@dbx-tools/shared-core 0.9.54 → 0.9.60

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/lib/src/net.js CHANGED
@@ -20,6 +20,8 @@ const URL_SCHEME_DEFAULT = "https";
20
20
  const URL_SCHEME_PREFIX = /^([A-Za-z][A-Za-z0-9+.-]*:\/\/)/;
21
21
  const URL_PATH_SEGMENT_TRIM = /^\/+|\/+$/g;
22
22
  const URL_SCHEME_SEPARATOR = "://";
23
+ /** Highest valid TCP port number. */
24
+ export const MAX_TCP_PORT = 65_535;
23
25
  /** Total bit width of an address of each {@link IpVersion}. */
24
26
  const IP_BITS = { 4: 32, 6: 128 };
25
27
  const IPV4_OCTET = /^\d{1,3}$/;
@@ -130,23 +132,6 @@ export function urlBuilder(input) {
130
132
  const url = parseUrl(input);
131
133
  return url ? urlBuilder(url) : undefined;
132
134
  }
133
- /**
134
- * Convenience wrapper over {@link UrlBuilder.pathMatches}: coerce
135
- * `input` via {@link urlBuilder} and test its pathname against `path`.
136
- * Returns `false` for input that can't be parsed into a URL.
137
- *
138
- * @example
139
- * pathMatch("/api/cool?q=1", "/api"); // true
140
- * pathMatch("/apicool", "/api"); // false
141
- * pathMatch("https://host/api", "/api"); // true
142
- * pathMatch(request, "/api/v2"); // fetch Request
143
- */
144
- export function pathMatch(input, path) {
145
- const urlb = urlBuilder(input);
146
- if (!urlb)
147
- return false;
148
- return urlb.pathMatches(path);
149
- }
150
135
  /**
151
136
  * Base origin for resolving path-only inputs. In a browser this is the
152
137
  * current page's origin (`window.location.origin`), so `urlBuilder("/api")`
@@ -464,4 +449,4 @@ function hextetsToValue(hextets) {
464
449
  value = (value << 16n) | BigInt(hextet);
465
450
  return value;
466
451
  }
467
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25ldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUlILE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbkQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7QUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxpQ0FBaUMsQ0FBQztBQUM1RCxNQUFNLHFCQUFxQixHQUFHLFlBQVksQ0FBQztBQUMzQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUVuQywrREFBK0Q7QUFDL0QsTUFBTSxPQUFPLEdBQXdDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkUsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDO0FBQy9CLE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDO0FBRXpDLG9FQUFvRTtBQUNwRSxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztBQUN2QyxvRUFBb0U7QUFDcEUsTUFBTSxhQUFhLEdBQUcsNEJBQTRCLENBQUM7QUFvRG5EOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWUsU0FBUSxHQUFHO0lBQzlCLFlBQVksR0FBUTtRQUNsQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUEyQixHQUFNLEVBQUUsS0FBd0I7UUFDN0QsTUFBTSxJQUFJ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QUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBuZXR3b3JraW5nIGhlbHBlcnMgYnVpbHQgYXJvdW5kIHtAbGluayB1cmxCdWlsZGVyfTogYVxuICogdG9sZXJhbnQgYFVSTGAgY29lcmNpb24gKyBjaGFpbmFibGUgYnVpbGRlciB0aGF0IGdyYWNlZnVsbHkgaGFuZGxlc1xuICogcGFydGlhbCBpbnB1dHMgKGJhcmUgaG9zdHMsIHBhdGgtb25seSBzdHJpbmdzLCBgeyB1cmwgfWAgd3JhcHBlcnMpLFxuICogYSBzbWFsbCBJUHY0IC8gSVB2NiBhZGRyZXNzICsgQ0lEUiB0b29sa2l0IChwYXJzaW5nIGFuZCBtZW1iZXJzaGlwXG4gKiBsb29rdXBzKSwgYW5kIGVtYWlsLWFkZHJlc3MgcGFyc2luZyAoe0BsaW5rIHBhcnNlRW1haWxzfSAvXG4gKiB7QGxpbmsgaXNFbWFpbH0pIHRoYXQgbm9ybWFsaXplcyB0aGUgQ1NWIC8gc2luZ2xlLXN0cmluZyAvIGFycmF5XG4gKiBpbnB1dHMgZW1haWwgcmVjaXBpZW50IGFuZCBhbGxvdy1saXN0IGZpZWxkcyBhY2NlcHQgaW50byBhIGNsZWFuXG4gKiBgc3RyaW5nW11gLiBObyBub2RlLW9ubHkgaW1wb3J0cywgc28gdGhpcyBtb2R1bGUgaXMgdGhlIGNhbm9uaWNhbFxuICogaG9tZSBmb3IgYW55dGhpbmcgVVJMLSwgSVAtLCBvciBlbWFpbC1zaGFwZWQgdGhhdCBhbHNvIGhhcyB0byBydW4gaW5cbiAqIGEgVml0ZSAvIFdlYnBhY2sgLyBlc2J1aWxkIGNsaWVudCBidW5kbGUuIE5vZGUtb25seSBuZXR3b3JrIGhlbHBlcnNcbiAqIChlLmcuIEROUyByZXNvbHV0aW9uKSBiZWxvbmcgaW4gYSBub2RlLXRhZ2dlZCBwYWNrYWdlLCBub3QgaGVyZS5cbiAqIFJldXNlIHRoaXMgbW9kdWxlIGZvciBVUkwsIElQL0NJRFIsIGFuZCBlbWFpbCBwYXJzaW5nIGluc3RlYWQgb2YgaW50cm9kdWNpbmdcbiAqIHBhY2thZ2UtbG9jYWwgbm9ybWFsaXplcnMgd2l0aCBzdWJ0bHkgZGlmZmVyZW50IHJ1bGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE5vbkZ1bmN0aW9uS2V5cyB9IGZyb20gXCIuL29iamVjdC50c1wiO1xuXG5jb25zdCBMT0NBTF9IT1NUX1VSTCA9IG5ldyBVUkwoXCJodHRwOi8vbG9jYWxob3N0XCIpO1xuY29uc3QgVVJMX1NDSEVNRV9ERUZBVUxUID0gXCJodHRwc1wiO1xuY29uc3QgVVJMX1NDSEVNRV9QUkVGSVggPSAvXihbQS1aYS16XVtBLVphLXowLTkrLi1dKjpcXC9cXC8pLztcbmNvbnN0IFVSTF9QQVRIX1NFR01FTlRfVFJJTSA9IC9eXFwvK3xcXC8rJC9nO1xuY29uc3QgVVJMX1NDSEVNRV9TRVBBUkFUT1IgPSBcIjovL1wiO1xuXG4vKiogVG90YWwgYml0IHdpZHRoIG9mIGFuIGFkZHJlc3Mgb2YgZWFjaCB7QGxpbmsgSXBWZXJzaW9ufS4gKi9cbmNvbnN0IElQX0JJVFM6IFJlYWRvbmx5PFJlY29yZDxJcFZlcnNpb24sIG51bWJlcj4+ID0geyA0OiAzMiwgNjogMTI4IH07XG5jb25zdCBJUFY0X09DVEVUID0gL15cXGR7MSwzfSQvO1xuY29uc3QgSVBWNl9IRVhURVQgPSAvXlswLTlhLWZBLUZdezEsNH0kLztcblxuLyoqIERlbGltaXRlcnMgYmV0d2VlbiBhZGRyZXNzZXMgaW4gYSBmcmVlLXRleHQgLyBDU1YgZW1haWwgbGlzdC4gKi9cbmNvbnN0IEVNQUlMX0xJU1RfU0VQQVJBVE9SID0gL1tcXHMsO10rLztcbi8qKiBQcmFnbWF0aWMgYGxvY2FsQGRvbWFpbi50bGRgIHNoYXBlIGNoZWNrIChub3QgZnVsbCBSRkMgNTMyMikuICovXG5jb25zdCBFTUFJTF9BRERSRVNTID0gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC87XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gVHlwZXNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEFueXRoaW5nIHtAbGluayB1cmxCdWlsZGVyfSAoYW5kIHtAbGluayBwYXRoTWF0Y2h9KSBrbm93IGhvdyB0byBjb2VyY2VcbiAqIGludG8gYSBVUkw6XG4gKlxuICogLSBBIHN0cmluZzogYSBob3N0LCBhIGZ1bGwgVVJMLCBvciBhIHBhdGggLyBxdWVyeSAvIGhhc2ggZnJhZ21lbnQuXG4gKiAtIEEgV0hBVFdHIGBVUkxgIGluc3RhbmNlLlxuICogLSBBbnkgb2JqZWN0IHdpdGggYSBgdXJsYCBmaWVsZCAoZS5nLiBhIGZldGNoIGBSZXF1ZXN0YCwgYSBEYXRhYnJpY2tzXG4gKiAgIGBXb3Jrc3BhY2VDbGllbnRgIGNvbmZpZykuXG4gKi9cbmV4cG9ydCB0eXBlIFVybExpa2UgPSBzdHJpbmcgfCBVUkwgfCB7IHVybDogc3RyaW5nIH07XG5cbi8qKiBJUCBwcm90b2NvbCBmYW1pbHk6IGA0YCBmb3IgSVB2NCwgYDZgIGZvciBJUHY2LiAqL1xuZXhwb3J0IHR5cGUgSXBWZXJzaW9uID0gNCB8IDY7XG5cbi8qKlxuICogQSBwYXJzZWQgSVAgYWRkcmVzcy4gYHZhbHVlYCBpcyB0aGUgYWRkcmVzcyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyXG4gKiAoYSAzMi1iaXQgcmFuZ2UgZm9yIHY0LCAxMjgtYml0IGZvciB2NikgaGVsZCBpbiBhIGBiaWdpbnRgIHNvIGJvdGhcbiAqIGZhbWlsaWVzIHNoYXJlIG9uZSBjb21wYXJpc29uIC8gbWFza2luZyBwYXRoLiBQcm9kdWNlIG9uZSB3aXRoXG4gKiB7QGxpbmsgcGFyc2VJcH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkSXAge1xuICB2ZXJzaW9uOiBJcFZlcnNpb247XG4gIC8qKiBUaGUgYWRkcmVzcyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIChgYmlnaW50YCBmb3IgdW5pZm9ybSB2NC92NiBtYXRoKS4gKi9cbiAgdmFsdWU6IGJpZ2ludDtcbn1cblxuLyoqXG4gKiBBIHBhcnNlZCBDSURSIGJsb2NrIChgMTAuMC4wLjAvOGAsIGAyMDAxOmRiODo6LzMyYCkuIGBiYXNlYCBpcyB0aGVcbiAqIG5ldHdvcmsgYWRkcmVzcyB3aXRoIGFsbCBob3N0IGJpdHMgY2xlYXJlZCwgc28gbWVtYmVyc2hpcCBpcyBhXG4gKiBzaW5nbGUgbWFza2VkIGNvbXBhcmUgKHNlZSB7QGxpbmsgaXBJbkNpZHJ9KS4gUHJvZHVjZSBvbmUgd2l0aFxuICoge0BsaW5rIHBhcnNlQ2lkcn0uIENhcnJpZXMgdGhlIG5vcm1hbGl6ZWQgYGNpZHJgIHN0cmluZyBmb3IgbG9nZ2luZ1xuICogYW5kIHRvIGtleSBiYWNrIHRvIGNhbGxlci1zaWRlIG1ldGFkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENpZHIge1xuICB2ZXJzaW9uOiBJcFZlcnNpb247XG4gIC8qKiBOZXR3b3JrIGFkZHJlc3MgKGhvc3QgYml0cyB6ZXJvZWQpIGFzIGFuIHVuc2lnbmVkIGBiaWdpbnRgLiAqL1xuICBiYXNlOiBiaWdpbnQ7XG4gIC8qKiBQcmVmaXggbGVuZ3RoIGluIGJpdHMgKHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGAvYCkuICovXG4gIHByZWZpeDogbnVtYmVyO1xuICAvKiogTm9ybWFsaXplZCBgPGFkZHJlc3M+LzxwcmVmaXg+YCBzdHJpbmcuICovXG4gIGNpZHI6IHN0cmluZztcbn1cblxuLyoqIFNldHRhYmxlLCBub24tbWV0aG9kIGBVUkxgIHByb3BlcnRpZXMgLSB0aGUga2V5cyB7QGxpbmsgVXJsQnVpbGRlci53aXRofSBhY2NlcHRzLiAqL1xudHlwZSBVcmxQcm9wZXJ0eUtleSA9IE5vbkZ1bmN0aW9uS2V5czxVcmxCdWlsZGVySW1wbD47XG5cbi8qKlxuICogQSBgVVJMYCBzdWJjbGFzcyB3aXRoIGNoYWluYWJsZSwgY29weS1vbi13cml0ZSBoZWxwZXJzLiBFdmVyeSBtdXRhdGluZ1xuICogbWV0aG9kIHJldHVybnMgYSBmcmVzaCBidWlsZGVyIHJhdGhlciB0aGFuIGVkaXRpbmcgaW4gcGxhY2UsIHNvIGEgYmFzZVxuICogYnVpbGRlciBjYW4gYmUgc2FmZWx5IHJldXNlZC4gQ29uc3RydWN0IG9uZSB2aWEge0BsaW5rIHVybEJ1aWxkZXJ9LlxuICovXG5jbGFzcyBVcmxCdWlsZGVySW1wbCBleHRlbmRzIFVSTCB7XG4gIGNvbnN0cnVjdG9yKHVybDogVVJMKSB7XG4gICAgc3VwZXIodXJsKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2NoZW1lIHdpdGhvdXQgdGhlIHRyYWlsaW5nIGNvbG9uIChgaHR0cHNgLCBub3QgYGh0dHBzOmApLiAqL1xuICBnZXQgc2NoZW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2wuc2xpY2UoMCwgLTEpO1xuICB9XG5cbiAgc2V0IHNjaGVtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wcm90b2NvbCA9IHZhbHVlICsgXCI6XCI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgY29weSB3aXRoIGEgc2luZ2xlIGBVUkxgIHByb3BlcnR5IChgcGF0aG5hbWVgLCBgc2VhcmNoYCxcbiAgICogYGhvc3RuYW1lYCwgYHNjaGVtZWAsIC4uLikgc2V0IHRvIGB2YWx1ZWAsIGxlYXZpbmcgdGhpcyBidWlsZGVyXG4gICAqIHVudG91Y2hlZC5cbiAgICovXG4gIHdpdGg8SyBleHRlbmRzIFVybFByb3BlcnR5S2V5PihrZXk6IEssIHZhbHVlOiBVcmxCdWlsZGVySW1wbFtLXSk6IFVybEJ1aWxkZXIge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgVXJsQnVpbGRlckltcGwodGhpcyk7XG4gICAgKG5leHQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIG5ldyBVcmxCdWlsZGVySW1wbChuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjb3B5IHdpdGggYHBhdGhTZWdtZW50c2AgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgcGF0aG5hbWUuXG4gICAqIFNlZ21lbnRzIG1heSBiZSBzdHJpbmdzIG9yIHN0cmluZyBhcnJheXM7IGVhY2ggaXMgdHJpbW1lZCBvZlxuICAgKiBib3VuZGFyeSBzbGFzaGVzIGFuZCBibGFua3MgYXJlIGRyb3BwZWQgYmVmb3JlIGpvaW5pbmcgd2l0aCBgL2AuXG4gICAqL1xuICB3aXRoUGF0aEFwcGVuZCguLi5wYXRoU2VnbWVudHM6IChzdHJpbmcgfCBzdHJpbmdbXSlbXSk6IFVybEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLndpdGhQYXRoUmVwbGFjZSh0aGlzLnBhdGhuYW1lLCAuLi5wYXRoU2VnbWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNvcHkgd2hvc2UgcGF0aG5hbWUgaXMgYHBhdGhTZWdtZW50c2Agam9pbmVkIHdpdGggYC9gLFxuICAgKiByZXBsYWNpbmcgYW55IGV4aXN0aW5nIHBhdGguIFNlZ21lbnRzIG1heSBiZSBzdHJpbmdzIG9yIHN0cmluZ1xuICAgKiBhcnJheXM7IGVhY2ggaXMgdHJpbW1lZCBvZiBib3VuZGFyeSBzbGFzaGVzIGFuZCBibGFua3MgYXJlIGRyb3BwZWQuXG4gICAqL1xuICB3aXRoUGF0aFJlcGxhY2UoLi4ucGF0aFNlZ21lbnRzOiAoc3RyaW5nIHwgc3RyaW5nW10pW10pOiBVcmxCdWlsZGVyIHtcbiAgICBjb25zdCBwYXRobmFtZVBhcnRzOiBzdHJpbmdbXSA9IFsuLi5wYXRoU2VnbWVudHNdLmZsYXRNYXAoKHApID0+IChBcnJheS5pc0FycmF5KHApID8gcCA6IFtwXSkpO1xuICAgIGNvbnN0IHBhdGhuYW1lID0gcGF0aG5hbWVQYXJ0c1xuICAgICAgLm1hcCgocCkgPT4gcC5yZXBsYWNlKFVSTF9QQVRIX1NFR01FTlRfVFJJTSwgXCJcIikpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbihcIi9cIik7XG4gICAgcmV0dXJuIHRoaXMud2l0aChcInBhdGhuYW1lXCIsIFwiL1wiICsgcGF0aG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3Qgd2hldGhlciB0aGlzIFVSTCdzIHBhdGhuYW1lIGlzIGBwYXRoYCBvciBsaXZlcyBiZW5lYXRoIGl0LFxuICAgKiBtYXRjaGluZyBvbiBzZWdtZW50IGJvdW5kYXJpZXMgc28gYC9hcGlgIG1hdGNoZXMgYC9hcGlgIGFuZFxuICAgKiBgL2FwaS9jb29sYCBidXQgbm90IGAvYXBpY29vbGAuIEEgbWlzc2luZyBsZWFkaW5nIHNsYXNoIG9uIGBwYXRoYFxuICAgKiBpcyB0b2xlcmF0ZWQ7IHF1ZXJ5IGFuZCBoYXNoIGFyZSBpZ25vcmVkICh0aGV5IGFyZW4ndCBwYXJ0IG9mXG4gICAqIGBwYXRobmFtZWApLiBNYXRjaGluZyBpcyBleGFjdCBvdGhlcndpc2UgLSB0cmFpbGluZyBzbGFzaGVzIGFyZVxuICAgKiBub3Qgbm9ybWFsaXplZCBhbmQgYC9gIG1hdGNoZXMgb25seSB0aGUgcm9vdC5cbiAgICovXG4gIHBhdGhNYXRjaGVzKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGhuYW1lID0gdGhpcy5wYXRobmFtZTtcbiAgICBpZiAocGF0aG5hbWUgPT0gcGF0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSBwYXRoID0gXCIvXCIgKyBwYXRoO1xuICAgIGlmIChwYXRobmFtZSA9PSBwYXRoKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gcGF0aG5hbWUuc3RhcnRzV2l0aChwYXRoICsgXCIvXCIpO1xuICB9XG59XG5cbi8qKiBQdWJsaWMgdHlwZSBmb3IgdGhlIHtAbGluayB1cmxCdWlsZGVyfSByZXR1cm4gdmFsdWUuICovXG5leHBvcnQgdHlwZSBVcmxCdWlsZGVyID0gVXJsQnVpbGRlckltcGw7XG5cbi8qKiBXaXRoIG5vIGFyZ3VtZW50LCByZXNvbHZlcyB0byB0aGUgYmFzZSBvcmlnaW4gKG5ldmVyIGBudWxsYCkuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsQnVpbGRlcigpOiBVcmxCdWlsZGVyO1xuXG4vKipcbiAqIENvZXJjZSBhIHtAbGluayBVcmxMaWtlfSBpbnRvIGEgY2hhaW5hYmxlIHtAbGluayBVcmxCdWlsZGVyfSwgb3IgYG51bGxgXG4gKiB3aGVuIHRoZSBpbnB1dCBjYW5ub3QgYmUgcGFyc2VkIGludG8gYSBVUkwuIE5ldmVyIHRocm93cy5cbiAqXG4gKiAtIEEgYFVSTGAgaW5zdGFuY2Ugb3IgYHsgdXJsIH1gIHdyYXBwZXIgaXMgYWRvcHRlZCBhcy1pcy5cbiAqIC0gQSBiYXJlIGhvc3RuYW1lIChgXCJleGFtcGxlLmNvbVwiYCkgaXMgdXBncmFkZWQgdG8gYGh0dHBzOi8vYDsgYW5cbiAqICAgZXhwbGljaXQgc2NoZW1lIGlzIHByZXNlcnZlZC5cbiAqIC0gQSBwYXRoIC8gcXVlcnkgLyBoYXNoIGZyYWdtZW50IChgXCIvYXBpXCJgLCBgXCI/cT0xXCJgLCBgXCIjeFwiYCkgaXNcbiAqICAgcmVzb2x2ZWQgYWdhaW5zdCB7QGxpbmsgZGVmYXVsdFVybH0gKHRoZSBicm93c2VyIG9yaWdpbiwgZWxzZVxuICogICBgaHR0cDovL2xvY2FsaG9zdGApLlxuICogLSBBbiBlbXB0eSAvIGJsYW5rIHN0cmluZyBvciBvbWl0dGVkIGlucHV0IHJlc29sdmVzIHRvIHRoZSBiYXNlXG4gKiAgIG9yaWdpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogdXJsQnVpbGRlcihcImV4YW1wbGUuY29tXCIpOyAgICAgICAgICAvLyBodHRwczovL2V4YW1wbGUuY29tL1xuICogdXJsQnVpbGRlcihcImh0dHA6Ly94L3BhdGhcIik7ICAgICAgICAvLyBodHRwOi8veC9wYXRoXG4gKiB1cmxCdWlsZGVyKFwiL2FwaS92MlwiKTsgICAgICAgICAgICAgIC8vIGh0dHA6Ly9sb2NhbGhvc3QvYXBpL3YyXG4gKiB1cmxCdWlsZGVyKHsgdXJsOiBcImh0dHA6Ly95XCIgfSk7ICAgIC8vIGh0dHA6Ly95L1xuICogdXJsQnVpbGRlcigpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL2xvY2FsaG9zdC9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybEJ1aWxkZXIoaW5wdXQ/OiBVcmxMaWtlKTogVXJsQnVpbGRlciB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIHVybEJ1aWxkZXIoaW5wdXQ/OiBVcmxMaWtlKTogVXJsQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHJldHVybiBuZXcgVXJsQnVpbGRlckltcGwoaW5wdXQpO1xuICB9XG4gIGlmIChpbnB1dCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgXCJ1cmxcIiBpbiBpbnB1dCkge1xuICAgIGlucHV0ID0gaW5wdXQudXJsO1xuICB9XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpbnB1dCA9IGlucHV0LnRyaW0oKTtcbiAgfVxuICBpZiAoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcIi9cIikgfHwgaW5wdXQuc3RhcnRzV2l0aChcIj9cIikgfHwgaW5wdXQuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgIGNvbnN0IGpvaW5lZFVybCA9IGRlZmF1bHRVcmwoKS50b1N0cmluZygpLnNsaWNlKDAsIC0xKSArIGlucHV0O1xuICAgICAgcmV0dXJuIHVybEJ1aWxkZXIoam9pbmVkVXJsKTtcbiAgICB9IGVsc2UgaWYgKGlucHV0LnN0YXJ0c1dpdGgoVVJMX1NDSEVNRV9TRVBBUkFUT1IpKSB7XG4gICAgICBpbnB1dCA9IGAke1VSTF9TQ0hFTUVfREVGQVVMVH0ke2lucHV0fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goVVJMX1NDSEVNRV9QUkVGSVgpO1xuICAgICAgY29uc3Qgc2NoZW1lUHJlZml4ID0gbWF0Y2g/LlsxXTtcbiAgICAgIGlmIChzY2hlbWVQcmVmaXgpIHtcbiAgICAgICAgY29uc3QgcmVzdCA9IGlucHV0LnNsaWNlKHNjaGVtZVByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpbnB1dCA9IGAke3NjaGVtZVByZWZpeH0ke3Jlc3QgfHwgZGVmYXVsdFVybCgpLmhvc3RuYW1lfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dCA9IGAke1VSTF9TQ0hFTUVfREVGQVVMVH06Ly8ke2lucHV0fWA7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB1cmxCdWlsZGVyKGRlZmF1bHRVcmwoKSk7XG4gIH1cbiAgY29uc3QgdXJsID0gcGFyc2VVcmwoaW5wdXQpO1xuICByZXR1cm4gdXJsID8gdXJsQnVpbGRlcih1cmwpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgb3ZlciB7QGxpbmsgVXJsQnVpbGRlci5wYXRoTWF0Y2hlc306IGNvZXJjZVxuICogYGlucHV0YCB2aWEge0BsaW5rIHVybEJ1aWxkZXJ9IGFuZCB0ZXN0IGl0cyBwYXRobmFtZSBhZ2FpbnN0IGBwYXRoYC5cbiAqIFJldHVybnMgYGZhbHNlYCBmb3IgaW5wdXQgdGhhdCBjYW4ndCBiZSBwYXJzZWQgaW50byBhIFVSTC5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGF0aE1hdGNoKFwiL2FwaS9jb29sP3E9MVwiLCBcIi9hcGlcIik7ICAgICAgLy8gdHJ1ZVxuICogcGF0aE1hdGNoKFwiL2FwaWNvb2xcIiwgXCIvYXBpXCIpOyAgICAgICAgICAgLy8gZmFsc2VcbiAqIHBhdGhNYXRjaChcImh0dHBzOi8vaG9zdC9hcGlcIiwgXCIvYXBpXCIpOyAgIC8vIHRydWVcbiAqIHBhdGhNYXRjaChyZXF1ZXN0LCBcIi9hcGkvdjJcIik7ICAgICAgICAgICAvLyBmZXRjaCBSZXF1ZXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRoTWF0Y2goaW5wdXQ6IFVybExpa2UsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB1cmxiID0gdXJsQnVpbGRlcihpbnB1dCk7XG4gIGlmICghdXJsYikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdXJsYi5wYXRoTWF0Y2hlcyhwYXRoKTtcbn1cblxuLyoqXG4gKiBCYXNlIG9yaWdpbiBmb3IgcmVzb2x2aW5nIHBhdGgtb25seSBpbnB1dHMuIEluIGEgYnJvd3NlciB0aGlzIGlzIHRoZVxuICogY3VycmVudCBwYWdlJ3Mgb3JpZ2luIChgd2luZG93LmxvY2F0aW9uLm9yaWdpbmApLCBzbyBgdXJsQnVpbGRlcihcIi9hcGlcIilgXG4gKiByZWZsZWN0cyB3aGVyZSB0aGUgYXBwIGlzIGFjdHVhbGx5IHNlcnZlZCBmcm9tOyBvbiB0aGUgc2VydmVyIC8gaW5cbiAqIHRlc3RzIChubyBgd2luZG93YCwgb3IgYW4gb3BhcXVlIGBcIm51bGxcImAgb3JpZ2luKSBpdCBmYWxscyBiYWNrIHRvXG4gKiBgaHR0cDovL2xvY2FsaG9zdGAuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRVcmwoKTogVVJMIHtcbiAgLy8gUmVhY2ggYHdpbmRvd2AgdmlhIGBnbG9iYWxUaGlzYCBzbyB0aGlzIGNvbXBpbGVzIHdpdGhvdXQgdGhlIERPTVxuICAvLyBsaWIgKGl0J3MgYHVuZGVmaW5lZGAgb24gdGhlIHNlcnZlciAvIGluIHdvcmtlcnMgd2l0aG91dCBvbmUpLlxuICBjb25zdCBvcmlnaW4gPSAoZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHsgbG9jYXRpb24/OiB7IG9yaWdpbj86IHN0cmluZyB9IH0gfSkud2luZG93Py5sb2NhdGlvblxuICAgID8ub3JpZ2luO1xuICBpZiAob3JpZ2luICYmIG9yaWdpbiAhPT0gXCJudWxsXCIpIHtcbiAgICBjb25zdCBvcmlnaW5VcmwgPSBwYXJzZVVybChvcmlnaW4pO1xuICAgIGlmIChvcmlnaW5VcmwpIHtcbiAgICAgIHJldHVybiBvcmlnaW5Vcmw7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgVVJMKExPQ0FMX0hPU1RfVVJMKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VVcmwoaW5wdXQ6IHN0cmluZyk6IFVSTCB8IG51bGwge1xuICBpZiAoaW5wdXQgJiYgaW5wdXQuaW5jbHVkZXMoVVJMX1NDSEVNRV9TRVBBUkFUT1IpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgVVJMKGlucHV0KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRW1haWwgYWRkcmVzc2VzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBwYXJzZUVtYWlsc30uICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlRW1haWxzT3B0aW9ucyB7XG4gIC8qKiBMb3dlci1jYXNlIGV2ZXJ5IGFkZHJlc3MgKHVzZWZ1bCBmb3IgYWxsb3ctbGlzdHMgLyBtYXRjaGluZykuIE9mZiBieSBkZWZhdWx0LiAqL1xuICBsb3dlcmNhc2U/OiBib29sZWFuO1xuICAvKipcbiAgICogRHJvcCBsYXRlciBjYXNlLWluc2Vuc2l0aXZlIGR1cGxpY2F0ZXMsIGtlZXBpbmcgZmlyc3Qtc2VlbiBjYXNpbmcuXG4gICAqIE9uIGJ5IGRlZmF1bHQgLSBhIHJlY2lwaWVudCBvciBwYXR0ZXJuIGxpc3QgcmFyZWx5IHdhbnRzIHJlcGVhdHMuXG4gICAqL1xuICBkZWR1cGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgc2hhcGVzIGFuIGVtYWlsIGFkZHJlc3MgZmllbGQgYWNjZXB0cyAtIGEgc2luZ2xlIHN0cmluZyxcbiAqIGEgY29tbWEgLyBzZW1pY29sb24gLyB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBsaXN0LCBhbiBhcnJheSBvZiBlaXRoZXIsXG4gKiBvciBub3RoaW5nIC0gaW50byBhIGNsZWFuIGBzdHJpbmdbXWAuIEVhY2ggZW50cnkgaXMgc3BsaXQgb24gdGhlIGxpc3RcbiAqIHNlcGFyYXRvcnMsIHRyaW1tZWQsIGFuZCBkZS1lbXB0aWVkOyBibGFua3MgYW5kIG5vbi1zdHJpbmcgYXJyYXlcbiAqIG1lbWJlcnMgYXJlIGRyb3BwZWQuIEJ5IGRlZmF1bHQgZHVwbGljYXRlcyBhcmUgcmVtb3ZlZFxuICogY2FzZS1pbnNlbnNpdGl2ZWx5IChmaXJzdC1zZWVuIGNhc2luZyB3aW5zKSBhbmQgY2FzaW5nIGlzIG90aGVyd2lzZVxuICogcHJlc2VydmVkOyBwYXNzIGBsb3dlcmNhc2VgIHRvIGZvbGQgZXZlcnl0aGluZyB0byBsb3dlciBjYXNlIChlLmcuIGZvclxuICogYW4gYWxsb3ctbGlzdCkuIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSByZWNpcGllbnQgbGlzdHMsIENDL0JDQyBpbnB1dHMsXG4gKiBhbmQgc2VuZGVyIGFsbG93LWxpc3RzIGFjcm9zcyB0aGUgcmVwbyBhZ3JlZSBvbiBob3cgZnJlZS10ZXh0IGVtYWlsXG4gKiBpbnB1dCBpcyByZWFkLiBOZXZlciB0aHJvd3M7IGRvZXMgbm90IHZhbGlkYXRlIC0gcGFpciB3aXRoXG4gKiB7QGxpbmsgaXNFbWFpbH0gd2hlbiB5b3UgbmVlZCB0byByZWplY3QgbWFsZm9ybWVkIGFkZHJlc3Nlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGFyc2VFbWFpbHMoXCJhQHguY29tLCBiQHkuY29tOyBhQHguY29tXCIpOyAvLyBbXCJhQHguY29tXCIsIFwiYkB5LmNvbVwiXVxuICogcGFyc2VFbWFpbHMoW1wiQUB4LmNvbVwiLCBcIiBiQHkuY29tIFwiXSk7ICAgICAgLy8gW1wiQUB4LmNvbVwiLCBcImJAeS5jb21cIl1cbiAqIHBhcnNlRW1haWxzKFwiKkBjb3JwLmNvbVwiLCB7IGxvd2VyY2FzZTogdHJ1ZSB9KTsgLy8gW1wiKkBjb3JwLmNvbVwiXVxuICogcGFyc2VFbWFpbHModW5kZWZpbmVkKTsgICAgICAgICAgICAgICAgICAgICAvLyBbXVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFbWFpbHMoXG4gIGlucHV0OiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IFBhcnNlRW1haWxzT3B0aW9ucyA9IHt9LFxuKTogc3RyaW5nW10ge1xuICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICBjb25zdCB7IGxvd2VyY2FzZSA9IGZhbHNlLCBkZWR1cGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuICBjb25zdCBlbnRyaWVzID0gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dCBhcyBzdHJpbmddO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBlbnRyeS5zcGxpdChFTUFJTF9MSVNUX1NFUEFSQVRPUikpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSB0b2tlbi50cmltKCk7XG4gICAgICBpZiAoIXRyaW1tZWQpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGxvd2VyY2FzZSA/IHRyaW1tZWQudG9Mb3dlckNhc2UoKSA6IHRyaW1tZWQ7XG4gICAgICBpZiAoZGVkdXBlKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goYWRkcmVzcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUHJhZ21hdGljIGBsb2NhbEBkb21haW4udGxkYCBzaGFwZSBjaGVjazogbm9uLWVtcHR5IGxvY2FsIGFuZCBkb21haW5cbiAqIHBhcnRzIGFyb3VuZCBhIHNpbmdsZSBgQGAsIHdpdGggYSBkb3R0ZWQgZG9tYWluIGFuZCBubyB3aGl0ZXNwYWNlLlxuICogRGVsaWJlcmF0ZWx5IGxvb3NlIChub3QgZnVsbCBSRkMgNTMyMikgLSBlbm91Z2ggdG8gY2F0Y2ggb2J2aW91cyB0eXBvc1xuICogYW5kIGdpdmUgQ0xJIC8gZm9ybSBmZWVkYmFjaywgbm90IHRvIGdhdGUgZGVsaXZlcnkuIFRyaW1zIGZpcnN0LiBUaGlzXG4gKiBpcyBhIHB1cmVseSBzeW50YWN0aWMgdGVzdCwgc28gYSB3aWxkY2FyZCBhbGxvdy1saXN0IHBhdHRlcm4gbGlrZVxuICogYCpAZXhhbXBsZS5jb21gIHBhc3NlczsgZGlzdGluZ3Vpc2hpbmcgYSBwYXR0ZXJuIGZyb20gYSByZWFsIGFkZHJlc3NcbiAqIGlzIHRoZSBzZW5kZXIgcG9saWN5J3Mgam9iLCBub3QgdGhpcyB2YWxpZGF0b3Incy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaXNFbWFpbChcImFsaWNlQGV4YW1wbGUuY29tXCIpOyAvLyB0cnVlXG4gKiBpc0VtYWlsKFwibm9wZVwiKTsgICAgICAgICAgICAgIC8vIGZhbHNlIChubyBAKVxuICogaXNFbWFpbChcIm5vQGRvbWFpblwiKTsgICAgICAgICAvLyBmYWxzZSAobm8gZG90dGVkIGRvbWFpbilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1haWwodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU1BSUxfQUREUkVTUy50ZXN0KHZhbHVlLnRyaW0oKSk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSVAgYWRkcmVzc2VzIGFuZCBDSURSIGJsb2Nrc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUGFyc2UgYW4gSVB2NCAoYFwiMS4yLjMuNFwiYCkgb3IgSVB2NiAoYFwiMjAwMTpkYjg6OjFcImAsXG4gKiBgXCI6OmZmZmY6MS4yLjMuNFwiYCwgYFwiOjoxXCJgKSBhZGRyZXNzIGludG8gYSB7QGxpbmsgUGFyc2VkSXB9LCBvclxuICogYG51bGxgIHdoZW4gdGhlIGlucHV0IGlzbid0IGEgdmFsaWQgbGl0ZXJhbC4gTmV2ZXIgdGhyb3dzLiBTdXJyb3VuZGluZ1xuICogd2hpdGVzcGFjZSwgYFsuLi5dYCBicmFja2V0cyBhcm91bmQgYW4gSVB2NiBsaXRlcmFsLCBhbmQgYW4gSVB2NiB6b25lXG4gKiBpZCAoYGZlODA6OjElZXRoMGApIGFyZSBhbGwgdG9sZXJhdGVkLiBUaGUgYHZhbHVlYCBpcyByZXR1cm5lZCBhcyBhXG4gKiBgYmlnaW50YCBzbyB2NCBhbmQgdjYgc2hhcmUgb25lIGNvbXBhcmlzb24gcGF0aC5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGFyc2VJcChcIjEwLjAuMC4xXCIpOyAgICAgICAgLy8geyB2ZXJzaW9uOiA0LCB2YWx1ZTogMTY3NzcyMTYxbiB9XG4gKiBwYXJzZUlwKFwiMjAwMTpkYjg6OjFcIik7ICAgICAvLyB7IHZlcnNpb246IDYsIHZhbHVlOiAuLi4gfVxuICogcGFyc2VJcChcIm5vdC1hbi1pcFwiKTsgICAgICAgLy8gbnVsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJcChpbnB1dDogc3RyaW5nKTogUGFyc2VkSXAgfCBudWxsIHtcbiAgbGV0IHRleHQgPSBpbnB1dC50cmltKCk7XG4gIGlmICh0ZXh0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHRleHQuZW5kc1dpdGgoXCJdXCIpKSB0ZXh0ID0gdGV4dC5zbGljZSgxLCAtMSk7XG4gIGlmICh0ZXh0LmluY2x1ZGVzKFwiOlwiKSkge1xuICAgIC8vIERyb3AgYW4gSVB2NiB6b25lIGlkIChgZmU4MDo6MSVldGgwYCkgLSBpdCBpc24ndCBwYXJ0IG9mIHRoZSBhZGRyZXNzLlxuICAgIGNvbnN0IHpvbmUgPSB0ZXh0LmluZGV4T2YoXCIlXCIpO1xuICAgIGlmICh6b25lID49IDApIHRleHQgPSB0ZXh0LnNsaWNlKDAsIHpvbmUpO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJcHY2KHRleHQpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiB7IHZlcnNpb246IDYsIHZhbHVlIH07XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBwYXJzZUlwdjQodGV4dCk7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiB7IHZlcnNpb246IDQsIHZhbHVlIH07XG59XG5cbi8qKlxuICogUGFyc2UgYSBDSURSIGJsb2NrIChgXCIxMC4wLjAuMC84XCJgLCBgXCIyMDAxOmRiODo6LzMyXCJgKSBpbnRvIGFcbiAqIHtAbGluayBDaWRyfSB3aXRoIGhvc3QgYml0cyBjbGVhcmVkIGZyb20gYGJhc2VgLCBvciBgbnVsbGAgd2hlbiB0aGVcbiAqIGlucHV0IGlzbid0IGEgdmFsaWQgYmxvY2sgKGJhZCBhZGRyZXNzLCBtaXNzaW5nIC8gb3V0LW9mLXJhbmdlXG4gKiBwcmVmaXgpLiBOZXZlciB0aHJvd3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlQ2lkcihcIjEwLjAuMC4wLzhcIik/LmJhc2U7ICAgLy8gMTY3NzcyMTYwbiAoMTAuMC4wLjApXG4gKiBwYXJzZUNpZHIoXCIxMC4xLjIuMy84XCIpPy5iYXNlOyAgIC8vIDE2Nzc3MjE2MG4gKGhvc3QgYml0cyBkcm9wcGVkKVxuICogcGFyc2VDaWRyKFwiMTAuMC4wLjAvNDBcIik7ICAgICAgICAvLyBudWxsIChwcmVmaXggPiAzMiBmb3IgdjQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNpZHIoaW5wdXQ6IHN0cmluZyk6IENpZHIgfCBudWxsIHtcbiAgY29uc3QgdGV4dCA9IGlucHV0LnRyaW0oKTtcbiAgY29uc3Qgc2xhc2ggPSB0ZXh0Lmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgaWYgKHNsYXNoIDwgMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHByZWZpeFRleHQgPSB0ZXh0LnNsaWNlKHNsYXNoICsgMSk7XG4gIGlmICghSVBWNF9PQ1RFVC50ZXN0KHByZWZpeFRleHQpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaXAgPSBwYXJzZUlwKHRleHQuc2xpY2UoMCwgc2xhc2gpKTtcbiAgaWYgKCFpcCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHByZWZpeCA9IE51bWJlcihwcmVmaXhUZXh0KTtcbiAgY29uc3QgYml0cyA9IElQX0JJVFNbaXAudmVyc2lvbl07XG4gIGlmIChwcmVmaXggPiBiaXRzKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYmFzZSA9IGlwLnZhbHVlICYgbmV0d29ya01hc2soYml0cywgcHJlZml4KTtcbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiBpcC52ZXJzaW9uLFxuICAgIGJhc2UsXG4gICAgcHJlZml4LFxuICAgIGNpZHI6IGAke3RleHQuc2xpY2UoMCwgc2xhc2gpfS8ke3ByZWZpeH1gLFxuICB9O1xufVxuXG4vKipcbiAqIFRlc3Qgd2hldGhlciBgaXBgIGZhbGxzIGluc2lkZSBgY2lkcmAuIEJvdGggYXJndW1lbnRzIGFjY2VwdCBlaXRoZXJcbiAqIGEgc3RyaW5nIChwYXJzZWQgb24gdGhlIGZseSB2aWEge0BsaW5rIHBhcnNlSXB9IC8ge0BsaW5rIHBhcnNlQ2lkcn0pXG4gKiBvciBhbiBhbHJlYWR5LXBhcnNlZCB2YWx1ZSAtIHBhc3MgcGFyc2VkIHZhbHVlcyBpbiBob3QgbG9vcHMgdG8gc2tpcFxuICogcmUtcGFyc2luZy4gUmV0dXJucyBgZmFsc2VgIGZvciB1bnBhcnNlYWJsZSBpbnB1dCBvciBhIHZlcnNpb25cbiAqIG1pc21hdGNoIChhbiBJUHY0IGFkZHJlc3MgaXMgbmV2ZXIgaW5zaWRlIGFuIElQdjYgYmxvY2spLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpcEluQ2lkcihcIjEwLjEuMi4zXCIsIFwiMTAuMC4wLjAvOFwiKTsgICAvLyB0cnVlXG4gKiBpcEluQ2lkcihcIjExLjAuMC4xXCIsIFwiMTAuMC4wLjAvOFwiKTsgICAvLyBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXBJbkNpZHIoaXA6IHN0cmluZyB8IFBhcnNlZElwLCBjaWRyOiBzdHJpbmcgfCBDaWRyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlZElwID0gdHlwZW9mIGlwID09PSBcInN0cmluZ1wiID8gcGFyc2VJcChpcCkgOiBpcDtcbiAgY29uc3QgcGFyc2VkQ2lkciA9IHR5cGVvZiBjaWRyID09PSBcInN0cmluZ1wiID8gcGFyc2VDaWRyKGNpZHIpIDogY2lkcjtcbiAgaWYgKCFwYXJzZWRJcCB8fCAhcGFyc2VkQ2lkciB8fCBwYXJzZWRJcC52ZXJzaW9uICE9PSBwYXJzZWRDaWRyLnZlcnNpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgbWFzayA9IG5ldHdvcmtNYXNrKElQX0JJVFNbcGFyc2VkQ2lkci52ZXJzaW9uXSwgcGFyc2VkQ2lkci5wcmVmaXgpO1xuICByZXR1cm4gKHBhcnNlZElwLnZhbHVlICYgbWFzaykgPT09IHBhcnNlZENpZHIuYmFzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGZpcnN0IENJRFIgaW4gYGNpZHJzYCB0aGF0IGNvbnRhaW5zIGBpcGAsIG9yIGBudWxsYCB3aGVuXG4gKiBub25lIG1hdGNoLiBgY2lkcnNgIGhvbGRzIHByZS1wYXJzZWQge0BsaW5rIENpZHJ9IHZhbHVlcyAob3IgYW55XG4gKiBvYmplY3QgZXh0ZW5kaW5nIGl0KSwgc28gY2FsbGVycyBjYW4gY2Fycnkgc2lkZSBtZXRhZGF0YSBvbiBlYWNoXG4gKiBlbnRyeSAoZS5nLiBhIHJlZ2lvbiB0YWcpIGFuZCByZWFkIGl0IHN0cmFpZ2h0IG9mZiB0aGUgcmV0dXJuZWRcbiAqIG1hdGNoLiBMaW5lYXIgc2NhbjsgcGFyc2UgdGhlIGFkZHJlc3Mgb25jZSBieSBwYXNzaW5nIGFcbiAqIHtAbGluayBQYXJzZWRJcH0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHJhbmdlcyA9IFtcIjEwLjAuMC4wLzhcIiwgXCIxOTIuMTY4LjAuMC8xNlwiXVxuICogICAubWFwKHBhcnNlQ2lkcilcbiAqICAgLmZpbHRlcigoYyk6IGMgaXMgQ2lkciA9PiBjICE9PSBudWxsKTtcbiAqIGZpbmRDb250YWluaW5nQ2lkcihcIjEwLjEuMi4zXCIsIHJhbmdlcyk/LmNpZHI7IC8vIFwiMTAuMC4wLjAvOFwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29udGFpbmluZ0NpZHI8VCBleHRlbmRzIENpZHI+KFxuICBpcDogc3RyaW5nIHwgUGFyc2VkSXAsXG4gIGNpZHJzOiBJdGVyYWJsZTxUPixcbik6IFQgfCBudWxsIHtcbiAgY29uc3QgcGFyc2VkSXAgPSB0eXBlb2YgaXAgPT09IFwic3RyaW5nXCIgPyBwYXJzZUlwKGlwKSA6IGlwO1xuICBpZiAoIXBhcnNlZElwKSByZXR1cm4gbnVsbDtcbiAgZm9yIChjb25zdCBjaWRyIG9mIGNpZHJzKSB7XG4gICAgaWYgKGNpZHIudmVyc2lvbiAhPT0gcGFyc2VkSXAudmVyc2lvbikgY29udGludWU7XG4gICAgY29uc3QgbWFzayA9IG5ldHdvcmtNYXNrKElQX0JJVFNbY2lkci52ZXJzaW9uXSwgY2lkci5wcmVmaXgpO1xuICAgIGlmICgocGFyc2VkSXAudmFsdWUgJiBtYXNrKSA9PT0gY2lkci5iYXNlKSByZXR1cm4gY2lkcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBpbnB1dGAncyBob3N0IGlzIGEgbG9vcGJhY2sgYWRkcmVzcyAtIGBsb2NhbGhvc3RgLCBhbiBJUHY0XG4gKiBgMTI3LjAuMC4wLzhgIGFkZHJlc3MsIG9yIElQdjYgYDo6MWAgLSBpLmUuIGEgc2VydmljZSBydW5uaW5nIG9uIHRoaXNcbiAqIG1hY2hpbmUgKGUuZy4gYSBsb2NhbCByZWdpc3RyeSkuIEFjY2VwdHMgYW55dGhpbmcge0BsaW5rIHVybEJ1aWxkZXJ9XG4gKiBjb2VyY2VzIChhIFVSTCBzdHJpbmcsIGBVUkxgLCBvciBgeyB1cmwgfWApOyByZXR1cm5zIGBmYWxzZWAgd2hlbiB0aGVcbiAqIGlucHV0IGhhcyBubyByZXNvbHZhYmxlIGhvc3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlzTG9vcGJhY2tIb3N0KFwiaHR0cDovL2xvY2FsaG9zdDo0ODczXCIpOyAvLyB0cnVlXG4gKiBpc0xvb3BiYWNrSG9zdChcImh0dHA6Ly8xMjcuMC4wLjFcIik7ICAgICAgIC8vIHRydWVcbiAqIGlzTG9vcGJhY2tIb3N0KFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmdcIik7IC8vIGZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xvb3BiYWNrSG9zdChpbnB1dDogVXJsTGlrZSk6IGJvb2xlYW4ge1xuICBjb25zdCBob3N0ID0gdXJsQnVpbGRlcihpbnB1dCk/Lmhvc3RuYW1lO1xuICBpZiAoIWhvc3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKGhvc3QgPT09IFwibG9jYWxob3N0XCIpIHJldHVybiB0cnVlO1xuICAvLyBgVVJMYCBicmFja2V0cyBhbiBJUHY2IGhvc3QgKGBbOjoxXWApOyBzdHJpcCB0aGVtIGJlZm9yZSBwYXJzaW5nLlxuICBjb25zdCBpcCA9IGhvc3QucmVwbGFjZSgvXlxcW3xcXF0kL2csIFwiXCIpO1xuICByZXR1cm4gaXBJbkNpZHIoaXAsIFwiMTI3LjAuMC4wLzhcIikgfHwgaXBJbkNpZHIoaXAsIFwiOjoxLzEyOFwiKTtcbn1cblxuLyoqXG4gKiBOZXR3b3JrIG1hc2sgZm9yIGBwcmVmaXhgIGxlYWRpbmcgYml0cyBvZiBhIGBiaXRzYC13aWRlIGFkZHJlc3MgYXMgYVxuICogYGJpZ2ludGA6IHRoZSB0b3AgYHByZWZpeGAgYml0cyBzZXQsIHRoZSBsb3cgaG9zdCBiaXRzIGNsZWFyZWQuXG4gKiBgcHJlZml4ID09PSAwYCB5aWVsZHMgYDBuYCAobWF0Y2hlcyBldmVyeXRoaW5nKTsgYHByZWZpeCA9PT0gYml0c2BcbiAqIHlpZWxkcyB0aGUgYWxsLW9uZXMgbWFzayAobWF0Y2hlcyBhIHNpbmdsZSBhZGRyZXNzKS5cbiAqL1xuZnVuY3Rpb24gbmV0d29ya01hc2soYml0czogbnVtYmVyLCBwcmVmaXg6IG51bWJlcik6IGJpZ2ludCB7XG4gIGNvbnN0IGhvc3RCaXRzID0gQmlnSW50KGJpdHMgLSBwcmVmaXgpO1xuICBjb25zdCBmdWxsID0gKDFuIDw8IEJpZ0ludChiaXRzKSkgLSAxbjtcbiAgcmV0dXJuIGZ1bGwgXiAoKDFuIDw8IGhvc3RCaXRzKSAtIDFuKTtcbn1cblxuLyoqIFBhcnNlIGEgZG90dGVkLXF1YWQgSVB2NCBsaXRlcmFsIGludG8gYSAzMi1iaXQgdmFsdWUsIGVsc2UgYG51bGxgLiAqL1xuZnVuY3Rpb24gcGFyc2VJcHY0KGlucHV0OiBzdHJpbmcpOiBiaWdpbnQgfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSBpbnB1dC5zcGxpdChcIi5cIik7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICBsZXQgdmFsdWUgPSAwbjtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgaWYgKCFJUFY0X09DVEVULnRlc3QocGFydCkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9jdGV0ID0gTnVtYmVyKHBhcnQpO1xuICAgIGlmIChvY3RldCA+IDI1NSkgcmV0dXJuIG51bGw7XG4gICAgdmFsdWUgPSAodmFsdWUgPDwgOG4pIHwgQmlnSW50KG9jdGV0KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogUGFyc2UgYW4gSVB2NiBsaXRlcmFsIGludG8gYSAxMjgtYml0IHZhbHVlLCBlbHNlIGBudWxsYC4gSGFuZGxlcyBgOjpgXG4gKiB6ZXJvLWNvbXByZXNzaW9uIChhdCBtb3N0IG9uY2UpIGFuZCBhIHRyYWlsaW5nIGVtYmVkZGVkIElQdjQgZ3JvdXBcbiAqIChgOjpmZmZmOjEuMi4zLjRgKS4gVGhlIHpvbmUgaWQsIGlmIGFueSwgaXMgZXhwZWN0ZWQgdG8gYmUgc3RyaXBwZWRcbiAqIGJ5IHtAbGluayBwYXJzZUlwfSBiZWZvcmUgdGhpcyBpcyBjYWxsZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSXB2NihpbnB1dDogc3RyaW5nKTogYmlnaW50IHwgbnVsbCB7XG4gIGNvbnN0IGhhbHZlcyA9IGlucHV0LnNwbGl0KFwiOjpcIik7XG4gIGlmIChoYWx2ZXMubGVuZ3RoID4gMikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgaGVhZCA9IHBhcnNlSGV4dGV0cyhoYWx2ZXNbMF0hKTtcbiAgaWYgKGhlYWQgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIGlmIChoYWx2ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgdGFpbCA9IHBhcnNlSGV4dGV0cyhoYWx2ZXNbMV0hKTtcbiAgICBpZiAodGFpbCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgLy8gXCI6OlwiIG11c3Qgc3RhbmQgaW4gZm9yIGF0IGxlYXN0IG9uZSBhbGwtemVybyBoZXh0ZXQuXG4gICAgY29uc3QgbWlzc2luZyA9IDggLSBoZWFkLmxlbmd0aCAtIHRhaWwubGVuZ3RoO1xuICAgIGlmIChtaXNzaW5nIDwgMSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGhleHRldHNUb1ZhbHVlKFsuLi5oZWFkLCAuLi5BcnJheShtaXNzaW5nKS5maWxsKDApLCAuLi50YWlsXSk7XG4gIH1cblxuICBpZiAoaGVhZC5sZW5ndGggIT09IDgpIHJldHVybiBudWxsO1xuICByZXR1cm4gaGV4dGV0c1RvVmFsdWUoaGVhZCk7XG59XG5cbi8qKlxuICogUGFyc2Ugb25lIGNvbG9uLXNlcGFyYXRlZCBydW4gb2YgSVB2NiBoZXh0ZXRzLCBleHBhbmRpbmcgYSB0cmFpbGluZ1xuICogZW1iZWRkZWQgSVB2NCBncm91cCBpbnRvIGl0cyB0d28gaGV4dGV0cy4gQW4gZW1wdHkgc3RyaW5nIHlpZWxkcyBhblxuICogZW1wdHkgbGlzdCAodGhlIHNpZGUgb2YgYSBsZWFkaW5nIC8gdHJhaWxpbmcgYDo6YCkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGV4dGV0cyhwYXJ0OiBzdHJpbmcpOiBudW1iZXJbXSB8IG51bGwge1xuICBpZiAocGFydCA9PT0gXCJcIikgcmV0dXJuIFtdO1xuICBjb25zdCB0b2tlbnMgPSBwYXJ0LnNwbGl0KFwiOlwiKTtcbiAgY29uc3QgaGV4dGV0czogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpXSE7XG4gICAgaWYgKHRva2VuLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgLy8gQSBkb3R0ZWQtcXVhZCBpcyBvbmx5IGxlZ2FsIGFzIHRoZSBmaW5hbCBncm91cC5cbiAgICAgIGlmIChpICE9PSB0b2tlbnMubGVuZ3RoIC0gMSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCB2NCA9IHBhcnNlSXB2NCh0b2tlbik7XG4gICAgICBpZiAodjQgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgaGV4dGV0cy5wdXNoKE51bWJlcigodjQgPj4gMTZuKSAmIDB4ZmZmZm4pLCBOdW1iZXIodjQgJiAweGZmZmZuKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghSVBWNl9IRVhURVQudGVzdCh0b2tlbikpIHJldHVybiBudWxsO1xuICAgICAgaGV4dGV0cy5wdXNoKHBhcnNlSW50KHRva2VuLCAxNikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGV4dGV0cztcbn1cblxuLyoqIEZvbGQgZXhhY3RseSA4IGhleHRldHMgaW50byBhIHNpbmdsZSAxMjgtYml0IGBiaWdpbnRgLCBlbHNlIGBudWxsYC4gKi9cbmZ1bmN0aW9uIGhleHRldHNUb1ZhbHVlKGhleHRldHM6IG51bWJlcltdKTogYmlnaW50IHwgbnVsbCB7XG4gIGlmIChoZXh0ZXRzLmxlbmd0aCAhPT0gOCkgcmV0dXJuIG51bGw7XG4gIGxldCB2YWx1ZSA9IDBuO1xuICBmb3IgKGNvbnN0IGhleHRldCBvZiBoZXh0ZXRzKSB2YWx1ZSA9ICh2YWx1ZSA8PCAxNm4pIHwgQmlnSW50KGhleHRldCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbiJdfQ==
452
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25ldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUlILE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbkQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7QUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxpQ0FBaUMsQ0FBQztBQUM1RCxNQUFNLHFCQUFxQixHQUFHLFlBQVksQ0FBQztBQUMzQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUVuQyxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztBQUVuQywrREFBK0Q7QUFDL0QsTUFBTSxPQUFPLEdBQXdDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkUsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDO0FBQy9CLE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDO0FBRXpDLG9FQUFvRTtBQUNwRSxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztBQUN2QyxvRUFBb0U7QUFDcEUsTUFBTSxhQUFhLEdBQUcsNEJBQTRCLENBQUM7QUFvRG5EOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWUsU0FBUSxHQUFHO0lBQzlCLFlBQVksR0FBUTtRQUNsQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUEyQixHQUFNLEVBQUUsS0FBd0I7UUFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMzQixPQUFPLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLEdBQUcsWUFBbUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxHQUFHLFlBQW1DO1FBQ3BELE1BQU0sYUFBYSxHQUFhLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRixNQUFNLFFBQVEsR0FBRyxhQUFhO2FBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNoRCxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxXQUFXLENBQUMsSUFBWTtRQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksUUFBUSxJQUFJLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztRQUM3QyxJQUFJLFFBQVEsSUFBSSxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbEMsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUE4QkQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFlO0lBQ3hDLElBQUksS0FBSyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ2xFLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxTQUFTLEdBQUcsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUMvRCxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQixDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztZQUNsRCxLQUFLLEdBQUcsR0FBRyxrQkFBa0IsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM3QyxNQUFNLFlBQVksR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDOUMsS0FBSyxHQUFHLEdBQUcsWUFBWSxHQUFHLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxHQUFHLEdBQUcsa0JBQWtCLE1BQU0sS0FBSyxFQUFFLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0MsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsVUFBVTtJQUNqQixtRUFBbUU7SUFDbkUsaUVBQWlFO0lBQ2pFLE1BQU0sTUFBTSxHQUFJLFVBQThELENBQUMsTUFBTSxFQUFFLFFBQVE7UUFDN0YsRUFBRSxNQUFNLENBQUM7SUFDWCxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDaEMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQWE7SUFDN0IsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQztJQUNaLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFpQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLEtBQW9ELEVBQ3BELFVBQThCLEVBQUU7SUFFaEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDckQsTUFBTSxFQUFFLFNBQVMsR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBZSxDQUFDLENBQUM7SUFDakUsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMvQixNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUM7SUFDekIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFBRSxTQUFTO1FBQ3hDLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7WUFDdEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxPQUFPO2dCQUFFLFNBQVM7WUFDdkIsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUM1RCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztvQkFBRSxTQUFTO2dCQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLENBQUM7WUFDRCxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBYTtJQUNuQyxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELG1FQUFtRTtBQUNuRSwrQkFBK0I7QUFDL0IsbUVBQW1FO0FBRW5FOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBYTtJQUNuQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsd0VBQXdFO1FBQ3hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxJQUFJLElBQUksQ0FBQztZQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsT0FBTyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLE9BQU8sS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDdkQsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWE7SUFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsSUFBSSxLQUFLLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzNCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLElBQUksQ0FBQyxFQUFFO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDckIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMs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QUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLGtEQUFrRDtZQUNsRCxJQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDekMsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLElBQUksRUFBRSxLQUFLLElBQUk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSxTQUFTLGNBQWMsQ0FBQyxPQUFpQjtJQUN2QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3RDLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNmLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTztRQUFFLEtBQUssR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLXNhZmUgbmV0d29ya2luZyBoZWxwZXJzIGJ1aWx0IGFyb3VuZCB7QGxpbmsgdXJsQnVpbGRlcn06IGFcbiAqIHRvbGVyYW50IGBVUkxgIGNvZXJjaW9uICsgY2hhaW5hYmxlIGJ1aWxkZXIgdGhhdCBncmFjZWZ1bGx5IGhhbmRsZXNcbiAqIHBhcnRpYWwgaW5wdXRzIChiYXJlIGhvc3RzLCBwYXRoLW9ubHkgc3RyaW5ncywgYHsgdXJsIH1gIHdyYXBwZXJzKSxcbiAqIGEgc21hbGwgSVB2NCAvIElQdjYgYWRkcmVzcyArIENJRFIgdG9vbGtpdCAocGFyc2luZyBhbmQgbWVtYmVyc2hpcFxuICogbG9va3VwcyksIGFuZCBlbWFpbC1hZGRyZXNzIHBhcnNpbmcgKHtAbGluayBwYXJzZUVtYWlsc30gL1xuICoge0BsaW5rIGlzRW1haWx9KSB0aGF0IG5vcm1hbGl6ZXMgdGhlIENTViAvIHNpbmdsZS1zdHJpbmcgLyBhcnJheVxuICogaW5wdXRzIGVtYWlsIHJlY2lwaWVudCBhbmQgYWxsb3ctbGlzdCBmaWVsZHMgYWNjZXB0IGludG8gYSBjbGVhblxuICogYHN0cmluZ1tdYC4gTm8gbm9kZS1vbmx5IGltcG9ydHMsIHNvIHRoaXMgbW9kdWxlIGlzIHRoZSBjYW5vbmljYWxcbiAqIGhvbWUgZm9yIGFueXRoaW5nIFVSTC0sIElQLSwgb3IgZW1haWwtc2hhcGVkIHRoYXQgYWxzbyBoYXMgdG8gcnVuIGluXG4gKiBhIFZpdGUgLyBXZWJwYWNrIC8gZXNidWlsZCBjbGllbnQgYnVuZGxlLiBOb2RlLW9ubHkgbmV0d29yayBoZWxwZXJzXG4gKiAoZS5nLiBETlMgcmVzb2x1dGlvbikgYmVsb25nIGluIGEgbm9kZS10YWdnZWQgcGFja2FnZSwgbm90IGhlcmUuXG4gKiBSZXVzZSB0aGlzIG1vZHVsZSBmb3IgVVJMLCBJUC9DSURSLCBhbmQgZW1haWwgcGFyc2luZyBpbnN0ZWFkIG9mIGludHJvZHVjaW5nXG4gKiBwYWNrYWdlLWxvY2FsIG5vcm1hbGl6ZXJzIHdpdGggc3VidGx5IGRpZmZlcmVudCBydWxlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBOb25GdW5jdGlvbktleXMgfSBmcm9tIFwiLi9vYmplY3QudHNcIjtcblxuY29uc3QgTE9DQUxfSE9TVF9VUkwgPSBuZXcgVVJMKFwiaHR0cDovL2xvY2FsaG9zdFwiKTtcbmNvbnN0IFVSTF9TQ0hFTUVfREVGQVVMVCA9IFwiaHR0cHNcIjtcbmNvbnN0IFVSTF9TQ0hFTUVfUFJFRklYID0gL14oW0EtWmEtel1bQS1aYS16MC05Ky4tXSo6XFwvXFwvKS87XG5jb25zdCBVUkxfUEFUSF9TRUdNRU5UX1RSSU0gPSAvXlxcLyt8XFwvKyQvZztcbmNvbnN0IFVSTF9TQ0hFTUVfU0VQQVJBVE9SID0gXCI6Ly9cIjtcblxuLyoqIEhpZ2hlc3QgdmFsaWQgVENQIHBvcnQgbnVtYmVyLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9UQ1BfUE9SVCA9IDY1XzUzNTtcblxuLyoqIFRvdGFsIGJpdCB3aWR0aCBvZiBhbiBhZGRyZXNzIG9mIGVhY2gge0BsaW5rIElwVmVyc2lvbn0uICovXG5jb25zdCBJUF9CSVRTOiBSZWFkb25seTxSZWNvcmQ8SXBWZXJzaW9uLCBudW1iZXI+PiA9IHsgNDogMzIsIDY6IDEyOCB9O1xuY29uc3QgSVBWNF9PQ1RFVCA9IC9eXFxkezEsM30kLztcbmNvbnN0IElQVjZfSEVYVEVUID0gL15bMC05YS1mQS1GXXsxLDR9JC87XG5cbi8qKiBEZWxpbWl0ZXJzIGJldHdlZW4gYWRkcmVzc2VzIGluIGEgZnJlZS10ZXh0IC8gQ1NWIGVtYWlsIGxpc3QuICovXG5jb25zdCBFTUFJTF9MSVNUX1NFUEFSQVRPUiA9IC9bXFxzLDtdKy87XG4vKiogUHJhZ21hdGljIGBsb2NhbEBkb21haW4udGxkYCBzaGFwZSBjaGVjayAobm90IGZ1bGwgUkZDIDUzMjIpLiAqL1xuY29uc3QgRU1BSUxfQUREUkVTUyA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFR5cGVzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBBbnl0aGluZyB7QGxpbmsgdXJsQnVpbGRlcn0ga25vd3MgaG93IHRvIGNvZXJjZVxuICogaW50byBhIFVSTDpcbiAqXG4gKiAtIEEgc3RyaW5nOiBhIGhvc3QsIGEgZnVsbCBVUkwsIG9yIGEgcGF0aCAvIHF1ZXJ5IC8gaGFzaCBmcmFnbWVudC5cbiAqIC0gQSBXSEFUV0cgYFVSTGAgaW5zdGFuY2UuXG4gKiAtIEFueSBvYmplY3Qgd2l0aCBhIGB1cmxgIGZpZWxkIChlLmcuIGEgZmV0Y2ggYFJlcXVlc3RgLCBhIERhdGFicmlja3NcbiAqICAgYFdvcmtzcGFjZUNsaWVudGAgY29uZmlnKS5cbiAqL1xuZXhwb3J0IHR5cGUgVXJsTGlrZSA9IHN0cmluZyB8IFVSTCB8IHsgdXJsOiBzdHJpbmcgfTtcblxuLyoqIElQIHByb3RvY29sIGZhbWlseTogYDRgIGZvciBJUHY0LCBgNmAgZm9yIElQdjYuICovXG5leHBvcnQgdHlwZSBJcFZlcnNpb24gPSA0IHwgNjtcblxuLyoqXG4gKiBBIHBhcnNlZCBJUCBhZGRyZXNzLiBgdmFsdWVgIGlzIHRoZSBhZGRyZXNzIGFzIGFuIHVuc2lnbmVkIGludGVnZXJcbiAqIChhIDMyLWJpdCByYW5nZSBmb3IgdjQsIDEyOC1iaXQgZm9yIHY2KSBoZWxkIGluIGEgYGJpZ2ludGAgc28gYm90aFxuICogZmFtaWxpZXMgc2hhcmUgb25lIGNvbXBhcmlzb24gLyBtYXNraW5nIHBhdGguIFByb2R1Y2Ugb25lIHdpdGhcbiAqIHtAbGluayBwYXJzZUlwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRJcCB7XG4gIHZlcnNpb246IElwVmVyc2lvbjtcbiAgLyoqIFRoZSBhZGRyZXNzIGFzIGFuIHVuc2lnbmVkIGludGVnZXIgKGBiaWdpbnRgIGZvciB1bmlmb3JtIHY0L3Y2IG1hdGgpLiAqL1xuICB2YWx1ZTogYmlnaW50O1xufVxuXG4vKipcbiAqIEEgcGFyc2VkIENJRFIgYmxvY2sgKGAxMC4wLjAuMC84YCwgYDIwMDE6ZGI4OjovMzJgKS4gYGJhc2VgIGlzIHRoZVxuICogbmV0d29yayBhZGRyZXNzIHdpdGggYWxsIGhvc3QgYml0cyBjbGVhcmVkLCBzbyBtZW1iZXJzaGlwIGlzIGFcbiAqIHNpbmdsZSBtYXNrZWQgY29tcGFyZSAoc2VlIHtAbGluayBpcEluQ2lkcn0pLiBQcm9kdWNlIG9uZSB3aXRoXG4gKiB7QGxpbmsgcGFyc2VDaWRyfS4gQ2FycmllcyB0aGUgbm9ybWFsaXplZCBgY2lkcmAgc3RyaW5nIGZvciBsb2dnaW5nXG4gKiBhbmQgdG8ga2V5IGJhY2sgdG8gY2FsbGVyLXNpZGUgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2lkciB7XG4gIHZlcnNpb246IElwVmVyc2lvbjtcbiAgLyoqIE5ldHdvcmsgYWRkcmVzcyAoaG9zdCBiaXRzIHplcm9lZCkgYXMgYW4gdW5zaWduZWQgYGJpZ2ludGAuICovXG4gIGJhc2U6IGJpZ2ludDtcbiAgLyoqIFByZWZpeCBsZW5ndGggaW4gYml0cyAodGhlIG51bWJlciBhZnRlciB0aGUgYC9gKS4gKi9cbiAgcHJlZml4OiBudW1iZXI7XG4gIC8qKiBOb3JtYWxpemVkIGA8YWRkcmVzcz4vPHByZWZpeD5gIHN0cmluZy4gKi9cbiAgY2lkcjogc3RyaW5nO1xufVxuXG4vKiogU2V0dGFibGUsIG5vbi1tZXRob2QgYFVSTGAgcHJvcGVydGllcyAtIHRoZSBrZXlzIHtAbGluayBVcmxCdWlsZGVyLndpdGh9IGFjY2VwdHMuICovXG50eXBlIFVybFByb3BlcnR5S2V5ID0gTm9uRnVuY3Rpb25LZXlzPFVybEJ1aWxkZXJJbXBsPjtcblxuLyoqXG4gKiBBIGBVUkxgIHN1YmNsYXNzIHdpdGggY2hhaW5hYmxlLCBjb3B5LW9uLXdyaXRlIGhlbHBlcnMuIEV2ZXJ5IG11dGF0aW5nXG4gKiBtZXRob2QgcmV0dXJucyBhIGZyZXNoIGJ1aWxkZXIgcmF0aGVyIHRoYW4gZWRpdGluZyBpbiBwbGFjZSwgc28gYSBiYXNlXG4gKiBidWlsZGVyIGNhbiBiZSBzYWZlbHkgcmV1c2VkLiBDb25zdHJ1Y3Qgb25lIHZpYSB7QGxpbmsgdXJsQnVpbGRlcn0uXG4gKi9cbmNsYXNzIFVybEJ1aWxkZXJJbXBsIGV4dGVuZHMgVVJMIHtcbiAgY29uc3RydWN0b3IodXJsOiBVUkwpIHtcbiAgICBzdXBlcih1cmwpO1xuICB9XG5cbiAgLyoqIFRoZSBzY2hlbWUgd2l0aG91dCB0aGUgdHJhaWxpbmcgY29sb24gKGBodHRwc2AsIG5vdCBgaHR0cHM6YCkuICovXG4gIGdldCBzY2hlbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5zbGljZSgwLCAtMSk7XG4gIH1cblxuICBzZXQgc2NoZW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnByb3RvY29sID0gdmFsdWUgKyBcIjpcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjb3B5IHdpdGggYSBzaW5nbGUgYFVSTGAgcHJvcGVydHkgKGBwYXRobmFtZWAsIGBzZWFyY2hgLFxuICAgKiBgaG9zdG5hbWVgLCBgc2NoZW1lYCwgLi4uKSBzZXQgdG8gYHZhbHVlYCwgbGVhdmluZyB0aGlzIGJ1aWxkZXJcbiAgICogdW50b3VjaGVkLlxuICAgKi9cbiAgd2l0aDxLIGV4dGVuZHMgVXJsUHJvcGVydHlLZXk+KGtleTogSywgdmFsdWU6IFVybEJ1aWxkZXJJbXBsW0tdKTogVXJsQnVpbGRlciB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBVcmxCdWlsZGVySW1wbCh0aGlzKTtcbiAgICAobmV4dCBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gbmV3IFVybEJ1aWxkZXJJbXBsKG5leHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNvcHkgd2l0aCBgcGF0aFNlZ21lbnRzYCBhcHBlbmRlZCB0byB0aGUgY3VycmVudCBwYXRobmFtZS5cbiAgICogU2VnbWVudHMgbWF5IGJlIHN0cmluZ3Mgb3Igc3RyaW5nIGFycmF5czsgZWFjaCBpcyB0cmltbWVkIG9mXG4gICAqIGJvdW5kYXJ5IHNsYXNoZXMgYW5kIGJsYW5rcyBhcmUgZHJvcHBlZCBiZWZvcmUgam9pbmluZyB3aXRoIGAvYC5cbiAgICovXG4gIHdpdGhQYXRoQXBwZW5kKC4uLnBhdGhTZWdtZW50czogKHN0cmluZyB8IHN0cmluZ1tdKVtdKTogVXJsQnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMud2l0aFBhdGhSZXBsYWNlKHRoaXMucGF0aG5hbWUsIC4uLnBhdGhTZWdtZW50cyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgY29weSB3aG9zZSBwYXRobmFtZSBpcyBgcGF0aFNlZ21lbnRzYCBqb2luZWQgd2l0aCBgL2AsXG4gICAqIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgcGF0aC4gU2VnbWVudHMgbWF5IGJlIHN0cmluZ3Mgb3Igc3RyaW5nXG4gICAqIGFycmF5czsgZWFjaCBpcyB0cmltbWVkIG9mIGJvdW5kYXJ5IHNsYXNoZXMgYW5kIGJsYW5rcyBhcmUgZHJvcHBlZC5cbiAgICovXG4gIHdpdGhQYXRoUmVwbGFjZSguLi5wYXRoU2VnbWVudHM6IChzdHJpbmcgfCBzdHJpbmdbXSlbXSk6IFVybEJ1aWxkZXIge1xuICAgIGNvbnN0IHBhdGhuYW1lUGFydHM6IHN0cmluZ1tdID0gWy4uLnBhdGhTZWdtZW50c10uZmxhdE1hcCgocCkgPT4gKEFycmF5LmlzQXJyYXkocCkgPyBwIDogW3BdKSk7XG4gICAgY29uc3QgcGF0aG5hbWUgPSBwYXRobmFtZVBhcnRzXG4gICAgICAubWFwKChwKSA9PiBwLnJlcGxhY2UoVVJMX1BBVEhfU0VHTUVOVF9UUklNLCBcIlwiKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKFwiL1wiKTtcbiAgICByZXR1cm4gdGhpcy53aXRoKFwicGF0aG5hbWVcIiwgXCIvXCIgKyBwYXRobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogVGVzdCB3aGV0aGVyIHRoaXMgVVJMJ3MgcGF0aG5hbWUgaXMgYHBhdGhgIG9yIGxpdmVzIGJlbmVhdGggaXQsXG4gICAqIG1hdGNoaW5nIG9uIHNlZ21lbnQgYm91bmRhcmllcyBzbyBgL2FwaWAgbWF0Y2hlcyBgL2FwaWAgYW5kXG4gICAqIGAvYXBpL2Nvb2xgIGJ1dCBub3QgYC9hcGljb29sYC4gQSBtaXNzaW5nIGxlYWRpbmcgc2xhc2ggb24gYHBhdGhgXG4gICAqIGlzIHRvbGVyYXRlZDsgcXVlcnkgYW5kIGhhc2ggYXJlIGlnbm9yZWQgKHRoZXkgYXJlbid0IHBhcnQgb2ZcbiAgICogYHBhdGhuYW1lYCkuIE1hdGNoaW5nIGlzIGV4YWN0IG90aGVyd2lzZSAtIHRyYWlsaW5nIHNsYXNoZXMgYXJlXG4gICAqIG5vdCBub3JtYWxpemVkIGFuZCBgL2AgbWF0Y2hlcyBvbmx5IHRoZSByb290LlxuICAgKi9cbiAgcGF0aE1hdGNoZXMocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0aG5hbWUgPSB0aGlzLnBhdGhuYW1lO1xuICAgIGlmIChwYXRobmFtZSA9PSBwYXRoKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChcIi9cIikpIHBhdGggPSBcIi9cIiArIHBhdGg7XG4gICAgaWYgKHBhdGhuYW1lID09IHBhdGgpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBwYXRobmFtZS5zdGFydHNXaXRoKHBhdGggKyBcIi9cIik7XG4gIH1cbn1cblxuLyoqIFB1YmxpYyB0eXBlIGZvciB0aGUge0BsaW5rIHVybEJ1aWxkZXJ9IHJldHVybiB2YWx1ZS4gKi9cbmV4cG9ydCB0eXBlIFVybEJ1aWxkZXIgPSBVcmxCdWlsZGVySW1wbDtcblxuLyoqIFdpdGggbm8gYXJndW1lbnQsIHJlc29sdmVzIHRvIHRoZSBiYXNlIG9yaWdpbiAobmV2ZXIgYG51bGxgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmxCdWlsZGVyKCk6IFVybEJ1aWxkZXI7XG5cbi8qKlxuICogQ29lcmNlIGEge0BsaW5rIFVybExpa2V9IGludG8gYSBjaGFpbmFibGUge0BsaW5rIFVybEJ1aWxkZXJ9LCBvciBgbnVsbGBcbiAqIHdoZW4gdGhlIGlucHV0IGNhbm5vdCBiZSBwYXJzZWQgaW50byBhIFVSTC4gTmV2ZXIgdGhyb3dzLlxuICpcbiAqIC0gQSBgVVJMYCBpbnN0YW5jZSBvciBgeyB1cmwgfWAgd3JhcHBlciBpcyBhZG9wdGVkIGFzLWlzLlxuICogLSBBIGJhcmUgaG9zdG5hbWUgKGBcImV4YW1wbGUuY29tXCJgKSBpcyB1cGdyYWRlZCB0byBgaHR0cHM6Ly9gOyBhblxuICogICBleHBsaWNpdCBzY2hlbWUgaXMgcHJlc2VydmVkLlxuICogLSBBIHBhdGggLyBxdWVyeSAvIGhhc2ggZnJhZ21lbnQgKGBcIi9hcGlcImAsIGBcIj9xPTFcImAsIGBcIiN4XCJgKSBpc1xuICogICByZXNvbHZlZCBhZ2FpbnN0IHtAbGluayBkZWZhdWx0VXJsfSAodGhlIGJyb3dzZXIgb3JpZ2luLCBlbHNlXG4gKiAgIGBodHRwOi8vbG9jYWxob3N0YCkuXG4gKiAtIEFuIGVtcHR5IC8gYmxhbmsgc3RyaW5nIG9yIG9taXR0ZWQgaW5wdXQgcmVzb2x2ZXMgdG8gdGhlIGJhc2VcbiAqICAgb3JpZ2luLlxuICpcbiAqIEBleGFtcGxlXG4gKiB1cmxCdWlsZGVyKFwiZXhhbXBsZS5jb21cIik7ICAgICAgICAgIC8vIGh0dHBzOi8vZXhhbXBsZS5jb20vXG4gKiB1cmxCdWlsZGVyKFwiaHR0cDovL3gvcGF0aFwiKTsgICAgICAgIC8vIGh0dHA6Ly94L3BhdGhcbiAqIHVybEJ1aWxkZXIoXCIvYXBpL3YyXCIpOyAgICAgICAgICAgICAgLy8gaHR0cDovL2xvY2FsaG9zdC9hcGkvdjJcbiAqIHVybEJ1aWxkZXIoeyB1cmw6IFwiaHR0cDovL3lcIiB9KTsgICAgLy8gaHR0cDovL3kvXG4gKiB1cmxCdWlsZGVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vbG9jYWxob3N0L1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsQnVpbGRlcihpbnB1dD86IFVybExpa2UpOiBVcmxCdWlsZGVyIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gdXJsQnVpbGRlcihpbnB1dD86IFVybExpa2UpOiBVcmxCdWlsZGVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgVVJMKSB7XG4gICAgcmV0dXJuIG5ldyBVcmxCdWlsZGVySW1wbChpbnB1dCk7XG4gIH1cbiAgaWYgKGlucHV0ICE9PSBudWxsICYmIHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiAmJiBcInVybFwiIGluIGlucHV0KSB7XG4gICAgaW5wdXQgPSBpbnB1dC51cmw7XG4gIH1cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlucHV0ID0gaW5wdXQudHJpbSgpO1xuICB9XG4gIGlmIChpbnB1dCkge1xuICAgIGlmIChpbnB1dC5zdGFydHNXaXRoKFwiL1wiKSB8fCBpbnB1dC5zdGFydHNXaXRoKFwiP1wiKSB8fCBpbnB1dC5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgY29uc3Qgam9pbmVkVXJsID0gZGVmYXVsdFVybCgpLnRvU3RyaW5nKCkuc2xpY2UoMCwgLTEpICsgaW5wdXQ7XG4gICAgICByZXR1cm4gdXJsQnVpbGRlcihqb2luZWRVcmwpO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQuc3RhcnRzV2l0aChVUkxfU0NIRU1FX1NFUEFSQVRPUikpIHtcbiAgICAgIGlucHV0ID0gYCR7VVJMX1NDSEVNRV9ERUZBVUxUfSR7aW5wdXR9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaChVUkxfU0NIRU1FX1BSRUZJWCk7XG4gICAgICBjb25zdCBzY2hlbWVQcmVmaXggPSBtYXRjaD8uWzFdO1xuICAgICAgaWYgKHNjaGVtZVByZWZpeCkge1xuICAgICAgICBjb25zdCByZXN0ID0gaW5wdXQuc2xpY2Uoc2NoZW1lUHJlZml4Lmxlbmd0aCk7XG4gICAgICAgIGlucHV0ID0gYCR7c2NoZW1lUHJlZml4fSR7cmVzdCB8fCBkZWZhdWx0VXJsKCkuaG9zdG5hbWV9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0ID0gYCR7VVJMX1NDSEVNRV9ERUZBVUxUfTovLyR7aW5wdXR9YDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVybEJ1aWxkZXIoZGVmYXVsdFVybCgpKTtcbiAgfVxuICBjb25zdCB1cmwgPSBwYXJzZVVybChpbnB1dCk7XG4gIHJldHVybiB1cmwgPyB1cmxCdWlsZGVyKHVybCkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQmFzZSBvcmlnaW4gZm9yIHJlc29sdmluZyBwYXRoLW9ubHkgaW5wdXRzLiBJbiBhIGJyb3dzZXIgdGhpcyBpcyB0aGVcbiAqIGN1cnJlbnQgcGFnZSdzIG9yaWdpbiAoYHdpbmRvdy5sb2NhdGlvbi5vcmlnaW5gKSwgc28gYHVybEJ1aWxkZXIoXCIvYXBpXCIpYFxuICogcmVmbGVjdHMgd2hlcmUgdGhlIGFwcCBpcyBhY3R1YWxseSBzZXJ2ZWQgZnJvbTsgb24gdGhlIHNlcnZlciAvIGluXG4gKiB0ZXN0cyAobm8gYHdpbmRvd2AsIG9yIGFuIG9wYXF1ZSBgXCJudWxsXCJgIG9yaWdpbikgaXQgZmFsbHMgYmFjayB0b1xuICogYGh0dHA6Ly9sb2NhbGhvc3RgLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0VXJsKCk6IFVSTCB7XG4gIC8vIFJlYWNoIGB3aW5kb3dgIHZpYSBgZ2xvYmFsVGhpc2Agc28gdGhpcyBjb21waWxlcyB3aXRob3V0IHRoZSBET01cbiAgLy8gbGliIChpdCdzIGB1bmRlZmluZWRgIG9uIHRoZSBzZXJ2ZXIgLyBpbiB3b3JrZXJzIHdpdGhvdXQgb25lKS5cbiAgY29uc3Qgb3JpZ2luID0gKGdsb2JhbFRoaXMgYXMgeyB3aW5kb3c/OiB7IGxvY2F0aW9uPzogeyBvcmlnaW4/OiBzdHJpbmcgfSB9IH0pLndpbmRvdz8ubG9jYXRpb25cbiAgICA/Lm9yaWdpbjtcbiAgaWYgKG9yaWdpbiAmJiBvcmlnaW4gIT09IFwibnVsbFwiKSB7XG4gICAgY29uc3Qgb3JpZ2luVXJsID0gcGFyc2VVcmwob3JpZ2luKTtcbiAgICBpZiAob3JpZ2luVXJsKSB7XG4gICAgICByZXR1cm4gb3JpZ2luVXJsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IFVSTChMT0NBTF9IT1NUX1VSTCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVXJsKGlucHV0OiBzdHJpbmcpOiBVUkwgfCBudWxsIHtcbiAgaWYgKGlucHV0ICYmIGlucHV0LmluY2x1ZGVzKFVSTF9TQ0hFTUVfU0VQQVJBVE9SKSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IFVSTChpbnB1dCk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEVtYWlsIGFkZHJlc3Nlc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgcGFyc2VFbWFpbHN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUVtYWlsc09wdGlvbnMge1xuICAvKiogTG93ZXItY2FzZSBldmVyeSBhZGRyZXNzICh1c2VmdWwgZm9yIGFsbG93LWxpc3RzIC8gbWF0Y2hpbmcpLiBPZmYgYnkgZGVmYXVsdC4gKi9cbiAgbG93ZXJjYXNlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERyb3AgbGF0ZXIgY2FzZS1pbnNlbnNpdGl2ZSBkdXBsaWNhdGVzLCBrZWVwaW5nIGZpcnN0LXNlZW4gY2FzaW5nLlxuICAgKiBPbiBieSBkZWZhdWx0IC0gYSByZWNpcGllbnQgb3IgcGF0dGVybiBsaXN0IHJhcmVseSB3YW50cyByZXBlYXRzLlxuICAgKi9cbiAgZGVkdXBlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIHNoYXBlcyBhbiBlbWFpbCBhZGRyZXNzIGZpZWxkIGFjY2VwdHMgLSBhIHNpbmdsZSBzdHJpbmcsXG4gKiBhIGNvbW1hIC8gc2VtaWNvbG9uIC8gd2hpdGVzcGFjZSBzZXBhcmF0ZWQgbGlzdCwgYW4gYXJyYXkgb2YgZWl0aGVyLFxuICogb3Igbm90aGluZyAtIGludG8gYSBjbGVhbiBgc3RyaW5nW11gLiBFYWNoIGVudHJ5IGlzIHNwbGl0IG9uIHRoZSBsaXN0XG4gKiBzZXBhcmF0b3JzLCB0cmltbWVkLCBhbmQgZGUtZW1wdGllZDsgYmxhbmtzIGFuZCBub24tc3RyaW5nIGFycmF5XG4gKiBtZW1iZXJzIGFyZSBkcm9wcGVkLiBCeSBkZWZhdWx0IGR1cGxpY2F0ZXMgYXJlIHJlbW92ZWRcbiAqIGNhc2UtaW5zZW5zaXRpdmVseSAoZmlyc3Qtc2VlbiBjYXNpbmcgd2lucykgYW5kIGNhc2luZyBpcyBvdGhlcndpc2VcbiAqIHByZXNlcnZlZDsgcGFzcyBgbG93ZXJjYXNlYCB0byBmb2xkIGV2ZXJ5dGhpbmcgdG8gbG93ZXIgY2FzZSAoZS5nLiBmb3JcbiAqIGFuIGFsbG93LWxpc3QpLiBUaGlzIGlzIHRoZSBvbmUgcGxhY2UgcmVjaXBpZW50IGxpc3RzLCBDQy9CQ0MgaW5wdXRzLFxuICogYW5kIHNlbmRlciBhbGxvdy1saXN0cyBhY3Jvc3MgdGhlIHJlcG8gYWdyZWUgb24gaG93IGZyZWUtdGV4dCBlbWFpbFxuICogaW5wdXQgaXMgcmVhZC4gTmV2ZXIgdGhyb3dzOyBkb2VzIG5vdCB2YWxpZGF0ZSAtIHBhaXIgd2l0aFxuICoge0BsaW5rIGlzRW1haWx9IHdoZW4geW91IG5lZWQgdG8gcmVqZWN0IG1hbGZvcm1lZCBhZGRyZXNzZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlRW1haWxzKFwiYUB4LmNvbSwgYkB5LmNvbTsgYUB4LmNvbVwiKTsgLy8gW1wiYUB4LmNvbVwiLCBcImJAeS5jb21cIl1cbiAqIHBhcnNlRW1haWxzKFtcIkFAeC5jb21cIiwgXCIgYkB5LmNvbSBcIl0pOyAgICAgIC8vIFtcIkFAeC5jb21cIiwgXCJiQHkuY29tXCJdXG4gKiBwYXJzZUVtYWlscyhcIipAY29ycC5jb21cIiwgeyBsb3dlcmNhc2U6IHRydWUgfSk7IC8vIFtcIipAY29ycC5jb21cIl1cbiAqIHBhcnNlRW1haWxzKHVuZGVmaW5lZCk7ICAgICAgICAgICAgICAgICAgICAgLy8gW11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRW1haWxzKFxuICBpbnB1dDogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBQYXJzZUVtYWlsc09wdGlvbnMgPSB7fSxcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgY29uc3QgeyBsb3dlcmNhc2UgPSBmYWxzZSwgZGVkdXBlID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW50cmllcyA9IEFycmF5LmlzQXJyYXkoaW5wdXQpID8gaW5wdXQgOiBbaW5wdXQgYXMgc3RyaW5nXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgZW50cnkuc3BsaXQoRU1BSUxfTElTVF9TRVBBUkFUT1IpKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gdG9rZW4udHJpbSgpO1xuICAgICAgaWYgKCF0cmltbWVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBsb3dlcmNhc2UgPyB0cmltbWVkLnRvTG93ZXJDYXNlKCkgOiB0cmltbWVkO1xuICAgICAgaWYgKGRlZHVwZSkge1xuICAgICAgICBjb25zdCBrZXkgPSBhZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICAgIG91dC5wdXNoKGFkZHJlc3MpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFByYWdtYXRpYyBgbG9jYWxAZG9tYWluLnRsZGAgc2hhcGUgY2hlY2s6IG5vbi1lbXB0eSBsb2NhbCBhbmQgZG9tYWluXG4gKiBwYXJ0cyBhcm91bmQgYSBzaW5nbGUgYEBgLCB3aXRoIGEgZG90dGVkIGRvbWFpbiBhbmQgbm8gd2hpdGVzcGFjZS5cbiAqIERlbGliZXJhdGVseSBsb29zZSAobm90IGZ1bGwgUkZDIDUzMjIpIC0gZW5vdWdoIHRvIGNhdGNoIG9idmlvdXMgdHlwb3NcbiAqIGFuZCBnaXZlIENMSSAvIGZvcm0gZmVlZGJhY2ssIG5vdCB0byBnYXRlIGRlbGl2ZXJ5LiBUcmltcyBmaXJzdC4gVGhpc1xuICogaXMgYSBwdXJlbHkgc3ludGFjdGljIHRlc3QsIHNvIGEgd2lsZGNhcmQgYWxsb3ctbGlzdCBwYXR0ZXJuIGxpa2VcbiAqIGAqQGV4YW1wbGUuY29tYCBwYXNzZXM7IGRpc3Rpbmd1aXNoaW5nIGEgcGF0dGVybiBmcm9tIGEgcmVhbCBhZGRyZXNzXG4gKiBpcyB0aGUgc2VuZGVyIHBvbGljeSdzIGpvYiwgbm90IHRoaXMgdmFsaWRhdG9yJ3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlzRW1haWwoXCJhbGljZUBleGFtcGxlLmNvbVwiKTsgLy8gdHJ1ZVxuICogaXNFbWFpbChcIm5vcGVcIik7ICAgICAgICAgICAgICAvLyBmYWxzZSAobm8gQClcbiAqIGlzRW1haWwoXCJub0Bkb21haW5cIik7ICAgICAgICAgLy8gZmFsc2UgKG5vIGRvdHRlZCBkb21haW4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VtYWlsKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEVNQUlMX0FERFJFU1MudGVzdCh2YWx1ZS50cmltKCkpO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIElQIGFkZHJlc3NlcyBhbmQgQ0lEUiBibG9ja3Ncbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFBhcnNlIGFuIElQdjQgKGBcIjEuMi4zLjRcImApIG9yIElQdjYgKGBcIjIwMDE6ZGI4OjoxXCJgLFxuICogYFwiOjpmZmZmOjEuMi4zLjRcImAsIGBcIjo6MVwiYCkgYWRkcmVzcyBpbnRvIGEge0BsaW5rIFBhcnNlZElwfSwgb3JcbiAqIGBudWxsYCB3aGVuIHRoZSBpbnB1dCBpc24ndCBhIHZhbGlkIGxpdGVyYWwuIE5ldmVyIHRocm93cy4gU3Vycm91bmRpbmdcbiAqIHdoaXRlc3BhY2UsIGBbLi4uXWAgYnJhY2tldHMgYXJvdW5kIGFuIElQdjYgbGl0ZXJhbCwgYW5kIGFuIElQdjYgem9uZVxuICogaWQgKGBmZTgwOjoxJWV0aDBgKSBhcmUgYWxsIHRvbGVyYXRlZC4gVGhlIGB2YWx1ZWAgaXMgcmV0dXJuZWQgYXMgYVxuICogYGJpZ2ludGAgc28gdjQgYW5kIHY2IHNoYXJlIG9uZSBjb21wYXJpc29uIHBhdGguXG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlSXAoXCIxMC4wLjAuMVwiKTsgICAgICAgIC8vIHsgdmVyc2lvbjogNCwgdmFsdWU6IDE2Nzc3MjE2MW4gfVxuICogcGFyc2VJcChcIjIwMDE6ZGI4OjoxXCIpOyAgICAgLy8geyB2ZXJzaW9uOiA2LCB2YWx1ZTogLi4uIH1cbiAqIHBhcnNlSXAoXCJub3QtYW4taXBcIik7ICAgICAgIC8vIG51bGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSXAoaW5wdXQ6IHN0cmluZyk6IFBhcnNlZElwIHwgbnVsbCB7XG4gIGxldCB0ZXh0ID0gaW5wdXQudHJpbSgpO1xuICBpZiAodGV4dC5zdGFydHNXaXRoKFwiW1wiKSAmJiB0ZXh0LmVuZHNXaXRoKFwiXVwiKSkgdGV4dCA9IHRleHQuc2xpY2UoMSwgLTEpO1xuICBpZiAodGV4dC5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICAvLyBEcm9wIGFuIElQdjYgem9uZSBpZCAoYGZlODA6OjElZXRoMGApIC0gaXQgaXNuJ3QgcGFydCBvZiB0aGUgYWRkcmVzcy5cbiAgICBjb25zdCB6b25lID0gdGV4dC5pbmRleE9mKFwiJVwiKTtcbiAgICBpZiAoem9uZSA+PSAwKSB0ZXh0ID0gdGV4dC5zbGljZSgwLCB6b25lKTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSXB2Nih0ZXh0KTtcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyBudWxsIDogeyB2ZXJzaW9uOiA2LCB2YWx1ZSB9O1xuICB9XG4gIGNvbnN0IHZhbHVlID0gcGFyc2VJcHY0KHRleHQpO1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyBudWxsIDogeyB2ZXJzaW9uOiA0LCB2YWx1ZSB9O1xufVxuXG4vKipcbiAqIFBhcnNlIGEgQ0lEUiBibG9jayAoYFwiMTAuMC4wLjAvOFwiYCwgYFwiMjAwMTpkYjg6Oi8zMlwiYCkgaW50byBhXG4gKiB7QGxpbmsgQ2lkcn0gd2l0aCBob3N0IGJpdHMgY2xlYXJlZCBmcm9tIGBiYXNlYCwgb3IgYG51bGxgIHdoZW4gdGhlXG4gKiBpbnB1dCBpc24ndCBhIHZhbGlkIGJsb2NrIChiYWQgYWRkcmVzcywgbWlzc2luZyAvIG91dC1vZi1yYW5nZVxuICogcHJlZml4KS4gTmV2ZXIgdGhyb3dzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBwYXJzZUNpZHIoXCIxMC4wLjAuMC84XCIpPy5iYXNlOyAgIC8vIDE2Nzc3MjE2MG4gKDEwLjAuMC4wKVxuICogcGFyc2VDaWRyKFwiMTAuMS4yLjMvOFwiKT8uYmFzZTsgICAvLyAxNjc3NzIxNjBuIChob3N0IGJpdHMgZHJvcHBlZClcbiAqIHBhcnNlQ2lkcihcIjEwLjAuMC4wLzQwXCIpOyAgICAgICAgLy8gbnVsbCAocHJlZml4ID4gMzIgZm9yIHY0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDaWRyKGlucHV0OiBzdHJpbmcpOiBDaWRyIHwgbnVsbCB7XG4gIGNvbnN0IHRleHQgPSBpbnB1dC50cmltKCk7XG4gIGNvbnN0IHNsYXNoID0gdGV4dC5sYXN0SW5kZXhPZihcIi9cIik7XG4gIGlmIChzbGFzaCA8IDApIHJldHVybiBudWxsO1xuICBjb25zdCBwcmVmaXhUZXh0ID0gdGV4dC5zbGljZShzbGFzaCArIDEpO1xuICBpZiAoIUlQVjRfT0NURVQudGVzdChwcmVmaXhUZXh0KSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGlwID0gcGFyc2VJcCh0ZXh0LnNsaWNlKDAsIHNsYXNoKSk7XG4gIGlmICghaXApIHJldHVybiBudWxsO1xuICBjb25zdCBwcmVmaXggPSBOdW1iZXIocHJlZml4VGV4dCk7XG4gIGNvbnN0IGJpdHMgPSBJUF9CSVRTW2lwLnZlcnNpb25dO1xuICBpZiAocHJlZml4ID4gYml0cykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGJhc2UgPSBpcC52YWx1ZSAmIG5ldHdvcmtNYXNrKGJpdHMsIHByZWZpeCk7XG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogaXAudmVyc2lvbixcbiAgICBiYXNlLFxuICAgIHByZWZpeCxcbiAgICBjaWRyOiBgJHt0ZXh0LnNsaWNlKDAsIHNsYXNoKX0vJHtwcmVmaXh9YCxcbiAgfTtcbn1cblxuLyoqXG4gKiBUZXN0IHdoZXRoZXIgYGlwYCBmYWxscyBpbnNpZGUgYGNpZHJgLiBCb3RoIGFyZ3VtZW50cyBhY2NlcHQgZWl0aGVyXG4gKiBhIHN0cmluZyAocGFyc2VkIG9uIHRoZSBmbHkgdmlhIHtAbGluayBwYXJzZUlwfSAvIHtAbGluayBwYXJzZUNpZHJ9KVxuICogb3IgYW4gYWxyZWFkeS1wYXJzZWQgdmFsdWUgLSBwYXNzIHBhcnNlZCB2YWx1ZXMgaW4gaG90IGxvb3BzIHRvIHNraXBcbiAqIHJlLXBhcnNpbmcuIFJldHVybnMgYGZhbHNlYCBmb3IgdW5wYXJzZWFibGUgaW5wdXQgb3IgYSB2ZXJzaW9uXG4gKiBtaXNtYXRjaCAoYW4gSVB2NCBhZGRyZXNzIGlzIG5ldmVyIGluc2lkZSBhbiBJUHY2IGJsb2NrKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaXBJbkNpZHIoXCIxMC4xLjIuM1wiLCBcIjEwLjAuMC4wLzhcIik7ICAgLy8gdHJ1ZVxuICogaXBJbkNpZHIoXCIxMS4wLjAuMVwiLCBcIjEwLjAuMC4wLzhcIik7ICAgLy8gZmFsc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlwSW5DaWRyKGlwOiBzdHJpbmcgfCBQYXJzZWRJcCwgY2lkcjogc3RyaW5nIHwgQ2lkcik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZWRJcCA9IHR5cGVvZiBpcCA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlSXAoaXApIDogaXA7XG4gIGNvbnN0IHBhcnNlZENpZHIgPSB0eXBlb2YgY2lkciA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlQ2lkcihjaWRyKSA6IGNpZHI7XG4gIGlmICghcGFyc2VkSXAgfHwgIXBhcnNlZENpZHIgfHwgcGFyc2VkSXAudmVyc2lvbiAhPT0gcGFyc2VkQ2lkci52ZXJzaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IG1hc2sgPSBuZXR3b3JrTWFzayhJUF9CSVRTW3BhcnNlZENpZHIudmVyc2lvbl0sIHBhcnNlZENpZHIucHJlZml4KTtcbiAgcmV0dXJuIChwYXJzZWRJcC52YWx1ZSAmIG1hc2spID09PSBwYXJzZWRDaWRyLmJhc2U7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBmaXJzdCBDSURSIGluIGBjaWRyc2AgdGhhdCBjb250YWlucyBgaXBgLCBvciBgbnVsbGAgd2hlblxuICogbm9uZSBtYXRjaC4gYGNpZHJzYCBob2xkcyBwcmUtcGFyc2VkIHtAbGluayBDaWRyfSB2YWx1ZXMgKG9yIGFueVxuICogb2JqZWN0IGV4dGVuZGluZyBpdCksIHNvIGNhbGxlcnMgY2FuIGNhcnJ5IHNpZGUgbWV0YWRhdGEgb24gZWFjaFxuICogZW50cnkgKGUuZy4gYSByZWdpb24gdGFnKSBhbmQgcmVhZCBpdCBzdHJhaWdodCBvZmYgdGhlIHJldHVybmVkXG4gKiBtYXRjaC4gTGluZWFyIHNjYW47IHBhcnNlIHRoZSBhZGRyZXNzIG9uY2UgYnkgcGFzc2luZyBhXG4gKiB7QGxpbmsgUGFyc2VkSXB9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByYW5nZXMgPSBbXCIxMC4wLjAuMC84XCIsIFwiMTkyLjE2OC4wLjAvMTZcIl1cbiAqICAgLm1hcChwYXJzZUNpZHIpXG4gKiAgIC5maWx0ZXIoKGMpOiBjIGlzIENpZHIgPT4gYyAhPT0gbnVsbCk7XG4gKiBmaW5kQ29udGFpbmluZ0NpZHIoXCIxMC4xLjIuM1wiLCByYW5nZXMpPy5jaWRyOyAvLyBcIjEwLjAuMC4wLzhcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbnRhaW5pbmdDaWRyPFQgZXh0ZW5kcyBDaWRyPihcbiAgaXA6IHN0cmluZyB8IFBhcnNlZElwLFxuICBjaWRyczogSXRlcmFibGU8VD4sXG4pOiBUIHwgbnVsbCB7XG4gIGNvbnN0IHBhcnNlZElwID0gdHlwZW9mIGlwID09PSBcInN0cmluZ1wiID8gcGFyc2VJcChpcCkgOiBpcDtcbiAgaWYgKCFwYXJzZWRJcCkgcmV0dXJuIG51bGw7XG4gIGZvciAoY29uc3QgY2lkciBvZiBjaWRycykge1xuICAgIGlmIChjaWRyLnZlcnNpb24gIT09IHBhcnNlZElwLnZlcnNpb24pIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1hc2sgPSBuZXR3b3JrTWFzayhJUF9CSVRTW2NpZHIudmVyc2lvbl0sIGNpZHIucHJlZml4KTtcbiAgICBpZiAoKHBhcnNlZElwLnZhbHVlICYgbWFzaykgPT09IGNpZHIuYmFzZSkgcmV0dXJuIGNpZHI7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogV2hldGhlciBgaW5wdXRgJ3MgaG9zdCBpcyBhIGxvb3BiYWNrIGFkZHJlc3MgLSBgbG9jYWxob3N0YCwgYW4gSVB2NFxuICogYDEyNy4wLjAuMC84YCBhZGRyZXNzLCBvciBJUHY2IGA6OjFgIC0gaS5lLiBhIHNlcnZpY2UgcnVubmluZyBvbiB0aGlzXG4gKiBtYWNoaW5lIChlLmcuIGEgbG9jYWwgcmVnaXN0cnkpLiBBY2NlcHRzIGFueXRoaW5nIHtAbGluayB1cmxCdWlsZGVyfVxuICogY29lcmNlcyAoYSBVUkwgc3RyaW5nLCBgVVJMYCwgb3IgYHsgdXJsIH1gKTsgcmV0dXJucyBgZmFsc2VgIHdoZW4gdGhlXG4gKiBpbnB1dCBoYXMgbm8gcmVzb2x2YWJsZSBob3N0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpc0xvb3BiYWNrSG9zdChcImh0dHA6Ly9sb2NhbGhvc3Q6NDg3M1wiKTsgLy8gdHJ1ZVxuICogaXNMb29wYmFja0hvc3QoXCJodHRwOi8vMTI3LjAuMC4xXCIpOyAgICAgICAvLyB0cnVlXG4gKiBpc0xvb3BiYWNrSG9zdChcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnXCIpOyAvLyBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMb29wYmFja0hvc3QoaW5wdXQ6IFVybExpa2UpOiBib29sZWFuIHtcbiAgY29uc3QgaG9zdCA9IHVybEJ1aWxkZXIoaW5wdXQpPy5ob3N0bmFtZTtcbiAgaWYgKCFob3N0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChob3N0ID09PSBcImxvY2FsaG9zdFwiKSByZXR1cm4gdHJ1ZTtcbiAgLy8gYFVSTGAgYnJhY2tldHMgYW4gSVB2NiBob3N0IChgWzo6MV1gKTsgc3RyaXAgdGhlbSBiZWZvcmUgcGFyc2luZy5cbiAgY29uc3QgaXAgPSBob3N0LnJlcGxhY2UoL15cXFt8XFxdJC9nLCBcIlwiKTtcbiAgcmV0dXJuIGlwSW5DaWRyKGlwLCBcIjEyNy4wLjAuMC84XCIpIHx8IGlwSW5DaWRyKGlwLCBcIjo6MS8xMjhcIik7XG59XG5cbi8qKlxuICogTmV0d29yayBtYXNrIGZvciBgcHJlZml4YCBsZWFkaW5nIGJpdHMgb2YgYSBgYml0c2Atd2lkZSBhZGRyZXNzIGFzIGFcbiAqIGBiaWdpbnRgOiB0aGUgdG9wIGBwcmVmaXhgIGJpdHMgc2V0LCB0aGUgbG93IGhvc3QgYml0cyBjbGVhcmVkLlxuICogYHByZWZpeCA9PT0gMGAgeWllbGRzIGAwbmAgKG1hdGNoZXMgZXZlcnl0aGluZyk7IGBwcmVmaXggPT09IGJpdHNgXG4gKiB5aWVsZHMgdGhlIGFsbC1vbmVzIG1hc2sgKG1hdGNoZXMgYSBzaW5nbGUgYWRkcmVzcykuXG4gKi9cbmZ1bmN0aW9uIG5ldHdvcmtNYXNrKGJpdHM6IG51bWJlciwgcHJlZml4OiBudW1iZXIpOiBiaWdpbnQge1xuICBjb25zdCBob3N0Qml0cyA9IEJpZ0ludChiaXRzIC0gcHJlZml4KTtcbiAgY29uc3QgZnVsbCA9ICgxbiA8PCBCaWdJbnQoYml0cykpIC0gMW47XG4gIHJldHVybiBmdWxsIF4gKCgxbiA8PCBob3N0Qml0cykgLSAxbik7XG59XG5cbi8qKiBQYXJzZSBhIGRvdHRlZC1xdWFkIElQdjQgbGl0ZXJhbCBpbnRvIGEgMzItYml0IHZhbHVlLCBlbHNlIGBudWxsYC4gKi9cbmZ1bmN0aW9uIHBhcnNlSXB2NChpbnB1dDogc3RyaW5nKTogYmlnaW50IHwgbnVsbCB7XG4gIGNvbnN0IHBhcnRzID0gaW5wdXQuc3BsaXQoXCIuXCIpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgbGV0IHZhbHVlID0gMG47XG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmICghSVBWNF9PQ1RFVC50ZXN0KHBhcnQpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBvY3RldCA9IE51bWJlcihwYXJ0KTtcbiAgICBpZiAob2N0ZXQgPiAyNTUpIHJldHVybiBudWxsO1xuICAgIHZhbHVlID0gKHZhbHVlIDw8IDhuKSB8IEJpZ0ludChvY3RldCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuIElQdjYgbGl0ZXJhbCBpbnRvIGEgMTI4LWJpdCB2YWx1ZSwgZWxzZSBgbnVsbGAuIEhhbmRsZXMgYDo6YFxuICogemVyby1jb21wcmVzc2lvbiAoYXQgbW9zdCBvbmNlKSBhbmQgYSB0cmFpbGluZyBlbWJlZGRlZCBJUHY0IGdyb3VwXG4gKiAoYDo6ZmZmZjoxLjIuMy40YCkuIFRoZSB6b25lIGlkLCBpZiBhbnksIGlzIGV4cGVjdGVkIHRvIGJlIHN0cmlwcGVkXG4gKiBieSB7QGxpbmsgcGFyc2VJcH0gYmVmb3JlIHRoaXMgaXMgY2FsbGVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUlwdjYoaW5wdXQ6IHN0cmluZyk6IGJpZ2ludCB8IG51bGwge1xuICBjb25zdCBoYWx2ZXMgPSBpbnB1dC5zcGxpdChcIjo6XCIpO1xuICBpZiAoaGFsdmVzLmxlbmd0aCA+IDIpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGhlYWQgPSBwYXJzZUhleHRldHMoaGFsdmVzWzBdISk7XG4gIGlmIChoZWFkID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICBpZiAoaGFsdmVzLmxlbmd0aCA9PT0gMikge1xuICAgIGNvbnN0IHRhaWwgPSBwYXJzZUhleHRldHMoaGFsdmVzWzFdISk7XG4gICAgaWYgKHRhaWwgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgIC8vIFwiOjpcIiBtdXN0IHN0YW5kIGluIGZvciBhdCBsZWFzdCBvbmUgYWxsLXplcm8gaGV4dGV0LlxuICAgIGNvbnN0IG1pc3NpbmcgPSA4IC0gaGVhZC5sZW5ndGggLSB0YWlsLmxlbmd0aDtcbiAgICBpZiAobWlzc2luZyA8IDEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBoZXh0ZXRzVG9WYWx1ZShbLi4uaGVhZCwgLi4uQXJyYXkobWlzc2luZykuZmlsbCgwKSwgLi4udGFpbF0pO1xuICB9XG5cbiAgaWYgKGhlYWQubGVuZ3RoICE9PSA4KSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGhleHRldHNUb1ZhbHVlKGhlYWQpO1xufVxuXG4vKipcbiAqIFBhcnNlIG9uZSBjb2xvbi1zZXBhcmF0ZWQgcnVuIG9mIElQdjYgaGV4dGV0cywgZXhwYW5kaW5nIGEgdHJhaWxpbmdcbiAqIGVtYmVkZGVkIElQdjQgZ3JvdXAgaW50byBpdHMgdHdvIGhleHRldHMuIEFuIGVtcHR5IHN0cmluZyB5aWVsZHMgYW5cbiAqIGVtcHR5IGxpc3QgKHRoZSBzaWRlIG9mIGEgbGVhZGluZyAvIHRyYWlsaW5nIGA6OmApLlxuICovXG5mdW5jdGlvbiBwYXJzZUhleHRldHMocGFydDogc3RyaW5nKTogbnVtYmVyW10gfCBudWxsIHtcbiAgaWYgKHBhcnQgPT09IFwiXCIpIHJldHVybiBbXTtcbiAgY29uc3QgdG9rZW5zID0gcGFydC5zcGxpdChcIjpcIik7XG4gIGNvbnN0IGhleHRldHM6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaV0hO1xuICAgIGlmICh0b2tlbi5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIC8vIEEgZG90dGVkLXF1YWQgaXMgb25seSBsZWdhbCBhcyB0aGUgZmluYWwgZ3JvdXAuXG4gICAgICBpZiAoaSAhPT0gdG9rZW5zLmxlbmd0aCAtIDEpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgdjQgPSBwYXJzZUlwdjQodG9rZW4pO1xuICAgICAgaWYgKHY0ID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgIGhleHRldHMucHVzaChOdW1iZXIoKHY0ID4+IDE2bikgJiAweGZmZmZuKSwgTnVtYmVyKHY0ICYgMHhmZmZmbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIUlQVjZfSEVYVEVULnRlc3QodG9rZW4pKSByZXR1cm4gbnVsbDtcbiAgICAgIGhleHRldHMucHVzaChwYXJzZUludCh0b2tlbiwgMTYpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhleHRldHM7XG59XG5cbi8qKiBGb2xkIGV4YWN0bHkgOCBoZXh0ZXRzIGludG8gYSBzaW5nbGUgMTI4LWJpdCBgYmlnaW50YCwgZWxzZSBgbnVsbGAuICovXG5mdW5jdGlvbiBoZXh0ZXRzVG9WYWx1ZShoZXh0ZXRzOiBudW1iZXJbXSk6IGJpZ2ludCB8IG51bGwge1xuICBpZiAoaGV4dGV0cy5sZW5ndGggIT09IDgpIHJldHVybiBudWxsO1xuICBsZXQgdmFsdWUgPSAwbjtcbiAgZm9yIChjb25zdCBoZXh0ZXQgb2YgaGV4dGV0cykgdmFsdWUgPSAodmFsdWUgPDwgMTZuKSB8IEJpZ0ludChoZXh0ZXQpO1xuICByZXR1cm4gdmFsdWU7XG59XG4iXX0=
@@ -16,8 +16,8 @@
16
16
  * can be derived from it, and {@link NameLike}/{@link NonFunctionKeys} describe
17
17
  * object shapes.
18
18
  *
19
- * Iterable helpers: {@link generator} flattens mixed arguments; {@link sequence}
20
- * wraps source(s) in a lazy, `Array`-compatible {@link Sequence}. Every
19
+ * Iterable helpers: {@link sequence} wraps source(s) in a lazy, `Array`-compatible
20
+ * {@link Sequence}. Every
21
21
  * transform/terminal is a standalone function operating on plain {@link
22
22
  * Container}s (see {@link map}, {@link filter}, {@link group}, ...); the {@link
23
23
  * Sequence} methods are thin forwarders over them so the same logic backs both
@@ -333,18 +333,6 @@ declare class SequenceImpl<T> {
333
333
  * @param sources - Iterables to concatenate, in order (`Map` sources use values).
334
334
  */
335
335
  export declare function sequence<T>(...sources: readonly SequenceSource<T>[]): Sequence<T>;
336
- /**
337
- * Flattens a mix of single items and iterables into one lazy {@link Generator}.
338
- *
339
- * Arguments are emitted in order: `null`/`undefined` are skipped, non-string
340
- * iterables (per {@link isContainer}) are yielded element-by-element, and
341
- * anything else (including strings) is yielded as a single item.
342
- *
343
- * @typeParam T - Element type produced by the generator.
344
- * @param items - Items and/or iterables to flatten, in order.
345
- * @returns A generator over the flattened elements.
346
- */
347
- export declare function generator<T>(...items: readonly (T | Iterable<T> | null | undefined)[]): Generator<T>;
348
336
  /** Minimal shape for objects that expose an optional `name` (e.g. AppKit plugins). */
349
337
  export interface NameLike {
350
338
  name?: string;