UNPKG

@fdot/edms-api-lib

Version:

The edms-api-lib package wraps service calls to FDOT EDMS API. ## Installation `npm install @fdot/edms-api-lib --save`

289 lines (288 loc) 28.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable, Inject } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { throwError } from 'rxjs'; import { of } from 'rxjs'; import { Config } from '../models/Config'; import * as FineUploaderCore from 'fine-uploader/lib/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; var EdmsService = /** @class */ (function () { function EdmsService(httpClient, config) { this.httpClient = httpClient; this.config = config; this.defaultPropertyMap = {}; if (!config) { throw Error('Call EdmsApiLibModule with for root passing in the config object'); } this.headers = { 'Ocp-Apim-Subscription-Key': config.apiKey }; this.httpOptions = { headers: new HttpHeaders(this.headers) }; } /** * @param {?} authTokenInputs * @return {?} */ EdmsService.prototype.getAuthToken = /** * @param {?} authTokenInputs * @return {?} */ function (authTokenInputs) { var _this = this; /** @type {?} */ var url = this.config.host + "/api/authenticationToken"; /** @type {?} */ var body = { server: authTokenInputs.server, library: authTokenInputs.library, userId: authTokenInputs.userId, password: authTokenInputs.password }; return this.httpClient.post(url, body, this.httpOptions) .pipe(map(function (response) { _this.token = response; return response; })); }; /** * @return {?} */ EdmsService.prototype.getBusinessAreas = /** * @return {?} */ function () { if (!this.token) return throwError("Please call Get Auth Token before making additional calls to establish a security token"); /** @type {?} */ var url = this.config.host + "/api/businessAreas?authenticationToken=" + this.token; return this.httpClient.get(url, this.httpOptions) .pipe(map(function (response) { return response; })); }; /** * @param {?} businessArea * @return {?} */ EdmsService.prototype.getDocumentGroupsByBusinessArea = /** * @param {?} businessArea * @return {?} */ function (businessArea) { if (!this.token) return throwError("Please call Get Auth Token before making additional calls to establish a security token"); /** @type {?} */ var url = this.config.host + "/api/businessArea/" + businessArea.SystemId + "/documentGroups?authenticationToken=" + this.token; return this.httpClient.get(url, this.httpOptions) .pipe(map(function (response) { return response; })); }; /** * @param {?} documentGroup * @return {?} */ EdmsService.prototype.getDocumentTypesByDocumentGroup = /** * @param {?} documentGroup * @return {?} */ function (documentGroup) { if (!this.token) return throwError("Please call Get Auth Token before making additional calls to establish a security token"); /** @type {?} */ var url = this.config.host + "/api/documentGroup/" + documentGroup.SystemId + "/documentTypes?authenticationToken=" + this.token; return this.httpClient.get(url, this.httpOptions) .pipe(map(function (response) { return response; })); }; /** * @return {?} */ EdmsService.prototype.getDefaultPropertyData = /** * @return {?} */ function () { var _this = this; if (!this.token) return throwError("Please call Get Auth Token before making additional calls to establish a security token"); /** @type {?} */ var cachedValue = this.defaultPropertyMap[this.token]; if (cachedValue) { return of(tslib_1.__assign({}, cachedValue)); } /** @type {?} */ var url = this.config.host + "/api/defaultPropertyData?authenticationToken=" + this.token; return this.httpClient.get(url, this.httpOptions) .pipe(map(function (response) { _this.defaultPropertyMap[_this.token] = tslib_1.__assign({}, response); return response; })); }; /** * @param {?} file * @param {?} documentMetadata * @return {?} */ EdmsService.prototype.addNewDocument = /** * @param {?} file * @param {?} documentMetadata * @return {?} */ function (file, documentMetadata) { if (!this.token) return throwError("Please call Get Auth Token before making additional calls to establish a security token"); if (file.size < this.config.uploadChunkThreshold) { return this.uploadDocumentWithOneRequest(file, documentMetadata); } else { return this.uploadDocumentInSimultaneousChunks(file, documentMetadata); } }; /** * @param {?} file * @param {?} documentMetadata * @return {?} */ EdmsService.prototype.uploadDocumentInSimultaneousChunks = /** * @param {?} file * @param {?} documentMetadata * @return {?} */ function (file, documentMetadata) { var _this = this; return Observable.create(function (observer) { /** @type {?} */ var completeCallback = function (id, name, document, xhr) { if (xhr.status != 200) { observer.error(xhr.response); } else { observer.next(document); observer.complete(); } }; /** @type {?} */ var chunkingSuccessOptions = { endpoint: _this.config.host + "/api/chunkComplete?authenticationToken=" + _this.token, jsonPayload: true, params: function (fileId) { return { documentMetadata: documentMetadata, id: fineUploaderBasic.getUuid(fileId), totalParts: 3 }; } }; /** @type {?} */ var chunkingOptions = { enabled: true, partSize: _this.config.uploadChunkSize, concurrent: { enabled: true }, paramNames: { partIndex: "partIndex", totalParts: "totalParts" }, success: chunkingSuccessOptions }; /** @type {?} */ var requestOptions = { customHeaders: _this.headers, endpoint: _this.config.host + "/api/chunkNewDocument?authenticationToken=" + _this.token, filenameParam: 'filename', forceMultipart: true, omitDefaultParams: false, paramsInBody: true, uuidName: "id", inputName: "file" }; /** @type {?} */ var callbackOptions = { onComplete: function (id, name, responseJSON, xhr) { return completeCallback(id, name, responseJSON, xhr); }, onError: function (id, name, errorReason, xhr) { debugger; console.log(JSON.stringify(xhr)); } }; /** @type {?} */ var options = { maxConnections: 6, multiple: false, chunking: chunkingOptions, request: requestOptions, callbacks: callbackOptions, autoUpload: false, debug: true }; /** @type {?} */ var fineUploaderBasic = new FineUploaderCore.FineUploaderBasic(options); fineUploaderBasic.addFiles([file]); fineUploaderBasic.uploadStoredFiles(); }); }; /** * @param {?} file * @param {?} documentMetadata * @return {?} */ EdmsService.prototype.uploadDocumentWithOneRequest = /** * @param {?} file * @param {?} documentMetadata * @return {?} */ function (file, documentMetadata) { /** @type {?} */ var url = this.config.host + "/api/addNewDocument?authenticationToken=" + this.token; /** @type {?} */ var formData = new FormData(); formData.append('file', file, file.name); formData.append("metadata", JSON.stringify(documentMetadata)); return this.httpClient.post(url, formData, this.httpOptions).pipe(map(function (response) { return response; })); }; /** * @param {?} docId * @return {?} */ EdmsService.prototype.getDocumentDownloadUrl = /** * @param {?} docId * @return {?} */ function (docId) { return this.config.host + "/api/document/" + docId + "?subscription-key=" + this.config.apiKey + "&authenticationToken=" + this.token; }; EdmsService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ EdmsService.ctorParameters = function () { return [ { type: HttpClient }, { type: Config, decorators: [{ type: Inject, args: ['config',] }] } ]; }; /** @nocollapse */ EdmsService.ngInjectableDef = i0.defineInjectable({ factory: function EdmsService_Factory() { return new EdmsService(i0.inject(i1.HttpClient), i0.inject("config")); }, token: EdmsService, providedIn: "root" }); return EdmsService; }()); export { EdmsService }; if (false) { /** @type {?} */ EdmsService.prototype.headers; /** @type {?} */ EdmsService.prototype.httpOptions; /** @type {?} */ EdmsService.prototype.token; /** @type {?} */ EdmsService.prototype.defaultPropertyMap; /** @type {?} */ EdmsService.prototype.httpClient; /** @type {?} */ EdmsService.prototype.config; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWRtc1NlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZmRvdC9lZG1zLWFwaS1saWIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvRWRtc1NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFRMUMsT0FBTyxLQUFLLGdCQUFnQixNQUFNLHdCQUF3QixDQUFDOzs7O0lBWXpELHFCQUFvQixVQUFzQixFQUE0QixNQUFjO1FBQWhFLGVBQVUsR0FBVixVQUFVLENBQVk7UUFBNEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtrQ0FGYixFQUFFO1FBR3ZFLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxNQUFNLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1NBQ2pGO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM5RCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0tBQy9EOzs7OztJQUVNLGtDQUFZOzs7O2NBQUMsZUFBZ0M7OztRQUNsRCxJQUFNLEdBQUcsR0FBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUks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QkFBaUIsS0FBSywwQkFBcUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLDZCQUF3QixJQUFJLENBQUMsS0FBTyxDQUFDOzs7Z0JBbkwvSCxVQUFVLFNBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzs7O2dCQW5CUSxVQUFVO2dCQU9WLE1BQU0sdUJBb0JnQyxNQUFNLFNBQUMsUUFBUTs7O3NCQTVCOUQ7O1NBcUJhLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL0NvbmZpZyc7XHJcbmltcG9ydCB7IEF1dGhUb2tlbklucHV0cyB9IGZyb20gJy4uL21vZGVscy9BdXRoVG9rZW5JbnB1dHMnO1xyXG5pbXBvcnQgeyBCdXNpbmVzc0FyZWEgfSBmcm9tICcuLi9tb2RlbHMvQnVzaW5lc3NBcmVhJztcclxuaW1wb3J0IHsgRG9jdW1lbnREYXRhIH0gZnJvbSAnLi4vbW9kZWxzL0RvY3VtZW50RGF0YSc7XHJcbmltcG9ydCB7IERvY3VtZW50R3JvdXAgfSBmcm9tICcuLi9tb2RlbHMvRG9jdW1lbnRHcm91cCc7XHJcbmltcG9ydCB7IERvY3VtZW50UHJvcGVydHkgfSBmcm9tICcuLi9tb2RlbHMvRG9jdW1lbnRQcm9wZXJ0eSc7XHJcbmltcG9ydCB7IERvY3VtZW50VHlwZSB9IGZyb20gJy4uL21vZGVscy9Eb2N1bWVudFR5cGUnO1xyXG5cclxuaW1wb3J0ICogYXMgRmluZVVwbG9hZGVyQ29yZSBmcm9tICdmaW5lLXVwbG9hZGVyL2xpYi9jb3JlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEVkbXNTZXJ2aWNlIHtcclxuICBwcml2YXRlIGhlYWRlcnM7XHJcbiAgcHJpdmF0ZSBodHRwT3B0aW9ucztcclxuXHJcbiAgcHJpdmF0ZSB0b2tlbjogc3RyaW5nO1xyXG4gIHByaXZhdGUgZGVmYXVsdFByb3BlcnR5TWFwOiB7IFt0b2tlbjogc3RyaW5nXTogRG9jdW1lbnRQcm9wZXJ0eVtdOyB9ID0ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCwgQEluamVjdCgnY29uZmlnJykgcHJpdmF0ZSBjb25maWc6IENvbmZpZykge1xyXG4gICAgaWYgKCFjb25maWcpIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ0NhbGwgRWRtc0FwaUxpYk1vZHVsZSB3aXRoIGZvciByb290IHBhc3NpbmcgaW4gdGhlIGNvbmZpZyBvYmplY3QnKTtcclxuICAgIH1cclxuICAgIHRoaXMuaGVhZGVycyA9IHsgJ09jcC1BcGltLVN1YnNjcmlwdGlvbi1LZXknOiBjb25maWcuYXBpS2V5IH07XHJcbiAgICB0aGlzLmh0dHBPcHRpb25zID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXJzKSB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEF1dGhUb2tlbihhdXRoVG9rZW5JbnB1dHM6IEF1dGhUb2tlbklucHV0cyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvbmZpZy5ob3N0fS9hcGkvYXV0aGVudGljYXRpb25Ub2tlbmA7XHJcbiAgICBjb25zdCBib2R5ID0ge1xyXG4gICAgICBzZXJ2ZXI6IGF1dGhUb2tlbklucHV0cy5zZXJ2ZXIsXHJcbiAgICAgIGxpYnJhcnk6IGF1dGhUb2tlbklucHV0cy5saWJyYXJ5LFxyXG4gICAgICB1c2VySWQ6IGF1dGhUb2tlbklucHV0cy51c2VySWQsXHJcbiAgICAgIHBhc3N3b3JkOiBhdXRoVG9rZW5JbnB1dHMucGFzc3dvcmRcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8c3RyaW5nPih1cmwsIGJvZHksIHRoaXMuaHR0cE9wdGlvbnMpXHJcbiAgICAgIC5waXBlKG1hcChcclxuICAgICAgICAocmVzcG9uc2U6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2tlbiA9IHJlc3BvbnNlO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRCdXNpbmVzc0FyZWFzKCk6IE9ic2VydmFibGU8QnVzaW5lc3NBcmVhW10+IHtcclxuICAgIGlmICghdGhpcy50b2tlbikgcmV0dXJuIHRocm93RXJyb3IoXCJQbGVhc2UgY2FsbCBHZXQgQXV0aCBUb2tlbiBiZWZvcmUgbWFraW5nIGFkZGl0aW9uYWwgY2FsbHMgdG8gZXN0YWJsaXNoIGEgc2VjdXJpdHkgdG9rZW5cIik7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvbmZpZy5ob3N0fS9hcGkvYnVzaW5lc3NBcmVhcz9hdXRoZW50aWNhdGlvblRva2VuPSR7dGhpcy50b2tlbn1gO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEJ1c2luZXNzQXJlYVtdPih1cmwsIHRoaXMuaHR0cE9wdGlvbnMpXHJcbiAgICAgIC5waXBlKG1hcChcclxuICAgICAgICAocmVzcG9uc2U6IEJ1c2luZXNzQXJlYVtdKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERvY3VtZW50R3JvdXBzQnlCdXNpbmVzc0FyZWEoYnVzaW5lc3NBcmVhOiBCdXNpbmVzc0FyZWEpOiBPYnNlcnZhYmxlPERvY3VtZW50R3JvdXBbXT4ge1xyXG4gICAgaWYgKCF0aGlzLnRva2VuKSByZXR1cm4gdGhyb3dFcnJvcihcIlBsZWFzZSBjYWxsIEdldCBBdXRoIFRva2VuIGJlZm9yZSBtYWtpbmcgYWRkaXRpb25hbCBjYWxscyB0byBlc3RhYmxpc2ggYSBzZWN1cml0eSB0b2tlblwiKTtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuY29uZmlnLmhvc3R9L2FwaS9idXNpbmVzc0FyZWEvJHtidXNpbmVzc0FyZWEuU3lzdGVtSWR9L2RvY3VtZW50R3JvdXBzP2F1dGhlbnRpY2F0aW9uVG9rZW49JHt0aGlzLnRva2VufWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxEb2N1bWVudEdyb3VwW10+KHVybCwgdGhpcy5odHRwT3B0aW9ucylcclxuICAgICAgLnBpcGUobWFwKFxyXG4gICAgICAgIChyZXNwb25zZTogRG9jdW1lbnRHcm91cFtdKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERvY3VtZW50VHlwZXNCeURvY3VtZW50R3JvdXAoZG9jdW1lbnRHcm91cDogRG9jdW1lbnRHcm91cCk6IE9ic2VydmFibGU8RG9jdW1lbnRUeXBlW10+IHtcclxuICAgIGlmICghdGhpcy50b2tlbikgcmV0dXJuIHRocm93RXJyb3IoXCJQbGVhc2UgY2FsbCBHZXQgQXV0aCBUb2tlbiBiZWZvcmUgbWFraW5nIGFkZGl0aW9uYWwgY2FsbHMgdG8gZXN0YWJsaXNoIGEgc2VjdXJpdHkgdG9rZW5cIik7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvbmZpZy5ob3N0fS9hcGkvZG9jdW1lbnRHcm91cC8ke2RvY3VtZW50R3JvdXAuU3lzdGVtSWR9L2RvY3VtZW50VHlwZXM/YXV0aGVudGljYXRpb25Ub2tlbj0ke3RoaXMudG9rZW59YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PERvY3VtZW50VHlwZVtdPih1cmwsIHRoaXMuaHR0cE9wdGlvbnMpXHJcbiAgICAgIC5waXBlKG1hcCgocmVzcG9uc2U6IERvY3VtZW50R3JvdXApID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREZWZhdWx0UHJvcGVydHlEYXRhKCk6IE9ic2VydmFibGU8RG9jdW1lbnRQcm9wZXJ0eVtdPiB7XHJcbiAgICBpZiAoIXRoaXMudG9rZW4pIHJldHVybiB0aHJvd0Vycm9yKFwiUGxlYXNlIGNhbGwgR2V0IEF1dGggVG9rZW4gYmVmb3JlIG1ha2luZyBhZGRpdGlvbmFsIGNhbGxzIHRvIGVzdGFibGlzaCBhIHNlY3VyaXR5IHRva2VuXCIpO1xyXG4gICAgdmFyIGNhY2hlZFZhbHVlID0gdGhpcy5kZWZhdWx0UHJvcGVydHlNYXBbdGhpcy50b2tlbl07XHJcbiAgICBpZiAoY2FjaGVkVmFsdWUpIHtcclxuICAgICAgcmV0dXJuIG9mKHsgLi4uY2FjaGVkVmFsdWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5jb25maWcuaG9zdH0vYXBpL2RlZmF1bHRQcm9wZXJ0eURhdGE/YXV0aGVudGljYXRpb25Ub2tlbj0ke3RoaXMudG9rZW59YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PERvY3VtZW50UHJvcGVydHlbXT4odXJsLCB0aGlzLmh0dHBPcHRpb25zKVxyXG4gICAgICAucGlwZShtYXAoXHJcbiAgICAgICAgKHJlc3BvbnNlOiBEb2N1bWVudFByb3BlcnR5W10pID0+IHtcclxuICAgICAgICAgIHRoaXMuZGVmYXVsdFByb3BlcnR5TWFwW3RoaXMudG9rZW5dID0geyAuLi5yZXNwb25zZSB9O1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH1cclxuICAgICAgKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkTmV3RG9jdW1lbnQoZmlsZTogRmlsZSwgZG9jdW1lbnRNZXRhZGF0YTogRG9jdW1lbnREYXRhKTogT2JzZXJ2YWJsZTxEb2N1bWVudD4ge1xyXG4gICAgaWYgKCF0aGlzLnRva2VuKSByZXR1cm4gdGhyb3dFcnJvcihcIlBsZWFzZSBjYWxsIEdldCBBdXRoIFRva2VuIGJlZm9yZSBtYWtpbmcgYWRkaXRpb25hbCBjYWxscyB0byBlc3RhYmxpc2ggYSBzZWN1cml0eSB0b2tlblwiKTtcclxuXHJcbiAgICBpZiAoZmlsZS5zaXplIDwgdGhpcy5jb25maWcudXBsb2FkQ2h1bmtUaHJlc2hvbGQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudXBsb2FkRG9jdW1lbnRXaXRoT25lUmVxdWVzdChmaWxlLCBkb2N1bWVudE1ldGFkYXRhKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy51cGxvYWREb2N1bWVudEluU2ltdWx0YW5lb3VzQ2h1bmtzKGZpbGUsIGRvY3VtZW50TWV0YWRhdGEpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBsb2FkRG9jdW1lbnRJblNpbXVsdGFuZW91c0NodW5rcyhmaWxlOiBGaWxlLCBkb2N1bWVudE1ldGFkYXRhOiBEb2N1bWVudERhdGEpOiBPYnNlcnZhYmxlPERvY3VtZW50PiB7XHJcblxyXG4gICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKG9ic2VydmVyID0+IHtcclxuICAgICAgY29uc3QgY29tcGxldGVDYWxsYmFjayA9IChpZDogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIGRvY3VtZW50OiBEb2N1bWVudCwgeGhyOiBYTUxIdHRwUmVxdWVzdCk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGlmICh4aHIuc3RhdHVzICE9IDIwMCkge1xyXG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoeGhyLnJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KGRvY3VtZW50KTtcclxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdmFyIGNodW5raW5nU3VjY2Vzc09wdGlvbnM6IEZpbmVVcGxvYWRlckNvcmUuU3VjY2Vzc09wdGlvbnMgPSB7XHJcbiAgICAgICAgZW5kcG9pbnQ6IGAke3RoaXMuY29uZmlnLmhvc3R9L2FwaS9jaHVua0NvbXBsZXRlP2F1dGhlbnRpY2F0aW9uVG9rZW49JHt0aGlzLnRva2VufWAsXHJcbiAgICAgICAganNvblBheWxvYWQ6IHRydWUsXHJcbiAgICAgICAgcGFyYW1zOiBmdW5jdGlvbiAoZmlsZUlkOiBudW1iZXIpIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50TWV0YWRhdGEsXHJcbiAgICAgICAgICAgIGlkOiBmaW5lVXBsb2FkZXJCYXNpYy5nZXRVdWlkKGZpbGVJZCksXHJcbiAgICAgICAgICAgIHRvdGFsUGFydHM6IDNcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBjaHVua2luZ09wdGlvbnM6IEZpbmVVcGxvYWRlckNvcmUuQ2h1bmtpbmdPcHRpb25zID0ge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgcGFydFNpemU6IHRoaXMuY29uZmlnLnVwbG9hZENodW5rU2l6ZSxcclxuICAgICAgICBjb25jdXJyZW50OiB7IGVuYWJsZWQ6IHRydWUgfSxcclxuICAgICAgICBwYXJhbU5hbWVzOiB7XHJcbiAgICAgICAgICBwYXJ0SW5kZXg6IFwicGFydEluZGV4XCIsXHJcbiAgICAgICAgICB0b3RhbFBhcnRzOiBcInRvdGFsUGFydHNcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3VjY2VzczogY2h1bmtpbmdTdWNjZXNzT3B0aW9uc1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgdmFyIHJlcXVlc3RPcHRpb25zOiBGaW5lVXBsb2FkZXJDb3JlLlJlcXVlc3RPcHRpb25zID0ge1xyXG4gICAgICAgIGN1c3RvbUhlYWRlcnM6IHRoaXMuaGVhZGVycyxcclxuICAgICAgICBlbmRwb2ludDogYCR7dGhpcy5jb25maWcuaG9zdH0vYXBpL2NodW5rTmV3RG9jdW1lbnQ/YXV0aGVudGljYXRpb25Ub2tlbj0ke3RoaXMudG9rZW59YCxcclxuICAgICAgICBmaWxlbmFtZVBhcmFtOiAnZmlsZW5hbWUnLFxyXG4gICAgICAgIGZvcmNlTXVsdGlwYXJ0OiB0cnVlLFxyXG4gICAgICAgIG9taXREZWZhdWx0UGFyYW1zOiBmYWxzZSxcclxuICAgICAgICBwYXJhbXNJbkJvZHk6IHRydWUsXHJcbiAgICAgICAgdXVpZE5hbWU6IFwiaWRcIixcclxuICAgICAgICBpbnB1dE5hbWU6IFwiZmlsZVwiXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBjYWxsYmFja09wdGlvbnM6IEZpbmVVcGxvYWRlckNvcmUuQ29yZUV2ZW50cyA9IHtcclxuICAgICAgICBvbkNvbXBsZXRlOiAoaWQ6IG51bWJlciwgbmFtZTogc3RyaW5nLCByZXNwb25zZUpTT046IGFueSwgeGhyOiBYTUxIdHRwUmVxdWVzdCkgPT4gY29tcGxldGVDYWxsYmFjayhpZCwgbmFtZSwgcmVzcG9uc2VKU09OLCB4aHIpLFxyXG4gICAgICAgIG9uRXJyb3I6IChpZDogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIGVycm9yUmVhc29uOiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QpID0+IHtcclxuICAgICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeGhyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgb3B0aW9uczogRmluZVVwbG9hZGVyQ29yZS5Db3JlT3B0aW9ucyA9IHtcclxuICAgICAgICBtYXhDb25uZWN0aW9uczogNixcclxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXHJcbiAgICAgICAgY2h1bmtpbmc6IGNodW5raW5nT3B0aW9ucyxcclxuICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9ucyxcclxuICAgICAgICBjYWxsYmFja3M6IGNhbGxiYWNrT3B0aW9ucyxcclxuICAgICAgICBhdXRvVXBsb2FkOiBmYWxzZSxcclxuICAgICAgICBkZWJ1ZzogdHJ1ZVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdmFyIGZpbmVVcGxvYWRlckJhc2ljID0gbmV3IEZpbmVVcGxvYWRlckNvcmUuRmluZVVwbG9hZGVyQmFzaWMob3B0aW9ucyk7XHJcblxyXG4gICAgICBmaW5lVXBsb2FkZXJCYXNpYy5hZGRGaWxlcyhbZmlsZV0pO1xyXG4gICAgICBmaW5lVXBsb2FkZXJCYXNpYy51cGxvYWRTdG9yZWRGaWxlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwbG9hZERvY3VtZW50V2l0aE9uZVJlcXVlc3QoZmlsZTogRmlsZSwgZG9jdW1lbnRNZXRhZGF0YTogRG9jdW1lbnREYXRhKTogT2JzZXJ2YWJsZTxEb2N1bWVudD4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5jb25maWcuaG9zdH0vYXBpL2FkZE5ld0RvY3VtZW50P2F1dGhlbnRpY2F0aW9uVG9rZW49JHt0aGlzLnRva2VufWA7XHJcbiAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XHJcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJtZXRhZGF0YVwiLCBKU09OLnN0cmluZ2lmeShkb2N1bWVudE1ldGFkYXRhKSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PERvY3VtZW50Pih1cmwsIGZvcm1EYXRhLCB0aGlzLmh0dHBPcHRpb25zKS5waXBlKG1hcChcclxuICAgICAgKHJlc3BvbnNlOiBEb2N1bWVudCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERvY3VtZW50RG93bmxvYWRVcmwoZG9jSWQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5jb25maWcuaG9zdH0vYXBpL2RvY3VtZW50LyR7ZG9jSWR9P3N1YnNjcmlwdGlvbi1rZXk9JHt0aGlzLmNvbmZpZy5hcGlLZXl9JmF1dGhlbnRpY2F0aW9uVG9rZW49JHt0aGlzLnRva2VufWA7XHJcbiAgfVxyXG59Il19