UNPKG

@helgoland/core

Version:

634 lines (633 loc) 48.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { deserialize, deserializeArray } from 'class-transformer'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { Dataset, Timeseries } from '../model/dataset-api/dataset'; import { DatasetApiInterface } from './api-interface'; import { HttpService } from './http.service'; import { InternalIdHandler } from './internal-id-handler.service'; var DatasetImplApiInterface = /** @class */ (function (_super) { tslib_1.__extends(DatasetImplApiInterface, _super); function DatasetImplApiInterface(httpservice, internalDatasetId, translate) { var _this = _super.call(this, httpservice, translate) || this; _this.httpservice = httpservice; _this.internalDatasetId = internalDatasetId; _this.translate = translate; return _this; } /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getServices = /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'services'); if (params) { params.expanded = true; } else { params = { expanded: true }; } return this.requestApi(url, params, options).pipe(map(function (result) { result.forEach(function (entry) { return entry.apiUrl = apiUrl; }); return result; })); }; /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getService = /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (id, apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'services', id); return this.requestApi(url, params, options).pipe(map(function (result) { result.apiUrl = apiUrl; return result; })); }; /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getStations = /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'stations'); return this.requestApi(url, params, options); }; /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getStation = /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (id, apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'stations', id); return this.requestApi(url, params, options); }; /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getTimeseries = /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (apiUrl, params, options) { var _this = this; /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'timeseries'); return new Observable(function (observer) { _this.requestApiTexted(url, params, options).subscribe(function (result) { /** @type {?} */ var timeseriesList = deserializeArray(Timeseries, result); timeseriesList.forEach(function (entry) { entry.url = apiUrl; _this.internalDatasetId.generateInternalId(entry); }); observer.next(timeseriesList); }, function (error) { return observer.error(error); }, function () { return observer.complete(); }); }); }; /** * @param {?} apiUrl * @param {?} ids * @param {?} timespan * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getTimeseriesData = /** * @param {?} apiUrl * @param {?} ids * @param {?} timespan * @param {?=} options * @return {?} */ function (apiUrl, ids, timespan, options) { var _this = this; /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'timeseries/getData'); return new Observable(function (observer) { _this.requestApiTextedPost(url, { timespan: _this.createRequestTimespan(timespan), timeseries: ids }, options).subscribe(function (result) { /** @type {?} */ var timeseriesList = []; for (var id in result) { if (id) { timeseriesList.push({ id: id, url: apiUrl, data: result[id].values }); } } observer.next(timeseriesList); }, function (error) { return observer.error(error); }, function () { return observer.complete(); }); }); }; /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @return {?} */ DatasetImplApiInterface.prototype.getSingleTimeseries = /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @return {?} */ function (id, apiUrl, params) { var _this = this; /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'timeseries', id); return this.requestApiTexted(url, params).pipe(map(function (result) { /** @type {?} */ var timeseries = deserialize(Timeseries, result); timeseries.url = apiUrl; _this.internalDatasetId.generateInternalId(timeseries); return timeseries; })); }; /** * @param {?} internalId * @param {?=} params * @return {?} */ DatasetImplApiInterface.prototype.getSingleTimeseriesByInternalId = /** * @param {?} internalId * @param {?=} params * @return {?} */ function (internalId, params) { /** @type {?} */ var resolvedId = this.internalDatasetId.resolveInternalId(internalId); return this.getSingleTimeseries(resolvedId.id, resolvedId.url, params); }; /** * @param {?} id * @param {?} apiUrl * @return {?} */ DatasetImplApiInterface.prototype.getTimeseriesExtras = /** * @param {?} id * @param {?} apiUrl * @return {?} */ function (id, apiUrl) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'timeseries', id); return this.requestApi(url + '/extras'); }; /** * @template T * @param {?} id * @param {?} apiUrl * @param {?} timespan * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getTsData = /** * @template T * @param {?} id * @param {?} apiUrl * @param {?} timespan * @param {?=} params * @param {?=} options * @return {?} */ function (id, apiUrl, timespan, params, options) { if (params === void 0) { params = {}; } /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'timeseries', id) + '/getData'; params.timespan = this.createRequestTimespan(timespan); return this.requestApi(url, params, options).pipe(map(function (res) { if (params.expanded) { res = res[id]; } return res; })); }; /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getCategories = /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'categories'); return this.requestApi(url, params, options); }; /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @return {?} */ DatasetImplApiInterface.prototype.getCategory = /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @return {?} */ function (id, apiUrl, params) { // const url = this.createRequestUrl(apiUrl, 'categories', id); throw new Error('Not implemented'); // return this.requestApi(url, params) // .map(this.extractData); }; /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getPhenomena = /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'phenomena'); return this.requestApi(url, params, options); }; /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getPhenomenon = /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (id, apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'phenomena', id); return this.requestApi(url, params, options); }; /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getOfferings = /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'offerings'); return this.requestApi(url, params, options); }; /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getOffering = /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (id, apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'offerings', id); return this.requestApi(url, params, options); }; /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getFeatures = /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'features'); return this.requestApi(url, params, options); }; /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getFeature = /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (id, apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'features', id); return this.requestApi(url, params, options); }; /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getProcedures = /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'procedures'); return this.requestApi(url, params, options); }; /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getProcedure = /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (id, apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'procedures', id); return this.requestApi(url, params, options); }; /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getPlatforms = /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'platforms'); return this.requestApi(url, params, options); }; /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getPlatform = /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (id, apiUrl, params, options) { /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'platforms', id); return this.requestApi(url, params, options); }; /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getDatasets = /** * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (apiUrl, params, options) { var _this = this; /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'datasets'); return this.requestApi(url, params, options).pipe(map(function (list) { return list.map(function (entry) { return _this.prepareDataset(entry, apiUrl); }); })); }; /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getDataset = /** * @param {?} id * @param {?} apiUrl * @param {?=} params * @param {?=} options * @return {?} */ function (id, apiUrl, params, options) { var _this = this; /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'datasets', id); return this.requestApi(url, params, options).pipe(map(function (res) { return _this.prepareDataset(res, apiUrl); })); }; /** * @param {?} internalId * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getDatasetByInternalId = /** * @param {?} internalId * @param {?=} params * @param {?=} options * @return {?} */ function (internalId, params, options) { /** @type {?} */ var resolvedId = this.internalDatasetId.resolveInternalId(internalId); return this.getDataset(resolvedId.id, resolvedId.url, params, options); }; /** * @template T * @param {?} id * @param {?} apiUrl * @param {?} timespan * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.getData = /** * @template T * @param {?} id * @param {?} apiUrl * @param {?} timespan * @param {?=} params * @param {?=} options * @return {?} */ function (id, apiUrl, timespan, params, options) { if (params === void 0) { params = {}; } /** @type {?} */ var url = this.createRequestUrl(apiUrl, 'datasets', id) + '/data'; params.timespan = this.createRequestTimespan(timespan); return this.requestApi(url, params, options); }; /** * @param {?} url * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.requestApiTexted = /** * @param {?} url * @param {?=} params * @param {?=} options * @return {?} */ function (url, params, options) { if (params === void 0) { params = {}; } if (options === void 0) { options = {}; } return this.httpservice.client(options).get(url, { params: this.prepareParams(params), responseType: 'text' }); }; /** * @param {?} url * @param {?=} params * @param {?=} options * @return {?} */ DatasetImplApiInterface.prototype.requestApiTextedPost = /** * @param {?} url * @param {?=} params * @param {?=} options * @return {?} */ function (url, params, options) { if (params === void 0) { params = {}; } if (options === void 0) { options = {}; } return this.httpservice.client().post(url, params, { responseType: 'json' }); }; /** * @param {?} datasetObj * @param {?} apiUrl * @return {?} */ DatasetImplApiInterface.prototype.prepareDataset = /** * @param {?} datasetObj * @param {?} apiUrl * @return {?} */ function (datasetObj, apiUrl) { /** @type {?} */ var dataset = deserialize(Dataset, JSON.stringify(datasetObj)); dataset.url = apiUrl; this.internalDatasetId.generateInternalId(dataset); if (dataset.seriesParameters) { dataset.parameters = dataset.seriesParameters; delete dataset.seriesParameters; } return dataset; }; DatasetImplApiInterface.decorators = [ { type: Injectable }, ]; /** @nocollapse */ DatasetImplApiInterface.ctorParameters = function () { return [ { type: HttpService }, { type: InternalIdHandler }, { type: TranslateService } ]; }; return DatasetImplApiInterface; }(DatasetApiInterface)); export { DatasetImplApiInterface }; if (false) { /** @type {?} */ DatasetImplApiInterface.prototype.httpservice; /** @type {?} */ DatasetImplApiInterface.prototype.internalDatasetId; /** @type {?} */ DatasetImplApiInterface.prototype.translate; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNldC1pbXBsLWFwaS1pbnRlcmZhY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoZWxnb2xhbmQvY29yZS8iLCJzb3VyY2VzIjpbImxpYi9kYXRhc2V0LWFwaS9kYXRhc2V0LWltcGwtYXBpLWludGVyZmFjZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEUsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQW9DLE1BQU0sOEJBQThCLENBQUM7QUFVckcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDOztJQUdyQixtREFBbUI7SUFFNUQsaUNBQ2MsV0FBd0IsRUFDeEIsaUJBQW9DLEVBQ3BDLFNBQTJCO1FBSHpDLFlBS0ksa0JBQU0sV0FBVyxFQUFFLFNBQVMsQ0FBQyxTQUNoQztRQUxhLGlCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLHVCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsZUFBUyxHQUFULFNBQVMsQ0FBa0I7O0tBR3hDOzs7Ozs7O0lBRU0sNkNBQVc7Ozs7OztjQUFDLE1BQWMsRUFBRSxNQUF3QixFQUFFLE9BQTRCOztRQUNyRixJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxF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Q0FBVSxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzFFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1lBQzlDLE9BQU8sT0FBTyxDQUFDLGdCQUFnQixDQUFDO1NBQ25DO1FBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQzs7O2dCQTNSdEIsVUFBVTs7OztnQkFIRixXQUFXO2dCQUNYLGlCQUFpQjtnQkFuQmpCLGdCQUFnQjs7a0NBRHpCO0VBdUI2QyxtQkFBbUI7U0FBbkQsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZGVzZXJpYWxpemUsIGRlc2VyaWFsaXplQXJyYXkgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDYXRlZ29yeSB9IGZyb20gJy4uL21vZGVsL2RhdGFzZXQtYXBpL2NhdGVnb3J5JztcbmltcG9ydCB7IERhdGEgfSBmcm9tICcuLi9tb2RlbC9kYXRhc2V0LWFwaS9kYXRhJztcbmltcG9ydCB7IERhdGFzZXQsIFRpbWVzZXJpZXMsIFRpbWVzZXJpZXNEYXRhLCBUaW1lc2VyaWVzRXh0cmFzIH0gZnJvbSAnLi4vbW9kZWwvZGF0YXNldC1hcGkvZGF0YXNldCc7XG5pbXBvcnQgeyBGZWF0dXJlIH0gZnJvbSAnLi4vbW9kZWwvZGF0YXNldC1hcGkvZmVhdHVyZSc7XG5pbXBvcnQgeyBPZmZlcmluZyB9IGZyb20gJy4uL21vZGVsL2RhdGFzZXQtYXBpL29mZmVyaW5nJztcbmltcG9ydCB7IFBoZW5vbWVub24gfSBmcm9tICcuLi9tb2RlbC9kYXRhc2V0LWFwaS9waGVub21lbm9uJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnLi4vbW9kZWwvZGF0YXNldC1hcGkvcGxhdGZvcm0nO1xuaW1wb3J0IHsgUHJvY2VkdXJlIH0gZnJvbSAnLi4vbW9kZWwvZGF0YXNldC1hcGkvcHJvY2VkdXJlJztcbmltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICcuLi9tb2RlbC9kYXRhc2V0LWFwaS9zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRpb24gfSBmcm9tICcuLi9tb2RlbC9kYXRhc2V0LWFwaS9zdGF0aW9uJztcbmltcG9ydCB7IERhdGFQYXJhbWV0ZXJGaWx0ZXIsIEh0dHBSZXF1ZXN0T3B0aW9ucywgUGFyYW1ldGVyRmlsdGVyIH0gZnJvbSAnLi4vbW9kZWwvaW50ZXJuYWwvaHR0cC1yZXF1ZXN0cyc7XG5pbXBvcnQgeyBUaW1lc3BhbiB9IGZyb20gJy4uL21vZGVsL2ludGVybmFsL3RpbWVJbnRlcnZhbCc7XG5pbXBvcnQgeyBEYXRhc2V0QXBpSW50ZXJmYWNlIH0gZnJvbSAnLi9hcGktaW50ZXJmYWNlJztcbmltcG9ydCB7IEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi9odHRwLnNlcnZpY2UnO1xuaW1wb3J0IHsgSW50ZXJuYWxJZEhhbmRsZXIgfSBmcm9tICcuL2ludGVybmFsLWlkLWhhbmRsZXIuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRhc2V0SW1wbEFwaUludGVyZmFjZSBleHRlbmRzIERhdGFzZXRBcGlJbnRlcmZhY2Uge1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBodHRwc2VydmljZTogSHR0cFNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbERhdGFzZXRJZDogSW50ZXJuYWxJZEhhbmRsZXIsXG4gICAgICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaHR0cHNlcnZpY2UsIHRyYW5zbGF0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlcnZpY2VzKGFwaVVybDogc3RyaW5nLCBwYXJhbXM/OiBQYXJhbWV0ZXJGaWx0ZXIsIG9wdGlvbnM/OiBIdHRwUmVxdWVzdE9wdGlvbnMpOiBPYnNlcnZhYmxlPFNlcnZpY2VbXT4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAnc2VydmljZXMnKTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgICAgcGFyYW1zLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHsgZXhwYW5kZWQ6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QXBpPFNlcnZpY2VbXT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuYXBpVXJsID0gYXBpVXJsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZXJ2aWNlKFxuICAgICAgICBpZDogc3RyaW5nLFxuICAgICAgICBhcGlVcmw6IHN0cmluZyxcbiAgICAgICAgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLFxuICAgICAgICBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zXG4gICAgKTogT2JzZXJ2YWJsZTxTZXJ2aWNlPiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3JlYXRlUmVxdWVzdFVybChhcGlVcmwsICdzZXJ2aWNlcycsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEFwaTxTZXJ2aWNlPih1cmwsIHBhcmFtcywgb3B0aW9ucykucGlwZShcbiAgICAgICAgICAgIG1hcCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFwaVVybCA9IGFwaVVybDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdGF0aW9ucyhhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxTdGF0aW9uW10+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ3N0YXRpb25zJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8U3RhdGlvbltdPih1cmwsIHBhcmFtcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0YXRpb24oXG4gICAgICAgIGlkOiBzdHJpbmcsXG4gICAgICAgIGFwaVVybDogc3RyaW5nLFxuICAgICAgICBwYXJhbXM/OiBQYXJhbWV0ZXJGaWx0ZXIsXG4gICAgICAgIG9wdGlvbnM/OiBIdHRwUmVxdWVzdE9wdGlvbnNcbiAgICApOiBPYnNlcnZhYmxlPFN0YXRpb24+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ3N0YXRpb25zJywgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QXBpPFN0YXRpb24+KHVybCwgcGFyYW1zLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGltZXNlcmllcyhhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxUaW1lc2VyaWVzW10+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ3RpbWVzZXJpZXMnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFRpbWVzZXJpZXNbXT4oKG9ic2VydmVyOiBPYnNlcnZlcjxUaW1lc2VyaWVzW10+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RBcGlUZXh0ZWQodXJsLCBwYXJhbXMsIG9wdGlvbnMpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVzZXJpZXNMaXN0ID0gZGVzZXJpYWxpemVBcnJheTxUaW1lc2VyaWVzPihUaW1lc2VyaWVzLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB0aW1lc2VyaWVzTGlzdC5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkudXJsID0gYXBpVXJsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbERhdGFzZXRJZC5nZW5lcmF0ZUludGVybmFsSWQoZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0aW1lc2VyaWVzTGlzdCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IG9ic2VydmVyLmVycm9yKGVycm9yKSxcbiAgICAgICAgICAgICAgICAoKSA9PiBvYnNlcnZlci5jb21wbGV0ZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGltZXNlcmllc0RhdGEoYXBpVXJsOiBzdHJpbmcsIGlkczogc3RyaW5nW10sIHRpbWVzcGFuOiBUaW1lc3Bhbiwgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9ucyk6IE9ic2VydmFibGU8VGltZXNlcmllc0RhdGFbXT4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAndGltZXNlcmllcy9nZXREYXRhJyk7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxUaW1lc2VyaWVzRGF0YVtdPigob2JzZXJ2ZXI6IE9ic2VydmVyPE9iamVjdD4pID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdEFwaVRleHRlZFBvc3QodXJsLCB7XG4gICAgICAgICAgICAgICAgdGltZXNwYW46IHRoaXMuY3JlYXRlUmVxdWVzdFRpbWVzcGFuKHRpbWVzcGFuKSxcbiAgICAgICAgICAgICAgICB0aW1lc2VyaWVzOiBpZHNcbiAgICAgICAgICAgIH0sIG9wdGlvbnMpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVzZXJpZXNMaXN0OiBUaW1lc2VyaWVzRGF0YVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2VyaWVzTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGFwaVVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJlc3VsdFtpZF0udmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodGltZXNlcmllc0xpc3QpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiBvYnNlcnZlci5lcnJvcihlcnJvciksXG4gICAgICAgICAgICAgICAgKCkgPT4gb2JzZXJ2ZXIuY29tcGxldGUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpbmdsZVRpbWVzZXJpZXMoaWQ6IHN0cmluZywgYXBpVXJsOiBzdHJpbmcsIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlcik6IE9ic2VydmFibGU8VGltZXNlcmllcz4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAndGltZXNlcmllcycsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEFwaVRleHRlZCh1cmwsIHBhcmFtcykucGlwZShtYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGltZXNlcmllcyA9IGRlc2VyaWFsaXplPFRpbWVzZXJpZXM+KFRpbWVzZXJpZXMsIHJlc3VsdCk7XG4gICAgICAgICAgICB0aW1lc2VyaWVzLnVybCA9IGFwaVVybDtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxEYXRhc2V0SWQuZ2VuZXJhdGVJbnRlcm5hbElkKHRpbWVzZXJpZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRpbWVzZXJpZXM7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2luZ2xlVGltZXNlcmllc0J5SW50ZXJuYWxJZChpbnRlcm5hbElkOiBzdHJpbmcsIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlcik6IE9ic2VydmFibGU8VGltZXNlcmllcz4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZElkID0gdGhpcy5pbnRlcm5hbERhdGFzZXRJZC5yZXNvbHZlSW50ZXJuYWxJZChpbnRlcm5hbElkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2luZ2xlVGltZXNlcmllcyhyZXNvbHZlZElkLmlkLCByZXNvbHZlZElkLnVybCwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGltZXNlcmllc0V4dHJhcyhpZDogc3RyaW5nLCBhcGlVcmw6IHN0cmluZyk6IE9ic2VydmFibGU8VGltZXNlcmllc0V4dHJhcz4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAndGltZXNlcmllcycsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEFwaTxUaW1lc2VyaWVzRXh0cmFzPih1cmwgKyAnL2V4dHJhcycpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUc0RhdGE8VD4oXG4gICAgICAgIGlkOiBzdHJpbmcsXG4gICAgICAgIGFwaVVybDogc3RyaW5nLFxuICAgICAgICB0aW1lc3BhbjogVGltZXNwYW4sXG4gICAgICAgIHBhcmFtczogRGF0YVBhcmFtZXRlckZpbHRlciA9IHt9LFxuICAgICAgICBvcHRpb25zOiBIdHRwUmVxdWVzdE9wdGlvbnNcbiAgICApOiBPYnNlcnZhYmxlPERhdGE8VD4+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ3RpbWVzZXJpZXMnLCBpZCkgKyAnL2dldERhdGEnO1xuICAgICAgICBwYXJhbXMudGltZXNwYW4gPSB0aGlzLmNyZWF0ZVJlcXVlc3RUaW1lc3Bhbih0aW1lc3Bhbik7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8RGF0YTxUPj4odXJsLCBwYXJhbXMsIG9wdGlvbnMpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5leHBhbmRlZCkgeyByZXMgPSByZXNbaWRdOyB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2F0ZWdvcmllcyhhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxDYXRlZ29yeVtdPiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3JlYXRlUmVxdWVzdFVybChhcGlVcmwsICdjYXRlZ29yaWVzJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8Q2F0ZWdvcnlbXT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDYXRlZ29yeShpZDogc3RyaW5nLCBhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyKTogT2JzZXJ2YWJsZTxDYXRlZ29yeT4ge1xuICAgICAgICAvLyBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAnY2F0ZWdvcmllcycsIGlkKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMucmVxdWVzdEFwaSh1cmwsIHBhcmFtcylcbiAgICAgICAgLy8gICAgIC5tYXAodGhpcy5leHRyYWN0RGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBoZW5vbWVuYShhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxQaGVub21lbm9uW10+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ3BoZW5vbWVuYScpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QXBpPFBoZW5vbWVub25bXT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQaGVub21lbm9uKFxuICAgICAgICBpZDogc3RyaW5nLFxuICAgICAgICBhcGlVcmw6IHN0cmluZyxcbiAgICAgICAgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLFxuICAgICAgICBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zXG4gICAgKTogT2JzZXJ2YWJsZTxQaGVub21lbm9uPiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3JlYXRlUmVxdWVzdFVybChhcGlVcmwsICdwaGVub21lbmEnLCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8UGhlbm9tZW5vbj4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPZmZlcmluZ3MoYXBpVXJsOiBzdHJpbmcsIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlciwgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9ucyk6IE9ic2VydmFibGU8T2ZmZXJpbmdbXT4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAnb2ZmZXJpbmdzJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8T2ZmZXJpbmdbXT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPZmZlcmluZyhcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgYXBpVXJsOiBzdHJpbmcsXG4gICAgICAgIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlcixcbiAgICAgICAgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9uc1xuICAgICk6IE9ic2VydmFibGU8T2ZmZXJpbmc+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ29mZmVyaW5ncycsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEFwaTxPZmZlcmluZz4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGZWF0dXJlcyhhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxGZWF0dXJlW10+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ2ZlYXR1cmVzJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8RmVhdHVyZVtdPih1cmwsIHBhcmFtcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZlYXR1cmUoXG4gICAgICAgIGlkOiBzdHJpbmcsXG4gICAgICAgIGFwaVVybDogc3RyaW5nLFxuICAgICAgICBwYXJhbXM/OiBQYXJhbWV0ZXJGaWx0ZXIsXG4gICAgICAgIG9wdGlvbnM/OiBIdHRwUmVxdWVzdE9wdGlvbnNcbiAgICApOiBPYnNlcnZhYmxlPEZlYXR1cmU+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ2ZlYXR1cmVzJywgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QXBpPEZlYXR1cmU+KHVybCwgcGFyYW1zLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UHJvY2VkdXJlcyhhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxQcm9jZWR1cmVbXT4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAncHJvY2VkdXJlcycpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QXBpPFByb2NlZHVyZVtdPih1cmwsIHBhcmFtcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFByb2NlZHVyZShcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgYXBpVXJsOiBzdHJpbmcsXG4gICAgICAgIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlcixcbiAgICAgICAgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9uc1xuICAgICk6IE9ic2VydmFibGU8UHJvY2VkdXJlPiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3JlYXRlUmVxdWVzdFVybChhcGlVcmwsICdwcm9jZWR1cmVzJywgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QXBpPFByb2NlZHVyZT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQbGF0Zm9ybXMoYXBpVXJsOiBzdHJpbmcsIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlciwgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9ucyk6IE9ic2VydmFibGU8UGxhdGZvcm1bXT4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAncGxhdGZvcm1zJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8UGxhdGZvcm1bXT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQbGF0Zm9ybShcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgYXBpVXJsOiBzdHJpbmcsXG4gICAgICAgIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlcixcbiAgICAgICAgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9uc1xuICAgICk6IE9ic2VydmFibGU8UGxhdGZvcm0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ3BsYXRmb3JtcycsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEFwaTxQbGF0Zm9ybT4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREYXRhc2V0cyhhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxEYXRhc2V0W10+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVSZXF1ZXN0VXJsKGFwaVVybCwgJ2RhdGFzZXRzJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8RGF0YXNldFtdPih1cmwsIHBhcmFtcywgb3B0aW9ucykucGlwZShcbiAgICAgICAgICAgIG1hcCgobGlzdCkgPT4gbGlzdC5tYXAoKGVudHJ5KSA9PiB0aGlzLnByZXBhcmVEYXRhc2V0KGVudHJ5LCBhcGlVcmwpKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGF0YXNldChpZDogc3RyaW5nLCBhcGlVcmw6IHN0cmluZywgcGFyYW1zPzogUGFyYW1ldGVyRmlsdGVyLCBvcHRpb25zPzogSHR0cFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTxEYXRhc2V0PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3JlYXRlUmVxdWVzdFVybChhcGlVcmwsICdkYXRhc2V0cycsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEFwaTxEYXRhc2V0Pih1cmwsIHBhcmFtcywgb3B0aW9ucykucGlwZShcbiAgICAgICAgICAgIG1hcCgocmVzKSA9PiB0aGlzLnByZXBhcmVEYXRhc2V0KHJlcywgYXBpVXJsKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGF0YXNldEJ5SW50ZXJuYWxJZChpbnRlcm5hbElkOiBzdHJpbmcsIHBhcmFtcz86IFBhcmFtZXRlckZpbHRlciwgb3B0aW9ucz86IEh0dHBSZXF1ZXN0T3B0aW9ucyk6IE9ic2VydmFibGU8RGF0YXNldD4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZElkID0gdGhpcy5pbnRlcm5hbERhdGFzZXRJZC5yZXNvbHZlSW50ZXJuYWxJZChpbnRlcm5hbElkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YXNldChyZXNvbHZlZElkLmlkLCByZXNvbHZlZElkLnVybCwgcGFyYW1zLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGF0YTxUPihcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgYXBpVXJsOiBzdHJpbmcsXG4gICAgICAgIHRpbWVzcGFuOiBUaW1lc3BhbixcbiAgICAgICAgcGFyYW1zOiBEYXRhUGFyYW1ldGVyRmlsdGVyID0ge30sXG4gICAgICAgIG9wdGlvbnM6IEh0dHBSZXF1ZXN0T3B0aW9uc1xuICAgICk6IE9ic2VydmFibGU8RGF0YTxUPj4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVJlcXVlc3RVcmwoYXBpVXJsLCAnZGF0YXNldHMnLCBpZCkgKyAnL2RhdGEnO1xuICAgICAgICBwYXJhbXMudGltZXNwYW4gPSB0aGlzLmNyZWF0ZVJlcXVlc3RUaW1lc3Bhbih0aW1lc3Bhbik7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RBcGk8RGF0YTxUPj4odXJsLCBwYXJhbXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIHB1YmxpYyBnZXRHZW9tZXRyaWVzKGlkOiBzdHJpbmcsIGFwaVVybDogc3RyaW5nLCBwYXJhbXM/KTogT2JzZXJ2YWJsZTw+IHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICAvLyB9XG5cbiAgICAvLyBwcm90ZWN0ZWQgY3JlYXRlUmVxdWVzdFRpbWVzcGFuKHRpbWVzcGFuOiBUaW1lc3Bhbik6IHN0cmluZyB7XG4gICAgLy8gICAgIHJldHVybiBlbmNvZGVVUkkobW9tZW50KHRpbWVzcGFuLmZyb20pLmZvcm1hdCgpICsgJy8nICsgbW9tZW50KHRpbWVzcGFuLnRvKS5mb3JtYXQoKSk7XG4gICAgLy8gfVxuXG4gICAgcHJpdmF0ZSByZXF1ZXN0QXBpVGV4dGVkKHVybDogc3RyaW5nLCBwYXJhbXM6IFBhcmFtZXRlckZpbHRlciA9IHt9LCBvcHRpb25zOiBIdHRwUmVxdWVzdE9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBzZXJ2aWNlLmNsaWVudChvcHRpb25zKS5nZXQodXJsLCB7XG4gICAgICAgICAgICBwYXJhbXM6IHRoaXMucHJlcGFyZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXF1ZXN0QXBpVGV4dGVkUG9zdCh1cmw6IHN0cmluZywgcGFyYW1zOiBQYXJhbWV0ZXJGaWx0ZXIgPSB7fSwgb3B0aW9uczogSHR0cFJlcXVlc3RPcHRpb25zID0ge30pOiBPYnNlcnZhYmxlPE9iamVjdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwc2VydmljZS5jbGllbnQoKS5wb3N0KHVybCwgcGFyYW1zLCB7XG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVEYXRhc2V0KGRhdGFzZXRPYmo6IERhdGFzZXQsIGFwaVVybDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSBkZXNlcmlhbGl6ZTxEYXRhc2V0PihEYXRhc2V0LCBKU09OLnN0cmluZ2lmeShkYXRhc2V0T2JqKSk7XG4gICAgICAgIGRhdGFzZXQudXJsID0gYXBpVXJsO1xuICAgICAgICB0aGlzLmludGVybmFsRGF0YXNldElkLmdlbmVyYXRlSW50ZXJuYWxJZChkYXRhc2V0KTtcbiAgICAgICAgaWYgKGRhdGFzZXQuc2VyaWVzUGFyYW1ldGVycykge1xuICAgICAgICAgICAgZGF0YXNldC5wYXJhbWV0ZXJzID0gZGF0YXNldC5zZXJpZXNQYXJhbWV0ZXJzO1xuICAgICAgICAgICAgZGVsZXRlIGRhdGFzZXQuc2VyaWVzUGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YXNldDtcbiAgICB9XG59XG4iXX0=