@pepperize/cdk-route53-health-check
Version:
Create Route53 HealthChecks to monitor TCP, HTTP, HTTPS endpoints, CloudWatch Alarms and other Route53 HealthChecks.
93 lines • 15.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Failover = exports.HealthCheckBase = void 0;
const aws_cdk_lib_1 = require("aws-cdk-lib");
const cloudwatch = require("aws-cdk-lib/aws-cloudwatch");
const route53 = require("aws-cdk-lib/aws-route53");
/**
* @internal
*/
class HealthCheckBase extends aws_cdk_lib_1.Resource {
constructor() {
super(...arguments);
this.tags = new aws_cdk_lib_1.TagManager(aws_cdk_lib_1.TagType.STANDARD, "AWS::Route53::HealthCheck");
}
/**
* Import an existing Route53 HealthCheck.
*/
static fromHealthCheckId(scope, id, healthCheckId) {
return new (class Imported extends HealthCheckBase {
constructor() {
super(scope, id);
this.healthCheckId = healthCheckId;
}
})();
}
resolveSafeTags() {
return aws_cdk_lib_1.Lazy.any({
produce: () => {
const raw = this.tags.renderedTags;
if (aws_cdk_lib_1.Token.isUnresolved(raw)) {
return raw;
}
const arr = raw;
function isSafeString(v) {
if (typeof v !== "string")
return false;
const allowed = /^[a-zA-Z0-9 _.:\/=+\-@]+$/;
return allowed.test(v) && !v.includes("${") && !v.includes("}") && !v.includes("$");
}
return arr.filter((t) => isSafeString(t.value)).map((t) => ({ key: t.key, value: t.value }));
},
});
}
failover(recordSet, evaluateTargetHealth, failover) {
const resource = recordSet.node.defaultChild;
if (!(resource instanceof route53.CfnRecordSet)) {
throw new Error(`RecordSet ${recordSet.node.path} doesn't have a default child of type CfnRecordSet`);
}
resource.healthCheckId = this.healthCheckId;
if (failover) {
resource.failover = failover;
}
if (evaluateTargetHealth) {
resource.addPropertyOverride("AliasTarget.EvaluateTargetHealth", evaluateTargetHealth);
}
}
failoverPrimary(recordSet, evaluateTargetHealth) {
this.failover(recordSet, evaluateTargetHealth, Failover.PRIMARY);
}
failoverSecondary(recordSet, evaluateTargetHealth) {
this.failover(recordSet, evaluateTargetHealth, Failover.SECONDARY);
}
/**
* Return the given named metric for this HealthCheck.
*/
metric(metricName, props) {
return new cloudwatch.Metric({
namespace: "AWS/Route53",
metricName,
dimensionsMap: { HealthCheckId: this.healthCheckId },
...props,
}).attachTo(this);
}
/**
* Route53 health checkers report that the HealthCheck is healthy or unhealthy.
*/
metricHealthCheckStatus(props) {
return this.metric("HealthCheckStatus", { statistic: cloudwatch.Statistic.MINIMUM, ...props });
}
}
exports.HealthCheckBase = HealthCheckBase;
var Failover;
(function (Failover) {
/**
* The primary record set
*/
Failover["PRIMARY"] = "PRIMARY";
/**
* The secondary record set
*/
Failover["SECONDARY"] = "SECONDARY";
})(Failover || (exports.Failover = Failover = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLWNoZWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hlYWx0aC1jaGVjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBaUc7QUFDakcseURBQXlEO0FBQ3pELG1EQUFtRDtBQWlFbkQ7O0dBRUc7QUFDSCxNQUFzQixlQUFnQixTQUFRLHNCQUFRO0lBQXREOztRQWVXLFNBQUksR0FBRyxJQUFJLHdCQUFVLENBQUMscUJBQU8sQ0FBQyxRQUFRLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztJQW1FaEYsQ0FBQztJQWpGQzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxhQUFxQjtRQUNqRixPQUFPLElBQUksQ0FBQyxNQUFNLFFBQVMsU0FBUSxlQUFlO1lBRWhEO2dCQUNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBRkgsa0JBQWEsR0FBRyxhQUFhLENBQUM7WUFHOUMsQ0FBQztTQUNGLENBQUMsRUFBRSxDQUFDO0lBQ1AsQ0FBQztJQU1TLGVBQWU7UUFDdkIsT0FBTyxrQkFBSSxDQUFDLEdBQUcsQ0FBQztZQUNkLE9BQU8sRUFBRSxHQUFHLEVBQUU7Z0JBQ1osTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBRW5DLElBQUksbUJBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDNUIsT0FBTyxHQUFHLENBQUM7Z0JBQ2IsQ0FBQztnQkFFRCxNQUFNLEdBQUcsR0FBRyxHQUFpRSxDQUFDO2dCQUU5RSxTQUFTLFlBQVksQ0FBQyxDQUFVO29CQUM5QixJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7d0JBQUUsT0FBTyxLQUFLLENBQUM7b0JBQ3hDLE1BQU0sT0FBTyxHQUFHLDJCQUEyQixDQUFDO29CQUM1QyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RGLENBQUM7Z0JBRUQsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakcsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxRQUFRLENBQUMsU0FBb0IsRUFBRSxvQkFBOEIsRUFBRSxRQUFtQjtRQUNoRixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUU3QyxJQUFJLENBQUMsQ0FBQyxRQUFRLFlBQVksT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hHLENBQUM7UUFFRCxRQUFRLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFFNUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLFFBQVEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQy9CLENBQUM7UUFFRCxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDekIsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGtDQUFrQyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDekYsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsU0FBNEIsRUFBRSxvQkFBOEI7UUFDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxTQUE0QixFQUFFLG9CQUE4QjtRQUM1RSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFVBQWtCLEVBQUUsS0FBZ0M7UUFDekQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDM0IsU0FBUyxFQUFFLGFBQWE7WUFDeEIsVUFBVTtZQUNWLGFBQWEsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BELEdBQUcsS0FBSztTQUNULENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUNEOztPQUVHO0lBQ0gsdUJBQXVCLENBQUMsS0FBZ0M7UUFDdEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNqRyxDQUFDO0NBQ0Y7QUFsRkQsMENBa0ZDO0FBRUQsSUFBWSxRQVNYO0FBVEQsV0FBWSxRQUFRO0lBQ2xCOztPQUVHO0lBQ0gsK0JBQW1CLENBQUE7SUFDbkI7O09BRUc7SUFDSCxtQ0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBVFcsUUFBUSx3QkFBUixRQUFRLFFBU25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVJlc29sdmFibGUsIElUYWdnYWJsZSwgTGF6eSwgUmVzb3VyY2UsIFRhZ01hbmFnZXIsIFRhZ1R5cGUsIFRva2VuIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0ICogYXMgcm91dGU1MyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7IFJlY29yZFNldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIFJvdXRlNTMgSGVhbHRoQ2hlY2tcbiAgICovXG4gIHJlYWRvbmx5IGhlYWx0aENoZWNrTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW52ZXJ0IHRoZSBzdGF0dXMgb2YgdGhlIFJvdXRlNTMgaGVhbHRoIGNoZWNrIHN0YXR1cy5cbiAgICovXG4gIHJlYWRvbmx5IGludmVydGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSGVhbHRoQ2hlY2sge1xuICByZWFkb25seSBoZWFsdGhDaGVja0lkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXRzIGB0aGlzLmhlYWx0aENoZWNrSWRgIGFzIHRoZSB2YWx1ZSBmb3IgYEhlYWx0aENoZWNrSWRgIG9uIHRoZSBnaXZlbiBSZWNvcmRTZXQuXG4gICAqXG4gICAqIDxiPkFwcGxpZXMgb25seSB0byBhbGlhcywgZmFpbG92ZXIgYWxpYXMsIGdlb2xvY2F0aW9uIGFsaWFzLCBsYXRlbmN5IGFsaWFzLCBhbmQgd2VpZ2h0ZWQgYWxpYXMgcmVzb3VyY2UgcmVjb3JkIHNldHM8L2I+XG4gICAqXG4gICAqIEBwYXJhbSByZWNvcmRTZXQgVGhlIFJvdXRlNTMgUmVjb3JkU2V0IHRvIGNvbmZpZ3VyZSBmYWlsb3ZlclxuICAgKiBAcGFyYW0gZXZhbHVhdGVUYXJnZXRIZWFsdGggSW5oZXJpdCB0aGUgaGVhbHRoIG9mIHRoZSByZWZlcmVuY2VkIEFsaWFzIFJlY29yZFNldCBUYXJnZXRcbiAgICogQHBhcmFtIGZhaWxvdmVyIFNldHMgYFBSSU1BUllgIG9yIGBTRUNPTkRBUllgIGFzIHRoZSB2YWx1ZSBmb3IgYEZhaWxvdmVyYCBvbiB0aGUgZ2l2ZW4gUmVjb3JkU2V0LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLXJvdXRlNTMtYWxpYXN0YXJnZXQuaHRtbCNjZm4tcm91dGU1My1hbGlhc3RhcmdldC1ldmFsdWF0ZXRhcmdldGhlYWx0aFxuICAgKi9cbiAgZmFpbG92ZXIocmVjb3JkU2V0OiBSZWNvcmRTZXQsIGV2YWx1YXRlVGFyZ2V0SGVhbHRoPzogYm9vbGVhbiwgZmFpbG92ZXI/OiBGYWlsb3Zlcik6IHZvaWQ7XG4gIC8qKlxuICAgKiBTZXRzIGBQUklNQVJZYCBhcyB0aGUgdmFsdWUgZm9yIGBGYWlsb3ZlcmAgb24gdGhlIGdpdmVuIFJlY29yZFNldC4gQWRkaXRpb25hbGx5LCBzZXRzIGB0aGlzLmhlYWx0aENoZWNrSWRgIGFzIHRoZSB2YWx1ZSBmb3IgYEhlYWx0aENoZWNrSWRgLlxuICAgKlxuICAgKiA8Yj5BcHBsaWVzIG9ubHkgdG8gYWxpYXMsIGZhaWxvdmVyIGFsaWFzLCBnZW9sb2NhdGlvbiBhbGlhcywgbGF0ZW5jeSBhbGlhcywgYW5kIHdlaWdodGVkIGFsaWFzIHJlc291cmNlIHJlY29yZCBzZXRzPC9iPlxuICAgKlxuICAgKiBAcGFyYW0gcmVjb3JkU2V0IFRoZSBSb3V0ZTUzIFJlY29yZFNldCB0byBjb25maWd1cmUgZmFpbG92ZXJcbiAgICogQHBhcmFtIGV2YWx1YXRlVGFyZ2V0SGVhbHRoIEluaGVyaXQgdGhlIGhlYWx0aCBvZiB0aGUgcmVmZXJlbmNlZCBBbGlhcyBSZWNvcmRTZXQgVGFyZ2V0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXByb3BlcnRpZXMtcm91dGU1My1hbGlhc3RhcmdldC5odG1sI2Nmbi1yb3V0ZTUzLWFsaWFzdGFyZ2V0LWV2YWx1YXRldGFyZ2V0aGVhbHRoXG4gICAqL1xuICBmYWlsb3ZlclByaW1hcnkocmVjb3JkU2V0OiByb3V0ZTUzLlJlY29yZFNldCwgZXZhbHVhdGVUYXJnZXRIZWFsdGg/OiBib29sZWFuKTogdm9pZDtcbiAgLyoqXG4gICAqIFNldHMgYFBSSU1BUllgIGFzIHRoZSB2YWx1ZSBmb3IgYEZhaWxvdmVyYCBvbiB0aGUgZ2l2ZW4gUmVjb3JkU2V0LiBBZGRpdGlvbmFsbHksIHNldHMgYHRoaXMuaGVhbHRoQ2hlY2tJZGAgYXMgdGhlIHZhbHVlIGZvciBgSGVhbHRoQ2hlY2tJZGAuXG4gICAqXG4gICAqIDxiPkFwcGxpZXMgb25seSB0byBhbGlhcywgZmFpbG92ZXIgYWxpYXMsIGdlb2xvY2F0aW9uIGFsaWFzLCBsYXRlbmN5IGFsaWFzLCBhbmQgd2VpZ2h0ZWQgYWxpYXMgcmVzb3VyY2UgcmVjb3JkIHNldHM8L2I+XG4gICAqXG4gICAqIEBwYXJhbSByZWNvcmRTZXQgVGhlIFJvdXRlNTMgUmVjb3JkU2V0IHRvIGNvbmZpZ3VyZSBmYWlsb3ZlclxuICAgKiBAcGFyYW0gZXZhbHVhdGVUYXJnZXRIZWFsdGggSW5oZXJpdCB0aGUgaGVhbHRoIG9mIHRoZSByZWZlcmVuY2VkIEFsaWFzIFJlY29yZFNldCBUYXJnZXRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1yb3V0ZTUzLWFsaWFzdGFyZ2V0Lmh0bWwjY2ZuLXJvdXRlNTMtYWxpYXN0YXJnZXQtZXZhbHVhdGV0YXJnZXRoZWFsdGhcbiAgICovXG4gIGZhaWxvdmVyU2Vjb25kYXJ5KHJlY29yZFNldDogcm91dGU1My5SZWNvcmRTZXQsIGV2YWx1YXRlVGFyZ2V0SGVhbHRoPzogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGdpdmVuIG5hbWVkIG1ldHJpYyBmb3IgdGhpcyBIZWFsdGhDaGVjay5cbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJvdXRlNTMgaGVhbHRoIGNoZWNrZXJzIHJlcG9ydCB0aGF0IHRoZSBIZWFsdGhDaGVjayBpcyBoZWFsdGh5IG9yIHVuaGVhbHRoeS5cbiAgICovXG4gIG1ldHJpY0hlYWx0aENoZWNrU3RhdHVzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIZWFsdGhDaGVja0Jhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElIZWFsdGhDaGVjaywgSVRhZ2dhYmxlIHtcbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBSb3V0ZTUzIEhlYWx0aENoZWNrLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSGVhbHRoQ2hlY2tJZChzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBoZWFsdGhDaGVja0lkOiBzdHJpbmcpOiBJSGVhbHRoQ2hlY2sge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIEltcG9ydGVkIGV4dGVuZHMgSGVhbHRoQ2hlY2tCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBoZWFsdGhDaGVja0lkID0gaGVhbHRoQ2hlY2tJZDtcbiAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgaGVhbHRoQ2hlY2tJZDogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHRhZ3MgPSBuZXcgVGFnTWFuYWdlcihUYWdUeXBlLlNUQU5EQVJELCBcIkFXUzo6Um91dGU1Mzo6SGVhbHRoQ2hlY2tcIik7XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVTYWZlVGFncygpOiByb3V0ZTUzLkNmbkhlYWx0aENoZWNrLkhlYWx0aENoZWNrVGFnUHJvcGVydHlbXSB8IElSZXNvbHZhYmxlIHtcbiAgICByZXR1cm4gTGF6eS5hbnkoe1xuICAgICAgcHJvZHVjZTogKCkgPT4ge1xuICAgICAgICBjb25zdCByYXcgPSB0aGlzLnRhZ3MucmVuZGVyZWRUYWdzO1xuXG4gICAgICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQocmF3KSkge1xuICAgICAgICAgIHJldHVybiByYXc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcnIgPSByYXcgYXMgdW5rbm93biBhcyByb3V0ZTUzLkNmbkhlYWx0aENoZWNrLkhlYWx0aENoZWNrVGFnUHJvcGVydHlbXTtcblxuICAgICAgICBmdW5jdGlvbiBpc1NhZmVTdHJpbmcodjogdW5rbm93bikge1xuICAgICAgICAgIGlmICh0eXBlb2YgdiAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSAvXlthLXpBLVowLTkgXy46XFwvPStcXC1AXSskLztcbiAgICAgICAgICByZXR1cm4gYWxsb3dlZC50ZXN0KHYpICYmICF2LmluY2x1ZGVzKFwiJHtcIikgJiYgIXYuaW5jbHVkZXMoXCJ9XCIpICYmICF2LmluY2x1ZGVzKFwiJFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnIuZmlsdGVyKCh0KSA9PiBpc1NhZmVTdHJpbmcodC52YWx1ZSkpLm1hcCgodCkgPT4gKHsga2V5OiB0LmtleSEsIHZhbHVlOiB0LnZhbHVlISB9KSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZmFpbG92ZXIocmVjb3JkU2V0OiBSZWNvcmRTZXQsIGV2YWx1YXRlVGFyZ2V0SGVhbHRoPzogYm9vbGVhbiwgZmFpbG92ZXI/OiBGYWlsb3Zlcikge1xuICAgIGNvbnN0IHJlc291cmNlID0gcmVjb3JkU2V0Lm5vZGUuZGVmYXVsdENoaWxkO1xuXG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiByb3V0ZTUzLkNmblJlY29yZFNldCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjb3JkU2V0ICR7cmVjb3JkU2V0Lm5vZGUucGF0aH0gZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBjaGlsZCBvZiB0eXBlIENmblJlY29yZFNldGApO1xuICAgIH1cblxuICAgIHJlc291cmNlLmhlYWx0aENoZWNrSWQgPSB0aGlzLmhlYWx0aENoZWNrSWQ7XG5cbiAgICBpZiAoZmFpbG92ZXIpIHtcbiAgICAgIHJlc291cmNlLmZhaWxvdmVyID0gZmFpbG92ZXI7XG4gICAgfVxuXG4gICAgaWYgKGV2YWx1YXRlVGFyZ2V0SGVhbHRoKSB7XG4gICAgICByZXNvdXJjZS5hZGRQcm9wZXJ0eU92ZXJyaWRlKFwiQWxpYXNUYXJnZXQuRXZhbHVhdGVUYXJnZXRIZWFsdGhcIiwgZXZhbHVhdGVUYXJnZXRIZWFsdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZhaWxvdmVyUHJpbWFyeShyZWNvcmRTZXQ6IHJvdXRlNTMuUmVjb3JkU2V0LCBldmFsdWF0ZVRhcmdldEhlYWx0aD86IGJvb2xlYW4pIHtcbiAgICB0aGlzLmZhaWxvdmVyKHJlY29yZFNldCwgZXZhbHVhdGVUYXJnZXRIZWFsdGgsIEZhaWxvdmVyLlBSSU1BUlkpO1xuICB9XG5cbiAgZmFpbG92ZXJTZWNvbmRhcnkocmVjb3JkU2V0OiByb3V0ZTUzLlJlY29yZFNldCwgZXZhbHVhdGVUYXJnZXRIZWFsdGg/OiBib29sZWFuKSB7XG4gICAgdGhpcy5mYWlsb3ZlcihyZWNvcmRTZXQsIGV2YWx1YXRlVGFyZ2V0SGVhbHRoLCBGYWlsb3Zlci5TRUNPTkRBUlkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZ2l2ZW4gbmFtZWQgbWV0cmljIGZvciB0aGlzIEhlYWx0aENoZWNrLlxuICAgKi9cbiAgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBuYW1lc3BhY2U6IFwiQVdTL1JvdXRlNTNcIixcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7IEhlYWx0aENoZWNrSWQ6IHRoaXMuaGVhbHRoQ2hlY2tJZCB9LFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cbiAgLyoqXG4gICAqIFJvdXRlNTMgaGVhbHRoIGNoZWNrZXJzIHJlcG9ydCB0aGF0IHRoZSBIZWFsdGhDaGVjayBpcyBoZWFsdGh5IG9yIHVuaGVhbHRoeS5cbiAgICovXG4gIG1ldHJpY0hlYWx0aENoZWNrU3RhdHVzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkhlYWx0aENoZWNrU3RhdHVzXCIsIHsgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRpc3RpYy5NSU5JTVVNLCAuLi5wcm9wcyB9KTtcbiAgfVxufVxuXG5leHBvcnQgZW51bSBGYWlsb3ZlciB7XG4gIC8qKlxuICAgKiBUaGUgcHJpbWFyeSByZWNvcmQgc2V0XG4gICAqL1xuICBQUklNQVJZID0gXCJQUklNQVJZXCIsXG4gIC8qKlxuICAgKiBUaGUgc2Vjb25kYXJ5IHJlY29yZCBzZXRcbiAgICovXG4gIFNFQ09OREFSWSA9IFwiU0VDT05EQVJZXCIsXG59XG4iXX0=