UNPKG

@grnsft/if

Version:

Impact Framework

108 lines 17.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MockObservations = void 0; const luxon_1 = require("luxon"); const zod_1 = require("zod"); const interfaces_1 = require("@grnsft/if-core/interfaces"); const utils_1 = require("@grnsft/if-core/utils"); const validations_1 = require("../../../common/util/validations"); const config_1 = require("../../config"); const common_generator_1 = require("./helpers/common-generator"); const rand_int_generator_1 = require("./helpers/rand-int-generator"); const { ConfigError } = utils_1.ERRORS; const { MISSING_CONFIG } = config_1.STRINGS; exports.MockObservations = (0, interfaces_1.PluginFactory)({ configValidation: (config) => { if (!config || !Object.keys(config)?.length) { throw new ConfigError(MISSING_CONFIG); } const schema = zod_1.z.object({ 'timestamp-from': zod_1.z.string(), 'timestamp-to': zod_1.z.string(), duration: zod_1.z.number().gt(0), components: zod_1.z.array(zod_1.z.record(zod_1.z.string())), generators: zod_1.z.object({ common: zod_1.z.record(zod_1.z.string().or(zod_1.z.number())), randint: zod_1.z.record(zod_1.z.object({ min: zod_1.z.number(), max: zod_1.z.number() })), }), }); return (0, validations_1.validate)(schema, config); }, implementation: async (inputs, config) => { const { duration, timeBuckets, components, generators } = generateParamsFromConfig(config); const generatorToHistory = new Map(); generators.forEach(generator => { generatorToHistory.set(generator, []); }); const defaults = inputs && inputs[0]; return Object.entries(components).reduce((acc, item) => { const component = item[1]; timeBuckets.forEach(timeBucket => { const observation = createObservation({ duration, component, timeBucket, generators }, generatorToHistory); acc.push(Object.assign({}, defaults, observation)); }); return acc; }, []); }, }); /** * Configures the MockObservations Plugin for IF */ const generateParamsFromConfig = (config) => { const { 'timestamp-from': timestampFrom, 'timestamp-to': timestampTo, duration, generators, components, } = config; const convertedTimestampFrom = luxon_1.DateTime.fromISO(timestampFrom, { zone: 'UTC', }); const convertedTimestampTo = luxon_1.DateTime.fromISO(timestampTo, { zone: 'UTC' }); return { duration, timeBuckets: createTimeBuckets(convertedTimestampFrom, convertedTimestampTo, duration), generators: createGenerators(generators), components, }; }; /* * Creates time buckets based on start time, end time and duration of each bucket. */ const createTimeBuckets = (timestampFrom, timestampTo, duration, timeBuckets = []) => { if (timestampFrom < timestampTo || timestampFrom.plus(luxon_1.Duration.fromObject({ seconds: duration })) < timestampTo) { return createTimeBuckets(timestampFrom.plus(luxon_1.Duration.fromObject({ seconds: duration })), timestampTo, duration, [...timeBuckets, timestampFrom]); } return timeBuckets; }; /* * Creates generators based on a given config */ const createGenerators = (generatorsConfig) => { const createCommonGenerator = (config) => [ (0, common_generator_1.CommonGenerator)(config), ]; const createRandIntGenerators = (config) => Object.entries(config).map(([fieldToPopulate, value]) => (0, rand_int_generator_1.RandIntGenerator)(fieldToPopulate, value)); return Object.entries(generatorsConfig).flatMap(([key, value]) => key === 'randint' ? createRandIntGenerators(value).flat() : createCommonGenerator(value)); }; /* * Creates time buckets based on start time, end time and duration of each bucket. */ const createObservation = (observationParams, generatorToHistory) => { const { duration, component, timeBucket, generators } = observationParams; const timestamp = timeBucket.toISO(); const generateObservation = (generator) => { const history = generatorToHistory.get(generator) || []; const generated = generator.next(history); generatorToHistory.set(generator, [...history, generated.value]); return generated; }; const generateObservations = (gen) => generateObservation(gen); const generatedValues = generators.map(generateObservations); const initialObservation = { timestamp, duration, ...component, }; const generatedObservation = generatedValues.reduce((observation, generated) => Object.assign(observation, generated), initialObservation); return generatedObservation; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaWYtcnVuL2J1aWx0aW5zL21vY2stb2JzZXJ2YXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUF5QztBQUN6Qyw2QkFBc0I7QUFFdEIsMkRBQXlEO0FBTXpELGlEQUE2QztBQUU3QyxrRUFBMEQ7QUFFMUQseUNBQXFDO0FBRXJDLGlFQUEyRDtBQUMzRCxxRUFBOEQ7QUFJOUQsTUFBTSxFQUFDLFdBQVcsRUFBQyxHQUFHLGNBQU0sQ0FBQztBQUM3QixNQUFNLEVBQUMsY0FBYyxFQUFDLEdBQUcsZ0JBQU8sQ0FBQztBQUVwQixRQUFBLGdCQUFnQixHQUFHLElBQUEsMEJBQWEsRUFBQztJQUM1QyxnQkFBZ0IsRUFBRSxDQUFDLE1BQW9CLEVBQUUsRUFBRTtRQUN6QyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUU7WUFDM0MsTUFBTSxJQUFJLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN2QztRQUVELE1BQU0sTUFBTSxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7WUFDdEIsZ0JBQWdCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtZQUM1QixjQUFjLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtZQUMxQixRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUIsVUFBVSxFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQUMsT0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUN6QyxVQUFVLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDbkIsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FB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QUFpQixDQUFDO0lBQ3hFLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUVyQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsU0FBb0IsRUFBRSxFQUFFO1FBQ25ELE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEQsTUFBTSxTQUFTLEdBQXdCLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFL0Qsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWpFLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUVGLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFjLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM3RCxNQUFNLGtCQUFrQixHQUFpQjtRQUN2QyxTQUFTO1FBQ1QsUUFBUTtRQUNSLEdBQUcsU0FBUztLQUNiLENBQUM7SUFDRixNQUFNLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQ2pELENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQ2pFLGtCQUFrQixDQUNuQixDQUFDO0lBRUYsT0FBTyxvQkFBb0MsQ0FBQztBQUM5QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RhdGVUaW1lLCBEdXJhdGlvbn0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuXG5pbXBvcnQge1BsdWdpbkZhY3Rvcnl9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIFBsdWdpblBhcmFtcyxcbiAgQ29uZmlnUGFyYW1zLFxuICBPYnNlcnZhdGlvblBhcmFtcyxcbn0gZnJvbSAnQGdybnNmdC9pZi1jb3JlL3R5cGVzJztcbmltcG9ydCB7RVJST1JTfSBmcm9tICdAZ3Juc2Z0L2lmLWNvcmUvdXRpbHMnO1xuXG5pbXBvcnQge3ZhbGlkYXRlfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdXRpbC92YWxpZGF0aW9ucyc7XG5cbmltcG9ydCB7U1RSSU5HU30gZnJvbSAnLi4vLi4vY29uZmlnJztcblxuaW1wb3J0IHtDb21tb25HZW5lcmF0b3J9IGZyb20gJy4vaGVscGVycy9jb21tb24tZ2VuZXJhdG9yJztcbmltcG9ydCB7UmFuZEludEdlbmVyYXRvcn0gZnJvbSAnLi9oZWxwZXJzL3JhbmQtaW50LWdlbmVyYXRvcic7XG5cbmltcG9ydCB7R2VuZXJhdG9yfSBmcm9tICcuL2ludGVyZmFjZXMvaW5kZXgnO1xuXG5jb25zdCB7Q29uZmlnRXJyb3J9ID0gRVJST1JTO1xuY29uc3Qge01JU1NJTkdfQ09ORklHfSA9IFNUUklOR1M7XG5cbmV4cG9ydCBjb25zdCBNb2NrT2JzZXJ2YXRpb25zID0gUGx1Z2luRmFjdG9yeSh7XG4gIGNvbmZpZ1ZhbGlkYXRpb246IChjb25maWc6IENvbmZpZ1BhcmFtcykgPT4ge1xuICAgIGlmICghY29uZmlnIHx8ICFPYmplY3Qua2V5cyhjb25maWcpPy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBDb25maWdFcnJvcihNSVNTSU5HX0NPTkZJRyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hID0gei5vYmplY3Qoe1xuICAgICAgJ3RpbWVzdGFtcC1mcm9tJzogei5zdHJpbmcoKSxcbiAgICAgICd0aW1lc3RhbXAtdG8nOiB6LnN0cmluZygpLFxuICAgICAgZHVyYXRpb246IHoubnVtYmVyKCkuZ3QoMCksXG4gICAgICBjb21wb25lbnRzOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCkpKSxcbiAgICAgIGdlbmVyYXRvcnM6IHoub2JqZWN0KHtcbiAgICAgICAgY29tbW9uOiB6LnJlY29yZCh6LnN0cmluZygpLm9yKHoubnVtYmVyKCkpKSxcbiAgICAgICAgcmFuZGludDogei5yZWNvcmQoei5vYmplY3Qoe21pbjogei5udW1iZXIoKSwgbWF4OiB6Lm51bWJlcigpfSkpLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmFsaWRhdGU8ei5pbmZlcjx0eXBlb2Ygc2NoZW1hPj4oc2NoZW1hLCBjb25maWcpO1xuICB9LFxuICBpbXBsZW1lbnRhdGlvbjogYXN5bmMgKGlucHV0czogUGx1Z2luUGFyYW1zW10sIGNvbmZpZzogQ29uZmlnUGFyYW1zKSA9PiB7XG4gICAgY29uc3Qge2R1cmF0aW9uLCB0aW1lQnVja2V0cywgY29tcG9uZW50cywgZ2VuZXJhdG9yc30gPVxuICAgICAgZ2VuZXJhdGVQYXJhbXNGcm9tQ29uZmlnKGNvbmZpZyk7XG4gICAgY29uc3QgZ2VuZXJhdG9yVG9IaXN0b3J5ID0gbmV3IE1hcDxHZW5lcmF0b3IsIG51bWJlcltdPigpO1xuXG4gICAgZ2VuZXJhdG9ycy5mb3JFYWNoKGdlbmVyYXRvciA9PiB7XG4gICAgICBnZW5lcmF0b3JUb0hpc3Rvcnkuc2V0KGdlbmVyYXRvciwgW10pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZGVmYXVsdHMgPSBpbnB1dHMgJiYgaW5wdXRzWzBdO1xuXG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGNvbXBvbmVudHMpLnJlZHVjZSgoYWNjOiBQbHVnaW5QYXJhbXNbXSwgaXRlbSkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50OiBhbnkgPSBpdGVtWzFdO1xuICAgICAgdGltZUJ1Y2tldHMuZm9yRWFjaCh0aW1lQnVja2V0ID0+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2YXRpb24gPSBjcmVhdGVPYnNlcnZhdGlvbihcbiAgICAgICAgICB7ZHVyYXRpb24sIGNvbXBvbmVudCwgdGltZUJ1Y2tldCwgZ2VuZXJhdG9yc30sXG4gICAgICAgICAgZ2VuZXJhdG9yVG9IaXN0b3J5XG4gICAgICAgICk7XG5cbiAgICAgICAgYWNjLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIG9ic2VydmF0aW9uKSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG4gIH0sXG59KTtcblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBNb2NrT2JzZXJ2YXRpb25zIFBsdWdpbiBmb3IgSUZcbiAqL1xuY29uc3QgZ2VuZXJhdGVQYXJhbXNGcm9tQ29uZmlnID0gKGNvbmZpZzogQ29uZmlnUGFyYW1zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICAndGltZXN0YW1wLWZyb20nOiB0aW1lc3RhbXBGcm9tLFxuICAgICd0aW1lc3RhbXAtdG8nOiB0aW1lc3RhbXBUbyxcbiAgICBkdXJhdGlvbixcbiAgICBnZW5lcmF0b3JzLFxuICAgIGNvbXBvbmVudHMsXG4gIH0gPSBjb25maWc7XG5cbiAgY29uc3QgY29udmVydGVkVGltZXN0YW1wRnJvbSA9IERhdGVUaW1lLmZyb21JU08odGltZXN0YW1wRnJvbSwge1xuICAgIHpvbmU6ICdVVEMnLFxuICB9KTtcbiAgY29uc3QgY29udmVydGVkVGltZXN0YW1wVG8gPSBEYXRlVGltZS5mcm9tSVNPKHRpbWVzdGFtcFRvLCB7em9uZTogJ1VUQyd9KTtcblxuICByZXR1cm4ge1xuICAgIGR1cmF0aW9uLFxuICAgIHRpbWVCdWNrZXRzOiBjcmVhdGVUaW1lQnVja2V0cyhcbiAgICAgIGNvbnZlcnRlZFRpbWVzdGFtcEZyb20sXG4gICAgICBjb252ZXJ0ZWRUaW1lc3RhbXBUbyxcbiAgICAgIGR1cmF0aW9uXG4gICAgKSxcbiAgICBnZW5lcmF0b3JzOiBjcmVhdGVHZW5lcmF0b3JzKGdlbmVyYXRvcnMpLFxuICAgIGNvbXBvbmVudHMsXG4gIH07XG59O1xuXG4vKlxuICogQ3JlYXRlcyB0aW1lIGJ1Y2tldHMgYmFzZWQgb24gc3RhcnQgdGltZSwgZW5kIHRpbWUgYW5kIGR1cmF0aW9uIG9mIGVhY2ggYnVja2V0LlxuICovXG5jb25zdCBjcmVhdGVUaW1lQnVja2V0cyA9IChcbiAgdGltZXN0YW1wRnJvbTogRGF0ZVRpbWUsXG4gIHRpbWVzdGFtcFRvOiBEYXRlVGltZSxcbiAgZHVyYXRpb246IG51bWJlcixcbiAgdGltZUJ1Y2tldHM6IERhdGVUaW1lW10gPSBbXVxuKTogRGF0ZVRpbWVbXSA9PiB7XG4gIGlmIChcbiAgICB0aW1lc3RhbXBGcm9tIDwgdGltZXN0YW1wVG8gfHxcbiAgICB0aW1lc3RhbXBGcm9tLnBsdXMoRHVyYXRpb24uZnJvbU9iamVjdCh7c2Vjb25kczogZHVyYXRpb259KSkgPCB0aW1lc3RhbXBUb1xuICApIHtcbiAgICByZXR1cm4gY3JlYXRlVGltZUJ1Y2tldHMoXG4gICAgICB0aW1lc3RhbXBGcm9tLnBsdXMoRHVyYXRpb24uZnJvbU9iamVjdCh7c2Vjb25kczogZHVyYXRpb259KSksXG4gICAgICB0aW1lc3RhbXBUbyxcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgWy4uLnRpbWVCdWNrZXRzLCB0aW1lc3RhbXBGcm9tXVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHRpbWVCdWNrZXRzO1xufTtcblxuLypcbiAqIENyZWF0ZXMgZ2VuZXJhdG9ycyBiYXNlZCBvbiBhIGdpdmVuIGNvbmZpZ1xuICovXG5jb25zdCBjcmVhdGVHZW5lcmF0b3JzID0gKGdlbmVyYXRvcnNDb25maWc6IG9iamVjdCk6IEdlbmVyYXRvcltdID0+IHtcbiAgY29uc3QgY3JlYXRlQ29tbW9uR2VuZXJhdG9yID0gKGNvbmZpZzogYW55KTogR2VuZXJhdG9yW10gPT4gW1xuICAgIENvbW1vbkdlbmVyYXRvcihjb25maWcpLFxuICBdO1xuXG4gIGNvbnN0IGNyZWF0ZVJhbmRJbnRHZW5lcmF0b3JzID0gKGNvbmZpZzogYW55KTogR2VuZXJhdG9yW10gPT5cbiAgICBPYmplY3QuZW50cmllcyhjb25maWcpLm1hcCgoW2ZpZWxkVG9Qb3B1bGF0ZSwgdmFsdWVdKSA9PlxuICAgICAgUmFuZEludEdlbmVyYXRvcihmaWVsZFRvUG9wdWxhdGUsIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgKTtcblxuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZ2VuZXJhdG9yc0NvbmZpZykuZmxhdE1hcCgoW2tleSwgdmFsdWVdKSA9PlxuICAgIGtleSA9PT0gJ3JhbmRpbnQnXG4gICAgICA/IGNyZWF0ZVJhbmRJbnRHZW5lcmF0b3JzKHZhbHVlKS5mbGF0KClcbiAgICAgIDogY3JlYXRlQ29tbW9uR2VuZXJhdG9yKHZhbHVlKVxuICApO1xufTtcblxuLypcbiAqIENyZWF0ZXMgdGltZSBidWNrZXRzIGJhc2VkIG9uIHN0YXJ0IHRpbWUsIGVuZCB0aW1lIGFuZCBkdXJhdGlvbiBvZiBlYWNoIGJ1Y2tldC5cbiAqL1xuY29uc3QgY3JlYXRlT2JzZXJ2YXRpb24gPSAoXG4gIG9ic2VydmF0aW9uUGFyYW1zOiBPYnNlcnZhdGlvblBhcmFtcyxcbiAgZ2VuZXJhdG9yVG9IaXN0b3J5OiBNYXA8R2VuZXJhdG9yLCBudW1iZXJbXT5cbik6IFBsdWdpblBhcmFtcyA9PiB7XG4gIGNvbnN0IHtkdXJhdGlvbiwgY29tcG9uZW50LCB0aW1lQnVja2V0LCBnZW5lcmF0b3JzfSA9IG9ic2VydmF0aW9uUGFyYW1zO1xuICBjb25zdCB0aW1lc3RhbXAgPSB0aW1lQnVja2V0LnRvSVNPKCk7XG5cbiAgY29uc3QgZ2VuZXJhdGVPYnNlcnZhdGlvbiA9IChnZW5lcmF0b3I6IEdlbmVyYXRvcikgPT4ge1xuICAgIGNvbnN0IGhpc3RvcnkgPSBnZW5lcmF0b3JUb0hpc3RvcnkuZ2V0KGdlbmVyYXRvcikgfHwgW107XG4gICAgY29uc3QgZ2VuZXJhdGVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2VuZXJhdG9yLm5leHQoaGlzdG9yeSk7XG5cbiAgICBnZW5lcmF0b3JUb0hpc3Rvcnkuc2V0KGdlbmVyYXRvciwgWy4uLmhpc3RvcnksIGdlbmVyYXRlZC52YWx1ZV0pO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRlZDtcbiAgfTtcblxuICBjb25zdCBnZW5lcmF0ZU9ic2VydmF0aW9ucyA9IChnZW46IEdlbmVyYXRvcikgPT4gZ2VuZXJhdGVPYnNlcnZhdGlvbihnZW4pO1xuICBjb25zdCBnZW5lcmF0ZWRWYWx1ZXMgPSBnZW5lcmF0b3JzLm1hcChnZW5lcmF0ZU9ic2VydmF0aW9ucyk7XG4gIGNvbnN0IGluaXRpYWxPYnNlcnZhdGlvbjogUGx1Z2luUGFyYW1zID0ge1xuICAgIHRpbWVzdGFtcCxcbiAgICBkdXJhdGlvbixcbiAgICAuLi5jb21wb25lbnQsXG4gIH07XG4gIGNvbnN0IGdlbmVyYXRlZE9ic2VydmF0aW9uID0gZ2VuZXJhdGVkVmFsdWVzLnJlZHVjZShcbiAgICAob2JzZXJ2YXRpb24sIGdlbmVyYXRlZCkgPT4gT2JqZWN0LmFzc2lnbihvYnNlcnZhdGlvbiwgZ2VuZXJhdGVkKSxcbiAgICBpbml0aWFsT2JzZXJ2YXRpb25cbiAgKTtcblxuICByZXR1cm4gZ2VuZXJhdGVkT2JzZXJ2YXRpb24gYXMgUGx1Z2luUGFyYW1zO1xufTtcbiJdfQ==