cdk-nextjs-standalone
Version:
Deploy a NextJS app to AWS using CDK and OpenNext.
106 lines • 18.2 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.NextjsDomain = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_certificatemanager_1 = require("aws-cdk-lib/aws-certificatemanager");
const aws_route53_1 = require("aws-cdk-lib/aws-route53");
const aws_route53_targets_1 = require("aws-cdk-lib/aws-route53-targets");
const constructs_1 = require("constructs");
/**
* Use a custom domain with `Nextjs`. Requires a Route53 hosted zone to have been
* created within the same AWS account. For DNS setups where you cannot use a
* Route53 hosted zone in the same AWS account, use the `overrides.nextjsDistribution.distributionProps`
* prop of {@link NextjsProps}.
*
* See {@link NextjsDomainProps} TS Doc comments for detailed docs on how to customize.
* This construct is helpful to user to not have to worry about interdependencies
* between Route53 Hosted Zone, CloudFront Distribution, and Route53 Hosted Zone Records.
*
* Note, if you're using another service for domain name registration, you can
* still create a Route53 hosted zone. Please see [Configuring DNS Delegation from
* CloudFlare to AWS Route53](https://veducate.co.uk/dns-delegation-route53/)
* as an example.
*/
class NextjsDomain extends constructs_1.Construct {
/**
* Concatentation of {@link NextjsDomainProps.domainName} and {@link NextjsDomainProps.alternateNames}.
* Used in instantiation of CloudFront Distribution in NextjsDistribution
*/
get domainNames() {
const names = [this.props.domainName];
if (this.props.alternateNames?.length) {
names.push(...this.props.alternateNames);
}
return names;
}
constructor(scope, id, props) {
super(scope, id);
this.props = props;
this.hostedZone = this.getHostedZone();
this.certificate = this.getCertificate();
}
getHostedZone() {
if (!this.props.hostedZone) {
return aws_route53_1.HostedZone.fromLookup(this, 'HostedZone', {
domainName: this.props.domainName,
...this.props.overrides?.hostedZoneProviderProps,
});
}
else {
return this.props.hostedZone;
}
}
getCertificate() {
if (!this.props.certificate) {
return new aws_certificatemanager_1.Certificate(this, 'Certificate', {
domainName: this.props.certificateDomainName ?? this.props.domainName,
validation: aws_certificatemanager_1.CertificateValidation.fromDns(this.hostedZone),
...this.props.overrides?.certificateProps,
});
}
else {
return this.props.certificate;
}
}
/**
* Creates DNS records (A and AAAA) records for {@link NextjsDomainProps.domainName}
* and {@link NextjsDomainProps.alternateNames} if defined.
*/
createDnsRecords(distribution) {
// Create DNS record
const recordProps = {
recordName: this.props.domainName,
zone: this.hostedZone,
target: aws_route53_1.RecordTarget.fromAlias(new aws_route53_targets_1.CloudFrontTarget(distribution)),
};
new aws_route53_1.ARecord(this, 'ARecordMain', {
...recordProps,
...this.props.overrides?.aRecordProps,
}); // IPv4
new aws_route53_1.AaaaRecord(this, 'AaaaRecordMain', {
...recordProps,
...this.props.overrides?.aaaaRecordProps,
}); // IPv6
if (this.props.alternateNames?.length) {
let i = 1;
for (const alternateName of this.props.alternateNames) {
new aws_route53_1.ARecord(this, 'ARecordAlt' + i, {
...recordProps,
recordName: `${alternateName}.`,
...this.props.overrides?.aRecordProps,
});
new aws_route53_1.AaaaRecord(this, 'AaaaRecordAlt' + i, {
...recordProps,
recordName: `${alternateName}.`,
...this.props.overrides?.aaaaRecordProps,
});
i++;
}
}
}
}
exports.NextjsDomain = NextjsDomain;
_a = JSII_RTTI_SYMBOL_1;
NextjsDomain[_a] = { fqn: "cdk-nextjs-standalone.NextjsDomain", version: "4.2.3" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmV4dGpzRG9tYWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL05leHRqc0RvbWFpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtFQUFzRztBQUV0Ryx5REFRaUM7QUFDakMseUVBQW1FO0FBQ25FLDJDQUF1QztBQTRFdkM7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFhLFlBQWEsU0FBUSxzQkFBUztJQUN6Qzs7O09BR0c7SUFDSCxJQUFJLFdBQVc7UUFDYixNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBWUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF3QjtRQUNoRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzNCLE9BQU8sd0JBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtnQkFDL0MsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtnQkFDakMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSx1QkFBdUI7YUFDakQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QixPQUFPLElBQUksb0NBQVcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO2dCQUMxQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7Z0JBQ3JFLFVBQVUsRUFBRSw4Q0FBcUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDMUQsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0I7YUFDMUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsWUFBMEI7UUFDekMsb0JBQW9CO1FBQ3BCLE1BQU0sV0FBVyxHQUFtQztZQUNsRCxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQ2pDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtZQUNyQixNQUFNLEVBQUUsMEJBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxzQ0FBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNuRSxDQUFDO1FBQ0YsSUFBSSxxQkFBTyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDL0IsR0FBRyxXQUFXO1lBQ2QsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxZQUFZO1NBQ3RDLENBQUMsQ0FBQyxDQUFDLE9BQU87UUFDWCxJQUFJLHdCQUFVLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQ3JDLEdBQUcsV0FBVztZQUNkLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZUFBZTtTQUN6QyxDQUFDLENBQUMsQ0FBQyxPQUFPO1FBQ1gsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixLQUFLLE1BQU0sYUFBYSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RELElBQUkscUJBQU8sQ0FBQyxJQUFJLEVBQUUsWUFBWSxHQUFHLENBQUMsRUFBRTtvQkFDbEMsR0FBRyxXQUFXO29CQUNkLFVBQVUsRUFBRSxHQUFHLGFBQWEsR0FBRztvQkFDL0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxZQUFZO2lCQUN0QyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSx3QkFBVSxDQUFDLElBQUksRUFBRSxlQUFlLEdBQUcsQ0FBQyxFQUFFO29CQUN4QyxHQUFHLFdBQVc7b0JBQ2QsVUFBVSxFQUFFLEdBQUcsYUFBYSxHQUFHO29CQUMvQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLGVBQWU7aUJBQ3pDLENBQUMsQ0FBQztnQkFDSCxDQUFDLEVBQUUsQ0FBQztZQUNOLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzs7QUF4Rkgsb0NBeUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNlcnRpZmljYXRlLCBDZXJ0aWZpY2F0ZSwgQ2VydGlmaWNhdGVWYWxpZGF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlcic7XG5pbXBvcnQgeyBEaXN0cmlidXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQge1xuICBBUmVjb3JkLFxuICBBUmVjb3JkUHJvcHMsXG4gIEFhYWFSZWNvcmQsXG4gIEFhYWFSZWNvcmRQcm9wcyxcbiAgSG9zdGVkWm9uZSxcbiAgSUhvc3RlZFpvbmUsXG4gIFJlY29yZFRhcmdldCxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMnO1xuaW1wb3J0IHsgQ2xvdWRGcm9udFRhcmdldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBOZXh0anNQcm9wcyB9IGZyb20gJy4nO1xuaW1wb3J0IHtcbiAgT3B0aW9uYWxBYWFhUmVjb3JkUHJvcHMsXG4gIE9wdGlvbmFsQ2VydGlmaWNhdGVQcm9wcyxcbiAgT3B0aW9uYWxIb3N0ZWRab25lUHJvdmlkZXJQcm9wcyxcbiAgT3B0aW9uYWxBUmVjb3JkUHJvcHMsXG59IGZyb20gJy4vZ2VuZXJhdGVkLXN0cnVjdHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0RvbWFpbk92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IGNlcnRpZmljYXRlUHJvcHM/OiBPcHRpb25hbENlcnRpZmljYXRlUHJvcHM7XG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVQcm92aWRlclByb3BzPzogT3B0aW9uYWxIb3N0ZWRab25lUHJvdmlkZXJQcm9wcztcbiAgcmVhZG9ubHkgYVJlY29yZFByb3BzPzogT3B0aW9uYWxBUmVjb3JkUHJvcHM7XG4gIHJlYWRvbmx5IGFhYWFSZWNvcmRQcm9wcz86IE9wdGlvbmFsQWFhYVJlY29yZFByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0RvbWFpblByb3BzIHtcbiAgLyoqXG4gICAqIEFuIGVhc3kgdG8gcmVtZW1iZXIgYWRkcmVzcyBvZiB5b3VyIHdlYnNpdGUuIE9ubHkgc3VwcG9ydHMgZG9tYWlucyBob3N0ZWRcbiAgICogb24gW1JvdXRlIDUzXShodHRwczovL2F3cy5hbWF6b24uY29tL3JvdXRlNTMvKS4gVXNlZCBhcyBgZG9tYWluTmFtZWAgZm9yXG4gICAqIEFDTSBgQ2VydGlmaWNhdGVgIGlmIHtAbGluayBOZXh0anNEb21haW5Qcm9wcy5jZXJ0aWZpY2F0ZX0gYW5kXG4gICAqIHtAbGluayBOZXh0anNEb21haW5Qcm9wcy5jZXJ0aWZpY2F0ZURvbWFpbk5hbWV9IGFyZSBgdW5kZWZpbmVkYC5cbiAgICogQGV4YW1wbGUgXCJleGFtcGxlLmNvbVwiXG4gICAqL1xuICByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbHRlcm5hdGUgZG9tYWluIG5hbWVzIHRoYXQgc2hvdWxkIHJvdXRlIHRvIHRoZSBDbG91ZGZyb250IERpc3RyaWJ1dGlvbi5cbiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBzcGVjaWZpY2llZCBgXCJleGFtcGxlLmNvbVwiYCBhcyB5b3VyIHtAbGluayBOZXh0anNEb21haW5Qcm9wcy5kb21haW5OYW1lfSxcbiAgICogeW91IGNvdWxkIHNwZWNpZnkgYFtcInd3dy5leGFtcGxlLmNvbVwiLCBcImFwaS5leGFtcGxlLmNvbVwiXWAuXG4gICAqIExlYXJuIG1vcmUgYWJvdXQgdGhlIFtyZXF1aXJlbWVudHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9DTkFNRXMuaHRtbCNhbHRlcm5hdGUtZG9tYWluLW5hbWVzLXJlcXVpcmVtZW50cylcbiAgICogYW5kIFtyZXN0cmljdGlvbnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9DTkFNRXMuaHRtbCNhbHRlcm5hdGUtZG9tYWluLW5hbWVzLXJlc3RyaWN0aW9ucylcbiAgICogZm9yIHVzaW5nIGFsdGVybmF0ZSBkb21haW4gbmFtZXMgd2l0aCBDbG91ZEZyb250LlxuICAgKlxuICAgKiBOb3RlLCBpbiBvcmRlciB0byB1c2UgYWx0ZXJuYXRlIGRvbWFpbiBuYW1lcywgdGhleSBtdXN0IGJlIGNvdmVyZWQgYnkgeW91clxuICAgKiBjZXJ0aWZpY2F0ZS4gQnkgZGVmYXVsdCwgdGhlIGNlcnRpZmljYXRlIGNyZWF0ZWQgaW4gdGhpcyBjb25zdHJ1Y3Qgb25seSBjb3ZlcnNcbiAgICogdGhlIHtAbGluayBOZXh0anNEb21haW5Qcm9wcy5kb21haW5OYW1lfS4gVGhlcmVmb3JlLCB5b3UnbGwgbmVlZCB0byBzcGVjaWZ5XG4gICAqIGEgd2lsZGNhcmQgZG9tYWluIG5hbWUgbGlrZSBgXCIqLmV4YW1wbGUuY29tXCJgIHdpdGgge0BsaW5rIE5leHRqc0RvbWFpblByb3BzLmNlcnRpZmljYXRlRG9tYWluTmFtZX1cbiAgICogc28gdGhhdCB0aGlzIGNvbnN0cnVjdCB3aWxsIGNyZWF0ZSB0aGUgY2VydGlmaWNhdGUgdGhlIGNvdmVycyB0aGUgYWx0ZXJuYXRlXG4gICAqIGRvbWFpbiBuYW1lcy4gT3RoZXJ3aXNlLCB5b3UgY2FuIHVzZSB7QGxpbmsgTmV4dGpzRG9tYWluUHJvcHMuY2VydGlmaWNhdGV9XG4gICAqIHRvIGNyZWF0ZSB0aGUgY2VydGlmaWNhdGUgeW91cnNlbGYgd2hlcmUgeW91J2xsIG5lZWQgdG8gZW5zdXJlIGl0IGhhcyBhXG4gICAqIHdpbGRjYXJkIG9yIHVzZXMgc3ViamVjdCBhbHRlcm5hdGl2ZSBuYW1lcyBpbmNsdWRpbmcgdGhlXG4gICAqIGFsdGVybmF0aXZlIG5hbWVzIHNwZWNpZmllZCBoZXJlLlxuICAgKiBAZXhhbXBsZSBbXCJ3d3cuZXhhbXBsZS5jb21cIiwgXCJhcGkuZXhhbXBsZS5jb21cIl1cbiAgICovXG4gIHJlYWRvbmx5IGFsdGVybmF0ZU5hbWVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBZb3UgbXVzdCBjcmVhdGUgdGhlIGhvc3RlZCB6b25lIG91dC1vZi1iYW5kLlxuICAgKiBZb3UgY2FuIGxvb2t1cCB0aGUgaG9zdGVkIHpvbmUgb3V0c2lkZSB0aGlzIGNvbnN0cnVjdCBhbmQgcGFzcyBpdCBpbiB2aWEgdGhpcyBwcm9wLlxuICAgKiBBbHRlcm5hdGl2ZWx5IGlmIHRoaXMgcHJvcCBpcyBgdW5kZWZpbmVkYCwgdGhlbiB0aGUgaG9zdGVkIHpvbmUgd2lsbCBiZVxuICAgKiAqKmxvb2tlZCB1cCoqIChub3QgY3JlYXRlZCkgdmlhIGBIb3N0ZWRab25lLmZyb21Mb29rdXBgIHdpdGgge0BsaW5rIE5leHRqc0RvbWFpblByb3BzLmRvbWFpbk5hbWV9LlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdGVkWm9uZT86IElIb3N0ZWRab25lO1xuICAvKipcbiAgICogSWYgdGhpcyBwcm9wIGlzIGB1bmRlZmluZWRgIHRoZW4gYW4gQUNNIGBDZXJ0aWZpY2F0ZWAgd2lsbCBiZSBjcmVhdGVkIGJhc2VkIG9uIHtAbGluayBOZXh0anNEb21haW5Qcm9wcy5kb21haW5OYW1lfVxuICAgKiB3aXRoIEROUyBWYWxpZGF0aW9uLiBUaGlzIHByb3AgYWxsb3dzIHlvdSB0byBjb250cm9sIHRoZSBUTFMvU1NMXG4gICAqIGNlcnRpZmljYXRlIGNyZWF0ZWQuIFRoZSBjZXJ0aWZpY2F0ZSB5b3UgY3JlYXRlIG11c3QgYmUgaW4gdGhlIGB1cy1lYXN0LTFgXG4gICAqIChOLiBWaXJnaW5pYSkgcmVnaW9uIGFzIHJlcXVpcmVkIGJ5IEFXUyBDbG91ZEZyb250LlxuICAgKlxuICAgKiBTZXQgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYW4gZXhpc3RpbmcgY2VydGlmaWNhdGUgaW4gdGhlIGB1cy1lYXN0LTFgIHJlZ2lvbiBpbiBBV1MgQ2VydGlmaWNhdGUgTWFuYWdlciB5b3Ugd2FudCB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZT86IElDZXJ0aWZpY2F0ZTtcbiAgLyoqXG4gICAqIFRoZSBkb21haW4gbmFtZSB1c2VkIGluIHRoaXMgY29uc3RydWN0IHdoZW4gY3JlYXRpbmcgYW4gQUNNIGBDZXJ0aWZpY2F0ZWAuIFVzZWZ1bFxuICAgKiB3aGVuIHBhc3Npbmcge0BsaW5rIE5leHRqc0RvbWFpblByb3BzLmFsdGVybmF0ZU5hbWVzfSBhbmQgeW91IG5lZWQgdG8gc3BlY2lmeVxuICAgKiBhIHdpbGRjYXJkIGRvbWFpbiBsaWtlIFwiKi5leGFtcGxlLmNvbVwiLiBJZiBgdW5kZWZpbmVkYCwgdGhlbiB7QGxpbmsgTmV4dGpzRG9tYWluUHJvcHMuZG9tYWluTmFtZX1cbiAgICogd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBJZiB7QGxpbmsgTmV4dGpzRG9tYWluUHJvcHMuY2VydGlmaWNhdGV9IGlzIHBhc3NlZCwgdGhlbiB0aGlzIHByb3AgaXMgaWdub3JlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNlcnRpZmljYXRlRG9tYWluTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIGZvciBldmVyeSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNEb21haW5PdmVycmlkZXM7XG59XG5cbi8qKlxuICogVXNlIGEgY3VzdG9tIGRvbWFpbiB3aXRoIGBOZXh0anNgLiBSZXF1aXJlcyBhIFJvdXRlNTMgaG9zdGVkIHpvbmUgdG8gaGF2ZSBiZWVuXG4gKiBjcmVhdGVkIHdpdGhpbiB0aGUgc2FtZSBBV1MgYWNjb3VudC4gRm9yIEROUyBzZXR1cHMgd2hlcmUgeW91IGNhbm5vdCB1c2UgYVxuICogUm91dGU1MyBob3N0ZWQgem9uZSBpbiB0aGUgc2FtZSBBV1MgYWNjb3VudCwgdXNlIHRoZSBgb3ZlcnJpZGVzLm5leHRqc0Rpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Qcm9wc2BcbiAqIHByb3Agb2Yge0BsaW5rIE5leHRqc1Byb3BzfS5cbiAqXG4gKiBTZWUge0BsaW5rIE5leHRqc0RvbWFpblByb3BzfSBUUyBEb2MgY29tbWVudHMgZm9yIGRldGFpbGVkIGRvY3Mgb24gaG93IHRvIGN1c3RvbWl6ZS5cbiAqIFRoaXMgY29uc3RydWN0IGlzIGhlbHBmdWwgdG8gdXNlciB0byBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBpbnRlcmRlcGVuZGVuY2llc1xuICogYmV0d2VlbiBSb3V0ZTUzIEhvc3RlZCBab25lLCBDbG91ZEZyb250IERpc3RyaWJ1dGlvbiwgYW5kIFJvdXRlNTMgSG9zdGVkIFpvbmUgUmVjb3Jkcy5cbiAqXG4gKiBOb3RlLCBpZiB5b3UncmUgdXNpbmcgYW5vdGhlciBzZXJ2aWNlIGZvciBkb21haW4gbmFtZSByZWdpc3RyYXRpb24sIHlvdSBjYW5cbiAqIHN0aWxsIGNyZWF0ZSBhIFJvdXRlNTMgaG9zdGVkIHpvbmUuIFBsZWFzZSBzZWUgW0NvbmZpZ3VyaW5nIEROUyBEZWxlZ2F0aW9uIGZyb21cbiAqIENsb3VkRmxhcmUgdG8gQVdTIFJvdXRlNTNdKGh0dHBzOi8vdmVkdWNhdGUuY28udWsvZG5zLWRlbGVnYXRpb24tcm91dGU1My8pXG4gKiBhcyBhbiBleGFtcGxlLlxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzRG9tYWluIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIENvbmNhdGVudGF0aW9uIG9mIHtAbGluayBOZXh0anNEb21haW5Qcm9wcy5kb21haW5OYW1lfSBhbmQge0BsaW5rIE5leHRqc0RvbWFpblByb3BzLmFsdGVybmF0ZU5hbWVzfS5cbiAgICogVXNlZCBpbiBpbnN0YW50aWF0aW9uIG9mIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uIGluIE5leHRqc0Rpc3RyaWJ1dGlvblxuICAgKi9cbiAgZ2V0IGRvbWFpbk5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBuYW1lcyA9IFt0aGlzLnByb3BzLmRvbWFpbk5hbWVdO1xuICAgIGlmICh0aGlzLnByb3BzLmFsdGVybmF0ZU5hbWVzPy5sZW5ndGgpIHtcbiAgICAgIG5hbWVzLnB1c2goLi4udGhpcy5wcm9wcy5hbHRlcm5hdGVOYW1lcyk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lcztcbiAgfVxuICAvKipcbiAgICogUm91dGU1MyBIb3N0ZWQgWm9uZS5cbiAgICovXG4gIGhvc3RlZFpvbmU6IElIb3N0ZWRab25lO1xuICAvKipcbiAgICogQUNNIENlcnRpZmljYXRlLlxuICAgKi9cbiAgY2VydGlmaWNhdGU6IElDZXJ0aWZpY2F0ZTtcblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNEb21haW5Qcm9wcztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzRG9tYWluUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmhvc3RlZFpvbmUgPSB0aGlzLmdldEhvc3RlZFpvbmUoKTtcbiAgICB0aGlzLmNlcnRpZmljYXRlID0gdGhpcy5nZXRDZXJ0aWZpY2F0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIb3N0ZWRab25lKCk6IElIb3N0ZWRab25lIHtcbiAgICBpZiAoIXRoaXMucHJvcHMuaG9zdGVkWm9uZSkge1xuICAgICAgcmV0dXJuIEhvc3RlZFpvbmUuZnJvbUxvb2t1cCh0aGlzLCAnSG9zdGVkWm9uZScsIHtcbiAgICAgICAgZG9tYWluTmFtZTogdGhpcy5wcm9wcy5kb21haW5OYW1lLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uaG9zdGVkWm9uZVByb3ZpZGVyUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuaG9zdGVkWm9uZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENlcnRpZmljYXRlKCk6IElDZXJ0aWZpY2F0ZSB7XG4gICAgaWYgKCF0aGlzLnByb3BzLmNlcnRpZmljYXRlKSB7XG4gICAgICByZXR1cm4gbmV3IENlcnRpZmljYXRlKHRoaXMsICdDZXJ0aWZpY2F0ZScsIHtcbiAgICAgICAgZG9tYWluTmFtZTogdGhpcy5wcm9wcy5jZXJ0aWZpY2F0ZURvbWFpbk5hbWUgPz8gdGhpcy5wcm9wcy5kb21haW5OYW1lLFxuICAgICAgICB2YWxpZGF0aW9uOiBDZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyh0aGlzLmhvc3RlZFpvbmUpLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uY2VydGlmaWNhdGVQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jZXJ0aWZpY2F0ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBETlMgcmVjb3JkcyAoQSBhbmQgQUFBQSkgcmVjb3JkcyBmb3Ige0BsaW5rIE5leHRqc0RvbWFpblByb3BzLmRvbWFpbk5hbWV9XG4gICAqIGFuZCB7QGxpbmsgTmV4dGpzRG9tYWluUHJvcHMuYWx0ZXJuYXRlTmFtZXN9IGlmIGRlZmluZWQuXG4gICAqL1xuICBjcmVhdGVEbnNSZWNvcmRzKGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIEROUyByZWNvcmRcbiAgICBjb25zdCByZWNvcmRQcm9wczogQVJlY29yZFByb3BzICYgQWFhYVJlY29yZFByb3BzID0ge1xuICAgICAgcmVjb3JkTmFtZTogdGhpcy5wcm9wcy5kb21haW5OYW1lLFxuICAgICAgem9uZTogdGhpcy5ob3N0ZWRab25lLFxuICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KGRpc3RyaWJ1dGlvbikpLFxuICAgIH07XG4gICAgbmV3IEFSZWNvcmQodGhpcywgJ0FSZWNvcmRNYWluJywge1xuICAgICAgLi4ucmVjb3JkUHJvcHMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uYVJlY29yZFByb3BzLFxuICAgIH0pOyAvLyBJUHY0XG4gICAgbmV3IEFhYWFSZWNvcmQodGhpcywgJ0FhYWFSZWNvcmRNYWluJywge1xuICAgICAgLi4ucmVjb3JkUHJvcHMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uYWFhYVJlY29yZFByb3BzLFxuICAgIH0pOyAvLyBJUHY2XG4gICAgaWYgKHRoaXMucHJvcHMuYWx0ZXJuYXRlTmFtZXM/Lmxlbmd0aCkge1xuICAgICAgbGV0IGkgPSAxO1xuICAgICAgZm9yIChjb25zdCBhbHRlcm5hdGVOYW1lIG9mIHRoaXMucHJvcHMuYWx0ZXJuYXRlTmFtZXMpIHtcbiAgICAgICAgbmV3IEFSZWNvcmQodGhpcywgJ0FSZWNvcmRBbHQnICsgaSwge1xuICAgICAgICAgIC4uLnJlY29yZFByb3BzLFxuICAgICAgICAgIHJlY29yZE5hbWU6IGAke2FsdGVybmF0ZU5hbWV9LmAsXG4gICAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmFSZWNvcmRQcm9wcyxcbiAgICAgICAgfSk7XG4gICAgICAgIG5ldyBBYWFhUmVjb3JkKHRoaXMsICdBYWFhUmVjb3JkQWx0JyArIGksIHtcbiAgICAgICAgICAuLi5yZWNvcmRQcm9wcyxcbiAgICAgICAgICByZWNvcmROYW1lOiBgJHthbHRlcm5hdGVOYW1lfS5gLFxuICAgICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5hYWFhUmVjb3JkUHJvcHMsXG4gICAgICAgIH0pO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=