UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

98 lines 14.2 kB
import { Inject, Injectable } from '@angular/core'; import { get, sortBy } from 'lodash-es'; import { ANNOTATIONS, LABELS, METADATA, TOKEN_BASE_DOMAIN, } from '../public-api'; import { emptyObjectRemoveRuleFactory, prefixFilterRuleFactory, stringify, yamlFilterField, } from '../utils/public-api'; import * as i0 from "@angular/core"; export class YamlUtilService { constructor(baseDomain) { this.baseDomain = baseDomain; } // https://confluence.alauda.cn/pages/viewpage.action?pageId=112060211 // 所有资源规则全平台通用 getConciseResource(r) { const commonFilters = [ 'metadata.namespace', 'metadata.managedFields', 'metadata.creationTimestamp', 'metadata.generation', 'metadata.resourceVersion', 'metadata.uid', 'metadata.ownerReferences', 'metadata.finalizers', 'metadata.selfLink', `metadata.labels.['app.${this.baseDomain}/uuid']`, prefixFilterRuleFactory(this.baseDomain, [METADATA, ANNOTATIONS]), prefixFilterRuleFactory('kubernetes.io', [METADATA, ANNOTATIONS], 'includes'), 'status', ]; const specificFilters = []; switch (r.kind) { case 'Application': { specificFilters.push('metadata.labels.sync-from-helmrequest'); break; } case 'Deployment': case 'StatefulSet': case 'DaemonSet': { specificFilters.push('spec.template.annotations.updateTimestamp'); break; } case 'Job': { specificFilters.push('spec.selector.matchLabels', 'spec.template.metadata.labels.controller-uid', `${METADATA}.${LABELS}.controller-uid`, prefixFilterRuleFactory('batch.kubernetes.io/controller-uid', ['spec', 'template', METADATA, LABELS], 'includes')); break; } case 'PersistentVolumeClaim': { specificFilters.push(prefixFilterRuleFactory('pv.kubernetes.io', [METADATA, ANNOTATIONS], 'startsWith'), prefixFilterRuleFactory('volume.beta.kubernetes.io', [METADATA, ANNOTATIONS], 'startsWith'), 'spec.volumeName'); break; } case 'Service': { specificFilters.push(resource => { // ExternalName 类型的 Service 没有 ports const ports = get(resource, ['spec', 'ports']) ?? []; return ports.map((_, i) => ['spec', 'ports', `[${i}]`, 'nodePort'].join('.')); }, 'spec.clusterIPs', 'spec.clusterIP', 'spec.ipFamilies', 'spec.ipFamilyPolicy'); break; } default: { break; } } specificFilters.push(emptyObjectRemoveRuleFactory([METADATA, ANNOTATIONS]), emptyObjectRemoveRuleFactory([METADATA, LABELS])); return yamlFilterField(r, [...commonFilters, ...specificFilters]); } /** * * * @template T * @param {T} resource * @param {boolean} [concise=false] 精简 Yaml * @param {boolean} [reduce=false] 隐藏 managedFields * @returns * @memberof YamlUtilService */ generateFilteredYamlResource(resource, concise = false, reduce = false) { return sortBy(Array.isArray(resource) ? resource : [resource], 'kind') .map((resource) => concise ? this.getConciseResource(resource) : reduce ? yamlFilterField(resource, ['metadata.managedFields']) : resource) .map(res => stringify(res, { strict: false, sortMapEntries: true, })) .join('\n---\r\n\n'); } static { this.ɵfac = function YamlUtilService_Factory(t) { return new (t || YamlUtilService)(i0.ɵɵinject(TOKEN_BASE_DOMAIN)); }; } static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: YamlUtilService, factory: YamlUtilService.ɵfac, providedIn: 'root' }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(YamlUtilService, [{ type: Injectable, args: [{ providedIn: 'root', }] }], () => [{ type: undefined, decorators: [{ type: Inject, args: [TOKEN_BASE_DOMAIN] }] }], null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWFtbC11dGlsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY29yZS9zZXJ2aWNlcy95YW1sLXV0aWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV4QyxPQUFPLEVBQ0wsV0FBVyxFQUdYLE1BQU0sRUFDTixRQUFRLEVBRVIsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxlQUFlLEdBRWhCLE1BQU0scUJBQXFCLENBQUM7O0FBSzdCLE1BQU0sT0FBTyxlQUFlO0lBQzFCLFlBQXdELFVBQWtCO1FBQWxCLGVBQVUsR0FBVixVQUFVLENBQVE7SUFBRyxDQUFDO0lBRTlFLHNFQUFzRTtJQUN0RSxjQUFjO0lBQ2Qsa0JBQWtCLENBQUMsQ0FBcUI7UUFDdEMsTUFBTSxhQUFhLEdBQXFCO1lBQ3RDLG9CQUFvQjtZQUNwQix3QkFBd0I7WUFDeEIsNEJBQTRCO1lBQzVCLHFCQUFxQjtZQUNyQiwwQkFBMEI7WUFDMUIsY0FBYztZQUNkLDBCQUEwQjtZQUMxQixxQkFBcUI7WUFDckIsbUJBQW1CO1lBQ25CLHlCQUF5QixJQUFJLENBQUMsVUFBVSxTQUFTO1lBQ2pELHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDakUsdUJBQXVCLENBQ3JCLGVBQWUsRUFDZixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFDdkIsVUFBVSxDQUNYO1lBQ0QsUUFBUTtTQUNULENBQUM7UUFDRixNQUFNLGVBQWUsR0FBcUIsRUFBRSxDQUFDO1FBQzdDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixlQUFlLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7Z0JBQzlELE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxZQUFZLENBQUM7WUFDbEIsS0FBSyxhQUFhLENBQUM7WUFDbkIsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixlQUFlLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7Z0JBQ2xFLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNYLGVBQWUsQ0FBQyxJQUFJLENBQ2xCLDJCQUEyQixFQUMzQiw4Q0FBOEMsRUFDOUMsR0FBRyxRQUFRLElBQUksTUFBTSxpQkFBaUIsRUFDdEMsdUJBQXVCLENBQ3JCLG9DQUFvQyxFQUNwQyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUN0QyxVQUFVLENBQ1gsQ0FDRixDQUFDO2dCQUNGLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLGVBQWUsQ0FBQyxJQUFJLENBQ2xCLHVCQUF1QixDQUNyQixrQkFBa0IsRUFDbEIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEVBQ3ZCLFlBQVksQ0FDYixFQUNELHVCQUF1QixDQUNyQiwyQkFBMkIsRUFDM0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEVBQ3ZCLFlBQVksQ0FDYixFQUNELGlCQUFpQixDQUNsQixDQUFDO2dCQUNGLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNmLGVBQWUsQ0FBQyxJQUFJLENBQ2xCLFFBQVEsQ0FBQyxFQUFFO29CQUNULG9DQUFvQztvQkFDcEMsTUFBTSxLQUFLLEdBQ1IsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBbUIsSUFBSSxFQUFFLENBQUM7b0JBQzVELE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUN4QixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ2xELENBQUM7Z0JBQ0osQ0FBQyxFQUNELGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLHFCQUFxQixDQUN0QixDQUFDO2dCQUNGLE1BQU07WUFDUixDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDUixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFDRCxlQUFlLENBQUMsSUFBSSxDQUNsQiw0QkFBNEIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUNyRCw0QkFBNEIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUNqRCxDQUFDO1FBQ0YsT0FBTyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCw0QkFBNEIsQ0FDMUIsUUFBc0IsRUFDdEIsT0FBTyxHQUFHLEtBQUssRUFDZixNQUFNLEdBQUcsS0FBSztRQUVkLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUM7YUFDbkUsR0FBRyxDQUFDLENBQUMsUUFBVyxFQUFFLEVBQUUsQ0FDbkIsT0FBTztZQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDO1lBQ25DLENBQUMsQ0FBQyxNQUFNO2dCQUNSLENBQUMsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztnQkFDdkQsQ0FBQyxDQUFDLFFBQVEsQ0FDYjthQUNBLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUNULFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDYixNQUFNLEVBQUUsS0FBSztZQUNiLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUMsQ0FDSDthQUNBLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN6QixDQUFDO2dGQTVIVSxlQUFlLGNBQ04saUJBQWlCO3VFQUQxQixlQUFlLFdBQWYsZUFBZSxtQkFGZCxNQUFNOztpRkFFUCxlQUFlO2NBSDNCLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7c0JBRWMsTUFBTTt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldCwgc29ydEJ5IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHtcbiAgQU5OT1RBVElPTlMsXG4gIEFycmF5YWJsZSxcbiAgS3ViZXJuZXRlc1Jlc291cmNlLFxuICBMQUJFTFMsXG4gIE1FVEFEQVRBLFxuICBTZXJ2aWNlUG9ydCxcbiAgVE9LRU5fQkFTRV9ET01BSU4sXG59IGZyb20gJy4uL3B1YmxpYy1hcGknO1xuaW1wb3J0IHtcbiAgZW1wdHlPYmplY3RSZW1vdmVSdWxlRmFjdG9yeSxcbiAgcHJlZml4RmlsdGVyUnVsZUZhY3RvcnksXG4gIHN0cmluZ2lmeSxcbiAgeWFtbEZpbHRlckZpZWxkLFxuICBZYW1sRmlsdGVySXRlbSxcbn0gZnJvbSAnLi4vdXRpbHMvcHVibGljLWFwaSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBZYW1sVXRpbFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KFRPS0VOX0JBU0VfRE9NQUlOKSBwcml2YXRlIHJlYWRvbmx5IGJhc2VEb21haW46IHN0cmluZykge31cblxuICAvLyBodHRwczovL2NvbmZsdWVuY2UuYWxhdWRhLmNuL3BhZ2VzL3ZpZXdwYWdlLmFjdGlvbj9wYWdlSWQ9MTEyMDYwMjExXG4gIC8vIOaJgOaciei1hOa6kOinhOWImeWFqOW5s+WPsOmAmueUqFxuICBnZXRDb25jaXNlUmVzb3VyY2UocjogS3ViZXJuZXRlc1Jlc291cmNlKSB7XG4gICAgY29uc3QgY29tbW9uRmlsdGVyczogWWFtbEZpbHRlckl0ZW1bXSA9IFtcbiAgICAgICdtZXRhZGF0YS5uYW1lc3BhY2UnLFxuICAgICAgJ21ldGFkYXRhLm1hbmFnZWRGaWVsZHMnLFxuICAgICAgJ21ldGFkYXRhLmNyZWF0aW9uVGltZXN0YW1wJyxcbiAgICAgICdtZXRhZGF0YS5nZW5lcmF0aW9uJyxcbiAgICAgICdtZXRhZGF0YS5yZXNvdXJjZVZlcnNpb24nLFxuICAgICAgJ21ldGFkYXRhLnVpZCcsXG4gICAgICAnbWV0YWRhdGEub3duZXJSZWZlcmVuY2VzJyxcbiAgICAgICdtZXRhZGF0YS5maW5hbGl6ZXJzJyxcbiAgICAgICdtZXRhZGF0YS5zZWxmTGluaycsXG4gICAgICBgbWV0YWRhdGEubGFiZWxzLlsnYXBwLiR7dGhpcy5iYXNlRG9tYWlufS91dWlkJ11gLFxuICAgICAgcHJlZml4RmlsdGVyUnVsZUZhY3RvcnkodGhpcy5iYXNlRG9tYWluLCBbTUVUQURBVEEsIEFOTk9UQVRJT05TXSksXG4gICAgICBwcmVmaXhGaWx0ZXJSdWxlRmFjdG9yeShcbiAgICAgICAgJ2t1YmVybmV0ZXMuaW8nLFxuICAgICAgICBbTUVUQURBVEEsIEFOTk9UQVRJT05TXSxcbiAgICAgICAgJ2luY2x1ZGVzJyxcbiAgICAgICksXG4gICAgICAnc3RhdHVzJyxcbiAgICBdO1xuICAgIGNvbnN0IHNwZWNpZmljRmlsdGVyczogWWFtbEZpbHRlckl0ZW1bXSA9IFtdO1xuICAgIHN3aXRjaCAoci5raW5kKSB7XG4gICAgICBjYXNlICdBcHBsaWNhdGlvbic6IHtcbiAgICAgICAgc3BlY2lmaWNGaWx0ZXJzLnB1c2goJ21ldGFkYXRhLmxhYmVscy5zeW5jLWZyb20taGVsbXJlcXVlc3QnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdEZXBsb3ltZW50JzpcbiAgICAgIGNhc2UgJ1N0YXRlZnVsU2V0JzpcbiAgICAgIGNhc2UgJ0RhZW1vblNldCc6IHtcbiAgICAgICAgc3BlY2lmaWNGaWx0ZXJzLnB1c2goJ3NwZWMudGVtcGxhdGUuYW5ub3RhdGlvbnMudXBkYXRlVGltZXN0YW1wJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnSm9iJzoge1xuICAgICAgICBzcGVjaWZpY0ZpbHRlcnMucHVzaChcbiAgICAgICAgICAnc3BlYy5zZWxlY3Rvci5tYXRjaExhYmVscycsXG4gICAgICAgICAgJ3NwZWMudGVtcGxhdGUubWV0YWRhdGEubGFiZWxzLmNvbnRyb2xsZXItdWlkJyxcbiAgICAgICAgICBgJHtNRVRBREFUQX0uJHtMQUJFTFN9LmNvbnRyb2xsZXItdWlkYCxcbiAgICAgICAgICBwcmVmaXhGaWx0ZXJSdWxlRmFjdG9yeShcbiAgICAgICAgICAgICdiYXRjaC5rdWJlcm5ldGVzLmlvL2NvbnRyb2xsZXItdWlkJyxcbiAgICAgICAgICAgIFsnc3BlYycsICd0ZW1wbGF0ZScsIE1FVEFEQVRBLCBMQUJFTFNdLFxuICAgICAgICAgICAgJ2luY2x1ZGVzJyxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1BlcnNpc3RlbnRWb2x1bWVDbGFpbSc6IHtcbiAgICAgICAgc3BlY2lmaWNGaWx0ZXJzLnB1c2goXG4gICAgICAgICAgcHJlZml4RmlsdGVyUnVsZUZhY3RvcnkoXG4gICAgICAgICAgICAncHYua3ViZXJuZXRlcy5pbycsXG4gICAgICAgICAgICBbTUVUQURBVEEsIEFOTk9UQVRJT05TXSxcbiAgICAgICAgICAgICdzdGFydHNXaXRoJyxcbiAgICAgICAgICApLFxuICAgICAgICAgIHByZWZpeEZpbHRlclJ1bGVGYWN0b3J5KFxuICAgICAgICAgICAgJ3ZvbHVtZS5iZXRhLmt1YmVybmV0ZXMuaW8nLFxuICAgICAgICAgICAgW01FVEFEQVRBLCBBTk5PVEFUSU9OU10sXG4gICAgICAgICAgICAnc3RhcnRzV2l0aCcsXG4gICAgICAgICAgKSxcbiAgICAgICAgICAnc3BlYy52b2x1bWVOYW1lJyxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdTZXJ2aWNlJzoge1xuICAgICAgICBzcGVjaWZpY0ZpbHRlcnMucHVzaChcbiAgICAgICAgICByZXNvdXJjZSA9PiB7XG4gICAgICAgICAgICAvLyBFeHRlcm5hbE5hbWUg57G75Z6L55qEIFNlcnZpY2Ug5rKh5pyJIHBvcnRzXG4gICAgICAgICAgICBjb25zdCBwb3J0cyA9XG4gICAgICAgICAgICAgIChnZXQocmVzb3VyY2UsIFsnc3BlYycsICdwb3J0cyddKSBhcyBTZXJ2aWNlUG9ydFtdKSA/PyBbXTtcbiAgICAgICAgICAgIHJldHVybiBwb3J0cy5tYXAoKF8sIGkpID0+XG4gICAgICAgICAgICAgIFsnc3BlYycsICdwb3J0cycsIGBbJHtpfV1gLCAnbm9kZVBvcnQnXS5qb2luKCcuJyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3NwZWMuY2x1c3RlcklQcycsXG4gICAgICAgICAgJ3NwZWMuY2x1c3RlcklQJyxcbiAgICAgICAgICAnc3BlYy5pcEZhbWlsaWVzJyxcbiAgICAgICAgICAnc3BlYy5pcEZhbWlseVBvbGljeScsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgc3BlY2lmaWNGaWx0ZXJzLnB1c2goXG4gICAgICBlbXB0eU9iamVjdFJlbW92ZVJ1bGVGYWN0b3J5KFtNRVRBREFUQSwgQU5OT1RBVElPTlNdKSxcbiAgICAgIGVtcHR5T2JqZWN0UmVtb3ZlUnVsZUZhY3RvcnkoW01FVEFEQVRBLCBMQUJFTFNdKSxcbiAgICApO1xuICAgIHJldHVybiB5YW1sRmlsdGVyRmllbGQociwgWy4uLmNvbW1vbkZpbHRlcnMsIC4uLnNwZWNpZmljRmlsdGVyc10pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VH0gcmVzb3VyY2VcbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uY2lzZT1mYWxzZV0g57K+566AIFlhbWxcbiAgICogQHBhcmFtIHtib29sZWFufSBbcmVkdWNlPWZhbHNlXSDpmpDol48gbWFuYWdlZEZpZWxkc1xuICAgKiBAcmV0dXJuc1xuICAgKiBAbWVtYmVyb2YgWWFtbFV0aWxTZXJ2aWNlXG4gICAqL1xuICBnZW5lcmF0ZUZpbHRlcmVkWWFtbFJlc291cmNlPFQgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+KFxuICAgIHJlc291cmNlOiBBcnJheWFibGU8VD4sXG4gICAgY29uY2lzZSA9IGZhbHNlLFxuICAgIHJlZHVjZSA9IGZhbHNlLFxuICApIHtcbiAgICByZXR1cm4gc29ydEJ5KEFycmF5LmlzQXJyYXkocmVzb3VyY2UpID8gcmVzb3VyY2UgOiBbcmVzb3VyY2VdLCAna2luZCcpXG4gICAgICAubWFwKChyZXNvdXJjZTogVCkgPT5cbiAgICAgICAgY29uY2lzZVxuICAgICAgICAgID8gdGhpcy5nZXRDb25jaXNlUmVzb3VyY2UocmVzb3VyY2UpXG4gICAgICAgICAgOiByZWR1Y2VcbiAgICAgICAgICA/IHlhbWxGaWx0ZXJGaWVsZChyZXNvdXJjZSwgWydtZXRhZGF0YS5tYW5hZ2VkRmllbGRzJ10pXG4gICAgICAgICAgOiByZXNvdXJjZSxcbiAgICAgIClcbiAgICAgIC5tYXAocmVzID0+XG4gICAgICAgIHN0cmluZ2lmeShyZXMsIHtcbiAgICAgICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgICAgICAgIHNvcnRNYXBFbnRyaWVzOiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5qb2luKCdcXG4tLS1cXHJcXG5cXG4nKTtcbiAgfVxufVxuIl19