204 lines
31 KiB
JavaScript
204 lines
31 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.ModelBaseImporter = void 0;
|
|
const base_importer_1 = require("./base-importer");
|
|
class ModelBaseImporter extends base_importer_1.BaseAssetImporter {
|
|
async setProperty(assetInfo, path, value) {
|
|
const meta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid);
|
|
if (!meta || !meta.userData) {
|
|
return false;
|
|
}
|
|
const userData = meta.userData;
|
|
let handled = false;
|
|
// Support for nested paths (e.g. meshOptimize.enable)
|
|
if (path.includes('.')) {
|
|
const parts = path.split('.');
|
|
let current = userData;
|
|
for (let i = 0; i < parts.length - 1; i++) {
|
|
// If the path segment doesn't exist, we might need to create it if it's a known object
|
|
// But for now, assume structure exists or fail
|
|
if (!current[parts[i]]) {
|
|
// Try to be smart? No, just fail for now.
|
|
return false;
|
|
}
|
|
current = current[parts[i]];
|
|
}
|
|
if (current) {
|
|
current[parts[parts.length - 1]] = value;
|
|
handled = true;
|
|
}
|
|
}
|
|
else {
|
|
userData[path] = value;
|
|
handled = true;
|
|
}
|
|
if (handled) {
|
|
await Editor.Message.request('asset-db', 'save-asset-meta', assetInfo.uuid, JSON.stringify(meta));
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
async getProperties(assetInfo) {
|
|
const assetMeta = await Editor.Message.request('asset-db', 'query-asset-meta', assetInfo.uuid);
|
|
if (!assetMeta) {
|
|
throw new Error(`Asset meta not found for ${assetInfo.uuid}`);
|
|
}
|
|
const userData = assetMeta.userData;
|
|
if (!userData) {
|
|
throw new Error(`UserData not found for asset ${assetInfo.uuid}`);
|
|
}
|
|
const properties = this.parseUserData(userData);
|
|
console.log('ModelBaseImporter properties:', properties);
|
|
this.addSpecificUserData(userData, properties);
|
|
console.log('ModelBaseImporter properties after specific:', properties);
|
|
return properties;
|
|
}
|
|
parseUserData(userData) {
|
|
const propertyContainer = {};
|
|
// Common Normals/Tangents settings
|
|
const normalOptions = [
|
|
{ name: 'Optional', value: 0 },
|
|
{ name: 'Exclude', value: 1 },
|
|
{ name: 'Require', value: 2 },
|
|
{ name: 'Recalculate', value: 3 }
|
|
];
|
|
propertyContainer.normals = {
|
|
value: userData.normals,
|
|
userData: { enumName: 'cc.ModelDataIncludeMode' },
|
|
type: 'Enum',
|
|
enumList: normalOptions
|
|
};
|
|
propertyContainer.tangents = {
|
|
value: userData.tangents,
|
|
userData: { enumName: 'cc.ModelDataIncludeMode' },
|
|
type: 'Enum',
|
|
enumList: normalOptions
|
|
};
|
|
propertyContainer.morphNormals = {
|
|
value: userData.morphNormals,
|
|
userData: { enumName: 'cc.ModelDataIncludeMode' },
|
|
type: 'Enum',
|
|
enumList: normalOptions,
|
|
tooltip: 'Required if you need to use normal map on morph targets'
|
|
};
|
|
// Booleans
|
|
propertyContainer.skipValidation = { value: !!userData.skipValidation, type: 'Boolean', displayName: 'Skip Validation' };
|
|
propertyContainer.disableMeshSplit = { value: !!userData.disableMeshSplit, type: 'Boolean', displayName: 'Disable Mesh Split' };
|
|
propertyContainer.allowMeshDataAccess = { value: !!userData.allowMeshDataAccess, type: 'Boolean', displayName: 'Allow Data Access' };
|
|
propertyContainer.addVertexColor = { value: !!userData.addVertexColor, type: 'Boolean', displayName: 'Add Vertex Color' };
|
|
propertyContainer.promoteSingleRootNode = { value: !!userData.promoteSingleRootNode, type: 'Boolean', displayName: 'Promote Single Root Node' };
|
|
// Optimization Sections as Objects
|
|
propertyContainer.meshOptimize = this.createMeshOptimizeObject(userData.meshOptimize);
|
|
propertyContainer.meshSimplify = this.createMeshSimplifyObject(userData.meshSimplify);
|
|
propertyContainer.meshCluster = this.createMeshClusterObject(userData.meshCluster);
|
|
propertyContainer.meshCompress = this.createMeshCompressObject(userData.meshCompress);
|
|
propertyContainer.lods = this.createLODsObject(userData.lods);
|
|
return propertyContainer;
|
|
}
|
|
createMeshOptimizeObject(data) {
|
|
const props = {};
|
|
if (!data) {
|
|
data = {
|
|
enable: false,
|
|
vertexCache: false,
|
|
vertexFetch: false,
|
|
overdraw: false
|
|
};
|
|
}
|
|
props.enable = { value: !!data.enable, type: 'Boolean', tooltip: 'It is recommended to enable these options for models with high vertex count.' };
|
|
props.vertexCache = { value: !!data.vertexCache, type: 'Boolean' };
|
|
props.vertexFetch = { value: !!data.vertexFetch, type: 'Boolean' };
|
|
props.overdraw = { value: !!data.overdraw, type: 'Boolean' };
|
|
return {
|
|
value: props,
|
|
type: 'cc.MeshOptimizeOptions',
|
|
displayName: 'Mesh Optimize'
|
|
};
|
|
}
|
|
createMeshSimplifyObject(data) {
|
|
const props = {};
|
|
if (!data) {
|
|
data = {
|
|
enable: false,
|
|
targetRatio: 1,
|
|
autoErrorRate: false,
|
|
errorRate: 1,
|
|
lockBoundary: false
|
|
};
|
|
}
|
|
props.enable = { value: !!data.enable, type: 'Boolean' };
|
|
props.targetRatio = { value: data.targetRatio, type: 'Float', min: 0, max: 1, step: 0.01, tooltip: 'The target ratio of the simplified mesh data. It is recommended to set this value to 0.5.' };
|
|
props.autoErrorRate = { value: !!data.autoErrorRate, type: 'Boolean' };
|
|
props.errorRate = { value: data.errorRate, type: 'Float', min: 0, max: 1, step: 0.01, tooltip: 'The max error rate of the simplified mesh data. This value also alters the result size. It is recommended to tune until you get a good result.', visible: !data.autoErrorRate };
|
|
props.lockBoundary = { value: !!data.lockBoundary, type: 'Boolean' };
|
|
return {
|
|
value: props,
|
|
type: 'cc.MeshSimplifyOptions',
|
|
displayName: 'Mesh Simplify'
|
|
};
|
|
}
|
|
createMeshClusterObject(data) {
|
|
const props = {};
|
|
if (!data) {
|
|
data = {
|
|
enable: false,
|
|
generateBounding: false
|
|
};
|
|
}
|
|
props.enable = { value: !!data.enable, type: 'Boolean' };
|
|
props.generateBounding = { value: !!data.generateBounding, type: 'Boolean', tooltip: 'Whether to generate bounding sphere and normal cone for the clustered mesh data.' };
|
|
return {
|
|
value: props,
|
|
type: 'cc.MeshClusterOptions',
|
|
displayName: 'Mesh Cluster'
|
|
};
|
|
}
|
|
createMeshCompressObject(data) {
|
|
const props = {};
|
|
if (!data) {
|
|
data = {
|
|
enable: false,
|
|
encode: false,
|
|
compress: false,
|
|
quantize: false
|
|
};
|
|
}
|
|
props.enable = { value: !!data.enable, type: 'Boolean' };
|
|
props.encode = { value: !!data.encode, type: 'Boolean' };
|
|
props.compress = { value: !!data.compress, type: 'Boolean' };
|
|
props.quantize = { value: !!data.quantize, type: 'Boolean' };
|
|
return {
|
|
value: props,
|
|
type: 'cc.MeshCompressOptions',
|
|
displayName: 'Mesh Compress'
|
|
};
|
|
}
|
|
createLODsObject(data) {
|
|
const props = {};
|
|
if (!data) {
|
|
data = {
|
|
enable: false,
|
|
options: []
|
|
};
|
|
}
|
|
props.enable = { value: !!data.enable, type: 'Boolean', displayName: 'Enable' };
|
|
if (data.options && Array.isArray(data.options)) {
|
|
data.options.forEach((opt, index) => {
|
|
const lodProps = {};
|
|
lodProps.screenRatio = { value: opt.screenRatio, type: 'Number', displayName: 'Screen Ratio' };
|
|
lodProps.faceCount = { value: opt.faceCount, type: 'Number', displayName: 'Face Count', readonly: true };
|
|
props[`lod${index}`] = {
|
|
value: lodProps,
|
|
type: 'cc.LodOptions',
|
|
};
|
|
});
|
|
}
|
|
return {
|
|
value: props,
|
|
type: 'cc.LodGroups',
|
|
displayName: 'LODs'
|
|
};
|
|
}
|
|
}
|
|
exports.ModelBaseImporter = ModelBaseImporter;
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtYmFzZS1pbXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NvdXJjZS91dGNwL3V0aWxzL2Fzc2V0LWltcG9ydGVycy9tb2RlbC1iYXNlLWltcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFvRDtBQUlwRCxNQUFzQixpQkFBa0IsU0FBUSxpQ0FBaUI7SUFFN0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFxQixFQUFFLElBQVksRUFBRSxLQUFVO1FBQzdELE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVwQixzREFBc0Q7UUFDdEQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUM7WUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3hDLHVGQUF1RjtnQkFDdkYsK0NBQStDO2dCQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3JCLDBDQUEwQztvQkFDMUMsT0FBTyxLQUFLLENBQUM7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QyxXQUFXLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsQ0FBQztnQkFDL0YsUUFBUSxDQUFDLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBRXpHLEtBQUssQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLEdBQUc7b0JBQ25CLEtBQUssRUFBRSxRQUFRO29CQUNmLElBQUksRUFBRSxlQUFlO2lCQUN4QixDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsT0FBTztZQUNILEtBQUssRUFBRSxLQUFLO1lBQ1osSUFBSSxFQUFFLGNBQWM7WUFDcEIsV0FBVyxFQUFFLE1BQU07U0FDdEIsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQXJPRCw4Q0FxT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQXNzZXRJbXBvcnRlciB9IGZyb20gJy4vYmFzZS1pbXBvcnRlcic7XG5pbXBvcnQgeyBJQXNzZXRJbmZvIH0gZnJvbSAnQGNvY29zL2NyZWF0b3ItdHlwZXMvZWRpdG9yL3BhY2thZ2VzL2Fzc2V0LWRiL0B0eXBlcy9wdWJsaWMnO1xuaW1wb3J0IHsgSVByb3BlcnR5LCBJUHJvcGVydHlWYWx1ZVR5cGUgfSBmcm9tICdAY29jb3MvY3JlYXRvci10eXBlcy9lZGl0b3IvcGFja2FnZXMvc2NlbmUvQHR5cGVzL3B1YmxpYyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNb2RlbEJhc2VJbXBvcnRlciBleHRlbmRzIEJhc2VBc3NldEltcG9ydGVyIHtcbiAgICBcbiAgICBhc3luYyBzZXRQcm9wZXJ0eShhc3NldEluZm86IElBc3NldEluZm8sIHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBtZXRhID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAncXVlcnktYXNzZXQtbWV0YScsIGFzc2V0SW5mby51dWlkKTtcbiAgICAgICAgaWYgKCFtZXRhIHx8ICFtZXRhLnVzZXJEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHVzZXJEYXRhID0gbWV0YS51c2VyRGF0YTtcbiAgICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBTdXBwb3J0IGZvciBuZXN0ZWQgcGF0aHMgKGUuZy4gbWVzaE9wdGltaXplLmVuYWJsZSlcbiAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IHVzZXJEYXRhO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGF0aCBzZWdtZW50IGRvZXNuJ3QgZXhpc3QsIHdlIG1pZ2h0IG5lZWQgdG8gY3JlYXRlIGl0IGlmIGl0J3MgYSBrbm93biBvYmplY3RcbiAgICAgICAgICAgICAgICAvLyBCdXQgZm9yIG5vdywgYXNzdW1lIHN0cnVjdHVyZSBleGlzdHMgb3IgZmFpbFxuICAgICAgICAgICAgICAgIGlmICghY3VycmVudFtwYXJ0c1tpXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGJlIHNtYXJ0PyBObywganVzdCBmYWlsIGZvciBub3cuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydHNbaV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50W3BhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgIHVzZXJEYXRhW3BhdGhdID0gdmFsdWU7XG4gICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnYXNzZXQtZGInLCAnc2F2ZS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQsIEpTT04uc3RyaW5naWZ5KG1ldGEpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKGFzc2V0SW5mbzogSUFzc2V0SW5mbyk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfT4ge1xuICAgICAgICBjb25zdCBhc3NldE1ldGEgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1tZXRhJywgYXNzZXRJbmZvLnV1aWQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFhc3NldE1ldGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZXQgbWV0YSBub3QgZm91bmQgZm9yICR7YXNzZXRJbmZvLnV1aWR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1c2VyRGF0YSA9IGFzc2V0TWV0YS51c2VyRGF0YTtcbiAgICAgICAgaWYgKCF1c2VyRGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVc2VyRGF0YSBub3QgZm91bmQgZm9yIGFzc2V0ICR7YXNzZXRJbmZvLnV1aWR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5wYXJzZVVzZXJEYXRhKHVzZXJEYXRhKTtcbiAgICAgICAgY29uc29sZS5sb2coJ01vZGVsQmFzZUltcG9ydGVyIHByb3BlcnRpZXM6JywgcHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuYWRkU3BlY2lmaWNVc2VyRGF0YSh1c2VyRGF0YSwgcHJvcGVydGllcyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEJhc2VJbXBvcnRlciBwcm9wZXJ0aWVzIGFmdGVyIHNwZWNpZmljOicsIHByb3BlcnRpZXMpO1xuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYWRkU3BlY2lmaWNVc2VyRGF0YSh1c2VyRGF0YTogYW55LCBjb250YWluZXI6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0pOiB2b2lkO1xuXG4gICAgcHJvdGVjdGVkIHBhcnNlVXNlckRhdGEodXNlckRhdGE6IGFueSk6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUNvbnRhaW5lcjogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSA9IHt9O1xuXG4gICAgICAgIC8vIENvbW1vbiBOb3JtYWxzL1RhbmdlbnRzIHNldHRpbmdzXG4gICAgICAgIGNvbnN0IG5vcm1hbE9wdGlvbnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICdPcHRpb25hbCcsIHZhbHVlOiAwIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdFeGNsdWRlJywgdmFsdWU6IDEgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ1JlcXVpcmUnLCB2YWx1ZTogMiB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnUmVjYWxjdWxhdGUnLCB2YWx1ZTogMyB9XG4gICAgICAgIF07XG5cbiAgICAgICAgcHJvcGVydHlDb250YWluZXIubm9ybWFscyA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5ub3JtYWxzLFxuICAgICAgICAgICAgdXNlckRhdGE6IHsgZW51bU5hbWU6ICdjYy5Nb2RlbERhdGFJbmNsdWRlTW9kZScgfSxcbiAgICAgICAgICAgIHR5cGU6ICdFbnVtJyxcbiAgICAgICAgICAgIGVudW1MaXN0OiBub3JtYWxPcHRpb25zXG4gICAgICAgIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLnRhbmdlbnRzID0ge1xuICAgICAgICAgICAgdmFsdWU6IHVzZXJEYXRhLnRhbmdlbnRzLFxuICAgICAgICAgICAgdXNlckRhdGE6IHsgZW51bU5hbWU6ICdjYy5Nb2RlbERhdGFJbmNsdWRlTW9kZScgfSxcbiAgICAgICAgICAgIHR5cGU6ICdFbnVtJyxcbiAgICAgICAgICAgIGVudW1MaXN0OiBub3JtYWxPcHRpb25zXG4gICAgICAgIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLm1vcnBoTm9ybWFscyA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB1c2VyRGF0YS5tb3JwaE5vcm1hbHMsXG4gICAgICAgICAgICB1c2VyRGF0YTogeyBlbnVtTmFtZTogJ2NjLk1vZGVsRGF0YUluY2x1ZGVNb2RlJyB9LFxuICAgICAgICAgICAgdHlwZTogJ0VudW0nLFxuICAgICAgICAgICAgZW51bUxpc3Q6IG5vcm1hbE9wdGlvbnMsXG4gICAgICAgICAgICB0b29sdGlwOiAnUmVxdWlyZWQgaWYgeW91IG5lZWQgdG8gdXNlIG5vcm1hbCBtYXAgb24gbW9ycGggdGFyZ2V0cydcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBCb29sZWFuc1xuICAgICAgICBwcm9wZXJ0eUNvbnRhaW5lci5za2lwVmFsaWRhdGlvbiA9IHsgdmFsdWU6ICEhdXNlckRhdGEuc2tpcFZhbGlkYXRpb24sIHR5cGU6ICdCb29sZWFuJywgZGlzcGxheU5hbWU6ICdTa2lwIFZhbGlkYXRpb24nIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmRpc2FibGVNZXNoU3BsaXQgPSB7IHZhbHVlOiAhIXVzZXJEYXRhLmRpc2FibGVNZXNoU3BsaXQsIHR5cGU6ICdCb29sZWFuJywgZGlzcGxheU5hbWU6ICdEaXNhYmxlIE1lc2ggU3BsaXQnIH07XG4gICAgICAgIHByb3BlcnR5Q29udGFpbmVyLmFsbG93TWVzaERhdGFBY2Nlc3MgPSB7IHZhbHVlOiAhIXVzZXJEYXRhLmFsbG93TWVzaERhdGFBY2Nlc3MsIHR5cGU6ICdCb29sZWFuJywgZGlzcGxheU5hbWU6ICdBbGxvdyBEYXRhIEFjY2VzcycgfTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIuYWRkVmVydGV4Q29sb3IgPSB7IHZhbHVlOiAhIXVzZXJEYXRhLmFkZFZlcnRleENvbG9yLCB0eXBlOiAnQm9vbGVhbicsIGRpc3BsYXlOYW1lOiAnQWRkIFZlcnRleCBDb2xvcicgfTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIucHJvbW90ZVNpbmdsZVJvb3ROb2RlID0geyB2YWx1ZTogISF1c2VyRGF0YS5wcm9tb3RlU2luZ2xlUm9vdE5vZGUsIHR5cGU6ICdCb29sZWFuJywgZGlzcGxheU5hbWU6ICdQcm9tb3RlIFNpbmdsZSBSb290IE5vZGUnIH07XG5cbiAgICAgICAgLy8gT3B0aW1pemF0aW9uIFNlY3Rpb25zIGFzIE9iamVjdHNcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIubWVzaE9wdGltaXplID0gdGhpcy5jcmVhdGVNZXNoT3B0aW1pemVPYmplY3QodXNlckRhdGEubWVzaE9wdGltaXplKTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIubWVzaFNpbXBsaWZ5ID0gdGhpcy5jcmVhdGVNZXNoU2ltcGxpZnlPYmplY3QodXNlckRhdGEubWVzaFNpbXBsaWZ5KTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIubWVzaENsdXN0ZXIgPSB0aGlzLmNyZWF0ZU1lc2hDbHVzdGVyT2JqZWN0KHVzZXJEYXRhLm1lc2hDbHVzdGVyKTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIubWVzaENvbXByZXNzID0gdGhpcy5jcmVhdGVNZXNoQ29tcHJlc3NPYmplY3QodXNlckRhdGEubWVzaENvbXByZXNzKTtcbiAgICAgICAgcHJvcGVydHlDb250YWluZXIubG9kcyA9IHRoaXMuY3JlYXRlTE9Ec09iamVjdCh1c2VyRGF0YS5sb2RzKTtcblxuICAgICAgICByZXR1cm4gcHJvcGVydHlDb250YWluZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVNZXNoT3B0aW1pemVPYmplY3QoZGF0YTogYW55KTogSVByb3BlcnR5IHtcbiAgICAgICAgY29uc3QgcHJvcHM6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0gPSB7fTtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgICAgIGVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmVydGV4Q2FjaGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZlcnRleEZldGNoOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBvdmVyZHJhdzogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHByb3BzLmVuYWJsZSA9IHsgdmFsdWU6ICEhZGF0YS5lbmFibGUsIHR5cGU6ICdCb29sZWFuJywgdG9vbHRpcDogJ0l0IGlzIHJlY29tbWVuZGVkIHRvIGVuYWJsZSB0aGVzZSBvcHRpb25zIGZvciBtb2RlbHMgd2l0aCBoaWdoIHZlcnRleCBjb3VudC4nfTtcbiAgICAgICAgcHJvcHMudmVydGV4Q2FjaGUgPSB7IHZhbHVlOiAhIWRhdGEudmVydGV4Q2FjaGUsIHR5cGU6ICdCb29sZWFuJyB9O1xuICAgICAgICBwcm9wcy52ZXJ0ZXhGZXRjaCA9IHsgdmFsdWU6ICEhZGF0YS52ZXJ0ZXhGZXRjaCwgdHlwZTogJ0Jvb2xlYW4nfTtcbiAgICAgICAgcHJvcHMub3ZlcmRyYXcgPSB7IHZhbHVlOiAhIWRhdGEub3ZlcmRyYXcsIHR5cGU6ICdCb29sZWFuJ307XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wcyxcbiAgICAgICAgICAgIHR5cGU6ICdjYy5NZXNoT3B0aW1pemVPcHRpb25zJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTWVzaCBPcHRpbWl6ZSdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU1lc2hTaW1wbGlmeU9iamVjdChkYXRhOiBhbnkpOiBJUHJvcGVydHkge1xuICAgICAgICBjb25zdCBwcm9wczogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSA9IHt9O1xuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0YXJnZXRSYXRpbzogMSxcbiAgICAgICAgICAgICAgICBhdXRvRXJyb3JSYXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJvclJhdGU6IDEsXG4gICAgICAgICAgICAgICAgbG9ja0JvdW5kYXJ5OiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcHJvcHMuZW5hYmxlID0geyB2YWx1ZTogISFkYXRhLmVuYWJsZSwgdHlwZTogJ0Jvb2xlYW4nIH07XG4gICAgICAgIHByb3BzLnRhcmdldFJhdGlvID0geyB2YWx1ZTogZGF0YS50YXJnZXRSYXRpbywgdHlwZTogJ0Zsb2F0JywgbWluOiAwLCBtYXg6IDEsIHN0ZXA6IDAuMDEsIHRvb2x0aXA6ICdUaGUgdGFyZ2V0IHJhdGlvIG9mIHRoZSBzaW1wbGlmaWVkIG1lc2ggZGF0YS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc2V0IHRoaXMgdmFsdWUgdG8gMC41LicgfTtcbiAgICAgICAgcHJvcHMuYXV0b0Vycm9yUmF0ZSA9IHsgdmFsdWU6ICEhZGF0YS5hdXRvRXJyb3JSYXRlLCB0eXBlOiAnQm9vbGVhbicgfTtcbiAgICAgICAgcHJvcHMuZXJyb3JSYXRlID0geyB2YWx1ZTogZGF0YS5lcnJvclJhdGUsIHR5cGU6ICdGbG9hdCcsIG1pbjogMCwgbWF4OiAxLCBzdGVwOiAwLjAxLCB0b29sdGlwOiAnVGhlIG1heCBlcnJvciByYXRlIG9mIHRoZSBzaW1wbGlmaWVkIG1lc2ggZGF0YS4gVGhpcyB2YWx1ZSBhbHNvIGFsdGVycyB0aGUgcmVzdWx0IHNpemUuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHR1bmUgdW50aWwgeW91IGdldCBhIGdvb2QgcmVzdWx0LicsIHZpc2libGU6ICFkYXRhLmF1dG9FcnJvclJhdGUgfTtcbiAgICAgICAgcHJvcHMubG9ja0JvdW5kYXJ5ID0geyB2YWx1ZTogISFkYXRhLmxvY2tCb3VuZGFyeSwgdHlwZTogJ0Jvb2xlYW4nIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wcyxcbiAgICAgICAgICAgIHR5cGU6ICdjYy5NZXNoU2ltcGxpZnlPcHRpb25zJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTWVzaCBTaW1wbGlmeSdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU1lc2hDbHVzdGVyT2JqZWN0KGRhdGE6IGFueSk6IElQcm9wZXJ0eSB7XG4gICAgICAgIGNvbnN0IHByb3BzOiB7IFtrZXk6IHN0cmluZ106IElQcm9wZXJ0eSB9ID0ge307XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICBlbmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQm91bmRpbmc6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBwcm9wcy5lbmFibGUgPSB7IHZhbHVlOiAhIWRhdGEuZW5hYmxlLCB0eXBlOiAnQm9vbGVhbicgfTtcbiAgICAgICAgcHJvcHMuZ2VuZXJhdGVCb3VuZGluZyA9IHsgdmFsdWU6ICEhZGF0YS5nZW5lcmF0ZUJvdW5kaW5nLCB0eXBlOiAnQm9vbGVhbicsIHRvb2x0aXA6ICdXaGV0aGVyIHRvIGdlbmVyYXRlIGJvdW5kaW5nIHNwaGVyZSBhbmQgbm9ybWFsIGNvbmUgZm9yIHRoZSBjbHVzdGVyZWQgbWVzaCBkYXRhLicgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHByb3BzLFxuICAgICAgICAgICAgdHlwZTogJ2NjLk1lc2hDbHVzdGVyT3B0aW9ucycsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ01lc2ggQ2x1c3RlcidcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU1lc2hDb21wcmVzc09iamVjdChkYXRhOiBhbnkpOiBJUHJvcGVydHkge1xuICAgICAgICBjb25zdCBwcm9wczogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHkgfSA9IHt9O1xuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbmNvZGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbXByZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBxdWFudGl6ZTogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHByb3BzLmVuYWJsZSA9IHsgdmFsdWU6ICEhZGF0YS5lbmFibGUsIHR5cGU6ICdCb29sZWFuJyB9O1xuICAgICAgICBwcm9wcy5lbmNvZGUgPSB7IHZhbHVlOiAhIWRhdGEuZW5jb2RlLCB0eXBlOiAnQm9vbGVhbicgfTtcbiAgICAgICAgcHJvcHMuY29tcHJlc3MgPSB7IHZhbHVlOiAhIWRhdGEuY29tcHJlc3MsIHR5cGU6ICdCb29sZWFuJyB9O1xuICAgICAgICBwcm9wcy5xdWFudGl6ZSA9IHsgdmFsdWU6ICEhZGF0YS5xdWFudGl6ZSwgdHlwZTogJ0Jvb2xlYW4nIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wcyxcbiAgICAgICAgICAgIHR5cGU6ICdjYy5NZXNoQ29tcHJlc3NPcHRpb25zJyxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTWVzaCBDb21wcmVzcydcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUxPRHNPYmplY3QoZGF0YTogYW55KTogSVByb3BlcnR5IHtcbiAgICAgICAgY29uc3QgcHJvcHM6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0gPSB7fTtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgICAgIGVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHByb3BzLmVuYWJsZSA9IHsgdmFsdWU6ICEhZGF0YS5lbmFibGUsIHR5cGU6ICdCb29sZWFuJywgZGlzcGxheU5hbWU6ICdFbmFibGUnIH07XG4gICAgICAgIFxuICAgICAgICBpZiAoZGF0YS5vcHRpb25zICYmIEFycmF5LmlzQXJyYXkoZGF0YS5vcHRpb25zKSkge1xuICAgICAgICAgICAgZGF0YS5vcHRpb25zLmZvckVhY2goKG9wdDogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9kUHJvcHM6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5IH0gPSB7fTtcbiAgICAgICAgICAgICAgICBsb2RQcm9wcy5zY3JlZW5SYXRpbyA9IHsgdmFsdWU6IG9wdC5zY3JlZW5SYXRpbywgdHlwZTogJ051bWJlcicsIGRpc3BsYXlOYW1lOiAnU2NyZWVuIFJhdGlvJyB9O1xuICAgICAgICAgICAgICAgIGxvZFByb3BzLmZhY2VDb3VudCA9IHsgdmFsdWU6IG9wdC5mYWNlQ291bnQsIHR5cGU6ICdOdW1iZXInLCBkaXNwbGF5TmFtZTogJ0ZhY2UgQ291bnQnLCByZWFkb25seTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHByb3BzW2Bsb2Qke2luZGV4fWBdID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbG9kUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjYy5Mb2RPcHRpb25zJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHByb3BzLFxuICAgICAgICAgICAgdHlwZTogJ2NjLkxvZEdyb3VwcycsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0xPRHMnXG4gICAgICAgIH07XG4gICAgfVxufVxuIl19
|