@dbx-tools/shared-core 0.9.19 → 0.9.28

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.
@@ -52,6 +52,7 @@ const IDENTIFIER_DEFAULTS = {
52
52
  truncateHashLength: 6,
53
53
  delimiter: "-",
54
54
  };
55
+ /** Yield normalized tokens using explicit casing, URI, email, and deduplication rules. */
55
56
  export function* tokenizeWithOptions(options, ...values) {
56
57
  const opts = { ...TOKENIZE_DEFAULTS, ...options };
57
58
  const seen = opts.distinct ? new Set() : undefined;
@@ -94,6 +95,7 @@ export function* tokenizeWithOptions(options, ...values) {
94
95
  }
95
96
  }
96
97
  }
98
+ /** Yield normalized tokens using the default tokenization rules. */
97
99
  export function* tokenize(...values) {
98
100
  yield* tokenizeWithOptions({}, ...values);
99
101
  }
@@ -130,6 +132,7 @@ export function toIdentifierWithOptions(options, ...values) {
130
132
  }
131
133
  return tokens.join(opts.delimiter);
132
134
  }
135
+ /** Convert arbitrary values into a normalized camel-case identifier. */
133
136
  export function toIdentifier(...values) {
134
137
  return toIdentifierWithOptions({}, ...values);
135
138
  }
