@versatiledatakit/data-pipelines
Version:
Data Pipelines help Data Engineers develop, deploy, run, and manage data processing workloads (called 'Data Job')
117 lines • 13.6 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
/* eslint-disable @typescript-eslint/naming-convention */
import { Inject, Injectable } from '@angular/core';
import { gql, InMemoryCache } from '@apollo/client/core';
import { TaurusBaseApiService } from '@versatiledatakit/shared';
import { DATA_PIPELINES_CONFIGS } from '../model';
import * as i0 from "@angular/core";
import * as i1 from "apollo-angular";
import * as i2 from "apollo-angular/http";
/**
* ** Data Jobs Service build on top of Apollo gql client.
*/
export class DataJobsBaseApiService extends TaurusBaseApiService {
/**
* ** Constructor.
*/
constructor(dataPipelinesConfig, apollo, httpLink) {
super(DataJobsBaseApiService.CLASS_NAME);
this.dataPipelinesConfig = dataPipelinesConfig;
this.apollo = apollo;
this.httpLink = httpLink;
this.registerErrorCodes(DataJobsBaseApiService);
}
/**
* ** Get all DataJobs for provided OwnerTeam and load data based on provided gqlQuery.
*/
getJobs(ownerTeam, gqlQuery, variables) {
return this.getApolloClientFor(ownerTeam).query({
query: gql `
${gqlQuery}
`,
variables
});
}
/**
* ** Create Apollo watcher for gqlQuery.
*/
watchForJobs(ownerTeam, gqlQuery, variables) {
return this.getApolloClientFor(ownerTeam).watchQuery({
query: gql `
${gqlQuery}
`,
variables
});
}
/**
* ** Get all DataJob Executions for provided OwnerTeam and load data based on provided gqlQuery.
*/
getExecutions(ownerTeam, gqlQuery, variables) {
return this.getApolloClientFor(ownerTeam).query({
query: gql `
${gqlQuery}
`,
variables
});
}
getApolloClientFor(ownerTeam) {
if (!this.apollo.use(ownerTeam)) {
this.apollo.createNamed(ownerTeam, {
cache: new InMemoryCache({
typePolicies: {
Query: {
fields: {
jobs: (_existing, _options) => {
return {};
},
executions: (_existing, _options) => {
return {};
}
}
}
}
}),
link: this.httpLink.create({
uri: `${this._resolvePipelinesServiceUrl()}/data-jobs/for-team/${ownerTeam}/jobs`,
method: DataJobsBaseApiService.APOLLO_METHOD
}),
defaultOptions: DataJobsBaseApiService.APOLLO_DEFAULT_OPTIONS
});
}
return this.apollo.use(ownerTeam);
}
_resolvePipelinesServiceUrl() {
return this.dataPipelinesConfig?.resourceServer?.getUrl ? this.dataPipelinesConfig.resourceServer.getUrl() : '';
}
}
/**
* @inheritDoc
*/
DataJobsBaseApiService.CLASS_NAME = 'DataJobsBaseApiService';
/**
* @inheritDoc
*/
DataJobsBaseApiService.PUBLIC_NAME = 'Data-Pipelines-Service';
DataJobsBaseApiService.APOLLO_METHOD = 'GET';
DataJobsBaseApiService.APOLLO_DEFAULT_OPTIONS = {
watchQuery: {
fetchPolicy: 'no-cache',
errorPolicy: 'all'
},
query: {
fetchPolicy: 'no-cache',
errorPolicy: 'all'
}
};
DataJobsBaseApiService.ɵfac = function DataJobsBaseApiService_Factory(t) { return new (t || DataJobsBaseApiService)(i0.ɵɵinject(DATA_PIPELINES_CONFIGS), i0.ɵɵinject(i1.Apollo), i0.ɵɵinject(i2.HttpLink)); };
DataJobsBaseApiService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: DataJobsBaseApiService, factory: DataJobsBaseApiService.ɵfac });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataJobsBaseApiService, [{
type: Injectable
}], function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [DATA_PIPELINES_CONFIGS]
}] }, { type: i1.Apollo }, { type: i2.HttpLink }]; }, null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1qb2JzLWJhc2UuYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhLXBpcGVsaW5lcy9zcmMvbGliL3NlcnZpY2VzL2RhdGEtam9icy1iYXNlLmFwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILHlEQUF5RDtBQUV6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUluRCxPQUFPLEVBQXFDLEdBQUcsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUs1RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVoRSxPQUFPLEVBQ0gsc0JBQXNCLEVBT3pCLE1BQU0sVUFBVSxDQUFDOzs7O0FBRWxCOztHQUVHO0FBRUgsTUFBTSxPQUFPLHNCQUF1QixTQUFRLG9CQUE0QztJQXVCcEY7O09BRUc7SUFDSCxZQUNxRCxtQkFBd0MsRUFDeEUsTUFBYyxFQUNkLFFBQWtCO1FBRW5DLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUpRLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFJbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTyxDQUFDLFNBQWlCLEVBQUUsUUFBZ0IsRUFBRSxTQUE4QjtRQUN2RSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDNUMsS0FBSyxFQUFFLEdBQUcsQ0FBQTtrQkFDSixRQUFRO2FBQ2I7WUFDRCxTQUFTO1NBQ1osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLFNBQWlCLEVBQUUsUUFBZ0IsRUFBRSxTQUE4QjtRQUM1RSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFDakQsS0FBSyxFQUFFLEdBQUcsQ0FBQTtrQkFDSixRQUFRO2FBQ2I7WUFDRCxTQUFTO1NBQ1osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUNULFNBQWlCLEVBQ2pCLFFBQWdCLEVBQ2hCLFNBQXdDO1FBRXhDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUM1QyxLQUFLLEVBQUUsR0FBRyxDQUFBO2tCQUNKLFFBQVE7YUFDYjtZQUNELFNBQVM7U0FDWixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsU0FBaUI7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTtnQkFDL0IsS0FBSyxFQUFFLElBQUksYUFBYSxDQUFDO29CQUNyQixZQUFZLEVBQUU7d0JBQ1YsS0FBSyxFQUFFOzRCQUNILE1BQU0sRUFBRTtnQ0FDSixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUU7b0NBQzFCLE9BQU8sRUFBRSxDQUFDO2dDQUNkLENBQUM7Z0NBQ0QsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFO29DQUNoQyxPQUFPLEVBQUUsQ0FBQztnQ0FDZCxDQUFDOzZCQUNKO3lCQUNKO3FCQUNKO2lCQUNKLENBQUM7Z0JBQ0YsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO29CQUN2QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsdUJBQXVCLFNBQVMsT0FBTztvQkFDakYsTUFBTSxFQUFFLHNCQUFzQixDQUFDLGFBQWE7aUJBQy9DLENBQUM7Z0JBQ0YsY0FBYyxFQUFFLHNCQUFzQixDQUFDLHNCQUFzQjthQUNoRSxDQUFDLENBQUM7U0FDTjtRQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUF3QixDQUFDO0lBQzdELENBQUM7SUFFTywyQkFBMkI7UUFDL0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BILENBQUM7O0FBekdEOztHQUVHO0FBQ3NCLGlDQUFVLEdBQVcsd0JBQXlCLENBQUE7QUFFdkU7O0dBRUc7QUFDc0Isa0NBQVcsR0FBVyx3QkFBeUIsQ0FBQTtBQUVoRCxvQ0FBYSxHQUFHLEtBQU0sQ0FBQTtBQUN0Qiw2Q0FBc0IsR0FBbUI7SUFDN0QsVUFBVSxFQUFFO1FBQ1IsV0FBVyxFQUFFLFVBQVU7UUFDdkIsV0FBVyxFQUFFLEtBQUs7S0FDckI7SUFDRCxLQUFLLEVBQUU7UUFDSCxXQUFXLEVBQUUsVUFBVTtRQUN2QixXQUFXLEVBQUUsS0FBSztLQUNyQjtDQUNILENBQUE7NEZBckJPLHNCQUFzQixjQTJCbkIsc0JBQXNCOzRFQTNCekIsc0JBQXNCLFdBQXRCLHNCQUFzQjt1RkFBdEIsc0JBQXNCO2NBRGxDLFVBQVU7O3NCQTRCRixNQUFNO3VCQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBcG9sbG9RdWVyeVJlc3VsdCwgRGVmYXVsdE9wdGlvbnMsIGdxbCwgSW5NZW1vcnlDYWNoZSB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuXG5pbXBvcnQgeyBBcG9sbG8sIEFwb2xsb0Jhc2UsIFF1ZXJ5UmVmIH0gZnJvbSAnYXBvbGxvLWFuZ3VsYXInO1xuaW1wb3J0IHsgSHR0cExpbmsgfSBmcm9tICdhcG9sbG8tYW5ndWxhci9odHRwJztcblxuaW1wb3J0IHsgVGF1cnVzQmFzZUFwaVNlcnZpY2UgfSBmcm9tICdAdmVyc2F0aWxlZGF0YWtpdC9zaGFyZWQnO1xuXG5pbXBvcnQge1xuICAgIERBVEFfUElQRUxJTkVTX0NPTkZJR1MsXG4gICAgRGF0YUpvYixcbiAgICBEYXRhSm9iRXhlY3V0aW9uc1BhZ2UsXG4gICAgRGF0YUpvYkV4ZWN1dGlvbnNSZXFWYXJpYWJsZXMsXG4gICAgRGF0YUpvYlBhZ2UsXG4gICAgRGF0YUpvYlJlcVZhcmlhYmxlcyxcbiAgICBEYXRhUGlwZWxpbmVzQ29uZmlnXG59IGZyb20gJy4uL21vZGVsJztcblxuLyoqXG4gKiAqKiBEYXRhIEpvYnMgU2VydmljZSBidWlsZCBvbiB0b3Agb2YgQXBvbGxvIGdxbCBjbGllbnQuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRhSm9ic0Jhc2VBcGlTZXJ2aWNlIGV4dGVuZHMgVGF1cnVzQmFzZUFwaVNlcnZpY2U8RGF0YUpvYnNCYXNlQXBpU2VydmljZT4ge1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IENMQVNTX05BTUU6IHN0cmluZyA9ICdEYXRhSm9ic0Jhc2VBcGlTZXJ2aWNlJztcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IFBVQkxJQ19OQU1FOiBzdHJpbmcgPSAnRGF0YS1QaXBlbGluZXMtU2VydmljZSc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBUE9MTE9fTUVUSE9EID0gJ0dFVCc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVBPTExPX0RFRkFVTFRfT1BUSU9OUzogRGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgIHdhdGNoUXVlcnk6IHtcbiAgICAgICAgICAgIGZldGNoUG9saWN5OiAnbm8tY2FjaGUnLFxuICAgICAgICAgICAgZXJyb3JQb2xpY3k6ICdhbGwnXG4gICAgICAgIH0sXG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICBmZXRjaFBvbGljeTogJ25vLWNhY2hlJyxcbiAgICAgICAgICAgIGVycm9yUG9saWN5OiAnYWxsJ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICoqIENvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KERBVEFfUElQRUxJTkVTX0NPTkZJR1MpIHByaXZhdGUgcmVhZG9ubHkgZGF0YVBpcGVsaW5lc0NvbmZpZzogRGF0YVBpcGVsaW5lc0NvbmZpZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhcG9sbG86IEFwb2xsbyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBodHRwTGluazogSHR0cExpbmtcbiAgICApIHtcbiAgICAgICAgc3VwZXIoRGF0YUpvYnNCYXNlQXBpU2VydmljZS5DTEFTU19OQU1FKTtcblxuICAgICAgICB0aGlzLnJlZ2lzdGVyRXJyb3JDb2RlcyhEYXRhSm9ic0Jhc2VBcGlTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBHZXQgYWxsIERhdGFKb2JzIGZvciBwcm92aWRlZCBPd25lclRlYW0gYW5kIGxvYWQgZGF0YSBiYXNlZCBvbiBwcm92aWRlZCBncWxRdWVyeS5cbiAgICAgKi9cbiAgICBnZXRKb2JzKG93bmVyVGVhbTogc3RyaW5nLCBncWxRdWVyeTogc3RyaW5nLCB2YXJpYWJsZXM6IERhdGFKb2JSZXFWYXJpYWJsZXMpOiBPYnNlcnZhYmxlPEFwb2xsb1F1ZXJ5UmVzdWx0PERhdGFKb2JQYWdlPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBcG9sbG9DbGllbnRGb3Iob3duZXJUZWFtKS5xdWVyeSh7XG4gICAgICAgICAgICBxdWVyeTogZ3FsYFxuICAgICAgICAgICAgICAgICR7Z3FsUXVlcnl9XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgdmFyaWFibGVzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIENyZWF0ZSBBcG9sbG8gd2F0Y2hlciBmb3IgZ3FsUXVlcnkuXG4gICAgICovXG4gICAgd2F0Y2hGb3JKb2JzKG93bmVyVGVhbTogc3RyaW5nLCBncWxRdWVyeTogc3RyaW5nLCB2YXJpYWJsZXM6IERhdGFKb2JSZXFWYXJpYWJsZXMpOiBRdWVyeVJlZjxEYXRhSm9iUGFnZSwgRGF0YUpvYlJlcVZhcmlhYmxlcz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBcG9sbG9DbGllbnRGb3Iob3duZXJUZWFtKS53YXRjaFF1ZXJ5KHtcbiAgICAgICAgICAgIHF1ZXJ5OiBncWxgXG4gICAgICAgICAgICAgICAgJHtncWxRdWVyeX1cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICB2YXJpYWJsZXNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogR2V0IGFsbCBEYXRhSm9iIEV4ZWN1dGlvbnMgZm9yIHByb3ZpZGVkIE93bmVyVGVhbSBhbmQgbG9hZCBkYXRhIGJhc2VkIG9uIHByb3ZpZGVkIGdxbFF1ZXJ5LlxuICAgICAqL1xuICAgIGdldEV4ZWN1dGlvbnMoXG4gICAgICAgIG93bmVyVGVhbTogc3RyaW5nLFxuICAgICAgICBncWxRdWVyeTogc3RyaW5nLFxuICAgICAgICB2YXJpYWJsZXM6IERhdGFKb2JFeGVjdXRpb25zUmVxVmFyaWFibGVzXG4gICAgKTogT2JzZXJ2YWJsZTxBcG9sbG9RdWVyeVJlc3VsdDxEYXRhSm9iRXhlY3V0aW9uc1BhZ2U+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFwb2xsb0NsaWVudEZvcihvd25lclRlYW0pLnF1ZXJ5KHtcbiAgICAgICAgICAgIHF1ZXJ5OiBncWxgXG4gICAgICAgICAgICAgICAgJHtncWxRdWVyeX1cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICB2YXJpYWJsZXNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBcG9sbG9DbGllbnRGb3Iob3duZXJUZWFtOiBzdHJpbmcpOiBBcG9sbG9CYXNlPERhdGFKb2I+IHtcbiAgICAgICAgaWYgKCF0aGlzLmFwb2xsby51c2Uob3duZXJUZWFtKSkge1xuICAgICAgICAgICAgdGhpcy5hcG9sbG8uY3JlYXRlTmFtZWQob3duZXJUZWFtLCB7XG4gICAgICAgICAgICAgICAgY2FjaGU6IG5ldyBJbk1lbW9yeUNhY2hlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZVBvbGljaWVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBRdWVyeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JzOiAoX2V4aXN0aW5nLCBfb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25zOiAoX2V4aXN0aW5nLCBfb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgbGluazogdGhpcy5odHRwTGluay5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgICB1cmk6IGAke3RoaXMuX3Jlc29sdmVQaXBlbGluZXNTZXJ2aWNlVXJsKCl9L2RhdGEtam9icy9mb3ItdGVhbS8ke293bmVyVGVhbX0vam9ic2AsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogRGF0YUpvYnNCYXNlQXBpU2VydmljZS5BUE9MTE9fTUVUSE9EXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnM6IERhdGFKb2JzQmFzZUFwaVNlcnZpY2UuQVBPTExPX0RFRkFVTFRfT1BUSU9OU1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG8udXNlKG93bmVyVGVhbSkgYXMgQXBvbGxvQmFzZTxEYXRhSm9iPjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNvbHZlUGlwZWxpbmVzU2VydmljZVVybCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhUGlwZWxpbmVzQ29uZmlnPy5yZXNvdXJjZVNlcnZlcj8uZ2V0VXJsID8gdGhpcy5kYXRhUGlwZWxpbmVzQ29uZmlnLnJlc291cmNlU2VydmVyLmdldFVybCgpIDogJyc7XG4gICAgfVxufVxuIl19