trimble-connect-sdk
Version:
Trimble Connect SDK for JavaScript
444 lines • 108 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PSet = exports.DefaultPSetServiceUri = void 0;
const response_1 = require("./response");
const service_1 = require("./service");
exports.DefaultPSetServiceUri = 'https://pset-api.connect.trimble.com/v1/';
const PsetServiceUriMap = new Map([
['us-east-1', 'https://pset-api.us-east-1.connect.trimble.com/v1/'],
['ap-southeast-1', 'https://pset-api.ap-southeast-1.connect.trimble.com/v1/'],
['eu-west-1', 'https://pset-api.eu-west-1.connect.trimble.com/v1/'],
]);
function getDefaultConfiguration() {
return {
region: 'eu-west-1',
serviceUri: exports.DefaultPSetServiceUri,
};
}
class PSet extends service_1.Service {
constructor(config) {
const sanitizedConfig = Object.assign({}, config);
if (sanitizedConfig &&
sanitizedConfig.region &&
sanitizedConfig.serviceUri === undefined) {
if (PsetServiceUriMap.has(sanitizedConfig.region)) {
sanitizedConfig.serviceUri = PsetServiceUriMap.get(sanitizedConfig.region);
}
else {
throw new Error(`Unknown region: ${sanitizedConfig.region}, allowed values ${Array.from(PsetServiceUriMap.keys()).join(', ')}`);
}
}
super(Object.assign(Object.assign({}, getDefaultConfiguration()), sanitizedConfig));
}
getUserInfo(params) {
return __awaiter(this, void 0, void 0, function* () {
let url = 'me';
if (params) {
const query = [];
if (params.wait) {
query.push('wait');
}
if (params.refresh) {
query.push('refresh');
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url);
});
}
getLibrary(libId, params) {
return __awaiter(this, void 0, void 0, function* () {
const url = `libs/${encodeURIComponent(libId)}${params && params.deleted ? '?deleted' : ''}`;
return this.makeRequest(url);
});
}
createLibrary(request) {
return __awaiter(this, void 0, void 0, function* () {
const url = 'libs';
return this.makeRequest(url, 'POST', JSON.stringify(request));
});
}
updateLibrary(libId, request) {
return __awaiter(this, void 0, void 0, function* () {
const url = `libs/${encodeURIComponent(libId)}`;
return this.makeRequest(url, 'PATCH', JSON.stringify(request));
});
}
deleteLibrary(libId, params) {
return __awaiter(this, void 0, void 0, function* () {
const url = `libs/${encodeURIComponent(libId)}`;
let headers;
if (params && params.v !== undefined) {
headers = new Headers({ 'If-Match': `W/"${params.v}"` });
}
return this.makeRequest(url, 'DELETE', undefined, headers);
});
}
getLibraryPolicy(libId) {
return __awaiter(this, void 0, void 0, function* () {
const url = `libs/${encodeURIComponent(libId)}/policy`;
return this.makeRequest(url);
});
}
putLibraryPolicy(libId, policy) {
return __awaiter(this, void 0, void 0, function* () {
const url = `libs/${encodeURIComponent(libId)}/policy`;
return this.makeRequest(url, 'PUT', JSON.stringify(policy));
});
}
listDefinitions(libId, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `libs/${encodeURIComponent(libId)}/defs`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.top) {
query.push(`top=${encodeURIComponent(params.top.toString())}`);
}
if (params.skiptoken) {
query.push(`skiptoken=${encodeURIComponent(params.skiptoken)}`);
}
if (params.prefix) {
query.push(`prefix=${encodeURIComponent(params.prefix)}`);
}
if (params.type) {
query.push(`type=${encodeURIComponent(params.type)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url);
});
}
listDefinitionVersions(libId, defId, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `libs/${encodeURIComponent(libId)}/defs/${encodeURIComponent(defId)}/versions`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.top) {
query.push(`top=${encodeURIComponent(params.top.toString())}`);
}
if (params.skiptoken) {
query.push(`skiptoken=${encodeURIComponent(params.skiptoken)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url);
});
}
getDefinition(libId, defId, params) {
return __awaiter(this, void 0, void 0, function* () {
const url = `libs/${encodeURIComponent(libId)}/defs/${encodeURIComponent(defId)}${params && params.deleted ? '?deleted' : ''}`;
return this.makeRequest(url);
});
}
getDefinitionVersion(libId, defId, ver) {
return __awaiter(this, void 0, void 0, function* () {
const url = `libs/${encodeURIComponent(libId)}/defs/${encodeURIComponent(defId)}/versions/${encodeURIComponent(ver.toString())}`;
return this.makeRequest(url);
});
}
getDefinitionVersionBySchema(libId, defId, ver) {
return __awaiter(this, void 0, void 0, function* () {
const url = `libs/${encodeURIComponent(libId)}/defs/${encodeURIComponent(defId)}/schema/${encodeURIComponent(ver.toString())}`;
return this.makeRequest(url);
});
}
getPSetDefinitions(libId, ids, params) {
var _a, _b;
return __awaiter(this, void 0, void 0, function* () {
const requestBatchGet = {};
const paramsBatchGet = { deleted: params === null || params === void 0 ? void 0 : params.deleted };
const defs = new Set();
ids.items.forEach((def) => {
defs.add({ libId, defId: def.id, v: def.v, schemaV: def.schemaV });
});
requestBatchGet.defs = Array.from(defs);
const responseBatchGet = yield this.batchGet(requestBatchGet, paramsBatchGet);
const response = new response_1.ServiceResponse(this, responseBatchGet.response, { items: responseBatchGet.data.responses.defs });
if (responseBatchGet.data.errors.defs) {
const errors = new Set();
(_a = responseBatchGet.data.errors.defs) === null || _a === void 0 ? void 0 : _a.forEach((def) => {
errors.add({
item: {
id: def.item.defId,
v: def.item.v,
schemaV: def.item.schemaV,
},
code: def.code,
message: def.message,
});
});
response.data.errors = Array.from(errors);
}
if (responseBatchGet.data.unprocessed.defs) {
const unprocessed = new Set();
(_b = responseBatchGet.data.unprocessed.defs) === null || _b === void 0 ? void 0 : _b.forEach((def) => {
unprocessed.add({ id: def.defId, v: def.v, schemaV: def.schemaV });
});
response.data.unprocessed = Array.from(unprocessed);
}
return response;
});
}
createDefinition(libId, request) {
return __awaiter(this, void 0, void 0, function* () {
const url = `libs/${encodeURIComponent(libId)}/defs`;
return this.makeRequest(url, 'POST', JSON.stringify(request));
});
}
updateDefinition(libId, defId, request) {
return __awaiter(this, void 0, void 0, function* () {
const url = `libs/${encodeURIComponent(libId)}/defs/${encodeURIComponent(defId)}`;
return this.makeRequest(url, 'PATCH', JSON.stringify(request));
});
}
deleteDefinition(libId, defId, params) {
return __awaiter(this, void 0, void 0, function* () {
const url = `libs/${encodeURIComponent(libId)}/defs/${encodeURIComponent(defId)}`;
let headers;
if (params && params.v !== undefined) {
headers = new Headers({
'If-Match': `W/"${encodeURIComponent(params.v.toString())}"`,
});
}
return this.makeRequest(url, 'DELETE', undefined, headers);
});
}
validate(libId, defId, request, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `libs/${encodeURIComponent(libId)}/defs/${encodeURIComponent(defId)}/validate`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.skiptoken) {
query.push(`skiptoken=${encodeURIComponent(params.skiptoken)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url, 'POST', JSON.stringify(request));
});
}
validateNextPage(prev, request) {
return __awaiter(this, void 0, void 0, function* () {
if (prev && prev.next) {
return this.makeRequest(prev.next, 'POST', JSON.stringify(request));
}
else {
throw new Error('There is no next page.');
}
});
}
listPSets(link, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `psets/${encodeURIComponent(link)}`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.top) {
query.push(`top=${encodeURIComponent(params.top.toString())}`);
}
if (params.skiptoken) {
query.push(`skiptoken=${encodeURIComponent(params.skiptoken)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url);
});
}
listPSetsByDefinition(libId, defId, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `libs/${encodeURIComponent(libId)}/defs/${encodeURIComponent(defId)}/psets`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.top) {
query.push(`top=${encodeURIComponent(params.top.toString())}`);
}
if (params.skiptoken) {
query.push(`skiptoken=${encodeURIComponent(params.skiptoken)}`);
}
if (params.link) {
query.push(`link=${encodeURIComponent(params.link)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url);
});
}
listPSetVersions(link, libId, defId, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `psets/${encodeURIComponent(link)}/${encodeURIComponent(libId)}/${encodeURIComponent(defId)}/versions`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.top) {
query.push(`top=${encodeURIComponent(params.top.toString())}`);
}
if (params.skiptoken) {
query.push(`skiptoken=${encodeURIComponent(params.skiptoken)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url);
});
}
getPSet(link, libId, defId, params) {
return __awaiter(this, void 0, void 0, function* () {
const url = `psets/${encodeURIComponent(link)}/${encodeURIComponent(libId)}/${encodeURIComponent(defId)}${params && params.deleted ? '?deleted' : ''}`;
return this.makeRequest(url);
});
}
getPSetVersion(link, libId, defId, ver) {
return __awaiter(this, void 0, void 0, function* () {
const url = `psets/${encodeURIComponent(link)}/${encodeURIComponent(libId)}/${encodeURIComponent(defId)}/versions/${encodeURIComponent(ver.toString())}`;
return this.makeRequest(url);
});
}
getPSets(keys, params) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
const requestBatchGet = {};
const paramsBatchGet = { deleted: params === null || params === void 0 ? void 0 : params.deleted };
const psets = new Set();
keys.items.forEach((pset) => {
psets.add({
libId: pset.libId,
defId: pset.defId,
v: pset.v,
link: pset.link,
});
});
requestBatchGet.psets = Array.from(psets);
const responseBatchGet = yield this.batchGet(requestBatchGet, paramsBatchGet);
const response = new response_1.ServiceResponse(this, responseBatchGet.response, { items: responseBatchGet.data.responses.psets || [] });
if (responseBatchGet.data.unprocessed.psets) {
const unprocessed = new Set();
(_a = responseBatchGet.data.unprocessed.psets) === null || _a === void 0 ? void 0 : _a.forEach((pset) => {
unprocessed.add({
libId: pset.libId,
defId: pset.defId,
v: pset.v,
link: pset.link,
});
});
response.data.unhandled = Array.from(unprocessed);
}
return response;
});
}
getPSetsByDefinition(libId, defId, links, params) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
const requestBatchGet = {};
const paramsBatchGet = { deleted: params === null || params === void 0 ? void 0 : params.deleted };
const psets = new Set();
links.items.forEach((link) => {
psets.add({ libId, defId, link });
});
requestBatchGet.psets = Array.from(psets);
const responseBatchGet = yield this.batchGet(requestBatchGet, paramsBatchGet);
const response = new response_1.ServiceResponse(this, responseBatchGet.response, { items: responseBatchGet.data.responses.psets || [] });
if (responseBatchGet.data.unprocessed.psets) {
const unprocessed = new Set();
(_a = responseBatchGet.data.unprocessed.psets) === null || _a === void 0 ? void 0 : _a.forEach((pset) => {
unprocessed.add(pset.link);
});
response.data.unhandled = Array.from(unprocessed);
}
return response;
});
}
batchGet(request, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `batch-get`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url, 'POST', JSON.stringify(request));
});
}
updatePSet(link, libId, defId, request) {
return __awaiter(this, void 0, void 0, function* () {
const url = `psets/${encodeURIComponent(link)}/${encodeURIComponent(libId)}/${encodeURIComponent(defId)}`;
return this.makeRequest(url, 'PATCH', JSON.stringify(request));
});
}
deletePSet(link, libId, defId, params) {
return __awaiter(this, void 0, void 0, function* () {
const url = `psets/${encodeURIComponent(link)}/${encodeURIComponent(libId)}/${encodeURIComponent(defId)}`;
let headers;
if (params && params.v !== undefined) {
headers = new Headers({ 'If-Match': `W/"${params.v}"` });
}
return this.makeRequest(url, 'DELETE', undefined, headers);
});
}
changeset(changeset) {
return __awaiter(this, void 0, void 0, function* () {
const url = 'psets/changeset';
return this.makeRequest(url, 'POST', JSON.stringify(changeset));
});
}
changesetAsync() {
return __awaiter(this, void 0, void 0, function* () {
const url = 'psets/changeset-async';
return this.makeRequest(url, 'POST');
});
}
changesetStatus(changesetId) {
return __awaiter(this, void 0, void 0, function* () {
const url = `psets/changeset/${encodeURIComponent(changesetId)}`;
return this.makeRequest(url);
});
}
subscribeWS() {
return __awaiter(this, void 0, void 0, function* () {
const url = 'subscribe';
return this.makeRequest(url, 'GET');
});
}
}
exports.PSet = PSet;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNldC5qcyIsInNvdXJjZVJvb3QiOiIuLyIsInNvdXJjZXMiOlsicHNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFZQSx5Q0FBNkM7QUFDN0MsdUNBQW9DO0FBSXZCLFFBQUEscUJBQXFCLEdBQUcsMENBQTBDLENBQUM7QUFFaEYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBaUI7SUFDaEQsQ0FBQyxXQUFXLEVBQUUsb0RBQW9ELENBQUM7SUFDbkUsQ0FBQyxnQkFBZ0IsRUFBRSx5REFBeUQsQ0FBQztJQUM3RSxDQUFDLFdBQVcsRUFBRSxvREFBb0QsQ0FBQztDQUNwRSxDQUFDLENBQUM7QUFHSCxTQUFTLHVCQUF1QjtJQUM5QixPQUFPO1FBQ0wsTUFBTSxFQUFFLFdBQVc7UUFDbkIsVUFBVSxFQUFFLDZCQUFxQjtLQUNsQyxDQUFDO0FBQ0osQ0FBQztBQTZqQkQsTUFBYSxJQUFLLFNBQVEsaUJBQU87SUFNL0IsWUFBWSxNQUErQjtRQUN6QyxNQUFNLGVBQWUscUJBQWdDLE1BQU0sQ0FBRSxDQUFDO1FBRTlELElBQ0UsZUFBZTtZQUNmLGVBQWUsQ0FBQyxNQUFNO1lBQ3RCLGVBQWUsQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUN4QztZQUNBLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDakQsZUFBZSxDQUFDLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQ2hELGVBQWUsQ0FBQyxNQUFNLENBQ3ZCLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxNQUFNLElBQUksS0FBSyxDQUNiLG1CQUNFLGVBQWUsQ0FBQyxNQUNsQixvQkFBb0IsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUN0RSxDQUFDO2FBQ0g7U0FDRjtRQUVELEtBQUssaUNBQU0sdUJBQXVCLEVBQUUsR0FBSyxl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QVFZLFNBQVMsQ0FDcEIsU0FBK0I7O1lBSS9CLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDO1lBRTlCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FDckIsR0FBRyxFQUNILE1BQU0sRUFDTixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUMxQixDQUFDO1FBQ0osQ0FBQztLQUFBO0lBT1ksY0FBYzs7WUFHekIsTUFBTSxHQUFHLEdBQUcsdUJBQXVCLENBQUM7WUFFcEMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUE2QixHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkUsQ0FBQztLQUFBO0lBUVksZUFBZSxDQUMxQixXQUFtQjs7WUFFbkIsTUFBTSxHQUFHLEdBQUcsbUJBQW1CLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFFakUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUF3QixHQUFHLENBQUMsQ0FBQztRQUN0RCxDQUFDO0tBQUE7SUFPWSxXQUFXOztZQUN0QixNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUM7WUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUF5QixHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUQsQ0FBQztLQUFBO0NBQ0Y7QUF0NEJELG9CQXM0QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEZWxldGVPcHRpb25zLFxuICBHZXRPcHRpb25zLFxuICBMaXN0T3B0aW9ucyxcbiAgUGFnZWRJdGVtcyxcbiAgUmVzb3VyY2VJZGVudGl0eVdpdGhFcnJvcixcbiAgVXNlckluZm9HZXRPcHRpb25zLFxuICBVc2VySW5mb1Jlc3BvbnNlLFxuICBXU1N1YnNjcmlwdGlvblJlc3BvbnNlLFxufSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgUG9saWN5IH0gZnJvbSAnLi9wb2xpY3knO1xuaW1wb3J0IHsgU2VydmljZVJlc3BvbnNlIH0gZnJvbSAnLi9yZXNwb25zZSc7XG5pbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0UFNldFNlcnZpY2VVcmkgPSAnaHR0cHM6Ly9wc2V0LWFwaS5jb25uZWN0LnRyaW1ibGUuY29tL3YxLyc7XG5cbmNvbnN0IFBzZXRTZXJ2aWNlVXJpTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oW1xuICBbJ3VzLWVhc3QtMScsICdodHRwczovL3BzZXQtYXBpLnVzLWVhc3QtMS5jb25uZWN0LnRyaW1ibGUuY29tL3YxLyddLFxuICBbJ2FwLXNvdXRoZWFzdC0xJywgJ2h0dHBzOi8vcHNldC1hcGkuYXAtc291dGhlYXN0LTEuY29ubmVjdC50cmltYmxlLmNvbS92MS8nXSxcbiAgWydldS13ZXN0LTEnLCAnaHR0cHM6Ly9wc2V0LWFwaS5ldS13ZXN0LTEuY29ubmVjdC50cmltYmxlLmNvbS92MS8nXSxcbl0pO1xuXG4vKiogQGludGVybmFsICovXG5mdW5jdGlvbiBnZXREZWZhdWx0Q29uZmlndXJhdGlvbigpOiBDb25maWd1cmF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICByZWdpb246ICdldS13ZXN0LTEnLFxuICAgIHNlcnZpY2VVcmk6IERlZmF1bHRQU2V0U2VydmljZVVyaSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBib2R5IGZvciB0aGUgQHNlZSBQU2V0I2NyZWF0ZUxpYnJhcnkgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUxpYnJhcnlSZXF1ZXN0IHtcbiAgLyoqIFRoZSBvcHRpb25hbCBpZGVudGlmaWVyIGZvciB0aGUgbmV3IGxpYnJhcnksIGlmIG5vdCBwcm92aWRlZCBzZXJ2aWNlIHdpbGwgZ2VuZXJhdGUgYW4gdW5pcXVlIGlkZW50aWZpZXIuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogVGhlIGFjY2VzcyBjb25yb2wgcG9saWN5IGRvY3VtZW50IHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBsaWJyYXJ5LiAqL1xuICBwb2xpY3k/OiBQb2xpY3k7XG4gIC8qKiBUaGUgb3B0aW9uYWwgbGlicmFyeSBuYW1lLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBwYXJhbWV0ZXJzIGZvciB0aGUgQHNlZSBQU2V0I2dldExpYnJhcnkgb3BlcmF0aW9uLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZW1wdHktaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIEdldExpYnJhcnlPcHRpb25zIGV4dGVuZHMgR2V0T3B0aW9ucyB7fVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIHRoZSBAc2VlIFBTZXQjZ2V0RGVmaW5pdGlvbiBvcGVyYXRpb24uXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1lbXB0eS1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgR2V0RGVmaW5pdGlvbk9wdGlvbnMgZXh0ZW5kcyBHZXRPcHRpb25zIHt9XG5cbi8qKlxuICogVGhlIHJlcXVlc3QgYm9keSBmb3IgdGhlIEBzZWUgUFNldCN1cGRhdGVMaWJyYXJ5IG9wZXJhdGlvbi5cbiAqIEFsbCBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbCwgaWYgcHJvcGVydHkgaXMgbm90IHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IHRoZSBwcm9wZXJ0eSB3aWxsIHJldGFpbiBpdCdzIG9sZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaWJyYXJ5UmVxdWVzdCB7XG4gIC8qKlxuICAgKiBUaGUgbGFzdCBzZWVuIHZlcnNpb24gb2YgdGhlIHRyZWUgZGVzY3JpcHRvci5cbiAgICogSWYgcHJvdmlkZWQgc2VydmljZSB3aWxsIHVzZSB0aGlzIGluZm9ybWF0aW9uIGZvciB0aGUgY29uY3VyZW5jeSBjb250cm9sIGFuZCB3aWxsIHJlZnVzZSB0byBhcHBseSBjaGFuZ2VzIGlmIGN1cnJlbnQgdmVyc2lvbiBpcyBub3QgZXF1YWwgdG8gdmVyc2lvbiBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIHY/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYWNjZXNzIGNvbnJvbCBwb2xpY3kgZG9jdW1lbnQgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIGxpYnJhcnkuXG4gICAqIElmIHByb3BlcnR5IGlzIHNwZWNpZmllZCBjYWxsZXIgbXVzdCBoYXZlIG9yZzpVcGRhdGVMaWJyYXJ5UG9saWN5IHJpZ2h0IHRvIGV4ZWN1dGUgdGhpcyBvcGVyYXRpb24gaW4gYWRkaXRpb24gdG8gb3JnOlVwZGF0ZUxpYnJhcnkuXG4gICAqL1xuICBwb2xpY3k/OiBQb2xpY3k7XG4gIC8qKiBUaGUgbmV3IG5hbWUuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBUaGUgbmV3IGRlc2NyaXB0aW9uLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgdHJlZSBkZXNjcmlwdG9yIHJldHVybmVkIGZyb20gQHNlZSBQU2V0I2NyZWF0ZUxpYnJhcnkgLCBAc2VlIFBTZXQjdXBkYXRlTGlicmFyeSAsIEBzZWUgUFNldCNkZWxldGVMaWJyYXJ5IGFuZCBAc2VlIFBTZXQjZ2V0TGlicmFyeSBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYnJhcnlSZXNwb25zZSB7XG4gIC8qKiBUaGUgdW5pcXVlIGxpYnJhcnkgaWRlbnRpZmllci4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSBjcmVhdGlvbiB0aW1lc3RhbXAgaW4gSVNPIGZvcm1hdC4gKi9cbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIC8qKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcHJpbmNpcGFsIHdobyBjcmVhdGVkIHRoZSB0cmVlLiAqL1xuICBjcmVhdGVkQnk6IHN0cmluZztcbiAgLyoqIFRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgaW4gSVNPIGZvcm1hdC4gKi9cbiAgbW9kaWZpZWRBdDogc3RyaW5nO1xuICAvKiogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHByaW5jaWxhdCB3aG8gbGFzdCBtb2RpZmllZCB0aGUgdHJlZSBkZXNjcmlwdG9yLiAqL1xuICBtb2RpZmllZEJ5OiBzdHJpbmc7XG4gIC8qKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSB0cmVlIGRlc2NyaXB0b3IuICovXG4gIHY6IG51bWJlcjtcbiAgLyoqIFRoZSBhY2Nlc3MgY29ucm9sIHBvbGljeSBkb2N1bWVudCBhdHRhY2hlZCB0byB0aGUgbGlicmFyeS4gVGhpcyBwcm9wZXJ0eSBpcyByZXR1cm5lZCBvbmx5IGlmIGNhbGxlciBoYXMgcHNldDpHZXRMaWJyYXJ5UG9saWN5IHJpZ2h0LiAqL1xuICBwb2xpY3k/OiBQb2xpY3k7XG4gIC8qKiBUaGUgZGVsZXRpb24gbWFya2VyLiBJZiBub3QgcHJlc2VudCBvciBmYWxzZSB0aGUgdHJlZSBpcyBhY3RpdmUsIG90aGVyd2lzZSB0aGUgdHJlZSBpcyBtYXJrZWQgYXMgZGVsZXRlZC4gKi9cbiAgZGVsZXRlZD86IGJvb2xlYW47XG4gIC8qKiBUaGUgbGlicmFyeSBuYW1lLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24uICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogVGhlIGNvbGxlY3Rpb24gb2YgYWN0aW9ucyBjdXJyZW50IHVzZXIgaGFzIHJpZ2h0cyB0byBwZXJmb3JtIG9uIHRoaXMgcmVzb3VyY2UgYXQgdGhlIG1vbWVudCB0aGUgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkIGJ5IHNlcnZpY2UuIE5vdCByZXR1cm5lZCB3aGVuIHNwZWNpZmljIHZlcnNpb24gaXMgcmVxdWVzdGVkLiAqL1xuICBfYWN0aW9ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IGJvZHkgZm9yIHRoZSBAc2VlIFBTZXQjY3JlYXRlRGVmaW5pdGlvbiBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRGVmaW5pdGlvblJlcXVlc3Qge1xuICAvKiogVGhlIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHRoZSBuZXcgcHNldCBkZWZpbml0aW9uLCBpZiBub3QgcHJvdmlkZWQgc2VydmljZSB3aWxsIGdlbmVyYXRlIGFuIHVuaXF1ZSBpZGVudGlmaWVyLiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIFRoZSBwc2V0IG5hbWUuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbi4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBUaGUgb3B0aW9uYWwgY29sbGVjdGlvbiBvZiByZXNvdXJjZSB0eXBlcyB0aGUgcHNldCBhcHBsaWNhYmxlIHRvLiAqL1xuICB0eXBlcz86IHN0cmluZ1tdO1xuICAvKiogVGhlIHBzZXQgc2NoZW1hLiAqL1xuICBzY2hlbWE6IG9iamVjdDtcbiAgLyoqIFRoZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBwYXJ0IHdpdGggdHJhbnNsYXRpb24gdGFibGVzLiAqL1xuICBpMThuPzogb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IGJvZHkgZm9yIHRoZSBAc2VlIFBTZXQjdXBkYXRlRGVmaW5pdGlvbiBvcGVyYXRpb24uXG4gKiBBbGwgcHJvcGVydGllcyBhcmUgb3B0aW9uYWwsIGlmIHByb3BlcnR5IG5vdCBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdCB0aGUgcHJvcGVydHkgd2lsbCByZXRhaW4gaXQncyBvbGQgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRGVmaW5pdGlvblJlcXVlc3Qge1xuICAvKipcbiAgICogVGhlIGxhc3Qgc2VlbiB2ZXJzaW9uIG9mIHRoZSB0cmVlIGRlc2NyaXB0b3IuXG4gICAqIElmIHByb3ZpZGVkIHNlcnZpY2Ugd2lsbCB1c2UgdGhpcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbmN1cmVuY3kgY29udHJvbCBhbmQgd2lsbCByZWZ1c2UgdG8gYXBwbHkgY2hhbmdlcyBpZiBjdXJyZW50IHZlcnNpb24gaXMgbm90IGVxdWFsIHRvIHZlcnNpb24gcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QuXG4gICAqL1xuICB2PzogbnVtYmVyO1xuICAvKiogVGhlIG5ldyBuYW1lLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogVGhlIG5ldyBkZXNjcmlwdGlvbi4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBUaGUgbmV3IGNvbGxlY3Rpb24gb2YgcmVzb3VyY2UgdHlwZXMgdGhlIHBzZXQgYXBwbGljYWJsZSB0by4gKi9cbiAgdHlwZXM/OiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBuZXcgcHNldCBzY2hlbWEuICovXG4gIHNjaGVtYT86IG9iamVjdDtcbiAgLyoqIFRoZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBwYXJ0IHdpdGggdHJhbnNsYXRpb24gdGFibGVzLiAqL1xuICBpMThuPzogb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSBwc2V0IGRlZmluaXRpb24gZGVzY3JpcHRvciByZXR1cm5lZCBmcm9tIEBzZWUgUFNldCNjcmVhdGVEZWZpbml0aW9uLCBAc2VlIFBTZXQjdXBkYXRlRGVmaW5pdGlvbiwgQHNlZSBQU2V0I2RlbGV0ZU5vZGUsIEBzZWUgUFNldCNnZXREZWZpbml0aW9uIGFuZCBAc2VlIE9yZ2FuaXNlciNnZXREZWZpbml0aW9uVmVyc2lvbiBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmluaXRpb25SZXNwb25zZSB7XG4gIC8qKiBUaGUgbGlicmFyeSBpZGVudGlmaWVyLiAqL1xuICBsaWJJZDogc3RyaW5nO1xuICAvKiogVGhlIGRlZmluaXRpb24gaWRlbnRpZmllci4gVW5pcXVlIGluc2lkZSB0aGUgbGlicmFyeS4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSBjcmVhdGlvbiB0aW1lc3RhbXAgaW4gSVNPIGZvcm1hdC4gKi9cbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIC8qKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcHJpbmNpcGFsIHdobyBjcmVhdGVkIHRoZSBub2RlLiAqL1xuICBjcmVhdGVkQnk6IHN0cmluZztcbiAgLyoqIFRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgaW4gSVNPIGZvcm1hdC4gKi9cbiAgbW9kaWZpZWRBdDogc3RyaW5nO1xuICAvKiogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHByaW5jaWxhdCB3aG8gbGFzdCBtb2RpZmllZCB0aGUgbm9kZS4gKi9cbiAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICAvKiogVGhlIHZlcnNpb24gbnVtYmVyLiAqL1xuICB2OiBudW1iZXI7XG4gIC8qKiBUaGUgZGVsZXRpb24gbWFya2VyLiBJZiBub3QgcHJlc2VudCBvciBmYWxzZSB0aGUgbm9kZSBpcyBhY3RpdmUsIG90aGVyd2lzZSB0aGUgbm9kZSBpcyBtYXJrZWQgYXMgZGVsZXRlZC4gKi9cbiAgZGVsZXRlZD86IGJvb2xlYW47XG4gIC8qKiBUaGUgbmFtZS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIG9mIHJlc291cmNlIHR5cGVzIHRoZSBwc2V0IGFwcGxpY2FibGUgdG8uIElmIG5vdCBwcmVzZW50IHBzZXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFsbCByZXNvdXJjZSB0eXBlcy4gKi9cbiAgdHlwZXM/OiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBwc2V0IHNjaGVtYS4gKi9cbiAgc2NoZW1hOiBvYmplY3Q7XG4gIC8qKiBUaGUgaW50ZXJuYXRpb25hbGl6YXRpb24gcGFydCB3aXRoIHRyYW5zbGF0aW9uIHRhYmxlcy4gKi9cbiAgaTE4bjogb2JqZWN0O1xuICAvKiogVGhlIGNvbGxlY3Rpb24gb2YgYWN0aW9ucyBjdXJyZW50IHVzZXIgaGFzIHJpZ2h0cyB0byBwZXJmb3JtIG9uIHRoaXMgcmVzb3VyY2UgYXQgdGhlIG1vbWVudCB0aGUgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkIGJ5IHNlcnZpY2UuIE5vdCByZXR1cm5lZCB3aGVuIHNwZWNpZmljIHZlcnNpb24gaXMgcmVxdWVzdGVkLiAqL1xuICBfYWN0aW9ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IG9wdGlvbnMgdG8gdmFsaWRhdGUgcHNldHMgYWdhaW5zdCBhIG5ldyBzY2hlbWEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBpZiBkZWZpbmVkIGFuZCB0cnVlIGluZm9ybXMgc2VydmVyIHRoYXQgZW50aXRpZXMgbWFya2VkIGFzIGRlbGV0ZWQgc2hvdWxkIGJlIHJldHVybmVkIGFzIHdlbGwuXG4gICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHNraXAvaGlkZSBlbnRpdGllZCBtYXJrZWQgYXMgZGVsZXRlZC5cbiAgICovXG4gIGRlbGV0ZWQ/OiBib29sZWFuO1xuICAvKiogVGhlIHNraXAgdG9rZW4gdXNlZCBhIGFzIGN1cnNvciB0byBpbmRpY2F0ZSB0aGUgcGxhY2Ugd2hlcmUgbmV4dCBwYWdlIG9mIHJlc3VsdHMgc2hvdWxkIGZldGNoZWQgZnJvbS4gKi9cbiAgc2tpcHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IGJvZHkgZm9yIHRoZSBAc2VlIFBTZXQjdmFsaWRhdGUgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRlUmVxdWVzdCB7XG4gIC8qKiBUaGUgc2NoZW1hIHRvIHZhbGlkYXRlIGV4aXN0aW5nIGRhdGEgYWdhaW5zdC4gKi9cbiAgc2NoZW1hOiBvYmplY3Q7XG59XG5cbi8qKlxuICogVGhlIHJlc3BvbnNlIGJvZHkgZm9yIHRoZSBAc2VlIFBTZXQjdmFsaWRhdGUgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRlUmVzcG9uc2Uge1xuICAvKiogVGhlIG51bWJlciBvZiB2YWxpZCBwc2V0cy4gKi9cbiAgdmFsaWRJdGVtc0NvdW50OiBudW1iZXI7XG4gIC8qKiBUaGUgbnVtYmVyIG9mIG5vdCB2YWxpZCBwc2V0cy4gKi9cbiAgaW52YWxpZEl0ZW1zQ291bnQ6IG51bWJlcjtcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIG9mIGVycm9yIG1lc3NhZ2VzIGZvciBmb3VuZCBpbnZhbGlkIHBzZXRzLiBPbmx5IGZpcnN0IDEwMCB1bmlxdWUgZXJyb3IgbWVzc2FnZXMgYXJlIHJldHVybmVkLiAqL1xuICBlcnJvcnM/OiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBsaW5rIHRvIHRoZSBuZXh0IHBhZ2UuIElmIG5vdCBwcmVzZW50LCB0aGlzIGlzIHRoZSBsYXN0IHBhZ2UuICovXG4gIG5leHQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGRlLXNlcmlhbGl6ZWQgZGF0YSByZXR1cm5lZCBmcm9tIHRoZSByZXF1ZXN0IHdpdGggbGlzdCBvZiBwc2V0IGRlZmluaXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3REZWZpbml0aW9uc1Jlc3BvbnNlXG4gIGV4dGVuZHMgUGFnZWRJdGVtczxEZWZpbml0aW9uUmVzcG9uc2U+IHt9XG5cbi8qKlxuICogVGhlIGRlLXNlcmlhbGl6ZWQgZGF0YSByZXR1cm5lZCBmcm9tIHRoZSByZXF1ZXN0IHdpdGggbGlzdCBvZiBkZWZpbml0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0RGVmaW5pdGlvbnNPcHRpb25zIGV4dGVuZHMgTGlzdE9wdGlvbnMge1xuICAvKiogVGhlIHJldHVybiBvbmx5IHBzZXQgZGVmaW5pdGlvbnMgYXBwbGljYWJsZSB0byB0aGUgZ2l2ZW4gcmVzb3VyY2UgdHlwZS4gKi9cbiAgdHlwZT86IHN0cmluZztcbiAgLyoqIFRoZSBuYW1lIHByZWZpeCB0byBmaWx0ZXIgcHNldCBkZWZpbml0aW9ucy4gT25seSBkZWZpbml0aW9ucyB3aG9zIG5hbWUgc3RhcnRzIHdpdGggdGhpcyBwcmVmaXggYXJlIHJldHVybmVkLiAqL1xuICBwcmVmaXg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGRlLXNlcmlhbGl6ZWQgZGF0YSByZXR1cm5lZCBmcm9tIHRoZSByZXF1ZXN0IHdpdGggbGlzdCBvZiBkZWZpbml0aW9uIHZlcnNpb25zLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZW1wdHktaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIExpc3REZWZpbml0aW9uVmVyc2lvbnNPcHRpb25zIGV4dGVuZHMgTGlzdE9wdGlvbnMge31cblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBib2R5IGZvciB0aGUgQHNlZSBQU2V0I3VwZGF0ZVBTZXQgb3BlcmF0aW9uLlxuICogQWxsIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsLCBpZiBwcm9wZXJ0eSBub3QgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgdGhlIHByb3BlcnR5IHdpbGwgcmV0YWluIGl0J3Mgb2xkIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBTZXRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBsYXN0IHNlZW4gdmVyc2lvbiBvZiB0aGUgcHNldCBpbnN0YW5jZS5cbiAgICogSWYgcHJvdmlkZWQgc2VydmljZSB3aWxsIHVzZSB0aGlzIGluZm9ybWF0aW9uIGZvciB0aGUgY29uY3VyZW5jeSBjb250cm9sIGFuZCB3aWxsIHJlZnVzZSB0byBhcHBseSBjaGFuZ2VzIGlmIGN1cnJlbnQgdmVyc2lvbiBpcyBub3QgZXF1YWwgdG8gdmVyc2lvbiBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIHY/OiBudW1iZXI7XG4gIC8qKiBUaGUgdmVyc2lvbiBvZiB0aGUgcHNldCBkZWZpbml0aW9uIHNjaGVtYS4gKi9cbiAgc2NoZW1hVj86IG51bWJlcjtcbiAgLyoqIFRoZSBuZXcgcHJvcGVydHkgdmFsdWVzLiAqL1xuICBwcm9wcz86IG9iamVjdDtcbn1cblxuLyoqXG4gKiBUaGUgcHNldCBpbnN0YW5jZSByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU2V0UmVzcG9uc2Uge1xuICAvKiogVGhlIGxpbmsgdG8gdGhlIGV4dGVybmFsIHJlc291cmNlLiAqL1xuICBsaW5rOiBzdHJpbmc7XG4gIC8qKiBUaGUgbGlicmFyeSBpZGVudGlmaWVyLiAqL1xuICBsaWJJZDogc3RyaW5nO1xuICAvKiogVGhlIHBzZXQgZGVmaW5pdGlvbiBpZGVudGlmaWVyLiAqL1xuICBkZWZJZDogc3RyaW5nO1xuICAvKiogVGhlIGNyZWF0aW9uIHRpbWVzdGFtcCBpbiBJU08gZm9ybWF0LiAqL1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgLyoqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwcmluY2lwYWwgd2hvIGNyZWF0ZWQgdGhlIG5vZGUuICovXG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICAvKiogVGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCBpbiBJU08gZm9ybWF0LiAqL1xuICBtb2RpZmllZEF0OiBzdHJpbmc7XG4gIC8qKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcHJpbmNpbGF0IHdobyBsYXN0IG1vZGlmaWVkIHRoZSBub2RlLiAqL1xuICBtb2RpZmllZEJ5OiBzdHJpbmc7XG4gIC8qKiBUaGUgdmVyc2lvbiBudW1iZXIuICovXG4gIHY6IG51bWJlcjtcbiAgLyoqIFRoZSBkZWxldGlvbiBtYXJrZXIuIElmIG5vdCBwcmVzZW50IG9yIGZhbHNlIHRoZSBub2RlIGlzIGFjdGl2ZSwgb3RoZXJ3aXNlIHRoZSBub2RlIGlzIG1hcmtlZCBhcyBkZWxldGVkLiAqL1xuICBkZWxldGVkPzogYm9vbGVhbjtcbiAgLyoqIFRoZSB2ZXJzaW9uIG9mIHBzZXQgZGVmaW5pdGlvbiBzY2hlbWEgZm9yIHRoaXMgcHNldCBpbnN0YW5jZS4gKi9cbiAgc2NoZW1hVjogbnVtYmVyO1xuICAvKiogVGhlIHByb3BlcnR5IHZhbHVlcy4gKi9cbiAgcHJvcHM6IG9iamVjdDtcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIG9mIGFjdGlvbnMgY3VycmVudCB1c2VyIGhhcyByaWdodHMgdG8gcGVyZm9ybSBvbiB0aGlzIHJlc291cmNlIGF0IHRoZSBtb21lbnQgdGhlIHJlc3BvbnNlIGlzIGdlbmVyYXRlZCBieSBzZXJ2aWNlLiBOb3QgcmV0dXJuZWQgd2hlbiBzcGVjaWZpYyB2ZXJzaW9uIGlzIHJlcXVlc3RlZC4gKi9cbiAgX2FjdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcHNldCBrZXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUFNldEtleSB7XG4gIC8qKiBUaGUgbGluayB0byB0aGUgZXh0ZXJuYWwgcmVzb3VyY2UuICovXG4gIGxpbms6IHN0cmluZztcbiAgLyoqIFRoZSBsaWJyYXJ5IGlkZW50aWZpZXIuICovXG4gIGxpYklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgcHNldCBkZWZpbml0aW9uIGlkZW50aWZpZXIuICovXG4gIGRlZklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgdmVyc2lvbiBudW1iZXIuICovXG4gIHY/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQm9keSBmb3IgYmF0Y2ggcmVxdWVzdCBvZiBwcm9wZXJ0eSBzZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUFNldEtleVJlcXVlc3Qge1xuICAvKiogVGhlIGNvbGxlY3Rpb24gb2Yga2V5cyBmb3IgUFNldHMgdG8gZ2V0LiAqL1xuICBpdGVtczogUFNldEtleVtdO1xufVxuXG4vKipcbiAqIFRoZSBwc2V0IGRlZmluaXRpb24vdmVyc2lvbiBpZGVudGlmaWVyLiBVc2VkIGluIGJhdGNoIGdldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU2V0RGVmSWQge1xuICAvKiogVGhlIHBzZXQgZGVmaW5pdGlvbiBpZGVudGlmaWVyLiBXaGVuIG9ubHkgdGhlIGlkIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBsYXRlc3QgdmVyc2lvbiBpcyByZXF1ZXN0ZWQuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBSZXF1ZXN0aW5nIHRoZSBkZWZpbml0aW9uIHdpdGggdGhpcyBzY2hlbWEgdmVyc2lvbi4gT3B0aW9uYWwsIGNhbid0IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCAndicuICovXG4gIHNjaGVtYVY/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0aW5nIHRoZSBkZWZpbml0aW9uIHdpdGggdGhpcyB2ZXJzaW9uLiBPcHRpb25hbCwgY2FuJ3QgYmUgdXNlZCB0b2dldGhlciB3aXRoICdzY2hlbWFWJy4gKi9cbiAgdj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCb2R5IGZvciBiYXRjaCByZXF1ZXN0IG9mIHByb3BlcnR5IHNldCBkZWZpbml0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU2V0RGVmSWRSZXF1ZXN0IHtcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIG9mIGlkcyBmb3IgUFNldCBkZWZpbml0aW9ucyB0byBnZXQuICovXG4gIGl0ZW1zOiBQU2V0RGVmSWRbXTtcbn1cblxuLyoqXG4gKiBBbiBlcnJvciBkZXNjcmlwdG9yIGZyb20gdGhlIGJhdGNoIGdldCBQU2V0IGRlZmluaXRpb25zIEFQSS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU2V0RGVmSWRFcnJvciB7XG4gIC8qKiBUaGUgcHNldCBkZWZpbml0aW9uL3ZlcnNpb24gaWRlbnRpZmllciAoZnJvbSB0aGUgcmVxdWVzdCkuICovXG4gIGl0ZW06IFBTZXREZWZJZDtcbiAgLyoqIFRoZSBlcnJvciBjb2RlLiAqL1xuICBjb2RlOiBzdHJpbmc7XG4gIC8qKiBBIGh1bWFuIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuICovXG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVzcG9uc2UgZnJvbSBiYXRjaCBnZXQgUFNldCBkZWZpbml0aW9ucyBBUEkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hQU2V0RGVmUmVzcG9uc2Uge1xuICAvKiogVGhlIGxpc3Qgb2YgdW5wcm9jZXNzZWQgUFNldCBkZWZpbml0aW9uIGtleXMuICovXG4gIHVucHJvY2Vzc2VkPzogUFNldERlZklkW107XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBQU2V0IGRlZmluaXRpb25zLiAqL1xuICBpdGVtcz86IERlZmluaXRpb25SZXNwb25zZVtdO1xuICAvKiogVGhlIGxpc3Qgb2YgZXJyb3JzLiAqL1xuICBlcnJvcnM/OiBQU2V0RGVmSWRFcnJvcltdO1xufVxuXG4vKipcbiAqIEJvZHkgZm9yIGJhdGNoIHJlcXVlc3Qgb2YgcHJvcGVydHkgc2V0cyBmb3IgYSBsaWIvZGVmXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1JlcXVlc3Qge1xuICAvKiogVGhlIGFycmF5IG9mIGxpbmtzIGZvciBQU2V0cyB0byBnZXQuICovXG4gIGl0ZW1zOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXRjaFBTZXRSZXNwb25zZTxUPiB7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBvZiBwcm9wZXJ0eSBzZXRzLiAqL1xuICBpdGVtczogUFNldFJlc3BvbnNlW107XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBvZiB1bmhhbmRsZWQgcmVxdWVzdHMuICovXG4gIHVuaGFuZGxlZD86IFRbXTtcbn1cblxuLyoqXG4gKiBUaGUgbGlicmFyeSBpZGVudGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWJyYXJ5SWRlbnRpdHkge1xuICAvKiogVGhlIGxpYnJhcnkgaWRlbnRpZmllci4gKi9cbiAgbGliSWQ6IHN0cmluZztcbiAgLyoqIFRoZSBkZWZpbml0aW9uIGlkZW50aWZpZXIuICovXG59XG5cbi8qKlxuICogVGhlIGRlZmluaXRpb24gaWRlbnRpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5pdGlvbklkZW50aXR5IHtcbiAgLyoqIFRoZSBsaWJyYXJ5IGlkZW50aWZpZXIuICovXG4gIGxpYklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGVmaW5pdGlvbiBpZGVudGlmaWVyLiAqL1xuICBkZWZJZDogc3RyaW5nO1xuICAvKiogUmVxdWVzdGluZyB0aGUgcmVzb3VyY2Ugd2l0aCB0aGlzIHZlcnNpb24uIE9wdGlvbmFsLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBsYXRlc3QgdmVyc2lvbiBpcyByZXF1ZXN0ZWQuICovXG4gIHY/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0aW5nIHRoZSBkZWZpbml0aW9uIHdpdGggdGhpcyBzY2hlbWEgdmVyc2lvbi4gT3B0aW9uYWwuIElmIG5vdCBzcGVjaWZpZWQgdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIHJlcXVlc3RlZC4gKi9cbiAgc2NoZW1hVj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgcHNldCBpZGVudGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU2V0SWRlbnRpdHkge1xuICAvKiogVGhlIGxpbmsuICovXG4gIGxpbms6IHN0cmluZztcbiAgLyoqIFRoZSBsaWJyYXJ5IGlkZW50aWZpZXIuICovXG4gIGxpYklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGVmaW5pdGlvbiBpZGVudGlmaWVyLiAqL1xuICBkZWZJZDogc3RyaW5nO1xuICAvKiogUmVxdWVzdGluZyB0aGUgcmVzb3VyY2Ugd2l0aCB0aGlzIHZlcnNpb24uIE9wdGlvbmFsLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBsYXRlc3QgdmVyc2lvbiBpcyByZXF1ZXN0ZWQuICovXG4gIHY/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGJhdGNoIGdldCBBUEkgcmVxdWVzdCBib2R5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBTZXRCYXRjaEdldFJlcXVlc3RcbiAgZXh0ZW5kcyBQU2V0QmF0Y2hHZXRNYXA8TGlicmFyeUlkZW50aXR5LCBEZWZpbml0aW9uSWRlbnRpdHksIFBTZXRJZGVudGl0eT4ge31cblxuLyoqXG4gKiBUaGUgQmF0Y2hHZXQgQVBJIG9wdGlvbnMuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1lbXB0eS1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgUFNldEJhdGNoR2V0T3B0aW9ucyBleHRlbmRzIEdldE9wdGlvbnMge31cblxuLyoqXG4gKiBUaGUgbm9kZSBkZXNjcmlwdG9yIHRoYXQgaW5jbHVkZXMgdGhlIHRyZWUgaWRlbnRpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5pdGlvbldpdGhMaWJJZGVudGl0eVJlc3BvbnNlIGV4dGVuZHMgRGVmaW5pdGlvblJlc3BvbnNlIHtcbiAgLyoqIFRoZSBsaWJyYXJ5IGlkZW50aWZpZXIuICovXG4gIGxpYklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlc3BvbnNlIGZyb20gYmF0Y2ggZ2V0IEFQSS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU2V0QmF0Y2hHZXRSZXNwb25zZSB7XG4gIC8qKiBUaGUgbGlzdCBvZiB1bnByb2Nlc3NlZCByZXF1ZXN0ZWQgcmVzb3VyY2VzLlxuICAgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCBjbGllbnQgaGFzIGEgcmV0cnkgbG9naWMgdG8gZmV0Y2ggdGhlIGl0ZW1zIHVucHJvY2Vzc2VkIGluIHRoZSBvcmlnaW5hbCByZXF1ZXN0LlxuICAgKiBDb2xsZWN0aW9uIG9mIHVucHJvY2Vzc2VkIGl0ZW1zIGNhbiBiZSBwYXNzZWQgYXMgaXMgdG8gdGhlIG5leHQgcmVxdWVzdC5cbiAgICovXG4gIHVucHJvY2Vzc2VkOiBQU2V0QmF0Y2hHZXRNYXA8XG4gICAgTGlicmFyeUlkZW50aXR5LFxuICAgIERlZmluaXRpb25JZGVudGl0eSxcbiAgICBQU2V0SWRlbnRpdHlcbiAgPjtcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIHJlcXVlc3RlZCBub2Rlcy4gKi9cbiAgcmVzcG9uc2VzOiBQU2V0QmF0Y2hHZXRNYXA8XG4gICAgTGlicmFyeVJlc3BvbnNlLFxuICAgIERlZmluaXRpb25XaXRoTGliSWRlbnRpdHlSZXNwb25zZSxcbiAgICBQU2V0UmVzcG9uc2VcbiAgPjtcbiAgLyoqIFRoZSBsaXN0IG9mIGVycm9ycy4gKi9cbiAgZXJyb3JzOiBQU2V0QmF0Y2hHZXRNYXA8XG4gICAgUmVzb3VyY2VJZGVudGl0eVdpdGhFcnJvcjxMaWJyYXJ5SWRlbnRpdHk+LFxuICAgIFJlc291cmNlSWRlbnRpdHlXaXRoRXJyb3I8RGVmaW5pdGlvbklkZW50aXR5PixcbiAgICBSZXNvdXJjZUlkZW50aXR5V2l0aEVycm9yPFBTZXRJZGVudGl0eT5cbiAgPjtcbn1cblxuLyoqXG4gKiBUaGUgcHNldCBzZXJ2aWNlIG1hcCBzdHJ1Y3R1cmUgdXNlZCBpbiBiYXRjaCBnZXQgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBTZXRCYXRjaEdldE1hcDxMLCBELCBQPiB7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBsaWJyYXJpZXMuICovXG4gIGxpYnM/OiBMW107XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBkZWZpbml0aW9ucy4gKi9cbiAgZGVmcz86IERbXTtcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIHBzZXRzLiAqL1xuICBwc2V0cz86IFBbXTtcbn1cblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBvcHRpb25zIHRvIHF1ZXJ5IHBzZXRzIGJ5IGxpbmsuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1lbXB0eS1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFBTZXRzT3B0aW9ucyBleHRlbmRzIExpc3RPcHRpb25zIHt9XG5cbi8qKlxuICogVGhlIHJlcXVlc3Qgb3B0aW9ucyB0byBxdWVyeSBwc2V0cyBieSBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RQU2V0c0J5RGVmaW5pdGlvbk9wdGlvbnMgZXh0ZW5kcyBMaXN0T3B0aW9ucyB7XG4gIC8qKiBUaGUgbGluayBwcmVmaXggdG8gZmlsdGVyIHBzZXRzIGJ5LiAqL1xuICBsaW5rPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZS1zZXJpYWxpemVkIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgcmVxdWVzdCB3aXRoIGxpc3Qgb2YgcHNldCBpbnN0YW5jZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFBTZXRzUmVzcG9uc2UgZXh0ZW5kcyBQYWdlZEl0ZW1zPFBTZXRSZXNwb25zZT4ge31cblxuLyoqXG4gKiBUaGUgZGUtc2VyaWFsaXplZCBkYXRhIHJldHVybmVkIGZyb20gdGhlIHJlcXVlc3Qgd2l0aCBsaXN0IG9mIGRlZmluaXRpb24gdmVyc2lvbnMuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1lbXB0eS1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFBTZXRWZXJzaW9uc09wdGlvbnMgZXh0ZW5kcyBMaXN0T3B0aW9ucyB7fVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IGJvZHkgZm9yIEBzZWUgUFNldCNjaGFuZ2VzZXQgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBTZXRDaGFuZ2VzZXRSZXF1ZXN0IHtcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIG9mIGNoYW5nZSByZXF1ZXN0cyB0byBQU2V0cy4gKi9cbiAgaXRlbXM6IENoYW5nZVBTZXRSZXF1ZXN0W107XG59XG5cbi8qKlxuICogVGhlIGl0ZW1zIGluIHJlcXVlc3QgYm9keSBmb3IgQHNlZSBQU2V0I2NoYW5nZXNldCBvcGVyYXRpb24uXG4gKiBBbGwgcHJvcGVydGllcyBleGNlcHQgcmVmZXJlbmNpbmcga2V5cyBhcmUgb3B0aW9uYWwsIGlmIHByb3BlcnR5IG5vdCBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdCB0aGUgcHJvcGVydHkgd2lsbCByZXRhaW4gaXQncyBvbGQgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbmdlUFNldFJlcXVlc3Qge1xuICAvKiogVGhlIGxpbmsgdG8gdGhlIGV4dGVybmFsIHJlc291cmNlLiAqL1xuICBsaW5rOiBzdHJpbmc7XG4gIC8qKiBUaGUgbGlicmFyeSBpZGVudGlmaWVyLiAqL1xuICBsaWJJZDogc3RyaW5nO1xuICAvKiogVGhlIHBzZXQgZGVmaW5pdGlvbiBpZGVudGlmaWVyLiAqL1xuICBkZWZJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGxhc3Qgc2VlbiB2ZXJzaW9uIG9mIHRoZSBwc2V0IGluc3RhbmNlLlxuICAgKiBJZiBwcm92aWRlZCBzZXJ2aWNlIHdpbGwgdXNlIHRoaXMgaW5mb3JtYXRpb24gZm9yIHRoZSBjb25jdXJlbmN5IGNvbnRyb2wgYW5kIHdpbGwgcmVmdXNlIHRvIGFwcGx5IGNoYW5nZXMgaWYgY3VycmVudCB2ZXJzaW9uIGlzIG5vdCBlcXVhbCB0byB2ZXJzaW9uIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgdj86IG51bWJlcjtcbiAgLyoqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwc2V0IGRlZmluaXRpb24gc2NoZW1hLiAqL1xuICBzY2hlbWFWPzogbnVtYmVyO1xuICAvKiogVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZXMuICovXG4gIHByb3BzPzogb2JqZWN0O1xuICAvKiogVGhlIGRlbGV0aW9uIGZsYWcuIElmIHNwZWNpZmllZCBpdCBpcyBhbiBpbnN0cnVjdGlvbiB0byBtYXJrIHRoZSBwc2V0IGFzIGRlbGV0ZWQuICovXG4gIGRlbGV0ZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSByZXNwb25zZSBib2R5IGZvciBAc2VlIFBTZXQjY2hhbmdlc2V0IG9wZXJhdGlvbiBpZiBpdCBnb2VzIHRvIGFzeW5jIGV4ZWN1dGlvbiBtb2RlICg+NTAwIGl0ZW1zIGluIHRoZSByZXF1ZXN0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU2V0Q2hhbmdlc2V0UmVzcG9uc2VBY2NlcHRlZCB7XG4gIC8qKiBUaGUgY2hhbmdlc2V0IGlkZW50aWZpZXIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgdXNlciBpZGVudGlmaWVyLiAqL1xuICBjcmVhdGVkQnk6IHN0cmluZztcbiAgLyoqIFRoZSBjcmVhdGlvbiB0aW1lc3RhbXAgaW4gSVNPIGZvcm1hdC4gKi9cbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIC8qKiBUaGUgY2hhbmdlc2V0IHByb2Nlc3Npbmcgc3RhdHVzOiBXYWl0aW5nVXBsb2FkLCBRdWV1ZWQsIFByb2Nlc3NpbmcsIERvbmUsIEZhaWxlZC4gKi9cbiAgc3RhdHVzOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlc3BvbnNlIGJvZHkgZm9yIEBzZWUgUFNldCNjaGFuZ2VzZXQgb3BlcmF0aW9uIGlmIGl0IGlzIGV4ZWN1dGVkIGluIHN5bmMgbW9kZSAoPD01MDAgaXRlbXMgaW4gdGhlIHJlcXVlc3QpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBTZXRDaGFuZ2VzZXRSZXNwb25zZUlubGluZVxuICBleHRlbmRzIFBTZXRDaGFuZ2VzZXRSZXNwb25zZUFjY2VwdGVkIHtcbiAgLyoqIFRoZSB0aW1lc3RhbXAgaW4gSVNPIGZvcm1hdCB3aGVuIHByb2Nlc3NpbmcgaGFzIGJlZW4gc3RhcnRlZC4gKi9cbiAgc3RhcnRlZEF0OiBzdHJpbmc7XG4gIC8qKiBUaGUgdGltZXN0YW1wIGluIElTTyBmb3JtYXQgd2hlbiBwcm9jZXNzaW5nIGhhcyBiZWVuIGZpbmlzaGVkLiAqL1xuICBwcm9jZXNzZWRBdDogc3RyaW5nO1xuICAvKiogVGhlIGVycm9yIG1lc3NhZ2UgaWYgcHJvY2Vzc2luZyBvZiB0aGUgY2hhbmdlc2V0IGZhaWxlZC4gKi9cbiAgbWVzc2FnZT86IHN0cmluZztcbiAgLyoqIE51bWJlciBvZiBpdGVtcyBzdWNjZXNzZnVsbCBwcm9jZXNzZWQuICovXG4gIGl0ZW1Db3VudDogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0IGl0ZW1zLiAqL1xuICBlcnJvckNvdW50OiBudW1iZXI7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBvZiBlY2hvZWQgUFNldHMgYWZ0ZXIgcHJvY2Vzc2luZyBjaGFuZ2VzLiAqL1xuICBpdGVtczogUFNldFJlc3BvbnNlW107XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBvZiBmYWlsZWQgY2hhbmdlIHJlcXVlc3RzLiAqL1xuICBlcnJvcnM/OiBQU2V0Q2hhbmdlc2V0RXJyb3JbXTtcbn1cblxuLyoqXG4gKiBUaGUgY2hhbmdlc2V0IHJlcXVlc3QgcHJvY2Vzc2luZyBmYWlsZWQgZHVlIHRvIHNvbWUgZXJyb3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUFNldENoYW5nZXNldEVycm9yIHtcbiAgLyoqIFRoZSBjaGFuZ2UgcmVxdWVzdGVkIGluIHRoZSBjaGFuZ2VzZXQuICovXG4gIGl0ZW06IENoYW5nZVBTZXRSZXF1ZXN0O1xuXG4gIC8qKiBUaGUgZXJyb3IgY29kZS4gKi9cbiAgY29kZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgZXJyb3IgbWVzc2FnZS4gKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSByZXNwb25zZSBib2R5IGZvciBpbml0aWFsaXppbmcgYXN5bmNocm9ub3VzIGNoYW5nZXNldCwgIEBzZWUgUFNldCNjaGFuZ2VzZXRBc3luYyBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUFNldENoYW5nZXNldFJlc3BvbnNlQXN5bmNcbiAgZXh0ZW5kcyBQU2V0Q2hhbmdlc2V0UmVzcG9uc2VBY2NlcHRlZCB7XG4gIC8qKiBVcmwgZm9yIHVwbG9hZGluZyByZXF1ZXN0IGl0ZW1zLiBGaWxlIG11c3QgY29udGFpbiBtdWx0aXBsZSBzZXBhcmF0ZSBDaGFuZ2VQU2V0UmVxdWVzdCBvYmplY3RzIGluIE5ld2xpbmUgRGVsaW1pdGVkIEpTT04gZm9ybWF0IChzZWUgaHR0cDovL25kanNvbi5vcmcvLCBDb250ZW50LVR5cGU9YXBwbGljYXRpb24veC1uZGpzb24pLiAqL1xuICB1cGxvYWRVcmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVzcG9uc2UgYm9keSBmb3IgQHNlZSBQU2V0I2NoYW5nZXNldFN0YXR1cyBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUFNldENoYW5nZXNldFJlc3BvbnNlIGV4dGVuZHMgUFNldENoYW5nZXNldFJlc3BvbnNlQWNjZXB0ZWQge1xuICAvKiogVGhlIHRpbWVzdGFtcCBpbiBJU08gZm9ybWF0IHdoZW4gcHJvY2Vzc2luZyBoYXMgYmVlbiBzdGFydGVkLiAqL1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgdGltZXN0YW1wIGluIElTTyBmb3JtYXQgd2hlbiBwcm9jZXNzaW5nIGhhcyBiZWVuIGZpbmlzaGVkLiAqL1xuICBwcm9jZXNzZWRBdD86IHN0cmluZztcbiAgLyoqIFRoZSBlcnJvciBtZXNzYWdlIGlmIHByb2Nlc3Npbmcgb2YgdGhlIGNoYW5nZXNldCBmYWlsZWQuICovXG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgaXRlbXMgc3VjY2Vzc2Z1bGwgcHJvY2Vzc2VkLiAqL1xuICBpdGVtQ291bnQ6IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBmYWlsZWQgcmVxdWVzdCBpdGVtcy4gKi9cbiAgZXJyb3JDb3VudDogbnVtYmVyO1xuICAvKiogVXJsIGZvciBkb3dubG9hZGluZyBlY2hvZWQgcHJvY2Vzc2VkIGl0ZW1zLiBGaWxlIGNvbnRhaW5zIG11bHRpcGxlIHNlcGFyYXRlIFBTZXQgb2JqZWN0cyBpbiBOZXdsaW5lIERlbGltaXRlZCBKU09OIGZvcm1hdCAoc2VlIGh0dHA6Ly9uZGpzb24ub3JnLywgQ29udGVudC1UeXBlPWFwcGxpY2F0aW9uL3gtbmRqc29uKS4gKi9cbiAgcmVzdWx0c1VybD86IHN0cmluZztcbiAgLyoqIFVybCBmb3IgZG93bmxvYWRpbmcgZmFpbGVkIHJlcXVlc3QgaXRlbXMuIEZpbGUgY29udGFpbnMgbXVsdGlwbGUgc2VwYXJhdGUgUFNldENoYW5nZXNldEVycm9yIG9iamVjdHMgaW4gTmV3bGluZSBEZWxpbWl0ZWQgSlNPTiBmb3JtYXQgKHNlZSBodHRwOi8vbmRqc29uLm9yZy8sIENvbnRlbnQtVHlwZT1hcHBsaWNhdGlvbi94LW5kanNvbikuICovXG4gIGVycm9yc1VybD86IHN0cmluZztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tIHNlcnZpY2UgY2FsbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVGhlIHNlcnZpY2UgY2xpZW50IHRoYXQgcmVwcmVzZW50cyBjb25uZWN0aW9uIHRvIHRoZSBPcmdhbml6ZXIgU2VydmljZS5cbiAqIEVhY2ggQVBJIG9wZXJhdGlvbiBpcyBleHBvc2VkIGFzIGEgZnVuY3Rpb24gb24gc2VydmljZS5cbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1jbGFzc2VzLXBlci1maWxlXG5leHBvcnQgY2xhc3MgUFNldCBleHRlbmRzIFNlcnZpY2Uge1xuICAvKipcbiAgICogQGNvbnN0cnVjdG9yIENvbnN0cnVjdHMgYSBzZXJ2aWNlIG9iamVjdC5cbiAgICogQHBhcmFtIHtDb25maWd9IGNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIChlLmcuIHNlcnZpY2UgdXJsKS4gSWYgbm90IHByb3ZpZGVkIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB1c2VkLlxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFscyBUaGUgY3JlZGVudGlhbHMgdG8gYmUgYXR0YWNoZWQgdG8gc2VydmljZSByZXF1ZXN0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IFBhcnRpYWw8Q29uZmlndXJhdGlvbj4pIHtcbiAgICBjb25zdCBzYW5pdGl6ZWRDb25maWc6IFBhcnRpYWw8Q29uZmlndXJhdGlvbj4gPSB7IC4uLmNvbmZpZyB9O1xuXG4gICAgaWYgKFxuICAgICAgc2FuaXRpemVkQ29uZmlnICYmXG4gICAgICBzYW5pdGl6ZWRDb25maWcucmVnaW9uICYmXG4gICAgICBzYW5pdGl6ZWRDb25maWcuc2VydmljZVVyaSA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBpZiAoUHNldFNlcnZpY2VVcmlNYXAuaGFzKHNhbml0aXplZENvbmZpZy5yZWdpb24pKSB7XG4gICAgICAgIHNhbml0aXplZENvbmZpZy5zZXJ2aWNlVXJpID0gUHNldFNlcnZpY2VVcmlNYXAuZ2V0KFxuICAgICAgICAgIHNhbml0aXplZENvbmZpZy5yZWdpb25cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVW5rbm93biByZWdpb246ICR7XG4gICAgICAgICAgICBzYW5pdGl6ZWRDb25maWcucmVnaW9uXG4gICAgICAgICAgfSwgYWxsb3dlZCB2YWx1ZXMgJHtBcnJheS5mcm9tKFBzZXRTZXJ2aWNlVXJpTWFwLmtleXMoKSkuam9pbignLCAnKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VwZXIoeyAuLi5nZXREZWZhdWx0Q29uZmlndXJhdGlvbigpLCAuLi5zYW5pdGl6ZWRDb25maWcgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBpbmZvcm1hdGlvbiB0aGUgc2VydmljZSBrbm93cyBhYm91dCB0aGUgY3VycmVudCB1c2VyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8VXNlckluZm9SZXNwb25zZT4+fSB0aGUgaW5mb3JtYXRpb24ga25vd24gYWJvdXQgdGhlIGNhbGxlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRVc2VySW5mbyhcbiAgICBwYXJhbXM/OiBVc2VySW5mb0dldE9wdGlvbnNcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8VXNlckluZm9SZXNwb25zZT4+IHtcbiAgICBsZXQgdXJsID0gJ21lJztcbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IFtdO1xuICAgICAgaWYgKHBhcmFtcy53YWl0KSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goJ3dhaXQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5yZWZyZXNoKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goJ3JlZnJlc2gnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXJsICs9IGA/JHtxdWVyeS5qb2luKCcmJyl9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8VXNlckluZm9SZXNwb25zZT4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0cmVlIGRlc2NyaXB0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJJZCBUaGUgbGlicmFyeSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge0dldExpYnJhcnlPcHRpb25zfSBwYXJhbXMgVGhlIG9wdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPExpYnJhcnlSZXNwb25zZT4+fSBUaGUgc2VydmljZSByZXNwb25zZSB3aXRoIHRyZWUgZGVzY3JpcHRvci5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExpYnJhcnkoXG4gICAgbGliSWQ6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBHZXRMaWJyYXJ5T3B0aW9uc1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxMaWJyYXJ5UmVzcG9uc2U+PiB7XG4gICAgY29uc3QgdXJsID0gYGxpYnMvJHtlbmNvZGVVUklDb21wb25lbnQobGliSWQpfSR7XG4gICAgICBwYXJhbXMgJiYgcGFyYW1zLmRlbGV0ZWQgPyAnP2RlbGV0ZWQnIDogJydcbiAgICB9YDtcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdDxMaWJyYXJ5UmVzcG9uc2U+KHVybCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBsaWJyYXJ5LlxuICAgKiBAcGFyYW0ge0NyZWF0ZUxpYnJhcnlSZXF1ZXN0fSByZXF1ZXN0IFRoZSBsaWJyYXJ5IGNyZWF0aW9uIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxMaWJyYXJ5UmVzcG9uc2U+Pn0gVGhlIHNlcnZpY2UgcmVzcG9uc2Ugd2l0aCB0cmVlIGRlc2NyaXB0b3IuXG4gICAqIEB0aHJvd3Mge1NlcnZpY2VFcnJvcn0gaW4gY2FzZSBvZiB0aGUgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVMaWJyYXJ5KFxuICAgIHJlcXVlc3Q6IENyZWF0ZUxpYnJhcnlSZXF1ZXN0XG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPExpYnJhcnlSZXNwb25zZT4+IHtcbiAgICBjb25zdCB1cmwgPSAnbGlicyc7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8TGlicmFyeVJlc3BvbnNlPihcbiAgICAgIHVybCxcbiAgICAgICdQT1NUJyxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBsaWJyYXJ5IGRlc2NyaXB0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJJZCBUaGUgbGlicmFyeSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge1VwZGF0ZUxpYnJhcnlSZXF1ZXN0fSByZXF1ZXN0IFRoZSBsaWJyYXJ5IGRlc2NyaXB0b3IgdXBkYXRlIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxMaWJyYXJ5UmVzcG9uc2U+Pn0gVGhlIHNlcnZpY2UgcmVzcG9uc2Ugd2l0aCB0cmVlIGRlc2NyaXB0b3IuXG4gICAqIEB0aHJvd3Mge1NlcnZpY2VFcnJvcn0gaW4gY2FzZSBvZiB0aGUgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVMaWJyYXJ5KFxuICAgIGxpYklkOiBzdHJpbmcsXG4gICAgcmVxdWVzdDogVXBkYXRlTGlicmFyeVJlcXVlc3RcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8TGlicmFyeVJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHVybCA9IGBsaWJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpYklkKX1gO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PExpYnJhcnlSZXNwb25zZT4oXG4gICAgICB1cmwsXG4gICAgICAnUEFUQ0gnLFxuICAgICAgSlNPTi5zdHJpbmdpZnkocmVxdWVzdClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIHRoZSB0cmVlIGFzIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJJZCBUaGUgbGlicmFyeSBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUcmVlUmVzcG9uc2U+Pn0gVGhlIGRlLXNlcmlhbGl6ZWQgc2VydmljZSByZXNwb25zZSB3aXRoIGxpYnJhcnkgZGVzY3JpcHRvci5cbiAgICogQHBhcmFtIHtEZWxldGVPcHRpb25zfSBwYXJhbXMgVGhlIG9wdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZUxpYnJhcnkoXG4gICAgbGliSWQ6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBEZWxldGVPcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPExpYnJhcnlSZXNwb25zZT4+IHtcbiAgICBjb25zdCB1cmwgPSBgbGlicy8ke2VuY29kZVVSSUNvbXBvbmVudChsaWJJZCl9YDtcblxuICAgIGxldCBoZWFkZXJzOiBIZWFkZXJzIHwgdW5kZWZpbmVkO1xuICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLnYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgJ0lmLU1hdGNoJzogYFcvXCIke3BhcmFtcy52fVwiYCB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdDxMaWJyYXJ5UmVzcG9uc2U+KHVybCwgJ0RFTEVURScsIHVuZGVmaW5lZCwgaGVhZGVycyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaWJyYXJ5IGFjY2VzcyBjb250cm9sIHBvbGljeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpYklkIFRoZSBsaWJyYXJ5IGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxQb2xpY3k+Pn0gdGhlIGFjY2VzcyBjb250cm9sIHBvbGljeS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRMaWJyYXJ5UG9saWN5KFxuICAgIGxpYklkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8UG9saWN5Pj4ge1xuICAgIGNvbnN0IHVybCA9IGBsaWJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpYklkKX0vcG9saWN5YDtcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdDxQb2xpY3k+KHVybCk7XG4gIH1cblxuICAvKipcbiAgICogUHV0cyB0aGUgbGlicmFyeSBhY2Nlc3MgY29udHJvbCBwb2xpY3kuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJJZCBUaGUgbGlicmFyeSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge1BvbGljeX0gcG9saWN5IFRoZSBwb2xpY3kuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTx2b2lkPj59IHRoZSBlbXB0eSByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwdXRMaWJyYXJ5UG9saWN5KFxuICAgIGxpYklkOiBzdHJpbmcsXG4gICAgcG9saWN5OiBQb2xpY3lcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8dm9pZD4+IHtcbiAgICBjb25zdCB1cmwgPSBgbGlicy8ke2VuY29kZVVSSUNvbXBvbmVudChsaWJJZCl9L3BvbGljeWA7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8dm9pZD4odXJsLCAnUFVUJywgSlNPTi5zdHJpbmdpZnkocG9saWN5KSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzb21lIG9yIGFsbCAodXAgdG8gNTAwLCBkZWZhdWx0IGlzIDEwMCkgb2YgdGhlIHBzZXQgZGVmaW5pdGlvbnMgaW4gYSBsaWJyYXJ5LlxuICAgKiBZb3UgY2FuIHVzZSB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIGFzIHNlbGVjdGlvbiBjcml0ZXJpYSB0byByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIG5vZGVzIGluIGEgdHJlZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpYklkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBsaWJyYXJ5IHRvIGxpc3QgZGVmaW5pdGlvbnMgZnJvbS5cbiAgICogQHBhcmFtIHtMaXN0RGVmaW5pdGlvbnNPcHRpb25zfSBwYXJhbXMgVGhlIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPExpc3REZWZpbml0aW9uc1Jlc3BvbnNlPj59IFRoZSBkZS1zZXJpYWxpemVkIHNlcnZpY2UgcmVzcG9uc2UuXG4gICAqIEB0aHJvd3Mge1NlcnZpY2VFcnJvcn0gaW4gY2FzZSBvZiB0aGUgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsaXN0RGVmaW5pdGlvbnMoXG4gICAgbGliSWQ6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBMaXN0RGVmaW5pdGlvbnNPcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPExpc3REZWZpbml0aW9uc1Jlc3BvbnNlPj4ge1xuICAgIGxldCB1cmwgPSBgbGlicy8ke2VuY29kZVVSSUNvbXBvbmVudChsaWJJZCl9L2RlZnNgO1xuXG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgY29uc3QgcXVlcnkgPSBbXTtcbiAgICAgIGlmIChwYXJhbXMuZGVsZXRlZCkge1xuICAgICAgICBxdWVyeS5wdXNoKCdkZWxldGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMudG9wKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goYHRvcD0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMudG9wLnRvU3RyaW5nKCkpfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNraXB0b2tlbikge1xuICAgICAgICBxdWVyeS5wdXNoKGBza2lwdG9rZW49JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnNraXB0b2tlbil9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMucHJlZml4KSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goYHByZWZpeD0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMucHJlZml4KX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy50eXBlKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goYHR5cGU9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnR5cGUpfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnkubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gYD8ke3F1ZXJ5LmpvaW4oJyYnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PExpc3REZWZpbml0aW9uc1Jlc3BvbnNlPih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgc29tZSBvciBhbGwgKHVwIHRvIDUwMCwgZGVmYXVsdCBpcyAxMDApIG9mIHRoZSBkZWZpbml0aW9uIHZlcnNpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGliSWQgVGhlIGxpYnJhcnkgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlZklkIFRoZSBkZWZpbml0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7TGlzdE5vZGVWZXJzaW9uc09wdGlvbnN9IHBhcmFtcyBUaGUgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8TGlzdERlZmluaXRpb25zUmVzcG9uc2U+Pn0gVGhlIGRlLXNlcmlhbGl6ZWQgc2VydmljZSByZXNwb25zZS5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3REZWZpbml0aW9uVmVyc2lvbnMoXG4gICAgbGliSWQ6IHN0cmluZyxcbiAgICBkZWZJZDogc3RyaW5nLFxuICAgIHBhcmFtcz86IExpc3REZWZpbml0aW9uVmVyc2lvbnNPcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPExpc3REZWZpbml0aW9uc1Jlc3BvbnNlPj4ge1xuICAgIGxldCB1cmwgPSBgbGlicy8ke2VuY29kZVVSSUNvbXBvbmVudChsaWJJZCl9L2RlZnMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBkZWZJZFxuICAgICl9L3ZlcnNpb25zYDtcblxuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gW107XG4gICAgICBpZiAocGFyYW1zLmRlbGV0ZWQpIHtcbiAgICAgICAgcXVlcnkucHVzaCgnZGVsZXRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnRvcCkge1xuICAgICAgICBxdWVyeS5wdXNoKGB0b3A9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnRvcC50b1N0cmluZygpKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5za2lwdG9rZW4pIHtcbiAgICAgICAgcXVlcnkucHVzaChgc2tpcHRva2VuPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5za2lwdG9rZW4pfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnkubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gYD8ke3F1ZXJ5LmpvaW4oJyYnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PExpc3REZWZpbml0aW9uc1Jlc3BvbnNlPih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRlZmluaXRpb24gZGVzY3JpcHRvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpYklkIFRoZSBsaWJyYXJ5IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWZJZCBUaGUgZGVmaW5pdGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge0dldERlZmluaXRpb25PcHRpb25zfSBwYXJhbXMgVGhlIG9wdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPERlZmluaXRpb25SZXNwb25zZT4+fSBUaGUgc2VydmljZSByZXNwb25zZSB3aXRoIHBzZXQgZGVmaW5pdGlvbiBkZXNjcmlwdG9yLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGVmaW5pdGlvbihcbiAgICBsaWJJZDogc3RyaW5nLFxuICAgIGRlZklkOiBzdHJpbmcsXG4gICAgcGFyYW1zPzogR2V0RGVmaW5pdGlvbk9wdGlvbnNcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8RGVmaW5pdGlvblJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHVybCA9IGBsaWJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpYklkKX0vZGVmcy8ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGRlZklkXG4gICAgKX0ke3BhcmFtcyAmJiBwYXJhbXMuZGVsZXRlZCA/ICc/ZGVsZXRlZCcgOiAnJ31gO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PERlZmluaXRpb25SZXNwb25zZT4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBwc2V0IGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJJZCBUaGUgbGlicmFyeSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVmSWQgVGhlIGRlZmluaXRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHZlciBUaGUgZGVmaW5pdGlvbiByZXNvdXJjZSB2ZXJzaW9uIG51bWJlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPERlZmluaXRpb25SZXNwb25zZT4+fSBUaGUgc2VydmljZSByZXNwb25zZSB3aXRoIHBzZXQgZGVmaW5pdGlvbiBkZXNjcmlwdG9yLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGVmaW5pdGlvblZlcnNpb24oXG4gICAgbGliSWQ6IHN0cmluZyxcbiAgICBkZWZJZDogc3RyaW5nLFxuICAgIHZlcjogbnVtYmVyXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPERlZmluaXRpb25SZXNwb25zZT4+IHtcbiAgICBjb25zdCB1cmwgPSBgbGlicy8ke2VuY29kZVVSSUNvbXBvbmVudChsaWJJZCl9L2RlZnMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBkZWZJZFxuICAgICl9L3ZlcnNpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHZlci50b1N0cmluZygpKX1gO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PERlZmluaXRpb25SZXNwb25zZT4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBwc2V0IGRlZmluaXRpb24gYnkgdGhlIHNjaGVtYSB2ZXJzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGliSWQgVGhlIGxpYnJhcnkgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlZklkIFRoZSBkZWZpbml0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2ZXIgVGhlIHNjaGVtYSB2ZXJzaW9uIG51bWJlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPERlZmluaXRpb25SZXNwb25zZT4+fSBUaGUgc2VydmljZSByZXNwb25zZSB3aXRoIHBzZXQgZGVmaW5pdGlvbiBkZXNjcmlwdG9yLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGVmaW5pdGlvblZlcnNpb25CeVNjaGVtYShcbiAgICBsaWJJZDogc3RyaW5nLFxuICAgIGRlZklkOiBzdHJpbmcsXG4gICAgdmVyOiBudW1iZXJcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8RGVmaW5pdGlvblJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHVybCA9IGBsaWJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpYklkKX0vZGVmcy8ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGRlZklkXG4gICAgKX0vc2NoZW1hLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHZlci50b1N0cmluZygpKX1gO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PERlZmluaXRpb25SZXNwb25zZT4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgY29sbGVjdGlvbiBvZiBwcm9wZXJ0eSBzZXQgZGVmaW5pdGlvbnMgZnJvbSBhIGxpYnJhcnksIGEgY29sbGVjdGlvbiBvZiBlcnJvcnMgYW5kIGEgY29sbGVjdGlvbiBvZiB1bmhhbmRsZWQgcmVxdWVzdHMuXG4gICAqIEl0IHNob3VsZCBuZXZlciByZXR1cm4gYSBwYWdlZCByZXNwb25zZS5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGJhdGNoR2V0IGluc3RlYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpYklkIFRoZSBsaWJyYXJ5IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7UFNldERlZklkUmVxdWVzdH0gaWRzIFRoZSBpZHMvdmVyc2lvbnMgb2YgcHJvcGVydHkgc2V0IGRlZmluaXRpb25zIHRvIHJldHVybi5cbiAgICogQHBhcmFtIHtHZXREZWZpbml0aW9uT3B0aW9uc30gcGFyYW1zIFRoZSBvcHRpb25hbCByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxCYXRjaFBTZXREZWZSZXNwb25zZT4+fSBUaGUgc2VydmljZSByZXNwb25zZS5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFBTZXREZWZpbml0aW9ucyhcbiAgICBsaWJJZDogc3RyaW5nLFxuICAgIGlkczogUFNldERlZklkUmVxdWVzdCxcbiAgICBwYXJhbXM/OiBHZXREZWZpbml0aW9uT3B0aW9uc1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxCYXRjaFBTZXREZWZSZXNwb25zZT4+IHtcbiAgICBjb25zdCByZXF1ZXN0QmF0Y2hHZXQ6IFBTZXRCYXRjaEdldFJlcXVlc3QgPSB7fTtcbiAgICBjb25zdCBwYXJhbXNCYXRjaEdldDogUFNldEJhdGNoR2V0T3B0aW9ucyA9IHsgZGVsZXRlZDogcGFyYW1zPy5kZWxldGVkIH07XG5cbiAgICBjb25zdCBkZWZzID0gbmV3IFNldDxEZWZpbml0aW9uSWRlbnRpdHk+KCk7XG4gICAgaWRzLml0ZW1zLmZvckVhY2goKGRlZikgPT4ge1xuICAgICAgZGVmcy5hZGQoeyBsaWJJZCwgZGVmSWQ6IGRlZi5pZCwgdjogZGVmLnYsIHNjaGVtYVY6IGRlZi5zY2hlbWFWIH0pO1xuICAgIH0pO1xuICAgIHJlcXVlc3RCYXRjaEdldC5kZWZzID0gQXJyYXkuZnJvbShkZWZzKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlQmF0Y2hHZXQgPSBhd2FpdCB0aGlzLmJhdGNoR2V0KFxuICAgICAgcmVxdWVzdEJhdGNoR2V0LFxuICAgICAgcGFyYW1zQmF0Y2hHZXRcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBTZXJ2aWNlUmVzcG9uc2U8QmF0Y2hQU2V0RGVmUmVzcG9uc2U+ID1cbiAgICAgIG5ldyBTZXJ2aWNlUmVzcG9uc2U8QmF0Y2hQU2V0RGVmUmVzcG9uc2U+KFxuICAgICAgICB0aGlzLFxuICAgICAgICByZXNwb25zZUJhdGNoR2V0LnJlc3BvbnNlLFxuICAgICAgICB7IGl0ZW1zOiByZXNwb25zZUJhdGNoR2V0LmRhdGEucmVzcG9uc2VzLmRlZnMgfVxuICAgICAgKTtcblxuICAgIGlmIChyZXNwb25zZUJhdGNoR2V0LmRhdGEuZXJyb3JzLmRlZnMpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IG5ldyBTZXQ8UFNldERlZklkRXJyb3I+KCk7XG4gICAgICByZXNwb25zZUJhdGNoR2V0LmRhdGEuZXJyb3JzLmRlZnM/LmZvckVhY2goKGRlZikgPT4ge1xuICAgICAgICBlcnJvcnMuYWRkKHtcbiAgICAgICAgICBpdGVtOiB7XG4gICAgICAgICAgICBpZDogZGVmLml0ZW0uZGVmSWQsXG4gICAgICAgICAgICB2OiBkZWYuaXRlbS52LFxuICAgICAgICAgICAgc2NoZW1hVjogZGVmLml0ZW0uc2NoZW1hVixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvZGU6IGRlZi5jb2RlLFxuICAgICAgICAgIG1lc3NhZ2U6IGRlZi5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmVzcG9uc2UuZGF0YS5lcnJvcnMgPSBBcnJheS5mcm9tKGVycm9ycyk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlQmF0Y2hHZXQuZGF0YS51bnByb2Nlc3NlZC5kZWZzKSB7XG4gICAgICBjb25zdCB1bnByb2Nlc3NlZCA9IG5ldyBTZXQ8UFNldERlZklkPigpO1xuICAgICAgcmVzcG9uc2VCYXRjaEdldC5kYXRhLnVucHJvY2Vzc2VkLmRlZnM/LmZvckVhY2goKGRlZikgPT4ge1xuICAgICAgICB1bnByb2Nlc3NlZC5hZGQoeyBpZDogZGVmLmRlZklkLCB2OiBkZWYudiwgc2NoZW1hVjogZGVmLnNjaGVtYVYgfSk7XG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlLmRhdGEudW5wcm9jZXNzZWQgPSBBcnJheS5mcm9tKHVucHJvY2Vzc2VkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGliSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGxpYnJhcnkgdG8gY3JlYXRlIGEgZGVmaW5pdGlvbiBpbi5cbiAgICogQHBhcmFtIHtDcmVhdGVEZWZpbml0aW9uUmVxdWVzdH0gcmVxdWVzdCBUaGUgZGVmaW5pdGlvbiBjcmVhdGlvbiByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8RGVmaW5pdGlvblJlc3BvbnNlPj59IFRoZSBkZS1zZXJpYWxpemVkIHNlcnZpY2UgcmVzcG9uc2Ugd2l0aCB0cmVlIGRlc2NyaXB0b3IuXG4gICAqIEB0aHJvd3Mge1NlcnZpY2VFcnJvcn0gaW4gY2FzZSBvZiB0aGUgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVEZWZpbml0aW9uKFxuICAgIGxpYklkOiBzdHJpbmcsXG4gICAgcmVxdWVzdDogQ3JlYXRlRGVmaW5pdGlvblJlcXVlc3RcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8RGVmaW5pdGlvblJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHVybCA9IGBsaWJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpYklkKX0vZGVmc2A7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8RGVmaW5pdGlvblJlc3BvbnNlPihcbiAgICAgIHVybCxcbiAgICAgICdQT1NUJyxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGliSWQgVGhlIGxpYnJhcnkgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlZklkIFRoZSBkZWZpbml0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7VXBkYXRlRGVmaW5pdGlvblJlcXVlc3R9IHJlcXVlc3QgVGhlIHRyZWUgZGVzY3JpcHRvciB1cGRhdGUgcmVxdWVzdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPERlZmluaXRpb25SZXNwb25zZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlRGVmaW5pdGlvbihcbiAgICBsaWJJZDogc3RyaW5nLFxuICAgIGRlZklkOiBzdHJpbmcsXG4gICAgcmVxdWVzdDogVXBkYXRlRGVmaW5pdGlvblJlcXVlc3RcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8RGVmaW5pdGlvblJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHVybCA9IGBsaWJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpYklkKX0vZGVmcy8ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGRlZklkXG4gICAgKX1gO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PERlZmluaXRpb25SZXNwb25zZT4oXG4gICAgICB1cmwsXG4gICAgICAnUEFUQ0gnLFxuICAgICAgSlNPTi5zdHJpbmdpZnkocmVxdWVzdClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIHRoZSBkZWZpbml0aW9uIGFzIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJJZCBUaGUgdHJlZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVmSWQgVGhlIG5vZGUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtEZWxldGVPcHRpb25zfSBwYXJhbXMgVGhlIG9wdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPERlZmluaXRpb25SZXNwb25zZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlIHdpdGggbm9kZSBkZXNjcmlwdG9yLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlRGVmaW5pdGlvbihcbiAgICBsaWJJZDogc3RyaW5nLFxuICAgIGRlZklkOiBzdHJpbmcsXG4gICAgcGFyYW1zPzogRGVsZXRlT3B0aW9uc1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxEZWZpbml0aW9uUmVzcG9uc2U+PiB7XG4gICAgY29uc3QgdXJsID0gYGxpYnMvJHtlbmNvZGVVUklDb21wb25lbnQobGliSWQpfS9kZWZzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgZGVmSWRcbiAgICApfWA7XG5cbiAgICBsZXQgaGVhZGVyczogSGVhZGVycyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyYW1zICYmIHBhcmFtcy52ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgICdJZi1NYXRjaCc6IGBXL1wiJHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnYudG9TdHJpbmcoKSl9XCJgLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8RGVmaW5pdGlvblJlc3BvbnNlPihcbiAgICAgIHVybCxcbiAgICAgICdERUxFVEUnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgaGVhZGVyc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGV4aXN0aW5nIHBzZXQgaW5zdGFuY2VzIGFnYWluc3QgYSBzY2hlbWEgcHJvcG9zYWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJJZCBUaGUgbGlicmFyeSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVmSWQgVGhlIGRlZmluaXRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtWYWxpZGF0ZVJlcXVlc3R9IHJlcXVlc3QgVGhlIHRyZWUgZGVzY3JpcHRvciB1cGRhdGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtWYWxpZGF0ZU9wdGlvbnN9IHBhcmFtcyBUaGUgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8VmFsaWRhdGVSZXNwb25zZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUoXG4gICAgbGliSWQ6IHN0cmluZyxcbiAgICBkZWZJZDogc3RyaW5nLFxuICAgIHJlcXVlc3Q6IFZhbGlkYXRlUmVxdWVzdCxcbiAgICBwYXJhbXM/OiBWYWxpZGF0ZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8VmFsaWRhdGVSZXNwb25zZT4+IHtcbiAgICBsZXQgdXJsID0gYGxpYnMvJHtlbmNvZGVVUklDb21wb25lbnQobGliSWQpfS9kZWZzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgZGVmSWRcbiAgICApfS92YWxpZGF0ZWA7XG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IFtdO1xuICAgICAgaWYgKHBhcmFtcy5kZWxldGVkKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goJ2RlbGV0ZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5za2lwdG9rZW4pIHtcbiAgICAgICAgcXVlcnkucHVzaChgc2tpcHRva2VuPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5za2lwdG9rZW4pfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnkubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gYD8ke3F1ZXJ5LmpvaW4oJyYnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PFZhbGlkYXRlUmVzcG9uc2U+KFxuICAgICAgdXJsLFxuICAgICAgJ1BPU1QnLFxuICAgICAgSlNPTi5zdHJpbmdpZnkocmVxdWVzdClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBleGlzdGluZyBwc2V0IGluc3RhbmNlcyBhZ2FpbnN0IGEgc2NoZW1hIHByb3Bvc2FsLlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRlUmVzcG9uc2V9IHByZXYgVGhlIHJlc3BvbnNlIGZvciBwcmV2aW91cyBwYWdlLlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRlUmVxdWVzdH0gcmVxdWVzdCBUaGUgdHJlZSBkZXNjcmlwdG9yIHVwZGF0ZSByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8VmFsaWRhdGVSZXNwb25zZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVOZXh0UGFnZShcbiAgICBwcmV2OiBWYWxpZGF0ZVJlc3BvbnNlLFxuICAgIHJlcXVlc3Q6IFZhbGlkYXRlUmVxdWVzdFxuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxWYWxpZGF0ZVJlc3BvbnNlPj4ge1xuICAgIGlmIChwcmV2ICYmIHByZXYubmV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8VmFsaWRhdGVSZXNwb25zZT4oXG4gICAgICAgIHByZXYubmV4dCxcbiAgICAgICAgJ1BPU1QnLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBubyBuZXh0IHBhZ2UuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgc29tZSBvciBhbGwgKHVwIHRvIDUwMCwgZGVmYXVsdCBpcyAxMDApIG9mIHRoZSBwc2V0cyBsaW5rZWQgdG8gdGhlIGV4dGVybmFsIHJlc291cmNlLlxuICAgKiBZb3UgY2FuIHVzZSB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIGFzIHNlbGVjdGlvbiBjcml0ZXJpYSB0byByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIG5vZGVzIGluIGEgdHJlZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmsgVGhlIGxpbmsgdG8gZXh0ZXJuYWwgcmVzb3VyY2UuXG4gICAqIEBwYXJhbSB7TGlzdFBTZXRzT3B0aW9uc30gcGFyYW1zIFRoZSByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxMaXN0UFNldHNSZXNwb25zZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdFBTZXRzKFxuICAgIGxpbms6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBMaXN0UFNldHNPcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPExpc3RQU2V0c1Jlc3BvbnNlPj4ge1xuICAgIGxldCB1cmwgPSBgcHNldHMvJHtlbmNvZGVVUklDb21wb25lbnQobGluayl9YDtcblxuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gW107XG4gICAgICBpZiAocGFyYW1zLmRlbGV0ZWQpIHtcbiAgICAgICAgcXVlcnkucHVzaCgnZGVsZXRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnRvcCkge1xuICAgICAgICBxdWVyeS5wdXNoKGB0b3A9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnRvcC50b1N0cmluZygpKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5za2lwdG9rZW4pIHtcbiAgICAgICAgcXVlcnkucHVzaChgc2tpcHRva2VuPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5za2lwdG9rZW4pfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnkubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gYD8ke3F1ZXJ5LmpvaW4oJyYnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PExpc3RQU2V0c1Jlc3BvbnNlPih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgc29tZSBvciBhbGwgKHVwIHRvIDUwMCwgZGVmYXVsdCBpcyAxMDApIG9mIHRoZSBwc2V0cyBjcmVhdGVkIGZyb20gdGhlIGRlZmluaXRpb24uXG4gICAqIFlvdSBjYW4gdXNlIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgYXMgc2VsZWN0aW9uIGNyaXRlcmlhIHRvIHJldHVybiBhIHN1YnNldCBvZiB0aGUgbm9kZXMgaW4gYSB0cmVlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGliSWQgVGhlIGxpYnJhcnkgaWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWZJZCBUaGUgZGVmaW5pdGlvbiBpZC5cbiAgICogQHBhcmFtIHtMaXN0UFNldHNCeURlZmluaXRpb25PcHRpb25zfSBwYXJhbXMgVGhlIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPExpc3RQU2V0c1Jlc3BvbnNlPj59IFRoZSBkZS1zZXJpYWxpemVkIHNlcnZpY2UgcmVzcG9uc2UuXG4gICAqIEB0aHJvd3Mge1NlcnZpY2VFcnJvcn0gaW4gY2FzZSBvZiB0aGUgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsaXN0UFNldHNCeURlZmluaXRpb24oXG4gICAgbGliSWQ6IHN0cmluZyxcbiAgICBkZWZJZDogc3RyaW5nLFxuICAgIHBhcmFtcz86IExpc3RQU2V0c0J5RGVmaW5pdGlvbk9wdGlvbnNcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8TGlzdFBTZXRzUmVzcG9uc2U+PiB7XG4gICAgbGV0IHVybCA9IGBsaWJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpYklkKX0vZGVmcy8ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGRlZklkXG4gICAgKX0vcHNldHNgO1xuXG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgY29uc3QgcXVlcnkgPSBbXTtcbiAgICAgIGlmIChwYXJhbXMuZGVsZXRlZCkge1xuICAgICAgICBxdWVyeS5wdXNoKCdkZWxldGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMudG9wKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goYHRvcD0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMudG9wLnRvU3RyaW5nKCkpfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNraXB0b2tlbikge1xuICAgICAgICBxdWVyeS5wdXNoKGBza2lwdG9rZW49JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnNraXB0b2tlbil9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMubGluaykge1xuICAgICAgICBxdWVyeS5wdXNoKGBsaW5rPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5saW5rKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXJsICs9IGA/JHtxdWVyeS5qb2luKCcmJyl9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdDxMaXN0UFNldHNSZXNwb25zZT4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHNvbWUgb3IgYWxsICh1cCB0byA1MDAsIGRlZmF1bHQgaXMgMTAwKSBvZiB0aGUgcHNldCB2ZXJzaW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmsgVGhlIGV4dGVybmFsIHJlc291cmNlIGxpbmsuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJJZCBUaGUgbGlicmFyeSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVmSWQgVGhlIGRlZmluaXRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtMaXN0UFNldFZlcnNpb25zT3B0aW9uc30gcGFyYW1zIFRoZSByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxMaXN0UFNldHNSZXNwb25zZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdFBTZXRWZXJzaW9ucyhcbiAgICBsaW5rOiBzdHJpbmcsXG4gICAgbGliSWQ6IHN0cmluZyxcbiAgICBkZWZJZDogc3RyaW5nLFxuICAgIHBhcmFtcz86IExpc3RQU2V0VmVyc2lvbnNPcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPExpc3RQU2V0c1Jlc3BvbnNlPj4ge1xuICAgIGxldCB1cmwgPSBgcHNldHMvJHtlbmNvZGVVUklDb21wb25lbnQobGluayl9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgbGliSWRcbiAgICApfS8ke2VuY29kZVVSSUNvbXBvbmVudChkZWZJZCl9L3ZlcnNpb25zYDtcblxuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gW107XG4gICAgICBpZiAocGFyYW1zLmRlbGV0ZWQpIHtcbiAgICAgICAgcXVlcnkucHVzaCgnZGVsZXRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnRvcCkge1xuICAgICAgICBxdWVyeS5wdXNoKGB0b3A9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnRvcC50b1N0cmluZygpKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5za2lwdG9rZW4pIHtcbiAgICAgICAgcXVlcnkucHVzaChgc2tpcHRva2VuPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5za2lwdG9rZW4pfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnkubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gYD8ke3F1ZXJ5LmpvaW4oJyYnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PExpc3RQU2V0c1Jlc3BvbnNlPih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBzZXQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaW5rIFRoZSBleHRlcm5hbCByZXNvdXJjZSBsaW5rLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGliSWQgVGhlIGxpYnJhcnkgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlZklkIFRoZSBkZWZpbml0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7R2V0RGVmaW5pdGlvbk9wdGlvbnN9IHBhcmFtcyBUaGUgb3B0aW9uYWwgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8UFNldFJlc3BvbnNlPj59IFRoZSBzZXJ2aWNlIHJlc3BvbnNlIHdpdGggdHJlZSBkZXNjcmlwdG9yLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UFNldChcbiAgICBsaW5rOiBzdHJpbmcsXG4gICAgbGliSWQ6IHN0cmluZyxcbiAgICBkZWZJZDogc3RyaW5nLFxuICAgIHBhcmFtcz86IEdldERlZmluaXRpb25PcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPFBTZXRSZXNwb25zZT4+IHtcbiAgICBjb25zdCB1cmwgPSBgcHNldHMvJHtlbmNvZGVVUklDb21wb25lbnQobGluayl9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgbGliSWRcbiAgICApfS8ke2VuY29kZVVSSUNvbXBvbmVudChkZWZJZCl9JHtcbiAgICAgIHBhcmFtcyAmJiBwYXJhbXMuZGVsZXRlZCA/ICc/ZGVsZXRlZCcgOiAnJ1xuICAgIH1gO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PFBTZXRSZXNwb25zZT4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBwc2V0IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluayBUaGUgZXh0ZXJuYWwgcmVzb3VyY2UgbGluay5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpYklkIFRoZSBsaWJyYXJ5IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWZJZCBUaGUgZGVmaW5pdGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmVyIFRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICogQHBhcmFtIHtHZXREZWZpbml0aW9uT3B0aW9uc30gcGFyYW1zIFRoZSBvcHRpb25hbCByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxQU2V0UmVzcG9uc2U+Pn0gVGhlIHNlcnZpY2UgcmVzcG9uc2Ugd2l0aCB0cmVlIGRlc2NyaXB0b3IuXG4gICAqIEB0aHJvd3Mge1NlcnZpY2VFcnJvcn0gaW4gY2FzZSBvZiB0aGUgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRQU2V0VmVyc2lvbihcbiAgICBsaW5rOiBzdHJpbmcsXG4gICAgbGliSWQ6IHN0cmluZyxcbiAgICBkZWZJZDogc3RyaW5nLFxuICAgIHZlcjogbnVtYmVyXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPFBTZXRSZXNwb25zZT4+IHtcbiAgICBjb25zdCB1cmwgPSBgcHNldHMvJHtlbmNvZGVVUklDb21wb25lbnQobGluayl9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgbGliSWRcbiAgICApfS8ke2VuY29kZVVSSUNvbXBvbmVudChkZWZJZCl9L3ZlcnNpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgdmVyLnRvU3RyaW5nKClcbiAgICApfWA7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8UFNldFJlc3BvbnNlPih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBjb2xsZWN0aW9uIG9mIHByb3BlcnR5IHNldHMgYW5kIGEgY29sbGVjdGlvbiBvZiB1bmhhbmRsZWQgcmVxdXN0cy5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGJhdGNoR2V0IGluc3RlYWRcbiAgICogQGtleXMge1BTZXRLZXlSZXF1ZXN0fSBUaGUga2V5cyBvZiBwcm9wZXJ0eSBzZXRzIHRvIHJldHVyblxuICAgKiBAcGFyYW0ge0dldERlZmluaXRpb25PcHRpb25zfSBwYXJhbXMgVGhlIG9wdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPFBTZXRSZXNwb25zZT4+fSBUaGUgc2VydmljZSByZXNwb25zZSB3aXRoIHRyZWUgZGVzY3JpcHRvci5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFBTZXRzKFxuICAgIGtleXM6IFBTZXRLZXlSZXF1ZXN0LFxuICAgIHBhcmFtcz86IEdldERlZmluaXRpb25PcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPEJhdGNoUFNldFJlc3BvbnNlPFBTZXRLZXk+Pj4ge1xuICAgIGNvbnN0IHJlcXVlc3RCYXRjaEdldDogUFNldEJhdGNoR2V0UmVxdWVzdCA9IHt9O1xuICAgIGNvbnN0IHBhcmFtc0JhdGNoR2V0OiBQU2V0QmF0Y2hHZXRPcHRpb25zID0geyBkZWxldGVkOiBwYXJhbXM/LmRlbGV0ZWQgfTtcblxuICAgIGNvbnN0IHBzZXRzID0gbmV3IFNldDxQU2V0SWRlbnRpdHk+KCk7XG4gICAga2V5cy5pdGVtcy5mb3JFYWNoKChwc2V0KSA9PiB7XG4gICAgICBwc2V0cy5hZGQoe1xuICAgICAgICBsaWJJZDogcHNldC5saWJJZCxcbiAgICAgICAgZGVmSWQ6IHBzZXQuZGVmSWQsXG4gICAgICAgIHY6IHBzZXQudixcbiAgICAgICAgbGluazogcHNldC5saW5rLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmVxdWVzdEJhdGNoR2V0LnBzZXRzID0gQXJyYXkuZnJvbShwc2V0cyk7XG5cbiAgICBjb25zdCByZXNwb25zZUJhdGNoR2V0ID0gYXdhaXQgdGhpcy5iYXRjaEdldChcbiAgICAgIHJlcXVlc3RCYXRjaEdldCxcbiAgICAgIHBhcmFtc0JhdGNoR2V0XG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZTogU2VydmljZVJlc3BvbnNlPEJhdGNoUFNldFJlc3BvbnNlPFBTZXRLZXk+PiA9XG4gICAgICBuZXcgU2VydmljZVJlc3BvbnNlPEJhdGNoUFNldFJlc3BvbnNlPFBTZXRLZXk+PihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgcmVzcG9uc2VCYXRjaEdldC5yZXNwb25zZSxcbiAgICAgICAgeyBpdGVtczogcmVzcG9uc2VCYXRjaEdldC5kYXRhLnJlc3BvbnNlcy5wc2V0cyB8fCBbXSB9XG4gICAgICApO1xuXG4gICAgaWYgKHJlc3BvbnNlQmF0Y2hHZXQuZGF0YS51bnByb2Nlc3NlZC5wc2V0cykge1xuICAgICAgY29uc3QgdW5wcm9jZXNzZWQgPSBuZXcgU2V0PFBTZXRLZXk+KCk7XG4gICAgICByZXNwb25zZUJhdGNoR2V0LmRhdGEudW5wcm9jZXNzZWQucHNldHM/LmZvckVhY2goKHBzZXQpID0+IHtcbiAgICAgICAgdW5wcm9jZXNzZWQuYWRkKHtcbiAgICAgICAgICBsaWJJZDogcHNldC5saWJJZCxcbiAgICAgICAgICBkZWZJZDogcHNldC5kZWZJZCxcbiAgICAgICAgICB2OiBwc2V0LnYsXG4gICAgICAgICAgbGluazogcHNldC5saW5rLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmVzcG9uc2UuZGF0YS51bmhhbmRsZWQgPSBBcnJheS5mcm9tKHVucHJvY2Vzc2VkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGNvbGxlY3Rpb24gb2YgcHJvcGVydHkgc2V0cyBhbmQgYSBjb2xsZWN0aW9uIG9mIHVuaGFuZGxlZCByZXF1c3RzLlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYmF0Y2hHZXQgaW5zdGVhZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGliSWQgVGhlIGxpYnJhcnkgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlZklkIFRoZSBkZWZpbml0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBsaW5rcyB7TGlua1JlcXVlc3R9IFRoZSBsaXN0IG9mIGV4dGVybmFsIHJlc291cmNlIGxpbmtzXG4gICAqIEBwYXJhbSB7R2V0RGVmaW5pdGlvbk9wdGlvbnN9IHBhcmFtcyBUaGUgb3B0aW9uYWwgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8UFNldFJlc3BvbnNlPj59IFRoZSBzZXJ2aWNlIHJlc3BvbnNlIHdpdGggdHJlZSBkZXNjcmlwdG9yLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UFNldHNCeURlZmluaXRpb24oXG4gICAgbGliSWQ6IHN0cmluZyxcbiAgICBkZWZJZDogc3RyaW5nLFxuICAgIGxpbmtzOiBMaW5rUmVxdWVzdCxcbiAgICBwYXJhbXM/OiBHZXREZWZpbml0aW9uT3B0aW9uc1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxCYXRjaFBTZXRSZXNwb25zZTxzdHJpbmc+Pj4ge1xuICAgIGNvbnN0IHJlcXVlc3RCYXRjaEdldDogUFNldEJhdGNoR2V0UmVxdWVzdCA9IHt9O1xuICAgIGNvbnN0IHBhcmFtc0JhdGNoR2V0OiBQU2V0QmF0Y2hHZXRPcHRpb25zID0geyBkZWxldGVkOiBwYXJhbXM/LmRlbGV0ZWQgfTtcblxuICAgIGNvbnN0IHBzZXRzID0gbmV3IFNldDxQU2V0SWRlbnRpdHk+KCk7XG4gICAgbGlua3MuaXRlbXMuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgcHNldHMuYWRkKHsgbGliSWQsIGRlZklkLCBsaW5rIH0pO1xuICAgIH0pO1xuICAgIHJlcXVlc3RCYXRjaEdldC5wc2V0cyA9IEFycmF5LmZyb20ocHNldHMpO1xuXG4gICAgY29uc3QgcmVzcG9uc2VCYXRjaEdldCA9IGF3YWl0IHRoaXMuYmF0Y2hHZXQoXG4gICAgICByZXF1ZXN0QmF0Y2hHZXQsXG4gICAgICBwYXJhbXNCYXRjaEdldFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2U6IFNlcnZpY2VSZXNwb25zZTxCYXRjaFBTZXRSZXNwb25zZTxzdHJpbmc+PiA9XG4gICAgICBuZXcgU2VydmljZVJlc3BvbnNlPEJhdGNoUFNldFJlc3BvbnNlPHN0cmluZz4+KFxuICAgICAgICB0aGlzLFxuICAgICAgICByZXNwb25zZUJhdGNoR2V0LnJlc3BvbnNlLFxuICAgICAgICB7IGl0ZW1zOiByZXNwb25zZUJhdGNoR2V0LmRhdGEucmVzcG9uc2VzLnBzZXRzIHx8IFtdIH1cbiAgICAgICk7XG5cbiAgICBpZiAocmVzcG9uc2VCYXRjaEdldC5kYXRhLnVucHJvY2Vzc2VkLnBzZXRzKSB7XG4gICAgICBjb25zdCB1bnByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgcmVzcG9uc2VCYXRjaEdldC5kYXRhLnVucHJvY2Vzc2VkLnBzZXRzPy5mb3JFYWNoKChwc2V0KSA9PiB7XG4gICAgICAgIHVucHJvY2Vzc2VkLmFkZChwc2V0LmxpbmspO1xuICAgICAgfSk7XG4gICAgICByZXNwb25zZS5kYXRhLnVuaGFuZGxlZCA9IEFycmF5LmZyb20odW5wcm9jZXNzZWQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCBnZXQgcmVzb3VyY2VzLiBEaWZmZXJlbnQgcmVzb3VyY2UgdHlwZXMgKGxpYnMsIGRlZnMsIHBzZXRzKSBjYW4gYmUgcmVxdWVzdGVkIGluIGEgc2luZ2xlIHJlcXVlc3QuXG4gICAqIEl0IHNob3VsZCBuZXZlciByZXR1cm4gYSBwYWdlZCByZXNwb25zZS5cbiAgICogQHBhcmFtIHtCYXRjaEdldFJlcXVlc3R9IHJlcXVlc3QgVGhlIGlkcy92ZXJzaW9ucyBvZiByZXNvdXJjZXMgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge0JhdGNoR2V0T3B0aW9uc30gcGFyYW1zIFRoZSBvcHRpb25hbCByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxCYXRjaEdldFJlc3BvbnNlPj59IFRoZSBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYmF0Y2hHZXQoXG4gICAgcmVxdWVzdDogUFNldEJhdGNoR2V0UmVxdWVzdCxcbiAgICBwYXJhbXM/OiBQU2V0QmF0Y2hHZXRPcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPFBTZXRCYXRjaEdldFJlc3BvbnNlPj4ge1xuICAgIGxldCB1cmwgPSBgYmF0Y2gtZ2V0YDtcblxuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gW107XG4gICAgICBpZiAocGFyYW1zLmRlbGV0ZWQpIHtcbiAgICAgICAgcXVlcnkucHVzaCgnZGVsZXRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnkubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gYD8ke3F1ZXJ5LmpvaW4oJyYnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PFBTZXRCYXRjaEdldFJlc3BvbnNlPihcbiAgICAgIHVybCxcbiAgICAgICdQT1NUJyxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBwc2V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluayBUaGUgZXh0ZXJuYWwgcmVzb3VyY2UgbGluay5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpYklkIFRoZSBsaWJyYXJ5IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWZJZCBUaGUgZGVmaW5pdGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge1VwZGF0ZURlZmluaXRpb25SZXF1ZXN0fSByZXF1ZXN0IFRoZSB0cmVlIGRlc2NyaXB0b3IgdXBkYXRlIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxQU2V0UmVzcG9uc2U+Pn0gVGhlIGRlLXNlcmlhbGl6ZWQgc2VydmljZSByZXNwb25zZS5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVBTZXQoXG4gICAgbGluazogc3RyaW5nLFxuICAgIGxpYklkOiBzdHJpbmcsXG4gICAgZGVmSWQ6IHN0cmluZyxcbiAgICByZXF1ZXN0OiBQU2V0UmVxdWVzdFxuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxQU2V0UmVzcG9uc2U+PiB7XG4gICAgY29uc3QgdXJsID0gYHBzZXRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfS8ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGxpYklkXG4gICAgKX0vJHtlbmNvZGVVUklDb21wb25lbnQoZGVmSWQpfWA7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8UFNldFJlc3BvbnNlPihcbiAgICAgIHVybCxcbiAgICAgICdQQVRDSCcsXG4gICAgICBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgdGhlIHBzZXQgYXMgZGVsZXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmsgVGhlIGV4dGVybmFsIHJlc291cmNlIGxpbmsuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJJZCBUaGUgdHJlZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVmSWQgVGhlIG5vZGUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtEZWxldGVPcHRpb25zfSBwYXJhbXMgVGhlIG9wdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPFBTZXRSZXNwb25zZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlIHdpdGggbm9kZSBkZXNjcmlwdG9yLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlUFNldChcbiAgICBsaW5rOiBzdHJpbmcsXG4gICAgbGliSWQ6IHN0cmluZyxcbiAgICBkZWZJZDogc3RyaW5nLFxuICAgIHBhcmFtcz86IERlbGV0ZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8UFNldFJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHVybCA9IGBwc2V0cy8ke2VuY29kZVVSSUNvbXBvbmVudChsaW5rKX0vJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBsaWJJZFxuICAgICl9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGRlZklkKX1gO1xuXG4gICAgbGV0IGhlYWRlcnM6IEhlYWRlcnMgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMudiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyAnSWYtTWF0Y2gnOiBgVy9cIiR7cGFyYW1zLnZ9XCJgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PFBTZXRSZXNwb25zZT4odXJsLCAnREVMRVRFJywgdW5kZWZpbmVkLCBoZWFkZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0IGEgY2hhbmdlc2V0IGZvciBwcm9jZXNzaW5nLiBUaGUgY2hhbmdlc2V0IGlzIHByb2Nlc3NlcyBzeW5jaHJvbm91c2x5IGlmIHRoZXIgZWFyZSA8PTUwMCBpdGVtcyBpbiB0aGUgcmVxdWVzdCwgb3RoZXJ3aXNlIGFzeW5jaHJvbm91c2x5LlxuICAgKiBAcGFyYW0ge0NoYW5nZXNldFJlcXVlc3R9IGNoYW5nZXNldCBUaGUgcmVxdWVzdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPENoYW5nZXNldFJlc3BvbnNlIHwgUFNldENoYW5nZXNldEFjY2VwdGVkUmVzcG9uc2U+Pn0gVGhlIGRlLXNlcmlhbGl6ZWQgc2VydmljZSByZXNwb25zZS5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNoYW5nZXNldChcbiAgICBjaGFuZ2VzZXQ6IFBTZXRDaGFuZ2VzZXRSZXF1ZXN0XG4gICk6IFByb21pc2U8XG4gICAgU2VydmljZVJlc3BvbnNlPFBTZXRDaGFuZ2VzZXRSZXNwb25zZUlubGluZSB8IFBTZXRDaGFuZ2VzZXRSZXNwb25zZUFjY2VwdGVkPlxuICA+IHtcbiAgICBjb25zdCB1cmwgPSAncHNldHMvY2hhbmdlc2V0JztcblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PFBTZXRDaGFuZ2VzZXRSZXNwb25zZUlubGluZT4oXG4gICAgICB1cmwsXG4gICAgICAnUE9TVCcsXG4gICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzZXQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGEgY2hhbmdlc2V0IGFuZCBnZXQgYSBsaW5rIGZvciB1cGxvYWRpbmcgY2hhbmdlc2V0IGZvciBsYXRlciBwcm9jZXNzaW5nLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8Q2hhbmdlc2V0U3RhdHVzUmVzcG9uc2U+Pn0gVGhlIGRlLXNlcmlhbGl6ZWQgc2VydmljZSByZXNwb25zZS5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNoYW5nZXNldEFzeW5jKCk6IFByb21pc2U8XG4gICAgU2VydmljZVJlc3BvbnNlPFBTZXRDaGFuZ2VzZXRSZXNwb25zZUFzeW5jPlxuICA+IHtcbiAgICBjb25zdCB1cmwgPSAncHNldHMvY2hhbmdlc2V0LWFzeW5jJztcblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PFBTZXRDaGFuZ2VzZXRSZXNwb25zZUFzeW5jPih1cmwsICdQT1NUJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGNoYW5nZXNldCBzdGF0dXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFuZ2VzZXRJZCBUaGUgY2hhbmdlc2V0IGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxDaGFuZ2VzZXRTdGF0dXNSZXNwb25zZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2hhbmdlc2V0U3RhdHVzKFxuICAgIGNoYW5nZXNldElkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8UFNldENoYW5nZXNldFJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHVybCA9IGBwc2V0cy9jaGFuZ2VzZXQvJHtlbmNvZGVVUklDb21wb25lbnQoY2hhbmdlc2V0SWQpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdDxQU2V0Q2hhbmdlc2V0UmVzcG9uc2U+KHVybCk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgY3JlZGVudGlhbCB0byBzdWJzY3JpYmUgdG8gY2hhbmdlIG5vdGlmaWNhdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxXU1N1YnNjcmlwdGlvblJlc3BvbnNlPj59IFRoZSBkZS1zZXJpYWxpemVkIHNlcnZpY2UgcmVzcG9uc2Ugd2l0aCB0ZW1wb3JhcnkgY3JlZGVudGlhbHMgYW5kIHN1YnNjcmlwdGlvbiBkZXRhaWxzLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3Vic2NyaWJlV1MoKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8V1NTdWJzY3JpcHRpb25SZXNwb25zZT4+IHtcbiAgICBjb25zdCB1cmwgPSAnc3Vic2NyaWJlJztcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdDxXU1N1YnNjcmlwdGlvblJlc3BvbnNlPih1cmwsICdHRVQnKTtcbiAgfVxufVxuIl19