UNPKG

cdk8s-plus-29

Version:

cdk8s+ is a software development framework that provides high level abstractions for authoring Kubernetes applications. cdk8s-plus-29 synthesizes Kubernetes manifests for Kubernetes 1.29.0

246 lines 34.6 kB
"use strict"; var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); exports.IngressBackend = exports.Ingress = exports.HttpIngressPathType = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const cdk8s_1 = require("cdk8s"); const base = require("./base"); const k8s = require("./imports/k8s"); /** * Specify how the path is matched against request paths. * * @see https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types */ var HttpIngressPathType; (function (HttpIngressPathType) { /** * Matches the URL path exactly. */ HttpIngressPathType["PREFIX"] = "Prefix"; /** * Matches based on a URL path prefix split by '/'. */ HttpIngressPathType["EXACT"] = "Exact"; /** * Matching is specified by the underlying IngressClass. */ HttpIngressPathType["IMPLEMENTATION_SPECIFIC"] = "ImplementationSpecific"; })(HttpIngressPathType || (exports.HttpIngressPathType = HttpIngressPathType = {})); /** * Ingress is a collection of rules that allow inbound connections to reach the * endpoints defined by a backend. An Ingress can be configured to give services * externally-reachable urls, load balance traffic, terminate SSL, offer name * based virtual hosting etc. */ class Ingress extends base.Resource { constructor(scope, id, props = {}) { super(scope, id); this.resourceType = 'ingresses'; this._rulesPerHost = {}; this._tlsConfig = []; this.apiObject = new k8s.KubeIngress(this, 'Resource', { metadata: props.metadata, spec: { defaultBackend: cdk8s_1.Lazy.any({ produce: () => this._defaultBackend?._toKube() }), ingressClassName: props.className, rules: cdk8s_1.Lazy.any({ produce: () => this.synthRules() }), tls: cdk8s_1.Lazy.any({ produce: () => this.tlsConfig() }), }, }); if (props.defaultBackend) { this.addDefaultBackend(props.defaultBackend); } this.addRules(...props.rules ?? []); if (props.tls) { this.addTls(props.tls); } this.node.addValidation({ validate: () => this._validate() }); } _validate() { if (!this._defaultBackend && Object.keys(this._rulesPerHost).length === 0) { return ['ingress with no rules or default backend']; } return []; } /** * Defines the default backend for this ingress. A default backend capable of * servicing requests that don't match any rule. * * @param backend The backend to use for requests that do not match any rule. */ addDefaultBackend(backend) { this.addRules({ backend }); } /** * Specify a default backend for a specific host name. This backend will be used as a catch-all for requests * targeted to this host name (the `Host` header matches this value). * * @param host The host name to match * @param backend The backend to route to */ addHostDefaultBackend(host, backend) { if (!host) { throw new Error('host must not be an empty string'); } this.addRules({ host, backend }); } /** * Adds an ingress rule applied to requests to a specific host and a specific * HTTP path (the `Host` header matches this value). * * @param host The host name * @param path The HTTP path * @param backend The backend to route requests to * @param pathType How the path is matched against request paths */ addHostRule(host, path, backend, pathType) { if (!host) { throw new Error('host must not be an empty string'); } this.addRules({ host, backend, path, pathType }); } /** * Adds an ingress rule applied to requests sent to a specific HTTP path. * * @param path The HTTP path * @param backend The backend to route requests to * @param pathType How the path is matched against request paths */ addRule(path, backend, pathType) { this.addRules({ backend, path, pathType }); } /** * Adds rules to this ingress. * @param rules The rules to add */ addRules(...rules) { for (const rule of rules) { // default backend is not really a rule if (!rule.host && !rule.path) { if (this._defaultBackend) { throw new Error('a default backend is already defined for this ingress'); } this._defaultBackend = rule.backend; continue; } const host = rule.host ?? ''; const backend = rule.backend; const path = rule.path ?? '/'; const pathType = rule.pathType ?? HttpIngressPathType.PREFIX; if (path && !path.startsWith('/')) { throw new Error(`ingress paths must begin with a "/": ${path}`); } const routes = this._rulesPerHost[host] = this._rulesPerHost[host] ?? []; // check if we already have a rule for this host/path if (routes.find(r => r.path === path)) { throw new Error(`there is already an ingress rule for ${host}${path}`); } routes.push({ backend: backend._toKube(), path, pathType, }); } } synthRules() { const rules = new Array(); for (const [host, paths] of Object.entries(this._rulesPerHost)) { rules.push({ host: host ? host : undefined, http: { paths: paths.sort(sortByPath) }, }); } return rules.length > 0 ? rules : undefined; } addTls(tls) { this._tlsConfig.push(...tls); } tlsConfig() { if (this._tlsConfig.length == 0) { return undefined; } const tls = new Array(); for (const entry of this._tlsConfig) { tls.push({ hosts: entry.hosts, secretName: entry.secret?.name, }); } return tls; } } exports.Ingress = Ingress; _a = JSII_RTTI_SYMBOL_1; Ingress[_a] = { fqn: "cdk8s-plus-29.Ingress", version: "2.6.0" }; /** * The backend for an ingress path. */ class IngressBackend { /** * A Kubernetes `Service` to use as the backend for this path. * @param serv The service object. */ static fromService(serv, options = {}) { if (serv.ports.length === 0) { throw new Error('service does not expose any ports'); } let servicePort; if (serv.ports.length === 1) { servicePort = serv.ports[0].port; } else { if (options.port !== undefined) { const found = serv.ports.find(p => p.port === options.port); if (found) { servicePort = found.port; } else { throw new Error(`service exposes ports ${serv.ports.map(p => p.port).join(',')} but backend is defined to use port ${options.port}`); } } else { throw new Error(`unable to determine service port since service exposes multiple ports: ${serv.ports.map(x => x.port).join(',')}`); } } if (options.port !== undefined && servicePort !== options.port) { throw new Error(`backend defines port ${options.port} but service exposes port ${servicePort}`); } return new IngressBackend({ service: { name: serv.name, port: { number: servicePort }, }, }); } /** * A Resource backend is an ObjectRef to another Kubernetes resource * within the same namespace as the Ingress object. * A common usage for a Resource backend is to ingress data to an object * storage backend with static assets. */ static fromResource(resource) { return new IngressBackend({ resource: { kind: resource.kind, name: resource.name, apiGroup: resource.apiGroup, }, }); } constructor(backend) { this.backend = backend; } /** * @internal */ _toKube() { return this.backend; } } exports.IngressBackend = IngressBackend; _b = JSII_RTTI_SYMBOL_1; IngressBackend[_b] = { fqn: "cdk8s-plus-29.IngressBackend", version: "2.6.0" }; function sortByPath(lhs, rhs) { const p1 = lhs.path ?? ''; const p2 = rhs.path ?? ''; return p1.localeCompare(p2); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5ncmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmdyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaUNBQXdDO0FBRXhDLCtCQUErQjtBQUMvQixxQ0FBcUM7QUFpRHJDOzs7O0dBSUc7QUFDSCxJQUFZLG1CQWVYO0FBZkQsV0FBWSxtQkFBbUI7SUFDN0I7O09BRUc7SUFDSCx3Q0FBaUIsQ0FBQTtJQUVqQjs7T0FFRztJQUNILHNDQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILHlFQUFrRCxDQUFBO0FBQ3BELENBQUMsRUFmVyxtQkFBbUIsbUNBQW5CLG1CQUFtQixRQWU5QjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSxPQUFRLFNBQVEsSUFBSSxDQUFDLFFBQVE7SUFheEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxRQUFzQixFQUFFO1FBQ2hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFQSCxpQkFBWSxHQUFHLFdBQVcsQ0FBQztRQUUxQixrQkFBYSxHQUE4QyxFQUFFLENBQUM7UUFFOUQsZUFBVSxHQUFpQixFQUFFLENBQUM7UUFLN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNyRCxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsSUFBSSxFQUFFO2dCQUNKLGNBQWMsRUFBRSxZQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDNUUsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQ2pDLEtBQUssRUFBRSxZQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUNyRCxH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RUFBRSxXQUFXLEVBQUU7YUFDOUI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQXdCO1FBQ2pELE9BQU8sSUFBSSxjQUFjLENBQUM7WUFDeEIsUUFBUSxFQUFFO2dCQUNSLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7YUFDNUI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBcUMsT0FBMkI7UUFBM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7SUFFaEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7O0FBN0QzQyx3Q0E4REM7OztBQTRFRCxTQUFTLFVBQVUsQ0FBQyxHQUF3QixFQUFFLEdBQXdCO0lBQ3BFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQzFCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQzFCLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBpT2JqZWN0LCBMYXp5IH0gZnJvbSAnY2RrOHMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBrOHMgZnJvbSAnLi9pbXBvcnRzL2s4cyc7XG5pbXBvcnQgKiBhcyBzZWNyZXQgZnJvbSAnLi9zZWNyZXQnO1xuaW1wb3J0ICogYXMgc2VydmljZSBmcm9tICcuL3NlcnZpY2UnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGBJbmdyZXNzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdyZXNzUHJvcHMgZXh0ZW5kcyBiYXNlLlJlc291cmNlUHJvcHMge1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgYmFja2VuZCBzZXJ2aWNlcyByZXF1ZXN0cyB0aGF0IGRvIG5vdCBtYXRjaCBhbnkgcnVsZS5cbiAgICpcbiAgICogVXNpbmcgdGhpcyBvcHRpb24gb3IgdGhlIGBhZGREZWZhdWx0QmFja2VuZCgpYCBtZXRob2QgaXMgZXF1aXZhbGVudCB0b1xuICAgKiBhZGRpbmcgYSBydWxlIHdpdGggYm90aCBgcGF0aGAgYW5kIGBob3N0YCB1bmRlZmluZWQuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0QmFja2VuZD86IEluZ3Jlc3NCYWNrZW5kO1xuXG4gIC8qKlxuICAgKiBSb3V0aW5nIHJ1bGVzIGZvciB0aGlzIGluZ3Jlc3MuXG4gICAqXG4gICAqIEVhY2ggcnVsZSBtdXN0IGRlZmluZSBhbiBgSW5ncmVzc0JhY2tlbmRgIHRoYXQgd2lsbCByZWNlaXZlIHRoZSByZXF1ZXN0c1xuICAgKiB0aGF0IG1hdGNoIHRoaXMgcnVsZS4gSWYgYm90aCBgaG9zdGAgYW5kIGBwYXRoYCBhcmUgbm90IHNwZWNpZmllYywgdGhpc1xuICAgKiBiYWNrZW5kIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBiYWNrZW5kIG9mIHRoZSBpbmdyZXNzLlxuICAgKlxuICAgKiBZb3UgY2FuIGFsc28gYWRkIHJ1bGVzIGxhdGVyIHVzaW5nIGBhZGRSdWxlKClgLCBgYWRkSG9zdFJ1bGUoKWAsXG4gICAqIGBhZGREZWZhdWx0QmFja2VuZCgpYCBhbmQgYGFkZEhvc3REZWZhdWx0QmFja2VuZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bGVzPzogSW5ncmVzc1J1bGVbXTtcblxuXG4gIC8qKlxuICAgKiBUTFMgc2V0dGluZ3MgZm9yIHRoaXMgaW5ncmVzcy5cbiAgICpcbiAgICogVXNpbmcgdGhpcyBvcHRpb24gdGVsbHMgdGhlIGluZ3Jlc3MgY29udHJvbGxlciB0byBleHBvc2UgYSBUTFMgZW5kcG9pbnQuXG4gICAqIEN1cnJlbnRseSB0aGUgSW5ncmVzcyBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIFRMUyBwb3J0LCA0NDMuIElmIG11bHRpcGxlXG4gICAqIG1lbWJlcnMgb2YgdGhpcyBsaXN0IHNwZWNpZnkgZGlmZmVyZW50IGhvc3RzLCB0aGV5IHdpbGwgYmUgbXVsdGlwbGV4ZWQgb25cbiAgICogdGhlIHNhbWUgcG9ydCBhY2NvcmRpbmcgdG8gdGhlIGhvc3RuYW1lIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBTTkkgVExTXG4gICAqIGV4dGVuc2lvbiwgaWYgdGhlIGluZ3Jlc3MgY29udHJvbGxlciBmdWxmaWxsaW5nIHRoZSBpbmdyZXNzIHN1cHBvcnRzIFNOSS5cbiAgICovXG4gIHJlYWRvbmx5IHRscz86IEluZ3Jlc3NUbHNbXTtcblxuICAvKipcbiAgICogQ2xhc3MgTmFtZSBmb3IgdGhpcyBpbmdyZXNzLlxuICAgKlxuICAgKiBUaGlzIGZpZWxkIGlzIGEgcmVmZXJlbmNlIHRvIGFuIEluZ3Jlc3NDbGFzcyByZXNvdXJjZSB0aGF0IGNvbnRhaW5zXG4gICAqIGFkZGl0aW9uYWwgSW5ncmVzcyBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlIEluZ3Jlc3MgY29udHJvbGxlci5cbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTcGVjaWZ5IGhvdyB0aGUgcGF0aCBpcyBtYXRjaGVkIGFnYWluc3QgcmVxdWVzdCBwYXRocy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3NlcnZpY2VzLW5ldHdvcmtpbmcvaW5ncmVzcy8jcGF0aC10eXBlc1xuICovXG5leHBvcnQgZW51bSBIdHRwSW5ncmVzc1BhdGhUeXBlIHtcbiAgLyoqXG4gICAqIE1hdGNoZXMgdGhlIFVSTCBwYXRoIGV4YWN0bHkuXG4gICAqL1xuICBQUkVGSVggPSAnUHJlZml4JyxcblxuICAvKipcbiAgICogTWF0Y2hlcyBiYXNlZCBvbiBhIFVSTCBwYXRoIHByZWZpeCBzcGxpdCBieSAnLycuXG4gICAqL1xuICBFWEFDVCA9ICdFeGFjdCcsXG5cbiAgLyoqXG4gICAqIE1hdGNoaW5nIGlzIHNwZWNpZmllZCBieSB0aGUgdW5kZXJseWluZyBJbmdyZXNzQ2xhc3MuXG4gICAqL1xuICBJTVBMRU1FTlRBVElPTl9TUEVDSUZJQyA9ICdJbXBsZW1lbnRhdGlvblNwZWNpZmljJyxcbn1cblxuLyoqXG4gKiBJbmdyZXNzIGlzIGEgY29sbGVjdGlvbiBvZiBydWxlcyB0aGF0IGFsbG93IGluYm91bmQgY29ubmVjdGlvbnMgdG8gcmVhY2ggdGhlXG4gKiBlbmRwb2ludHMgZGVmaW5lZCBieSBhIGJhY2tlbmQuIEFuIEluZ3Jlc3MgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZ2l2ZSBzZXJ2aWNlc1xuICogZXh0ZXJuYWxseS1yZWFjaGFibGUgdXJscywgbG9hZCBiYWxhbmNlIHRyYWZmaWMsIHRlcm1pbmF0ZSBTU0wsIG9mZmVyIG5hbWVcbiAqIGJhc2VkIHZpcnR1YWwgaG9zdGluZyBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmdyZXNzIGV4dGVuZHMgYmFzZS5SZXNvdXJjZSB7XG5cbiAgLyoqXG4gICAqIEBzZWUgYmFzZS5SZXNvdXJjZS5hcGlPYmplY3RcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcGlPYmplY3Q6IEFwaU9iamVjdDtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2VUeXBlID0gJ2luZ3Jlc3Nlcyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcnVsZXNQZXJIb3N0OiB7IFtob3N0OiBzdHJpbmddOiBrOHMuSHR0cEluZ3Jlc3NQYXRoW10gfSA9IHt9O1xuICBwcml2YXRlIF9kZWZhdWx0QmFja2VuZD86IEluZ3Jlc3NCYWNrZW5kO1xuICBwcml2YXRlIHJlYWRvbmx5IF90bHNDb25maWc6IEluZ3Jlc3NUbHNbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbmdyZXNzUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmFwaU9iamVjdCA9IG5ldyBrOHMuS3ViZUluZ3Jlc3ModGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbWV0YWRhdGE6IHByb3BzLm1ldGFkYXRhLFxuICAgICAgc3BlYzoge1xuICAgICAgICBkZWZhdWx0QmFja2VuZDogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLl9kZWZhdWx0QmFja2VuZD8uX3RvS3ViZSgpIH0pLFxuICAgICAgICBpbmdyZXNzQ2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHJ1bGVzOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMuc3ludGhSdWxlcygpIH0pLFxuICAgICAgICB0bHM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gdGhpcy50bHNDb25maWcoKSB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdEJhY2tlbmQpIHtcbiAgICAgIHRoaXMuYWRkRGVmYXVsdEJhY2tlbmQocHJvcHMuZGVmYXVsdEJhY2tlbmQpO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUnVsZXMoLi4ucHJvcHMucnVsZXMgPz8gW10pO1xuXG4gICAgaWYgKHByb3BzLnRscykge1xuICAgICAgdGhpcy5hZGRUbHMocHJvcHMudGxzKTtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbih7IHZhbGlkYXRlOiAoKSA9PiB0aGlzLl92YWxpZGF0ZSgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmFsaWRhdGUoKSB7XG4gICAgaWYgKCF0aGlzLl9kZWZhdWx0QmFja2VuZCAmJiBPYmplY3Qua2V5cyh0aGlzLl9ydWxlc1Blckhvc3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFsnaW5ncmVzcyB3aXRoIG5vIHJ1bGVzIG9yIGRlZmF1bHQgYmFja2VuZCddO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgZGVmYXVsdCBiYWNrZW5kIGZvciB0aGlzIGluZ3Jlc3MuIEEgZGVmYXVsdCBiYWNrZW5kIGNhcGFibGUgb2ZcbiAgICogc2VydmljaW5nIHJlcXVlc3RzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55IHJ1bGUuXG4gICAqXG4gICAqIEBwYXJhbSBiYWNrZW5kIFRoZSBiYWNrZW5kIHRvIHVzZSBmb3IgcmVxdWVzdHMgdGhhdCBkbyBub3QgbWF0Y2ggYW55IHJ1bGUuXG4gICAqL1xuICBwdWJsaWMgYWRkRGVmYXVsdEJhY2tlbmQoYmFja2VuZDogSW5ncmVzc0JhY2tlbmQpIHtcbiAgICB0aGlzLmFkZFJ1bGVzKHsgYmFja2VuZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgZGVmYXVsdCBiYWNrZW5kIGZvciBhIHNwZWNpZmljIGhvc3QgbmFtZS4gVGhpcyBiYWNrZW5kIHdpbGwgYmUgdXNlZCBhcyBhIGNhdGNoLWFsbCBmb3IgcmVxdWVzdHNcbiAgICogdGFyZ2V0ZWQgdG8gdGhpcyBob3N0IG5hbWUgKHRoZSBgSG9zdGAgaGVhZGVyIG1hdGNoZXMgdGhpcyB2YWx1ZSkuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IFRoZSBob3N0IG5hbWUgdG8gbWF0Y2hcbiAgICogQHBhcmFtIGJhY2tlbmQgVGhlIGJhY2tlbmQgdG8gcm91dGUgdG9cbiAgICovXG4gIHB1YmxpYyBhZGRIb3N0RGVmYXVsdEJhY2tlbmQoaG9zdDogc3RyaW5nLCBiYWNrZW5kOiBJbmdyZXNzQmFja2VuZCkge1xuICAgIGlmICghaG9zdCkgeyB0aHJvdyBuZXcgRXJyb3IoJ2hvc3QgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7IH1cbiAgICB0aGlzLmFkZFJ1bGVzKHsgaG9zdCwgYmFja2VuZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGluZ3Jlc3MgcnVsZSBhcHBsaWVkIHRvIHJlcXVlc3RzIHRvIGEgc3BlY2lmaWMgaG9zdCBhbmQgYSBzcGVjaWZpY1xuICAgKiBIVFRQIHBhdGggKHRoZSBgSG9zdGAgaGVhZGVyIG1hdGNoZXMgdGhpcyB2YWx1ZSkuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IFRoZSBob3N0IG5hbWVcbiAgICogQHBhcmFtIHBhdGggVGhlIEhUVFAgcGF0aFxuICAgKiBAcGFyYW0gYmFja2VuZCBUaGUgYmFja2VuZCB0byByb3V0ZSByZXF1ZXN0cyB0b1xuICAgKiBAcGFyYW0gcGF0aFR5cGUgSG93IHRoZSBwYXRoIGlzIG1hdGNoZWQgYWdhaW5zdCByZXF1ZXN0IHBhdGhzXG4gICAqL1xuICBwdWJsaWMgYWRkSG9zdFJ1bGUoaG9zdDogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIGJhY2tlbmQ6IEluZ3Jlc3NCYWNrZW5kLCBwYXRoVHlwZT86IEh0dHBJbmdyZXNzUGF0aFR5cGUpIHtcbiAgICBpZiAoIWhvc3QpIHsgdGhyb3cgbmV3IEVycm9yKCdob3N0IG11c3Qgbm90IGJlIGFuIGVtcHR5IHN0cmluZycpOyB9XG4gICAgdGhpcy5hZGRSdWxlcyh7IGhvc3QsIGJhY2tlbmQsIHBhdGgsIHBhdGhUeXBlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gaW5ncmVzcyBydWxlIGFwcGxpZWQgdG8gcmVxdWVzdHMgc2VudCB0byBhIHNwZWNpZmljIEhUVFAgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggVGhlIEhUVFAgcGF0aFxuICAgKiBAcGFyYW0gYmFja2VuZCBUaGUgYmFja2VuZCB0byByb3V0ZSByZXF1ZXN0cyB0b1xuICAgKiBAcGFyYW0gcGF0aFR5cGUgSG93IHRoZSBwYXRoIGlzIG1hdGNoZWQgYWdhaW5zdCByZXF1ZXN0IHBhdGhzXG4gICAqL1xuICBwdWJsaWMgYWRkUnVsZShwYXRoOiBzdHJpbmcsIGJhY2tlbmQ6IEluZ3Jlc3NCYWNrZW5kLCBwYXRoVHlwZT86IEh0dHBJbmdyZXNzUGF0aFR5cGUpIHtcbiAgICB0aGlzLmFkZFJ1bGVzKHsgYmFja2VuZCwgcGF0aCwgcGF0aFR5cGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBydWxlcyB0byB0aGlzIGluZ3Jlc3MuXG4gICAqIEBwYXJhbSBydWxlcyBUaGUgcnVsZXMgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgYWRkUnVsZXMoLi4ucnVsZXM6IEluZ3Jlc3NSdWxlW10pIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcblxuICAgICAgLy8gZGVmYXVsdCBiYWNrZW5kIGlzIG5vdCByZWFsbHkgYSBydWxlXG4gICAgICBpZiAoIXJ1bGUuaG9zdCAmJiAhcnVsZS5wYXRoKSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWZhdWx0QmFja2VuZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYSBkZWZhdWx0IGJhY2tlbmQgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGlzIGluZ3Jlc3MnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kZWZhdWx0QmFja2VuZCA9IHJ1bGUuYmFja2VuZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhvc3QgPSBydWxlLmhvc3QgPz8gJyc7XG4gICAgICBjb25zdCBiYWNrZW5kID0gcnVsZS5iYWNrZW5kO1xuICAgICAgY29uc3QgcGF0aCA9IHJ1bGUucGF0aCA/PyAnLyc7XG4gICAgICBjb25zdCBwYXRoVHlwZSA9IHJ1bGUucGF0aFR5cGUgPz8gSHR0cEluZ3Jlc3NQYXRoVHlwZS5QUkVGSVg7XG5cbiAgICAgIGlmIChwYXRoICYmICFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluZ3Jlc3MgcGF0aHMgbXVzdCBiZWdpbiB3aXRoIGEgXCIvXCI6ICR7cGF0aH1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm91dGVzID0gdGhpcy5fcnVsZXNQZXJIb3N0W2hvc3RdID0gdGhpcy5fcnVsZXNQZXJIb3N0W2hvc3RdID8/IFtdO1xuXG4gICAgICAvLyBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBydWxlIGZvciB0aGlzIGhvc3QvcGF0aFxuICAgICAgaWYgKHJvdXRlcy5maW5kKHIgPT4gci5wYXRoID09PSBwYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRoZXJlIGlzIGFscmVhZHkgYW4gaW5ncmVzcyBydWxlIGZvciAke2hvc3R9JHtwYXRofWApO1xuICAgICAgfVxuXG4gICAgICByb3V0ZXMucHVzaCh7XG4gICAgICAgIGJhY2tlbmQ6IGJhY2tlbmQuX3RvS3ViZSgpLFxuICAgICAgICBwYXRoLFxuICAgICAgICBwYXRoVHlwZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3ludGhSdWxlcygpOiB1bmRlZmluZWQgfCBrOHMuSW5ncmVzc1J1bGVbXSB7XG4gICAgY29uc3QgcnVsZXMgPSBuZXcgQXJyYXk8azhzLkluZ3Jlc3NSdWxlPigpO1xuXG4gICAgZm9yIChjb25zdCBbaG9zdCwgcGF0aHNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX3J1bGVzUGVySG9zdCkpIHtcbiAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICBob3N0OiBob3N0ID8gaG9zdCA6IHVuZGVmaW5lZCxcbiAgICAgICAgaHR0cDogeyBwYXRoczogcGF0aHMuc29ydChzb3J0QnlQYXRoKSB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ1bGVzLmxlbmd0aCA+IDAgPyBydWxlcyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUbHModGxzOiBJbmdyZXNzVGxzW10pIHtcbiAgICB0aGlzLl90bHNDb25maWcucHVzaCguLi50bHMpO1xuICB9XG5cbiAgcHJpdmF0ZSB0bHNDb25maWcoKTogdW5kZWZpbmVkIHwgazhzLkluZ3Jlc3NUbHNbXSB7XG4gICAgaWYgKHRoaXMuX3Rsc0NvbmZpZy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCB0bHMgPSBuZXcgQXJyYXk8azhzLkluZ3Jlc3NUbHM+KCk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLl90bHNDb25maWcpIHtcbiAgICAgIHRscy5wdXNoKHtcbiAgICAgICAgaG9zdHM6IGVudHJ5Lmhvc3RzLFxuICAgICAgICBzZWNyZXROYW1lOiBlbnRyeS5zZWNyZXQ/Lm5hbWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGxzO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc2V0dGluZyB1cCBiYWNrZW5kcyBmb3IgaW5ncmVzcyBydWxlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlSW5ncmVzc0JhY2tlbmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBwb3J0IHRvIHVzZSB0byBhY2Nlc3MgdGhlIHNlcnZpY2UuXG4gICAqXG4gICAqIC0gVGhpcyBvcHRpb24gd2lsbCBmYWlsIGlmIHRoZSBzZXJ2aWNlIGRvZXMgbm90IGV4cG9zZSBhbnkgcG9ydHMuXG4gICAqIC0gSWYgdGhlIHNlcnZpY2UgZXhwb3NlcyBtdWx0aXBsZSBwb3J0cywgdGhpcyBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQuXG4gICAqIC0gSWYgdGhlIHNlcnZpY2UgZXhwb3NlcyBhIHNpbmdsZSBwb3J0LCB0aGlzIG9wdGlvbiBpcyBvcHRpb25hbCBhbmQgaWZcbiAgICogICBzcGVjaWZpZWQsIGl0IG11c3QgYmUgdGhlIHNhbWUgcG9ydCBleHBvc2VkIGJ5IHRoZSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGlmIHRoZSBzZXJ2aWNlIGV4cG9zZXMgYSBzaW5nbGUgcG9ydCwgdGhpcyBwb3J0IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGJhY2tlbmQgZm9yIGFuIGluZ3Jlc3MgcGF0aC5cbiAqL1xuZXhwb3J0IGNsYXNzIEluZ3Jlc3NCYWNrZW5kIHtcbiAgLyoqXG4gICAqIEEgS3ViZXJuZXRlcyBgU2VydmljZWAgdG8gdXNlIGFzIHRoZSBiYWNrZW5kIGZvciB0aGlzIHBhdGguXG4gICAqIEBwYXJhbSBzZXJ2IFRoZSBzZXJ2aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcnZpY2Uoc2Vydjogc2VydmljZS5TZXJ2aWNlLCBvcHRpb25zOiBTZXJ2aWNlSW5ncmVzc0JhY2tlbmRPcHRpb25zID0ge30pIHtcbiAgICBpZiAoc2Vydi5wb3J0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2VydmljZSBkb2VzIG5vdCBleHBvc2UgYW55IHBvcnRzJyk7XG4gICAgfVxuXG4gICAgbGV0IHNlcnZpY2VQb3J0O1xuICAgIGlmIChzZXJ2LnBvcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgc2VydmljZVBvcnQgPSBzZXJ2LnBvcnRzWzBdLnBvcnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHNlcnYucG9ydHMuZmluZChwID0+IHAucG9ydCA9PT0gb3B0aW9ucy5wb3J0KTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgc2VydmljZVBvcnQgPSBmb3VuZC5wb3J0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VydmljZSBleHBvc2VzIHBvcnRzICR7c2Vydi5wb3J0cy5tYXAocCA9PiBwLnBvcnQpLmpvaW4oJywnKX0gYnV0IGJhY2tlbmQgaXMgZGVmaW5lZCB0byB1c2UgcG9ydCAke29wdGlvbnMucG9ydH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmFibGUgdG8gZGV0ZXJtaW5lIHNlcnZpY2UgcG9ydCBzaW5jZSBzZXJ2aWNlIGV4cG9zZXMgbXVsdGlwbGUgcG9ydHM6ICR7c2Vydi5wb3J0cy5tYXAoeCA9PiB4LnBvcnQpLmpvaW4oJywnKX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQgJiYgc2VydmljZVBvcnQgIT09IG9wdGlvbnMucG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYWNrZW5kIGRlZmluZXMgcG9ydCAke29wdGlvbnMucG9ydH0gYnV0IHNlcnZpY2UgZXhwb3NlcyBwb3J0ICR7c2VydmljZVBvcnR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbmdyZXNzQmFja2VuZCh7XG4gICAgICBzZXJ2aWNlOiB7XG4gICAgICAgIG5hbWU6IHNlcnYubmFtZSxcbiAgICAgICAgcG9ydDogeyBudW1iZXI6IHNlcnZpY2VQb3J0IH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgUmVzb3VyY2UgYmFja2VuZCBpcyBhbiBPYmplY3RSZWYgdG8gYW5vdGhlciBLdWJlcm5ldGVzIHJlc291cmNlXG4gICAqIHdpdGhpbiB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIEluZ3Jlc3Mgb2JqZWN0LlxuICAgKiBBIGNvbW1vbiB1c2FnZSBmb3IgYSBSZXNvdXJjZSBiYWNrZW5kIGlzIHRvIGluZ3Jlc3MgZGF0YSB0byBhbiBvYmplY3RcbiAgICogc3RvcmFnZSBiYWNrZW5kIHdpdGggc3RhdGljIGFzc2V0cy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVJlc291cmNlKHJlc291cmNlOiBiYXNlLklSZXNvdXJjZSkge1xuICAgIHJldHVybiBuZXcgSW5ncmVzc0JhY2tlbmQoe1xuICAgICAgcmVzb3VyY2U6IHtcbiAgICAgICAga2luZDogcmVzb3VyY2Uua2luZCxcbiAgICAgICAgbmFtZTogcmVzb3VyY2UubmFtZSxcbiAgICAgICAgYXBpR3JvdXA6IHJlc291cmNlLmFwaUdyb3VwLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBiYWNrZW5kOiBrOHMuSW5ncmVzc0JhY2tlbmQpIHtcblxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0t1YmUoKSB7IHJldHVybiB0aGlzLmJhY2tlbmQ7IH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBydWxlcyBtYXBwaW5nIHRoZSBwYXRocyB1bmRlciBhIHNwZWNpZmllZCBob3N0IHRvIHRoZSByZWxhdGVkXG4gKiBiYWNrZW5kIHNlcnZpY2VzLiBJbmNvbWluZyByZXF1ZXN0cyBhcmUgZmlyc3QgZXZhbHVhdGVkIGZvciBhIGhvc3QgbWF0Y2gsXG4gKiB0aGVuIHJvdXRlZCB0byB0aGUgYmFja2VuZCBhc3NvY2lhdGVkIHdpdGggdGhlIG1hdGNoaW5nIHBhdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5ncmVzc1J1bGUge1xuICAvKipcbiAgICogQmFja2VuZCBkZWZpbmVzIHRoZSByZWZlcmVuY2VkIHNlcnZpY2UgZW5kcG9pbnQgdG8gd2hpY2ggdGhlIHRyYWZmaWMgd2lsbFxuICAgKiBiZSBmb3J3YXJkZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBiYWNrZW5kOiBJbmdyZXNzQmFja2VuZDtcblxuICAvKipcbiAgICogSG9zdCBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIG9mIGEgbmV0d29yayBob3N0LCBhcyBkZWZpbmVkIGJ5XG4gICAqIFJGQyAzOTg2LiBOb3RlIHRoZSBmb2xsb3dpbmcgZGV2aWF0aW9ucyBmcm9tIHRoZSBcImhvc3RcIiBwYXJ0IG9mIHRoZSBVUkkgYXNcbiAgICogZGVmaW5lZCBpbiB0aGUgUkZDOiAxLiBJUHMgYXJlIG5vdCBhbGxvd2VkLiBDdXJyZW50bHkgYW4gSW5ncmVzc1J1bGVWYWx1ZVxuICAgKiBjYW4gb25seSBhcHBseSB0byB0aGUgSVAgaW4gdGhlIFNwZWMgb2YgdGhlIHBhcmVudCBJbmdyZXNzLiAyLiBUaGUgYDpgXG4gICAqIGRlbGltaXRlciBpcyBub3QgcmVzcGVjdGVkIGJlY2F1c2UgcG9ydHMgYXJlIG5vdCBhbGxvd2VkLiBDdXJyZW50bHkgdGhlXG4gICAqIHBvcnQgb2YgYW4gSW5ncmVzcyBpcyBpbXBsaWNpdGx5IDo4MCBmb3IgaHR0cCBhbmQgOjQ0MyBmb3IgaHR0cHMuIEJvdGhcbiAgICogdGhlc2UgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLiBJbmNvbWluZyByZXF1ZXN0cyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBob3N0IGJlZm9yZSB0aGUgSW5ncmVzc1J1bGVWYWx1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB0aGUgaG9zdCBpcyB1bnNwZWNpZmllZCwgdGhlIEluZ3Jlc3Mgcm91dGVzIGFsbCB0cmFmZmljIGJhc2VkXG4gICAqIG9uIHRoZSBzcGVjaWZpZWQgSW5ncmVzc1J1bGVWYWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggaXMgYW4gZXh0ZW5kZWQgUE9TSVggcmVnZXggYXMgZGVmaW5lZCBieSBJRUVFIFN0ZCAxMDAzLjEsIChpLmUgdGhpc1xuICAgKiBmb2xsb3dzIHRoZSBlZ3JlcC91bml4IHN5bnRheCwgbm90IHRoZSBwZXJsIHN5bnRheCkgbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBwYXRoIG9mIGFuIGluY29taW5nIHJlcXVlc3QuIEN1cnJlbnRseSBpdCBjYW4gY29udGFpbiBjaGFyYWN0ZXJzIGRpc2FsbG93ZWRcbiAgICogZnJvbSB0aGUgY29udmVudGlvbmFsIFwicGF0aFwiIHBhcnQgb2YgYSBVUkwgYXMgZGVmaW5lZCBieSBSRkMgMzk4Ni4gUGF0aHNcbiAgICogbXVzdCBiZWdpbiB3aXRoIGEgJy8nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIHVuc3BlY2lmaWVkLCB0aGUgcGF0aCBkZWZhdWx0cyB0byBhIGNhdGNoIGFsbCBzZW5kaW5nIHRyYWZmaWNcbiAgICogdG8gdGhlIGJhY2tlbmQuXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGhvdyB0aGUgcGF0aCBpcyBtYXRjaGVkIGFnYWluc3QgcmVxdWVzdCBwYXRocy4gQnkgZGVmYXVsdCwgcGF0aFxuICAgKiB0eXBlcyB3aWxsIGJlIG1hdGNoZWQgYnkgcHJlZml4LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3NlcnZpY2VzLW5ldHdvcmtpbmcvaW5ncmVzcy8jcGF0aC10eXBlc1xuICAgKi9cbiAgcmVhZG9ubHkgcGF0aFR5cGU/OiBIdHRwSW5ncmVzc1BhdGhUeXBlO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFRMUyBjb25maWd1cmF0aW9uIG1hcHBpbmcgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGluZ3Jlc3NcbiAqIGNvbnRyb2xsZXIgZm9yIFNTTCB0ZXJtaW5hdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdyZXNzVGxzIHtcblxuICAvKipcbiAgICogSG9zdHMgYXJlIGEgbGlzdCBvZiBob3N0cyBpbmNsdWRlZCBpbiB0aGUgVExTIGNlcnRpZmljYXRlLiBUaGUgdmFsdWVzIGluXG4gICAqIHRoaXMgbGlzdCBtdXN0IG1hdGNoIHRoZSBuYW1lL3MgdXNlZCBpbiB0aGUgVExTIFNlY3JldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gdGhlIHdpbGRjYXJkIGhvc3Qgc2V0dGluZyBmb3JcbiAgICogdGhlIGxvYWRiYWxhbmNlciBjb250cm9sbGVyIGZ1bGZpbGxpbmcgdGhpcyBJbmdyZXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU2VjcmV0IGlzIHRoZSBzZWNyZXQgdGhhdCBjb250YWlucyB0aGUgY2VydGlmaWNhdGUgYW5kIGtleSB1c2VkIHRvXG4gICAqIHRlcm1pbmF0ZSBTU0wgdHJhZmZpYyBvbiA0NDMuIElmIHRoZSBTTkkgaG9zdCBpbiBhIGxpc3RlbmVyIGNvbmZsaWN0cyB3aXRoXG4gICAqIHRoZSBcIkhvc3RcIiBoZWFkZXIgZmllbGQgdXNlZCBieSBhbiBJbmdyZXNzUnVsZSwgdGhlIFNOSSBob3N0IGlzIHVzZWQgZm9yXG4gICAqIHRlcm1pbmF0aW9uIGFuZCB2YWx1ZSBvZiB0aGUgSG9zdCBoZWFkZXIgaXMgdXNlZCBmb3Igcm91dGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB1bnNwZWNpZmllZCwgaXQgYWxsb3dzIFNTTCByb3V0aW5nIGJhc2VkIG9uIFNOSSBob3N0bmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldD86IHNlY3JldC5JU2VjcmV0O1xufVxuXG5mdW5jdGlvbiBzb3J0QnlQYXRoKGxoczogazhzLkh0dHBJbmdyZXNzUGF0aCwgcmhzOiBrOHMuSHR0cEluZ3Jlc3NQYXRoKSB7XG4gIGNvbnN0IHAxID0gbGhzLnBhdGggPz8gJyc7XG4gIGNvbnN0IHAyID0gcmhzLnBhdGggPz8gJyc7XG4gIHJldHVybiBwMS5sb2NhbGVDb21wYXJlKHAyKTtcbn1cbiJdfQ==