UNPKG

@richkang/cdk-construct-network-firewall-textfile-rules

Version:

A simple AWS VPC Firewall with one stateless rule and one stateful rule to meet the AWS Config Network Firewall Conformance.

159 lines 20.7 kB
"use strict"; var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); exports.NetworkFirewallRulesBuilder = exports.NetworkFirewallDistributedConstruct = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const cdk = require("aws-cdk-lib"); const constructs_1 = require("constructs"); const fs = require("fs"); const path = require("path"); class NetworkFirewallDistributedConstruct extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); this.subnetList = []; this.statefulRuleGroups = []; this.statelessRulesGroups = []; this.vpc = props.vpc; props.subnetList.forEach((subnet) => { this.subnetList.push({ subnetId: subnet.subnetId }); }); } addStatelessRuleGroup(rule) { this.statelessRulesGroups.push(rule); return this; } addStatefulRule(rule) { this.statefulRuleGroups.push({ resourceArn: rule.ref }); return this; } addStatefulRules(rules) { rules.forEach((rule) => { this.statefulRuleGroups.push({ resourceArn: rule.ref }); }); return this; } buildFirewall() { const statelessRuleGroups = () => { const groups = []; this.statelessRulesGroups.forEach((stateless) => { groups.push({ priority: 100, // ruleDefinition: stateless, resourceArn: stateless.ref, }); }); return groups; }; const fw_policy = new cdk.aws_networkfirewall.CfnFirewallPolicy(this, 'fw_policy', { firewallPolicyName: 'network-firewall-policy', firewallPolicy: { statelessDefaultActions: ['aws:drop'], statelessFragmentDefaultActions: ['aws:drop'], statelessRuleGroupReferences: statelessRuleGroups(), statefulRuleGroupReferences: this.statefulRuleGroups }, }); const firewall = new cdk.aws_networkfirewall.CfnFirewall(this, 'network-firewall', { firewallName: 'network-firewall', firewallPolicyArn: fw_policy.attrFirewallPolicyArn, subnetMappings: this.subnetList, vpcId: this.vpc.vpcId, deleteProtection: false, description: 'AWS Network Firewall to centrally control egress traffic', firewallPolicyChangeProtection: false, subnetChangeProtection: true, }); return firewall; } } exports.NetworkFirewallDistributedConstruct = NetworkFirewallDistributedConstruct; _a = JSII_RTTI_SYMBOL_1; NetworkFirewallDistributedConstruct[_a] = { fqn: "@richkang/cdk-construct-network-firewall-textfile-rules.NetworkFirewallDistributedConstruct", version: "0.1.7" }; class NetworkFirewallRulesBuilder { static statefulRulesSourcePropertyFromFile(scope, filenameList) { const rulesSource = []; filenameList.forEach((filename) => { const contents = fs.readFileSync(filename, { encoding: 'utf8', flag: 'r' }); rulesSource.push(new cdk.aws_networkfirewall.CfnRuleGroup(scope, path.parse(filename.toString()).name, { capacity: 1000, ruleGroupName: path.parse(filename.toString()).name, type: 'STATEFUL', ruleGroup: { rulesSource: { rulesString: contents.split(/\r?\n/).filter((line) => line.match("^([^#])")).join("\n") } }, })); }); return rulesSource; } static statelessRulesAllowedPorts(scope) { return new cdk.aws_networkfirewall.CfnRuleGroup(scope, 'allowed-ports', { capacity: 1000, ruleGroupName: 'allowed-ports', type: 'STATELESS', ruleGroup: { rulesSource: { statelessRulesAndCustomActions: { statelessRules: [ { priority: 1, ruleDefinition: { actions: ['aws:forward_to_sfe'], matchAttributes: { destinations: [{ addressDefinition: '0.0.0.0/0', }], sources: [{ addressDefinition: '0.0.0.0/0', }], protocols: [6], destinationPorts: [ { fromPort: 80, toPort: 80, }, { fromPort: 443, toPort: 443, }, ], }, }, }, { priority: 2, ruleDefinition: { actions: ['aws:forward_to_sfe'], matchAttributes: { destinations: [{ addressDefinition: '0.0.0.0/0', }], sources: [{ addressDefinition: '0.0.0.0/0', }], protocols: [6], sourcePorts: [ { fromPort: 80, toPort: 80, }, { fromPort: 443, toPort: 443, }, ], }, }, } ], }, }, }, }); } } exports.NetworkFirewallRulesBuilder = NetworkFirewallRulesBuilder; _b = JSII_RTTI_SYMBOL_1; NetworkFirewallRulesBuilder[_b] = { fqn: "@richkang/cdk-construct-network-firewall-textfile-rules.NetworkFirewallRulesBuilder", version: "0.1.7" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmV0d29ya0ZpcmV3YWxsRGlzdHJpYnV0ZWRDb25zdHJ1Y3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJOZXR3b3JrRmlyZXdhbGxEaXN0cmlidXRlZENvbnN0cnVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFtQztBQUVuQywyQ0FBdUM7QUFDdkMseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQWU3QixNQUFhLG1DQUFvQyxTQUFRLHNCQUFTO0lBT2hFLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZ0Q7UUFDeEYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUxYLGVBQVUsR0FBNEMsRUFBRSxDQUFDO1FBQ3pELHVCQUFrQixHQUF1RixFQUFFLENBQUM7UUFDNUcseUJBQW9CLEdBQStDLEVBQUUsQ0FBQztRQUk1RSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFFckIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQ3RCLENBQUMsTUFBTSxFQUFDLEVBQUU7WUFDUixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUNuRCxDQUFDLENBQ0YsQ0FBQTtJQUNILENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUF5QztRQUM3RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUF5QztRQUN2RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWlEO1FBQ2hFLEtBQUssQ0FBQyxPQUFP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QyxDQUFDO3dDQUNkLFdBQVcsRUFBRTs0Q0FDWDtnREFDRSxRQUFRLEVBQUUsRUFBRTtnREFDWixNQUFNLEVBQUUsRUFBRTs2Q0FDWDs0Q0FDRDtnREFDRSxRQUFRLEVBQUUsR0FBRztnREFDYixNQUFNLEVBQUUsR0FBRzs2Q0FDWjt5Q0FDRjtxQ0FDRjtpQ0FDRjs2QkFDRjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUEzRkgsa0VBNEZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENmbkZpcmV3YWxsLCBDZm5GaXJld2FsbFBvbGljeSwgQ2ZuUnVsZUdyb3VwIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW5ldHdvcmtmaXJld2FsbCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU5ldHdvcmtGaXJld2FsbERpc3RyaWJ1dGVkQ29uc3RydWN0UHJvcHMge1xuICByZWFkb25seSB2cGM6IGNkay5hd3NfZWMyLklWcGM7XG4gIHJlYWRvbmx5IHN1Ym5ldExpc3Q6IEFycmF5PGNkay5hd3NfZWMyLklTdWJuZXQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOZXR3b3JrRmlyZXdhbGx7XG4gIGFkZFN0YXRlbGVzc1J1bGVHcm91cChydWxlOmNkay5hd3NfbmV0d29ya2ZpcmV3YWxsLkNmblJ1bGVHcm91cCk6SU5ldHdvcmtGaXJld2FsbDtcbiAgYWRkU3RhdGVmdWxSdWxlKHJ1bGU6Y2RrLmF3c19uZXR3b3JrZmlyZXdhbGwuQ2ZuUnVsZUdyb3VwKTpJTmV0d29ya0ZpcmV3YWxsO1xuICBhZGRTdGF0ZWZ1bFJ1bGVzKHJ1bGVzOkFycmF5PGNkay5hd3NfbmV0d29ya2ZpcmV3YWxsLkNmblJ1bGVHcm91cD4pOklOZXR3b3JrRmlyZXdhbGw7XG4gIGJ1aWxkRmlyZXdhbGwoKTpDZm5GaXJld2FsbDtcblxufVxuXG5leHBvcnQgY2xhc3MgTmV0d29ya0ZpcmV3YWxsRGlzdHJpYnV0ZWRDb25zdHJ1Y3QgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJTmV0d29ya0ZpcmV3YWxsIHtcblxuICBwcml2YXRlIHZwYzogY2RrLmF3c19lYzIuSVZwYztcbiAgcHJpdmF0ZSBzdWJuZXRMaXN0OkFycmF5PENmbkZpcmV3YWxsLlN1Ym5ldE1hcHBpbmdQcm9wZXJ0eT4gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0ZWZ1bFJ1bGVHcm91cHM6QXJyYXk8Y2RrLmF3c19uZXR3b3JrZmlyZXdhbGwuQ2ZuRmlyZXdhbGxQb2xpY3kuU3RhdGVmdWxSdWxlR3JvdXBSZWZlcmVuY2VQcm9wZXJ0eT4gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0ZWxlc3NSdWxlc0dyb3VwczpBcnJheTxjZGsuYXdzX25ldHdvcmtmaXJld2FsbC5DZm5SdWxlR3JvdXA+ID0gW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElOZXR3b3JrRmlyZXdhbGxEaXN0cmlidXRlZENvbnN0cnVjdFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnZwYyA9IHByb3BzLnZwYztcblxuICAgIHByb3BzLnN1Ym5ldExpc3QuZm9yRWFjaChcbiAgICAgIChzdWJuZXQpPT57XG4gICAgICAgIHRoaXMuc3VibmV0TGlzdC5wdXNoKHtzdWJuZXRJZDogc3VibmV0LnN1Ym5ldElkfSlcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICBhZGRTdGF0ZWxlc3NSdWxlR3JvdXAocnVsZTpjZGsuYXdzX25ldHdvcmtmaXJld2FsbC5DZm5SdWxlR3JvdXApOklOZXR3b3JrRmlyZXdhbGx7XG4gICAgdGhpcy5zdGF0ZWxlc3NSdWxlc0dyb3Vwcy5wdXNoKHJ1bGUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkU3RhdGVmdWxSdWxlKHJ1bGU6Y2RrLmF3c19uZXR3b3JrZmlyZXdhbGwuQ2ZuUnVsZUdyb3VwKTpJTmV0d29ya0ZpcmV3YWxse1xuICAgIHRoaXMuc3RhdGVmdWxSdWxlR3JvdXBzLnB1c2goeyByZXNvdXJjZUFybjogcnVsZS5yZWYgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdGF0ZWZ1bFJ1bGVzKHJ1bGVzOkFycmF5PGNkay5hd3NfbmV0d29ya2ZpcmV3YWxsLkNmblJ1bGVHcm91cD4pOklOZXR3b3JrRmlyZXdhbGx7XG4gICAgcnVsZXMuZm9yRWFjaChcbiAgICAgIChydWxlKT0+e1xuICAgICAgICB0aGlzLnN0YXRlZnVsUnVsZUdyb3Vwcy5wdXNoKHsgcmVzb3VyY2VBcm46IHJ1bGUucmVmIH0pO1xuICAgICAgfVxuICAgIClcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGJ1aWxkRmlyZXdhbGwoKTogQ2ZuRmlyZXdhbGx7XG4gICAgY29uc3Qgc3RhdGVsZXNzUnVsZUdyb3VwcyA9ICgpOkFycmF5PENmbkZpcmV3YWxsUG9saWN5LlN0YXRlbGVzc1J1bGVHcm91cFJlZmVyZW5jZVByb3BlcnR5PiA9PiB7XG4gICAgICBjb25zdCBncm91cHM6QXJyYXk8Q2ZuRmlyZXdhbGxQb2xpY3kuU3RhdGVsZXNzUnVsZUdyb3VwUmVmZXJlbmNlUHJvcGVydHk+ID0gW107XG4gICAgICB0aGlzLnN0YXRlbGVzc1J1bGVzR3JvdXBzLmZvckVhY2goXG4gICAgICAgIChzdGF0ZWxlc3MpPT57XG4gICAgICAgICAgZ3JvdXBzLnB1c2goe1xuICAgICAgICAgICAgcHJpb3JpdHk6IDEwMCxcbiAgICAgICAgICAgIC8vIHJ1bGVEZWZpbml0aW9uOiBzdGF0ZWxlc3MsXG4gICAgICAgICAgICByZXNvdXJjZUFybjogc3RhdGVsZXNzLnJlZixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgcmV0dXJuIGdyb3VwcztcbiAgICB9O1xuXG4gICAgY29uc3QgZndfcG9saWN5ID0gbmV3IGNkay5hd3NfbmV0d29ya2ZpcmV3YWxsLkNmbkZpcmV3YWxsUG9saWN5KHRoaXMsICdmd19wb2xpY3knLCB7XG4gICAgICBmaXJld2FsbFBvbGljeU5hbWU6ICduZXR3b3JrLWZpcmV3YWxsLXBvbGljeScsXG4gICAgICBmaXJld2FsbFBvbGljeToge1xuICAgICAgICBzdGF0ZWxlc3NEZWZhdWx0QWN0aW9uczogWydhd3M6ZHJvcCddLFxuICAgICAgICBzdGF0ZWxlc3NGcmFnbWVudERlZmF1bHRBY3Rpb25zOiBbJ2F3czpkcm9wJ10sXG4gICAgICAgIHN0YXRlbGVzc1J1bGVHcm91cFJlZmVyZW5jZXM6IHN0YXRlbGVzc1J1bGVHcm91cHMoKSxcbiAgICAgICAgc3RhdGVmdWxSdWxlR3JvdXBSZWZlcmVuY2VzOiB0aGlzLnN0YXRlZnVsUnVsZUdyb3Vwc1xuICAgICAgfSxcbiAgICB9KTsgXG4gICAgXG4gICAgY29uc3QgZmlyZXdhbGwgPSBuZXcgY2RrLmF3c19uZXR3b3JrZmlyZXdhbGwuQ2ZuRmlyZXdhbGwodGhpcywgJ25ldHdvcmstZmlyZXdhbGwnLCB7XG4gICAgICBmaXJld2FsbE5hbWU6ICduZXR3b3JrLWZpcmV3YWxsJyxcbiAgICAgIGZpcmV3YWxsUG9saWN5QXJuOiBmd19wb2xpY3kuYXR0ckZpcmV3YWxsUG9saWN5QXJuLFxuICAgICAgc3VibmV0TWFwcGluZ3M6IHRoaXMuc3VibmV0TGlzdCxcbiAgICAgIHZwY0lkOiB0aGlzLnZwYy52cGNJZCxcbiAgICAgIGRlbGV0ZVByb3RlY3Rpb246IGZhbHNlLFxuICAgICAgZGVzY3JpcHRpb246ICdBV1MgTmV0d29yayBGaXJld2FsbCB0byBjZW50cmFsbHkgY29udHJvbCBlZ3Jlc3MgdHJhZmZpYycsXG4gICAgICBmaXJld2FsbFBvbGljeUNoYW5nZVByb3RlY3Rpb246IGZhbHNlLFxuICAgICAgc3VibmV0Q2hhbmdlUHJvdGVjdGlvbjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmaXJld2FsbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTmV0d29ya0ZpcmV3YWxsUnVsZXNCdWlsZGVye1xuICBcbiAgc3RhdGljIHN0YXRlZnVsUnVsZXNTb3VyY2VQcm9wZXJ0eUZyb21GaWxlKHNjb3BlOiBDb25zdHJ1Y3QsIGZpbGVuYW1lTGlzdDpBcnJheTxzdHJpbmc+KTpBcnJheTxDZm5SdWxlR3JvdXA+e1xuXG4gICAgY29uc3QgcnVsZXNTb3VyY2U6QXJyYXk8Q2ZuUnVsZUdyb3VwPiA9IFtdO1xuXG4gICAgZmlsZW5hbWVMaXN0LmZvckVhY2goXG4gICAgICAoZmlsZW5hbWUpPT57XG4gICAgICAgIGNvbnN0IGNvbnRlbnRzID0gZnMucmVhZEZpbGVTeW5jKGZpbGVuYW1lLCB7IGVuY29kaW5nOiAndXRmOCcsIGZsYWc6ICdyJyB9KTtcbiAgICAgICAgcnVsZXNTb3VyY2UucHVzaCggXG4gICAgICAgICAgbmV3IGNkay5hd3NfbmV0d29ya2ZpcmV3YWxsLkNmblJ1bGVHcm91cChzY29wZSwgcGF0aC5wYXJzZShmaWxlbmFtZS50b1N0cmluZygpKS5uYW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhcGFjaXR5OiAxMDAwLFxuICAgICAgICAgICAgcnVsZUdyb3VwTmFtZTogcGF0aC5wYXJzZShmaWxlbmFtZS50b1N0cmluZygpKS5uYW1lLFxuICAgICAgICAgICAgdHlwZTogJ1NUQVRFRlVMJyxcbiAgICAgICAgICAgIHJ1bGVHcm91cDoge1xuICAgICAgICAgICAgICBydWxlc1NvdXJjZToge1xuICAgICAgICAgICAgICAgIHJ1bGVzU3RyaW5nOiBjb250ZW50cy5zcGxpdCgvXFxyP1xcbi8pLmZpbHRlcigobGluZSkgPT4gbGluZS5tYXRjaChcIl4oW14jXSlcIikpLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSAgICAgICAgICBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIClcbiAgICByZXR1cm4gcnVsZXNTb3VyY2U7XG4gIH1cblxuICBzdGF0aWMgc3RhdGVsZXNzUnVsZXNBbGxvd2VkUG9ydHMoc2NvcGU6IENvbnN0cnVjdCk6Y2RrLmF3c19uZXR3b3JrZmlyZXdhbGwuQ2ZuUnVsZUdyb3Vwe1xuICAgIHJldHVybiBuZXcgY2RrLmF3c19uZXR3b3JrZmlyZXdhbGwuQ2ZuUnVsZUdyb3VwKHNjb3BlLCAnYWxsb3dlZC1wb3J0cycsIHtcbiAgICAgIGNhcGFjaXR5OiAxMDAwLFxuICAgICAgcnVsZUdyb3VwTmFtZTogJ2FsbG93ZWQtcG9ydHMnLFxuICAgICAgdHlwZTogJ1NUQVRFTEVTUycsXG4gICAgICBydWxlR3JvdXA6IHtcbiAgICAgICAgcnVsZXNTb3VyY2U6IHtcbiAgICAgICAgICBzdGF0ZWxlc3NSdWxlc0FuZEN1c3RvbUFjdGlvbnM6IHtcbiAgICAgICAgICAgIHN0YXRlbGVzc1J1bGVzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogMSxcbiAgICAgICAgICAgICAgICBydWxlRGVmaW5pdGlvbjoge1xuICAgICAgICAgICAgICAgICAgYWN0aW9uczogWydhd3M6Zm9yd2FyZF90b19zZmUnXSxcbiAgICAgICAgICAgICAgICAgIG1hdGNoQXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbnM6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc0RlZmluaXRpb246ICcwLjAuMC4wLzAnLFxuICAgICAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlczogW3tcbiAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzRGVmaW5pdGlvbjogJzAuMC4wLjAvMCcsXG4gICAgICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICAgICAgICBwcm90b2NvbHM6IFs2XSxcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Qb3J0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21Qb3J0OiA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvUG9ydDogODAsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tUG9ydDogNDQzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9Qb3J0OiA0NDMsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW9yaXR5OiAyLFxuICAgICAgICAgICAgICAgIHJ1bGVEZWZpbml0aW9uOiB7XG4gICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbJ2F3czpmb3J3YXJkX3RvX3NmZSddLFxuICAgICAgICAgICAgICAgICAgbWF0Y2hBdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uczogW3tcbiAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzRGVmaW5pdGlvbjogJzAuMC4wLjAvMCcsXG4gICAgICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NEZWZpbml0aW9uOiAnMC4wLjAuMC8wJyxcbiAgICAgICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICAgICAgICAgIHByb3RvY29sczogWzZdLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VQb3J0czogW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21Qb3J0OiA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvUG9ydDogODAsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tUG9ydDogNDQzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9Qb3J0OiA0NDMsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LCAgICAgICAgXG4gICAgICB9LFxuICAgIH0pOyAgICBcbiAgfVxufSJdfQ==