UNPKG

@harbor/ui

Version:

Harbor shared UI components based on Clarity and Angular6

181 lines (180 loc) 17.2 kB
/** * @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