UNPKG

ngx-mat-lib

Version:

A bunch of utilities and components to use in your Angular 7+ apps!

222 lines (221 loc) 24.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Injectable } from "@angular/core"; import { HttpClient, HttpParams } from "@angular/common/http"; import { XmatConstantsService } from "./xmat-constants.service"; import { XmatResponseTypes, XmatRestVerbs } from "../models/index"; import { Observable, forkJoin } from "rxjs"; import { map } from "rxjs/operators"; import { forEach } from "lodash"; /** * XMAT REST BY TONY SAMPERI * extend this file by adding a public "serviceUrls" variable * and optionally servicesConfigs * * CRUD-HTTP MAPPING * POST Create Crea una nuova risorsa * GET Read Ottiene una risorsa esistente * PUT Update Aggiorna una risorsa o ne modifica lo stato * DELETE Delete Elimina una risorsa */ export class XmatRestService { /** * @param {?} _http * @param {?} _xmatConstants */ constructor(_http, _xmatConstants) { this._http = _http; this._xmatConstants = _xmatConstants; // Sample data this.servicesUrls = {}; this.servicesConfigs = {}; this._restBaseUrl = this._xmatConstants.restBaseUrl; this._ds = this._xmatConstants.ds; } /** * @param {?} file * @param {?=} verb * @param {?=} body * @param {?=} onError * @return {?} */ downloadBlobFromUrl(file, verb = XmatRestVerbs.GET, body, onError) { /** @type {?} */ let call; if (verb === XmatRestVerbs.GET) { call = this.getBlobFromUrl(file, verb); } if (verb === XmatRestVerbs.PATCH) { call = this.getBlobFromUrl(file, verb, body); } call.subscribe((results) => { // IE DOESN'T SUPPORT TRIGGERING SO WE START DOWNLOADING WITH THIS PORKAROUND if (window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(results, file.fileName); } else { /** @type {?} */ const unsafeUrl = URL.createObjectURL(results); /** @type {?} */ const linkEl = document.createElement("a"); linkEl.setAttribute("href", unsafeUrl); linkEl.setAttribute("download", file.fileName); document.body.appendChild(linkEl); linkEl.click(); document.body.removeChild(linkEl); } }, (err) => { typeof onError === typeof isNaN && onError(err); }); } /** * @param {?} file * @param {?=} verb * @param {?=} body * @return {?} */ getBlobFromUrl(file, verb = XmatRestVerbs.GET, body) { if (!file || !file.url) { console.error("XmatRest: invalid XmatFile provided!", file); return void 0; } // Use a default fileName if not set if (!file.fileName || !file.fileName.length) { /** @type {?} */ const ext = file.url.substr(file.url.lastIndexOf(".")); file.fileName = `xmat-document${ext}`; } if (verb === XmatRestVerbs.GET) { return this._http.get(file.url, { responseType: XmatResponseTypes.blob }); } if (verb === XmatRestVerbs.PATCH) { return this._http.patch(file.url, body, { responseType: XmatResponseTypes.blob }); } throw new Error(`XmatRest: invalid verb provided for 'getBlobFromUrl'. Expected GET|PATCH, got ${verb}`); } /** * @param {?} configs * @return {?} */ $all(configs) { /** @type {?} */ const queue = []; forEach(configs, (c) => { queue.push(this.$http(c)); }); return forkJoin(queue); } /** * @template T, U * @param {?} configs * @return {?} */ $allMap(configs) { /** @type {?} */ const queue = []; /** @type {?} */ const queueKeys = []; forEach(configs, (c, key) => { queue.push(this.$http(c)); queueKeys.push(key); }); return forkJoin(queue) .pipe(map((raw) => { /** @type {?} */ const mapped = {}; forEach(raw, (value, index) => { mapped[queueKeys[index]] = value; }); return mapped; })); } /** * @template T * @param {?=} config * @return {?} */ $http(config = this._generateHttpConfig()) { if (!config.method) { config.method = XmatRestVerbs.GET; } if (!config.url) { console.error("Error: [$http:badconfig]", config); return new Observable(); } switch (config.method) { case XmatRestVerbs.GET: /** @type {?} */ let params = config.params || new HttpParams(); /** * Transform data in query params */ if (!!config.data) { // Accepting 0, null, void 0 as empty params if (this._xmatConstants.isStrictlyObject(config.data)) { forEach(Object.keys(config.data), (key) => { params = params.append(key, config.data[key]); }); } else { console.warn("Error: [XmatRest:badparams]"); } } return this._http.get(config.url, { params: params }); case XmatRestVerbs.PATCH: return this._http.patch(config.url, config.data, { params: config.params }); case XmatRestVerbs.POST: return this._http.post(config.url, config.data, { params: config.params }); case XmatRestVerbs.DELETE: return this._http.delete(config.url, { params: config.params }); case XmatRestVerbs.PUT: return this._http.put(config.url, config.data, { params: config.params }); default: console.error("Error: [XmatRest:badmethod]", arguments); return new Observable(); } } /** * @param {?=} method * @param {?=} url * @param {?=} queryable * @return {?} */ _generateHttpConfig(method = XmatRestVerbs.GET, url = "", queryable = false) { url = this._xmatConstants.removeTrailingSlash(url); return /** @type {?} */ ({ method: method, url: url, data: void 0, queryable: queryable }); } } XmatRestService.decorators = [ { type: Injectable } ]; /** @nocollapse */ XmatRestService.ctorParameters = () => [ { type: HttpClient }, { type: XmatConstantsService } ]; if (false) { /** @type {?} */ XmatRestService.prototype.servicesUrls; /** @type {?} */ XmatRestService.prototype.servicesConfigs; /** @type {?} */ XmatRestService.prototype._restBaseUrl; /** @type {?} */ XmatRestService.prototype._ds; /** @type {?} */ XmatRestService.prototype._http; /** @type {?} */ XmatRestService.prototype._xmatConstants; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1hdC1yZXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbWF0LWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy94bWF0LXJlc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFHSCxpQkFBaUIsRUFDakIsYUFBYSxFQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBR3pCLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7QUFlakMsTUFBTSxPQUFPLGVBQWU7Ozs7O0lBNkJ4QixZQUFzQixLQUFpQixFQUN6QixjQUFvQztRQUQ1QixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ3pCLG1CQUFjLEdBQWQsY0FBYyxDQUFzQjs7UUEzQmxELG9CQUF3QixFQUt2QixDQUFDO1FBRUYsdUJBQTJCLEVBYzFCLENBQUM7UUFFRixvQkFBeUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7UUFDekQsV0FBZ0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7S0FLdEM7Ozs7Ozs7O0lBSUQsbUJBQW1CLENBQ2YsSUFBYyxFQUNkLE9BQWdELGFBQWEsQ0FBQyxHQUFHLEVBQ2pFLElBQWlCLEVBQ2pCLE9BQTRCOztRQUU1QixJQUFJLElBQUksQ0FBQztRQUNULElBQUksSUFBSSxLQUFLLGFBQWEsQ0FBQyxHQUFHLEVBQUU7WUFDNUIsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssYUFBYSxDQUFDLEtBQUssRUFBRTtZQUM5QixJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQWEsRUFBRSxFQUFFOztZQUU3QixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ25DLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM3RDtpQkFDSTs7Z0JBQ0QsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7Z0JBQy9DLE1BQU0sTUFBTSxHQUFnQixRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUUvQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3JDO1NBQ0osRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ1osT0FBTyxPQUFPLEtBQUssT0FBTyxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ25ELENBQUMsQ0FBQztLQUNOOzs7Ozs7O0lBSUQsY0FBYyxDQUFDLElBQWMsRUFBRSxPQUFnRCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQVU7UUFDeEcsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1RCxPQUFPLEtBQUssQ0FBQyxDQUFDO1NBQ2pCOztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7O1lBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7U0FDekM7UUFFRCxJQUFJLElBQUksS0FBSyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQzVCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDNUIsWUFBWSxFQUFFLGlCQUFpQixDQUFDLElBQUk7YUFDdkMsQ0FBQyxDQUFDO1NBQ047UUFDRCxJQUFJLElBQUksS0FBSyxhQUFhLENBQUMsS0FBSyxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7Z0JBQ3BDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2FBQ3ZDLENBQUMsQ0FBQztTQUNOO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRkFBaUYsSUFBSSxFQUFFLENBQUMsQ0FBQztLQUM1Rzs7Ozs7SUFFRCxJQUFJLENBQUMsT0FBeUI7O1FBQzFCLE1BQU0sS0FBSyxHQUFzQixFQUFFLENBQUM7UUFDcEMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQWlCLEVBQUUsRUFBRTtZQUNuQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3QixDQUFDLENBQUM7UUFFSCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMxQjs7Ozs7O0lBRUQsT0FBTyxDQUF1RCxPQUFVOztRQUNwRSxNQUFNLEtBQUssR0FBc0IsRUFBRSxDQUFDOztRQUNwQyxNQUFNLFNBQVMsR0FBMkIsRUFBRSxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFpQixFQUFFLEdBQW9CLEVBQUUsRUFBRTtZQUN6RCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZCLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQzthQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBVSxFQUFFLEVBQUU7O1lBQ3JCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMxQixNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ3BDLENBQUMsQ0FBQztZQUVILE9BQU8sTUFBTSxDQUFDO1NBQ2pCLENBQUMsQ0FBQyxDQUFDO0tBQ1g7Ozs7OztJQUVELEtBQUssQ0FBSSxTQUF5QixJQUFJLENBQUMsbUJBQW1CLEVBQUU7UUFDeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDaEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2xELE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztTQUMzQjtRQUNELFFBQVEsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNuQixLQUFLLGFBQWEsQ0FBQyxHQUFHOztnQkFDbEIsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDOzs7O2dCQUkvQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFOztvQkFFZixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUNuRCxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFXLEVBQUUsRUFBRTs0QkFDOUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt5QkFDakQsQ0FBQyxDQUFDO3FCQUNOO3lCQUNJO3dCQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQztxQkFDL0M7aUJBQ0o7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBSSxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDN0QsS0FBSyxhQUFhLENBQUMsS0FBSztnQkFDcEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBSSxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDbkYsS0FBSyxhQUFhLENBQUMsSUFBSTtnQkFDbkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBSSxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDbEYsS0FBSyxhQUFhLENBQUMsTUFBTTtnQkFDckIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBSSxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLEtBQUssYUFBYSxDQUFDLEdBQUc7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ2pGO2dCQUNJLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3hELE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztTQUMvQjtLQUNKOzs7Ozs7O0lBRVMsbUJBQW1CLENBQUMsU0FBd0IsYUFBYSxDQUFDLEdBQUcsRUFBRSxNQUFjLEVBQUUsRUFBRSxZQUFxQixLQUFLO1FBQ2pILEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELHlCQUFPO1lBQ0gsTUFBTSxFQUFFLE1BQU07WUFDZCxHQUFHLEVBQUUsR0FBRztZQUNSLElBQUksRUFBRSxLQUFLLENBQUM7WUFDWixTQUFTLEVBQUUsU0FBUztTQUNMLEVBQUM7S0FDdkI7OztZQTdLSixVQUFVOzs7O1lBM0JGLFVBQVU7WUFFVixvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbi8vXG5pbXBvcnQgeyBYbWF0Q29uc3RhbnRzU2VydmljZSB9IGZyb20gXCIuL3htYXQtY29uc3RhbnRzLnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gICAgWG1hdEZpbGUsXG4gICAgWG1hdEh0dHBDb25maWcsXG4gICAgWG1hdFJlc3BvbnNlVHlwZXMsXG4gICAgWG1hdFJlc3RWZXJic1xufSBmcm9tIFwiLi4vbW9kZWxzL2luZGV4XCI7XG5pbXBvcnQgeyBYbWF0R2VuZXJpY09iamVjdCB9IGZyb20gXCIuLi9tb2RlbHMvaW5kZXhcIjtcbi8vXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgdGhyb3dFcnJvciB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBtYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IGZvckVhY2ggfSBmcm9tIFwibG9kYXNoXCI7XG5cbi8qKlxuICogWE1BVCBSRVNUIEJZIFRPTlkgU0FNUEVSSVxuICogZXh0ZW5kIHRoaXMgZmlsZSBieSBhZGRpbmcgYSBwdWJsaWMgXCJzZXJ2aWNlVXJsc1wiIHZhcmlhYmxlXG4gKiBhbmQgb3B0aW9uYWxseSBzZXJ2aWNlc0NvbmZpZ3NcbiAqXG4gKiBDUlVELUhUVFAgTUFQUElOR1xuICogUE9TVCAgICAgICAgQ3JlYXRlICAgICAgICBDcmVhIHVuYSBudW92YSByaXNvcnNhXG4gKiBHRVQgICAgICAgIFJlYWQgICAgICAgIE90dGllbmUgdW5hIHJpc29yc2EgZXNpc3RlbnRlXG4gKiBQVVQgICAgICAgIFVwZGF0ZSAgICBBZ2dpb3JuYSB1bmEgcmlzb3JzYSBvIG5lIG1vZGlmaWNhIGxvIHN0YXRvXG4gKiBERUxFVEUgICAgRGVsZXRlICAgIEVsaW1pbmEgdW5hIHJpc29yc2FcbiAqL1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgWG1hdFJlc3RTZXJ2aWNlIHtcblxuICAgIC8vIFNhbXBsZSBkYXRhXG4gICAgcmVhZG9ubHkgc2VydmljZXNVcmxzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogIG15U2VydmljZUE6IFwibXktc2VydmljZS1hXCJcbiAgICAgICAgICogIG15U2VydmljZUE6IFwibXktc2VydmljZS1iXCJcbiAgICAgICAgICovXG4gICAgfTtcblxuICAgIHJlYWRvbmx5IHNlcnZpY2VzQ29uZmlncyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIG15U2VydmljZUE6IHtcbiAgICAgICAgICogICAgIGdldDogKCk6IFhtYXRIdHRwQ29uZmlnID0+IHtcbiAgICAgICAgICogICAgICAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdGVIdHRwQ29uZmlnKFhtYXRSZXN0VmVyYnMuR0VULCB0aGlzLnNlcnZpY2VzVXJscy5teVNlcnZpY2VBLCB0cnVlKTtcbiAgICAgICAgICogICAgIH0sXG4gICAgICAgICAqICAgICBwb3N0OiAoKTogWG1hdEh0dHBDb25maWcgPT4ge1xuICAgICAgICAgKiAgICAgICAgIHJldHVybiB0aGlzLl9nZW5lcmF0ZUh0dHBDb25maWcoWG1hdFJlc3RWZXJicy5QT1NULCB0aGlzLnNlcnZpY2VzVXJscy5teVNlcnZpY2VBKTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICogfSxcbiAgICAgICAgICogbXlTZXJ2aWNlQjogKCk6IFhtYXRIdHRwQ29uZmlnID0+IHtcbiAgICAgICAgICogICAgIHJldHVybiB0aGlzLl9nZW5lcmF0ZUh0dHBDb25maWcoWG1hdFJlc3RWZXJicy5HRVQsIHRoaXMuc2VydmljZXNVcmxzLm15U2VydmljZUEsIHRydWUpO1xuICAgICAgICAgKiB9XG4gICAgICAgICAqL1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX3Jlc3RCYXNlVXJsID0gdGhpcy5feG1hdENvbnN0YW50cy5yZXN0QmFzZVVybDtcbiAgICBwcm90ZWN0ZWQgX2RzID0gdGhpcy5feG1hdENvbnN0YW50cy5kcztcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfaHR0cDogSHR0cENsaWVudCxcbiAgICAgICAgcHJvdGVjdGVkIF94bWF0Q29uc3RhbnRzOiBYbWF0Q29uc3RhbnRzU2VydmljZSkge1xuXG4gICAgfVxuXG4gICAgZG93bmxvYWRCbG9iRnJvbVVybChmaWxlOiBYbWF0RmlsZSwgdmVyYj86IFhtYXRSZXN0VmVyYnMuR0VULCBvbkVycm9yPzogKGVycjogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICBkb3dubG9hZEJsb2JGcm9tVXJsKGZpbGU6IFhtYXRGaWxlLCB2ZXJiOiBYbWF0UmVzdFZlcmJzLlBBVENILCBib2R5OiBhbnksIG9uRXJyb3I/OiAoZXJyOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIGRvd25sb2FkQmxvYkZyb21VcmwoXG4gICAgICAgIGZpbGU6IFhtYXRGaWxlLFxuICAgICAgICB2ZXJiOiBYbWF0UmVzdFZlcmJzLkdFVCB8IFhtYXRSZXN0VmVyYnMuUEFUQ0ggPSBYbWF0UmVzdFZlcmJzLkdFVCxcbiAgICAgICAgYm9keT86IGFueSB8IHZvaWQsXG4gICAgICAgIG9uRXJyb3I/OiAoZXJyOiBhbnkpID0+IHZvaWRcbiAgICApOiB2b2lkIHtcbiAgICAgICAgbGV0IGNhbGw7XG4gICAgICAgIGlmICh2ZXJiID09PSBYbWF0UmVzdFZlcmJzLkdFVCkge1xuICAgICAgICAgICAgY2FsbCA9IHRoaXMuZ2V0QmxvYkZyb21VcmwoZmlsZSwgdmVyYik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZlcmIgPT09IFhtYXRSZXN0VmVyYnMuUEFUQ0gpIHtcbiAgICAgICAgICAgIGNhbGwgPSB0aGlzLmdldEJsb2JGcm9tVXJsKGZpbGUsIHZlcmIsIGJvZHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbC5zdWJzY3JpYmUoKHJlc3VsdHM6IEJsb2IpID0+IHtcbiAgICAgICAgICAgIC8vIElFIERPRVNOJ1QgU1VQUE9SVCBUUklHR0VSSU5HIFNPIFdFIFNUQVJUIERPV05MT0FESU5HIFdJVEggVEhJUyBQT1JLQVJPVU5EXG4gICAgICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKSB7XG4gICAgICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKHJlc3VsdHMsIGZpbGUuZmlsZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5zYWZlVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rRWw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICAgICAgICAgICAgbGlua0VsLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgdW5zYWZlVXJsKTtcbiAgICAgICAgICAgICAgICBsaW5rRWwuc2V0QXR0cmlidXRlKFwiZG93bmxvYWRcIiwgZmlsZS5maWxlTmFtZSk7XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmtFbCk7XG4gICAgICAgICAgICAgICAgbGlua0VsLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHR5cGVvZiBvbkVycm9yID09PSB0eXBlb2YgaXNOYU4gJiYgb25FcnJvcihlcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRCbG9iRnJvbVVybChmaWxlOiBYbWF0RmlsZSwgdmVyYj86IFhtYXRSZXN0VmVyYnMuR0VUKTogT2JzZXJ2YWJsZTxCbG9iPjtcbiAgICBnZXRCbG9iRnJvbVVybChmaWxlOiBYbWF0RmlsZSwgdmVyYjogWG1hdFJlc3RWZXJicy5QQVRDSCwgYm9keTogYW55KTogT2JzZXJ2YWJsZTxCbG9iPjtcbiAgICBnZXRCbG9iRnJvbVVybChmaWxlOiBYbWF0RmlsZSwgdmVyYjogWG1hdFJlc3RWZXJicy5HRVQgfCBYbWF0UmVzdFZlcmJzLlBBVENIID0gWG1hdFJlc3RWZXJicy5HRVQsIGJvZHk/OiBhbnkpOiBPYnNlcnZhYmxlPEJsb2I+IHtcbiAgICAgICAgaWYgKCFmaWxlIHx8ICFmaWxlLnVybCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlhtYXRSZXN0OiBpbnZhbGlkIFhtYXRGaWxlIHByb3ZpZGVkIVwiLCBmaWxlKTtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNlIGEgZGVmYXVsdCBmaWxlTmFtZSBpZiBub3Qgc2V0XG4gICAgICAgIGlmICghZmlsZS5maWxlTmFtZSB8fCAhZmlsZS5maWxlTmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGZpbGUudXJsLnN1YnN0cihmaWxlLnVybC5sYXN0SW5kZXhPZihcIi5cIikpO1xuICAgICAgICAgICAgZmlsZS5maWxlTmFtZSA9IGB4bWF0LWRvY3VtZW50JHtleHR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2ZXJiID09PSBYbWF0UmVzdFZlcmJzLkdFVCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0KGZpbGUudXJsLCB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBYbWF0UmVzcG9uc2VUeXBlcy5ibG9iXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmVyYiA9PT0gWG1hdFJlc3RWZXJicy5QQVRDSCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAucGF0Y2goZmlsZS51cmwsIGJvZHksIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IFhtYXRSZXNwb25zZVR5cGVzLmJsb2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYbWF0UmVzdDogaW52YWxpZCB2ZXJiIHByb3ZpZGVkIGZvciAnZ2V0QmxvYkZyb21VcmwnLiBFeHBlY3RlZCBHRVR8UEFUQ0gsIGdvdCAke3ZlcmJ9YCk7XG4gICAgfVxuXG4gICAgJGFsbChjb25maWdzOiBYbWF0SHR0cENvbmZpZ1tdKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgICAgICBjb25zdCBxdWV1ZTogT2JzZXJ2YWJsZTxhbnk+W10gPSBbXTtcbiAgICAgICAgZm9yRWFjaChjb25maWdzLCAoYzogWG1hdEh0dHBDb25maWcpID0+IHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2godGhpcy4kaHR0cChjKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmb3JrSm9pbihxdWV1ZSk7XG4gICAgfVxuXG4gICAgJGFsbE1hcDxUIGV4dGVuZHMgWG1hdEdlbmVyaWNPYmplY3Q8WG1hdEh0dHBDb25maWc+LCBVID0gYW55Pihjb25maWdzOiBUKTogT2JzZXJ2YWJsZTxYbWF0R2VuZXJpY09iamVjdDxVPj4ge1xuICAgICAgICBjb25zdCBxdWV1ZTogT2JzZXJ2YWJsZTxhbnk+W10gPSBbXTtcbiAgICAgICAgY29uc3QgcXVldWVLZXlzOiBBcnJheTxudW1iZXIgfCBzdHJpbmc+ID0gW107XG4gICAgICAgIGZvckVhY2goY29uZmlncywgKGM6IFhtYXRIdHRwQ29uZmlnLCBrZXk6IHN0cmluZyB8IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgcXVldWUucHVzaCh0aGlzLiRodHRwKGMpKTtcbiAgICAgICAgICAgIHF1ZXVlS2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4ocXVldWUpXG4gICAgICAgICAgICAucGlwZShtYXAoKHJhdzogYW55W10pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWQgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3JFYWNoKHJhdywgKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBtYXBwZWRbcXVldWVLZXlzW2luZGV4XV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgJGh0dHA8VD4oY29uZmlnOiBYbWF0SHR0cENvbmZpZyA9IHRoaXMuX2dlbmVyYXRlSHR0cENvbmZpZygpKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGlmICghY29uZmlnLm1ldGhvZCkge1xuICAgICAgICAgICAgY29uZmlnLm1ldGhvZCA9IFhtYXRSZXN0VmVyYnMuR0VUO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29uZmlnLnVybCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOiBbJGh0dHA6YmFkY29uZmlnXVwiLCBjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChjb25maWcubWV0aG9kKSB7XG4gICAgICAgICAgICBjYXNlIFhtYXRSZXN0VmVyYnMuR0VUOlxuICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSBjb25maWcucGFyYW1zIHx8IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogVHJhbnNmb3JtIGRhdGEgaW4gcXVlcnkgcGFyYW1zXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKCEhY29uZmlnLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjZXB0aW5nIDAsIG51bGwsIHZvaWQgMCBhcyBlbXB0eSBwYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3htYXRDb25zdGFudHMuaXNTdHJpY3RseU9iamVjdChjb25maWcuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvckVhY2goT2JqZWN0LmtleXMoY29uZmlnLmRhdGEpLCAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKGtleSwgY29uZmlnLmRhdGFba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkVycm9yOiBbWG1hdFJlc3Q6YmFkcGFyYW1zXVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5nZXQ8VD4oY29uZmlnLnVybCwgeyBwYXJhbXM6IHBhcmFtcyB9KTtcbiAgICAgICAgICAgIGNhc2UgWG1hdFJlc3RWZXJicy5QQVRDSDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wYXRjaDxUPihjb25maWcudXJsLCBjb25maWcuZGF0YSwgeyBwYXJhbXM6IGNvbmZpZy5wYXJhbXMgfSk7XG4gICAgICAgICAgICBjYXNlIFhtYXRSZXN0VmVyYnMuUE9TVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0PFQ+KGNvbmZpZy51cmwsIGNvbmZpZy5kYXRhLCB7IHBhcmFtczogY29uZmlnLnBhcmFtcyB9KTtcbiAgICAgICAgICAgIGNhc2UgWG1hdFJlc3RWZXJicy5ERUxFVEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZGVsZXRlPFQ+KGNvbmZpZy51cmwsIHsgcGFyYW1zOiBjb25maWcucGFyYW1zIH0pO1xuICAgICAgICAgICAgY2FzZSBYbWF0UmVzdFZlcmJzLlBVVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wdXQ8VD4oY29uZmlnLnVybCwgY29uZmlnLmRhdGEsIHsgcGFyYW1zOiBjb25maWcucGFyYW1zIH0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IFtYbWF0UmVzdDpiYWRtZXRob2RdXCIsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2dlbmVyYXRlSHR0cENvbmZpZyhtZXRob2Q6IFhtYXRSZXN0VmVyYnMgPSBYbWF0UmVzdFZlcmJzLkdFVCwgdXJsOiBzdHJpbmcgPSBcIlwiLCBxdWVyeWFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IFhtYXRIdHRwQ29uZmlnIHtcbiAgICAgICAgdXJsID0gdGhpcy5feG1hdENvbnN0YW50cy5yZW1vdmVUcmFpbGluZ1NsYXNoKHVybCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgZGF0YTogdm9pZCAwLFxuICAgICAgICAgICAgcXVlcnlhYmxlOiBxdWVyeWFibGVcbiAgICAgICAgfSBhcyBYbWF0SHR0cENvbmZpZztcbiAgICB9XG59XG5cblxuIl19