aws-cdk-neuronx-patterns
Version:
> [!WARNING] > This library is experimental module.
353 lines • 71.7 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.VllmEngineArgumentsParser = exports.SchedulingPolicy = exports.PreemptionMode = exports.VllmTask = exports.ToolCallParser = exports.ChatTemplateContentFormat = exports.LoraDtype = exports.Device = exports.TokenizerPoolType = exports.ConfigFormat = exports.TokenizerMode = exports.Quantization = exports.PrefixCachingHashAlgo = exports.KvCacheDtype = exports.BlockSize = exports.DistributedExecutorBackend = exports.ModelImpl = exports.ReasoningParser = exports.GuidedDecodingBackend = exports.GenerationConfig = exports.DataType = exports.LoadFormat = exports.UvicornLogLevel = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
/**
* Log level options for Uvicorn
*/
var UvicornLogLevel;
(function (UvicornLogLevel) {
UvicornLogLevel["DEBUG"] = "debug";
UvicornLogLevel["INFO"] = "info";
UvicornLogLevel["WARNING"] = "warning";
UvicornLogLevel["ERROR"] = "error";
UvicornLogLevel["CRITICAL"] = "critical";
UvicornLogLevel["TRACE"] = "trace";
})(UvicornLogLevel || (exports.UvicornLogLevel = UvicornLogLevel = {}));
/**
* Available model weight loading formats
*/
var LoadFormat;
(function (LoadFormat) {
LoadFormat["AUTO"] = "auto";
LoadFormat["PT"] = "pt";
LoadFormat["SAFETENSORS"] = "safetensors";
LoadFormat["NPCACHE"] = "npcache";
LoadFormat["DUMMY"] = "dummy";
LoadFormat["TENSORIZER"] = "tensorizer";
LoadFormat["SHARDED_STATE"] = "sharded_state";
LoadFormat["GGUF"] = "gguf";
LoadFormat["BITSANDBYTES"] = "bitsandbytes";
LoadFormat["MISTRAL"] = "mistral";
LoadFormat["RUNAI_STREAMER"] = "runai_streamer";
LoadFormat["FASTSAFETENSORS"] = "fastsafetensors";
})(LoadFormat || (exports.LoadFormat = LoadFormat = {}));
/**
* Data types for model weights and activations
*/
var DataType;
(function (DataType) {
/**
* “auto” will use FP16 precision for FP32 and FP16 models, and BF16 precision for BF16 models.
*/
DataType["AUTO"] = "auto";
/**
* “half” for FP16. Recommended for AWQ quantization.
*/
DataType["HALF"] = "half";
/**
* “float16” is the same as “half”.
*/
DataType["FLOAT16"] = "float16";
/**
* “bfloat16” for a balance between precision and range.
*/
DataType["BFLOAT16"] = "bfloat16";
/**
* “float” is shorthand for FP32 precision.
*/
DataType["FLOAT"] = "float";
/**
* “float32” for FP32 precision.
*/
DataType["FLOAT32"] = "float32";
})(DataType || (exports.DataType = DataType = {}));
/**
* The folder path to the generation config.
*/
var GenerationConfig;
(function (GenerationConfig) {
GenerationConfig["AUTO"] = "auto";
GenerationConfig["VLLM"] = "vllm";
})(GenerationConfig || (exports.GenerationConfig = GenerationConfig = {}));
/**
* Available guided decoding backends
*/
var GuidedDecodingBackend;
(function (GuidedDecodingBackend) {
GuidedDecodingBackend["AUTO"] = "auto";
GuidedDecodingBackend["OUTLINES"] = "outlines";
GuidedDecodingBackend["LM_FORMAT_ENFORCER"] = "lm-format-enforcer";
GuidedDecodingBackend["XGRAMMAR"] = "xgrammar";
})(GuidedDecodingBackend || (exports.GuidedDecodingBackend = GuidedDecodingBackend = {}));
/**
* Available reasoning parsers
*/
var ReasoningParser;
(function (ReasoningParser) {
ReasoningParser["DEEPSEEK_R1"] = "deepseek_r1";
ReasoningParser["GRANITE"] = "granite";
})(ReasoningParser || (exports.ReasoningParser = ReasoningParser = {}));
/**
* Model implementation options
*/
var ModelImpl;
(function (ModelImpl) {
/**
* “auto” will try to use the vLLM implementation if it exists and fall back to the Transformers
* implementation if no vLLM implementation is available.
*/
ModelImpl["AUTO"] = "auto";
/**
* “vllm” will use the vLLM model implementation.
*/
ModelImpl["VLLM"] = "vllm";
/**
* “transformers” will use the Transformers model implementation.
*/
ModelImpl["TRANSFORMERS"] = "transformers";
})(ModelImpl || (exports.ModelImpl = ModelImpl = {}));
/**
* Distributed execution backend options
*/
var DistributedExecutorBackend;
(function (DistributedExecutorBackend) {
DistributedExecutorBackend["RAY"] = "ray";
DistributedExecutorBackend["MP"] = "mp";
DistributedExecutorBackend["UNI"] = "uni";
DistributedExecutorBackend["EXTERNAL_LAUNCHER"] = "external_launcher";
})(DistributedExecutorBackend || (exports.DistributedExecutorBackend = DistributedExecutorBackend = {}));
/**
* Cache block size options in number of tokens
*/
var BlockSize;
(function (BlockSize) {
BlockSize[BlockSize["SIZE_8"] = 8] = "SIZE_8";
BlockSize[BlockSize["SIZE_16"] = 16] = "SIZE_16";
BlockSize[BlockSize["SIZE_32"] = 32] = "SIZE_32";
BlockSize[BlockSize["SIZE_64"] = 64] = "SIZE_64";
BlockSize[BlockSize["SIZE_128"] = 128] = "SIZE_128";
})(BlockSize || (exports.BlockSize = BlockSize = {}));
/**
* KV cache data type options
*/
var KvCacheDtype;
(function (KvCacheDtype) {
KvCacheDtype["AUTO"] = "auto";
KvCacheDtype["FP8"] = "fp8";
KvCacheDtype["FP8_E4M3"] = "fp8_e4m3";
KvCacheDtype["FP8_E5M2"] = "fp8_e5m2";
})(KvCacheDtype || (exports.KvCacheDtype = KvCacheDtype = {}));
/**
* Hash algorithm options for prefix caching
*/
var PrefixCachingHashAlgo;
(function (PrefixCachingHashAlgo) {
/**
* “builtin” is Python’s built-in hash.
*/
PrefixCachingHashAlgo["BUILTIN"] = "builtin";
/**
* “sha256” is collision resistant but with certain overheads.
*/
PrefixCachingHashAlgo["SHA256"] = "sha256";
})(PrefixCachingHashAlgo || (exports.PrefixCachingHashAlgo = PrefixCachingHashAlgo = {}));
/**
* Quantization methods
*/
var Quantization;
(function (Quantization) {
Quantization["AQLM"] = "aqlm";
Quantization["AWQ"] = "awq";
Quantization["DEEPSPEEDFP"] = "deepspeedfp";
Quantization["TPU_INT8"] = "tpu_int8";
Quantization["FP8"] = "fp8";
Quantization["PTPC_FP8"] = "ptpc_fp8";
Quantization["FBGEMM_FP8"] = "fbgemm_fp8";
Quantization["MODELOPT"] = "modelopt";
Quantization["NVFP4"] = "nvfp4";
Quantization["MARLIN"] = "marlin";
Quantization["GGUF"] = "gguf";
Quantization["GPTQ_MARLIN_24"] = "gptq_marlin_24";
Quantization["GPTQ_MARLIN"] = "gptq_marlin";
Quantization["AWQ_MARLIN"] = "awq_marlin";
Quantization["GPTQ"] = "gptq";
Quantization["COMPRESSED_TENSORS"] = "compressed-tensors";
Quantization["BITSANDBYTES"] = "bitsandbytes";
Quantization["QQQ"] = "qqq";
Quantization["HQQ"] = "hqq";
Quantization["EXPERTS_INT8"] = "experts_int8";
Quantization["NEURON_QUANT"] = "neuron_quant";
Quantization["IPEX"] = "ipex";
Quantization["QUARK"] = "quark";
Quantization["MOE_WNA16"] = "moe_wna16";
Quantization["TORCHAO"] = "torchao";
Quantization["NONE"] = "None";
})(Quantization || (exports.Quantization = Quantization = {}));
/**
* Tokenizer mode options
*/
var TokenizerMode;
(function (TokenizerMode) {
/**
* “auto” will use the fast tokenizer if available.
*/
TokenizerMode["AUTO"] = "auto";
/**
* “slow” will always use the slow tokenizer.
*/
TokenizerMode["SLOW"] = "slow";
/**
* “mistral” will always use the mistral_common tokenizer.
*/
TokenizerMode["MISTRAL"] = "mistral";
/**
* “custom” will use –tokenizer to select the preregistered tokenizer.
*/
TokenizerMode["CUSTOM"] = "custom";
})(TokenizerMode || (exports.TokenizerMode = TokenizerMode = {}));
/**
* Model config format options
*/
var ConfigFormat;
(function (ConfigFormat) {
/**
* “auto” will try to load the config in hf format if available else it will try to load in mistral format
*/
ConfigFormat["AUTO"] = "auto";
ConfigFormat["HF"] = "hf";
ConfigFormat["MISTRAL"] = "mistral";
})(ConfigFormat || (exports.ConfigFormat = ConfigFormat = {}));
/**
* Tokenizer pool type options
*/
var TokenizerPoolType;
(function (TokenizerPoolType) {
TokenizerPoolType["RAY"] = "ray";
})(TokenizerPoolType || (exports.TokenizerPoolType = TokenizerPoolType = {}));
/**
* Device type options for vLLM execution
*/
var Device;
(function (Device) {
Device["AUTO"] = "auto";
Device["CUDA"] = "cuda";
Device["NEURON"] = "neuron";
Device["CPU"] = "cpu";
Device["TPU"] = "tpu";
Device["XPU"] = "xpu";
Device["HPU"] = "hpu";
})(Device || (exports.Device = Device = {}));
/**
* LoRA data type options
*/
var LoraDtype;
(function (LoraDtype) {
LoraDtype["AUTO"] = "auto";
LoraDtype["FLOAT16"] = "float16";
LoraDtype["BFLOAT16"] = "bfloat16";
})(LoraDtype || (exports.LoraDtype = LoraDtype = {}));
/**
* Format options for rendering message content within a chat template
*/
var ChatTemplateContentFormat;
(function (ChatTemplateContentFormat) {
ChatTemplateContentFormat["AUTO"] = "auto";
ChatTemplateContentFormat["STRING"] = "string";
ChatTemplateContentFormat["OPENAI"] = "openai";
})(ChatTemplateContentFormat || (exports.ChatTemplateContentFormat = ChatTemplateContentFormat = {}));
/**
* Tool call parser options
*/
var ToolCallParser;
(function (ToolCallParser) {
ToolCallParser["GRANITE_20B_FC"] = "granite-20b-fc";
ToolCallParser["GRANITE"] = "granite";
ToolCallParser["HERMES"] = "hermes";
ToolCallParser["INTERNLM"] = "internlm";
ToolCallParser["JAMBA"] = "jamba";
ToolCallParser["LLAMA3_JSON"] = "llama3_json";
ToolCallParser["MISTRAL"] = "mistral";
ToolCallParser["PHI4_MINI_JSON"] = "phi4_mini_json";
ToolCallParser["PYTHONIC"] = "pythonic";
})(ToolCallParser || (exports.ToolCallParser = ToolCallParser = {}));
/**
* Task options for model usage
*/
var VllmTask;
(function (VllmTask) {
VllmTask["AUTO"] = "auto";
VllmTask["GENERATE"] = "generate";
VllmTask["EMBEDDING"] = "embedding";
VllmTask["EMBED"] = "embed";
VllmTask["CLASSIFY"] = "classify";
VllmTask["SCORE"] = "score";
VllmTask["REWARD"] = "reward";
VllmTask["TRANSCRIPTION"] = "transcription";
})(VllmTask || (exports.VllmTask = VllmTask = {}));
/**
* Preemption mode.
*/
var PreemptionMode;
(function (PreemptionMode) {
PreemptionMode["RECOMPUTE"] = "recompute";
PreemptionMode["SWAP"] = "swap";
})(PreemptionMode || (exports.PreemptionMode = PreemptionMode = {}));
/**
* Scheduling policy options
*/
var SchedulingPolicy;
(function (SchedulingPolicy) {
SchedulingPolicy["FCFS"] = "fcfs";
SchedulingPolicy["PRIORITY"] = "priority";
})(SchedulingPolicy || (exports.SchedulingPolicy = SchedulingPolicy = {}));
const jsonValueProperties = [
"allowedOrigins",
"allowedHeaders",
"allowedMethods",
];
const ignoreKeys = ["model", "hfToken"];
class VllmEngineArgumentsParser {
/**
* Convert vLLM engine arguments (camel case) to config (kebab case)
* @param args vLLM engine arguments
* @returns vLLM engine config
* @see https://docs.vllm.ai/en/latest/serving/openai_compatible_server.html#configuration-file
*/
static config(args) {
return Object.entries(args)
.filter(([key]) => !ignoreKeys.includes(key))
.reduce((prev, [key, value]) => {
const k = key.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);
if (jsonValueProperties.includes(key) ||
(!Array.isArray(value) && typeof value === "object")) {
value = JSON.stringify(value);
}
prev[k] = value;
return prev;
}, {});
}
static cli(args) {
const generalArgs = Object.entries(args)
.filter(([key]) => !ignoreKeys.includes(key))
.flatMap(([k, value]) => {
const key = k.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);
if (typeof value === "boolean") {
return value ? [`--${key}`] : [];
}
if (Array.isArray(value)) {
return [`--${key}`, ...value.map((v) => `${v}`)];
}
if (typeof value === "object") {
return [`--${key}`, JSON.stringify(value)];
}
return [`--${key}`, `${value}`];
});
return [args.model, ...generalArgs];
}
}
exports.VllmEngineArgumentsParser = VllmEngineArgumentsParser;
_a = JSII_RTTI_SYMBOL_1;
VllmEngineArgumentsParser[_a] = { fqn: "aws-cdk-neuronx-patterns.VllmEngineArgumentsParser", version: "0.3.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmxsbS1lbmdpbmUtYXJnbWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYmFzZS9zZXJ2ZXItZW5naW5lL3ZsbG0tZW5naW5lL3ZsbG0tZW5naW5lLWFyZ21lbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUE7O0dBRUc7QUFDSCxJQUFZLGVBT1g7QUFQRCxXQUFZLGVBQWU7SUFDekIsa0NBQWUsQ0FBQTtJQUNmLGdDQUFhLENBQUE7SUFDYixzQ0FBbUIsQ0FBQTtJQUNuQixrQ0FBZSxDQUFBO0lBQ2Ysd0NBQXFCLENBQUE7SUFDckIsa0NBQWUsQ0FBQTtBQUNqQixDQUFDLEVBUFcsZUFBZSwrQkFBZixlQUFlLFFBTzFCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFVBYVg7QUFiRCxXQUFZLFVBQVU7SUFDcEIsMkJBQWEsQ0FBQTtJQUNiLHVCQUFTLENBQUE7SUFDVCx5Q0FBMkIsQ0FBQTtJQUMzQixpQ0FBbUIsQ0FBQTtJQUNuQiw2QkFBZSxDQUFBO0lBQ2YsdUNBQXlCLENBQUE7SUFDekIsNkNBQStCLENBQUE7SUFDL0IsMkJBQWEsQ0FBQTtJQUNiLDJDQUE2QixDQUFBO0lBQzdCLGlDQUFtQixDQUFBO0lBQ25CLCtDQUFpQyxDQUFBO0lBQ2pDLGlEQUFtQyxDQUFBO0FBQ3JDLENBQUMsRUFiVyxVQUFVLDBCQUFWLFVBQVUsUUFhckI7QUFFRDs7R0FFRztBQUNILElBQVksUUF5Qlg7QUF6QkQsV0FBWSxRQUFRO0lBQ2xCOztPQUVHO0lBQ0gseUJBQWEsQ0FBQTtJQUNiOztPQUVHO0lBQ0gseUJBQWEsQ0FBQTtJQUNiOztPQUVHO0lBQ0gsK0JBQW1CLENBQUE7SUFDbkI7O09BRUc7SUFDSCxpQ0FBcUIsQ0FBQTtJQUNyQjs7T0FFRztJQUNILDJCQUFlLENBQUE7SUFDZjs7T0FFRztJQUNILCtCQUFtQixDQUFBO0FBQ3JCLENBQUMsRUF6QlcsUUFBUSx3QkFBUixRQUFRLFFBeUJuQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxnQkFHWDtBQUhELFdBQVksZ0JBQWdCO0lBQzFCLGlDQUFhLENBQUE7SUFDYixpQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQUhXLGdCQUFnQixnQ0FBaEIsZ0JBQWdCLFFBRzNCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLHFCQUtYO0FBTEQsV0FBWSxxQkFBcUI7SUFDL0Isc0NBQWEsQ0FBQTtJQUNiLDhDQUFxQixDQUFBO0lBQ3JCLGtFQUF5QyxDQUFBO0lBQ3pDLDhDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFMVyxxQkFBcUIscUNBQXJCLHFCQUFxQixRQUtoQztBQUVEOztHQUVHO0FBQ0gsSUFBWSxlQUdYO0FBSEQsV0FBWSxlQUFlO0lBQ3pCLDhDQUEyQixDQUFBO0lBQzNCLHNDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxlQUFlLCtCQUFmLGVBQWUsUUFHMUI7QUFFRDs7R0FFRztBQUNILElBQVksU0FjWDtBQWRELFdBQVksU0FBUztJQUNuQjs7O09BR0c7SUFDSCwwQkFBYSxDQUFBO0lBQ2I7O09BRUc7SUFDSCwwQkFBYSxDQUFBO0lBQ2I7O09BRUc7SUFDSCwwQ0FBNkIsQ0FBQTtBQUMvQixDQUFDLEVBZFcsU0FBUyx5QkFBVCxTQUFTLFFBY3BCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLDBCQUtYO0FBTEQsV0FBWSwwQkFBMEI7SUFDcEMseUNBQVcsQ0FBQTtJQUNYLHVDQUFTLENBQUE7SUFDVCx5Q0FBVyxDQUFBO0lBQ1gscUVBQXVDLENBQUE7QUFDekMsQ0FBQyxFQUxXLDBCQUEwQiwwQ0FBMUIsMEJBQTBCLFFBS3JDO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFNBTVg7QUFORCxXQUFZLFNBQVM7SUFDbkIsNkNBQVUsQ0FBQTtJQUNWLGdEQUFZLENBQUE7SUFDWixnREFBWSxDQUFBO0lBQ1osZ0RBQVksQ0FBQTtJQUNaLG1EQUFjLENBQUE7QUFDaEIsQ0FBQyxFQU5XLFNBQVMseUJBQVQsU0FBUyxRQU1wQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxZQUtYO0FBTEQsV0FBWSxZQUFZO0lBQ3RCLDZCQUFhLENBQUE7SUFDYiwyQkFBVyxDQUFBO0lBQ1gscUNBQXFCLENBQUE7SUFDckIscUNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQUxXLFlBQVksNEJBQVosWUFBWSxRQUt2QjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxxQkFTWDtBQVRELFdBQVkscUJBQXFCO0lBQy9COztPQUVHO0lBQ0gsNENBQW1CLENBQUE7SUFDbkI7O09BRUc7SUFDSCwwQ0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBVFcscUJBQXFCLHFDQUFyQixxQkFBcUIsUUFTaEM7QUFFRDs7R0FFRztBQUNILElBQVksWUEyQlg7QUEzQkQsV0FBWSxZQUFZO0lBQ3RCLDZCQUFhLENBQUE7SUFDYiwyQkFBVyxDQUFBO0lBQ1gsMkNBQTJCLENBQUE7SUFDM0IscUNBQXFCLENBQUE7SUFDckIsMkJBQVcsQ0FBQTtJQUNYLHFDQUFxQixDQUFBO0lBQ3JCLHlDQUF5QixDQUFBO0lBQ3pCLHFDQUFxQixDQUFBO0lBQ3JCLCtCQUFlLENBQUE7SUFDZixpQ0FBaUIsQ0FBQTtJQUNqQiw2QkFBYSxDQUFBO0lBQ2IsaURBQWlDLENBQUE7SUFDakMsMkNBQTJCLENBQUE7SUFDM0IseUNBQXlCLENBQUE7SUFDekIsNkJBQWEsQ0FBQTtJQUNiLHlEQUF5QyxDQUFBO0lBQ3pDLDZDQUE2QixDQUFBO0lBQzdCLDJCQUFXLENBQUE7SUFDWCwyQkFBVyxDQUFBO0lBQ1gsNkNBQTZCLENBQUE7SUFDN0IsNkNBQTZCLENBQUE7SUFDN0IsNkJBQWEsQ0FBQTtJQUNiLCtCQUFlLENBQUE7SUFDZix1Q0FBdUIsQ0FBQTtJQUN2QixtQ0FBbUIsQ0FBQTtJQUNuQiw2QkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQTNCVyxZQUFZLDRCQUFaLFlBQVksUUEyQnZCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLGFBaUJYO0FBakJELFdBQVksYUFBYTtJQUN2Qjs7T0FFRztJQUNILDhCQUFhLENBQUE7SUFDYjs7T0FFRztJQUNILDhCQUFhLENBQUE7SUFDYjs7T0FFRztJQUNILG9DQUFtQixDQUFBO0lBQ25COztPQUVHO0lBQ0gsa0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQWpCVyxhQUFhLDZCQUFiLGFBQWEsUUFpQnhCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFlBT1g7QUFQRCxXQUFZLFlBQVk7SUFDdEI7O09BRUc7SUFDSCw2QkFBYSxDQUFBO0lBQ2IseUJBQVMsQ0FBQTtJQUNULG1DQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFQVyxZQUFZLDRCQUFaLFlBQVksUUFPdkI7QUFFRDs7R0FFRztBQUNILElBQVksaUJBRVg7QUFGRCxXQUFZLGlCQUFpQjtJQUMzQixnQ0FBVyxDQUFBO0FBQ2IsQ0FBQyxFQUZXLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBRTVCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLE1BUVg7QUFSRCxXQUFZLE1BQU07SUFDaEIsdUJBQWEsQ0FBQTtJQUNiLHVCQUFhLENBQUE7SUFDYiwyQkFBaUIsQ0FBQTtJQUNqQixxQkFBVyxDQUFBO0lBQ1gscUJBQVcsQ0FBQTtJQUNYLHFCQUFXLENBQUE7SUFDWCxxQkFBVyxDQUFBO0FBQ2IsQ0FBQyxFQVJXLE1BQU0sc0JBQU4sTUFBTSxRQVFqQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxTQUlYO0FBSkQsV0FBWSxTQUFTO0lBQ25CLDBCQUFhLENBQUE7SUFDYixnQ0FBbUIsQ0FBQTtJQUNuQixrQ0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBSlcsU0FBUyx5QkFBVCxTQUFTLFFBSXBCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLHlCQUlYO0FBSkQsV0FBWSx5QkFBeUI7SUFDbkMsMENBQWEsQ0FBQTtJQUNiLDhDQUFpQixDQUFBO0lBQ2pCLDhDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFKVyx5QkFBeUIseUNBQXpCLHlCQUF5QixRQUlwQztBQUVEOztHQUVHO0FBQ0gsSUFBWSxjQVVYO0FBVkQsV0FBWSxjQUFjO0lBQ3hCLG1EQUFpQyxDQUFBO0lBQ2pDLHFDQUFtQixDQUFBO0lBQ25CLG1DQUFpQixDQUFBO0lBQ2pCLHVDQUFxQixDQUFBO0lBQ3JCLGlDQUFlLENBQUE7SUFDZiw2Q0FBMkIsQ0FBQTtJQUMzQixxQ0FBbUIsQ0FBQTtJQUNuQixtREFBaUMsQ0FBQTtJQUNqQyx1Q0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBVlcsY0FBYyw4QkFBZCxjQUFjLFFBVXpCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFFBU1g7QUFURCxXQUFZLFFBQVE7SUFDbEIseUJBQWEsQ0FBQTtJQUNiLGlDQUFxQixDQUFBO0lBQ3JCLG1DQUF1QixDQUFBO0lBQ3ZCLDJCQUFlLENBQUE7SUFDZixpQ0FBcUIsQ0FBQTtJQUNyQiwyQkFBZSxDQUFBO0lBQ2YsNkJBQWlCLENBQUE7SUFDakIsMkNBQStCLENBQUE7QUFDakMsQ0FBQyxFQVRXLFFBQVEsd0JBQVIsUUFBUSxRQVNuQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxjQUdYO0FBSEQsV0FBWSxjQUFjO0lBQ3hCLHlDQUF1QixDQUFBO0lBQ3ZCLCtCQUFhLENBQUE7QUFDZixDQUFDLEVBSFcsY0FBYyw4QkFBZCxjQUFjLFFBR3pCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLGdCQUdYO0FBSEQsV0FBWSxnQkFBZ0I7SUFDMUIsaUNBQWEsQ0FBQTtJQUNiLHlDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQUczQjtBQW03QkQsTUFBTSxtQkFBbUIsR0FBa0M7SUFDekQsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixnQkFBZ0I7Q0FDakIsQ0FBQztBQUNGLE1BQU0sVUFBVSxHQUFrQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUV2RSxNQUFzQix5QkFBeUI7SUFDN0M7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQXlCO1FBQ3JDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7YUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQWdDLENBQUMsQ0FBQzthQUN6RSxNQUFNLENBQTJCLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDdkQsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0RSxJQUNFLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxHQUFnQyxDQUFDO2dCQUM5RCxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsRUFDcEQsQ0FBQztnQkFDRCxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQXlCO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQ3JDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFnQyxDQUFDLENBQUM7YUFDekUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUN0QixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25DLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxDQUFDLEtBQUssR0FBRyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxDQUFDLEtBQUssR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxPQUFPLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7O0FBdkNILDhEQXdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYmF0Y2hcIjtcblxuLyoqXG4gKiBMb2cgbGV2ZWwgb3B0aW9ucyBmb3IgVXZpY29yblxuICovXG5leHBvcnQgZW51bSBVdmljb3JuTG9nTGV2ZWwge1xuICBERUJVRyA9IFwiZGVidWdcIixcbiAgSU5GTyA9IFwiaW5mb1wiLFxuICBXQVJOSU5HID0gXCJ3YXJuaW5nXCIsXG4gIEVSUk9SID0gXCJlcnJvclwiLFxuICBDUklUSUNBTCA9IFwiY3JpdGljYWxcIixcbiAgVFJBQ0UgPSBcInRyYWNlXCIsXG59XG5cbi8qKlxuICogQXZhaWxhYmxlIG1vZGVsIHdlaWdodCBsb2FkaW5nIGZvcm1hdHNcbiAqL1xuZXhwb3J0IGVudW0gTG9hZEZvcm1hdCB7XG4gIEFVVE8gPSBcImF1dG9cIixcbiAgUFQgPSBcInB0XCIsXG4gIFNBRkVURU5TT1JTID0gXCJzYWZldGVuc29yc1wiLFxuICBOUENBQ0hFID0gXCJucGNhY2hlXCIsXG4gIERVTU1ZID0gXCJkdW1teVwiLFxuICBURU5TT1JJWkVSID0gXCJ0ZW5zb3JpemVyXCIsXG4gIFNIQVJERURfU1RBVEUgPSBcInNoYXJkZWRfc3RhdGVcIixcbiAgR0dVRiA9IFwiZ2d1ZlwiLFxuICBCSVRTQU5EQllURVMgPSBcImJpdHNhbmRieXRlc1wiLFxuICBNSVNUUkFMID0gXCJtaXN0cmFsXCIsXG4gIFJVTkFJX1NUUkVBTUVSID0gXCJydW5haV9zdHJlYW1lclwiLFxuICBGQVNUU0FGRVRFTlNPUlMgPSBcImZhc3RzYWZldGVuc29yc1wiLFxufVxuXG4vKipcbiAqIERhdGEgdHlwZXMgZm9yIG1vZGVsIHdlaWdodHMgYW5kIGFjdGl2YXRpb25zXG4gKi9cbmV4cG9ydCBlbnVtIERhdGFUeXBlIHtcbiAgLyoqXG4gICAqIOKAnGF1dG/igJ0gd2lsbCB1c2UgRlAxNiBwcmVjaXNpb24gZm9yIEZQMzIgYW5kIEZQMTYgbW9kZWxzLCBhbmQgQkYxNiBwcmVjaXNpb24gZm9yIEJGMTYgbW9kZWxzLlxuICAgKi9cbiAgQVVUTyA9IFwiYXV0b1wiLFxuICAvKipcbiAgICog4oCcaGFsZuKAnSBmb3IgRlAxNi4gUmVjb21tZW5kZWQgZm9yIEFXUSBxdWFudGl6YXRpb24uXG4gICAqL1xuICBIQUxGID0gXCJoYWxmXCIsXG4gIC8qKlxuICAgKiDigJxmbG9hdDE24oCdIGlzIHRoZSBzYW1lIGFzIOKAnGhhbGbigJ0uXG4gICAqL1xuICBGTE9BVDE2ID0gXCJmbG9hdDE2XCIsXG4gIC8qKlxuICAgKiDigJxiZmxvYXQxNuKAnSBmb3IgYSBiYWxhbmNlIGJldHdlZW4gcHJlY2lzaW9uIGFuZCByYW5nZS5cbiAgICovXG4gIEJGTE9BVDE2ID0gXCJiZmxvYXQxNlwiLFxuICAvKipcbiAgICog4oCcZmxvYXTigJ0gaXMgc2hvcnRoYW5kIGZvciBGUDMyIHByZWNpc2lvbi5cbiAgICovXG4gIEZMT0FUID0gXCJmbG9hdFwiLFxuICAvKipcbiAgICog4oCcZmxvYXQzMuKAnSBmb3IgRlAzMiBwcmVjaXNpb24uXG4gICAqL1xuICBGTE9BVDMyID0gXCJmbG9hdDMyXCIsXG59XG5cbi8qKlxuICogVGhlIGZvbGRlciBwYXRoIHRvIHRoZSBnZW5lcmF0aW9uIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGVudW0gR2VuZXJhdGlvbkNvbmZpZyB7XG4gIEFVVE8gPSBcImF1dG9cIixcbiAgVkxMTSA9IFwidmxsbVwiLFxufVxuXG4vKipcbiAqIEF2YWlsYWJsZSBndWlkZWQgZGVjb2RpbmcgYmFja2VuZHNcbiAqL1xuZXhwb3J0IGVudW0gR3VpZGVkRGVjb2RpbmdCYWNrZW5kIHtcbiAgQVVUTyA9IFwiYXV0b1wiLFxuICBPVVRMSU5FUyA9IFwib3V0bGluZXNcIixcbiAgTE1fRk9STUFUX0VORk9SQ0VSID0gXCJsbS1mb3JtYXQtZW5mb3JjZXJcIixcbiAgWEdSQU1NQVIgPSBcInhncmFtbWFyXCIsXG59XG5cbi8qKlxuICogQXZhaWxhYmxlIHJlYXNvbmluZyBwYXJzZXJzXG4gKi9cbmV4cG9ydCBlbnVtIFJlYXNvbmluZ1BhcnNlciB7XG4gIERFRVBTRUVLX1IxID0gXCJkZWVwc2Vla19yMVwiLFxuICBHUkFOSVRFID0gXCJncmFuaXRlXCIsXG59XG5cbi8qKlxuICogTW9kZWwgaW1wbGVtZW50YXRpb24gb3B0aW9uc1xuICovXG5leHBvcnQgZW51bSBNb2RlbEltcGwge1xuICAvKipcbiAgICog4oCcYXV0b+KAnSB3aWxsIHRyeSB0byB1c2UgdGhlIHZMTE0gaW1wbGVtZW50YXRpb24gaWYgaXQgZXhpc3RzIGFuZCBmYWxsIGJhY2sgdG8gdGhlIFRyYW5zZm9ybWVyc1xuICAgKiBpbXBsZW1lbnRhdGlvbiBpZiBubyB2TExNIGltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIEFVVE8gPSBcImF1dG9cIixcbiAgLyoqXG4gICAqIOKAnHZsbG3igJ0gd2lsbCB1c2UgdGhlIHZMTE0gbW9kZWwgaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICBWTExNID0gXCJ2bGxtXCIsXG4gIC8qKlxuICAgKiDigJx0cmFuc2Zvcm1lcnPigJ0gd2lsbCB1c2UgdGhlIFRyYW5zZm9ybWVycyBtb2RlbCBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIFRSQU5TRk9STUVSUyA9IFwidHJhbnNmb3JtZXJzXCIsXG59XG5cbi8qKlxuICogRGlzdHJpYnV0ZWQgZXhlY3V0aW9uIGJhY2tlbmQgb3B0aW9uc1xuICovXG5leHBvcnQgZW51bSBEaXN0cmlidXRlZEV4ZWN1dG9yQmFja2VuZCB7XG4gIFJBWSA9IFwicmF5XCIsXG4gIE1QID0gXCJtcFwiLFxuICBVTkkgPSBcInVuaVwiLFxuICBFWFRFUk5BTF9MQVVOQ0hFUiA9IFwiZXh0ZXJuYWxfbGF1bmNoZXJcIixcbn1cblxuLyoqXG4gKiBDYWNoZSBibG9jayBzaXplIG9wdGlvbnMgaW4gbnVtYmVyIG9mIHRva2Vuc1xuICovXG5leHBvcnQgZW51bSBCbG9ja1NpemUge1xuICBTSVpFXzggPSA4LFxuICBTSVpFXzE2ID0gMTYsXG4gIFNJWkVfMzIgPSAzMixcbiAgU0laRV82NCA9IDY0LFxuICBTSVpFXzEyOCA9IDEyOCxcbn1cblxuLyoqXG4gKiBLViBjYWNoZSBkYXRhIHR5cGUgb3B0aW9uc1xuICovXG5leHBvcnQgZW51bSBLdkNhY2hlRHR5cGUge1xuICBBVVRPID0gXCJhdXRvXCIsXG4gIEZQOCA9IFwiZnA4XCIsXG4gIEZQOF9FNE0zID0gXCJmcDhfZTRtM1wiLFxuICBGUDhfRTVNMiA9IFwiZnA4X2U1bTJcIixcbn1cblxuLyoqXG4gKiBIYXNoIGFsZ29yaXRobSBvcHRpb25zIGZvciBwcmVmaXggY2FjaGluZ1xuICovXG5leHBvcnQgZW51bSBQcmVmaXhDYWNoaW5nSGFzaEFsZ28ge1xuICAvKipcbiAgICog4oCcYnVpbHRpbuKAnSBpcyBQeXRob27igJlzIGJ1aWx0LWluIGhhc2guXG4gICAqL1xuICBCVUlMVElOID0gXCJidWlsdGluXCIsXG4gIC8qKlxuICAgKiDigJxzaGEyNTbigJ0gaXMgY29sbGlzaW9uIHJlc2lzdGFudCBidXQgd2l0aCBjZXJ0YWluIG92ZXJoZWFkcy5cbiAgICovXG4gIFNIQTI1NiA9IFwic2hhMjU2XCIsXG59XG5cbi8qKlxuICogUXVhbnRpemF0aW9uIG1ldGhvZHNcbiAqL1xuZXhwb3J0IGVudW0gUXVhbnRpemF0aW9uIHtcbiAgQVFMTSA9IFwiYXFsbVwiLFxuICBBV1EgPSBcImF3cVwiLFxuICBERUVQU1BFRURGUCA9IFwiZGVlcHNwZWVkZnBcIixcbiAgVFBVX0lOVDggPSBcInRwdV9pbnQ4XCIsXG4gIEZQOCA9IFwiZnA4XCIsXG4gIFBUUENfRlA4ID0gXCJwdHBjX2ZwOFwiLFxuICBGQkdFTU1fRlA4ID0gXCJmYmdlbW1fZnA4XCIsXG4gIE1PREVMT1BUID0gXCJtb2RlbG9wdFwiLFxuICBOVkZQNCA9IFwibnZmcDRcIixcbiAgTUFSTElOID0gXCJtYXJsaW5cIixcbiAgR0dVRiA9IFwiZ2d1ZlwiLFxuICBHUFRRX01BUkxJTl8yNCA9IFwiZ3B0cV9tYXJsaW5fMjRcIixcbiAgR1BUUV9NQVJMSU4gPSBcImdwdHFfbWFybGluXCIsXG4gIEFXUV9NQVJMSU4gPSBcImF3cV9tYXJsaW5cIixcbiAgR1BUUSA9IFwiZ3B0cVwiLFxuICBDT01QUkVTU0VEX1RFTlNPUlMgPSBcImNvbXByZXNzZWQtdGVuc29yc1wiLFxuICBCSVRTQU5EQllURVMgPSBcImJpdHNhbmRieXRlc1wiLFxuICBRUVEgPSBcInFxcVwiLFxuICBIUVEgPSBcImhxcVwiLFxuICBFWFBFUlRTX0lOVDggPSBcImV4cGVydHNfaW50OFwiLFxuICBORVVST05fUVVBTlQgPSBcIm5ldXJvbl9xdWFudFwiLFxuICBJUEVYID0gXCJpcGV4XCIsXG4gIFFVQVJLID0gXCJxdWFya1wiLFxuICBNT0VfV05BMTYgPSBcIm1vZV93bmExNlwiLFxuICBUT1JDSEFPID0gXCJ0b3JjaGFvXCIsXG4gIE5PTkUgPSBcIk5vbmVcIixcbn1cblxuLyoqXG4gKiBUb2tlbml6ZXIgbW9kZSBvcHRpb25zXG4gKi9cbmV4cG9ydCBlbnVtIFRva2VuaXplck1vZGUge1xuICAvKipcbiAgICog4oCcYXV0b+KAnSB3aWxsIHVzZSB0aGUgZmFzdCB0b2tlbml6ZXIgaWYgYXZhaWxhYmxlLlxuICAgKi9cbiAgQVVUTyA9IFwiYXV0b1wiLFxuICAvKipcbiAgICog4oCcc2xvd+KAnSB3aWxsIGFsd2F5cyB1c2UgdGhlIHNsb3cgdG9rZW5pemVyLlxuICAgKi9cbiAgU0xPVyA9IFwic2xvd1wiLFxuICAvKipcbiAgICog4oCcbWlzdHJhbOKAnSB3aWxsIGFsd2F5cyB1c2UgdGhlIG1pc3RyYWxfY29tbW9uIHRva2VuaXplci5cbiAgICovXG4gIE1JU1RSQUwgPSBcIm1pc3RyYWxcIixcbiAgLyoqXG4gICAqIOKAnGN1c3RvbeKAnSB3aWxsIHVzZSDigJN0b2tlbml6ZXIgdG8gc2VsZWN0IHRoZSBwcmVyZWdpc3RlcmVkIHRva2VuaXplci5cbiAgICovXG4gIENVU1RPTSA9IFwiY3VzdG9tXCIsXG59XG5cbi8qKlxuICogTW9kZWwgY29uZmlnIGZvcm1hdCBvcHRpb25zXG4gKi9cbmV4cG9ydCBlbnVtIENvbmZpZ0Zvcm1hdCB7XG4gIC8qKlxuICAgKiDigJxhdXRv4oCdIHdpbGwgdHJ5IHRvIGxvYWQgdGhlIGNvbmZpZyBpbiBoZiBmb3JtYXQgaWYgYXZhaWxhYmxlIGVsc2UgaXQgd2lsbCB0cnkgdG8gbG9hZCBpbiBtaXN0cmFsIGZvcm1hdFxuICAgKi9cbiAgQVVUTyA9IFwiYXV0b1wiLFxuICBIRiA9IFwiaGZcIixcbiAgTUlTVFJBTCA9IFwibWlzdHJhbFwiLFxufVxuXG4vKipcbiAqIFRva2VuaXplciBwb29sIHR5cGUgb3B0aW9uc1xuICovXG5leHBvcnQgZW51bSBUb2tlbml6ZXJQb29sVHlwZSB7XG4gIFJBWSA9IFwicmF5XCIsXG59XG5cbi8qKlxuICogRGV2aWNlIHR5cGUgb3B0aW9ucyBmb3IgdkxMTSBleGVjdXRpb25cbiAqL1xuZXhwb3J0IGVudW0gRGV2aWNlIHtcbiAgQVVUTyA9IFwiYXV0b1wiLFxuICBDVURBID0gXCJjdWRhXCIsXG4gIE5FVVJPTiA9IFwibmV1cm9uXCIsXG4gIENQVSA9IFwiY3B1XCIsXG4gIFRQVSA9IFwidHB1XCIsXG4gIFhQVSA9IFwieHB1XCIsXG4gIEhQVSA9IFwiaHB1XCIsXG59XG5cbi8qKlxuICogTG9SQSBkYXRhIHR5cGUgb3B0aW9uc1xuICovXG5leHBvcnQgZW51bSBMb3JhRHR5cGUge1xuICBBVVRPID0gXCJhdXRvXCIsXG4gIEZMT0FUMTYgPSBcImZsb2F0MTZcIixcbiAgQkZMT0FUMTYgPSBcImJmbG9hdDE2XCIsXG59XG5cbi8qKlxuICogRm9ybWF0IG9wdGlvbnMgZm9yIHJlbmRlcmluZyBtZXNzYWdlIGNvbnRlbnQgd2l0aGluIGEgY2hhdCB0ZW1wbGF0ZVxuICovXG5leHBvcnQgZW51bSBDaGF0VGVtcGxhdGVDb250ZW50Rm9ybWF0IHtcbiAgQVVUTyA9IFwiYXV0b1wiLFxuICBTVFJJTkcgPSBcInN0cmluZ1wiLFxuICBPUEVOQUkgPSBcIm9wZW5haVwiLFxufVxuXG4vKipcbiAqIFRvb2wgY2FsbCBwYXJzZXIgb3B0aW9uc1xuICovXG5leHBvcnQgZW51bSBUb29sQ2FsbFBhcnNlciB7XG4gIEdSQU5JVEVfMjBCX0ZDID0gXCJncmFuaXRlLTIwYi1mY1wiLFxuICBHUkFOSVRFID0gXCJncmFuaXRlXCIsXG4gIEhFUk1FUyA9IFwiaGVybWVzXCIsXG4gIElOVEVSTkxNID0gXCJpbnRlcm5sbVwiLFxuICBKQU1CQSA9IFwiamFtYmFcIixcbiAgTExBTUEzX0pTT04gPSBcImxsYW1hM19qc29uXCIsXG4gIE1JU1RSQUwgPSBcIm1pc3RyYWxcIixcbiAgUEhJNF9NSU5JX0pTT04gPSBcInBoaTRfbWluaV9qc29uXCIsXG4gIFBZVEhPTklDID0gXCJweXRob25pY1wiLFxufVxuXG4vKipcbiAqIFRhc2sgb3B0aW9ucyBmb3IgbW9kZWwgdXNhZ2VcbiAqL1xuZXhwb3J0IGVudW0gVmxsbVRhc2sge1xuICBBVVRPID0gXCJhdXRvXCIsXG4gIEdFTkVSQVRFID0gXCJnZW5lcmF0ZVwiLFxuICBFTUJFRERJTkcgPSBcImVtYmVkZGluZ1wiLFxuICBFTUJFRCA9IFwiZW1iZWRcIixcbiAgQ0xBU1NJRlkgPSBcImNsYXNzaWZ5XCIsXG4gIFNDT1JFID0gXCJzY29yZVwiLFxuICBSRVdBUkQgPSBcInJld2FyZFwiLFxuICBUUkFOU0NSSVBUSU9OID0gXCJ0cmFuc2NyaXB0aW9uXCIsXG59XG5cbi8qKlxuICogUHJlZW1wdGlvbiBtb2RlLlxuICovXG5leHBvcnQgZW51bSBQcmVlbXB0aW9uTW9kZSB7XG4gIFJFQ09NUFVURSA9IFwicmVjb21wdXRlXCIsXG4gIFNXQVAgPSBcInN3YXBcIixcbn1cblxuLyoqXG4gKiBTY2hlZHVsaW5nIHBvbGljeSBvcHRpb25zXG4gKi9cbmV4cG9ydCBlbnVtIFNjaGVkdWxpbmdQb2xpY3kge1xuICBGQ0ZTID0gXCJmY2ZzXCIsXG4gIFBSSU9SSVRZID0gXCJwcmlvcml0eVwiLFxufVxuXG4vKipcbiAqIFZsbG1OYW1lZEFyZ3VtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZsbG1OYW1lZEFyZ3VtZW50cyB7XG4gIC8qKlxuICAgKiBIb3N0IG5hbWUuXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQb3J0IG51bWJlci5cbiAgICogQGRlZmF1bHQgODAwMFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogTG9nIGxldmVsIGZvciB1dmljb3JuLlxuICAgKiBAZGVmYXVsdCBVdmljb3JuTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgdXZpY29ybkxvZ0xldmVsPzogVXZpY29ybkxvZ0xldmVsO1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHV2aWNvcm4gYWNjZXNzIGxvZy5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRpc2FibGVVdmljb3JuQWNjZXNzTG9nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWxsb3cgY3JlZGVudGlhbHMuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhbGxvd0NyZWRlbnRpYWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWxsb3dlZCBvcmlnaW5zLlxuICAgKiBAZGVmYXVsdCBbJyonXVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZE9yaWdpbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQWxsb3dlZCBtZXRob2RzLlxuICAgKiBAZGVmYXVsdCBbJyonXVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZE1ldGhvZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQWxsb3dlZCBoZWFkZXJzLlxuICAgKiBAZGVmYXVsdCBbJyonXVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZEhlYWRlcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIHRoZSBzZXJ2ZXIgd2lsbCByZXF1aXJlIHRoaXMga2V5IHRvIGJlIHByZXNlbnRlZCBpbiB0aGUgaGVhZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpS2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMb1JBIG1vZHVsZSBjb25maWd1cmF0aW9ucy5cbiAgICogQGV4YW1wbGUge1wibmFtZVwiOiBcIm5hbWVcIiwgXCJwYXRoXCI6IFwibG9yYV9wYXRoXCIsIFwiYmFzZV9tb2RlbF9uYW1lXCI6IFwiaWRcIn1cbiAgICovXG4gIHJlYWRvbmx5IGxvcmFNb2R1bGVzPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuICAvKipcbiAgICogUHJvbXB0IGFkYXB0ZXIgY29uZmlndXJhdGlvbnMgaW4gdGhlIGZvcm1hdCBuYW1lPXBhdGguIE11bHRpcGxlIGFkYXB0ZXJzIGNhbiBiZSBzcGVjaWZpZWQuXG4gICAqL1xuICByZWFkb25seSBwcm9tcHRBZGFwdGVycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSBwYXRoIHRvIHRoZSBjaGF0IHRlbXBsYXRlLCBvciB0aGUgdGVtcGxhdGUgaW4gc2luZ2xlLWxpbmUgZm9ybSBmb3IgdGhlIHNwZWNpZmllZCBtb2RlbC5cbiAgICovXG4gIHJlYWRvbmx5IGNoYXRUZW1wbGF0ZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCB0byByZW5kZXIgbWVzc2FnZSBjb250ZW50IHdpdGhpbiBhIGNoYXQgdGVtcGxhdGUuXG4gICAqIC0g4oCcc3RyaW5n4oCdIHdpbGwgcmVuZGVyIHRoZSBjb250ZW50IGFzIGEgc3RyaW5nLlxuICAgKiAgIC0gRXhhbXBsZTogYFwiSGVsbG8gV29ybGRcImBcbiAgICogLSDigJxvcGVuYWnigJ0gd2lsbCByZW5kZXIgdGhlIGNvbnRlbnQgYXMgYSBsaXN0IG9mIGRpY3Rpb25hcmllcywgc2ltaWxhciB0byBPcGVuQUkgc2NoZW1hLlxuICAgKiAgIC0gRXhhbXBsZTogYFt7XCJ0eXBlXCI6IFwidGV4dFwiLCBcInRleHRcIjogXCJIZWxsbyB3b3JsZCFcIn1dYFxuICAgKiBAZGVmYXVsdCBDaGF0VGVtcGxhdGVDb250ZW50Rm9ybWF0LkFVVE9cbiAgICovXG4gIHJlYWRvbmx5IGNoYXRUZW1wbGF0ZUNvbnRlbnRGb3JtYXQ/OiBDaGF0VGVtcGxhdGVDb250ZW50Rm9ybWF0O1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBuYW1lIHRvIHJldHVybiBpZiBgcmVxdWVzdC5hZGRfZ2VuZXJhdGlvbl9wcm9tcHQ9dHJ1ZWAuXG4gICAqIEBkZWZhdWx0IFwiYXNzaXN0YW50XCJcbiAgICovXG4gIHJlYWRvbmx5IHJlc3BvbnNlUm9sZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZpbGUgcGF0aCB0byB0aGUgU1NMIGtleSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3NsS2V5ZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZpbGUgcGF0aCB0byB0aGUgU1NMIGNlcnQgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHNzbENlcnRmaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ0EgY2VydGlmaWNhdGVzIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBzc2xDYUNlcnRzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWZyZXNoIFNTTCBDb250ZXh0IHdoZW4gU1NMIGNlcnRpZmljYXRlIGZpbGVzIGNoYW5nZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVNzbFJlZnJlc2g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNsaWVudCBjZXJ0aWZpY2F0ZSBpcyByZXF1aXJlZCAoc2VlIHN0ZGxpYiBzc2wgbW9kdWxlJ3MpLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICByZWFkb25seSBzc2xDZXJ0UmVxcz86IG51bWJlcjtcblxuICAvKipcbiAgICogRmFzdEFQSSByb290X3BhdGggd2hlbiBhcHAgaXMgYmVoaW5kIGEgcGF0aCBiYXNlZCByb3V0aW5nIHByb3h5LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdFBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgQVNHSSBtaWRkbGV3YXJlIHRvIGFwcGx5IHRvIHRoZSBhcHAuXG4gICAqIFdlIGFjY2VwdCBtdWx0aXBsZSDigJNtaWRkbGV3YXJlIGFyZ3VtZW50cy4gVGhlIHZhbHVlIHNob3VsZCBiZSBhbiBpbXBvcnQgcGF0aC5cbiAgICogSWYgYSBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdkxMTSB3aWxsIGFkZCBpdCB0byB0aGUgc2VydmVyIHVzaW5nIGBAYXBwLm1pZGRsZXdhcmUoJ2h0dHAnKWAuXG4gICAqIElmIGEgY2xhc3MgaXMgcHJvdmlkZWQsIHZMTE0gd2lsbCBhZGQgaXQgdG8gdGhlIHNlcnZlciB1c2luZyBgYXBwLmFkZF9taWRkbGV3YXJlKClgLlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgcmVhZG9ubHkgbWlkZGxld2FyZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGVuIGAtLW1heC1sb2dwcm9ic2AgaXMgc3BlY2lmaWVkLFxuICAgKiByZXByZXNlbnRzIHNpbmdsZSB0b2tlbnMgYXMgc3RyaW5ncyBvZiB0aGUgZm9ybSAndG9rZW5faWQ6e3Rva2VuX2lkfScgc28gdGhhdCB0b2tlbnMgdGhhdCBhcmUgbm90IEpTT04tZW5jb2RhYmxlIGNhbiBiZSBpZGVudGlmaWVkLi5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJldHVyblRva2Vuc0FzVG9rZW5JZHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBzcGVjaWZpZWQsIHdpbGwgcnVuIHRoZSBPcGVuQUkgZnJvbnRlbmQgc2VydmVyIGluIHRoZSBzYW1lIHByb2Nlc3MgYXMgdGhlIG1vZGVsIHNlcnZpbmcgZW5naW5lLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZUZyb250ZW5kTXVsdGlwcm9jZXNzaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgc3BlY2lmaWVkLCBBUEkgc2VydmVyIHdpbGwgYWRkIFgtUmVxdWVzdC1JZCBoZWFkZXIgdG8gcmVzcG9uc2VzLlxuICAgKlxuICAgKiBDYXV0aW9uOiB0aGlzIGh1cnRzIHBlcmZvcm1hbmNlIGF0IGhpZ2ggUVBTLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlUmVxdWVzdElkSGVhZGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBhdXRvIHRvb2wgY2hvaWNlIGZvciBzdXBwb3J0ZWQgbW9kZWxzLlxuICAgKiBVc2UgYC0tdG9vbC1jYWxsLXBhcnNlcmAgdG8gc3BlY2lmeSB3aGljaCBwYXJzZXIgdG8gdXNlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlQXV0b1Rvb2xDaG9pY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIHRvb2wgY2FsbCBwYXJzZXIgZGVwZW5kaW5nIG9uIHRoZSBtb2RlbCB0aGF0IHlvdeKAmXJlIHVzaW5nLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gcGFyc2UgdGhlIG1vZGVsLWdlbmVyYXRlZCB0b29sIGNhbGwgaW50byBPcGVuQUkgQVBJIGZvcm1hdC5cbiAgICpcbiAgICogUmVxdWlyZWQgZm9yIGAtLWVuYWJsZS1hdXRvLXRvb2wtY2hvaWNlYC5cbiAgICovXG4gIHJlYWRvbmx5IHRvb2xDYWxsUGFyc2VyPzogVG9vbENhbGxQYXJzZXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHRvb2wgcGFyc2VyIHBsdWdpbi5cbiAgICogQGRlZmF1bHQgXCJcIlxuICAgKi9cbiAgcmVhZG9ubHkgdG9vbFBhcnNlclBsdWdpbj86IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvciBwYXRoIG9mIHRoZSBodWdnaW5nZmFjZSBtb2RlbCB0byB1c2UuXG4gICAqIEBkZWZhdWx0IFwiZmFjZWJvb2svb3B0LTEyNW1cIlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YXNrIHRvIHVzZSB0aGUgbW9kZWwgZm9yLlxuICAgKiBFYWNoIHZMTE0gaW5zdGFuY2Ugb25seSBzdXBwb3J0cyBvbmUgdGFzaywgZXZlbiBpZiB0aGUgc2FtZSBtb2RlbCBjYW4gYmUgdXNlZCBmb3IgbXVsdGlwbGUgdGFza3MuXG4gICAqIFdoZW4gdGhlIG1vZGVsIG9ubHkgc3VwcG9ydHMgb25lIHRhc2ssIFwiYXV0b1wiIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCBpdDsgb3RoZXJ3aXNlLFxuICAgKiB5b3UgbXVzdCBzcGVjaWZ5IGV4cGxpY2l0bHkgd2hpY2ggdGFzayB0byB1c2UuXG4gICAqIEBkZWZhdWx0IFZsbG1UYXNrLkFVVE9cbiAgICovXG4gIHJlYWRvbmx5IHRhc2s/OiBWbGxtVGFzaztcblxuICAvKipcbiAgICogTmFtZSBvciBwYXRoIG9mIHRoZSBodWdnaW5nZmFjZSB0b2tlbml6ZXIgdG8gdXNlLlxuICAgKiBJZiB1bnNwZWNpZmllZCwgbW9kZWwgbmFtZSBvciBwYXRoIHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRva2VuaXplcj86IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvciBwYXRoIG9mIHRoZSBodWdnaW5nZmFjZSBjb25maWcgdG8gdXNlLlxuICAgKiBJZiB1bnNwZWNpZmllZCwgbW9kZWwgbmFtZSBvciBwYXRoIHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGhmQ29uZmlnUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogU2tpcCBpbml0aWFsaXphdGlvbiBvZiB0b2tlbml6ZXIgYW5kIGRldG9rZW5pemVyLlxuICAgKiBFeHBlY3RzIHZhbGlkIHByb21wdF90b2tlbl9pZHMgYW5kIE5vbmUgZm9yIHByb21wdCBmcm9tIHRoZSBpbnB1dC5cbiAgICogVGhlIGdlbmVyYXRlZCBvdXRwdXQgd2lsbCBjb250YWluIHRva2VuIGlkcy5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBUb2tlbml6ZXJJbml0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNwZWNpZmljIG1vZGVsIHZlcnNpb24gdG8gdXNlLiBJdCBjYW4gYmUgYSBicmFuY2ggbmFtZSwgYSB0YWcgbmFtZSwgb3IgYSBjb21taXQgaWQuXG4gICAqIElmIHVuc3BlY2lmaWVkLCB3aWxsIHVzZSB0aGUgZGVmYXVsdCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV2aXNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzcGVjaWZpYyByZXZpc2lvbiB0byB1c2UgZm9yIHRoZSBtb2RlbCBjb2RlIG9uIEh1Z2dpbmcgRmFjZSBIdWIuXG4gICAqIEl0IGNhbiBiZSBhIGJyYW5jaCBuYW1lLCBhIHRhZyBuYW1lLCBvciBhIGNvbW1pdCBpZC4gSWYgdW5zcGVjaWZpZWQsIHdpbGwgdXNlIHRoZSBkZWZhdWx0IHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSBjb2RlUmV2aXNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldmlzaW9uIG9mIHRoZSBodWdnaW5nZmFjZSB0b2tlbml6ZXIgdG8gdXNlLlxuICAgKiBJdCBjYW4gYmUgYSBicmFuY2ggbmFtZSwgYSB0YWcgbmFtZSwgb3IgYSBjb21taXQgaWQuIElmIHVuc3BlY2lmaWVkLCB3aWxsIHVzZSB0aGUgZGVmYXVsdCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9rZW5pemVyUmV2aXNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0b2tlbml6ZXIgbW9kZS5cbiAgICogQGRlZmF1bHQgVG9rZW5pemVyTW9kZS5BVVRPXG4gICAqL1xuICByZWFkb25seSB0b2tlbml6ZXJNb2RlPzogVG9rZW5pemVyTW9kZTtcblxuICAvKipcbiAgICogVHJ1c3QgcmVtb3RlIGNvZGUgZnJvbSBodWdnaW5nZmFjZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHRydXN0UmVtb3RlQ29kZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFsbG93aW5nIEFQSSByZXF1ZXN0cyB0byByZWFkIGxvY2FsIGltYWdlcyBvciB2aWRlb3MgZnJvbSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgdGhlIHNlcnZlciBmaWxlIHN5c3RlbS5cbiAgICogVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2suIFNob3VsZCBvbmx5IGJlIGVuYWJsZWQgaW4gdHJ1c3RlZCBlbnZpcm9ubWVudHMuXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTG9jYWxNZWRpYVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtYXQgb2YgdGhlIG1vZGVsIGNvbmZpZyB0byBsb2FkLlxuICAgKiBAZGVmYXVsdCBDb25maWdGb3JtYXQuQVVUT1xuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnRm9ybWF0PzogQ29uZmlnRm9ybWF0O1xuXG4gIC8qKlxuICAgKiBEYXRhIHR5cGUgZm9yIG1vZGVsIHdlaWdodHMgYW5kIGFjdGl2YXRpb25zLlxuICAgKiBAZGVmYXVsdCBEYXRhVHlwZS5BVVRPXG4gICAqL1xuICByZWFkb25seSBkdHlwZT86IERhdGFUeXBlO1xuXG4gIC8qKlxuICAgKiBNb2RlbCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlYWRvbmx5IG1heE1vZGVsTGVuPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCByZWdleCBwYXR0ZXJuIHNwZWNpZnlpbmcgdmFsaWQgbG9naXRzIHByb2Nlc3NvciBxdWFsaWZpZWQgbmFtZXMgdGhhdCBjYW4gYmUgcGFzc2VkXG4gICAqIHdpdGggdGhlIGxvZ2l0c19wcm9jZXNzb3JzIGV4dHJhIGNvbXBsZXRpb24gYXJndW1lbnQuIERlZmF1bHRzIHRvIE5vbmUsIHdoaWNoIGFsbG93cyBubyBwcm9jZXNzb3JzLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9naXRzUHJvY2Vzc29yUGF0dGVybj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hpY2ggaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIHRvIHVzZS5cbiAgICogQGRlZmF1bHQgTW9kZWxJbXBsLkFVVE9cbiAgICovXG4gIHJlYWRvbmx5IG1vZGVsSW1wbD86IE1vZGVsSW1wbDtcblxuICAvKipcbiAgICogRGlzYWJsZXMgc2xpZGluZyB3aW5kb3csIGNhcHBpbmcgdG8gc2xpZGluZyB3aW5kb3cgc2l6ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRpc2FibGVTbGlkaW5nV2luZG93PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQmxvY2sgbWFuYWdlciB2MSBoYXMgYmVlbiByZW1vdmVkIGFuZCBTZWxmQXR0bkJsb2NrU3BhY2VNYW5hZ2VyIChpLmUuIGJsb2NrIG1hbmFnZXIgdjIpIGlzIG5vdyB0aGUgZGVmYXVsdC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAZGVwcmVjYXRlZCBTZXR0aW5nIHRoaXMgZmxhZyB0byBUcnVlIG9yIEZhbHNlIGhhcyBubyBlZmZlY3Qgb24gdkxMTSBiZWhhdmlvci5cbiAgICovXG4gIHJlYWRvbmx5IHVzZVYyQmxvY2tNYW5hZ2VyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmFuZG9tIHNlZWQgZm9yIG9wZXJhdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBzZWVkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXggbnVtYmVyIG9mIGxvZyBwcm9icyB0byByZXR1cm4gbG9ncHJvYnMgaXMgc3BlY2lmaWVkIGluIFNhbXBsaW5nUGFyYW1zLlxuICAgKiBAZGVmYXVsdCAyMFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4TG9ncHJvYnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgbG9nZ2luZyBzdGF0aXN0aWNzLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZUxvZ1N0YXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gcXVhbnRpemUgdGhlIHdlaWdodHMuXG4gICAqIElmIE5vbmUsIHdlIGZpcnN0IGNoZWNrIHRoZSBxdWFudGl6YXRpb25fY29uZmlnIGF0dHJpYnV0ZSBpbiB0aGUgbW9kZWwgY29uZmlnIGZpbGUuXG4gICAqIElmIHRoYXQgaXMgTm9uZSwgd2UgYXNzdW1lIHRoZSBtb2RlbCB3ZWlnaHRzIGFyZSBub3QgcXVhbnRpemVkIGFuZCB1c2UgZHR5cGUgdG8gZGV0ZXJtaW5lIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHdlaWdodHMuXG4gICAqL1xuICByZWFkb25seSBxdWFudGl6YXRpb24/OiBRdWFudGl6YXRpb247XG5cbiAgLyoqXG4gICAqIFJvUEUgc2NhbGluZyBjb25maWd1cmF0aW9uIGluIEpTT04gZm9ybWF0LlxuICAgKiBAZXhhbXBsZSB7XCJyb3BlX3R5cGVcIjpcImR5bmFtaWNcIixcImZhY3RvclwiOjIuMH1cbiAgICovXG4gIHJlYWRvbmx5IHJvcGVTY2FsaW5nPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuICAvKipcbiAgICogUm9QRSB0aGV0YS4gVXNlIHdpdGggcm9wZV9zY2FsaW5nLlxuICAgKiBJbiBzb21lIGNhc2VzLCBjaGFuZ2luZyB0aGUgUm9QRSB0aGV0YSBpbXByb3ZlcyB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIHNjYWxlZCBtb2RlbC5cbiAgICovXG4gIHJlYWRvbmx5IHJvcGVUaGV0YT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRva2VuIHRvIHVzZSBhcyBIVFRQIGJlYXJlciBhdXRob3JpemF0aW9uIGZvciByZW1vdGUgZmlsZXMuXG4gICAqIElmIHByb3ZpZGVkLCB0aGUgU2VjcmV0IHdpbGwgYmUgcGFzc2VkIGFzIEhGX1RPS0VOIHNlY3JldCB0byBjb21waWxlIGVudmlyb25tZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgaGZUb2tlbj86IFNlY3JldDtcblxuICAvKipcbiAgICogRXh0cmEgYXJndW1lbnRzIGZvciB0aGUgSHVnZ2luZ0ZhY2UgY29uZmlnLlxuICAgKiBUaGlzIHNob3VsZCBiZSBhIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFyc2VkIGludG8gYSBkaWN0aW9uYXJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgaGZPdmVycmlkZXM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4gIC8qKlxuICAgKiBBbHdheXMgdXNlIGVhZ2VyLW1vZGUgUHlUb3JjaC5cbiAgICogSWYgRmFsc2UsIHdpbGwgdXNlIGVhZ2VyIG1vZGUgYW5kIENVREEgZ3JhcGggaW4gaHlicmlkIGZvciBtYXhpbWFsIHBlcmZvcm1hbmNlIGFuZCBmbGV4aWJpbGl0eS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuZm9yY2VFYWdlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE1heGltdW0gc2VxdWVuY2UgbGVuZ3RoIGNvdmVyZWQgYnkgQ1VEQSBncmFwaHMuXG4gICAqIFdoZW4gYSBzZXF1ZW5jZSBoYXMgY29udGV4dCBsZW5ndGggbGFyZ2VyIHRoYW4gdGhpcywgd2UgZmFsbCBiYWNrIHRvIGVhZ2VyIG1vZGUuXG4gICAqIEFkZGl0aW9uYWxseSBmb3IgZW5jb2Rlci1kZWNvZGVyIG1vZGVscywgaWYgdGhlIHNlcXVlbmNlIGxlbmd0aCBvZiB0aGUgZW5jb2RlciBpbnB1dCBpcyBsYXJnZXIgdGhhbiB0aGlzLFxuICAgKiB3ZSBmYWxsIGJhY2sgdG8gdGhlIGVhZ2VyIG1vZGUuXG4gICAqIEBkZWZhdWx0IDgxOTJcbiAgICovXG4gIHJlYWRvbmx5IG1heFNlcUxlblRvQ2FwdHVyZT86IG51bWJlcjtcblxuICAvKipcbiAgICogT3ZlcnJpZGVzIGZvciB0aGUgbXVsdGltb2RhbCBpbnB1dCBtYXBwaW5nL3Byb2Nlc3NpbmcsIGUuZy4sIGltYWdlIHByb2Nlc3Nvci5cbiAgICogQGV4YW1wbGUge1wibnVtX2Nyb3BzXCI6IDR9XG4gICAqL1xuICByZWFkb25seSBtbVByb2Nlc3Nvckt3YXJncz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHRoZW4gZGlzYWJsZXMgY2FjaGluZyBvZiB0aGUgbXVsdGktbW9kYWwgcHJlcHJvY2Vzc29yL21hcHBlci4gKG5vdCByZWNvbW1lbmRlZClcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRpc2FibGVNbVByZXByb2Nlc3NvckNhY2hlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdHRlcm4ocykgdG8gaWdub3JlIHdoZW4gbG9hZGluZyB0aGUgbW9kZWwuRGVmYXVsdCB0byBvcmlnaW5hbC8qKlxcLyogdG8gYXZvaWRcbiAgICogcmVwZWF0ZWQgbG9hZGluZyBvZiBsbGFtYeKAmXMgY2hlY2twb2ludHMuXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVQYXR0ZXJucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgbmFtZShzKSB1c2VkIGluIHRoZSBBUEkuXG4gICAqIElmIG11bHRpcGxlIG5hbWVzIGFyZSBwcm92aWRlZCwgdGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgdG8gYW55IG9mIHRoZSBwcm92aWRlZCBuYW1lcy5cbiAgICogVGhlIG1vZGVsIG5hbWUgaW4gdGhlIG1vZGVsIGZpZWxkIG9mIGEgcmVzcG9uc2Ugd2lsbCBiZSB0aGUgZmlyc3QgbmFtZSBpbiB0aGlzIGxpc3QuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBtb2RlbCBuYW1lIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGAtLW1vZGVsYCBhcmd1bWVudC5cbiAgICogTm90ZWQgdGhhdCB0aGlzIG5hbWUocykgd2lsbCBhbHNvIGJlIHVzZWQgaW4gbW9kZWxfbmFtZSB0YWcgY29udGVudCBvZiBwcm9tZXRoZXVzIG1ldHJpY3MsXG4gICAqIGlmIG11bHRpcGxlIG5hbWVzIHByb3ZpZGVkLCBtZXRyaWNzIHRhZyB3aWxsIHRha2UgdGhlIGZpcnN0IG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZlZE1vZGVsTmFtZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9yIHBhdGggb2YgdGhlIFFMb1JBIGFkYXB0ZXIuXG4gICAqL1xuICByZWFkb25seSBxbG9yYUFkYXB0ZXJOYW1lT3JQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgZGVwcmVjYXRlZCBQcm9tZXRoZXVzIG1ldHJpY3MgdGhhdCBoYXZlIGJlZW4gaGlkZGVuIHNpbmNlIHRoZSBzcGVjaWZpZWQgdmVyc2lvbi5cbiAgICogRm9yIGV4YW1wbGUsIGlmIGEgcHJldmlvdXNseSBkZXByZWNhdGVkIG1ldHJpYyBoYXMgYmVlbiBoaWRkZW4gc2luY2UgdGhlIHYwLjcuMCByZWxlYXNlLFxuICAgKiB5b3UgdXNlIOKAk3Nob3ctaGlkZGVuLW1ldHJpY3MtZm9yLXZlcnNpb249MC43IGFzIGEgdGVtcG9yYXJ5IGVzY2FwZSBoYXRjaCB3aGlsZSB5b3UgbWlncmF0ZSB0byBuZXcgbWV0cmljcy5cbiAgICogVGhlIG1ldHJpYyBpcyBsaWtlbHkgdG8gYmUgcmVtb3ZlZCBjb21wbGV0ZWx5IGluIGFuIHVwY29taW5nIHJlbGVhc2UuXG4gICAqL1xuICByZWFkb25seSBzaG93SGlkZGVuTWV0cmljc0ZvclZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRhcmdldCBVUkwgdG8gd2hpY2ggT3BlblRlbGVtZXRyeSB0cmFjZXMgd2lsbCBiZSBzZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgb3RscFRyYWNlc0VuZHBvaW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWYWxpZCBjaG9pY2VzIGFyZSBtb2RlbCx3b3JrZXIsYWxsLlxuICAgKiBJdCBtYWtlcyBzZW5zZSB0byBzZXQgdGhpcyBvbmx5IGlmIC0tb3RscC10cmFjZXMtZW5kcG9pbnQgaXMgc2V0LlxuICAgKiBJZiBzZXQsIGl0IHdpbGwgY29sbGVjdCBkZXRhaWxlZCB0cmFjZXMgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlcy5cbiAgICogVGhpcyBpbnZvbHZlcyB1c2Ugb2YgcG9zc2libHkgY29zdGx5IGFuZCBvciBibG9ja2luZyBvcGVyYXRpb25zIGFuZCBoZW5jZSBtaWdodCBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29sbGVjdERldGFpbGVkVHJhY2VzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGFzeW5jIG91dHB1dCBwcm9jZXNzaW5nLiBUaGlzIG1heSByZXN1bHQgaW4gbG93ZXIgcGVyZm9ybWFuY2UuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkaXNhYmxlQXN5bmNPdXRwdXRQcm9jPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNjaGVkdWxlciBjbGFzcyB0byB1c2UuXG4gICAqIEBkZWZhdWx0IFwidmxsbS5jb3JlLnNjaGVkdWxlci5TY2hlZHVsZXJcIlxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGVyQ2xzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBzZXQgbmV1cm9uIGRldmljZSBjb25maWd1cmF0aW9uLlxuICAgKiBAZXhhbXBsZSB7XCJjYXN0X2xvZ2l0c19kdHlwZVwiOiBcImJsb2F0MTZcIn1cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlTmV1cm9uQ29uZmlnPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3Igc2V0IHRoZSBwb29saW5nIG1ldGhvZCBmb3IgcG9vbGluZyBtb2RlbHMuXG4gICAqIEBleGFtcGxlIHtcInBvb2xpbmdfdHlwZVwiOiBcIm1lYW5cIiwgXCJub3JtYWxpemVcIjogZmFsc2V9XG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZVBvb2xlckNvbmZpZz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgLyoqXG4gICAqIHRvcmNoLmNvbXBpbGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIG1vZGVsLlxuICAgKiBXaGVuIGl0IGlzIGEgbnVtYmVyICgwLCAxLCAyLCAzKSwgaXQgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyB0aGUgb3B0aW1pemF0aW9uIGxldmVsLlxuICAgKlxuICAgKiBOT1RFOiBsZXZlbCAwIGlzIHRoZSBkZWZhdWx0IGxldmVsIHdpdGhvdXQgYW55IG9wdGltaXphdGlvbi5cbiAgICogbGV2ZWwgMSBhbmQgMiBhcmUgZm9yIGludGVybmFsIHRlc3Rpbmcgb25seS4gbGV2ZWwgMyBpcyB0aGUgcmVjb21tZW5kZWQgbGV2ZWwgZm9yIHByb2R1Y3Rpb24uXG4gICAqIFRvIHNwZWNpZnkgdGhlIGZ1bGwgY29tcGlsYXRpb24gY29uZmlnLCB1c2UgYSBKU09OIHN0cmluZyxcbiAgICogZS5nLiBge1wibGV2ZWxcIjogMywgXCJjdWRhZ3JhcGhfY2FwdHVyZV9zaXplc1wiOiBbMSwgMiwgNCwgOF19YCBGb2xsb3dpbmcgdGhlIGNvbnZlbnRpb24gb2YgdHJhZGl0aW9uYWwgY29tcGlsZXJzLFxuICAgKiB1c2luZyAtTyB3aXRob3V0IHNwYWNlIGlzIGFsc28gc3VwcG9ydGVkLiAtTzMgaXMgZXF1aXZhbGVudCB0byAtTyAzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGlsYXRpb25Db25maWc/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9ucyBmb3IgZGlzdHJpYnV0ZWQgS1YgY2FjaGUgdHJhbnNmZXIgaW4gb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkga3ZUcmFuc2ZlckNvbmZpZz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JrZXIgY2xhc3MgdG8gdXNlIGZvciBkaXN0cmlidXRlZCBleGVjdXRpb24uXG4gICAqIEBkZWZhdWx0IFwiYXV0b1wiXG4gICAqL1xuICByZWFkb25seSB3b3JrZXJDbHM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JrZXIgZXh0ZW5zaW9uIGNsYXNzLlxuICAgKiBAZGVmYXVsdCBcIlwiXG4gICAqL1xuICByZWFkb25seSB3b3JrZXJFeHRlbnNpb25DbHM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgcGF0aCB0byB0aGUgZ2VuZXJhdGlvbiBjb25maWcuIERlZmF1bHRzIHRvIOKAmGF1dG/igJksXG4gICAqIHRoZSBnZW5lcmF0aW9uIGNvbmZpZyB3aWxsIGJlIGxvYWRlZCBmcm9tIG1vZGVsIHBhdGguIElmIHNldCB0byDigJh2bGxt4oCZLFxuICAgKiBubyBnZW5lcmF0aW9uIGNvbmZpZyBpcyBsb2FkZWQsIHZMTE0gZGVmYXVsdHMgd2lsbCBiZSB1c2VkLlxuICAgKiBJZiBzZXQgdG8gYSBmb2xkZXIgcGF0aCwgdGhlIGdlbmVyYXRpb24gY29uZmlnIHdpbGwgYmUgbG9hZGVkIGZyb20gdGhlIHNwZWNpZmllZCBmb2xkZXIgcGF0aC5cbiAgICogSWYgbWF4X25ld190b2tlbnMgaXMgc3BlY2lmaWVkIGluIGdlbmVyYXRpb24gY29uZmlnLFxuICAgKiB0aGVuIGl0IHNldHMgYSBzZXJ2ZXItd2lkZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIG91dHB1dCB0b2tlbnMgZm9yIGFsbCByZXF1ZXN0cy5cbiAgICogQGRlZmF1bHQgXCJhdXRvXCJcbiAgICovXG4gIHJlYWRvbmx5IGdlbmVyYXRpb25Db25maWc/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyBvciBzZXRzIGdlbmVyYXRpb24gY29uZmlnLlxuICAgKiBJZiB1c2VkIHdpdGgg4oCTZ2VuZXJhdGlvbi1jb25maWc9YXV0bywgdGhlIG92ZXJyaWRlIHBhcmFtZXRlcnMgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGUgZGVmYXVsdCBjb25maWcgZnJvbSB0aGUgbW9kZWwuXG4gICAqIElmIGdlbmVyYXRpb24tY29uZmlnIGlzIE5vbmUsIG9ubHkgdGhlIG92ZXJyaWRlIHBhcmFtZXRlcnMgYXJlIHVzZWQuXG4gICAqIEBleGFtcGxlIHtcInRlbXBlcmF0dXJlXCI6IDAuNX1cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlR2VuZXJhdGlvbkNvbmZpZz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBzbGVlcCBtb2RlIGZvciB0aGUgZW5naW5lLiAob25seSBjdWRhIHBsYXRmb3JtIGlzIHN1cHBvcnRlZClcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVNsZWVwTW9kZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgY29uZmlnIGZvciBzcGVjaWZpZWQgcGxhdGZvcm0uXG4gICAqIERpZmZlcmVudCBwbGF0Zm9ybXMgbWF5IHN1cHBvcnQgZGlmZmVyZW50IGNvbmZpZ3MuXG4gICAqIE1ha2Ugc3VyZSB0aGUgY29uZmlncyBhcmUgdmFsaWQgZm9yIHRoZSBwbGF0Zm9ybSB5b3UgYXJlIHVzaW5nLlxuICAgKiBUaGUgaW5wdXQgZm9ybWF0IGlzIGxpa2Ug4oCYe+KAnGNvbmZpZ19rZXnigJ064oCdY29uZmlnX3ZhbHVl4oCdfeKAmVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbENvbmZpZz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgLyoqXG4gICAqIEVuYWJsZSByZWFzb25pbmdfY29udGVudCBmb3IgdGhlIG1vZGVsLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlUmVhc29uaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzYWJsZSBjYXNjYWRlIGF0dGVudGlvbiBmb3IgVjEuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkaXNhYmxlQ2FzY2FkZUF0dG4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGxvZ2dpbmcgcmVxdWVzdHMuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkaXNhYmxlTG9nUmVxdWVzdHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNYXggbnVtYmVyIG9mIHByb21wdCBjaGFyYWN0ZXJzIG9yIHByb21wdCBJRCBudW1iZXJzIGluIGxvZy5cbiAgICovXG4gIHJlYWRvbmx5IG1heExvZ0xlbj86IG51bWJlcjtcblxuICAvKipcbiAgICogRGlzYWJsZSBGYXN0QVBJJ3MgT3BlbkFQSSBzY2hlbWEsIFN3YWdnZXIgVUksIGFuZCBSZURvYyBlbmRwb2ludC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRpc2FibGVGYXN0QXBpRG9jcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBwcm9tcHRfdG9rZW5zX2RldGFpbHMgaW4gdXNhZ2UuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVQcm9tcHRUb2tlbnNEZXRhaWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlIHRyYWNraW5nIHNlcnZlcl9sb2FkX21ldHJpY3MgaW4gdGhlIGFwcCBzdGF0ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVNlcnZlckxvYWRUcmFja2luZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgbG9hZGluZyB0aGUgbW9kZWwgd2VpZ2h0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWbGxtTG9hZE