import { __assign, __spreadArray } from "/_nuxt/node_modules/tslib/tslib.es6.js?v=e4f18c29"; import { invariant } from "/_nuxt/node_modules/@apollo/client/utilities/globals/index.js?v=e4f18c29"; import { visit, Kind } from "/_nuxt/node_modules/graphql/index.mjs?v=e4f18c29"; import { checkDocument, getOperationDefinition, getFragmentDefinition, getFragmentDefinitions, getMainDefinition, } from "/_nuxt/node_modules/@apollo/client/utilities/graphql/getFromAST.js?v=e4f18c29"; import { isField } from "/_nuxt/node_modules/@apollo/client/utilities/graphql/storeUtils.js?v=e4f18c29"; import { createFragmentMap } from "/_nuxt/node_modules/@apollo/client/utilities/graphql/fragments.js?v=e4f18c29"; import { isArray, isNonEmptyArray } from "/_nuxt/node_modules/@apollo/client/utilities/common/arrays.js?v=e4f18c29"; var TYPENAME_FIELD = { kind: Kind.FIELD, name: { kind: Kind.NAME, value: "__typename", }, }; function isEmpty(op, fragmentMap) { return (!op || op.selectionSet.selections.every(function (selection) { return selection.kind === Kind.FRAGMENT_SPREAD && isEmpty(fragmentMap[selection.name.value], fragmentMap); })); } function nullIfDocIsEmpty(doc) { return (isEmpty(getOperationDefinition(doc) || getFragmentDefinition(doc), createFragmentMap(getFragmentDefinitions(doc)))) ? null : doc; } function getDirectiveMatcher(configs) { var names = new Map(); var tests = new Map(); configs.forEach(function (directive) { if (directive) { if (directive.name) { names.set(directive.name, directive); } else if (directive.test) { tests.set(directive.test, directive); } } }); return function (directive) { var config = names.get(directive.name.value); if (!config && tests.size) { tests.forEach(function (testConfig, test) { if (test(directive)) { config = testConfig; } }); } return config; }; } function makeInUseGetterFunction(defaultKey) { var map = new Map(); return function inUseGetterFunction(key) { if (key === void 0) { key = defaultKey; } var inUse = map.get(key); if (!inUse) { map.set(key, (inUse = { // Variable and fragment spread names used directly within this // operation or fragment definition, as identified by key. These sets // will be populated during the first traversal of the document in // removeDirectivesFromDocument below. variables: new Set(), fragmentSpreads: new Set(), })); } return inUse; }; } export function removeDirectivesFromDocument(directives, doc) { checkDocument(doc); // Passing empty strings to makeInUseGetterFunction means we handle anonymous // operations as if their names were "". Anonymous fragment definitions are // not supposed to be possible, but the same default naming strategy seems // appropriate for that case as well. var getInUseByOperationName = makeInUseGetterFunction(""); var getInUseByFragmentName = makeInUseGetterFunction(""); var getInUse = function (ancestors) { for (var p = 0, ancestor = void 0; p < ancestors.length && (ancestor = ancestors[p]); ++p) { if (isArray(ancestor)) continue; if (ancestor.kind === Kind.OPERATION_DEFINITION) { // If an operation is anonymous, we use the empty string as its key. return getInUseByOperationName(ancestor.name && ancestor.name.value); } if (ancestor.kind === Kind.FRAGMENT_DEFINITION) { return getInUseByFragmentName(ancestor.name.value); } } globalThis.__DEV__ !== false && invariant.error(97); return null; }; var operationCount = 0; for (var i = doc.definitions.length - 1; i >= 0; --i) { if (doc.definitions[i].kind === Kind.OPERATION_DEFINITION) { ++operationCount; } } var directiveMatcher = getDirectiveMatcher(directives); var shouldRemoveField = function (nodeDirectives) { return isNonEmptyArray(nodeDirectives) && nodeDirectives .map(directiveMatcher) .some(function (config) { return config && config.remove; }); }; var originalFragmentDefsByPath = new Map(); // Any time the first traversal of the document below makes a change like // removing a fragment (by returning null), this variable should be set to // true. Once it becomes true, it should never be set to false again. If this // variable remains false throughout the traversal, then we can return the // original doc immediately without any modifications. var firstVisitMadeChanges = false; var fieldOrInlineFragmentVisitor = { enter: function (node) { if (shouldRemoveField(node.directives)) { firstVisitMadeChanges = true; return null; } }, }; var docWithoutDirectiveSubtrees = visit(doc, { // These two AST node types share the same implementation, defined above. Field: fieldOrInlineFragmentVisitor, InlineFragment: fieldOrInlineFragmentVisitor, VariableDefinition: { enter: function () { // VariableDefinition nodes do not count as variables in use, though // they do contain Variable nodes that might be visited below. To avoid // counting variable declarations as usages, we skip visiting the // contents of this VariableDefinition node by returning false. return false; }, }, Variable: { enter: function (node, _key, _parent, _path, ancestors) { var inUse = getInUse(ancestors); if (inUse) { inUse.variables.add(node.name.value); } }, }, FragmentSpread: { enter: function (node, _key, _parent, _path, ancestors) { if (shouldRemoveField(node.directives)) { firstVisitMadeChanges = true; return null; } var inUse = getInUse(ancestors); if (inUse) { inUse.fragmentSpreads.add(node.name.value); } // We might like to remove this FragmentSpread by returning null here if // the corresponding FragmentDefinition node is also going to be removed // by the logic below, but we can't control the relative order of those // events, so we have to postpone the removal of dangling FragmentSpread // nodes until after the current visit of the document has finished. }, }, FragmentDefinition: { enter: function (node, _key, _parent, path) { originalFragmentDefsByPath.set(JSON.stringify(path), node); }, leave: function (node, _key, _parent, path) { var originalNode = originalFragmentDefsByPath.get(JSON.stringify(path)); if (node === originalNode) { // If the FragmentNode received by this leave function is identical to // the one received by the corresponding enter function (above), then // the visitor must not have made any changes within this // FragmentDefinition node. This fragment definition may still be // removed if there are no ...spread references to it, but it won't be // removed just because it has only a __typename field. return node; } if ( // This logic applies only if the document contains one or more // operations, since removing all fragments from a document containing // only fragments makes the document useless. operationCount > 0 && node.selectionSet.selections.every(function (selection) { return selection.kind === Kind.FIELD && selection.name.value === "__typename"; })) { // This is a somewhat opinionated choice: if a FragmentDefinition ends // up having no fields other than __typename, we remove the whole // fragment definition, and later prune ...spread references to it. getInUseByFragmentName(node.name.value).removed = true; firstVisitMadeChanges = true; return null; } }, }, Directive: { leave: function (node) { // If a matching directive is found, remove the directive itself. Note // that this does not remove the target (field, argument, etc) of the // directive, but only the directive itself. if (directiveMatcher(node)) { firstVisitMadeChanges = true; return null; } }, }, }); if (!firstVisitMadeChanges) { // If our first pass did not change anything about the document, then there // is no cleanup we need to do, and we can return the original doc. return doc; } // Utility for making sure inUse.transitiveVars is recursively populated. // Because this logic assumes inUse.fragmentSpreads has been completely // populated and inUse.removed has been set if appropriate, // populateTransitiveVars must be called after that information has been // collected by the first traversal of the document. var populateTransitiveVars = function (inUse) { if (!inUse.transitiveVars) { inUse.transitiveVars = new Set(inUse.variables); if (!inUse.removed) { inUse.fragmentSpreads.forEach(function (childFragmentName) { populateTransitiveVars(getInUseByFragmentName(childFragmentName)).transitiveVars.forEach(function (varName) { inUse.transitiveVars.add(varName); }); }); } } return inUse; }; // Since we've been keeping track of fragment spreads used by particular // operations and fragment definitions, we now need to compute the set of all // spreads used (transitively) by any operations in the document. var allFragmentNamesUsed = new Set(); docWithoutDirectiveSubtrees.definitions.forEach(function (def) { if (def.kind === Kind.OPERATION_DEFINITION) { populateTransitiveVars(getInUseByOperationName(def.name && def.name.value)).fragmentSpreads.forEach(function (childFragmentName) { allFragmentNamesUsed.add(childFragmentName); }); } else if (def.kind === Kind.FRAGMENT_DEFINITION && // If there are no operations in the document, then all fragment // definitions count as usages of their own fragment names. This heuristic // prevents accidentally removing all fragment definitions from the // document just because it contains no operations that use the fragments. operationCount === 0 && !getInUseByFragmentName(def.name.value).removed) { allFragmentNamesUsed.add(def.name.value); } }); // Now that we have added all fragment spreads used by operations to the // allFragmentNamesUsed set, we can complete the set by transitively adding // all fragment spreads used by those fragments, and so on. allFragmentNamesUsed.forEach(function (fragmentName) { // Once all the childFragmentName strings added here have been seen already, // the top-level allFragmentNamesUsed.forEach loop will terminate. populateTransitiveVars(getInUseByFragmentName(fragmentName)).fragmentSpreads.forEach(function (childFragmentName) { allFragmentNamesUsed.add(childFragmentName); }); }); var fragmentWillBeRemoved = function (fragmentName) { return !!( // A fragment definition will be removed if there are no spreads that refer // to it, or the fragment was explicitly removed because it had no fields // other than __typename. (!allFragmentNamesUsed.has(fragmentName) || getInUseByFragmentName(fragmentName).removed)); }; var enterVisitor = { enter: function (node) { if (fragmentWillBeRemoved(node.name.value)) { return null; } }, }; return nullIfDocIsEmpty(visit(docWithoutDirectiveSubtrees, { // If the fragment is going to be removed, then leaving any dangling // FragmentSpread nodes with the same name would be a mistake. FragmentSpread: enterVisitor, // This is where the fragment definition is actually removed. FragmentDefinition: enterVisitor, OperationDefinition: { leave: function (node) { // Upon leaving each operation in the depth-first AST traversal, prune // any variables that are declared by the operation but unused within. if (node.variableDefinitions) { var usedVariableNames_1 = populateTransitiveVars( // If an operation is anonymous, we use the empty string as its key. getInUseByOperationName(node.name && node.name.value)).transitiveVars; // According to the GraphQL spec, all variables declared by an // operation must either be used by that operation or used by some // fragment included transitively into that operation: // https://spec.graphql.org/draft/#sec-All-Variables-Used // // To stay on the right side of this validation rule, if/when we // remove the last $var references from an operation or its fragments, // we must also remove the corresponding $var declaration from the // enclosing operation. This pruning applies only to operations and // not fragment definitions, at the moment. Fragments may be able to // declare variables eventually, but today they can only consume them. if (usedVariableNames_1.size < node.variableDefinitions.length) { return __assign(__assign({}, node), { variableDefinitions: node.variableDefinitions.filter(function (varDef) { return usedVariableNames_1.has(varDef.variable.name.value); }) }); } } }, }, })); } export var addTypenameToDocument = Object.assign(function (doc) { return visit(doc, { SelectionSet: { enter: function (node, _key, parent) { // Don't add __typename to OperationDefinitions. if (parent && parent.kind === Kind.OPERATION_DEFINITION) { return; } // No changes if no selections. var selections = node.selections; if (!selections) { return; } // If selections already have a __typename, or are part of an // introspection query, do nothing. var skip = selections.some(function (selection) { return (isField(selection) && (selection.name.value === "__typename" || selection.name.value.lastIndexOf("__", 0) === 0)); }); if (skip) { return; } // If this SelectionSet is @export-ed as an input variable, it should // not have a __typename field (see issue #4691). var field = parent; if (isField(field) && field.directives && field.directives.some(function (d) { return d.name.value === "export"; })) { return; } // Create and return a new SelectionSet with a __typename Field. return __assign(__assign({}, node), { selections: __spreadArray(__spreadArray([], selections, true), [TYPENAME_FIELD], false) }); }, }, }); }, { added: function (field) { return field === TYPENAME_FIELD; }, }); var connectionRemoveConfig = { test: function (directive) { var willRemove = directive.name.value === "connection"; if (willRemove) { if (!directive.arguments || !directive.arguments.some(function (arg) { return arg.name.value === "key"; })) { globalThis.__DEV__ !== false && invariant.warn(98); } } return willRemove; }, }; export function removeConnectionDirectiveFromDocument(doc) { return removeDirectivesFromDocument([connectionRemoveConfig], checkDocument(doc)); } function hasDirectivesInSelectionSet(directives, selectionSet, nestedCheck) { if (nestedCheck === void 0) { nestedCheck = true; } return (!!selectionSet && selectionSet.selections && selectionSet.selections.some(function (selection) { return hasDirectivesInSelection(directives, selection, nestedCheck); })); } function hasDirectivesInSelection(directives, selection, nestedCheck) { if (nestedCheck === void 0) { nestedCheck = true; } if (!isField(selection)) { return true; } if (!selection.directives) { return false; } return (selection.directives.some(getDirectiveMatcher(directives)) || (nestedCheck && hasDirectivesInSelectionSet(directives, selection.selectionSet, nestedCheck))); } function getArgumentMatcher(config) { return function argumentMatcher(argument) { return config.some(function (aConfig) { return argument.value && argument.value.kind === Kind.VARIABLE && argument.value.name && (aConfig.name === argument.value.name.value || (aConfig.test && aConfig.test(argument))); }); }; } export function removeArgumentsFromDocument(config, doc) { var argMatcher = getArgumentMatcher(config); return nullIfDocIsEmpty(visit(doc, { OperationDefinition: { enter: function (node) { return __assign(__assign({}, node), { // Remove matching top level variables definitions. variableDefinitions: node.variableDefinitions ? node.variableDefinitions.filter(function (varDef) { return !config.some(function (arg) { return arg.name === varDef.variable.name.value; }); }) : [] }); }, }, Field: { enter: function (node) { // If `remove` is set to true for an argument, and an argument match // is found for a field, remove the field as well. var shouldRemoveField = config.some(function (argConfig) { return argConfig.remove; }); if (shouldRemoveField) { var argMatchCount_1 = 0; if (node.arguments) { node.arguments.forEach(function (arg) { if (argMatcher(arg)) { argMatchCount_1 += 1; } }); } if (argMatchCount_1 === 1) { return null; } } }, }, Argument: { enter: function (node) { // Remove all matching arguments. if (argMatcher(node)) { return null; } }, }, })); } export function removeFragmentSpreadFromDocument(config, doc) { function enter(node) { if (config.some(function (def) { return def.name === node.name.value; })) { return null; } } return nullIfDocIsEmpty(visit(doc, { FragmentSpread: { enter: enter }, FragmentDefinition: { enter: enter }, })); } // If the incoming document is a query, return it as is. Otherwise, build a // new document containing a query operation based on the selection set // of the previous main operation. export function buildQueryFromSelectionSet(document) { var definition = getMainDefinition(document); var definitionOperation = definition.operation; if (definitionOperation === "query") { // Already a query, so return the existing document. return document; } // Build a new query using the selection set of the main operation. var modifiedDoc = visit(document, { OperationDefinition: { enter: function (node) { return __assign(__assign({}, node), { operation: "query" }); }, }, }); return modifiedDoc; } // Remove fields / selection sets that include an @client directive. export function removeClientSetsFromDocument(document) { checkDocument(document); var modifiedDoc = removeDirectivesFromDocument([ { test: function (directive) { return directive.name.value === "client"; }, remove: true, }, ], document); return modifiedDoc; } export function addNonReactiveToNamedFragments(document) { checkDocument(document); return visit(document, { FragmentSpread: function (node) { var _a; // Do not add `@nonreactive` if the fragment is marked with `@unmask` // since we want to react to changes in this fragment. if ((_a = node.directives) === null || _a === void 0 ? void 0 : _a.some(function (directive) { return directive.name.value === "unmask"; })) { return; } return __assign(__assign({}, node), { directives: __spreadArray(__spreadArray([], (node.directives || []), true), [ { kind: Kind.DIRECTIVE, name: { kind: Kind.NAME, value: "nonreactive" }, }, ], false) }); }, }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxpdGllcy9ncmFwaHFsL3RyYW5zZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBaUJoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsYUFBYSxFQUNiLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBNkIvRCxJQUFNLGNBQWMsR0FBYztJQUNoQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUs7SUFDaEIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsS0FBSyxFQUFFLFlBQVk7S0FDcEI7Q0FDRixDQUFDO0FBRUYsU0FBUyxPQUFPLENBQ2QsRUFBb0QsRUFDcEQsV0FBd0I7SUFFeEIsT0FBTyxDQUNMLENBQUMsRUFBRTtRQUNILEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FDOUIsVUFBQyxTQUFTO1lBQ1IsT0FBQSxTQUFTLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxlQUFlO2dCQUN2QyxPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDO1FBRHZELENBQ3VELENBQzFELENBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEdBQWlC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UUFBc0I7SUFFdEIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXhCLElBQUksV0FBVyxHQUFHLDRCQUE0QixDQUM1QztRQUNFO1lBQ0UsSUFBSSxFQUFFLFVBQUMsU0FBd0IsSUFBSyxPQUFBLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBakMsQ0FBaUM7WUFDckUsTUFBTSxFQUFFLElBQUk7U0FDYjtLQUNGLEVBQ0QsUUFBUSxDQUNULENBQUM7SUFFRixPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsTUFBTSxVQUFVLDhCQUE4QixDQUFDLFFBQXNCO0lBQ25FLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV4QixPQUFPLEtBQUssQ0FBQyxRQUFRLEVBQUU7UUFDckIsY0FBYyxFQUFFLFVBQUMsSUFBSTs7WUFDbkIscUVBQXFFO1lBQ3JFLHNEQUFzRDtZQUN0RCxJQUNFLE1BQUEsSUFBSSxDQUFDLFVBQVUsMENBQUUsSUFBSSxDQUFDLFVBQUMsU0FBUyxJQUFLLE9BQUEsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFqQyxDQUFpQyxDQUFDLEVBQ3ZFLENBQUM7Z0JBQ0QsT0FBTztZQUNULENBQUM7WUFFRCw2QkFDSyxJQUFJLEtBQ1AsVUFBVSxrQ0FDTCxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO29CQUMxQjt3QkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVM7d0JBQ3BCLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7cUJBQ3hCOzZCQUUzQjtRQUNKLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSBcIi4uL2dsb2JhbHMvaW5kZXguanNcIjtcblxuaW1wb3J0IHR5cGUge1xuICBEb2N1bWVudE5vZGUsXG4gIFNlbGVjdGlvbk5vZGUsXG4gIFNlbGVjdGlvblNldE5vZGUsXG4gIE9wZXJhdGlvbkRlZmluaXRpb25Ob2RlLFxuICBGaWVsZE5vZGUsXG4gIERpcmVjdGl2ZU5vZGUsXG4gIEZyYWdtZW50RGVmaW5pdGlvbk5vZGUsXG4gIEFyZ3VtZW50Tm9kZSxcbiAgRnJhZ21lbnRTcHJlYWROb2RlLFxuICBWYXJpYWJsZURlZmluaXRpb25Ob2RlLFxuICBBU1ROb2RlLFxuICBBU1RWaXNpdEZuLFxuICBJbmxpbmVGcmFnbWVudE5vZGUsXG59IGZyb20gXCJncmFwaHFsXCI7XG5pbXBvcnQgeyB2aXNpdCwgS2luZCB9IGZyb20gXCJncmFwaHFsXCI7XG5cbmltcG9ydCB7XG4gIGNoZWNrRG9jdW1lbnQsXG4gIGdldE9wZXJhdGlvbkRlZmluaXRpb24sXG4gIGdldEZyYWdtZW50RGVmaW5pdGlvbixcbiAgZ2V0RnJhZ21lbnREZWZpbml0aW9ucyxcbiAgZ2V0TWFpbkRlZmluaXRpb24sXG59IGZyb20gXCIuL2dldEZyb21BU1QuanNcIjtcbmltcG9ydCB7IGlzRmllbGQgfSBmcm9tIFwiLi9zdG9yZVV0aWxzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZyYWdtZW50TWFwIH0gZnJvbSBcIi4vZnJhZ21lbnRzLmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVGcmFnbWVudE1hcCB9IGZyb20gXCIuL2ZyYWdtZW50cy5qc1wiO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNOb25FbXB0eUFycmF5IH0gZnJvbSBcIi4uL2NvbW1vbi9hcnJheXMuanNcIjtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwvZ3JhcGhxbC1qcy9ibG9iLzhkN2M4ZmNjZjVhOTg0NmE1MDc4NWRlMDRhYmRhNThhN2ViMTNmYzAvc3JjL2xhbmd1YWdlL3Zpc2l0b3IudHMjTDIwLUwyM1xuaW50ZXJmYWNlIEVudGVyTGVhdmVWaXNpdG9yPFRWaXNpdGVkTm9kZSBleHRlbmRzIEFTVE5vZGU+IHtcbiAgcmVhZG9ubHkgZW50ZXI/OiBBU1RWaXNpdEZuPFRWaXNpdGVkTm9kZT47XG4gIHJlYWRvbmx5IGxlYXZlPzogQVNUVmlzaXRGbjxUVmlzaXRlZE5vZGU+O1xufVxuXG5leHBvcnQgdHlwZSBSZW1vdmVOb2RlQ29uZmlnPE4+ID0ge1xuICBuYW1lPzogc3RyaW5nO1xuICB0ZXN0PzogKG5vZGU6IE4pID0+IGJvb2xlYW47XG4gIHJlbW92ZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBHZXROb2RlQ29uZmlnPE4+ID0ge1xuICBuYW1lPzogc3RyaW5nO1xuICB0ZXN0PzogKG5vZGU6IE4pID0+IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBSZW1vdmVEaXJlY3RpdmVDb25maWcgPSBSZW1vdmVOb2RlQ29uZmlnPERpcmVjdGl2ZU5vZGU+O1xuZXhwb3J0IHR5cGUgR2V0RGlyZWN0aXZlQ29uZmlnID0gR2V0Tm9kZUNvbmZpZzxEaXJlY3RpdmVOb2RlPjtcbmV4cG9ydCB0eXBlIFJlbW92ZUFyZ3VtZW50c0NvbmZpZyA9IFJlbW92ZU5vZGVDb25maWc8QXJndW1lbnROb2RlPjtcbmV4cG9ydCB0eXBlIEdldEZyYWdtZW50U3ByZWFkQ29uZmlnID0gR2V0Tm9kZUNvbmZpZzxGcmFnbWVudFNwcmVhZE5vZGU+O1xuZXhwb3J0IHR5cGUgUmVtb3ZlRnJhZ21lbnRTcHJlYWRDb25maWcgPSBSZW1vdmVOb2RlQ29uZmlnPEZyYWdtZW50U3ByZWFkTm9kZT47XG5leHBvcnQgdHlwZSBSZW1vdmVGcmFnbWVudERlZmluaXRpb25Db25maWcgPVxuICBSZW1vdmVOb2RlQ29uZmlnPEZyYWdtZW50RGVmaW5pdGlvbk5vZGU+O1xuZXhwb3J0IHR5cGUgUmVtb3ZlVmFyaWFibGVEZWZpbml0aW9uQ29uZmlnID1cbiAgUmVtb3ZlTm9kZUNvbmZpZzxWYXJpYWJsZURlZmluaXRpb25Ob2RlPjtcblxuY29uc3QgVFlQRU5BTUVfRklFTEQ6IEZpZWxkTm9kZSA9IHtcbiAga2luZDogS2luZC5GSUVMRCxcbiAgbmFtZToge1xuICAgIGtpbmQ6IEtpbmQuTkFNRSxcbiAgICB2YWx1ZTogXCJfX3R5cGVuYW1lXCIsXG4gIH0sXG59O1xuXG5mdW5jdGlvbiBpc0VtcHR5KFxuICBvcDogT3BlcmF0aW9uRGVmaW5pdGlvbk5vZGUgfCBGcmFnbWVudERlZmluaXRpb25Ob2RlLFxuICBmcmFnbWVudE1hcDogRnJhZ21lbnRNYXBcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgICFvcCB8fFxuICAgIG9wLnNlbGVjdGlvblNldC5zZWxlY3Rpb25zLmV2ZXJ5KFxuICAgICAgKHNlbGVjdGlvbikgPT5cbiAgICAgICAgc2VsZWN0aW9uLmtpbmQgPT09IEtpbmQuRlJBR01FTlRfU1BSRUFEICYmXG4gICAgICAgIGlzRW1wdHkoZnJhZ21lbnRNYXBbc2VsZWN0aW9uLm5hbWUudmFsdWVdLCBmcmFnbWVudE1hcClcbiAgICApXG4gICk7XG59XG5cbmZ1bmN0aW9uIG51bGxJZkRvY0lzRW1wdHkoZG9jOiBEb2N1bWVudE5vZGUpIHtcbiAgcmV0dXJuIChcbiAgICAgIGlzRW1wdHkoXG4gICAgICAgIGdldE9wZXJhdGlvbkRlZmluaXRpb24oZG9jKSB8fCBnZXRGcmFnbWVudERlZmluaXRpb24oZG9jKSxcbiAgICAgICAgY3JlYXRlRnJhZ21lbnRNYXAoZ2V0RnJhZ21lbnREZWZpbml0aW9ucyhkb2MpKVxuICAgICAgKVxuICAgICkgP1xuICAgICAgbnVsbFxuICAgIDogZG9jO1xufVxuXG5mdW5jdGlvbiBnZXREaXJlY3RpdmVNYXRjaGVyKFxuICBjb25maWdzOiAoUmVtb3ZlRGlyZWN0aXZlQ29uZmlnIHwgR2V0RGlyZWN0aXZlQ29uZmlnKVtdXG4pIHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgTWFwPHN0cmluZywgUmVtb3ZlRGlyZWN0aXZlQ29uZmlnIHwgR2V0RGlyZWN0aXZlQ29uZmlnPigpO1xuXG4gIGNvbnN0IHRlc3RzID0gbmV3IE1hcDxcbiAgICAoZGlyZWN0aXZlOiBEaXJlY3RpdmVOb2RlKSA9PiBib29sZWFuLFxuICAgIFJlbW92ZURpcmVjdGl2ZUNvbmZpZyB8IEdldERpcmVjdGl2ZUNvbmZpZ1xuICA+KCk7XG5cbiAgY29uZmlncy5mb3JFYWNoKChkaXJlY3RpdmUpID0+IHtcbiAgICBpZiAoZGlyZWN0aXZlKSB7XG4gICAgICBpZiAoZGlyZWN0aXZlLm5hbWUpIHtcbiAgICAgICAgbmFtZXMuc2V0KGRpcmVjdGl2ZS5uYW1lLCBkaXJlY3RpdmUpO1xuICAgICAgfSBlbHNlIGlmIChkaXJlY3RpdmUudGVzdCkge1xuICAgICAgICB0ZXN0cy5zZXQoZGlyZWN0aXZlLnRlc3QsIGRpcmVjdGl2ZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gKGRpcmVjdGl2ZTogRGlyZWN0aXZlTm9kZSkgPT4ge1xuICAgIGxldCBjb25maWcgPSBuYW1lcy5nZXQoZGlyZWN0aXZlLm5hbWUudmFsdWUpO1xuICAgIGlmICghY29uZmlnICYmIHRlc3RzLnNpemUpIHtcbiAgICAgIHRlc3RzLmZvckVhY2goKHRlc3RDb25maWcsIHRlc3QpID0+IHtcbiAgICAgICAgaWYgKHRlc3QoZGlyZWN0aXZlKSkge1xuICAgICAgICAgIGNvbmZpZyA9IHRlc3RDb25maWc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xuICB9O1xufVxuXG4vLyBIZWxwZXIgaW50ZXJmYWNlIGFuZCBmdW5jdGlvbiB1c2VkIGJ5IHJlbW92ZURpcmVjdGl2ZXNGcm9tRG9jdW1lbnQgdG8ga2VlcFxuLy8gdHJhY2sgb2YgdmFyaWFibGUgcmVmZXJlbmNlcyBhbmQgZnJhZ21lbnRzIHNwcmVhZHMgZm91bmQgd2l0aGluIGEgZ2l2ZW5cbi8vIG9wZXJhdGlvbiBvciBmcmFnbWVudCBkZWZpbml0aW9uLlxuaW50ZXJmYWNlIEludGVybmFsSW5Vc2VJbmZvIHtcbiAgdmFyaWFibGVzOiBTZXQ8c3RyaW5nPjtcbiAgZnJhZ21lbnRTcHJlYWRzOiBTZXQ8c3RyaW5nPjtcbiAgLy8gU2V0IHRvIHRydWUgd2hlbiB3ZSBkZWxpYmVyYXRlbHkgcmVtb3ZlIGEgZnJhZ21lbnQgZGVmaW5pdGlvbiwgc28gd2UgY2FuXG4gIC8vIG1ha2Ugc3VyZSBhbHNvIHRvIHJlbW92ZSBkYW5nbGluZyAuLi5zcHJlYWRzIHRoYXQgcmVmZXIgdG8gaXQuXG4gIHJlbW92ZWQ/OiBib29sZWFuO1xuICAvLyBQb3B1bGF0ZWQgYnkgdGhlIHBvcHVsYXRlVHJhbnNpdGl2ZVZhcnMgaGVscGVyIGZ1bmN0aW9uIGJlbG93LlxuICB0cmFuc2l0aXZlVmFycz86IFNldDxzdHJpbmc+O1xufVxuZnVuY3Rpb24gbWFrZUluVXNlR2V0dGVyRnVuY3Rpb248VEtleT4oZGVmYXVsdEtleTogVEtleSkge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPFRLZXksIEludGVybmFsSW5Vc2VJbmZvPigpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBpblVzZUdldHRlckZ1bmN0aW9uKFxuICAgIGtleTogVEtleSA9IGRlZmF1bHRLZXlcbiAgKTogSW50ZXJuYWxJblVzZUluZm8ge1xuICAgIGxldCBpblVzZSA9IG1hcC5nZXQoa2V5KTtcbiAgICBpZiAoIWluVXNlKSB7XG4gICAgICBtYXAuc2V0KFxuICAgICAgICBrZXksXG4gICAgICAgIChpblVzZSA9IHtcbiAgICAgICAgICAvLyBWYXJpYWJsZSBhbmQgZnJhZ21lbnQgc3ByZWFkIG5hbWVzIHVzZWQgZGlyZWN0bHkgd2l0aGluIHRoaXNcbiAgICAgICAgICAvLyBvcGVyYXRpb24gb3IgZnJhZ21lbnQgZGVmaW5pdGlvbiwgYXMgaWRlbnRpZmllZCBieSBrZXkuIFRoZXNlIHNldHNcbiAgICAgICAgICAvLyB3aWxsIGJlIHBvcHVsYXRlZCBkdXJpbmcgdGhlIGZpcnN0IHRyYXZlcnNhbCBvZiB0aGUgZG9jdW1lbnQgaW5cbiAgICAgICAgICAvLyByZW1vdmVEaXJlY3RpdmVzRnJvbURvY3VtZW50IGJlbG93LlxuICAgICAgICAgIHZhcmlhYmxlczogbmV3IFNldCgpLFxuICAgICAgICAgIGZyYWdtZW50U3ByZWFkczogbmV3IFNldCgpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGluVXNlO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRGlyZWN0aXZlc0Zyb21Eb2N1bWVudChcbiAgZGlyZWN0aXZlczogUmVtb3ZlRGlyZWN0aXZlQ29uZmlnW10sXG4gIGRvYzogRG9jdW1lbnROb2RlXG4pOiBEb2N1bWVudE5vZGUgfCBudWxsIHtcbiAgY2hlY2tEb2N1bWVudChkb2MpO1xuXG4gIC8vIFBhc3NpbmcgZW1wdHkgc3RyaW5ncyB0byBtYWtlSW5Vc2VHZXR0ZXJGdW5jdGlvbiBtZWFucyB3ZSBoYW5kbGUgYW5vbnltb3VzXG4gIC8vIG9wZXJhdGlvbnMgYXMgaWYgdGhlaXIgbmFtZXMgd2VyZSBcIlwiLiBBbm9ueW1vdXMgZnJhZ21lbnQgZGVmaW5pdGlvbnMgYXJlXG4gIC8vIG5vdCBzdXBwb3NlZCB0byBiZSBwb3NzaWJsZSwgYnV0IHRoZSBzYW1lIGRlZmF1bHQgbmFtaW5nIHN0cmF0ZWd5IHNlZW1zXG4gIC8vIGFwcHJvcHJpYXRlIGZvciB0aGF0IGNhc2UgYXMgd2VsbC5cbiAgY29uc3QgZ2V0SW5Vc2VCeU9wZXJhdGlvbk5hbWUgPSBtYWtlSW5Vc2VHZXR0ZXJGdW5jdGlvbjxzdHJpbmc+KFwiXCIpO1xuICBjb25zdCBnZXRJblVzZUJ5RnJhZ21lbnROYW1lID0gbWFrZUluVXNlR2V0dGVyRnVuY3Rpb248c3RyaW5nPihcIlwiKTtcbiAgY29uc3QgZ2V0SW5Vc2UgPSAoXG4gICAgYW5jZXN0b3JzOiByZWFkb25seSAoQVNUTm9kZSB8IHJlYWRvbmx5IEFTVE5vZGVbXSlbXVxuICApOiBJbnRlcm5hbEluVXNlSW5mbyB8IG51bGwgPT4ge1xuICAgIGZvciAoXG4gICAgICBsZXQgcCA9IDAsIGFuY2VzdG9yOiBBU1ROb2RlIHwgcmVhZG9ubHkgQVNUTm9kZVtdO1xuICAgICAgcCA8IGFuY2VzdG9ycy5sZW5ndGggJiYgKGFuY2VzdG9yID0gYW5jZXN0b3JzW3BdKTtcbiAgICAgICsrcFxuICAgICkge1xuICAgICAgaWYgKGlzQXJyYXkoYW5jZXN0b3IpKSBjb250aW51ZTtcbiAgICAgIGlmIChhbmNlc3Rvci5raW5kID09PSBLaW5kLk9QRVJBVElPTl9ERUZJTklUSU9OKSB7XG4gICAgICAgIC8vIElmIGFuIG9wZXJhdGlvbiBpcyBhbm9ueW1vdXMsIHdlIHVzZSB0aGUgZW1wdHkgc3RyaW5nIGFzIGl0cyBrZXkuXG4gICAgICAgIHJldHVybiBnZXRJblVzZUJ5T3BlcmF0aW9uTmFtZShhbmNlc3Rvci5uYW1lICYmIGFuY2VzdG9yLm5hbWUudmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKGFuY2VzdG9yLmtpbmQgPT09IEtpbmQuRlJBR01FTlRfREVGSU5JVElPTikge1xuICAgICAgICByZXR1cm4gZ2V0SW5Vc2VCeUZyYWdtZW50TmFtZShhbmNlc3Rvci5uYW1lLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaW52YXJpYW50LmVycm9yKGBDb3VsZCBub3QgZmluZCBvcGVyYXRpb24gb3IgZnJhZ21lbnRgKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBsZXQgb3BlcmF0aW9uQ291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gZG9jLmRlZmluaXRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgaWYgKGRvYy5kZWZpbml0aW9uc1tpXS5raW5kID09PSBLaW5kLk9QRVJBVElPTl9ERUZJTklUSU9OKSB7XG4gICAgICArK29wZXJhdGlvbkNvdW50O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRpcmVjdGl2ZU1hdGNoZXIgPSBnZXREaXJlY3RpdmVNYXRjaGVyKGRpcmVjdGl2ZXMpO1xuICBjb25zdCBzaG91bGRSZW1vdmVGaWVsZCA9IChub2RlRGlyZWN0aXZlczogRmllbGROb2RlW1wiZGlyZWN0aXZlc1wiXSkgPT5cbiAgICBpc05vbkVtcHR5QXJyYXkobm9kZURpcmVjdGl2ZXMpICYmXG4gICAgbm9kZURpcmVjdGl2ZXNcbiAgICAgIC5tYXAoZGlyZWN0aXZlTWF0Y2hlcilcbiAgICAgIC5zb21lKFxuICAgICAgICAoY29uZmlnOiBSZW1vdmVEaXJlY3RpdmVDb25maWcgfCB1bmRlZmluZWQpID0+IGNvbmZpZyAmJiBjb25maWcucmVtb3ZlXG4gICAgICApO1xuXG4gIGNvbnN0IG9yaWdpbmFsRnJhZ21lbnREZWZzQnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIEZyYWdtZW50RGVmaW5pdGlvbk5vZGU+KCk7XG5cbiAgLy8gQW55IHRpbWUgdGhlIGZpcnN0IHRyYXZlcnNhbCBvZiB0aGUgZG9jdW1lbnQgYmVsb3cgbWFrZXMgYSBjaGFuZ2UgbGlrZVxuICAvLyByZW1vdmluZyBhIGZyYWdtZW50IChieSByZXR1cm5pbmcgbnVsbCksIHRoaXMgdmFyaWFibGUgc2hvdWxkIGJlIHNldCB0b1xuICAvLyB0cnVlLiBPbmNlIGl0IGJlY29tZXMgdHJ1ZSwgaXQgc2hvdWxkIG5ldmVyIGJlIHNldCB0byBmYWxzZSBhZ2Fpbi4gSWYgdGhpc1xuICAvLyB2YXJpYWJsZSByZW1haW5zIGZhbHNlIHRocm91Z2hvdXQgdGhlIHRyYXZlcnNhbCwgdGhlbiB3ZSBjYW4gcmV0dXJuIHRoZVxuICAvLyBvcmlnaW5hbCBkb2MgaW1tZWRpYXRlbHkgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9ucy5cbiAgbGV0IGZpcnN0VmlzaXRNYWRlQ2hhbmdlcyA9IGZhbHNlO1xuXG4gIGNvbnN0IGZpZWxkT3JJbmxpbmVGcmFnbWVudFZpc2l0b3I6IEVudGVyTGVhdmVWaXNpdG9yPFxuICAgIEZpZWxkTm9kZSB8IElubGluZUZyYWdtZW50Tm9kZVxuICA+ID0ge1xuICAgIGVudGVyKG5vZGUpIHtcbiAgICAgIGlmIChzaG91bGRSZW1vdmVGaWVsZChub2RlLmRpcmVjdGl2ZXMpKSB7XG4gICAgICAgIGZpcnN0VmlzaXRNYWRlQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgZG9jV2l0aG91dERpcmVjdGl2ZVN1YnRyZWVzID0gdmlzaXQoZG9jLCB7XG4gICAgLy8gVGhlc2UgdHdvIEFTVCBub2RlIHR5cGVzIHNoYXJlIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLCBkZWZpbmVkIGFib3ZlLlxuICAgIEZpZWxkOiBmaWVsZE9ySW5saW5lRnJhZ21lbnRWaXNpdG9yLFxuICAgIElubGluZUZyYWdtZW50OiBmaWVsZE9ySW5saW5lRnJhZ21lbnRWaXNpdG9yLFxuXG4gICAgVmFyaWFibGVEZWZpbml0aW9uOiB7XG4gICAgICBlbnRlcigpIHtcbiAgICAgICAgLy8gVmFyaWFibGVEZWZpbml0aW9uIG5vZGVzIGRvIG5vdCBjb3VudCBhcyB2YXJpYWJsZXMgaW4gdXNlLCB0aG91Z2hcbiAgICAgICAgLy8gdGhleSBkbyBjb250YWluIFZhcmlhYmxlIG5vZGVzIHRoYXQgbWlnaHQgYmUgdmlzaXRlZCBiZWxvdy4gVG8gYXZvaWRcbiAgICAgICAgLy8gY291bnRpbmcgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFzIHVzYWdlcywgd2Ugc2tpcCB2aXNpdGluZyB0aGVcbiAgICAgICAgLy8gY29udGVudHMgb2YgdGhpcyBWYXJpYWJsZURlZmluaXRpb24gbm9kZSBieSByZXR1cm5pbmcgZmFsc2UuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIFZhcmlhYmxlOiB7XG4gICAgICBlbnRlcihub2RlLCBfa2V5LCBfcGFyZW50LCBfcGF0aCwgYW5jZXN0b3JzKSB7XG4gICAgICAgIGNvbnN0IGluVXNlID0gZ2V0SW5Vc2UoYW5jZXN0b3JzKTtcbiAgICAgICAgaWYgKGluVXNlKSB7XG4gICAgICAgICAgaW5Vc2UudmFyaWFibGVzLmFkZChub2RlLm5hbWUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBGcmFnbWVudFNwcmVhZDoge1xuICAgICAgZW50ZXIobm9kZSwgX2tleSwgX3BhcmVudCwgX3BhdGgsIGFuY2VzdG9ycykge1xuICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlRmllbGQobm9kZS5kaXJlY3RpdmVzKSkge1xuICAgICAgICAgIGZpcnN0VmlzaXRNYWRlQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5Vc2UgPSBnZXRJblVzZShhbmNlc3RvcnMpO1xuICAgICAgICBpZiAoaW5Vc2UpIHtcbiAgICAgICAgICBpblVzZS5mcmFnbWVudFNwcmVhZHMuYWRkKG5vZGUubmFtZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgbWlnaHQgbGlrZSB0byByZW1vdmUgdGhpcyBGcmFnbWVudFNwcmVhZCBieSByZXR1cm5pbmcgbnVsbCBoZXJlIGlmXG4gICAgICAgIC8vIHRoZSBjb3JyZXNwb25kaW5nIEZyYWdtZW50RGVmaW5pdGlvbiBub2RlIGlzIGFsc28gZ29pbmcgdG8gYmUgcmVtb3ZlZFxuICAgICAgICAvLyBieSB0aGUgbG9naWMgYmVsb3csIGJ1dCB3ZSBjYW4ndCBjb250cm9sIHRoZSByZWxhdGl2ZSBvcmRlciBvZiB0aG9zZVxuICAgICAgICAvLyBldmVudHMsIHNvIHdlIGhhdmUgdG8gcG9zdHBvbmUgdGhlIHJlbW92YWwgb2YgZGFuZ2xpbmcgRnJhZ21lbnRTcHJlYWRcbiAgICAgICAgLy8gbm9kZXMgdW50aWwgYWZ0ZXIgdGhlIGN1cnJlbnQgdmlzaXQgb2YgdGhlIGRvY3VtZW50IGhhcyBmaW5pc2hlZC5cbiAgICAgIH0sXG4gICAgfSxcblxuICAgIEZyYWdtZW50RGVmaW5pdGlvbjoge1xuICAgICAgZW50ZXIobm9kZSwgX2tleSwgX3BhcmVudCwgcGF0aCkge1xuICAgICAgICBvcmlnaW5hbEZyYWdtZW50RGVmc0J5UGF0aC5zZXQoSlNPTi5zdHJpbmdpZnkocGF0aCksIG5vZGUpO1xuICAgICAgfSxcbiAgICAgIGxlYXZlKG5vZGUsIF9rZXksIF9wYXJlbnQsIHBhdGgpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxOb2RlID0gb3JpZ2luYWxGcmFnbWVudERlZnNCeVBhdGguZ2V0KFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHBhdGgpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChub2RlID09PSBvcmlnaW5hbE5vZGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgRnJhZ21lbnROb2RlIHJlY2VpdmVkIGJ5IHRoaXMgbGVhdmUgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvXG4gICAgICAgICAgLy8gdGhlIG9uZSByZWNlaXZlZCBieSB0aGUgY29ycmVzcG9uZGluZyBlbnRlciBmdW5jdGlvbiAoYWJvdmUpLCB0aGVuXG4gICAgICAgICAgLy8gdGhlIHZpc2l0b3IgbXVzdCBub3QgaGF2ZSBtYWRlIGFueSBjaGFuZ2VzIHdpdGhpbiB0aGlzXG4gICAgICAgICAgLy8gRnJhZ21lbnREZWZpbml0aW9uIG5vZGUuIFRoaXMgZnJhZ21lbnQgZGVmaW5pdGlvbiBtYXkgc3RpbGwgYmVcbiAgICAgICAgICAvLyByZW1vdmVkIGlmIHRoZXJlIGFyZSBubyAuLi5zcHJlYWQgcmVmZXJlbmNlcyB0byBpdCwgYnV0IGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gcmVtb3ZlZCBqdXN0IGJlY2F1c2UgaXQgaGFzIG9ubHkgYSBfX3R5cGVuYW1lIGZpZWxkLlxuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIC8vIFRoaXMgbG9naWMgYXBwbGllcyBvbmx5IGlmIHRoZSBkb2N1bWVudCBjb250YWlucyBvbmUgb3IgbW9yZVxuICAgICAgICAgIC8vIG9wZXJhdGlvbnMsIHNpbmNlIHJlbW92aW5nIGFsbCBmcmFnbWVudHMgZnJvbSBhIGRvY3VtZW50IGNvbnRhaW5pbmdcbiAgICAgICAgICAvLyBvbmx5IGZyYWdtZW50cyBtYWtlcyB0aGUgZG9jdW1lbnQgdXNlbGVzcy5cbiAgICAgICAgICBvcGVyYXRpb25Db3VudCA+IDAgJiZcbiAgICAgICAgICBub2RlLnNlbGVjdGlvblNldC5zZWxlY3Rpb25zLmV2ZXJ5KFxuICAgICAgICAgICAgKHNlbGVjdGlvbikgPT5cbiAgICAgICAgICAgICAgc2VsZWN0aW9uLmtpbmQgPT09IEtpbmQuRklFTEQgJiZcbiAgICAgICAgICAgICAgc2VsZWN0aW9uLm5hbWUudmFsdWUgPT09IFwiX190eXBlbmFtZVwiXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgc29tZXdoYXQgb3BpbmlvbmF0ZWQgY2hvaWNlOiBpZiBhIEZyYWdtZW50RGVmaW5pdGlvbiBlbmRzXG4gICAgICAgICAgLy8gdXAgaGF2aW5nIG5vIGZpZWxkcyBvdGhlciB0aGFuIF9fdHlwZW5hbWUsIHdlIHJlbW92ZSB0aGUgd2hvbGVcbiAgICAgICAgICAvLyBmcmFnbWVudCBkZWZpbml0aW9uLCBhbmQgbGF0ZXIgcHJ1bmUgLi4uc3ByZWFkIHJlZmVyZW5jZXMgdG8gaXQuXG4gICAgICAgICAgZ2V0SW5Vc2VCeUZyYWdtZW50TmFtZShub2RlLm5hbWUudmFsdWUpLnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGZpcnN0VmlzaXRNYWRlQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcblxuICAgIERpcmVjdGl2ZToge1xuICAgICAgbGVhdmUobm9kZSkge1xuICAgICAgICAvLyBJZiBhIG1hdGNoaW5nIGRpcmVjdGl2ZSBpcyBmb3VuZCwgcmVtb3ZlIHRoZSBkaXJlY3RpdmUgaXRzZWxmLiBOb3RlXG4gICAgICAgIC8vIHRoYXQgdGhpcyBkb2VzIG5vdCByZW1vdmUgdGhlIHRhcmdldCAoZmllbGQsIGFyZ3VtZW50LCBldGMpIG9mIHRoZVxuICAgICAgICAvLyBkaXJlY3RpdmUsIGJ1dCBvbmx5IHRoZSBkaXJlY3RpdmUgaXRzZWxmLlxuICAgICAgICBpZiAoZGlyZWN0aXZlTWF0Y2hlcihub2RlKSkge1xuICAgICAgICAgIGZpcnN0VmlzaXRNYWRlQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgaWYgKCFmaXJzdFZpc2l0TWFkZUNoYW5nZXMpIHtcbiAgICAvLyBJZiBvdXIgZmlyc3QgcGFzcyBkaWQgbm90IGNoYW5nZSBhbnl0aGluZyBhYm91dCB0aGUgZG9jdW1lbnQsIHRoZW4gdGhlcmVcbiAgICAvLyBpcyBubyBjbGVhbnVwIHdlIG5lZWQgdG8gZG8sIGFuZCB3ZSBjYW4gcmV0dXJuIHRoZSBvcmlnaW5hbCBkb2MuXG4gICAgcmV0dXJuIGRvYztcbiAgfVxuXG4gIC8vIFV0aWxpdHkgZm9yIG1ha2luZyBzdXJlIGluVXNlLnRyYW5zaXRpdmVWYXJzIGlzIHJlY3Vyc2l2ZWx5IHBvcHVsYXRlZC5cbiAgLy8gQmVjYXVzZSB0aGlzIGxvZ2ljIGFzc3VtZXMgaW5Vc2UuZnJhZ21lbnRTcHJlYWRzIGhhcyBiZWVuIGNvbXBsZXRlbHlcbiAgLy8gcG9wdWxhdGVkIGFuZCBpblVzZS5yZW1vdmVkIGhhcyBiZWVuIHNldCBpZiBhcHByb3ByaWF0ZSxcbiAgLy8gcG9wdWxhdGVUcmFuc2l0aXZlVmFycyBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGF0IGluZm9ybWF0aW9uIGhhcyBiZWVuXG4gIC8vIGNvbGxlY3RlZCBieSB0aGUgZmlyc3QgdHJhdmVyc2FsIG9mIHRoZSBkb2N1bWVudC5cbiAgY29uc3QgcG9wdWxhdGVUcmFuc2l0aXZlVmFycyA9IChpblVzZTogSW50ZXJuYWxJblVzZUluZm8pID0+IHtcbiAgICBpZiAoIWluVXNlLnRyYW5zaXRpdmVWYXJzKSB7XG4gICAgICBpblVzZS50cmFuc2l0aXZlVmFycyA9IG5ldyBTZXQoaW5Vc2UudmFyaWFibGVzKTtcbiAgICAgIGlmICghaW5Vc2UucmVtb3ZlZCkge1xuICAgICAgICBpblVzZS5mcmFnbWVudFNwcmVhZHMuZm9yRWFjaCgoY2hpbGRGcmFnbWVudE5hbWUpID0+IHtcbiAgICAgICAgICBwb3B1bGF0ZVRyYW5zaXRpdmVWYXJzKFxuICAgICAgICAgICAgZ2V0SW5Vc2VCeUZyYWdtZW50TmFtZShjaGlsZEZyYWdtZW50TmFtZSlcbiAgICAgICAgICApLnRyYW5zaXRpdmVWYXJzIS5mb3JFYWNoKCh2YXJOYW1lKSA9PiB7XG4gICAgICAgICAgICBpblVzZS50cmFuc2l0aXZlVmFycyEuYWRkKHZhck5hbWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluVXNlO1xuICB9O1xuXG4gIC8vIFNpbmNlIHdlJ3ZlIGJlZW4ga2VlcGluZyB0cmFjayBvZiBmcmFnbWVudCBzcHJlYWRzIHVzZWQgYnkgcGFydGljdWxhclxuICAvLyBvcGVyYXRpb25zIGFuZCBmcmFnbWVudCBkZWZpbml0aW9ucywgd2Ugbm93IG5lZWQgdG8gY29tcHV0ZSB0aGUgc2V0IG9mIGFsbFxuICAvLyBzcHJlYWRzIHVzZWQgKHRyYW5zaXRpdmVseSkgYnkgYW55IG9wZXJhdGlvbnMgaW4gdGhlIGRvY3VtZW50LlxuICBjb25zdCBhbGxGcmFnbWVudE5hbWVzVXNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBkb2NXaXRob3V0RGlyZWN0aXZlU3VidHJlZXMuZGVmaW5pdGlvbnMuZm9yRWFjaCgoZGVmKSA9PiB7XG4gICAgaWYgKGRlZi5raW5kID09PSBLaW5kLk9QRVJBVElPTl9ERUZJTklUSU9OKSB7XG4gICAgICBwb3B1bGF0ZVRyYW5zaXRpdmVWYXJzKFxuICAgICAgICBnZXRJblVzZUJ5T3BlcmF0aW9uTmFtZShkZWYubmFtZSAmJiBkZWYubmFtZS52YWx1ZSlcbiAgICAgICkuZnJhZ21lbnRTcHJlYWRzLmZvckVhY2goKGNoaWxkRnJhZ21lbnROYW1lKSA9PiB7XG4gICAgICAgIGFsbEZyYWdtZW50TmFtZXNVc2VkLmFkZChjaGlsZEZyYWdtZW50TmFtZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZGVmLmtpbmQgPT09IEtpbmQuRlJBR01FTlRfREVGSU5JVElPTiAmJlxuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIG9wZXJhdGlvbnMgaW4gdGhlIGRvY3VtZW50LCB0aGVuIGFsbCBmcmFnbWVudFxuICAgICAgLy8gZGVmaW5pdGlvbnMgY291bnQgYXMgdXNhZ2VzIG9mIHRoZWlyIG93biBmcmFnbWVudCBuYW1lcy4gVGhpcyBoZXVyaXN0aWNcbiAgICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSByZW1vdmluZyBhbGwgZnJhZ21lbnQgZGVmaW5pdGlvbnMgZnJvbSB0aGVcbiAgICAgIC8vIGRvY3VtZW50IGp1c3QgYmVjYXVzZSBpdCBjb250YWlucyBubyBvcGVyYXRpb25zIHRoYXQgdXNlIHRoZSBmcmFnbWVudHMuXG4gICAgICBvcGVyYXRpb25Db3VudCA9PT0gMCAmJlxuICAgICAgIWdldEluVXNlQnlGcmFnbWVudE5hbWUoZGVmLm5hbWUudmFsdWUpLnJlbW92ZWRcbiAgICApIHtcbiAgICAgIGFsbEZyYWdtZW50TmFtZXNVc2VkLmFkZChkZWYubmFtZS52YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhZGRlZCBhbGwgZnJhZ21lbnQgc3ByZWFkcyB1c2VkIGJ5IG9wZXJhdGlvbnMgdG8gdGhlXG4gIC8vIGFsbEZyYWdtZW50TmFtZXNVc2VkIHNldCwgd2UgY2FuIGNvbXBsZXRlIHRoZSBzZXQgYnkgdHJhbnNpdGl2ZWx5IGFkZGluZ1xuICAvLyBhbGwgZnJhZ21lbnQgc3ByZWFkcyB1c2VkIGJ5IHRob3NlIGZyYWdtZW50cywgYW5kIHNvIG9uLlxuICBhbGxGcmFnbWVudE5hbWVzVXNlZC5mb3JFYWNoKChmcmFnbWVudE5hbWUpID0+IHtcbiAgICAvLyBPbmNlIGFsbCB0aGUgY2hpbGRGcmFnbWVudE5hbWUgc3RyaW5ncyBhZGRlZCBoZXJlIGhhdmUgYmVlbiBzZWVuIGFscmVhZHksXG4gICAgLy8gdGhlIHRvcC1sZXZlbCBhbGxGcmFnbWVudE5hbWVzVXNlZC5mb3JFYWNoIGxvb3Agd2lsbCB0ZXJtaW5hdGUuXG4gICAgcG9wdWxhdGVUcmFuc2l0aXZlVmFycyhcbiAgICAgIGdldEluVXNlQnlGcmFnbWVudE5hbWUoZnJhZ21lbnROYW1lKVxuICAgICkuZnJhZ21lbnRTcHJlYWRzLmZvckVhY2goKGNoaWxkRnJhZ21lbnROYW1lKSA9PiB7XG4gICAgICBhbGxGcmFnbWVudE5hbWVzVXNlZC5hZGQoY2hpbGRGcmFnbWVudE5hbWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBmcmFnbWVudFdpbGxCZVJlbW92ZWQgPSAoZnJhZ21lbnROYW1lOiBzdHJpbmcpID0+XG4gICAgISEoXG4gICAgICAvLyBBIGZyYWdtZW50IGRlZmluaXRpb24gd2lsbCBiZSByZW1vdmVkIGlmIHRoZXJlIGFyZSBubyBzcHJlYWRzIHRoYXQgcmVmZXJcbiAgICAgIC8vIHRvIGl0LCBvciB0aGUgZnJhZ21lbnQgd2FzIGV4cGxpY2l0bHkgcmVtb3ZlZCBiZWNhdXNlIGl0IGhhZCBubyBmaWVsZHNcbiAgICAgIC8vIG90aGVyIHRoYW4gX190eXBlbmFtZS5cbiAgICAgIChcbiAgICAgICAgIWFsbEZyYWdtZW50TmFtZXNVc2VkLmhhcyhmcmFnbWVudE5hbWUpIHx8XG4gICAgICAgIGdldEluVXNlQnlGcmFnbWVudE5hbWUoZnJhZ21lbnROYW1lKS5yZW1vdmVkXG4gICAgICApXG4gICAgKTtcblxuICBjb25zdCBlbnRlclZpc2l0b3I6IEVudGVyTGVhdmVWaXNpdG9yPFxuICAgIEZyYWdtZW50U3ByZWFkTm9kZSB8IEZyYWdtZW50RGVmaW5pdGlvbk5vZGVcbiAgPiA9IHtcbiAgICBlbnRlcihub2RlKSB7XG4gICAgICBpZiAoZnJhZ21lbnRXaWxsQmVSZW1vdmVkKG5vZGUubmFtZS52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gbnVsbElmRG9jSXNFbXB0eShcbiAgICB2aXNpdChkb2NXaXRob3V0RGlyZWN0aXZlU3VidHJlZXMsIHtcbiAgICAgIC8vIElmIHRoZSBmcmFnbWVudCBpcyBnb2luZyB0byBiZSByZW1vdmVkLCB0aGVuIGxlYXZpbmcgYW55IGRhbmdsaW5nXG4gICAgICAvLyBGcmFnbWVudFNwcmVhZCBub2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgd291bGQgYmUgYSBtaXN0YWtlLlxuICAgICAgRnJhZ21lbnRTcHJlYWQ6IGVudGVyVmlzaXRvcixcblxuICAgICAgLy8gVGhpcyBpcyB3aGVyZSB0aGUgZnJhZ21lbnQgZGVmaW5pdGlvbiBpcyBhY3R1YWxseSByZW1vdmVkLlxuICAgICAgRnJhZ21lbnREZWZpbml0aW9uOiBlbnRlclZpc2l0b3IsXG5cbiAgICAgIE9wZXJhdGlvbkRlZmluaXRpb246IHtcbiAgICAgICAgbGVhdmUobm9kZSkge1xuICAgICAgICAgIC8vIFVwb24gbGVhdmluZyBlYWNoIG9wZXJhdGlvbiBpbiB0aGUgZGVwdGgtZmlyc3QgQVNUIHRyYXZlcnNhbCwgcHJ1bmVcbiAgICAgICAgICAvLyBhbnkgdmFyaWFibGVzIHRoYXQgYXJlIGRlY2xhcmVkIGJ5IHRoZSBvcGVyYXRpb24gYnV0IHVudXNlZCB3aXRoaW4uXG4gICAgICAgICAgaWYgKG5vZGUudmFyaWFibGVEZWZpbml0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgdXNlZFZhcmlhYmxlTmFtZXMgPSBwb3B1bGF0ZVRyYW5zaXRpdmVWYXJzKFxuICAgICAgICAgICAgICAvLyBJZiBhbiBvcGVyYXRpb24gaXMgYW5vbnltb3VzLCB3ZSB1c2UgdGhlIGVtcHR5IHN0cmluZyBhcyBpdHMga2V5LlxuICAgICAgICAgICAgICBnZXRJblVzZUJ5T3BlcmF0aW9uTmFtZShub2RlLm5hbWUgJiYgbm9kZS5uYW1lLnZhbHVlKVxuICAgICAgICAgICAgKS50cmFuc2l0aXZlVmFycyE7XG5cbiAgICAgICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgR3JhcGhRTCBzcGVjLCBhbGwgdmFyaWFibGVzIGRlY2xhcmVkIGJ5IGFuXG4gICAgICAgICAgICAvLyBvcGVyYXRpb24gbXVzdCBlaXRoZXIgYmUgdXNlZCBieSB0aGF0IG9wZXJhdGlvbiBvciB1c2VkIGJ5IHNvbWVcbiAgICAgICAgICAgIC8vIGZyYWdtZW50IGluY2x1ZGVkIHRyYW5zaXRpdmVseSBpbnRvIHRoYXQgb3BlcmF0aW9uOlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9zcGVjLmdyYXBocWwub3JnL2RyYWZ0LyNzZWMtQWxsLVZhcmlhYmxlcy1Vc2VkXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVG8gc3RheSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGlzIHZhbGlkYXRpb24gcnVsZSwgaWYvd2hlbiB3ZVxuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBsYXN0ICR2YXIgcmVmZXJlbmNlcyBmcm9tIGFuIG9wZXJhdGlvbiBvciBpdHMgZnJhZ21lbnRzLFxuICAgICAgICAgICAgLy8gd2UgbXVzdCBhbHNvIHJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyAkdmFyIGRlY2xhcmF0aW9uIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBlbmNsb3Npbmcgb3BlcmF0aW9uLiBUaGlzIHBydW5pbmcgYXBwbGllcyBvbmx5IHRvIG9wZXJhdGlvbnMgYW5kXG4gICAgICAgICAgICAvLyBub3QgZnJhZ21lbnQgZGVmaW5pdGlvbnMsIGF0IHRoZSBtb21lbnQuIEZyYWdtZW50cyBtYXkgYmUgYWJsZSB0b1xuICAgICAgICAgICAgLy8gZGVjbGFyZSB2YXJpYWJsZXMgZXZlbnR1YWxseSwgYnV0IHRvZGF5IHRoZXkgY2FuIG9ubHkgY29uc3VtZSB0aGVtLlxuICAgICAgICAgICAgaWYgKHVzZWRWYXJpYWJsZU5hbWVzLnNpemUgPCBub2RlLnZhcmlhYmxlRGVmaW5pdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgICAgICB2YXJpYWJsZURlZmluaXRpb25zOiBub2RlLnZhcmlhYmxlRGVmaW5pdGlvbnMuZmlsdGVyKCh2YXJEZWYpID0+XG4gICAgICAgICAgICAgICAgICB1c2VkVmFyaWFibGVOYW1lcy5oYXModmFyRGVmLnZhcmlhYmxlLm5hbWUudmFsdWUpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBjb25zdCBhZGRUeXBlbmFtZVRvRG9jdW1lbnQgPSBPYmplY3QuYXNzaWduKFxuICBmdW5jdGlvbiA8VE5vZGUgZXh0ZW5kcyBBU1ROb2RlPihkb2M6IFROb2RlKTogVE5vZGUge1xuICAgIHJldHVybiB2aXNpdChkb2MsIHtcbiAgICAgIFNlbGVjdGlvblNldDoge1xuICAgICAgICBlbnRlcihub2RlLCBfa2V5LCBwYXJlbnQpIHtcbiAgICAgICAgICAvLyBEb24ndCBhZGQgX190eXBlbmFtZSB0byBPcGVyYXRpb25EZWZpbml0aW9ucy5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJlbnQgJiZcbiAgICAgICAgICAgIChwYXJlbnQgYXMgT3BlcmF0aW9uRGVmaW5pdGlvbk5vZGUpLmtpbmQgPT09XG4gICAgICAgICAgICAgIEtpbmQuT1BFUkFUSU9OX0RFRklOSVRJT05cbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBObyBjaGFuZ2VzIGlmIG5vIHNlbGVjdGlvbnMuXG4gICAgICAgICAgY29uc3QgeyBzZWxlY3Rpb25zIH0gPSBub2RlO1xuICAgICAgICAgIGlmICghc2VsZWN0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHNlbGVjdGlvbnMgYWxyZWFkeSBoYXZlIGEgX190eXBlbmFtZSwgb3IgYXJlIHBhcnQgb2YgYW5cbiAgICAgICAgICAvLyBpbnRyb3NwZWN0aW9uIHF1ZXJ5LCBkbyBub3RoaW5nLlxuICAgICAgICAgIGNvbnN0IHNraXAgPSBzZWxlY3Rpb25zLnNvbWUoKHNlbGVjdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgaXNGaWVsZChzZWxlY3Rpb24pICYmXG4gICAgICAgICAgICAgIChzZWxlY3Rpb24ubmFtZS52YWx1ZSA9PT0gXCJfX3R5cGVuYW1lXCIgfHxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24ubmFtZS52YWx1ZS5sYXN0SW5kZXhPZihcIl9fXCIsIDApID09PSAwKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoc2tpcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHRoaXMgU2VsZWN0aW9uU2V0IGlzIEBleHBvcnQtZWQgYXMgYW4gaW5wdXQgdmFyaWFibGUsIGl0IHNob3VsZFxuICAgICAgICAgIC8vIG5vdCBoYXZlIGEgX190eXBlbmFtZSBmaWVsZCAoc2VlIGlzc3VlICM0NjkxKS5cbiAgICAgICAgICBjb25zdCBmaWVsZCA9IHBhcmVudCBhcyBGaWVsZE5vZGU7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGaWVsZChmaWVsZCkgJiZcbiAgICAgICAgICAgIGZpZWxkLmRpcmVjdGl2ZXMgJiZcbiAgICAgICAgICAgIGZpZWxkLmRpcmVjdGl2ZXMuc29tZSgoZCkgPT4gZC5uYW1lLnZhbHVlID09PSBcImV4cG9ydFwiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFNlbGVjdGlvblNldCB3aXRoIGEgX190eXBlbmFtZSBGaWVsZC5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IFsuLi5zZWxlY3Rpb25zLCBUWVBFTkFNRV9GSUVMRF0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0sXG4gIHtcbiAgICBhZGRlZChmaWVsZDogRmllbGROb2RlKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZmllbGQgPT09IFRZUEVOQU1FX0ZJRUxEO1xuICAgIH0sXG4gIH1cbik7XG5cbmNvbnN0IGNvbm5lY3Rpb25SZW1vdmVDb25maWcgPSB7XG4gIHRlc3Q6IChkaXJlY3RpdmU6IERpcmVjdGl2ZU5vZGUpID0+IHtcbiAgICBjb25zdCB3aWxsUmVtb3ZlID0gZGlyZWN0aXZlLm5hbWUudmFsdWUgPT09IFwiY29ubmVjdGlvblwiO1xuICAgIGlmICh3aWxsUmVtb3ZlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFkaXJlY3RpdmUuYXJndW1lbnRzIHx8XG4gICAgICAgICFkaXJlY3RpdmUuYXJndW1lbnRzLnNvbWUoKGFyZykgPT4gYXJnLm5hbWUudmFsdWUgPT09IFwia2V5XCIpXG4gICAgICApIHtcbiAgICAgICAgaW52YXJpYW50Lndhcm4oXG4gICAgICAgICAgXCJSZW1vdmluZyBhbiBAY29ubmVjdGlvbiBkaXJlY3RpdmUgZXZlbiB0aG91Z2ggaXQgZG9lcyBub3QgaGF2ZSBhIGtleS4gXCIgK1xuICAgICAgICAgICAgXCJZb3UgbWF5IHdhbnQgdG8gdXNlIHRoZSBrZXkgcGFyYW1ldGVyIHRvIHNwZWNpZnkgYSBzdG9yZSBrZXkuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gd2lsbFJlbW92ZTtcbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDb25uZWN0aW9uRGlyZWN0aXZlRnJvbURvY3VtZW50KGRvYzogRG9jdW1lbnROb2RlKSB7XG4gIHJldHVybiByZW1vdmVEaXJlY3RpdmVzRnJvbURvY3VtZW50KFxuICAgIFtjb25uZWN0aW9uUmVtb3ZlQ29uZmlnXSxcbiAgICBjaGVja0RvY3VtZW50KGRvYylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzRGlyZWN0aXZlc0luU2VsZWN0aW9uU2V0KFxuICBkaXJlY3RpdmVzOiBHZXREaXJlY3RpdmVDb25maWdbXSxcbiAgc2VsZWN0aW9uU2V0OiBTZWxlY3Rpb25TZXROb2RlIHwgdW5kZWZpbmVkLFxuICBuZXN0ZWRDaGVjayA9IHRydWVcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgICEhc2VsZWN0aW9uU2V0ICYmXG4gICAgc2VsZWN0aW9uU2V0LnNlbGVjdGlvbnMgJiZcbiAgICBzZWxlY3Rpb25TZXQuc2VsZWN0aW9ucy5zb21lKChzZWxlY3Rpb24pID0+XG4gICAgICBoYXNEaXJlY3RpdmVzSW5TZWxlY3Rpb24oZGlyZWN0aXZlcywgc2VsZWN0aW9uLCBuZXN0ZWRDaGVjaylcbiAgICApXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhc0RpcmVjdGl2ZXNJblNlbGVjdGlvbihcbiAgZGlyZWN0aXZlczogR2V0RGlyZWN0aXZlQ29uZmlnW10sXG4gIHNlbGVjdGlvbjogU2VsZWN0aW9uTm9kZSxcbiAgbmVzdGVkQ2hlY2sgPSB0cnVlXG4pOiBib29sZWFuIHtcbiAgaWYgKCFpc0ZpZWxkKHNlbGVjdGlvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghc2VsZWN0aW9uLmRpcmVjdGl2ZXMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIHNlbGVjdGlvbi5kaXJlY3RpdmVzLnNvbWUoZ2V0RGlyZWN0aXZlTWF0Y2hlcihkaXJlY3RpdmVzKSkgfHxcbiAgICAobmVzdGVkQ2hlY2sgJiZcbiAgICAgIGhhc0RpcmVjdGl2ZXNJblNlbGVjdGlvblNldChcbiAgICAgICAgZGlyZWN0aXZlcyxcbiAgICAgICAgc2VsZWN0aW9uLnNlbGVjdGlvblNldCxcbiAgICAgICAgbmVzdGVkQ2hlY2tcbiAgICAgICkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEFyZ3VtZW50TWF0Y2hlcihjb25maWc6IFJlbW92ZUFyZ3VtZW50c0NvbmZpZ1tdKSB7XG4gIHJldHVybiBmdW5jdGlvbiBhcmd1bWVudE1hdGNoZXIoYXJndW1lbnQ6IEFyZ3VtZW50Tm9kZSkge1xuICAgIHJldHVybiBjb25maWcuc29tZShcbiAgICAgIChhQ29uZmlnOiBSZW1vdmVBcmd1bWVudHNDb25maWcpID0+XG4gICAgICAgIGFyZ3VtZW50LnZhbHVlICYmXG4gICAgICAgIGFyZ3VtZW50LnZhbHVlLmtpbmQgPT09IEtpbmQuVkFSSUFCTEUgJiZcbiAgICAgICAgYXJndW1lbnQudmFsdWUubmFtZSAmJlxuICAgICAgICAoYUNvbmZpZy5uYW1lID09PSBhcmd1bWVudC52YWx1ZS5uYW1lLnZhbHVlIHx8XG4gICAgICAgICAgKGFDb25maWcudGVzdCAmJiBhQ29uZmlnLnRlc3QoYXJndW1lbnQpKSlcbiAgICApO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXJndW1lbnRzRnJvbURvY3VtZW50KFxuICBjb25maWc6IFJlbW92ZUFyZ3VtZW50c0NvbmZpZ1tdLFxuICBkb2M6IERvY3VtZW50Tm9kZVxuKTogRG9jdW1lbnROb2RlIHwgbnVsbCB7XG4gIGNvbnN0IGFyZ01hdGNoZXIgPSBnZXRBcmd1bWVudE1hdGNoZXIoY29uZmlnKTtcblxuICByZXR1cm4gbnVsbElmRG9jSXNFbXB0eShcbiAgICB2aXNpdChkb2MsIHtcbiAgICAgIE9wZXJhdGlvbkRlZmluaXRpb246IHtcbiAgICAgICAgZW50ZXIobm9kZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLy8gUmVtb3ZlIG1hdGNoaW5nIHRvcCBsZXZlbCB2YXJpYWJsZXMgZGVmaW5pdGlvbnMuXG4gICAgICAgICAgICB2YXJpYWJsZURlZmluaXRpb25zOlxuICAgICAgICAgICAgICBub2RlLnZhcmlhYmxlRGVmaW5pdGlvbnMgP1xuICAgICAgICAgICAgICAgIG5vZGUudmFyaWFibGVEZWZpbml0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAodmFyRGVmKSA9PlxuICAgICAgICAgICAgICAgICAgICAhY29uZmlnLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgKGFyZykgPT4gYXJnLm5hbWUgPT09IHZhckRlZi52YXJpYWJsZS5uYW1lLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIEZpZWxkOiB7XG4gICAgICAgIGVudGVyKG5vZGUpIHtcbiAgICAgICAgICAvLyBJZiBgcmVtb3ZlYCBpcyBzZXQgdG8gdHJ1ZSBmb3IgYW4gYXJndW1lbnQsIGFuZCBhbiBhcmd1bWVudCBtYXRjaFxuICAgICAgICAgIC8vIGlzIGZvdW5kIGZvciBhIGZpZWxkLCByZW1vdmUgdGhlIGZpZWxkIGFzIHdlbGwuXG4gICAgICAgICAgY29uc3Qgc2hvdWxkUmVtb3ZlRmllbGQgPSBjb25maWcuc29tZShcbiAgICAgICAgICAgIChhcmdDb25maWcpID0+IGFyZ0NvbmZpZy5yZW1vdmVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUZpZWxkKSB7XG4gICAgICAgICAgICBsZXQgYXJnTWF0Y2hDb3VudCA9IDA7XG4gICAgICAgICAgICBpZiAobm9kZS5hcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgbm9kZS5hcmd1bWVudHMuZm9yRWFjaCgoYXJnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ01hdGNoZXIoYXJnKSkge1xuICAgICAgICAgICAgICAgICAgYXJnTWF0Y2hDb3VudCArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhcmdNYXRjaENvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIEFyZ3VtZW50OiB7XG4gICAgICAgIGVudGVyKG5vZGUpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgYWxsIG1hdGNoaW5nIGFyZ3VtZW50cy5cbiAgICAgICAgICBpZiAoYXJnTWF0Y2hlcihub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRnJhZ21lbnRTcHJlYWRGcm9tRG9jdW1lbnQoXG4gIGNvbmZpZzogUmVtb3ZlRnJhZ21lbnRTcHJlYWRDb25maWdbXSxcbiAgZG9jOiBEb2N1bWVudE5vZGVcbik6IERvY3VtZW50Tm9kZSB8IG51bGwge1xuICBmdW5jdGlvbiBlbnRlcihcbiAgICBub2RlOiBGcmFnbWVudFNwcmVhZE5vZGUgfCBGcmFnbWVudERlZmluaXRpb25Ob2RlXG4gICk6IG51bGwgfCB2b2lkIHtcbiAgICBpZiAoY29uZmlnLnNvbWUoKGRlZikgPT4gZGVmLm5hbWUgPT09IG5vZGUubmFtZS52YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsSWZEb2NJc0VtcHR5KFxuICAgIHZpc2l0KGRvYywge1xuICAgICAgRnJhZ21lbnRTcHJlYWQ6IHsgZW50ZXIgfSxcbiAgICAgIEZyYWdtZW50RGVmaW5pdGlvbjogeyBlbnRlciB9LFxuICAgIH0pXG4gICk7XG59XG5cbi8vIElmIHRoZSBpbmNvbWluZyBkb2N1bWVudCBpcyBhIHF1ZXJ5LCByZXR1cm4gaXQgYXMgaXMuIE90aGVyd2lzZSwgYnVpbGQgYVxuLy8gbmV3IGRvY3VtZW50IGNvbnRhaW5pbmcgYSBxdWVyeSBvcGVyYXRpb24gYmFzZWQgb24gdGhlIHNlbGVjdGlvbiBzZXRcbi8vIG9mIHRoZSBwcmV2aW91cyBtYWluIG9wZXJhdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFF1ZXJ5RnJvbVNlbGVjdGlvblNldChcbiAgZG9jdW1lbnQ6IERvY3VtZW50Tm9kZVxuKTogRG9jdW1lbnROb2RlIHtcbiAgY29uc3QgZGVmaW5pdGlvbiA9IGdldE1haW5EZWZpbml0aW9uKGRvY3VtZW50KTtcbiAgY29uc3QgZGVmaW5pdGlvbk9wZXJhdGlvbiA9ICg8T3BlcmF0aW9uRGVmaW5pdGlvbk5vZGU+ZGVmaW5pdGlvbikub3BlcmF0aW9uO1xuXG4gIGlmIChkZWZpbml0aW9uT3BlcmF0aW9uID09PSBcInF1ZXJ5XCIpIHtcbiAgICAvLyBBbHJlYWR5IGEgcXVlcnksIHNvIHJldHVybiB0aGUgZXhpc3RpbmcgZG9jdW1lbnQuXG4gICAgcmV0dXJuIGRvY3VtZW50O1xuICB9XG5cbiAgLy8gQnVpbGQgYSBuZXcgcXVlcnkgdXNpbmcgdGhlIHNlbGVjdGlvbiBzZXQgb2YgdGhlIG1haW4gb3BlcmF0aW9uLlxuICBjb25zdCBtb2RpZmllZERvYyA9IHZpc2l0KGRvY3VtZW50LCB7XG4gICAgT3BlcmF0aW9uRGVmaW5pdGlvbjoge1xuICAgICAgZW50ZXIobm9kZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgb3BlcmF0aW9uOiBcInF1ZXJ5XCIsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gbW9kaWZpZWREb2M7XG59XG5cbi8vIFJlbW92ZSBmaWVsZHMgLyBzZWxlY3Rpb24gc2V0cyB0aGF0IGluY2x1ZGUgYW4gQGNsaWVudCBkaXJlY3RpdmUuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQ2xpZW50U2V0c0Zyb21Eb2N1bWVudChcbiAgZG9jdW1lbnQ6IERvY3VtZW50Tm9kZVxuKTogRG9jdW1lbnROb2RlIHwgbnVsbCB7XG4gIGNoZWNrRG9jdW1lbnQoZG9jdW1lbnQpO1xuXG4gIGxldCBtb2RpZmllZERvYyA9IHJlbW92ZURpcmVjdGl2ZXNGcm9tRG9jdW1lbnQoXG4gICAgW1xuICAgICAge1xuICAgICAgICB0ZXN0OiAoZGlyZWN0aXZlOiBEaXJlY3RpdmVOb2RlKSA9PiBkaXJlY3RpdmUubmFtZS52YWx1ZSA9PT0gXCJjbGllbnRcIixcbiAgICAgICAgcmVtb3ZlOiB0cnVlLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGRvY3VtZW50XG4gICk7XG5cbiAgcmV0dXJuIG1vZGlmaWVkRG9jO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkTm9uUmVhY3RpdmVUb05hbWVkRnJhZ21lbnRzKGRvY3VtZW50OiBEb2N1bWVudE5vZGUpIHtcbiAgY2hlY2tEb2N1bWVudChkb2N1bWVudCk7XG5cbiAgcmV0dXJuIHZpc2l0KGRvY3VtZW50LCB7XG4gICAgRnJhZ21lbnRTcHJlYWQ6IChub2RlKSA9PiB7XG4gICAgICAvLyBEbyBub3QgYWRkIGBAbm9ucmVhY3RpdmVgIGlmIHRoZSBmcmFnbWVudCBpcyBtYXJrZWQgd2l0aCBgQHVubWFza2BcbiAgICAgIC8vIHNpbmNlIHdlIHdhbnQgdG8gcmVhY3QgdG8gY2hhbmdlcyBpbiB0aGlzIGZyYWdtZW50LlxuICAgICAgaWYgKFxuICAgICAgICBub2RlLmRpcmVjdGl2ZXM/LnNvbWUoKGRpcmVjdGl2ZSkgPT4gZGlyZWN0aXZlLm5hbWUudmFsdWUgPT09IFwidW5tYXNrXCIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5ub2RlLFxuICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgLi4uKG5vZGUuZGlyZWN0aXZlcyB8fCBbXSksXG4gICAgICAgICAge1xuICAgICAgICAgICAga2luZDogS2luZC5ESVJFQ1RJVkUsXG4gICAgICAgICAgICBuYW1lOiB7IGtpbmQ6IEtpbmQuTkFNRSwgdmFsdWU6IFwibm9ucmVhY3RpdmVcIiB9LFxuICAgICAgICAgIH0gc2F0aXNmaWVzIERpcmVjdGl2ZU5vZGUsXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0sXG4gIH0pO1xufVxuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXX0=