UNPKG

@versatiledatakit/data-pipelines

Version:

Data Pipelines help Data Engineers develop, deploy, run, and manage data processing workloads (called 'Data Job')

259 lines 35.4 kB
/* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ import { Inject, Injectable } from '@angular/core'; import { HttpHeaders } from '@angular/common/http'; import { map } from 'rxjs/operators'; import { CollectionsUtil, TaurusBaseApiService } from '@versatiledatakit/shared'; import { DATA_PIPELINES_CONFIGS, MISSING_DEFAULT_TEAM_MESSAGE, RESERVED_DEFAULT_TEAM_NAME_MESSAGE } from '../model'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; import * as i2 from "./data-jobs-base.api.service"; export class DataJobsApiService extends TaurusBaseApiService { constructor(dataPipelinesConfig, http, dataJobsBaseService) { super(DataJobsApiService.CLASS_NAME); this.dataPipelinesConfig = dataPipelinesConfig; this.http = http; this.dataJobsBaseService = dataJobsBaseService; this.registerErrorCodes(DataJobsApiService); this._validateModuleConfig(this.dataPipelinesConfig); this.ownerTeamName = this.dataPipelinesConfig?.defaultOwnerTeamName; if (this.dataPipelinesConfig?.ownerTeamNamesObservable) { this.dataPipelinesConfig.ownerTeamNamesObservable.subscribe((result) => { if (result?.length) { //Take the first element from the teams array this.ownerTeamName = result[0]; } }); } } getJobs(filters, searchQueryValue, pageNumber, pageSize) { return this.dataJobsBaseService.getJobs(this.ownerTeamName, `query jobsQuery($filter: [Predicate], $search: String, $pageNumber: Int, $pageSize: Int) { jobs(pageNumber: $pageNumber, pageSize: $pageSize, filter: $filter, search: $search) { content { jobName config { team description sourceUrl schedule { scheduleCron nextRunEpochSeconds } contacts { notifiedOnJobSuccess notifiedOnJobDeploy notifiedOnJobFailureUserError notifiedOnJobFailurePlatformError } } deployments { id enabled lastDeployedDate lastDeployedBy lastExecutionStatus lastExecutionTime lastExecutionDuration successfulExecutions failedExecutions jobPythonVersion executions(pageNumber: 1, pageSize: 10, order: { property: "startTime", direction: DESC }) { id status logsUrl message } } } totalPages totalItems } }`, { pageNumber, pageSize, filter: filters, search: searchQueryValue }); } getJob(teamName, jobName) { return this.dataJobsBaseService .getJobs(teamName, `query jobsQuery($filter: [Predicate]) { jobs(pageNumber: 1, pageSize: 1, filter: $filter) { content { jobName config { team description sourceUrl schedule { scheduleCron nextRunEpochSeconds } contacts { notifiedOnJobSuccess notifiedOnJobDeploy notifiedOnJobFailureUserError notifiedOnJobFailurePlatformError } } deployments { id enabled jobPythonVersion executions(pageNumber: 1, pageSize: 10, order: { property: "startTime", direction: DESC }) { id status logsUrl startedBy startTime endTime } } } totalPages totalItems } }`, { filter: this._createTeamJobNameFilter(teamName, jobName) }) .pipe(map((response) => { if (!CollectionsUtil.isArray(response?.data?.content) || response.data.content.length === 0) { return null; } return response.data.content[0]; })); } getJobDetails(teamName, jobName) { return this.http.get(`${this._resolvePipelinesServiceUrl()}/data-jobs/for-team/${teamName}/jobs/${jobName}`); } removeJob(teamName, jobName) { return this.http.delete(`${this._resolvePipelinesServiceUrl()}/data-jobs/for-team/${teamName}/jobs/${jobName}`); } downloadFile(teamName, jobName) { const httpHeaders = new HttpHeaders(); httpHeaders.append('Accept', 'application/octet-stream'); return this.http.get(`${this._resolvePipelinesServiceUrl()}/data-jobs/for-team/${teamName}/jobs/${jobName}/keytab`, { headers: httpHeaders, responseType: 'blob' }); } getJobExecutions(teamName, jobName, forceGraphQL = false, filter = null, order = null, pageNumber = null, pageSize = null) { if (!forceGraphQL) { return this.http.get(`${this._resolvePipelinesServiceUrl()}/data-jobs/for-team/${teamName}/jobs/${jobName}/executions`); } const preparedFilter = { ...(filter ?? {}) }; if (jobName.length > 0) { if (CollectionsUtil.isArray(preparedFilter.jobNameIn)) { preparedFilter.jobNameIn.push(jobName); } else { preparedFilter.jobNameIn = [jobName]; } } return this.dataJobsBaseService .getExecutions(teamName, `query jobsQuery($pageNumber: Int, $pageSize: Int, $filter: DataJobExecutionFilter, $order: DataJobExecutionOrder) { executions(pageNumber: $pageNumber, pageSize: $pageSize, filter: $filter, order: $order) { content { id type jobName status startTime endTime startedBy message opId logsUrl deployment { enabled jobVersion deployedDate deployedBy resources { cpuLimit cpuRequest memoryLimit memoryRequest } schedule { scheduleCron } vdkVersion status jobPythonVersion } } totalPages totalItems } }`, { pageNumber: pageNumber ?? 1, pageSize: pageSize ?? 500, filter: preparedFilter, order: order ?? null }) .pipe(map((response) => response.data)); } getJobExecution(teamName, jobName, executionId) { return this.http.get(`${this._resolvePipelinesServiceUrl()}/data-jobs/for-team/${teamName}/jobs/${jobName}/executions/${executionId}`); } getJobDeployments(teamName, jobName) { return this.http.get(`${this._resolvePipelinesServiceUrl()}/data-jobs/for-team/${teamName}/jobs/${jobName}/deployments`); } updateDataJobStatus(teamName, jobName, deploymentId, dataJobEnabled) { const deploymentStatus = { enabled: dataJobEnabled }; if (!deploymentId) { console.log(`Status update will be processed with default deploymentId`); deploymentId = 'default'; } return this.http.patch(`${this._resolvePipelinesServiceUrl()}/data-jobs/for-team/${teamName}/jobs/${jobName}/deployments/${deploymentId}`, deploymentStatus); } updateDataJob(teamName, jobName, dataJob) { return this.http.put(`${this._resolvePipelinesServiceUrl()}/data-jobs/for-team/${teamName}/jobs/${jobName}`, dataJob); } executeDataJob(teamName, jobName, deploymentId) { return this.http.post(`${this._resolvePipelinesServiceUrl()}/data-jobs/for-team/${teamName}/jobs/${jobName}/deployments/${deploymentId}/executions`, {}); } cancelDataJobExecution(teamName, jobName, executionId) { return this.http.delete(`${this._resolvePipelinesServiceUrl()}/data-jobs/for-team/${teamName}/jobs/${jobName}/executions/${executionId}`); } _resolvePipelinesServiceUrl() { return this.dataPipelinesConfig?.resourceServer?.getUrl ? this.dataPipelinesConfig.resourceServer.getUrl() : ''; } _createTeamJobNameFilter(teamName, jobName) { return [ { property: 'config.team', pattern: teamName, sort: null }, { property: 'jobName', pattern: jobName, sort: null } ]; } _validateModuleConfig(dataPipelinesConfig) { if (!dataPipelinesConfig?.defaultOwnerTeamName) { throw new Error(MISSING_DEFAULT_TEAM_MESSAGE); } if (dataPipelinesConfig?.defaultOwnerTeamName === 'default') { throw new Error(RESERVED_DEFAULT_TEAM_NAME_MESSAGE); } } } /** * @inheritDoc */ DataJobsApiService.CLASS_NAME = 'DataJobsApiService'; /** * @inheritDoc */ DataJobsApiService.PUBLIC_NAME = 'Data-Pipelines-Service'; DataJobsApiService.ɵfac = function DataJobsApiService_Factory(t) { return new (t || DataJobsApiService)(i0.ɵɵinject(DATA_PIPELINES_CONFIGS), i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.DataJobsBaseApiService)); }; DataJobsApiService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: DataJobsApiService, factory: DataJobsApiService.ɵfac }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataJobsApiService, [{ type: Injectable }], function () { return [{ type: undefined, decorators: [{ type: Inject, args: [DATA_PIPELINES_CONFIGS] }] }, { type: i1.HttpClient }, { type: i2.DataJobsBaseApiService }]; }, null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1qb2JzLmFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS1waXBlbGluZXMvc3JjL2xpYi9zZXJ2aWNlcy9kYXRhLWpvYnMuYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFjLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRy9ELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlyQyxPQUFPLEVBQWdCLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRS9GLE9BQU8sRUFDSCxzQkFBc0IsRUFVdEIsNEJBQTRCLEVBQzVCLGtDQUFrQyxFQUNyQyxNQUFNLFVBQVUsQ0FBQzs7OztBQUtsQixNQUFNLE9BQU8sa0JBQW1CLFNBQVEsb0JBQXdDO0lBYTVFLFlBQ3FELG1CQUF3QyxFQUN4RSxJQUFnQixFQUNoQixtQkFBMkM7UUFFNUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBSlksd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4RSxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBd0I7UUFJNUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLG9CQUFvQixDQUFDO1FBQ3BFLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFO1lBQ3BELElBQUksQ0FBQyxtQkFBbUIsQ0FB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QUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwSCxDQUFDO0lBRU8sd0JBQXdCLENBQUMsUUFBZ0IsRUFBRSxPQUFlO1FBQzlELE9BQU87WUFDSCxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQzFELEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7U0FDeEQsQ0FBQztJQUNOLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxtQkFBd0M7UUFDbEUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztTQUNqRDtRQUVELElBQUksbUJBQW1CLEVBQUUsb0JBQW9CLEtBQUssU0FBUyxFQUFFO1lBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUN2RDtJQUNMLENBQUM7O0FBcFVEOztHQUVHO0FBQ3NCLDZCQUFVLEdBQVcsb0JBQXFCLENBQUE7QUFFbkU7O0dBRUc7QUFDc0IsOEJBQVcsR0FBVyx3QkFBeUIsQ0FBQTtvRkFUL0Qsa0JBQWtCLGNBY2Ysc0JBQXNCO3dFQWR6QixrQkFBa0IsV0FBbEIsa0JBQWtCO3VGQUFsQixrQkFBa0I7Y0FEOUIsVUFBVTs7c0JBZUYsTUFBTTt1QkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjMtMjAyNSBCcm9hZGNvbVxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEFwb2xsb1F1ZXJ5UmVzdWx0IH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5cbmltcG9ydCB7IEFwaVByZWRpY2F0ZSwgQ29sbGVjdGlvbnNVdGlsLCBUYXVydXNCYXNlQXBpU2VydmljZSB9IGZyb20gJ0B2ZXJzYXRpbGVkYXRha2l0L3NoYXJlZCc7XG5cbmltcG9ydCB7XG4gICAgREFUQV9QSVBFTElORVNfQ09ORklHUyxcbiAgICBEYXRhSm9iLFxuICAgIERhdGFKb2JEZXBsb3ltZW50RGV0YWlscyxcbiAgICBEYXRhSm9iRGV0YWlscyxcbiAgICBEYXRhSm9iRXhlY3V0aW9uRGV0YWlscyxcbiAgICBEYXRhSm9iRXhlY3V0aW9uRmlsdGVyLFxuICAgIERhdGFKb2JFeGVjdXRpb25PcmRlcixcbiAgICBEYXRhSm9iRXhlY3V0aW9uc1BhZ2UsXG4gICAgRGF0YUpvYlBhZ2UsXG4gICAgRGF0YVBpcGVsaW5lc0NvbmZpZyxcbiAgICBNSVNTSU5HX0RFRkFVTFRfVEVBTV9NRVNTQUdFLFxuICAgIFJFU0VSVkVEX0RFRkFVTFRfVEVBTV9OQU1FX01FU1NBR0Vcbn0gZnJvbSAnLi4vbW9kZWwnO1xuXG5pbXBvcnQgeyBEYXRhSm9ic0Jhc2VBcGlTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhLWpvYnMtYmFzZS5hcGkuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRhSm9ic0FwaVNlcnZpY2UgZXh0ZW5kcyBUYXVydXNCYXNlQXBpU2VydmljZTxEYXRhSm9ic0FwaVNlcnZpY2U+IHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBDTEFTU19OQU1FOiBzdHJpbmcgPSAnRGF0YUpvYnNBcGlTZXJ2aWNlJztcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IFBVQkxJQ19OQU1FOiBzdHJpbmcgPSAnRGF0YS1QaXBlbGluZXMtU2VydmljZSc7XG5cbiAgICBvd25lclRlYW1OYW1lOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChEQVRBX1BJUEVMSU5FU19DT05GSUdTKSBwcml2YXRlIHJlYWRvbmx5IGRhdGFQaXBlbGluZXNDb25maWc6IERhdGFQaXBlbGluZXNDb25maWcsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkYXRhSm9ic0Jhc2VTZXJ2aWNlOiBEYXRhSm9ic0Jhc2VBcGlTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKERhdGFKb2JzQXBpU2VydmljZS5DTEFTU19OQU1FKTtcblxuICAgICAgICB0aGlzLnJlZ2lzdGVyRXJyb3JDb2RlcyhEYXRhSm9ic0FwaVNlcnZpY2UpO1xuXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlTW9kdWxlQ29uZmlnKHRoaXMuZGF0YVBpcGVsaW5lc0NvbmZpZyk7XG5cbiAgICAgICAgdGhpcy5vd25lclRlYW1OYW1lID0gdGhpcy5kYXRhUGlwZWxpbmVzQ29uZmlnPy5kZWZhdWx0T3duZXJUZWFtTmFtZTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVBpcGVsaW5lc0NvbmZpZz8ub3duZXJUZWFtTmFtZXNPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFQaXBlbGluZXNDb25maWcub3duZXJUZWFtTmFtZXNPYnNlcnZhYmxlLnN1YnNjcmliZSgocmVzdWx0OiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAvL1Rha2UgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgdGVhbXMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vd25lclRlYW1OYW1lID0gcmVzdWx0WzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Sm9icyhcbiAgICAgICAgZmlsdGVyczogQXBpUHJlZGljYXRlW10sXG4gICAgICAgIHNlYXJjaFF1ZXJ5VmFsdWU6IHN0cmluZyxcbiAgICAgICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgICAgICBwYWdlU2l6ZTogbnVtYmVyXG4gICAgKTogT2JzZXJ2YWJsZTxBcG9sbG9RdWVyeVJlc3VsdDxEYXRhSm9iUGFnZT4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUpvYnNCYXNlU2VydmljZS5nZXRKb2JzKFxuICAgICAgICAgICAgdGhpcy5vd25lclRlYW1OYW1lLFxuICAgICAgICAgICAgYHF1ZXJ5IGpvYnNRdWVyeSgkZmlsdGVyOiBbUHJlZGljYXRlXSwgJHNlYXJjaDogU3RyaW5nLCAkcGFnZU51bWJlcjogSW50LCAkcGFnZVNpemU6IEludClcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGpvYnMocGFnZU51bWJlcjogJHBhZ2VOdW1iZXIsIHBhZ2VTaXplOiAkcGFnZVNpemUsIGZpbHRlcjogJGZpbHRlciwgc2VhcmNoOiAkc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50IHtcbiAgICAgICAgICAgICAgICAgICAgam9iTmFtZVxuICAgICAgICAgICAgICAgICAgICBjb25maWcge1xuICAgICAgICAgICAgICAgICAgICAgIHRlYW1cbiAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVVybFxuICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlQ3JvblxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJ1bkVwb2NoU2Vjb25kc1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjb250YWN0cyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllZE9uSm9iU3VjY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWRPbkpvYkRlcGxveVxuICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWRPbkpvYkZhaWx1cmVVc2VyRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVkT25Kb2JGYWlsdXJlUGxhdGZvcm1FcnJvclxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50cyB7XG4gICAgICAgICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkXG4gICAgICAgICAgICAgICAgICAgICAgbGFzdERlcGxveWVkRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIGxhc3REZXBsb3llZEJ5XG4gICAgICAgICAgICAgICAgICAgICAgbGFzdEV4ZWN1dGlvblN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgIGxhc3RFeGVjdXRpb25UaW1lXG4gICAgICAgICAgICAgICAgICAgICAgbGFzdEV4ZWN1dGlvbkR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bEV4ZWN1dGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRFeGVjdXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgam9iUHl0aG9uVmVyc2lvblxuICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbnMocGFnZU51bWJlcjogMSwgcGFnZVNpemU6IDEwLCBvcmRlcjogeyBwcm9wZXJ0eTogXCJzdGFydFRpbWVcIiwgZGlyZWN0aW9uOiBERVNDIH0pIHtcblx0XHRcdFx0XHRcdCAgICAgICAgICAgIGlkXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ3NVcmxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRvdGFsUGFnZXNcbiAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgICAgICAgICAgcGFnZVNpemUsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiBmaWx0ZXJzLFxuICAgICAgICAgICAgICAgIHNlYXJjaDogc2VhcmNoUXVlcnlWYWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldEpvYih0ZWFtTmFtZTogc3RyaW5nLCBqb2JOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERhdGFKb2I+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUpvYnNCYXNlU2VydmljZVxuICAgICAgICAgICAgLmdldEpvYnMoXG4gICAgICAgICAgICAgICAgdGVhbU5hbWUsXG4gICAgICAgICAgICAgICAgYHF1ZXJ5IGpvYnNRdWVyeSgkZmlsdGVyOiBbUHJlZGljYXRlXSlcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGpvYnMocGFnZU51bWJlcjogMSwgcGFnZVNpemU6IDEsIGZpbHRlcjogJGZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgY29udGVudCB7XG4gICAgICAgICAgICAgICAgICAgIGpvYk5hbWVcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnIHtcbiAgICAgICAgICAgICAgICAgICAgICB0ZWFtXG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VVcmxcbiAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZUNyb25cbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSdW5FcG9jaFNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY29udGFjdHMge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWRPbkpvYlN1Y2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVkT25Kb2JEZXBsb3lcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVkT25Kb2JGYWlsdXJlVXNlckVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllZE9uSm9iRmFpbHVyZVBsYXRmb3JtRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudHMge1xuICAgICAgICAgICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICAgIGpvYlB5dGhvblZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25zKHBhZ2VOdW1iZXI6IDEsIHBhZ2VTaXplOiAxMCwgb3JkZXI6IHsgcHJvcGVydHk6IFwic3RhcnRUaW1lXCIsIGRpcmVjdGlvbjogREVTQyB9KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dzVXJsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkQnlcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdG90YWxQYWdlc1xuICAgICAgICAgICAgICAgICAgdG90YWxJdGVtc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IHRoaXMuX2NyZWF0ZVRlYW1Kb2JOYW1lRmlsdGVyKHRlYW1OYW1lLCBqb2JOYW1lKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgocmVzcG9uc2U6IEFwb2xsb1F1ZXJ5UmVzdWx0PERhdGFKb2JQYWdlPikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNvbGxlY3Rpb25zVXRpbC5pc0FycmF5KHJlc3BvbnNlPy5kYXRhPy5jb250ZW50KSB8fCByZXNwb25zZS5kYXRhLmNvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhLmNvbnRlbnRbMF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0Sm9iRGV0YWlscyh0ZWFtTmFtZTogc3RyaW5nLCBqb2JOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERhdGFKb2JEZXRhaWxzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PERhdGFKb2JEZXRhaWxzPihgJHt0aGlzLl9yZXNvbHZlUGlwZWxpbmVzU2VydmljZVVybCgpfS9kYXRhLWpvYnMvZm9yLXRlYW0vJHt0ZWFtTmFtZX0vam9icy8ke2pvYk5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlSm9iKHRlYW1OYW1lOiBzdHJpbmcsIGpvYk5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8RGF0YUpvYkRldGFpbHM+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoYCR7dGhpcy5fcmVzb2x2ZVBpcGVsaW5lc1NlcnZpY2VVcmwoKX0vZGF0YS1qb2JzL2Zvci10ZWFtLyR7dGVhbU5hbWV9L2pvYnMvJHtqb2JOYW1lfWApO1xuICAgIH1cblxuICAgIGRvd25sb2FkRmlsZSh0ZWFtTmFtZTogc3RyaW5nLCBqb2JOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEJsb2I+IHtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICAgICAgaHR0cEhlYWRlcnMuYXBwZW5kKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5fcmVzb2x2ZVBpcGVsaW5lc1NlcnZpY2VVcmwoKX0vZGF0YS1qb2JzL2Zvci10ZWFtLyR7dGVhbU5hbWV9L2pvYnMvJHtqb2JOYW1lfS9rZXl0YWJgLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiBodHRwSGVhZGVycyxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEpvYkV4ZWN1dGlvbnModGVhbU5hbWU6IHN0cmluZywgam9iTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxEYXRhSm9iRXhlY3V0aW9uRGV0YWlsc1tdPjtcbiAgICBnZXRKb2JFeGVjdXRpb25zKFxuICAgICAgICB0ZWFtTmFtZTogc3RyaW5nLFxuICAgICAgICBqb2JOYW1lOiBzdHJpbmcsXG4gICAgICAgIGZvcmNlR3JhcGhRTDogYm9vbGVhbixcbiAgICAgICAgZmlsdGVyPzogRGF0YUpvYkV4ZWN1dGlvbkZpbHRlcixcbiAgICAgICAgb3JkZXI/OiBEYXRhSm9iRXhlY3V0aW9uT3JkZXIsXG4gICAgICAgIHBhZ2VOdW1iZXI/OiBudW1iZXIsXG4gICAgICAgIHBhZ2VTaXplPzogbnVtYmVyXG4gICAgKTogT2JzZXJ2YWJsZTxEYXRhSm9iRXhlY3V0aW9uc1BhZ2U+O1xuICAgIGdldEpvYkV4ZWN1dGlvbnMoXG4gICAgICAgIHRlYW1OYW1lOiBzdHJpbmcsXG4gICAgICAgIGpvYk5hbWU6IHN0cmluZyxcbiAgICAgICAgZm9yY2VHcmFwaFFMID0gZmFsc2UsXG4gICAgICAgIGZpbHRlcjogRGF0YUpvYkV4ZWN1dGlvbkZpbHRlciA9IG51bGwsXG4gICAgICAgIG9yZGVyOiBEYXRhSm9iRXhlY3V0aW9uT3JkZXIgPSBudWxsLFxuICAgICAgICBwYWdlTnVtYmVyOiBudW1iZXIgPSBudWxsLFxuICAgICAgICBwYWdlU2l6ZTogbnVtYmVyID0gbnVsbFxuICAgICk6IE9ic2VydmFibGU8RGF0YUpvYkV4ZWN1dGlvbkRldGFpbHNbXT4gfCBPYnNlcnZhYmxlPERhdGFKb2JFeGVjdXRpb25zUGFnZT4ge1xuICAgICAgICBpZiAoIWZvcmNlR3JhcGhRTCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8RGF0YUpvYkV4ZWN1dGlvbkRldGFpbHNbXT4oXG4gICAgICAgICAgICAgICAgYCR7dGhpcy5fcmVzb2x2ZVBpcGVsaW5lc1NlcnZpY2VVcmwoKX0vZGF0YS1qb2JzL2Zvci10ZWFtLyR7dGVhbU5hbWV9L2pvYnMvJHtqb2JOYW1lfS9leGVjdXRpb25zYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXBhcmVkRmlsdGVyID0geyAuLi4oZmlsdGVyID8/IHt9KSB9O1xuXG4gICAgICAgIGlmIChqb2JOYW1lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChDb2xsZWN0aW9uc1V0aWwuaXNBcnJheShwcmVwYXJlZEZpbHRlci5qb2JOYW1lSW4pKSB7XG4gICAgICAgICAgICAgICAgcHJlcGFyZWRGaWx0ZXIuam9iTmFtZUluLnB1c2goam9iTmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXBhcmVkRmlsdGVyLmpvYk5hbWVJbiA9IFtqb2JOYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFKb2JzQmFzZVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRFeGVjdXRpb25zKFxuICAgICAgICAgICAgICAgIHRlYW1OYW1lLFxuICAgICAgICAgICAgICAgIGBxdWVyeSBqb2JzUXVlcnkoJHBhZ2VOdW1iZXI6IEludCwgJHBhZ2VTaXplOiBJbnQsICRmaWx0ZXI6IERhdGFKb2JFeGVjdXRpb25GaWx0ZXIsICRvcmRlcjogRGF0YUpvYkV4ZWN1dGlvbk9yZGVyKVxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZXhlY3V0aW9ucyhwYWdlTnVtYmVyOiAkcGFnZU51bWJlciwgcGFnZVNpemU6ICRwYWdlU2l6ZSwgZmlsdGVyOiAkZmlsdGVyLCBvcmRlcjogJG9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50IHtcbiAgICAgICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgICAgICAgICBqb2JOYW1lXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c1xuICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICAgICAgICBzdGFydGVkQnlcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICBvcElkXG4gICAgICAgICAgICAgICAgICAgIGxvZ3NVcmxcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudCB7XG4gICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICAgIGpvYlZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgICBkZXBsb3llZERhdGVcbiAgICAgICAgICAgICAgICAgICAgICBkZXBsb3llZEJ5XG4gICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNwdUxpbWl0XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHVSZXF1ZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlMaW1pdFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UmVxdWVzdFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZUNyb25cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgdmRrVmVyc2lvblxuICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgIGpvYlB5dGhvblZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdG90YWxQYWdlc1xuICAgICAgICAgICAgICAgICAgdG90YWxJdGVtc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyID8/IDEsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiBwYWdlU2l6ZSA/PyA1MDAsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcjogcHJlcGFyZWRGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyOiBvcmRlciA/PyBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUobWFwKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuZGF0YSkpO1xuICAgIH1cblxuICAgIGdldEpvYkV4ZWN1dGlvbih0ZWFtTmFtZTogc3RyaW5nLCBqb2JOYW1lOiBzdHJpbmcsIGV4ZWN1dGlvbklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERhdGFKb2JFeGVjdXRpb25EZXRhaWxzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PERhdGFKb2JFeGVjdXRpb25EZXRhaWxzPihcbiAgICAgICAgICAgIGAke3RoaXMuX3Jlc29sdmVQaXBlbGluZXNTZXJ2aWNlVXJsKCl9L2RhdGEtam9icy9mb3ItdGVhbS8ke3RlYW1OYW1lfS9qb2JzLyR7am9iTmFtZX0vZXhlY3V0aW9ucy8ke2V4ZWN1dGlvbklkfWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRKb2JEZXBsb3ltZW50cyh0ZWFtTmFtZTogc3RyaW5nLCBqb2JOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERhdGFKb2JEZXBsb3ltZW50RGV0YWlsc1tdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PERhdGFKb2JEZXBsb3ltZW50RGV0YWlsc1tdPihcbiAgICAgICAgICAgIGAke3RoaXMuX3Jlc29sdmVQaXBlbGluZXNTZXJ2aWNlVXJsKCl9L2RhdGEtam9icy9mb3ItdGVhbS8ke3RlYW1OYW1lfS9qb2JzLyR7am9iTmFtZX0vZGVwbG95bWVudHNgXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YUpvYlN0YXR1cyhcbiAgICAgICAgdGVhbU5hbWU6IHN0cmluZyxcbiAgICAgICAgam9iTmFtZTogc3RyaW5nLFxuICAgICAgICBkZXBsb3ltZW50SWQ6IHN0cmluZyxcbiAgICAgICAgZGF0YUpvYkVuYWJsZWQ6IGJvb2xlYW5cbiAgICApOiBPYnNlcnZhYmxlPHsgZW5hYmxlZDogYm9vbGVhbiB9PiB7XG4gICAgICAgIGNvbnN0IGRlcGxveW1lbnRTdGF0dXMgPSB7IGVuYWJsZWQ6IGRhdGFKb2JFbmFibGVkIH07XG5cbiAgICAgICAgaWYgKCFkZXBsb3ltZW50SWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdGF0dXMgdXBkYXRlIHdpbGwgYmUgcHJvY2Vzc2VkIHdpdGggZGVmYXVsdCBkZXBsb3ltZW50SWRgKTtcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZCA9ICdkZWZhdWx0JztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2g8eyBlbmFibGVkOiBib29sZWFuIH0+KFxuICAgICAgICAgICAgYCR7dGhpcy5fcmVzb2x2ZVBpcGVsaW5lc1NlcnZpY2VVcmwoKX0vZGF0YS1qb2JzL2Zvci10ZWFtLyR7dGVhbU5hbWV9L2pvYnMvJHtqb2JOYW1lfS9kZXBsb3ltZW50cy8ke2RlcGxveW1lbnRJZH1gLFxuICAgICAgICAgICAgZGVwbG95bWVudFN0YXR1c1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHVwZGF0ZURhdGFKb2IodGVhbU5hbWU6IHN0cmluZywgam9iTmFtZTogc3RyaW5nLCBkYXRhSm9iOiBEYXRhSm9iRGV0YWlscyk6IE9ic2VydmFibGU8RGF0YUpvYkRldGFpbHM+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8RGF0YUpvYkRldGFpbHM+KFxuICAgICAgICAgICAgYCR7dGhpcy5fcmVzb2x2ZVBpcGVsaW5lc1NlcnZpY2VVcmwoKX0vZGF0YS1qb2JzL2Zvci10ZWFtLyR7dGVhbU5hbWV9L2pvYnMvJHtqb2JOYW1lfWAsXG4gICAgICAgICAgICBkYXRhSm9iXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZXhlY3V0ZURhdGFKb2IodGVhbU5hbWU6IHN0cmluZywgam9iTmFtZTogc3RyaW5nLCBkZXBsb3ltZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDx1bmRlZmluZWQ+KFxuICAgICAgICAgICAgYCR7dGhpcy5fcmVzb2x2ZVBpcGVsaW5lc1NlcnZpY2VVcmwoKX0vZGF0YS1qb2JzL2Zvci10ZWFtLyR7dGVhbU5hbWV9L2pvYnMvJHtqb2JOYW1lfS9kZXBsb3ltZW50cy8ke2RlcGxveW1lbnRJZH0vZXhlY3V0aW9uc2AsXG4gICAgICAgICAgICB7fVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNhbmNlbERhdGFKb2JFeGVjdXRpb24odGVhbU5hbWU6IHN0cmluZywgam9iTmFtZTogc3RyaW5nLCBleGVjdXRpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoXG4gICAgICAgICAgICBgJHt0aGlzLl9yZXNvbHZlUGlwZWxpbmVzU2VydmljZVVybCgpfS9kYXRhLWpvYnMvZm9yLXRlYW0vJHt0ZWFtTmFtZX0vam9icy8ke2pvYk5hbWV9L2V4ZWN1dGlvbnMvJHtleGVjdXRpb25JZH1gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzb2x2ZVBpcGVsaW5lc1NlcnZpY2VVcmwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVBpcGVsaW5lc0NvbmZpZz8ucmVzb3VyY2VTZXJ2ZXI/LmdldFVybCA/IHRoaXMuZGF0YVBpcGVsaW5lc0NvbmZpZy5yZXNvdXJjZVNlcnZlci5nZXRVcmwoKSA6ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NyZWF0ZVRlYW1Kb2JOYW1lRmlsdGVyKHRlYW1OYW1lOiBzdHJpbmcsIGpvYk5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgeyBwcm9wZXJ0eTogJ2NvbmZpZy50ZWFtJywgcGF0dGVybjogdGVhbU5hbWUsIHNvcnQ6IG51bGwgfSxcbiAgICAgICAgICAgIHsgcHJvcGVydHk6ICdqb2JOYW1lJywgcGF0dGVybjogam9iTmFtZSwgc29ydDogbnVsbCB9XG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGVNb2R1bGVDb25maWcoZGF0YVBpcGVsaW5lc0NvbmZpZzogRGF0YVBpcGVsaW5lc0NvbmZpZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWRhdGFQaXBlbGluZXNDb25maWc/LmRlZmF1bHRPd25lclRlYW1OYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoTUlTU0lOR19ERUZBVUxUX1RFQU1fTUVTU0FHRSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YVBpcGVsaW5lc0NvbmZpZz8uZGVmYXVsdE93bmVyVGVhbU5hbWUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFJFU0VSVkVEX0RFRkFVTFRfVEVBTV9OQU1FX01FU1NBR0UpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19