@@ -141,6 +144,7 @@ export function toIdentifier(...values) {
141
144
  export function toSlugWithOptions(options, ...values) {
142
145
  return toIdentifierWithOptions({ ...options, delimiter: "-" }, ...values);
143
146
  }
147
+ /** Convert arbitrary values into a normalized hyphen-delimited slug. */
144
148
  export function toSlug(...values) {
145
149
  return toSlugWithOptions({}, ...values);
146
150
  }
@@ -517,4 +521,4 @@ export function toLabel(value, options) {
517
521
  export function capitalize(value) {
518
522
  return value ? value.charAt(0).toUpperCase() + value.slice(1) : value;
519
523
  }
520
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmluZy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQXlEL0MsMEVBQTBFO0FBQzFFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsaUVBQWlFO0FBQ2pFLE1BQU0sMEJBQTBCLEdBQUcsaURBQWlELENBQUM7QUFDckYsTUFBTSxnQ0FBZ0MsR0FBRyxlQUFlLENBQUM7QUFDekQsTUFBTSxrQkFBa0IsR0FBNEQ7SUFDbEYsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNoQyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsNkVBQTZFO0lBQzdFLCtEQUErRDtJQUMvRCxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUNqQixJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGLENBQUM7QUFDRixNQUFNLFVBQVUsR0FBRyxvREFBb0QsQ0FBQztBQUN4RSxNQUFNLFlBQVksR0FBRywwRUFBMEUsQ0FBQztBQUVoRyxNQUFNLGlCQUFpQixH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Q0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLEtBQWEsRUFBRSxPQUF5QjtJQUM5RCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBYTtJQUN0QyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDeEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJvd3Nlci1zYWZlIHN0cmluZyB0b29sa2l0OiB0b2tlbml6YXRpb24sIGlkZW50aWZpZXIgLyBzbHVnXG4gKiBnZW5lcmF0aW9uICh3aXRoIGhhc2gtc3VmZml4IGNvbGxpc2lvbiByZXNpc3RhbmNlKSwgSFRNTCBlc2NhcGluZyxcbiAqIGhlYWRlci12YWx1ZSB0cmltbWluZywgYW5kIGEgbmVzdGVkIGRlc2NyaXB0aW9uLXRyZWUgcmVuZGVyZXIgZm9yXG4gKiBsb25nLWZvcm0gTExNIHByb21wdCAvIHRvb2wtZGVzY3JpcHRpb24gdGV4dC4gRGVwZW5kcyBvbmx5IG9uIHRoZVxuICogbG9jYWwge0BsaW5rIGZudkhhc2hXaXRoT3B0aW9uc30gZm9yIGRldGVybWluaXN0aWMgaGFzaCBzdWZmaXhlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IGZudkhhc2hXaXRoT3B0aW9ucyB9IGZyb20gXCIuL2hhc2gudHNcIjtcblxuLyoqXG4gKiBPcHRpb25zIGNvbnRyb2xsaW5nIHtAbGluayB0b2tlbml6ZVdpdGhPcHRpb25zfS4gQWxsIGRlZmF1bHQgb2ZmIGV4Y2VwdFxuICogYGNhbWVsQ2FzZWAuXG4gKlxuICogLSBgZGlzdGluY3RgIC0gZHJvcCBkdXBsaWNhdGUgdG9rZW5zIChmaXJzdCBvY2N1cnJlbmNlIHdpbnMpLlxuICogLSBgbG93ZXJDYXNlYCAtIGxvd2VyY2FzZSBldmVyeSB0b2tlbi5cbiAqIC0gYGNhcGl0YWxpemVgIC0gdXBwZXItY2FzZSBlYWNoIHRva2VuJ3MgZmlyc3QgbGV0dGVyICh0aGVuXG4gKiAgIHtAbGluayBUT0tFTklaRV9PVkVSUklERVN9IGZpeCB1cCBgYWlgIC0+IGBBSWAsIGBmc2AgLT4gYEZTYCwgYW5kXG4gKiAgIGB2MmAgLT4gYFYyYCkuXG4gKiAtIGBvbWl0VXJpU2NoZW1lYCAtIHN0cmlwIGEgbGVhZGluZyBgc2NoZW1lOi8vYCBiZWZvcmUgdG9rZW5pemluZy5cbiAqIC0gYG9taXRFbWFpbERvbWFpbmAgLSBrZWVwIG9ubHkgdGhlIGxvY2FsIHBhcnQgb2YgYW4gZW1haWwuXG4gKiAtIGBjYW1lbENhc2VgIC0gc3BsaXQgb24gY2FtZWxDYXNlIGJvdW5kYXJpZXMgLyBkaWdpdCBydW5zIC8gYWNyb255bXNcbiAqICAgKGRlZmF1bHQgYHRydWVgKTsgd2hlbiBgZmFsc2VgLCBzcGxpdCBvbmx5IG9uIG5vbi1hbHBoYW51bWVyaWNzLlxuICovXG5leHBvcnQgdHlwZSBUb2tlbml6ZU9wdGlvbnMgPSB7XG4gIGRpc3RpbmN0PzogYm9vbGVhbjtcbiAgbG93ZXJDYXNlPzogYm9vbGVhbjtcbiAgY2FwaXRhbGl6ZT86IGJvb2xlYW47XG4gIG9taXRVcmlTY2hlbWU/OiBib29sZWFuO1xuICBvbWl0RW1haWxEb21haW4/OiBib29sZWFuO1xuICBjYW1lbENhc2U/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBUb2tlbml6YXRpb24gYW5kIG92ZXJmbG93IGNvbnRyb2xzIGZvciBsb3dlcmNhc2Uga2V5cyBhbmQgc2x1Z3MuIFRoZSBkZWZhdWx0XG4gKiBsZW5ndGggaXMgdW5saW1pdGVkOyBvdmVyZmxvdyB1c2VzIGEgc2l4LWNoYXJhY3RlciBoYXNoIHVubGVzcyBvdmVycmlkZGVuLlxuICovXG5leHBvcnQgdHlwZSBLZXlPcHRpb25zID0gT21pdDxUb2tlbml6ZU9wdGlvbnMsIFwibG93ZXJDYXNlXCIgfCBcImNhcGl0YWxpemVcIj4gJiB7XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgdHJ1bmNhdGVTdHJhdGVneT86IFwiaGFzaFwiIHwgXCJ0cmltXCIgfCBcImVtcHR5XCI7XG4gIHRydW5jYXRlSGFzaExlbmd0aD86IG51bWJlcjtcbn07XG5cbi8qKiB7QGxpbmsgS2V5T3B0aW9uc30gcGx1cyB0aGUgdG9rZW4gZGVsaW1pdGVyIHVzZWQgYnkgaWRlbnRpZmllciBnZW5lcmF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgSWRlbnRpZmllck9wdGlvbnMgPSBLZXlPcHRpb25zICYge1xuICBkZWxpbWl0ZXI/OiBzdHJpbmc7XG59O1xuXG4vKiogTGVhZGluZyBhbmQgdHJhaWxpbmcgYmxhbmstbGluZSBoYW5kbGluZyBmb3Ige0BsaW5rIGRlZGVudH0uICovXG5leHBvcnQgdHlwZSBEZWRlbnRPcHRpb25zID0ge1xuICAvKiogUmVtb3ZlIGxlYWRpbmcgYmxhbmsgbGluZXMgYWZ0ZXIgaW5kZW50YXRpb24gbm9ybWFsaXphdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLiAqL1xuICB0cmltU3RhcnQ/OiBib29sZWFuO1xuICAvKipcbiAgICogUmVtb3ZlIHRyYWlsaW5nIGJsYW5rIGxpbmVzIGFmdGVyIGluZGVudGF0aW9uIG5vcm1hbGl6YXRpb24uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHRyaW1FbmQ/OiBib29sZWFuO1xuICAvKiogUmVtb3ZlIHNwYWNlcyBhbmQgdGFicyBmcm9tIGVhY2ggbGluZSBlbmQuIERlZmF1bHRzIHRvIGB0cnVlYC4gKi9cbiAgdHJpbUxpbmVFbmQ/OiBib29sZWFuO1xufTtcblxudHlwZSBSZXNvbHZlZFRva2VuaXplT3B0aW9ucyA9IFJlcXVpcmVkPFRva2VuaXplT3B0aW9ucz47XG50eXBlIFJlc29sdmVkSWRlbnRpZmllck9wdGlvbnMgPSBSZXF1aXJlZDxcbiAgSWRlbnRpZmllck9wdGlvbnMgJiBQaWNrPFRva2VuaXplT3B0aW9ucywgXCJsb3dlckNhc2VcIiB8IFwiY2FwaXRhbGl6ZVwiPlxuPjtcblxuLy8gQSBsZWFkaW5nIGB2YC9gVmAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgZGlnaXRzIChhIHZlcnNpb24gbWFya2VyIGxpa2Vcbi8vIGB2MmApIGlzIGtlcHQgYXMgT05FIHRva2VuIGluc3RlYWQgb2Ygc3BsaXR0aW5nIGludG8gYHZgICsgYDJgOyBpdCBsZWFkcyB0aGVcbi8vIGFsdGVybmF0aW9uIHNvIGl0IHdpbnMgb3ZlciB0aGUgZ2VuZXJpYyBsZXR0ZXIgLyBkaWdpdCBydW5zLiBFdmVyeXRoaW5nIGVsc2Vcbi8vIGlzIHRoZSB1c3VhbCBjYW1lbENhc2Ugd29yZCAvIG51bWJlciAvIGFsbC1jYXBzLWFjcm9ueW0gc3BsaXQuXG5jb25zdCBUT0tFTklaRV9DQU1FTF9DQVNFX1JFR0VYUCA9IC9bdlZdWzAtOV0rfFtBLVpdP1thLXpdK3xbMC05XSt8W0EtWl0rKD8hW2Etel0pL2c7XG5jb25zdCBUT0tFTklaRV9OT05fQUxQSEFOVU1FUklDX1JFR0VYUCA9IC9bYS16QS1aMC05XSsvZztcbmNvbnN0IFRPS0VOSVpFX09WRVJSSURFUzogKCh0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBUb2tlbml6ZU9wdGlvbnMpID0+IHN0cmluZylbXSA9IFtcbiAgKHRva2VuLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKCFvcHRpb25zLmNhcGl0YWxpemUpIHJldHVybiB0b2tlbjtcbiAgICBjb25zdCBsb3dlciA9IHRva2VuLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyID09PSBcImFpXCIpIHJldHVybiBcIkFJXCI7XG4gICAgaWYgKGxvd2VyID09PSBcImZzXCIpIHJldHVybiBcIkZTXCI7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9LFxuICAvLyBWZXJzaW9uIG1hcmtlciBgdjJgIC0+IGBWMmAgd2hlbiBjYXBpdGFsaXppbmcgKHRoZSBsZWFkaW5nIGB2YCB1cHBlcmNhc2VzLFxuICAvLyB0aGUgZGlnaXRzIHN0YXkpLCBzbyBpdCByZWFkcyBhcyBvbmUgdW5pdCByYXRoZXIgdGhhbiBcIlYgMlwiLlxuICAodG9rZW4sIG9wdGlvbnMpID0+IHtcbiAgICBpZiAob3B0aW9ucy5jYXBpdGFsaXplICYmIC9edlswLTldKyQvLnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gYFYke3Rva2VuLnNsaWNlKDEpfWA7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbjtcbiAgfSxcbl07XG5jb25zdCBVUklfUkVHRVhQID0gL14oW2EtekEtWl1bYS16QS1aMC05Ky4tXSopPzpcXC9cXC8oW15cXHMvPyNdW15cXHNdKik/JC87XG5jb25zdCBFTUFJTF9SRUdFWFAgPSAvXihbYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dKylAKFthLXpBLVowLTktXSsoPzpcXC5bYS16QS1aMC05LV0rKSspJC87XG5cbmNvbnN0IFRPS0VOSVpFX0RFRkFVTFRTOiBSZXNvbHZlZFRva2VuaXplT3B0aW9ucyA9IHtcbiAgZGlzdGluY3Q6IGZhbHNlLFxuICBsb3dlckNhc2U6IGZhbHNlLFxuICBjYXBpdGFsaXplOiBmYWxzZSxcbiAgb21pdFVyaVNjaGVtZTogZmFsc2UsXG4gIG9taXRFbWFpbERvbWFpbjogZmFsc2UsXG4gIGNhbWVsQ2FzZTogdHJ1ZSxcbn07XG5cbmNvbnN0IElERU5USUZJRVJfREVGQVVMVFM6IFJlc29sdmVkSWRlbnRpZmllck9wdGlvbnMgPSB7XG4gIC4uLlRPS0VOSVpFX0RFRkFVTFRTLFxuICBsb3dlckNhc2U6IHRydWUsXG4gIG1heExlbmd0aDogSW5maW5pdHksXG4gIHRydW5jYXRlU3RyYXRlZ3k6IFwiaGFzaFwiLFxuICB0cnVuY2F0ZUhhc2hMZW5ndGg6IDYsXG4gIGRlbGltaXRlcjogXCItXCIsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24qIHRva2VuaXplV2l0aE9wdGlvbnMoXG4gIG9wdGlvbnM6IFRva2VuaXplT3B0aW9ucyxcbiAgLi4udmFsdWVzOiB1bmtub3duW11cbik6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgY29uc3Qgb3B0czogUmVzb2x2ZWRUb2tlbml6ZU9wdGlvbnMgPSB7IC4uLlRPS0VOSVpFX0RFRkFVTFRTLCAuLi5vcHRpb25zIH07XG4gIGNvbnN0IHNlZW4gPSBvcHRzLmRpc3RpbmN0ID8gbmV3IFNldDxzdHJpbmc+KCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlZ2V4cCA9IG9wdHMuY2FtZWxDYXNlID8gVE9LRU5JWkVfQ0FNRUxfQ0FTRV9SRUdFWFAgOiBUT0tFTklaRV9OT05fQUxQSEFOVU1FUklDX1JFR0VYUDtcblxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSBjb250aW51ZTtcbiAgICBsZXQgc3RyaW5nVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgaWYgKCFzdHJpbmdWYWx1ZSkgY29udGludWU7XG4gICAgaWYgKG9wdHMub21pdFVyaVNjaGVtZSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBzdHJpbmdWYWx1ZS5tYXRjaChVUklfUkVHRVhQKTtcbiAgICAgIGlmIChtYXRjaCkgc3RyaW5nVmFsdWUgPSBtYXRjaFsyXSA/PyBcIlwiO1xuICAgIH1cbiAgICBpZiAob3B0cy5vbWl0RW1haWxEb21haW4pIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc3RyaW5nVmFsdWUubWF0Y2goRU1BSUxfUkVHRVhQKTtcbiAgICAgIGlmIChtYXRjaCkgc3RyaW5nVmFsdWUgPSBtYXRjaFsxXSA/PyBcIlwiO1xuICAgIH1cbiAgICBpZiAoIXN0cmluZ1ZhbHVlKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHRva2VuTWF0Y2ggb2Ygc3RyaW5nVmFsdWUubWF0Y2hBbGwocmVnZXhwKSkge1xuICAgICAgbGV0IHRva2VuID0gdG9rZW5NYXRjaFswXSE7XG4gICAgICBpZiAob3B0cy5sb3dlckNhc2UpIHRva2VuID0gdG9rZW4udG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChvcHRzLmNhcGl0YWxpemUpIHRva2VuID0gY2FwaXRhbGl6ZSh0b2tlbik7XG4gICAgICBpZiAoIXRva2VuKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3Qgb3ZlcnJpZGUgb2YgVE9LRU5JWkVfT1ZFUlJJREVTKSB7XG4gICAgICAgIHRva2VuID0gb3ZlcnJpZGUodG9rZW4sIG9wdHMpO1xuICAgICAgICBpZiAoIXRva2VuKSBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICghdG9rZW4gfHwgc2Vlbj8uaGFzKHRva2VuKSkgY29udGludWU7XG4gICAgICBzZWVuPy5hZGQodG9rZW4pO1xuICAgICAgeWllbGQgdG9rZW47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogdG9rZW5pemUoLi4udmFsdWVzOiB1bmtub3duW10pOiBHZW5lcmF0b3I8c3RyaW5nPiB7XG4gIHlpZWxkKiB0b2tlbml6ZVdpdGhPcHRpb25zKHt9LCAuLi52YWx1ZXMpO1xufVxuXG4vKipcbiAqIEpvaW4gdG9rZW5pemVkIHZhbHVlcyB3aXRoIGBkZWxpbWl0ZXJgLiBXaGVuIHRoZSBuZXh0IHRva2VuIHdvdWxkIHB1c2ggdGhlXG4gKiByZXN1bHQgb3ZlciBgbWF4TGVuZ3RoYDogYHRyaW1gIHN0b3BzIGFkZGluZzsgYGVtcHR5YCByZXR1cm5zIGBcIlwiYDsgYGhhc2hgXG4gKiBhcHBlbmRzIGEgZGlnZXN0IG9mIGFjY2VwdGVkIHRva2VucyBwbHVzIHRoZSBvdmVyZmxvdyB0b2tlbiBpZiB0aGUgcmVzdWx0XG4gKiBzdGlsbCBmaXRzLCBvdGhlcndpc2UgYFwiXCJgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMob3B0aW9uczogSWRlbnRpZmllck9wdGlvbnMsIC4uLnZhbHVlczogdW5rbm93bltdKTogc3RyaW5nIHtcbiAgY29uc3Qgb3B0czogUmVzb2x2ZWRJZGVudGlmaWVyT3B0aW9ucyA9IHtcbiAgICAuLi5JREVOVElGSUVSX0RFRkFVTFRTLFxuICAgIC4uLm9wdGlvbnMsXG4gICAgbG93ZXJDYXNlOiB0cnVlLFxuICB9O1xuICBjb25zdCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50TGVuZ3RoID0gMDtcblxuICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2VuaXplV2l0aE9wdGlvbnMob3B0cywgLi4udmFsdWVzKSkge1xuICAgIGNvbnN0IHNlcExlbmd0aCA9IHRva2Vucy5sZW5ndGggPiAwID8gb3B0cy5kZWxpbWl0ZXIubGVuZ3RoIDogMDtcbiAgICBjb25zdCBuZXh0TGVuZ3RoID0gY3VycmVudExlbmd0aCArIHNlcExlbmd0aCArIHRva2VuLmxlbmd0aDtcblxuICAgIGlmIChuZXh0TGVuZ3RoID4gb3B0cy5tYXhMZW5ndGgpIHtcbiAgICAgIGlmIChvcHRzLnRydW5jYXRlU3RyYXRlZ3kgPT09IFwiZW1wdHlcIikgcmV0dXJuIFwiXCI7XG4gICAgICBpZiAob3B0cy50cnVuY2F0ZVN0cmF0ZWd5ID09PSBcInRyaW1cIikgYnJlYWs7XG5cbiAgICAgIGNvbnN0IGhhc2ggPSBkaWdlc3RUb2tlbnMob3B0cy50cnVuY2F0ZUhhc2hMZW5ndGgsIHRva2VucywgdG9rZW4pO1xuICAgICAgaWYgKGN1cnJlbnRMZW5ndGggKyBzZXBMZW5ndGggKyBoYXNoLmxlbmd0aCA8PSBvcHRzLm1heExlbmd0aCkge1xuICAgICAgICByZXR1cm4gdG9rZW5zLmxlbmd0aCA+IDAgPyB0b2tlbnMuam9pbihvcHRzLmRlbGltaXRlcikgKyBvcHRzLmRlbGltaXRlciArIGhhc2ggOiBoYXNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgIGN1cnJlbnRMZW5ndGggPSBuZXh0TGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucy5qb2luKG9wdHMuZGVsaW1pdGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvSWRlbnRpZmllciguLi52YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIHJldHVybiB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7fSwgLi4udmFsdWVzKTtcbn1cblxuLyoqXG4gKiBTbHVnaWZpZWQgaWRlbnRpZmllcjogc2FtZSBydWxlcyBhcyB7QGxpbmsgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnN9IHdpdGggdGhlXG4gKiBkZWxpbWl0ZXIgZm9yY2VkIHRvIGAtYC4gQWNjZXB0cyB7QGxpbmsgS2V5T3B0aW9uc30gc28gY2FsbGVycyBjYW5ub3RcbiAqIG92ZXJyaWRlIHRoZSBkZWxpbWl0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NsdWdXaXRoT3B0aW9ucyhvcHRpb25zOiBLZXlPcHRpb25zLCAuLi52YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIHJldHVybiB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7IC4uLm9wdGlvbnMsIGRlbGltaXRlcjogXCItXCIgfSwgLi4udmFsdWVzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU2x1ZyguLi52YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIHJldHVybiB0b1NsdWdXaXRoT3B0aW9ucyh7fSwgLi4udmFsdWVzKTtcbn1cblxuLyoqXG4gKiBUcmltIGB2YWx1ZWAgYW5kIHJldHVybiBgbnVsbGAgZm9yIG5vbi1zdHJpbmdzLCBgdW5kZWZpbmVkYCwgb3JcbiAqIHN0cmluZ3MgdGhhdCBhcmUgZW1wdHkgYWZ0ZXIgdHJpbW1pbmcuIExldHMgY2FsbCBzaXRlcyBjb2xsYXBzZSB0aGVcbiAqIGNvbW1vblxuICpcbiAqIGBgYHRzXG4gKiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiB2LnRyaW0oKSA/IHYudHJpbSgpIDogbnVsbFxuICogYGBgXG4gKlxuICogZGFuY2UgaW50byBhIHNpbmdsZSBoZWxwZXIuIFVzZWZ1bCBmb3IgSFRUUCBoZWFkZXIgLyBxdWVyeSAvIGZvcm1cbiAqIGV4dHJhY3RvcnMgd2hlcmUgZG93bnN0cmVhbSBjb2RlIHdhbnRzIGBzdHJpbmcgfCBudWxsYCB0byBkcml2ZSBhXG4gKiBjaGVhcCBgPz9gIC8gYGlmICh4KWAgY2FzY2FkZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1Ub051bGwodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gIHJldHVybiB0cmltbWVkID8gdHJpbW1lZCA6IG51bGw7XG59XG5cbi8vIENvbmZpZyBsaXN0cyBhcnJpdmUgZWl0aGVyIGFscmVhZHkgc3BsaXQgKGFuIGFycmF5KSBvciBhcyBvbmUgZW52LXZhciBzdHJpbmdcbi8vIHdpdGggZW50cmllcyBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZC9vciB3aGl0ZXNwYWNlLlxuY29uc3QgTElTVF9TRVBBUkFUT1JfUkVHRVhQID0gL1tcXHMsXSsvO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIGNvbmZpZyBsaXN0IHRoYXQgbWF5IGFycml2ZSBhcyBhbiBhcnJheSBvciBhcyBhIHNpbmdsZVxuICogY29tbWEvd2hpdGVzcGFjZS1zZXBhcmF0ZWQgc3RyaW5nOiBzcGxpdCwgYXBwbHkgYHRyYW5zZm9ybWAsIGRyb3AgZW1wdGllcyxcbiAqIGFuZCBkZS1kdXBsaWNhdGUgKGZpcnN0IG9jY3VycmVuY2Ugd2lucykuXG4gKlxuICogVGhpcyBpcyB0aGUgc2hhcGUgZXZlcnkgYWxsb3ctbGlzdCAvIGZhbGxiYWNrLW9yZGVyIHNldHRpbmcgaW4gdGhpcyByZXBvXG4gKiB0YWtlcywgYmVjYXVzZSB0aGUgc2FtZSB2YWx1ZSBjYW4gY29tZSBmcm9tIHR5cGVkIGNvbmZpZyAoYHN0cmluZ1tdYCkgb3IgZnJvbVxuICogYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgKGBcImEsIGIgY1wiYCkuIFBhc3MgYHRyYW5zZm9ybWAgdG8gbm9ybWFsaXplIGVudHJpZXNcbiAqIGFzIHRoZXkgYXJlIHJlYWQ7IGl0IGRlZmF1bHRzIHRvIHRyaW1taW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiBwYXJzZUxpc3QoXCJkb2NzLmV4YW1wbGUuY29tLCAqLmRhdGFicmlja3MuY29tXCIpO1xuICogcGFyc2VMaXN0KHByb2Nlc3MuZW52Lk1PREVMX0ZBTExCQUNLUyk7XG4gKiBwYXJzZUxpc3QocmF3LCBub3JtYWxpemVVcmxQYXR0ZXJuKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlzdChcbiAgcmF3OiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gIHRyYW5zZm9ybTogKGVudHJ5OiBzdHJpbmcpID0+IHN0cmluZyA9IChlbnRyeSkgPT4gZW50cnkudHJpbSgpLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBlbnRyaWVzID1cbiAgICB0eXBlb2YgcmF3ID09PSBcInN0cmluZ1wiID8gcmF3LnNwbGl0KExJU1RfU0VQQVJBVE9SX1JFR0VYUCkgOiBBcnJheS5pc0FycmF5KHJhdykgPyByYXcgOiBbXTtcbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0cmFuc2Zvcm0oZW50cnkpO1xuICAgIGlmICghbm9ybWFsaXplZCB8fCBzZWVuLmhhcyhub3JtYWxpemVkKSkgY29udGludWU7XG4gICAgc2Vlbi5hZGQobm9ybWFsaXplZCk7XG4gICAgb3V0LnB1c2gobm9ybWFsaXplZCk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiB7QGxpbmsgdHJpbVRvTnVsbH0gd2l0aCBhbiBlbXB0eS1zdHJpbmcgbWlzcyBpbnN0ZWFkIG9mIGBudWxsYCwgZm9yIGNhbGxlcnNcbiAqIHRoYXQgYnVpbGQgYSBzdHJpbmcgdW5jb25kaXRpb25hbGx5IGFuZCB0cmVhdCBcImFic2VudFwiIGFzIFwiXCIuXG4gKlxuICogUmVhZGluZyBsb29zZWx5LXR5cGVkIEpTT04gaXMgdGhlIG1vdGl2YXRpbmcgY2FzZTogYSBmaWVsZCB0aGF0IHNob3VsZCBiZSBhXG4gKiBzdHJpbmcgbWF5IGJlIG1pc3Npbmcgb3IgdGhlIHdyb25nIHR5cGUsIGFuZCB0aGUgY2FsbGVyIHdhbnRzIGBcIlwiYCByYXRoZXJcbiAqIHRoYW4gYSBudWxsIGNoZWNrIGF0IGV2ZXJ5IGFjY2Vzcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgdGl0bGUgPSB0cmltVG9FbXB0eShyZWNvcmQudGl0bGUpOyAvLyBhbHdheXMgYSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1Ub0VtcHR5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRyaW1Ub051bGwodmFsdWUpID8/IFwiXCI7XG59XG5cbi8qKlxuICogVHJpbSB0aGUgZmlyc3QgdXNhYmxlIHN0cmluZyBvdXQgb2YgYHZhbHVlYC4gUmV0dXJucyBgbnVsbGAgd2hlblxuICogYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgYG51bGxgLCBhbiBlbXB0eSBzdHJpbmcsIG9yIGFuIGFycmF5IHdob3NlXG4gKiBmaXJzdCBzdHJpbmcgbWVtYmVyIGlzIGVtcHR5LiBNaXJyb3JzIGhvdyBFeHByZXNzIC8gTm9kZSBoZWFkZXJcbiAqIGFjY2Vzc29ycyBleHBvc2Ugc2luZ2xlIHZzLiByZXBlYXRlZCBoZWFkZXJzIC0gdGhlIGZpcnN0XG4gKiBub24tZW1wdHkgZW50cnkgd2lucywgZXZlcnl0aGluZyBlbHNlIGlzIGlnbm9yZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdE5vbkVtcHR5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IHRyaW1Ub051bGwoaXRlbSk7XG4gICAgICBpZiAodHJpbW1lZCkgcmV0dXJuIHRyaW1tZWQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB0cmltVG9OdWxsKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgdGhlIGZpdmUgY2hhcmFjdGVycyBzaWduaWZpY2FudCBpbiBIVE1MIHRleHQgYW5kXG4gKiBkb3VibGUtcXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgKGAmYCwgYDxgLCBgPmAsIGBcImAsIGAnYCkgc28gYW5cbiAqIHVudHJ1c3RlZCBzdHJpbmcgY2FuIGJlIGludGVycG9sYXRlZCBpbnRvIG1hcmt1cCB3aXRob3V0IGJyZWFraW5nXG4gKiBvdXQgb2YgaXRzIGNvbnRleHQuIGAmYCBpcyByZXBsYWNlZCBmaXJzdCBzbyBhbXBlcnNhbmRzIGludHJvZHVjZWRcbiAqIGJ5IHRoZSBsYXRlciByZXBsYWNlbWVudHMgYXJlbid0IGRvdWJsZS1lc2NhcGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSHRtbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKVxuICAgIC5yZXBsYWNlKC88L2csIFwiJmx0O1wiKVxuICAgIC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKVxuICAgIC5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKVxuICAgIC5yZXBsYWNlKC8nL2csIFwiJiMzOTtcIik7XG59XG5cbi8qKlxuICogU2x1Z2lmeSBgdmFsdWVgICh1c2luZyB0aGUgc3RhbmRhcmQge0BsaW5rIHRvSWRlbnRpZmllcldpdGhPcHRpb25zfVxuICogdG9rZW5pemVyICsgZGVsaW1pdGVyIHJ1bGVzKSBhbmQgKiphbHdheXMqKiBzdWZmaXggYSBzaG9ydFxuICogZGV0ZXJtaW5pc3RpYyBoYXNoLiBVc2Ugd2hlbiB5b3UgbmVlZCBhIHN0YWJsZSwgc2x1Z2lmaWVkIGlkIHRoYXRcbiAqIGlzIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlIGFjcm9zcyBkZXNjcmlwdGlvbnMgc2hhcmluZyB0aGUgc2FtZVxuICogbGVhZGluZyB0b2tlbnMgKHRvb2wgaWRzLCBjYWNoZSBrZXlzLCBldGMuKS5cbiAqXG4gKiBCZWhhdmlvdXIgZGlmZmVycyBmcm9tIGB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7IG1heExlbmd0aCxcbiAqIHRydW5jYXRlU3RyYXRlZ3k6IFwiaGFzaFwiIH0pYDogdGhhdCBoZWxwZXIgb25seSBhcHBlbmRzIGEgaGFzaCB3aGVuXG4gKiB0aGUgc2x1ZyAqb3ZlcmZsb3dzKiBgbWF4TGVuZ3RoYC4gVGhpcyBoZWxwZXIgYXBwZW5kcyBhIGhhc2hcbiAqIHVuY29uZGl0aW9uYWxseSBzbyB0aGUgcmVzdWx0IGlzIGNvbGxpc2lvbi1yZXNpc3RhbnQgZXZlbiBmb3JcbiAqIHNob3J0IGlucHV0cy4gVGhlIGhhc2ggaXMgY29tcHV0ZWQgb3ZlciB0aGUgcmF3IGB2YWx1ZWAgc28gdHdvXG4gKiBkZXNjcmlwdGlvbnMgcHJvZHVjaW5nIHRoZSBzYW1lIHNsdWcgc3RpbGwgZ2V0IGRpZmZlcmVudCBpZHMuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gU291cmNlIHN0cmluZyAodHlwaWNhbGx5IGEgdG9vbC9hZ2VudCBkZXNjcmlwdGlvbikuXG4gKiBAcGFyYW0gb3B0aW9ucy5kZWxpbWl0ZXIgLSBUb2tlbiBzZXBhcmF0b3IgKGRlZmF1bHQgYFwiX1wiYCkuXG4gKiBAcGFyYW0gb3B0aW9ucy5zbHVnTWF4TGVuZ3RoIC0gQ2FwIG9uIHRoZSBzbHVnIHBvcnRpb24gKHRoZSBwYXJ0XG4gKiAgIGJlZm9yZSB0aGUgaGFzaCkuIERlZmF1bHQgMzIuXG4gKiBAcGFyYW0gb3B0aW9ucy5oYXNoTGVuZ3RoIC0gTGVuZ3RoIG9mIHRoZSBzdWZmaXggcHJvZHVjZWQgYnlcbiAqICAge0BsaW5rIGZudkhhc2hXaXRoT3B0aW9uc30gKENyb2NrZm9yZC1zdHlsZSBiYXNlLTMyIGFscGhhYmV0LCBtYXggN1xuICogICBjaGFycykuIERlZmF1bHQgNi5cbiAqIEBwYXJhbSBvcHRpb25zLmZhbGxiYWNrUHJlZml4IC0gUHJlZml4IHVzZWQgd2hlbiB0aGUgc2x1ZyBpcyBlbXB0eVxuICogICAoZS5nLiBwdW5jdHVhdGlvbi1vbmx5IGlucHV0KS4gRGVmYXVsdCBgXCJpZFwiYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVW5pcXVlU2x1ZyhcbiAgdmFsdWU6IHN0cmluZyxcbiAgb3B0aW9uczoge1xuICAgIGRlbGltaXRlcj86IHN0cmluZztcbiAgICBzbHVnTWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgIGhhc2hMZW5ndGg/OiBudW1iZXI7XG4gICAgZmFsbGJhY2tQcmVmaXg/OiBzdHJpbmc7XG4gIH0gPSB7fSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRlbGltaXRlciA9IG9wdGlvbnMuZGVsaW1pdGVyID8/IFwiX1wiO1xuICBjb25zdCBzbHVnTWF4TGVuZ3RoID0gb3B0aW9ucy5zbHVnTWF4TGVuZ3RoID8/IDMyO1xuICBjb25zdCBoYXNoTGVuZ3RoID0gb3B0aW9ucy5oYXNoTGVuZ3RoID8/IDY7XG4gIGNvbnN0IGZhbGxiYWNrUHJlZml4ID0gb3B0aW9ucy5mYWxsYmFja1ByZWZpeCA/PyBcImlkXCI7XG4gIGNvbnN0IHNsdWcgPSB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyhcbiAgICB7IGRlbGltaXRlciwgbWF4TGVuZ3RoOiBzbHVnTWF4TGVuZ3RoLCB0cnVuY2F0ZVN0cmF0ZWd5OiBcInRyaW1cIiB9LFxuICAgIHZhbHVlLFxuICApO1xuICBjb25zdCBzdWZmaXggPSBmbnZIYXNoV2l0aE9wdGlvbnMoeyBsZW5ndGg6IGhhc2hMZW5ndGggfSwgdmFsdWUpO1xuICByZXR1cm4gc2x1ZyA/IGAke3NsdWd9JHtkZWxpbWl0ZXJ9JHtzdWZmaXh9YCA6IGAke2ZhbGxiYWNrUHJlZml4fSR7ZGVsaW1pdGVyfSR7c3VmZml4fWA7XG59XG5cbmZ1bmN0aW9uIGRpZ2VzdFRva2VucyhsZW5ndGg6IG51bWJlciwgcGFydHM6IHJlYWRvbmx5IHN0cmluZ1tdLCBleHRyYT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBjb21iaW5lZCA9IFwiXCI7XG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykgY29tYmluZWQgKz0gcGFydCArIFwiXFwwXCI7XG4gIGlmIChleHRyYSAhPT0gdW5kZWZpbmVkKSBjb21iaW5lZCArPSBleHRyYSArIFwiXFwwXCI7XG4gIHJldHVybiBmbnZIYXNoV2l0aE9wdGlvbnMoeyBsZW5ndGggfSwgY29tYmluZWQpO1xufVxuXG4vKipcbiAqIEEgbm9kZSBpbiB0aGUgZGVzY3JpcHRpb24gdHJlZSBjb25zdW1lZCBieSB7QGxpbmsgdG9EZXNjcmlwdGlvbn0uXG4gKlxuICogLSBgc3RyaW5nYCAtIGEgdGV4dCBwYXJhZ3JhcGguXG4gKiAtIGBEZXNjcmlwdGlvbltdYCAtIGEgc2VxdWVuY2Ugb2Ygc3RhY2tlZCBibG9ja3MgYXQgdGhlIHNhbWUgbGV2ZWxcbiAqICAgKG5vIGxpc3QgbWFya2VycykuIFBsYWluIHRleHQgYWRqYWNlbnQgdG8gYSBsaXN0IChlaXRoZXIgZGlyZWN0aW9uKVxuICogICBmbHVzaGVzIHRvZ2V0aGVyIHNvIHRoZSBwcm9zZSByZWFkcyBhcyBhIGxlYWQtaW4gb3IgdHJhaWxpbmdcbiAqICAgc3VtbWFyeS4gVHdvIHRleHQgcGFyYWdyYXBocywgdHdvIGFkamFjZW50IGxpc3RzLCBhbmQgYW55dGhpbmdcbiAqICAgdG91Y2hpbmcgYSBtYXAgZ2V0IGEgYmxhbmstbGluZSBicmVhay5cbiAqIC0gYHsgYnVsbGV0czogWy4uLl0gfWAgLyBgeyBudW1iZXJlZDogWy4uLl0gfWAgLSBleHBsaWNpdCBsaXN0LiBBXG4gKiAgIGxpc3Qgb2Ygb25lIGJhcmUgc3RyaW5nIGRyb3BzIGl0cyBtYXJrZXIgKGAtYCAvIGAxLmApOyBhIGxpc3Qgb2ZcbiAqICAgb25lIGl0ZW0gd2l0aCBuZXN0ZWQgY2hpbGRyZW4ga2VlcHMgaXRzIG1hcmtlciBhcyB0aGUgdmlzdWFsIGFuY2hvclxuICogICBmb3IgdGhlIGluZGVudGVkIGNoaWxkcmVuLlxuICogLSBhbnkgb3RoZXIgb2JqZWN0IC0gaGVhZGVycyBtYXA6IGVhY2gga2V5IGJlY29tZXMgYSBgSGVhZGVyOmAgbGluZVxuICogICBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUgYW5kIHRoZSByZW5kZXJlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgRGVzY3JpcHRpb24gPSBzdHJpbmcgfCByZWFkb25seSBEZXNjcmlwdGlvbltdIHwgeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBEZXNjcmlwdGlvbiB9O1xuXG5jb25zdCBMSVNUX0tFWVMgPSBbXCJidWxsZXRzXCIsIFwibnVtYmVyZWRcIl0gYXMgY29uc3Q7XG50eXBlIExpc3RLaW5kID0gKHR5cGVvZiBMSVNUX0tFWVMpW251bWJlcl07XG5cbi8qKlxuICogRm9ybWF0IGEgbmVzdGVkIGRlc2NyaXB0aW9uIHRyZWUgYXMgYSBNYXJrZG93bi1pc2ggc3RyaW5nIHN1aXRhYmxlXG4gKiBmb3IgYW4gTExNIHN5c3RlbSBwcm9tcHQsIFpvZCBgLmRlc2NyaWJlKClgIGJsb2NrLCBNYXN0cmEgdG9vbFxuICogZGVzY3JpcHRpb24sIG9yIGFueSBvdGhlciBsb25nLWZvcm0gdGV4dCBkZXN0aW5hdGlvbi5cbiAqXG4gKiBFdmVyeSBzdHJpbmcgc2VjdGlvbiBpcyBkZWRlbnRlZCAoY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZSBzdHJpcHBlZCksXG4gKiByaWdodC10cmltbWVkIGxpbmUgYnkgbGluZSwgYW5kIGZyZWVkIG9mIGxlYWRpbmcgLyB0cmFpbGluZyBibGFua1xuICogbGluZXMsIHNvIGNhbGxlcnMgY2FuIHdyaXRlIG11bHRpLWxpbmUgdGVtcGxhdGUgbGl0ZXJhbHMgaW5kZW50ZWRcbiAqIG5hdHVyYWxseSBpbiBzb3VyY2Ugd2l0aG91dCBsZWFraW5nIHRoYXQgaW5kZW50YXRpb24gaW50byB0aGVcbiAqIGNvbnN1bWVyLWZhY2luZyBvdXRwdXQuIFBsYWluLXN0cmluZyBpbnB1dHMgZmxvdyB0aHJvdWdoIHVuY2hhbmdlZFxuICogYXBhcnQgZnJvbSB0aGUgc2FtZSBub3JtYWxpemF0aW9uIHBhc3MsIHNvIGEgc2luZ2xlIG11bHRpLWxpbmVcbiAqIHRlbXBsYXRlIGxpdGVyYWwgd29ya3MgZGlyZWN0bHk6XG4gKlxuICogYGBgdHNcbiAqIHRvRGVzY3JpcHRpb24oYFxuICogICBBc2sgdGhlIEdlbmllIHNwYWNlIFwiJHthbGlhc31cIiBhIHF1ZXN0aW9uLlxuICogICBQYXNzIHRoZSBhbnN3ZXIgdGhyb3VnaCBhcy1pcy5cbiAqIGApO1xuICogLy8gQXNrIHRoZSBHZW5pZSBzcGFjZSBcImRlZmF1bHRcIiBhIHF1ZXN0aW9uLlxuICogLy8gUGFzcyB0aGUgYW5zd2VyIHRocm91Z2ggYXMtaXMuXG4gKlxuICogdG9EZXNjcmlwdGlvbihbXG4gKiAgIGBcbiAqICAgICBBc2sgdGhlIEdlbmllIHNwYWNlIGEgcXVlc3Rpb24uXG4gKiAgICAgUGhyYXNlIGl0IGZyb20gdGhlIHVzZXIncyBwZXJzcGVjdGl2ZS5cbiAqICAgYCxcbiAqICAgeyBidWxsZXRzOiBbXG4gKiAgICAgW1wiUGFzcyB0aGUgYW5zd2VyIHRocm91Z2ggYXMtaXNcIiwgeyBudW1iZXJlZDogW1wiaXRlbVwiLCBcIml0ZW1cIl0gfV0sXG4gKiAgIF19LFxuICogICB7IEluc3RydWN0aW9uczogXCJSZXBseSB3aXRoIHRoZSBTUUwgb25seS5cIiB9LFxuICogXSk7XG4gKiAvLyBBc2sgdGhlIEdlbmllIHNwYWNlIGEgcXVlc3Rpb24uXG4gKiAvLyBQaHJhc2UgaXQgZnJvbSB0aGUgdXNlcidzIHBlcnNwZWN0aXZlLlxuICogLy8gLSBQYXNzIHRoZSBhbnN3ZXIgdGhyb3VnaCBhcy1pc1xuICogLy8gICAxLiBpdGVtXG4gKiAvLyAgIDIuIGl0ZW1cbiAqIC8vXG4gKiAvLyBJbnN0cnVjdGlvbnM6XG4gKiAvL1xuICogLy8gUmVwbHkgd2l0aCB0aGUgU1FMIG9ubHkuXG4gKiBgYGBcbiAqXG4gKiBTZWUge0BsaW5rIERlc2NyaXB0aW9ufSBmb3IgdGhlIG5vZGUgZ3JhbW1hci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRGVzY3JpcHRpb24obm9kZTogRGVzY3JpcHRpb24pOiBzdHJpbmcge1xuICByZXR1cm4gcmVuZGVyQmxvY2sobm9kZSwgXCJcIilcbiAgICAucmVwbGFjZSgvWyBcXHRdKyQvZ20sIFwiXCIpXG4gICAgLnJlcGxhY2UoL1xcbiskLywgXCJcIik7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckJsb2NrKG5vZGU6IERlc2NyaXB0aW9uLCBwYWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChub2RlID09IG51bGwpIHJldHVybiBcIlwiO1xuICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHJldHVybiBwcmVwZW5kUGFkKGRlZGVudChub2RlKSwgcGFkKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiByZW5kZXJTZXF1ZW5jZShub2RlLCBwYWQpO1xuICBjb25zdCBraW5kID0gbGlzdEtpbmQobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gIGlmIChraW5kKSB7XG4gICAgcmV0dXJuIHJlbmRlckxpc3QoKG5vZGUgYXMgUmVjb3JkPExpc3RLaW5kLCByZWFkb25seSBEZXNjcmlwdGlvbltdPilba2luZF0sIHBhZCwga2luZCk7XG4gIH1cbiAgcmV0dXJuIHJlbmRlck1hcChub2RlIGFzIFJlY29yZDxzdHJpbmcsIERlc2NyaXB0aW9uPiwgcGFkKTtcbn1cblxuLyoqXG4gKiBSaWdodC1zdHJpcCBldmVyeSBsaW5lLCByZW1vdmUgY29tbW9uIGluZGVudGF0aW9uLCBhbmQgb3B0aW9uYWxseSB0cmltXG4gKiBsZWFkaW5nIGFuZCB0cmFpbGluZyBibGFuayBsaW5lcy4gV2hpdGVzcGFjZS1vbmx5IGxpbmVzIG5vcm1hbGl6ZSB0byBlbXB0eVxuICogbGluZXMsIG1hdGNoaW5nIGNvbW1vbiBkZWRlbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVkZW50TGluZXModGV4dDogc3RyaW5nLCBvcHRpb25zOiBEZWRlbnRPcHRpb25zID0ge30pOiBzdHJpbmdbXSB7XG4gIGlmICghdGV4dCkgcmV0dXJuIFtdO1xuICBjb25zdCB7IHRyaW1TdGFydCA9IHRydWUsIHRyaW1FbmQgPSB0cnVlLCB0cmltTGluZUVuZCA9IHRydWUgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdChcIlxcblwiKS5tYXAoKGxpbmUpID0+ICh0cmltTGluZUVuZCA/IGxpbmUucmVwbGFjZSgvWyBcXHRdKyQvLCBcIlwiKSA6IGxpbmUpKTtcbiAgbGV0IG1pbiA9IEluZmluaXR5O1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBpZiAoIWxpbmUudHJpbSgpKSBjb250aW51ZTtcbiAgICBjb25zdCBtYXRjaCA9IC9eWyBcXHRdKi8uZXhlYyhsaW5lKTtcbiAgICBjb25zdCB3aWR0aCA9IG1hdGNoID8gbWF0Y2hbMF0ubGVuZ3RoIDogMDtcbiAgICBpZiAod2lkdGggPCBtaW4pIG1pbiA9IHdpZHRoO1xuICB9XG4gIGNvbnN0IHN0cmlwcGVkID1cbiAgICBtaW4gPT09IEluZmluaXR5IHx8IG1pbiA9PT0gMCA/IGxpbmVzIDogbGluZXMubWFwKChsaW5lKSA9PiAobGluZSA/IGxpbmUuc2xpY2UobWluKSA6IFwiXCIpKTtcbiAgbGV0IHN0YXJ0ID0gMDtcbiAgbGV0IGVuZCA9IHN0cmlwcGVkLmxlbmd0aDtcbiAgaWYgKHRyaW1TdGFydCkge1xuICAgIHdoaWxlIChzdGFydCA8IGVuZCAmJiAhc3RyaXBwZWRbc3RhcnRdIS50cmltKCkpIHN0YXJ0ICs9IDE7XG4gIH1cbiAgaWYgKHRyaW1FbmQpIHtcbiAgICB3aGlsZSAoZW5kID4gc3RhcnQgJiYgIXN0cmlwcGVkW2VuZCAtIDFdIS50cmltKCkpIGVuZCAtPSAxO1xuICB9XG4gIHJldHVybiBzdHJpcHBlZC5zbGljZShzdGFydCwgZW5kKTtcbn1cblxuLyoqIEpvaW4ge0BsaW5rIGRlZGVudExpbmVzfSwgdHJpbW1pbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcgYmxhbmsgbGluZXMgYnkgZGVmYXVsdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWRlbnQodGV4dDogc3RyaW5nLCBvcHRpb25zOiBEZWRlbnRPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICByZXR1cm4gZGVkZW50TGluZXModGV4dCwgb3B0aW9ucykuam9pbihcIlxcblwiKTtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgaXMgdHJlYXRlZCBhcyBhIHR5cGVkIGxpc3Qgb25seSB3aGVuIGl0IGhhcyBleGFjdGx5IG9uZVxuICogb3duIGtleSwgdGhhdCBrZXkgaXMgYGJ1bGxldHNgIG9yIGBudW1iZXJlZGAsIGFuZCB0aGUgdmFsdWUgaXMgYW5cbiAqIGFycmF5LiBFdmVyeXRoaW5nIGVsc2UgaXMgYSBoZWFkZXJzIG1hcCAtIHNvIGNhbGxlcnMgd2FudGluZyBhXG4gKiBzaW5nbGUgaGVhZGVyIGxpdGVyYWxseSBuYW1lZCBgYnVsbGV0c2Agb3IgYG51bWJlcmVkYCBjYW4gdXNlIGFcbiAqIG11bHRpLWtleSBtYXAgb3IgcmVuYW1lLlxuICovXG5mdW5jdGlvbiBsaXN0S2luZChub2RlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IExpc3RLaW5kIHwgbnVsbCB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhub2RlKTtcbiAgaWYgKGtleXMubGVuZ3RoICE9PSAxKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qga2V5ID0ga2V5c1swXSE7XG4gIGlmICgoTElTVF9LRVlTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhrZXkpICYmIEFycmF5LmlzQXJyYXkobm9kZVtrZXldKSkge1xuICAgIHJldHVybiBrZXkgYXMgTGlzdEtpbmQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHByZXBlbmRQYWQodGV4dDogc3RyaW5nLCBwYWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdGV4dCkgcmV0dXJuIFwiXCI7XG4gIGlmICghcGFkKSByZXR1cm4gdGV4dDtcbiAgcmV0dXJuIHRleHRcbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAubWFwKChsaW5lKSA9PiAobGluZSA/IHBhZCArIGxpbmUgOiBcIlwiKSlcbiAgICAuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU2VxdWVuY2UoaXRlbXM6IHJlYWRvbmx5IERlc2NyaXB0aW9uW10sIHBhZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVuZGVyZWQ6IHsgdGV4dDogc3RyaW5nOyBub2RlOiBEZXNjcmlwdGlvbiB9W10gPSBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgdGV4dCA9IHJlbmRlckJsb2NrKGl0ZW0sIHBhZCk7XG4gICAgaWYgKCF0ZXh0KSBjb250aW51ZTtcbiAgICByZW5kZXJlZC5wdXNoKHsgdGV4dCwgbm9kZTogaXRlbSB9KTtcbiAgfVxuICBpZiAocmVuZGVyZWQubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgbGV0IG91dCA9IHJlbmRlcmVkWzBdIS50ZXh0O1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHJlbmRlcmVkLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3Qgc2VwID0gbmVlZHNCbGFua0xpbmVCZXR3ZWVuKHJlbmRlcmVkW2kgLSAxXSEubm9kZSwgcmVuZGVyZWRbaV0hLm5vZGUpID8gXCJcXG5cXG5cIiA6IFwiXFxuXCI7XG4gICAgb3V0ICs9IHNlcCArIHJlbmRlcmVkW2ldIS50ZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTWFwcyBhbHdheXMgY3JlYXRlIHRoZWlyIG93biBzZWN0aW9uIGJvdW5kYXJ5IChhIGBIZWFkZXI6YCBsaW5lIHBsdXNcbiAqIGEgYmxhbmsgbGluZSBiZWZvcmUgdGhlIGJvZHkpLCBzbyBhbnl0aGluZyB0b3VjaGluZyBhIG1hcCBnZXRzIGFcbiAqIGJsYW5rLWxpbmUgYnJlYWsuIFBsYWluIHRleHQgYWRqYWNlbnQgdG8gYSB0eXBlZCBsaXN0IGZsdXNoZXNcbiAqIHRvZ2V0aGVyIGluIGVpdGhlciBkaXJlY3Rpb246IHRleHQtYmVmb3JlLWxpc3QgcmVhZHMgYXMgYSBsZWFkLWluLFxuICogdGV4dC1hZnRlci1saXN0IGFzIGEgdHJhaWxpbmcgc3VtbWFyeS4gVHdvIHRleHQgcGFyYWdyYXBocyBhbmQgdHdvXG4gKiBhZGphY2VudCBsaXN0cyBib3RoIGdldCBhIGJsYW5rLWxpbmUgYnJlYWsgZm9yIGxlZ2liaWxpdHkuXG4gKi9cbmZ1bmN0aW9uIG5lZWRzQmxhbmtMaW5lQmV0d2VlbihwcmV2OiBEZXNjcmlwdGlvbiwgY3VycjogRGVzY3JpcHRpb24pOiBib29sZWFuIHtcbiAgaWYgKGlzTWFwKHByZXYpIHx8IGlzTWFwKGN1cnIpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcHJldklzVGV4dCA9IHR5cGVvZiBwcmV2ID09PSBcInN0cmluZ1wiO1xuICBjb25zdCBjdXJySXNUZXh0ID0gdHlwZW9mIGN1cnIgPT09IFwic3RyaW5nXCI7XG4gIGlmIChwcmV2SXNUZXh0ICE9PSBjdXJySXNUZXh0KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEEgbm9kZSBpcyBhIGhlYWRlcnMgbWFwIHdoZW4gaXQgaXMgYSBub24tYXJyYXksIG5vbi1saXN0IG9iamVjdC5cbiAqIGBidWxsZXRzYCAvIGBudW1iZXJlZGAgc2luZ2xlLWtleSBvYmplY3RzIGFyZSB0aGUgb25seSBzdHJ1Y3R1cmVkXG4gKiBvYmplY3RzIHRoYXQgYXJlbid0IG1hcHMuXG4gKi9cbmZ1bmN0aW9uIGlzTWFwKG5vZGU6IERlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gIGlmIChub2RlID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBsaXN0S2luZChub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTGlzdChpdGVtczogcmVhZG9ubHkgRGVzY3JpcHRpb25bXSwgcGFkOiBzdHJpbmcsIGtpbmQ6IExpc3RLaW5kKTogc3RyaW5nIHtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGl0ZW1zWzBdID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHByZXBlbmRQYWQoaXRlbXNbMF0sIHBhZCk7XG4gIH1cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBpdGVtID0gaXRlbXNbaV0hO1xuICAgIGNvbnN0IG1hcmtlciA9IGtpbmQgPT09IFwiYnVsbGV0c1wiID8gXCItIFwiIDogYCR7aSArIDF9LiBgO1xuICAgIGNvbnN0IGJvZHkgPSByZW5kZXJCbG9jayhpdGVtLCBcIlwiKTtcbiAgICBjb25zdCBib2R5TGluZXMgPSBib2R5LnNwbGl0KFwiXFxuXCIpO1xuICAgIGxpbmVzLnB1c2goYCR7cGFkfSR7bWFya2VyfSR7Ym9keUxpbmVzWzBdID8/IFwiXCJ9YCk7XG4gICAgY29uc3QgY29udGludWF0aW9uID0gcGFkICsgXCIgXCIucmVwZWF0KG1hcmtlci5sZW5ndGgpO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBib2R5TGluZXMuc2xpY2UoMSkpIHtcbiAgICAgIGxpbmVzLnB1c2gobGluZSA/IGAke2NvbnRpbnVhdGlvbn0ke2xpbmV9YCA6IFwiXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTWFwKG5vZGU6IFJlY29yZDxzdHJpbmcsIERlc2NyaXB0aW9uPiwgcGFkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbaGVhZGVyLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBib2R5ID0gcmVuZGVyQmxvY2sodmFsdWUsIHBhZCk7XG4gICAgaWYgKCFib2R5ICYmICFoZWFkZXIudHJpbSgpKSBjb250aW51ZTtcbiAgICBjb25zdCBoZWFkZXJMaW5lID0gaGVhZGVyLnRyaW0oKSA/IGAke3BhZH0ke2hlYWRlcn06YCA6IFwiXCI7XG4gICAgcGFydHMucHVzaChib2R5ID8gYCR7aGVhZGVyTGluZX1cXG5cXG4ke2JvZHl9YCA6IGhlYWRlckxpbmUpO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKFwiXFxuXFxuXCIpO1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNvdW50IHdpdGggaXRzIG5vdW4sIHBsdXJhbGl6aW5nIChuYWl2ZSBgK3NgKSB1bmxlc3MgdGhlIGNvdW50IGlzIDE6XG4gKiBgcGx1cmFsaXplKDEsIFwiYmFycmVsXCIpYCAtPiBgXCIxIGJhcnJlbFwiYCwgYHBsdXJhbGl6ZSgzLCBcImJhcnJlbFwiKWAgLT5cbiAqIGBcIjMgYmFycmVsc1wiYC4gQ29sbGFwc2VzIHRoZSBgJHtufSBub3VuJHtuID09PSAxID8gXCJcIiA6IFwic1wifWAgaWRpb20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVyYWxpemUoY291bnQ6IG51bWJlciwgbm91bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NvdW50fSAke25vdW59JHtjb3VudCA9PT0gMSA/IFwiXCIgOiBcInNcIn1gO1xufVxuXG4vKipcbiAqIFRpdGxlLWNhc2UgYSBzbmFrZSAvIGtlYmFiIC8gY2FtZWwgaWRlbnRpZmllciBpbnRvIGEgaHVtYW4tcmVhZGFibGUgbGFiZWw6XG4gKiB0b2tlbml6ZSAobG93ZXJjYXNlZCwgY2FwaXRhbGl6ZWQpLCB0aGVuIGpvaW4gd2l0aCBzcGFjZXMuIEZhbGxzIGJhY2sgdG9cbiAqIHRoZSByYXcgYHZhbHVlYCB3aGVuIGl0IHlpZWxkcyBubyB0b2tlbnMgKGUuZy4gcHVuY3R1YXRpb24tb25seSBpbnB1dCkuXG4gKiBgYmdlX2xhcmdlX2VuYCAtPiBgXCJCZ2UgTGFyZ2UgRW5cImAsIGBwcm9tcHRJZGAgLT4gYFwiUHJvbXB0IElkXCJgLlxuICpcbiAqIFRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgXCJodW1hbml6ZSBhIGNvbHVtbiAvIGZpZWxkIG5hbWVcIiBpZGlvbSAtXG4gKiByZXVzZWQgYnkgdGhlIGNoYXQgZGF0YS1ncmlkIGhlYWRlcnMgYW5kIHRoZSBleHBvcnQgcmVuZGVyZXIuIEV4dHJhXG4gKiB7QGxpbmsgVG9rZW5pemVPcHRpb25zfSAoZS5nLiBgY2FtZWxDYXNlOiBmYWxzZWApIG1lcmdlIG92ZXIgdGhlIGRlZmF1bHRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9MYWJlbCh2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzogVG9rZW5pemVPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zID0gWy4uLnRva2VuaXplV2l0aE9wdGlvbnMoeyBsb3dlckNhc2U6IHRydWUsIGNhcGl0YWxpemU6IHRydWUsIC4uLm9wdGlvbnMgfSwgdmFsdWUpXTtcbiAgcmV0dXJuIHRva2Vucy5sZW5ndGggPiAwID8gdG9rZW5zLmpvaW4oXCIgXCIpIDogdmFsdWU7XG59XG5cbi8qKlxuICogVXBwZXItY2FzZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGB2YWx1ZWAsIGxlYXZpbmcgdGhlIHJlc3QgdW50b3VjaGVkLlxuICogYFwid29ya2luZ1wiYCAtPiBgXCJXb3JraW5nXCJgLiBDb2xsYXBzZXMgdGhlXG4gKiBgcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSlgIGlkaW9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwaXRhbGl6ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlID8gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKSA6IHZhbHVlO1xufVxuIl19
524
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmluZy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQXlEL0MsMEVBQTBFO0FBQzFFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsaUVBQWlFO0FBQ2pFLE1BQU0sMEJBQTBCLEdBQUcsaURBQWlELENBQUM7QUFDckYsTUFBTSxnQ0FBZ0MsR0FBRyxlQUFlLENBQUM7QUFDekQsTUFBTSxrQkFBa0IsR0FBNEQ7SUFDbEYsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNoQyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsNkVBQTZFO0lBQzdFLCtEQUErRDtJQUMvRCxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUNqQixJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGLENBQUM7QUFDRixNQUFNLFVBQVUsR0FBRyxvREFBb0QsQ0FBQztBQUN4RSxNQUFNLFlBQVksR0FBRywwRUFBMEUsQ0FBQztBQUVoRyxNQUFNLGlCQUFpQixHQUE0QjtJQUNqRCxRQUFRLEVBQUUsS0FBSztJQUNmLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLGFBQWEsRUFBRSxLQUFLO0lBQ3BCLGVBQWUsRUFBRSxLQUFLO0lBQ3RCLFNBQVMsRUFBRSxJQUFJO0NBQ2hCLENBQUM7QUFFRixNQUFNLG1CQUFtQixHQUE4QjtJQUNyRCxHQUFHLGlCQUFpQjtJQUNwQixTQUFTLEVBQUUsSUFBSTtJQUNmLFNBQVMsRUFBRSxRQUFRO0lBQ25CLGdCQUFnQixFQUFFLE1BQU07SUFDeEIsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixTQUFTLEVBQUUsR0FBRztDQUNmLENBQUM7QUFFRiwwRkFBMEY7QUFDMUYsTUFBTSxTQUFTLENBQUMsQ0FBQyxtQkFBbUIsQ0FDbEMsT0FBd0IsRUFDeEIsR0FBRyxNQUFpQjtJQUVwQixNQUFNLElBQUksR0FBNEIsRUFBRSxHQUFHLGlCQUFpQixFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDM0UsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQztJQUU5RixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksS0FBSyxJQUFJLElBQUk7WUFBRSxTQUFTO1FBQzVCLElBQUksV0FBVyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLFdBQVc7WUFBRSxTQUFTO1FBQzNCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUMsSUFBSSxLQUFLO2dCQUFFLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzlDLElBQUksS0FBSztnQkFBRSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVc7WUFBRSxTQUFTO1FBQzNCLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUUsQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxTQUFTO2dCQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEQsSUFBSSxJQUFJLENBQUMsVUFBVTtnQkFBRSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxLQUFLO2dCQUFFLFNBQVM7WUFDckIsS0FBSyxNQUFNLFFBQVEsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLEtBQUs7b0JBQUUsTUFBTTtZQUNwQixDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFBRSxTQUFTO1lBQ3pDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxvRUFBb0U7QUFDcEUsTUFBTSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFpQjtJQUM1QyxLQUFLLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsT0FBMEIsRUFBRSxHQUFHLE1BQWlCO0lBQ3RGLE1BQU0sSUFBSSxHQUE4QjtRQUN0QyxHQUFHLG1CQUFtQjtRQUN0QixHQUFHLE9BQU87UUFDVixTQUFTLEVBQUUsSUFBSTtLQUNoQixDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztJQUV0QixLQUFLLE1BQU0sS0FBSyxJQUFJLG1CQUFtQixDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDekQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxVQUFVLEdBQUcsYUFBYSxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBRTVELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNoQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxPQUFPO2dCQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ2pELElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLE1BQU07Z0JBQUUsTUFBTTtZQUU1QyxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRSxJQUFJLGFBQWEsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzlELE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDeEYsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsYUFBYSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sVUFBVSxZQUFZLENBQUMsR0FBRyxNQUFpQjtJQUMvQyxPQUFPLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE9BQW1CLEVBQUUsR0FBRyxNQUFpQjtJQUN6RSxPQUFPLHVCQUF1QixDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsTUFBTSxDQUFDLEdBQUcsTUFBaUI7SUFDekMsT0FBTyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFjO0lBQ3ZDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzNDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDbEMsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxzREFBc0Q7QUFDdEQsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUM7QUFFdkM7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUN2QixHQUFrRCxFQUNsRCxZQUF1QyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtJQUU5RCxNQUFNLE9BQU8sR0FDWCxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDN0YsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDL0IsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUFFLFNBQVM7UUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFjO0lBQ3hDLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFjO0lBQzFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksT0FBTztnQkFBRSxPQUFPLE9BQU8sQ0FBQztRQUM5QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBYTtJQUN0QyxPQUFPLEtBQUs7U0FDVCxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztTQUN0QixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztTQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztTQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztTQUN2QixPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixLQUFhLEVBQ2IsVUFLSSxFQUFFO0lBRU4sTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUM7SUFDM0MsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7SUFDbEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7SUFDM0MsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUM7SUFDdEQsTUFBTSxJQUFJLEdBQUcsdUJBQXVCLENBQ2xDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEVBQ2pFLEtBQUssQ0FDTixDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLEdBQUcsU0FBUyxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQzFGLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxNQUFjLEVBQUUsS0FBd0IsRUFBRSxLQUFjO0lBQzVFLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNsQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUs7UUFBRSxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsRCxJQUFJLEtBQUssS0FBSyxTQUFTO1FBQUUsUUFBUSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDbEQsT0FBTyxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFvQkQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFVLENBQUM7QUFHbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQ0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQWlCO0lBQzdDLE9BQU8sV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDekIsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7U0FDeEIsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBaUIsRUFBRSxHQUFXO0lBQ2pELElBQUksSUFBSSxJQUFJLElBQUk7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUM1QixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbkUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBK0IsQ0FBQyxDQUFDO0lBQ3ZELElBQUksSUFBSSxFQUFFLENBQUM7UUFDVCxPQUFPLFVBQVUsQ0FBRSxJQUFpRCxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUMsSUFBbUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWSxFQUFFLFVBQXlCLEVBQUU7SUFDbkUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyQixNQUFNLEVBQUUsU0FBUyxHQUFHLElBQUksRUFBRSxPQUFPLEdBQUcsSUFBSSxFQUFFLFdBQVcsR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDekUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDbkIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUFFLFNBQVM7UUFDM0IsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLEtBQUssR0FBRyxHQUFHO1lBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQ1osR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdGLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDMUIsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLE9BQU8sS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUUsQ0FBQyxJQUFJLEVBQUU7WUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osT0FBTyxHQUFHLEdBQUcsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUUsQ0FBQyxJQUFJLEVBQUU7WUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxzRkFBc0Y7QUFDdEYsTUFBTSxVQUFVLE1BQU0sQ0FBQyxJQUFZLEVBQUUsVUFBeUIsRUFBRTtJQUM5RCxPQUFPLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxJQUE2QjtJQUM3QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBRSxDQUFDO0lBQ3JCLElBQUssU0FBK0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9FLE9BQU8sR0FBZSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFZLEVBQUUsR0FBVztJQUMzQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3JCLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEIsT0FBTyxJQUFJO1NBQ1IsS0FBSyxDQUFDLElBQUksQ0FBQztTQUNYLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBNkIsRUFBRSxHQUFXO0lBQ2hFLE1BQU0sUUFBUSxHQUEwQyxFQUFFLENBQUM7SUFDM0QsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJO1lBQUUsU0FBUztRQUNwQixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQyxJQUFJLENBQUM7SUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sR0FBRyxHQUFHLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDNUYsR0FBRyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFFLENBQUMsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxJQUFpQixFQUFFLElBQWlCO0lBQ2pFLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM1QyxNQUFNLFVBQVUsR0FBRyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUM7SUFDNUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDO0lBQzVDLElBQUksVUFBVSxLQUFLLFVBQVU7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM1QyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxLQUFLLENBQUMsSUFBaUI7SUFDOUIsSUFBSSxJQUFJLElBQUksSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQy9CLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzNDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0QyxPQUFPLFFBQVEsQ0FBQyxJQUErQixDQUFDLEtBQUssSUFBSSxDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUE2QixFQUFFLEdBQVcsRUFBRSxJQUFjO0lBQzVFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDbEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN2RCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDeEQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sWUFBWSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFpQyxFQUFFLEdBQVc7SUFDL0QsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQzNCLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtZQUFFLFNBQVM7UUFDdEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYSxFQUFFLElBQVk7SUFDbkQsT0FBTyxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFhLEVBQUUsT0FBeUI7SUFDOUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQWE7SUFDdEMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBzdHJpbmcgdG9vbGtpdDogdG9rZW5pemF0aW9uLCBpZGVudGlmaWVyIC8gc2x1Z1xuICogZ2VuZXJhdGlvbiAod2l0aCBoYXNoLXN1ZmZpeCBjb2xsaXNpb24gcmVzaXN0YW5jZSksIEhUTUwgZXNjYXBpbmcsXG4gKiBoZWFkZXItdmFsdWUgdHJpbW1pbmcsIGFuZCBhIG5lc3RlZCBkZXNjcmlwdGlvbi10cmVlIHJlbmRlcmVyIGZvclxuICogbG9uZy1mb3JtIExMTSBwcm9tcHQgLyB0b29sLWRlc2NyaXB0aW9uIHRleHQuIERlcGVuZHMgb25seSBvbiB0aGVcbiAqIGxvY2FsIHtAbGluayBmbnZIYXNoV2l0aE9wdGlvbnN9IGZvciBkZXRlcm1pbmlzdGljIGhhc2ggc3VmZml4ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBmbnZIYXNoV2l0aE9wdGlvbnMgfSBmcm9tIFwiLi9oYXNoLnRzXCI7XG5cbi8qKlxuICogT3B0aW9ucyBjb250cm9sbGluZyB7QGxpbmsgdG9rZW5pemVXaXRoT3B0aW9uc30uIEFsbCBkZWZhdWx0IG9mZiBleGNlcHRcbiAqIGBjYW1lbENhc2VgLlxuICpcbiAqIC0gYGRpc3RpbmN0YCAtIGRyb3AgZHVwbGljYXRlIHRva2VucyAoZmlyc3Qgb2NjdXJyZW5jZSB3aW5zKS5cbiAqIC0gYGxvd2VyQ2FzZWAgLSBsb3dlcmNhc2UgZXZlcnkgdG9rZW4uXG4gKiAtIGBjYXBpdGFsaXplYCAtIHVwcGVyLWNhc2UgZWFjaCB0b2tlbidzIGZpcnN0IGxldHRlciAodGhlblxuICogICB7QGxpbmsgVE9LRU5JWkVfT1ZFUlJJREVTfSBmaXggdXAgYGFpYCAtPiBgQUlgLCBgZnNgIC0+IGBGU2AsIGFuZFxuICogICBgdjJgIC0+IGBWMmApLlxuICogLSBgb21pdFVyaVNjaGVtZWAgLSBzdHJpcCBhIGxlYWRpbmcgYHNjaGVtZTovL2AgYmVmb3JlIHRva2VuaXppbmcuXG4gKiAtIGBvbWl0RW1haWxEb21haW5gIC0ga2VlcCBvbmx5IHRoZSBsb2NhbCBwYXJ0IG9mIGFuIGVtYWlsLlxuICogLSBgY2FtZWxDYXNlYCAtIHNwbGl0IG9uIGNhbWVsQ2FzZSBib3VuZGFyaWVzIC8gZGlnaXQgcnVucyAvIGFjcm9ueW1zXG4gKiAgIChkZWZhdWx0IGB0cnVlYCk7IHdoZW4gYGZhbHNlYCwgc3BsaXQgb25seSBvbiBub24tYWxwaGFudW1lcmljcy5cbiAqL1xuZXhwb3J0IHR5cGUgVG9rZW5pemVPcHRpb25zID0ge1xuICBkaXN0aW5jdD86IGJvb2xlYW47XG4gIGxvd2VyQ2FzZT86IGJvb2xlYW47XG4gIGNhcGl0YWxpemU/OiBib29sZWFuO1xuICBvbWl0VXJpU2NoZW1lPzogYm9vbGVhbjtcbiAgb21pdEVtYWlsRG9tYWluPzogYm9vbGVhbjtcbiAgY2FtZWxDYXNlPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogVG9rZW5pemF0aW9uIGFuZCBvdmVyZmxvdyBjb250cm9scyBmb3IgbG93ZXJjYXNlIGtleXMgYW5kIHNsdWdzLiBUaGUgZGVmYXVsdFxuICogbGVuZ3RoIGlzIHVubGltaXRlZDsgb3ZlcmZsb3cgdXNlcyBhIHNpeC1jaGFyYWN0ZXIgaGFzaCB1bmxlc3Mgb3ZlcnJpZGRlbi5cbiAqL1xuZXhwb3J0IHR5cGUgS2V5T3B0aW9ucyA9IE9taXQ8VG9rZW5pemVPcHRpb25zLCBcImxvd2VyQ2FzZVwiIHwgXCJjYXBpdGFsaXplXCI+ICYge1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIHRydW5jYXRlU3RyYXRlZ3k/OiBcImhhc2hcIiB8IFwidHJpbVwiIHwgXCJlbXB0eVwiO1xuICB0cnVuY2F0ZUhhc2hMZW5ndGg/OiBudW1iZXI7XG59O1xuXG4vKioge0BsaW5rIEtleU9wdGlvbnN9IHBsdXMgdGhlIHRva2VuIGRlbGltaXRlciB1c2VkIGJ5IGlkZW50aWZpZXIgZ2VuZXJhdGlvbi4gKi9cbmV4cG9ydCB0eXBlIElkZW50aWZpZXJPcHRpb25zID0gS2V5T3B0aW9ucyAmIHtcbiAgZGVsaW1pdGVyPzogc3RyaW5nO1xufTtcblxuLyoqIExlYWRpbmcgYW5kIHRyYWlsaW5nIGJsYW5rLWxpbmUgaGFuZGxpbmcgZm9yIHtAbGluayBkZWRlbnR9LiAqL1xuZXhwb3J0IHR5cGUgRGVkZW50T3B0aW9ucyA9IHtcbiAgLyoqIFJlbW92ZSBsZWFkaW5nIGJsYW5rIGxpbmVzIGFmdGVyIGluZGVudGF0aW9uIG5vcm1hbGl6YXRpb24uIERlZmF1bHRzIHRvIGB0cnVlYC4gKi9cbiAgdHJpbVN0YXJ0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJlbW92ZSB0cmFpbGluZyBibGFuayBsaW5lcyBhZnRlciBpbmRlbnRhdGlvbiBub3JtYWxpemF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICB0cmltRW5kPzogYm9vbGVhbjtcbiAgLyoqIFJlbW92ZSBzcGFjZXMgYW5kIHRhYnMgZnJvbSBlYWNoIGxpbmUgZW5kLiBEZWZhdWx0cyB0byBgdHJ1ZWAuICovXG4gIHRyaW1MaW5lRW5kPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgUmVzb2x2ZWRUb2tlbml6ZU9wdGlvbnMgPSBSZXF1aXJlZDxUb2tlbml6ZU9wdGlvbnM+O1xudHlwZSBSZXNvbHZlZElkZW50aWZpZXJPcHRpb25zID0gUmVxdWlyZWQ8XG4gIElkZW50aWZpZXJPcHRpb25zICYgUGljazxUb2tlbml6ZU9wdGlvbnMsIFwibG93ZXJDYXNlXCIgfCBcImNhcGl0YWxpemVcIj5cbj47XG5cbi8vIEEgbGVhZGluZyBgdmAvYFZgIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGRpZ2l0cyAoYSB2ZXJzaW9uIG1hcmtlciBsaWtlXG4vLyBgdjJgKSBpcyBrZXB0IGFzIE9ORSB0b2tlbiBpbnN0ZWFkIG9mIHNwbGl0dGluZyBpbnRvIGB2YCArIGAyYDsgaXQgbGVhZHMgdGhlXG4vLyBhbHRlcm5hdGlvbiBzbyBpdCB3aW5zIG92ZXIgdGhlIGdlbmVyaWMgbGV0dGVyIC8gZGlnaXQgcnVucy4gRXZlcnl0aGluZyBlbHNlXG4vLyBpcyB0aGUgdXN1YWwgY2FtZWxDYXNlIHdvcmQgLyBudW1iZXIgLyBhbGwtY2Fwcy1hY3JvbnltIHNwbGl0LlxuY29uc3QgVE9LRU5JWkVfQ0FNRUxfQ0FTRV9SRUdFWFAgPSAvW3ZWXVswLTldK3xbQS1aXT9bYS16XSt8WzAtOV0rfFtBLVpdKyg/IVthLXpdKS9nO1xuY29uc3QgVE9LRU5JWkVfTk9OX0FMUEhBTlVNRVJJQ19SRUdFWFAgPSAvW2EtekEtWjAtOV0rL2c7XG5jb25zdCBUT0tFTklaRV9PVkVSUklERVM6ICgodG9rZW46IHN0cmluZywgb3B0aW9uczogVG9rZW5pemVPcHRpb25zKSA9PiBzdHJpbmcpW10gPSBbXG4gICh0b2tlbiwgb3B0aW9ucykgPT4ge1xuICAgIGlmICghb3B0aW9ucy5jYXBpdGFsaXplKSByZXR1cm4gdG9rZW47XG4gICAgY29uc3QgbG93ZXIgPSB0b2tlbi50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChsb3dlciA9PT0gXCJhaVwiKSByZXR1cm4gXCJBSVwiO1xuICAgIGlmIChsb3dlciA9PT0gXCJmc1wiKSByZXR1cm4gXCJGU1wiO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfSxcbiAgLy8gVmVyc2lvbiBtYXJrZXIgYHYyYCAtPiBgVjJgIHdoZW4gY2FwaXRhbGl6aW5nICh0aGUgbGVhZGluZyBgdmAgdXBwZXJjYXNlcyxcbiAgLy8gdGhlIGRpZ2l0cyBzdGF5KSwgc28gaXQgcmVhZHMgYXMgb25lIHVuaXQgcmF0aGVyIHRoYW4gXCJWIDJcIi5cbiAgKHRva2VuLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMuY2FwaXRhbGl6ZSAmJiAvXnZbMC05XSskLy50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuIGBWJHt0b2tlbi5zbGljZSgxKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW47XG4gIH0sXG5dO1xuY29uc3QgVVJJX1JFR0VYUCA9IC9eKFthLXpBLVpdW2EtekEtWjAtOSsuLV0qKT86XFwvXFwvKFteXFxzLz8jXVteXFxzXSopPyQvO1xuY29uc3QgRU1BSUxfUkVHRVhQID0gL14oW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXSspQChbYS16QS1aMC05LV0rKD86XFwuW2EtekEtWjAtOS1dKykrKSQvO1xuXG5jb25zdCBUT0tFTklaRV9ERUZBVUxUUzogUmVzb2x2ZWRUb2tlbml6ZU9wdGlvbnMgPSB7XG4gIGRpc3RpbmN0OiBmYWxzZSxcbiAgbG93ZXJDYXNlOiBmYWxzZSxcbiAgY2FwaXRhbGl6ZTogZmFsc2UsXG4gIG9taXRVcmlTY2hlbWU6IGZhbHNlLFxuICBvbWl0RW1haWxEb21haW46IGZhbHNlLFxuICBjYW1lbENhc2U6IHRydWUsXG59O1xuXG5jb25zdCBJREVOVElGSUVSX0RFRkFVTFRTOiBSZXNvbHZlZElkZW50aWZpZXJPcHRpb25zID0ge1xuICAuLi5UT0tFTklaRV9ERUZBVUxUUyxcbiAgbG93ZXJDYXNlOiB0cnVlLFxuICBtYXhMZW5ndGg6IEluZmluaXR5LFxuICB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIixcbiAgdHJ1bmNhdGVIYXNoTGVuZ3RoOiA2LFxuICBkZWxpbWl0ZXI6IFwiLVwiLFxufTtcblxuLyoqIFlpZWxkIG5vcm1hbGl6ZWQgdG9rZW5zIHVzaW5nIGV4cGxpY2l0IGNhc2luZywgVVJJLCBlbWFpbCwgYW5kIGRlZHVwbGljYXRpb24gcnVsZXMuICovXG5leHBvcnQgZnVuY3Rpb24qIHRva2VuaXplV2l0aE9wdGlvbnMoXG4gIG9wdGlvbnM6IFRva2VuaXplT3B0aW9ucyxcbiAgLi4udmFsdWVzOiB1bmtub3duW11cbik6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgY29uc3Qgb3B0czogUmVzb2x2ZWRUb2tlbml6ZU9wdGlvbnMgPSB7IC4uLlRPS0VOSVpFX0RFRkFVTFRTLCAuLi5vcHRpb25zIH07XG4gIGNvbnN0IHNlZW4gPSBvcHRzLmRpc3RpbmN0ID8gbmV3IFNldDxzdHJpbmc+KCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlZ2V4cCA9IG9wdHMuY2FtZWxDYXNlID8gVE9LRU5JWkVfQ0FNRUxfQ0FTRV9SRUdFWFAgOiBUT0tFTklaRV9OT05fQUxQSEFOVU1FUklDX1JFR0VYUDtcblxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSBjb250aW51ZTtcbiAgICBsZXQgc3RyaW5nVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgaWYgKCFzdHJpbmdWYWx1ZSkgY29udGludWU7XG4gICAgaWYgKG9wdHMub21pdFVyaVNjaGVtZSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBzdHJpbmdWYWx1ZS5tYXRjaChVUklfUkVHRVhQKTtcbiAgICAgIGlmIChtYXRjaCkgc3RyaW5nVmFsdWUgPSBtYXRjaFsyXSA/PyBcIlwiO1xuICAgIH1cbiAgICBpZiAob3B0cy5vbWl0RW1haWxEb21haW4pIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc3RyaW5nVmFsdWUubWF0Y2goRU1BSUxfUkVHRVhQKTtcbiAgICAgIGlmIChtYXRjaCkgc3RyaW5nVmFsdWUgPSBtYXRjaFsxXSA/PyBcIlwiO1xuICAgIH1cbiAgICBpZiAoIXN0cmluZ1ZhbHVlKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHRva2VuTWF0Y2ggb2Ygc3RyaW5nVmFsdWUubWF0Y2hBbGwocmVnZXhwKSkge1xuICAgICAgbGV0IHRva2VuID0gdG9rZW5NYXRjaFswXSE7XG4gICAgICBpZiAob3B0cy5sb3dlckNhc2UpIHRva2VuID0gdG9rZW4udG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChvcHRzLmNhcGl0YWxpemUpIHRva2VuID0gY2FwaXRhbGl6ZSh0b2tlbik7XG4gICAgICBpZiAoIXRva2VuKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3Qgb3ZlcnJpZGUgb2YgVE9LRU5JWkVfT1ZFUlJJREVTKSB7XG4gICAgICAgIHRva2VuID0gb3ZlcnJpZGUodG9rZW4sIG9wdHMpO1xuICAgICAgICBpZiAoIXRva2VuKSBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICghdG9rZW4gfHwgc2Vlbj8uaGFzKHRva2VuKSkgY29udGludWU7XG4gICAgICBzZWVuPy5hZGQodG9rZW4pO1xuICAgICAgeWllbGQgdG9rZW47XG4gICAgfVxuICB9XG59XG5cbi8qKiBZaWVsZCBub3JtYWxpemVkIHRva2VucyB1c2luZyB0aGUgZGVmYXVsdCB0b2tlbml6YXRpb24gcnVsZXMuICovXG5leHBvcnQgZnVuY3Rpb24qIHRva2VuaXplKC4uLnZhbHVlczogdW5rbm93bltdKTogR2VuZXJhdG9yPHN0cmluZz4ge1xuICB5aWVsZCogdG9rZW5pemVXaXRoT3B0aW9ucyh7fSwgLi4udmFsdWVzKTtcbn1cblxuLyoqXG4gKiBKb2luIHRva2VuaXplZCB2YWx1ZXMgd2l0aCBgZGVsaW1pdGVyYC4gV2hlbiB0aGUgbmV4dCB0b2tlbiB3b3VsZCBwdXNoIHRoZVxuICogcmVzdWx0IG92ZXIgYG1heExlbmd0aGA6IGB0cmltYCBzdG9wcyBhZGRpbmc7IGBlbXB0eWAgcmV0dXJucyBgXCJcImA7IGBoYXNoYFxuICogYXBwZW5kcyBhIGRpZ2VzdCBvZiBhY2NlcHRlZCB0b2tlbnMgcGx1cyB0aGUgb3ZlcmZsb3cgdG9rZW4gaWYgdGhlIHJlc3VsdFxuICogc3RpbGwgZml0cywgb3RoZXJ3aXNlIGBcIlwiYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSWRlbnRpZmllcldpdGhPcHRpb25zKG9wdGlvbnM6IElkZW50aWZpZXJPcHRpb25zLCAuLi52YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIGNvbnN0IG9wdHM6IFJlc29sdmVkSWRlbnRpZmllck9wdGlvbnMgPSB7XG4gICAgLi4uSURFTlRJRklFUl9ERUZBVUxUUyxcbiAgICAuLi5vcHRpb25zLFxuICAgIGxvd2VyQ2FzZTogdHJ1ZSxcbiAgfTtcbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudExlbmd0aCA9IDA7XG5cbiAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbml6ZVdpdGhPcHRpb25zKG9wdHMsIC4uLnZhbHVlcykpIHtcbiAgICBjb25zdCBzZXBMZW5ndGggPSB0b2tlbnMubGVuZ3RoID4gMCA/IG9wdHMuZGVsaW1pdGVyLmxlbmd0aCA6IDA7XG4gICAgY29uc3QgbmV4dExlbmd0aCA9IGN1cnJlbnRMZW5ndGggKyBzZXBMZW5ndGggKyB0b2tlbi5sZW5ndGg7XG5cbiAgICBpZiAobmV4dExlbmd0aCA+IG9wdHMubWF4TGVuZ3RoKSB7XG4gICAgICBpZiAob3B0cy50cnVuY2F0ZVN0cmF0ZWd5ID09PSBcImVtcHR5XCIpIHJldHVybiBcIlwiO1xuICAgICAgaWYgKG9wdHMudHJ1bmNhdGVTdHJhdGVneSA9PT0gXCJ0cmltXCIpIGJyZWFrO1xuXG4gICAgICBjb25zdCBoYXNoID0gZGlnZXN0VG9rZW5zKG9wdHMudHJ1bmNhdGVIYXNoTGVuZ3RoLCB0b2tlbnMsIHRva2VuKTtcbiAgICAgIGlmIChjdXJyZW50TGVuZ3RoICsgc2VwTGVuZ3RoICsgaGFzaC5sZW5ndGggPD0gb3B0cy5tYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRva2Vucy5sZW5ndGggPiAwID8gdG9rZW5zLmpvaW4ob3B0cy5kZWxpbWl0ZXIpICsgb3B0cy5kZWxpbWl0ZXIgKyBoYXNoIDogaGFzaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICBjdXJyZW50TGVuZ3RoID0gbmV4dExlbmd0aDtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnMuam9pbihvcHRzLmRlbGltaXRlcik7XG59XG5cbi8qKiBDb252ZXJ0IGFyYml0cmFyeSB2YWx1ZXMgaW50byBhIG5vcm1hbGl6ZWQgY2FtZWwtY2FzZSBpZGVudGlmaWVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSWRlbnRpZmllciguLi52YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIHJldHVybiB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7fSwgLi4udmFsdWVzKTtcbn1cblxuLyoqXG4gKiBTbHVnaWZpZWQgaWRlbnRpZmllcjogc2FtZSBydWxlcyBhcyB7QGxpbmsgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnN9IHdpdGggdGhlXG4gKiBkZWxpbWl0ZXIgZm9yY2VkIHRvIGAtYC4gQWNjZXB0cyB7QGxpbmsgS2V5T3B0aW9uc30gc28gY2FsbGVycyBjYW5ub3RcbiAqIG92ZXJyaWRlIHRoZSBkZWxpbWl0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NsdWdXaXRoT3B0aW9ucyhvcHRpb25zOiBLZXlPcHRpb25zLCAuLi52YWx1ZXM6IHVua25vd25bXSk6IHN0cmluZyB7XG4gIHJldHVybiB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7IC4uLm9wdGlvbnMsIGRlbGltaXRlcjogXCItXCIgfSwgLi4udmFsdWVzKTtcbn1cblxuLyoqIENvbnZlcnQgYXJiaXRyYXJ5IHZhbHVlcyBpbnRvIGEgbm9ybWFsaXplZCBoeXBoZW4tZGVsaW1pdGVkIHNsdWcuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TbHVnKC4uLnZhbHVlczogdW5rbm93bltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvU2x1Z1dpdGhPcHRpb25zKHt9LCAuLi52YWx1ZXMpO1xufVxuXG4vKipcbiAqIFRyaW0gYHZhbHVlYCBhbmQgcmV0dXJuIGBudWxsYCBmb3Igbm9uLXN0cmluZ3MsIGB1bmRlZmluZWRgLCBvclxuICogc3RyaW5ncyB0aGF0IGFyZSBlbXB0eSBhZnRlciB0cmltbWluZy4gTGV0cyBjYWxsIHNpdGVzIGNvbGxhcHNlIHRoZVxuICogY29tbW9uXG4gKlxuICogYGBgdHNcbiAqIHR5cGVvZiB2ID09PSBcInN0cmluZ1wiICYmIHYudHJpbSgpID8gdi50cmltKCkgOiBudWxsXG4gKiBgYGBcbiAqXG4gKiBkYW5jZSBpbnRvIGEgc2luZ2xlIGhlbHBlci4gVXNlZnVsIGZvciBIVFRQIGhlYWRlciAvIHF1ZXJ5IC8gZm9ybVxuICogZXh0cmFjdG9ycyB3aGVyZSBkb3duc3RyZWFtIGNvZGUgd2FudHMgYHN0cmluZyB8IG51bGxgIHRvIGRyaXZlIGFcbiAqIGNoZWFwIGA/P2AgLyBgaWYgKHgpYCBjYXNjYWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbVRvTnVsbCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKTtcbiAgcmV0dXJuIHRyaW1tZWQgPyB0cmltbWVkIDogbnVsbDtcbn1cblxuLy8gQ29uZmlnIGxpc3RzIGFycml2ZSBlaXRoZXIgYWxyZWFkeSBzcGxpdCAoYW4gYXJyYXkpIG9yIGFzIG9uZSBlbnYtdmFyIHN0cmluZ1xuLy8gd2l0aCBlbnRyaWVzIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kL29yIHdoaXRlc3BhY2UuXG5jb25zdCBMSVNUX1NFUEFSQVRPUl9SRUdFWFAgPSAvW1xccyxdKy87XG5cbi8qKlxuICogTm9ybWFsaXplIGEgY29uZmlnIGxpc3QgdGhhdCBtYXkgYXJyaXZlIGFzIGFuIGFycmF5IG9yIGFzIGEgc2luZ2xlXG4gKiBjb21tYS93aGl0ZXNwYWNlLXNlcGFyYXRlZCBzdHJpbmc6IHNwbGl0LCBhcHBseSBgdHJhbnNmb3JtYCwgZHJvcCBlbXB0aWVzLFxuICogYW5kIGRlLWR1cGxpY2F0ZSAoZmlyc3Qgb2NjdXJyZW5jZSB3aW5zKS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBzaGFwZSBldmVyeSBhbGxvdy1saXN0IC8gZmFsbGJhY2stb3JkZXIgc2V0dGluZyBpbiB0aGlzIHJlcG9cbiAqIHRha2VzLCBiZWNhdXNlIHRoZSBzYW1lIHZhbHVlIGNhbiBjb21lIGZyb20gdHlwZWQgY29uZmlnIChgc3RyaW5nW11gKSBvciBmcm9tXG4gKiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSAoYFwiYSwgYiBjXCJgKS4gUGFzcyBgdHJhbnNmb3JtYCB0byBub3JtYWxpemUgZW50cmllc1xuICogYXMgdGhleSBhcmUgcmVhZDsgaXQgZGVmYXVsdHMgdG8gdHJpbW1pbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlTGlzdChcImRvY3MuZXhhbXBsZS5jb20sICouZGF0YWJyaWNrcy5jb21cIik7XG4gKiBwYXJzZUxpc3QocHJvY2Vzcy5lbnYuTU9ERUxfRkFMTEJBQ0tTKTtcbiAqIHBhcnNlTGlzdChyYXcsIG5vcm1hbGl6ZVVybFBhdHRlcm4pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaXN0KFxuICByYXc6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgdHJhbnNmb3JtOiAoZW50cnk6IHN0cmluZykgPT4gc3RyaW5nID0gKGVudHJ5KSA9PiBlbnRyeS50cmltKCksXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVudHJpZXMgPVxuICAgIHR5cGVvZiByYXcgPT09IFwic3RyaW5nXCIgPyByYXcuc3BsaXQoTElTVF9TRVBBUkFUT1JfUkVHRVhQKSA6IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhdyA6IFtdO1xuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRyYW5zZm9ybShlbnRyeSk7XG4gICAgaWYgKCFub3JtYWxpemVkIHx8IHNlZW4uaGFzKG5vcm1hbGl6ZWQpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChub3JtYWxpemVkKTtcbiAgICBvdXQucHVzaChub3JtYWxpemVkKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIHtAbGluayB0cmltVG9OdWxsfSB3aXRoIGFuIGVtcHR5LXN0cmluZyBtaXNzIGluc3RlYWQgb2YgYG51bGxgLCBmb3IgY2FsbGVyc1xuICogdGhhdCBidWlsZCBhIHN0cmluZyB1bmNvbmRpdGlvbmFsbHkgYW5kIHRyZWF0IFwiYWJzZW50XCIgYXMgXCJcIi5cbiAqXG4gKiBSZWFkaW5nIGxvb3NlbHktdHlwZWQgSlNPTiBpcyB0aGUgbW90aXZhdGluZyBjYXNlOiBhIGZpZWxkIHRoYXQgc2hvdWxkIGJlIGFcbiAqIHN0cmluZyBtYXkgYmUgbWlzc2luZyBvciB0aGUgd3JvbmcgdHlwZSwgYW5kIHRoZSBjYWxsZXIgd2FudHMgYFwiXCJgIHJhdGhlclxuICogdGhhbiBhIG51bGwgY2hlY2sgYXQgZXZlcnkgYWNjZXNzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB0aXRsZSA9IHRyaW1Ub0VtcHR5KHJlY29yZC50aXRsZSk7IC8vIGFsd2F5cyBhIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbVRvRW1wdHkodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gdHJpbVRvTnVsbCh2YWx1ZSkgPz8gXCJcIjtcbn1cblxuLyoqXG4gKiBUcmltIHRoZSBmaXJzdCB1c2FibGUgc3RyaW5nIG91dCBvZiBgdmFsdWVgLiBSZXR1cm5zIGBudWxsYCB3aGVuXG4gKiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLCBgbnVsbGAsIGFuIGVtcHR5IHN0cmluZywgb3IgYW4gYXJyYXkgd2hvc2VcbiAqIGZpcnN0IHN0cmluZyBtZW1iZXIgaXMgZW1wdHkuIE1pcnJvcnMgaG93IEV4cHJlc3MgLyBOb2RlIGhlYWRlclxuICogYWNjZXNzb3JzIGV4cG9zZSBzaW5nbGUgdnMuIHJlcGVhdGVkIGhlYWRlcnMgLSB0aGUgZmlyc3RcbiAqIG5vbi1lbXB0eSBlbnRyeSB3aW5zLCBldmVyeXRoaW5nIGVsc2UgaXMgaWdub3JlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0Tm9uRW1wdHkodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gdHJpbVRvTnVsbChpdGVtKTtcbiAgICAgIGlmICh0cmltbWVkKSByZXR1cm4gdHJpbW1lZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHRyaW1Ub051bGwodmFsdWUpO1xufVxuXG4vKipcbiAqIEVzY2FwZSB0aGUgZml2ZSBjaGFyYWN0ZXJzIHNpZ25pZmljYW50IGluIEhUTUwgdGV4dCBhbmRcbiAqIGRvdWJsZS1xdW90ZWQgYXR0cmlidXRlIHZhbHVlcyAoYCZgLCBgPGAsIGA+YCwgYFwiYCwgYCdgKSBzbyBhblxuICogdW50cnVzdGVkIHN0cmluZyBjYW4gYmUgaW50ZXJwb2xhdGVkIGludG8gbWFya3VwIHdpdGhvdXQgYnJlYWtpbmdcbiAqIG91dCBvZiBpdHMgY29udGV4dC4gYCZgIGlzIHJlcGxhY2VkIGZpcnN0IHNvIGFtcGVyc2FuZHMgaW50cm9kdWNlZFxuICogYnkgdGhlIGxhdGVyIHJlcGxhY2VtZW50cyBhcmVuJ3QgZG91YmxlLWVzY2FwZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVIdG1sKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWVcbiAgICAucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpXG4gICAgLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpXG4gICAgLnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpXG4gICAgLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpXG4gICAgLnJlcGxhY2UoLycvZywgXCImIzM5O1wiKTtcbn1cblxuLyoqXG4gKiBTbHVnaWZ5IGB2YWx1ZWAgKHVzaW5nIHRoZSBzdGFuZGFyZCB7QGxpbmsgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnN9XG4gKiB0b2tlbml6ZXIgKyBkZWxpbWl0ZXIgcnVsZXMpIGFuZCAqKmFsd2F5cyoqIHN1ZmZpeCBhIHNob3J0XG4gKiBkZXRlcm1pbmlzdGljIGhhc2guIFVzZSB3aGVuIHlvdSBuZWVkIGEgc3RhYmxlLCBzbHVnaWZpZWQgaWQgdGhhdFxuICogaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYWNyb3NzIGRlc2NyaXB0aW9ucyBzaGFyaW5nIHRoZSBzYW1lXG4gKiBsZWFkaW5nIHRva2VucyAodG9vbCBpZHMsIGNhY2hlIGtleXMsIGV0Yy4pLlxuICpcbiAqIEJlaGF2aW91ciBkaWZmZXJzIGZyb20gYHRvSWRlbnRpZmllcldpdGhPcHRpb25zKHsgbWF4TGVuZ3RoLFxuICogdHJ1bmNhdGVTdHJhdGVneTogXCJoYXNoXCIgfSlgOiB0aGF0IGhlbHBlciBvbmx5IGFwcGVuZHMgYSBoYXNoIHdoZW5cbiAqIHRoZSBzbHVnICpvdmVyZmxvd3MqIGBtYXhMZW5ndGhgLiBUaGlzIGhlbHBlciBhcHBlbmRzIGEgaGFzaFxuICogdW5jb25kaXRpb25hbGx5IHNvIHRoZSByZXN1bHQgaXMgY29sbGlzaW9uLXJlc2lzdGFudCBldmVuIGZvclxuICogc2hvcnQgaW5wdXRzLiBUaGUgaGFzaCBpcyBjb21wdXRlZCBvdmVyIHRoZSByYXcgYHZhbHVlYCBzbyB0d29cbiAqIGRlc2NyaXB0aW9ucyBwcm9kdWNpbmcgdGhlIHNhbWUgc2x1ZyBzdGlsbCBnZXQgZGlmZmVyZW50IGlkcy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBTb3VyY2Ugc3RyaW5nICh0eXBpY2FsbHkgYSB0b29sL2FnZW50IGRlc2NyaXB0aW9uKS5cbiAqIEBwYXJhbSBvcHRpb25zLmRlbGltaXRlciAtIFRva2VuIHNlcGFyYXRvciAoZGVmYXVsdCBgXCJfXCJgKS5cbiAqIEBwYXJhbSBvcHRpb25zLnNsdWdNYXhMZW5ndGggLSBDYXAgb24gdGhlIHNsdWcgcG9ydGlvbiAodGhlIHBhcnRcbiAqICAgYmVmb3JlIHRoZSBoYXNoKS4gRGVmYXVsdCAzMi5cbiAqIEBwYXJhbSBvcHRpb25zLmhhc2hMZW5ndGggLSBMZW5ndGggb2YgdGhlIHN1ZmZpeCBwcm9kdWNlZCBieVxuICogICB7QGxpbmsgZm52SGFzaFdpdGhPcHRpb25zfSAoQ3JvY2tmb3JkLXN0eWxlIGJhc2UtMzIgYWxwaGFiZXQsIG1heCA3XG4gKiAgIGNoYXJzKS4gRGVmYXVsdCA2LlxuICogQHBhcmFtIG9wdGlvbnMuZmFsbGJhY2tQcmVmaXggLSBQcmVmaXggdXNlZCB3aGVuIHRoZSBzbHVnIGlzIGVtcHR5XG4gKiAgIChlLmcuIHB1bmN0dWF0aW9uLW9ubHkgaW5wdXQpLiBEZWZhdWx0IGBcImlkXCJgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9VbmlxdWVTbHVnKFxuICB2YWx1ZTogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgZGVsaW1pdGVyPzogc3RyaW5nO1xuICAgIHNsdWdNYXhMZW5ndGg/OiBudW1iZXI7XG4gICAgaGFzaExlbmd0aD86IG51bWJlcjtcbiAgICBmYWxsYmFja1ByZWZpeD86IHN0cmluZztcbiAgfSA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGVsaW1pdGVyID0gb3B0aW9ucy5kZWxpbWl0ZXIgPz8gXCJfXCI7XG4gIGNvbnN0IHNsdWdNYXhMZW5ndGggPSBvcHRpb25zLnNsdWdNYXhMZW5ndGggPz8gMzI7XG4gIGNvbnN0IGhhc2hMZW5ndGggPSBvcHRpb25zLmhhc2hMZW5ndGggPz8gNjtcbiAgY29uc3QgZmFsbGJhY2tQcmVmaXggPSBvcHRpb25zLmZhbGxiYWNrUHJlZml4ID8/IFwiaWRcIjtcbiAgY29uc3Qgc2x1ZyA9IHRvSWRlbnRpZmllcldpdGhPcHRpb25zKFxuICAgIHsgZGVsaW1pdGVyLCBtYXhMZW5ndGg6IHNsdWdNYXhMZW5ndGgsIHRydW5jYXRlU3RyYXRlZ3k6IFwidHJpbVwiIH0sXG4gICAgdmFsdWUsXG4gICk7XG4gIGNvbnN0IHN1ZmZpeCA9IGZudkhhc2hXaXRoT3B0aW9ucyh7IGxlbmd0aDogaGFzaExlbmd0aCB9LCB2YWx1ZSk7XG4gIHJldHVybiBzbHVnID8gYCR7c2x1Z30ke2RlbGltaXRlcn0ke3N1ZmZpeH1gIDogYCR7ZmFsbGJhY2tQcmVmaXh9JHtkZWxpbWl0ZXJ9JHtzdWZmaXh9YDtcbn1cblxuZnVuY3Rpb24gZGlnZXN0VG9rZW5zKGxlbmd0aDogbnVtYmVyLCBwYXJ0czogcmVhZG9ubHkgc3RyaW5nW10sIGV4dHJhPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGNvbWJpbmVkID0gXCJcIjtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSBjb21iaW5lZCArPSBwYXJ0ICsgXCJcXDBcIjtcbiAgaWYgKGV4dHJhICE9PSB1bmRlZmluZWQpIGNvbWJpbmVkICs9IGV4dHJhICsgXCJcXDBcIjtcbiAgcmV0dXJuIGZudkhhc2hXaXRoT3B0aW9ucyh7IGxlbmd0aCB9LCBjb21iaW5lZCk7XG59XG5cbi8qKlxuICogQSBub2RlIGluIHRoZSBkZXNjcmlwdGlvbiB0cmVlIGNvbnN1bWVkIGJ5IHtAbGluayB0b0Rlc2NyaXB0aW9ufS5cbiAqXG4gKiAtIGBzdHJpbmdgIC0gYSB0ZXh0IHBhcmFncmFwaC5cbiAqIC0gYERlc2NyaXB0aW9uW11gIC0gYSBzZXF1ZW5jZSBvZiBzdGFja2VkIGJsb2NrcyBhdCB0aGUgc2FtZSBsZXZlbFxuICogICAobm8gbGlzdCBtYXJrZXJzKS4gUGxhaW4gdGV4dCBhZGphY2VudCB0byBhIGxpc3QgKGVpdGhlciBkaXJlY3Rpb24pXG4gKiAgIGZsdXNoZXMgdG9nZXRoZXIgc28gdGhlIHByb3NlIHJlYWRzIGFzIGEgbGVhZC1pbiBvciB0cmFpbGluZ1xuICogICBzdW1tYXJ5LiBUd28gdGV4dCBwYXJhZ3JhcGhzLCB0d28gYWRqYWNlbnQgbGlzdHMsIGFuZCBhbnl0aGluZ1xuICogICB0b3VjaGluZyBhIG1hcCBnZXQgYSBibGFuay1saW5lIGJyZWFrLlxuICogLSBgeyBidWxsZXRzOiBbLi4uXSB9YCAvIGB7IG51bWJlcmVkOiBbLi4uXSB9YCAtIGV4cGxpY2l0IGxpc3QuIEFcbiAqICAgbGlzdCBvZiBvbmUgYmFyZSBzdHJpbmcgZHJvcHMgaXRzIG1hcmtlciAoYC1gIC8gYDEuYCk7IGEgbGlzdCBvZlxuICogICBvbmUgaXRlbSB3aXRoIG5lc3RlZCBjaGlsZHJlbiBrZWVwcyBpdHMgbWFya2VyIGFzIHRoZSB2aXN1YWwgYW5jaG9yXG4gKiAgIGZvciB0aGUgaW5kZW50ZWQgY2hpbGRyZW4uXG4gKiAtIGFueSBvdGhlciBvYmplY3QgLSBoZWFkZXJzIG1hcDogZWFjaCBrZXkgYmVjb21lcyBhIGBIZWFkZXI6YCBsaW5lXG4gKiAgIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSBhbmQgdGhlIHJlbmRlcmVkIHZhbHVlLlxuICovXG5leHBvcnQgdHlwZSBEZXNjcmlwdGlvbiA9IHN0cmluZyB8IHJlYWRvbmx5IERlc2NyaXB0aW9uW10gfCB7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IERlc2NyaXB0aW9uIH07XG5cbmNvbnN0IExJU1RfS0VZUyA9IFtcImJ1bGxldHNcIiwgXCJudW1iZXJlZFwiXSBhcyBjb25zdDtcbnR5cGUgTGlzdEtpbmQgPSAodHlwZW9mIExJU1RfS0VZUylbbnVtYmVyXTtcblxuLyoqXG4gKiBGb3JtYXQgYSBuZXN0ZWQgZGVzY3JpcHRpb24gdHJlZSBhcyBhIE1hcmtkb3duLWlzaCBzdHJpbmcgc3VpdGFibGVcbiAqIGZvciBhbiBMTE0gc3lzdGVtIHByb21wdCwgWm9kIGAuZGVzY3JpYmUoKWAgYmxvY2ssIE1hc3RyYSB0b29sXG4gKiBkZXNjcmlwdGlvbiwgb3IgYW55IG90aGVyIGxvbmctZm9ybSB0ZXh0IGRlc3RpbmF0aW9uLlxuICpcbiAqIEV2ZXJ5IHN0cmluZyBzZWN0aW9uIGlzIGRlZGVudGVkIChjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlIHN0cmlwcGVkKSxcbiAqIHJpZ2h0LXRyaW1tZWQgbGluZSBieSBsaW5lLCBhbmQgZnJlZWQgb2YgbGVhZGluZyAvIHRyYWlsaW5nIGJsYW5rXG4gKiBsaW5lcywgc28gY2FsbGVycyBjYW4gd3JpdGUgbXVsdGktbGluZSB0ZW1wbGF0ZSBsaXRlcmFscyBpbmRlbnRlZFxuICogbmF0dXJhbGx5IGluIHNvdXJjZSB3aXRob3V0IGxlYWtpbmcgdGhhdCBpbmRlbnRhdGlvbiBpbnRvIHRoZVxuICogY29uc3VtZXItZmFjaW5nIG91dHB1dC4gUGxhaW4tc3RyaW5nIGlucHV0cyBmbG93IHRocm91Z2ggdW5jaGFuZ2VkXG4gKiBhcGFydCBmcm9tIHRoZSBzYW1lIG5vcm1hbGl6YXRpb24gcGFzcywgc28gYSBzaW5nbGUgbXVsdGktbGluZVxuICogdGVtcGxhdGUgbGl0ZXJhbCB3b3JrcyBkaXJlY3RseTpcbiAqXG4gKiBgYGB0c1xuICogdG9EZXNjcmlwdGlvbihgXG4gKiAgIEFzayB0aGUgR2VuaWUgc3BhY2UgXCIke2FsaWFzfVwiIGEgcXVlc3Rpb24uXG4gKiAgIFBhc3MgdGhlIGFuc3dlciB0aHJvdWdoIGFzLWlzLlxuICogYCk7XG4gKiAvLyBBc2sgdGhlIEdlbmllIHNwYWNlIFwiZGVmYXVsdFwiIGEgcXVlc3Rpb24uXG4gKiAvLyBQYXNzIHRoZSBhbnN3ZXIgdGhyb3VnaCBhcy1pcy5cbiAqXG4gKiB0b0Rlc2NyaXB0aW9uKFtcbiAqICAgYFxuICogICAgIEFzayB0aGUgR2VuaWUgc3BhY2UgYSBxdWVzdGlvbi5cbiAqICAgICBQaHJhc2UgaXQgZnJvbSB0aGUgdXNlcidzIHBlcnNwZWN0aXZlLlxuICogICBgLFxuICogICB7IGJ1bGxldHM6IFtcbiAqICAgICBbXCJQYXNzIHRoZSBhbnN3ZXIgdGhyb3VnaCBhcy1pc1wiLCB7IG51bWJlcmVkOiBbXCJpdGVtXCIsIFwiaXRlbVwiXSB9XSxcbiAqICAgXX0sXG4gKiAgIHsgSW5zdHJ1Y3Rpb25zOiBcIlJlcGx5IHdpdGggdGhlIFNRTCBvbmx5LlwiIH0sXG4gKiBdKTtcbiAqIC8vIEFzayB0aGUgR2VuaWUgc3BhY2UgYSBxdWVzdGlvbi5cbiAqIC8vIFBocmFzZSBpdCBmcm9tIHRoZSB1c2VyJ3MgcGVyc3BlY3RpdmUuXG4gKiAvLyAtIFBhc3MgdGhlIGFuc3dlciB0aHJvdWdoIGFzLWlzXG4gKiAvLyAgIDEuIGl0ZW1cbiAqIC8vICAgMi4gaXRlbVxuICogLy9cbiAqIC8vIEluc3RydWN0aW9uczpcbiAqIC8vXG4gKiAvLyBSZXBseSB3aXRoIHRoZSBTUUwgb25seS5cbiAqIGBgYFxuICpcbiAqIFNlZSB7QGxpbmsgRGVzY3JpcHRpb259IGZvciB0aGUgbm9kZSBncmFtbWFyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EZXNjcmlwdGlvbihub2RlOiBEZXNjcmlwdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiByZW5kZXJCbG9jayhub2RlLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9bIFxcdF0rJC9nbSwgXCJcIilcbiAgICAucmVwbGFjZSgvXFxuKyQvLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQmxvY2sobm9kZTogRGVzY3JpcHRpb24sIHBhZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG4gIGlmICh0eXBlb2Ygbm9kZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHByZXBlbmRQYWQoZGVkZW50KG5vZGUpLCBwYWQpO1xuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkgcmV0dXJuIHJlbmRlclNlcXVlbmNlKG5vZGUsIHBhZCk7XG4gIGNvbnN0IGtpbmQgPSBsaXN0S2luZChub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgaWYgKGtpbmQpIHtcbiAgICByZXR1cm4gcmVuZGVyTGlzdCgobm9kZSBhcyBSZWNvcmQ8TGlzdEtpbmQsIHJlYWRvbmx5IERlc2NyaXB0aW9uW10+KVtraW5kXSwgcGFkLCBraW5kKTtcbiAgfVxuICByZXR1cm4gcmVuZGVyTWFwKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgRGVzY3JpcHRpb24+LCBwYWQpO1xufVxuXG4vKipcbiAqIFJpZ2h0LXN0cmlwIGV2ZXJ5IGxpbmUsIHJlbW92ZSBjb21tb24gaW5kZW50YXRpb24sIGFuZCBvcHRpb25hbGx5IHRyaW1cbiAqIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGJsYW5rIGxpbmVzLiBXaGl0ZXNwYWNlLW9ubHkgbGluZXMgbm9ybWFsaXplIHRvIGVtcHR5XG4gKiBsaW5lcywgbWF0Y2hpbmcgY29tbW9uIGRlZGVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWRlbnRMaW5lcyh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM6IERlZGVudE9wdGlvbnMgPSB7fSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gW107XG4gIGNvbnN0IHsgdHJpbVN0YXJ0ID0gdHJ1ZSwgdHJpbUVuZCA9IHRydWUsIHRyaW1MaW5lRW5kID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpLm1hcCgobGluZSkgPT4gKHRyaW1MaW5lRW5kID8gbGluZS5yZXBsYWNlKC9bIFxcdF0rJC8sIFwiXCIpIDogbGluZSkpO1xuICBsZXQgbWluID0gSW5maW5pdHk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmICghbGluZS50cmltKCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1hdGNoID0gL15bIFxcdF0qLy5leGVjKGxpbmUpO1xuICAgIGNvbnN0IHdpZHRoID0gbWF0Y2ggPyBtYXRjaFswXS5sZW5ndGggOiAwO1xuICAgIGlmICh3aWR0aCA8IG1pbikgbWluID0gd2lkdGg7XG4gIH1cbiAgY29uc3Qgc3RyaXBwZWQgPVxuICAgIG1pbiA9PT0gSW5maW5pdHkgfHwgbWluID09PSAwID8gbGluZXMgOiBsaW5lcy5tYXAoKGxpbmUpID0+IChsaW5lID8gbGluZS5zbGljZShtaW4pIDogXCJcIikpO1xuICBsZXQgc3RhcnQgPSAwO1xuICBsZXQgZW5kID0gc3RyaXBwZWQubGVuZ3RoO1xuICBpZiAodHJpbVN0YXJ0KSB7XG4gICAgd2hpbGUgKHN0YXJ0IDwgZW5kICYmICFzdHJpcHBlZFtzdGFydF0hLnRyaW0oKSkgc3RhcnQgKz0gMTtcbiAgfVxuICBpZiAodHJpbUVuZCkge1xuICAgIHdoaWxlIChlbmQgPiBzdGFydCAmJiAhc3RyaXBwZWRbZW5kIC0gMV0hLnRyaW0oKSkgZW5kIC09IDE7XG4gIH1cbiAgcmV0dXJuIHN0cmlwcGVkLnNsaWNlKHN0YXJ0LCBlbmQpO1xufVxuXG4vKiogSm9pbiB7QGxpbmsgZGVkZW50TGluZXN9LCB0cmltbWluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyBibGFuayBsaW5lcyBieSBkZWZhdWx0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZGVudCh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM6IERlZGVudE9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gIHJldHVybiBkZWRlbnRMaW5lcyh0ZXh0LCBvcHRpb25zKS5qb2luKFwiXFxuXCIpO1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCBpcyB0cmVhdGVkIGFzIGEgdHlwZWQgbGlzdCBvbmx5IHdoZW4gaXQgaGFzIGV4YWN0bHkgb25lXG4gKiBvd24ga2V5LCB0aGF0IGtleSBpcyBgYnVsbGV0c2Agb3IgYG51bWJlcmVkYCwgYW5kIHRoZSB2YWx1ZSBpcyBhblxuICogYXJyYXkuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBhIGhlYWRlcnMgbWFwIC0gc28gY2FsbGVycyB3YW50aW5nIGFcbiAqIHNpbmdsZSBoZWFkZXIgbGl0ZXJhbGx5IG5hbWVkIGBidWxsZXRzYCBvciBgbnVtYmVyZWRgIGNhbiB1c2UgYVxuICogbXVsdGkta2V5IG1hcCBvciByZW5hbWUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RLaW5kKG5vZGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogTGlzdEtpbmQgfCBudWxsIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG5vZGUpO1xuICBpZiAoa2V5cy5sZW5ndGggIT09IDEpIHJldHVybiBudWxsO1xuICBjb25zdCBrZXkgPSBrZXlzWzBdITtcbiAgaWYgKChMSVNUX0tFWVMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKGtleSkgJiYgQXJyYXkuaXNBcnJheShub2RlW2tleV0pKSB7XG4gICAgcmV0dXJuIGtleSBhcyBMaXN0S2luZDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJlcGVuZFBhZCh0ZXh0OiBzdHJpbmcsIHBhZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gXCJcIjtcbiAgaWYgKCFwYWQpIHJldHVybiB0ZXh0O1xuICByZXR1cm4gdGV4dFxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC5tYXAoKGxpbmUpID0+IChsaW5lID8gcGFkICsgbGluZSA6IFwiXCIpKVxuICAgIC5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTZXF1ZW5jZShpdGVtczogcmVhZG9ubHkgRGVzY3JpcHRpb25bXSwgcGFkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZW5kZXJlZDogeyB0ZXh0OiBzdHJpbmc7IG5vZGU6IERlc2NyaXB0aW9uIH1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBjb25zdCB0ZXh0ID0gcmVuZGVyQmxvY2soaXRlbSwgcGFkKTtcbiAgICBpZiAoIXRleHQpIGNvbnRpbnVlO1xuICAgIHJlbmRlcmVkLnB1c2goeyB0ZXh0LCBub2RlOiBpdGVtIH0pO1xuICB9XG4gIGlmIChyZW5kZXJlZC5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuICBsZXQgb3V0ID0gcmVuZGVyZWRbMF0hLnRleHQ7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcmVuZGVyZWQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBzZXAgPSBuZWVkc0JsYW5rTGluZUJldHdlZW4ocmVuZGVyZWRbaSAtIDFdIS5ub2RlLCByZW5kZXJlZFtpXSEubm9kZSkgPyBcIlxcblxcblwiIDogXCJcXG5cIjtcbiAgICBvdXQgKz0gc2VwICsgcmVuZGVyZWRbaV0hLnRleHQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBNYXBzIGFsd2F5cyBjcmVhdGUgdGhlaXIgb3duIHNlY3Rpb24gYm91bmRhcnkgKGEgYEhlYWRlcjpgIGxpbmUgcGx1c1xuICogYSBibGFuayBsaW5lIGJlZm9yZSB0aGUgYm9keSksIHNvIGFueXRoaW5nIHRvdWNoaW5nIGEgbWFwIGdldHMgYVxuICogYmxhbmstbGluZSBicmVhay4gUGxhaW4gdGV4dCBhZGphY2VudCB0byBhIHR5cGVkIGxpc3QgZmx1c2hlc1xuICogdG9nZXRoZXIgaW4gZWl0aGVyIGRpcmVjdGlvbjogdGV4dC1iZWZvcmUtbGlzdCByZWFkcyBhcyBhIGxlYWQtaW4sXG4gKiB0ZXh0LWFmdGVyLWxpc3QgYXMgYSB0cmFpbGluZyBzdW1tYXJ5LiBUd28gdGV4dCBwYXJhZ3JhcGhzIGFuZCB0d29cbiAqIGFkamFjZW50IGxpc3RzIGJvdGggZ2V0IGEgYmxhbmstbGluZSBicmVhayBmb3IgbGVnaWJpbGl0eS5cbiAqL1xuZnVuY3Rpb24gbmVlZHNCbGFua0xpbmVCZXR3ZWVuKHByZXY6IERlc2NyaXB0aW9uLCBjdXJyOiBEZXNjcmlwdGlvbik6IGJvb2xlYW4ge1xuICBpZiAoaXNNYXAocHJldikgfHwgaXNNYXAoY3VycikpIHJldHVybiB0cnVlO1xuICBjb25zdCBwcmV2SXNUZXh0ID0gdHlwZW9mIHByZXYgPT09IFwic3RyaW5nXCI7XG4gIGNvbnN0IGN1cnJJc1RleHQgPSB0eXBlb2YgY3VyciA9PT0gXCJzdHJpbmdcIjtcbiAgaWYgKHByZXZJc1RleHQgIT09IGN1cnJJc1RleHQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQSBub2RlIGlzIGEgaGVhZGVycyBtYXAgd2hlbiBpdCBpcyBhIG5vbi1hcnJheSwgbm9uLWxpc3Qgb2JqZWN0LlxuICogYGJ1bGxldHNgIC8gYG51bWJlcmVkYCBzaW5nbGUta2V5IG9iamVjdHMgYXJlIHRoZSBvbmx5IHN0cnVjdHVyZWRcbiAqIG9iamVjdHMgdGhhdCBhcmVuJ3QgbWFwcy5cbiAqL1xuZnVuY3Rpb24gaXNNYXAobm9kZTogRGVzY3JpcHRpb24pOiBib29sZWFuIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGxpc3RLaW5kKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID09PSBudWxsO1xufVxuXG5mdW5jdGlvbiByZW5kZXJMaXN0KGl0ZW1zOiByZWFkb25seSBEZXNjcmlwdGlvbltdLCBwYWQ6IHN0cmluZywga2luZDogTGlzdEtpbmQpOiBzdHJpbmcge1xuICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgaXRlbXNbMF0gPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gcHJlcGVuZFBhZChpdGVtc1swXSwgcGFkKTtcbiAgfVxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXSE7XG4gICAgY29uc3QgbWFya2VyID0ga2luZCA9PT0gXCJidWxsZXRzXCIgPyBcIi0gXCIgOiBgJHtpICsgMX0uIGA7XG4gICAgY29uc3QgYm9keSA9IHJlbmRlckJsb2NrKGl0ZW0sIFwiXCIpO1xuICAgIGNvbnN0IGJvZHlMaW5lcyA9IGJvZHkuc3BsaXQoXCJcXG5cIik7XG4gICAgbGluZXMucHVzaChgJHtwYWR9JHttYXJrZXJ9JHtib2R5TGluZXNbMF0gPz8gXCJcIn1gKTtcbiAgICBjb25zdCBjb250aW51YXRpb24gPSBwYWQgKyBcIiBcIi5yZXBlYXQobWFya2VyLmxlbmd0aCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGJvZHlMaW5lcy5zbGljZSgxKSkge1xuICAgICAgbGluZXMucHVzaChsaW5lID8gYCR7Y29udGludWF0aW9ufSR7bGluZX1gIDogXCJcIik7XG4gICAgfVxuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJNYXAobm9kZTogUmVjb3JkPHN0cmluZywgRGVzY3JpcHRpb24+LCBwYWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtoZWFkZXIsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgIGNvbnN0IGJvZHkgPSByZW5kZXJCbG9jayh2YWx1ZSwgcGFkKTtcbiAgICBpZiAoIWJvZHkgJiYgIWhlYWRlci50cmltKCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGhlYWRlckxpbmUgPSBoZWFkZXIudHJpbSgpID8gYCR7cGFkfSR7aGVhZGVyfTpgIDogXCJcIjtcbiAgICBwYXJ0cy5wdXNoKGJvZHkgPyBgJHtoZWFkZXJMaW5lfVxcblxcbiR7Ym9keX1gIDogaGVhZGVyTGluZSk7XG4gIH1cbiAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcXG5cXG5cIik7XG59XG5cbi8qKlxuICogRm9ybWF0IGEgY291bnQgd2l0aCBpdHMgbm91biwgcGx1cmFsaXppbmcgKG5haXZlIGArc2ApIHVubGVzcyB0aGUgY291bnQgaXMgMTpcbiAqIGBwbHVyYWxpemUoMSwgXCJiYXJyZWxcIilgIC0+IGBcIjEgYmFycmVsXCJgLCBgcGx1cmFsaXplKDMsIFwiYmFycmVsXCIpYCAtPlxuICogYFwiMyBiYXJyZWxzXCJgLiBDb2xsYXBzZXMgdGhlIGAke259IG5vdW4ke24gPT09IDEgPyBcIlwiIDogXCJzXCJ9YCBpZGlvbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdXJhbGl6ZShjb3VudDogbnVtYmVyLCBub3VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Y291bnR9ICR7bm91bn0ke2NvdW50ID09PSAxID8gXCJcIiA6IFwic1wifWA7XG59XG5cbi8qKlxuICogVGl0bGUtY2FzZSBhIHNuYWtlIC8ga2ViYWIgLyBjYW1lbCBpZGVudGlmaWVyIGludG8gYSBodW1hbi1yZWFkYWJsZSBsYWJlbDpcbiAqIHRva2VuaXplIChsb3dlcmNhc2VkLCBjYXBpdGFsaXplZCksIHRoZW4gam9pbiB3aXRoIHNwYWNlcy4gRmFsbHMgYmFjayB0b1xuICogdGhlIHJhdyBgdmFsdWVgIHdoZW4gaXQgeWllbGRzIG5vIHRva2VucyAoZS5nLiBwdW5jdHVhdGlvbi1vbmx5IGlucHV0KS5cbiAqIGBiZ2VfbGFyZ2VfZW5gIC0+IGBcIkJnZSBMYXJnZSBFblwiYCwgYHByb21wdElkYCAtPiBgXCJQcm9tcHQgSWRcImAuXG4gKlxuICogVGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBcImh1bWFuaXplIGEgY29sdW1uIC8gZmllbGQgbmFtZVwiIGlkaW9tIC1cbiAqIHJldXNlZCBieSB0aGUgY2hhdCBkYXRhLWdyaWQgaGVhZGVycyBhbmQgdGhlIGV4cG9ydCByZW5kZXJlci4gRXh0cmFcbiAqIHtAbGluayBUb2tlbml6ZU9wdGlvbnN9IChlLmcuIGBjYW1lbENhc2U6IGZhbHNlYCkgbWVyZ2Ugb3ZlciB0aGUgZGVmYXVsdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0xhYmVsKHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBUb2tlbml6ZU9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB0b2tlbnMgPSBbLi4udG9rZW5pemVXaXRoT3B0aW9ucyh7IGxvd2VyQ2FzZTogdHJ1ZSwgY2FwaXRhbGl6ZTogdHJ1ZSwgLi4ub3B0aW9ucyB9LCB2YWx1ZSldO1xuICByZXR1cm4gdG9rZW5zLmxlbmd0aCA+IDAgPyB0b2tlbnMuam9pbihcIiBcIikgOiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBVcHBlci1jYXNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHZhbHVlYCwgbGVhdmluZyB0aGUgcmVzdCB1bnRvdWNoZWQuXG4gKiBgXCJ3b3JraW5nXCJgIC0+IGBcIldvcmtpbmdcImAuIENvbGxhcHNlcyB0aGVcbiAqIGBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKWAgaWRpb20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXBpdGFsaXplKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUgPyB2YWx1ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpIDogdmFsdWU7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"root":["../src/async-utils.ts","../src/brand-utils.ts","../src/error-utils.ts","../src/execution.ts","../src/function-utils.ts","../src/hash.ts","../src/http.ts","../src/json.ts","../src/log.ts","../src/net.ts","../src/object.ts","../src/pattern.ts","../src/predicate.ts","../src/string-utils.ts","../src/token.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/async-utils.ts","../src/brand-utils.ts","../src/environment-utils.ts","../src/error-utils.ts","../src/execution.ts","../src/function-utils.ts","../src/hash.ts","../src/http.ts","../src/json.ts","../src/log.ts","../src/net.ts","../src/object.ts","../src/pattern.ts","../src/predicate.ts","../src/string-utils.ts","../src/token.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -19,7 +19,7 @@
19
19
  "projen": "projen"
20
20
  },
21
21
  "devDependencies": {
22
- "@dbx-tools/test-polyglot": "^0.9.19",
22
+ "@dbx-tools/test-polyglot": "^0.9.28",
23
23
  "@types/bun": "1.3.14",
24
24
  "@types/node": "^24.6.0",
25
25
  "typescript": "^5.9.3"
@@ -38,10 +38,42 @@
38
38
  "types": "./lib/index.d.ts",
39
39
  "default": "./lib/index.js"
40
40
  },
41
+ "./async-utils": {
42
+ "types": "./lib/src/async-utils.d.ts",
43
+ "default": "./lib/src/async-utils.js"
44
+ },
45
+ "./environment-utils": {
46
+ "types": "./lib/src/environment-utils.d.ts",
47
+ "default": "./lib/src/environment-utils.js"
48
+ },
49
+ "./error-utils": {
50
+ "types": "./lib/src/error-utils.d.ts",
51
+ "default": "./lib/src/error-utils.js"
52
+ },
53
+ "./function-utils": {
54
+ "types": "./lib/src/function-utils.d.ts",
55
+ "default": "./lib/src/function-utils.js"
56
+ },
57
+ "./hash": {
58
+ "types": "./lib/src/hash.d.ts",
59
+ "default": "./lib/src/hash.js"
60
+ },
61
+ "./log": {
62
+ "types": "./lib/src/log.d.ts",
63
+ "default": "./lib/src/log.js"
64
+ },
65
+ "./object": {
66
+ "types": "./lib/src/object.d.ts",
67
+ "default": "./lib/src/object.js"
68
+ },
69
+ "./string-utils": {
70
+ "types": "./lib/src/string-utils.d.ts",
71
+ "default": "./lib/src/string-utils.js"
72
+ },
41
73
  "./package.json": "./package.json"
42
74
  }
43
75
  },
