aws-cdk-neuronx-patterns
Version:
> [!WARNING] > This library is experimental module.
181 lines • 21.7 kB
JavaScript
;
var _a, _b, _c, _d;
Object.defineProperty(exports, "__esModule", { value: true });
exports.NeuronxInstanceType = exports.Trainium2Chips = exports.Trainium1Chips = exports.Inferentia2Chips = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const ec2 = require("aws-cdk-lib/aws-ec2");
class Inferentia2Chips {
constructor(chips) {
this.chips = chips;
this.neuronxCores = chips * 2;
this.acceleratorMemory = aws_cdk_lib_1.Size.gibibytes(16 * this.neuronxCores);
}
}
exports.Inferentia2Chips = Inferentia2Chips;
_a = JSII_RTTI_SYMBOL_1;
Inferentia2Chips[_a] = { fqn: "aws-cdk-neuronx-patterns.Inferentia2Chips", version: "0.3.0" };
class Trainium1Chips {
constructor(chips) {
this.chips = chips;
this.neuronxCores = chips * 2;
this.acceleratorMemory = aws_cdk_lib_1.Size.gibibytes(16 * this.neuronxCores);
}
}
exports.Trainium1Chips = Trainium1Chips;
_b = JSII_RTTI_SYMBOL_1;
Trainium1Chips[_b] = { fqn: "aws-cdk-neuronx-patterns.Trainium1Chips", version: "0.3.0" };
class Trainium2Chips {
constructor(chips) {
this.chips = chips;
// Each Trainium2 chip has 8 physical NeuronCore-v3.
// With LNC=2 (default), 2 physical cores are combined into 1 logical core,
// resulting in 4 logical NeuronCores per chip, each with 24 GiB of memory.
this.neuronxCores = chips * 4;
this.acceleratorMemory = aws_cdk_lib_1.Size.gibibytes(24 * this.neuronxCores);
}
}
exports.Trainium2Chips = Trainium2Chips;
_c = JSII_RTTI_SYMBOL_1;
Trainium2Chips[_c] = { fqn: "aws-cdk-neuronx-patterns.Trainium2Chips", version: "0.3.0" };
class NeuronxInstanceTypeBase {
constructor(props) {
this.instanceType = props.instanceType;
this.vCpu = props.vCpu;
this.memory = props.memory;
this.acceleratorChips = props.acceleratorChips;
}
/**
* Return the instance type as a string
* @returns The instance type as a string
*/
toString() {
return this.instanceType.toString();
}
}
class Inferentia2InstanceType extends NeuronxInstanceTypeBase {
get supportedTensorParallelism() {
return [1, 2, 4, 8, 24].filter((tp) => tp <= this.acceleratorChips.neuronxCores);
}
constructor(props) {
super({
instanceType: props.instanceType,
vCpu: props.vCpu,
memory: props.memory,
acceleratorChips: new Inferentia2Chips(props.chips),
});
}
}
class Trainium1InstanceType extends NeuronxInstanceTypeBase {
get supportedTensorParallelism() {
return [1, 2, 8, 16, 32].filter((tp) => tp <= this.acceleratorChips.neuronxCores);
}
constructor(props) {
super({
instanceType: props.instanceType,
vCpu: props.vCpu,
memory: props.memory,
acceleratorChips: new Trainium1Chips(props.chips),
});
}
}
class Trainium2InstanceType extends NeuronxInstanceTypeBase {
get supportedTensorParallelism() {
return [1, 2, 4, 8, 16, 32, 64].filter((tp) => tp <= this.acceleratorChips.neuronxCores);
}
constructor(props) {
super({
instanceType: props.instanceType,
vCpu: props.vCpu,
memory: props.memory,
acceleratorChips: new Trainium2Chips(props.chips),
});
}
}
class NeuronxInstanceType {
}
exports.NeuronxInstanceType = NeuronxInstanceType;
_d = JSII_RTTI_SYMBOL_1;
NeuronxInstanceType[_d] = { fqn: "aws-cdk-neuronx-patterns.NeuronxInstanceType", version: "0.3.0" };
/**
* inf2.xlarge
*/
NeuronxInstanceType.INF2_XLARGE = new Inferentia2InstanceType({
instanceType: ec2.InstanceType.of(ec2.InstanceClass.INF2, ec2.InstanceSize.XLARGE),
vCpu: 4,
memory: aws_cdk_lib_1.Size.gibibytes(16),
chips: 1,
});
/**
* inf2.8xlarge
*/
NeuronxInstanceType.INF2_8XLARGE = new Inferentia2InstanceType({
instanceType: ec2.InstanceType.of(ec2.InstanceClass.INF2, ec2.InstanceSize.XLARGE8),
vCpu: 32,
memory: aws_cdk_lib_1.Size.gibibytes(128),
chips: 1,
});
/**
* inf2.24xlarge
*/
NeuronxInstanceType.INF2_24XLARGE = new Inferentia2InstanceType({
instanceType: ec2.InstanceType.of(ec2.InstanceClass.INF2, ec2.InstanceSize.XLARGE24),
vCpu: 96,
memory: aws_cdk_lib_1.Size.gibibytes(384),
chips: 6,
});
/**
* inf2.48xlarge
*/
NeuronxInstanceType.INF2_48XLARGE = new Inferentia2InstanceType({
instanceType: ec2.InstanceType.of(ec2.InstanceClass.INF2, ec2.InstanceSize.XLARGE48),
vCpu: 192,
memory: aws_cdk_lib_1.Size.gibibytes(768),
chips: 12,
});
/**
* trn1.2xlarge
*/
NeuronxInstanceType.TRN1_2XLARGE = new Trainium1InstanceType({
instanceType: ec2.InstanceType.of(ec2.InstanceClass.TRN1, ec2.InstanceSize.XLARGE2),
vCpu: 8,
memory: aws_cdk_lib_1.Size.gibibytes(32),
chips: 1,
});
/**
* trn1.32xlarge
*/
NeuronxInstanceType.TRN1_32XLARGE = new Trainium1InstanceType({
instanceType: ec2.InstanceType.of(ec2.InstanceClass.TRN1, ec2.InstanceSize.XLARGE32),
vCpu: 128,
memory: aws_cdk_lib_1.Size.gibibytes(512),
chips: 16,
});
/**
* trn2.3xlarge
*/
NeuronxInstanceType.TRN2_3XLARGE = new Trainium2InstanceType({
instanceType: ec2.InstanceType.of(ec2.InstanceClass.TRN2, ec2.InstanceSize.XLARGE3),
vCpu: 12,
memory: aws_cdk_lib_1.Size.gibibytes(128),
chips: 1,
});
/**
* trn2.48xlarge
*/
NeuronxInstanceType.TRN2_48XLARGE = new Trainium2InstanceType({
instanceType: ec2.InstanceType.of(ec2.InstanceClass.TRN2, ec2.InstanceSize.XLARGE48),
vCpu: 192,
memory: aws_cdk_lib_1.Size.gibibytes(2048),
chips: 16,
});
/**
* trn2u.48xlarge
*/
NeuronxInstanceType.TRN2U_48XLARGE = new Trainium2InstanceType({
instanceType: ec2.InstanceType.of(ec2.InstanceClass.TRN2U, ec2.InstanceSize.XLARGE48),
vCpu: 192,
memory: aws_cdk_lib_1.Size.gibibytes(2048),
chips: 16,
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV1cm9ueC1pbnN0YW5jZS10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Jhc2UvbmV1cm9ueC9uZXVyb254LWluc3RhbmNlLXR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBbUM7QUFDbkMsMkNBQTJDO0FBVzNDLE1BQWEsZ0JBQWdCO0lBRzNCLFlBQXFCLEtBQWE7UUFBYixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsa0JBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRSxDQUFDOztBQU5ILDRDQU9DOzs7QUFFRCxNQUFhLGNBQWM7SUFHekIsWUFBcUIsS0FBYTtRQUFiLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxrQkFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xFLENBQUM7O0FBTkgsd0NBT0M7OztBQUVELE1BQWEsY0FBYztJQUd6QixZQUFxQixLQUFhO1FBQWIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNoQyxvREFBb0Q7UUFDcEQsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGtCQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEUsQ0FBQzs7QUFUSCx3Q0FVQzs7O0FBU0QsTUFBZSx1QkFBdUI7SUFNcEMsWUFBWSxLQUtYO1FBQ0MsSUFB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QUFDO0lBQzVCLEtBQUssRUFBRSxFQUFFO0NBQ1YsQ0FBQyxDQUFDO0FBQ0w7O0dBRUc7QUFDb0Isa0NBQWMsR0FDbkMsSUFBSSxxQkFBcUIsQ0FBQztJQUN4QixZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQy9CLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUN2QixHQUFHLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FDMUI7SUFDRCxJQUFJLEVBQUUsR0FBRztJQUNULE1BQU0sRUFBRSxrQkFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDNUIsS0FBSyxFQUFFLEVBQUU7Q0FDVixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaXplIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBY2NlbGVyYXRvckNoaXBzIHtcbiAgcmVhZG9ubHkgY2hpcHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmV1cm9ueENvcmVzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGFjY2VsZXJhdG9yTWVtb3J5OiBTaXplO1xufVxuXG5leHBvcnQgY2xhc3MgSW5mZXJlbnRpYTJDaGlwcyBpbXBsZW1lbnRzIElBY2NlbGVyYXRvckNoaXBzIHtcbiAgcmVhZG9ubHkgbmV1cm9ueENvcmVzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGFjY2VsZXJhdG9yTWVtb3J5OiBTaXplO1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBjaGlwczogbnVtYmVyKSB7XG4gICAgdGhpcy5uZXVyb254Q29yZXMgPSBjaGlwcyAqIDI7XG4gICAgdGhpcy5hY2NlbGVyYXRvck1lbW9yeSA9IFNpemUuZ2liaWJ5dGVzKDE2ICogdGhpcy5uZXVyb254Q29yZXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFpbml1bTFDaGlwcyBpbXBsZW1lbnRzIElBY2NlbGVyYXRvckNoaXBzIHtcbiAgcmVhZG9ubHkgbmV1cm9ueENvcmVzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGFjY2VsZXJhdG9yTWVtb3J5OiBTaXplO1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBjaGlwczogbnVtYmVyKSB7XG4gICAgdGhpcy5uZXVyb254Q29yZXMgPSBjaGlwcyAqIDI7XG4gICAgdGhpcy5hY2NlbGVyYXRvck1lbW9yeSA9IFNpemUuZ2liaWJ5dGVzKDE2ICogdGhpcy5uZXVyb254Q29yZXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFpbml1bTJDaGlwcyBpbXBsZW1lbnRzIElBY2NlbGVyYXRvckNoaXBzIHtcbiAgcmVhZG9ubHkgbmV1cm9ueENvcmVzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGFjY2VsZXJhdG9yTWVtb3J5OiBTaXplO1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBjaGlwczogbnVtYmVyKSB7XG4gICAgLy8gRWFjaCBUcmFpbml1bTIgY2hpcCBoYXMgOCBwaHlzaWNhbCBOZXVyb25Db3JlLXYzLlxuICAgIC8vIFdpdGggTE5DPTIgKGRlZmF1bHQpLCAyIHBoeXNpY2FsIGNvcmVzIGFyZSBjb21iaW5lZCBpbnRvIDEgbG9naWNhbCBjb3JlLFxuICAgIC8vIHJlc3VsdGluZyBpbiA0IGxvZ2ljYWwgTmV1cm9uQ29yZXMgcGVyIGNoaXAsIGVhY2ggd2l0aCAyNCBHaUIgb2YgbWVtb3J5LlxuICAgIHRoaXMubmV1cm9ueENvcmVzID0gY2hpcHMgKiA0O1xuICAgIHRoaXMuYWNjZWxlcmF0b3JNZW1vcnkgPSBTaXplLmdpYmlieXRlcygyNCAqIHRoaXMubmV1cm9ueENvcmVzKTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBJTmV1cm9ueEluc3RhbmNlVHlwZSB7XG4gIHJlYWRvbmx5IHN1cHBvcnRlZFRlbnNvclBhcmFsbGVsaXNtOiBudW1iZXJbXTtcbiAgcmVhZG9ubHkgaW5zdGFuY2VUeXBlOiBlYzIuSW5zdGFuY2VUeXBlO1xuICByZWFkb25seSB2Q3B1OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1lbW9yeTogU2l6ZTtcbiAgcmVhZG9ubHkgYWNjZWxlcmF0b3JDaGlwczogSUFjY2VsZXJhdG9yQ2hpcHM7XG59XG5cbmFic3RyYWN0IGNsYXNzIE5ldXJvbnhJbnN0YW5jZVR5cGVCYXNlIGltcGxlbWVudHMgSU5ldXJvbnhJbnN0YW5jZVR5cGUge1xuICByZWFkb25seSBhY2NlbGVyYXRvckNoaXBzOiBJQWNjZWxlcmF0b3JDaGlwcztcbiAgcmVhZG9ubHkgaW5zdGFuY2VUeXBlOiBlYzIuSW5zdGFuY2VUeXBlO1xuICByZWFkb25seSB2Q3B1OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1lbW9yeTogU2l6ZTtcbiAgYWJzdHJhY3QgcmVhZG9ubHkgc3VwcG9ydGVkVGVuc29yUGFyYWxsZWxpc206IG51bWJlcltdO1xuICBjb25zdHJ1Y3Rvcihwcm9wczoge1xuICAgIGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZTtcbiAgICB2Q3B1OiBudW1iZXI7XG4gICAgbWVtb3J5OiBTaXplO1xuICAgIGFjY2VsZXJhdG9yQ2hpcHM6IElBY2NlbGVyYXRvckNoaXBzO1xuICB9KSB7XG4gICAgdGhpcy5pbnN0YW5jZVR5cGUgPSBwcm9wcy5pbnN0YW5jZVR5cGU7XG4gICAgdGhpcy52Q3B1ID0gcHJvcHMudkNwdTtcbiAgICB0aGlzLm1lbW9yeSA9IHByb3BzLm1lbW9yeTtcbiAgICB0aGlzLmFjY2VsZXJhdG9yQ2hpcHMgPSBwcm9wcy5hY2NlbGVyYXRvckNoaXBzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGluc3RhbmNlIHR5cGUgYXMgYSBzdHJpbmdcbiAgICogQHJldHVybnMgVGhlIGluc3RhbmNlIHR5cGUgYXMgYSBzdHJpbmdcbiAgICovXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmluc3RhbmNlVHlwZS50b1N0cmluZygpO1xuICB9XG59XG5cbmNsYXNzIEluZmVyZW50aWEySW5zdGFuY2VUeXBlIGV4dGVuZHMgTmV1cm9ueEluc3RhbmNlVHlwZUJhc2Uge1xuICBnZXQgc3VwcG9ydGVkVGVuc29yUGFyYWxsZWxpc20oKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBbMSwgMiwgNCwgOCwgMjRdLmZpbHRlcihcbiAgICAgICh0cCkgPT4gdHAgPD0gdGhpcy5hY2NlbGVyYXRvckNoaXBzLm5ldXJvbnhDb3JlcyxcbiAgICApO1xuICB9XG4gIGNvbnN0cnVjdG9yKHByb3BzOiB7XG4gICAgaW5zdGFuY2VUeXBlOiBlYzIuSW5zdGFuY2VUeXBlO1xuICAgIHZDcHU6IG51bWJlcjtcbiAgICBtZW1vcnk6IFNpemU7XG4gICAgY2hpcHM6IG51bWJlcjtcbiAgfSkge1xuICAgIHN1cGVyKHtcbiAgICAgIGluc3RhbmNlVHlwZTogcHJvcHMuaW5zdGFuY2VUeXBlLFxuICAgICAgdkNwdTogcHJvcHMudkNwdSxcbiAgICAgIG1lbW9yeTogcHJvcHMubWVtb3J5LFxuICAgICAgYWNjZWxlcmF0b3JDaGlwczogbmV3IEluZmVyZW50aWEyQ2hpcHMocHJvcHMuY2hpcHMpLFxuICAgIH0pO1xuICB9XG59XG5jbGFzcyBUcmFpbml1bTFJbnN0YW5jZVR5cGUgZXh0ZW5kcyBOZXVyb254SW5zdGFuY2VUeXBlQmFzZSB7XG4gIGdldCBzdXBwb3J0ZWRUZW5zb3JQYXJhbGxlbGlzbSgpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFsxLCAyLCA4LCAxNiwgMzJdLmZpbHRlcihcbiAgICAgICh0cCkgPT4gdHAgPD0gdGhpcy5hY2NlbGVyYXRvckNoaXBzLm5ldXJvbnhDb3JlcyxcbiAgICApO1xuICB9XG4gIGNvbnN0cnVjdG9yKHByb3BzOiB7XG4gICAgaW5zdGFuY2VUeXBlOiBlYzIuSW5zdGFuY2VUeXBlO1xuICAgIHZDcHU6IG51bWJlcjtcbiAgICBtZW1vcnk6IFNpemU7XG4gICAgY2hpcHM6IG51bWJlcjtcbiAgfSkge1xuICAgIHN1cGVyKHtcbiAgICAgIGluc3RhbmNlVHlwZTogcHJvcHMuaW5zdGFuY2VUeXBlLFxuICAgICAgdkNwdTogcHJvcHMudkNwdSxcbiAgICAgIG1lbW9yeTogcHJvcHMubWVtb3J5LFxuICAgICAgYWNjZWxlcmF0b3JDaGlwczogbmV3IFRyYWluaXVtMUNoaXBzKHByb3BzLmNoaXBzKSxcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgVHJhaW5pdW0ySW5zdGFuY2VUeXBlIGV4dGVuZHMgTmV1cm9ueEluc3RhbmNlVHlwZUJhc2Uge1xuICBnZXQgc3VwcG9ydGVkVGVuc29yUGFyYWxsZWxpc20oKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBbMSwgMiwgNCwgOCwgMTYsIDMyLCA2NF0uZmlsdGVyKFxuICAgICAgKHRwKSA9PiB0cCA8PSB0aGlzLmFjY2VsZXJhdG9yQ2hpcHMubmV1cm9ueENvcmVzLFxuICAgICk7XG4gIH1cbiAgY29uc3RydWN0b3IocHJvcHM6IHtcbiAgICBpbnN0YW5jZVR5cGU6IGVjMi5JbnN0YW5jZVR5cGU7XG4gICAgdkNwdTogbnVtYmVyO1xuICAgIG1lbW9yeTogU2l6ZTtcbiAgICBjaGlwczogbnVtYmVyO1xuICB9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgaW5zdGFuY2VUeXBlOiBwcm9wcy5pbnN0YW5jZVR5cGUsXG4gICAgICB2Q3B1OiBwcm9wcy52Q3B1LFxuICAgICAgbWVtb3J5OiBwcm9wcy5tZW1vcnksXG4gICAgICBhY2NlbGVyYXRvckNoaXBzOiBuZXcgVHJhaW5pdW0yQ2hpcHMocHJvcHMuY2hpcHMpLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOZXVyb254SW5zdGFuY2VUeXBlIHtcbiAgLyoqXG4gICAqIGluZjIueGxhcmdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElORjJfWExBUkdFOiBJTmV1cm9ueEluc3RhbmNlVHlwZSA9XG4gICAgbmV3IEluZmVyZW50aWEySW5zdGFuY2VUeXBlKHtcbiAgICAgIGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZS5vZihcbiAgICAgICAgZWMyLkluc3RhbmNlQ2xhc3MuSU5GMixcbiAgICAgICAgZWMyLkluc3RhbmNlU2l6ZS5YTEFSR0UsXG4gICAgICApLFxuICAgICAgdkNwdTogNCxcbiAgICAgIG1lbW9yeTogU2l6ZS5naWJpYnl0ZXMoMTYpLFxuICAgICAgY2hpcHM6IDEsXG4gICAgfSk7XG4gIC8qKlxuICAgKiBpbmYyLjh4bGFyZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSU5GMl84WExBUkdFOiBJTmV1cm9ueEluc3RhbmNlVHlwZSA9XG4gICAgbmV3IEluZmVyZW50aWEySW5zdGFuY2VUeXBlKHtcbiAgICAgIGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZS5vZihcbiAgICAgICAgZWMyLkluc3RhbmNlQ2xhc3MuSU5GMixcbiAgICAgICAgZWMyLkluc3RhbmNlU2l6ZS5YTEFSR0U4LFxuICAgICAgKSxcbiAgICAgIHZDcHU6IDMyLFxuICAgICAgbWVtb3J5OiBTaXplLmdpYmlieXRlcygxMjgpLFxuICAgICAgY2hpcHM6IDEsXG4gICAgfSk7XG4gIC8qKlxuICAgKiBpbmYyLjI0eGxhcmdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElORjJfMjRYTEFSR0U6IElOZXVyb254SW5zdGFuY2VUeXBlID1cbiAgICBuZXcgSW5mZXJlbnRpYTJJbnN0YW5jZVR5cGUoe1xuICAgICAgaW5zdGFuY2VUeXBlOiBlYzIuSW5zdGFuY2VUeXBlLm9mKFxuICAgICAgICBlYzIuSW5zdGFuY2VDbGFzcy5JTkYyLFxuICAgICAgICBlYzIuSW5zdGFuY2VTaXplLlhMQVJHRTI0LFxuICAgICAgKSxcbiAgICAgIHZDcHU6IDk2LFxuICAgICAgbWVtb3J5OiBTaXplLmdpYmlieXRlcygzODQpLFxuICAgICAgY2hpcHM6IDYsXG4gICAgfSk7XG4gIC8qKlxuICAgKiBpbmYyLjQ4eGxhcmdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElORjJfNDhYTEFSR0U6IElOZXVyb254SW5zdGFuY2VUeXBlID1cbiAgICBuZXcgSW5mZXJlbnRpYTJJbnN0YW5jZVR5cGUoe1xuICAgICAgaW5zdGFuY2VUeXBlOiBlYzIuSW5zdGFuY2VUeXBlLm9mKFxuICAgICAgICBlYzIuSW5zdGFuY2VDbGFzcy5JTkYyLFxuICAgICAgICBlYzIuSW5zdGFuY2VTaXplLlhMQVJHRTQ4LFxuICAgICAgKSxcbiAgICAgIHZDcHU6IDE5MixcbiAgICAgIG1lbW9yeTogU2l6ZS5naWJpYnl0ZXMoNzY4KSxcbiAgICAgIGNoaXBzOiAxMixcbiAgICB9KTtcbiAgLyoqXG4gICAqIHRybjEuMnhsYXJnZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUUk4xXzJYTEFSR0U6IElOZXVyb254SW5zdGFuY2VUeXBlID1cbiAgICBuZXcgVHJhaW5pdW0xSW5zdGFuY2VUeXBlKHtcbiAgICAgIGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZS5vZihcbiAgICAgICAgZWMyLkluc3RhbmNlQ2xhc3MuVFJOMSxcbiAgICAgICAgZWMyLkluc3RhbmNlU2l6ZS5YTEFSR0UyLFxuICAgICAgKSxcbiAgICAgIHZDcHU6IDgsXG4gICAgICBtZW1vcnk6IFNpemUuZ2liaWJ5dGVzKDMyKSxcbiAgICAgIGNoaXBzOiAxLFxuICAgIH0pO1xuICAvKipcbiAgICogdHJuMS4zMnhsYXJnZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUUk4xXzMyWExBUkdFOiBJTmV1cm9ueEluc3RhbmNlVHlwZSA9XG4gICAgbmV3IFRyYWluaXVtMUluc3RhbmNlVHlwZSh7XG4gICAgICBpbnN0YW5jZVR5cGU6IGVjMi5JbnN0YW5jZVR5cGUub2YoXG4gICAgICAgIGVjMi5JbnN0YW5jZUNsYXNzLlRSTjEsXG4gICAgICAgIGVjMi5JbnN0YW5jZVNpemUuWExBUkdFMzIsXG4gICAgICApLFxuICAgICAgdkNwdTogMTI4LFxuICAgICAgbWVtb3J5OiBTaXplLmdpYmlieXRlcyg1MTIpLFxuICAgICAgY2hpcHM6IDE2LFxuICAgIH0pO1xuICAvKipcbiAgICogdHJuMi4zeGxhcmdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRSTjJfM1hMQVJHRTogSU5ldXJvbnhJbnN0YW5jZVR5cGUgPVxuICAgIG5ldyBUcmFpbml1bTJJbnN0YW5jZVR5cGUoe1xuICAgICAgaW5zdGFuY2VUeXBlOiBlYzIuSW5zdGFuY2VUeXBlLm9mKFxuICAgICAgICBlYzIuSW5zdGFuY2VDbGFzcy5UUk4yLFxuICAgICAgICBlYzIuSW5zdGFuY2VTaXplLlhMQVJHRTMsXG4gICAgICApLFxuICAgICAgdkNwdTogMTIsXG4gICAgICBtZW1vcnk6IFNpemUuZ2liaWJ5dGVzKDEyOCksXG4gICAgICBjaGlwczogMSxcbiAgICB9KTtcbiAgLyoqXG4gICAqIHRybjIuNDh4bGFyZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFJOMl80OFhMQVJHRTogSU5ldXJvbnhJbnN0YW5jZVR5cGUgPVxuICAgIG5ldyBUcmFpbml1bTJJbnN0YW5jZVR5cGUoe1xuICAgICAgaW5zdGFuY2VUeXBlOiBlYzIuSW5zdGFuY2VUeXBlLm9mKFxuICAgICAgICBlYzIuSW5zdGFuY2VDbGFzcy5UUk4yLFxuICAgICAgICBlYzIuSW5zdGFuY2VTaXplLlhMQVJHRTQ4LFxuICAgICAgKSxcbiAgICAgIHZDcHU6IDE5MixcbiAgICAgIG1lbW9yeTogU2l6ZS5naWJpYnl0ZXMoMjA0OCksXG4gICAgICBjaGlwczogMTYsXG4gICAgfSk7XG4gIC8qKlxuICAgKiB0cm4ydS40OHhsYXJnZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUUk4yVV80OFhMQVJHRTogSU5ldXJvbnhJbnN0YW5jZVR5cGUgPVxuICAgIG5ldyBUcmFpbml1bTJJbnN0YW5jZVR5cGUoe1xuICAgICAgaW5zdGFuY2VUeXBlOiBlYzIuSW5zdGFuY2VUeXBlLm9mKFxuICAgICAgICBlYzIuSW5zdGFuY2VDbGFzcy5UUk4yVSxcbiAgICAgICAgZWMyLkluc3RhbmNlU2l6ZS5YTEFSR0U0OCxcbiAgICAgICksXG4gICAgICB2Q3B1OiAxOTIsXG4gICAgICBtZW1vcnk6IFNpemUuZ2liaWJ5dGVzKDIwNDgpLFxuICAgICAgY2hpcHM6IDE2LFxuICAgIH0pO1xufVxuIl19