@harbor/ui
Version:
Harbor shared UI components based on Clarity and Angular6
181 lines (180 loc) • 17.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { RequestQueryParams } from './RequestQueryParams';
import { Injectable, Inject } from '@angular/core';
import { Http } from '@angular/http';
import { SERVICE_CONFIG } from '../service.config';
import { buildHttpRequestOptions, HTTP_JSON_OPTIONS } from '../utils';
/**
* Define service methods for handling the repository related things.
* Loose couple with project module.
*
* *
* @abstract
* class RepositoryService
* @abstract
*/
export class RepositoryService {
}
if (false) {
/**
* List all the repositories in the specified project.
* Specify the 'repositoryName' to only return the repositories which match the name pattern.
* If pagination needed, set the following parameters in queryParams:
* 'page': current page,
* 'page_size': page size.
*
* @abstract
* ** deprecated param {(number | string)} projectId
* ** deprecated param {string} repositoryName
* ** deprecated param {RequestQueryParams} [queryParams]
* returns {(Observable<Repository> | Promise<Repository> | Repository)}
*
* \@memberOf RepositoryService
* @abstract
* @param {?} projectId
* @param {?=} repositoryName
* @param {?=} queryParams
* @return {?}
*/
RepositoryService.prototype.getRepositories = function (projectId, repositoryName, queryParams) { };
/**
* Update description of specified repository.
*
* @abstract
* ** deprecated param {number | string} projectId
* ** deprecated param {string} repoName
* returns {(Observable<Repository> | Promise<Repository> | Repository)}
*
* \@memberOf RepositoryService
* @abstract
* @param {?} repoName
* @param {?} description
* @return {?}
*/
RepositoryService.prototype.updateRepositoryDescription = function (repoName, description) { };
/**
* DELETE the specified repository.
*
* @abstract
* ** deprecated param {string} repositoryName
* returns {(Observable<any> | Promise<any> | any)}
*
* \@memberOf RepositoryService
* @abstract
* @param {?} repositoryName
* @return {?}
*/
RepositoryService.prototype.deleteRepository = function (repositoryName) { };
}
/**
* Implement default service for repository.
*
* *
* class RepositoryDefaultService
* extends {RepositoryService}
*/
export class RepositoryDefaultService extends RepositoryService {
/**
* @param {?} http
* @param {?} config
*/
constructor(http, config) {
super();
this.http = http;
this.config = config;
}
/**
* @param {?} projectId
* @param {?=} repositoryName
* @param {?=} queryParams
* @return {?}
*/
getRepositories(projectId, repositoryName, queryParams) {
if (!projectId) {
return Promise.reject('Bad argument');
}
if (!queryParams) {
queryParams = new RequestQueryParams();
}
queryParams.set('project_id', '' + projectId);
if (repositoryName && repositoryName.trim() !== '') {
queryParams.set('q', repositoryName);
}
/** @type {?} */
let url = this.config.repositoryBaseEndpoint ? this.config.repositoryBaseEndpoint : '/api/repositories';
return this.http.get(url, buildHttpRequestOptions(queryParams)).toPromise()
.then(response => {
/** @type {?} */
let result = {
metadata: { xTotalCount: 0 },
data: []
};
if (response && response.headers) {
/** @type {?} */
let xHeader = response.headers.get('X-Total-Count');
if (xHeader) {
result.metadata.xTotalCount = parseInt(xHeader, 0);
}
}
result.data = /** @type {?} */ (response.json());
if (result.metadata.xTotalCount === 0) {
if (result.data && result.data.length > 0) {
result.metadata.xTotalCount = result.data.length;
}
}
return result;
})
.catch(error => Promise.reject(error));
}
/**
* @param {?} repositoryName
* @param {?} description
* @param {?=} queryParams
* @return {?}
*/
updateRepositoryDescription(repositoryName, description, queryParams) {
if (!queryParams) {
queryParams = new RequestQueryParams();
}
/** @type {?} */
let baseUrl = this.config.repositoryBaseEndpoint ? this.config.repositoryBaseEndpoint : '/api/repositories';
/** @type {?} */
let url = `${baseUrl}/${repositoryName}`;
return this.http.put(url, { 'description': description }, HTTP_JSON_OPTIONS).toPromise()
.then(response => response)
.catch(error => Promise.reject(error));
}
/**
* @param {?} repositoryName
* @return {?}
*/
deleteRepository(repositoryName) {
if (!repositoryName) {
return Promise.reject('Bad argument');
}
/** @type {?} */
let url = this.config.repositoryBaseEndpoint ? this.config.repositoryBaseEndpoint : '/api/repositories';
url = `${url}/${repositoryName}`;
return this.http.delete(url, HTTP_JSON_OPTIONS).toPromise()
.then(response => response)
.catch(error => { return Promise.reject(error); });
}
}
RepositoryDefaultService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
RepositoryDefaultService.ctorParameters = () => [
{ type: Http },
{ type: undefined, decorators: [{ type: Inject, args: [SERVICE_CONFIG,] }] }
];
if (false) {
/** @type {?} */
RepositoryDefaultService.prototype.http;
/** @type {?} */
RepositoryDefaultService.prototype.config;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3NpdG9yeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhhcmJvci91aS8iLCJzb3VyY2VzIjpbInNyYy9zZXJ2aWNlL3JlcG9zaXRvcnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUUsY0FBYyxFQUFrQixNQUFNLG1CQUFtQixDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7OztBQVV0RSxNQUFNO0NBeUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVVELE1BQU0sK0JBQWdDLFNBQVEsaUJBQWlCOzs7OztJQUMzRCxZQUNZLE1BQ3dCLE1BQXNCO1FBRXRELEtBQUssRUFBRSxDQUFDO1FBSEEsU0FBSSxHQUFKLElBQUk7UUFDb0IsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7S0FHekQ7Ozs7Ozs7SUFFTSxlQUFlLENBQUMsU0FBMEIsRUFBRSxjQUF1QixFQUFFLFdBQWdDO1FBRXhHLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDWixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDekM7UUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2QsV0FBVyxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztTQUMxQztRQUVELFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUM5QyxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUss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QUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLEVBQUU7YUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDO2FBQzFCLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFFLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7OztZQTNFN0QsVUFBVTs7OztZQTlERixJQUFJOzRDQWtFSixNQUFNLFNBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgUmVxdWVzdFF1ZXJ5UGFyYW1zIH0gZnJvbSAnLi9SZXF1ZXN0UXVlcnlQYXJhbXMnO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgUmVwb3NpdG9yeUl0ZW0gfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSHR0cCB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xuaW1wb3J0IHsgU0VSVklDRV9DT05GSUcsIElTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vc2VydmljZS5jb25maWcnO1xuaW1wb3J0IHsgYnVpbGRIdHRwUmVxdWVzdE9wdGlvbnMsIEhUVFBfSlNPTl9PUFRJT05TIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG4vKipcbiAqIERlZmluZSBzZXJ2aWNlIG1ldGhvZHMgZm9yIGhhbmRsaW5nIHRoZSByZXBvc2l0b3J5IHJlbGF0ZWQgdGhpbmdzLlxuICogTG9vc2UgY291cGxlIHdpdGggcHJvamVjdCBtb2R1bGUuXG4gKlxuICoqXG4gKiBAYWJzdHJhY3RcbiAqIGNsYXNzIFJlcG9zaXRvcnlTZXJ2aWNlXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZXBvc2l0b3J5U2VydmljZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgdGhlIHJlcG9zaXRvcmllcyBpbiB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICogU3BlY2lmeSB0aGUgJ3JlcG9zaXRvcnlOYW1lJyB0byBvbmx5IHJldHVybiB0aGUgcmVwb3NpdG9yaWVzIHdoaWNoIG1hdGNoIHRoZSBuYW1lIHBhdHRlcm4uXG4gICAgICogSWYgcGFnaW5hdGlvbiBuZWVkZWQsIHNldCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaW4gcXVlcnlQYXJhbXM6XG4gICAgICogICAncGFnZSc6IGN1cnJlbnQgcGFnZSxcbiAgICAgKiAgICdwYWdlX3NpemUnOiBwYWdlIHNpemUuXG4gICAgICpcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiAgKiogZGVwcmVjYXRlZCBwYXJhbSB7KG51bWJlciB8IHN0cmluZyl9IHByb2plY3RJZFxuICAgICAqICAqKiBkZXByZWNhdGVkIHBhcmFtIHtzdHJpbmd9IHJlcG9zaXRvcnlOYW1lXG4gICAgICogICoqIGRlcHJlY2F0ZWQgcGFyYW0ge1JlcXVlc3RRdWVyeVBhcmFtc30gW3F1ZXJ5UGFyYW1zXVxuICAgICAqIHJldHVybnMgeyhPYnNlcnZhYmxlPFJlcG9zaXRvcnk+IHwgUHJvbWlzZTxSZXBvc2l0b3J5PiB8IFJlcG9zaXRvcnkpfVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJlcG9zaXRvcnlTZXJ2aWNlXG4gICAgICovXG4gICAgYWJzdHJhY3QgZ2V0UmVwb3NpdG9yaWVzKHByb2plY3RJZDogbnVtYmVyIHwgc3RyaW5nLCByZXBvc2l0b3J5TmFtZT86IHN0cmluZywgcXVlcnlQYXJhbXM/OiBSZXF1ZXN0UXVlcnlQYXJhbXMpOlxuICAgIE9ic2VydmFibGU8UmVwb3NpdG9yeT4gfCBQcm9taXNlPFJlcG9zaXRvcnk+IHwgUmVwb3NpdG9yeTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBkZXNjcmlwdGlvbiBvZiBzcGVjaWZpZWQgcmVwb3NpdG9yeS5cbiAgICAgKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqICAqKiBkZXByZWNhdGVkIHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IHByb2plY3RJZFxuICAgICAqICAqKiBkZXByZWNhdGVkIHBhcmFtIHtzdHJpbmd9IHJlcG9OYW1lXG4gICAgICogcmV0dXJucyB7KE9ic2VydmFibGU8UmVwb3NpdG9yeT4gfCBQcm9taXNlPFJlcG9zaXRvcnk+IHwgUmVwb3NpdG9yeSl9XG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUmVwb3NpdG9yeVNlcnZpY2VcbiAgICAgKi9cbiAgICBhYnN0cmFjdCB1cGRhdGVSZXBvc2l0b3J5RGVzY3JpcHRpb24ocmVwb05hbWU6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB8IFByb21pc2U8YW55PiB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIERFTEVURSB0aGUgc3BlY2lmaWVkIHJlcG9zaXRvcnkuXG4gICAgICpcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiAgKiogZGVwcmVjYXRlZCBwYXJhbSB7c3RyaW5nfSByZXBvc2l0b3J5TmFtZVxuICAgICAqIHJldHVybnMgeyhPYnNlcnZhYmxlPGFueT4gfCBQcm9taXNlPGFueT4gfCBhbnkpfVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJlcG9zaXRvcnlTZXJ2aWNlXG4gICAgICovXG4gICAgYWJzdHJhY3QgZGVsZXRlUmVwb3NpdG9yeShyZXBvc2l0b3J5TmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHwgUHJvbWlzZTxhbnk+IHwgYW55O1xufVxuXG4vKipcbiAqIEltcGxlbWVudCBkZWZhdWx0IHNlcnZpY2UgZm9yIHJlcG9zaXRvcnkuXG4gKlxuICoqXG4gKiBjbGFzcyBSZXBvc2l0b3J5RGVmYXVsdFNlcnZpY2VcbiAqIGV4dGVuZHMge1JlcG9zaXRvcnlTZXJ2aWNlfVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3NpdG9yeURlZmF1bHRTZXJ2aWNlIGV4dGVuZHMgUmVwb3NpdG9yeVNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGh0dHA6IEh0dHAsXG4gICAgICAgIEBJbmplY3QoU0VSVklDRV9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBJU2VydmljZUNvbmZpZ1xuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZXBvc2l0b3JpZXMocHJvamVjdElkOiBudW1iZXIgfCBzdHJpbmcsIHJlcG9zaXRvcnlOYW1lPzogc3RyaW5nLCBxdWVyeVBhcmFtcz86IFJlcXVlc3RRdWVyeVBhcmFtcyk6XG4gICAgT2JzZXJ2YWJsZTxSZXBvc2l0b3J5PiB8IFByb21pc2U8UmVwb3NpdG9yeT4gfCBSZXBvc2l0b3J5IHtcbiAgICAgICAgaWYgKCFwcm9qZWN0SWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnQmFkIGFyZ3VtZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtcyA9IG5ldyBSZXF1ZXN0UXVlcnlQYXJhbXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXJ5UGFyYW1zLnNldCgncHJvamVjdF9pZCcsICcnICsgcHJvamVjdElkKTtcbiAgICAgICAgaWYgKHJlcG9zaXRvcnlOYW1lICYmIHJlcG9zaXRvcnlOYW1lLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnNldCgncScsIHJlcG9zaXRvcnlOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuY29uZmlnLnJlcG9zaXRvcnlCYXNlRW5kcG9pbnQgPyB0aGlzLmNvbmZpZy5yZXBvc2l0b3J5QmFzZUVuZHBvaW50IDogJy9hcGkvcmVwb3NpdG9yaWVzJztcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCBidWlsZEh0dHBSZXF1ZXN0T3B0aW9ucyhxdWVyeVBhcmFtcykpLnRvUHJvbWlzZSgpXG4gICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDogUmVwb3NpdG9yeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IHsgeFRvdGFsQ291bnQ6IDAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogW11cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHhIZWFkZXI6IHN0cmluZyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdYLVRvdGFsLUNvdW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4SGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubWV0YWRhdGEueFRvdGFsQ291bnQgPSBwYXJzZUludCh4SGVhZGVyLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gcmVzcG9uc2UuanNvbigpIGFzIFJlcG9zaXRvcnlJdGVtW107XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lm1ldGFkYXRhLnhUb3RhbENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZGF0YSAmJiByZXN1bHQuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubWV0YWRhdGEueFRvdGFsQ291bnQgPSByZXN1bHQuZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVSZXBvc2l0b3J5RGVzY3JpcHRpb24ocmVwb3NpdG9yeU5hbWU6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAgICAgIHF1ZXJ5UGFyYW1zPzogUmVxdWVzdFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxhbnk+IHwgUHJvbWlzZTxhbnk+IHwgYW55IHtcblxuICAgICAgICBpZiAoIXF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtcyA9IG5ldyBSZXF1ZXN0UXVlcnlQYXJhbXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiYXNlVXJsOiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5yZXBvc2l0b3J5QmFzZUVuZHBvaW50ID8gdGhpcy5jb25maWcucmVwb3NpdG9yeUJhc2VFbmRwb2ludCA6ICcvYXBpL3JlcG9zaXRvcmllcyc7XG4gICAgICAgIGxldCB1cmwgPSBgJHtiYXNlVXJsfS8ke3JlcG9zaXRvcnlOYW1lfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KHVybCwgeydkZXNjcmlwdGlvbic6IGRlc2NyaXB0aW9uIH0sIEhUVFBfSlNPTl9PUFRJT05TKS50b1Byb21pc2UoKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gICAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlUmVwb3NpdG9yeShyZXBvc2l0b3J5TmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHwgUHJvbWlzZTxhbnk+IHwgYW55IHtcbiAgICAgICAgaWYgKCFyZXBvc2l0b3J5TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdCYWQgYXJndW1lbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5yZXBvc2l0b3J5QmFzZUVuZHBvaW50ID8gdGhpcy5jb25maWcucmVwb3NpdG9yeUJhc2VFbmRwb2ludCA6ICcvYXBpL3JlcG9zaXRvcmllcyc7XG4gICAgICAgIHVybCA9IGAke3VybH0vJHtyZXBvc2l0b3J5TmFtZX1gO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKHVybCwgSFRUUF9KU09OX09QVElPTlMpLnRvUHJvbWlzZSgpXG4gICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTsgfSk7XG4gICAgfVxufVxuIl19