44
- "version": "0.9.19",
76
+ "version": "0.9.28",
45
77
  "types": "./lib/index.d.ts",
46
78
  "type": "module",
47
79
  "exports": {
@@ -49,6 +81,38 @@
49
81
  "types": "./lib/index.d.ts",
50
82
  "default": "./lib/index.js"
51
83
  },
84
+ "./async-utils": {
85
+ "types": "./lib/src/async-utils.d.ts",
86
+ "default": "./lib/src/async-utils.js"
87
+ },
88
+ "./environment-utils": {
89
+ "types": "./lib/src/environment-utils.d.ts",
90
+ "default": "./lib/src/environment-utils.js"
91
+ },
92
+ "./error-utils": {
93
+ "types": "./lib/src/error-utils.d.ts",
94
+ "default": "./lib/src/error-utils.js"
95
+ },
96
+ "./function-utils": {
97
+ "types": "./lib/src/function-utils.d.ts",
98
+ "default": "./lib/src/function-utils.js"
99
+ },
100
+ "./hash": {
101
+ "types": "./lib/src/hash.d.ts",
102
+ "default": "./lib/src/hash.js"
103
+ },
104
+ "./log": {
105
+ "types": "./lib/src/log.d.ts",
106
+ "default": "./lib/src/log.js"
107
+ },
108
+ "./object": {
109
+ "types": "./lib/src/object.d.ts",
110
+ "default": "./lib/src/object.js"
111
+ },
112
+ "./string-utils": {
113
+ "types": "./lib/src/string-utils.d.ts",
114
+ "default": "./lib/src/string-utils.js"
115
+ },
52
116
  "./package.json": "./package.json"
