UNPKG

air-lib

Version:

This is Air's angular component library

526 lines 47.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; 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"; var HttpService = /** @class */ (function () { function HttpService(http, sessionContext) { this.http = http; this.sessionContext = sessionContext; if (!sessionContext) { throw new Error('SessionContext is null'); } } /** * @param {?} url * @param {?=} useAuthorizationHeader * @return {?} */ HttpService.prototype.httpGet = /** * @param {?} url * @param {?=} useAuthorizationHeader * @return {?} */ function (url, useAuthorizationHeader) { if (useAuthorizationHeader === void 0) { useAuthorizationHeader = true; } /** @type {?} */ var headers = this.getHeaders(this.sessionContext, useAuthorizationHeader); if (this.sessionContext.apiServer) { url = this.sessionContext.apiServer + url; } return this.http.get(url, { headers: headers, responseType: 'json' }); }; /** * @param {?} url * @param {?=} useAuthorizationHeader * @return {?} */ HttpService.prototype.get = /** * @param {?} url * @param {?=} useAuthorizationHeader * @return {?} */ function (url, useAuthorizationHeader) { if (useAuthorizationHeader === void 0) { useAuthorizationHeader = true; } /** @type {?} */ var headers = this.getHeaders(this.sessionContext, useAuthorizationHeader); if (this.sessionContext.apiServer) { url = this.sessionContext.apiServer + url; } return this.http.get(url, { headers: headers, observe: 'response' }); }; /** * @param {?} url * @param {?=} useAuthorizationHeader * @param {?=} useApiServer * @param {?=} userequestOption * @return {?} */ HttpService.prototype.httpGetFile = /** * @param {?} url * @param {?=} useAuthorizationHeader * @param {?=} useApiServer * @param {?=} userequestOption * @return {?} */ function (url, useAuthorizationHeader, useApiServer, userequestOption) { if (useAuthorizationHeader === void 0) { useAuthorizationHeader = true; } if (useApiServer === void 0) { useApiServer = false; } if (userequestOption === void 0) { userequestOption = false; } /** @type {?} */ var 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 {?} */ HttpService.prototype.getChunkedResponse = /** * @param {?} method * @param {?} url * @param {?} object * @param {?=} reportProgressCallback * @return {?} */ function (method, url, object, reportProgressCallback) { var _this = this; if (reportProgressCallback === void 0) { reportProgressCallback = null; } return new Promise(function (resolve, reject) { /** @type {?} */ var _xhr = new XMLHttpRequest(); /** @type {?} */ var previousLen = 0; /** @type {?} */ var data = JSON.stringify(object); /** @type {?} */ var 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 = function () { /** @type {?} */ var text = _xhr.responseText; if (!text || text.length === 0) { return; } text = text.substring(previousLen); if (text.length === 0) { complete(); return; } /** @type {?} */ var items = text.split('\n-- values separator --').map(function (x) { return x.trim(); }); if (items.length > 0) { /** @type {?} */ var lastItem = items[items.length - 1]; /** @type {?} */ var trimmedValue = lastItem.length > 0 ? lastItem[lastItem.length - 1].trim() : lastItem.trim(); if (trimmedValue !== '') { items.pop(); } } if (items.length > 0) { /** @type {?} */ var dataItem = tslib_1.__spread(items).filter(function (x) { return 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 {?} */ HttpService.prototype.httpPost = /** * @param {?} url * @param {?} object * @param {?=} useAuthorizationHeader * @param {?=} requestType * @return {?} */ function (url, object, useAuthorizationHeader, requestType) { if (useAuthorizationHeader === void 0) { useAuthorizationHeader = true; } if (requestType === void 0) { requestType = 'json'; } /** @type {?} */ var body = requestType === 'json' ? JSON.stringify(object) : object; /** @type {?} */ var 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: headers, responseType: 'json', withCredentials: true }); }; // tslint:disable-next-line:max-line-length // tslint:disable-next-line:max-line-length /** * @param {?} url * @param {?} object * @param {?=} useAuthorizationHeader * @param {?=} requestType * @param {?=} customHeaders * @return {?} */ HttpService.prototype.post = // tslint:disable-next-line:max-line-length /** * @param {?} url * @param {?} object * @param {?=} useAuthorizationHeader * @param {?=} requestType * @param {?=} customHeaders * @return {?} */ function (url, object, useAuthorizationHeader, requestType, customHeaders) { if (useAuthorizationHeader === void 0) { useAuthorizationHeader = true; } if (requestType === void 0) { requestType = 'json'; } if (customHeaders === void 0) { customHeaders = null; } /** @type {?} */ var body = requestType === 'json' ? JSON.stringify(object) : object; /** @type {?} */ var 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: headers, responseType: 'json', withCredentials: true, observe: 'response' }); }; /** * @param {?} url * @param {?} object * @param {?=} useAuthorizationHeader * @return {?} */ HttpService.prototype.httpPut = /** * @param {?} url * @param {?} object * @param {?=} useAuthorizationHeader * @return {?} */ function (url, object, useAuthorizationHeader) { if (useAuthorizationHeader === void 0) { useAuthorizationHeader = true; } /** @type {?} */ var body = JSON.stringify(object); /** @type {?} */ var headers = this.getHeaders(this.sessionContext, useAuthorizationHeader); if (this.sessionContext) { url = this.sessionContext.apiServer + url; } return this.http.put(url, body, { headers: headers, responseType: 'json' }); }; // tslint:disable-next-line:max-line-length // tslint:disable-next-line:max-line-length /** * @param {?} url * @param {?} object * @param {?=} useAuthorizationHeader * @param {?=} customHeaders * @return {?} */ HttpService.prototype.put = // tslint:disable-next-line:max-line-length /** * @param {?} url * @param {?} object * @param {?=} useAuthorizationHeader * @param {?=} customHeaders * @return {?} */ function (url, object, useAuthorizationHeader, customHeaders) { if (useAuthorizationHeader === void 0) { useAuthorizationHeader = true; } if (customHeaders === void 0) { customHeaders = null; } /** @type {?} */ var body = JSON.stringify(object); /** @type {?} */ var 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: headers, responseType: 'json', withCredentials: true, observe: 'response' }); }; // tslint:disable-next-line:max-line-length // tslint:disable-next-line:max-line-length /** * @param {?} url * @param {?=} useAuthorizationHeader * @param {?=} customHeaders * @return {?} */ HttpService.prototype.delete = // tslint:disable-next-line:max-line-length /** * @param {?} url * @param {?=} useAuthorizationHeader * @param {?=} customHeaders * @return {?} */ function (url, useAuthorizationHeader, customHeaders) { if (useAuthorizationHeader === void 0) { useAuthorizationHeader = true; } if (customHeaders === void 0) { customHeaders = null; } /** @type {?} */ var headers = this.getHeaders(this.sessionContext, useAuthorizationHeader); if (customHeaders) { headers = this.appendCustomHeaders(headers, customHeaders); } return this.http.delete(this.sessionContext.apiServer + url, { headers: headers, responseType: 'json', withCredentials: true, observe: 'response' }); }; /** * @param {?} url * @param {?=} useAuthorizationHeader * @return {?} */ HttpService.prototype.httpDelete = /** * @param {?} url * @param {?=} useAuthorizationHeader * @return {?} */ function (url, useAuthorizationHeader) { if (useAuthorizationHeader === void 0) { useAuthorizationHeader = true; } /** @type {?} */ var headers = this.getHeaders(this.sessionContext, useAuthorizationHeader); return this.http.delete(this.sessionContext.apiServer + url, { headers: headers, responseType: 'json' }); }; /** * @param {?} url * @param {?} file * @param {?=} useAuthorizationHeader * @return {?} */ HttpService.prototype.httpPostAttachment = /** * @param {?} url * @param {?} file * @param {?=} useAuthorizationHeader * @return {?} */ function (url, file, useAuthorizationHeader) { var _this = this; if (useAuthorizationHeader === void 0) { useAuthorizationHeader = true; } return new Promise(function (resolve, reject) { /** @type {?} */ var xhr = new XMLHttpRequest(); /** @type {?} */ var formData = new FormData(); formData.append('file', file, file.name); xhr.onreadystatechange = function () { 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 // tslint:disable-next-line:max-line-length /** * @param {?} sessionContext * @param {?} useAuthorizationHeader * @param {?=} contentTypeHeader * @return {?} */ HttpService.prototype.getHeaders = // tslint:disable-next-line:max-line-length /** * @param {?} sessionContext * @param {?} useAuthorizationHeader * @param {?=} contentTypeHeader * @return {?} */ function (sessionContext, useAuthorizationHeader, contentTypeHeader) { if (contentTypeHeader === void 0) { contentTypeHeader = 'application/json'; } /** @type {?} */ var 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 {?} */ HttpService.prototype.getStateByName = /** * @param {?} name * @return {?} */ function (name) { /** @type {?} */ var result = this.httpGet(Const.urlGetStateByName + name); return result.map(function (data) { if (data) { return JSON.parse(data); } return null; }); }; /** * @param {?} name * @param {?} state * @return {?} */ HttpService.prototype.setStateByName = /** * @param {?} name * @param {?} state * @return {?} */ function (name, state) { /** @type {?} */ var strState = JSON.stringify(state); this.httpPut(Const.urlSetState + name, strState) .subscribe(function () { }, function (err) { return console.log(err); }); }; /** * @private * @param {?} headers * @param {?} customHeaders * @return {?} */ HttpService.prototype.appendCustomHeaders = /** * @private * @param {?} headers * @param {?} customHeaders * @return {?} */ function (headers, customHeaders) { if (customHeaders) { customHeaders.forEach(function (key, value) { headers = headers.append(key, value); }); } return headers; }; HttpService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; HttpService.ctorParameters = function () { return [ { 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" }); return HttpService; }()); export { HttpService }; if (false) { /** @type {?} */ HttpService.prototype.http; /** @type {?} */ HttpService.prototype.sessionContext; } var Const = /** @class */ (function () { function Const() { } Const.urlSetState = 'api/State/SetState/'; Const.urlGetStateByName = 'api/State/GetStateByName?name='; return Const; }()); if (false) { /** @type {?} */ Const.urlSetState; /** @type {?} */ Const.urlGetStateByName; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWlyLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9odHRwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFnQixNQUFNLHNCQUFzQixDQUFDO0FBRTdFLE9BQU8sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7O0FBRzdEO0lBS0kscUJBQW1CLElBQWdCLEVBQVMsY0FBOEI7UUFBdkQsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFTLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUN0RSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUM3QztJQUNMLENBQUM7Ozs7OztJQUVNLDZCQUFPOzs7OztJQUFkLFVBQWUsR0FBVyxFQUFFLHNCQUE2QjtRQUE3Qix1Q0FBQSxFQUFBLDZCQUE2Qjs7WUFDL0MsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQztRQUU1RSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFO1lBQy9CLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7U0FDN0M7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sU0FBQSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7Ozs7OztJQUVNLHlCQUFHOzs7OztJQUFWLFVBQVcsR0FBVyxFQUFFLHNCQUE2QjtRQUE3Qix1Q0FBQSxFQUFBLDZCQUE2Qjs7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Y0FBUSxDQUFDLEVBQUUsVUFBQSxHQUFHLElBQUksT0FBQSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFoQixDQUFnQixDQUFDLENBQUM7SUFDdkQsQ0FBQzs7Ozs7OztJQUVPLHlDQUFtQjs7Ozs7O0lBQTNCLFVBQTRCLE9BQW9CLEVBQUUsYUFBa0M7UUFDaEYsSUFBSSxhQUFhLEVBQUU7WUFFZixhQUFhLENBQUMsT0FBTyxDQUFDLFVBQUMsR0FBVyxFQUFFLEtBQWE7Z0JBQzdDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN6QyxDQUFDLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQzs7Z0JBalRKLFVBQVUsU0FBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OztnQkFSUSxVQUFVO2dCQUdWLGNBQWM7OztzQkFKdkI7Q0F5VEMsQUFsVEQsSUFrVEM7U0E5U1ksV0FBVzs7O0lBQ1IsMkJBQXVCOztJQUFFLHFDQUFxQzs7QUErUzlFO0lBQUE7SUFHQSxDQUFDO0lBRmlCLGlCQUFXLEdBQUcscUJBQXFCLENBQUM7SUFDcEMsdUJBQWlCLEdBQUcsZ0NBQWdDLENBQUM7SUFDdkUsWUFBQztDQUFBLEFBSEQsSUFHQzs7O0lBRkcsa0JBQWtEOztJQUNsRCx3QkFBbUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xyXG5pbXBvcnQgeyBTZXNzaW9uQ29udGV4dCB9IGZyb20gJy4uL2VudGl0aWVzL3Nlc3Npb24tY29udGV4dCc7XHJcblxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgSHR0cFNlcnZpY2Uge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIGh0dHA6IEh0dHBDbGllbnQsIHB1YmxpYyBzZXNzaW9uQ29udGV4dDogU2Vzc2lvbkNvbnRleHQpIHtcclxuICAgICAgICBpZiAoIXNlc3Npb25Db250ZXh0KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2Vzc2lvbkNvbnRleHQgaXMgbnVsbCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaHR0cEdldCh1cmw6IHN0cmluZywgdXNlQXV0aG9yaXphdGlvbkhlYWRlciA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmdldEhlYWRlcnModGhpcy5zZXNzaW9uQ29udGV4dCwgdXNlQXV0aG9yaXphdGlvbkhlYWRlcik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25Db250ZXh0LmFwaVNlcnZlcikge1xyXG4gICAgICAgICAgICB1cmwgPSB0aGlzLnNlc3Npb25Db250ZXh0LmFwaVNlcnZlciArIHVybDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCwgeyBoZWFkZXJzLCByZXNwb25zZVR5cGU6ICdqc29uJyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KHVybDogc3RyaW5nLCB1c2VBdXRob3JpemF0aW9uSGVhZGVyID0gdHJ1ZSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPE9iamVjdD4+IHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKHRoaXMuc2Vzc2lvbkNvbnRleHQsIHVzZUF1dGhvcml6YXRpb25IZWFkZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXNzaW9uQ29udGV4dC5hcGlTZXJ2ZXIpIHtcclxuICAgICAgICAgICAgdXJsID0gdGhpcy5zZXNzaW9uQ29udGV4dC5hcGlTZXJ2ZXIgKyB1cmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxIdHRwUmVzcG9uc2U8T2JqZWN0Pj4odXJsLCB7IGhlYWRlcnMsIG9ic2VydmU6ICdyZXNwb25zZScgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBodHRwR2V0RmlsZSh1cmw6IHN0cmluZywgdXNlQXV0aG9yaXphdGlvbkhlYWRlciA9IHRydWUsIHVzZUFwaVNlcnZlciA9IGZhbHNlLCB1c2VyZXF1ZXN0T3B0aW9uID0gZmFsc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIGlmICh1c2VBdXRob3JpemF0aW9uSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIHRoaXMuc2Vzc2lvbkNvbnRleHQuYWNjZXNzVG9rZW4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHVzZUFwaVNlcnZlcikge1xyXG4gICAgICAgICAgICB1cmwgPSB0aGlzLnNlc3Npb25Db250ZXh0LmFwaVNlcnZlciArIHVybDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHVzZXJlcXVlc3RPcHRpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IGhlYWRlcnM6IGhlYWRlcnMsIHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCwgeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2h1bmtlZFJlc3BvbnNlKG1ldGhvZDogc3RyaW5nLCB1cmw6IHN0cmluZywgb2JqZWN0OiBhbnksIHJlcG9ydFByb2dyZXNzQ2FsbGJhY2s6IGFueSA9IG51bGwpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IF94aHI6IFhNTEh0dHBSZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgICAgIGxldCBwcmV2aW91c0xlbiA9IDA7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkob2JqZWN0KTtcclxuICAgICAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvbXBsZXRlLiBDaHVua3MgcmVjZWl2ZWQ6ICcsIHRvdGFsKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlcG9ydFByb2dyZXNzKGNvdW50OiBudW1iZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICghcmVwb3J0UHJvZ3Jlc3NDYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzc0NhbGxiYWNrKGNvdW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgX3hoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IF94aHIucmVzcG9uc2VUZXh0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGV4dCB8fCB0ZXh0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcocHJldmlvdXNMZW4pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGV4dC5zcGxpdCgnXFxuLS0gdmFsdWVzIHNlcGFyYXRvciAtLScpLm1hcCh4ID0+IHgudHJpbSgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SXRlbSA9IGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmltbWVkVmFsdWUgPSBsYXN0SXRlbS5sZW5ndGggPiAwID8gbGFzdEl0ZW1bbGFzdEl0ZW0ubGVuZ3RoIC0gMV0udHJpbSgpIDogbGFzdEl0ZW0udHJpbSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodHJpbW1lZFZhbHVlICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhSXRlbSA9IFsuLi5pdGVtc10uZmlsdGVyKHggPT4geCAhPT0gJycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBkYXRhLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3ModG90YWwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnY2h1bmsgZGF0YTonLCBkYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFJdGVtLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnV29ya2luZy4gQ2h1bmtzIHJlY2VpdmVkOicsIHRvdGFsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBwcmV2aW91c0xlbiArPSB0ZXh0Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoX3hoci5yZWFkeVN0YXRlID09PSA0KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChfeGhyLnN0YXR1cyA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIF94aHIub3BlbihtZXRob2QsIHRoaXMuc2Vzc2lvbkNvbnRleHQuYXBpU2VydmVyICsgdXJsLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIF94aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuICAgICAgICAgICAgX3hoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0Jyk7XHJcbiAgICAgICAgICAgIF94aHIuc2V0UmVxdWVzdEhlYWRlcignWC1EaXNhYmxlLUNvbXByZXNzaW9uJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgX3hoci5zZXRSZXF1ZXN0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgdGhpcy5zZXNzaW9uQ29udGV4dC5hY2Nlc3NUb2tlbik7XHJcblxyXG4gICAgICAgICAgICBfeGhyLnNlbmQoZGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGh0dHBQb3N0KHVybDogc3RyaW5nLCBvYmplY3Q6IGFueSwgdXNlQXV0aG9yaXphdGlvbkhlYWRlciA9IHRydWUsIHJlcXVlc3RUeXBlID0gJ2pzb24nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBib2R5ID0gcmVxdWVzdFR5cGUgPT09ICdqc29uJyA/IEpTT04uc3RyaW5naWZ5KG9iamVjdCkgOiBvYmplY3Q7XHJcblxyXG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICAgICAgaWYgKHJlcXVlc3RUeXBlID09PSAnanNvbicpIHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycyh0aGlzLnNlc3Npb25Db250ZXh0LCB1c2VBdXRob3JpemF0aW9uSGVhZGVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKHRoaXMuc2Vzc2lvbkNvbnRleHQsIHVzZUF1dGhvcml6YXRpb25IZWFkZXIsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25Db250ZXh0LmFwaVNlcnZlcikge1xyXG4gICAgICAgICAgICB1cmwgPSB0aGlzLnNlc3Npb25Db250ZXh0LmFwaVNlcnZlciArIHVybDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIGJvZHksIHsgaGVhZGVycywgcmVzcG9uc2VUeXBlOiAnanNvbicsIHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBwdWJsaWMgcG9zdCh1cmw6IHN0cmluZywgb2JqZWN0OiBhbnksIHVzZUF1dGhvcml6YXRpb25IZWFkZXIgPSB0cnVlLCByZXF1ZXN0VHlwZSA9ICdqc29uJywgY3VzdG9tSGVhZGVyczogTWFwPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPSBudWxsKVxyXG4gICAgICAgIDogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8T2JqZWN0Pj4ge1xyXG5cclxuICAgICAgICBjb25zdCBib2R5ID0gcmVxdWVzdFR5cGUgPT09ICdqc29uJyA/IEpTT04uc3RyaW5naWZ5KG9iamVjdCkgOiBvYmplY3Q7XHJcblxyXG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gJ2pzb24nKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSB0aGlzLmdldEhlYWRlcnModGhpcy5zZXNzaW9uQ29udGV4dCwgdXNlQXV0aG9yaXphdGlvbkhlYWRlcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycyh0aGlzLnNlc3Npb25Db250ZXh0LCB1c2VBdXRob3JpemF0aW9uSGVhZGVyLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXNzaW9uQ29udGV4dCkge1xyXG4gICAgICAgICAgICB1cmwgPSB0aGlzLnNlc3Npb25Db250ZXh0LmFwaVNlcnZlciArIHVybDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXN0b21IZWFkZXJzKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSB0aGlzLmFwcGVuZEN1c3RvbUhlYWRlcnMoaGVhZGVycywgY3VzdG9tSGVhZGVycyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8SHR0cFJlc3BvbnNlPE9iamVjdD4+KHVybCwgYm9keSwge1xyXG4gICAgICAgICAgICBoZWFkZXJzLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBodHRwUHV0KHVybDogc3RyaW5nLCBvYmplY3Q6IGFueSwgdXNlQXV0aG9yaXphdGlvbkhlYWRlciA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShvYmplY3QpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmdldEhlYWRlcnModGhpcy5zZXNzaW9uQ29udGV4dCwgdXNlQXV0aG9yaXphdGlvbkhlYWRlcik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25Db250ZXh0KSB7XHJcbiAgICAgICAgICAgIHVybCA9IHRoaXMuc2Vzc2lvbkNvbnRleHQuYXBpU2VydmVyICsgdXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQodXJsLCBib2R5LCB7IGhlYWRlcnMsIHJlc3BvbnNlVHlwZTogJ2pzb24nIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgIHB1YmxpYyBwdXQodXJsOiBzdHJpbmcsIG9iamVjdDogYW55LCB1c2VBdXRob3JpemF0aW9uSGVhZGVyID0gdHJ1ZSwgY3VzdG9tSGVhZGVyczogTWFwPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPSBudWxsKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8T2JqZWN0Pj4ge1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShvYmplY3QpO1xyXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKHRoaXMuc2Vzc2lvbkNvbnRleHQsIHVzZUF1dGhvcml6YXRpb25IZWFkZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXNzaW9uQ29udGV4dCkge1xyXG4gICAgICAgICAgICB1cmwgPSB0aGlzLnNlc3Npb25Db250ZXh0LmFwaVNlcnZlciArIHVybDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXN0b21IZWFkZXJzKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSB0aGlzLmFwcGVuZEN1c3RvbUhlYWRlcnMoaGVhZGVycywgY3VzdG9tSGVhZGVycyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxIdHRwUmVzcG9uc2U8T2JqZWN0Pj4odXJsLCBib2R5LCB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXHJcbiAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZSdcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBwdWJsaWMgZGVsZXRlKHVybDogc3RyaW5nLCB1c2VBdXRob3JpemF0aW9uSGVhZGVyID0gdHJ1ZSwgY3VzdG9tSGVhZGVyczogTWFwPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPSBudWxsKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8T2JqZWN0Pj4ge1xyXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKHRoaXMuc2Vzc2lvbkNvbnRleHQsIHVzZUF1dGhvcml6YXRpb25IZWFkZXIpO1xyXG4gICAgICAgIGlmIChjdXN0b21IZWFkZXJzKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnMgPSB0aGlzLmFwcGVuZEN1c3RvbUhlYWRlcnMoaGVhZGVycywgY3VzdG9tSGVhZGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPEh0dHBSZXNwb25zZTxPYmplY3Q+Pih0aGlzLnNlc3Npb25Db250ZXh0LmFwaVNlcnZlciArIHVybCwge1xyXG4gICAgICAgICAgICBoZWFkZXJzLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGh0dHBEZWxldGUodXJsOiBzdHJpbmcsIHVzZUF1dGhvcml6YXRpb25IZWFkZXIgPSB0cnVlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKHRoaXMuc2Vzc2lvbkNvbnRleHQsIHVzZUF1dGhvcml6YXRpb25IZWFkZXIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKHRoaXMuc2Vzc2lvbkNvbnRleHQuYXBpU2VydmVyICsgdXJsLCB7IGhlYWRlcnMsIHJlc3BvbnNlVHlwZTogJ2pzb24nIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBodHRwUG9zdEF0dGFjaG1lbnQodXJsOiBzdHJpbmcsIGZpbGU6IGFueSwgdXNlQXV0aG9yaXphdGlvbkhlYWRlciA9IHRydWUpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHhocjogWE1MSHR0cFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICAgICAgY29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcblxyXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpO1xyXG5cclxuICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh4aHIucmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh4aHIucmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHhoci5vcGVuKCdQT1NUJywgdGhpcy5zZXNzaW9uQ29udGV4dC5hcGlTZXJ2ZXIgKyB1cmwsIHRydWUpO1xyXG4gICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0ZWQtV2l0aCcsICdYTUxIdHRwUmVxdWVzdCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHVzZUF1dGhvcml6YXRpb25IZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgdGhpcy5zZXNzaW9uQ29udGV4dC5hY2Nlc3NUb2tlbik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHhoci5zZW5kKGZvcm1EYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBwdWJsaWMgZ2V0SGVhZGVycyhzZXNzaW9uQ29udGV4dDogU2Vzc2lvbkNvbnRleHQsIHVzZUF1dGhvcml6YXRpb25IZWFkZXI6IGJvb2xlYW4sIGNvbnRlbnRUeXBlSGVhZGVyOiBzdHJpbmcgPSAnYXBwbGljYXRpb24vanNvbicpOiBIdHRwSGVhZGVycyB7XHJcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuXHJcbiAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xyXG4gICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgY29udGVudFR5cGVIZWFkZXIpO1xyXG5cclxuICAgICAgICBpZiAodXNlQXV0aG9yaXphdGlvbkhlYWRlciAmJiBzZXNzaW9uQ29udGV4dC5hY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB0aGlzLnNlc3Npb25Db250ZXh0LmFjY2Vzc1Rva2VuKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTdGF0ZUJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmh0dHBHZXQoQ29uc3QudXJsR2V0U3RhdGVCeU5hbWUgKyBuYW1lKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0U3RhdGVCeU5hbWUobmFtZTogc3RyaW5nLCBzdGF0ZTogYW55KSB7XHJcbiAgICAgICAgY29uc3Qgc3RyU3RhdGUgPSBKU09OLnN0cmluZ2lmeShzdGF0ZSk7XHJcbiAgICAgICAgdGhpcy5odHRwUHV0KENvbnN0LnVybFNldFN0YXRlICsgbmFtZSwgc3RyU3RhdGUpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4geyB9LCBlcnIgPT4gY29uc29sZS5sb2coZXJyKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcHBlbmRDdXN0b21IZWFkZXJzKGhlYWRlcnM6IEh0dHBIZWFkZXJzLCBjdXN0b21IZWFkZXJzOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogSHR0cEhlYWRlcnMge1xyXG4gICAgICAgIGlmIChjdXN0b21IZWFkZXJzKSB7XHJcblxyXG4gICAgICAgICAgICBjdXN0b21IZWFkZXJzLmZvckVhY2goKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIENvbnN0IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgdXJsU2V0U3RhdGUgPSAnYXBpL1N0YXRlL1NldFN0YXRlLyc7XHJcbiAgICBwdWJsaWMgc3RhdGljIHVybEdldFN0YXRlQnlOYW1lID0gJ2FwaS9TdGF0ZS9HZXRTdGF0ZUJ5TmFtZT9uYW1lPSc7XHJcbn1cclxuIl19