@flxbl-io/sfp
Version:
sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model
180 lines • 17.2 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@salesforce/core");
const SfpCommand_1 = __importDefault(require("../../SfpCommand"));
const ValidateImpl_1 = __importStar(require("../../impl/validate/ValidateImpl"));
const SFPStatsSender_1 = __importDefault(require("../../core/stats/SFPStatsSender"));
const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger"));
const fs = __importStar(require("fs-extra"));
const ValidateError_1 = __importDefault(require("../../errors/ValidateError"));
const sfdxflags_1 = require("../../flags/sfdxflags");
const core_2 = require("@oclif/core");
core_1.Messages.importMessagesDirectory(__dirname);
const messages = core_1.Messages.loadMessages('@flxbl-io/sfp', 'validateAgainstOrg');
class ValidateAgainstOrg extends SfpCommand_1.default {
async execute() {
let executionStartTime = Date.now();
let tags;
tags = {
tag: this.flags.tag != null ? this.flags.tag : undefined,
validation_mode: this.flags.mode,
releaseConfig: this.flags.releaseconfig,
};
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`command: ${(0, sfp_logger_1.COLOR_KEY_MESSAGE)(`validateAgainstOrg`)}`));
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Target Org: ${this.flags.targetorg}`));
if (this.flags.releaseconfig) {
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Domains: ${this.flags.releaseconfig}`));
}
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Validation Mode: ${(0, sfp_logger_1.COLOR_KEY_MESSAGE)(`${ValidateImpl_1.ValidationMode[Object.keys(ValidateImpl_1.ValidationMode)[Object.values(ValidateImpl_1.ValidationMode).indexOf(this.flags.mode)]]}`)}`));
if (this.flags.ref) {
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Ref: ${this.flags.ref}`));
}
if (this.flags.baseRef) {
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Base Ref: ${this.flags.baseRef}`));
}
if (this.flags.mode != ValidateImpl_1.ValidationMode.FAST_FEEDBACK) {
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Coverage Percentage: ${this.flags.coveragepercent}`));
}
sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, core_1.LoggerLevel.INFO);
let validateResult;
try {
let validateProps = {
validateAgainst: ValidateImpl_1.ValidateAgainst.PROVIDED_ORG,
validationMode: ValidateImpl_1.ValidationMode[Object.keys(ValidateImpl_1.ValidationMode)[Object.values(ValidateImpl_1.ValidationMode).indexOf(this.flags.mode)]],
coverageThreshold: this.flags.coveragepercent,
logsGroupSymbol: this.flags.logsgroupsymbol,
targetOrg: this.flags.targetorg,
diffcheck: this.flags.diffcheck,
branch: this.flags.ref,
baseBranch: this.flags.baseRef,
disableArtifactCommit: this.flags.disableartifactupdate,
disableSourcePackageOverride: this.flags.disablesourcepkgoverride,
disableParallelTestExecution: this.flags.disableparalleltesting,
orgInfo: this.flags.orginfo,
installExternalDependencies: this.flags.installdeps,
};
//Add check for devhub
if (this.flags.devhubalias) {
validateProps.hubOrg = await core_1.Org.create({ aliasOrUsername: this.flags.devhubalias });
}
setReleaseConfigForReleaseBasedModes(this.flags.releaseconfig, validateProps);
let validateImpl = new ValidateImpl_1.default(validateProps);
validateResult = await validateImpl.exec();
}
catch (error) {
if (error instanceof ValidateError_1.default) {
validateResult = error.data;
}
SFPStatsSender_1.default.logCount('validate.failed', tags);
process.exitCode = 1;
}
finally {
let totalElapsedTime = Date.now() - executionStartTime;
SFPStatsSender_1.default.logGauge('validate.duration', totalElapsedTime, tags);
SFPStatsSender_1.default.logCount('validate.scheduled', tags);
if (validateResult) {
SFPStatsSender_1.default.logGauge('validate.packages.scheduled', validateResult.deploymentResult?.scheduled, tags);
SFPStatsSender_1.default.logGauge('validate.packages.succeeded', validateResult.deploymentResult?.deployed?.length, tags);
SFPStatsSender_1.default.logGauge('validate.packages.failed', validateResult.deploymentResult?.failed?.length, tags);
}
}
function setReleaseConfigForReleaseBasedModes(releaseConfigPaths, validateProps) {
if (validateProps.validationMode == ValidateImpl_1.ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG ||
validateProps.validationMode == ValidateImpl_1.ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG) {
if (!releaseConfigPaths || releaseConfigPaths.length === 0) {
throw new Error(`Release config paths are required when using validation by release config`);
}
const validPaths = releaseConfigPaths.filter(path => fs.existsSync(path));
if (validPaths.length === 0) {
throw new Error(`None of the provided release config paths exist, please check the paths: ${releaseConfigPaths.join(', ')}`);
}
// Assuming validateProps can handle an array of paths; adjust as per your implementation
validateProps.releaseConfigPaths = validPaths;
}
}
}
}
ValidateAgainstOrg.aliases = ['orchestrator:validateagainstorg', 'validateAgainstOrg'];
ValidateAgainstOrg.description = messages.getMessage('commandDescription');
ValidateAgainstOrg.examples = [`$ sfp validate org -o <targetorg>`];
ValidateAgainstOrg.flags = {
targetorg: sfdxflags_1.requiredUserNameFlag,
mode: core_2.Flags.string({
description: 'validation mode',
default: 'thorough',
required: true,
options: ['individual', 'fastfeedback', 'thorough', 'ff-release-config', 'thorough-release-config'],
}),
releaseconfig: (0, sfdxflags_1.arrayFlagSfdxStyle)({
aliases: ['domain'],
description: messages.getMessage('releaseConfigFileFlagDescription'),
}),
coveragepercent: core_2.Flags.integer({
description: messages.getMessage('coveragePercentFlagDescription'),
default: 75,
}),
diffcheck: core_2.Flags.boolean({
description: messages.getMessage('diffCheckFlagDescription'),
default: false,
}),
disableartifactupdate: core_2.Flags.boolean({
description: messages.getMessage('disableArtifactUpdateFlagDescription'),
default: false,
}),
logsgroupsymbol: sfdxflags_1.logsgroupsymbol,
ref: core_2.Flags.string({
aliases: ['branch'],
dependsOn: ['baseRef'],
description: messages.getMessage('refFlagDescription'),
}),
baseRef: core_2.Flags.string({
aliases: ['basebranch'],
description: messages.getMessage('baseRefFlagDescription'),
}),
orginfo: core_2.Flags.boolean({
description: messages.getMessage('orgInfoFlagDescription'),
default: false,
}),
installdeps: core_2.Flags.boolean({
description: messages.getMessage('installDepsFlagDescription'),
default: false,
}),
devhubalias: sfdxflags_1.targetdevhubusername,
disablesourcepkgoverride: core_2.Flags.boolean({
description: messages.getMessage('disableSourcePackageOverride'),
dependsOn: ['devhubalias']
}),
disableparalleltesting: core_2.Flags.boolean({
description: messages.getMessage('disableParallelTestingFlagDescription'),
default: false,
}),
loglevel: sfdxflags_1.loglevel
};
exports.default = ValidateAgainstOrg;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3ZhbGlkYXRlL29yZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQThEO0FBQzlELGtFQUEwQztBQUMxQyxpRkFBZ0g7QUFDaEgscUZBQTZEO0FBQzdELG1FQUFrRjtBQUNsRiw2Q0FBK0I7QUFDL0IsK0VBQXVEO0FBRXZELHFEQUFrSTtBQUNsSSxzQ0FBb0M7QUFHcEMsZUFBUSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzVDLE1BQU0sUUFBUSxHQUFHLGVBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLG9CQUFvQixDQUFDLENBQUM7QUFFOUUsTUFBcUIsa0JBQW1CLFNBQVEsb0JBQVU7SUE0RHRELEtBQUssQ0FBQyxPQUFPO1FBQ1QsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFcEMsSUFBSSxJQUE2QixDQUFDO1FBQ2xDLElBQUksR0FBRztZQUNILEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3hELGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDaEMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtTQUMxQyxDQUFDO1FBRUYsb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSx5QkFBWSxFQUFDLFlBQVksSUFBQSw4QkFBaUIsRUFBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25GLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEseUJBQVksRUFBQyxlQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUMsQ0FBQztZQUN6QixvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLHlCQUFZLEVBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0Qsb0JBQVMsQ0FBQyxHQUFHLENBQ1QsSUFBQSx5QkFBWSxFQUNSLG9CQUFvQixJQUFBLDhCQUFpQixFQUNqQyxHQUNJLDZCQUFjLENBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBYyxDQUFDLENBQ3RCLE1BQU0sQ0FBQyxNQUFNLENBQUMsNkJBQWMsQ0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUN2RSxDQUVULEVBQUUsQ0FDTCxFQUFFLENBQ04sQ0FDSixDQUFDO1FBQ0YsSUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEseUJBQVksRUFBQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCxJQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEIsb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSx5QkFBWSxFQUFDLGFBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksNkJBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNsRCxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLHlCQUFZLEVBQUMsd0JBQXdCLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFHRCxvQkFBUyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUMseUJBQVksRUFBQyxrQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRzVELElBQUksY0FBOEIsQ0FBQztRQUNuQyxJQUFJLENBQUM7WUFDRCxJQUFJLGFBQWEsR0FBa0I7Z0JBQy9CLGVBQWUsRUFBRSw4QkFBZSxDQUFDLFlBQVk7Z0JBQzdDLGNBQWMsRUFBRyw2QkFBYyxDQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUFjLENBQUMsQ0FDdEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyw2QkFBYyxDQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQ3ZFLENBQ0o7Z0JBQ0QsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlO2dCQUM3QyxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlO2dCQUMzQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO2dCQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO2dCQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO2dCQUN0QixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO2dCQUM5QixxQkFBcUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQjtnQkFDdkQsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0I7Z0JBQ2pFLDRCQUE0QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCO2dCQUMvRCxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO2dCQUMzQiwyQkFBMkIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7YUFDdEQsQ0FBQztZQUdGLHNCQUFzQjtZQUN0QixJQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUN6QixDQUFDO2dCQUNHLGFBQWEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxVQUFHLENBQUMsTUFBTSxDQUFDLEVBQUMsZUFBZSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQztZQUN0RixDQUFDO1lBRUQsb0NBQW9DLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0UsSUFBSSxZQUFZLEdBQWlCLElBQUksc0JBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNqRSxjQUFjLEdBQUcsTUFBTSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0MsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLEtBQUssWUFBWSx1QkFBYSxFQUFFLENBQUM7Z0JBQ2pDLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ2hDLENBQUM7WUFFRCx3QkFBYyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVqRCxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUN6QixDQUFDO2dCQUFTLENBQUM7WUFDUCxJQUFJLGdCQUFnQixHQUFXLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQztZQUUvRCx3QkFBYyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVyRSx3QkFBYyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVwRCxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNqQix3QkFBYyxDQUFDLFFBQVEsQ0FDbkIsNkJBQTZCLEVBQzdCLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQzFDLElBQUksQ0FDUCxDQUFDO2dCQUVGLHdCQUFjLENBQUMsUUFBUSxDQUNuQiw2QkFBNkIsRUFDN0IsY0FBYyxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQ2pELElBQUksQ0FDUCxDQUFDO2dCQUVGLHdCQUFjLENBQUMsUUFBUSxDQUNuQiwwQkFBMEIsRUFDMUIsY0FBYyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQy9DLElBQUksQ0FDUCxDQUFDO1lBQ04sQ0FBQztRQUNMLENBQUM7UUFFRCxTQUFTLG9DQUFvQyxDQUFDLGtCQUE0QixFQUFFLGFBQTRCO1lBQ3BHLElBQUksYUFBYSxDQUFDLGNBQWMsSUFBSSw2QkFBYyxDQUFDLHNDQUFzQztnQkFDckYsYUFBYSxDQUFDLGNBQWMsSUFBSSw2QkFBYyxDQUFDLGtDQUFrQyxFQUFFLENBQUM7Z0JBQ3BGLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsMkVBQTJFLENBQUMsQ0FBQztnQkFDakcsQ0FBQztnQkFFRCxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBRTFFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0RUFBNEUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDakksQ0FBQztnQkFFRCx5RkFBeUY7Z0JBQ3pGLGFBQWEsQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUM7WUFDbEQsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDOztBQTNMTSwwQkFBTyxHQUFHLENBQUMsaUNBQWlDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtBQUM1RCw4QkFBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUV4RCwyQkFBUSxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQztBQUVsRCx3QkFBSyxHQUFHO0lBQ2xCLFNBQVMsRUFBRSxnQ0FBb0I7SUFDL0IsSUFBSSxFQUFFLFlBQUssQ0FBQyxNQUFNLENBQUM7UUFDZixXQUFXLEVBQUUsaUJBQWlCO1FBQzlCLE9BQU8sRUFBRSxVQUFVO1FBQ25CLFFBQVEsRUFBRSxJQUFJO1FBQ2QsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLENBQUM7S0FDdEcsQ0FBQztJQUNGLGFBQWEsRUFBRSxJQUFBLDhCQUFrQixFQUFDO1FBQzlCLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUNuQixXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxrQ0FBa0MsQ0FBQztLQUN2RSxDQUFDO0lBQ0YsZUFBZSxFQUFFLFlBQUssQ0FBQyxPQUFPLENBQUM7UUFDM0IsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQUM7UUFDbEUsT0FBTyxFQUFFLEVBQUU7S0FDZCxDQUFDO0lBQ0YsU0FBUyxFQUFFLFlBQUssQ0FBQyxPQUFPLENBQUM7UUFDckIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUM7UUFDNUQsT0FBTyxFQUFFLEtBQUs7S0FDakIsQ0FBQztJQUNGLHFCQUFxQixFQUFFLFlBQUssQ0FBQyxPQUFPLENBQUM7UUFDakMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsc0NBQXNDLENBQUM7UUFDeEUsT0FBTyxFQUFFLEtBQUs7S0FDakIsQ0FBQztJQUNGLGVBQWUsRUFBZiwyQkFBZTtJQUNmLEdBQUcsRUFBRSxZQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2QsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ25CLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUN0QixXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQztLQUN6RCxDQUFDO0lBQ0YsT0FBTyxFQUFFLFlBQUssQ0FBQyxNQUFNLENBQUM7UUFDbEIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO1FBQ3ZCLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDO0tBQzdELENBQUM7SUFDRixPQUFPLEVBQUUsWUFBSyxDQUFDLE9BQU8sQ0FBQztRQUNuQixXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQztRQUMxRCxPQUFPLEVBQUUsS0FBSztLQUNqQixDQUFDO0lBQ0YsV0FBVyxFQUFFLFlBQUssQ0FBQyxPQUFPLENBQUM7UUFDdkIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsNEJBQTRCLENBQUM7UUFDOUQsT0FBTyxFQUFFLEtBQUs7S0FDakIsQ0FBQztJQUNGLFdBQVcsRUFBRSxnQ0FBb0I7SUFDakMsd0JBQXdCLEVBQUUsWUFBSyxDQUFDLE9BQU8sQ0FBQztRQUNwQyxXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQztRQUNoRSxTQUFTLEVBQUMsQ0FBQyxhQUFhLENBQUM7S0FDNUIsQ0FBQztJQUNGLHNCQUFzQixFQUFFLFlBQUssQ0FBQyxPQUFPLENBQUM7UUFDbEMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsdUNBQXVDLENBQUM7UUFDekUsT0FBTyxFQUFFLEtBQUs7S0FDakIsQ0FBQztJQUNGLFFBQVEsRUFBUixvQkFBUTtDQUNYLENBQUM7a0JBMURlLGtCQUFrQiJ9