53
117
  },
54
118
  "files": [
@@ -72,6 +72,7 @@ export async function mapConcurrent<T, R>(
72
72
  throw failures[0]!.reason;
73
73
  }
74
74
 
75
+ /** Select a bounded retry delay, clamping attempts to the configured schedule. */
75
76
  export function boundedRetryDelay(
76
77
  attempt: number,
77
78
  delaysMs: readonly number[] = DEFAULT_RETRY_DELAYS_MS,
@@ -0,0 +1,31 @@
1
+ import { toBoolean } from "./object.ts";
2
+
3
+ const MAX_TCP_PORT = 65_535;
4
+
5
+ function runtimeEnvironment(): Record<string, string | undefined> {
6
+ return (
7
+ globalThis as typeof globalThis & {
8
+ process?: { env?: Record<string, string | undefined> };
9
+ }
10
+ ).process?.env ?? {};
11
+ }
12
+
13
+ /** Detect a Databricks App runtime from its required name, host, and port. */
14
+ export function isDatabricksAppEnv(
15
+ source: Record<string, string | undefined> = runtimeEnvironment(),
16
+ ): boolean {
17
+ const override = toBoolean(source.DBX_TOOLS_DATABRICKS_APP_ENV);
18
+ if (override !== undefined) return override;
19
+ const name = source.DATABRICKS_APP_NAME?.trim();
20
+ const host = source.DATABRICKS_HOST?.trim();
21
+ const port = source.DATABRICKS_APP_PORT?.trim();
22
+ if (!name || /\$\{[^}]+\}/.test(name) || !host || !port || !/^\d+$/.test(port)) return false;
23
+ const parsedPort = Number(port);
24
+ if (!Number.isInteger(parsedPort) || parsedPort < 1 || parsedPort > MAX_TCP_PORT) return false;
25
+ try {
26
+ const url = new URL(host);
27
+ return (url.protocol === "http:" || url.protocol === "https:") && Boolean(url.hostname);
28
+ } catch {
29
+ return false;
30
+ }
31
+ }
package/src/object.ts CHANGED
@@ -528,6 +528,7 @@ export function at<T>(index: number, ...sources: readonly Source<T>[]): T | unde
528
528
  return undefined;
529
529
  }
