UNPKG

@harbor/ui

Version:

Harbor shared UI components based on Clarity and Angular6

286 lines (285 loc) 23.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Injectable, Inject } from "@angular/core"; import { Http } from "@angular/http"; import { SERVICE_CONFIG } from "../service.config"; import { buildHttpRequestOptions, HTTP_JSON_OPTIONS, HTTP_GET_OPTIONS } from "../utils"; import { RequestQueryParams } from "./RequestQueryParams"; /** * For getting tag signatures. * This is temporary, will be removed in future. * * * * class VerifiedSignature */ export class VerifiedSignature { } if (false) { /** @type {?} */ VerifiedSignature.prototype.tag; /** @type {?} */ VerifiedSignature.prototype.hashes; } /** * Define the service methods to handle the repository tag related things. * * * * @abstract * class TagService * @abstract */ export class TagService { } if (false) { /** * Get all the tags under the specified repository. * NOTES: If the Notary is enabled, the signatures should be included in the returned data. * * @abstract * ** deprecated param {string} repositoryName * ** deprecated param {RequestQueryParams} [queryParams] * returns {(Observable<Tag[]> | Promise<Tag[]> | Tag[])} * * \@memberOf TagService * @abstract * @param {?} repositoryName * @param {?=} queryParams * @return {?} */ TagService.prototype.getTags = function (repositoryName, queryParams) { }; /** * Delete the specified tag. * * @abstract * ** deprecated param {string} repositoryName * ** deprecated param {string} tag * returns {(Observable<any> | any)} * * \@memberOf TagService * @abstract * @param {?} repositoryName * @param {?} tag * @return {?} */ TagService.prototype.deleteTag = function (repositoryName, tag) { }; /** * Get the specified tag. * * @abstract * ** deprecated param {string} repositoryName * ** deprecated param {string} tag * returns {(Observable<Tag> | Promise<Tag> | Tag)} * * \@memberOf TagService * @abstract * @param {?} repositoryName * @param {?} tag * @param {?=} queryParams * @return {?} */ TagService.prototype.getTag = function (repositoryName, tag, queryParams) { }; /** * @abstract * @param {?} repoName * @param {?} tagName * @param {?} labelId * @return {?} */ TagService.prototype.addLabelToImages = function (repoName, tagName, labelId) { }; /** * @abstract * @param {?} repoName * @param {?} tagName * @param {?} labelId * @return {?} */ TagService.prototype.deleteLabelToImages = function (repoName, tagName, labelId) { }; /** * Get manifest of tag under the specified repository. * * @abstract * returns {(Observable<Manifest> | Promise<Manifest> | Manifest)} * * \@memberOf TagService * @abstract * @param {?} repositoryName * @param {?} tag * @return {?} */ TagService.prototype.getManifest = function (repositoryName, tag) { }; } /** * Implement default service for tag. * * * * class TagDefaultService * extends {TagService} */ export class TagDefaultService extends TagService { /** * @param {?} http * @param {?} config */ constructor(http, config) { super(); this.http = http; this.config = config; this._baseUrl = this.config.repositoryBaseEndpoint ? this.config.repositoryBaseEndpoint : "/api/repositories"; this._labelUrl = this.config.labelEndpoint ? this.config.labelEndpoint : "/api/labels"; } /** * @param {?} repositoryName * @param {?=} queryParams * @return {?} */ _getTags(repositoryName, queryParams) { if (!queryParams) { queryParams = new RequestQueryParams(); } queryParams.set("detail", "1"); /** @type {?} */ let url = `${this._baseUrl}/${repositoryName}/tags`; return this.http .get(url, buildHttpRequestOptions(queryParams)) .toPromise() .then(response => /** @type {?} */ (response.json())) .catch(error => Promise.reject(error)); } /** * @param {?} repositoryName * @return {?} */ _getSignatures(repositoryName) { /** @type {?} */ let url = `${this._baseUrl}/${repositoryName}/signatures`; return this.http .get(url, HTTP_GET_OPTIONS) .toPromise() .then(response => /** @type {?} */ (response.json())) .catch(error => Promise.reject(error)); } /** * @param {?} repositoryName * @param {?=} queryParams * @return {?} */ getTags(repositoryName, queryParams) { if (!repositoryName) { return Promise.reject("Bad argument"); } return this._getTags(repositoryName, queryParams); } /** * @param {?} repositoryName * @param {?} tag * @return {?} */ deleteTag(repositoryName, tag) { if (!repositoryName || !tag) { return Promise.reject("Bad argument"); } /** @type {?} */ let url = `${this._baseUrl}/${repositoryName}/tags/${tag}`; return this.http .delete(url, HTTP_JSON_OPTIONS) .toPromise() .then(response => response) .catch(error => Promise.reject(error)); } /** * @param {?} repositoryName * @param {?} tag * @param {?=} queryParams * @return {?} */ getTag(repositoryName, tag, queryParams) { if (!repositoryName || !tag) { return Promise.reject("Bad argument"); } /** @type {?} */ let url = `${this._baseUrl}/${repositoryName}/tags/${tag}`; return this.http .get(url, HTTP_GET_OPTIONS) .toPromise() .then(response => /** @type {?} */ (response.json())) .catch(error => Promise.reject(error)); } /** * @param {?} repoName * @param {?} tagName * @param {?} labelId * @return {?} */ addLabelToImages(repoName, tagName, labelId) { if (!labelId || !tagName || !repoName) { return Promise.reject("Invalid parameters."); } /** @type {?} */ let _addLabelToImageUrl = `${this._baseUrl}/${repoName}/tags/${tagName}/labels`; return this.http .post(_addLabelToImageUrl, { id: labelId }, HTTP_JSON_OPTIONS) .toPromise() .then(response => response.status) .catch(error => Promise.reject(error)); } /** * @param {?} repoName * @param {?} tagName * @param {?} labelId * @return {?} */ deleteLabelToImages(repoName, tagName, labelId) { if (!labelId || !tagName || !repoName) { return Promise.reject("Invalid parameters."); } /** @type {?} */ let _addLabelToImageUrl = `${this._baseUrl}/${repoName}/tags/${tagName}/labels/${labelId}`; return this.http .delete(_addLabelToImageUrl) .toPromise() .then(response => response.status) .catch(error => Promise.reject(error)); } /** * @param {?} repositoryName * @param {?} tag * @return {?} */ getManifest(repositoryName, tag) { if (!repositoryName || !tag) { return Promise.reject("Bad argument"); } /** @type {?} */ let url = `${this._baseUrl}/${repositoryName}/tags/${tag}/manifest`; return this.http .get(url, HTTP_GET_OPTIONS) .toPromise() .then(response => /** @type {?} */ (response.json())) .catch(error => Promise.reject(error)); } } TagDefaultService.decorators = [ { type: Injectable } ]; /** @nocollapse */ TagDefaultService.ctorParameters = () => [ { type: Http }, { type: undefined, decorators: [{ type: Inject, args: [SERVICE_CONFIG,] }] } ]; if (false) { /** @type {?} */ TagDefaultService.prototype._baseUrl; /** @type {?} */ TagDefaultService.prototype._labelUrl; /** @type {?} */ TagDefaultService.prototype.http; /** @type {?} */ TagDefaultService.prototype.config; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaGFyYm9yL3VpLyIsInNvdXJjZXMiOlsic3JjL3NlcnZpY2UvdGFnLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHckMsT0FBTyxFQUFFLGNBQWMsRUFBa0IsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDakIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7O0FBVTFELE1BQU07Q0FLTDs7Ozs7Ozs7Ozs7Ozs7O0FBU0QsTUFBTTtDQXVFTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVRCxNQUFNLHdCQUF5QixTQUFRLFVBQVU7Ozs7O0lBRy9DLFlBQ1UsTUFDd0IsTUFBc0I7UUFFdEQsS0FBSyxFQUFFLENBQUM7UUFIQSxTQUFJLEdBQUosSUFBSTtRQUNvQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUd0RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCO1lBQ2hELENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtZQUNwQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWE7WUFDeEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYTtZQUMzQixDQUFDLENBQUMsYUFBYSxDQUFDO0tBQ25COzs7Ozs7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Q0FBQzs7Ozs7OztJQUdwQyxXQUFXLENBQ2hCLGNBQXNCLEVBQ3RCLEdBQVc7UUFFWCxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzNCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN2Qzs7UUFDRCxJQUFJLEdBQUcsR0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksY0FBYyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQzVFLE9BQU8sSUFBSSxDQUFDLElBQUk7YUFDYixHQUFHLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDO2FBQzFCLFNBQVMsRUFBRTthQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxtQkFBQyxRQUFRLENBQUMsSUFBSSxFQUFjLENBQUEsQ0FBQzthQUM3QyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Ozs7WUEzSTVDLFVBQVU7Ozs7WUFqSEYsSUFBSTs0Q0F1SFIsTUFBTSxTQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgSHR0cCB9IGZyb20gXCJAYW5ndWxhci9odHRwXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgU0VSVklDRV9DT05GSUcsIElTZXJ2aWNlQ29uZmlnIH0gZnJvbSBcIi4uL3NlcnZpY2UuY29uZmlnXCI7XG5pbXBvcnQge1xuICBidWlsZEh0dHBSZXF1ZXN0T3B0aW9ucyxcbiAgSFRUUF9KU09OX09QVElPTlMsXG4gIEhUVFBfR0VUX09QVElPTlNcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBSZXF1ZXN0UXVlcnlQYXJhbXMgfSBmcm9tIFwiLi9SZXF1ZXN0UXVlcnlQYXJhbXNcIjtcbmltcG9ydCB7IFRhZywgTWFuaWZlc3QgfSBmcm9tIFwiLi9pbnRlcmZhY2VcIjtcblxuLyoqXG4gKiBGb3IgZ2V0dGluZyB0YWcgc2lnbmF0dXJlcy5cbiAqIFRoaXMgaXMgdGVtcG9yYXJ5LCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlLlxuICpcbiAqKlxuICogY2xhc3MgVmVyaWZpZWRTaWduYXR1cmVcbiAqL1xuZXhwb3J0IGNsYXNzIFZlcmlmaWVkU2lnbmF0dXJlIHtcbiAgdGFnOiBzdHJpbmc7XG4gIGhhc2hlczoge1xuICAgIHNoYTI1Njogc3RyaW5nO1xuICB9O1xufVxuXG4vKipcbiAqIERlZmluZSB0aGUgc2VydmljZSBtZXRob2RzIHRvIGhhbmRsZSB0aGUgcmVwb3NpdG9yeSB0YWcgcmVsYXRlZCB0aGluZ3MuXG4gKlxuICoqXG4gKiBAYWJzdHJhY3RcbiAqIGNsYXNzIFRhZ1NlcnZpY2VcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRhZ1NlcnZpY2Uge1xuICAvKipcbiAgICogR2V0IGFsbCB0aGUgdGFncyB1bmRlciB0aGUgc3BlY2lmaWVkIHJlcG9zaXRvcnkuXG4gICAqIE5PVEVTOiBJZiB0aGUgTm90YXJ5IGlzIGVuYWJsZWQsIHRoZSBzaWduYXR1cmVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqICAqKiBkZXByZWNhdGVkIHBhcmFtIHtzdHJpbmd9IHJlcG9zaXRvcnlOYW1lXG4gICAqICAqKiBkZXByZWNhdGVkIHBhcmFtIHtSZXF1ZXN0UXVlcnlQYXJhbXN9IFtxdWVyeVBhcmFtc11cbiAgICogcmV0dXJucyB7KE9ic2VydmFibGU8VGFnW10+IHwgUHJvbWlzZTxUYWdbXT4gfCBUYWdbXSl9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBUYWdTZXJ2aWNlXG4gICAqL1xuICBhYnN0cmFjdCBnZXRUYWdzKFxuICAgIHJlcG9zaXRvcnlOYW1lOiBzdHJpbmcsXG4gICAgcXVlcnlQYXJhbXM/OiBSZXF1ZXN0UXVlcnlQYXJhbXNcbiAgKTogT2JzZXJ2YWJsZTxUYWdbXT4gfCBQcm9taXNlPFRhZ1tdPiB8IFRhZ1tdO1xuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIHNwZWNpZmllZCB0YWcuXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKiAgKiogZGVwcmVjYXRlZCBwYXJhbSB7c3RyaW5nfSByZXBvc2l0b3J5TmFtZVxuICAgKiAgKiogZGVwcmVjYXRlZCBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICogcmV0dXJucyB7KE9ic2VydmFibGU8YW55PiB8IGFueSl9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBUYWdTZXJ2aWNlXG4gICAqL1xuICBhYnN0cmFjdCBkZWxldGVUYWcoXG4gICAgcmVwb3NpdG9yeU5hbWU6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGFueT4gfCBQcm9taXNlPGFueT4gfCBhbnk7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3BlY2lmaWVkIHRhZy5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqICAqKiBkZXByZWNhdGVkIHBhcmFtIHtzdHJpbmd9IHJlcG9zaXRvcnlOYW1lXG4gICAqICAqKiBkZXByZWNhdGVkIHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiByZXR1cm5zIHsoT2JzZXJ2YWJsZTxUYWc+IHwgUHJvbWlzZTxUYWc+IHwgVGFnKX1cbiAgICpcbiAgICogQG1lbWJlck9mIFRhZ1NlcnZpY2VcbiAgICovXG4gIGFic3RyYWN0IGdldFRhZyhcbiAgICByZXBvc2l0b3J5TmFtZTogc3RyaW5nLFxuICAgIHRhZzogc3RyaW5nLFxuICAgIHF1ZXJ5UGFyYW1zPzogUmVxdWVzdFF1ZXJ5UGFyYW1zXG4gICk6IE9ic2VydmFibGU8VGFnPiB8IFByb21pc2U8VGFnPiB8IFRhZztcblxuICBhYnN0cmFjdCBhZGRMYWJlbFRvSW1hZ2VzKFxuICAgIHJlcG9OYW1lOiBzdHJpbmcsXG4gICAgdGFnTmFtZTogc3RyaW5nLFxuICAgIGxhYmVsSWQ6IG51bWJlclxuICApOiBPYnNlcnZhYmxlPGFueT4gfCBQcm9taXNlPGFueT4gfCBhbnk7XG4gIGFic3RyYWN0IGRlbGV0ZUxhYmVsVG9JbWFnZXMoXG4gICAgcmVwb05hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxJZDogbnVtYmVyXG4gICk6IE9ic2VydmFibGU8YW55PiB8IFByb21pc2U8YW55PiB8IGFueTtcblxuICAvKipcbiAgICogR2V0IG1hbmlmZXN0IG9mIHRhZyB1bmRlciB0aGUgc3BlY2lmaWVkIHJlcG9zaXRvcnkuXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKiByZXR1cm5zIHsoT2JzZXJ2YWJsZTxNYW5pZmVzdD4gfCBQcm9taXNlPE1hbmlmZXN0PiB8IE1hbmlmZXN0KX1cbiAgICpcbiAgICogQG1lbWJlck9mIFRhZ1NlcnZpY2VcbiAgICovXG4gIGFic3RyYWN0IGdldE1hbmlmZXN0KFxuICAgIHJlcG9zaXRvcnlOYW1lOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxNYW5pZmVzdD4gfCBQcm9taXNlPE1hbmlmZXN0PiB8IE1hbmlmZXN0O1xufVxuXG4vKipcbiAqIEltcGxlbWVudCBkZWZhdWx0IHNlcnZpY2UgZm9yIHRhZy5cbiAqXG4gKipcbiAqIGNsYXNzIFRhZ0RlZmF1bHRTZXJ2aWNlXG4gKiBleHRlbmRzIHtUYWdTZXJ2aWNlfVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGFnRGVmYXVsdFNlcnZpY2UgZXh0ZW5kcyBUYWdTZXJ2aWNlIHtcbiAgX2Jhc2VVcmw6IHN0cmluZztcbiAgX2xhYmVsVXJsOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cCxcbiAgICBASW5qZWN0KFNFUlZJQ0VfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogSVNlcnZpY2VDb25maWdcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9iYXNlVXJsID0gdGhpcy5jb25maWcucmVwb3NpdG9yeUJhc2VFbmRwb2ludFxuICAgICAgPyB0aGlzLmNvbmZpZy5yZXBvc2l0b3J5QmFzZUVuZHBvaW50XG4gICAgICA6IFwiL2FwaS9yZXBvc2l0b3JpZXNcIjtcbiAgICB0aGlzLl9sYWJlbFVybCA9IHRoaXMuY29uZmlnLmxhYmVsRW5kcG9pbnRcbiAgICAgID8gdGhpcy5jb25maWcubGFiZWxFbmRwb2ludFxuICAgICAgOiBcIi9hcGkvbGFiZWxzXCI7XG4gIH1cblxuICAvLyBQcml2YXRlIG1ldGhvZHNcbiAgLy8gVGhlc2UgdHdvIG1ldGhvZHMgYXJlIHRlbXBvcmFyeSwgd2lsbCBiZSBkZWxldGVkIGluIGZ1dHVyZSBhZnRlciBBUEkgcmVmYWN0b3JlZFxuICBfZ2V0VGFncyhcbiAgICByZXBvc2l0b3J5TmFtZTogc3RyaW5nLFxuICAgIHF1ZXJ5UGFyYW1zPzogUmVxdWVzdFF1ZXJ5UGFyYW1zXG4gICk6IFByb21pc2U8VGFnW10+IHtcbiAgICBpZiAoIXF1ZXJ5UGFyYW1zKSB7XG4gICAgICBxdWVyeVBhcmFtcyA9IG5ldyBSZXF1ZXN0UXVlcnlQYXJhbXMoKTtcbiAgICB9XG5cbiAgICBxdWVyeVBhcmFtcy5zZXQoXCJkZXRhaWxcIiwgXCIxXCIpO1xuICAgIGxldCB1cmw6IHN0cmluZyA9IGAke3RoaXMuX2Jhc2VVcmx9LyR7cmVwb3NpdG9yeU5hbWV9L3RhZ3NgO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldCh1cmwsIGJ1aWxkSHR0cFJlcXVlc3RPcHRpb25zKHF1ZXJ5UGFyYW1zKSlcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpIGFzIFRhZ1tdKVxuICAgICAgLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gIH1cblxuICBfZ2V0U2lnbmF0dXJlcyhyZXBvc2l0b3J5TmFtZTogc3RyaW5nKTogUHJvbWlzZTxWZXJpZmllZFNpZ25hdHVyZVtdPiB7XG4gICAgbGV0IHVybDogc3RyaW5nID0gYCR7dGhpcy5fYmFzZVVybH0vJHtyZXBvc2l0b3J5TmFtZX0vc2lnbmF0dXJlc2A7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldCh1cmwsIEhUVFBfR0VUX09QVElPTlMpXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSBhcyBWZXJpZmllZFNpZ25hdHVyZVtdKVxuICAgICAgLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFncyhcbiAgICByZXBvc2l0b3J5TmFtZTogc3RyaW5nLFxuICAgIHF1ZXJ5UGFyYW1zPzogUmVxdWVzdFF1ZXJ5UGFyYW1zXG4gICk6IE9ic2VydmFibGU8VGFnW10+IHwgUHJvbWlzZTxUYWdbXT4gfCBUYWdbXSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5TmFtZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiQmFkIGFyZ3VtZW50XCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ2V0VGFncyhyZXBvc2l0b3J5TmFtZSwgcXVlcnlQYXJhbXMpO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZVRhZyhcbiAgICByZXBvc2l0b3J5TmFtZTogc3RyaW5nLFxuICAgIHRhZzogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8YW55PiB8IFByb21pc2U8VGFnPiB8IGFueSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5TmFtZSB8fCAhdGFnKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJCYWQgYXJndW1lbnRcIik7XG4gICAgfVxuXG4gICAgbGV0IHVybDogc3RyaW5nID0gYCR7dGhpcy5fYmFzZVVybH0vJHtyZXBvc2l0b3J5TmFtZX0vdGFncy8ke3RhZ31gO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5kZWxldGUodXJsLCBIVFRQX0pTT05fT1BUSU9OUylcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYWcoXG4gICAgcmVwb3NpdG9yeU5hbWU6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBxdWVyeVBhcmFtcz86IFJlcXVlc3RRdWVyeVBhcmFtc1xuICApOiBPYnNlcnZhYmxlPFRhZz4gfCBQcm9taXNlPFRhZz4gfCBUYWcge1xuICAgIGlmICghcmVwb3NpdG9yeU5hbWUgfHwgIXRhZykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiQmFkIGFyZ3VtZW50XCIpO1xuICAgIH1cblxuICAgIGxldCB1cmw6IHN0cmluZyA9IGAke3RoaXMuX2Jhc2VVcmx9LyR7cmVwb3NpdG9yeU5hbWV9L3RhZ3MvJHt0YWd9YDtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0KHVybCwgSFRUUF9HRVRfT1BUSU9OUylcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpIGFzIFRhZylcbiAgICAgIC5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICB9XG5cbiAgcHVibGljIGFkZExhYmVsVG9JbWFnZXMoXG4gICAgcmVwb05hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxJZDogbnVtYmVyXG4gICk6IE9ic2VydmFibGU8YW55PiB8IFByb21pc2U8YW55PiB8IGFueSB7XG4gICAgaWYgKCFsYWJlbElkIHx8ICF0YWdOYW1lIHx8ICFyZXBvTmFtZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiSW52YWxpZCBwYXJhbWV0ZXJzLlwiKTtcbiAgICB9XG5cbiAgICBsZXQgX2FkZExhYmVsVG9JbWFnZVVybCA9IGAke1xuICAgICAgdGhpcy5fYmFzZVVybFxuICAgIH0vJHtyZXBvTmFtZX0vdGFncy8ke3RhZ05hbWV9L2xhYmVsc2A7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoX2FkZExhYmVsVG9JbWFnZVVybCwgeyBpZDogbGFiZWxJZCB9LCBIVFRQX0pTT05fT1BUSU9OUylcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlTGFiZWxUb0ltYWdlcyhcbiAgICByZXBvTmFtZTogc3RyaW5nLFxuICAgIHRhZ05hbWU6IHN0cmluZyxcbiAgICBsYWJlbElkOiBudW1iZXJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHwgUHJvbWlzZTxhbnk+IHwgYW55IHtcbiAgICBpZiAoIWxhYmVsSWQgfHwgIXRhZ05hbWUgfHwgIXJlcG9OYW1lKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJJbnZhbGlkIHBhcmFtZXRlcnMuXCIpO1xuICAgIH1cblxuICAgIGxldCBfYWRkTGFiZWxUb0ltYWdlVXJsID0gYCR7XG4gICAgICB0aGlzLl9iYXNlVXJsXG4gICAgfS8ke3JlcG9OYW1lfS90YWdzLyR7dGFnTmFtZX0vbGFiZWxzLyR7bGFiZWxJZH1gO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5kZWxldGUoX2FkZExhYmVsVG9JbWFnZVVybClcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFuaWZlc3QoXG4gICAgcmVwb3NpdG9yeU5hbWU6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPE1hbmlmZXN0PiB8IFByb21pc2U8TWFuaWZlc3Q+IHwgTWFuaWZlc3Qge1xuICAgIGlmICghcmVwb3NpdG9yeU5hbWUgfHwgIXRhZykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiQmFkIGFyZ3VtZW50XCIpO1xuICAgIH1cbiAgICBsZXQgdXJsOiBzdHJpbmcgPSBgJHt0aGlzLl9iYXNlVXJsfS8ke3JlcG9zaXRvcnlOYW1lfS90YWdzLyR7dGFnfS9tYW5pZmVzdGA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldCh1cmwsIEhUVFBfR0VUX09QVElPTlMpXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSBhcyBNYW5pZmVzdClcbiAgICAgIC5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICB9XG59XG4iXX0=