@xivapi/angular-client
Version:
xivapi client library (service and models) for angular applications
271 lines • 34.7 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { HttpParams } from '@angular/common/http';
import { GCF_URL } from './xivapi-client.module';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
export class XivapiService {
constructor(http, GCFUrl) {
this.http = http;
this.GCFUrl = GCFUrl;
}
/**
* Makes a request on a given endpoint with an id.
*
* @param endpoint The endpoint to use for the request.
* @param id The id of the resource for the request.
* @param options The options of the request, optional.
*/
get(endpoint, id, options) {
return this.request(`/${endpoint}/${id}`, options);
}
/**
* Makes a request on a given endpoint with an id.
*
* @param query Text to search inside the lore.
* @param lang
* @param allLanguages should it include Text_*?
* @param dataColumns Additional data you want to fetch.
* @param page data page to get
* @param options Options of the request.
*/
searchLore(query, lang = 'en', allLanguages = false, dataColumns = [], page = 1, options = {}) {
if (!options.extraQueryParams) {
options.extraQueryParams = {};
}
Object.assign(options.extraQueryParams, {
string: query,
language: lang,
page: page.toString()
});
if (dataColumns && dataColumns.length > 0) {
const columns = [
'Context',
'Source',
'SourceID',
'Text',
...dataColumns.map(col => `Data.${col}`)
];
if (allLanguages) {
columns.push('Text_*');
}
options.extraQueryParams['columns'] = columns.join(',');
}
return this.request('/lore', options);
}
/**
* Makes a request to a given endpoint to list resources available.
*
* @param endpoint The endpoint to use for the request.
* @param options The options of the request, optional.
*/
getList(endpoint, options) {
return this.request(`/${endpoint}`, options);
}
/**
* Searches for something in the api using the /Search endpoint.
*
* @param options Search options, see http://xivapi.com/docs/Search for more details.
*/
search(options) {
if (options.filters) {
const filterChain = options.filters.reduce((chain, filter) => {
const value = filter.value instanceof Array ? filter.value.join(';') : (filter.value || '').toString();
return `${chain}${filter.column}${filter.operator}${value},`;
}, '').slice(0, -1);
if (!options.extraQueryParams) {
options.extraQueryParams = {};
}
options.extraQueryParams['filters'] = filterChain;
}
return this.request('/Search', options);
}
/**
* Gets a character using the /Character endpoint.
*
* @param lodestoneId LodestoneID of the character to get.
* @param options Options of the request.
* @param details Specific details you want to get.
*/
getCharacter(lodestoneId, options, details) {
return this.request(`/character/${lodestoneId}${details ? '/' + details : ''}`, options);
}
/**
* Gets character verification state using /character/<id>/verification endpoint
*
* @param lodestoneId LodestoneID of the character to verify.
* @param options Options of the request.
*/
getCharacterVerification(lodestoneId, options) {
return this.request(`/character/${lodestoneId}/verification`, options);
}
/**
* Gets the current list of available servers. Useful for character search queries.
*/
getServerList() {
return this.request(`/servers`);
}
/**
* Gets the current list of available servers, per DC.
*/
getDCList() {
return this.request(`/servers/dc`);
}
/**
* Search for a character on **The Lodestone**. This does not search XIVAPI but instead it goes directly to
* lodestone so the response will be "real-time". Responses are cached for 1 hour,
* it is important to know that Lodestone has a ~6 hour varnish and CDN cache.
*
* @param name The name of the character to search, you can use + for spaces or let the API handle it for you.
* If you search very short names you will get lots of responses.
* This is an issue with The Lodestone and not much XIVAPI can do about it at this time.
* @param server (optional) The server to search against, this is case sensitive.
* You can obtain a list of valid servers via getServerList method.
* @param page Search or move to a specific page.
*/
searchCharacter(name, server, page) {
let url = `/character/search?name=${name}`;
if (server !== undefined) {
url += `&server=${server}`;
}
if (page !== undefined) {
url += `&page=${page}`;
}
return this.request(url);
}
/**
* Search for free companies on The Lodestone. This parses the lodestone in real time so it will be slow for non-cached responses.
* All search queries are cached for 1 hour, it is important to know that Lodestone has a ~6 hour varnish and CDN cache.
* This does not search XIVAPI so free companies found may not be on
* the service and will be added when requested by their specified lodestone ID.
*
* @param name The name of the company to search, you can use + for spaces or let the API handle it for you.
* If you search very short names you will get lots of responses.
* This is an issue with The Lodestone and not much XIVAPI can do about it at this time.
* @param server (optional) The server to search against, this is case sensitive.
* You can obtain a list of valid servers via getServerList method.
* @param page Search or move to a specific page.
*/
searchFreeCompany(name, server, page) {
let url = `/freecompany/search?name=${name}`;
if (server !== undefined) {
url += `&server=${server}`;
}
if (page !== undefined) {
url += `&page=${page}`;
}
return this.request(url);
}
/**
* Gets character verification informations based on lodestoneId.
*
* @param lodestoneId LodestoneID of the character to get.
* @param options Options of the request.
*/
verifyCharacter(lodestoneId, options) {
return this.request(`/Character/${lodestoneId}/Verification`, options);
}
/**
* Gets a free company using the /FreeCompany endpoint.
*
* @param lodestoneId LodestoneID of the free company to get.
* @param options Options of the request.
* @param details Specific details you want to get.
*/
getFreeCompany(lodestoneId, options, details) {
return this.request(`/FreeCompany/${lodestoneId}${details ? '/' + details : ''}`, options);
}
/**
* Gets a linkshell using the /Linkshell endpoint.
*
* @param lodestoneId LodestoneID of the linkshell to get.
* @param options Options of the request.
* @param details Specific details you want to get.
*/
getLinkshell(lodestoneId, options, details) {
return this.request(`/Linkshell/${lodestoneId}${details ? '/' + details : ''}`, options);
}
/**
* Gets a PvP team based on its lodestone id (string)
*
* @param id the id of the team to get.
* @param options Options of the request
*/
getPvPTeam(id, options) {
return this.request(`/PvPTeam/${id}`, options);
}
/**
* Gets the list of patches using the /PatchList endpoint.
* @param options Options of the request.
*/
getPatchList(options) {
return this.request(`/PatchList`, options);
}
request(endpoint, params) {
let queryParams = this.prepareQueryString(params);
let baseUrl = XivapiService.API_BASE_URL;
if (params) {
if (params.baseUrl) {
baseUrl = params.baseUrl;
}
else if (params.staging) {
baseUrl = XivapiService.STAGING_API_BASE_URL;
}
['staging', 'baseUrl'].forEach(key => {
if (params.hasOwnProperty(key)) {
queryParams.delete(key);
}
});
}
return this.doGet(`${baseUrl}${endpoint}`, queryParams);
}
prepareQueryString(options) {
let queryString = new HttpParams();
if (options === null || options === undefined) {
return queryString;
}
const { extraQueryParams, ...rest } = options;
Object.keys(rest)
.forEach(optionKey => {
if (extraQueryParams && Object.prototype.hasOwnProperty.call(extraQueryParams, optionKey)) {
return;
}
// @ts-ignore
const value = options[optionKey];
if (value instanceof Array) {
queryString = queryString.set(optionKey, value.join(','));
}
else {
queryString = queryString.set(optionKey, value.toString());
}
});
if (extraQueryParams) {
Object.keys(extraQueryParams)
.forEach(key => {
// @ts-ignore
queryString = queryString.set(key, extraQueryParams[key].toString());
});
}
return queryString;
}
doGet(url, queryParams) {
if (this.GCFUrl) {
const queryString = queryParams.toString();
return this.http.get(this.GCFUrl, { params: { url: btoa(`${url}${queryString.length > 0 ? `?${queryString}` : ''}`) } });
}
return this.http.get(url, { params: queryParams });
}
}
/**
* Base url of xivapi.
*/
XivapiService.API_BASE_URL = 'https://xivapi.com';
XivapiService.STAGING_API_BASE_URL = 'https://staging.xivapi.com';
XivapiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: XivapiService, deps: [{ token: i1.HttpClient }, { token: GCF_URL }], target: i0.ɵɵFactoryTarget.Injectable });
XivapiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: XivapiService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: XivapiService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
type: Inject,
args: [GCF_URL]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGl2YXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNsaWVudC9zcmMvbGliL3hpdmFwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBYSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQWM1RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7OztBQUkvQyxNQUFNLE9BQU8sYUFBYTtJQVF4QixZQUFvQixJQUFnQixFQUEyQixNQUFlO1FBQTFELFNBQUksR0FBSixJQUFJLENBQVk7UUFBMkIsV0FBTSxHQUFOLE1BQU0sQ0FBUztJQUM5RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksR0FBRyxDQUFVLFFBQXdCLEVBQUUsRUFBVSxFQUFFLE9BQThCO1FBQ3RGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBSSxJQUFJLFFBQVEsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksVUFBVSxDQUFDLEtBQWEsRUFBRSxPQUFlLElBQUksRUFBRSxlQUF3QixLQUFLLEVBQ2pFLGNBQXdCLEVBQUUsRUFBRSxPQUFlLENBQUMsRUFBRSxVQUF5QixFQUFFO1FBQ3pGLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7WUFDN0IsT0FBTyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztTQUMvQjtRQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFO1lBQ3RDLE1BQU0sRUFBRSxLQUFLO1lBQ2IsUUFBUSxFQUFFLElBQUk7WUFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtTQUN0QixDQUFDLENBQUM7UUFFSCxJQUFJLFdB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LENBQUM7SUFDckIsQ0FBQztJQUVPLEtBQUssQ0FBSSxHQUFXLEVBQUUsV0FBdUI7UUFDbkQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsTUFBTSxXQUFXLEdBQVcsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25ELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBQyxDQUFDLENBQUM7U0FDekg7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFJLEdBQUcsRUFBRSxFQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7O0FBMVJEOztHQUVHO0FBQ29CLDBCQUFZLEdBQVcsb0JBQXFCLENBQUE7QUFDNUMsa0NBQW9CLEdBQVcsNEJBQTZCLENBQUE7MkdBTnhFLGFBQWEsNENBUXNCLE9BQU87K0dBUjFDLGFBQWE7NEZBQWIsYUFBYTtrQkFEekIsVUFBVTs7MEJBUzhCLE1BQU07MkJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cENsaWVudCwgSHR0cFBhcmFtc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENoYXJhY3RlclNlYXJjaFJlc3VsdCxcbiAgUGFnaW5hdGlvbixcbiAgUHZwVGVhbSxcbiAgWGl2YXBpQ2hhcmFjdGVyT3B0aW9ucyxcbiAgWGl2YXBpRW5kcG9pbnQsXG4gIFhpdmFwaUxpc3QsXG4gIFhpdmFwaU9wdGlvbnMsXG4gIFhpdmFwaVJlcXVlc3RPcHRpb25zLFxuICBYaXZhcGlTZWFyY2hPcHRpb25zXG59IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHtDaGFyYWN0ZXJSZXNwb25zZSwgQ2hhcmFjdGVyVmVyaWZpY2F0aW9ufSBmcm9tICcuL21vZGVsL3NjaGVtYS9jaGFyYWN0ZXInO1xuaW1wb3J0IHtHQ0ZfVVJMfSBmcm9tICcuL3hpdmFwaS1jbGllbnQubW9kdWxlJztcbmltcG9ydCB7TG9yZVNlYXJjaFJlc3VsdH0gZnJvbSAnLi9tb2RlbC9sb3JlLXNlYXJjaC1yZXN1bHQnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgWGl2YXBpU2VydmljZSB7XG5cbiAgLyoqXG4gICAqIEJhc2UgdXJsIG9mIHhpdmFwaS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQVBJX0JBU0VfVVJMOiBzdHJpbmcgPSAnaHR0cHM6Ly94aXZhcGkuY29tJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVEFHSU5HX0FQSV9CQVNFX1VSTDogc3RyaW5nID0gJ2h0dHBzOi8vc3RhZ2luZy54aXZhcGkuY29tJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIEBJbmplY3QoR0NGX1VSTCkgcHJpdmF0ZSBHQ0ZVcmw/OiBzdHJpbmcpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIHJlcXVlc3Qgb24gYSBnaXZlbiBlbmRwb2ludCB3aXRoIGFuIGlkLlxuICAgKlxuICAgKiBAcGFyYW0gZW5kcG9pbnQgVGhlIGVuZHBvaW50IHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIHJlc291cmNlIGZvciB0aGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2YgdGhlIHJlcXVlc3QsIG9wdGlvbmFsLlxuICAgKi9cbiAgcHVibGljIGdldDxUID0gYW55PihlbmRwb2ludDogWGl2YXBpRW5kcG9pbnQsIGlkOiBudW1iZXIsIG9wdGlvbnM/OiBYaXZhcGlSZXF1ZXN0T3B0aW9ucyk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oYC8ke2VuZHBvaW50fS8ke2lkfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgcmVxdWVzdCBvbiBhIGdpdmVuIGVuZHBvaW50IHdpdGggYW4gaWQuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeSBUZXh0IHRvIHNlYXJjaCBpbnNpZGUgdGhlIGxvcmUuXG4gICAqIEBwYXJhbSBsYW5nXG4gICAqIEBwYXJhbSBhbGxMYW5ndWFnZXMgc2hvdWxkIGl0IGluY2x1ZGUgVGV4dF8qP1xuICAgKiBAcGFyYW0gZGF0YUNvbHVtbnMgQWRkaXRpb25hbCBkYXRhIHlvdSB3YW50IHRvIGZldGNoLlxuICAgKiBAcGFyYW0gcGFnZSBkYXRhIHBhZ2UgdG8gZ2V0XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2YgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBwdWJsaWMgc2VhcmNoTG9yZShxdWVyeTogc3RyaW5nLCBsYW5nOiBzdHJpbmcgPSAnZW4nLCBhbGxMYW5ndWFnZXM6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YUNvbHVtbnM6IHN0cmluZ1tdID0gW10sIHBhZ2U6IG51bWJlciA9IDEsIG9wdGlvbnM6IFhpdmFwaU9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8TG9yZVNlYXJjaFJlc3VsdD4ge1xuICAgIGlmICghb3B0aW9ucy5leHRyYVF1ZXJ5UGFyYW1zKSB7XG4gICAgICBvcHRpb25zLmV4dHJhUXVlcnlQYXJhbXMgPSB7fTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMuZXh0cmFRdWVyeVBhcmFtcywge1xuICAgICAgc3RyaW5nOiBxdWVyeSxcbiAgICAgIGxhbmd1YWdlOiBsYW5nLFxuICAgICAgcGFnZTogcGFnZS50b1N0cmluZygpXG4gICAgfSk7XG5cbiAgICBpZiAoZGF0YUNvbHVtbnMgJiYgZGF0YUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY29sdW1uczogc3RyaW5nW10gPSBbXG4gICAgICAgICdDb250ZXh0JyxcbiAgICAgICAgJ1NvdXJjZScsXG4gICAgICAgICdTb3VyY2VJRCcsXG4gICAgICAgICdUZXh0JyxcbiAgICAgICAgLi4uZGF0YUNvbHVtbnMubWFwKGNvbCA9PiBgRGF0YS4ke2NvbH1gKVxuICAgICAgXTtcbiAgICAgIGlmIChhbGxMYW5ndWFnZXMpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKCdUZXh0XyonKTtcbiAgICAgIH1cblxuICAgICAgb3B0aW9ucy5leHRyYVF1ZXJ5UGFyYW1zWydjb2x1bW5zJ10gPSBjb2x1bW5zLmpvaW4oJywnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMb3JlU2VhcmNoUmVzdWx0PignL2xvcmUnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIHJlcXVlc3QgdG8gYSBnaXZlbiBlbmRwb2ludCB0byBsaXN0IHJlc291cmNlcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCBUaGUgZW5kcG9pbnQgdG8gdXNlIGZvciB0aGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2YgdGhlIHJlcXVlc3QsIG9wdGlvbmFsLlxuICAgKi9cbiAgcHVibGljIGdldExpc3Q8VCA9IGFueT4oZW5kcG9pbnQ6IFhpdmFwaUVuZHBvaW50LCBvcHRpb25zPzogWGl2YXBpUmVxdWVzdE9wdGlvbnMpOiBPYnNlcnZhYmxlPFhpdmFwaUxpc3Q8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFhpdmFwaUxpc3Q8VD4+KGAvJHtlbmRwb2ludH1gLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBmb3Igc29tZXRoaW5nIGluIHRoZSBhcGkgdXNpbmcgdGhlIC9TZWFyY2ggZW5kcG9pbnQuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIFNlYXJjaCBvcHRpb25zLCBzZWUgaHR0cDovL3hpdmFwaS5jb20vZG9jcy9TZWFyY2ggZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIHB1YmxpYyBzZWFyY2gob3B0aW9uczogWGl2YXBpU2VhcmNoT3B0aW9ucyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKG9wdGlvbnMuZmlsdGVycykge1xuICAgICAgY29uc3QgZmlsdGVyQ2hhaW46IHN0cmluZyA9IG9wdGlvbnMuZmlsdGVycy5yZWR1Y2UoKGNoYWluLCBmaWx0ZXIpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyA9IGZpbHRlci52YWx1ZSBpbnN0YW5jZW9mIEFycmF5ID8gZmlsdGVyLnZhbHVlLmpvaW4oJzsnKSA6IChmaWx0ZXIudmFsdWUgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBgJHtjaGFpbn0ke2ZpbHRlci5jb2x1bW59JHtmaWx0ZXIub3BlcmF0b3J9JHt2YWx1ZX0sYDtcbiAgICAgIH0sICcnKS5zbGljZSgwLCAtMSk7XG5cbiAgICAgIGlmICghb3B0aW9ucy5leHRyYVF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIG9wdGlvbnMuZXh0cmFRdWVyeVBhcmFtcyA9IHt9O1xuICAgICAgfVxuICAgICAgb3B0aW9ucy5leHRyYVF1ZXJ5UGFyYW1zWydmaWx0ZXJzJ10gPSBmaWx0ZXJDaGFpbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PGFueT4oJy9TZWFyY2gnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgY2hhcmFjdGVyIHVzaW5nIHRoZSAvQ2hhcmFjdGVyIGVuZHBvaW50LlxuICAgKlxuICAgKiBAcGFyYW0gbG9kZXN0b25lSWQgTG9kZXN0b25lSUQgb2YgdGhlIGNoYXJhY3RlciB0byBnZXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2YgdGhlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSBkZXRhaWxzIFNwZWNpZmljIGRldGFpbHMgeW91IHdhbnQgdG8gZ2V0LlxuICAgKi9cbiAgcHVibGljIGdldENoYXJhY3Rlcihsb2Rlc3RvbmVJZDogbnVtYmVyIHwgc3RyaW5nLCBvcHRpb25zPzogWGl2YXBpQ2hhcmFjdGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzPzogJ0ZyaWVuZHMnIHwgJ0FjaGlldmVtZW50cycgfCAnR2VhcnNldHMnIHwgJ1JlY29yZCcgfCAnRnJlZUNvbXBhbnknKTogT2JzZXJ2YWJsZTxDaGFyYWN0ZXJSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8Q2hhcmFjdGVyUmVzcG9uc2U+KGAvY2hhcmFjdGVyLyR7bG9kZXN0b25lSWR9JHtkZXRhaWxzID8gJy8nICsgZGV0YWlscyA6ICcnfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY2hhcmFjdGVyIHZlcmlmaWNhdGlvbiBzdGF0ZSB1c2luZyAvY2hhcmFjdGVyLzxpZD4vdmVyaWZpY2F0aW9uIGVuZHBvaW50XG4gICAqXG4gICAqIEBwYXJhbSBsb2Rlc3RvbmVJZCBMb2Rlc3RvbmVJRCBvZiB0aGUgY2hhcmFjdGVyIHRvIHZlcmlmeS5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIHB1YmxpYyBnZXRDaGFyYWN0ZXJWZXJpZmljYXRpb24obG9kZXN0b25lSWQ6IG51bWJlciB8IHN0cmluZywgb3B0aW9ucz86IFhpdmFwaUNoYXJhY3Rlck9wdGlvbnMpOiBPYnNlcnZhYmxlPENoYXJhY3RlclZlcmlmaWNhdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8Q2hhcmFjdGVyVmVyaWZpY2F0aW9uPihgL2NoYXJhY3Rlci8ke2xvZGVzdG9uZUlkfS92ZXJpZmljYXRpb25gLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGxpc3Qgb2YgYXZhaWxhYmxlIHNlcnZlcnMuIFVzZWZ1bCBmb3IgY2hhcmFjdGVyIHNlYXJjaCBxdWVyaWVzLlxuICAgKi9cbiAgcHVibGljIGdldFNlcnZlckxpc3QoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8c3RyaW5nW10+KGAvc2VydmVyc2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgbGlzdCBvZiBhdmFpbGFibGUgc2VydmVycywgcGVyIERDLlxuICAgKi9cbiAgcHVibGljIGdldERDTGlzdCgpOiBPYnNlcnZhYmxlPHsgW2luZGV4OiBzdHJpbmddOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDx7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nW10gfT4oYC9zZXJ2ZXJzL2RjYCk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGZvciBhIGNoYXJhY3RlciBvbiAqKlRoZSBMb2Rlc3RvbmUqKi4gVGhpcyBkb2VzIG5vdCBzZWFyY2ggWElWQVBJIGJ1dCBpbnN0ZWFkIGl0IGdvZXMgZGlyZWN0bHkgdG9cbiAgICogbG9kZXN0b25lIHNvIHRoZSByZXNwb25zZSB3aWxsIGJlIFwicmVhbC10aW1lXCIuIFJlc3BvbnNlcyBhcmUgY2FjaGVkIGZvciAxIGhvdXIsXG4gICAqIGl0IGlzIGltcG9ydGFudCB0byBrbm93IHRoYXQgTG9kZXN0b25lIGhhcyBhIH42IGhvdXIgdmFybmlzaCBhbmQgQ0ROIGNhY2hlLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIHRvIHNlYXJjaCwgeW91IGNhbiB1c2UgKyBmb3Igc3BhY2VzIG9yIGxldCB0aGUgQVBJIGhhbmRsZSBpdCBmb3IgeW91LlxuICAgKiAgSWYgeW91IHNlYXJjaCB2ZXJ5IHNob3J0IG5hbWVzIHlvdSB3aWxsIGdldCBsb3RzIG9mIHJlc3BvbnNlcy5cbiAgICogIFRoaXMgaXMgYW4gaXNzdWUgd2l0aCBUaGUgTG9kZXN0b25lIGFuZCBub3QgbXVjaCBYSVZBUEkgY2FuIGRvIGFib3V0IGl0IGF0IHRoaXMgdGltZS5cbiAgICogQHBhcmFtIHNlcnZlciAob3B0aW9uYWwpIFRoZSBzZXJ2ZXIgdG8gc2VhcmNoIGFnYWluc3QsIHRoaXMgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAqICBZb3UgY2FuIG9idGFpbiBhIGxpc3Qgb2YgdmFsaWQgc2VydmVycyB2aWEgZ2V0U2VydmVyTGlzdCBtZXRob2QuXG4gICAqIEBwYXJhbSBwYWdlIFNlYXJjaCBvciBtb3ZlIHRvIGEgc3BlY2lmaWMgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBzZWFyY2hDaGFyYWN0ZXIobmFtZTogc3RyaW5nLCBzZXJ2ZXI/OiBzdHJpbmcsIHBhZ2U/OiBudW1iZXIpOiBPYnNlcnZhYmxlPENoYXJhY3RlclNlYXJjaFJlc3VsdD4ge1xuICAgIGxldCB1cmw6IHN0cmluZyA9IGAvY2hhcmFjdGVyL3NlYXJjaD9uYW1lPSR7bmFtZX1gO1xuICAgIGlmIChzZXJ2ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXJsICs9IGAmc2VydmVyPSR7c2VydmVyfWA7XG4gICAgfVxuICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVybCArPSBgJnBhZ2U9JHtwYWdlfWA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8Q2hhcmFjdGVyU2VhcmNoUmVzdWx0Pih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBmb3IgZnJlZSBjb21wYW5pZXMgb24gVGhlIExvZGVzdG9uZS4gVGhpcyBwYXJzZXMgdGhlIGxvZGVzdG9uZSBpbiByZWFsIHRpbWUgc28gaXQgd2lsbCBiZSBzbG93IGZvciBub24tY2FjaGVkIHJlc3BvbnNlcy5cbiAgICogQWxsIHNlYXJjaCBxdWVyaWVzIGFyZSBjYWNoZWQgZm9yIDEgaG91ciwgaXQgaXMgaW1wb3J0YW50IHRvIGtub3cgdGhhdCBMb2Rlc3RvbmUgaGFzIGEgfjYgaG91ciB2YXJuaXNoIGFuZCBDRE4gY2FjaGUuXG4gICAqIFRoaXMgZG9lcyBub3Qgc2VhcmNoIFhJVkFQSSBzbyBmcmVlIGNvbXBhbmllcyBmb3VuZCBtYXkgbm90IGJlIG9uXG4gICAqIHRoZSBzZXJ2aWNlIGFuZCB3aWxsIGJlIGFkZGVkIHdoZW4gcmVxdWVzdGVkIGJ5IHRoZWlyIHNwZWNpZmllZCBsb2Rlc3RvbmUgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb21wYW55IHRvIHNlYXJjaCwgeW91IGNhbiB1c2UgKyBmb3Igc3BhY2VzIG9yIGxldCB0aGUgQVBJIGhhbmRsZSBpdCBmb3IgeW91LlxuICAgKiAgSWYgeW91IHNlYXJjaCB2ZXJ5IHNob3J0IG5hbWVzIHlvdSB3aWxsIGdldCBsb3RzIG9mIHJlc3BvbnNlcy5cbiAgICogIFRoaXMgaXMgYW4gaXNzdWUgd2l0aCBUaGUgTG9kZXN0b25lIGFuZCBub3QgbXVjaCBYSVZBUEkgY2FuIGRvIGFib3V0IGl0IGF0IHRoaXMgdGltZS5cbiAgICogQHBhcmFtIHNlcnZlciAob3B0aW9uYWwpIFRoZSBzZXJ2ZXIgdG8gc2VhcmNoIGFnYWluc3QsIHRoaXMgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAqICBZb3UgY2FuIG9idGFpbiBhIGxpc3Qgb2YgdmFsaWQgc2VydmVycyB2aWEgZ2V0U2VydmVyTGlzdCBtZXRob2QuXG4gICAqIEBwYXJhbSBwYWdlIFNlYXJjaCBvciBtb3ZlIHRvIGEgc3BlY2lmaWMgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBzZWFyY2hGcmVlQ29tcGFueShuYW1lOiBzdHJpbmcsIHNlcnZlcj86IHN0cmluZywgcGFnZT86IG51bWJlcik6IE9ic2VydmFibGU8eyBSZXN1bHRzOiBhbnlbXSwgUGFnaW5hdGlvbjogUGFnaW5hdGlvbiB9PiB7XG4gICAgbGV0IHVybDogc3RyaW5nID0gYC9mcmVlY29tcGFueS9zZWFyY2g/bmFtZT0ke25hbWV9YDtcbiAgICBpZiAoc2VydmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVybCArPSBgJnNlcnZlcj0ke3NlcnZlcn1gO1xuICAgIH1cbiAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cmwgKz0gYCZwYWdlPSR7cGFnZX1gO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PHsgUmVzdWx0czogYW55W10sIFBhZ2luYXRpb246IFBhZ2luYXRpb24gfT4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNoYXJhY3RlciB2ZXJpZmljYXRpb24gaW5mb3JtYXRpb25zIGJhc2VkIG9uIGxvZGVzdG9uZUlkLlxuICAgKlxuICAgKiBAcGFyYW0gbG9kZXN0b25lSWQgTG9kZXN0b25lSUQgb2YgdGhlIGNoYXJhY3RlciB0byBnZXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2YgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBwdWJsaWMgdmVyaWZ5Q2hhcmFjdGVyKGxvZGVzdG9uZUlkOiBudW1iZXIsIG9wdGlvbnM/OiBYaXZhcGlDaGFyYWN0ZXJPcHRpb25zKTogT2JzZXJ2YWJsZTxDaGFyYWN0ZXJWZXJpZmljYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PGFueT4oYC9DaGFyYWN0ZXIvJHtsb2Rlc3RvbmVJZH0vVmVyaWZpY2F0aW9uYCwgb3B0aW9ucyk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXRzIGEgZnJlZSBjb21wYW55IHVzaW5nIHRoZSAvRnJlZUNvbXBhbnkgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBwYXJhbSBsb2Rlc3RvbmVJZCBMb2Rlc3RvbmVJRCBvZiB0aGUgZnJlZSBjb21wYW55IHRvIGdldC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBvZiB0aGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIGRldGFpbHMgU3BlY2lmaWMgZGV0YWlscyB5b3Ugd2FudCB0byBnZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0RnJlZUNvbXBhbnkobG9kZXN0b25lSWQ6IG51bWJlciB8IHN0cmluZywgb3B0aW9ucz86IFhpdmFwaU9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzPzogJ21lbWJlcnMnIHwgJ3JlY29yZCcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8YW55PihgL0ZyZWVDb21wYW55LyR7bG9kZXN0b25lSWR9JHtkZXRhaWxzID8gJy8nICsgZGV0YWlscyA6ICcnfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBsaW5rc2hlbGwgdXNpbmcgdGhlIC9MaW5rc2hlbGwgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBwYXJhbSBsb2Rlc3RvbmVJZCBMb2Rlc3RvbmVJRCBvZiB0aGUgbGlua3NoZWxsIHRvIGdldC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBvZiB0aGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIGRldGFpbHMgU3BlY2lmaWMgZGV0YWlscyB5b3Ugd2FudCB0byBnZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0TGlua3NoZWxsKGxvZGVzdG9uZUlkOiBudW1iZXIgfCBzdHJpbmcsIG9wdGlvbnM/OiBYaXZhcGlPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM/OiAncmVjb3JkJyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxhbnk+KGAvTGlua3NoZWxsLyR7bG9kZXN0b25lSWR9JHtkZXRhaWxzID8gJy8nICsgZGV0YWlscyA6ICcnfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBQdlAgdGVhbSBiYXNlZCBvbiBpdHMgbG9kZXN0b25lIGlkIChzdHJpbmcpXG4gICAqXG4gICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHRlYW0gdG8gZ2V0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIG9mIHRoZSByZXF1ZXN0XG4gICAqL1xuICBwdWJsaWMgZ2V0UHZQVGVhbShpZDogc3RyaW5nLCBvcHRpb25zPzogWGl2YXBpT3B0aW9ucyk6IE9ic2VydmFibGU8UHZwVGVhbT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8UHZwVGVhbT4oYC9QdlBUZWFtLyR7aWR9YCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBwYXRjaGVzIHVzaW5nIHRoZSAvUGF0Y2hMaXN0IGVuZHBvaW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIG9mIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgcHVibGljIGdldFBhdGNoTGlzdChvcHRpb25zPzogWGl2YXBpT3B0aW9ucyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxhbnk+KGAvUGF0Y2hMaXN0YCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVxdWVzdDxUPihlbmRwb2ludDogc3RyaW5nLCBwYXJhbXM/OiBYaXZhcGlPcHRpb25zKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gdGhpcy5wcmVwYXJlUXVlcnlTdHJpbmcocGFyYW1zKTtcbiAgICBsZXQgYmFzZVVybDogc3RyaW5nID0gWGl2YXBpU2VydmljZS5BUElfQkFTRV9VUkw7XG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgaWYgKHBhcmFtcy5iYXNlVXJsKSB7XG4gICAgICAgIGJhc2VVcmwgPSBwYXJhbXMuYmFzZVVybDtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnN0YWdpbmcpIHtcbiAgICAgICAgYmFzZVVybCA9IFhpdmFwaVNlcnZpY2UuU1RBR0lOR19BUElfQkFTRV9VUkw7XG4gICAgICB9XG5cbiAgICAgIFsnc3RhZ2luZycsICdiYXNlVXJsJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBxdWVyeVBhcmFtcy5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRvR2V0PGFueT4oYCR7YmFzZVVybH0ke2VuZHBvaW50fWAsIHF1ZXJ5UGFyYW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVF1ZXJ5U3RyaW5nKG9wdGlvbnM/OiBYaXZhcGlPcHRpb25zKTogSHR0cFBhcmFtcyB7XG4gICAgbGV0IHF1ZXJ5U3RyaW5nOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBxdWVyeVN0cmluZztcbiAgICB9XG5cbiAgICBjb25zdCB7ZXh0cmFRdWVyeVBhcmFtcywgLi4ucmVzdH0gPSBvcHRpb25zO1xuICAgIE9iamVjdC5rZXlzKHJlc3QpXG4gICAgICAuZm9yRWFjaChvcHRpb25LZXkgPT4ge1xuICAgICAgICBpZiAoZXh0cmFRdWVyeVBhcmFtcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXh0cmFRdWVyeVBhcmFtcywgb3B0aW9uS2V5KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgdmFsdWU6IGFueSA9IG9wdGlvbnNbb3B0aW9uS2V5XSBhcyBhbnk7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgcXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZy5zZXQob3B0aW9uS2V5LCB2YWx1ZS5qb2luKCcsJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXJ5U3RyaW5nID0gcXVlcnlTdHJpbmcuc2V0KG9wdGlvbktleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGlmIChleHRyYVF1ZXJ5UGFyYW1zKSB7XG4gICAgICBPYmplY3Qua2V5cyhleHRyYVF1ZXJ5UGFyYW1zKVxuICAgICAgICAuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nLnNldChrZXksIGV4dHJhUXVlcnlQYXJhbXNba2V5XS50b1N0cmluZygpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBxdWVyeVN0cmluZztcbiAgfVxuXG4gIHByaXZhdGUgZG9HZXQ8VD4odXJsOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgaWYgKHRoaXMuR0NGVXJsKSB7XG4gICAgICBjb25zdCBxdWVyeVN0cmluZzogc3RyaW5nID0gcXVlcnlQYXJhbXMudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KHRoaXMuR0NGVXJsLCB7cGFyYW1zOiB7dXJsOiBidG9hKGAke3VybH0ke3F1ZXJ5U3RyaW5nLmxlbmd0aCA+IDAgPyBgPyR7cXVlcnlTdHJpbmd9YCA6ICcnfWApfX0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPih1cmwsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSk7XG4gIH1cbn1cbiJdfQ==