@cdktn/provider-schema 0.24.0-pre.88 → 0.24.0-pre.89

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/cache.js CHANGED
@@ -33,10 +33,16 @@ const fs = __importStar(require("fs-extra"));
33
33
  const path = __importStar(require("path"));
34
34
  // We keep this very simple since the caching feature is experimental
35
35
  // we might need to do housekeeping / include terraform / cdktf version in the future
36
- function cacheKey(input) {
37
- return `${encodeURIComponent(input.fqn)}@${encodeURIComponent(input.version || "")}`;
36
+ //
37
+ // keySuffix distinguishes cache entries fetched by different CLIs/versions
38
+ // (e.g. "terraform-1.7") so a schema fetched by a CLI too old to emit newer
39
+ // sections (functions, ephemeral resources, ...) isn't served up as if it
40
+ // were a complete fetch. See read.ts.
41
+ function cacheKey(input, keySuffix) {
42
+ const base = `${encodeURIComponent(input.fqn)}@${encodeURIComponent(input.version || "")}`;
43
+ return keySuffix ? `${base}@${encodeURIComponent(keySuffix)}` : base;
38
44
  }
39
- function cachedAccess(producer, cacheDir) {
45
+ function cachedAccess(producer, cacheDir, keySuffix) {
40
46
  const cacheEnabled = typeof cacheDir === "string" && cacheDir.length > 0;
41
47
  if (cacheEnabled && !fs.lstatSync(cacheDir).isDirectory()) {
42
48
  throw commons_1.Errors.Usage(`Provider Schema Cache directory '${cacheDir}' is not a directory`);
@@ -49,7 +55,7 @@ function cachedAccess(producer, cacheDir) {
49
55
  }
50
56
  commons_1.logger.debug(`Provider Schema Cache enabled, caching at ${cacheDir}`);
51
57
  return async (input) => {
52
- const key = cacheKey(input);
58
+ const key = cacheKey(input, keySuffix);
53
59
  const cachePath = path.join(cacheDir, `${key}.json`);
54
60
  if (fs.existsSync(cachePath)) {
55
61
  commons_1.logger.debug(`Cache hit for ${key}`);
@@ -63,4 +69,4 @@ function cachedAccess(producer, cacheDir) {
63
69
  };
64
70
  }
65
71
  exports.cachedAccess = cachedAccess;
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw0Q0FBdUU7QUFDdkUsNkNBQStCO0FBQy9CLDJDQUE2QjtBQUU3QixxRUFBcUU7QUFDckUscUZBQXFGO0FBQ3JGLFNBQVMsUUFBUSxDQUFDLEtBQTRCO0lBQzVDLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksa0JBQWtCLENBQzNELEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRSxDQUNwQixFQUFFLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUMxQixRQUFrQyxFQUNsQyxRQUF3QjtJQUV4QixNQUFNLFlBQVksR0FBRyxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFekUsSUFBSSxZQUFZLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQWtCLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ3BFLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQ2hCLG9DQUFvQyxRQUFRLHNCQUFzQixDQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNmLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyw2Q0FBNkMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN0RSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNyQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzdCLGdCQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFNLENBQUM7UUFDaEUsQ0FBQztRQUNELGdCQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDLENBQUM7UUFFekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDdEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQWxDRCxvQ0FrQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuICovXG5cbmltcG9ydCB7IENvbnN0cnVjdHNNYWtlclRhcmdldCwgbG9nZ2VyLCBFcnJvcnMgfSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG4vLyBXZSBrZWVwIHRoaXMgdmVyeSBzaW1wbGUgc2luY2UgdGhlIGNhY2hpbmcgZmVhdHVyZSBpcyBleHBlcmltZW50YWxcbi8vIHdlIG1pZ2h0IG5lZWQgdG8gZG8gaG91c2VrZWVwaW5nIC8gaW5jbHVkZSB0ZXJyYWZvcm0gLyBjZGt0ZiB2ZXJzaW9uIGluIHRoZSBmdXR1cmVcbmZ1bmN0aW9uIGNhY2hlS2V5KGlucHV0OiBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGlucHV0LmZxbil9QCR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgIGlucHV0LnZlcnNpb24gfHwgXCJcIixcbiAgKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVkQWNjZXNzPEkgZXh0ZW5kcyBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQsIE8+KFxuICBwcm9kdWNlcjogKGlucHV0OiBJKSA9PiBQcm9taXNlPE8+LFxuICBjYWNoZURpcj86IHN0cmluZyB8IG51bGwsXG4pOiAoaW5wdXQ6IEkpID0+IFByb21pc2U8Tz4ge1xuICBjb25zdCBjYWNoZUVuYWJsZWQgPSB0eXBlb2YgY2FjaGVEaXIgPT09IFwic3RyaW5nXCIgJiYgY2FjaGVEaXIubGVuZ3RoID4gMDtcblxuICBpZiAoY2FjaGVFbmFibGVkICYmICFmcy5sc3RhdFN5bmMoY2FjaGVEaXIgYXMgc3RyaW5nKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgdGhyb3cgRXJyb3JzLlVzYWdlKFxuICAgICAgYFByb3ZpZGVyIFNjaGVtYSBDYWNoZSBkaXJlY3RvcnkgJyR7Y2FjaGVEaXJ9JyBpcyBub3QgYSBkaXJlY3RvcnlgLFxuICAgICk7XG4gIH1cblxuICBpZiAoIWNhY2hlRW5hYmxlZCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgUHJvdmlkZXIgU2NoZW1hIENhY2hlIGRpc2FibGVkYCk7XG4gICAgcmV0dXJuIChpbnB1dCkgPT4ge1xuICAgICAgcmV0dXJuIHByb2R1Y2VyKGlucHV0KTtcbiAgICB9O1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGBQcm92aWRlciBTY2hlbWEgQ2FjaGUgZW5hYmxlZCwgY2FjaGluZyBhdCAke2NhY2hlRGlyfWApO1xuICByZXR1cm4gYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkoaW5wdXQpO1xuICAgIGNvbnN0IGNhY2hlUGF0aCA9IHBhdGguam9pbihjYWNoZURpciwgYCR7a2V5fS5qc29uYCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2FjaGVQYXRoKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBDYWNoZSBoaXQgZm9yICR7a2V5fWApO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUoY2FjaGVQYXRoLCBcInV0Zi04XCIpKSBhcyBPO1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoYENhY2hlIG1pc3MgZm9yICR7a2V5fSwgZ2VuZXJhdGluZyBzY2hlbWFgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2R1Y2VyKGlucHV0KTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoY2FjaGVQYXRoLCBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICBsb2dnZXIuZGVidWcoYFdyaXRlIGNhY2hlIGZvciAke2tleX1gKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuIl19
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw0Q0FBdUU7QUFDdkUsNkNBQStCO0FBQy9CLDJDQUE2QjtBQUU3QixxRUFBcUU7QUFDckUscUZBQXFGO0FBQ3JGLEVBQUU7QUFDRiwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLDBFQUEwRTtBQUMxRSxzQ0FBc0M7QUFDdEMsU0FBUyxRQUFRLENBQUMsS0FBNEIsRUFBRSxTQUFrQjtJQUNoRSxNQUFNLElBQUksR0FBRyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxrQkFBa0IsQ0FDakUsS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQ3BCLEVBQUUsQ0FBQztJQUNKLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDdkUsQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FDMUIsUUFBa0MsRUFDbEMsUUFBd0IsRUFDeEIsU0FBa0I7SUFFbEIsTUFBTSxZQUFZLEdBQUcsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRXpFLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFrQixDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUNwRSxNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUNoQixvQ0FBb0MsUUFBUSxzQkFBc0IsQ0FDbkUsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUMvQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDZixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdEUsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDckIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDckQsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDN0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQU0sQ0FBQztRQUNoRSxDQUFDO1FBQ0QsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcscUJBQXFCLENBQUMsQ0FBQztRQUV6RCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN0RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2QyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDO0FBbkNELG9DQW1DQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuaW1wb3J0IHsgQ29uc3RydWN0c01ha2VyVGFyZ2V0LCBsb2dnZXIsIEVycm9ycyB9IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbi8vIFdlIGtlZXAgdGhpcyB2ZXJ5IHNpbXBsZSBzaW5jZSB0aGUgY2FjaGluZyBmZWF0dXJlIGlzIGV4cGVyaW1lbnRhbFxuLy8gd2UgbWlnaHQgbmVlZCB0byBkbyBob3VzZWtlZXBpbmcgLyBpbmNsdWRlIHRlcnJhZm9ybSAvIGNka3RmIHZlcnNpb24gaW4gdGhlIGZ1dHVyZVxuLy9cbi8vIGtleVN1ZmZpeCBkaXN0aW5ndWlzaGVzIGNhY2hlIGVudHJpZXMgZmV0Y2hlZCBieSBkaWZmZXJlbnQgQ0xJcy92ZXJzaW9uc1xuLy8gKGUuZy4gXCJ0ZXJyYWZvcm0tMS43XCIpIHNvIGEgc2NoZW1hIGZldGNoZWQgYnkgYSBDTEkgdG9vIG9sZCB0byBlbWl0IG5ld2VyXG4vLyBzZWN0aW9ucyAoZnVuY3Rpb25zLCBlcGhlbWVyYWwgcmVzb3VyY2VzLCAuLi4pIGlzbid0IHNlcnZlZCB1cCBhcyBpZiBpdFxuLy8gd2VyZSBhIGNvbXBsZXRlIGZldGNoLiBTZWUgcmVhZC50cy5cbmZ1bmN0aW9uIGNhY2hlS2V5KGlucHV0OiBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQsIGtleVN1ZmZpeD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBgJHtlbmNvZGVVUklDb21wb25lbnQoaW5wdXQuZnFuKX1AJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgaW5wdXQudmVyc2lvbiB8fCBcIlwiLFxuICApfWA7XG4gIHJldHVybiBrZXlTdWZmaXggPyBgJHtiYXNlfUAke2VuY29kZVVSSUNvbXBvbmVudChrZXlTdWZmaXgpfWAgOiBiYXNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVkQWNjZXNzPEkgZXh0ZW5kcyBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQsIE8+KFxuICBwcm9kdWNlcjogKGlucHV0OiBJKSA9PiBQcm9taXNlPE8+LFxuICBjYWNoZURpcj86IHN0cmluZyB8IG51bGwsXG4gIGtleVN1ZmZpeD86IHN0cmluZyxcbik6IChpbnB1dDogSSkgPT4gUHJvbWlzZTxPPiB7XG4gIGNvbnN0IGNhY2hlRW5hYmxlZCA9IHR5cGVvZiBjYWNoZURpciA9PT0gXCJzdHJpbmdcIiAmJiBjYWNoZURpci5sZW5ndGggPiAwO1xuXG4gIGlmIChjYWNoZUVuYWJsZWQgJiYgIWZzLmxzdGF0U3luYyhjYWNoZURpciBhcyBzdHJpbmcpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICB0aHJvdyBFcnJvcnMuVXNhZ2UoXG4gICAgICBgUHJvdmlkZXIgU2NoZW1hIENhY2hlIGRpcmVjdG9yeSAnJHtjYWNoZURpcn0nIGlzIG5vdCBhIGRpcmVjdG9yeWAsXG4gICAgKTtcbiAgfVxuXG4gIGlmICghY2FjaGVFbmFibGVkKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBQcm92aWRlciBTY2hlbWEgQ2FjaGUgZGlzYWJsZWRgKTtcbiAgICByZXR1cm4gKGlucHV0KSA9PiB7XG4gICAgICByZXR1cm4gcHJvZHVjZXIoaW5wdXQpO1xuICAgIH07XG4gIH1cblxuICBsb2dnZXIuZGVidWcoYFByb3ZpZGVyIFNjaGVtYSBDYWNoZSBlbmFibGVkLCBjYWNoaW5nIGF0ICR7Y2FjaGVEaXJ9YCk7XG4gIHJldHVybiBhc3luYyAoaW5wdXQpID0+IHtcbiAgICBjb25zdCBrZXkgPSBjYWNoZUtleShpbnB1dCwga2V5U3VmZml4KTtcbiAgICBjb25zdCBjYWNoZVBhdGggPSBwYXRoLmpvaW4oY2FjaGVEaXIsIGAke2tleX0uanNvbmApO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGNhY2hlUGF0aCkpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2FjaGUgaGl0IGZvciAke2tleX1gKTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKGNhY2hlUGF0aCwgXCJ1dGYtOFwiKSkgYXMgTztcbiAgICB9XG4gICAgbG9nZ2VyLmRlYnVnKGBDYWNoZSBtaXNzIGZvciAke2tleX0sIGdlbmVyYXRpbmcgc2NoZW1hYCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9kdWNlcihpbnB1dCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGNhY2hlUGF0aCwgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgbG9nZ2VyLmRlYnVnKGBXcml0ZSBjYWNoZSBmb3IgJHtrZXl9YCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The newer-protocol schema sections that a fetching CLI only starts to
3
+ * *emit* in `terraform providers schema -json` as of a certain version.
4
+ *
5
+ * NOTE: these are emission boundaries, not language-support boundaries -
6
+ * e.g. provider functions are usable in HCL since Terraform 1.7.0, but only
7
+ * show up in the schema dump as of 1.8.0.
8
+ */
9
+ export type SchemaEmissionFamily = "functions" | "ephemeral_resource_schemas" | "write_only" | "resource_identity_schemas";
10
+ declare const TARGET_PRODUCTS: readonly ["terraform", "opentofu"];
11
+ type TargetProduct = (typeof TARGET_PRODUCTS)[number];
12
+ /**
13
+ * Hand-maintained from `tools/provider-feature-availability/features-matrix.json`
14
+ * — specifically each feature's `documented_emitted_from` /
15
+ * `observed_introduced` fields per product (see that directory's README for
16
+ * how the dataset itself is produced/regenerated, and its "In-repo
17
+ * consumers" section for how this map and `providerFeatureConstraints` in
18
+ * `packages/cdktn/src/provider-feature-constraints.ts` relate to the
19
+ * matrix and to each other).
20
+ *
21
+ * There is no automated check that this map stays in sync with the matrix;
22
+ * updates must be applied by hand when the matrix changes. An automated
23
+ * drift check is tracked in #309.
24
+ */
25
+ export declare const SCHEMA_EMISSION_BOUNDARIES: Record<SchemaEmissionFamily, Record<TargetProduct, string>>;
26
+ export declare const SCHEMA_EMISSION_FAMILY_LABELS: Record<SchemaEmissionFamily, string>;
27
+ export {};
28
+ //# sourceMappingURL=emission-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emission-check.d.ts","sourceRoot":"","sources":["../src/emission-check.ts"],"names":[],"mappings":"AASA;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAC5B,WAAW,GACX,4BAA4B,GAC5B,YAAY,GACZ,2BAA2B,CAAC;AAEhC,QAAA,MAAM,eAAe,oCAAqC,CAAC;AAC3D,KAAK,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAC7C,oBAAoB,EACpB,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAM9B,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAChD,oBAAoB,EACpB,MAAM,CAMP,CAAC"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.suggestedEmittingCliVersions = exports.checkSchemaEmissionGapFamilies = exports.checkSchemaEmissionGaps = exports.SCHEMA_EMISSION_FAMILY_LABELS = exports.SCHEMA_EMISSION_BOUNDARIES = void 0;
27
+ // Copyright (c) HashiCorp, Inc
28
+ // SPDX-License-Identifier: MPL-2.0
29
+ const semver = __importStar(require("semver"));
30
+ const TARGET_PRODUCTS = ["terraform", "opentofu"];
31
+ /**
32
+ * Hand-maintained from `tools/provider-feature-availability/features-matrix.json`
33
+ * — specifically each feature's `documented_emitted_from` /
34
+ * `observed_introduced` fields per product (see that directory's README for
35
+ * how the dataset itself is produced/regenerated, and its "In-repo
36
+ * consumers" section for how this map and `providerFeatureConstraints` in
37
+ * `packages/cdktn/src/provider-feature-constraints.ts` relate to the
38
+ * matrix and to each other).
39
+ *
40
+ * There is no automated check that this map stays in sync with the matrix;
41
+ * updates must be applied by hand when the matrix changes. An automated
42
+ * drift check is tracked in #309.
43
+ */
44
+ exports.SCHEMA_EMISSION_BOUNDARIES = {
45
+ functions: { terraform: "1.8.0", opentofu: "1.8.0" },
46
+ ephemeral_resource_schemas: { terraform: "1.10.0", opentofu: "1.11.0" },
47
+ write_only: { terraform: "1.11.0", opentofu: "1.11.0" },
48
+ resource_identity_schemas: { terraform: "1.12.0", opentofu: "1.12.0" },
49
+ };
50
+ exports.SCHEMA_EMISSION_FAMILY_LABELS = {
51
+ functions: "provider functions",
52
+ ephemeral_resource_schemas: "ephemeral resources",
53
+ write_only: "write-only attributes",
54
+ resource_identity_schemas: "resource identity",
55
+ };
56
+ /**
57
+ * Determines which schema-emission gaps the given fetching CLI has, in
58
+ * light of the project's declared `targetVersions`.
59
+ *
60
+ * A family is reported when both are true:
61
+ * - the fetching CLI's own version predates that family's emission
62
+ * boundary for its product (so this particular fetch could not have
63
+ * included the section, even if the provider implements it)
64
+ * - at least one of the project's targeted products declares a range that
65
+ * intersects the versions where that family is emitted (i.e. the project
66
+ * actually intends to run on versions where the feature would show up)
67
+ *
68
+ * @internal exposed for testing
69
+ */
70
+ function checkSchemaEmissionGaps(cli, targets) {
71
+ return checkSchemaEmissionGapFamilies(cli, targets).map((family) => exports.SCHEMA_EMISSION_FAMILY_LABELS[family]);
72
+ }
73
+ exports.checkSchemaEmissionGaps = checkSchemaEmissionGaps;
74
+ /**
75
+ * Same as checkSchemaEmissionGaps, but returns the raw family keys so
76
+ * callers can also compute a remedy (see suggestedEmittingCliVersions).
77
+ *
78
+ * @internal exposed for testing
79
+ */
80
+ function checkSchemaEmissionGapFamilies(cli, targets) {
81
+ if (cli.name === "unknown" || !cli.version)
82
+ return [];
83
+ const cliProduct = cli.name;
84
+ const gaps = [];
85
+ for (const family of Object.keys(exports.SCHEMA_EMISSION_BOUNDARIES)) {
86
+ const boundaries = exports.SCHEMA_EMISSION_BOUNDARIES[family];
87
+ const cliBoundary = boundaries[cliProduct];
88
+ if (!cliBoundary)
89
+ continue;
90
+ // The fetching CLI is new enough to emit this family - no gap.
91
+ if (!semver.lt(cli.version, cliBoundary))
92
+ continue;
93
+ const wanted = TARGET_PRODUCTS.some((product) => {
94
+ const targetRange = targets[product];
95
+ if (!targetRange)
96
+ return false;
97
+ if (semver.validRange(targetRange) === null)
98
+ return false;
99
+ const supportedRange = `>=${boundaries[product]}`;
100
+ try {
101
+ return semver.intersects(targetRange, supportedRange);
102
+ }
103
+ catch (_a) {
104
+ return false;
105
+ }
106
+ });
107
+ if (wanted)
108
+ gaps.push(family);
109
+ }
110
+ return gaps;
111
+ }
112
+ exports.checkSchemaEmissionGapFamilies = checkSchemaEmissionGapFamilies;
113
+ /**
114
+ * The lowest CLI version per product whose `providers schema -json` emits
115
+ * every one of the given families — the remedy to suggest alongside the
116
+ * fetch-time warning.
117
+ *
118
+ * @internal exposed for testing
119
+ */
120
+ function suggestedEmittingCliVersions(families) {
121
+ return TARGET_PRODUCTS.map((product) => {
122
+ const needed = families
123
+ .map((family) => exports.SCHEMA_EMISSION_BOUNDARIES[family][product])
124
+ .sort(semver.compare)
125
+ .pop();
126
+ return needed ? `${product} >=${needed}` : undefined;
127
+ })
128
+ .filter((part) => part !== undefined)
129
+ .join(" / ");
130
+ }
131
+ exports.suggestedEmittingCliVersions = suggestedEmittingCliVersions;
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1pc3Npb24tY2hlY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW1pc3Npb24tY2hlY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLCtDQUFpQztBQXFCakMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFVLENBQUM7QUFHM0Q7Ozs7Ozs7Ozs7OztHQVlHO0FBQ1UsUUFBQSwwQkFBMEIsR0FHbkM7SUFDRixTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDcEQsMEJBQTBCLEVBQUUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7SUFDdkUsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0lBQ3ZELHlCQUF5QixFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0NBQ3ZFLENBQUM7QUFFVyxRQUFBLDZCQUE2QixHQUd0QztJQUNGLFNBQVMsRUFBRSxvQkFBb0I7SUFDL0IsMEJBQTBCLEVBQUUscUJBQXFCO0lBQ2pELFVBQVUsRUFBRSx1QkFBdUI7SUFDbkMseUJBQXlCLEVBQUUsbUJBQW1CO0NBQy9DLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQ3JDLEdBQXdCLEVBQ3hCLE9BQWdDO0lBRWhDLE9BQU8sOEJBQThCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FDckQsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLHFDQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUNsRCxDQUFDO0FBQ0osQ0FBQztBQVBELDBEQU9DO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQiw4QkFBOEIsQ0FDNUMsR0FBd0IsRUFDeEIsT0FBZ0M7SUFFaEMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdEQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLElBQXFCLENBQUM7SUFFN0MsTUFBTSxJQUFJLEdBQTJCLEVBQUUsQ0FBQztJQUV4QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQzlCLGtDQUEwQixDQUNELEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxrQ0FBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFdBQVc7WUFBRSxTQUFTO1FBRTNCLCtEQUErRDtRQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQztZQUFFLFNBQVM7UUFFbkQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzlDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMvQixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxRCxNQUFNLGNBQWMsR0FBRyxLQUFLLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ3hELENBQUM7WUFBQyxXQUFNLENBQUM7Z0JBQ1AsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLE1BQU07WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFuQ0Qsd0VBbUNDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsNEJBQTRCLENBQzFDLFFBQWdDO0lBRWhDLE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLFFBQVE7YUFDcEIsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxrQ0FBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQzthQUNwQixHQUFHLEVBQUUsQ0FBQztRQUNULE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sTUFBTSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZELENBQUMsQ0FBQztTQUNDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztTQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakIsQ0FBQztBQVpELG9FQVlDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCAqIGFzIHNlbXZlciBmcm9tIFwic2VtdmVyXCI7XG5cbmltcG9ydCB0eXBlIHtcbiAgVGVycmFmb3JtQ2xpVmVyc2lvbixcbiAgVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuXG4vKipcbiAqIFRoZSBuZXdlci1wcm90b2NvbCBzY2hlbWEgc2VjdGlvbnMgdGhhdCBhIGZldGNoaW5nIENMSSBvbmx5IHN0YXJ0cyB0b1xuICogKmVtaXQqIGluIGB0ZXJyYWZvcm0gcHJvdmlkZXJzIHNjaGVtYSAtanNvbmAgYXMgb2YgYSBjZXJ0YWluIHZlcnNpb24uXG4gKlxuICogTk9URTogdGhlc2UgYXJlIGVtaXNzaW9uIGJvdW5kYXJpZXMsIG5vdCBsYW5ndWFnZS1zdXBwb3J0IGJvdW5kYXJpZXMgLVxuICogZS5nLiBwcm92aWRlciBmdW5jdGlvbnMgYXJlIHVzYWJsZSBpbiBIQ0wgc2luY2UgVGVycmFmb3JtIDEuNy4wLCBidXQgb25seVxuICogc2hvdyB1cCBpbiB0aGUgc2NoZW1hIGR1bXAgYXMgb2YgMS44LjAuXG4gKi9cbmV4cG9ydCB0eXBlIFNjaGVtYUVtaXNzaW9uRmFtaWx5ID1cbiAgfCBcImZ1bmN0aW9uc1wiXG4gIHwgXCJlcGhlbWVyYWxfcmVzb3VyY2Vfc2NoZW1hc1wiXG4gIHwgXCJ3cml0ZV9vbmx5XCJcbiAgfCBcInJlc291cmNlX2lkZW50aXR5X3NjaGVtYXNcIjtcblxuY29uc3QgVEFSR0VUX1BST0RVQ1RTID0gW1widGVycmFmb3JtXCIsIFwib3BlbnRvZnVcIl0gYXMgY29uc3Q7XG50eXBlIFRhcmdldFByb2R1Y3QgPSAodHlwZW9mIFRBUkdFVF9QUk9EVUNUUylbbnVtYmVyXTtcblxuLyoqXG4gKiBIYW5kLW1haW50YWluZWQgZnJvbSBgdG9vbHMvcHJvdmlkZXItZmVhdHVyZS1hdmFpbGFiaWxpdHkvZmVhdHVyZXMtbWF0cml4Lmpzb25gXG4gKiDigJQgc3BlY2lmaWNhbGx5IGVhY2ggZmVhdHVyZSdzIGBkb2N1bWVudGVkX2VtaXR0ZWRfZnJvbWAgL1xuICogYG9ic2VydmVkX2ludHJvZHVjZWRgIGZpZWxkcyBwZXIgcHJvZHVjdCAoc2VlIHRoYXQgZGlyZWN0b3J5J3MgUkVBRE1FIGZvclxuICogaG93IHRoZSBkYXRhc2V0IGl0c2VsZiBpcyBwcm9kdWNlZC9yZWdlbmVyYXRlZCwgYW5kIGl0cyBcIkluLXJlcG9cbiAqIGNvbnN1bWVyc1wiIHNlY3Rpb24gZm9yIGhvdyB0aGlzIG1hcCBhbmQgYHByb3ZpZGVyRmVhdHVyZUNvbnN0cmFpbnRzYCBpblxuICogYHBhY2thZ2VzL2Nka3RuL3NyYy9wcm92aWRlci1mZWF0dXJlLWNvbnN0cmFpbnRzLnRzYCByZWxhdGUgdG8gdGhlXG4gKiBtYXRyaXggYW5kIHRvIGVhY2ggb3RoZXIpLlxuICpcbiAqIFRoZXJlIGlzIG5vIGF1dG9tYXRlZCBjaGVjayB0aGF0IHRoaXMgbWFwIHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgbWF0cml4O1xuICogdXBkYXRlcyBtdXN0IGJlIGFwcGxpZWQgYnkgaGFuZCB3aGVuIHRoZSBtYXRyaXggY2hhbmdlcy4gQW4gYXV0b21hdGVkXG4gKiBkcmlmdCBjaGVjayBpcyB0cmFja2VkIGluICMzMDkuXG4gKi9cbmV4cG9ydCBjb25zdCBTQ0hFTUFfRU1JU1NJT05fQk9VTkRBUklFUzogUmVjb3JkPFxuICBTY2hlbWFFbWlzc2lvbkZhbWlseSxcbiAgUmVjb3JkPFRhcmdldFByb2R1Y3QsIHN0cmluZz5cbj4gPSB7XG4gIGZ1bmN0aW9uczogeyB0ZXJyYWZvcm06IFwiMS44LjBcIiwgb3BlbnRvZnU6IFwiMS44LjBcIiB9LFxuICBlcGhlbWVyYWxfcmVzb3VyY2Vfc2NoZW1hczogeyB0ZXJyYWZvcm06IFwiMS4xMC4wXCIsIG9wZW50b2Z1OiBcIjEuMTEuMFwiIH0sXG4gIHdyaXRlX29ubHk6IHsgdGVycmFmb3JtOiBcIjEuMTEuMFwiLCBvcGVudG9mdTogXCIxLjExLjBcIiB9LFxuICByZXNvdXJjZV9pZGVudGl0eV9zY2hlbWFzOiB7IHRlcnJhZm9ybTogXCIxLjEyLjBcIiwgb3BlbnRvZnU6IFwiMS4xMi4wXCIgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBTQ0hFTUFfRU1JU1NJT05fRkFNSUxZX0xBQkVMUzogUmVjb3JkPFxuICBTY2hlbWFFbWlzc2lvbkZhbWlseSxcbiAgc3RyaW5nXG4+ID0ge1xuICBmdW5jdGlvbnM6IFwicHJvdmlkZXIgZnVuY3Rpb25zXCIsXG4gIGVwaGVtZXJhbF9yZXNvdXJjZV9zY2hlbWFzOiBcImVwaGVtZXJhbCByZXNvdXJjZXNcIixcbiAgd3JpdGVfb25seTogXCJ3cml0ZS1vbmx5IGF0dHJpYnV0ZXNcIixcbiAgcmVzb3VyY2VfaWRlbnRpdHlfc2NoZW1hczogXCJyZXNvdXJjZSBpZGVudGl0eVwiLFxufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoaWNoIHNjaGVtYS1lbWlzc2lvbiBnYXBzIHRoZSBnaXZlbiBmZXRjaGluZyBDTEkgaGFzLCBpblxuICogbGlnaHQgb2YgdGhlIHByb2plY3QncyBkZWNsYXJlZCBgdGFyZ2V0VmVyc2lvbnNgLlxuICpcbiAqIEEgZmFtaWx5IGlzIHJlcG9ydGVkIHdoZW4gYm90aCBhcmUgdHJ1ZTpcbiAqIC0gdGhlIGZldGNoaW5nIENMSSdzIG93biB2ZXJzaW9uIHByZWRhdGVzIHRoYXQgZmFtaWx5J3MgZW1pc3Npb25cbiAqICAgYm91bmRhcnkgZm9yIGl0cyBwcm9kdWN0IChzbyB0aGlzIHBhcnRpY3VsYXIgZmV0Y2ggY291bGQgbm90IGhhdmVcbiAqICAgaW5jbHVkZWQgdGhlIHNlY3Rpb24sIGV2ZW4gaWYgdGhlIHByb3ZpZGVyIGltcGxlbWVudHMgaXQpXG4gKiAtIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJvamVjdCdzIHRhcmdldGVkIHByb2R1Y3RzIGRlY2xhcmVzIGEgcmFuZ2UgdGhhdFxuICogICBpbnRlcnNlY3RzIHRoZSB2ZXJzaW9ucyB3aGVyZSB0aGF0IGZhbWlseSBpcyBlbWl0dGVkIChpLmUuIHRoZSBwcm9qZWN0XG4gKiAgIGFjdHVhbGx5IGludGVuZHMgdG8gcnVuIG9uIHZlcnNpb25zIHdoZXJlIHRoZSBmZWF0dXJlIHdvdWxkIHNob3cgdXApXG4gKlxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrU2NoZW1hRW1pc3Npb25HYXBzKFxuICBjbGk6IFRlcnJhZm9ybUNsaVZlcnNpb24sXG4gIHRhcmdldHM6IFRlcnJhZm9ybVRhcmdldFZlcnNpb25zLFxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gY2hlY2tTY2hlbWFFbWlzc2lvbkdhcEZhbWlsaWVzKGNsaSwgdGFyZ2V0cykubWFwKFxuICAgIChmYW1pbHkpID0+IFNDSEVNQV9FTUlTU0lPTl9GQU1JTFlfTEFCRUxTW2ZhbWlseV0sXG4gICk7XG59XG5cbi8qKlxuICogU2FtZSBhcyBjaGVja1NjaGVtYUVtaXNzaW9uR2FwcywgYnV0IHJldHVybnMgdGhlIHJhdyBmYW1pbHkga2V5cyBzb1xuICogY2FsbGVycyBjYW4gYWxzbyBjb21wdXRlIGEgcmVtZWR5IChzZWUgc3VnZ2VzdGVkRW1pdHRpbmdDbGlWZXJzaW9ucykuXG4gKlxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrU2NoZW1hRW1pc3Npb25HYXBGYW1pbGllcyhcbiAgY2xpOiBUZXJyYWZvcm1DbGlWZXJzaW9uLFxuICB0YXJnZXRzOiBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyxcbik6IFNjaGVtYUVtaXNzaW9uRmFtaWx5W10ge1xuICBpZiAoY2xpLm5hbWUgPT09IFwidW5rbm93blwiIHx8ICFjbGkudmVyc2lvbikgcmV0dXJuIFtdO1xuICBjb25zdCBjbGlQcm9kdWN0ID0gY2xpLm5hbWUgYXMgVGFyZ2V0UHJvZHVjdDtcblxuICBjb25zdCBnYXBzOiBTY2hlbWFFbWlzc2lvbkZhbWlseVtdID0gW107XG5cbiAgZm9yIChjb25zdCBmYW1pbHkgb2YgT2JqZWN0LmtleXMoXG4gICAgU0NIRU1BX0VNSVNTSU9OX0JPVU5EQVJJRVMsXG4gICkgYXMgU2NoZW1hRW1pc3Npb25GYW1pbHlbXSkge1xuICAgIGNvbnN0IGJvdW5kYXJpZXMgPSBTQ0hFTUFfRU1JU1NJT05fQk9VTkRBUklFU1tmYW1pbHldO1xuICAgIGNvbnN0IGNsaUJvdW5kYXJ5ID0gYm91bmRhcmllc1tjbGlQcm9kdWN0XTtcbiAgICBpZiAoIWNsaUJvdW5kYXJ5KSBjb250aW51ZTtcblxuICAgIC8vIFRoZSBmZXRjaGluZyBDTEkgaXMgbmV3IGVub3VnaCB0byBlbWl0IHRoaXMgZmFtaWx5IC0gbm8gZ2FwLlxuICAgIGlmICghc2VtdmVyLmx0KGNsaS52ZXJzaW9uLCBjbGlCb3VuZGFyeSkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qgd2FudGVkID0gVEFSR0VUX1BST0RVQ1RTLnNvbWUoKHByb2R1Y3QpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldFJhbmdlID0gdGFyZ2V0c1twcm9kdWN0XTtcbiAgICAgIGlmICghdGFyZ2V0UmFuZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChzZW12ZXIudmFsaWRSYW5nZSh0YXJnZXRSYW5nZSkgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHN1cHBvcnRlZFJhbmdlID0gYD49JHtib3VuZGFyaWVzW3Byb2R1Y3RdfWA7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2VtdmVyLmludGVyc2VjdHModGFyZ2V0UmFuZ2UsIHN1cHBvcnRlZFJhbmdlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAod2FudGVkKSBnYXBzLnB1c2goZmFtaWx5KTtcbiAgfVxuXG4gIHJldHVybiBnYXBzO1xufVxuXG4vKipcbiAqIFRoZSBsb3dlc3QgQ0xJIHZlcnNpb24gcGVyIHByb2R1Y3Qgd2hvc2UgYHByb3ZpZGVycyBzY2hlbWEgLWpzb25gIGVtaXRzXG4gKiBldmVyeSBvbmUgb2YgdGhlIGdpdmVuIGZhbWlsaWVzIOKAlCB0aGUgcmVtZWR5IHRvIHN1Z2dlc3QgYWxvbmdzaWRlIHRoZVxuICogZmV0Y2gtdGltZSB3YXJuaW5nLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWdnZXN0ZWRFbWl0dGluZ0NsaVZlcnNpb25zKFxuICBmYW1pbGllczogU2NoZW1hRW1pc3Npb25GYW1pbHlbXSxcbik6IHN0cmluZyB7XG4gIHJldHVybiBUQVJHRVRfUFJPRFVDVFMubWFwKChwcm9kdWN0KSA9PiB7XG4gICAgY29uc3QgbmVlZGVkID0gZmFtaWxpZXNcbiAgICAgIC5tYXAoKGZhbWlseSkgPT4gU0NIRU1BX0VNSVNTSU9OX0JPVU5EQVJJRVNbZmFtaWx5XVtwcm9kdWN0XSlcbiAgICAgIC5zb3J0KHNlbXZlci5jb21wYXJlKVxuICAgICAgLnBvcCgpO1xuICAgIHJldHVybiBuZWVkZWQgPyBgJHtwcm9kdWN0fSA+PSR7bmVlZGVkfWAgOiB1bmRlZmluZWQ7XG4gIH0pXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gdW5kZWZpbmVkKVxuICAgIC5qb2luKFwiIC8gXCIpO1xufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"provider-schema.d.ts","sourceRoot":"","sources":["../src/provider-schema.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,2BAA2B,EAC3B,6BAA6B,EAG7B,YAAY,EACZ,cAAc,EAMf,MAAM,gBAAgB,CAAC;AAiExB;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,4BAA4B,CAAA;CAAE,CAAC;AACrE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC;AACvE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC;AAE/D,eAAO,MAAM,SAAS,MAAO,IAAI;cAMnB,gBAAgB;eACf,iBAAiB;UACtB,YAAY;CAErB,CAAC;AAkIF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC;IACnD,SAAS,EAAE;QACT,kBAAkB,CAAC,EAAE;YACnB,CAAC,IAAI,EAAE,MAAM,GAAG;gBAAE,MAAM,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SACvD,CAAC;KACH,CAAC;IACF,MAAM,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACnE;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,6BAA6B,2BAuCtC;AAID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAsC7E;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,yCAqCzE"}
1
+ {"version":3,"file":"provider-schema.d.ts","sourceRoot":"","sources":["../src/provider-schema.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,2BAA2B,EAC3B,6BAA6B,EAG7B,YAAY,EACZ,cAAc,EAUf,MAAM,gBAAgB,CAAC;AA2FxB;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,4BAA4B,CAAA;CAAE,CAAC;AACrE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC;AACvE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC;AAE/D,eAAO,MAAM,SAAS,MAAO,IAAI;cAMnB,gBAAgB;eACf,iBAAiB;UACtB,YAAY;CAErB,CAAC;AAuIF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC;IACnD,SAAS,EAAE;QACT,kBAAkB,CAAC,EAAE;YACnB,CAAC,IAAI,EAAE,MAAM,GAAG;gBAAE,MAAM,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SACvD,CAAC;KACH,CAAC;IACF,MAAM,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACnE;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,6BAA6B,2BAoDtC;AA2DD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAuC7E;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,yCAqCzE"}
@@ -23,14 +23,35 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.readModuleSchema = exports.sanitizeProviderSchema = exports.readProviderSchema = exports.parseFQPN = exports.terraformInitWithRetry = void 0;
26
+ exports.readModuleSchema = exports.sanitizeProviderSchema = exports.warnIfSchemaEmissionGaps = exports.readProviderSchema = exports.parseFQPN = exports.terraformInitWithRetry = exports.getFetchingCliVersion = void 0;
27
27
  // Copyright (c) HashiCorp, Inc
28
28
  // SPDX-License-Identifier: MPL-2.0
29
29
  const fs = __importStar(require("fs-extra"));
30
30
  const path = __importStar(require("path"));
31
31
  const hcl2json_1 = require("@cdktn/hcl2json");
32
32
  const commons_1 = require("@cdktn/commons");
33
+ const emission_check_1 = require("./emission-check");
33
34
  const terraformBinaryName = process.env.TERRAFORM_BINARY_NAME || "terraform";
35
+ let fetchingCliVersionPromise;
36
+ /**
37
+ * Determines the version of the fetching CLI (`terraform`/`tofu` binary
38
+ * resolved via `TERRAFORM_BINARY_NAME`) once per process, memoized.
39
+ *
40
+ * Used both to stamp fetched provider schemas (`cli_name`/`cli_version`)
41
+ * and as the cache key suffix in read.ts, since schema emission is fixed
42
+ * per CLI minor version.
43
+ *
44
+ * @internal exposed for testing like terraformInitWithRetry
45
+ */
46
+ function getFetchingCliVersion() {
47
+ if (!fetchingCliVersionPromise) {
48
+ fetchingCliVersionPromise = (0, commons_1.exec)(terraformBinaryName, ["version"], {
49
+ cwd: process.cwd(),
50
+ }).then(commons_1.parseTerraformCliVersion);
51
+ }
52
+ return fetchingCliVersionPromise;
53
+ }
54
+ exports.getFetchingCliVersion = getFetchingCliVersion;
34
55
  // Provider binaries are downloaded from GitHub release CDNs during
35
56
  // `terraform init`, which intermittently returns 5xx. Retry on those
36
57
  // signatures only — real config/schema errors should still fail fast.
@@ -181,6 +202,11 @@ const harvestModuleSchema = async (workingDirectory, modules) => {
181
202
  }
182
203
  return result;
183
204
  };
205
+ function joinWithAnd(items) {
206
+ if (items.length <= 1)
207
+ return items.join("");
208
+ return `${items.slice(0, -1).join(", ")} and ${items[items.length - 1]}`;
209
+ }
184
210
  async function readProviderSchema(target) {
185
211
  const config = {
186
212
  provider: {},
@@ -207,9 +233,65 @@ async function readProviderSchema(target) {
207
233
  }));
208
234
  providerSchema.provider_versions = versionSchema.provider_selections;
209
235
  });
236
+ // Stamp the fetching CLI's identity so downstream consumers can reason
237
+ // about which newer-protocol sections this fetch could possibly have
238
+ // emitted. Never fail the fetch over this - it's best-effort metadata.
239
+ try {
240
+ const cli = await getFetchingCliVersion();
241
+ providerSchema.cli_name = cli.name;
242
+ providerSchema.cli_version = cli.version;
243
+ }
244
+ catch (error) {
245
+ commons_1.logger.debug(`Could not determine fetching CLI version to stamp provider schema: ${error}`);
246
+ }
210
247
  return sanitizeProviderSchema(providerSchema);
211
248
  }
212
249
  exports.readProviderSchema = readProviderSchema;
250
+ /**
251
+ * Warns when the CLI that produced a given provider schema predates one or
252
+ * more schema-emission boundaries the project's declared `targetVersions`
253
+ * care about (see emission-check.ts) - i.e. some newer-protocol sections
254
+ * (functions, ephemeral resources, ...) may be missing from the generated
255
+ * bindings even though the schema fetch itself succeeded.
256
+ *
257
+ * Deliberately decoupled from the fetch path (readProviderSchema) so it
258
+ * also runs for schemas served from the on-disk cache: cached JSON carries
259
+ * the same `cli_name`/`cli_version` stamps a fresh fetch would have
260
+ * written (the cache key already segments by CLI product+minor), so the gap
261
+ * check is just as meaningful on a cache hit as on a miss.
262
+ *
263
+ * No-op without `targetVersions` - there is nothing to compare the CLI
264
+ * against. Falls back to the current process's fetching CLI version when
265
+ * the schema itself isn't stamped (e.g. older cache entries written before
266
+ * stamping existed).
267
+ *
268
+ * @internal exposed for testing
269
+ */
270
+ async function warnIfSchemaEmissionGaps(schema, targetVersions) {
271
+ if (!targetVersions)
272
+ return;
273
+ let cli;
274
+ if (schema.cli_name && schema.cli_version) {
275
+ if (schema.cli_name !== "terraform" && schema.cli_name !== "opentofu") {
276
+ return;
277
+ }
278
+ cli = { name: schema.cli_name, version: schema.cli_version };
279
+ }
280
+ else {
281
+ try {
282
+ cli = await getFetchingCliVersion();
283
+ }
284
+ catch (error) {
285
+ commons_1.logger.debug(`Could not determine fetching CLI version to check for schema emission gaps: ${error}`);
286
+ return;
287
+ }
288
+ }
289
+ const gapFamilies = (0, emission_check_1.checkSchemaEmissionGapFamilies)(cli, targetVersions);
290
+ if (gapFamilies.length > 0 && cli.version) {
291
+ commons_1.logger.warn(`provider schema fetched with ${cli.name} ${cli.version} — ${joinWithAnd(gapFamilies.map((family) => emission_check_1.SCHEMA_EMISSION_FAMILY_LABELS[family]))} will not be generated; run cdktn get with ${(0, emission_check_1.suggestedEmittingCliVersions)(gapFamilies)}`);
292
+ }
293
+ }
294
+ exports.warnIfSchemaEmissionGaps = warnIfSchemaEmissionGaps;
213
295
  // The providers have some potential bugs that we want to pro-actively
214
296
  // fix here so that the rest of the code can assume a consistent schema.
215
297
  function sanitizeProviderSchema(schema) {
@@ -237,6 +319,7 @@ function sanitizeProviderSchema(schema) {
237
319
  provider.provider,
238
320
  ...Object.values(provider.resource_schemas || {}),
239
321
  ...Object.values(provider.data_source_schemas || {}),
322
+ ...Object.values(provider.ephemeral_resource_schemas || {}),
240
323
  ];
241
324
  entities.forEach((entity) => {
242
325
  sanitizeBlock(entity.block);
@@ -275,4 +358,4 @@ async function readModuleSchema(target) {
275
358
  return moduleSchema;
276
359
  }
277
360
  exports.readModuleSchema = readModuleSchema;
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3ZpZGVyLXNjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsNkNBQStCO0FBQy9CLDJDQUE2QjtBQUU3Qiw4Q0FBK0M7QUFDL0MsNENBZXdCO0FBRXhCLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxXQUFXLENBQUM7QUFFN0UsbUVBQW1FO0FBQ25FLHFFQUFxRTtBQUNyRSxzRUFBc0U7QUFDdEUsTUFBTSw2QkFBNkIsR0FBRztJQUNwQyxhQUFhO0lBQ2IsY0FBYztJQUNkLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsYUFBYTtJQUNiLFlBQVk7SUFDWixZQUFZO0lBQ1osaUJBQWlCO0NBQ2xCLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNJLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsT0FBd0IsRUFDeEIsV0FBVyxHQUFHLENBQUMsRUFDZixXQUFXLEdBQUcsSUFBSSxFQUNsQixpQkFBaUIsR0FBRyxDQUFDOztJQUVyQixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUEsY0FBSSxFQUFDLG1CQUFtQixFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDcEIsTUFBTSxNQUFNLEdBQVcsTUFBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsTUFBTSxtQ0FBSSxFQUFFLENBQUM7WUFDM0MsTUFBTSxTQUFTLEdBQUcsNkJBQTZCLENBQUMsSUFBSSxD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Q0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGNvbnZlcnRGaWxlcyB9IGZyb20gXCJAY2RrdG4vaGNsMmpzb25cIjtcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZSxcbiAgQXR0cmlidXRlVHlwZSxcbiAgQmxvY2ssXG4gIENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldCxcbiAgQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQsXG4gIElucHV0LFxuICBNb2R1bGVJbmRleCxcbiAgTW9kdWxlU2NoZW1hLFxuICBQcm92aWRlclNjaGVtYSxcbiAgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludCxcbiAgVmVyc2lvblNjaGVtYSxcbiAgZXhlYyxcbiAgaXNOZXN0ZWRUeXBlQXR0cmlidXRlLFxuICB3aXRoVGVtcERpcixcbn0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5cbmNvbnN0IHRlcnJhZm9ybUJpbmFyeU5hbWUgPSBwcm9jZXNzLmVudi5URVJSQUZPUk1fQklOQVJZX05BTUUgfHwgXCJ0ZXJyYWZvcm1cIjtcblxuLy8gUHJvdmlkZXIgYmluYXJpZXMgYXJlIGRvd25sb2FkZWQgZnJvbSBHaXRIdWIgcmVsZWFzZSBDRE5zIGR1cmluZ1xuLy8gYHRlcnJhZm9ybSBpbml0YCwgd2hpY2ggaW50ZXJtaXR0ZW50bHkgcmV0dXJucyA1eHguIFJldHJ5IG9uIHRob3NlXG4vLyBzaWduYXR1cmVzIG9ubHkg4oCUIHJlYWwgY29uZmlnL3NjaGVtYSBlcnJvcnMgc2hvdWxkIHN0aWxsIGZhaWwgZmFzdC5cbmNvbnN0IFRSQU5TSUVOVF9JTklUX0VSUk9SX1BBVFRFUk5TID0gW1xuICAvXFxiNTBbMjM0XVxcYi8sXG4gIC9CYWQgR2F0ZXdheS9pLFxuICAvU2VydmljZSBVbmF2YWlsYWJsZS9pLFxuICAvR2F0ZXdheSBUaW1lb3V0L2ksXG4gIC9FQ09OTlJFU0VUL2ksXG4gIC9FVElNRURPVVQvaSxcbiAgL0VBSV9BR0FJTi9pLFxuICAvdW5leHBlY3RlZCBFT0YvaSxcbl07XG5cbi8qKlxuICogUnVucyBgdGVycmFmb3JtIGluaXRgIGFuZCByZXRyaWVzIG9uIHRyYW5zaWVudCBIVFRQL25ldHdvcmsgZmFpbHVyZXMuXG4gKlxuICogUHJvdmlkZXIgYmluYXJpZXMgYXJlIHB1bGxlZCBmcm9tIEdpdEh1YidzIHJlbGVhc2UgQ0ROLCB3aGljaFxuICogaW50ZXJtaXR0ZW50bHkgcmV0dXJucyA1eHguIFRoZSByZXRyeSBvbmx5IGZpcmVzIHdoZW4gc3RkZXJyIG1hdGNoZXMgYVxuICoga25vd24gdHJhbnNpZW50IHBhdHRlcm4g4oCUIHJlYWwgZXJyb3JzIChiYWQgdmVyc2lvbiwgc2NoZW1hIHBhcnNlLCBldGMuKVxuICogc3RpbGwgZmFpbCBvbiB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIHNwYXduIG9wdGlvbnMgZm9yd2FyZGVkIHRvIGBleGVjYCAoYGN3ZGAgaXMgcmVxdWlyZWQgc29cbiAqICAgYHRlcnJhZm9ybSBpbml0YCBydW5zIGluc2lkZSB0aGUgdGVtcCBkaXIgaG9sZGluZyBgbWFpbi50Zi5qc29uYClcbiAqIEBwYXJhbSBtYXhBdHRlbXB0cyAtIHRvdGFsIGF0dGVtcHRzIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBjYWxsOyB0aGUgbnVtYmVyXG4gKiAgIG9mIHJldHJpZXMgaXMgYG1heEF0dGVtcHRzIC0gMWAuIERlZmF1bHRzIHRvIDUgKDEgaW5pdGlhbCArIDQgcmV0cmllcylcbiAqIEBwYXJhbSBiYXNlRGVsYXlNcyAtIGRlbGF5IGJlZm9yZSB0aGUgZmlyc3QgcmV0cnkuIFRlc3RzIHBhc3MgYDBgIHRvIHNraXBcbiAqICAgd2FpdHMuIERlZmF1bHRzIHRvIDUwMDBtc1xuICogQHBhcmFtIGJhY2tvZmZNdWx0aXBsaWVyIC0gZmFjdG9yIGFwcGxpZWQgdG8gdGhlIGRlbGF5IG9uIGVhY2ggc3Vic2VxdWVudFxuICogICByZXRyeSAoc28gcmV0cmllcyB3YWl0IGBiYXNlRGVsYXlNcyAqIG11bHRpcGxpZXJeKGF0dGVtcHQtMSlgKS4gRGVmYXVsdHNcbiAqICAgdG8gMiAoMXMg4oaSIDJzIOKGkiA0cyDigKYpXG4gKiBAcmV0dXJucyBzdGRvdXQgZnJvbSB0aGUgc3VjY2Vzc2Z1bCBgdGVycmFmb3JtIGluaXRgIGludm9jYXRpb25cbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KFxuICBvcHRpb25zOiB7IGN3ZDogc3RyaW5nIH0sXG4gIG1heEF0dGVtcHRzID0gNSxcbiAgYmFzZURlbGF5TXMgPSA1MDAwLFxuICBiYWNrb2ZmTXVsdGlwbGllciA9IDIsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBleGVjKHRlcnJhZm9ybUJpbmFyeU5hbWUsIFtcImluaXRcIl0sIG9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnN0IHN0ZGVycjogc3RyaW5nID0gZXJyb3I/LnN0ZGVyciA/PyBcIlwiO1xuICAgICAgY29uc3QgdHJhbnNpZW50ID0gVFJBTlNJRU5UX0lOSVRfRVJST1JfUEFUVEVSTlMuc29tZSgocCkgPT5cbiAgICAgICAgcC50ZXN0KHN0ZGVyciksXG4gICAgICApO1xuICAgICAgaWYgKCF0cmFuc2llbnQgfHwgYXR0ZW1wdCA9PT0gbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWxheU1zID0gYmFzZURlbGF5TXMgKiBiYWNrb2ZmTXVsdGlwbGllciAqKiAoYXR0ZW1wdCAtIDEpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGB0ZXJyYWZvcm0gaW5pdCBmYWlsZWQgd2l0aCBhIHRyYW5zaWVudCBlcnJvciwgcmV0cnlpbmcgaW4gJHtkZWxheU1zfW1zIChhdHRlbXB0ICR7YXR0ZW1wdH0vJHttYXhBdHRlbXB0cyAtIDF9KWAsXG4gICAgICApO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXlNcykpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTtcbn1cblxuLyoqXG4gKiBGdWxseSBRdWFsaWZpZWQgcHJvdmlkZXIgbmFtZSBpbiB0aGUgZm9ybWF0OlxuICogbGlrZSBlLmcuIHJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvYXdzXG4gKi9cbmV4cG9ydCB0eXBlIEZRUE4gPSBzdHJpbmcgJiB7IF9fdHlwZTogXCJGdWxseVF1YWxpZmllZFByb3ZpZGVyTmFtZVwiIH07XG5leHBvcnQgdHlwZSBQcm92aWRlckhvc3RuYW1lID0gc3RyaW5nICYgeyBfX3R5cGU6IFwiUHJvdmlkZXJIb3N0bmFtZVwiIH07XG5leHBvcnQgdHlwZSBQcm92aWRlck5hbWVzcGFjZSA9IHN0cmluZyAmIHsgX190eXBlOiBcIlByb3ZpZGVyTmFtZXNwYWNlXCIgfTtcbmV4cG9ydCB0eXBlIFByb3ZpZGVyTmFtZSA9IHN0cmluZyAmIHsgX190eXBlOiBcIlByb3ZpZGVyTmFtZVwiIH07XG5cbmV4cG9ydCBjb25zdCBwYXJzZUZRUE4gPSAoZjogRlFQTikgPT4ge1xuICBjb25zdCBbaG9zdG5hbWUsIG5hbWVzcGFjZSwgbmFtZV0gPSBmLnNwbGl0KFwiL1wiKTtcbiAgaWYgKCFuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBoYW5kbGUgJHtmfWApO1xuICB9XG4gIHJldHVybiB7IGhvc3RuYW1lLCBuYW1lc3BhY2UsIG5hbWUgfSBhcyB7XG4gICAgaG9zdG5hbWU6IFByb3ZpZGVySG9zdG5hbWU7XG4gICAgbmFtZXNwYWNlOiBQcm92aWRlck5hbWVzcGFjZTtcbiAgICBuYW1lOiBQcm92aWRlck5hbWU7XG4gIH07XG59O1xuXG5jb25zdCB1bndyYXBJZkFycmF5ID0gPFQ+KGl0ZW06IFQgfCBUW10pOiBUID0+XG4gIEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtWzBdIDogaXRlbTtcblxuY29uc3QgdHJhbnNmb3JtVmFyaWFibGVzID0gKHZhcmlhYmxlczogYW55KSA9PiB7XG4gIGNvbnN0IHJlc3VsdDogSW5wdXRbXSA9IFtdO1xuXG4gIGlmICghdmFyaWFibGVzKSByZXR1cm4gcmVzdWx0O1xuXG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyh2YXJpYWJsZXMpKSB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB1bndyYXBJZkFycmF5KHZhcmlhYmxlc1tuYW1lXSk7XG4gICAgbGV0IHZhcmlhYmxlVHlwZTogc3RyaW5nO1xuXG4gICAgaWYgKFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgdmFyaWFibGUuaGFzT3duUHJvcGVydHkoXCJ0eXBlXCIpID09IGZhbHNlICYmXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICB2YXJpYWJsZS5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRcIikgPT0gdHJ1ZVxuICAgICkge1xuICAgICAgc3dpdGNoICh0eXBlb2YgdmFyaWFibGVbXCJkZWZhdWx0XCJdKSB7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgdmFyaWFibGVUeXBlID0gXCJib29sXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICB2YXJpYWJsZVR5cGUgPSBcIm51bWJlclwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHZhcmlhYmxlVHlwZSA9IFwiYW55XCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJhd1ZhcmlhYmxlVHlwZSA9IHZhcmlhYmxlW1widHlwZVwiXTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHJhd1ZhcmlhYmxlVHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByYXdWYXJpYWJsZVR5cGUuc3RhcnRzV2l0aChcIiR7XCIpICYmXG4gICAgICAgIHJhd1ZhcmlhYmxlVHlwZS5lbmRzV2l0aChcIn1cIikgJiZcbiAgICAgICAgIXJhd1ZhcmlhYmxlVHlwZS5pbmNsdWRlcyhcIlxcblwiKVxuICAgICAgKSB7XG4gICAgICAgIHZhcmlhYmxlVHlwZSA9IHJhd1ZhcmlhYmxlVHlwZS5zbGljZSgyLCAtMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJpYWJsZVR5cGUgPSBcImFueVwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGl0ZW06IElucHV0ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIHR5cGU6IHZhcmlhYmxlVHlwZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB2YXJpYWJsZVtcImRlc2NyaXB0aW9uXCJdLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgcmVxdWlyZWQ6IHZhcmlhYmxlLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFwiKSA9PSBmYWxzZSxcbiAgICB9O1xuXG4gICAgaWYgKCFpdGVtLnJlcXVpcmVkKSB7XG4gICAgICBpdGVtW1wiZGVmYXVsdFwiXSA9IHZhcmlhYmxlW1wiZGVmYXVsdFwiXTtcbiAgICB9XG5cbiAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1PdXRwdXRzID0gKG91dHB1dHM6IGFueSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcblxuICBpZiAob3V0cHV0cykge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhvdXRwdXRzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gdW53cmFwSWZBcnJheShvdXRwdXRzW25hbWVdKTtcblxuICAgICAgY29uc3QgaXRlbTogYW55ID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogb3V0cHV0W1wiZGVzY3JpcHRpb25cIl0sXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgaGFydmVzdE1vZHVsZVNjaGVtYSA9IGFzeW5jIChcbiAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nLFxuICBtb2R1bGVzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4gPT4ge1xuICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbihcbiAgICB3b3JraW5nRGlyZWN0b3J5LFxuICAgIFwiLnRlcnJhZm9ybVwiLFxuICAgIFwibW9kdWxlc1wiLFxuICAgIFwibW9kdWxlcy5qc29uXCIsXG4gICk7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlTmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTW9kdWxlcyB3ZXJlIG5vdCBnZW5lcmF0ZWQgcHJvcGVybHkgLSBjb3VsZG4ndCBmaW5kICR7ZmlsZU5hbWV9YCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlSW5kZXggPSBKU09OLnBhcnNlKFxuICAgIGZzLnJlYWRGaWxlU3luYyhmaWxlTmFtZSwgXCJ1dGYtOFwiKSxcbiAgKSBhcyBNb2R1bGVJbmRleDtcblxuICBmb3IgKGNvbnN0IG1vZCBvZiBtb2R1bGVzKSB7XG4gICAgY29uc3QgbSA9IG1vZHVsZUluZGV4Lk1vZHVsZXMuZmluZCgob3RoZXIpID0+IG1vZCA9PT0gb3RoZXIuS2V5KTtcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kICR7bX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBhd2FpdCBjb252ZXJ0RmlsZXMocGF0aC5qb2luKHdvcmtpbmdEaXJlY3RvcnksIG0uRGlyKSk7XG5cbiAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTW9kdWxlcyB3ZXJlIG5vdCBnZW5lcmF0ZWQgcHJvcGVybHkgLSBjb3VsZG4ndCBwYXJzZSAke20uRGlyfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYTogTW9kdWxlU2NoZW1hID0ge1xuICAgICAgaW5wdXRzOiB0cmFuc2Zvcm1WYXJpYWJsZXMocGFyc2VkLnZhcmlhYmxlKSxcbiAgICAgIG91dHB1dHM6IHRyYW5zZm9ybU91dHB1dHMocGFyc2VkLm91dHB1dCksXG4gICAgICBuYW1lOiBtb2QsXG4gICAgfTtcblxuICAgIHJlc3VsdFttb2RdID0gc2NoZW1hO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVycmFmb3JtQ29uZmlnIHtcbiAgcHJvdmlkZXI/OiB7IFtuYW1lOiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gIHRlcnJhZm9ybToge1xuICAgIHJlcXVpcmVkX3Byb3ZpZGVycz86IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB7IHNvdXJjZT86IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9O1xuICAgIH07XG4gIH07XG4gIG1vZHVsZT86IHsgW25hbWU6IHN0cmluZ106IHsgc291cmNlOiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFByb3ZpZGVyU2NoZW1hKFxuICB0YXJnZXQ6IENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuKSB7XG4gIGNvbnN0IGNvbmZpZzogVGVycmFmb3JtQ29uZmlnID0ge1xuICAgIHByb3ZpZGVyOiB7fSxcbiAgICB0ZXJyYWZvcm06IHtcbiAgICAgIHJlcXVpcmVkX3Byb3ZpZGVyczoge30sXG4gICAgfSxcbiAgfTtcblxuICBjb25maWcucHJvdmlkZXIhW3RhcmdldC5uYW1lXSA9IHt9O1xuICBjb25maWcudGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycyFbdGFyZ2V0Lm5hbWVdID0ge1xuICAgIHZlcnNpb246IHRhcmdldC52ZXJzaW9uLFxuICAgIHNvdXJjZTogdGFyZ2V0LnNvdXJjZSxcbiAgfTtcblxuICBsZXQgcHJvdmlkZXJTY2hlbWE6IFByb3ZpZGVyU2NoZW1hID0geyBmb3JtYXRfdmVyc2lvbjogXCIwLjFcIiB9O1xuXG4gIGF3YWl0IHdpdGhUZW1wRGlyKFwiZmV0Y2hQcm92aWRlclNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvdXRkaXIsIFwibWFpbi50Zi5qc29uXCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG5cbiAgICBhd2FpdCB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KHsgY3dkOiBvdXRkaXIgfSk7XG4gICAgcHJvdmlkZXJTY2hlbWEgPSBKU09OLnBhcnNlKFxuICAgICAgYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJwcm92aWRlcnNcIiwgXCJzY2hlbWFcIiwgXCItanNvblwiXSwge1xuICAgICAgICBjd2Q6IG91dGRpcixcbiAgICAgIH0pLFxuICAgICkgYXMgUHJvdmlkZXJTY2hlbWE7XG5cbiAgICBjb25zdCB2ZXJzaW9uU2NoZW1hID0gSlNPTi5wYXJzZShcbiAgICAgIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1widmVyc2lvblwiLCBcIi1qc29uXCJdLCB7XG4gICAgICAgIGN3ZDogb3V0ZGlyLFxuICAgICAgfSksXG4gICAgKSBhcyBWZXJzaW9uU2NoZW1hO1xuXG4gICAgcHJvdmlkZXJTY2hlbWEucHJvdmlkZXJfdmVyc2lvbnMgPSB2ZXJzaW9uU2NoZW1hLnByb3ZpZGVyX3NlbGVjdGlvbnM7XG4gIH0pO1xuXG4gIHJldHVybiBzYW5pdGl6ZVByb3ZpZGVyU2NoZW1hKHByb3ZpZGVyU2NoZW1hKTtcbn1cblxuLy8gVGhlIHByb3ZpZGVycyBoYXZlIHNvbWUgcG90ZW50aWFsIGJ1Z3MgdGhhdCB3ZSB3YW50IHRvIHByby1hY3RpdmVseVxuLy8gZml4IGhlcmUgc28gdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29kZSBjYW4gYXNzdW1lIGEgY29uc2lzdGVudCBzY2hlbWEuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVQcm92aWRlclNjaGVtYShzY2hlbWE6IFByb3ZpZGVyU2NoZW1hKTogUHJvdmlkZXJTY2hlbWEge1xuICAvLyBNYWlubHkgc29tZSBhdHRyaWJ1dGVzIGFyZSBcImRvdWJsZWRcIiwgZS5nLiBbXCJsaXN0XCIsIFwic3RyaW5nXCIsIFwibGlzdFwiLCBcInN0cmluZ1wiXVxuICAvLyBpbnN0ZWFkIG9mIFtcImxpc3RcIiwgXCJzdHJpbmdcIl1cbiAgZnVuY3Rpb24gYXR0cmlidXRlRG91YmxpbmdGaXgoYXR0cmlidXRlOiBBdHRyaWJ1dGUpOiBBdHRyaWJ1dGUge1xuICAgIGlmIChpc05lc3RlZFR5cGVBdHRyaWJ1dGUoYXR0cmlidXRlKSB8fCAhQXJyYXkuaXNBcnJheShhdHRyaWJ1dGUudHlwZSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9XG4gICAgICBhdHRyaWJ1dGUudHlwZS5sZW5ndGggPT09IDJcbiAgICAgICAgPyBhdHRyaWJ1dGUudHlwZVxuICAgICAgICA6IChhdHRyaWJ1dGUudHlwZSBhcyBzdHJpbmdbXSkuc2xpY2UoMCwgMik7IC8vIFRoZSB0eXBlcyB0ZWxsIHVzIHRoaXMgY2FuJ3QgaGFwcGVuLCByZWFsaXR5IGJlZ3MgdG8gZGlmZmVyXG5cbiAgICBhdHRyaWJ1dGUudHlwZSA9IHR5cGUgYXMgQXR0cmlidXRlVHlwZTtcbiAgICByZXR1cm4gYXR0cmlidXRlO1xuICB9XG5cbiAgLy8gTXV0YXRlcyBibG9jayB3aXRoIHRoZSBmaXhcbiAgZnVuY3Rpb24gc2FuaXRpemVCbG9jayhibG9jazogQmxvY2spIHtcbiAgICBPYmplY3QudmFsdWVzKGJsb2NrLmF0dHJpYnV0ZXMgfHwge30pLmZvckVhY2goYXR0cmlidXRlRG91YmxpbmdGaXgpO1xuICAgIE9iamVjdC52YWx1ZXMoYmxvY2suYmxvY2tfdHlwZXMgfHwge30pLmZvckVhY2goKGJsb2NrVHlwZSkgPT4ge1xuICAgICAgc2FuaXRpemVCbG9jayhibG9ja1R5cGUuYmxvY2spO1xuICAgIH0pO1xuICB9XG5cbiAgT2JqZWN0LnZhbHVlcyhzY2hlbWEucHJvdmlkZXJfc2NoZW1hcyB8fCB7fSkuZm9yRWFjaCgocHJvdmlkZXIpID0+IHtcbiAgICBjb25zdCBlbnRpdGllcyA9IFtcbiAgICAgIHByb3ZpZGVyLnByb3ZpZGVyLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyhwcm92aWRlci5yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMocHJvdmlkZXIuZGF0YV9zb3VyY2Vfc2NoZW1hcyB8fCB7fSksXG4gICAgXTtcblxuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eSkgPT4ge1xuICAgICAgc2FuaXRpemVCbG9jayhlbnRpdHkuYmxvY2spO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gc2NoZW1hO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1vZHVsZVNjaGVtYSh0YXJnZXQ6IENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldCkge1xuICBsZXQgbW9kdWxlU2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBNb2R1bGVTY2hlbWE+ID0ge307XG5cbiAgYXdhaXQgd2l0aFRlbXBEaXIoXCJmZXRjaFNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnOiBUZXJyYWZvcm1Db25maWcgPSB7XG4gICAgICB0ZXJyYWZvcm06IHt9LFxuICAgIH07XG5cbiAgICBpZiAoIWNvbmZpZy5tb2R1bGUpIGNvbmZpZy5tb2R1bGUgPSB7fTtcbiAgICBsZXQgc291cmNlOiBzdHJpbmcgPSB0YXJnZXQuc291cmNlO1xuXG4gICAgY29uc3QgbG9jYWxTb3VyY2UgPSAodGFyZ2V0LmNvbnN0cmFpbnQgYXMgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludClcbiAgICAgIC5sb2NhbFNvdXJjZUFic29sdXRlUGF0aDtcbiAgICBpZiAobG9jYWxTb3VyY2UpIHtcbiAgICAgIC8vIGNyZWF0ZSByZWxhdGl2ZSBwYXRoIHRvIG1vZHVsZSBpbiB0aGUgdXNlciBwcm9qZWN0XG4gICAgICBzb3VyY2UgPSBwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGxvY2FsU291cmNlKTtcbiAgICB9XG5cbiAgICBjb25maWcubW9kdWxlW3RhcmdldC5tb2R1bGVLZXldID0geyBzb3VyY2U6IHNvdXJjZSB9O1xuICAgIGlmICh0YXJnZXQudmVyc2lvbikge1xuICAgICAgY29uZmlnLm1vZHVsZVt0YXJnZXQubW9kdWxlS2V5XVtcInZlcnNpb25cIl0gPSB0YXJnZXQudmVyc2lvbjtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKG91dGRpciwgXCJtYWluLnRmLmpzb25cIik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcblxuICAgIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1wiZ2V0XCJdLCB7IGN3ZDogb3V0ZGlyIH0pO1xuICAgIGlmIChjb25maWcubW9kdWxlKSB7XG4gICAgICBtb2R1bGVTY2hlbWEgPSBhd2FpdCBoYXJ2ZXN0TW9kdWxlU2NoZW1hKFxuICAgICAgICBvdXRkaXIsXG4gICAgICAgIE9iamVjdC5rZXlzKGNvbmZpZy5tb2R1bGUpLFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBtb2R1bGVTY2hlbWE7XG59XG4iXX0=
361
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3ZpZGVyLXNjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsNkNBQStCO0FBQy9CLDJDQUE2QjtBQUU3Qiw4Q0FBK0M7QUFDL0MsNENBbUJ3QjtBQUN4QixxREFJMEI7QUFFMUIsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLFdBQVcsQ0FBQztBQUU3RSxJQUFJLHlCQUFtRSxDQUFDO0FBRXhFOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLHFCQUFxQjtJQUNuQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUMvQix5QkFBeUIsR0FBRyxJQUFBLGNBQUksRUFBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFO1NBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsa0NBQXdCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyx5QkFBeUIsQ0FBQztBQUNuQyxDQUFDO0FBUEQsc0RBT0M7QUFFRCxtRUFBbUU7QUFDbkUscUVBQXFFO0FBQ3JFLHNFQUFzRTtBQUN0RSxNQUFNLDZCQUE2QixHQUFHO0lBQ3BDLGFBQWE7SUFDYixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsWUFBWTtJQUNaLFlBQVk7SUFDWixpQkFBaUI7Q0FDbEIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0ksS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxPQUF3QixFQUN4QixXQUFXLEdBQUcsQ0FBQyxFQUNmLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLGlCQUFpQixHQUFHLENBQUM7O0lBRXJCLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sSUFBQSxjQUFJLEVBQUMsbUJBQW1CLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztZQUNwQixNQUFNLE1BQU0sR0FBVyxNQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxNQUFNLG1DQUFJLEVBQUUsQ0FBQztZQUMzQyxNQUFNLFNBQVMsR0FBRyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUN6RCxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUNmLENBQUM7WUFDRixJQUFJLENBQUMsU0FBUyxJQUFJLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsV0FBVyxHQUFHLGlCQUFpQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sQ0FBQyxHQUFHLENBQ1QsNkRBQTZELE9BQU8sZUFBZSxPQUFPLElBQUksV0FBVyxHQUFHLENBQUMsR0FBRyxDQUNqSCxDQUFDO1lBQ0YsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBekJELHdEQXlCQztBQVdNLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBSWpDLENBQUM7QUFDSixDQUFDLENBQUM7QUFWVyxRQUFBLFNBQVMsYUFVcEI7QUFFRixNQUFNLGFBQWEsR0FBRyxDQUFJLElBQWEsRUFBSyxFQUFFLENBQzVDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBRXZDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxTQUFjLEVBQUUsRUFBRTtJQUM1QyxNQUFNLE1BQU0sR0FBWSxFQUFFLENBQUM7SUFFM0IsSUFBSSxDQUFDLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUU5QixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxZQUFvQixDQUFDO1FBRXpCO1FBQ0UsaURBQWlEO1FBQ2pELFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSztZQUN4QyxpREFBaUQ7WUFDakQsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLEVBQzFDLENBQUM7WUFDRCxRQUFRLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLEtBQUssU0FBUztvQkFDWixZQUFZLEdBQUcsTUFBTSxDQUFDO29CQUN0QixNQUFNO2dCQUNSLEtBQUssUUFBUTtvQkFDWCxZQUFZLEdBQUcsUUFBUSxDQUFDO29CQUN4QixNQUFNO2dCQUNSO29CQUNFLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLElBQ0UsT0FBTyxlQUFlLEtBQUssUUFBUTtnQkFDbkMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hDLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUM3QixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQy9CLENBQUM7Z0JBQ0QsWUFBWSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLElBQUksR0FBVTtZQUNsQixJQUFJO1lBQ0osSUFBSSxFQUFFLFlBQVk7WUFDbEIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUM7WUFDcEMsaURBQWlEO1lBQ2pELFFBQVEsRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUs7U0FDdEQsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQVksRUFBRSxFQUFFO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUVsQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDeEMsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRTVDLE1BQU0sSUFBSSxHQUFRO2dCQUNoQixJQUFJO2dCQUNKLFdBQVcsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDO2FBQ25DLENBQUM7WUFFRixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEVBQy9CLGdCQUF3QixFQUN4QixPQUFpQixFQUNhLEVBQUU7SUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDeEIsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixTQUFTLEVBQ1QsY0FBYyxDQUNmLENBQUM7SUFDRixNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFDO0lBRXZDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDYix1REFBdUQsUUFBUSxFQUFFLENBQ2xFLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDNUIsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQ3BCLENBQUM7SUFFakIsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMxQixNQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsdUJBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXRFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0RBQXdELENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FDaEUsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBaUI7WUFDM0IsTUFBTSxFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDM0MsT0FBTyxFQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDeEMsSUFBSSxFQUFFLEdBQUc7U0FDVixDQUFDO1FBRUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsU0FBUyxXQUFXLENBQUMsS0FBZTtJQUNsQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QyxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMzRSxDQUFDO0FBWU0sS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxNQUFxQztJQUVyQyxNQUFNLE1BQU0sR0FBb0I7UUFDOUIsUUFBUSxFQUFFLEVBQUU7UUFDWixTQUFTLEVBQUU7WUFDVCxrQkFBa0IsRUFBRSxFQUFFO1NBQ3ZCO0tBQ0YsQ0FBQztJQUVGLE1BQU0sQ0FBQyxRQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNuQyxNQUFNLENBQUMsU0FBUyxDQUFDLGtCQUFtQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRztRQUNsRCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO0tBQ3RCLENBQUM7SUFFRixJQUFJLGNBQWMsR0FBbUIsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFFL0QsTUFBTSxJQUFBLHFCQUFXLEVBQUMscUJBQXFCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXJELE1BQU0sc0JBQXNCLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM5QyxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDekIsTUFBTSxJQUFBLGNBQUksRUFBQyxtQkFBbUIsRUFBRSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDaEUsR0FBRyxFQUFFLE1BQU07U0FDWixDQUFDLENBQ2UsQ0FBQztRQUVwQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUM5QixNQUFNLElBQUEsY0FBSSxFQUFDLG1CQUFtQixFQUFFLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3BELEdBQUcsRUFBRSxNQUFNO1NBQ1osQ0FBQyxDQUNjLENBQUM7UUFFbkIsY0FBYyxDQUFDLGlCQUFpQixHQUFHLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztJQUN2RSxDQUFDLENBQUMsQ0FBQztJQUVILHVFQUF1RTtJQUN2RSxxRUFBcUU7SUFDckUsdUVBQXVFO0lBQ3ZFLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0scUJBQXFCLEVBQUUsQ0FBQztRQUMxQyxjQUFjLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDbkMsY0FBYyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO0lBQzNDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1Ysc0VBQXNFLEtBQUssRUFBRSxDQUM5RSxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQXJERCxnREFxREM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNJLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsTUFBc0IsRUFDdEIsY0FBd0M7SUFFeEMsSUFBSSxDQUFDLGNBQWM7UUFBRSxPQUFPO0lBRTVCLElBQUksR0FBd0IsQ0FBQztJQUM3QixJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFDLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN0RSxPQUFPO1FBQ1QsQ0FBQztRQUNELEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0QsQ0FBQztTQUFNLENBQUM7UUFDTixJQUFJLENBQUM7WUFDSCxHQUFHLEdBQUcsTUFBTSxxQkFBcUIsRUFBRSxDQUFDO1FBQ3RDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsK0VBQStFLEtBQUssRUFBRSxDQUN2RixDQUFDO1lBQ0YsT0FBTztRQUNULENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBQSwrQ0FBOEIsRUFBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDeEUsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsZ0JBQU0sQ0FBQyxJQUFJLENBQ1QsZ0NBQWdDLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sTUFBTSxXQUFXLENBQ3RFLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLDhDQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQ25FLDhDQUE4QyxJQUFBLDZDQUE0QixFQUN6RSxXQUFXLENBQ1osRUFBRSxDQUNKLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQWpDRCw0REFpQ0M7QUFFRCxzRUFBc0U7QUFDdEUsd0VBQXdFO0FBQ3hFLFNBQWdCLHNCQUFzQixDQUFDLE1BQXNCO0lBQzNELGtGQUFrRjtJQUNsRixnQ0FBZ0M7SUFDaEMsU0FBUyxvQkFBb0IsQ0FBQyxTQUFvQjtRQUNoRCxJQUFJLElBQUEsK0JBQXFCLEVBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLElBQUksR0FDUixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSTtZQUNoQixDQUFDLENBQUUsU0FBUyxDQUFDLElBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDhEQUE4RDtRQUU5RyxTQUFTLENBQUMsSUFBSSxHQUFHLElBQXFCLENBQUM7UUFDdkMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELDZCQUE2QjtJQUM3QixTQUFTLGFBQWEsQ0FBQyxLQUFZO1FBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNwRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDM0QsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNoRSxNQUFNLFFBQVEsR0FBRztZQUNmLFFBQVEsQ0FBQyxRQUFRO1lBQ2pCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDO1lBQ2pELEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLElBQUksRUFBRSxDQUFDO1lBQ3BELEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLElBQUksRUFBRSxDQUFDO1NBQzVELENBQUM7UUFFRixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDMUIsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQXZDRCx3REF1Q0M7QUFFTSxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsTUFBbUM7SUFDeEUsSUFBSSxZQUFZLEdBQWlDLEVBQUUsQ0FBQztJQUVwRCxNQUFNLElBQUEscUJBQVcsRUFBQyxhQUFhLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUMsTUFBTSxNQUFNLEdBQW9CO1lBQzlCLFNBQVMsRUFBRSxFQUFFO1NBQ2QsQ0FBQztRQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFXLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFFbkMsTUFBTSxXQUFXLEdBQUksTUFBTSxDQUFDLFVBQXdDO2FBQ2pFLHVCQUF1QixDQUFDO1FBQzNCLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIscURBQXFEO1lBQ3JELE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDckQsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUM5RCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXJELE1BQU0sSUFBQSxjQUFJLEVBQUMsbUJBQW1CLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzFELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLFlBQVksR0FBRyxNQUFNLG1CQUFtQixDQUN0QyxNQUFNLEVBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQzNCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBckNELDRDQXFDQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgY29udmVydEZpbGVzIH0gZnJvbSBcIkBjZGt0bi9oY2wyanNvblwiO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlLFxuICBBdHRyaWJ1dGVUeXBlLFxuICBCbG9jayxcbiAgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0LFxuICBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldCxcbiAgSW5wdXQsXG4gIE1vZHVsZUluZGV4LFxuICBNb2R1bGVTY2hlbWEsXG4gIFByb3ZpZGVyU2NoZW1hLFxuICBUZXJyYWZvcm1DbGlWZXJzaW9uLFxuICBUZXJyYWZvcm1Nb2R1bGVDb25zdHJhaW50LFxuICBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyxcbiAgVmVyc2lvblNjaGVtYSxcbiAgZXhlYyxcbiAgaXNOZXN0ZWRUeXBlQXR0cmlidXRlLFxuICBsb2dnZXIsXG4gIHBhcnNlVGVycmFmb3JtQ2xpVmVyc2lvbixcbiAgd2l0aFRlbXBEaXIsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHtcbiAgU0NIRU1BX0VNSVNTSU9OX0ZBTUlMWV9MQUJFTFMsXG4gIGNoZWNrU2NoZW1hRW1pc3Npb25HYXBGYW1pbGllcyxcbiAgc3VnZ2VzdGVkRW1pdHRpbmdDbGlWZXJzaW9ucyxcbn0gZnJvbSBcIi4vZW1pc3Npb24tY2hlY2tcIjtcblxuY29uc3QgdGVycmFmb3JtQmluYXJ5TmFtZSA9IHByb2Nlc3MuZW52LlRFUlJBRk9STV9CSU5BUllfTkFNRSB8fCBcInRlcnJhZm9ybVwiO1xuXG5sZXQgZmV0Y2hpbmdDbGlWZXJzaW9uUHJvbWlzZTogUHJvbWlzZTxUZXJyYWZvcm1DbGlWZXJzaW9uPiB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBmZXRjaGluZyBDTEkgKGB0ZXJyYWZvcm1gL2B0b2Z1YCBiaW5hcnlcbiAqIHJlc29sdmVkIHZpYSBgVEVSUkFGT1JNX0JJTkFSWV9OQU1FYCkgb25jZSBwZXIgcHJvY2VzcywgbWVtb2l6ZWQuXG4gKlxuICogVXNlZCBib3RoIHRvIHN0YW1wIGZldGNoZWQgcHJvdmlkZXIgc2NoZW1hcyAoYGNsaV9uYW1lYC9gY2xpX3ZlcnNpb25gKVxuICogYW5kIGFzIHRoZSBjYWNoZSBrZXkgc3VmZml4IGluIHJlYWQudHMsIHNpbmNlIHNjaGVtYSBlbWlzc2lvbiBpcyBmaXhlZFxuICogcGVyIENMSSBtaW5vciB2ZXJzaW9uLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nIGxpa2UgdGVycmFmb3JtSW5pdFdpdGhSZXRyeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmV0Y2hpbmdDbGlWZXJzaW9uKCk6IFByb21pc2U8VGVycmFmb3JtQ2xpVmVyc2lvbj4ge1xuICBpZiAoIWZldGNoaW5nQ2xpVmVyc2lvblByb21pc2UpIHtcbiAgICBmZXRjaGluZ0NsaVZlcnNpb25Qcm9taXNlID0gZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJ2ZXJzaW9uXCJdLCB7XG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgfSkudGhlbihwYXJzZVRlcnJhZm9ybUNsaVZlcnNpb24pO1xuICB9XG4gIHJldHVybiBmZXRjaGluZ0NsaVZlcnNpb25Qcm9taXNlO1xufVxuXG4vLyBQcm92aWRlciBiaW5hcmllcyBhcmUgZG93bmxvYWRlZCBmcm9tIEdpdEh1YiByZWxlYXNlIENETnMgZHVyaW5nXG4vLyBgdGVycmFmb3JtIGluaXRgLCB3aGljaCBpbnRlcm1pdHRlbnRseSByZXR1cm5zIDV4eC4gUmV0cnkgb24gdGhvc2Vcbi8vIHNpZ25hdHVyZXMgb25seSDigJQgcmVhbCBjb25maWcvc2NoZW1hIGVycm9ycyBzaG91bGQgc3RpbGwgZmFpbCBmYXN0LlxuY29uc3QgVFJBTlNJRU5UX0lOSVRfRVJST1JfUEFUVEVSTlMgPSBbXG4gIC9cXGI1MFsyMzRdXFxiLyxcbiAgL0JhZCBHYXRld2F5L2ksXG4gIC9TZXJ2aWNlIFVuYXZhaWxhYmxlL2ksXG4gIC9HYXRld2F5IFRpbWVvdXQvaSxcbiAgL0VDT05OUkVTRVQvaSxcbiAgL0VUSU1FRE9VVC9pLFxuICAvRUFJX0FHQUlOL2ksXG4gIC91bmV4cGVjdGVkIEVPRi9pLFxuXTtcblxuLyoqXG4gKiBSdW5zIGB0ZXJyYWZvcm0gaW5pdGAgYW5kIHJldHJpZXMgb24gdHJhbnNpZW50IEhUVFAvbmV0d29yayBmYWlsdXJlcy5cbiAqXG4gKiBQcm92aWRlciBiaW5hcmllcyBhcmUgcHVsbGVkIGZyb20gR2l0SHViJ3MgcmVsZWFzZSBDRE4sIHdoaWNoXG4gKiBpbnRlcm1pdHRlbnRseSByZXR1cm5zIDV4eC4gVGhlIHJldHJ5IG9ubHkgZmlyZXMgd2hlbiBzdGRlcnIgbWF0Y2hlcyBhXG4gKiBrbm93biB0cmFuc2llbnQgcGF0dGVybiDigJQgcmVhbCBlcnJvcnMgKGJhZCB2ZXJzaW9uLCBzY2hlbWEgcGFyc2UsIGV0Yy4pXG4gKiBzdGlsbCBmYWlsIG9uIHRoZSBmaXJzdCBhdHRlbXB0LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gc3Bhd24gb3B0aW9ucyBmb3J3YXJkZWQgdG8gYGV4ZWNgIChgY3dkYCBpcyByZXF1aXJlZCBzb1xuICogICBgdGVycmFmb3JtIGluaXRgIHJ1bnMgaW5zaWRlIHRoZSB0ZW1wIGRpciBob2xkaW5nIGBtYWluLnRmLmpzb25gKVxuICogQHBhcmFtIG1heEF0dGVtcHRzIC0gdG90YWwgYXR0ZW1wdHMgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGNhbGw7IHRoZSBudW1iZXJcbiAqICAgb2YgcmV0cmllcyBpcyBgbWF4QXR0ZW1wdHMgLSAxYC4gRGVmYXVsdHMgdG8gNSAoMSBpbml0aWFsICsgNCByZXRyaWVzKVxuICogQHBhcmFtIGJhc2VEZWxheU1zIC0gZGVsYXkgYmVmb3JlIHRoZSBmaXJzdCByZXRyeS4gVGVzdHMgcGFzcyBgMGAgdG8gc2tpcFxuICogICB3YWl0cy4gRGVmYXVsdHMgdG8gNTAwMG1zXG4gKiBAcGFyYW0gYmFja29mZk11bHRpcGxpZXIgLSBmYWN0b3IgYXBwbGllZCB0byB0aGUgZGVsYXkgb24gZWFjaCBzdWJzZXF1ZW50XG4gKiAgIHJldHJ5IChzbyByZXRyaWVzIHdhaXQgYGJhc2VEZWxheU1zICogbXVsdGlwbGllcl4oYXR0ZW1wdC0xKWApLiBEZWZhdWx0c1xuICogICB0byAyICgxcyDihpIgMnMg4oaSIDRzIOKApilcbiAqIEByZXR1cm5zIHN0ZG91dCBmcm9tIHRoZSBzdWNjZXNzZnVsIGB0ZXJyYWZvcm0gaW5pdGAgaW52b2NhdGlvblxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlcnJhZm9ybUluaXRXaXRoUmV0cnkoXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmcgfSxcbiAgbWF4QXR0ZW1wdHMgPSA1LFxuICBiYXNlRGVsYXlNcyA9IDUwMDAsXG4gIGJhY2tvZmZNdWx0aXBsaWVyID0gMixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1wiaW5pdFwiXSwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc3Qgc3RkZXJyOiBzdHJpbmcgPSBlcnJvcj8uc3RkZXJyID8/IFwiXCI7XG4gICAgICBjb25zdCB0cmFuc2llbnQgPSBUUkFOU0lFTlRfSU5JVF9FUlJPUl9QQVRURVJOUy5zb21lKChwKSA9PlxuICAgICAgICBwLnRlc3Qoc3RkZXJyKSxcbiAgICAgICk7XG4gICAgICBpZiAoIXRyYW5zaWVudCB8fCBhdHRlbXB0ID09PSBtYXhBdHRlbXB0cykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlbGF5TXMgPSBiYXNlRGVsYXlNcyAqIGJhY2tvZmZNdWx0aXBsaWVyICoqIChhdHRlbXB0IC0gMSk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYHRlcnJhZm9ybSBpbml0IGZhaWxlZCB3aXRoIGEgdHJhbnNpZW50IGVycm9yLCByZXRyeWluZyBpbiAke2RlbGF5TXN9bXMgKGF0dGVtcHQgJHthdHRlbXB0fS8ke21heEF0dGVtcHRzIC0gMX0pYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheU1zKSk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcInVucmVhY2hhYmxlXCIpO1xufVxuXG4vKipcbiAqIEZ1bGx5IFF1YWxpZmllZCBwcm92aWRlciBuYW1lIGluIHRoZSBmb3JtYXQ6XG4gKiBsaWtlIGUuZy4gcmVnaXN0cnkudGVycmFmb3JtLmlvL2hhc2hpY29ycC9hd3NcbiAqL1xuZXhwb3J0IHR5cGUgRlFQTiA9IHN0cmluZyAmIHsgX190eXBlOiBcIkZ1bGx5UXVhbGlmaWVkUHJvdmlkZXJOYW1lXCIgfTtcbmV4cG9ydCB0eXBlIFByb3ZpZGVySG9zdG5hbWUgPSBzdHJpbmcgJiB7IF9fdHlwZTogXCJQcm92aWRlckhvc3RuYW1lXCIgfTtcbmV4cG9ydCB0eXBlIFByb3ZpZGVyTmFtZXNwYWNlID0gc3RyaW5nICYgeyBfX3R5cGU6IFwiUHJvdmlkZXJOYW1lc3BhY2VcIiB9O1xuZXhwb3J0IHR5cGUgUHJvdmlkZXJOYW1lID0gc3RyaW5nICYgeyBfX3R5cGU6IFwiUHJvdmlkZXJOYW1lXCIgfTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlRlFQTiA9IChmOiBGUVBOKSA9PiB7XG4gIGNvbnN0IFtob3N0bmFtZSwgbmFtZXNwYWNlLCBuYW1lXSA9IGYuc3BsaXQoXCIvXCIpO1xuICBpZiAoIW5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IGhhbmRsZSAke2Z9YCk7XG4gIH1cbiAgcmV0dXJuIHsgaG9zdG5hbWUsIG5hbWVzcGFjZSwgbmFtZSB9IGFzIHtcbiAgICBob3N0bmFtZTogUHJvdmlkZXJIb3N0bmFtZTtcbiAgICBuYW1lc3BhY2U6IFByb3ZpZGVyTmFtZXNwYWNlO1xuICAgIG5hbWU6IFByb3ZpZGVyTmFtZTtcbiAgfTtcbn07XG5cbmNvbnN0IHVud3JhcElmQXJyYXkgPSA8VD4oaXRlbTogVCB8IFRbXSk6IFQgPT5cbiAgQXJyYXkuaXNBcnJheShpdGVtKSA/IGl0ZW1bMF0gOiBpdGVtO1xuXG5jb25zdCB0cmFuc2Zvcm1WYXJpYWJsZXMgPSAodmFyaWFibGVzOiBhbnkpID0+IHtcbiAgY29uc3QgcmVzdWx0OiBJbnB1dFtdID0gW107XG5cbiAgaWYgKCF2YXJpYWJsZXMpIHJldHVybiByZXN1bHQ7XG5cbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHZhcmlhYmxlcykpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHVud3JhcElmQXJyYXkodmFyaWFibGVzW25hbWVdKTtcbiAgICBsZXQgdmFyaWFibGVUeXBlOiBzdHJpbmc7XG5cbiAgICBpZiAoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICB2YXJpYWJsZS5oYXNPd25Qcm9wZXJ0eShcInR5cGVcIikgPT0gZmFsc2UgJiZcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIHZhcmlhYmxlLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFwiKSA9PSB0cnVlXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YXJpYWJsZVtcImRlZmF1bHRcIl0pIHtcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICB2YXJpYWJsZVR5cGUgPSBcImJvb2xcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgIHZhcmlhYmxlVHlwZSA9IFwibnVtYmVyXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdmFyaWFibGVUeXBlID0gXCJhbnlcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VmFyaWFibGVUeXBlID0gdmFyaWFibGVbXCJ0eXBlXCJdO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgcmF3VmFyaWFibGVUeXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHJhd1ZhcmlhYmxlVHlwZS5zdGFydHNXaXRoKFwiJHtcIikgJiZcbiAgICAgICAgcmF3VmFyaWFibGVUeXBlLmVuZHNXaXRoKFwifVwiKSAmJlxuICAgICAgICAhcmF3VmFyaWFibGVUeXBlLmluY2x1ZGVzKFwiXFxuXCIpXG4gICAgICApIHtcbiAgICAgICAgdmFyaWFibGVUeXBlID0gcmF3VmFyaWFibGVUeXBlLnNsaWNlKDIsIC0xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcmlhYmxlVHlwZSA9IFwiYW55XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbTogSW5wdXQgPSB7XG4gICAgICBuYW1lLFxuICAgICAgdHlwZTogdmFyaWFibGVUeXBlLFxuICAgICAgZGVzY3JpcHRpb246IHZhcmlhYmxlW1wiZGVzY3JpcHRpb25cIl0sXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICByZXF1aXJlZDogdmFyaWFibGUuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0XCIpID09IGZhbHNlLFxuICAgIH07XG5cbiAgICBpZiAoIWl0ZW0ucmVxdWlyZWQpIHtcbiAgICAgIGl0ZW1bXCJkZWZhdWx0XCJdID0gdmFyaWFibGVbXCJkZWZhdWx0XCJdO1xuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybU91dHB1dHMgPSAob3V0cHV0czogYW55KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gIGlmIChvdXRwdXRzKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKG91dHB1dHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSB1bndyYXBJZkFycmF5KG91dHB1dHNbbmFtZV0pO1xuXG4gICAgICBjb25zdCBpdGVtOiBhbnkgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBvdXRwdXRbXCJkZXNjcmlwdGlvblwiXSxcbiAgICAgIH07XG5cbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBoYXJ2ZXN0TW9kdWxlU2NoZW1hID0gYXN5bmMgKFxuICB3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcsXG4gIG1vZHVsZXM6IHN0cmluZ1tdLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9PiB7XG4gIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5qb2luKFxuICAgIHdvcmtpbmdEaXJlY3RvcnksXG4gICAgXCIudGVycmFmb3JtXCIsXG4gICAgXCJtb2R1bGVzXCIsXG4gICAgXCJtb2R1bGVzLmpzb25cIixcbiAgKTtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVOYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNb2R1bGVzIHdlcmUgbm90IGdlbmVyYXRlZCBwcm9wZXJseSAtIGNvdWxkbid0IGZpbmQgJHtmaWxlTmFtZX1gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBtb2R1bGVJbmRleCA9IEpTT04ucGFyc2UoXG4gICAgZnMucmVhZEZpbGVTeW5jKGZpbGVOYW1lLCBcInV0Zi04XCIpLFxuICApIGFzIE1vZHVsZUluZGV4O1xuXG4gIGZvciAoY29uc3QgbW9kIG9mIG1vZHVsZXMpIHtcbiAgICBjb25zdCBtID0gbW9kdWxlSW5kZXguTW9kdWxlcy5maW5kKChvdGhlcikgPT4gbW9kID09PSBvdGhlci5LZXkpO1xuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgJHttfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IGF3YWl0IGNvbnZlcnRGaWxlcyhwYXRoLmpvaW4od29ya2luZ0RpcmVjdG9yeSwgbS5EaXIpKTtcblxuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNb2R1bGVzIHdlcmUgbm90IGdlbmVyYXRlZCBwcm9wZXJseSAtIGNvdWxkbid0IHBhcnNlICR7bS5EaXJ9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hOiBNb2R1bGVTY2hlbWEgPSB7XG4gICAgICBpbnB1dHM6IHRyYW5zZm9ybVZhcmlhYmxlcyhwYXJzZWQudmFyaWFibGUpLFxuICAgICAgb3V0cHV0czogdHJhbnNmb3JtT3V0cHV0cyhwYXJzZWQub3V0cHV0KSxcbiAgICAgIG5hbWU6IG1vZCxcbiAgICB9O1xuXG4gICAgcmVzdWx0W21vZF0gPSBzY2hlbWE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZnVuY3Rpb24gam9pbldpdGhBbmQoaXRlbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA8PSAxKSByZXR1cm4gaXRlbXMuam9pbihcIlwiKTtcbiAgcmV0dXJuIGAke2l0ZW1zLnNsaWNlKDAsIC0xKS5qb2luKFwiLCBcIil9IGFuZCAke2l0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdfWA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVycmFmb3JtQ29uZmlnIHtcbiAgcHJvdmlkZXI/OiB7IFtuYW1lOiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gIHRlcnJhZm9ybToge1xuICAgIHJlcXVpcmVkX3Byb3ZpZGVycz86IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB7IHNvdXJjZT86IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9O1xuICAgIH07XG4gIH07XG4gIG1vZHVsZT86IHsgW25hbWU6IHN0cmluZ106IHsgc291cmNlOiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFByb3ZpZGVyU2NoZW1hKFxuICB0YXJnZXQ6IENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuKSB7XG4gIGNvbnN0IGNvbmZpZzogVGVycmFmb3JtQ29uZmlnID0ge1xuICAgIHByb3ZpZGVyOiB7fSxcbiAgICB0ZXJyYWZvcm06IHtcbiAgICAgIHJlcXVpcmVkX3Byb3ZpZGVyczoge30sXG4gICAgfSxcbiAgfTtcblxuICBjb25maWcucHJvdmlkZXIhW3RhcmdldC5uYW1lXSA9IHt9O1xuICBjb25maWcudGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycyFbdGFyZ2V0Lm5hbWVdID0ge1xuICAgIHZlcnNpb246IHRhcmdldC52ZXJzaW9uLFxuICAgIHNvdXJjZTogdGFyZ2V0LnNvdXJjZSxcbiAgfTtcblxuICBsZXQgcHJvdmlkZXJTY2hlbWE6IFByb3ZpZGVyU2NoZW1hID0geyBmb3JtYXRfdmVyc2lvbjogXCIwLjFcIiB9O1xuXG4gIGF3YWl0IHdpdGhUZW1wRGlyKFwiZmV0Y2hQcm92aWRlclNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvdXRkaXIsIFwibWFpbi50Zi5qc29uXCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG5cbiAgICBhd2FpdCB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KHsgY3dkOiBvdXRkaXIgfSk7XG4gICAgcHJvdmlkZXJTY2hlbWEgPSBKU09OLnBhcnNlKFxuICAgICAgYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJwcm92aWRlcnNcIiwgXCJzY2hlbWFcIiwgXCItanNvblwiXSwge1xuICAgICAgICBjd2Q6IG91dGRpcixcbiAgICAgIH0pLFxuICAgICkgYXMgUHJvdmlkZXJTY2hlbWE7XG5cbiAgICBjb25zdCB2ZXJzaW9uU2NoZW1hID0gSlNPTi5wYXJzZShcbiAgICAgIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1widmVyc2lvblwiLCBcIi1qc29uXCJdLCB7XG4gICAgICAgIGN3ZDogb3V0ZGlyLFxuICAgICAgfSksXG4gICAgKSBhcyBWZXJzaW9uU2NoZW1hO1xuXG4gICAgcHJvdmlkZXJTY2hlbWEucHJvdmlkZXJfdmVyc2lvbnMgPSB2ZXJzaW9uU2NoZW1hLnByb3ZpZGVyX3NlbGVjdGlvbnM7XG4gIH0pO1xuXG4gIC8vIFN0YW1wIHRoZSBmZXRjaGluZyBDTEkncyBpZGVudGl0eSBzbyBkb3duc3RyZWFtIGNvbnN1bWVycyBjYW4gcmVhc29uXG4gIC8vIGFib3V0IHdoaWNoIG5ld2VyLXByb3RvY29sIHNlY3Rpb25zIHRoaXMgZmV0Y2ggY291bGQgcG9zc2libHkgaGF2ZVxuICAvLyBlbWl0dGVkLiBOZXZlciBmYWlsIHRoZSBmZXRjaCBvdmVyIHRoaXMgLSBpdCdzIGJlc3QtZWZmb3J0IG1ldGFkYXRhLlxuICB0cnkge1xuICAgIGNvbnN0IGNsaSA9IGF3YWl0IGdldEZldGNoaW5nQ2xpVmVyc2lvbigpO1xuICAgIHByb3ZpZGVyU2NoZW1hLmNsaV9uYW1lID0gY2xpLm5hbWU7XG4gICAgcHJvdmlkZXJTY2hlbWEuY2xpX3ZlcnNpb24gPSBjbGkudmVyc2lvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgQ291bGQgbm90IGRldGVybWluZSBmZXRjaGluZyBDTEkgdmVyc2lvbiB0byBzdGFtcCBwcm92aWRlciBzY2hlbWE6ICR7ZXJyb3J9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHNhbml0aXplUHJvdmlkZXJTY2hlbWEocHJvdmlkZXJTY2hlbWEpO1xufVxuXG4vKipcbiAqIFdhcm5zIHdoZW4gdGhlIENMSSB0aGF0IHByb2R1Y2VkIGEgZ2l2ZW4gcHJvdmlkZXIgc2NoZW1hIHByZWRhdGVzIG9uZSBvclxuICogbW9yZSBzY2hlbWEtZW1pc3Npb24gYm91bmRhcmllcyB0aGUgcHJvamVjdCdzIGRlY2xhcmVkIGB0YXJnZXRWZXJzaW9uc2BcbiAqIGNhcmUgYWJvdXQgKHNlZSBlbWlzc2lvbi1jaGVjay50cykgLSBpLmUuIHNvbWUgbmV3ZXItcHJvdG9jb2wgc2VjdGlvbnNcbiAqIChmdW5jdGlvbnMsIGVwaGVtZXJhbCByZXNvdXJjZXMsIC4uLikgbWF5IGJlIG1pc3NpbmcgZnJvbSB0aGUgZ2VuZXJhdGVkXG4gKiBiaW5kaW5ncyBldmVuIHRob3VnaCB0aGUgc2NoZW1hIGZldGNoIGl0c2VsZiBzdWNjZWVkZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGRlY291cGxlZCBmcm9tIHRoZSBmZXRjaCBwYXRoIChyZWFkUHJvdmlkZXJTY2hlbWEpIHNvIGl0XG4gKiBhbHNvIHJ1bnMgZm9yIHNjaGVtYXMgc2VydmVkIGZyb20gdGhlIG9uLWRpc2sgY2FjaGU6IGNhY2hlZCBKU09OIGNhcnJpZXNcbiAqIHRoZSBzYW1lIGBjbGlfbmFtZWAvYGNsaV92ZXJzaW9uYCBzdGFtcHMgYSBmcmVzaCBmZXRjaCB3b3VsZCBoYXZlXG4gKiB3cml0dGVuICh0aGUgY2FjaGUga2V5IGFscmVhZHkgc2VnbWVudHMgYnkgQ0xJIHByb2R1Y3QrbWlub3IpLCBzbyB0aGUgZ2FwXG4gKiBjaGVjayBpcyBqdXN0IGFzIG1lYW5pbmdmdWwgb24gYSBjYWNoZSBoaXQgYXMgb24gYSBtaXNzLlxuICpcbiAqIE5vLW9wIHdpdGhvdXQgYHRhcmdldFZlcnNpb25zYCAtIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGFyZSB0aGUgQ0xJXG4gKiBhZ2FpbnN0LiBGYWxscyBiYWNrIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MncyBmZXRjaGluZyBDTEkgdmVyc2lvbiB3aGVuXG4gKiB0aGUgc2NoZW1hIGl0c2VsZiBpc24ndCBzdGFtcGVkIChlLmcuIG9sZGVyIGNhY2hlIGVudHJpZXMgd3JpdHRlbiBiZWZvcmVcbiAqIHN0YW1waW5nIGV4aXN0ZWQpLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YXJuSWZTY2hlbWFFbWlzc2lvbkdhcHMoXG4gIHNjaGVtYTogUHJvdmlkZXJTY2hlbWEsXG4gIHRhcmdldFZlcnNpb25zPzogVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCF0YXJnZXRWZXJzaW9ucykgcmV0dXJuO1xuXG4gIGxldCBjbGk6IFRlcnJhZm9ybUNsaVZlcnNpb247XG4gIGlmIChzY2hlbWEuY2xpX25hbWUgJiYgc2NoZW1hLmNsaV92ZXJzaW9uKSB7XG4gICAgaWYgKHNjaGVtYS5jbGlfbmFtZSAhPT0gXCJ0ZXJyYWZvcm1cIiAmJiBzY2hlbWEuY2xpX25hbWUgIT09IFwib3BlbnRvZnVcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjbGkgPSB7IG5hbWU6IHNjaGVtYS5jbGlfbmFtZSwgdmVyc2lvbjogc2NoZW1hLmNsaV92ZXJzaW9uIH07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGNsaSA9IGF3YWl0IGdldEZldGNoaW5nQ2xpVmVyc2lvbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGZldGNoaW5nIENMSSB2ZXJzaW9uIHRvIGNoZWNrIGZvciBzY2hlbWEgZW1pc3Npb24gZ2FwczogJHtlcnJvcn1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBnYXBGYW1pbGllcyA9IGNoZWNrU2NoZW1hRW1pc3Npb25HYXBGYW1pbGllcyhjbGksIHRhcmdldFZlcnNpb25zKTtcbiAgaWYgKGdhcEZhbWlsaWVzLmxlbmd0aCA+IDAgJiYgY2xpLnZlcnNpb24pIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGBwcm92aWRlciBzY2hlbWEgZmV0Y2hlZCB3aXRoICR7Y2xpLm5hbWV9ICR7Y2xpLnZlcnNpb259IOKAlCAke2pvaW5XaXRoQW5kKFxuICAgICAgICBnYXBGYW1pbGllcy5tYXAoKGZhbWlseSkgPT4gU0NIRU1BX0VNSVNTSU9OX0ZBTUlMWV9MQUJFTFNbZmFtaWx5XSksXG4gICAgICApfSB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQ7IHJ1biBjZGt0biBnZXQgd2l0aCAke3N1Z2dlc3RlZEVtaXR0aW5nQ2xpVmVyc2lvbnMoXG4gICAgICAgIGdhcEZhbWlsaWVzLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbn1cblxuLy8gVGhlIHByb3ZpZGVycyBoYXZlIHNvbWUgcG90ZW50aWFsIGJ1Z3MgdGhhdCB3ZSB3YW50IHRvIHByby1hY3RpdmVseVxuLy8gZml4IGhlcmUgc28gdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29kZSBjYW4gYXNzdW1lIGEgY29uc2lzdGVudCBzY2hlbWEuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVQcm92aWRlclNjaGVtYShzY2hlbWE6IFByb3ZpZGVyU2NoZW1hKTogUHJvdmlkZXJTY2hlbWEge1xuICAvLyBNYWlubHkgc29tZSBhdHRyaWJ1dGVzIGFyZSBcImRvdWJsZWRcIiwgZS5nLiBbXCJsaXN0XCIsIFwic3RyaW5nXCIsIFwibGlzdFwiLCBcInN0cmluZ1wiXVxuICAvLyBpbnN0ZWFkIG9mIFtcImxpc3RcIiwgXCJzdHJpbmdcIl1cbiAgZnVuY3Rpb24gYXR0cmlidXRlRG91YmxpbmdGaXgoYXR0cmlidXRlOiBBdHRyaWJ1dGUpOiBBdHRyaWJ1dGUge1xuICAgIGlmIChpc05lc3RlZFR5cGVBdHRyaWJ1dGUoYXR0cmlidXRlKSB8fCAhQXJyYXkuaXNBcnJheShhdHRyaWJ1dGUudHlwZSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9XG4gICAgICBhdHRyaWJ1dGUudHlwZS5sZW5ndGggPT09IDJcbiAgICAgICAgPyBhdHRyaWJ1dGUudHlwZVxuICAgICAgICA6IChhdHRyaWJ1dGUudHlwZSBhcyBzdHJpbmdbXSkuc2xpY2UoMCwgMik7IC8vIFRoZSB0eXBlcyB0ZWxsIHVzIHRoaXMgY2FuJ3QgaGFwcGVuLCByZWFsaXR5IGJlZ3MgdG8gZGlmZmVyXG5cbiAgICBhdHRyaWJ1dGUudHlwZSA9IHR5cGUgYXMgQXR0cmlidXRlVHlwZTtcbiAgICByZXR1cm4gYXR0cmlidXRlO1xuICB9XG5cbiAgLy8gTXV0YXRlcyBibG9jayB3aXRoIHRoZSBmaXhcbiAgZnVuY3Rpb24gc2FuaXRpemVCbG9jayhibG9jazogQmxvY2spIHtcbiAgICBPYmplY3QudmFsdWVzKGJsb2NrLmF0dHJpYnV0ZXMgfHwge30pLmZvckVhY2goYXR0cmlidXRlRG91YmxpbmdGaXgpO1xuICAgIE9iamVjdC52YWx1ZXMoYmxvY2suYmxvY2tfdHlwZXMgfHwge30pLmZvckVhY2goKGJsb2NrVHlwZSkgPT4ge1xuICAgICAgc2FuaXRpemVCbG9jayhibG9ja1R5cGUuYmxvY2spO1xuICAgIH0pO1xuICB9XG5cbiAgT2JqZWN0LnZhbHVlcyhzY2hlbWEucHJvdmlkZXJfc2NoZW1hcyB8fCB7fSkuZm9yRWFjaCgocHJvdmlkZXIpID0+IHtcbiAgICBjb25zdCBlbnRpdGllcyA9IFtcbiAgICAgIHByb3ZpZGVyLnByb3ZpZGVyLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyhwcm92aWRlci5yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMocHJvdmlkZXIuZGF0YV9zb3VyY2Vfc2NoZW1hcyB8fCB7fSksXG4gICAgICAuLi5PYmplY3QudmFsdWVzKHByb3ZpZGVyLmVwaGVtZXJhbF9yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICBdO1xuXG4gICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5KSA9PiB7XG4gICAgICBzYW5pdGl6ZUJsb2NrKGVudGl0eS5ibG9jayk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBzY2hlbWE7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTW9kdWxlU2NoZW1hKHRhcmdldDogQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0KSB7XG4gIGxldCBtb2R1bGVTY2hlbWE6IFJlY29yZDxzdHJpbmcsIE1vZHVsZVNjaGVtYT4gPSB7fTtcblxuICBhd2FpdCB3aXRoVGVtcERpcihcImZldGNoU2NoZW1hXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb25maWc6IFRlcnJhZm9ybUNvbmZpZyA9IHtcbiAgICAgIHRlcnJhZm9ybToge30sXG4gICAgfTtcblxuICAgIGlmICghY29uZmlnLm1vZHVsZSkgY29uZmlnLm1vZHVsZSA9IHt9O1xuICAgIGxldCBzb3VyY2U6IHN0cmluZyA9IHRhcmdldC5zb3VyY2U7XG5cbiAgICBjb25zdCBsb2NhbFNvdXJjZSA9ICh0YXJnZXQuY29uc3RyYWludCBhcyBUZXJyYWZvcm1Nb2R1bGVDb25zdHJhaW50KVxuICAgICAgLmxvY2FsU291cmNlQWJzb2x1dGVQYXRoO1xuICAgIGlmIChsb2NhbFNvdXJjZSkge1xuICAgICAgLy8gY3JlYXRlIHJlbGF0aXZlIHBhdGggdG8gbW9kdWxlIGluIHRoZSB1c2VyIHByb2plY3RcbiAgICAgIHNvdXJjZSA9IHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgbG9jYWxTb3VyY2UpO1xuICAgIH1cblxuICAgIGNvbmZpZy5tb2R1bGVbdGFyZ2V0Lm1vZHVsZUtleV0gPSB7IHNvdXJjZTogc291cmNlIH07XG4gICAgaWYgKHRhcmdldC52ZXJzaW9uKSB7XG4gICAgICBjb25maWcubW9kdWxlW3RhcmdldC5tb2R1bGVLZXldW1widmVyc2lvblwiXSA9IHRhcmdldC52ZXJzaW9uO1xuICAgIH1cblxuICAgIGNvbnN0IG91dGRpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ob3V0ZGlyLCBcIm1haW4udGYuanNvblwiKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuXG4gICAgYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJnZXRcIl0sIHsgY3dkOiBvdXRkaXIgfSk7XG4gICAgaWYgKGNvbmZpZy5tb2R1bGUpIHtcbiAgICAgIG1vZHVsZVNjaGVtYSA9IGF3YWl0IGhhcnZlc3RNb2R1bGVTY2hlbWEoXG4gICAgICAgIG91dGRpcixcbiAgICAgICAgT2JqZWN0LmtleXMoY29uZmlnLm1vZHVsZSksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG1vZHVsZVNjaGVtYTtcbn1cbiJdfQ==
package/build/read.d.ts CHANGED
@@ -3,11 +3,11 @@
3
3
  * SPDX-License-Identifier: MPL-2.0
4
4
  */
5
5
  export { isRegistryModule, TerraformModuleConstraint, TerraformProviderConstraint, isLocalModule, } from "@cdktn/commons";
6
- import { TerraformDependencyConstraint } from "@cdktn/commons";
6
+ import { TerraformDependencyConstraint, TerraformTargetVersions } from "@cdktn/commons";
7
7
  import { readModuleSchema, readProviderSchema } from "./provider-schema";
8
8
  export type Schema = {
9
9
  providerSchema?: Awaited<ReturnType<typeof readProviderSchema>>;
10
10
  moduleSchema?: Awaited<ReturnType<typeof readModuleSchema>>;
11
11
  };
12
- export declare function readSchema(constraints: TerraformDependencyConstraint[], cacheDir?: string): Promise<Schema>;
12
+ export declare function readSchema(constraints: TerraformDependencyConstraint[], cacheDir?: string, targetVersions?: TerraformTargetVersions): Promise<Schema>;
13
13
  //# sourceMappingURL=read.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,2BAA2B,EAC3B,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,6BAA6B,EAK9B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGzE,MAAM,MAAM,MAAM,GAAG;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;IAChE,YAAY,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC;CAC7D,CAAC;AAEF,wBAAsB,UAAU,CAC9B,WAAW,EAAE,6BAA6B,EAAE,EAC5C,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CA6BjB"}
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,2BAA2B,EAC3B,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,6BAA6B,EAI7B,uBAAuB,EAGxB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAEL,gBAAgB,EAChB,kBAAkB,EAEnB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,MAAM,MAAM,GAAG;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;IAChE,YAAY,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC;CAC7D,CAAC;AA4BF,wBAAsB,UAAU,CAC9B,WAAW,EAAE,6BAA6B,EAAE,EAC5C,QAAQ,CAAC,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,uBAAuB,GACvC,OAAO,CAAC,MAAM,CAAC,CAuCjB"}
package/build/read.js CHANGED
@@ -17,13 +17,40 @@ const commons_2 = require("@cdktn/commons");
17
17
  const deepmerge_1 = __importDefault(require("deepmerge"));
18
18
  const provider_schema_1 = require("./provider-schema");
19
19
  const cache_1 = require("./cache");
20
- async function readSchema(constraints, cacheDir) {
21
- const cachedReadProviderSchema = (0, cache_1.cachedAccess)(provider_schema_1.readProviderSchema, cacheDir);
20
+ // Schema emission is fixed per CLI product+minor version, so that's enough
21
+ // granularity for the cache key - no need for the full patch version.
22
+ async function resolveCacheKeySuffix(cacheDir) {
23
+ if (!cacheDir)
24
+ return undefined;
25
+ try {
26
+ const cli = await (0, provider_schema_1.getFetchingCliVersion)();
27
+ if (cli.name === "unknown" || !cli.version) {
28
+ commons_2.logger.debug("Could not determine fetching CLI name/version for the schema cache key, falling back to 'unknown-cli'");
29
+ return "unknown-cli";
30
+ }
31
+ const [major, minor] = cli.version.split(".");
32
+ return `${cli.name}-${major}.${minor}`;
33
+ }
34
+ catch (error) {
35
+ commons_2.logger.debug(`Could not determine fetching CLI version for the schema cache key: ${error}`);
36
+ return "unknown-cli";
37
+ }
38
+ }
39
+ async function readSchema(constraints, cacheDir, targetVersions) {
40
+ const keySuffix = await resolveCacheKeySuffix(cacheDir);
41
+ const cachedReadProviderSchema = (0, cache_1.cachedAccess)(provider_schema_1.readProviderSchema, cacheDir, keySuffix);
22
42
  const targets = constraints.map((constraint) => commons_2.ConstructsMakerProviderTarget.from(constraint, commons_2.LANGUAGES[0]));
23
43
  throwIfTargetsConflict(targets);
24
44
  const schemas = await Promise.all(targets.map((t) => t.isModule
25
45
  ? (0, provider_schema_1.readModuleSchema)(t).then((s) => ({ moduleSchema: s }))
26
- : cachedReadProviderSchema(t).then((s) => ({ providerSchema: s }))));
46
+ : cachedReadProviderSchema(t).then(async (s) => {
47
+ // Runs on both cache hits and misses: cached schemas carry the
48
+ // same cli_name/cli_version stamps a fresh fetch would have
49
+ // written, so the emission-gap warning is just as relevant on
50
+ // a hit as on a miss.
51
+ await (0, provider_schema_1.warnIfSchemaEmissionGaps)(s, targetVersions);
52
+ return { providerSchema: s };
53
+ })));
27
54
  // ensure we have a schema for each target type
28
55
  schemas.unshift({
29
56
  providerSchema: {
@@ -44,4 +71,4 @@ function throwIfTargetsConflict(targets) {
44
71
  });
45
72
  });
46
73
  }
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7OztBQUVILDBDQUt3QjtBQUp0QiwyR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQixvSEFBQSx5QkFBeUIsT0FBQTtBQUN6QixzSEFBQSwyQkFBMkIsT0FBQTtBQUMzQix3R0FBQSxhQUFhLE9BQUE7QUFFZiw0Q0FNd0I7QUFDeEIsMERBQWtDO0FBQ2xDLHVEQUF5RTtBQUN6RSxtQ0FBdUM7QUFPaEMsS0FBSyxVQUFVLFVBQVUsQ0FDOUIsV0FBNEMsRUFDNUMsUUFBaUI7SUFFakIsTUFBTSx3QkFBd0IsR0FBRyxJQUFBLG9CQUFZLEVBQUMsb0NBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUUsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQzdDLHVDQUE2QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsbUJBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUM3RCxDQUFDO0lBRUYsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFaEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDaEIsQ0FBQyxDQUFDLFFBQVE7UUFDUixDQUFDLENBQUMsSUFBQSxrQ0FBZ0IsRUFBQyxDQUFRLENBQUMsQ0FBQyxJQUFJLENBQzdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFXLENBQ3ZDO1FBQ0gsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQVEsQ0FBQyxDQUFDLElBQUksQ0FDckMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQVcsQ0FDekMsQ0FDTixDQUNGLENBQUM7SUFFRiwrQ0FBK0M7SUFDL0MsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNkLGNBQWMsRUFBRTtZQUNkLGNBQWMsRUFBRSxLQUFLO1NBQ3RCO1FBQ0QsWUFBWSxFQUFFLEVBQUU7S0FDakIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxtQkFBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBaENELGdDQWdDQztBQUVELFNBQVMsc0JBQXNCLENBQzdCLE9BQXdFO0lBRXhFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQzVCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUNlLENBQUM7SUFFbkMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzFCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMxQixJQUFJLE9BQU8sS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3pELE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQ2hCLHlDQUF5QyxPQUFPLENBQUMsSUFBSSw0TUFBNE0sQ0FDbFEsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuZXhwb3J0IHtcbiAgaXNSZWdpc3RyeU1vZHVsZSxcbiAgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludCxcbiAgVGVycmFmb3JtUHJvdmlkZXJDb25zdHJhaW50LFxuICBpc0xvY2FsTW9kdWxlLFxufSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7XG4gIFRlcnJhZm9ybURlcGVuZGVuY3lDb25zdHJhaW50LFxuICBMQU5HVUFHRVMsXG4gIENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuICBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQsXG4gIEVycm9ycyxcbn0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQgZGVlcG1lcmdlIGZyb20gXCJkZWVwbWVyZ2VcIjtcbmltcG9ydCB7IHJlYWRNb2R1bGVTY2hlbWEsIHJlYWRQcm92aWRlclNjaGVtYSB9IGZyb20gXCIuL3Byb3ZpZGVyLXNjaGVtYVwiO1xuaW1wb3J0IHsgY2FjaGVkQWNjZXNzIH0gZnJvbSBcIi4vY2FjaGVcIjtcblxuZXhwb3J0IHR5cGUgU2NoZW1hID0ge1xuICBwcm92aWRlclNjaGVtYT86IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgcmVhZFByb3ZpZGVyU2NoZW1hPj47XG4gIG1vZHVsZVNjaGVtYT86IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgcmVhZE1vZHVsZVNjaGVtYT4+O1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTY2hlbWEoXG4gIGNvbnN0cmFpbnRzOiBUZXJyYWZvcm1EZXBlbmRlbmN5Q29uc3RyYWludFtdLFxuICBjYWNoZURpcj86IHN0cmluZyxcbik6IFByb21pc2U8U2NoZW1hPiB7XG4gIGNvbnN0IGNhY2hlZFJlYWRQcm92aWRlclNjaGVtYSA9IGNhY2hlZEFjY2VzcyhyZWFkUHJvdmlkZXJTY2hlbWEsIGNhY2hlRGlyKTtcbiAgY29uc3QgdGFyZ2V0cyA9IGNvbnN0cmFpbnRzLm1hcCgoY29uc3RyYWludCkgPT5cbiAgICBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldC5mcm9tKGNvbnN0cmFpbnQsIExBTkdVQUdFU1swXSksXG4gICk7XG5cbiAgdGhyb3dJZlRhcmdldHNDb25mbGljdCh0YXJnZXRzKTtcblxuICBjb25zdCBzY2hlbWFzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgdGFyZ2V0cy5tYXAoKHQpID0+XG4gICAgICB0LmlzTW9kdWxlXG4gICAgICAgID8gcmVhZE1vZHVsZVNjaGVtYSh0IGFzIGFueSkudGhlbihcbiAgICAgICAgICAgIChzKSA9PiAoeyBtb2R1bGVTY2hlbWE6IHMgfSkgYXMgU2NoZW1hLFxuICAgICAgICAgIClcbiAgICAgICAgOiBjYWNoZWRSZWFkUHJvdmlkZXJTY2hlbWEodCBhcyBhbnkpLnRoZW4oXG4gICAgICAgICAgICAocykgPT4gKHsgcHJvdmlkZXJTY2hlbWE6IHMgfSkgYXMgU2NoZW1hLFxuICAgICAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICAvLyBlbnN1cmUgd2UgaGF2ZSBhIHNjaGVtYSBmb3IgZWFjaCB0YXJnZXQgdHlwZVxuICBzY2hlbWFzLnVuc2hpZnQoe1xuICAgIHByb3ZpZGVyU2NoZW1hOiB7XG4gICAgICBmb3JtYXRfdmVyc2lvbjogXCIwLjFcIixcbiAgICB9LFxuICAgIG1vZHVsZVNjaGVtYToge30sXG4gIH0pO1xuXG4gIHJldHVybiBkZWVwbWVyZ2UuYWxsKHNjaGVtYXMpO1xufVxuXG5mdW5jdGlvbiB0aHJvd0lmVGFyZ2V0c0NvbmZsaWN0KFxuICB0YXJnZXRzOiAoQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQgfCBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQpW10sXG4pIHtcbiAgY29uc3QgbW9kdWxlcyA9IHRhcmdldHMuZmlsdGVyKFxuICAgICh0KSA9PiB0LmlzTW9kdWxlLFxuICApIGFzIENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldFtdO1xuXG4gIG1vZHVsZXMuZm9yRWFjaCgobW9kdWxlQSkgPT4ge1xuICAgIG1vZHVsZXMuZm9yRWFjaCgobW9kdWxlQikgPT4ge1xuICAgICAgaWYgKG1vZHVsZUEgIT09IG1vZHVsZUIgJiYgbW9kdWxlQS5uYW1lID09PSBtb2R1bGVCLm5hbWUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JzLlVzYWdlKFxuICAgICAgICAgIGBGb3VuZCB0d28gbW9kdWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUgXCIke21vZHVsZUEubmFtZX1cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgcmVuYW1lIG9uZSBvZiB0aGUgbW9kdWxlcyBpbiB5b3VyIGNka3RmLmpzb24gY29uZmlnLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gc2V0IHRoZSBuYW1lIHJlZmVyIHRvIGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9tb2R1bGVzI2FkZC1tb2R1bGUtdG8tY2RrdGYtanNvbmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7OztBQUVILDBDQUt3QjtBQUp0QiwyR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQixvSEFBQSx5QkFBeUIsT0FBQTtBQUN6QixzSEFBQSwyQkFBMkIsT0FBQTtBQUMzQix3R0FBQSxhQUFhLE9BQUE7QUFFZiw0Q0FRd0I7QUFDeEIsMERBQWtDO0FBQ2xDLHVEQUsyQjtBQUMzQixtQ0FBdUM7QUFPdkMsMkVBQTJFO0FBQzNFLHNFQUFzRTtBQUN0RSxLQUFLLFVBQVUscUJBQXFCLENBQ2xDLFFBQWlCO0lBRWpCLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFaEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFBLHVDQUFxQixHQUFFLENBQUM7UUFDMUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQyxnQkFBTSxDQUFDLEtBQUssQ0FDVix1R0FBdUcsQ0FDeEcsQ0FBQztZQUNGLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLGdCQUFNLENBQUMsS0FBSyxDQUNWLHNFQUFzRSxLQUFLLEVBQUUsQ0FDOUUsQ0FBQztRQUNGLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7QUFDSCxDQUFDO0FBRU0sS0FBSyxVQUFVLFVBQVUsQ0FDOUIsV0FBNEMsRUFDNUMsUUFBaUIsRUFDakIsY0FBd0M7SUFFeEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RCxNQUFNLHdCQUF3QixHQUFHLElBQUEsb0JBQVksRUFDM0Msb0NBQWtCLEVBQ2xCLFFBQVEsRUFDUixTQUFTLENBQ1YsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUM3Qyx1Q0FBNkIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLG1CQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDN0QsQ0FBQztJQUVGLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRWhDLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2hCLENBQUMsQ0FBQyxRQUFRO1FBQ1IsQ0FBQyxDQUFDLElBQUEsa0NBQWdCLEVBQUMsQ0FBUSxDQUFDLENBQUMsSUFBSSxDQUM3QixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBVyxDQUN2QztRQUNILENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xELCtEQUErRDtZQUMvRCw0REFBNEQ7WUFDNUQsOERBQThEO1lBQzlELHNCQUFzQjtZQUN0QixNQUFNLElBQUEsMENBQXdCLEVBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFZLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQ1AsQ0FDRixDQUFDO0lBRUYsK0NBQStDO0lBQy9DLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDZCxjQUFjLEVBQUU7WUFDZCxjQUFjLEVBQUUsS0FBSztTQUN0QjtRQUNELFlBQVksRUFBRSxFQUFFO0tBQ2pCLENBQUMsQ0FBQztJQUVILE9BQU8sbUJBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQTNDRCxnQ0EyQ0M7QUFFRCxTQUFTLHNCQUFzQixDQUM3QixPQUF3RTtJQUV4RSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUM1QixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FDZSxDQUFDO0lBRW5DLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUMxQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxPQUFPLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN6RCxNQUFNLGdCQUFNLENBQUMsS0FBSyxDQUNoQix5Q0FBeUMsT0FBTyxDQUFDLElBQUksNE1BQTRNLENBQ2xRLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuICovXG5cbmV4cG9ydCB7XG4gIGlzUmVnaXN0cnlNb2R1bGUsXG4gIFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQsXG4gIFRlcnJhZm9ybVByb3ZpZGVyQ29uc3RyYWludCxcbiAgaXNMb2NhbE1vZHVsZSxcbn0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQge1xuICBUZXJyYWZvcm1EZXBlbmRlbmN5Q29uc3RyYWludCxcbiAgTEFOR1VBR0VTLFxuICBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldCxcbiAgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0LFxuICBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyxcbiAgRXJyb3JzLFxuICBsb2dnZXIsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IGRlZXBtZXJnZSBmcm9tIFwiZGVlcG1lcmdlXCI7XG5pbXBvcnQge1xuICBnZXRGZXRjaGluZ0NsaVZlcnNpb24sXG4gIHJlYWRNb2R1bGVTY2hlbWEsXG4gIHJlYWRQcm92aWRlclNjaGVtYSxcbiAgd2FybklmU2NoZW1hRW1pc3Npb25HYXBzLFxufSBmcm9tIFwiLi9wcm92aWRlci1zY2hlbWFcIjtcbmltcG9ydCB7IGNhY2hlZEFjY2VzcyB9IGZyb20gXCIuL2NhY2hlXCI7XG5cbmV4cG9ydCB0eXBlIFNjaGVtYSA9IHtcbiAgcHJvdmlkZXJTY2hlbWE/OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHJlYWRQcm92aWRlclNjaGVtYT4+O1xuICBtb2R1bGVTY2hlbWE/OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHJlYWRNb2R1bGVTY2hlbWE+Pjtcbn07XG5cbi8vIFNjaGVtYSBlbWlzc2lvbiBpcyBmaXhlZCBwZXIgQ0xJIHByb2R1Y3QrbWlub3IgdmVyc2lvbiwgc28gdGhhdCdzIGVub3VnaFxuLy8gZ3JhbnVsYXJpdHkgZm9yIHRoZSBjYWNoZSBrZXkgLSBubyBuZWVkIGZvciB0aGUgZnVsbCBwYXRjaCB2ZXJzaW9uLlxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNhY2hlS2V5U3VmZml4KFxuICBjYWNoZURpcj86IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghY2FjaGVEaXIpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjbGkgPSBhd2FpdCBnZXRGZXRjaGluZ0NsaVZlcnNpb24oKTtcbiAgICBpZiAoY2xpLm5hbWUgPT09IFwidW5rbm93blwiIHx8ICFjbGkudmVyc2lvbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBcIkNvdWxkIG5vdCBkZXRlcm1pbmUgZmV0Y2hpbmcgQ0xJIG5hbWUvdmVyc2lvbiBmb3IgdGhlIHNjaGVtYSBjYWNoZSBrZXksIGZhbGxpbmcgYmFjayB0byAndW5rbm93bi1jbGknXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIFwidW5rbm93bi1jbGlcIjtcbiAgICB9XG5cbiAgICBjb25zdCBbbWFqb3IsIG1pbm9yXSA9IGNsaS52ZXJzaW9uLnNwbGl0KFwiLlwiKTtcbiAgICByZXR1cm4gYCR7Y2xpLm5hbWV9LSR7bWFqb3J9LiR7bWlub3J9YDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgQ291bGQgbm90IGRldGVybWluZSBmZXRjaGluZyBDTEkgdmVyc2lvbiBmb3IgdGhlIHNjaGVtYSBjYWNoZSBrZXk6ICR7ZXJyb3J9YCxcbiAgICApO1xuICAgIHJldHVybiBcInVua25vd24tY2xpXCI7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTY2hlbWEoXG4gIGNvbnN0cmFpbnRzOiBUZXJyYWZvcm1EZXBlbmRlbmN5Q29uc3RyYWludFtdLFxuICBjYWNoZURpcj86IHN0cmluZyxcbiAgdGFyZ2V0VmVyc2lvbnM/OiBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyxcbik6IFByb21pc2U8U2NoZW1hPiB7XG4gIGNvbnN0IGtleVN1ZmZpeCA9IGF3YWl0IHJlc29sdmVDYWNoZUtleVN1ZmZpeChjYWNoZURpcik7XG4gIGNvbnN0IGNhY2hlZFJlYWRQcm92aWRlclNjaGVtYSA9IGNhY2hlZEFjY2VzcyhcbiAgICByZWFkUHJvdmlkZXJTY2hlbWEsXG4gICAgY2FjaGVEaXIsXG4gICAga2V5U3VmZml4LFxuICApO1xuICBjb25zdCB0YXJnZXRzID0gY29uc3RyYWludHMubWFwKChjb25zdHJhaW50KSA9PlxuICAgIENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LmZyb20oY29uc3RyYWludCwgTEFOR1VBR0VTWzBdKSxcbiAgKTtcblxuICB0aHJvd0lmVGFyZ2V0c0NvbmZsaWN0KHRhcmdldHMpO1xuXG4gIGNvbnN0IHNjaGVtYXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICB0YXJnZXRzLm1hcCgodCkgPT5cbiAgICAgIHQuaXNNb2R1bGVcbiAgICAgICAgPyByZWFkTW9kdWxlU2NoZW1hKHQgYXMgYW55KS50aGVuKFxuICAgICAgICAgICAgKHMpID0+ICh7IG1vZHVsZVNjaGVtYTogcyB9KSBhcyBTY2hlbWEsXG4gICAgICAgICAgKVxuICAgICAgICA6IGNhY2hlZFJlYWRQcm92aWRlclNjaGVtYSh0IGFzIGFueSkudGhlbihhc3luYyAocykgPT4ge1xuICAgICAgICAgICAgLy8gUnVucyBvbiBib3RoIGNhY2hlIGhpdHMgYW5kIG1pc3NlczogY2FjaGVkIHNjaGVtYXMgY2FycnkgdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGNsaV9uYW1lL2NsaV92ZXJzaW9uIHN0YW1wcyBhIGZyZXNoIGZldGNoIHdvdWxkIGhhdmVcbiAgICAgICAgICAgIC8vIHdyaXR0ZW4sIHNvIHRoZSBlbWlzc2lvbi1nYXAgd2FybmluZyBpcyBqdXN0IGFzIHJlbGV2YW50IG9uXG4gICAgICAgICAgICAvLyBhIGhpdCBhcyBvbiBhIG1pc3MuXG4gICAgICAgICAgICBhd2FpdCB3YXJuSWZTY2hlbWFFbWlzc2lvbkdhcHMocywgdGFyZ2V0VmVyc2lvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIHsgcHJvdmlkZXJTY2hlbWE6IHMgfSBhcyBTY2hlbWE7XG4gICAgICAgICAgfSksXG4gICAgKSxcbiAgKTtcblxuICAvLyBlbnN1cmUgd2UgaGF2ZSBhIHNjaGVtYSBmb3IgZWFjaCB0YXJnZXQgdHlwZVxuICBzY2hlbWFzLnVuc2hpZnQoe1xuICAgIHByb3ZpZGVyU2NoZW1hOiB7XG4gICAgICBmb3JtYXRfdmVyc2lvbjogXCIwLjFcIixcbiAgICB9LFxuICAgIG1vZHVsZVNjaGVtYToge30sXG4gIH0pO1xuXG4gIHJldHVybiBkZWVwbWVyZ2UuYWxsKHNjaGVtYXMpO1xufVxuXG5mdW5jdGlvbiB0aHJvd0lmVGFyZ2V0c0NvbmZsaWN0KFxuICB0YXJnZXRzOiAoQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQgfCBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQpW10sXG4pIHtcbiAgY29uc3QgbW9kdWxlcyA9IHRhcmdldHMuZmlsdGVyKFxuICAgICh0KSA9PiB0LmlzTW9kdWxlLFxuICApIGFzIENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldFtdO1xuXG4gIG1vZHVsZXMuZm9yRWFjaCgobW9kdWxlQSkgPT4ge1xuICAgIG1vZHVsZXMuZm9yRWFjaCgobW9kdWxlQikgPT4ge1xuICAgICAgaWYgKG1vZHVsZUEgIT09IG1vZHVsZUIgJiYgbW9kdWxlQS5uYW1lID09PSBtb2R1bGVCLm5hbWUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JzLlVzYWdlKFxuICAgICAgICAgIGBGb3VuZCB0d28gbW9kdWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUgXCIke21vZHVsZUEubmFtZX1cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgcmVuYW1lIG9uZSBvZiB0aGUgbW9kdWxlcyBpbiB5b3VyIGNka3RmLmpzb24gY29uZmlnLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gc2V0IHRoZSBuYW1lIHJlZmVyIHRvIGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9tb2R1bGVzI2FkZC1tb2R1bGUtdG8tY2RrdGYtanNvbmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuIl19