air-lib
Version:
This is Air's angular component library
401 lines • 42.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import 'rxjs/add/operator/map';
import { SessionContext } from '../entities/session-context';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "../entities/session-context";
export class HttpService {
/**
* @param {?} http
* @param {?} sessionContext
*/
constructor(http, sessionContext) {
this.http = http;
this.sessionContext = sessionContext;
if (!sessionContext) {
throw new Error('SessionContext is null');
}
}
/**
* @param {?} url
* @param {?=} useAuthorizationHeader
* @return {?}
*/
httpGet(url, useAuthorizationHeader = true) {
/** @type {?} */
const headers = this.getHeaders(this.sessionContext, useAuthorizationHeader);
if (this.sessionContext.apiServer) {
url = this.sessionContext.apiServer + url;
}
return this.http.get(url, { headers, responseType: 'json' });
}
/**
* @param {?} url
* @param {?=} useAuthorizationHeader
* @return {?}
*/
get(url, useAuthorizationHeader = true) {
/** @type {?} */
const headers = this.getHeaders(this.sessionContext, useAuthorizationHeader);
if (this.sessionContext.apiServer) {
url = this.sessionContext.apiServer + url;
}
return this.http.get(url, { headers, observe: 'response' });
}
/**
* @param {?} url
* @param {?=} useAuthorizationHeader
* @param {?=} useApiServer
* @param {?=} userequestOption
* @return {?}
*/
httpGetFile(url, useAuthorizationHeader = true, useApiServer = false, userequestOption = false) {
/** @type {?} */
let headers = new HttpHeaders();
if (useAuthorizationHeader) {
headers = headers.append('Authorization', 'Bearer ' + this.sessionContext.accessToken);
}
if (useApiServer) {
url = this.sessionContext.apiServer + url;
}
if (userequestOption) {
return this.http.get(url, { headers: headers, responseType: 'blob' });
}
else {
return this.http.get(url, { headers: headers });
}
}
/**
* @param {?} method
* @param {?} url
* @param {?} object
* @param {?=} reportProgressCallback
* @return {?}
*/
getChunkedResponse(method, url, object, reportProgressCallback = null) {
return new Promise((resolve, reject) => {
/** @type {?} */
const _xhr = new XMLHttpRequest();
/** @type {?} */
let previousLen = 0;
/** @type {?} */
const data = JSON.stringify(object);
/** @type {?} */
let total = 0;
/**
* @return {?}
*/
function complete() {
console.log('Complete. Chunks received: ', total);
resolve(true);
}
/**
* @param {?} count
* @return {?}
*/
function reportProgress(count) {
if (!reportProgressCallback) {
return;
}
reportProgressCallback(count);
}
_xhr.onreadystatechange = () => {
/** @type {?} */
let text = _xhr.responseText;
if (!text || text.length === 0) {
return;
}
text = text.substring(previousLen);
if (text.length === 0) {
complete();
return;
}
/** @type {?} */
const items = text.split('\n-- values separator --').map(x => x.trim());
if (items.length > 0) {
/** @type {?} */
const lastItem = items[items.length - 1];
/** @type {?} */
const trimmedValue = lastItem.length > 0 ? lastItem[lastItem.length - 1].trim() : lastItem.trim();
if (trimmedValue !== '') {
items.pop();
}
}
if (items.length > 0) {
/** @type {?} */
const dataItem = [...items].filter(x => x !== '');
total += data.length;
reportProgress(total);
// console.log('chunk data:', data);
if (dataItem.length === 0) {
complete();
return;
}
// console.log('Working. Chunks received:', total);
}
previousLen += text.length;
if (_xhr.readyState === 4) {
if (_xhr.status === 200) {
complete();
return;
}
reject(false);
return;
}
};
_xhr.open(method, this.sessionContext.apiServer + url, true);
_xhr.setRequestHeader('Content-Type', 'application/json');
_xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
_xhr.setRequestHeader('X-Disable-Compression', 'true');
_xhr.setRequestHeader('Authorization', 'Bearer ' + this.sessionContext.accessToken);
_xhr.send(data);
});
}
/**
* @param {?} url
* @param {?} object
* @param {?=} useAuthorizationHeader
* @param {?=} requestType
* @return {?}
*/
httpPost(url, object, useAuthorizationHeader = true, requestType = 'json') {
/** @type {?} */
const body = requestType === 'json' ? JSON.stringify(object) : object;
/** @type {?} */
let headers = new HttpHeaders();
if (requestType === 'json') {
headers = this.getHeaders(this.sessionContext, useAuthorizationHeader);
}
else {
headers = this.getHeaders(this.sessionContext, useAuthorizationHeader, 'application/x-www-form-urlencoded');
}
if (this.sessionContext.apiServer) {
url = this.sessionContext.apiServer + url;
}
return this.http.post(url, body, { headers, responseType: 'json', withCredentials: true });
}
// tslint:disable-next-line:max-line-length
/**
* @param {?} url
* @param {?} object
* @param {?=} useAuthorizationHeader
* @param {?=} requestType
* @param {?=} customHeaders
* @return {?}
*/
post(url, object, useAuthorizationHeader = true, requestType = 'json', customHeaders = null) {
/** @type {?} */
const body = requestType === 'json' ? JSON.stringify(object) : object;
/** @type {?} */
let headers = new HttpHeaders();
if (requestType === 'json') {
headers = this.getHeaders(this.sessionContext, useAuthorizationHeader);
}
else {
headers = this.getHeaders(this.sessionContext, useAuthorizationHeader, 'application/x-www-form-urlencoded');
}
if (this.sessionContext) {
url = this.sessionContext.apiServer + url;
}
if (customHeaders) {
headers = this.appendCustomHeaders(headers, customHeaders);
}
return this.http.post(url, body, {
headers,
responseType: 'json',
withCredentials: true,
observe: 'response'
});
}
/**
* @param {?} url
* @param {?} object
* @param {?=} useAuthorizationHeader
* @return {?}
*/
httpPut(url, object, useAuthorizationHeader = true) {
/** @type {?} */
const body = JSON.stringify(object);
/** @type {?} */
const headers = this.getHeaders(this.sessionContext, useAuthorizationHeader);
if (this.sessionContext) {
url = this.sessionContext.apiServer + url;
}
return this.http.put(url, body, { headers, responseType: 'json' });
}
// tslint:disable-next-line:max-line-length
/**
* @param {?} url
* @param {?} object
* @param {?=} useAuthorizationHeader
* @param {?=} customHeaders
* @return {?}
*/
put(url, object, useAuthorizationHeader = true, customHeaders = null) {
/** @type {?} */
const body = JSON.stringify(object);
/** @type {?} */
let headers = this.getHeaders(this.sessionContext, useAuthorizationHeader);
if (this.sessionContext) {
url = this.sessionContext.apiServer + url;
}
if (customHeaders) {
headers = this.appendCustomHeaders(headers, customHeaders);
}
return this.http.put(url, body, {
headers,
responseType: 'json',
withCredentials: true,
observe: 'response'
});
}
// tslint:disable-next-line:max-line-length
/**
* @param {?} url
* @param {?=} useAuthorizationHeader
* @param {?=} customHeaders
* @return {?}
*/
delete(url, useAuthorizationHeader = true, customHeaders = null) {
/** @type {?} */
let headers = this.getHeaders(this.sessionContext, useAuthorizationHeader);
if (customHeaders) {
headers = this.appendCustomHeaders(headers, customHeaders);
}
return this.http.delete(this.sessionContext.apiServer + url, {
headers,
responseType: 'json',
withCredentials: true,
observe: 'response'
});
}
/**
* @param {?} url
* @param {?=} useAuthorizationHeader
* @return {?}
*/
httpDelete(url, useAuthorizationHeader = true) {
/** @type {?} */
const headers = this.getHeaders(this.sessionContext, useAuthorizationHeader);
return this.http.delete(this.sessionContext.apiServer + url, { headers, responseType: 'json' });
}
/**
* @param {?} url
* @param {?} file
* @param {?=} useAuthorizationHeader
* @return {?}
*/
httpPostAttachment(url, file, useAuthorizationHeader = true) {
return new Promise((resolve, reject) => {
/** @type {?} */
const xhr = new XMLHttpRequest();
/** @type {?} */
const formData = new FormData();
formData.append('file', file, file.name);
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
resolve(xhr.response);
}
else {
reject(xhr.response);
}
}
};
xhr.open('POST', this.sessionContext.apiServer + url, true);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
if (useAuthorizationHeader) {
xhr.setRequestHeader('Authorization', 'Bearer ' + this.sessionContext.accessToken);
}
xhr.send(formData);
});
}
// tslint:disable-next-line:max-line-length
/**
* @param {?} sessionContext
* @param {?} useAuthorizationHeader
* @param {?=} contentTypeHeader
* @return {?}
*/
getHeaders(sessionContext, useAuthorizationHeader, contentTypeHeader = 'application/json') {
/** @type {?} */
let headers = new HttpHeaders();
headers = headers.append('Accept', 'application/json');
headers = headers.append('Content-Type', contentTypeHeader);
if (useAuthorizationHeader && sessionContext.accessToken) {
headers = headers.append('Authorization', 'Bearer ' + this.sessionContext.accessToken);
}
return headers;
}
/**
* @param {?} name
* @return {?}
*/
getStateByName(name) {
/** @type {?} */
const result = this.httpGet(Const.urlGetStateByName + name);
return result.map((data) => {
if (data) {
return JSON.parse(data);
}
return null;
});
}
/**
* @param {?} name
* @param {?} state
* @return {?}
*/
setStateByName(name, state) {
/** @type {?} */
const strState = JSON.stringify(state);
this.httpPut(Const.urlSetState + name, strState)
.subscribe(() => { }, err => console.log(err));
}
/**
* @private
* @param {?} headers
* @param {?} customHeaders
* @return {?}
*/
appendCustomHeaders(headers, customHeaders) {
if (customHeaders) {
customHeaders.forEach((key, value) => {
headers = headers.append(key, value);
});
}
return headers;
}
}
HttpService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
HttpService.ctorParameters = () => [
{ type: HttpClient },
{ type: SessionContext }
];
/** @nocollapse */ HttpService.ngInjectableDef = i0.defineInjectable({ factory: function HttpService_Factory() { return new HttpService(i0.inject(i1.HttpClient), i0.inject(i2.SessionContext)); }, token: HttpService, providedIn: "root" });
if (false) {
/** @type {?} */
HttpService.prototype.http;
/** @type {?} */
HttpService.prototype.sessionContext;
}
class Const {
}
Const.urlSetState = 'api/State/SetState/';
Const.urlGetStateByName = 'api/State/GetStateByName?name=';
if (false) {
/** @type {?} */
Const.urlSetState;
/** @type {?} */
Const.urlGetStateByName;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWlyLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9odHRwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7QUFFN0UsT0FBTyx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7QUFPN0QsTUFBTTs7Ozs7SUFDRixZQUFtQixJQUFnQixFQUFTLGNBQThCO1FBQXZELFNBQUksR0FBSixJQUFJLENBQVk7UUFBUyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDdEUsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDN0M7SUFDTCxDQUFDOzs7Ozs7SUFFTSxPQUFPLENBQUMsR0FBVyxFQUFFLHNCQUFzQixHQUFHLElBQUk7O2NBQy9DLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLENBQUM7UUFFNUUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRTtZQUMvQixHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1NBQzdDO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQzs7Ozs7O0lBRU0sR0FBRyxDQUFDLEdBQVcsRUFBRSxzQkFBc0IsR0FBRyxJQUFJOztjQUMzQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMs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ZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcbmltcG9ydCB7IFNlc3Npb25Db250ZXh0IH0gZnJvbSAnLi4vZW50aXRpZXMvc2Vzc2lvbi1jb250ZXh0JztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBIdHRwU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaHR0cDogSHR0cENsaWVudCwgcHVibGljIHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dCkge1xyXG4gICAgICAgIGlmICghc2Vzc2lvbkNvbnRleHQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXNzaW9uQ29udGV4dCBpcyBudWxsJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBodHRwR2V0KHVybDogc3RyaW5nLCB1c2VBdXRob3JpemF0aW9uSGVhZGVyID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycyh0aGlzLnNlc3Npb25Db250ZXh0LCB1c2VBdXRob3JpemF0aW9uSGVhZGVyKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbkNvbnRleHQuYXBpU2VydmVyKSB7XHJcbiAgICAgICAgICAgIHVybCA9IHRoaXMuc2Vzc2lvbkNvbnRleHQuYXBpU2VydmVyICsgdXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IGhlYWRlcnMsIHJlc3BvbnNlVHlwZTogJ2pzb24nIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQodXJsOiBzdHJpbmcsIHVzZUF1dGhvcml6YXRpb25IZWFkZXIgPSB0cnVlKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8T2JqZWN0Pj4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmdldEhlYWRlcnModGhpcy5zZXNzaW9uQ29udGV4dCwgdXNlQXV0aG9yaXphdGlvbkhlYWRlcik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25Db250ZXh0LmFwaVNlcnZlcikge1xyXG4gICAgICAgICAgICB1cmwgPSB0aGlzLnNlc3Npb25Db250ZXh0LmFwaVNlcnZlciArIHVybDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEh0dHBSZXNwb25zZTxPYmplY3Q+Pih1cmwsIHsgaGVhZGVycywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGh0dHBHZXRGaWxlKHVybDogc3RyaW5nLCB1c2VBdXRob3JpemF0aW9uSGVhZGVyID0gdHJ1ZSwgdXNlQXBpU2VydmVyID0gZmFsc2UsIHVzZXJlcXVlc3RPcHRpb24gPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuXHJcbiAgICAgICAgaWYgKHVzZUF1dGhvcml6YXRpb25IZWFkZXIpIHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgdGhpcy5zZXNzaW9uQ29udGV4dC5hY2Nlc3NUb2tlbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodXNlQXBpU2VydmVyKSB7XHJcbiAgICAgICAgICAgIHVybCA9IHRoaXMuc2Vzc2lvbkNvbnRleHQuYXBpU2VydmVyICsgdXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodXNlcmVxdWVzdE9wdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwsIHsgaGVhZGVyczogaGVhZGVycywgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaHVua2VkUmVzcG9uc2UobWV0aG9kOiBzdHJpbmcsIHVybDogc3RyaW5nLCBvYmplY3Q6IGFueSwgcmVwb3J0UHJvZ3Jlc3NDYWxsYmFjazogYW55ID0gbnVsbCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgX3hocjogWE1MSHR0cFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICAgICAgbGV0IHByZXZpb3VzTGVuID0gMDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShvYmplY3QpO1xyXG4gICAgICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gY29tcGxldGUoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ29tcGxldGUuIENodW5rcyByZWNlaXZlZDogJywgdG90YWwpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gcmVwb3J0UHJvZ3Jlc3MoY291bnQ6IG51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXBvcnRQcm9ncmVzc0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzQ2FsbGJhY2soY291bnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBfeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gX3hoci5yZXNwb25zZVRleHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0IHx8IHRleHQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyhwcmV2aW91c0xlbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0ZXh0LnNwbGl0KCdcXG4tLSB2YWx1ZXMgc2VwYXJhdG9yIC0tJykubWFwKHggPT4geC50cmltKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RJdGVtID0gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IGxhc3RJdGVtLmxlbmd0aCA+IDAgPyBsYXN0SXRlbVtsYXN0SXRlbS5sZW5ndGggLSAxXS50cmltKCkgOiBsYXN0SXRlbS50cmltKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmltbWVkVmFsdWUgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFJdGVtID0gWy4uLml0ZW1zXS5maWx0ZXIoeCA9PiB4ICE9PSAnJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGRhdGEubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzcyh0b3RhbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdjaHVuayBkYXRhOicsIGRhdGEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YUl0ZW0ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdXb3JraW5nLiBDaHVua3MgcmVjZWl2ZWQ6JywgdG90YWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHByZXZpb3VzTGVuICs9IHRleHQubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChfeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKF94aHIuc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgX3hoci5vcGVuKG1ldGhvZCwgdGhpcy5zZXNzaW9uQ29udGV4dC5hcGlTZXJ2ZXIgKyB1cmwsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgX3hoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xyXG4gICAgICAgICAgICBfeGhyLnNldFJlcXVlc3RIZWFkZXIoJ1gtUmVxdWVzdGVkLVdpdGgnLCAnWE1MSHR0cFJlcXVlc3QnKTtcclxuICAgICAgICAgICAgX3hoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLURpc2FibGUtQ29tcHJlc3Npb24nLCAndHJ1ZScpO1xyXG4gICAgICAgICAgICBfeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB0aGlzLnNlc3Npb25Db250ZXh0LmFjY2Vzc1Rva2VuKTtcclxuXHJcbiAgICAgICAgICAgIF94aHIuc2VuZChkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaHR0cFBvc3QodXJsOiBzdHJpbmcsIG9iamVjdDogYW55LCB1c2VBdXRob3JpemF0aW9uSGVhZGVyID0gdHJ1ZSwgcmVxdWVzdFR5cGUgPSAnanNvbicpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSByZXF1ZXN0VHlwZSA9PT0gJ2pzb24nID8gSlNPTi5zdHJpbmdpZnkob2JqZWN0KSA6IG9iamVjdDtcclxuXHJcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgICAgICBpZiAocmVxdWVzdFR5cGUgPT09ICdqc29uJykge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKHRoaXMuc2Vzc2lvbkNvbnRleHQsIHVzZUF1dGhvcml6YXRpb25IZWFkZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSB0aGlzLmdldEhlYWRlcnModGhpcy5zZXNzaW9uQ29udGV4dCwgdXNlQXV0aG9yaXphdGlvbkhlYWRlciwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbkNvbnRleHQuYXBpU2VydmVyKSB7XHJcbiAgICAgICAgICAgIHVybCA9IHRoaXMuc2Vzc2lvbkNvbnRleHQuYXBpU2VydmVyICsgdXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwgYm9keSwgeyBoZWFkZXJzLCByZXNwb25zZVR5cGU6ICdqc29uJywgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgIHB1YmxpYyBwb3N0KHVybDogc3RyaW5nLCBvYmplY3Q6IGFueSwgdXNlQXV0aG9yaXphdGlvbkhlYWRlciA9IHRydWUsIHJlcXVlc3RUeXBlID0gJ2pzb24nLCBjdXN0b21IZWFkZXJzOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCA9IG51bGwpXHJcbiAgICAgICAgOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxPYmplY3Q+PiB7XHJcblxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSByZXF1ZXN0VHlwZSA9PT0gJ2pzb24nID8gSlNPTi5zdHJpbmdpZnkob2JqZWN0KSA6IG9iamVjdDtcclxuXHJcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcXVlc3RUeXBlID09PSAnanNvbicpIHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycyh0aGlzLnNlc3Npb25Db250ZXh0LCB1c2VBdXRob3JpemF0aW9uSGVhZGVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKHRoaXMuc2Vzc2lvbkNvbnRleHQsIHVzZUF1dGhvcml6YXRpb25IZWFkZXIsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25Db250ZXh0KSB7XHJcbiAgICAgICAgICAgIHVybCA9IHRoaXMuc2Vzc2lvbkNvbnRleHQuYXBpU2VydmVyICsgdXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN1c3RvbUhlYWRlcnMpIHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IHRoaXMuYXBwZW5kQ3VzdG9tSGVhZGVycyhoZWFkZXJzLCBjdXN0b21IZWFkZXJzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxIdHRwUmVzcG9uc2U8T2JqZWN0Pj4odXJsLCBib2R5LCB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXHJcbiAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZSdcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGh0dHBQdXQodXJsOiBzdHJpbmcsIG9iamVjdDogYW55LCB1c2VBdXRob3JpemF0aW9uSGVhZGVyID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9iamVjdCk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycyh0aGlzLnNlc3Npb25Db250ZXh0LCB1c2VBdXRob3JpemF0aW9uSGVhZGVyKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbkNvbnRleHQpIHtcclxuICAgICAgICAgICAgdXJsID0gdGhpcy5zZXNzaW9uQ29udGV4dC5hcGlTZXJ2ZXIgKyB1cmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnB1dCh1cmwsIGJvZHksIHsgaGVhZGVycywgcmVzcG9uc2VUeXBlOiAnanNvbicgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgcHVibGljIHB1dCh1cmw6IHN0cmluZywgb2JqZWN0OiBhbnksIHVzZUF1dGhvcml6YXRpb25IZWFkZXIgPSB0cnVlLCBjdXN0b21IZWFkZXJzOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCA9IG51bGwpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxPYmplY3Q+PiB7XHJcbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9iamVjdCk7XHJcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmdldEhlYWRlcnModGhpcy5zZXNzaW9uQ29udGV4dCwgdXNlQXV0aG9yaXphdGlvbkhlYWRlcik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25Db250ZXh0KSB7XHJcbiAgICAgICAgICAgIHVybCA9IHRoaXMuc2Vzc2lvbkNvbnRleHQuYXBpU2VydmVyICsgdXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN1c3RvbUhlYWRlcnMpIHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IHRoaXMuYXBwZW5kQ3VzdG9tSGVhZGVycyhoZWFkZXJzLCBjdXN0b21IZWFkZXJzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEh0dHBSZXNwb25zZTxPYmplY3Q+Pih1cmwsIGJvZHksIHtcclxuICAgICAgICAgICAgaGVhZGVycyxcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcclxuICAgICAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgIHB1YmxpYyBkZWxldGUodXJsOiBzdHJpbmcsIHVzZUF1dGhvcml6YXRpb25IZWFkZXIgPSB0cnVlLCBjdXN0b21IZWFkZXJzOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCA9IG51bGwpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxPYmplY3Q+PiB7XHJcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmdldEhlYWRlcnModGhpcy5zZXNzaW9uQ29udGV4dCwgdXNlQXV0aG9yaXphdGlvbkhlYWRlcik7XHJcbiAgICAgICAgaWYgKGN1c3RvbUhlYWRlcnMpIHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IHRoaXMuYXBwZW5kQ3VzdG9tSGVhZGVycyhoZWFkZXJzLCBjdXN0b21IZWFkZXJzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8SHR0cFJlc3BvbnNlPE9iamVjdD4+KHRoaXMuc2Vzc2lvbkNvbnRleHQuYXBpU2VydmVyICsgdXJsLCB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXHJcbiAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZSdcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaHR0cERlbGV0ZSh1cmw6IHN0cmluZywgdXNlQXV0aG9yaXphdGlvbkhlYWRlciA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmdldEhlYWRlcnModGhpcy5zZXNzaW9uQ29udGV4dCwgdXNlQXV0aG9yaXphdGlvbkhlYWRlcik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUodGhpcy5zZXNzaW9uQ29udGV4dC5hcGlTZXJ2ZXIgKyB1cmwsIHsgaGVhZGVycywgcmVzcG9uc2VUeXBlOiAnanNvbicgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGh0dHBQb3N0QXR0YWNobWVudCh1cmw6IHN0cmluZywgZmlsZTogYW55LCB1c2VBdXRob3JpemF0aW9uSGVhZGVyID0gdHJ1ZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgeGhyOiBYTUxIdHRwUmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuXHJcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XHJcblxyXG4gICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHhoci5yZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHhoci5yZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgeGhyLm9wZW4oJ1BPU1QnLCB0aGlzLnNlc3Npb25Db250ZXh0LmFwaVNlcnZlciArIHVybCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0Jyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodXNlQXV0aG9yaXphdGlvbkhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB0aGlzLnNlc3Npb25Db250ZXh0LmFjY2Vzc1Rva2VuKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgeGhyLnNlbmQoZm9ybURhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgIHB1YmxpYyBnZXRIZWFkZXJzKHNlc3Npb25Db250ZXh0OiBTZXNzaW9uQ29udGV4dCwgdXNlQXV0aG9yaXphdGlvbkhlYWRlcjogYm9vbGVhbiwgY29udGVudFR5cGVIZWFkZXI6IHN0cmluZyA9ICdhcHBsaWNhdGlvbi9qc29uJyk6IEh0dHBIZWFkZXJzIHtcclxuICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG5cclxuICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XHJcbiAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCBjb250ZW50VHlwZUhlYWRlcik7XHJcblxyXG4gICAgICAgIGlmICh1c2VBdXRob3JpemF0aW9uSGVhZGVyICYmIHNlc3Npb25Db250ZXh0LmFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIHRoaXMuc2Vzc2lvbkNvbnRleHQuYWNjZXNzVG9rZW4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFN0YXRlQnlOYW1lKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaHR0cEdldChDb25zdC51cmxHZXRTdGF0ZUJ5TmFtZSArIG5hbWUpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQubWFwKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXRTdGF0ZUJ5TmFtZShuYW1lOiBzdHJpbmcsIHN0YXRlOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBzdHJTdGF0ZSA9IEpTT04uc3RyaW5naWZ5KHN0YXRlKTtcclxuICAgICAgICB0aGlzLmh0dHBQdXQoQ29uc3QudXJsU2V0U3RhdGUgKyBuYW1lLCBzdHJTdGF0ZSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7IH0sIGVyciA9PiBjb25zb2xlLmxvZyhlcnIpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGVuZEN1c3RvbUhlYWRlcnMoaGVhZGVyczogSHR0cEhlYWRlcnMsIGN1c3RvbUhlYWRlcnM6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBIdHRwSGVhZGVycyB7XHJcbiAgICAgICAgaWYgKGN1c3RvbUhlYWRlcnMpIHtcclxuXHJcbiAgICAgICAgICAgIGN1c3RvbUhlYWRlcnMuZm9yRWFjaCgoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaGVhZGVycztcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQ29uc3Qge1xyXG4gICAgcHVibGljIHN0YXRpYyB1cmxTZXRTdGF0ZSA9ICdhcGkvU3RhdGUvU2V0U3RhdGUvJztcclxuICAgIHB1YmxpYyBzdGF0aWMgdXJsR2V0U3RhdGVCeU5hbWUgPSAnYXBpL1N0YXRlL0dldFN0YXRlQnlOYW1lP25hbWU9JztcclxufVxyXG4iXX0=