530
530
 
531
+ /** Normalize one value or an existing value list into a value list. */
531
532
  export function toOneOrMany<T>(input: T | OneOrMany<T>): OneOrMany<T> {
532
533
  return Array.isArray(input) ? input : [input];
533
534
  }
@@ -1407,6 +1408,7 @@ function toEpochMs(value: unknown): number | undefined {
1407
1408
  */
1408
1409
  export type DeepEqualComparator = (a: unknown, b: unknown) => boolean | undefined;
1409
1410
 
1411
+ /** Compare nested values structurally with an optional recursive override. */
1410
1412
  export function deepEqual(a: unknown, b: unknown, comparator?: DeepEqualComparator): boolean {
1411
1413
  if (comparator) {
1412
1414
  const decided = comparator(a, b);
@@ -108,6 +108,7 @@ const IDENTIFIER_DEFAULTS: ResolvedIdentifierOptions = {
108
108
  delimiter: "-",
109
109
  };
110
110
 
111
+ /** Yield normalized tokens using explicit casing, URI, email, and deduplication rules. */
111
112
  export function* tokenizeWithOptions(
112
113
  options: TokenizeOptions,
113
114
  ...values: unknown[]
@@ -145,6 +146,7 @@ export function* tokenizeWithOptions(
145
146
  }
146
147
  }
147
148
 
149
+ /** Yield normalized tokens using the default tokenization rules. */
148
150
  export function* tokenize(...values: unknown[]): Generator<string> {
149
151
  yield* tokenizeWithOptions({}, ...values);
150
152
  }
@@ -186,6 +188,7 @@ export function toIdentifierWithOptions(options: IdentifierOptions, ...values: u
186
188
  return tokens.join(opts.delimiter);
187
189
  }
188
190
 
191
+ /** Convert arbitrary values into a normalized camel-case identifier. */
189
192
  export function toIdentifier(...values: unknown[]): string {
190
193
  return toIdentifierWithOptions({}, ...values);
191
194
  }
@@ -199,6 +202,7 @@ export function toSlugWithOptions(options: KeyOptions, ...values: unknown[]): st
199
202
  return toIdentifierWithOptions({ ...options, delimiter: "-" }, ...values);
200
203
  }
201
204
 
205
+ /** Convert arbitrary values into a normalized hyphen-delimited slug. */
202
206
  export function toSlug(...values: unknown[]): string {
203
207
  return toSlugWithOptions({}, ...values);
204
208
  }