nsrtm-gestionarchivo-npm-prueba2
Version:
Proyecto de Libreria Frontend para la Gestión de Archivos
337 lines • 44.4 kB
JavaScript
/* tslint:disable */
/* eslint-disable */
import { HttpRequest, HttpParams, HttpHeaders } from '@angular/common/http';
/**
* Custom parameter codec to correctly handle the plus sign in parameter
* values. See https://github.com/angular/angular/issues/18261
*/
class ParameterCodec {
encodeKey(key) {
return encodeURIComponent(key);
}
encodeValue(value) {
return encodeURIComponent(value);
}
decodeKey(key) {
return decodeURIComponent(key);
}
decodeValue(value) {
return decodeURIComponent(value);
}
}
const ParameterCodecInstance = new ParameterCodec();
/**
* Base class for a parameter
*/
class Parameter {
constructor(name, value, options, defaultStyle, defaultExplode) {
this.name = name;
this.value = value;
this.options = options;
this.options = options || {};
if (this.options.style === null || this.options.style === undefined) {
this.options.style = defaultStyle;
}
if (this.options.explode === null || this.options.explode === undefined) {
this.options.explode = defaultExplode;
}
}
serializeValue(value, separator = ',') {
if (value === null || value === undefined) {
return '';
}
else if (value instanceof Array) {
return value.map(v => this.serializeValue(v).split(separator).join(encodeURIComponent(separator))).join(separator);
}
else if (typeof value === 'object') {
const array = [];
for (const key of Object.keys(value)) {
let propVal = value[key];
if (propVal !== null && propVal !== undefined) {
propVal = this.serializeValue(propVal).split(separator).join(encodeURIComponent(separator));
if (this.options.explode) {
array.push(`${key}=${propVal}`);
}
else {
array.push(key);
array.push(propVal);
}
}
}
return array.join(separator);
}
else {
return String(value);
}
}
}
/**
* A parameter in the operation path
*/
class PathParameter extends Parameter {
constructor(name, value, options) {
super(name, value, options, 'simple', false);
}
append(path) {
let value = this.value;
if (value === null || value === undefined) {
value = '';
}
let prefix = this.options.style === 'label' ? '.' : '';
let separator = this.options.explode ? prefix === '' ? ',' : prefix : ',';
let alreadySerialized = false;
if (this.options.style === 'matrix') {
// The parameter name is just used as prefix, except in some cases...
prefix = `;${this.name}=`;
if (this.options.explode && typeof value === 'object') {
prefix = ';';
if (value instanceof Array) {
// For arrays we have to repeat the name for each element
value = value.map(v => `${this.name}=${this.serializeValue(v, ';')}`);
value = value.join(';');
alreadySerialized = true;
}
else {
// For objects we have to put each the key / value pairs
value = this.serializeValue(value, ';');
alreadySerialized = true;
}
}
}
value = prefix + (alreadySerialized ? value : this.serializeValue(value, separator));
// Replace both the plain variable and the corresponding variant taking in the prefix and explode into account
path = path.replace(`{${this.name}}`, value);
path = path.replace(`{${prefix}${this.name}${this.options.explode ? '*' : ''}}`, value);
return path;
}
// @ts-ignore
serializeValue(value, separator = ',') {
var result = typeof value === 'string' ? encodeURIComponent(value) : super.serializeValue(value, separator);
result = result.replace(/%3D/g, '=');
result = result.replace(/%3B/g, ';');
result = result.replace(/%2C/g, ',');
return result;
}
}
/**
* A parameter in the query
*/
class QueryParameter extends Parameter {
constructor(name, value, options) {
super(name, value, options, 'form', true);
}
append(params) {
if (this.value instanceof Array) {
// Array serialization
if (this.options.explode) {
for (const v of this.value) {
params = params.append(this.name, this.serializeValue(v));
}
}
else {
const separator = this.options.style === 'spaceDelimited'
? ' ' : this.options.style === 'pipeDelimited'
? '|' : ',';
return params.append(this.name, this.serializeValue(this.value, separator));
}
}
else if (this.value !== null && typeof this.value === 'object') {
// Object serialization
if (this.options.style === 'deepObject') {
// Append a parameter for each key, in the form `name[key]`
for (const key of Object.keys(this.value)) {
const propVal = this.value[key];
if (propVal !== null && propVal !== undefined) {
params = params.append(`${this.name}[${key}]`, this.serializeValue(propVal));
}
}
}
else if (this.options.explode) {
// Append a parameter for each key without using the parameter name
for (const key of Object.keys(this.value)) {
const propVal = this.value[key];
if (propVal !== null && propVal !== undefined) {
params = params.append(key, this.serializeValue(propVal));
}
}
}
else {
// Append a single parameter whose values are a comma-separated list of key,value,key,value...
const array = [];
for (const key of Object.keys(this.value)) {
const propVal = this.value[key];
if (propVal !== null && propVal !== undefined) {
array.push(key);
array.push(propVal);
}
}
params = params.append(this.name, this.serializeValue(array));
}
}
else if (this.value !== null && this.value !== undefined) {
// Plain value
params = params.append(this.name, this.serializeValue(this.value));
}
return params;
}
}
/**
* A parameter in the HTTP request header
*/
class HeaderParameter extends Parameter {
constructor(name, value, options) {
super(name, value, options, 'simple', false);
}
append(headers) {
if (this.value !== null && this.value !== undefined) {
if (this.value instanceof Array) {
for (const v of this.value) {
headers = headers.append(this.name, this.serializeValue(v));
}
}
else {
headers = headers.append(this.name, this.serializeValue(this.value));
}
}
return headers;
}
}
/**
* Helper to build http requests from parameters
*/
export class RequestBuilder {
constructor(rootUrl, operationPath, method) {
this.rootUrl = rootUrl;
this.operationPath = operationPath;
this.method = method;
this._path = new Map();
this._query = new Map();
this._header = new Map();
}
/**
* Sets a path parameter
*/
path(name, value, options) {
this._path.set(name, new PathParameter(name, value, options || {}));
}
/**
* Sets a query parameter
*/
query(name, value, options) {
this._query.set(name, new QueryParameter(name, value, options || {}));
}
/**
* Sets a header parameter
*/
header(name, value, options) {
this._header.set(name, new HeaderParameter(name, value, options || {}));
}
/**
* Sets the body content, along with the content type
*/
body(value, contentType = 'application/json') {
if (value instanceof Blob) {
this._bodyContentType = value.type;
}
else {
this._bodyContentType = contentType;
}
if (this._bodyContentType === 'application/x-www-form-urlencoded' && value !== null && typeof value === 'object') {
// Handle URL-encoded data
const pairs = [];
for (const key of Object.keys(value)) {
let val = value[key];
if (!(val instanceof Array)) {
val = [val];
}
for (const v of val) {
const formValue = this.formDataValue(v);
if (formValue !== null) {
pairs.push([key, formValue]);
}
}
}
this._bodyContent = pairs.map(p => `${encodeURIComponent(p[0])}=${encodeURIComponent(p[1])}`).join('&');
}
else if (this._bodyContentType === 'multipart/form-data') {
// Handle multipart form data
const formData = new FormData();
if (value !== null && value !== undefined) {
for (const key of Object.keys(value)) {
const val = value[key];
if (val instanceof Array) {
for (const v of val) {
const toAppend = this.formDataValue(v);
if (toAppend !== null) {
formData.append(key, toAppend);
}
}
}
else {
const toAppend = this.formDataValue(val);
if (toAppend !== null) {
formData.set(key, toAppend);
}
}
}
}
this._bodyContent = formData;
}
else {
// The body is the plain content
this._bodyContent = value;
}
}
formDataValue(value) {
if (value === null || value === undefined) {
return null;
}
if (value instanceof Blob) {
return value;
}
if (typeof value === 'object') {
return JSON.stringify(value);
}
return String(value);
}
/**
* Builds the request with the current set parameters
*/
build(options) {
options = options || {};
// Path parameters
let path = this.operationPath;
for (const pathParam of this._path.values()) {
path = pathParam.append(path);
}
const url = this.rootUrl + path;
// Query parameters
let httpParams = new HttpParams({
encoder: ParameterCodecInstance
});
for (const queryParam of this._query.values()) {
httpParams = queryParam.append(httpParams);
}
// Header parameters
let httpHeaders = new HttpHeaders();
if (options.accept) {
httpHeaders = httpHeaders.append('Accept', options.accept);
}
for (const headerParam of this._header.values()) {
httpHeaders = headerParam.append(httpHeaders);
}
// Request content headers
if (this._bodyContentType && !(this._bodyContent instanceof FormData)) {
httpHeaders = httpHeaders.set('Content-Type', this._bodyContentType);
}
// Perform the request
return new HttpRequest(this.method.toUpperCase(), url, this._bodyContent, {
params: httpParams,
headers: httpHeaders,
responseType: options.responseType,
reportProgress: options.reportProgress,
context: options.context
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vYXJjaGl2by9uc3J0bS1nZXN0aW9uYXJjaGl2by1ucG0vc3JjL2FwcC9hcGkvY29tdW5lcy1yZWdpc3Ryby9yZXF1ZXN0LWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixPQUFPLEVBQUUsV0FBVyxFQUFzQixVQUFVLEVBQUUsV0FBVyxFQUFlLE1BQU0sc0JBQXNCLENBQUM7QUFFN0c7OztHQUdHO0FBQ0gsTUFBTSxjQUFjO0lBQ2xCLFNBQVMsQ0FBQyxHQUFXO1FBQ25CLE9BQU8sa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhO1FBQ3ZCLE9BQU8sa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFXO1FBQ25CLE9BQU8sa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhO1FBQ3ZCLE9BQU8sa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBQ0QsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0FBVXBEOztHQUVHO0FBQ0gsTUFBZSxTQUFTO0lBQ3RCLFlBQW1CLElBQVksRUFBUyxLQUFVLEVBQVMsT0FBeUIsRUFBRSxZQUFvQixFQUFFLGNBQXVCO1FBQWhILFNBQUksR0FBSixJQUFJLENBQVE7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFLO1FBQVMsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDbEYsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLElBQUks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WUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1lBQ2xDLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztZQUN0QyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87U0FDekIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cclxuLyogZXNsaW50LWRpc2FibGUgKi9cclxuaW1wb3J0IHsgSHR0cFJlcXVlc3QsIEh0dHBQYXJhbWV0ZXJDb2RlYywgSHR0cFBhcmFtcywgSHR0cEhlYWRlcnMsIEh0dHBDb250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5cclxuLyoqXHJcbiAqIEN1c3RvbSBwYXJhbWV0ZXIgY29kZWMgdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgcGx1cyBzaWduIGluIHBhcmFtZXRlclxyXG4gKiB2YWx1ZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xODI2MVxyXG4gKi9cclxuY2xhc3MgUGFyYW1ldGVyQ29kZWMgaW1wbGVtZW50cyBIdHRwUGFyYW1ldGVyQ29kZWMge1xyXG4gIGVuY29kZUtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGtleSk7XHJcbiAgfVxyXG5cclxuICBlbmNvZGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZGVjb2RlS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoa2V5KTtcclxuICB9XHJcblxyXG4gIGRlY29kZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XHJcbiAgfVxyXG59XHJcbmNvbnN0IFBhcmFtZXRlckNvZGVjSW5zdGFuY2UgPSBuZXcgUGFyYW1ldGVyQ29kZWMoKTtcclxuXHJcbi8qKlxyXG4gKiBEZWZpbmVzIHRoZSBvcHRpb25zIGZvciBhcHBlbmRpbmcgYSBwYXJhbWV0ZXJcclxuICovXHJcbmludGVyZmFjZSBQYXJhbWV0ZXJPcHRpb25zIHtcclxuICBzdHlsZT86IHN0cmluZztcclxuICBleHBsb2RlPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIGEgcGFyYW1ldGVyXHJcbiAqL1xyXG5hYnN0cmFjdCBjbGFzcyBQYXJhbWV0ZXIge1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyB2YWx1ZTogYW55LCBwdWJsaWMgb3B0aW9uczogUGFyYW1ldGVyT3B0aW9ucywgZGVmYXVsdFN0eWxlOiBzdHJpbmcsIGRlZmF1bHRFeHBsb2RlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdHlsZSA9PT0gbnVsbCB8fCB0aGlzLm9wdGlvbnMuc3R5bGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuc3R5bGUgPSBkZWZhdWx0U3R5bGU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmV4cGxvZGUgPT09IG51bGwgfHwgdGhpcy5vcHRpb25zLmV4cGxvZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuZXhwbG9kZSA9IGRlZmF1bHRFeHBsb2RlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VyaWFsaXplVmFsdWUodmFsdWU6IGFueSwgc2VwYXJhdG9yID0gJywnKTogc3RyaW5nIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICByZXR1cm4gdmFsdWUubWFwKHYgPT4gdGhpcy5zZXJpYWxpemVWYWx1ZSh2KS5zcGxpdChzZXBhcmF0b3IpLmpvaW4oZW5jb2RlVVJJQ29tcG9uZW50KHNlcGFyYXRvcikpKS5qb2luKHNlcGFyYXRvcik7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgY29uc3QgYXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xyXG4gICAgICAgIGxldCBwcm9wVmFsID0gdmFsdWVba2V5XTtcclxuICAgICAgICBpZiAocHJvcFZhbCAhPT0gbnVsbCAmJiBwcm9wVmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHByb3BWYWwgPSB0aGlzLnNlcmlhbGl6ZVZhbHVlKHByb3BWYWwpLnNwbGl0KHNlcGFyYXRvcikuam9pbihlbmNvZGVVUklDb21wb25lbnQoc2VwYXJhdG9yKSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV4cGxvZGUpIHtcclxuICAgICAgICAgICAgYXJyYXkucHVzaChgJHtrZXl9PSR7cHJvcFZhbH1gKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFycmF5LnB1c2goa2V5KTtcclxuICAgICAgICAgICAgYXJyYXkucHVzaChwcm9wVmFsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFycmF5LmpvaW4oc2VwYXJhdG9yKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcGFyYW1ldGVyIGluIHRoZSBvcGVyYXRpb24gcGF0aFxyXG4gKi9cclxuY2xhc3MgUGF0aFBhcmFtZXRlciBleHRlbmRzIFBhcmFtZXRlciB7XHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zOiBQYXJhbWV0ZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcihuYW1lLCB2YWx1ZSwgb3B0aW9ucywgJ3NpbXBsZScsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGFwcGVuZChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZTtcclxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHZhbHVlID0gJyc7XHJcbiAgICB9XHJcbiAgICBsZXQgcHJlZml4ID0gdGhpcy5vcHRpb25zLnN0eWxlID09PSAnbGFiZWwnID8gJy4nIDogJyc7XHJcbiAgICBsZXQgc2VwYXJhdG9yID0gdGhpcy5vcHRpb25zLmV4cGxvZGUgPyBwcmVmaXggPT09ICcnID8gJywnIDogcHJlZml4IDogJywnO1xyXG4gICAgbGV0IGFscmVhZHlTZXJpYWxpemVkID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnN0eWxlID09PSAnbWF0cml4Jykge1xyXG4gICAgICAvLyBUaGUgcGFyYW1ldGVyIG5hbWUgaXMganVzdCB1c2VkIGFzIHByZWZpeCwgZXhjZXB0IGluIHNvbWUgY2FzZXMuLi5cclxuICAgICAgcHJlZml4ID0gYDske3RoaXMubmFtZX09YDtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBsb2RlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICBwcmVmaXggPSAnOyc7XHJcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgIC8vIEZvciBhcnJheXMgd2UgaGF2ZSB0byByZXBlYXQgdGhlIG5hbWUgZm9yIGVhY2ggZWxlbWVudFxyXG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAodiA9PiBgJHt0aGlzLm5hbWV9PSR7dGhpcy5zZXJpYWxpemVWYWx1ZSh2LCAnOycpfWApO1xyXG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5qb2luKCc7Jyk7XHJcbiAgICAgICAgICBhbHJlYWR5U2VyaWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEZvciBvYmplY3RzIHdlIGhhdmUgdG8gcHV0IGVhY2ggdGhlIGtleSAvIHZhbHVlIHBhaXJzXHJcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuc2VyaWFsaXplVmFsdWUodmFsdWUsICc7Jyk7XHJcbiAgICAgICAgICBhbHJlYWR5U2VyaWFsaXplZCA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHZhbHVlID0gcHJlZml4ICsgKGFscmVhZHlTZXJpYWxpemVkID8gdmFsdWUgOiB0aGlzLnNlcmlhbGl6ZVZhbHVlKHZhbHVlLCBzZXBhcmF0b3IpKTtcclxuICAgIC8vIFJlcGxhY2UgYm90aCB0aGUgcGxhaW4gdmFyaWFibGUgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhbnQgdGFraW5nIGluIHRoZSBwcmVmaXggYW5kIGV4cGxvZGUgaW50byBhY2NvdW50XHJcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKGB7JHt0aGlzLm5hbWV9fWAsIHZhbHVlKTtcclxuICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoYHske3ByZWZpeH0ke3RoaXMubmFtZX0ke3RoaXMub3B0aW9ucy5leHBsb2RlID8gJyonIDogJyd9fWAsIHZhbHVlKTtcclxuICAgIHJldHVybiBwYXRoO1xyXG4gIH1cclxuXHJcbiAgLy8gQHRzLWlnbm9yZVxyXG4gIHNlcmlhbGl6ZVZhbHVlKHZhbHVlOiBhbnksIHNlcGFyYXRvciA9ICcsJyk6IHN0cmluZyB7XHJcbiAgICB2YXIgcmVzdWx0ID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgOiBzdXBlci5zZXJpYWxpemVWYWx1ZSh2YWx1ZSwgc2VwYXJhdG9yKTtcclxuICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8lM0QvZywgJz0nKTtcclxuICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8lM0IvZywgJzsnKTtcclxuICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8lMkMvZywgJywnKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQSBwYXJhbWV0ZXIgaW4gdGhlIHF1ZXJ5XHJcbiAqL1xyXG5jbGFzcyBRdWVyeVBhcmFtZXRlciBleHRlbmRzIFBhcmFtZXRlciB7XHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zOiBQYXJhbWV0ZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcihuYW1lLCB2YWx1ZSwgb3B0aW9ucywgJ2Zvcm0nLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIGFwcGVuZChwYXJhbXM6IEh0dHBQYXJhbXMpOiBIdHRwUGFyYW1zIHtcclxuICAgIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgLy8gQXJyYXkgc2VyaWFsaXphdGlvblxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4cGxvZGUpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy52YWx1ZSkge1xyXG4gICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCh0aGlzLm5hbWUsIHRoaXMuc2VyaWFsaXplVmFsdWUodikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSB0aGlzLm9wdGlvbnMuc3R5bGUgPT09ICdzcGFjZURlbGltaXRlZCdcclxuICAgICAgICAgID8gJyAnIDogdGhpcy5vcHRpb25zLnN0eWxlID09PSAncGlwZURlbGltaXRlZCdcclxuICAgICAgICAgICAgPyAnfCcgOiAnLCc7XHJcbiAgICAgICAgcmV0dXJuIHBhcmFtcy5hcHBlbmQodGhpcy5uYW1lLCB0aGlzLnNlcmlhbGl6ZVZhbHVlKHRoaXMudmFsdWUsIHNlcGFyYXRvcikpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMudmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIC8vIE9iamVjdCBzZXJpYWxpemF0aW9uXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3R5bGUgPT09ICdkZWVwT2JqZWN0Jykge1xyXG4gICAgICAgIC8vIEFwcGVuZCBhIHBhcmFtZXRlciBmb3IgZWFjaCBrZXksIGluIHRoZSBmb3JtIGBuYW1lW2tleV1gXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZSkpIHtcclxuICAgICAgICAgIGNvbnN0IHByb3BWYWwgPSB0aGlzLnZhbHVlW2tleV07XHJcbiAgICAgICAgICBpZiAocHJvcFZhbCAhPT0gbnVsbCAmJiBwcm9wVmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChgJHt0aGlzLm5hbWV9WyR7a2V5fV1gLCB0aGlzLnNlcmlhbGl6ZVZhbHVlKHByb3BWYWwpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmV4cGxvZGUpIHtcclxuICAgICAgICAvLyBBcHBlbmQgYSBwYXJhbWV0ZXIgZm9yIGVhY2gga2V5IHdpdGhvdXQgdXNpbmcgdGhlIHBhcmFtZXRlciBuYW1lXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZSkpIHtcclxuICAgICAgICAgIGNvbnN0IHByb3BWYWwgPSB0aGlzLnZhbHVlW2tleV07XHJcbiAgICAgICAgICBpZiAocHJvcFZhbCAhPT0gbnVsbCAmJiBwcm9wVmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChrZXksIHRoaXMuc2VyaWFsaXplVmFsdWUocHJvcFZhbCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBBcHBlbmQgYSBzaW5nbGUgcGFyYW1ldGVyIHdob3NlIHZhbHVlcyBhcmUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBrZXksdmFsdWUsa2V5LHZhbHVlLi4uXHJcbiAgICAgICAgY29uc3QgYXJyYXk6IGFueVtdID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZSkpIHtcclxuICAgICAgICAgIGNvbnN0IHByb3BWYWwgPSB0aGlzLnZhbHVlW2tleV07XHJcbiAgICAgICAgICBpZiAocHJvcFZhbCAhPT0gbnVsbCAmJiBwcm9wVmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgYXJyYXkucHVzaChrZXkpO1xyXG4gICAgICAgICAgICBhcnJheS5wdXNoKHByb3BWYWwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHRoaXMubmFtZSwgdGhpcy5zZXJpYWxpemVWYWx1ZShhcnJheSkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUgIT09IG51bGwgJiYgdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIFBsYWluIHZhbHVlXHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQodGhpcy5uYW1lLCB0aGlzLnNlcmlhbGl6ZVZhbHVlKHRoaXMudmFsdWUpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQSBwYXJhbWV0ZXIgaW4gdGhlIEhUVFAgcmVxdWVzdCBoZWFkZXJcclxuICovXHJcbmNsYXNzIEhlYWRlclBhcmFtZXRlciBleHRlbmRzIFBhcmFtZXRlciB7XHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zOiBQYXJhbWV0ZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcihuYW1lLCB2YWx1ZSwgb3B0aW9ucywgJ3NpbXBsZScsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGFwcGVuZChoZWFkZXJzOiBIdHRwSGVhZGVycyk6IEh0dHBIZWFkZXJzIHtcclxuICAgIGlmICh0aGlzLnZhbHVlICE9PSBudWxsICYmIHRoaXMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIHRoaXMudmFsdWUpIHtcclxuICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZCh0aGlzLm5hbWUsIHRoaXMuc2VyaWFsaXplVmFsdWUodikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQodGhpcy5uYW1lLCB0aGlzLnNlcmlhbGl6ZVZhbHVlKHRoaXMudmFsdWUpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogSGVscGVyIHRvIGJ1aWxkIGh0dHAgcmVxdWVzdHMgZnJvbSBwYXJhbWV0ZXJzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUmVxdWVzdEJ1aWxkZXIge1xyXG5cclxuICBwcml2YXRlIF9wYXRoID0gbmV3IE1hcDxzdHJpbmcsIFBhdGhQYXJhbWV0ZXI+KCk7XHJcbiAgcHJpdmF0ZSBfcXVlcnkgPSBuZXcgTWFwPHN0cmluZywgUXVlcnlQYXJhbWV0ZXI+KCk7XHJcbiAgcHJpdmF0ZSBfaGVhZGVyID0gbmV3IE1hcDxzdHJpbmcsIEhlYWRlclBhcmFtZXRlcj4oKTtcclxuICBfYm9keUNvbnRlbnQ6IGFueSB8IG51bGw7XHJcbiAgX2JvZHlDb250ZW50VHlwZT86IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgcm9vdFVybDogc3RyaW5nLFxyXG4gICAgcHVibGljIG9wZXJhdGlvblBhdGg6IHN0cmluZyxcclxuICAgIHB1YmxpYyBtZXRob2Q6IHN0cmluZykge1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyBhIHBhdGggcGFyYW1ldGVyXHJcbiAgICovXHJcbiAgcGF0aChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM/OiBQYXJhbWV0ZXJPcHRpb25zKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wYXRoLnNldChuYW1lLCBuZXcgUGF0aFBhcmFtZXRlcihuYW1lLCB2YWx1ZSwgb3B0aW9ucyB8fCB7fSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyBhIHF1ZXJ5IHBhcmFtZXRlclxyXG4gICAqL1xyXG4gIHF1ZXJ5KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9ucz86IFBhcmFtZXRlck9wdGlvbnMpOiB2b2lkIHtcclxuICAgIHRoaXMuX3F1ZXJ5LnNldChuYW1lLCBuZXcgUXVlcnlQYXJhbWV0ZXIobmFtZSwgdmFsdWUsIG9wdGlvbnMgfHwge30pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgYSBoZWFkZXIgcGFyYW1ldGVyXHJcbiAgICovXHJcbiAgaGVhZGVyKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9ucz86IFBhcmFtZXRlck9wdGlvbnMpOiB2b2lkIHtcclxuICAgIHRoaXMuX2hlYWRlci5zZXQobmFtZSwgbmV3IEhlYWRlclBhcmFtZXRlcihuYW1lLCB2YWx1ZSwgb3B0aW9ucyB8fCB7fSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgYm9keSBjb250ZW50LCBhbG9uZyB3aXRoIHRoZSBjb250ZW50IHR5cGVcclxuICAgKi9cclxuICBib2R5KHZhbHVlOiBhbnksIGNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL2pzb24nKTogdm9pZCB7XHJcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSB7XHJcbiAgICAgIHRoaXMuX2JvZHlDb250ZW50VHlwZSA9IHZhbHVlLnR5cGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9ib2R5Q29udGVudFR5cGUgPSBjb250ZW50VHlwZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9ib2R5Q29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgLy8gSGFuZGxlIFVSTC1lbmNvZGVkIGRhdGFcclxuICAgICAgY29uc3QgcGFpcnM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW107XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xyXG4gICAgICAgIGxldCB2YWwgPSB2YWx1ZVtrZXldO1xyXG4gICAgICAgIGlmICghKHZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xyXG4gICAgICAgICAgdmFsID0gW3ZhbF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWwpIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZm9ybURhdGFWYWx1ZSh2KTtcclxuICAgICAgICAgIGlmIChmb3JtVmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcGFpcnMucHVzaChba2V5LCBmb3JtVmFsdWVdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fYm9keUNvbnRlbnQgPSBwYWlycy5tYXAocCA9PiBgJHtlbmNvZGVVUklDb21wb25lbnQocFswXSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBbMV0pfWApLmpvaW4oJyYnKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUNvbnRlbnRUeXBlID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpIHtcclxuICAgICAgLy8gSGFuZGxlIG11bHRpcGFydCBmb3JtIGRhdGFcclxuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcclxuICAgICAgICAgIGNvbnN0IHZhbCA9IHZhbHVlW2tleV07XHJcbiAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhbCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRvQXBwZW5kID0gdGhpcy5mb3JtRGF0YVZhbHVlKHYpO1xyXG4gICAgICAgICAgICAgIGlmICh0b0FwcGVuZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdG9BcHBlbmQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdG9BcHBlbmQgPSB0aGlzLmZvcm1EYXRhVmFsdWUodmFsKTtcclxuICAgICAgICAgICAgaWYgKHRvQXBwZW5kICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgZm9ybURhdGEuc2V0KGtleSwgdG9BcHBlbmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2JvZHlDb250ZW50ID0gZm9ybURhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUaGUgYm9keSBpcyB0aGUgcGxhaW4gY29udGVudFxyXG4gICAgICB0aGlzLl9ib2R5Q29udGVudCA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtRGF0YVZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkcyB0aGUgcmVxdWVzdCB3aXRoIHRoZSBjdXJyZW50IHNldCBwYXJhbWV0ZXJzXHJcbiAgICovXHJcbiAgYnVpbGQ8VCA9IGFueT4ob3B0aW9ucz86IHtcclxuICAgIC8qKiBXaGljaCBjb250ZW50IHR5cGVzIHRvIGFjY2VwdCAqL1xyXG4gICAgYWNjZXB0Pzogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBUaGUgZXhwZWN0ZWQgcmVzcG9uc2UgdHlwZSAqL1xyXG4gICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nIHwgJ3RleHQnIHwgJ2Jsb2InIHwgJ2FycmF5YnVmZmVyJztcclxuXHJcbiAgICAvKiogV2hldGhlciB0byByZXBvcnQgcHJvZ3Jlc3Mgb24gdXBsb2FkcyAvIGRvd25sb2FkcyAqL1xyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xyXG5cclxuICAgIC8qKiBBbGxvdyBwYXNzaW5nIEh0dHBDb250ZXh0IGZvciBIdHRwQ2xpZW50ICovXHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHQ7XHJcbiAgfSk6IEh0dHBSZXF1ZXN0PFQ+IHtcclxuXHJcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuXHJcbiAgICAvLyBQYXRoIHBhcmFtZXRlcnNcclxuICAgIGxldCBwYXRoID0gdGhpcy5vcGVyYXRpb25QYXRoO1xyXG4gICAgZm9yIChjb25zdCBwYXRoUGFyYW0gb2YgdGhpcy5fcGF0aC52YWx1ZXMoKSkge1xyXG4gICAgICBwYXRoID0gcGF0aFBhcmFtLmFwcGVuZChwYXRoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHVybCA9IHRoaXMucm9vdFVybCArIHBhdGg7XHJcblxyXG4gICAgLy8gUXVlcnkgcGFyYW1ldGVyc1xyXG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcyh7XHJcbiAgICAgIGVuY29kZXI6IFBhcmFtZXRlckNvZGVjSW5zdGFuY2VcclxuICAgIH0pO1xyXG4gICAgZm9yIChjb25zdCBxdWVyeVBhcmFtIG9mIHRoaXMuX3F1ZXJ5LnZhbHVlcygpKSB7XHJcbiAgICAgIGh0dHBQYXJhbXMgPSBxdWVyeVBhcmFtLmFwcGVuZChodHRwUGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIZWFkZXIgcGFyYW1ldGVyc1xyXG4gICAgbGV0IGh0dHBIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICBpZiAob3B0aW9ucy5hY2NlcHQpIHtcclxuICAgICAgaHR0cEhlYWRlcnMgPSBodHRwSGVhZGVycy5hcHBlbmQoJ0FjY2VwdCcsIG9wdGlvbnMuYWNjZXB0KTtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgaGVhZGVyUGFyYW0gb2YgdGhpcy5faGVhZGVyLnZhbHVlcygpKSB7XHJcbiAgICAgIGh0dHBIZWFkZXJzID0gaGVhZGVyUGFyYW0uYXBwZW5kKGh0dHBIZWFkZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXF1ZXN0IGNvbnRlbnQgaGVhZGVyc1xyXG4gICAgaWYgKHRoaXMuX2JvZHlDb250ZW50VHlwZSAmJiAhKHRoaXMuX2JvZHlDb250ZW50IGluc3RhbmNlb2YgRm9ybURhdGEpKSB7XHJcbiAgICAgIGh0dHBIZWFkZXJzID0gaHR0cEhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCB0aGlzLl9ib2R5Q29udGVudFR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFBlcmZvcm0gdGhlIHJlcXVlc3RcclxuICAgIHJldHVybiBuZXcgSHR0cFJlcXVlc3Q8VD4odGhpcy5tZXRob2QudG9VcHBlckNhc2UoKSwgdXJsLCB0aGlzLl9ib2R5Q29udGVudCwge1xyXG4gICAgICBwYXJhbXM6IGh0dHBQYXJhbXMsXHJcbiAgICAgIGhlYWRlcnM6IGh0dHBIZWFkZXJzLFxyXG4gICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlLFxyXG4gICAgICByZXBvcnRQcm9ncmVzczogb3B0aW9ucy5yZXBvcnRQcm9ncmVzcyxcclxuICAgICAgY29udGV4dDogb3B0aW9ucy5jb250ZXh0XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19