blob: a18cf77e87a74ff8e7148425ab0a1d95a67b73fc [file] [log] [blame]
/******/ (function(modules) { // webpackBootstrap
/******/ // install a JSONP callback for chunk loading
/******/ function webpackJsonpCallback(data) {
/******/ var chunkIds = data[0];
/******/ var moreModules = data[1];
/******/ var executeModules = data[2];
/******/
/******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0, resolves = [];
/******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i];
/******/ if(installedChunks[chunkId]) {
/******/ resolves.push(installedChunks[chunkId][0]);
/******/ }
/******/ installedChunks[chunkId] = 0;
/******/ }
/******/ for(moduleId in moreModules) {
/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
/******/ modules[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if(parentJsonpFunction) parentJsonpFunction(data);
/******/
/******/ while(resolves.length) {
/******/ resolves.shift()();
/******/ }
/******/
/******/ // add entry modules from loaded chunk to deferred list
/******/ deferredModules.push.apply(deferredModules, executeModules || []);
/******/
/******/ // run deferred modules when all chunks ready
/******/ return checkDeferredModules();
/******/ };
/******/ function checkDeferredModules() {
/******/ var result;
/******/ for(var i = 0; i < deferredModules.length; i++) {
/******/ var deferredModule = deferredModules[i];
/******/ var fulfilled = true;
/******/ for(var j = 1; j < deferredModule.length; j++) {
/******/ var depId = deferredModule[j];
/******/ if(installedChunks[depId] !== 0) fulfilled = false;
/******/ }
/******/ if(fulfilled) {
/******/ deferredModules.splice(i--, 1);
/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
/******/ }
/******/ }
/******/
/******/ return result;
/******/ }
/******/ function hotDisposeChunk(chunkId) {
/******/ delete installedChunks[chunkId];
/******/ }
/******/ var parentHotUpdateCallback = window["webpackHotUpdate"];
/******/ window["webpackHotUpdate"] = // eslint-disable-next-line no-unused-vars
/******/ function webpackHotUpdateCallback(chunkId, moreModules) {
/******/ hotAddUpdateChunk(chunkId, moreModules);
/******/ if (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules);
/******/ } ;
/******/
/******/ // eslint-disable-next-line no-unused-vars
/******/ function hotDownloadUpdateChunk(chunkId) {
/******/ var script = document.createElement("script");
/******/ script.charset = "utf-8";
/******/ script.src = __webpack_require__.p + "" + chunkId + "." + hotCurrentHash + ".hot-update.js";
/******/ if (null) script.crossOrigin = null;
/******/ document.head.appendChild(script);
/******/ }
/******/
/******/ // eslint-disable-next-line no-unused-vars
/******/ function hotDownloadManifest(requestTimeout) {
/******/ requestTimeout = requestTimeout || 10000;
/******/ return new Promise(function(resolve, reject) {
/******/ if (typeof XMLHttpRequest === "undefined") {
/******/ return reject(new Error("No browser support"));
/******/ }
/******/ try {
/******/ var request = new XMLHttpRequest();
/******/ var requestPath = __webpack_require__.p + "" + hotCurrentHash + ".hot-update.json";
/******/ request.open("GET", requestPath, true);
/******/ request.timeout = requestTimeout;
/******/ request.send(null);
/******/ } catch (err) {
/******/ return reject(err);
/******/ }
/******/ request.onreadystatechange = function() {
/******/ if (request.readyState !== 4) return;
/******/ if (request.status === 0) {
/******/ // timeout
/******/ reject(
/******/ new Error("Manifest request to " + requestPath + " timed out.")
/******/ );
/******/ } else if (request.status === 404) {
/******/ // no update available
/******/ resolve();
/******/ } else if (request.status !== 200 && request.status !== 304) {
/******/ // other failure
/******/ reject(new Error("Manifest request to " + requestPath + " failed."));
/******/ } else {
/******/ // success
/******/ try {
/******/ var update = JSON.parse(request.responseText);
/******/ } catch (e) {
/******/ reject(e);
/******/ return;
/******/ }
/******/ resolve(update);
/******/ }
/******/ };
/******/ });
/******/ }
/******/
/******/ var hotApplyOnUpdate = true;
/******/ // eslint-disable-next-line no-unused-vars
/******/ var hotCurrentHash = "4ff01a0e327eddef25f9";
/******/ var hotRequestTimeout = 10000;
/******/ var hotCurrentModuleData = {};
/******/ var hotCurrentChildModule;
/******/ // eslint-disable-next-line no-unused-vars
/******/ var hotCurrentParents = [];
/******/ // eslint-disable-next-line no-unused-vars
/******/ var hotCurrentParentsTemp = [];
/******/
/******/ // eslint-disable-next-line no-unused-vars
/******/ function hotCreateRequire(moduleId) {
/******/ var me = installedModules[moduleId];
/******/ if (!me) return __webpack_require__;
/******/ var fn = function(request) {
/******/ if (me.hot.active) {
/******/ if (installedModules[request]) {
/******/ if (installedModules[request].parents.indexOf(moduleId) === -1) {
/******/ installedModules[request].parents.push(moduleId);
/******/ }
/******/ } else {
/******/ hotCurrentParents = [moduleId];
/******/ hotCurrentChildModule = request;
/******/ }
/******/ if (me.children.indexOf(request) === -1) {
/******/ me.children.push(request);
/******/ }
/******/ } else {
/******/ console.warn(
/******/ "[HMR] unexpected require(" +
/******/ request +
/******/ ") from disposed module " +
/******/ moduleId
/******/ );
/******/ hotCurrentParents = [];
/******/ }
/******/ return __webpack_require__(request);
/******/ };
/******/ var ObjectFactory = function ObjectFactory(name) {
/******/ return {
/******/ configurable: true,
/******/ enumerable: true,
/******/ get: function() {
/******/ return __webpack_require__[name];
/******/ },
/******/ set: function(value) {
/******/ __webpack_require__[name] = value;
/******/ }
/******/ };
/******/ };
/******/ for (var name in __webpack_require__) {
/******/ if (
/******/ Object.prototype.hasOwnProperty.call(__webpack_require__, name) &&
/******/ name !== "e" &&
/******/ name !== "t"
/******/ ) {
/******/ Object.defineProperty(fn, name, ObjectFactory(name));
/******/ }
/******/ }
/******/ fn.e = function(chunkId) {
/******/ if (hotStatus === "ready") hotSetStatus("prepare");
/******/ hotChunksLoading++;
/******/ return __webpack_require__.e(chunkId).then(finishChunkLoading, function(err) {
/******/ finishChunkLoading();
/******/ throw err;
/******/ });
/******/
/******/ function finishChunkLoading() {
/******/ hotChunksLoading--;
/******/ if (hotStatus === "prepare") {
/******/ if (!hotWaitingFilesMap[chunkId]) {
/******/ hotEnsureUpdateChunk(chunkId);
/******/ }
/******/ if (hotChunksLoading === 0 && hotWaitingFiles === 0) {
/******/ hotUpdateDownloaded();
/******/ }
/******/ }
/******/ }
/******/ };
/******/ fn.t = function(value, mode) {
/******/ if (mode & 1) value = fn(value);
/******/ return __webpack_require__.t(value, mode & ~1);
/******/ };
/******/ return fn;
/******/ }
/******/
/******/ // eslint-disable-next-line no-unused-vars
/******/ function hotCreateModule(moduleId) {
/******/ var hot = {
/******/ // private stuff
/******/ _acceptedDependencies: {},
/******/ _declinedDependencies: {},
/******/ _selfAccepted: false,
/******/ _selfDeclined: false,
/******/ _disposeHandlers: [],
/******/ _main: hotCurrentChildModule !== moduleId,
/******/
/******/ // Module API
/******/ active: true,
/******/ accept: function(dep, callback) {
/******/ if (dep === undefined) hot._selfAccepted = true;
/******/ else if (typeof dep === "function") hot._selfAccepted = dep;
/******/ else if (typeof dep === "object")
/******/ for (var i = 0; i < dep.length; i++)
/******/ hot._acceptedDependencies[dep[i]] = callback || function() {};
/******/ else hot._acceptedDependencies[dep] = callback || function() {};
/******/ },
/******/ decline: function(dep) {
/******/ if (dep === undefined) hot._selfDeclined = true;
/******/ else if (typeof dep === "object")
/******/ for (var i = 0; i < dep.length; i++)
/******/ hot._declinedDependencies[dep[i]] = true;
/******/ else hot._declinedDependencies[dep] = true;
/******/ },
/******/ dispose: function(callback) {
/******/ hot._disposeHandlers.push(callback);
/******/ },
/******/ addDisposeHandler: function(callback) {
/******/ hot._disposeHandlers.push(callback);
/******/ },
/******/ removeDisposeHandler: function(callback) {
/******/ var idx = hot._disposeHandlers.indexOf(callback);
/******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1);
/******/ },
/******/
/******/ // Management API
/******/ check: hotCheck,
/******/ apply: hotApply,
/******/ status: function(l) {
/******/ if (!l) return hotStatus;
/******/ hotStatusHandlers.push(l);
/******/ },
/******/ addStatusHandler: function(l) {
/******/ hotStatusHandlers.push(l);
/******/ },
/******/ removeStatusHandler: function(l) {
/******/ var idx = hotStatusHandlers.indexOf(l);
/******/ if (idx >= 0) hotStatusHandlers.splice(idx, 1);
/******/ },
/******/
/******/ //inherit from previous dispose call
/******/ data: hotCurrentModuleData[moduleId]
/******/ };
/******/ hotCurrentChildModule = undefined;
/******/ return hot;
/******/ }
/******/
/******/ var hotStatusHandlers = [];
/******/ var hotStatus = "idle";
/******/
/******/ function hotSetStatus(newStatus) {
/******/ hotStatus = newStatus;
/******/ for (var i = 0; i < hotStatusHandlers.length; i++)
/******/ hotStatusHandlers[i].call(null, newStatus);
/******/ }
/******/
/******/ // while downloading
/******/ var hotWaitingFiles = 0;
/******/ var hotChunksLoading = 0;
/******/ var hotWaitingFilesMap = {};
/******/ var hotRequestedFilesMap = {};
/******/ var hotAvailableFilesMap = {};
/******/ var hotDeferred;
/******/
/******/ // The update info
/******/ var hotUpdate, hotUpdateNewHash;
/******/
/******/ function toModuleId(id) {
/******/ var isNumber = +id + "" === id;
/******/ return isNumber ? +id : id;
/******/ }
/******/
/******/ function hotCheck(apply) {
/******/ if (hotStatus !== "idle") {
/******/ throw new Error("check() is only allowed in idle status");
/******/ }
/******/ hotApplyOnUpdate = apply;
/******/ hotSetStatus("check");
/******/ return hotDownloadManifest(hotRequestTimeout).then(function(update) {
/******/ if (!update) {
/******/ hotSetStatus("idle");
/******/ return null;
/******/ }
/******/ hotRequestedFilesMap = {};
/******/ hotWaitingFilesMap = {};
/******/ hotAvailableFilesMap = update.c;
/******/ hotUpdateNewHash = update.h;
/******/
/******/ hotSetStatus("prepare");
/******/ var promise = new Promise(function(resolve, reject) {
/******/ hotDeferred = {
/******/ resolve: resolve,
/******/ reject: reject
/******/ };
/******/ });
/******/ hotUpdate = {};
/******/ for(var chunkId in installedChunks)
/******/ // eslint-disable-next-line no-lone-blocks
/******/ {
/******/ /*globals chunkId */
/******/ hotEnsureUpdateChunk(chunkId);
/******/ }
/******/ if (
/******/ hotStatus === "prepare" &&
/******/ hotChunksLoading === 0 &&
/******/ hotWaitingFiles === 0
/******/ ) {
/******/ hotUpdateDownloaded();
/******/ }
/******/ return promise;
/******/ });
/******/ }
/******/
/******/ // eslint-disable-next-line no-unused-vars
/******/ function hotAddUpdateChunk(chunkId, moreModules) {
/******/ if (!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId])
/******/ return;
/******/ hotRequestedFilesMap[chunkId] = false;
/******/ for (var moduleId in moreModules) {
/******/ if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
/******/ hotUpdate[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if (--hotWaitingFiles === 0 && hotChunksLoading === 0) {
/******/ hotUpdateDownloaded();
/******/ }
/******/ }
/******/
/******/ function hotEnsureUpdateChunk(chunkId) {
/******/ if (!hotAvailableFilesMap[chunkId]) {
/******/ hotWaitingFilesMap[chunkId] = true;
/******/ } else {
/******/ hotRequestedFilesMap[chunkId] = true;
/******/ hotWaitingFiles++;
/******/ hotDownloadUpdateChunk(chunkId);
/******/ }
/******/ }
/******/
/******/ function hotUpdateDownloaded() {
/******/ hotSetStatus("ready");
/******/ var deferred = hotDeferred;
/******/ hotDeferred = null;
/******/ if (!deferred) return;
/******/ if (hotApplyOnUpdate) {
/******/ // Wrap deferred object in Promise to mark it as a well-handled Promise to
/******/ // avoid triggering uncaught exception warning in Chrome.
/******/ // See https://bugs.chromium.org/p/chromium/issues/detail?id=465666
/******/ Promise.resolve()
/******/ .then(function() {
/******/ return hotApply(hotApplyOnUpdate);
/******/ })
/******/ .then(
/******/ function(result) {
/******/ deferred.resolve(result);
/******/ },
/******/ function(err) {
/******/ deferred.reject(err);
/******/ }
/******/ );
/******/ } else {
/******/ var outdatedModules = [];
/******/ for (var id in hotUpdate) {
/******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
/******/ outdatedModules.push(toModuleId(id));
/******/ }
/******/ }
/******/ deferred.resolve(outdatedModules);
/******/ }
/******/ }
/******/
/******/ function hotApply(options) {
/******/ if (hotStatus !== "ready")
/******/ throw new Error("apply() is only allowed in ready status");
/******/ options = options || {};
/******/
/******/ var cb;
/******/ var i;
/******/ var j;
/******/ var module;
/******/ var moduleId;
/******/
/******/ function getAffectedStuff(updateModuleId) {
/******/ var outdatedModules = [updateModuleId];
/******/ var outdatedDependencies = {};
/******/
/******/ var queue = outdatedModules.map(function(id) {
/******/ return {
/******/ chain: [id],
/******/ id: id
/******/ };
/******/ });
/******/ while (queue.length > 0) {
/******/ var queueItem = queue.pop();
/******/ var moduleId = queueItem.id;
/******/ var chain = queueItem.chain;
/******/ module = installedModules[moduleId];
/******/ if (!module || module.hot._selfAccepted) continue;
/******/ if (module.hot._selfDeclined) {
/******/ return {
/******/ type: "self-declined",
/******/ chain: chain,
/******/ moduleId: moduleId
/******/ };
/******/ }
/******/ if (module.hot._main) {
/******/ return {
/******/ type: "unaccepted",
/******/ chain: chain,
/******/ moduleId: moduleId
/******/ };
/******/ }
/******/ for (var i = 0; i < module.parents.length; i++) {
/******/ var parentId = module.parents[i];
/******/ var parent = installedModules[parentId];
/******/ if (!parent) continue;
/******/ if (parent.hot._declinedDependencies[moduleId]) {
/******/ return {
/******/ type: "declined",
/******/ chain: chain.concat([parentId]),
/******/ moduleId: moduleId,
/******/ parentId: parentId
/******/ };
/******/ }
/******/ if (outdatedModules.indexOf(parentId) !== -1) continue;
/******/ if (parent.hot._acceptedDependencies[moduleId]) {
/******/ if (!outdatedDependencies[parentId])
/******/ outdatedDependencies[parentId] = [];
/******/ addAllToSet(outdatedDependencies[parentId], [moduleId]);
/******/ continue;
/******/ }
/******/ delete outdatedDependencies[parentId];
/******/ outdatedModules.push(parentId);
/******/ queue.push({
/******/ chain: chain.concat([parentId]),
/******/ id: parentId
/******/ });
/******/ }
/******/ }
/******/
/******/ return {
/******/ type: "accepted",
/******/ moduleId: updateModuleId,
/******/ outdatedModules: outdatedModules,
/******/ outdatedDependencies: outdatedDependencies
/******/ };
/******/ }
/******/
/******/ function addAllToSet(a, b) {
/******/ for (var i = 0; i < b.length; i++) {
/******/ var item = b[i];
/******/ if (a.indexOf(item) === -1) a.push(item);
/******/ }
/******/ }
/******/
/******/ // at begin all updates modules are outdated
/******/ // the "outdated" status can propagate to parents if they don't accept the children
/******/ var outdatedDependencies = {};
/******/ var outdatedModules = [];
/******/ var appliedUpdate = {};
/******/
/******/ var warnUnexpectedRequire = function warnUnexpectedRequire() {
/******/ console.warn(
/******/ "[HMR] unexpected require(" + result.moduleId + ") to disposed module"
/******/ );
/******/ };
/******/
/******/ for (var id in hotUpdate) {
/******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
/******/ moduleId = toModuleId(id);
/******/ /** @type {TODO} */
/******/ var result;
/******/ if (hotUpdate[id]) {
/******/ result = getAffectedStuff(moduleId);
/******/ } else {
/******/ result = {
/******/ type: "disposed",
/******/ moduleId: id
/******/ };
/******/ }
/******/ /** @type {Error|false} */
/******/ var abortError = false;
/******/ var doApply = false;
/******/ var doDispose = false;
/******/ var chainInfo = "";
/******/ if (result.chain) {
/******/ chainInfo = "\nUpdate propagation: " + result.chain.join(" -> ");
/******/ }
/******/ switch (result.type) {
/******/ case "self-declined":
/******/ if (options.onDeclined) options.onDeclined(result);
/******/ if (!options.ignoreDeclined)
/******/ abortError = new Error(
/******/ "Aborted because of self decline: " +
/******/ result.moduleId +
/******/ chainInfo
/******/ );
/******/ break;
/******/ case "declined":
/******/ if (options.onDeclined) options.onDeclined(result);
/******/ if (!options.ignoreDeclined)
/******/ abortError = new Error(
/******/ "Aborted because of declined dependency: " +
/******/ result.moduleId +
/******/ " in " +
/******/ result.parentId +
/******/ chainInfo
/******/ );
/******/ break;
/******/ case "unaccepted":
/******/ if (options.onUnaccepted) options.onUnaccepted(result);
/******/ if (!options.ignoreUnaccepted)
/******/ abortError = new Error(
/******/ "Aborted because " + moduleId + " is not accepted" + chainInfo
/******/ );
/******/ break;
/******/ case "accepted":
/******/ if (options.onAccepted) options.onAccepted(result);
/******/ doApply = true;
/******/ break;
/******/ case "disposed":
/******/ if (options.onDisposed) options.onDisposed(result);
/******/ doDispose = true;
/******/ break;
/******/ default:
/******/ throw new Error("Unexception type " + result.type);
/******/ }
/******/ if (abortError) {
/******/ hotSetStatus("abort");
/******/ return Promise.reject(abortError);
/******/ }
/******/ if (doApply) {
/******/ appliedUpdate[moduleId] = hotUpdate[moduleId];
/******/ addAllToSet(outdatedModules, result.outdatedModules);
/******/ for (moduleId in result.outdatedDependencies) {
/******/ if (
/******/ Object.prototype.hasOwnProperty.call(
/******/ result.outdatedDependencies,
/******/ moduleId
/******/ )
/******/ ) {
/******/ if (!outdatedDependencies[moduleId])
/******/ outdatedDependencies[moduleId] = [];
/******/ addAllToSet(
/******/ outdatedDependencies[moduleId],
/******/ result.outdatedDependencies[moduleId]
/******/ );
/******/ }
/******/ }
/******/ }
/******/ if (doDispose) {
/******/ addAllToSet(outdatedModules, [result.moduleId]);
/******/ appliedUpdate[moduleId] = warnUnexpectedRequire;
/******/ }
/******/ }
/******/ }
/******/
/******/ // Store self accepted outdated modules to require them later by the module system
/******/ var outdatedSelfAcceptedModules = [];
/******/ for (i = 0; i < outdatedModules.length; i++) {
/******/ moduleId = outdatedModules[i];
/******/ if (
/******/ installedModules[moduleId] &&
/******/ installedModules[moduleId].hot._selfAccepted &&
/******/ // removed self-accepted modules should not be required
/******/ appliedUpdate[moduleId] !== warnUnexpectedRequire
/******/ ) {
/******/ outdatedSelfAcceptedModules.push({
/******/ module: moduleId,
/******/ errorHandler: installedModules[moduleId].hot._selfAccepted
/******/ });
/******/ }
/******/ }
/******/
/******/ // Now in "dispose" phase
/******/ hotSetStatus("dispose");
/******/ Object.keys(hotAvailableFilesMap).forEach(function(chunkId) {
/******/ if (hotAvailableFilesMap[chunkId] === false) {
/******/ hotDisposeChunk(chunkId);
/******/ }
/******/ });
/******/
/******/ var idx;
/******/ var queue = outdatedModules.slice();
/******/ while (queue.length > 0) {
/******/ moduleId = queue.pop();
/******/ module = installedModules[moduleId];
/******/ if (!module) continue;
/******/
/******/ var data = {};
/******/
/******/ // Call dispose handlers
/******/ var disposeHandlers = module.hot._disposeHandlers;
/******/ for (j = 0; j < disposeHandlers.length; j++) {
/******/ cb = disposeHandlers[j];
/******/ cb(data);
/******/ }
/******/ hotCurrentModuleData[moduleId] = data;
/******/
/******/ // disable module (this disables requires from this module)
/******/ module.hot.active = false;
/******/
/******/ // remove module from cache
/******/ delete installedModules[moduleId];
/******/
/******/ // when disposing there is no need to call dispose handler
/******/ delete outdatedDependencies[moduleId];
/******/
/******/ // remove "parents" references from all children
/******/ for (j = 0; j < module.children.length; j++) {
/******/ var child = installedModules[module.children[j]];
/******/ if (!child) continue;
/******/ idx = child.parents.indexOf(moduleId);
/******/ if (idx >= 0) {
/******/ child.parents.splice(idx, 1);
/******/ }
/******/ }
/******/ }
/******/
/******/ // remove outdated dependency from module children
/******/ var dependency;
/******/ var moduleOutdatedDependencies;
/******/ for (moduleId in outdatedDependencies) {
/******/ if (
/******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
/******/ ) {
/******/ module = installedModules[moduleId];
/******/ if (module) {
/******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
/******/ for (j = 0; j < moduleOutdatedDependencies.length; j++) {
/******/ dependency = moduleOutdatedDependencies[j];
/******/ idx = module.children.indexOf(dependency);
/******/ if (idx >= 0) module.children.splice(idx, 1);
/******/ }
/******/ }
/******/ }
/******/ }
/******/
/******/ // Now in "apply" phase
/******/ hotSetStatus("apply");
/******/
/******/ hotCurrentHash = hotUpdateNewHash;
/******/
/******/ // insert new code
/******/ for (moduleId in appliedUpdate) {
/******/ if (Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) {
/******/ modules[moduleId] = appliedUpdate[moduleId];
/******/ }
/******/ }
/******/
/******/ // call accept handlers
/******/ var error = null;
/******/ for (moduleId in outdatedDependencies) {
/******/ if (
/******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
/******/ ) {
/******/ module = installedModules[moduleId];
/******/ if (module) {
/******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
/******/ var callbacks = [];
/******/ for (i = 0; i < moduleOutdatedDependencies.length; i++) {
/******/ dependency = moduleOutdatedDependencies[i];
/******/ cb = module.hot._acceptedDependencies[dependency];
/******/ if (cb) {
/******/ if (callbacks.indexOf(cb) !== -1) continue;
/******/ callbacks.push(cb);
/******/ }
/******/ }
/******/ for (i = 0; i < callbacks.length; i++) {
/******/ cb = callbacks[i];
/******/ try {
/******/ cb(moduleOutdatedDependencies);
/******/ } catch (err) {
/******/ if (options.onErrored) {
/******/ options.onErrored({
/******/ type: "accept-errored",
/******/ moduleId: moduleId,
/******/ dependencyId: moduleOutdatedDependencies[i],
/******/ error: err
/******/ });
/******/ }
/******/ if (!options.ignoreErrored) {
/******/ if (!error) error = err;
/******/ }
/******/ }
/******/ }
/******/ }
/******/ }
/******/ }
/******/
/******/ // Load self accepted modules
/******/ for (i = 0; i < outdatedSelfAcceptedModules.length; i++) {
/******/ var item = outdatedSelfAcceptedModules[i];
/******/ moduleId = item.module;
/******/ hotCurrentParents = [moduleId];
/******/ try {
/******/ __webpack_require__(moduleId);
/******/ } catch (err) {
/******/ if (typeof item.errorHandler === "function") {
/******/ try {
/******/ item.errorHandler(err);
/******/ } catch (err2) {
/******/ if (options.onErrored) {
/******/ options.onErrored({
/******/ type: "self-accept-error-handler-errored",
/******/ moduleId: moduleId,
/******/ error: err2,
/******/ originalError: err
/******/ });
/******/ }
/******/ if (!options.ignoreErrored) {
/******/ if (!error) error = err2;
/******/ }
/******/ if (!error) error = err;
/******/ }
/******/ } else {
/******/ if (options.onErrored) {
/******/ options.onErrored({
/******/ type: "self-accept-errored",
/******/ moduleId: moduleId,
/******/ error: err
/******/ });
/******/ }
/******/ if (!options.ignoreErrored) {
/******/ if (!error) error = err;
/******/ }
/******/ }
/******/ }
/******/ }
/******/
/******/ // handle errors in accept handlers and self accepted module load
/******/ if (error) {
/******/ hotSetStatus("fail");
/******/ return Promise.reject(error);
/******/ }
/******/
/******/ hotSetStatus("idle");
/******/ return new Promise(function(resolve) {
/******/ resolve(outdatedModules);
/******/ });
/******/ }
/******/
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // object to store loaded and loading chunks
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
/******/ // Promise = chunk loading, 0 = chunk loaded
/******/ var installedChunks = {
/******/ "fds-demo.bundle.min": 0
/******/ };
/******/
/******/ var deferredModules = [];
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {},
/******/ hot: hotCreateModule(moduleId),
/******/ parents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp),
/******/ children: []
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // __webpack_hash__
/******/ __webpack_require__.h = function() { return hotCurrentHash; };
/******/
/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
/******/ jsonpArray.push = webpackJsonpCallback;
/******/ jsonpArray = jsonpArray.slice();
/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
/******/ var parentJsonpFunction = oldJsonpFunction;
/******/
/******/
/******/ // add entry module to deferred list
/******/ deferredModules.push(["./webapp/fds-bootstrap.js","fds-demo.vendor.min"]);
/******/ // run deferred modules when ready
/******/ return checkDeferredModules();
/******/ })
/************************************************************************/
/******/ ({
/***/ "./node_modules/@angular/core/fesm5 lazy recursive":
/*!****************************************************************!*\
!*** ./node_modules/@angular/core/fesm5 lazy namespace object ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
function webpackEmptyAsyncContext(req) {
// Here Promise.resolve().then() is used instead of new Promise() to prevent
// uncaught exception popping up in devtools
return Promise.resolve().then(function() {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
});
}
webpackEmptyAsyncContext.keys = function() { return []; };
webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
module.exports = webpackEmptyAsyncContext;
webpackEmptyAsyncContext.id = "./node_modules/@angular/core/fesm5 lazy recursive";
/***/ }),
/***/ "./package.json":
/*!**********************!*\
!*** ./package.json ***!
\**********************/
/*! exports provided: //, name, version, scripts, husky, description, module, keywords, repository, bugs, license, dependencies, devDependencies, engines, default */
/***/ (function(module) {
module.exports = JSON.parse("{\"//\":\"limitations under the License.\",\"name\":\"nifi-fds\",\"version\":\"0.2.0\",\"scripts\":{\"start\":\"./node_modules/http-server/bin/http-server --gzip -p 28080 .\",\"build:webapp:bundle:development\":\"npm run webpack:development\",\"build:webapp:bundle:production\":\"npm run webpack:production\",\"clean:install\":\"bash ./scripts/clean-install\",\"clean:install:skipTests\":\"bash ./scripts/clean-install-skipTests\",\"dev:install\":\"bash ./scripts/dev-install\",\"dev:install:skipTests\":\"bash ./scripts/dev-install-skipTests\",\"publish\":\"bash ./scripts/npm-publish\",\"test\":\"karma start karma.conf.js --single-run\",\"test:dev\":\"karma start karma.conf.js\",\"watch\":\"npm run webpack:development && ./node_modules/.bin/webpack-dev-server --config webpack.dev.js\",\"webpack:analyze\":\"./node_modules/.bin/webpack-bundle-analyzer webpack-build-log.json ./\",\"webpack:development\":\"./node_modules/.bin/webpack --config webpack.dev.js\",\"webpack:production\":\"npm run lint && ./node_modules/.bin/webpack --config webpack.prod.js --json --progress --profile > webpack-build-log.json\",\"eslint\":\"./node_modules/.bin/eslint './webapp/**/*.js' './platform/**/*.js'\",\"stylelint\":\"./node_modules/.bin/stylelint './webapp/theming/**/*.scss' './platform/**/*.scss'\",\"lint\":\"npm run eslint && npm run stylelint\"},\"husky\":{\"hooks\":{\"pre-commit\":\"npm run lint\",\"pre-push\":\"npm run test\"}},\"description\":\"The Apache NiFi Flow Design System module is an atomic reusable platform providing consistent set of UI/UX components for open source friendly web applications to consume.\",\"module\":\"./platform/core/flow-design-system.module.js\",\"keywords\":[\"flow design system\",\"angular\",\"material\",\"material design\",\"components\",\"reusable\",\"nifi-fds\",\"covalent\"],\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/apache/nifi-fds.git\"},\"bugs\":{\"url\":\"https://github.com/apache/nifi-fds/issues\"},\"license\":\"Apache-2.0\",\"dependencies\":{\"@angular/animations\":\"8.1.1\",\"@angular/cdk\":\"8.1.0\",\"@angular/common\":\"8.1.1\",\"@angular/compiler\":\"8.1.1\",\"@angular/core\":\"8.1.1\",\"@angular/flex-layout\":\"8.0.0-beta.26\",\"@angular/forms\":\"8.1.1\",\"@angular/http\":\"8.0.0-beta.10\",\"@angular/material\":\"8.1.0\",\"@angular/platform-browser\":\"8.1.1\",\"@angular/platform-browser-dynamic\":\"8.1.1\",\"@angular/router\":\"8.1.1\",\"@covalent/core\":\"2.1.0\",\"detect-libc\":\"1.0.3\",\"font-awesome\":\"4.7.0\",\"hammerjs\":\"2.0.8\",\"jquery\":\"3.4.1\",\"roboto-fontface\":\"0.10.0\",\"rxjs\":\"6.5.2\",\"zone.js\":\"0.9.1\"},\"devDependencies\":{\"@babel/core\":\"7.5.4\",\"@babel/preset-env\":\"7.5.4\",\"@babel/runtime\":\"7.5.4\",\"@types/core-js\":\"2.5.2\",\"@typescript-eslint/eslint-plugin\":\"1.12.0\",\"@typescript-eslint/parser\":\"1.12.0\",\"babel-eslint\":\"10.0.2\",\"babel-loader\":\"8.0.6\",\"babel-plugin-istanbul\":\"5.1.4\",\"babel-polyfill\":\"6.26.0\",\"cache-loader\":\"4.0.1\",\"compression-webpack-plugin\":\"3.0.0\",\"css-loader\":\"3.0.0\",\"dtsgenerator\":\"2.0.8\",\"eslint\":\"6.0.1\",\"eslint-config-airbnb\":\"17.1.1\",\"eslint-plugin-import\":\"2.18.0\",\"eslint-plugin-jsx-a11y\":\"6.2.3\",\"eslint-plugin-react\":\"7.14.2\",\"file-loader\":\"4.0.0\",\"grunt\":\"1.0.4\",\"grunt-bump\":\"0.8.0\",\"grunt-cli\":\"1.3.2\",\"html-loader\":\"0.5.5\",\"html-webpack-plugin\":\"3.2.0\",\"http-server\":\"0.11.1\",\"husky\":\"3.0.0\",\"istanbul-instrumenter-loader\":\"3.0.1\",\"jasmine\":\"3.4.0\",\"karma\":\"4.2.0\",\"karma-chrome-launcher\":\"3.0.0\",\"karma-cli\":\"2.0.0\",\"karma-coverage\":\"1.1.2\",\"karma-coverage-istanbul-reporter\":\"2.0.5\",\"karma-jasmine\":\"2.0.1\",\"karma-jasmine-html-reporter\":\"1.4.2\",\"karma-spec-reporter\":\"0.0.32\",\"karma-webpack\":\"4.0.2\",\"license-webpack-plugin\":\"2.1.1\",\"load-grunt-tasks\":\"5.0.0\",\"mini-css-extract-plugin\":\"0.7.0\",\"node-sass\":\"4.12.0\",\"null-loader\":\"3.0.0\",\"optimize-css-assets-webpack-plugin\":\"5.0.3\",\"sass-loader\":\"7.1.0\",\"style-loader\":\"0.23.1\",\"stylelint\":\"10.1.0\",\"stylelint-config-standard\":\"18.3.0\",\"terser-webpack-plugin\":\"1.3.0\",\"ts-loader\":\"6.0.4\",\"typescript\":\"3.5.3\",\"webpack\":\"4.35.3\",\"webpack-bundle-analyzer\":\"3.3.2\",\"webpack-cli\":\"3.3.6\",\"webpack-dev-server\":\"3.7.2\",\"webpack-fix-style-only-entries\":\"0.3.0\",\"webpack-merge\":\"4.2.1\"},\"engines\":{\"node\":\"=8.10.0\",\"npm\":\"=5.6.0\"}}");
/***/ }),
/***/ "./platform/core/common/fds-common.module.js":
/*!***************************************************!*\
!*** ./platform/core/common/fds-common.module.js ***!
\***************************************************/
/*! exports provided: FdsCommonsModule, FdsStorageService */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsCommonsModule", function() { return FdsCommonsModule; });
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var _services_fds_storage_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./services/fds-storage.service */ "./platform/core/common/services/fds-storage.service.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsStorageService", function() { return _services_fds_storage_service__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* FdsCommonsModule constructor.
*
* @constructor
*/
function FdsCommonsModule() {}
FdsCommonsModule.prototype = {
constructor: FdsCommonsModule
};
FdsCommonsModule.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"]({
imports: [],
declarations: [],
exports: [],
providers: [_services_fds_storage_service__WEBPACK_IMPORTED_MODULE_1__["default"]]
})];
/***/ }),
/***/ "./platform/core/common/fds.animations.js":
/*!************************************************!*\
!*** ./platform/core/common/fds.animations.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _angular_animations__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/animations */ "./node_modules/@angular/animations/fesm5/animations.js");
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* FdsAnimations constructor.
*
* @constructor
*/
function FdsAnimations() {}
FdsAnimations.prototype = {
constructor: FdsAnimations,
/**
* Fade animation
*/
fadeAnimation: Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["trigger"])('routeAnimation', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["state"])('*', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
opacity: 1
})), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(':enter', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
opacity: 0
}), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-in')]), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(':leave', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-out', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
opacity: 0
}))])]),
/**
* Slide in from the left animation
*/
slideInLeftAnimation: Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["trigger"])('routeAnimation', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["state"])('*', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
opacity: 1,
transform: 'translateX(0)'
})), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(':enter', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
opacity: 0,
transform: 'translateX(-100%)'
}), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-in')]), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(':leave', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-out', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
opacity: 0,
transform: 'translateX(100%)'
}))])]),
/**
* Slide in from the top animation
*/
slideInDownAnimation: Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["trigger"])('routeAnimation', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["state"])('*', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
opacity: 1,
transform: 'translateY(0)'
})), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(':enter', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
opacity: 0,
transform: 'translateY(-100%)'
}), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-in')]), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(':leave', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-out', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
opacity: 0,
transform: 'translateY(100%)'
}))])]),
/**
* Fly in/out animation
*/
flyInOutAnimation: Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["trigger"])('flyInOut', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["state"])('in', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
transform: 'translateX(0)'
})), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('void => *', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
transform: 'translateX(100%)'
}), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.4s 0.1s ease-in')]), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('* => void', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.2s ease-out', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
transform: 'translateX(-100%)'
})))]),
/**
* Fly in/out animation
*/
fadeInOutAnimation: Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["trigger"])('fadeInOut', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["state"])('in', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
opacity: 1
})), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('void => *', [Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
opacity: 0
}), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s 0.1s ease-in')]), Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('* => void', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])('0.5s ease-out', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({
opacity: 0
})))])
};
/* harmony default export */ __webpack_exports__["default"] = (new FdsAnimations());
/***/ }),
/***/ "./platform/core/common/services/fds-storage.service.js":
/*!**************************************************************!*\
!*** ./platform/core/common/services/fds-storage.service.js ***!
\**************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Store items for two days before being eligible for removal.
var MILLIS_PER_DAY = 86400000;
var TWO_DAYS = MILLIS_PER_DAY * 2;
var isUndefined = function isUndefined(obj) {
return typeof obj === 'undefined';
};
var isNull = function isNull(obj) {
return obj === null;
};
var isDefinedAndNotNull = function isDefinedAndNotNull(obj) {
return !isUndefined(obj) && !isNull(obj);
};
/**
* Checks the expiration for the specified entry.
*
* @param {object} entry
* @returns {boolean}
*/
var checkExpiration = function checkExpiration(entry) {
if (isDefinedAndNotNull(entry.expires)) {
// get the expiration
var expires = new Date(entry.expires);
var now = new Date(); // return whether the expiration date has passed
return expires.valueOf() < now.valueOf();
}
return false;
};
/**
* Gets an enty for the key. The entry expiration is not checked.
*
* @param {string} key
*/
var getEntry = function getEntry(key) {
try {
// parse the entry
var entry = JSON.parse(localStorage.getItem(key)); // ensure the entry and item are present
if (isDefinedAndNotNull(entry)) {
return entry;
}
return null;
} catch (e) {
return null;
}
};
/**
* FdsStorageService constructor.
* @constructor
*/
function FdsStorageService() {}
FdsStorageService.prototype = {
constructor: FdsStorageService,
/**
* Initializes the storage. Items will be persisted for two days. Once the scripts runs
* thereafter, all eligible items will be removed. This strategy does not support persistence.
*/
init: function init() {
for (var i = 0; i < localStorage.length; i++) {
try {
// get the next item
var key = localStorage.key(i); // attempt to get the item which will expire if necessary
this.getItem(key);
} catch (e) {// Do nothing
}
}
},
/**
* Stores the specified item.
*
* @param {string} key
* @param {object} item
* @param {integer} expires
*/
setItem: function setItem(key, item, expires) {
// calculate the expiration
expires = isDefinedAndNotNull(expires) ? expires : new Date().valueOf() + TWO_DAYS; // create the entry
var entry = {
expires: expires,
item: item
}; // store the item
localStorage.setItem(key, JSON.stringify(entry));
},
/**
* Returns whether there is an entry for this key. This will not check the expiration. If
* the entry is expired, it will return null on a subsequent getItem invocation.
*
* @param {string} key
* @returns {boolean}
*/
hasItem: function hasItem(key) {
return getEntry(key) !== null;
},
/**
* Gets the item with the specified key. If an item with this key does
* not exist, null is returned. If an item exists but cannot be parsed
* or is malformed/unrecognized, null is returned.
*
* @param {type} key
*/
getItem: function getItem(key) {
var entry = getEntry(key);
if (entry === null) {
return null;
} // if the entry is expired, drop it and return null
if (checkExpiration(entry)) {
this.removeItem(key);
return null;
} // if the entry has the specified field return its value
if (isDefinedAndNotNull(entry['item'])) {
return entry['item'];
}
return null;
},
/**
* Gets the expiration for the specified item. This will not check the expiration. If
* the entry is expired, it will return null on a subsequent getItem invocation.
*
* @param {string} key
* @returns {integer}
*/
getItemExpiration: function getItemExpiration(key) {
var entry = getEntry(key);
if (entry === null) {
return null;
} // if the entry has the specified field return its value
if (isDefinedAndNotNull(entry['expires'])) {
return entry['expires'];
}
return null;
},
/**
* Extracts the subject from the specified jwt. If the jwt is not as expected
* an empty string is returned.
*
* @param {string} jwt
* @returns {string}
*/
getJwtPayload: function getJwtPayload(jwt) {
if (isDefinedAndNotNull(jwt)) {
var segments = jwt.split(/\./);
if (segments.length !== 3) {
return '';
}
var rawPayload = window.atob(segments[1]);
var payload = JSON.parse(rawPayload);
if (isDefinedAndNotNull(payload)) {
return payload;
}
return null;
}
return null;
},
/**
* Removes the item with the specified key.
*
* @param {type} key
*/
removeItem: function removeItem(key) {
localStorage.removeItem(key);
}
};
FdsStorageService.parameters = [];
/* harmony default export */ __webpack_exports__["default"] = (FdsStorageService);
/***/ }),
/***/ "./platform/core/dialogs/confirm-dialog/confirm-dialog.component.html":
/*!****************************************************************************!*\
!*** ./platform/core/dialogs/confirm-dialog/confirm-dialog.component.html ***!
\****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<fds-dialog>\n <fds-dialog-title *ngIf=\"title\">\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n {{title}}\n <button mat-icon-button (click)=\"cancel()\">\n <mat-icon color=\"primary\">close</mat-icon>\n </button>\n </div>\n </fds-dialog-title>\n <fds-dialog-content class=\"md-subhead tc-grey-700\">\n {{message}}\n </fds-dialog-content>\n <fds-dialog-actions>\n <button *ngIf=\"cancelButton\" mat-raised-button\n color=\"{{cancelButtonColor}}\"\n #closeBtn\n (keydown.arrowright)=\"acceptBtn.focus()\"\n (click)=\"cancel()\">{{cancelButton}}\n </button>\n <button *ngIf=\"acceptButton\" mat-raised-button\n color=\"{{acceptButtonColor}}\"\n #acceptBtn\n (keydown.arrowleft)=\"closeBtn.focus()\"\n (click)=\"accept()\"\n class=\"push-left-sm\">{{acceptButton}}\n </button>\n </fds-dialog-actions>\n</fds-dialog>";
/***/ }),
/***/ "./platform/core/dialogs/confirm-dialog/confirm-dialog.component.js":
/*!**************************************************************************!*\
!*** ./platform/core/dialogs/confirm-dialog/confirm-dialog.component.js ***!
\**************************************************************************/
/*! exports provided: FdsConfirmDialogComponent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsConfirmDialogComponent", function() { return FdsConfirmDialogComponent; });
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* FdsConfirmDialogComponent constructor.
*
* @constructor
*/
function FdsConfirmDialogComponent() {
this.title = '';
this.message = '';
this.acceptButton = '';
this.acceptButtonColor = 'fds-primary';
this.cancelButton = '';
this.cancelButtonColor = 'fds-regular';
this.dialogRef = undefined;
this.viewContainerRef = undefined;
this.disableClose = true;
}
FdsConfirmDialogComponent.prototype = {
constructor: FdsConfirmDialogComponent,
/**
* Close the dialog and send a cancel response to any subscribers.
*/
cancel: function cancel() {
this.dialogRef.close(false);
},
/**
* Close the dialog and send an accept response to any subscribers.
*/
accept: function accept() {
this.dialogRef.close(true);
}
};
FdsConfirmDialogComponent.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"]({
selector: 'fds-confirm-dialog',
template: __webpack_require__(/*! ./confirm-dialog.component.html */ "./platform/core/dialogs/confirm-dialog/confirm-dialog.component.html")})];
FdsConfirmDialogComponent.parameters = [];
/***/ }),
/***/ "./platform/core/dialogs/fds-dialog.component.html":
/*!*********************************************************!*\
!*** ./platform/core/dialogs/fds-dialog.component.html ***!
\*********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<div class=\"fds-dialog-wrapper\">\n <h3 class=\"fds-dialog-title md-title\" *ngIf=\"dialogTitle.length > 0\">\n <ng-content select=\"fds-dialog-title\"></ng-content>\n </h3>\n <div class=\"fds-dialog-content pad-bottom-md\" *ngIf=\"dialogContent.length > 0\">\n <ng-content select=\"fds-dialog-content\"></ng-content>\n </div>\n <div class=\"fds-dialog-actions\" *ngIf=\"dialogActions.length > 0\" layout=\"row\">\n <span flex></span>\n <ng-content select=\"fds-dialog-actions\"></ng-content>\n </div>\n</div>\n";
/***/ }),
/***/ "./platform/core/dialogs/fds-dialog.component.js":
/*!*******************************************************!*\
!*** ./platform/core/dialogs/fds-dialog.component.js ***!
\*******************************************************/
/*! exports provided: FdsDialogTitleDirective, FdsDialogContentDirective, FdsDialogActionsDirective, FdsDialogComponent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsDialogTitleDirective", function() { return FdsDialogTitleDirective; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsDialogContentDirective", function() { return FdsDialogContentDirective; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsDialogActionsDirective", function() { return FdsDialogActionsDirective; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsDialogComponent", function() { return FdsDialogComponent; });
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function FdsDialogTitleDirective() {}
FdsDialogTitleDirective.prototype = {
contstructor: FdsDialogTitleDirective
};
FdsDialogTitleDirective.decorators = [{
type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
args: [{
selector: 'fds-dialog-title'
}]
}];
function FdsDialogContentDirective() {}
FdsDialogContentDirective.prototype = {
contstructor: FdsDialogContentDirective
};
FdsDialogContentDirective.decorators = [{
type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
args: [{
selector: 'fds-dialog-content'
}]
}];
function FdsDialogActionsDirective() {}
FdsDialogActionsDirective.prototype = {
contstructor: FdsDialogActionsDirective
};
FdsDialogActionsDirective.decorators = [{
type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
args: [{
selector: 'fds-dialog-actions'
}]
}];
/**
* FdsDialogComponent constructor
*
* @constructor
*/
function FdsDialogComponent() {
this.dialogTitle = '';
this.dialogContent = '';
this.dialogActions = '';
}
FdsDialogComponent.prototype = {
constructor: FdsDialogComponent,
/**
* Respond after Angular projects external content into the component's view.
*/
ngAfterContentInit: function ngAfterContentInit() {
if (this.dialogTitle.length > 1) {
throw new Error('Duplicate fds-dialog-title component at in fds-dialog.');
}
if (this.dialogContent.length > 1) {
throw new Error('Duplicate fds-dialog-content component at in fds-dialog.');
}
if (this.dialogActions.length > 1) {
throw new Error('Duplicate fds-dialog-actions component at in fds-dialog.');
}
}
};
FdsDialogComponent.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"]({
selector: 'fds-dialog',
template: __webpack_require__(/*! ./fds-dialog.component.html */ "./platform/core/dialogs/fds-dialog.component.html"),
queries: {
dialogTitle: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"](FdsDialogTitleDirective),
dialogContent: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"](FdsDialogContentDirective),
dialogActions: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"](FdsDialogActionsDirective)
}
})];
FdsDialogComponent.parameters = [];
/***/ }),
/***/ "./platform/core/dialogs/fds-dialogs.module.js":
/*!*****************************************************!*\
!*** ./platform/core/dialogs/fds-dialogs.module.js ***!
\*****************************************************/
/*! exports provided: FdsDialogsModule, IConfirmConfig, FdsDialogService, FdsDialogComponent, FdsDialogTitleDirective, FdsDialogContentDirective, FdsDialogActionsDirective, FdsConfirmDialogComponent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsDialogsModule", function() { return FdsDialogsModule; });
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var _angular_flex_layout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/flex-layout */ "./node_modules/@angular/flex-layout/esm5/flex-layout.es5.js");
/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/fesm5/common.js");
/* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js");
/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/fesm5/forms.js");
/* harmony import */ var _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fds-dialog.component */ "./platform/core/dialogs/fds-dialog.component.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogComponent", function() { return _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogComponent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogTitleDirective", function() { return _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogTitleDirective"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogContentDirective", function() { return _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogContentDirective"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogActionsDirective", function() { return _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogActionsDirective"]; });
/* harmony import */ var _services_dialog_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./services/dialog.service */ "./platform/core/dialogs/services/dialog.service.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IConfirmConfig", function() { return _services_dialog_service__WEBPACK_IMPORTED_MODULE_6__["IConfirmConfig"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogService", function() { return _services_dialog_service__WEBPACK_IMPORTED_MODULE_6__["FdsDialogService"]; });
/* harmony import */ var _confirm_dialog_confirm_dialog_component__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./confirm-dialog/confirm-dialog.component */ "./platform/core/dialogs/confirm-dialog/confirm-dialog.component.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsConfirmDialogComponent", function() { return _confirm_dialog_confirm_dialog_component__WEBPACK_IMPORTED_MODULE_7__["FdsConfirmDialogComponent"]; });
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var FDS_DIALOGS = [_fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogComponent"], _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogTitleDirective"], _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogActionsDirective"], _fds_dialog_component__WEBPACK_IMPORTED_MODULE_5__["FdsDialogContentDirective"], _confirm_dialog_confirm_dialog_component__WEBPACK_IMPORTED_MODULE_7__["FdsConfirmDialogComponent"]];
var FDS_DIALOGS_ENTRY_COMPONENTS = [_confirm_dialog_confirm_dialog_component__WEBPACK_IMPORTED_MODULE_7__["FdsConfirmDialogComponent"]];
/**
* FdsDialogsModule constructor.
*
* @constructor
*/
function FdsDialogsModule() {}
FdsDialogsModule.prototype = {
constructor: FdsDialogsModule
};
FdsDialogsModule.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"]({
imports: [_angular_flex_layout__WEBPACK_IMPORTED_MODULE_1__["FlexLayoutModule"], _angular_forms__WEBPACK_IMPORTED_MODULE_4__["FormsModule"], _angular_common__WEBPACK_IMPORTED_MODULE_2__["CommonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatDialogModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatInputModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatButtonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatIconModule"]],
declarations: [FDS_DIALOGS],
exports: [FDS_DIALOGS],
providers: [_services_dialog_service__WEBPACK_IMPORTED_MODULE_6__["FdsDialogService"]],
entryComponents: [FDS_DIALOGS_ENTRY_COMPONENTS]
})];
/***/ }),
/***/ "./platform/core/dialogs/services/dialog.service.js":
/*!**********************************************************!*\
!*** ./platform/core/dialogs/services/dialog.service.js ***!
\**********************************************************/
/*! exports provided: IDialogConfig, IConfirmConfig, FdsDialogService */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IDialogConfig", function() { return IDialogConfig; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IConfirmConfig", function() { return IConfirmConfig; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsDialogService", function() { return FdsDialogService; });
/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js");
/* harmony import */ var _confirm_dialog_confirm_dialog_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../confirm-dialog/confirm-dialog.component */ "./platform/core/dialogs/confirm-dialog/confirm-dialog.component.js");
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function IDialogConfig() {
this.title = '';
this.message = '';
this.dialogRef = undefined;
this.viewContainerRef = undefined;
this.disableClose = true;
}
IDialogConfig.prototype = {
contstructor: IDialogConfig
};
jquery__WEBPACK_IMPORTED_MODULE_0___default.a.extend(IDialogConfig, _angular_material__WEBPACK_IMPORTED_MODULE_1__["MatDialogConfig"]);
function IConfirmConfig() {
this.acceptButton = 'ACCEPT';
this.acceptButtonColor = 'fds-primary';
this.cancelButton = 'CANCEL';
this.cancelButtonColor = 'fds-secondary';
}
IConfirmConfig.prototype = {
contstructor: IConfirmConfig
};
jquery__WEBPACK_IMPORTED_MODULE_0___default.a.extend(IConfirmConfig, IDialogConfig);
function createConfig(config) {
var dialogConfig = new IConfirmConfig();
dialogConfig.viewContainerRef = config.viewContainerRef;
dialogConfig.disableClose = config.disableClose;
return dialogConfig;
}
/**
* FdsDialogService constructor.
*
* @param MatDialog The angular material MatDialog.
* @constructor
*/
function FdsDialogService(MatDialog) {
this.dialogService = MatDialog;
}
FdsDialogService.prototype = {
contstructor: FdsDialogService,
/**
* Wrapper function over the open() method in MatDialog.
* Opens a modal dialog containing the given component.
*
* @param component The angular ComponentType<T>.
* @param config The angular material MatDialogConfig.
*
* @returns {MatDialoRef} The reference to the dialog.
*/
open: function open(component, config) {
return this.dialogService.open(component, config);
},
/**
* Wrapper function over the closeAll() method in MatDialog.
* Closes all of the currently-open dialogs.
*/
closeAll: function closeAll() {
this.dialogService.closeAll();
},
/**
* Opens a confirm dialog with the provided config.
*
* @param config IConfirmConfig {
* message?: string;
* title?: string;
* dialogRef?: MatDialoRef;
* viewContainerRef?: ViewContainerRef;
* disableClose?: boolean;
* acceptButton?: string;
* acceptButtonColor?: string;
* cancelButton?: string;
* cancelButtonColor?: string;
* }
*
* @returns {MatDialoRef} The reference to the dialog.
*/
openConfirm: function openConfirm(config) {
var dialogConfig = createConfig(config);
var dialogRef = this.dialogService.open(_confirm_dialog_confirm_dialog_component__WEBPACK_IMPORTED_MODULE_2__["FdsConfirmDialogComponent"], dialogConfig);
var confirmDialogComponent = dialogRef.componentInstance;
confirmDialogComponent.dialogRef = dialogRef;
if (config.title) {
confirmDialogComponent.title = config.title;
}
if (config.message) {
confirmDialogComponent.message = config.message;
}
if (config.acceptButton) {
confirmDialogComponent.acceptButton = config.acceptButton;
}
if (config.acceptButtonColor) {
confirmDialogComponent.acceptButtonColor = config.acceptButtonColor;
}
if (config.cancelButton) {
confirmDialogComponent.cancelButton = config.cancelButton;
}
if (config.cancelButtonColor) {
confirmDialogComponent.cancelButtonColor = config.cancelButtonColor;
}
return dialogRef;
}
};
FdsDialogService.parameters = [_angular_material__WEBPACK_IMPORTED_MODULE_1__["MatDialog"]];
/***/ }),
/***/ "./platform/core/flow-design-system.module.js":
/*!****************************************************!*\
!*** ./platform/core/flow-design-system.module.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var _angular_flex_layout__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/flex-layout */ "./node_modules/@angular/flex-layout/esm5/flex-layout.es5.js");
/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/fesm5/common.js");
/* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js");
/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/platform-browser */ "./node_modules/@angular/platform-browser/fesm5/platform-browser.js");
/* harmony import */ var _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/platform-browser/animations */ "./node_modules/@angular/platform-browser/fesm5/animations.js");
/* harmony import */ var _covalent_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @covalent/core */ "./node_modules/@covalent/core/fesm5/covalent-core.js");
/* harmony import */ var _covalent_core_steps__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @covalent/core/steps */ "./node_modules/@covalent/core/fesm5/covalent-core-steps.js");
/* harmony import */ var _covalent_core_data_table__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @covalent/core/data-table */ "./node_modules/@covalent/core/fesm5/covalent-core-data-table.js");
/* harmony import */ var _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./dialogs/fds-dialogs.module */ "./platform/core/dialogs/fds-dialogs.module.js");
/* harmony import */ var _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./snackbars/fds-snackbars.module */ "./platform/core/snackbars/fds-snackbars.module.js");
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* FlowDesignSystemModule constructor.
*
* @constructor
*/
function FlowDesignSystemModule() {
jquery__WEBPACK_IMPORTED_MODULE_0___default()(document).ready(function () {
//add fds attr to body tag to allow fine grain style overrides
document.body.setAttribute('fds', ''); //override the hover styles for checkbox borders
jquery__WEBPACK_IMPORTED_MODULE_0___default()(document.body).on('mouseenter', '.mat-checkbox-inner-container', function () {
jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).find('.mat-checkbox-frame').css('border-color', '#1491C1');
});
jquery__WEBPACK_IMPORTED_MODULE_0___default()(document.body).on('mouseleave', '.mat-checkbox-inner-container', function () {
jquery__WEBPACK_IMPORTED_MODULE_0___default()(this).find('.mat-checkbox-frame').css('border-color', '#DDDDDD');
});
});
}
FlowDesignSystemModule.prototype = {
constructor: FlowDesignSystemModule
};
FlowDesignSystemModule.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgModule"]({
imports: [_angular_flex_layout__WEBPACK_IMPORTED_MODULE_2__["FlexLayoutModule"], _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_6__["BrowserAnimationsModule"], _angular_common__WEBPACK_IMPORTED_MODULE_3__["CommonModule"], _angular_platform_browser__WEBPACK_IMPORTED_MODULE_5__["BrowserModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatAutocompleteModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatButtonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatButtonToggleModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatCardModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatCheckboxModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatChipsModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatDatepickerModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatDialogModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatExpansionModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatFormFieldModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatGridListModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatIconModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatInputModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatListModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatMenuModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatProgressBarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatProgressSpinnerModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatRadioModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSelectModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSlideToggleModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSliderModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSidenavModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSnackBarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatStepperModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatTabsModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatToolbarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatTooltipModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatPaginatorModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSortModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatTableModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentCommonModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentChipsModule"], _covalent_core_steps__WEBPACK_IMPORTED_MODULE_8__["CovalentStepsModule"], _covalent_core_data_table__WEBPACK_IMPORTED_MODULE_9__["CovalentDataTableModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentDialogsModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentExpansionPanelModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentPagingModule"], _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_10__["FdsDialogsModule"], _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_11__["FdsSnackBarsModule"]],
exports: [_angular_flex_layout__WEBPACK_IMPORTED_MODULE_2__["FlexLayoutModule"], _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_6__["BrowserAnimationsModule"], _angular_common__WEBPACK_IMPORTED_MODULE_3__["CommonModule"], _angular_platform_browser__WEBPACK_IMPORTED_MODULE_5__["BrowserModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatAutocompleteModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatButtonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatButtonToggleModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatCardModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatCheckboxModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatChipsModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatDatepickerModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatDialogModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatExpansionModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatFormFieldModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatGridListModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatIconModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatInputModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatListModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatMenuModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatProgressBarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatProgressSpinnerModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatRadioModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSelectModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSlideToggleModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSliderModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSidenavModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSnackBarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatStepperModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatTabsModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatToolbarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatTooltipModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatPaginatorModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatSortModule"], _angular_material__WEBPACK_IMPORTED_MODULE_4__["MatTableModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentCommonModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentChipsModule"], _covalent_core_steps__WEBPACK_IMPORTED_MODULE_8__["CovalentStepsModule"], _covalent_core_data_table__WEBPACK_IMPORTED_MODULE_9__["CovalentDataTableModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentDialogsModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentExpansionPanelModule"], _covalent_core__WEBPACK_IMPORTED_MODULE_7__["CovalentPagingModule"], _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_10__["FdsDialogsModule"], _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_11__["FdsSnackBarsModule"]]
})];
/* harmony default export */ __webpack_exports__["default"] = (FlowDesignSystemModule);
/***/ }),
/***/ "./platform/core/index.js":
/*!********************************!*\
!*** ./platform/core/index.js ***!
\********************************/
/*! exports provided: FdsDialogsModule, FdsConfirmDialogComponent, FdsDialogActionsDirective, FdsDialogComponent, FdsDialogContentDirective, FdsDialogService, FdsDialogTitleDirective, IConfirmConfig, FdsCommonsModule, FdsStorageService, FdsAnimations, FdsCoasterComponent, FdsSnackBarActionsDirective, FdsSnackBarComponent, FdsSnackBarContentDirective, FdsSnackBarService, FdsSnackBarsModule, FdsSnackBarTitleDirective, ICoasterConfig, FdsCoreModule */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dialogs/fds-dialogs.module */ "./platform/core/dialogs/fds-dialogs.module.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogsModule", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsDialogsModule"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsConfirmDialogComponent", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsConfirmDialogComponent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogActionsDirective", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsDialogActionsDirective"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogComponent", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsDialogComponent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogContentDirective", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsDialogContentDirective"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogService", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsDialogService"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsDialogTitleDirective", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["FdsDialogTitleDirective"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IConfirmConfig", function() { return _dialogs_fds_dialogs_module__WEBPACK_IMPORTED_MODULE_0__["IConfirmConfig"]; });
/* harmony import */ var _common_fds_common_module__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./common/fds-common.module */ "./platform/core/common/fds-common.module.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsCommonsModule", function() { return _common_fds_common_module__WEBPACK_IMPORTED_MODULE_1__["FdsCommonsModule"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsStorageService", function() { return _common_fds_common_module__WEBPACK_IMPORTED_MODULE_1__["FdsStorageService"]; });
/* harmony import */ var _common_fds_animations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./common/fds.animations */ "./platform/core/common/fds.animations.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsAnimations", function() { return _common_fds_animations__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/* harmony import */ var _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./snackbars/fds-snackbars.module */ "./platform/core/snackbars/fds-snackbars.module.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsCoasterComponent", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsCoasterComponent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarActionsDirective", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarActionsDirective"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarComponent", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarComponent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarContentDirective", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarContentDirective"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarService", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarService"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarsModule", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarsModule"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarTitleDirective", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarTitleDirective"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ICoasterConfig", function() { return _snackbars_fds_snackbars_module__WEBPACK_IMPORTED_MODULE_3__["ICoasterConfig"]; });
/* harmony import */ var _flow_design_system_module__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./flow-design-system.module */ "./platform/core/flow-design-system.module.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsCoreModule", function() { return _flow_design_system_module__WEBPACK_IMPORTED_MODULE_4__["default"]; });
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/***/ }),
/***/ "./platform/core/snackbars/coaster/coaster.component.html":
/*!****************************************************************!*\
!*** ./platform/core/snackbars/coaster/coaster.component.html ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<fds-snackbar>\n <fds-snackbar-title *ngIf=\"title\">\n <button class=\"coaster-close-icon\" mat-icon-button (click)=\"cancel()\">\n <mat-icon color=\"primary\">close</mat-icon>\n </button>\n <i *ngIf=\"icon\" class=\"{{icon}} fds-coaster-icon\" aria-hidden=\"true\"></i>\n <div class=\"ellipsis\" fxLayout=\"row\" title=\"{{title}}\" fxLayoutAlign=\"space-between center\">\n {{title}}\n </div>\n </fds-snackbar-title>\n <fds-snackbar-content title=\"{{message}}\" class=\"fds-coaster-message tc-grey-700\">\n {{message}}\n </fds-snackbar-content>\n <fds-snackbar-actions>\n </fds-snackbar-actions>\n</fds-snackbar>\n";
/***/ }),
/***/ "./platform/core/snackbars/coaster/coaster.component.js":
/*!**************************************************************!*\
!*** ./platform/core/snackbars/coaster/coaster.component.js ***!
\**************************************************************/
/*! exports provided: FdsCoasterComponent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsCoasterComponent", function() { return FdsCoasterComponent; });
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* FdsCoasterComponent constructor.
*
* @constructor
*/
function FdsCoasterComponent() {
this.title = '';
this.message = '';
this.icon = '';
this.color = '';
this.snackBarRef = undefined;
this.viewContainerRef = undefined;
}
FdsCoasterComponent.prototype = {
constructor: FdsCoasterComponent,
/**
* Initialize the component.
*/
ngAfterViewChecked: function ngAfterViewChecked() {
jquery__WEBPACK_IMPORTED_MODULE_1___default()('.fds-snackbar-wrapper').css('border-color', this.color);
jquery__WEBPACK_IMPORTED_MODULE_1___default()('.fds-snackbar-title').css('color', this.color);
jquery__WEBPACK_IMPORTED_MODULE_1___default()('.fds-coaster-icon').css('color', this.color);
if (this.icon) {
jquery__WEBPACK_IMPORTED_MODULE_1___default()('.fds-snackbar-wrapper').css('padding', '15px 15px 15px 45px');
} else {
jquery__WEBPACK_IMPORTED_MODULE_1___default()('.fds-snackbar-wrapper').css('padding', '15px 15px 15px 15px');
}
},
/**
* Close the snackbar and send a cancel response to any subscribers.
*/
cancel: function cancel() {
this.snackBarRef.dismiss(false);
}
};
FdsCoasterComponent.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"]({
selector: 'fds-coaster',
template: __webpack_require__(/*! ./coaster.component.html */ "./platform/core/snackbars/coaster/coaster.component.html")})];
FdsCoasterComponent.parameters = [];
/***/ }),
/***/ "./platform/core/snackbars/fds-snackbar.component.html":
/*!*************************************************************!*\
!*** ./platform/core/snackbars/fds-snackbar.component.html ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<div class=\"fds-snackbar-wrapper\">\n <div class=\"fds-snackbar-title\" *ngIf=\"snackBarTitle.length > 0\">\n <ng-content select=\"fds-snackbar-title\"></ng-content>\n </div>\n <div class=\"fds-snackbar-content\" *ngIf=\"snackBarContent.length > 0\">\n <ng-content select=\"fds-snackbar-content\"></ng-content>\n </div>\n <div class=\"fds-snackbar-actions\" *ngIf=\"snackBarActions.length > 0\" layout=\"row\">\n <span flex></span>\n <ng-content select=\"fds-snackbar-actions\"></ng-content>\n </div>\n</div>\n";
/***/ }),
/***/ "./platform/core/snackbars/fds-snackbar.component.js":
/*!***********************************************************!*\
!*** ./platform/core/snackbars/fds-snackbar.component.js ***!
\***********************************************************/
/*! exports provided: FdsSnackBarTitleDirective, FdsSnackBarContentDirective, FdsSnackBarActionsDirective, FdsSnackBarComponent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarTitleDirective", function() { return FdsSnackBarTitleDirective; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarContentDirective", function() { return FdsSnackBarContentDirective; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarActionsDirective", function() { return FdsSnackBarActionsDirective; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarComponent", function() { return FdsSnackBarComponent; });
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function FdsSnackBarTitleDirective() {}
FdsSnackBarTitleDirective.prototype = {
contstructor: FdsSnackBarTitleDirective
};
FdsSnackBarTitleDirective.decorators = [{
type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
args: [{
selector: 'fds-snackbar-title'
}]
}];
function FdsSnackBarContentDirective() {}
FdsSnackBarContentDirective.prototype = {
contstructor: FdsSnackBarContentDirective
};
FdsSnackBarContentDirective.decorators = [{
type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
args: [{
selector: 'fds-snackbar-content'
}]
}];
function FdsSnackBarActionsDirective() {}
FdsSnackBarActionsDirective.prototype = {
contstructor: FdsSnackBarActionsDirective
};
FdsSnackBarActionsDirective.decorators = [{
type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
args: [{
selector: 'fds-snackbar-actions'
}]
}];
/**
* FdsSnackBarComponent constructor
*
* @constructor
*/
function FdsSnackBarComponent() {
this.snackBarTitle = '';
this.snackBarContent = '';
this.snackBarActions = '';
}
FdsSnackBarComponent.prototype = {
constructor: FdsSnackBarComponent,
/**
* Respond after Angular projects external content into the component's view.
*/
ngAfterContentInit: function ngAfterContentInit() {
if (this.snackBarTitle.length > 1) {
throw new Error('Duplicate fds-snackbar-title component at in fds-snackbar.');
}
if (this.snackBarContent.length > 1) {
throw new Error('Duplicate fds-snackbar-content component at in fds-snackbar.');
}
if (this.snackBarActions.length > 1) {
throw new Error('Duplicate fds-snackbar-actions component at in fds-snackbar.');
}
}
};
FdsSnackBarComponent.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"]({
selector: 'fds-snackbar',
template: __webpack_require__(/*! ./fds-snackbar.component.html */ "./platform/core/snackbars/fds-snackbar.component.html"),
queries: {
snackBarTitle: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"](FdsSnackBarTitleDirective),
snackBarContent: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"](FdsSnackBarContentDirective),
snackBarActions: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"](FdsSnackBarActionsDirective)
}
})];
FdsSnackBarComponent.parameters = [];
/***/ }),
/***/ "./platform/core/snackbars/fds-snackbars.module.js":
/*!*********************************************************!*\
!*** ./platform/core/snackbars/fds-snackbars.module.js ***!
\*********************************************************/
/*! exports provided: FdsSnackBarsModule, ICoasterConfig, FdsSnackBarService, FdsSnackBarComponent, FdsSnackBarTitleDirective, FdsSnackBarContentDirective, FdsSnackBarActionsDirective, FdsCoasterComponent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarsModule", function() { return FdsSnackBarsModule; });
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var _angular_flex_layout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/flex-layout */ "./node_modules/@angular/flex-layout/esm5/flex-layout.es5.js");
/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/fesm5/common.js");
/* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js");
/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/fesm5/forms.js");
/* harmony import */ var _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fds-snackbar.component */ "./platform/core/snackbars/fds-snackbar.component.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarComponent", function() { return _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarComponent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarTitleDirective", function() { return _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarTitleDirective"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarContentDirective", function() { return _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarContentDirective"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarActionsDirective", function() { return _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarActionsDirective"]; });
/* harmony import */ var _services_snackbar_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./services/snackbar.service */ "./platform/core/snackbars/services/snackbar.service.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ICoasterConfig", function() { return _services_snackbar_service__WEBPACK_IMPORTED_MODULE_6__["ICoasterConfig"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarService", function() { return _services_snackbar_service__WEBPACK_IMPORTED_MODULE_6__["FdsSnackBarService"]; });
/* harmony import */ var _coaster_coaster_component__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./coaster/coaster.component */ "./platform/core/snackbars/coaster/coaster.component.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FdsCoasterComponent", function() { return _coaster_coaster_component__WEBPACK_IMPORTED_MODULE_7__["FdsCoasterComponent"]; });
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var FDS_SNACKBARS = [_fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarComponent"], _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarTitleDirective"], _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarActionsDirective"], _fds_snackbar_component__WEBPACK_IMPORTED_MODULE_5__["FdsSnackBarContentDirective"], _coaster_coaster_component__WEBPACK_IMPORTED_MODULE_7__["FdsCoasterComponent"]];
var FDS_SNACKBARS_ENTRY_COMPONENTS = [_coaster_coaster_component__WEBPACK_IMPORTED_MODULE_7__["FdsCoasterComponent"]];
/**
* FdsSnackBarsModule constructor.
*
* @constructor
*/
function FdsSnackBarsModule() {}
FdsSnackBarsModule.prototype = {
constructor: FdsSnackBarsModule
};
FdsSnackBarsModule.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"]({
imports: [_angular_flex_layout__WEBPACK_IMPORTED_MODULE_1__["FlexLayoutModule"], _angular_forms__WEBPACK_IMPORTED_MODULE_4__["FormsModule"], _angular_common__WEBPACK_IMPORTED_MODULE_2__["CommonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatSnackBarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatInputModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatButtonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_3__["MatIconModule"]],
declarations: [FDS_SNACKBARS],
exports: [FDS_SNACKBARS],
providers: [_services_snackbar_service__WEBPACK_IMPORTED_MODULE_6__["FdsSnackBarService"]],
entryComponents: [FDS_SNACKBARS_ENTRY_COMPONENTS]
})];
/***/ }),
/***/ "./platform/core/snackbars/services/snackbar.service.js":
/*!**************************************************************!*\
!*** ./platform/core/snackbars/services/snackbar.service.js ***!
\**************************************************************/
/*! exports provided: ISnackBarConfig, ICoasterConfig, FdsSnackBarService */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ISnackBarConfig", function() { return ISnackBarConfig; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ICoasterConfig", function() { return ICoasterConfig; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FdsSnackBarService", function() { return FdsSnackBarService; });
/* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js");
/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _coaster_coaster_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../coaster/coaster.component */ "./platform/core/snackbars/coaster/coaster.component.js");
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function ISnackBarConfig() {
this.title = '';
this.message = '';
this.snackBarRef = undefined;
this.viewContainerRef = undefined;
}
ISnackBarConfig.prototype = {
contstructor: ISnackBarConfig
};
jquery__WEBPACK_IMPORTED_MODULE_1___default.a.extend(ISnackBarConfig, _angular_material__WEBPACK_IMPORTED_MODULE_0__["MatSnackBarConfig"]);
function ICoasterConfig() {
this.icon = '';
this.color = '';
}
ICoasterConfig.prototype = {
contstructor: ICoasterConfig
};
jquery__WEBPACK_IMPORTED_MODULE_1___default.a.extend(ICoasterConfig, ISnackBarConfig);
/**
* FdsSnackBarService constructor.
*
* @param MatSnackBar The angular material MatSnackBar.
* @constructor
*/
function FdsSnackBarService(MatSnackBar) {
this.snackBarService = MatSnackBar;
}
FdsSnackBarService.prototype = {
contstructor: FdsSnackBarService,
/**
* Wrapper function over the open() method in MatSnackBar.
*
* @param message The message to show in the snackbar.
* @param action The label for the snackbar action.
* @param config Additional configuration options for the snackbar.
*
* @returns {MatSnackBarRef} The reference to the snackbar.
*/
open: function open(message, action, config) {
return this.snackBarService.open(message, action, config);
},
/**
* Wrapper function over the openFromComponent() method in MatSnackBar.
* Opens a snackbar containing the given component.
*
* @param component The angular ComponentType<T>.
* @param config The angular material MatSnackBarConfig.
*
* @returns {MatSnackBarRef} The reference to the snackbar.
*/
openFromComponent: function openFromComponent(component, config) {
return this.snackBarService.openFromComponent(component, config);
},
/**
* Wrapper function over the dismiss() method in MatSnackBar.
* Dismisses the currently-open snackbar.
*/
dismiss: function dismiss() {
this.snackBarService.dismiss();
},
/**
* Opens a coaster snackbar with the provided config.
*
* @param config ICoasterConfig {
* message?: string;
* title?: string;
* snackBarRef?: MatSnackBarRef;
* viewContainerRef?: ViewContainerRef;
* icon?: string;
* color?: string;
* }
*
* @returns {MatSnackBarRef} The reference to the snackbar.
*/
openCoaster: function openCoaster(config) {
var snackBarConfig = new ICoasterConfig();
snackBarConfig.verticalPosition = config.verticalPosition;
snackBarConfig.horizontalPosition = config.horizontalPosition;
snackBarConfig.duration = config.duration;
var snackBarRef = this.snackBarService.openFromComponent(_coaster_coaster_component__WEBPACK_IMPORTED_MODULE_2__["FdsCoasterComponent"], snackBarConfig);
var coasterComponent = snackBarRef.instance;
coasterComponent.snackBarRef = snackBarRef;
if (config.title) {
coasterComponent.title = config.title;
}
if (config.message) {
coasterComponent.message = config.message;
}
if (config.icon) {
coasterComponent.icon = config.icon;
}
if (config.color) {
coasterComponent.color = config.color;
}
return snackBarRef;
}
};
FdsSnackBarService.parameters = [_angular_material__WEBPACK_IMPORTED_MODULE_0__["MatSnackBar"]];
/***/ }),
/***/ "./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.html":
/*!********************************************************************************!*\
!*** ./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.html ***!
\********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<div>Hello Dialog!</div>\n";
/***/ }),
/***/ "./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.js":
/*!******************************************************************************!*\
!*** ./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.js ***!
\******************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js");
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* NfRegistryEditBucketPolicy constructor.
*
* @param nfRegistryApi The api service.
* @param nfRegistryService The nf-registry.service module.
* @param activatedRoute The angular route module.
* @param matDialogRef The angular material dialog ref.
* @param data The data passed into this component.
* @constructor
*/
function FdsDemoDialog(matDialogRef, data) {
// Services
this.dialogRef = matDialogRef;
this.data = data;
}
FdsDemoDialog.prototype = {
constructor: FdsDemoDialog,
/**
* Cancel creation of a new policy and close dialog.
*/
cancel: function cancel() {
this.dialogRef.close();
}
};
FdsDemoDialog.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"]({
template: __webpack_require__(/*! ./fds-demo-dialog.html */ "./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.html")})];
FdsDemoDialog.parameters = [_angular_material__WEBPACK_IMPORTED_MODULE_0__["MatDialogRef"], _angular_material__WEBPACK_IMPORTED_MODULE_0__["MAT_DIALOG_DATA"]];
/* harmony default export */ __webpack_exports__["default"] = (FdsDemoDialog);
/***/ }),
/***/ "./webapp/components/flow-design-system/fds-demo.html":
/*!************************************************************!*\
!*** ./webapp/components/flow-design-system/fds-demo.html ***!
\************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<mat-sidenav-container>\n <mat-sidenav #sidenav mode=\"over\" position=\"end\" opened=\"false\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between center\">\n <p>You can also open a dialog from a side nav.</p>\n <button mat-raised-button color=\"fds-primary\" (click)=\"openDialog()\">Show simple dialog</button>\n </div>\n </mat-sidenav>\n <div id=\"fds-demo\">\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\">Apache NiFi Flow Design System</mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content class=\"pad-top-sm\">\n <p>With the Apache NiFi Flow Design System module, we get an atomic, reusable component platform for\n Apache NiFi and its sub-projects to consume, while collaborating in an open source model. This\n module packages the <a class=\"link\" href=\"https://material.angular.io/components\" target=\"_blank\">Angular\n Material</a> module as well as the <a class=\"link\"\n href=\"https://teradata.github.io/covalent/#/components\"\n target=\"_blank\">Teradata Covalent</a> module. These\n modules have been themed to match the FDS color palette.</p>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Typography\">Typography <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Typography\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <p class=\"mat-body-1\">FDS provides typography CSS classes you can use to create visual consistency across your application. Optionally style tags with the classes shown below:</p>\n <div layout-align=\"center end\">\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-display-4</code>\n <span class=\"mat-display-4\">Display 4</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-display-3</code>\n <span class=\"mat-display-3\">Display 3</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-display-2</code>\n <span class=\"mat-display-2\">Display 2</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-display-1</code>\n <span class=\"mat-display-1\">Display 1</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-headline</code>\n <span class=\"mat-headline\">Headline</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.md-title</code>\n <span class=\"md-title\">Title</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.md-subhead</code>\n <span class=\"md-subhead\">Subhead</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.link</code>\n <span class=\"link\">Link</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-body-1</code>\n <span class=\"mat-body-1\">Body 1</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-body-2</code>\n <span class=\"mat-body-2\">Body 2</span>\n </div>\n <div layout=\"row\" layout-align=\"start center\">\n <code flex=\"15\">.mat-caption</code>\n <span class=\"mat-caption\">Caption</span>\n </div>\n </div>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <span class=\"mat-display-4\">Display 4</span>\n <span class=\"mat-display-3\">Display 3</span>\n <span class=\"mat-display-2\">Display 2</span>\n <span class=\"mat-display-1\">Display 1</span>\n <span class=\"mat-headline\">Headline</span>\n <span class=\"md-title\">Title</span>\n <span class=\"md-subhead\">Subhead</span>\n <span class=\"link\">Link</span>\n <span class=\"mat-body-1\">Body 1</span>\n <span class=\"mat-body-2\">Body 2</span>\n <span class=\"mat-caption\">Caption</span>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"RaisedButtons\">Raised Buttons <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"RaisedButtons\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <p>Tip: Use UPPERCASE text for 1-2 words, and Titlecase text for 3+ words.</p>\n <button mat-raised-button color=\"primary\">Primary</button>\n <button mat-raised-button color=\"accent\">Accent</button>\n <button mat-raised-button color=\"warn\">Warn</button>\n <button mat-raised-button color=\"fds-primary\">FDS Primary</button>\n <button mat-raised-button color=\"fds-secondary\">FDS Secondary</button>\n <button mat-raised-button color=\"fds-regular\">FDS regular</button>\n <button mat-raised-button color=\"fds-warn\">FDS warn</button>\n <button mat-raised-button color=\"fds-critical\">FDS critical</button>\n <button mat-raised-button disabled color=\"primary\">Primary</button>\n <button mat-raised-button disabled color=\"accent\">Accent</button>\n <button mat-raised-button disabled color=\"warn\">Warn</button>\n <button mat-raised-button disabled color=\"fds-primary\">FDS primary</button>\n <button mat-raised-button disabled color=\"fds-secondary\">FDS Secondary</button>\n <button mat-raised-button disabled color=\"fds-regular\">FDS regular</button>\n <button mat-raised-button disabled color=\"fds-warn\">FDS warn</button>\n <button mat-raised-button disabled color=\"fds-critical\">FDS critical</button>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Themed Raised Buttons -->\n <button mat-raised-button color=\"primary\">Primary</button>\n <button mat-raised-button color=\"accent\">Secondary</button>\n <button mat-raised-button color=\"warn\">warn</button>\n <button mat-raised-button color=\"fds-primary\">FDS Primary</button>\n <button mat-raised-button color=\"fds-secondary\">FDS Secondary</button>\n <button mat-raised-button color=\"fds-regular\">FDS regular</button>\n <button mat-raised-button color=\"fds-warn\">FDS warn</button>\n <button mat-raised-button color=\"fds-critical\">FDS critical</button>\n <!-- Disabled Raised Buttons -->\n <button mat-raised-button disabled color=\"primary\">Primary</button>\n <button mat-raised-button disabled color=\"accent\">Secondary</button>\n <button mat-raised-button disabled color=\"warn\">warn</button>\n <button mat-raised-button disabled color=\"fds-primary\">FDS primary</button>\n <button mat-raised-button disabled color=\"fds-secondary\">FDS Secondary</button>\n <button mat-raised-button disabled color=\"fds-regular\">FDS regular</button>\n <button mat-raised-button disabled color=\"fds-warn\">FDS warn</button>\n <button mat-raised-button disabled color=\"fds-critical\">FDS critical</button>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"FlatButtons\">Flat Buttons <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"FlatButtons\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <mat-card-actions>\n <button mat-button>Default</button>\n <button mat-button color=\"primary\">Primary</button>\n <button mat-button color=\"accent\">Secondary</button>\n <button mat-button color=\"warn\">Warn</button>\n <button mat-button disabled>Disabled Default</button>\n <button mat-button disabled color=\"primary\">Disabled Primary</button>\n <button mat-button disabled color=\"accent\">Disabled Secondary</button>\n <button mat-button disabled color=\"warn\">Disabled Warn</button>\n </mat-card-actions>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Themed Flat Buttons -->\n <button mat-button>Default</button>\n <button mat-button color=\"primary\">Primary</button>\n <button mat-button color=\"accent\">Secondary</button>\n <button mat-button color=\"warn\">warn</button>\n <!-- Disabled Flat Buttons -->\n <button mat-button disabled>disabled Default</button>\n <button mat-button disabled color=\"primary\">disabled primary</button>\n <button mat-button disabled color=\"accent\">disabled Secondary</button>\n <button mat-button disabled color=\"warn\">disabled warn</button>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"FabButtons\">Fab Buttons <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"FabButtons\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <mat-card-actions class=\"pad-left-sm\">\n <button mat-mini-fab color=\"primary\">P</button>\n <button mat-mini-fab color=\"accent\">A</button>\n <button mat-mini-fab color=\"warn\">W</button>\n <button mat-mini-fab disabled color=\"primary\">P</button>\n <button mat-mini-fab disabled color=\"accent\">A</button>\n <button mat-mini-fab disabled color=\"warn\">W</button>\n </mat-card-actions>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Themed Fab Buttons -->\n <button mat-mini-fab color=\"primary\">P</button>\n <button mat-mini-fab color=\"accent\">A</button>\n <button mat-mini-fab color=\"warn\">W</button>\n <!-- Disabled Fab Buttons -->\n <button mat-mini-fab disabled color=\"primary\">P</button>\n <button mat-mini-fab disabled color=\"accent\">A</button>\n <button mat-mini-fab disabled color=\"warn\">W</button>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"ButtonToggles\">Button Toggles <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"ButtonToggles\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <mat-button-toggle-group name=\"alignment\">\n <mat-button-toggle value=\"left\">\n <mat-icon>format_align_left</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"center\">\n <mat-icon>format_align_center</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"right\">\n <mat-icon>format_align_right</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"justify\">\n <mat-icon>format_align_justify</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div fxLayout=\"row\" class=\"pad-top-md pad-bot-md\"></div>\n <mat-button-toggle-group name=\"onOffToggle\" class=\"on-off-toggle-group\">\n <mat-button-toggle value=\"on\" [checked]=\"true\">\n ON\n </mat-button-toggle>\n <mat-button-toggle value=\"off\" class=\"off-toggle\">\n OFF\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div fxLayout=\"row\" class=\"pad-top-md pad-bot-md\"></div>\n <mat-button-toggle-group fxLayout=\"row\" fxLayoutAlign=\"space-between center\"\n class=\"expansion-panel-filter-toggle-group\" multiple>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">34</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Assets</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">300</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Extensions</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">5000</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Flows</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">0</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Certifications</div>\n </div>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div fxLayout=\"row\" class=\"pad-top-md pad-bot-md\"></div>\n <mat-button-toggle-group name=\"fds-administration-perspective\" fxLayout=\"row\" class=\"tab-toggle-group\">\n <mat-button-toggle value=\"general\">\n general\n </mat-button-toggle>\n <div fxLayout=\"row\" class=\"pad-left-md\"></div>\n <mat-button-toggle value=\"users\">\n Users\n </mat-button-toggle>\n <div fxLayout=\"row\" class=\"pad-left-md\"></div>\n <mat-button-toggle value=\"workflow\">\n Workflow\n </mat-button-toggle>\n </mat-button-toggle-group>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <mat-button-toggle-group name=\"alignment\">\n <mat-button-toggle value=\"left\">\n <mat-icon>format_align_left</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"center\">\n <mat-icon>format_align_center</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"right\">\n <mat-icon>format_align_right</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"justify\">\n <mat-icon>format_align_justify</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div fxLayout=\"row\" class=\"pad-top-md pad-bot-md\"></div>\n <mat-button-toggle-group name=\"onOffToggle\" class=\"on-off-toggle-group\">\n <mat-button-toggle value=\"on\" [checked]=\"true\">\n ON\n </mat-button-toggle>\n <mat-button-toggle value=\"off\" class=\"off-toggle\">\n OFF\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div fxLayout=\"row\" class=\"pad-top-md pad-bot-md\"></div>\n <mat-button-toggle-group fxLayout=\"row\" fxLayoutAlign=\"space-between center\"\n class=\"expansion-panel-filter-toggle-group\" multiple>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">34</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Assets</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">300</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Extensions</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">5000</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Flows</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle>\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">0</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Certifications</div>\n </div>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div fxLayout=\"row\" class=\"pad-top-md pad-bot-md\"></div>\n <mat-button-toggle-group name=\"fds-administration-perspective\" fxLayout=\"row\" class=\"tab-toggle-group\">\n <mat-button-toggle value=\"general\">\n general\n </mat-button-toggle>\n <div fxLayout=\"row\" class=\"pad-left-md\"></div>\n <mat-button-toggle value=\"users\">\n Users\n </mat-button-toggle>\n <div fxLayout=\"row\" class=\"pad-left-md\"></div>\n <mat-button-toggle value=\"workflow\">\n Workflow\n </mat-button-toggle>\n </mat-button-toggle-group>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Input\">Input <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Input\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <form>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"Company (disabled)\" disabled value=\"Google\">\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput disabled placeholder=\"First name\">\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" flex>\n <input matInput placeholder=\"Long Last Name That Will Be Truncated\">\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" flex>\n <input matInput placeholder=\"Button Addon with dropdown\">\n </mat-form-field>\n <button class=\"input-button\" color=\"fds-regular\" mat-raised-button\n [matMenuTriggerFor]=\"inputButtonDropdownAddonMenu\">\n Select<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu xPosition=\"before\" #inputButtonDropdownAddonMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <button mat-menu-item> Refresh</button>\n <button mat-menu-item> Settings</button>\n <button mat-menu-item> Help</button>\n <button mat-menu-item disabled> Sign Out</button>\n </mat-menu>\n </div>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"Button Addon\">\n </mat-form-field>\n <button class=\"input-button\" color=\"fds-regular\" mat-raised-button>\n Search\n </button>\n </div>\n </div>\n <div layout=\"row\" layout-margin>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input disabled matInput placeholder=\"Button Addon with dropdown\">\n </mat-form-field>\n <button disabled class=\"input-button\" color=\"fds-regular\" mat-raised-button>\n Select<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input disabled matInput placeholder=\"Button Addon\">\n </mat-form-field>\n <button disabled class=\"input-button\" color=\"fds-regular\" mat-raised-button>\n Search\n </button>\n </div>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" flex>\n <textarea matInput placeholder=\"Address\" value=\"1600 Amphitheatre Pkway\"></textarea>\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <textarea disabled value=\"Address 2 Value\" matInput placeholder=\"Address 2\"></textarea>\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"City\">\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"State\">\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" value=\"94043\">\n <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n </mat-form-field>\n </div>\n </form>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Inputs -->\n <form>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"Company (disabled)\" disabled value=\"Google\">\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput disabled placeholder=\"First name\">\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" flex>\n <input matInput placeholder=\"Long Last Name That Will Be Truncated\">\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" flex>\n <input matInput placeholder=\"Button Addon with dropdown\">\n </mat-form-field>\n <button class=\"input-button\" color=\"fds-regular\" mat-raised-button\n [matMenuTriggerFor]=\"inputButtonDropdownAddonMenu\">\n Select<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu xPosition=\"before\" #inputButtonDropdownAddonMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n </div>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"Button Addon\">\n </mat-form-field>\n <button class=\"input-button\" color=\"fds-regular\" mat-raised-button>\n Search\n </button>\n </div>\n </div>\n <div layout=\"row\" layout-margin>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input disabled matInput placeholder=\"Button Addon with dropdown\">\n </mat-form-field>\n <button disabled class=\"input-button\" color=\"fds-regular\" mat-raised-button>\n Select<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div flex fxLayoutAlign=\"start center\">\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input disabled matInput placeholder=\"Button Addon\">\n </mat-form-field>\n <button disabled class=\"input-button\" color=\"fds-regular\" mat-raised-button>\n Search\n </button>\n </div>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" flex>\n <textarea matInput placeholder=\"Address\" value=\"1600 Amphitheatre Pkway\"></textarea>\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <textarea disabled value=\"Address 2 Value\" matInput placeholder=\"Address 2\"></textarea>\n </mat-form-field>\n </div>\n <div layout=\"row\" layout-margin>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"City\">\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput placeholder=\"State\">\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" floatPlaceholder=\"always\" flex>\n <input matInput #postalCode maxlength=\"5\" placeholder=\"Postal Code\" value=\"94043\">\n <mat-hint align=\"end\">{{postalCode.value.length}} / 5</mat-hint>\n </mat-form-field>\n </div>\n </form>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Tabs\">Tabs <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Tabs\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <mat-tab-group dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>One</ng-template>\n <h3 class=\"md-title\">First tab content</h3>\n <p>Plaid echo park knausgaard normcore franzen cronut. Pickled humblebrag tofu hoodie, umami\n salvia farm-to-table schlitz try-hard food truck knausgaard pabst. Yuccie portland jean\n shorts, authentic mixtape waistcoat gentrify blue bottle. Fixie kickstarter church-key small\n batch seitan, shabby chic vegan listicle before they sold out. Hammock raw denim flannel\n tousled seitan you probably haven't heard of them. Trust fund man bun pug, kickstarter\n artisan selvage letterpress cornhole tote bag butcher locavore. Affogato try-hard\n kickstarter seitan, DIY pickled hella godard pork belly four loko ugh.</p>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Two</ng-template>\n <h3 class=\"md-title\">Second tab content</h3>\n <p>Hashtag distillery skateboard man bun gochujang, salvia man braid art party meggings heirloom\n kitsch farm-to-table. Franzen beard fingerstache gentrify, heirloom portland ennui XOXO\n microdosing kitsch plaid. Chicharrones bushwick chia, banh mi irony tattooed hammock butcher\n shabby chic taxidermy semiotics marfa post-ironic. Blue bottle keffiyeh farm-to-table ennui,\n chambray pitchfork art party pinterest artisan pop-up. Etsy banjo marfa, blue bottle\n kombucha crucifix XOXO tousled beard. Tilde disrupt kale chips bicycle rights skateboard\n master cleanse hella shoreditch, meditation retro shabby chic vice heirloom. Etsy listicle\n vice actually, iPhone chia hoodie four loko.</p>\n </mat-tab>\n </mat-tab-group>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <mat-tab-group dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>First tab content</ng-template>\n <h1>First content</h1>\n <p>...</p>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Second tab content</ng-template>\n <h1>Second tab content</h1>\n <p>...</p>\n </mat-tab>\n </mat-tab-group>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Stepper\">Stepper <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Stepper\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <td-steps mode=\"vertical\">\n <td-step label=\"Version 1\"\n sublabel=\"by Admin\"\n [active]=\"true\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\">\n <div fxLayout=\"row\" class=\"md-body-2\">\n Comments go here\n </div>\n <div fxLayout=\"row\" class=\"mat-caption\">\n An hour ago\n </div>\n </div>\n </td-step>\n <td-step label=\"Version 2\"\n sublabel=\"by Admin\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\">\n <div fxLayout=\"row\" class=\"md-body-2\">\n Comments go here\n </div>\n <div fxLayout=\"row\" class=\"mat-caption\">\n A day ago\n </div>\n </div>\n </td-step>\n </td-steps>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <td-steps mode=\"vertical\">\n <td-step label=\"Version 1\"\n sublabel=\"by Admin\"\n [active]=\"true\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\">\n <div fxLayout=\"row\" class=\"md-body-2\">\n Description goes here\n </div>\n <div fxLayout=\"row\" class=\"mat-caption\">\n An hour ago\n </div>\n </div>\n </td-step>\n <td-step label=\"Version 2\"\n sublabel=\"by Admin\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\">\n <div fxLayout=\"row\" class=\"md-body-2\">\n Description goes here\n </div>\n <div fxLayout=\"row\" class=\"mat-caption\">\n A day ago\n </div>\n </div>\n </td-step>\n </td-steps>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Autocomplete\">Autocomplete <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Autocomplete\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <div class=\"pad-top-sm\" layout=\"row\">\n <mat-form-field floatLabel=\"always\" flex=\"50\">\n <input matInput placeholder=\"State\" [matAutocomplete]=\"tdAuto\" [(ngModel)]=\"currentState\"\n #modelDir=\"ngModel\" (ngModelChange)=\"this.tdStates = filterStates(currentState)\"\n [disabled]=\"tdDisabled\">\n </mat-form-field>\n </div>\n <div class=\"push-top\">\n <button mat-button (click)=\"modelDir.reset()\" class=\"text-upper\">Reset</button>\n <button mat-button (click)=\"currentState='California'\" class=\"text-upper\">Set value</button>\n <button mat-button (click)=\"tdDisabled=!tdDisabled\" class=\"text-upper\">Toggle disabled</button>\n </div>\n <mat-autocomplete #tdAuto=\"matAutocomplete\">\n <mat-option *ngFor=\"let state of tdStates\" [value]=\"state.name\">\n <span>{{ state.name }}</span>\n <span class=\"demo-secondary-text\"> ({{state.code}}) </span>\n </mat-option>\n </mat-autocomplete>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <div class=\"pad-top-sm\" layout=\"row\">\n <mat-form-field floatLabel=\"always\" flex=\"50\">\n <input matInput placeholder=\"State\" [matAutocomplete]=\"tdAuto\" [(ngModel)]=\"currentState\"\n #modelDir=\"ngModel\" (ngModelChange)=\"this.tdStates = filterStates(currentState)\"\n [disabled]=\"tdDisabled\">\n </mat-form-field>\n </div>\n <div class=\"push-top\">\n <button mat-button (click)=\"modelDir.reset()\" class=\"text-upper\">Reset</button>\n <button mat-button (click)=\"currentState='California'\" class=\"text-upper\">Set value</button>\n <button mat-button (click)=\"tdDisabled=!tdDisabled\" class=\"text-upper\">Toggle disabled</button>\n </div>\n <mat-autocomplete #tdAuto=\"matAutocomplete\">\n <mat-option *ngFor=\"let state of tdStates\" [value]=\"state.name\">\n <span>{ { state.name } }</span>\n <span class=\"demo-secondary-text\"> ({ {state.code} }) </span>\n </mat-option>\n </mat-autocomplete>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.currentState = '';\n this.reactiveStates = '';\n this.tdStates = [];\n this.tdDisabled = false;\n this.states = [\n { code: 'AL', name: 'Alabama' },\n { code: 'AK', name: 'Alaska' },\n { code: 'AZ', name: 'Arizona' },\n { code: 'AR', name: 'Arkansas' },\n { code: 'CA', name: 'California' },\n { code: 'CO', name: 'Colorado' },\n { code: 'CT', name: 'Connecticut' },\n { code: 'DE', name: 'Delaware' },\n { code: 'FL', name: 'Florida' },\n { code: 'GA', name: 'Georgia' },\n { code: 'HI', name: 'Hawaii' },\n { code: 'ID', name: 'Idaho' },\n { code: 'IL', name: 'Illinois' },\n { code: 'IN', name: 'Indiana' },\n { code: 'IA', name: 'Iowa' },\n { code: 'KS', name: 'Kansas' },\n { code: 'KY', name: 'Kentucky' },\n { code: 'LA', name: 'Louisiana' },\n { code: 'ME', name: 'Maine' },\n { code: 'MD', name: 'Maryland' },\n { code: 'MA', name: 'Massachusetts' },\n { code: 'MI', name: 'Michigan' },\n { code: 'MN', name: 'Minnesota' },\n { code: 'MS', name: 'Mississippi' },\n { code: 'MO', name: 'Missouri' },\n { code: 'MT', name: 'Montana' },\n { code: 'NE', name: 'Nebraska' },\n { code: 'NV', name: 'Nevada' },\n { code: 'NH', name: 'New Hampshire' },\n { code: 'NJ', name: 'New Jersey' },\n { code: 'NM', name: 'New Mexico' },\n { code: 'NY', name: 'New York' },\n { code: 'NC', name: 'North Carolina' },\n { code: 'ND', name: 'North Dakota' },\n { code: 'OH', name: 'Ohio' },\n { code: 'OK', name: 'Oklahoma' },\n { code: 'OR', name: 'Oregon' },\n { code: 'PA', name: 'Pennsylvania' },\n { code: 'RI', name: 'Rhode Island' },\n { code: 'SC', name: 'South Carolina' },\n { code: 'SD', name: 'South Dakota' },\n { code: 'TN', name: 'Tennessee' },\n { code: 'TX', name: 'Texas' },\n { code: 'UT', name: 'Utah' },\n { code: 'VT', name: 'Vermont' },\n { code: 'VA', name: 'Virginia' },\n { code: 'WA', name: 'Washington' },\n { code: 'WV', name: 'West Virginia' },\n { code: 'WI', name: 'Wisconsin' },\n { code: 'WY', name: 'Wyoming' },\n ];\n\n ...\n\n displayFn: function(value) {\n return value && typeof value === 'object' ? value.name : value;\n },\n\n filterStates: function(val) {\n return val ? this.states.filter((s) => s.name.match(new RegExp(val, 'gi'))) : this.states;\n },\n\n ...\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Filter\">Filter <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Filter\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <h3 class=\"md-title\">Autocomplete with chips and no custom inputs</h3>\n <mat-divider></mat-divider>\n <mat-tab-group mat-stretch-tabs dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>Demo</ng-template>\n <div class=\"push\">\n <div class=\"mat-body-1\">Type and select a preset option:</div>\n <td-chips [items]=\"items\" [(ngModel)]=\"itemsRequireMatch\"\n placeholder=\"Enter autocomplete strings\" [disabled]=\"readOnly\"\n requireMatch></td-chips>\n </div>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Code</ng-template>\n <mat-card-content>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <td-chips [items]=\"items\" [(ngModel)]=\"itemsRequireMatch\" placeholder=\"Enter autocomplete strings\"\n [disabled]=\"readOnly\" requireMatch></td-chips>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.readOnly = false;\n\n this.items = [\n 'stepper',\n 'expansion-panel',\n 'markdown',\n 'highlight',\n 'loading',\n 'media',\n 'chips',\n 'http',\n 'json-formatter',\n 'pipes',\n 'need more?',\n ];\n\n this.itemsRequireMatch = this.items.slice(0, 6);\n\n ...\n\n toggleReadOnly: function() {\n this.readOnly = !this.readOnly;\n },\n\n ...\n ]]>\n </pre>\n </mat-card-content>\n </mat-tab>\n </mat-tab-group>\n <mat-divider></mat-divider>\n <mat-card-actions>\n <button mat-button color=\"primary\" (click)=\"toggleReadOnly()\" class=\"text-upper\">Toggle ReadOnly\n </button>\n </mat-card-actions>\n </mat-card-content>\n <mat-card-content>\n <h3 class=\"md-title\">Autocomplete with custom inputs</h3>\n <mat-divider></mat-divider>\n <mat-tab-group mat-stretch-tabs dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>Demo</ng-template>\n <div class=\"push\">\n <div class=\"mat-body-1\">Type and select option or enter custom text and press enter:</div>\n <td-chips [items]=\"items\" placeholder=\"Enter any string\"></td-chips>\n </div>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Code</ng-template>\n <mat-card-content>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <td-chips [items]=\"items\" placeholder=\"Enter any string\"></td-chips>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.items = [\n 'stepper',\n 'expansion-panel',\n 'markdown',\n 'highlight',\n 'loading',\n 'media',\n 'chips',\n 'http',\n 'json-formatter',\n 'pipes',\n 'need more?',\n ];\n ]]>\n </pre>\n </mat-card-content>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n <mat-card-content>\n <h3 class=\"md-title\">Demo allowing custom inputs for tags</h3>\n <mat-divider></mat-divider>\n <mat-tab-group mat-stretch-tabs dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>Demo</ng-template>\n <div class=\"push\">\n <div class=\"mat-body-1\">Type any test and press enter:</div>\n <td-chips placeholder=\"Enter any string\"></td-chips>\n </div>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Code</ng-template>\n <mat-card-content>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <td-chips placeholder=\"Enter any string\"></td-chips>\n ]]>\n </pre>\n </mat-card-content>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"SearchableExpansionPanels\">Searchable/Filterable Expansion Panels <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"SearchableExpansionPanels\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <mat-tab-group mat-stretch-tabs color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>Demo</ng-template>\n <div class=\"pad-top-md pad-bottom-md pad-right-xxl pad-left-xxl\">\n <div class=\"pad-top-md pad-bottom-sm\">\n <mat-button-toggle-group fxLayout=\"row\" fxLayoutAlign=\"space-between center\"\n class=\"expansion-panel-filter-toggle-group\" multiple>\n <mat-button-toggle (change)=\"toggleDropletsFilter('type:asset')\"\n [checked]=\"isDropletFilterChecked('type:asset')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletTypeCount('asset')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Assets</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('type:extension')\"\n [checked]=\"isDropletFilterChecked('type:extension')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletTypeCount('extension')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Extensions</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('type:flow')\"\n [checked]=\"isDropletFilterChecked('type:flow')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletTypeCount('flow')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Flows</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('compliant.label:Compliant')\"\n [checked]=\"isDropletFilterChecked('compliant.label:Compliant')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletCertificationCount('compliant')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Compliant</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('fleet.label:Fleet')\"\n [checked]=\"isDropletFilterChecked('fleet.label:Fleet')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletCertificationCount('fleet')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Fleet</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('prod.label:Production Ready')\"\n [checked]=\"isDropletFilterChecked('prod.label:Production Ready')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletCertificationCount('prod')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Production Ready</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('secure.label:Secure')\"\n [checked]=\"isDropletFilterChecked('secure.label:Secure')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\"\n fxFlex=\"55\">{{getDropletCertificationCount('secure')}}</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Secure</div>\n </div>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div id=\"fds-droplet-filter-clear-grouping-button-container\">\n <span *ngIf=\"dropletsSearchTerms.length > 0\"\n (click)=\"dropletsSearchTerms = [];filterDroplets(activeDropletColumn.name, activeDropletColumn.sortOrder);\"><i\n class=\"fa fa-plus-circle fa-rotate-45\" aria-hidden=\"true\"></i><span\n class=\"pad-left-sm link\">Clear Grouping</span></span>\n </div>\n </div>\n <div layout=\"row\" layout-align=\"space-between center\">\n <div flex fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <td-chips [(ngModel)]=\"dropletsSearchTerms\" [items]=\"autoCompleteDroplets\"\n (add)=\"filterDroplets(activeDropletColumn.name, activeDropletColumn.sortOrder);\"\n (remove)=\"filterDroplets(activeDropletColumn.name, activeDropletColumn.sortOrder);\"\n class=\"push-right-sm\"></td-chips>\n <span class=\"push-top-sm pad-right-sm\">Sort by:</span>\n <button class=\"push-top-sm\" color=\"fds-primary\" mat-raised-button\n [matMenuTriggerFor]=\"dropletGridSortMenu\">\n {{getSortBy()}}<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #dropletGridSortMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <div *ngFor=\"let column of dropletColumns\">\n <button mat-menu-item *ngIf=\"column.sortable\"\n (click)=\"sortDroplets(column);\">{{column.label}} {{(column.sortOrder === 'ASC') ? 'DESC' : 'ASC'}}</button>\n </div>\n </mat-menu>\n </div>\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\">\n <div *ngFor=\"let droplet of filteredDroplets\">\n <td-expansion-panel class=\"mat-elevation-z5\" label={{droplet.label}}\n sublabel={{droplet.sublabel}} [disabled]=\"disabled\">\n <ng-template td-expansion-panel-label>\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between start\">\n <span class=\"md-title text-caps\">{{droplet.displayName}}</span>\n <span class=\"md-subhead\">{{droplet.type}}</span>\n </div>\n </ng-template>\n <ng-template td-expansion-panel-sublabel>\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Versions</span> {{droplet.versions.length}}\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Flows</span> {{droplet.flows.length}}\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Extensions</span> {{droplet.extensions.length}}\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Assests</span> {{droplet.assets.length}}\n </div>\n </div>\n </ng-template>\n <div class=\"mat-padding\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\">\n <div class=\"pad-bottom-sm\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button color=\"fds-primary\"\n [matMenuTriggerFor]=\"primaryButtonDropdownMenu\"\n mat-raised-button>\n Actions<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"fds-primary-dropdown-button-menu\"\n #primaryButtonDropdownMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item *ngFor=\"let action of droplet.actions\">\n <span>{{action.name}}</span>\n </button>\n </mat-menu>\n </div>\n <div fxLayout=\"row\">\n <div fxFlex=\"25\">\n <span class=\"text-upper\">Description</span>\n <p>Blah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah\n blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla\n bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah\n bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah\n blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla,\n blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla,\n bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah\n blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah\n blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla\n bla, blah blah bla</p>\n </div>\n <div fxFlex=\"50\">\n <mat-card fxFlex>\n <mat-card-content class=\"pad-top-sm\">\n <img src=\"{{droplet.img}}\">\n </mat-card-content>\n </mat-card>\n </div>\n <div fxFlex=\"25\">\n <span class=\"text-upper\">Change Log</span>\n </div>\n </div>\n </div>\n </div>\n </td-expansion-panel>\n <div class=\"pad-bottom-sm\"></div>\n </div>\n </div>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Code</ng-template>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <div class=\"pad-top-md pad-bottom-md pad-right-xxl pad-left-xxl\">\n <div class=\"pad-top-md pad-bottom-sm\">\n <mat-button-toggle-group fxLayout=\"row\" fxLayoutAlign=\"space-between center\"\n class=\"expansion-panel-filter-toggle-group\" multiple>\n <mat-button-toggle (change)=\"toggleDropletsFilter('type:asset')\"\n [checked]=\"isDropletFilterChecked('type:asset')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{ {getDropletTypeCount('asset')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Assets</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('type:extension')\"\n [checked]=\"isDropletFilterChecked('type:extension')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{\n {getDropletTypeCount('extension')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Extensions</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('type:flow')\"\n [checked]=\"isDropletFilterChecked('type:flow')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{ {getDropletTypeCount('flow')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Flows</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('compliant.label:Compliant')\"\n [checked]=\"isDropletFilterChecked('compliant.label:Compliant')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{ {getDropletCertificationCount('compliant')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Compliant</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('fleet.label:Fleet')\"\n [checked]=\"isDropletFilterChecked('fleet.label:Fleet')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{ {getDropletCertificationCount('fleet')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Fleet</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('prod.label:Production Ready')\"\n [checked]=\"isDropletFilterChecked('prod.label:Production Ready')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{\n {getDropletCertificationCount('prod')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Production Ready</div>\n </div>\n </mat-button-toggle>\n <mat-button-toggle (change)=\"toggleDropletsFilter('secure.label:Secure')\"\n [checked]=\"isDropletFilterChecked('secure.label:Secure')\">\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"space-around stretch\">\n <div class=\"mat-display-1 pad-top-sm\" fxFlex=\"55\">{ {getDropletCertificationCount('secure')} }</div>\n <div class=\"pad-top-sm\" fxFlex=\"45\">Secure</div>\n </div>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <button *ngIf=\"activeDropletColumn\" mat-button color=\"primary\"\n (click)=\"dropletsSearchTerms = [];filterDroplets(activeDropletColumn.name, activeDropletColumn.sortOrder);\">Clear Grouping</button>\n </div>\n <div layout=\"row\" layout-align=\"space-between center\">\n <div flex fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <td-chips [(ngModel)]=\"dropletsSearchTerms\" [items]=\"autoCompleteDroplets\"\n (add)=\"filterDroplets(activeDropletColumn.name, activeDropletColumn.sortOrder);\"\n (remove)=\"filterDroplets(activeDropletColumn.name, activeDropletColumn.sortOrder);\"\n class=\"push-right-sm\"></td-chips>\n <span class=\"pad-right-sm\">Sort by:</span>\n <button color=\"fds-primary\" mat-raised-button [matMenuTriggerFor]=\"dropletGridSortMenu\">\n { {getSortBy()} }<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #dropletGridSortMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <div *ngFor=\"let column of dropletColumns\">\n <button mat-menu-item *ngIf=\"column.sortable\" (click)=\"sortDroplets(column);\">{\n {column.label} } { {(column.sortOrder === 'ASC') ? 'DESC' : 'ASC'} }</button>\n </div>\n </mat-menu>\n </div>\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\">\n <div *ngFor=\"let droplet of filteredDroplets\">\n <td-expansion-panel class=\"mat-elevation-z5\" label={ {droplet.label} } sublabel={ {droplet.sublabel} }\n [disabled]=\"disabled\">\n <ng-template td-expansion-panel-label>\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between start\">\n <span class=\"md-title text-caps\">{ {droplet.displayName} }</span>\n <span class=\"md-subhead\">{ {droplet.type} }</span>\n </div>\n </ng-template>\n <ng-template td-expansion-panel-sublabel>\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Versions</span> { {droplet.versions.length} }\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Flows</span> { {droplet.flows.length} }\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Extensions</span> { {droplet.extensions.length} }\n </div>\n <div class=\"pad-right-xxl pad-left-xxl\" fxLayout=\"column\"\n fxLayoutAlign=\"space-between start\">\n <span class=\"text-upper\">Assests</span> { {droplet.assets.length} }\n </div>\n </div>\n </ng-template>\n <div class=\"mat-padding\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\">\n <div class=\"pad-bottom-sm\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button color=\"fds-primary\" [matMenuTriggerFor]=\"primaryButtonDropdownMenu\"\n mat-raised-button>\n Actions<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #primaryButtonDropdownMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <button mat-menu-item *ngFor=\"let action of droplet.actions\">\n <span>{ {action.name} }</span>\n </button>\n </mat-menu>\n </div>\n <div fxLayout=\"row\">\n <div fxFlex=\"25\">\n <span class=\"text-upper\">Description</span>\n <p>Blah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah blaBlah blah bla, bla bla, blah blah bla</p>\n </div>\n <div fxFlex=\"50\">\n <mat-card fxFlex>\n <mat-card-content class=\"pad-top-sm\">\n <img src=\"{ {droplet.img} }\">\n </mat-card-content>\n </mat-card>\n </div>\n <div fxFlex=\"25\">\n <span class=\"text-upper\">Change Log</span>\n </div>\n </div>\n </div>\n </div>\n </td-expansion-panel>\n <div class=\"pad-bottom-sm\"></div>\n </div>\n </div>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.dataTableService = TdDataTableService;\n\n this.droplets = [\n {\n id: '23f6cc59-0156-1000-09b4-2b0610089090',\n name: \"Decompression_Circular_Flow\",\n displayName: 'Decompressed Circular flow',\n type: 'flow',\n sublabel: 'A sublabel',\n compliant: {\n id: '25fd6vv87-3549-0001-05g6-4d4567890765',\n label: 'Compliant',\n type: 'certification'\n },\n fleet: {\n id: '23f6cc59-3549-0001-05g6-4d4567890765',\n label: 'Fleet',\n type: 'certification'\n },\n prod: {\n id: '52fd6vv87-3549-0001-05g6-4d4567890765',\n label: 'Production Ready',\n type: 'certification'\n },\n secure: {\n id: '32f6cc59-3549-0001-05g6-4d4567890765',\n label: 'Secure',\n type: 'certification'\n },\n versions: [\n {\n id: '23f6cc59-0156-1000-06b4-2b0810089090',\n revision: '1',\n dependentFlows: [\n {\n id: '25fd6vv87-3549-0001-05g6-4d4567890765'\n }\n ],\n created: date.setDate(date.getDate() - 1),\n updated: new Date()\n }, {\n id: '25fd6vv87-3549-0001-05g6-4d4567890765',\n revision: '2',\n dependentFlows: [\n {\n id: '23f6cc59-0156-1000-06b4-2b0810089090'\n }\n ],\n created: new Date(),\n updated: new Date()\n }\n ],\n flows: [],\n extensions: [],\n assets: [],\n actions: [\n {\n 'name': 'Delete',\n 'icon': 'fa fa-close',\n 'tooltip': 'Delete User'\n },\n {\n 'name': 'Manage',\n 'icon': 'fa fa-user',\n 'tooltip': 'Manage User'\n },\n {\n 'name': 'Action 3',\n 'icon': 'fa fa-question',\n 'tooltip': 'Whatever else we want to do...'\n }\n ]\n },\n {\n id: '25fd6vv87-3249-0001-05g6-4d4767890765',\n name: \"DateConversion\",\n displayName: 'Date conversion',\n type: 'asset',\n sublabel: 'A sublabel',\n compliant: {\n id: '25fd6vv34-3549-0001-05g6-4d4567890765',\n label: 'Compliant',\n type: 'certification'\n },\n prod: {\n id: '52vn6vv87-3549-0001-05g6-4d4567890765',\n label: 'Production Ready',\n type: 'certification'\n },\n versions: [\n {\n id: '23f6ic59-0156-1000-06b4-2b0810089090',\n revision: '1',\n dependentFlows: [\n {\n id: '23f6cc19-0156-1000-06b4-2b0810089090'\n }\n ],\n created: new Date(),\n updated: new Date()\n }\n ],\n flows: [],\n extensions: [],\n assets: [],\n actions: [\n {\n 'name': 'Delete',\n 'icon': 'fa fa-close',\n 'tooltip': 'Delete User'\n }\n ]\n },\n {\n id: '52fd6vv87-3294-0001-05g6-4d4767890765',\n name: \"nifi-email-bundle\",\n displayName: 'nifi-email-bundle',\n type: 'extension',\n sublabel: 'A sublabel',\n compliant: {\n id: '33fd6vv87-3549-0001-05g6-4d4567890765',\n label: 'Compliant',\n test: {\n label: 'test'\n },\n type: 'certification'\n },\n versions: [\n {\n id: '23d3cc59-0156-1000-06b4-2b0810089090',\n revision: '1',\n dependentFlows: [\n {\n id: '23f6cc89-0156-1000-06b4-2b0810089090'\n }\n ],\n created: new Date(),\n updated: new Date()\n }\n ],\n flows: [],\n extensions: [],\n assets: [],\n actions: [\n {\n 'name': 'Delete',\n 'icon': 'fa fa-close',\n 'tooltip': 'Delete User'\n }, {\n 'name': 'Manage',\n 'icon': 'fa fa-user',\n 'tooltip': 'Manage User'\n }\n ]\n }];\n\n this.filteredDroplets = [];\n\n this.dropletColumns = [\n { name: 'id', label: 'ID', sortable: true },\n { name: 'name', label: 'Name', sortable: true },\n { name: 'displayName', label: 'Display Name', sortable: true },\n { name: 'sublabel', label: 'Label', sortable: true },\n { name: 'type', label: 'Type', sortable: true }\n ];\n\n this.autoCompleteDroplets = [];\n this.dropletsSearchTerms = [];\n\n ...\n\n isDropletFilterChecked: function(term) {\n return (this.dropletsSearchTerms.indexOf(term) > -1);\n },\n\n getDropletTypeCount: function(type) {\n return this.filteredDroplets.filter(function(droplet) {\n return droplet.type === type;\n }).length;\n },\n\n getDropletCertificationCount: function(certification) {\n return this.filteredDroplets.filter(droplet => {\n return Object.keys(droplet).find((key) => {\n if (key === certification && droplet[certification].type === 'certification') {\n return droplet;\n }\n });\n }).length;\n },\n\n getSortBy: function() {\n var sortByColumnLabel;\n var arrayLength = this.dropletColumns.length;\n for (var i = 0; i < arrayLength; i++) {\n if (this.dropletColumns[i].active === true) {\n sortByColumnLabel = this.dropletColumns[i].label;\n break;\n }\n }\n return sortByColumnLabel;\n },\n\n sortDroplets: function(column) {\n if (column.sortable === true) {\n // toggle column sort order\n var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 'DESC' : 'ASC';\n this.filterDroplets(column.name, sortOrder);\n\n //only one column can be actively sorted so we reset all to inactive\n this.dropletColumns.forEach(function (c) {\n c.active = false;\n });\n\n //and set this column as the actively sorted column\n column.active = true;\n this.activeDropletColumn = column;\n }\n },\n\n toggleDropletsFilter: function(searchTerm) {\n var applySearchTerm = true;\n // check if the search term is already applied and remove it if true\n if (this.dropletsSearchTerms.length > 0) {\n var arrayLength = this.dropletsSearchTerms.length;\n for (var i = 0; i < arrayLength; i++) {\n var index = this.dropletsSearchTerms.indexOf(searchTerm);\n if (index > -1) {\n this.dropletsSearchTerms.splice(index, 1);\n applySearchTerm = false;\n }\n }\n }\n\n // if we just removed the search term do NOT apply it again\n if (applySearchTerm) {\n this.dropletsSearchTerms.push(searchTerm);\n }\n\n this.filterDroplets(this.activeDropletColumn.name, this.activeDropletColumn.sortOrder);\n },\n\n filterDroplets: function(sortBy, sortOrder) {\n // if `sortBy` is `undefined` then find the first sortable column in this.dropletColumns\n if (sortBy === undefined) {\n var arrayLength = this.dropletColumns.length;\n for (var i = 0; i < arrayLength; i++) {\n if (this.dropletColumns[i].sortable === true) {\n sortBy = this.dropletColumns[i].name;\n this.activeDropletColumn = this.dropletColumns[i];\n\n //only one column can be actively sorted so we reset all to inactive\n this.dropletColumns.forEach(c => c.active = false);\n\n //and set this column as the actively sorted column\n this.dropletColumns[i].active = true;\n break;\n }\n }\n }\n\n // if `sortOrder` is `undefined` then use 'ASC'\n if (sortOrder === undefined) {\n sortOrder = 'ASC'\n }\n\n var newData = this.droplets;\n\n for (var i = 0; i < this.dropletsSearchTerms.length; i++) {\n newData = this.filterData(newData, this.dropletsSearchTerms[i], true, this.activeDropletColumn.name);\n }\n\n newData = this.dataTableService.sortData(newData, sortBy, sortOrder);\n this.filteredDroplets = newData;\n this.getAutoCompleteDroplets();\n },\n\n getAutoCompleteDroplets: function() {\n this.autoCompleteDroplets = [];\n this.dropletColumns.forEach(c => this.filteredDroplets.forEach(r => (r[c.name.toLowerCase()]) ? this.autoCompleteDroplets.push(r[c.name.toLowerCase()].toString()) : ''));\n },\n\n filterData: function(data, searchTerm, ignoreCase) {\n var field = '';\n if (searchTerm.indexOf(\":\") > -1) {\n field = searchTerm.split(':')[0].trim();\n searchTerm = searchTerm.split(':')[1].trim();\n }\n var filter = searchTerm ? (ignoreCase ? searchTerm.toLowerCase() : searchTerm) : '';\n\n if (filter) {\n data = data.filter(item => {\n var res = Object.keys(item).find((key) => {\n if (field.indexOf(\".\") > -1) {\n var objArray = field.split(\".\");\n var obj = item;\n var arrayLength = objArray.length;\n for (var i = 0; i < arrayLength; i++) {\n try {\n obj = obj[objArray[i]];\n } catch (e) {\n return false;\n }\n }\n var preItemValue = ('' + obj);\n var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;\n return itemValue.indexOf(filter) > -1;\n } else {\n if (key !== field && field !== '') {\n return false;\n }\n var preItemValue = ('' + item[key]);\n var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;\n return itemValue.indexOf(filter) > -1;\n }\n });\n return !(typeof res === 'undefined');\n });\n }\n return data;\n },\n\n ...\n ]]>\n </pre>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n <mat-divider></mat-divider>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Table\">Table <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Table\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <p>Example table with: Paging Bar / Filter / Sortable Columns / Multi-select with available Actions</p>\n <mat-tab-group mat-stretch-tabs color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>Demo</ng-template>\n <div layout=\"row\" layout-align=\"space-between center\"\n class=\"pad-top-md pad-bottom-sm pad-left-md pad-right-md\">\n <span class=\"table-title\">\n <span>Table title</span>\n </span>\n <div flex class=\"push-right-sm\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <td-chips [items]=\"autoCompleteData\" (add)=\"searchAdd($event)\"\n (remove)=\"searchRemove($event)\"></td-chips>\n <button class=\"push-top-sm\" color=\"fds-primary\" mat-raised-button\n [matMenuTriggerFor]=\"dataTableActionMenu\">\n Actions<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #dataTableActionMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <button mat-menu-item> Option 1</button>\n <button mat-menu-item> Option 2</button>\n </mat-menu>\n </div>\n <div class=\"pad-left-md pad-right-md\">\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"td-data-table\">\n <div class=\"td-data-table-column\" (click)=\"sort($event, column)\"\n [matTooltip]=\"column.tooltip\" *ngFor=\"let column of columns\"\n fxFlex=\"{{column.width}}\">\n <i *ngIf=\"column.active && column.sortable && column.sortOrder === 'ASC'\"\n class=\"fa fa-caret-up\" aria-hidden=\"true\"></i>\n <i *ngIf=\"column.active && column.sortable && column.sortOrder === 'DESC'\"\n class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n {{column.label}}\n </div>\n <div class=\"td-data-table-column\" fxFlex=10>\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"allRowsSelected\"\n (checked)=\"allRowsSelected\"\n (change)=\"toggleSelectAll()\"></mat-checkbox>\n </div>\n </div>\n </div>\n <div>\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"td-data-table-row\"\n [ngClass]=\"{'selected' : row.checked}\" *ngFor=\"let row of filteredData\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\">\n <div class=\"td-data-table-cell\" *ngFor=\"let column of columns\"\n fxFlex=\"{{column.width}}\">\n <div *ngIf=\"column.name !== 'comments' || row['comments']\">\n {{column.format ? column.format(row[column.name]) : row[column.name]}}\n </div>\n </div>\n <div class=\"td-data-table-cell\" fxFlex=10>\n <div *ngIf=\"row.actions\">\n <div *ngIf=\"row.actions.length <= 4\" fxLayout=\"row\"\n fxLayoutAlign=\"end center\">\n <button (click)=\"row.checked = !row.checked\"\n *ngFor=\"let action of row.actions\"\n matTooltip=\"{{action.tooltip}}\" mat-icon-button color=\"accent\"\n [disabled]=\"action.disabled ? '' : null\">\n <i class=\"{{action.icon}}\" aria-hidden=\"true\"></i>\n </button>\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"row.checked\"\n [checked]=\"row.checked\" (change)=\"toggleSelect(row)\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\"></mat-checkbox>\n </div>\n <div *ngIf=\"row.actions.length > 4\" fxLayout=\"row\"\n fxLayoutAlign=\"end center\">\n <button (click)=\"row.checked = !row.checked\" matTooltip=\"Actions\"\n mat-icon-button color=\"accent\"\n [matMenuTriggerFor]=\"tableActionMenu\">\n <i class=\"fa fa-ellipsis-h\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu #tableActionMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button *ngFor=\"let action of row.actions\"\n matTooltip=\"{{action.tooltip}}\" mat-menu-item\n [disabled]=\"action.disabled ? '' : null\">\n <i class=\"{{action.icon}}\" aria-hidden=\"true\"></i>\n <span>{{action.name}}</span>\n </button>\n </mat-menu>\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"row.checked\"\n [checked]=\"row.checked\" (change)=\"toggleSelect(row)\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\"></mat-checkbox>\n </div>\n </div>\n <div *ngIf=\"!row.actions\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"row.checked\"\n [checked]=\"row.checked\" (change)=\"toggleSelect(row)\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\"></mat-checkbox>\n </div>\n </div>\n </div>\n </div>\n <div class=\"mat-padding\" *ngIf=\"!filteredData.length > 0\" layout=\"row\"\n layout-align=\"center center\">\n <h3>No results to display.</h3>\n </div>\n <td-paging-bar #pagingBar [initialPage]=\"1\" [pageSize]=\"pageSize\" [total]=\"pageCount\"\n (change)=\"page($event)\">\n <span hide-xs>Row per page:</span> {{pagingBar.range}} <span\n hide-xs>of {{pagingBar.total}}</span>\n </td-paging-bar>\n </div>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Code</ng-template>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <div layout=\"row\" layout-align=\"space-between center\" class=\"pad-top-md pad-bottom-sm pad-left-md pad-right-md\">\n <span class=\"table-title\">\n <span>Table title</span>\n </span>\n <div flex class=\"push-right-sm\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <td-chips [items]=\"autoCompleteData\" (add)=\"searchAdd($event)\"\n (remove)=\"searchRemove($event)\"></td-chips>\n <button color=\"fds-primary\" mat-raised-button [matMenuTriggerFor]=\"dataTableActionMenu\">\n Actions<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #dataTableActionMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item> Option 1 </button>\n <button mat-menu-item> Option 2 </button>\n </mat-menu>\n </div>\n <div class=\"pad-left-md pad-right-md\">\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"td-data-table\">\n <div class=\"td-data-table-column\" (click)=\"sort($event, column)\" [matTooltip]=\"column.tooltip\"\n *ngFor=\"let column of columns\" fxFlex=\"{ { column.width } }\">\n { { column.label } }\n <i *ngIf=\"column.active && column.sortable && column.sortOrder === 'ASC'\" class=\"fa fa-caret-up\"\n aria-hidden=\"true\"></i>\n <i *ngIf=\"column.active && column.sortable && column.sortOrder === 'DESC'\" class=\"fa fa-caret-down\"\n aria-hidden=\"true\"></i>\n </div>\n <div class=\"td-data-table-column\" fxFlex=10>\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"allRowsSelected\" (checked)=\"allRowsSelected\"\n (change)=\"toggleSelectAll()\"></mat-checkbox>\n </div>\n </div>\n </div>\n <div>\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"td-data-table-row\"\n [ngClass]=\"{'selected' : row.checked}\" *ngFor=\"let row of filteredData\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\">\n <div class=\"td-data-table-cell\" *ngFor=\"let column of columns\" fxFlex=\"{ { column.width } }\">\n <div *ngIf=\"column.name !== 'comments' || row['comments']\">\n { { column.format ? column.format(row[column.name]) : row[column.name] } }\n </div>\n </div>\n <div class=\"td-data-table-cell\" fxFlex=10>\n <div *ngIf=\"row.actions\">\n <div *ngIf=\"row.actions.length <= 4\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button (click)=\"row.checked = !row.checked\" *ngFor=\"let action of row.actions\"\n matTooltip=\"{ { action.tooltip } }\" mat-icon-button color=\"accent\"\n [disabled]=\"action.disabled ? '' : null\">\n <i class=\"{ { action.icon } }\" aria-hidden=\"true\"></i>\n </button>\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"row.checked\" [checked]=\"row.checked\"\n (change)=\"toggleSelect(row)\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\"></mat-checkbox>\n </div>\n <div *ngIf=\"row.actions.length > 4\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button (click)=\"row.checked = !row.checked\" matTooltip=\"Actions\" mat-icon-button\n color=\"accent\" [matMenuTriggerFor]=\"tableActionMenu\">\n <i class=\"fa fa-ellipsis-h\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu #tableActionMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button *ngFor=\"let action of row.actions\" matTooltip=\"{ { action.tooltip } }\"\n mat-menu-item [disabled]=\"action.disabled ? '' : null\">\n <i class=\"{ { action.icon } }\" aria-hidden=\"true\"></i>\n <span>{ { action.name } }</span>\n </button>\n </mat-menu>\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"row.checked\" [checked]=\"row.checked\"\n (change)=\"toggleSelect(row)\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\"></mat-checkbox>\n </div>\n </div>\n <div *ngIf=\"!row.actions\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <mat-checkbox class=\"pad-left-sm\" [(ngModel)]=\"row.checked\" [checked]=\"row.checked\"\n (change)=\"toggleSelect(row)\"\n (click)=\"row.checked = !row.checked;toggleSelect(row)\"></mat-checkbox>\n </div>\n </div>\n </div>\n </div>\n <div class=\"mat-padding\" *ngIf=\"!filteredData.length > 0\" layout=\"row\" layout-align=\"center center\">\n <h3>No results to display.</h3>\n </div>\n <td-paging-bar #pagingBar [initialPage]=\"1\" [pageSize]=\"pageSize\" [total]=\"pageCount\"\n (change)=\"page($event)\">\n <span hide-xs>Row per page:</span> { { pagingBar.range } } <span hide-xs>of {\n { pagingBar.total } }</span>\n </td-paging-bar>\n </div>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.dataTableService = TdDataTableService;\n\n this.data = [\n {\n 'id': 1,\n 'name': 'Frozen yogurt',\n 'type': 'Ice cream',\n 'calories': 159.0,\n 'fat': 6.0,\n 'carbs': 24.0,\n 'protein': 4.0,\n 'sodium': 87.0,\n 'calcium': 14.0,\n 'iron': 1.0,\n 'comments': 'I love froyo!',\n 'actions': [\n {\n 'name': 'Action 1',\n 'icon': 'fa fa-user',\n 'tooltip': 'Manage Users'\n }, {\n 'name': 'Action 2',\n 'icon': 'fa fa-key',\n 'tooltip': 'Manage Permissions'\n }\n ]\n },\n {\n 'id': 2,\n 'name': 'Ice cream sandwich',\n 'type': 'Ice cream',\n 'calories': 237.0,\n 'fat': 9.0,\n 'carbs': 37.0,\n 'protein': 4.3,\n 'sodium': 129.0,\n 'calcium': 8.0,\n 'iron': 1.0,\n 'actions': [\n {\n 'name': 'Action 1',\n 'icon': 'fa fa-user',\n 'tooltip': 'Manage Users'\n }, {\n 'name': 'Action 2',\n 'icon': 'fa fa-key',\n 'tooltip': 'Manage Permissions'\n }, {\n 'name': 'Action 3',\n 'tooltip': 'Action 3'\n }, {\n 'name': 'Action 4',\n 'disabled': true,\n 'tooltip': 'Action 4'\n }, {\n 'name': 'Action 5',\n 'tooltip': 'Action 5'\n }\n ]\n },\n {\n 'id': 3,\n 'name': 'Eclair',\n 'type': 'Pastry',\n 'calories': 262.0,\n 'fat': 16.0,\n 'carbs': 24.0,\n 'protein': 6.0,\n 'sodium': 337.0,\n 'calcium': 6.0,\n 'iron': 7.0,\n 'actions': [{\n 'name': 'Action 1',\n 'icon': 'fa fa-user',\n 'tooltip': 'Manage Users'\n }, {\n 'name': 'Action 2',\n 'icon': 'fa fa-key',\n 'tooltip': 'Manage Permissions'\n }, {\n 'name': 'Action 3',\n 'tooltip': 'Action 3'\n }, {\n 'name': 'Action 4',\n 'disabled': true,\n 'tooltip': 'Action 4'\n }, {\n 'name': 'Action 5',\n 'tooltip': 'Action 5'\n }\n ],\n },\n {\n 'id': 4,\n 'name': 'Cupcake',\n 'type': 'Pastry',\n 'calories': 305.0,\n 'fat': 3.7,\n 'carbs': 67.0,\n 'protein': 4.3,\n 'sodium': 413.0,\n 'calcium': 3.0,\n 'iron': 8.0,\n 'actions': [{\n 'name': 'Action 1',\n 'icon': 'fa fa-user',\n 'tooltip': 'Manage Users'\n }, {\n 'name': 'Action 2',\n 'icon': 'fa fa-key',\n 'tooltip': 'Manage Permissions'\n }, {\n 'name': 'Action 3',\n 'tooltip': 'Action 3'\n }, {\n 'name': 'Action 4',\n 'disabled': true,\n 'tooltip': 'Action 4'\n }, {\n 'name': 'Action 5',\n 'tooltip': 'Action 5'\n }\n ],\n },\n {\n 'id': 5,\n 'name': 'Jelly bean',\n 'type': 'Candy',\n 'calories': 375.0,\n 'fat': 0.0,\n 'carbs': 94.0,\n 'protein': 0.0,\n 'sodium': 50.0,\n 'calcium': 0.0,\n 'iron': 0.0,\n },\n {\n 'id': 6,\n 'name': 'Lollipop',\n 'type': 'Candy',\n 'calories': 392.0,\n 'fat': 0.2,\n 'carbs': 98.0,\n 'protein': 0.0,\n 'sodium': 38.0,\n 'calcium': 0.0,\n 'iron': 2.0,\n },\n {\n 'id': 7,\n 'name': 'Honeycomb',\n 'type': 'Other',\n 'calories': 408.0,\n 'fat': 3.2,\n 'carbs': 87.0,\n 'protein': 6.5,\n 'sodium': 562.0,\n 'calcium': 0.0,\n 'iron': 45.0,\n },\n {\n 'id': 8,\n 'name': 'Donut',\n 'type': 'Pastry',\n 'calories': 452.0,\n 'fat': 25.0,\n 'carbs': 51.0,\n 'protein': 4.9,\n 'sodium': 326.0,\n 'calcium': 2.0,\n 'iron': 22.0,\n },\n {\n 'id': 9,\n 'name': 'KitKat',\n 'type': 'Candy',\n 'calories': 518.0,\n 'fat': 26.0,\n 'carbs': 65.0,\n 'protein': 7.0,\n 'sodium': 54.0,\n 'calcium': 12.0,\n 'iron': 6.0,\n },\n {\n 'id': 10,\n 'name': 'Chocolate',\n 'type': 'Candy',\n 'calories': 518.0,\n 'fat': 26.0,\n 'carbs': 65.0,\n 'protein': 7.0,\n 'sodium': 54.0,\n 'calcium': 12.0,\n 'iron': 6.0,\n },\n {\n 'id': 11,\n 'name': 'Chamoy',\n 'type': 'Candy',\n 'calories': 518.0,\n 'fat': 26.0,\n 'carbs': 65.0,\n 'protein': 7.0,\n 'sodium': 54.0,\n 'calcium': 12.0,\n 'iron': 6.0,\n }\n ];\n\n this.filteredData = this.data;\n this.filteredTotal = this.data.length;\n\n this.columns = [\n { name: 'comments', label: 'Comments' },\n { name: 'name', label: 'Dessert (100g serving)', sortable: true },\n { name: 'type', label: 'Type', sortable: true },\n { name: 'calories', label: 'Calories', numeric: true, format: NUMBER_FORMAT, sortable: true },\n { name: 'fat', label: 'Fat (g)', numeric: true, format: DECIMAL_FORMAT, sortable: true },\n { name: 'carbs', label: 'Carbs (g)', numeric: true, format: NUMBER_FORMAT, sortable: true },\n {\n name: 'protein', label: 'Protein (g)', numeric: true, format: DECIMAL_FORMAT, sortable: true },\n { name: 'sodium', label: 'Sodium (mg)', numeric: true, format: NUMBER_FORMAT, sortable: true },\n {name: 'calcium', label: 'Calcium (%)', numeric: true, format: NUMBER_FORMAT, sortable: true },\n { name: 'iron', label: 'Iron (%)', numeric: true, format: NUMBER_FORMAT },\n ];\n\n this.allRowsSelected = false;\n this.autoCompleteData = [];\n this.selectedRows = [];\n\n this.searchTerm = [];\n this.fromRow = 1;\n this.currentPage = 1;\n this.pageSize = 5;\n\n ...\n\n sort: function(sortEvent, column) {\n if (column.sortable) {\n var sortBy = column.name;\n var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 'DESC' : 'ASC';\n this.filter(sortBy, sortOrder);\n\n //only one column can be actively sorted so we reset all to inactive\n this.columns.forEach(c => c.active = false);\n\n //and set this column as the actively sorted column\n column.active = true;\n }\n },\n\n searchRemove: function(searchTerm) {\n //only remove the first occurrence of the search term\n var index = this.searchTerm.indexOf(searchTerm);\n if (index !== -1) {\n this.searchTerm.splice(index, 1);\n }\n this.filter();\n },\n\n searchAdd: function(searchTerm) {\n this.searchTerm.push(searchTerm);\n this.filter();\n },\n\n page: function(pagingEvent) {\n this.fromRow = pagingEvent.fromRow;\n this.currentPage = pagingEvent.page;\n this.pageSize = pagingEvent.pageSize;\n this.filter();\n },\n\n filterData: function(data, searchTerm, ignoreCase) {\n var field = '';\n if (searchTerm.indexOf(\":\") > -1) {\n field = searchTerm.split(':')[0].trim();\n searchTerm = searchTerm.split(':')[1].trim();\n }\n var filter = searchTerm ? (ignoreCase ? searchTerm.toLowerCase() : searchTerm) : '';\n\n if (filter) {\n data = data.filter(item => {\n var res = Object.keys(item).find((key) => {\n if (field.indexOf(\".\") > -1) {\n var objArray = field.split(\".\");\n var obj = item;\n var arrayLength = objArray.length;\n for (var i = 0; i < arrayLength; i++) {\n try {\n obj = obj[objArray[i]];\n } catch (e) {\n return false;\n }\n }\n var preItemValue = ('' + obj);\n var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;\n return itemValue.indexOf(filter) > -1;\n } else {\n if (key !== field && field !== '') {\n return false;\n }\n var preItemValue = ('' + item[key]);\n var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;\n return itemValue.indexOf(filter) > -1;\n }\n });\n return !(typeof res === 'undefined');\n });\n }\n return data;\n },\n\n filter: function(sortBy, sortOrder) {\n if (this.allRowsSelected) {\n this.toggleSelectAll();\n }\n this.deselectAll();\n var newData = this.data;\n\n if (this.searchTerm.length > 0) {\n for (var i = 0; i < this.searchTerm.length; i++) {\n //account for column/field name specific search syntax\n if (this.searchTerm[i].indexOf(\":\") > -1) {\n newData = this.filterData(newData, this.searchTerm[i].split(':')[1].trim(), true, this.searchTerm[i].split(':')[0].trim());\n } else { //otherwise search all cells\n newData = this.filterData(newData, this.searchTerm[i], true);\n }\n }\n } else {\n newData = this.dataTableService.filterData(newData, '', true);\n }\n this.filteredTotal = newData.length;\n newData = this.dataTableService.sortData(newData, sortBy, sortOrder);\n newData = this.dataTableService.pageData(newData, this.fromRow, this.currentPage * this.pageSize);\n this.filteredData = newData;\n this.getAutoCompleteData();\n },\n\n toggleSelect: function(row) {\n if (!row.checked) {\n this.allRowsSelected = false;\n } else {\n if (this.allFilteredRowsSelected()) {\n this.allRowsSelected = true;\n } else {\n this.allRowsSelected = false;\n }\n }\n },\n\n toggleSelectAll: function() {\n this.allRowsSelected = !this.allRowsSelected;\n if (this.allRowsSelected) {\n this.selectAll();\n } else {\n this.deselectAll();\n }\n },\n\n selectAll: function() {\n this.filteredData.forEach(c => c.checked = true);\n },\n\n deselectAll: function() {\n this.filteredData.forEach(c => c.checked = false);\n },\n\n allFilteredRowsSelected: function() {\n var allFilteredRowsSelected = true;\n this.filteredData.forEach(function(c) {\n if (c.checked === undefined || c.checked === false) {\n allFilteredRowsSelected = false;\n }\n });\n\n return allFilteredRowsSelected;\n },\n\n areTooltipsOn: function() {\n return this.columns[0].hasOwnProperty('tooltip');\n },\n\n toggleTooltips: function() {\n if (this.columns[0].tooltip) {\n this.columns.forEach(c => delete c.tooltip);\n } else {\n this.columns.forEach(c => c.tooltip = `This is ${c.label}!`);\n }\n },\n\n openDataTablePrompt: function(row, name) {\n this.dialogService.openPrompt({\n message: 'Enter comment?',\n value: row[name],\n }).afterClosed().subscribe(value => {\n if (value !== undefined) {\n row[name] = value;\n }\n })\n },\n\n getAutoCompleteData: function() {\n this.autoCompleteData = [];\n this.columns.forEach(c => this.filteredData.forEach(r => (r[c.name.toLowerCase()]) ? this.autoCompleteData.push(r[c.name.toLowerCase()].toString()):''));\n },\n\n ...\n ]]>\n </pre>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n <mat-divider></mat-divider>\n <mat-card-actions>\n <button matTooltip=\"Column field name tooltips toggle.\" mat-button color=\"primary\" (click)=\"toggleTooltips()\" class=\"text-upper\">\n Tooltips ({{areTooltipsOn() ? 'ON' : 'OFF'}})\n </button>\n </mat-card-actions>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Checkboxes\">Checkbox <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Checkboxes\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <h3 class=\"md-title\">Basic Usage</h3>\n <mat-divider></mat-divider>\n <mat-list>\n <mat-list-item *ngFor=\"let grocery of groceries\">\n <mat-checkbox [checked]=\"grocery.bought\">\n {{grocery.name}}\n </mat-checkbox>\n </mat-list-item>\n </mat-list>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Basic Usage -->\n <mat-checkbox [checked]=\"grocery.bought\">\n { {grocery.name} }\n </mat-checkbox>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.groceries = [\n {\n bought: true,\n name: 'Seitan',\n },\n {\n bought: false,\n name: 'Almond Meal Flour',\n },\n {\n bought: false,\n name: 'Organic Eggs',\n }\n ];\n ]]>\n </pre>\n <h3 class=\"md-title\">Usage within Forms</h3>\n <mat-divider></mat-divider>\n <form>\n <div layout=\"row\" layout-align=\"start center\">\n <mat-checkbox flex=\"initial\" [(ngModel)]=\"user.agreesToTOS\" name=\"agreesToTOS\">\n I agree to the terms\n </mat-checkbox>\n <button mat-raised-button color=\"fds-secondary\" [disabled]=\"!user.agreesToTOS\"\n class=\"pad-right-sm\" class=\"text-upper\">Sign Up\n </button>\n </div>\n <mat-divider></mat-divider>\n <div layout=\"row\" layout-align=\"start center\" class=\"pad-top-sm pad-bottom-sm\">\n <mat-checkbox labelPosition=\"after\">\n I come after my label.\n </mat-checkbox>\n </div>\n <mat-divider></mat-divider>\n <div layout=\"row\" layout-align=\"start center\" class=\"pad-top-sm pad-bottom-sm\">\n <mat-checkbox labelPosition=\"before\">\n I come before my label\n </mat-checkbox>\n </div>\n <mat-divider></mat-divider>\n </form>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Usage within Forms -->\n <form>\n <div layout=\"row\" layout-align=\"start center\">\n <mat-checkbox flex=\"initial\" [(ngModel)]=\"user.agreesToTOS\" name=\"agreesToTOS\">\n I agree to the terms\n </mat-checkbox>\n <button mat-raised-button color=\"fds-secondary\" [disabled]=\"!user.agreesToTOS\" class=\"pad-right-sm\"\n class=\"text-upper\">Sign Up</button>\n </div>\n <mat-divider></mat-divider>\n <div layout=\"row\" layout-align=\"start center\" class=\"pad-top-sm pad-bottom-sm\">\n <mat-checkbox labelPosition=\"after\">\n I come after my label.\n </mat-checkbox>\n </div>\n <mat-divider></mat-divider>\n <div layout=\"row\" layout-align=\"start center\" class=\"pad-top-sm pad-bottom-sm\">\n <mat-checkbox labelPosition=\"before\">\n I come before my label\n </mat-checkbox>\n </div>\n <mat-divider></mat-divider>\n </form>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.user = {\n agreesToTOS: false\n };\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Radios\">Radios <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Radios\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content layout=\"row\">\n <div flex=\"48\" class=\"pad-right\">\n <!-- Basic Radios -->\n <h3 class=\"md-title\">Basic Radios</h3>\n <mat-radio-group name=\"group1\">\n <mat-radio-button class=\"pad-right-sm\" name=\"group1\">Option 1</mat-radio-button>\n <mat-radio-button class=\"pad-right-sm\" name=\"group1\">Option 2</mat-radio-button>\n <mat-radio-button class=\"pad-right-sm\" name=\"group1\" disabled=\"true\">Option 3 (disabled)\n </mat-radio-button>\n </mat-radio-group>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Basic Radios -->\n <mat-radio-group name=\"group1\">\n <mat-radio-button class=\"pad-right-sm\" name=\"group1\">Option 1 </mat-radio-button>\n <mat-radio-button class=\"pad-right-sm\" name=\"group1\">Option 2 </mat-radio-button>\n <mat-radio-button class=\"pad-right-sm\" name=\"group1\" disabled=\"true\">Option 3 (disabled) </mat-radio-button>\n </mat-radio-group>\n ]]>\n </pre>\n </div>\n <div flex=\"48\">\n <!-- Dynamic Radios -->\n <h3 class=\"md-title\">Dynamic Radios</h3>\n <mat-radio-group name=\"more_options\" [(ngModel)]=\"favoriteSeason\">\n <mat-radio-button class=\"fds-radio pad-right-sm\" *ngFor=\"let season of seasonOptions\"\n name=\"more_options\" [value]=\"season\">\n {{season}}\n </mat-radio-button>\n </mat-radio-group>\n <p>Your favorite season is: <strong>{{favoriteSeason}}</strong></p>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Dynamic Radios -->\n <mat-radio-group name=\"more_options\" [(ngModel)]=\"favoriteSeason\">\n <mat-radio-button class=\"fds-radio\" *ngFor=\"let season of seasonOptions\" name=\"more_options\" [value]=\"season\">\n { {season} }\n </mat-radio-button>\n </mat-radio-group>\n <p>Your favorite season is: <strong>{ { favoriteSeason } }</strong></p>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n\n this.favoriteSeason = 'Autumn';\n\n this.seasonOptions = [\n 'Winter',\n 'Spring',\n 'Summer',\n 'Autumn',\n ];\n ]]>\n </pre>\n </div>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Tooltips\">Tooltips <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Tooltips\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show above\" matTooltipPosition=\"above\"\n class=\"text-upper\">Above Tooltip\n </button>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show after\" matTooltipPosition=\"after\"\n class=\"text-upper\">After Tooltip\n </button>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show below\" matTooltipPosition=\"below\"\n class=\"text-upper\">Below Tooltip\n </button>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show before\" matTooltipPosition=\"before\"\n class=\"text-upper\">Before Tooltip\n </button>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show above\" matTooltipPosition=\"above\"\n class=\"text-upper\">Bottom Tooltip</button>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show after\" matTooltipPosition=\"after\"\n class=\"text-upper\">Bottom Tooltip</button>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show below\" matTooltipPosition=\"below\"\n class=\"text-upper\">Bottom Tooltip</button>\n <button mat-raised-button color=\"fds-primary\" matTooltip=\"I show before\" matTooltipPosition=\"before\"\n class=\"text-upper\">Bottom Tooltip</button>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Panels\">Panels <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Panels\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <h3 class=\"md-title\">Standard Card</h3>\n <mat-card>\n <button class=\"fds-panel-menu-button\" matTooltip=\"Standard Card Menu\" mat-icon-button\n [matMenuTriggerFor]=\"standardCardMenu\">\n <i class=\"fa fa-ellipsis-v \" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"primary-icon-button-menu\" #standardCardMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <span>Option1</span>\n </button>\n <button mat-menu-item>\n <span>Option2</span>\n </button>\n </mat-menu>\n <mat-card-title class=\"pad-bottom-sm\">\n <span>Title</span>\n </mat-card-title>\n <mat-card-content>\n <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do tempor incididunt ut labore\n et dolore magna aliqua. Ut enim ad</p>\n </mat-card-content>\n <mat-card-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"fds-primary\" class=\"text-upper\">Action</button>\n </mat-card-actions>\n </mat-card>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Basic Card -->\n <mat-card>\n <button class=\"fds-panel-menu-button\" matTooltip=\"Standard Card Menu\" mat-icon-button\n [matMenuTriggerFor]=\"standardCardMenu\">\n <i class=\"fa fa-ellipsis-v \" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"primary-icon-button-menu\" #standardCardMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <span>Option1</span>\n </button>\n <button mat-menu-item>\n <span>Option2</span>\n </button>\n </mat-menu>\n <mat-card-title class=\"pad-bottom-sm\">\n <span>Title</span>\n </mat-card-title>\n <mat-card-content>\n <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do tempor incididunt ut labore et dolore magna aliqua. Ut enim ad</p>\n </mat-card-content>\n <mat-card-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"fds-primary\" class=\"text-upper\">Action</button>\n </mat-card-actions>\n </mat-card>\n ]]>\n </pre>\n <h3 class=\"md-title\">Tabbed Card</h3>\n <mat-card>\n <button class=\"fds-panel-menu-button\" matTooltip=\"Standard Card Menu\" mat-icon-button\n [matMenuTriggerFor]=\"standardCardMenu\">\n <i class=\"fa fa-ellipsis-v \" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"primary-icon-button-menu\" #standardCardMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <span>Option1</span>\n </button>\n <button mat-menu-item>\n <span>Option2</span>\n </button>\n </mat-menu>\n <mat-card-content>\n <mat-tab-group dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>One</ng-template>\n <h3 class=\"md-title\">First tab content</h3>\n <p>Plaid echo park knausgaard normcore franzen cronut. Pickled humblebrag tofu hoodie,\n umami salvia farm-to-table schlitz try-hard food truck knausgaard pabst. Yuccie\n portland jean shorts, authentic mixtape waistcoat gentrify blue bottle. Fixie\n kickstarter church-key small batch seitan, shabby chic vegan listicle before they\n sold out. Hammock raw denim flannel tousled seitan you probably haven't heard of\n them. Trust fund man bun pug, kickstarter artisan selvage letterpress cornhole tote\n bag butcher locavore. Affogato try-hard kickstarter seitan, DIY pickled hella godard\n pork belly four loko ugh.</p>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Two</ng-template>\n <h3 class=\"md-title\">Second tab content</h3>\n <p>Hashtag distillery skateboard man bun gochujang, salvia man braid art party meggings\n heirloom kitsch farm-to-table. Franzen beard fingerstache gentrify, heirloom\n portland ennui XOXO microdosing kitsch plaid. Chicharrones bushwick chia, banh mi\n irony tattooed hammock butcher shabby chic taxidermy semiotics marfa post-ironic.\n Blue bottle keffiyeh farm-to-table ennui, chambray pitchfork art party pinterest\n artisan pop-up. Etsy banjo marfa, blue bottle kombucha crucifix XOXO tousled beard.\n Tilde disrupt kale chips bicycle rights skateboard master cleanse hella shoreditch,\n meditation retro shabby chic vice heirloom. Etsy listicle vice actually, iPhone chia\n hoodie four loko.</p>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n <mat-card-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"fds-primary\" class=\"text-upper\">Action</button>\n </mat-card-actions>\n </mat-card>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Basic Card -->\n <mat-card>\n <button class=\"fds-panel-menu-button\" matTooltip=\"Standard Card Menu\" mat-icon-button\n [matMenuTriggerFor]=\"standardCardMenu\">\n <i class=\"fa fa-ellipsis-v \" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"primary-icon-button-menu\" #standardCardMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <span>Option1</span>\n </button>\n <button mat-menu-item>\n <span>Option2</span>\n </button>\n </mat-menu>\n <mat-card-content>\n <mat-tab-group dynamicHeight color=\"accent\">\n <mat-tab>\n <ng-template mat-tab-label>One</ng-template>\n <h3 class=\"md-title\">First tab content</h3>\n <p>Plaid echo park knausgaard normcore franzen cronut. Pickled humblebrag tofu hoodie, umami salvia farm-to-table schlitz try-hard food truck knausgaard pabst. Yuccie portland jean shorts, authentic mixtape waistcoat gentrify blue bottle. Fixie kickstarter church-key small batch seitan, shabby chic vegan listicle before they sold out. Hammock raw denim flannel tousled seitan you probably haven't heard of them. Trust fund man bun pug, kickstarter artisan selvage letterpress cornhole tote bag butcher locavore. Affogato try-hard kickstarter seitan, DIY pickled hella godard pork belly four loko ugh.</p>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>Two</ng-template>\n <h3 class=\"md-title\">Second tab content</h3>\n <p>Hashtag distillery skateboard man bun gochujang, salvia man braid art party meggings heirloom kitsch farm-to-table. Franzen beard fingerstache gentrify, heirloom portland ennui XOXO microdosing kitsch plaid. Chicharrones bushwick chia, banh mi irony tattooed hammock butcher shabby chic taxidermy semiotics marfa post-ironic. Blue bottle keffiyeh farm-to-table ennui, chambray pitchfork art party pinterest artisan pop-up. Etsy banjo marfa, blue bottle kombucha crucifix XOXO tousled beard. Tilde disrupt kale chips bicycle rights skateboard master cleanse hella shoreditch, meditation retro shabby chic vice heirloom. Etsy listicle vice actually, iPhone chia hoodie four loko.</p>\n </mat-tab>\n </mat-tab-group>\n </mat-card-content>\n <mat-card-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-raised-button color=\"fds-primary\" class=\"text-upper\">Action</button>\n </mat-card-actions>\n </mat-card>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Select\">Select <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Select\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <form>\n <div layout=\"row\" layout-margin>\n <mat-select color=\"accent\" floatPlaceholder=\"never\" placeholder=\"Favorite food\"\n [(ngModel)]=\"selectedValue\" name=\"food\">\n <mat-option *ngFor=\"let food of foods\" [value]=\"food.value\">\n {{food.viewValue}}\n </mat-option>\n </mat-select>\n </div>\n <div layout=\"row\" layout-margin>\n <div flex> Selected food value: {{selectedValue}} </div>\n </div>\n </form>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <form>\n <div layout=\"row\" layout-margin>\n <mat-select color=\"accent\" floatPlaceholder=\"never\" placeholder=\"Favorite food\"\n [(ngModel)]=\"selectedValue\" name=\"food\">\n <mat-option *ngFor=\"let food of foods\" [value]=\"food.value\">\n { {food.viewValue} }\n </mat-option>\n </mat-select>\n </div>\n <div layout=\"row\" layout-margin>\n <div flex> Selected food value: { {selectedValue} } </div>\n </div>\n </form>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.selectedValue = '';\n\n this.foods = [\n { value: 'steak-0', viewValue: 'Steak' },\n { value: 'pizza-1', viewValue: 'Pizza' },\n { value: 'tacos-2', viewValue: 'Tacos' },\n ];\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Menus\">Menus (dropdowns) <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Menus\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n <button color=\"fds-regular\" mat-raised-button [matMenuTriggerFor]=\"aboveMenu\">\n Above<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu yPosition=\"above\" #aboveMenu=\"matMenu\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n <button color=\"fds-regular\" mat-raised-button [matMenuTriggerFor]=\"iconsMenu\">\n Icons in Menu<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu #iconsMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <mat-icon>dialpad</mat-icon>\n <span>Redial</span>\n </button>\n <button mat-menu-item disabled>\n <mat-icon>voicemail</mat-icon>\n <span>Check voicemail</span>\n </button>\n <button mat-menu-item>\n <mat-icon>notifications_off</mat-icon>\n <span>Disable alerts</span>\n </button>\n </mat-menu>\n <button color=\"fds-primary\" [matMenuTriggerFor]=\"primaryButtonDropdownMenu\" mat-raised-button>\n FDS Primary<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #primaryButtonDropdownMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <span>Option 1</span>\n </button>\n <button mat-menu-item disabled>\n <span>Option 2</span>\n </button>\n </mat-menu>\n <button color=\"fds-regular\" mat-raised-button [matMenuTriggerFor]=\"posXMenu\">\n Before<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu xPosition=\"before\" #posXMenu=\"matMenu\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n <button color=\"fds-regular\" mat-raised-button [matMenuTriggerFor]=\"aboveMenu\">\n Above<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu yPosition=\"above\" #aboveMenu=\"matMenu\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n <button color=\"fds-regular\" mat-raised-button [matMenuTriggerFor]=\"iconsMenu\">\n Icons in Menu<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu #iconsMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <mat-icon>dialpad</mat-icon>\n <span>Redial</span>\n </button>\n <button mat-menu-item disabled>\n <mat-icon>voicemail</mat-icon>\n <span>Check voicemail</span>\n </button>\n <button mat-menu-item>\n <mat-icon>notifications_off</mat-icon>\n <span>Disable alerts</span>\n </button>\n </mat-menu>\n <button color=\"fds-primary\" [matMenuTriggerFor]=\"primaryButtonDropdownMenu\" mat-raised-button>\n FDS Primary<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu class=\"fds-primary-dropdown-button-menu\" #primaryButtonDropdownMenu=\"matMenu\" [overlapTrigger]=\"false\">\n <button mat-menu-item>\n <span>Option 1</span>\n </button>\n <button mat-menu-item disabled>\n <span>Option 2</span>\n </button>\n </mat-menu>\n <button color=\"fds-regular\" mat-raised-button [matMenuTriggerFor]=\"posXMenu\">\n Before<i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\n </button>\n <mat-menu xPosition=\"before\" #posXMenu=\"matMenu\">\n <button mat-menu-item> Refresh </button>\n <button mat-menu-item> Settings </button>\n <button mat-menu-item> Help </button>\n <button mat-menu-item disabled> Sign Out </button>\n </mat-menu>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Dialog\">Dialog <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Dialog\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <button mat-raised-button color=\"fds-primary\" (click)=\"openDialog()\">Show simple dialog</button>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <button mat-raised-button color=\"fds-primary\" (click)=\"openDialog()\">Show simple dialog</button>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n var ngCore = require('@angular/core');\n function DialogComponent() {};\n\n DialogComponent.prototype = {\n constructor: DialogComponent\n };\n\n DialogComponent.annotations = [\n new ngCore.Component({\n template: 'Hello Dialog'\n })];\n\n ...\n\n constructor(MatDialog) {\n this.dialog = MatDialog;\n }\n\n ...\n\n openDialog: function() {\n this.dialog.open(DialogComponent, {\n height: '50%', // can be px or %\n width: '60%', // can be px or %\n }\n );\n }\n\n ...\n\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"SimpleDialogs\">Simple Dialogs <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"SimpleDialogs\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <div class=\"pad-left-sm\">\n <button mat-raised-button color=\"fds-primary\" (click)=\"openConfirm()\" class=\"text-upper\">Open\n Confirm\n </button>\n </div>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <button mat-button color=\"primary\" (click)=\"openConfirm()\" class=\"text-upper\">Open Confirm</button>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n ...\n\n constructor(TdDialogService) {\n this.dialogService = TdDialogService\n }\n\n ...\n\n openConfirm: function() {\n this.dialogService.openConfirm({\n title: 'Confirm',\n message: 'This is how simple it is to create a confirm with this wrapper service. Do you agree?',\n cancelButton: 'Disagree',\n acceptButton: 'Agree',\n });\n },\n\n ...\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"SnackBars\">Snack Bars <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"SnackBars\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showSuccessSnackBar()\">Success Snack Bar</button>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showWarnSnackBar()\">Warning Snack Bar</button>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showErrorSnackBar()\">Error Snack Bar</button>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showRegularSnackBar()\">Regular Snack Bar</button>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <button mat-raised-button color=\"fds-primary\" (click)=\"showSuccessSnackBar()\">Success Snack Bar</button>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showWarnSnackBar()\">Warning Snack Bar</button>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showErrorSnackBar()\">Error Snack Bar</button>\n <button mat-raised-button color=\"fds-primary\" (click)=\"showRegularSnackBar()\">Regular Snack Bar</button>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n ...\n\n constructor(FdsSnackBarService) {\n this.snackBarService = FdsSnackBarService;\n },\n\n ...\n\n /** Possible values for horizontalPosition on MatSnackBarConfig are 'start' | 'center' | 'end' | 'left' | 'right'. */\n /** Possible values for verticalPosition on MatSnackBarConfig are 'top' | 'bottom'. */\n /** Possible values for icon on MatSnackBarConfig are any available icons loaded on the page. */\n\n showSuccessSnackBar: function () {\n var snackBarRef = this.snackBarService.openCoaster({\n title: 'Success',\n message: 'Some help text regarding the successful event.',\n verticalPosition: 'top',\n horizontalPosition: 'right',\n icon: 'fa fa-check-circle-o',\n color: '#1EB475',\n duration: 3000\n });\n },\n\n showWarnSnackBar: function () {\n var snackBarRef = this.snackBarService.openCoaster({\n title: 'Warning',\n message: 'Some help text regarding the warning.',\n verticalPosition: 'top',\n horizontalPosition: 'left',\n icon: 'fa fa-exclamation-triangle',\n color: '#E98A40',\n duration: 3000\n });\n },\n\n showErrorSnackBar: function () {\n var snackBarRef = this.snackBarService.openCoaster({\n title: 'Error',\n message: 'Some help text regarding the critical error. This coaster will stay open until closed with the `x` or if another coaster is created.',\n verticalPosition: 'bottom',\n horizontalPosition: 'right',\n icon: 'fa fa-times-circle-o',\n color: '#EF6162'\n });\n },\n\n showRegularSnackBar: function () {\n var snackBarRef = this.snackBarService.openCoaster({\n title: 'Regular',\n message: 'Something interesting.',\n verticalPosition: 'bottom',\n horizontalPosition: 'left',\n color: '#808793',\n duration: 3000\n });\n },\n\n ...\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"ExpansionPanels\">Expansion Panels <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"ExpansionPanels\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <p>Expand/Collapse Event for Expansion 1: {{expandCollapseExpansion1Msg}}</p>\n <div>\n <button mat-button color=\"primary\" (click)=\"toggleDisabled()\" class=\"text-upper\">Toggle disable\n </button>\n <button mat-button color=\"primary\" (click)=\"toggleExpansion1()\" class=\"text-upper\">Toggle first\n </button>\n </div>\n <div layout-gt-xs=\"row\" layout-align-gt-xs=\"center start\">\n <div flex-gt-xs=\"90\">\n <td-expansion-panel label=\"Google\"\n sublabel=\"1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA\"\n [expand]=\"expansion1\" [disabled]=\"disabled\"\n (expanded)=\"expandExpansion1Event()\"\n (collapsed)=\"collapseExpansion1Event()\">\n <td-expansion-summary>\n <mat-list>\n <mat-list-item>\n <mat-icon mat-list-avatar>pin_drop</mat-icon>\n <h3 mat-line>Google</h3>\n <h4 mat-line>Headquarters</h4>\n <p mat-line>\n 1600 Amphitheatre Pkwy\n <br/>Mountain View, CA 94043, USA\n </p>\n </mat-list-item>\n </mat-list>\n </td-expansion-summary>\n <div class=\"mat-padding\">\n <form class=\"mat-padding\" layout=\"column\">\n <mat-form-field floatLabel=\"always\" flex>\n <input matInput placeholder=\"Company (disabled)\" disabled value=\"Google\"/>\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" flex>\n <textarea matInput placeholder=\"Description\" rows=\"4\"></textarea>\n </mat-form-field>\n </form>\n <div layout=\"row\" layout-margin layout-align=\"end center\">\n <button mat-button class=\"text-upper\">Cancel</button>\n <button mat-button color=\"accent\" class=\"text-upper\">Save</button>\n </div>\n </div>\n </td-expansion-panel>\n </div>\n </div>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <td-expansion-panel label=\"Google\" sublabel=\"1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA\"\n [expand]=\"expansion1\" [disabled]=\"disabled\" (expanded)=\"expandExpansion1Event()\"\n (collapsed)=\"collapseExpansion1Event()\">\n <td-expansion-summary>\n <mat-list>\n <mat-list-item>\n <mat-icon mat-list-avatar>pin_drop</mat-icon>\n <h3 mat-line>Google</h3>\n <h4 mat-line>Headquarters</h4>\n <p mat-line>\n 1600 Amphitheatre Pkwy\n <br/>Mountain View, CA 94043, USA\n </p>\n </mat-list-item>\n </mat-list>\n </td-expansion-summary>\n <div class=\"mat-padding\">\n <form class=\"mat-padding\" layout=\"column\">\n <mat-form-field floatLabel=\"always\" flex>\n <input matInput placeholder=\"Company (disabled)\" disabled value=\"Google\"/>\n </mat-form-field>\n <mat-form-field floatLabel=\"always\" flex>\n <textarea matInput placeholder=\"Description\" rows=\"4\"></textarea>\n </mat-form-field>\n </form>\n <mat-divider></mat-divider>\n <div layout=\"row\" layout-margin layout-align=\"end center\">\n <button mat-button class=\"text-upper\">Cancel</button>\n <button mat-button color=\"accent\" class=\"text-upper\">Save</button>\n </div>\n </div>\n </td-expansion-panel>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.expandCollapseExpansion1Msg = 'No expanded/collapsed detected yet';\n this.expansion1 = false;\n this.disabled = false;\n\n ...\n\n toggleExpansion1: function() {\n if (!this.disabled) {\n this.expansion1 = !this.expansion1;\n }\n },\n\n toggleDisabled: function() {\n this.disabled = !this.disabled;\n },\n\n expandExpansion1Event: function() {\n this.expandCollapseExpansion1Msg = 'Expand event emitted.';\n },\n\n collapseExpansion1Event: function() {\n this.expandCollapseExpansion1Msg = 'Collapse event emitted.';\n },\n\n ...\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Progress\">Progress <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Progress\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content layout=\"row\">\n <div flex=\"48\" class=\"pad-right\">\n <h3 class=\"md-title\">Progress Bars</h3>\n <h4>Determinate</h4>\n <mat-progress-bar mode=\"determinate\" value=\"40\"></mat-progress-bar>\n <h4>Indeterminate</h4>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n <h4>Buffer</h4>\n <mat-progress-bar mode=\"buffer\" value=\"15\" bufferValue=\"15\"></mat-progress-bar>\n <h4>Query</h4>\n <mat-progress-bar mode=\"query\"></mat-progress-bar>\n <h4>Colors</h4>\n <mat-progress-bar mode=\"indeterminate\" color=\"primary\"></mat-progress-bar>\n <mat-progress-bar mode=\"indeterminate\" color=\"accent\"></mat-progress-bar>\n <mat-progress-bar mode=\"indeterminate\" color=\"warn\"></mat-progress-bar>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Determinate-->\n <mat-progress-bar mode=\"determinate\" value=\"40\"></mat-progress-bar>\n\n <!-- Indeterminate-->\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n\n <!-- Buffer-->\n <mat-progress-bar mode=\"buffer\" value=\"15\" bufferValue=\"15\"></mat-progress-bar>\n\n <!-- Query-->\n <mat-progress-bar mode=\"query\"></mat-progress-bar>\n\n <!-- Colors-->\n <mat-progress-bar mode=\"indeterminate\" color=\"primary\"></mat-progress-bar>\n\n <mat-progress-bar mode=\"indeterminate\" color=\"accent\"></mat-progress-bar>\n\n <mat-progress-bar mode=\"indeterminate\" color=\"warn\"></mat-progress-bar>\n ]]>\n </pre>\n </div>\n <div flex=\"48\">\n <!-- Progress circles-->\n <h3 class=\"md-title\">Progress Spinner</h3>\n <div layout=\"row\">\n <div>\n <h4>Determinate</h4>\n <mat-progress-spinner mode=\"determinate\" value=\"66\"></mat-progress-spinner>\n </div>\n <div>\n <h4>indeterminate</h4>\n <mat-progress-spinner mode=\"indeterminate\"></mat-progress-spinner>\n </div>\n <div>\n <h4>Spinner</h4>\n <mat-spinner></mat-spinner>\n </div>\n </div>\n <div>\n <h4>Colors</h4>\n <div layout=\"row\">\n <mat-progress-spinner mode=\"indeterminate\" color=\"primary\"></mat-progress-spinner>\n <mat-progress-spinner mode=\"indeterminate\" color=\"accent\"></mat-progress-spinner>\n <mat-progress-spinner mode=\"indeterminate\" color=\"warn\"></mat-progress-spinner>\n </div>\n </div>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Determinate -->\n <mat-progress-spinner mode=\"determinate\" value=\"66\"></mat-progress-spinner>\n <!-- Indeterminate -->\n <mat-progress-spinner mode=\"indeterminate\"></mat-progress-spinner>\n <!-- Spinner -->\n <mat-spinner></mat-spinner>\n <!-- Colors -->\n <mat-progress-spinner mode=\"indeterminate\" color=\"primary\"></mat-progress-spinner>\n <mat-progress-spinner mode=\"indeterminate\" color=\"accent\"></mat-progress-spinner>\n <mat-progress-spinner mode=\"indeterminate\" color=\"warn\"></mat-progress-spinner>\n ]]>\n </pre>\n </div>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"SideNav\">Side Nav <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"SideNav\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <p>The side nav can be opened at the `start` or `end` of a container and can be displayed in `over`,\n `side`, or `push` mode. You can also define its width.</p>\n <button matTooltip=\"Open side nav\" mat-raised-button color=\"fds-primary\" (click)=\"sidenav.toggle()\">\n Open\n </button>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Basic Usage -->\n <mat-sidenav #sidenav mode=\"over\" align=\"end\" opened=\"false\">\n ...\n </mat-sidenav>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"SlideToggle\">Slide Toggle <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"SlideToggle\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <h3 class=\"md-title\">Basic Usage</h3>\n <mat-divider></mat-divider>\n <mat-list>\n <mat-list-item *ngFor=\"let system of systems\">\n <mat-slide-toggle [color]=\"system.color\" [(ngModel)]=\"system.on\">\n {{system.name}}\n </mat-slide-toggle>\n </mat-list-item>\n </mat-list>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Basic Usage -->\n <mat-list>\n <mat-list-item *ngFor=\"let system of systems\">\n <mat-slide-toggle [color]=\"system.color\" [(ngModel)]=\"system.on\">\n { {system.name} }\n </mat-slide-toggle>\n </mat-list-item>\n </mat-list>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.systems = [{\n name: 'Lights',\n on: false,\n color: 'primary',\n }, {\n name: 'Surround Sound',\n on: true,\n color: 'accent',\n }, {\n name: 'T.V.',\n on: true,\n color: 'warn',\n }, ];\n ]]>\n </pre>\n <h3 class=\"md-title\">Usage within Forms</h3>\n <form>\n <mat-list>\n <mat-list-item>\n <mat-slide-toggle color=\"accent\" [(ngModel)]=\"house.lockHouse\" name=\"lockHouse\">\n Lock?\n </mat-slide-toggle>\n <mat-icon *ngIf=\"house.lockHouse\" class=\"pad-right-sm\">lock</mat-icon>\n </mat-list-item>\n <mat-list-item>\n <mat-slide-toggle disabled>\n I am disabled.\n </mat-slide-toggle>\n </mat-list-item>\n </mat-list>\n </form>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <!-- Usage within Forms -->\n <form>\n <mat-list>\n <mat-list-item>\n <mat-slide-toggle color=\"accent\" [(ngModel)]=\"house.lockHouse\" name=\"lockHouse\">\n Lock?\n </mat-slide-toggle>\n <mat-icon *ngIf=\"house.lockHouse\" class=\"pad-right-sm\">lock</mat-icon>\n </mat-list-item>\n <mat-list-item>\n <mat-slide-toggle disabled>\n I am disabled.\n </mat-slide-toggle>\n </mat-list-item>\n </mat-list>\n </form>\n ]]>\n </pre>\n <p>Javascript:</p>\n <pre lang=\"javascript\">\n <![CDATA[\n this.house = {\n lockHouse: false,\n };\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n <mat-card>\n <mat-card-title class=\"pad-bottom-sm\" id=\"Slider\">Slider <mat-icon class=\"link-to-component\" routerLink=\"/\" fragment=\"Slider\">link</mat-icon></mat-card-title>\n <mat-divider></mat-divider>\n <mat-card-content>\n <h3 class=\"md-title\">Horizontal Slider</h3>\n <mat-slider min=\"1\" max=\"5\" thumbLabel tickInterval=\"1\" value=\"2\" color=\"primary\"></mat-slider>\n <mat-slider step=\"5\" thumbLabel tickInterval=\"5\" value=\"20\" color=\"accent\"></mat-slider>\n <mat-slider thumbLabel tick-interval=\"auto\" value=\"2\" color=\"warn\"></mat-slider>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <mat-slider min=\"1\" max=\"5\" thumbLabel tickInterval=\"1\" value=\"2\" color=\"primary\"></mat-slider>\n <mat-slider step=\"5\" thumbLabel tickInterval=\"5\" value=\"20\" color=\"accent\"></mat-slider>\n <mat-slider thumbLabel tick-interval=\"auto\" value=\"2\" color=\"warn\"></mat-slider>\n ]]>\n </pre>\n <h3 class=\"md-title\">Vertical Slider</h3>\n <mat-slider vertical min=\"1\" max=\"100\" thumbLabel tickInterval=\"10\" value=\"2\"></mat-slider>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <mat-slider vertical min=\"1\" max=\"100\" thumbLabel tickInterval=\"10\" value=\"2\"></mat-slider>\n ]]>\n </pre>\n <h3 class=\"md-title\">Inverted Slider</h3>\n <mat-slider invert min=\"1\" max=\"100\" thumbLabel tickInterval=\"10\" value=\"2\"></mat-slider>\n <h3 class=\"md-title\">Usage</h3>\n <p>HTML:</p>\n <pre lang=\"html\">\n <![CDATA[\n <mat-slider invert min=\"1\" max=\"100\" thumbLabel tickInterval=\"10\" value=\"2\"></mat-slider>\n ]]>\n </pre>\n </mat-card-content>\n </mat-card>\n </div>\n</mat-sidenav-container>\n";
/***/ }),
/***/ "./webapp/components/flow-design-system/fds-demo.js":
/*!**********************************************************!*\
!*** ./webapp/components/flow-design-system/fds-demo.js ***!
\**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var _covalent_core_data_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @covalent/core/data-table */ "./node_modules/@covalent/core/fesm5/covalent-core-data-table.js");
/* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js");
/* harmony import */ var _nifi_fds_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @nifi-fds/core */ "./platform/core/index.js");
/* harmony import */ var webapp_services_fds_service_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! webapp/services/fds.service.js */ "./webapp/services/fds.service.js");
/* harmony import */ var webapp_components_flow_design_system_dialogs_demo_fds_demo_dialog_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.js */ "./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.js");
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the 'License'); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var NUMBER_FORMAT = function NUMBER_FORMAT(v) {
return v;
};
var DECIMAL_FORMAT = function DECIMAL_FORMAT(v) {
return v.toFixed(2);
};
var date = new Date();
/**
* FdsDemo constructor.
*
* @param FdsSnackBarService The FDS snack bar service module.
* @param FdsService The FDS service module.
* @param dialog The angular material dialog module.
* @param TdDialogService The covalent dialog service module.
* @param TdDataTableService The covalent data table service module.
* @constructor
*/
function FdsDemo(FdsSnackBarService, FdsService, dialog, TdDataTableService, FdsDialogService) {
this.fdsService = FdsService; //<editor-fold desc='Snack Bars'>
this.snackBarService = FdsSnackBarService; //</editor-fold>
//<editor-fold desc='Dialog'>
this.dialog = dialog; //</editor-fold>
//<editor-fold desc='Simple Dialogs'>
this.dialogService = FdsDialogService; //</editor-fold>
//<editor-fold desc='Expansion Panel'>
this.expandCollapseExpansion1Msg = 'No expanded/collapsed detected yet';
this.expansion1 = false;
this.disabled = false; //</editor-fold>
//<editor-fold desc='Autocomplete'>
this.currentState = '';
this.reactiveStates = '';
this.tdStates = [];
this.tdDisabled = false;
this.states = [{
code: 'AL',
name: 'Alabama'
}, {
code: 'AK',
name: 'Alaska'
}, {
code: 'AZ',
name: 'Arizona'
}, {
code: 'AR',
name: 'Arkansas'
}, {
code: 'CA',
name: 'California'
}, {
code: 'CO',
name: 'Colorado'
}, {
code: 'CT',
name: 'Connecticut'
}, {
code: 'DE',
name: 'Delaware'
}, {
code: 'FL',
name: 'Florida'
}, {
code: 'GA',
name: 'Georgia'
}, {
code: 'HI',
name: 'Hawaii'
}, {
code: 'ID',
name: 'Idaho'
}, {
code: 'IL',
name: 'Illinois'
}, {
code: 'IN',
name: 'Indiana'
}, {
code: 'IA',
name: 'Iowa'
}, {
code: 'KS',
name: 'Kansas'
}, {
code: 'KY',
name: 'Kentucky'
}, {
code: 'LA',
name: 'Louisiana'
}, {
code: 'ME',
name: 'Maine'
}, {
code: 'MD',
name: 'Maryland'
}, {
code: 'MA',
name: 'Massachusetts'
}, {
code: 'MI',
name: 'Michigan'
}, {
code: 'MN',
name: 'Minnesota'
}, {
code: 'MS',
name: 'Mississippi'
}, {
code: 'MO',
name: 'Missouri'
}, {
code: 'MT',
name: 'Montana'
}, {
code: 'NE',
name: 'Nebraska'
}, {
code: 'NV',
name: 'Nevada'
}, {
code: 'NH',
name: 'New Hampshire'
}, {
code: 'NJ',
name: 'New Jersey'
}, {
code: 'NM',
name: 'New Mexico'
}, {
code: 'NY',
name: 'New York'
}, {
code: 'NC',
name: 'North Carolina'
}, {
code: 'ND',
name: 'North Dakota'
}, {
code: 'OH',
name: 'Ohio'
}, {
code: 'OK',
name: 'Oklahoma'
}, {
code: 'OR',
name: 'Oregon'
}, {
code: 'PA',
name: 'Pennsylvania'
}, {
code: 'RI',
name: 'Rhode Island'
}, {
code: 'SC',
name: 'South Carolina'
}, {
code: 'SD',
name: 'South Dakota'
}, {
code: 'TN',
name: 'Tennessee'
}, {
code: 'TX',
name: 'Texas'
}, {
code: 'UT',
name: 'Utah'
}, {
code: 'VT',
name: 'Vermont'
}, {
code: 'VA',
name: 'Virginia'
}, {
code: 'WA',
name: 'Washington'
}, {
code: 'WV',
name: 'West Virginia'
}, {
code: 'WI',
name: 'Wisconsin'
}, {
code: 'WY',
name: 'Wyoming'
}]; //</editor-fold>
//<editor-fold desc='Searchable Expansion Panels'>
this.dataTableService = TdDataTableService;
this.droplets = [{
id: '23f6cc59-0156-1000-09b4-2b0610089090',
name: 'Decompression_Circular_Flow',
displayName: 'Decompressed Circular flow',
type: 'flow',
sublabel: 'A sublabel',
compliant: {
id: '25fd6vv87-3549-0001-05g6-4d4567890765',
label: 'Compliant',
type: 'certification'
},
fleet: {
id: '23f6cc59-3549-0001-05g6-4d4567890765',
label: 'Fleet',
type: 'certification'
},
prod: {
id: '52fd6vv87-3549-0001-05g6-4d4567890765',
label: 'Production Ready',
type: 'certification'
},
secure: {
id: '32f6cc59-3549-0001-05g6-4d4567890765',
label: 'Secure',
type: 'certification'
},
versions: [{
id: '23f6cc59-0156-1000-06b4-2b0810089090',
revision: '1',
dependentFlows: [{
id: '25fd6vv87-3549-0001-05g6-4d4567890765'
}],
created: date.setDate(date.getDate() - 1),
updated: new Date()
}, {
id: '25fd6vv87-3549-0001-05g6-4d4567890765',
revision: '2',
dependentFlows: [{
id: '23f6cc59-0156-1000-06b4-2b0810089090'
}],
created: new Date(),
updated: new Date()
}],
flows: [],
extensions: [],
assets: [],
actions: [{
'name': 'Delete',
'icon': 'fa fa-close',
'tooltip': 'Delete User'
}, {
'name': 'Manage',
'icon': 'fa fa-user',
'tooltip': 'Manage User'
}, {
'name': 'Action 3',
'icon': 'fa fa-question',
'tooltip': 'Whatever else we want to do...'
}]
}, {
id: '25fd6vv87-3249-0001-05g6-4d4767890765',
name: 'DateConversion',
displayName: 'Date conversion',
type: 'asset',
sublabel: 'A sublabel',
compliant: {
id: '25fd6vv34-3549-0001-05g6-4d4567890765',
label: 'Compliant',
type: 'certification'
},
prod: {
id: '52vn6vv87-3549-0001-05g6-4d4567890765',
label: 'Production Ready',
type: 'certification'
},
versions: [{
id: '23f6ic59-0156-1000-06b4-2b0810089090',
revision: '1',
dependentFlows: [{
id: '23f6cc19-0156-1000-06b4-2b0810089090'
}],
created: new Date(),
updated: new Date()
}],
flows: [],
extensions: [],
assets: [],
actions: [{
'name': 'Delete',
'icon': 'fa fa-close',
'tooltip': 'Delete User'
}]
}, {
id: '52fd6vv87-3294-0001-05g6-4d4767890765',
name: 'nifi-email-bundle',
displayName: 'nifi-email-bundle',
type: 'extension',
sublabel: 'A sublabel',
compliant: {
id: '33fd6vv87-3549-0001-05g6-4d4567890765',
label: 'Compliant',
test: {
label: 'test'
},
type: 'certification'
},
versions: [{
id: '23d3cc59-0156-1000-06b4-2b0810089090',
revision: '1',
dependentFlows: [{
id: '23f6cc89-0156-1000-06b4-2b0810089090'
}],
created: new Date(),
updated: new Date()
}],
flows: [],
extensions: [],
assets: [],
actions: [{
'name': 'Delete',
'icon': 'fa fa-close',
'tooltip': 'Delete User'
}, {
'name': 'Manage',
'icon': 'fa fa-user',
'tooltip': 'Manage User'
}]
}];
this.filteredDroplets = [];
this.dropletColumns = [{
name: 'id',
label: 'ID',
sortable: true
}, {
name: 'name',
label: 'Name',
sortable: true
}, {
name: 'displayName',
label: 'Display Name',
sortable: true
}, {
name: 'sublabel',
label: 'Label',
sortable: true
}, {
name: 'type',
label: 'Type',
sortable: true
}];
this.activeDropletColumn = this.dropletColumns[0];
this.autoCompleteDroplets = [];
this.dropletsSearchTerms = []; //</editor-fold>
//<editor-fold desc='Data Tables'>
this.data = [{
'id': 1,
'name': 'Frozen yogurt',
'type': 'Ice cream',
'calories': 159.0,
'fat': 6.0,
'carbs': 24.0,
'protein': 4.0,
'sodium': 87.0,
'calcium': 14.0,
'iron': 1.0,
'comments': 'I love froyo!',
'actions': [{
'name': 'Action 1',
'icon': 'fa fa-user',
'tooltip': 'Manage Users'
}, {
'name': 'Action 2',
'icon': 'fa fa-key',
'tooltip': 'Manage Permissions'
}]
}, {
'id': 2,
'name': 'Ice cream sandwich',
'type': 'Ice cream',
'calories': 237.0,
'fat': 9.0,
'carbs': 37.0,
'protein': 4.3,
'sodium': 129.0,
'calcium': 8.0,
'iron': 1.0,
'actions': [{
'name': 'Action 1',
'icon': 'fa fa-user',
'tooltip': 'Manage Users'
}, {
'name': 'Action 2',
'icon': 'fa fa-key',
'tooltip': 'Manage Permissions'
}, {
'name': 'Action 3',
'tooltip': 'Action 3'
}, {
'name': 'Action 4',
'disabled': true,
'tooltip': 'Action 4'
}, {
'name': 'Action 5',
'tooltip': 'Action 5'
}]
}, {
'id': 3,
'name': 'Eclair',
'type': 'Pastry',
'calories': 262.0,
'fat': 16.0,
'carbs': 24.0,
'protein': 6.0,
'sodium': 337.0,
'calcium': 6.0,
'iron': 7.0,
'actions': [{
'name': 'Action 1',
'icon': 'fa fa-user',
'tooltip': 'Manage Users'
}, {
'name': 'Action 2',
'icon': 'fa fa-key',
'tooltip': 'Manage Permissions'
}, {
'name': 'Action 3',
'tooltip': 'Action 3'
}, {
'name': 'Action 4',
'disabled': true,
'tooltip': 'Action 4'
}, {
'name': 'Action 5',
'tooltip': 'Action 5'
}]
}, {
'id': 4,
'name': 'Cupcake',
'type': 'Pastry',
'calories': 305.0,
'fat': 3.7,
'carbs': 67.0,
'protein': 4.3,
'sodium': 413.0,
'calcium': 3.0,
'iron': 8.0,
'actions': [{
'name': 'Action 1',
'icon': 'fa fa-user',
'tooltip': 'Manage Users'
}, {
'name': 'Action 2',
'icon': 'fa fa-key',
'tooltip': 'Manage Permissions'
}, {
'name': 'Action 3',
'tooltip': 'Action 3'
}, {
'name': 'Action 4',
'disabled': true,
'tooltip': 'Action 4'
}, {
'name': 'Action 5',
'tooltip': 'Action 5'
}]
}, {
'id': 5,
'name': 'Jelly bean',
'type': 'Candy',
'calories': 375.0,
'fat': 0.0,
'carbs': 94.0,
'protein': 0.0,
'sodium': 50.0,
'calcium': 0.0,
'iron': 0.0
}, {
'id': 6,
'name': 'Lollipop',
'type': 'Candy',
'calories': 392.0,
'fat': 0.2,
'carbs': 98.0,
'protein': 0.0,
'sodium': 38.0,
'calcium': 0.0,
'iron': 2.0
}, {
'id': 7,
'name': 'Honeycomb',
'type': 'Other',
'calories': 408.0,
'fat': 3.2,
'carbs': 87.0,
'protein': 6.5,
'sodium': 562.0,
'calcium': 0.0,
'iron': 45.0
}, {
'id': 8,
'name': 'Donut',
'type': 'Pastry',
'calories': 452.0,
'fat': 25.0,
'carbs': 51.0,
'protein': 4.9,
'sodium': 326.0,
'calcium': 2.0,
'iron': 22.0
}, {
'id': 9,
'name': 'KitKat',
'type': 'Candy',
'calories': 518.0,
'fat': 26.0,
'carbs': 65.0,
'protein': 7.0,
'sodium': 54.0,
'calcium': 12.0,
'iron': 6.0
}, {
'id': 10,
'name': 'Chocolate',
'type': 'Candy',
'calories': 518.0,
'fat': 26.0,
'carbs': 65.0,
'protein': 7.0,
'sodium': 54.0,
'calcium': 12.0,
'iron': 6.0
}, {
'id': 11,
'name': 'Chamoy',
'type': 'Candy',
'calories': 518.0,
'fat': 26.0,
'carbs': 65.0,
'protein': 7.0,
'sodium': 54.0,
'calcium': 12.0,
'iron': 6.0
}];
this.filteredData = this.data;
this.filteredTotal = this.data.length;
this.columns = [{
name: 'comments',
label: 'Comments',
width: 10
}, {
name: 'name',
label: 'Dessert (100g serving)',
sortable: true,
width: 10
}, {
name: 'type',
label: 'Type',
sortable: true,
width: 10
}, {
name: 'calories',
label: 'Calories',
numeric: true,
format: NUMBER_FORMAT,
sortable: true,
width: 10
}, {
name: 'fat',
label: 'Fat (g)',
numeric: true,
format: DECIMAL_FORMAT,
sortable: true,
width: 10
}, {
name: 'carbs',
label: 'Carbs (g)',
numeric: true,
format: NUMBER_FORMAT,
sortable: true,
width: 10
}, {
name: 'protein',
label: 'Protein (g)',
numeric: true,
format: DECIMAL_FORMAT,
sortable: true,
width: 10
}, {
name: 'sodium',
label: 'Sodium (mg)',
numeric: true,
format: NUMBER_FORMAT,
sortable: true,
width: 10
}, {
name: 'calcium',
label: 'Calcium (%)',
numeric: true,
format: NUMBER_FORMAT,
sortable: true,
width: 10
}, {
name: 'iron',
label: 'Iron (%)',
numeric: true,
format: NUMBER_FORMAT,
width: 10
}];
this.allRowsSelected = false;
this.autoCompleteData = [];
this.selectedRows = [];
this.searchTerm = [];
this.fromRow = 1;
this.currentPage = 1;
this.pageSize = 5;
this.pageCount = 0; //</editor-fold>
//<editor-fold desc='Chips $ Autocomplete'>
this.readOnly = false;
this.items = ['stepper', 'expansion-panel', 'markdown', 'highlight', 'loading', 'media', 'chips', 'http', 'json-formatter', 'pipes', 'need more?'];
this.itemsRequireMatch = this.items.slice(0, 6); //</editor-fold>
//<editor-fold desc='Radios'>
this.favoriteSeason = 'Autumn';
this.seasonOptions = ['Winter', 'Spring', 'Summer', 'Autumn']; //</editor-fold>
//<editor-fold desc='Select'>
this.selectedValue = '';
this.foods = [{
value: 'steak-0',
viewValue: 'Steak'
}, {
value: 'pizza-1',
viewValue: 'Pizza'
}, {
value: 'tacos-2',
viewValue: 'Tacos'
}]; //</editor-fold>
//<editor-fold desc='Checkbox'>
this.user = {
agreesToTOS: false
};
this.groceries = [{
bought: true,
name: 'Seitan'
}, {
bought: false,
name: 'Almond Meal Flour'
}, {
bought: false,
name: 'Organic Eggs'
}]; //</editor-fold>
//<editor-fold desc='Slide Toggle'>
this.systems = [{
name: 'Lights',
on: false,
color: 'primary'
}, {
name: 'Surround Sound',
on: true,
color: 'accent'
}, {
name: 'T.V.',
on: true,
color: 'warn'
}];
this.house = {
lockHouse: false
}; //</editor-fold>
}
FdsDemo.prototype = {
constructor: FdsDemo,
//<editor-fold desc='Autocomplete'>
displayFn: function displayFn(value) {
return value && _typeof(value) === 'object' ? value.name : value;
},
filterStates: function filterStates(val) {
return val ? this.states.filter(function (s) {
return s.name.match(new RegExp(val, 'gi'));
}) : this.states;
},
//</editor-fold>
//<editor-fold desc='Snack Bars'>
showSuccessSnackBar: function showSuccessSnackBar() {
this.snackBarService.openCoaster({
title: 'Success',
message: 'Some help text regarding the successful event.',
verticalPosition: 'top',
horizontalPosition: 'right',
icon: 'fa fa-check-circle-o',
color: '#1EB475',
duration: 3000
});
},
showWarnSnackBar: function showWarnSnackBar() {
this.snackBarService.openCoaster({
title: 'Warning',
message: 'Some help text regarding the warning.',
verticalPosition: 'top',
horizontalPosition: 'left',
icon: 'fa fa-exclamation-triangle',
color: '#E98A40',
duration: 3000
});
},
showErrorSnackBar: function showErrorSnackBar() {
this.snackBarService.openCoaster({
title: 'Error',
message: 'Some help text regarding the critical error. This coaster will stay open until closed with the `x` or if another coaster is created.',
verticalPosition: 'bottom',
horizontalPosition: 'right',
icon: 'fa fa-times-circle-o',
color: '#EF6162'
});
},
showRegularSnackBar: function showRegularSnackBar() {
this.snackBarService.openCoaster({
title: 'Regular',
message: 'Something interesting.',
verticalPosition: 'bottom',
horizontalPosition: 'left',
color: '#808793',
duration: 3000
});
},
//</editor-fold>
//<editor-fold desc='Dialog'>
openDialog: function openDialog() {
this.dialog.open(webapp_components_flow_design_system_dialogs_demo_fds_demo_dialog_js__WEBPACK_IMPORTED_MODULE_5__["default"]);
},
//</editor-fold>
//<editor-fold desc='Expansion Panel'>
toggleExpansion1: function toggleExpansion1() {
if (!this.disabled) {
this.expansion1 = !this.expansion1;
}
},
toggleDisabled: function toggleDisabled() {
this.disabled = !this.disabled;
},
expandExpansion1Event: function expandExpansion1Event() {
this.expandCollapseExpansion1Msg = 'Expand event emitted.';
},
collapseExpansion1Event: function collapseExpansion1Event() {
this.expandCollapseExpansion1Msg = 'Collapse event emitted.';
},
//</editor-fold>
//<editor-fold desc='Simple Dialogs'>
openAlert: function openAlert() {
this.dialogService.openAlert({
title: 'Alert',
disableClose: true,
message: 'This is how simple it is to create an alert with this wrapper service.'
});
},
openConfirm: function openConfirm() {
this.dialogService.openConfirm({
title: 'Confirm',
message: 'This is how simple it is to create a confirm with this wrapper service. Do you agree?',
cancelButton: 'Disagree',
acceptButton: 'Agree'
});
},
openPrompt: function openPrompt() {
this.dialogService.openPrompt({
title: 'Prompt',
message: 'This is how simple it is to create a prompt with this wrapper service. Prompt something.',
value: 'Populated value',
cancelButton: 'Cancel',
acceptButton: 'Ok'
});
},
//</editor-fold>
//<editor-fold desc='Searchable Expansion Panels'>
isDropletFilterChecked: function isDropletFilterChecked(term) {
return this.dropletsSearchTerms.indexOf(term) > -1;
},
getDropletTypeCount: function getDropletTypeCount(type) {
return this.filteredDroplets.filter(function (droplet) {
return droplet.type === type;
}).length;
},
getDropletCertificationCount: function getDropletCertificationCount(certification) {
return this.filteredDroplets.filter(function (droplet) {
return Object.keys(droplet).find(function (key) {
if (key === certification && droplet[certification].type === 'certification') {
return droplet;
}
return null;
});
}).length;
},
getSortBy: function getSortBy() {
var sortByColumnLabel;
var arrayLength = this.dropletColumns.length;
for (var i = 0; i < arrayLength; i++) {
if (this.dropletColumns[i].active === true) {
sortByColumnLabel = this.dropletColumns[i].label;
break;
}
}
return sortByColumnLabel;
},
sortDroplets: function sortDroplets(column) {
if (column.sortable === true) {
// toggle column sort order
column.sortOrder = column.sortOrder === 'ASC' ? 'DESC' : 'ASC';
var sortOrder = column.sortOrder;
this.filterDroplets(column.name, sortOrder); //only one column can be actively sorted so we reset all to inactive
this.dropletColumns.forEach(function (c) {
c.active = false;
}); //and set this column as the actively sorted column
column.active = true;
this.activeDropletColumn = column;
}
},
toggleDropletsFilter: function toggleDropletsFilter(searchTerm) {
var applySearchTerm = true; // check if the search term is already applied and remove it if true
if (this.dropletsSearchTerms.length > 0) {
var arrayLength = this.dropletsSearchTerms.length;
for (var i = 0; i < arrayLength; i++) {
var index = this.dropletsSearchTerms.indexOf(searchTerm);
if (index > -1) {
this.dropletsSearchTerms.splice(index, 1);
applySearchTerm = false;
}
}
} // if we just removed the search term do NOT apply it again
if (applySearchTerm) {
this.dropletsSearchTerms.push(searchTerm);
}
this.filterDroplets(this.activeDropletColumn.name, this.activeDropletColumn.sortOrder);
},
filterDroplets: function filterDroplets(sortBy, sortOrder) {
// if `sortOrder` is `undefined` then use 'ASC'
if (sortOrder === undefined) {
sortOrder = 'ASC';
} // if `sortBy` is `undefined` then find the first sortable column in this.dropletColumns
if (sortBy === undefined) {
var arrayLength = this.dropletColumns.length;
for (var i = 0; i < arrayLength; i++) {
if (this.dropletColumns[i].sortable === true) {
sortBy = this.dropletColumns[i].name;
this.activeDropletColumn = this.dropletColumns[i]; //only one column can be actively sorted so we reset all to inactive
this.dropletColumns.forEach(function (c) {
c.active = false;
}); //and set this column as the actively sorted column
this.dropletColumns[i].active = true;
this.dropletColumns[i].sortOrder = sortOrder;
break;
}
}
}
var newData = this.droplets;
for (var _i = 0; _i < this.dropletsSearchTerms.length; _i++) {
newData = this.filterData(newData, this.dropletsSearchTerms[_i], true, this.activeDropletColumn.name);
}
newData = this.dataTableService.sortData(newData, sortBy, sortOrder);
this.filteredDroplets = newData;
this.getAutoCompleteDroplets();
},
getAutoCompleteDroplets: function getAutoCompleteDroplets() {
var self = this;
this.autoCompleteDroplets = [];
this.dropletColumns.forEach(function (c) {
self.filteredDroplets.forEach(function (r) {
return r[c.name.toLowerCase()] ? self.autoCompleteDroplets.push(r[c.name.toLowerCase()].toString()) : '';
});
});
},
//</editor-fold>
filterData: function filterData(data, searchTerm, ignoreCase) {
var field = '';
if (searchTerm.indexOf(':') > -1) {
field = searchTerm.split(':')[0].trim();
searchTerm = searchTerm.split(':')[1].trim();
}
var filter = searchTerm ? ignoreCase ? searchTerm.toLowerCase() : searchTerm : '';
if (filter) {
data = data.filter(function (item) {
var res = Object.keys(item).find(function (key) {
if (field.indexOf('.') > -1) {
var objArray = field.split('.');
var obj = item;
var arrayLength = objArray.length;
for (var i = 0; i < arrayLength; i++) {
try {
obj = obj[objArray[i]];
} catch (e) {
return false;
}
}
var _preItemValue = '' + obj;
var _itemValue = ignoreCase ? _preItemValue.toLowerCase() : _preItemValue;
return _itemValue.indexOf(filter) > -1;
}
if (key !== field && field !== '') {
return false;
}
var preItemValue = '' + item[key];
var itemValue = ignoreCase ? preItemValue.toLowerCase() : preItemValue;
return itemValue.indexOf(filter) > -1;
});
return !(typeof res === 'undefined');
});
}
return data;
},
//<editor-fold desc='Data Tables'>
sort: function sort(sortEvent, column) {
if (column.sortable) {
var sortBy = column.name;
column.sortOrder = column.sortOrder === 'ASC' ? 'DESC' : 'ASC';
var sortOrder = column.sortOrder;
this.filter(sortBy, sortOrder); //only one column can be actively sorted so we reset all to inactive
this.columns.forEach(function (c) {
c.active = false;
}); //and set this column as the actively sorted column
column.active = true;
}
},
searchRemove: function searchRemove(searchTerm) {
//only remove the first occurrence of the search term
var index = this.searchTerm.indexOf(searchTerm);
if (index !== -1) {
this.searchTerm.splice(index, 1);
}
this.fromRow = 1;
this.currentPage = 1;
this.filter();
},
searchAdd: function searchAdd(searchTerm) {
this.searchTerm.push(searchTerm);
this.fromRow = 1;
this.currentPage = 1;
this.filter();
},
page: function page(pagingEvent) {
this.fromRow = pagingEvent.fromRow;
this.currentPage = pagingEvent.page;
this.pageSize = pagingEvent.pageSize;
this.allRowsSelected = false;
this.filter();
},
filter: function filter(sortBy, sortOrder) {
if (this.allRowsSelected) {
this.toggleSelectAll();
}
this.deselectAll();
var newData = this.data;
for (var i = 0; i < this.searchTerm.length; i++) {
newData = this.filterData(newData, this.searchTerm[i], true);
}
this.filteredTotal = newData.length;
newData = this.dataTableService.sortData(newData, sortBy, sortOrder);
this.pageCount = newData.length;
newData = this.dataTableService.pageData(newData, this.fromRow, this.currentPage * this.pageSize);
this.filteredData = newData;
this.getAutoCompleteData();
},
toggleSelect: function toggleSelect(row) {
if (this.allFilteredRowsSelected()) {
this.allRowsSelected = true;
} else {
this.allRowsSelected = false;
}
},
toggleSelectAll: function toggleSelectAll() {
if (this.allRowsSelected) {
this.selectAll();
} else {
this.deselectAll();
}
},
selectAll: function selectAll() {
this.filteredData.forEach(function (c) {
c.checked = true;
});
},
deselectAll: function deselectAll() {
this.filteredData.forEach(function (c) {
c.checked = false;
});
},
allFilteredRowsSelected: function allFilteredRowsSelected() {
var allFilteredRowsSelected = true;
this.filteredData.forEach(function (c) {
if (c.checked === undefined || c.checked === false) {
allFilteredRowsSelected = false;
}
});
return allFilteredRowsSelected;
},
areTooltipsOn: function areTooltipsOn() {
return this.columns[0].hasOwnProperty('tooltip');
},
toggleTooltips: function toggleTooltips() {
if (this.columns[0].tooltip) {
this.columns.forEach(function (c) {
delete c.tooltip;
});
} else {
this.columns.forEach(function (c) {
c.tooltip = 'This is ' + c.label + '!';
});
}
},
openDataTablePrompt: function openDataTablePrompt(row, name) {
this.dialogService.openPrompt({
message: 'Enter comment?',
value: row[name]
}).afterClosed().subscribe(function (value) {
if (value !== undefined) {
row[name] = value;
}
});
},
getAutoCompleteData: function getAutoCompleteData() {
var self = this;
this.autoCompleteData = [];
this.columns.forEach(function (c) {
self.filteredData.forEach(function (r) {
return r[c.name.toLowerCase()] ? self.autoCompleteData.push(r[c.name.toLowerCase()].toString()) : '';
});
});
},
//</editor-fold>
//<editor-fold desc='Chips $ Autocomplete'>
toggleReadOnly: function toggleReadOnly() {
this.readOnly = !this.readOnly;
},
//</editor-fold>
//<editor-fold desc='Life Cycle Listeners'>
/**
* Initialize the component
*/
ngOnInit: function ngOnInit() {
this.filter();
this.filterDroplets();
},
/**
* Respond after Angular checks the component's views and child views
*/
ngAfterViewChecked: function ngAfterViewChecked() {
this.fdsService.inProgress = false;
} //</editor-fold>
};
FdsDemo.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"]({
template: __webpack_require__(/*! ./fds-demo.html */ "./webapp/components/flow-design-system/fds-demo.html"),
animations: [_nifi_fds_core__WEBPACK_IMPORTED_MODULE_3__["FdsAnimations"].slideInLeftAnimation],
host: {
'[@routeAnimation]': 'routeAnimation'
}
})];
FdsDemo.parameters = [_nifi_fds_core__WEBPACK_IMPORTED_MODULE_3__["FdsSnackBarService"], webapp_services_fds_service_js__WEBPACK_IMPORTED_MODULE_4__["default"], _angular_material__WEBPACK_IMPORTED_MODULE_2__["MatDialog"], _covalent_core_data_table__WEBPACK_IMPORTED_MODULE_1__["TdDataTableService"], _nifi_fds_core__WEBPACK_IMPORTED_MODULE_3__["FdsDialogService"]];
/* harmony default export */ __webpack_exports__["default"] = (FdsDemo);
/***/ }),
/***/ "./webapp/fds-bootstrap.js":
/*!*********************************!*\
!*** ./webapp/fds-bootstrap.js ***!
\*********************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js */ "./node_modules/core-js/index.js");
/* harmony import */ var core_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var zone_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! zone.js */ "./node_modules/zone.js/dist/zone.js");
/* harmony import */ var zone_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(zone_js__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var hammerjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");
/* harmony import */ var hammerjs__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(hammerjs__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var _angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/platform-browser-dynamic */ "./node_modules/@angular/platform-browser-dynamic/fesm5/platform-browser-dynamic.js");
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var webapp_fds_module_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! webapp/fds.module.js */ "./webapp/fds.module.js");
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Comment out this line when developing to assert for unidirectional data flow
Object(_angular_core__WEBPACK_IMPORTED_MODULE_5__["enableProdMode"])(); // Get the locale id from the global
var locale = navigator.language;
var providers = []; // No locale or U.S. English: no translation providers so go ahead and bootstrap the app
if (!locale || locale === 'en-US') {
Object(_angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_4__["platformBrowserDynamic"])().bootstrapModule(webapp_fds_module_js__WEBPACK_IMPORTED_MODULE_6__["default"], {
providers: providers
});
} else {
//load the translation providers and bootstrap the module
var translationFile = '/locale/messages.' + locale + '.xlf';
jquery__WEBPACK_IMPORTED_MODULE_3___default.a.ajax({
url: translationFile
}).done(function (translations) {
// add providers if translation file for locale is loaded
if (translations) {
providers.push({
provide: _angular_core__WEBPACK_IMPORTED_MODULE_5__["TRANSLATIONS"],
useValue: translations
});
providers.push({
provide: _angular_core__WEBPACK_IMPORTED_MODULE_5__["TRANSLATIONS_FORMAT"],
useValue: 'xlf'
});
providers.push({
provide: _angular_core__WEBPACK_IMPORTED_MODULE_5__["LOCALE_ID"],
useValue: locale
});
}
Object(_angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_4__["platformBrowserDynamic"])().bootstrapModule(webapp_fds_module_js__WEBPACK_IMPORTED_MODULE_6__["default"], {
providers: providers
});
}).fail(function () {
Object(_angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_4__["platformBrowserDynamic"])().bootstrapModule(webapp_fds_module_js__WEBPACK_IMPORTED_MODULE_6__["default"], {
providers: providers
});
});
}
/***/ }),
/***/ "./webapp/fds.html":
/*!*************************!*\
!*** ./webapp/fds.html ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = "<!--\nLicensed to the Apache Software Foundation (ASF) under one or more\ncontributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright ownership.\nThe ASF licenses this file to You under the Apache License, Version 2.0\n(the \"License\"); you may not use this file except in compliance with\nthe License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n-->\n\n<mat-progress-spinner id=\"loading-spinner\" *ngIf=\"fdsService.inProgress\" mode=\"indeterminate\"></mat-progress-spinner>\n<mat-sidenav-container>\n <mat-sidenav #sidenav mode=\"over\" align=\"end\" opened=\"false\" disableClose=\"true\">\n <router-outlet name=\"sidenav\"></router-outlet>\n </mat-sidenav>\n <div id=\"fds-app-container\">\n <mat-toolbar id=\"fds-toolbar\">\n <!-- <img id=\"fds-logo\" src=\"fds/images/fds-logo-web-app.svg\"> -->\n <div *ngIf=\"fdsService.perspective !== 'login' && fdsService.perspective !== 'not-found'\" fxFlex=\"1 1 auto\" class=\"pad-left-xl\" [@flyInOut]=\"fdsService.breadCrumbState\">\n <span class=\"pointer\">{{fdsService.title}}</span>\n </div>\n </mat-toolbar>\n <div id=\"fds-perspectives-container\">\n <router-outlet></router-outlet>\n </div>\n </div>\n</mat-sidenav-container>\n";
/***/ }),
/***/ "./webapp/fds.js":
/*!***********************!*\
!*** ./webapp/fds.js ***!
\***********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var webapp_services_fds_service_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! webapp/services/fds.service.js */ "./webapp/services/fds.service.js");
/* harmony import */ var _nifi_fds_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @nifi-fds/core */ "./platform/core/index.js");
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Fds constructor.
*
* @param fdsService The fds service.
* @param changeDetectorRef The change detector ref.
* @constructor
*/
function Fds(fdsService, changeDetectorRef) {
this.fdsService = fdsService;
this.cd = changeDetectorRef;
}
Fds.prototype = {
constructor: Fds,
/**
* Initialize the component
*/
ngOnInit: function ngOnInit() {
this.fdsService.sidenav = this.sidenav; //ngCore.ViewChild
},
/**
* Since the child views are updating the fdsService values that are used to display
* the breadcrumbs in this component's view we need to manually detect changes at the correct
* point in the lifecycle.
*/
ngAfterViewChecked: function ngAfterViewChecked() {
this.cd.detectChanges();
}
};
Fds.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"]({
selector: 'fds-app',
template: __webpack_require__(/*! ./fds.html */ "./webapp/fds.html"),
queries: {
sidenav: new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewChild"]('sidenav')
},
animations: [_nifi_fds_core__WEBPACK_IMPORTED_MODULE_2__["FdsAnimations"].flyInOutAnimation]
})];
Fds.parameters = [webapp_services_fds_service_js__WEBPACK_IMPORTED_MODULE_1__["default"], _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"]];
/* harmony default export */ __webpack_exports__["default"] = (Fds);
/***/ }),
/***/ "./webapp/fds.module.js":
/*!******************************!*\
!*** ./webapp/fds.module.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var _nifi_fds_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @nifi-fds/core */ "./platform/core/index.js");
/* harmony import */ var webapp_fds_routes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! webapp/fds.routes.js */ "./webapp/fds.routes.js");
/* harmony import */ var webapp_fds_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! webapp/fds.js */ "./webapp/fds.js");
/* harmony import */ var webapp_components_flow_design_system_fds_demo_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! webapp/components/flow-design-system/fds-demo.js */ "./webapp/components/flow-design-system/fds-demo.js");
/* harmony import */ var webapp_components_flow_design_system_dialogs_demo_fds_demo_dialog_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.js */ "./webapp/components/flow-design-system/dialogs/demo/fds-demo-dialog.js");
/* harmony import */ var webapp_services_fds_service_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! webapp/services/fds.service.js */ "./webapp/services/fds.service.js");
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function FdsModule() {}
FdsModule.prototype = {
constructor: FdsModule
};
FdsModule.annotations = [new _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"]({
imports: [_nifi_fds_core__WEBPACK_IMPORTED_MODULE_1__["FdsCoreModule"], webapp_fds_routes_js__WEBPACK_IMPORTED_MODULE_2__["default"]],
declarations: [webapp_fds_js__WEBPACK_IMPORTED_MODULE_3__["default"], webapp_components_flow_design_system_fds_demo_js__WEBPACK_IMPORTED_MODULE_4__["default"], webapp_components_flow_design_system_dialogs_demo_fds_demo_dialog_js__WEBPACK_IMPORTED_MODULE_5__["default"]],
entryComponents: [webapp_components_flow_design_system_dialogs_demo_fds_demo_dialog_js__WEBPACK_IMPORTED_MODULE_5__["default"]],
providers: [webapp_services_fds_service_js__WEBPACK_IMPORTED_MODULE_6__["default"]],
bootstrap: [webapp_fds_js__WEBPACK_IMPORTED_MODULE_3__["default"]]
})];
/* harmony default export */ __webpack_exports__["default"] = (FdsModule);
/***/ }),
/***/ "./webapp/fds.routes.js":
/*!******************************!*\
!*** ./webapp/fds.routes.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/fesm5/router.js");
/* harmony import */ var webapp_components_flow_design_system_fds_demo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! webapp/components/flow-design-system/fds-demo.js */ "./webapp/components/flow-design-system/fds-demo.js");
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var FdsRoutes = _angular_router__WEBPACK_IMPORTED_MODULE_0__["RouterModule"].forRoot([{
path: '',
component: webapp_components_flow_design_system_fds_demo_js__WEBPACK_IMPORTED_MODULE_1__["default"]
}]);
/* harmony default export */ __webpack_exports__["default"] = (FdsRoutes);
/***/ }),
/***/ "./webapp/services/fds.service.js":
/*!****************************************!*\
!*** ./webapp/services/fds.service.js ***!
\****************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _covalent_core_data_table__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @covalent/core/data-table */ "./node_modules/@covalent/core/fesm5/covalent-core-data-table.js");
/* harmony import */ var _nifi_fds_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @nifi-fds/core */ "./platform/core/index.js");
/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../package.json */ "./package.json");
var _package_json__WEBPACK_IMPORTED_MODULE_2___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../../package.json */ "./package.json", 1);
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the 'License'); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* FdsService constructor.
*
* @param tdDataTableService The covalent data table service module.
* @param fdsDialogService The FDS dialog service.
* @param fdsSnackBarService The FDS snack bar service module.
* @constructor
*/
function FdsService(tdDataTableService, fdsDialogService, fdsSnackBarService) {
// Services
this.dialogService = fdsDialogService;
this.snackBarService = fdsSnackBarService;
this.dataTableService = tdDataTableService; // General
this.title = 'Apache NiFi Flow Design System Demo v' + _package_json__WEBPACK_IMPORTED_MODULE_2__["version"];
this.inProgress = true;
this.perspective = '';
}
FdsService.prototype = {
constructor: FdsService
};
FdsService.parameters = [_covalent_core_data_table__WEBPACK_IMPORTED_MODULE_0__["TdDataTableService"], _nifi_fds_core__WEBPACK_IMPORTED_MODULE_1__["FdsDialogService"], _nifi_fds_core__WEBPACK_IMPORTED_MODULE_1__["FdsSnackBarService"]];
/* harmony default export */ __webpack_exports__["default"] = (FdsService);
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bhbmd1bGFyL2NvcmUvZmVzbTUgbGF6eSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvY29tbW9uL2Zkcy1jb21tb24ubW9kdWxlLmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvY29tbW9uL2Zkcy5hbmltYXRpb25zLmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvY29tbW9uL3NlcnZpY2VzL2Zkcy1zdG9yYWdlLnNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vcGxhdGZvcm0vY29yZS9kaWFsb2dzL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvZGlhbG9ncy9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vcGxhdGZvcm0vY29yZS9kaWFsb2dzL2Zkcy1kaWFsb2cuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vcGxhdGZvcm0vY29yZS9kaWFsb2dzL2Zkcy1kaWFsb2cuY29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvZGlhbG9ncy9mZHMtZGlhbG9ncy5tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4vcGxhdGZvcm0vY29yZS9kaWFsb2dzL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvZmxvdy1kZXNpZ24tc3lzdGVtLm1vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9wbGF0Zm9ybS9jb3JlL2luZGV4LmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvc25hY2tiYXJzL2NvYXN0ZXIvY29hc3Rlci5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9wbGF0Zm9ybS9jb3JlL3NuYWNrYmFycy9jb2FzdGVyL2NvYXN0ZXIuY29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvc25hY2tiYXJzL2Zkcy1zbmFja2Jhci5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9wbGF0Zm9ybS9jb3JlL3NuYWNrYmFycy9mZHMtc25hY2tiYXIuY29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvc25hY2tiYXJzL2Zkcy1zbmFja2JhcnMubW9kdWxlLmpzIiwid2VicGFjazovLy8uL3BsYXRmb3JtL2NvcmUvc25hY2tiYXJzL3NlcnZpY2VzL3NuYWNrYmFyLnNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vd2ViYXBwL2NvbXBvbmVudHMvZmxvdy1kZXNpZ24tc3lzdGVtL2RpYWxvZ3MvZGVtby9mZHMtZGVtby1kaWFsb2cuaHRtbCIsIndlYnBhY2s6Ly8vLi93ZWJhcHAvY29tcG9uZW50cy9mbG93LWRlc2lnbi1zeXN0ZW0vZGlhbG9ncy9kZW1vL2Zkcy1kZW1vLWRpYWxvZy5qcyIsIndlYnBhY2s6Ly8vLi93ZWJhcHAvY29tcG9uZW50cy9mbG93LWRlc2lnbi1zeXN0ZW0vZmRzLWRlbW8uaHRtbCIsIndlYnBhY2s6Ly8vLi93ZWJhcHAvY29tcG9uZW50cy9mbG93LWRlc2lnbi1zeXN0ZW0vZmRzLWRlbW8uanMiLCJ3ZWJwYWNrOi8vLy4vd2ViYXBwL2Zkcy1ib290c3RyYXAuanMiLCJ3ZWJwYWNrOi8vLy4vd2ViYXBwL2Zkcy5odG1sIiwid2VicGFjazovLy8uL3dlYmFwcC9mZHMuanMiLCJ3ZWJwYWNrOi8vLy4vd2ViYXBwL2Zkcy5tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4vd2ViYXBwL2Zkcy5yb3V0ZXMuanMiLCJ3ZWJwYWNrOi8vLy4vd2ViYXBwL3NlcnZpY2VzL2Zkcy5zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdC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QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEOztBQUVBO0FBQ0EsZ0VBQWdFO0FBQ2hFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUcsRUFBRTtBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDRHQUFhO0FBQ2xDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxH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Q2pDLGNBQWMsc0VBQVU7QUFDeEIsY0FBYyxxREFBRztBQUNqQixDQUFDO0FBQ2Msd0VBQVMsRTs7Ozs7Ozs7Ozs7O0FDcEN4QjtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQytDO0FBQ3dCO0FBQ3ZFLGdCQUFnQiw0REFBWTtBQUM1QjtBQUNBLGFBQWEsd0ZBQU87QUFDcEIsQ0FBQztBQUNjLHdFQUFTLEU7Ozs7Ozs7Ozs7OztBQ3RCeEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDK0Q7QUFDTztBQUN6QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDOztBQUU3Qyx5REFBeUQscURBQU87QUFDaEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qiw0RUFBa0IsRUFBRSwrREFBZ0IsRUFBRSxpRUFBa0I7QUFDbEUseUVBQVUsRSIsImZpbGUiOiJmZHMtZGVtby5idW5kbGUubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gaW5zdGFsbCBhIEpTT05QIGNhbGxiYWNrIGZvciBjaHVuayBsb2FkaW5nXG4gXHRmdW5jdGlvbiB3ZWJwYWNrSnNvbnBDYWxsYmFjayhkYXRhKSB7XG4gXHRcdHZhciBjaHVua0lkcyA9IGRhdGFbMF07XG4gXHRcdHZhciBtb3JlTW9kdWxlcyA9IGRhdGFbMV07XG4gXHRcdHZhciBleGVjdXRlTW9kdWxlcyA9IGRhdGFbMl07XG5cbiBcdFx0Ly8gYWRkIFwibW9yZU1vZHVsZXNcIiB0byB0aGUgbW9kdWxlcyBvYmplY3QsXG4gXHRcdC8vIHRoZW4gZmxhZyBhbGwgXCJjaHVua0lkc1wiIGFzIGxvYWRlZCBhbmQgZmlyZSBjYWxsYmFja1xuIFx0XHR2YXIgbW9kdWxlSWQsIGNodW5rSWQsIGkgPSAwLCByZXNvbHZlcyA9IFtdO1xuIFx0XHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuIFx0XHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcbiBcdFx0XHRpZihpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcbiBcdFx0XHRcdHJlc29sdmVzLnB1c2goaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdWzBdKTtcbiBcdFx0XHR9XG4gXHRcdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcbiBcdFx0fVxuIFx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcbiBcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuIFx0XHRcdFx0bW9kdWxlc1ttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0fVxuIFx0XHR9XG4gXHRcdGlmKHBhcmVudEpzb25wRnVuY3Rpb24pIHBhcmVudEpzb25wRnVuY3Rpb24oZGF0YSk7XG5cbiBcdFx0d2hpbGUocmVzb2x2ZXMubGVuZ3RoKSB7XG4gXHRcdFx0cmVzb2x2ZXMuc2hpZnQoKSgpO1xuIFx0XHR9XG5cbiBcdFx0Ly8gYWRkIGVudHJ5IG1vZHVsZXMgZnJvbSBsb2FkZWQgY2h1bmsgdG8gZGVmZXJyZWQgbGlzdFxuIFx0XHRkZWZlcnJlZE1vZHVsZXMucHVzaC5hcHBseShkZWZlcnJlZE1vZHVsZXMsIGV4ZWN1dGVNb2R1bGVzIHx8IFtdKTtcblxuIFx0XHQvLyBydW4gZGVmZXJyZWQgbW9kdWxlcyB3aGVuIGFsbCBjaHVua3MgcmVhZHlcbiBcdFx0cmV0dXJuIGNoZWNrRGVmZXJyZWRNb2R1bGVzKCk7XG4gXHR9O1xuIFx0ZnVuY3Rpb24gY2hlY2tEZWZlcnJlZE1vZHVsZXMoKSB7XG4gXHRcdHZhciByZXN1bHQ7XG4gXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBkZWZlcnJlZE1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiBcdFx0XHR2YXIgZGVmZXJyZWRNb2R1bGUgPSBkZWZlcnJlZE1vZHVsZXNbaV07XG4gXHRcdFx0dmFyIGZ1bGZpbGxlZCA9IHRydWU7XG4gXHRcdFx0Zm9yKHZhciBqID0gMTsgaiA8IGRlZmVycmVkTW9kdWxlLmxlbmd0aDsgaisrKSB7XG4gXHRcdFx0XHR2YXIgZGVwSWQgPSBkZWZlcnJlZE1vZHVsZVtqXTtcbiBcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rc1tkZXBJZF0gIT09IDApIGZ1bGZpbGxlZCA9IGZhbHNlO1xuIFx0XHRcdH1cbiBcdFx0XHRpZihmdWxmaWxsZWQpIHtcbiBcdFx0XHRcdGRlZmVycmVkTW9kdWxlcy5zcGxpY2UoaS0tLCAxKTtcbiBcdFx0XHRcdHJlc3VsdCA9IF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gZGVmZXJyZWRNb2R1bGVbMF0pO1xuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdHJldHVybiByZXN1bHQ7XG4gXHR9XG4gXHRmdW5jdGlvbiBob3REaXNwb3NlQ2h1bmsoY2h1bmtJZCkge1xuIFx0XHRkZWxldGUgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdO1xuIFx0fVxuIFx0dmFyIHBhcmVudEhvdFVwZGF0ZUNhbGxiYWNrID0gd2luZG93W1wid2VicGFja0hvdFVwZGF0ZVwiXTtcbiBcdHdpbmRvd1tcIndlYnBhY2tIb3RVcGRhdGVcIl0gPSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdGZ1bmN0aW9uIHdlYnBhY2tIb3RVcGRhdGVDYWxsYmFjayhjaHVua0lkLCBtb3JlTW9kdWxlcykge1xuIFx0XHRob3RBZGRVcGRhdGVDaHVuayhjaHVua0lkLCBtb3JlTW9kdWxlcyk7XG4gXHRcdGlmIChwYXJlbnRIb3RVcGRhdGVDYWxsYmFjaykgcGFyZW50SG90VXBkYXRlQ2FsbGJhY2soY2h1bmtJZCwgbW9yZU1vZHVsZXMpO1xuIFx0fSA7XG5cbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gaG90RG93bmxvYWRVcGRhdGVDaHVuayhjaHVua0lkKSB7XG4gXHRcdHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuIFx0XHRzY3JpcHQuY2hhcnNldCA9IFwidXRmLThcIjtcbiBcdFx0c2NyaXB0LnNyYyA9IF9fd2VicGFja19yZXF1aXJlX18ucCArIFwiXCIgKyBjaHVua0lkICsgXCIuXCIgKyBob3RDdXJyZW50SGFzaCArIFwiLmhvdC11cGRhdGUuanNcIjtcbiBcdFx0aWYgKG51bGwpIHNjcmlwdC5jcm9zc09yaWdpbiA9IG51bGw7XG4gXHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiBcdH1cblxuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHRmdW5jdGlvbiBob3REb3dubG9hZE1hbmlmZXN0KHJlcXVlc3RUaW1lb3V0KSB7XG4gXHRcdHJlcXVlc3RUaW1lb3V0ID0gcmVxdWVzdFRpbWVvdXQgfHwgMTAwMDA7XG4gXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiBcdFx0XHRpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gXHRcdFx0XHRyZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcIk5vIGJyb3dzZXIgc3VwcG9ydFwiKSk7XG4gXHRcdFx0fVxuIFx0XHRcdHRyeSB7XG4gXHRcdFx0XHR2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuIFx0XHRcdFx0dmFyIHJlcXVlc3RQYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXy5wICsgXCJcIiArIGhvdEN1cnJlbnRIYXNoICsgXCIuaG90LXVwZGF0ZS5qc29uXCI7XG4gXHRcdFx0XHRyZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgcmVxdWVzdFBhdGgsIHRydWUpO1xuIFx0XHRcdFx0cmVxdWVzdC50aW1lb3V0ID0gcmVxdWVzdFRpbWVvdXQ7XG4gXHRcdFx0XHRyZXF1ZXN0LnNlbmQobnVsbCk7XG4gXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG4gXHRcdFx0XHRyZXR1cm4gcmVqZWN0KGVycik7XG4gXHRcdFx0fVxuIFx0XHRcdHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gXHRcdFx0XHRpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSByZXR1cm47XG4gXHRcdFx0XHRpZiAocmVxdWVzdC5zdGF0dXMgPT09IDApIHtcbiBcdFx0XHRcdFx0Ly8gdGltZW91dFxuIFx0XHRcdFx0XHRyZWplY3QoXG4gXHRcdFx0XHRcdFx0bmV3IEVycm9yKFwiTWFuaWZlc3QgcmVxdWVzdCB0byBcIiArIHJlcXVlc3RQYXRoICsgXCIgdGltZWQgb3V0LlwiKVxuIFx0XHRcdFx0XHQpO1xuIFx0XHRcdFx0fSBlbHNlIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gNDA0KSB7XG4gXHRcdFx0XHRcdC8vIG5vIHVwZGF0ZSBhdmFpbGFibGVcbiBcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuIFx0XHRcdFx0fSBlbHNlIGlmIChyZXF1ZXN0LnN0YXR1cyAhPT0gMjAwICYmIHJlcXVlc3Quc3RhdHVzICE9PSAzMDQpIHtcbiBcdFx0XHRcdFx0Ly8gb3RoZXIgZmFpbHVyZVxuIFx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKFwiTWFuaWZlc3QgcmVxdWVzdCB0byBcIiArIHJlcXVlc3RQYXRoICsgXCIgZmFpbGVkLlwiKSk7XG4gXHRcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0XHQvLyBzdWNjZXNzXG4gXHRcdFx0XHRcdHRyeSB7XG4gXHRcdFx0XHRcdFx0dmFyIHVwZGF0ZSA9IEpTT04ucGFyc2UocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuIFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG4gXHRcdFx0XHRcdFx0cmVqZWN0KGUpO1xuIFx0XHRcdFx0XHRcdHJldHVybjtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRyZXNvbHZlKHVwZGF0ZSk7XG4gXHRcdFx0XHR9XG4gXHRcdFx0fTtcbiBcdFx0fSk7XG4gXHR9XG5cbiBcdHZhciBob3RBcHBseU9uVXBkYXRlID0gdHJ1ZTtcbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0dmFyIGhvdEN1cnJlbnRIYXNoID0gXCI0ZmYwMWEwZTMyN2VkZGVmMjVmOVwiO1xuIFx0dmFyIGhvdFJlcXVlc3RUaW1lb3V0ID0gMTAwMDA7XG4gXHR2YXIgaG90Q3VycmVudE1vZHVsZURhdGEgPSB7fTtcbiBcdHZhciBob3RDdXJyZW50Q2hpbGRNb2R1bGU7XG4gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdHZhciBob3RDdXJyZW50UGFyZW50cyA9IFtdO1xuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHR2YXIgaG90Q3VycmVudFBhcmVudHNUZW1wID0gW107XG5cbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gaG90Q3JlYXRlUmVxdWlyZShtb2R1bGVJZCkge1xuIFx0XHR2YXIgbWUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0aWYgKCFtZSkgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX187XG4gXHRcdHZhciBmbiA9IGZ1bmN0aW9uKHJlcXVlc3QpIHtcbiBcdFx0XHRpZiAobWUuaG90LmFjdGl2ZSkge1xuIFx0XHRcdFx0aWYgKGluc3RhbGxlZE1vZHVsZXNbcmVxdWVzdF0pIHtcbiBcdFx0XHRcdFx0aWYgKGluc3RhbGxlZE1vZHVsZXNbcmVxdWVzdF0ucGFyZW50cy5pbmRleE9mKG1vZHVsZUlkKSA9PT0gLTEpIHtcbiBcdFx0XHRcdFx0XHRpbnN0YWxsZWRNb2R1bGVzW3JlcXVlc3RdLnBhcmVudHMucHVzaChtb2R1bGVJZCk7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRcdGhvdEN1cnJlbnRQYXJlbnRzID0gW21vZHVsZUlkXTtcbiBcdFx0XHRcdFx0aG90Q3VycmVudENoaWxkTW9kdWxlID0gcmVxdWVzdDtcbiBcdFx0XHRcdH1cbiBcdFx0XHRcdGlmIChtZS5jaGlsZHJlbi5pbmRleE9mKHJlcXVlc3QpID09PSAtMSkge1xuIFx0XHRcdFx0XHRtZS5jaGlsZHJlbi5wdXNoKHJlcXVlc3QpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRjb25zb2xlLndhcm4oXG4gXHRcdFx0XHRcdFwiW0hNUl0gdW5leHBlY3RlZCByZXF1aXJlKFwiICtcbiBcdFx0XHRcdFx0XHRyZXF1ZXN0ICtcbiBcdFx0XHRcdFx0XHRcIikgZnJvbSBkaXNwb3NlZCBtb2R1bGUgXCIgK1xuIFx0XHRcdFx0XHRcdG1vZHVsZUlkXG4gXHRcdFx0XHQpO1xuIFx0XHRcdFx0aG90Q3VycmVudFBhcmVudHMgPSBbXTtcbiBcdFx0XHR9XG4gXHRcdFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18ocmVxdWVzdCk7XG4gXHRcdH07XG4gXHRcdHZhciBPYmplY3RGYWN0b3J5ID0gZnVuY3Rpb24gT2JqZWN0RmFjdG9yeShuYW1lKSB7XG4gXHRcdFx0cmV0dXJuIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuIFx0XHRcdFx0XHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfX1tuYW1lXTtcbiBcdFx0XHRcdH0sXG4gXHRcdFx0XHRzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gXHRcdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX19bbmFtZV0gPSB2YWx1ZTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9O1xuIFx0XHR9O1xuIFx0XHRmb3IgKHZhciBuYW1lIGluIF9fd2VicGFja19yZXF1aXJlX18pIHtcbiBcdFx0XHRpZiAoXG4gXHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoX193ZWJwYWNrX3JlcXVpcmVfXywgbmFtZSkgJiZcbiBcdFx0XHRcdG5hbWUgIT09IFwiZVwiICYmXG4gXHRcdFx0XHRuYW1lICE9PSBcInRcIlxuIFx0XHRcdCkge1xuIFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBuYW1lLCBPYmplY3RGYWN0b3J5KG5hbWUpKTtcbiBcdFx0XHR9XG4gXHRcdH1cbiBcdFx0Zm4uZSA9IGZ1bmN0aW9uKGNodW5rSWQpIHtcbiBcdFx0XHRpZiAoaG90U3RhdHVzID09PSBcInJlYWR5XCIpIGhvdFNldFN0YXR1cyhcInByZXBhcmVcIik7XG4gXHRcdFx0aG90Q2h1bmtzTG9hZGluZysrO1xuIFx0XHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLmUoY2h1bmtJZCkudGhlbihmaW5pc2hDaHVua0xvYWRpbmcsIGZ1bmN0aW9uKGVycikge1xuIFx0XHRcdFx0ZmluaXNoQ2h1bmtMb2FkaW5nKCk7XG4gXHRcdFx0XHR0aHJvdyBlcnI7XG4gXHRcdFx0fSk7XG5cbiBcdFx0XHRmdW5jdGlvbiBmaW5pc2hDaHVua0xvYWRpbmcoKSB7XG4gXHRcdFx0XHRob3RDaHVua3NMb2FkaW5nLS07XG4gXHRcdFx0XHRpZiAoaG90U3RhdHVzID09PSBcInByZXBhcmVcIikge1xuIFx0XHRcdFx0XHRpZiAoIWhvdFdhaXRpbmdGaWxlc01hcFtjaHVua0lkXSkge1xuIFx0XHRcdFx0XHRcdGhvdEVuc3VyZVVwZGF0ZUNodW5rKGNodW5rSWQpO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdGlmIChob3RDaHVua3NMb2FkaW5nID09PSAwICYmIGhvdFdhaXRpbmdGaWxlcyA9PT0gMCkge1xuIFx0XHRcdFx0XHRcdGhvdFVwZGF0ZURvd25sb2FkZWQoKTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0fTtcbiBcdFx0Zm4udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdFx0aWYgKG1vZGUgJiAxKSB2YWx1ZSA9IGZuKHZhbHVlKTtcbiBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy50KHZhbHVlLCBtb2RlICYgfjEpO1xuIFx0XHR9O1xuIFx0XHRyZXR1cm4gZm47XG4gXHR9XG5cbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gaG90Q3JlYXRlTW9kdWxlKG1vZHVsZUlkKSB7XG4gXHRcdHZhciBob3QgPSB7XG4gXHRcdFx0Ly8gcHJpdmF0ZSBzdHVmZlxuIFx0XHRcdF9hY2NlcHRlZERlcGVuZGVuY2llczoge30sXG4gXHRcdFx0X2RlY2xpbmVkRGVwZW5kZW5jaWVzOiB7fSxcbiBcdFx0XHRfc2VsZkFjY2VwdGVkOiBmYWxzZSxcbiBcdFx0XHRfc2VsZkRlY2xpbmVkOiBmYWxzZSxcbiBcdFx0XHRfZGlzcG9zZUhhbmRsZXJzOiBbXSxcbiBcdFx0XHRfbWFpbjogaG90Q3VycmVudENoaWxkTW9kdWxlICE9PSBtb2R1bGVJZCxcblxuIFx0XHRcdC8vIE1vZHVsZSBBUElcbiBcdFx0XHRhY3RpdmU6IHRydWUsXG4gXHRcdFx0YWNjZXB0OiBmdW5jdGlvbihkZXAsIGNhbGxiYWNrKSB7XG4gXHRcdFx0XHRpZiAoZGVwID09PSB1bmRlZmluZWQpIGhvdC5fc2VsZkFjY2VwdGVkID0gdHJ1ZTtcbiBcdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiBkZXAgPT09IFwiZnVuY3Rpb25cIikgaG90Ll9zZWxmQWNjZXB0ZWQgPSBkZXA7XG4gXHRcdFx0XHRlbHNlIGlmICh0eXBlb2YgZGVwID09PSBcIm9iamVjdFwiKVxuIFx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRlcC5sZW5ndGg7IGkrKylcbiBcdFx0XHRcdFx0XHRob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW2RlcFtpXV0gPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuIFx0XHRcdFx0ZWxzZSBob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW2RlcF0gPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuIFx0XHRcdH0sXG4gXHRcdFx0ZGVjbGluZTogZnVuY3Rpb24oZGVwKSB7XG4gXHRcdFx0XHRpZiAoZGVwID09PSB1bmRlZmluZWQpIGhvdC5fc2VsZkRlY2xpbmVkID0gdHJ1ZTtcbiBcdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiBkZXAgPT09IFwib2JqZWN0XCIpXG4gXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGVwLmxlbmd0aDsgaSsrKVxuIFx0XHRcdFx0XHRcdGhvdC5fZGVjbGluZWREZXBlbmRlbmNpZXNbZGVwW2ldXSA9IHRydWU7XG4gXHRcdFx0XHRlbHNlIGhvdC5fZGVjbGluZWREZXBlbmRlbmNpZXNbZGVwXSA9IHRydWU7XG4gXHRcdFx0fSxcbiBcdFx0XHRkaXNwb3NlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuIFx0XHRcdFx0aG90Ll9kaXNwb3NlSGFuZGxlcnMucHVzaChjYWxsYmFjayk7XG4gXHRcdFx0fSxcbiBcdFx0XHRhZGREaXNwb3NlSGFuZGxlcjogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiBcdFx0XHRcdGhvdC5fZGlzcG9zZUhhbmRsZXJzLnB1c2goY2FsbGJhY2spO1xuIFx0XHRcdH0sXG4gXHRcdFx0cmVtb3ZlRGlzcG9zZUhhbmRsZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gXHRcdFx0XHR2YXIgaWR4ID0gaG90Ll9kaXNwb3NlSGFuZGxlcnMuaW5kZXhPZihjYWxsYmFjayk7XG4gXHRcdFx0XHRpZiAoaWR4ID49IDApIGhvdC5fZGlzcG9zZUhhbmRsZXJzLnNwbGljZShpZHgsIDEpO1xuIFx0XHRcdH0sXG5cbiBcdFx0XHQvLyBNYW5hZ2VtZW50IEFQSVxuIFx0XHRcdGNoZWNrOiBob3RDaGVjayxcbiBcdFx0XHRhcHBseTogaG90QXBwbHksXG4gXHRcdFx0c3RhdHVzOiBmdW5jdGlvbihsKSB7XG4gXHRcdFx0XHRpZiAoIWwpIHJldHVybiBob3RTdGF0dXM7XG4gXHRcdFx0XHRob3RTdGF0dXNIYW5kbGVycy5wdXNoKGwpO1xuIFx0XHRcdH0sXG4gXHRcdFx0YWRkU3RhdHVzSGFuZGxlcjogZnVuY3Rpb24obCkge1xuIFx0XHRcdFx0aG90U3RhdHVzSGFuZGxlcnMucHVzaChsKTtcbiBcdFx0XHR9LFxuIFx0XHRcdHJlbW92ZVN0YXR1c0hhbmRsZXI6IGZ1bmN0aW9uKGwpIHtcbiBcdFx0XHRcdHZhciBpZHggPSBob3RTdGF0dXNIYW5kbGVycy5pbmRleE9mKGwpO1xuIFx0XHRcdFx0aWYgKGlkeCA+PSAwKSBob3RTdGF0dXNIYW5kbGVycy5zcGxpY2UoaWR4LCAxKTtcbiBcdFx0XHR9LFxuXG4gXHRcdFx0Ly9pbmhlcml0IGZyb20gcHJldmlvdXMgZGlzcG9zZSBjYWxsXG4gXHRcdFx0ZGF0YTogaG90Q3VycmVudE1vZHVsZURhdGFbbW9kdWxlSWRdXG4gXHRcdH07XG4gXHRcdGhvdEN1cnJlbnRDaGlsZE1vZHVsZSA9IHVuZGVmaW5lZDtcbiBcdFx0cmV0dXJuIGhvdDtcbiBcdH1cblxuIFx0dmFyIGhvdFN0YXR1c0hhbmRsZXJzID0gW107XG4gXHR2YXIgaG90U3RhdHVzID0gXCJpZGxlXCI7XG5cbiBcdGZ1bmN0aW9uIGhvdFNldFN0YXR1cyhuZXdTdGF0dXMpIHtcbiBcdFx0aG90U3RhdHVzID0gbmV3U3RhdHVzO1xuIFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGhvdFN0YXR1c0hhbmRsZXJzLmxlbmd0aDsgaSsrKVxuIFx0XHRcdGhvdFN0YXR1c0hhbmRsZXJzW2ldLmNhbGwobnVsbCwgbmV3U3RhdHVzKTtcbiBcdH1cblxuIFx0Ly8gd2hpbGUgZG93bmxvYWRpbmdcbiBcdHZhciBob3RXYWl0aW5nRmlsZXMgPSAwO1xuIFx0dmFyIGhvdENodW5rc0xvYWRpbmcgPSAwO1xuIFx0dmFyIGhvdFdhaXRpbmdGaWxlc01hcCA9IHt9O1xuIFx0dmFyIGhvdFJlcXVlc3RlZEZpbGVzTWFwID0ge307XG4gXHR2YXIgaG90QXZhaWxhYmxlRmlsZXNNYXAgPSB7fTtcbiBcdHZhciBob3REZWZlcnJlZDtcblxuIFx0Ly8gVGhlIHVwZGF0ZSBpbmZvXG4gXHR2YXIgaG90VXBkYXRlLCBob3RVcGRhdGVOZXdIYXNoO1xuXG4gXHRmdW5jdGlvbiB0b01vZHVsZUlkKGlkKSB7XG4gXHRcdHZhciBpc051bWJlciA9ICtpZCArIFwiXCIgPT09IGlkO1xuIFx0XHRyZXR1cm4gaXNOdW1iZXIgPyAraWQgOiBpZDtcbiBcdH1cblxuIFx0ZnVuY3Rpb24gaG90Q2hlY2soYXBwbHkpIHtcbiBcdFx0aWYgKGhvdFN0YXR1cyAhPT0gXCJpZGxlXCIpIHtcbiBcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJjaGVjaygpIGlzIG9ubHkgYWxsb3dlZCBpbiBpZGxlIHN0YXR1c1wiKTtcbiBcdFx0fVxuIFx0XHRob3RBcHBseU9uVXBkYXRlID0gYXBwbHk7XG4gXHRcdGhvdFNldFN0YXR1cyhcImNoZWNrXCIpO1xuIFx0XHRyZXR1cm4gaG90RG93bmxvYWRNYW5pZmVzdChob3RSZXF1ZXN0VGltZW91dCkudGhlbihmdW5jdGlvbih1cGRhdGUpIHtcbiBcdFx0XHRpZiAoIXVwZGF0ZSkge1xuIFx0XHRcdFx0aG90U2V0U3RhdHVzKFwiaWRsZVwiKTtcbiBcdFx0XHRcdHJldHVybiBudWxsO1xuIFx0XHRcdH1cbiBcdFx0XHRob3RSZXF1ZXN0ZWRGaWxlc01hcCA9IHt9O1xuIFx0XHRcdGhvdFdhaXRpbmdGaWxlc01hcCA9IHt9O1xuIFx0XHRcdGhvdEF2YWlsYWJsZUZpbGVzTWFwID0gdXBkYXRlLmM7XG4gXHRcdFx0aG90VXBkYXRlTmV3SGFzaCA9IHVwZGF0ZS5oO1xuXG4gXHRcdFx0aG90U2V0U3RhdHVzKFwicHJlcGFyZVwiKTtcbiBcdFx0XHR2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuIFx0XHRcdFx0aG90RGVmZXJyZWQgPSB7XG4gXHRcdFx0XHRcdHJlc29sdmU6IHJlc29sdmUsXG4gXHRcdFx0XHRcdHJlamVjdDogcmVqZWN0XG4gXHRcdFx0XHR9O1xuIFx0XHRcdH0pO1xuIFx0XHRcdGhvdFVwZGF0ZSA9IHt9O1xuIFx0XHRcdGZvcih2YXIgY2h1bmtJZCBpbiBpbnN0YWxsZWRDaHVua3MpXG4gXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvbmUtYmxvY2tzXG4gXHRcdFx0e1xuIFx0XHRcdFx0LypnbG9iYWxzIGNodW5rSWQgKi9cbiBcdFx0XHRcdGhvdEVuc3VyZVVwZGF0ZUNodW5rKGNodW5rSWQpO1xuIFx0XHRcdH1cbiBcdFx0XHRpZiAoXG4gXHRcdFx0XHRob3RTdGF0dXMgPT09IFwicHJlcGFyZVwiICYmXG4gXHRcdFx0XHRob3RDaHVua3NMb2FkaW5nID09PSAwICYmXG4gXHRcdFx0XHRob3RXYWl0aW5nRmlsZXMgPT09IDBcbiBcdFx0XHQpIHtcbiBcdFx0XHRcdGhvdFVwZGF0ZURvd25sb2FkZWQoKTtcbiBcdFx0XHR9XG4gXHRcdFx0cmV0dXJuIHByb21pc2U7XG4gXHRcdH0pO1xuIFx0fVxuXG4gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdGZ1bmN0aW9uIGhvdEFkZFVwZGF0ZUNodW5rKGNodW5rSWQsIG1vcmVNb2R1bGVzKSB7XG4gXHRcdGlmICghaG90QXZhaWxhYmxlRmlsZXNNYXBbY2h1bmtJZF0gfHwgIWhvdFJlcXVlc3RlZEZpbGVzTWFwW2NodW5rSWRdKVxuIFx0XHRcdHJldHVybjtcbiBcdFx0aG90UmVxdWVzdGVkRmlsZXNNYXBbY2h1bmtJZF0gPSBmYWxzZTtcbiBcdFx0Zm9yICh2YXIgbW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcbiBcdFx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcbiBcdFx0XHRcdGhvdFVwZGF0ZVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0fVxuIFx0XHR9XG4gXHRcdGlmICgtLWhvdFdhaXRpbmdGaWxlcyA9PT0gMCAmJiBob3RDaHVua3NMb2FkaW5nID09PSAwKSB7XG4gXHRcdFx0aG90VXBkYXRlRG93bmxvYWRlZCgpO1xuIFx0XHR9XG4gXHR9XG5cbiBcdGZ1bmN0aW9uIGhvdEVuc3VyZVVwZGF0ZUNodW5rKGNodW5rSWQpIHtcbiBcdFx0aWYgKCFob3RBdmFpbGFibGVGaWxlc01hcFtjaHVua0lkXSkge1xuIFx0XHRcdGhvdFdhaXRpbmdGaWxlc01hcFtjaHVua0lkXSA9IHRydWU7XG4gXHRcdH0gZWxzZSB7XG4gXHRcdFx0aG90UmVxdWVzdGVkRmlsZXNNYXBbY2h1bmtJZF0gPSB0cnVlO1xuIFx0XHRcdGhvdFdhaXRpbmdGaWxlcysrO1xuIFx0XHRcdGhvdERvd25sb2FkVXBkYXRlQ2h1bmsoY2h1bmtJZCk7XG4gXHRcdH1cbiBcdH1cblxuIFx0ZnVuY3Rpb24gaG90VXBkYXRlRG93bmxvYWRlZCgpIHtcbiBcdFx0aG90U2V0U3RhdHVzKFwicmVhZHlcIik7XG4gXHRcdHZhciBkZWZlcnJlZCA9IGhvdERlZmVycmVkO1xuIFx0XHRob3REZWZlcnJlZCA9IG51bGw7XG4gXHRcdGlmICghZGVmZXJyZWQpIHJldHVybjtcbiBcdFx0aWYgKGhvdEFwcGx5T25VcGRhdGUpIHtcbiBcdFx0XHQvLyBXcmFwIGRlZmVycmVkIG9iamVjdCBpbiBQcm9taXNlIHRvIG1hcmsgaXQgYXMgYSB3ZWxsLWhhbmRsZWQgUHJvbWlzZSB0b1xuIFx0XHRcdC8vIGF2b2lkIHRyaWdnZXJpbmcgdW5jYXVnaHQgZXhjZXB0aW9uIHdhcm5pbmcgaW4gQ2hyb21lLlxuIFx0XHRcdC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NjU2NjZcbiBcdFx0XHRQcm9taXNlLnJlc29sdmUoKVxuIFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG4gXHRcdFx0XHRcdHJldHVybiBob3RBcHBseShob3RBcHBseU9uVXBkYXRlKTtcbiBcdFx0XHRcdH0pXG4gXHRcdFx0XHQudGhlbihcbiBcdFx0XHRcdFx0ZnVuY3Rpb24ocmVzdWx0KSB7XG4gXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpO1xuIFx0XHRcdFx0XHR9LFxuIFx0XHRcdFx0XHRmdW5jdGlvbihlcnIpIHtcbiBcdFx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3QoZXJyKTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0KTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHR2YXIgb3V0ZGF0ZWRNb2R1bGVzID0gW107XG4gXHRcdFx0Zm9yICh2YXIgaWQgaW4gaG90VXBkYXRlKSB7XG4gXHRcdFx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhvdFVwZGF0ZSwgaWQpKSB7XG4gXHRcdFx0XHRcdG91dGRhdGVkTW9kdWxlcy5wdXNoKHRvTW9kdWxlSWQoaWQpKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZShvdXRkYXRlZE1vZHVsZXMpO1xuIFx0XHR9XG4gXHR9XG5cbiBcdGZ1bmN0aW9uIGhvdEFwcGx5KG9wdGlvbnMpIHtcbiBcdFx0aWYgKGhvdFN0YXR1cyAhPT0gXCJyZWFkeVwiKVxuIFx0XHRcdHRocm93IG5ldyBFcnJvcihcImFwcGx5KCkgaXMgb25seSBhbGxvd2VkIGluIHJlYWR5IHN0YXR1c1wiKTtcbiBcdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiBcdFx0dmFyIGNiO1xuIFx0XHR2YXIgaTtcbiBcdFx0dmFyIGo7XG4gXHRcdHZhciBtb2R1bGU7XG4gXHRcdHZhciBtb2R1bGVJZDtcblxuIFx0XHRmdW5jdGlvbiBnZXRBZmZlY3RlZFN0dWZmKHVwZGF0ZU1vZHVsZUlkKSB7XG4gXHRcdFx0dmFyIG91dGRhdGVkTW9kdWxlcyA9IFt1cGRhdGVNb2R1bGVJZF07XG4gXHRcdFx0dmFyIG91dGRhdGVkRGVwZW5kZW5jaWVzID0ge307XG5cbiBcdFx0XHR2YXIgcXVldWUgPSBvdXRkYXRlZE1vZHVsZXMubWFwKGZ1bmN0aW9uKGlkKSB7XG4gXHRcdFx0XHRyZXR1cm4ge1xuIFx0XHRcdFx0XHRjaGFpbjogW2lkXSxcbiBcdFx0XHRcdFx0aWQ6IGlkXG4gXHRcdFx0XHR9O1xuIFx0XHRcdH0pO1xuIFx0XHRcdHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gXHRcdFx0XHR2YXIgcXVldWVJdGVtID0gcXVldWUucG9wKCk7XG4gXHRcdFx0XHR2YXIgbW9kdWxlSWQgPSBxdWV1ZUl0ZW0uaWQ7XG4gXHRcdFx0XHR2YXIgY2hhaW4gPSBxdWV1ZUl0ZW0uY2hhaW47XG4gXHRcdFx0XHRtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0XHRcdGlmICghbW9kdWxlIHx8IG1vZHVsZS5ob3QuX3NlbGZBY2NlcHRlZCkgY29udGludWU7XG4gXHRcdFx0XHRpZiAobW9kdWxlLmhvdC5fc2VsZkRlY2xpbmVkKSB7XG4gXHRcdFx0XHRcdHJldHVybiB7XG4gXHRcdFx0XHRcdFx0dHlwZTogXCJzZWxmLWRlY2xpbmVkXCIsXG4gXHRcdFx0XHRcdFx0Y2hhaW46IGNoYWluLFxuIFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZFxuIFx0XHRcdFx0XHR9O1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0aWYgKG1vZHVsZS5ob3QuX21haW4pIHtcbiBcdFx0XHRcdFx0cmV0dXJuIHtcbiBcdFx0XHRcdFx0XHR0eXBlOiBcInVuYWNjZXB0ZWRcIixcbiBcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4sXG4gXHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkXG4gXHRcdFx0XHRcdH07XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG1vZHVsZS5wYXJlbnRzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0XHRcdHZhciBwYXJlbnRJZCA9IG1vZHVsZS5wYXJlbnRzW2ldO1xuIFx0XHRcdFx0XHR2YXIgcGFyZW50ID0gaW5zdGFsbGVkTW9kdWxlc1twYXJlbnRJZF07XG4gXHRcdFx0XHRcdGlmICghcGFyZW50KSBjb250aW51ZTtcbiBcdFx0XHRcdFx0aWYgKHBhcmVudC5ob3QuX2RlY2xpbmVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXSkge1xuIFx0XHRcdFx0XHRcdHJldHVybiB7XG4gXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRlY2xpbmVkXCIsXG4gXHRcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4uY29uY2F0KFtwYXJlbnRJZF0pLFxuIFx0XHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkLFxuIFx0XHRcdFx0XHRcdFx0cGFyZW50SWQ6IHBhcmVudElkXG4gXHRcdFx0XHRcdFx0fTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRpZiAob3V0ZGF0ZWRNb2R1bGVzLmluZGV4T2YocGFyZW50SWQpICE9PSAtMSkgY29udGludWU7XG4gXHRcdFx0XHRcdGlmIChwYXJlbnQuaG90Ll9hY2NlcHRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRcdFx0XHRpZiAoIW91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXSlcbiBcdFx0XHRcdFx0XHRcdG91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXSA9IFtdO1xuIFx0XHRcdFx0XHRcdGFkZEFsbFRvU2V0KG91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXSwgW21vZHVsZUlkXSk7XG4gXHRcdFx0XHRcdFx0Y29udGludWU7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0ZGVsZXRlIG91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXTtcbiBcdFx0XHRcdFx0b3V0ZGF0ZWRNb2R1bGVzLnB1c2gocGFyZW50SWQpO1xuIFx0XHRcdFx0XHRxdWV1ZS5wdXNoKHtcbiBcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4uY29uY2F0KFtwYXJlbnRJZF0pLFxuIFx0XHRcdFx0XHRcdGlkOiBwYXJlbnRJZFxuIFx0XHRcdFx0XHR9KTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG5cbiBcdFx0XHRyZXR1cm4ge1xuIFx0XHRcdFx0dHlwZTogXCJhY2NlcHRlZFwiLFxuIFx0XHRcdFx0bW9kdWxlSWQ6IHVwZGF0ZU1vZHVsZUlkLFxuIFx0XHRcdFx0b3V0ZGF0ZWRNb2R1bGVzOiBvdXRkYXRlZE1vZHVsZXMsXG4gXHRcdFx0XHRvdXRkYXRlZERlcGVuZGVuY2llczogb3V0ZGF0ZWREZXBlbmRlbmNpZXNcbiBcdFx0XHR9O1xuIFx0XHR9XG5cbiBcdFx0ZnVuY3Rpb24gYWRkQWxsVG9TZXQoYSwgYikge1xuIFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuIFx0XHRcdFx0dmFyIGl0ZW0gPSBiW2ldO1xuIFx0XHRcdFx0aWYgKGEuaW5kZXhPZihpdGVtKSA9PT0gLTEpIGEucHVzaChpdGVtKTtcbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBhdCBiZWdpbiBhbGwgdXBkYXRlcyBtb2R1bGVzIGFyZSBvdXRkYXRlZFxuIFx0XHQvLyB0aGUgXCJvdXRkYXRlZFwiIHN0YXR1cyBjYW4gcHJvcGFnYXRlIHRvIHBhcmVudHMgaWYgdGhleSBkb24ndCBhY2NlcHQgdGhlIGNoaWxkcmVuXG4gXHRcdHZhciBvdXRkYXRlZERlcGVuZGVuY2llcyA9IHt9O1xuIFx0XHR2YXIgb3V0ZGF0ZWRNb2R1bGVzID0gW107XG4gXHRcdHZhciBhcHBsaWVkVXBkYXRlID0ge307XG5cbiBcdFx0dmFyIHdhcm5VbmV4cGVjdGVkUmVxdWlyZSA9IGZ1bmN0aW9uIHdhcm5VbmV4cGVjdGVkUmVxdWlyZSgpIHtcbiBcdFx0XHRjb25zb2xlLndhcm4oXG4gXHRcdFx0XHRcIltITVJdIHVuZXhwZWN0ZWQgcmVxdWlyZShcIiArIHJlc3VsdC5tb2R1bGVJZCArIFwiKSB0byBkaXNwb3NlZCBtb2R1bGVcIlxuIFx0XHRcdCk7XG4gXHRcdH07XG5cbiBcdFx0Zm9yICh2YXIgaWQgaW4gaG90VXBkYXRlKSB7XG4gXHRcdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChob3RVcGRhdGUsIGlkKSkge1xuIFx0XHRcdFx0bW9kdWxlSWQgPSB0b01vZHVsZUlkKGlkKTtcbiBcdFx0XHRcdC8qKiBAdHlwZSB7VE9ET30gKi9cbiBcdFx0XHRcdHZhciByZXN1bHQ7XG4gXHRcdFx0XHRpZiAoaG90VXBkYXRlW2lkXSkge1xuIFx0XHRcdFx0XHRyZXN1bHQgPSBnZXRBZmZlY3RlZFN0dWZmKG1vZHVsZUlkKTtcbiBcdFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRcdHJlc3VsdCA9IHtcbiBcdFx0XHRcdFx0XHR0eXBlOiBcImRpc3Bvc2VkXCIsXG4gXHRcdFx0XHRcdFx0bW9kdWxlSWQ6IGlkXG4gXHRcdFx0XHRcdH07XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHQvKiogQHR5cGUge0Vycm9yfGZhbHNlfSAqL1xuIFx0XHRcdFx0dmFyIGFib3J0RXJyb3IgPSBmYWxzZTtcbiBcdFx0XHRcdHZhciBkb0FwcGx5ID0gZmFsc2U7XG4gXHRcdFx0XHR2YXIgZG9EaXNwb3NlID0gZmFsc2U7XG4gXHRcdFx0XHR2YXIgY2hhaW5JbmZvID0gXCJcIjtcbiBcdFx0XHRcdGlmIChyZXN1bHQuY2hhaW4pIHtcbiBcdFx0XHRcdFx0Y2hhaW5JbmZvID0gXCJcXG5VcGRhdGUgcHJvcGFnYXRpb246IFwiICsgcmVzdWx0LmNoYWluLmpvaW4oXCIgLT4gXCIpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0c3dpdGNoIChyZXN1bHQudHlwZSkge1xuIFx0XHRcdFx0XHRjYXNlIFwic2VsZi1kZWNsaW5lZFwiOlxuIFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRGVjbGluZWQpIG9wdGlvbnMub25EZWNsaW5lZChyZXN1bHQpO1xuIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVEZWNsaW5lZClcbiBcdFx0XHRcdFx0XHRcdGFib3J0RXJyb3IgPSBuZXcgRXJyb3IoXG4gXHRcdFx0XHRcdFx0XHRcdFwiQWJvcnRlZCBiZWNhdXNlIG9mIHNlbGYgZGVjbGluZTogXCIgK1xuIFx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdC5tb2R1bGVJZCArXG4gXHRcdFx0XHRcdFx0XHRcdFx0Y2hhaW5JbmZvXG4gXHRcdFx0XHRcdFx0XHQpO1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0XHRjYXNlIFwiZGVjbGluZWRcIjpcbiBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkRlY2xpbmVkKSBvcHRpb25zLm9uRGVjbGluZWQocmVzdWx0KTtcbiBcdFx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuaWdub3JlRGVjbGluZWQpXG4gXHRcdFx0XHRcdFx0XHRhYm9ydEVycm9yID0gbmV3IEVycm9yKFxuIFx0XHRcdFx0XHRcdFx0XHRcIkFib3J0ZWQgYmVjYXVzZSBvZiBkZWNsaW5lZCBkZXBlbmRlbmN5OiBcIiArXG4gXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0Lm1vZHVsZUlkICtcbiBcdFx0XHRcdFx0XHRcdFx0XHRcIiBpbiBcIiArXG4gXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0LnBhcmVudElkICtcbiBcdFx0XHRcdFx0XHRcdFx0XHRjaGFpbkluZm9cbiBcdFx0XHRcdFx0XHRcdCk7XG4gXHRcdFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0XHRcdGNhc2UgXCJ1bmFjY2VwdGVkXCI6XG4gXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25VbmFjY2VwdGVkKSBvcHRpb25zLm9uVW5hY2NlcHRlZChyZXN1bHQpO1xuIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVVbmFjY2VwdGVkKVxuIFx0XHRcdFx0XHRcdFx0YWJvcnRFcnJvciA9IG5ldyBFcnJvcihcbiBcdFx0XHRcdFx0XHRcdFx0XCJBYm9ydGVkIGJlY2F1c2UgXCIgKyBtb2R1bGVJZCArIFwiIGlzIG5vdCBhY2NlcHRlZFwiICsgY2hhaW5JbmZvXG4gXHRcdFx0XHRcdFx0XHQpO1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0XHRjYXNlIFwiYWNjZXB0ZWRcIjpcbiBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkFjY2VwdGVkKSBvcHRpb25zLm9uQWNjZXB0ZWQocmVzdWx0KTtcbiBcdFx0XHRcdFx0XHRkb0FwcGx5ID0gdHJ1ZTtcbiBcdFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdFx0Y2FzZSBcImRpc3Bvc2VkXCI6XG4gXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25EaXNwb3NlZCkgb3B0aW9ucy5vbkRpc3Bvc2VkKHJlc3VsdCk7XG4gXHRcdFx0XHRcdFx0ZG9EaXNwb3NlID0gdHJ1ZTtcbiBcdFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdFx0ZGVmYXVsdDpcbiBcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmV4Y2VwdGlvbiB0eXBlIFwiICsgcmVzdWx0LnR5cGUpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0aWYgKGFib3J0RXJyb3IpIHtcbiBcdFx0XHRcdFx0aG90U2V0U3RhdHVzKFwiYWJvcnRcIik7XG4gXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChhYm9ydEVycm9yKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHRcdGlmIChkb0FwcGx5KSB7XG4gXHRcdFx0XHRcdGFwcGxpZWRVcGRhdGVbbW9kdWxlSWRdID0gaG90VXBkYXRlW21vZHVsZUlkXTtcbiBcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWRNb2R1bGVzLCByZXN1bHQub3V0ZGF0ZWRNb2R1bGVzKTtcbiBcdFx0XHRcdFx0Zm9yIChtb2R1bGVJZCBpbiByZXN1bHQub3V0ZGF0ZWREZXBlbmRlbmNpZXMpIHtcbiBcdFx0XHRcdFx0XHRpZiAoXG4gXHRcdFx0XHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gXHRcdFx0XHRcdFx0XHRcdHJlc3VsdC5vdXRkYXRlZERlcGVuZGVuY2llcyxcbiBcdFx0XHRcdFx0XHRcdFx0bW9kdWxlSWRcbiBcdFx0XHRcdFx0XHRcdClcbiBcdFx0XHRcdFx0XHQpIHtcbiBcdFx0XHRcdFx0XHRcdGlmICghb3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdKVxuIFx0XHRcdFx0XHRcdFx0XHRvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0gPSBbXTtcbiBcdFx0XHRcdFx0XHRcdGFkZEFsbFRvU2V0KFxuIFx0XHRcdFx0XHRcdFx0XHRvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0sXG4gXHRcdFx0XHRcdFx0XHRcdHJlc3VsdC5vdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF1cbiBcdFx0XHRcdFx0XHRcdCk7XG4gXHRcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHRpZiAoZG9EaXNwb3NlKSB7XG4gXHRcdFx0XHRcdGFkZEFsbFRvU2V0KG91dGRhdGVkTW9kdWxlcywgW3Jlc3VsdC5tb2R1bGVJZF0pO1xuIFx0XHRcdFx0XHRhcHBsaWVkVXBkYXRlW21vZHVsZUlkXSA9IHdhcm5VbmV4cGVjdGVkUmVxdWlyZTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBTdG9yZSBzZWxmIGFjY2VwdGVkIG91dGRhdGVkIG1vZHVsZXMgdG8gcmVxdWlyZSB0aGVtIGxhdGVyIGJ5IHRoZSBtb2R1bGUgc3lzdGVtXG4gXHRcdHZhciBvdXRkYXRlZFNlbGZBY2NlcHRlZE1vZHVsZXMgPSBbXTtcbiBcdFx0Zm9yIChpID0gMDsgaSA8IG91dGRhdGVkTW9kdWxlcy5sZW5ndGg7IGkrKykge1xuIFx0XHRcdG1vZHVsZUlkID0gb3V0ZGF0ZWRNb2R1bGVzW2ldO1xuIFx0XHRcdGlmIChcbiBcdFx0XHRcdGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdICYmXG4gXHRcdFx0XHRpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5ob3QuX3NlbGZBY2NlcHRlZCAmJlxuIFx0XHRcdFx0Ly8gcmVtb3ZlZCBzZWxmLWFjY2VwdGVkIG1vZHVsZXMgc2hvdWxkIG5vdCBiZSByZXF1aXJlZFxuIFx0XHRcdFx0YXBwbGllZFVwZGF0ZVttb2R1bGVJZF0gIT09IHdhcm5VbmV4cGVjdGVkUmVxdWlyZVxuIFx0XHRcdCkge1xuIFx0XHRcdFx0b3V0ZGF0ZWRTZWxmQWNjZXB0ZWRNb2R1bGVzLnB1c2goe1xuIFx0XHRcdFx0XHRtb2R1bGU6IG1vZHVsZUlkLFxuIFx0XHRcdFx0XHRlcnJvckhhbmRsZXI6IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmhvdC5fc2VsZkFjY2VwdGVkXG4gXHRcdFx0XHR9KTtcbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBOb3cgaW4gXCJkaXNwb3NlXCIgcGhhc2VcbiBcdFx0aG90U2V0U3RhdHVzKFwiZGlzcG9zZVwiKTtcbiBcdFx0T2JqZWN0LmtleXMoaG90QXZhaWxhYmxlRmlsZXNNYXApLmZvckVhY2goZnVuY3Rpb24oY2h1bmtJZCkge1xuIFx0XHRcdGlmIChob3RBdmFpbGFibGVGaWxlc01hcFtjaHVua0lkXSA9PT0gZmFsc2UpIHtcbiBcdFx0XHRcdGhvdERpc3Bvc2VDaHVuayhjaHVua0lkKTtcbiBcdFx0XHR9XG4gXHRcdH0pO1xuXG4gXHRcdHZhciBpZHg7XG4gXHRcdHZhciBxdWV1ZSA9IG91dGRhdGVkTW9kdWxlcy5zbGljZSgpO1xuIFx0XHR3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuIFx0XHRcdG1vZHVsZUlkID0gcXVldWUucG9wKCk7XG4gXHRcdFx0bW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0aWYgKCFtb2R1bGUpIGNvbnRpbnVlO1xuXG4gXHRcdFx0dmFyIGRhdGEgPSB7fTtcblxuIFx0XHRcdC8vIENhbGwgZGlzcG9zZSBoYW5kbGVyc1xuIFx0XHRcdHZhciBkaXNwb3NlSGFuZGxlcnMgPSBtb2R1bGUuaG90Ll9kaXNwb3NlSGFuZGxlcnM7XG4gXHRcdFx0Zm9yIChqID0gMDsgaiA8IGRpc3Bvc2VIYW5kbGVycy5sZW5ndGg7IGorKykge1xuIFx0XHRcdFx0Y2IgPSBkaXNwb3NlSGFuZGxlcnNbal07XG4gXHRcdFx0XHRjYihkYXRhKTtcbiBcdFx0XHR9XG4gXHRcdFx0aG90Q3VycmVudE1vZHVsZURhdGFbbW9kdWxlSWRdID0gZGF0YTtcblxuIFx0XHRcdC8vIGRpc2FibGUgbW9kdWxlICh0aGlzIGRpc2FibGVzIHJlcXVpcmVzIGZyb20gdGhpcyBtb2R1bGUpXG4gXHRcdFx0bW9kdWxlLmhvdC5hY3RpdmUgPSBmYWxzZTtcblxuIFx0XHRcdC8vIHJlbW92ZSBtb2R1bGUgZnJvbSBjYWNoZVxuIFx0XHRcdGRlbGV0ZSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcblxuIFx0XHRcdC8vIHdoZW4gZGlzcG9zaW5nIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsbCBkaXNwb3NlIGhhbmRsZXJcbiBcdFx0XHRkZWxldGUgb3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdO1xuXG4gXHRcdFx0Ly8gcmVtb3ZlIFwicGFyZW50c1wiIHJlZmVyZW5jZXMgZnJvbSBhbGwgY2hpbGRyZW5cbiBcdFx0XHRmb3IgKGogPSAwOyBqIDwgbW9kdWxlLmNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gXHRcdFx0XHR2YXIgY2hpbGQgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZS5jaGlsZHJlbltqXV07XG4gXHRcdFx0XHRpZiAoIWNoaWxkKSBjb250aW51ZTtcbiBcdFx0XHRcdGlkeCA9IGNoaWxkLnBhcmVudHMuaW5kZXhPZihtb2R1bGVJZCk7XG4gXHRcdFx0XHRpZiAoaWR4ID49IDApIHtcbiBcdFx0XHRcdFx0Y2hpbGQucGFyZW50cy5zcGxpY2UoaWR4LCAxKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyByZW1vdmUgb3V0ZGF0ZWQgZGVwZW5kZW5jeSBmcm9tIG1vZHVsZSBjaGlsZHJlblxuIFx0XHR2YXIgZGVwZW5kZW5jeTtcbiBcdFx0dmFyIG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzO1xuIFx0XHRmb3IgKG1vZHVsZUlkIGluIG91dGRhdGVkRGVwZW5kZW5jaWVzKSB7XG4gXHRcdFx0aWYgKFxuIFx0XHRcdFx0T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG91dGRhdGVkRGVwZW5kZW5jaWVzLCBtb2R1bGVJZClcbiBcdFx0XHQpIHtcbiBcdFx0XHRcdG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0XHRcdFx0aWYgKG1vZHVsZSkge1xuIFx0XHRcdFx0XHRtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcyA9IG91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXTtcbiBcdFx0XHRcdFx0Zm9yIChqID0gMDsgaiA8IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzLmxlbmd0aDsgaisrKSB7XG4gXHRcdFx0XHRcdFx0ZGVwZW5kZW5jeSA9IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzW2pdO1xuIFx0XHRcdFx0XHRcdGlkeCA9IG1vZHVsZS5jaGlsZHJlbi5pbmRleE9mKGRlcGVuZGVuY3kpO1xuIFx0XHRcdFx0XHRcdGlmIChpZHggPj0gMCkgbW9kdWxlLmNoaWxkcmVuLnNwbGljZShpZHgsIDEpO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHR9XG4gXHRcdFx0fVxuIFx0XHR9XG5cbiBcdFx0Ly8gTm93IGluIFwiYXBwbHlcIiBwaGFzZVxuIFx0XHRob3RTZXRTdGF0dXMoXCJhcHBseVwiKTtcblxuIFx0XHRob3RDdXJyZW50SGFzaCA9IGhvdFVwZGF0ZU5ld0hhc2g7XG5cbiBcdFx0Ly8gaW5zZXJ0IG5ldyBjb2RlXG4gXHRcdGZvciAobW9kdWxlSWQgaW4gYXBwbGllZFVwZGF0ZSkge1xuIFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXBwbGllZFVwZGF0ZSwgbW9kdWxlSWQpKSB7XG4gXHRcdFx0XHRtb2R1bGVzW21vZHVsZUlkXSA9IGFwcGxpZWRVcGRhdGVbbW9kdWxlSWRdO1xuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIGNhbGwgYWNjZXB0IGhhbmRsZXJzXG4gXHRcdHZhciBlcnJvciA9IG51bGw7XG4gXHRcdGZvciAobW9kdWxlSWQgaW4gb3V0ZGF0ZWREZXBlbmRlbmNpZXMpIHtcbiBcdFx0XHRpZiAoXG4gXHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3V0ZGF0ZWREZXBlbmRlbmNpZXMsIG1vZHVsZUlkKVxuIFx0XHRcdCkge1xuIFx0XHRcdFx0bW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0XHRpZiAobW9kdWxlKSB7XG4gXHRcdFx0XHRcdG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzID0gb3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdO1xuIFx0XHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gW107XG4gXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuIFx0XHRcdFx0XHRcdGRlcGVuZGVuY3kgPSBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llc1tpXTtcbiBcdFx0XHRcdFx0XHRjYiA9IG1vZHVsZS5ob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuIFx0XHRcdFx0XHRcdGlmIChjYikge1xuIFx0XHRcdFx0XHRcdFx0aWYgKGNhbGxiYWNrcy5pbmRleE9mKGNiKSAhPT0gLTEpIGNvbnRpbnVlO1xuIFx0XHRcdFx0XHRcdFx0Y2FsbGJhY2tzLnB1c2goY2IpO1xuIFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0XHRcdFx0Y2IgPSBjYWxsYmFja3NbaV07XG4gXHRcdFx0XHRcdFx0dHJ5IHtcbiBcdFx0XHRcdFx0XHRcdGNiKG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzKTtcbiBcdFx0XHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcbiBcdFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm9uRXJyb3JlZCh7XG4gXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJhY2NlcHQtZXJyb3JlZFwiLFxuIFx0XHRcdFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZCxcbiBcdFx0XHRcdFx0XHRcdFx0XHRkZXBlbmRlbmN5SWQ6IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzW2ldLFxuIFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yOiBlcnJcbiBcdFx0XHRcdFx0XHRcdFx0fSk7XG4gXHRcdFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuaWdub3JlRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGVycjtcbiBcdFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBMb2FkIHNlbGYgYWNjZXB0ZWQgbW9kdWxlc1xuIFx0XHRmb3IgKGkgPSAwOyBpIDwgb3V0ZGF0ZWRTZWxmQWNjZXB0ZWRNb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0dmFyIGl0ZW0gPSBvdXRkYXRlZFNlbGZBY2NlcHRlZE1vZHVsZXNbaV07XG4gXHRcdFx0bW9kdWxlSWQgPSBpdGVtLm1vZHVsZTtcbiBcdFx0XHRob3RDdXJyZW50UGFyZW50cyA9IFttb2R1bGVJZF07XG4gXHRcdFx0dHJ5IHtcbiBcdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpO1xuIFx0XHRcdH0gY2F0Y2ggKGVycikge1xuIFx0XHRcdFx0aWYgKHR5cGVvZiBpdGVtLmVycm9ySGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gXHRcdFx0XHRcdHRyeSB7XG4gXHRcdFx0XHRcdFx0aXRlbS5lcnJvckhhbmRsZXIoZXJyKTtcbiBcdFx0XHRcdFx0fSBjYXRjaCAoZXJyMikge1xuIFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5vbkVycm9yZWQoe1xuIFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcInNlbGYtYWNjZXB0LWVycm9yLWhhbmRsZXItZXJyb3JlZFwiLFxuIFx0XHRcdFx0XHRcdFx0XHRtb2R1bGVJZDogbW9kdWxlSWQsXG4gXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBlcnIyLFxuIFx0XHRcdFx0XHRcdFx0XHRvcmlnaW5hbEVycm9yOiBlcnJcbiBcdFx0XHRcdFx0XHRcdH0pO1xuIFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuaWdub3JlRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdFx0aWYgKCFlcnJvcikgZXJyb3IgPSBlcnIyO1xuIFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGVycjtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fSBlbHNlIHtcbiBcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25FcnJvcmVkKSB7XG4gXHRcdFx0XHRcdFx0b3B0aW9ucy5vbkVycm9yZWQoe1xuIFx0XHRcdFx0XHRcdFx0dHlwZTogXCJzZWxmLWFjY2VwdC1lcnJvcmVkXCIsXG4gXHRcdFx0XHRcdFx0XHRtb2R1bGVJZDogbW9kdWxlSWQsXG4gXHRcdFx0XHRcdFx0XHRlcnJvcjogZXJyXG4gXHRcdFx0XHRcdFx0fSk7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0aWYgKCFvcHRpb25zLmlnbm9yZUVycm9yZWQpIHtcbiBcdFx0XHRcdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGVycjtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIGhhbmRsZSBlcnJvcnMgaW4gYWNjZXB0IGhhbmRsZXJzIGFuZCBzZWxmIGFjY2VwdGVkIG1vZHVsZSBsb2FkXG4gXHRcdGlmIChlcnJvcikge1xuIFx0XHRcdGhvdFNldFN0YXR1cyhcImZhaWxcIik7XG4gXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiBcdFx0fVxuXG4gXHRcdGhvdFNldFN0YXR1cyhcImlkbGVcIik7XG4gXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gXHRcdFx0cmVzb2x2ZShvdXRkYXRlZE1vZHVsZXMpO1xuIFx0XHR9KTtcbiBcdH1cblxuIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3NcbiBcdC8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuIFx0Ly8gUHJvbWlzZSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbiBcdHZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG4gXHRcdFwiZmRzLWRlbW8uYnVuZGxlLm1pblwiOiAwXG4gXHR9O1xuXG4gXHR2YXIgZGVmZXJyZWRNb2R1bGVzID0gW107XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGhvdDogaG90Q3JlYXRlTW9kdWxlKG1vZHVsZUlkKSxcbiBcdFx0XHRwYXJlbnRzOiAoaG90Q3VycmVudFBhcmVudHNUZW1wID0gaG90Q3VycmVudFBhcmVudHMsIGhvdEN1cnJlbnRQYXJlbnRzID0gW10sIGhvdEN1cnJlbnRQYXJlbnRzVGVtcCksXG4gXHRcdFx0Y2hpbGRyZW46IFtdXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIGhvdENyZWF0ZVJlcXVpcmUobW9kdWxlSWQpKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBfX3dlYnBhY2tfaGFzaF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmggPSBmdW5jdGlvbigpIHsgcmV0dXJuIGhvdEN1cnJlbnRIYXNoOyB9O1xuXG4gXHR2YXIganNvbnBBcnJheSA9IHdpbmRvd1tcIndlYnBhY2tKc29ucFwiXSA9IHdpbmRvd1tcIndlYnBhY2tKc29ucFwiXSB8fCBbXTtcbiBcdHZhciBvbGRKc29ucEZ1bmN0aW9uID0ganNvbnBBcnJheS5wdXNoLmJpbmQoanNvbnBBcnJheSk7XG4gXHRqc29ucEFycmF5LnB1c2ggPSB3ZWJwYWNrSnNvbnBDYWxsYmFjaztcbiBcdGpzb25wQXJyYXkgPSBqc29ucEFycmF5LnNsaWNlKCk7XG4gXHRmb3IodmFyIGkgPSAwOyBpIDwganNvbnBBcnJheS5sZW5ndGg7IGkrKykgd2VicGFja0pzb25wQ2FsbGJhY2soanNvbnBBcnJheVtpXSk7XG4gXHR2YXIgcGFyZW50SnNvbnBGdW5jdGlvbiA9IG9sZEpzb25wRnVuY3Rpb247XG5cblxuIFx0Ly8gYWRkIGVudHJ5IG1vZHVsZSB0byBkZWZlcnJlZCBsaXN0XG4gXHRkZWZlcnJlZE1vZHVsZXMucHVzaChbXCIuL3dlYmFwcC9mZHMtYm9vdHN0cmFwLmpzXCIsXCJmZHMtZGVtby52ZW5kb3IubWluXCJdKTtcbiBcdC8vIHJ1biBkZWZlcnJlZCBtb2R1bGVzIHdoZW4gcmVhZHlcbiBcdHJldHVybiBjaGVja0RlZmVycmVkTW9kdWxlcygpO1xuIiwiZnVuY3Rpb24gd2VicGFja0VtcHR5QXN5bmNDb250ZXh0KHJlcSkge1xuXHQvLyBIZXJlIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKSBpcyB1c2VkIGluc3RlYWQgb2YgbmV3IFByb21pc2UoKSB0byBwcmV2ZW50XG5cdC8vIHVuY2F1Z2h0IGV4Y2VwdGlvbiBwb3BwaW5nIHVwIGluIGRldnRvb2xzXG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fSk7XG59XG53ZWJwYWNrRW1wdHlBc3luY0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH07XG53ZWJwYWNrRW1wdHlBc3luY0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tFbXB0eUFzeW5jQ29udGV4dDtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0VtcHR5QXN5bmNDb250ZXh0O1xud2VicGFja0VtcHR5QXN5bmNDb250ZXh0LmlkID0gXCIuL25vZGVfbW9kdWxlcy9AYW5ndWxhci9jb3JlL2Zlc201IGxhenkgcmVjdXJzaXZlXCI7IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBGZHNTdG9yYWdlU2VydmljZSBmcm9tICcuL3NlcnZpY2VzL2Zkcy1zdG9yYWdlLnNlcnZpY2UnO1xuLyoqXG4gKiBGZHNDb21tb25zTW9kdWxlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIEZkc0NvbW1vbnNNb2R1bGUoKSB7fVxuXG5GZHNDb21tb25zTW9kdWxlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZkc0NvbW1vbnNNb2R1bGVcbn07XG5GZHNDb21tb25zTW9kdWxlLmFubm90YXRpb25zID0gW25ldyBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtdLFxuICBkZWNsYXJhdGlvbnM6IFtdLFxuICBleHBvcnRzOiBbXSxcbiAgcHJvdmlkZXJzOiBbRmRzU3RvcmFnZVNlcnZpY2VdXG59KV07XG5leHBvcnQgeyBGZHNDb21tb25zTW9kdWxlLCBGZHNTdG9yYWdlU2VydmljZSB9OyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IHRyaWdnZXIsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgYW5pbWF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuLyoqXG4gKiBGZHNBbmltYXRpb25zIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIEZkc0FuaW1hdGlvbnMoKSB7fVxuXG5GZHNBbmltYXRpb25zLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZkc0FuaW1hdGlvbnMsXG5cbiAgLyoqXG4gICAqIEZhZGUgYW5pbWF0aW9uXG4gICAqL1xuICBmYWRlQW5pbWF0aW9uOiB0cmlnZ2VyKCdyb3V0ZUFuaW1hdGlvbicsIFtzdGF0ZSgnKicsIHN0eWxlKHtcbiAgICBvcGFjaXR5OiAxXG4gIH0pKSwgdHJhbnNpdGlvbignOmVudGVyJywgW3N0eWxlKHtcbiAgICBvcGFjaXR5OiAwXG4gIH0pLCBhbmltYXRlKCcwLjVzIGVhc2UtaW4nKV0pLCB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbYW5pbWF0ZSgnMC41cyBlYXNlLW91dCcsIHN0eWxlKHtcbiAgICBvcGFjaXR5OiAwXG4gIH0pKV0pXSksXG5cbiAgLyoqXG4gICAqIFNsaWRlIGluIGZyb20gdGhlIGxlZnQgYW5pbWF0aW9uXG4gICAqL1xuICBzbGlkZUluTGVmdEFuaW1hdGlvbjogdHJpZ2dlcigncm91dGVBbmltYXRpb24nLCBbc3RhdGUoJyonLCBzdHlsZSh7XG4gICAgb3BhY2l0eTogMSxcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDApJ1xuICB9KSksIHRyYW5zaXRpb24oJzplbnRlcicsIFtzdHlsZSh7XG4gICAgb3BhY2l0eTogMCxcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC0xMDAlKSdcbiAgfSksIGFuaW1hdGUoJzAuNXMgZWFzZS1pbicpXSksIHRyYW5zaXRpb24oJzpsZWF2ZScsIFthbmltYXRlKCcwLjVzIGVhc2Utb3V0Jywgc3R5bGUoe1xuICAgIG9wYWNpdHk6IDAsXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKSdcbiAgfSkpXSldKSxcblxuICAvKipcbiAgICogU2xpZGUgaW4gZnJvbSB0aGUgdG9wIGFuaW1hdGlvblxuICAgKi9cbiAgc2xpZGVJbkRvd25BbmltYXRpb246IHRyaWdnZXIoJ3JvdXRlQW5pbWF0aW9uJywgW3N0YXRlKCcqJywgc3R5bGUoe1xuICAgIG9wYWNpdHk6IDEsXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwKSdcbiAgfSkpLCB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbc3R5bGUoe1xuICAgIG9wYWNpdHk6IDAsXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMTAwJSknXG4gIH0pLCBhbmltYXRlKCcwLjVzIGVhc2UtaW4nKV0pLCB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbYW5pbWF0ZSgnMC41cyBlYXNlLW91dCcsIHN0eWxlKHtcbiAgICBvcGFjaXR5OiAwLFxuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMTAwJSknXG4gIH0pKV0pXSksXG5cbiAgLyoqXG4gICAqIEZseSBpbi9vdXQgYW5pbWF0aW9uXG4gICAqL1xuICBmbHlJbk91dEFuaW1hdGlvbjogdHJpZ2dlcignZmx5SW5PdXQnLCBbc3RhdGUoJ2luJywgc3R5bGUoe1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCknXG4gIH0pKSwgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW3N0eWxlKHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDEwMCUpJ1xuICB9KSwgYW5pbWF0ZSgnMC40cyAwLjFzIGVhc2UtaW4nKV0pLCB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBhbmltYXRlKCcwLjJzIGVhc2Utb3V0Jywgc3R5bGUoe1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTEwMCUpJ1xuICB9KSkpXSksXG5cbiAgLyoqXG4gICAqIEZseSBpbi9vdXQgYW5pbWF0aW9uXG4gICAqL1xuICBmYWRlSW5PdXRBbmltYXRpb246IHRyaWdnZXIoJ2ZhZGVJbk91dCcsIFtzdGF0ZSgnaW4nLCBzdHlsZSh7XG4gICAgb3BhY2l0eTogMVxuICB9KSksIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtzdHlsZSh7XG4gICAgb3BhY2l0eTogMFxuICB9KSwgYW5pbWF0ZSgnMC41cyAwLjFzIGVhc2UtaW4nKV0pLCB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBhbmltYXRlKCcwLjVzIGVhc2Utb3V0Jywgc3R5bGUoe1xuICAgIG9wYWNpdHk6IDBcbiAgfSkpKV0pXG59O1xuZXhwb3J0IGRlZmF1bHQgbmV3IEZkc0FuaW1hdGlvbnMoKTsiLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBTdG9yZSBpdGVtcyBmb3IgdHdvIGRheXMgYmVmb3JlIGJlaW5nIGVsaWdpYmxlIGZvciByZW1vdmFsLlxudmFyIE1JTExJU19QRVJfREFZID0gODY0MDAwMDA7XG52YXIgVFdPX0RBWVMgPSBNSUxMSVNfUEVSX0RBWSAqIDI7XG5cbnZhciBpc1VuZGVmaW5lZCA9IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCc7XG59O1xuXG52YXIgaXNOdWxsID0gZnVuY3Rpb24gaXNOdWxsKG9iaikge1xuICByZXR1cm4gb2JqID09PSBudWxsO1xufTtcblxudmFyIGlzRGVmaW5lZEFuZE5vdE51bGwgPSBmdW5jdGlvbiBpc0RlZmluZWRBbmROb3ROdWxsKG9iaikge1xuICByZXR1cm4gIWlzVW5kZWZpbmVkKG9iaikgJiYgIWlzTnVsbChvYmopO1xufTtcbi8qKlxuICogQ2hlY2tzIHRoZSBleHBpcmF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGVudHJ5LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBlbnRyeVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuXG52YXIgY2hlY2tFeHBpcmF0aW9uID0gZnVuY3Rpb24gY2hlY2tFeHBpcmF0aW9uKGVudHJ5KSB7XG4gIGlmIChpc0RlZmluZWRBbmROb3ROdWxsKGVudHJ5LmV4cGlyZXMpKSB7XG4gICAgLy8gZ2V0IHRoZSBleHBpcmF0aW9uXG4gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZShlbnRyeS5leHBpcmVzKTtcbiAgICB2YXIgbm93ID0gbmV3IERhdGUoKTsgLy8gcmV0dXJuIHdoZXRoZXIgdGhlIGV4cGlyYXRpb24gZGF0ZSBoYXMgcGFzc2VkXG5cbiAgICByZXR1cm4gZXhwaXJlcy52YWx1ZU9mKCkgPCBub3cudmFsdWVPZigpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcbi8qKlxuICogR2V0cyBhbiBlbnR5IGZvciB0aGUga2V5LiBUaGUgZW50cnkgZXhwaXJhdGlvbiBpcyBub3QgY2hlY2tlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKi9cblxuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiBnZXRFbnRyeShrZXkpIHtcbiAgdHJ5IHtcbiAgICAvLyBwYXJzZSB0aGUgZW50cnlcbiAgICB2YXIgZW50cnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkpOyAvLyBlbnN1cmUgdGhlIGVudHJ5IGFuZCBpdGVtIGFyZSBwcmVzZW50XG5cbiAgICBpZiAoaXNEZWZpbmVkQW5kTm90TnVsbChlbnRyeSkpIHtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuLyoqXG4gKiBGZHNTdG9yYWdlU2VydmljZSBjb25zdHJ1Y3Rvci5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cblxuZnVuY3Rpb24gRmRzU3RvcmFnZVNlcnZpY2UoKSB7fVxuXG5GZHNTdG9yYWdlU2VydmljZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBGZHNTdG9yYWdlU2VydmljZSxcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHN0b3JhZ2UuIEl0ZW1zIHdpbGwgYmUgcGVyc2lzdGVkIGZvciB0d28gZGF5cy4gT25jZSB0aGUgc2NyaXB0cyBydW5zXG4gICAqIHRoZXJlYWZ0ZXIsIGFsbCBlbGlnaWJsZSBpdGVtcyB3aWxsIGJlIHJlbW92ZWQuIFRoaXMgc3RyYXRlZ3kgZG9lcyBub3Qgc3VwcG9ydCBwZXJzaXN0ZW5jZS5cbiAgICovXG4gIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGdldCB0aGUgbmV4dCBpdGVtXG4gICAgICAgIHZhciBrZXkgPSBsb2NhbFN0b3JhZ2Uua2V5KGkpOyAvLyBhdHRlbXB0IHRvIGdldCB0aGUgaXRlbSB3aGljaCB3aWxsIGV4cGlyZSBpZiBuZWNlc3NhcnlcblxuICAgICAgICB0aGlzLmdldEl0ZW0oa2V5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsvLyBEbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTdG9yZXMgdGhlIHNwZWNpZmllZCBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpdGVtXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gZXhwaXJlc1xuICAgKi9cbiAgc2V0SXRlbTogZnVuY3Rpb24gc2V0SXRlbShrZXksIGl0ZW0sIGV4cGlyZXMpIHtcbiAgICAvLyBjYWxjdWxhdGUgdGhlIGV4cGlyYXRpb25cbiAgICBleHBpcmVzID0gaXNEZWZpbmVkQW5kTm90TnVsbChleHBpcmVzKSA/IGV4cGlyZXMgOiBuZXcgRGF0ZSgpLnZhbHVlT2YoKSArIFRXT19EQVlTOyAvLyBjcmVhdGUgdGhlIGVudHJ5XG5cbiAgICB2YXIgZW50cnkgPSB7XG4gICAgICBleHBpcmVzOiBleHBpcmVzLFxuICAgICAgaXRlbTogaXRlbVxuICAgIH07IC8vIHN0b3JlIHRoZSBpdGVtXG5cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KGVudHJ5KSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGVyZSBpcyBhbiBlbnRyeSBmb3IgdGhpcyBrZXkuIFRoaXMgd2lsbCBub3QgY2hlY2sgdGhlIGV4cGlyYXRpb24uIElmXG4gICAqIHRoZSBlbnRyeSBpcyBleHBpcmVkLCBpdCB3aWxsIHJldHVybiBudWxsIG9uIGEgc3Vic2VxdWVudCBnZXRJdGVtIGludm9jYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBoYXNJdGVtOiBmdW5jdGlvbiBoYXNJdGVtKGtleSkge1xuICAgIHJldHVybiBnZXRFbnRyeShrZXkpICE9PSBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuIElmIGFuIGl0ZW0gd2l0aCB0aGlzIGtleSBkb2VzXG4gICAqIG5vdCBleGlzdCwgbnVsbCBpcyByZXR1cm5lZC4gSWYgYW4gaXRlbSBleGlzdHMgYnV0IGNhbm5vdCBiZSBwYXJzZWRcbiAgICogb3IgaXMgbWFsZm9ybWVkL3VucmVjb2duaXplZCwgbnVsbCBpcyByZXR1cm5lZC5cbiAgICpcbiAgICogQHBhcmFtIHt0eXBlfSBrZXlcbiAgICovXG4gIGdldEl0ZW06IGZ1bmN0aW9uIGdldEl0ZW0oa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkoa2V5KTtcblxuICAgIGlmIChlbnRyeSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBpZiB0aGUgZW50cnkgaXMgZXhwaXJlZCwgZHJvcCBpdCBhbmQgcmV0dXJuIG51bGxcblxuXG4gICAgaWYgKGNoZWNrRXhwaXJhdGlvbihlbnRyeSkpIHtcbiAgICAgIHRoaXMucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBpZiB0aGUgZW50cnkgaGFzIHRoZSBzcGVjaWZpZWQgZmllbGQgcmV0dXJuIGl0cyB2YWx1ZVxuXG5cbiAgICBpZiAoaXNEZWZpbmVkQW5kTm90TnVsbChlbnRyeVsnaXRlbSddKSkge1xuICAgICAgcmV0dXJuIGVudHJ5WydpdGVtJ107XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGV4cGlyYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgaXRlbS4gVGhpcyB3aWxsIG5vdCBjaGVjayB0aGUgZXhwaXJhdGlvbi4gSWZcbiAgICogdGhlIGVudHJ5IGlzIGV4cGlyZWQsIGl0IHdpbGwgcmV0dXJuIG51bGwgb24gYSBzdWJzZXF1ZW50IGdldEl0ZW0gaW52b2NhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJucyB7aW50ZWdlcn1cbiAgICovXG4gIGdldEl0ZW1FeHBpcmF0aW9uOiBmdW5jdGlvbiBnZXRJdGVtRXhwaXJhdGlvbihrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBnZXRFbnRyeShrZXkpO1xuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIGlmIHRoZSBlbnRyeSBoYXMgdGhlIHNwZWNpZmllZCBmaWVsZCByZXR1cm4gaXRzIHZhbHVlXG5cblxuICAgIGlmIChpc0RlZmluZWRBbmROb3ROdWxsKGVudHJ5WydleHBpcmVzJ10pKSB7XG4gICAgICByZXR1cm4gZW50cnlbJ2V4cGlyZXMnXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIHN1YmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkIGp3dC4gSWYgdGhlIGp3dCBpcyBub3QgYXMgZXhwZWN0ZWRcbiAgICogYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gand0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRKd3RQYXlsb2FkOiBmdW5jdGlvbiBnZXRKd3RQYXlsb2FkKGp3dCkge1xuICAgIGlmIChpc0RlZmluZWRBbmROb3ROdWxsKGp3dCkpIHtcbiAgICAgIHZhciBzZWdtZW50cyA9IGp3dC5zcGxpdCgvXFwuLyk7XG5cbiAgICAgIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmF3UGF5bG9hZCA9IHdpbmRvdy5hdG9iKHNlZ21lbnRzWzFdKTtcbiAgICAgIHZhciBwYXlsb2FkID0gSlNPTi5wYXJzZShyYXdQYXlsb2FkKTtcblxuICAgICAgaWYgKGlzRGVmaW5lZEFuZE5vdE51bGwocGF5bG9hZCkpIHtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7dHlwZX0ga2V5XG4gICAqL1xuICByZW1vdmVJdGVtOiBmdW5jdGlvbiByZW1vdmVJdGVtKGtleSkge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gIH1cbn07XG5GZHNTdG9yYWdlU2VydmljZS5wYXJhbWV0ZXJzID0gW107XG5leHBvcnQgZGVmYXVsdCBGZHNTdG9yYWdlU2VydmljZTsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLVxcbkxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxcbmNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxcbnRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cXG5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxcbih0aGUgXFxcIkxpY2Vuc2VcXFwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXFxudGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcXG5cXG5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcXG5cXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXFxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXFxcIkFTIElTXFxcIiBCQVNJUyxcXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXFxuLS0+XFxuXFxuPGZkcy1kaWFsb2c+XFxuICAgIDxmZHMtZGlhbG9nLXRpdGxlICpuZ0lmPVxcXCJ0aXRsZVxcXCI+XFxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIj5cXG4gICAgICAgICAgICB7e3RpdGxlfX1cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVxcXCJjYW5jZWwoKVxcXCI+XFxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cXFwicHJpbWFyeVxcXCI+Y2xvc2U8L21hdC1pY29uPlxcbiAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZmRzLWRpYWxvZy10aXRsZT5cXG4gICAgPGZkcy1kaWFsb2ctY29udGVudCBjbGFzcz1cXFwibWQtc3ViaGVhZCB0Yy1ncmV5LTcwMFxcXCI+XFxuICAgICAgICB7e21lc3NhZ2V9fVxcbiAgICA8L2Zkcy1kaWFsb2ctY29udGVudD5cXG4gICAgPGZkcy1kaWFsb2ctYWN0aW9ucz5cXG4gICAgICAgIDxidXR0b24gKm5nSWY9XFxcImNhbmNlbEJ1dHRvblxcXCIgbWF0LXJhaXNlZC1idXR0b25cXG4gICAgICAgICAgICAgICAgY29sb3I9XFxcInt7Y2FuY2VsQnV0dG9uQ29sb3J9fVxcXCJcXG4gICAgICAgICAgICAgICAgI2Nsb3NlQnRuXFxuICAgICAgICAgICAgICAgIChrZXlkb3duLmFycm93cmlnaHQpPVxcXCJhY2NlcHRCdG4uZm9jdXMoKVxcXCJcXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cXFwiY2FuY2VsKClcXFwiPnt7Y2FuY2VsQnV0dG9ufX1cXG4gICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cXFwiYWNjZXB0QnV0dG9uXFxcIiBtYXQtcmFpc2VkLWJ1dHRvblxcbiAgICAgICAgICAgICAgICBjb2xvcj1cXFwie3thY2NlcHRCdXR0b25Db2xvcn19XFxcIlxcbiAgICAgICAgICAgICAgICAjYWNjZXB0QnRuXFxuICAgICAgICAgICAgICAgIChrZXlkb3duLmFycm93bGVmdCk9XFxcImNsb3NlQnRuLmZvY3VzKClcXFwiXFxuICAgICAgICAgICAgICAgIChjbGljayk9XFxcImFjY2VwdCgpXFxcIlxcbiAgICAgICAgICAgICAgICBjbGFzcz1cXFwicHVzaC1sZWZ0LXNtXFxcIj57e2FjY2VwdEJ1dHRvbn19XFxuICAgICAgICA8L2J1dHRvbj5cXG4gICAgPC9mZHMtZGlhbG9nLWFjdGlvbnM+XFxuPC9mZHMtZGlhbG9nPlwiOyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLyoqXG4gKiBGZHNDb25maXJtRGlhbG9nQ29tcG9uZW50IGNvbnN0cnVjdG9yLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIEZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQoKSB7XG4gIHRoaXMudGl0bGUgPSAnJztcbiAgdGhpcy5tZXNzYWdlID0gJyc7XG4gIHRoaXMuYWNjZXB0QnV0dG9uID0gJyc7XG4gIHRoaXMuYWNjZXB0QnV0dG9uQ29sb3IgPSAnZmRzLXByaW1hcnknO1xuICB0aGlzLmNhbmNlbEJ1dHRvbiA9ICcnO1xuICB0aGlzLmNhbmNlbEJ1dHRvbkNvbG9yID0gJ2Zkcy1yZWd1bGFyJztcbiAgdGhpcy5kaWFsb2dSZWYgPSB1bmRlZmluZWQ7XG4gIHRoaXMudmlld0NvbnRhaW5lclJlZiA9IHVuZGVmaW5lZDtcbiAgdGhpcy5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xufVxuXG5GZHNDb25maXJtRGlhbG9nQ29tcG9uZW50LnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQsXG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBkaWFsb2cgYW5kIHNlbmQgYSBjYW5jZWwgcmVzcG9uc2UgdG8gYW55IHN1YnNjcmliZXJzLlxuICAgKi9cbiAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZmFsc2UpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgZGlhbG9nIGFuZCBzZW5kIGFuIGFjY2VwdCByZXNwb25zZSB0byBhbnkgc3Vic2NyaWJlcnMuXG4gICAqL1xuICBhY2NlcHQ6IGZ1bmN0aW9uIGFjY2VwdCgpIHtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0cnVlKTtcbiAgfVxufTtcbkZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQuYW5ub3RhdGlvbnMgPSBbbmV3IENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmRzLWNvbmZpcm0tZGlhbG9nJyxcbiAgdGVtcGxhdGU6IHJlcXVpcmUoJy4vY29uZmlybS1kaWFsb2cuY29tcG9uZW50Lmh0bWwnKX0pXTtcbkZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQucGFyYW1ldGVycyA9IFtdO1xuZXhwb3J0IHsgRmRzQ29uZmlybURpYWxvZ0NvbXBvbmVudCB9OyIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tXFxuTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXFxuY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXFxudGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxcblRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXFxuKHRoZSBcXFwiTGljZW5zZVxcXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcXG50aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxcblxcbmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxcblxcblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcXFwiQVMgSVNcXFwiIEJBU0lTLFxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxcblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cXG4tLT5cXG5cXG48ZGl2IGNsYXNzPVxcXCJmZHMtZGlhbG9nLXdyYXBwZXJcXFwiPlxcbiAgICA8aDMgY2xhc3M9XFxcImZkcy1kaWFsb2ctdGl0bGUgbWQtdGl0bGVcXFwiICpuZ0lmPVxcXCJkaWFsb2dUaXRsZS5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cXFwiZmRzLWRpYWxvZy10aXRsZVxcXCI+PC9uZy1jb250ZW50PlxcbiAgICA8L2gzPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmZHMtZGlhbG9nLWNvbnRlbnQgcGFkLWJvdHRvbS1tZFxcXCIgKm5nSWY9XFxcImRpYWxvZ0NvbnRlbnQubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XFxcImZkcy1kaWFsb2ctY29udGVudFxcXCI+PC9uZy1jb250ZW50PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZmRzLWRpYWxvZy1hY3Rpb25zXFxcIiAqbmdJZj1cXFwiZGlhbG9nQWN0aW9ucy5sZW5ndGggPiAwXFxcIiBsYXlvdXQ9XFxcInJvd1xcXCI+XFxuICAgICAgICA8c3BhbiBmbGV4Pjwvc3Bhbj5cXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cXFwiZmRzLWRpYWxvZy1hY3Rpb25zXFxcIj48L25nLWNvbnRlbnQ+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiOyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBGZHNEaWFsb2dUaXRsZURpcmVjdGl2ZSgpIHt9XG5GZHNEaWFsb2dUaXRsZURpcmVjdGl2ZS5wcm90b3R5cGUgPSB7XG4gIGNvbnRzdHJ1Y3RvcjogRmRzRGlhbG9nVGl0bGVEaXJlY3RpdmVcbn07XG5GZHNEaWFsb2dUaXRsZURpcmVjdGl2ZS5kZWNvcmF0b3JzID0gW3tcbiAgdHlwZTogRGlyZWN0aXZlLFxuICBhcmdzOiBbe1xuICAgIHNlbGVjdG9yOiAnZmRzLWRpYWxvZy10aXRsZSdcbiAgfV1cbn1dO1xuZXhwb3J0IGZ1bmN0aW9uIEZkc0RpYWxvZ0NvbnRlbnREaXJlY3RpdmUoKSB7fVxuRmRzRGlhbG9nQ29udGVudERpcmVjdGl2ZS5wcm90b3R5cGUgPSB7XG4gIGNvbnRzdHJ1Y3RvcjogRmRzRGlhbG9nQ29udGVudERpcmVjdGl2ZVxufTtcbkZkc0RpYWxvZ0NvbnRlbnREaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFt7XG4gIHR5cGU6IERpcmVjdGl2ZSxcbiAgYXJnczogW3tcbiAgICBzZWxlY3RvcjogJ2Zkcy1kaWFsb2ctY29udGVudCdcbiAgfV1cbn1dO1xuZXhwb3J0IGZ1bmN0aW9uIEZkc0RpYWxvZ0FjdGlvbnNEaXJlY3RpdmUoKSB7fVxuRmRzRGlhbG9nQWN0aW9uc0RpcmVjdGl2ZS5wcm90b3R5cGUgPSB7XG4gIGNvbnRzdHJ1Y3RvcjogRmRzRGlhbG9nQWN0aW9uc0RpcmVjdGl2ZVxufTtcbkZkc0RpYWxvZ0FjdGlvbnNEaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFt7XG4gIHR5cGU6IERpcmVjdGl2ZSxcbiAgYXJnczogW3tcbiAgICBzZWxlY3RvcjogJ2Zkcy1kaWFsb2ctYWN0aW9ucydcbiAgfV1cbn1dO1xuLyoqXG4gKiBGZHNEaWFsb2dDb21wb25lbnQgY29uc3RydWN0b3JcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5mdW5jdGlvbiBGZHNEaWFsb2dDb21wb25lbnQoKSB7XG4gIHRoaXMuZGlhbG9nVGl0bGUgPSAnJztcbiAgdGhpcy5kaWFsb2dDb250ZW50ID0gJyc7XG4gIHRoaXMuZGlhbG9nQWN0aW9ucyA9ICcnO1xufVxuXG5GZHNEaWFsb2dDb21wb25lbnQucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRmRzRGlhbG9nQ29tcG9uZW50LFxuXG4gIC8qKlxuICAgKiBSZXNwb25kIGFmdGVyIEFuZ3VsYXIgcHJvamVjdHMgZXh0ZXJuYWwgY29udGVudCBpbnRvIHRoZSBjb21wb25lbnQncyB2aWV3LlxuICAgKi9cbiAgbmdBZnRlckNvbnRlbnRJbml0OiBmdW5jdGlvbiBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgaWYgKHRoaXMuZGlhbG9nVGl0bGUubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEdXBsaWNhdGUgZmRzLWRpYWxvZy10aXRsZSBjb21wb25lbnQgYXQgaW4gZmRzLWRpYWxvZy4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaWFsb2dDb250ZW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRHVwbGljYXRlIGZkcy1kaWFsb2ctY29udGVudCBjb21wb25lbnQgYXQgaW4gZmRzLWRpYWxvZy4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaWFsb2dBY3Rpb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRHVwbGljYXRlIGZkcy1kaWFsb2ctYWN0aW9ucyBjb21wb25lbnQgYXQgaW4gZmRzLWRpYWxvZy4nKTtcbiAgICB9XG4gIH1cbn07XG5GZHNEaWFsb2dDb21wb25lbnQuYW5ub3RhdGlvbnMgPSBbbmV3IENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmRzLWRpYWxvZycsXG4gIHRlbXBsYXRlOiByZXF1aXJlKCcuL2Zkcy1kaWFsb2cuY29tcG9uZW50Lmh0bWwnKSxcbiAgcXVlcmllczoge1xuICAgIGRpYWxvZ1RpdGxlOiBuZXcgQ29udGVudENoaWxkcmVuKEZkc0RpYWxvZ1RpdGxlRGlyZWN0aXZlKSxcbiAgICBkaWFsb2dDb250ZW50OiBuZXcgQ29udGVudENoaWxkcmVuKEZkc0RpYWxvZ0NvbnRlbnREaXJlY3RpdmUpLFxuICAgIGRpYWxvZ0FjdGlvbnM6IG5ldyBDb250ZW50Q2hpbGRyZW4oRmRzRGlhbG9nQWN0aW9uc0RpcmVjdGl2ZSlcbiAgfVxufSldO1xuRmRzRGlhbG9nQ29tcG9uZW50LnBhcmFtZXRlcnMgPSBbXTtcbmV4cG9ydCB7IEZkc0RpYWxvZ0NvbXBvbmVudCB9OyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGbGV4TGF5b3V0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZmxleC1sYXlvdXQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0SW5wdXRNb2R1bGUsIE1hdERpYWxvZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmRzRGlhbG9nVGl0bGVEaXJlY3RpdmUsIEZkc0RpYWxvZ0NvbnRlbnREaXJlY3RpdmUsIEZkc0RpYWxvZ0FjdGlvbnNEaXJlY3RpdmUsIEZkc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZmRzLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUNvbmZpcm1Db25maWcsIEZkc0RpYWxvZ1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IEZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XG52YXIgRkRTX0RJQUxPR1MgPSBbRmRzRGlhbG9nQ29tcG9uZW50LCBGZHNEaWFsb2dUaXRsZURpcmVjdGl2ZSwgRmRzRGlhbG9nQWN0aW9uc0RpcmVjdGl2ZSwgRmRzRGlhbG9nQ29udGVudERpcmVjdGl2ZSwgRmRzQ29uZmlybURpYWxvZ0NvbXBvbmVudF07XG52YXIgRkRTX0RJQUxPR1NfRU5UUllfQ09NUE9ORU5UUyA9IFtGZHNDb25maXJtRGlhbG9nQ29tcG9uZW50XTtcbi8qKlxuICogRmRzRGlhbG9nc01vZHVsZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5mdW5jdGlvbiBGZHNEaWFsb2dzTW9kdWxlKCkge31cblxuRmRzRGlhbG9nc01vZHVsZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBGZHNEaWFsb2dzTW9kdWxlXG59O1xuRmRzRGlhbG9nc01vZHVsZS5hbm5vdGF0aW9ucyA9IFtuZXcgTmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbRmxleExheW91dE1vZHVsZSwgRm9ybXNNb2R1bGUsIENvbW1vbk1vZHVsZSwgTWF0RGlhbG9nTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbRkRTX0RJQUxPR1NdLFxuICBleHBvcnRzOiBbRkRTX0RJQUxPR1NdLFxuICBwcm92aWRlcnM6IFtGZHNEaWFsb2dTZXJ2aWNlXSxcbiAgZW50cnlDb21wb25lbnRzOiBbRkRTX0RJQUxPR1NfRU5UUllfQ09NUE9ORU5UU11cbn0pXTtcbmV4cG9ydCB7IEZkc0RpYWxvZ3NNb2R1bGUsIElDb25maXJtQ29uZmlnLCBGZHNEaWFsb2dTZXJ2aWNlLCBGZHNEaWFsb2dDb21wb25lbnQsIEZkc0RpYWxvZ1RpdGxlRGlyZWN0aXZlLCBGZHNEaWFsb2dDb250ZW50RGlyZWN0aXZlLCBGZHNEaWFsb2dBY3Rpb25zRGlyZWN0aXZlLCBGZHNDb25maXJtRGlhbG9nQ29tcG9uZW50IH07IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IE1hdERpYWxvZ0NvbmZpZywgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgRmRzQ29uZmlybURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5cbmZ1bmN0aW9uIElEaWFsb2dDb25maWcoKSB7XG4gIHRoaXMudGl0bGUgPSAnJztcbiAgdGhpcy5tZXNzYWdlID0gJyc7XG4gIHRoaXMuZGlhbG9nUmVmID0gdW5kZWZpbmVkO1xuICB0aGlzLnZpZXdDb250YWluZXJSZWYgPSB1bmRlZmluZWQ7XG4gIHRoaXMuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcbn1cblxuSURpYWxvZ0NvbmZpZy5wcm90b3R5cGUgPSB7XG4gIGNvbnRzdHJ1Y3RvcjogSURpYWxvZ0NvbmZpZ1xufTtcbiQuZXh0ZW5kKElEaWFsb2dDb25maWcsIE1hdERpYWxvZ0NvbmZpZyk7XG5cbmZ1bmN0aW9uIElDb25maXJtQ29uZmlnKCkge1xuICB0aGlzLmFjY2VwdEJ1dHRvbiA9ICdBQ0NFUFQnO1xuICB0aGlzLmFjY2VwdEJ1dHRvbkNvbG9yID0gJ2Zkcy1wcmltYXJ5JztcbiAgdGhpcy5jYW5jZWxCdXR0b24gPSAnQ0FOQ0VMJztcbiAgdGhpcy5jYW5jZWxCdXR0b25Db2xvciA9ICdmZHMtc2Vjb25kYXJ5Jztcbn1cblxuSUNvbmZpcm1Db25maWcucHJvdG90eXBlID0ge1xuICBjb250c3RydWN0b3I6IElDb25maXJtQ29uZmlnXG59O1xuJC5leHRlbmQoSUNvbmZpcm1Db25maWcsIElEaWFsb2dDb25maWcpO1xuXG5mdW5jdGlvbiBjcmVhdGVDb25maWcoY29uZmlnKSB7XG4gIHZhciBkaWFsb2dDb25maWcgPSBuZXcgSUNvbmZpcm1Db25maWcoKTtcbiAgZGlhbG9nQ29uZmlnLnZpZXdDb250YWluZXJSZWYgPSBjb25maWcudmlld0NvbnRhaW5lclJlZjtcbiAgZGlhbG9nQ29uZmlnLmRpc2FibGVDbG9zZSA9IGNvbmZpZy5kaXNhYmxlQ2xvc2U7XG4gIHJldHVybiBkaWFsb2dDb25maWc7XG59XG4vKipcbiAqIEZkc0RpYWxvZ1NlcnZpY2UgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIE1hdERpYWxvZyAgICAgIFRoZSBhbmd1bGFyIG1hdGVyaWFsIE1hdERpYWxvZy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cblxuZnVuY3Rpb24gRmRzRGlhbG9nU2VydmljZShNYXREaWFsb2cpIHtcbiAgdGhpcy5kaWFsb2dTZXJ2aWNlID0gTWF0RGlhbG9nO1xufVxuXG5GZHNEaWFsb2dTZXJ2aWNlLnByb3RvdHlwZSA9IHtcbiAgY29udHN0cnVjdG9yOiBGZHNEaWFsb2dTZXJ2aWNlLFxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZ1bmN0aW9uIG92ZXIgdGhlIG9wZW4oKSBtZXRob2QgaW4gTWF0RGlhbG9nLlxuICAgKiBPcGVucyBhIG1vZGFsIGRpYWxvZyBjb250YWluaW5nIHRoZSBnaXZlbiBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjb21wb25lbnQgICAgIFRoZSBhbmd1bGFyIENvbXBvbmVudFR5cGU8VD4uXG4gICAqIEBwYXJhbSBjb25maWcgICAgICAgIFRoZSBhbmd1bGFyIG1hdGVyaWFsIE1hdERpYWxvZ0NvbmZpZy5cbiAgICpcbiAgICogQHJldHVybnMge01hdERpYWxvUmVmfSAgICBUaGUgcmVmZXJlbmNlIHRvIHRoZSBkaWFsb2cuXG4gICAqL1xuICBvcGVuOiBmdW5jdGlvbiBvcGVuKGNvbXBvbmVudCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKGNvbXBvbmVudCwgY29uZmlnKTtcbiAgfSxcblxuICAvKipcbiAgICogV3JhcHBlciBmdW5jdGlvbiBvdmVyIHRoZSBjbG9zZUFsbCgpIG1ldGhvZCBpbiBNYXREaWFsb2cuXG4gICAqIENsb3NlcyBhbGwgb2YgdGhlIGN1cnJlbnRseS1vcGVuIGRpYWxvZ3MuXG4gICAqL1xuICBjbG9zZUFsbDogZnVuY3Rpb24gY2xvc2VBbGwoKSB7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNsb3NlQWxsKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgY29uZmlybSBkaWFsb2cgd2l0aCB0aGUgcHJvdmlkZWQgY29uZmlnLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnICAgICBJQ29uZmlybUNvbmZpZyB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2dSZWY/OiBNYXREaWFsb1JlZjtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb250YWluZXJSZWY/OiBWaWV3Q29udGFpbmVyUmVmO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUNsb3NlPzogYm9vbGVhbjtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdEJ1dHRvbj86IHN0cmluZztcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdEJ1dHRvbkNvbG9yPzogc3RyaW5nO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uPzogc3RyaW5nO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uQ29sb3I/OiBzdHJpbmc7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAqXG4gICAqIEByZXR1cm5zIHtNYXREaWFsb1JlZn0gICAgVGhlIHJlZmVyZW5jZSB0byB0aGUgZGlhbG9nLlxuICAgKi9cbiAgb3BlbkNvbmZpcm06IGZ1bmN0aW9uIG9wZW5Db25maXJtKGNvbmZpZykge1xuICAgIHZhciBkaWFsb2dDb25maWcgPSBjcmVhdGVDb25maWcoY29uZmlnKTtcbiAgICB2YXIgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oRmRzQ29uZmlybURpYWxvZ0NvbXBvbmVudCwgZGlhbG9nQ29uZmlnKTtcbiAgICB2YXIgY29uZmlybURpYWxvZ0NvbXBvbmVudCA9IGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZTtcbiAgICBjb25maXJtRGlhbG9nQ29tcG9uZW50LmRpYWxvZ1JlZiA9IGRpYWxvZ1JlZjtcblxuICAgIGlmIChjb25maWcudGl0bGUpIHtcbiAgICAgIGNvbmZpcm1EaWFsb2dDb21wb25lbnQudGl0bGUgPSBjb25maWcudGl0bGU7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5tZXNzYWdlKSB7XG4gICAgICBjb25maXJtRGlhbG9nQ29tcG9uZW50Lm1lc3NhZ2UgPSBjb25maWcubWVzc2FnZTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmFjY2VwdEJ1dHRvbikge1xuICAgICAgY29uZmlybURpYWxvZ0NvbXBvbmVudC5hY2NlcHRCdXR0b24gPSBjb25maWcuYWNjZXB0QnV0dG9uO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuYWNjZXB0QnV0dG9uQ29sb3IpIHtcbiAgICAgIGNvbmZpcm1EaWFsb2dDb21wb25lbnQuYWNjZXB0QnV0dG9uQ29sb3IgPSBjb25maWcuYWNjZXB0QnV0dG9uQ29sb3I7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5jYW5jZWxCdXR0b24pIHtcbiAgICAgIGNvbmZpcm1EaWFsb2dDb21wb25lbnQuY2FuY2VsQnV0dG9uID0gY29uZmlnLmNhbmNlbEJ1dHRvbjtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmNhbmNlbEJ1dHRvbkNvbG9yKSB7XG4gICAgICBjb25maXJtRGlhbG9nQ29tcG9uZW50LmNhbmNlbEJ1dHRvbkNvbG9yID0gY29uZmlnLmNhbmNlbEJ1dHRvbkNvbG9yO1xuICAgIH1cblxuICAgIHJldHVybiBkaWFsb2dSZWY7XG4gIH1cbn07XG5GZHNEaWFsb2dTZXJ2aWNlLnBhcmFtZXRlcnMgPSBbTWF0RGlhbG9nXTtcbmV4cG9ydCB7IElEaWFsb2dDb25maWcsIElDb25maXJtQ29uZmlnLCBGZHNEaWFsb2dTZXJ2aWNlIH07IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGbGV4TGF5b3V0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZmxleC1sYXlvdXQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZU1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRCdXR0b25Ub2dnbGVNb2R1bGUsIE1hdENhcmRNb2R1bGUsIE1hdENoZWNrYm94TW9kdWxlLCBNYXRDaGlwc01vZHVsZSwgTWF0RGF0ZXBpY2tlck1vZHVsZSwgTWF0RGlhbG9nTW9kdWxlLCBNYXRFeHBhbnNpb25Nb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0R3JpZExpc3RNb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRMaXN0TW9kdWxlLCBNYXRNZW51TW9kdWxlLCBNYXRQcm9ncmVzc0Jhck1vZHVsZSwgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLCBNYXRSYWRpb01vZHVsZSwgTWF0U2VsZWN0TW9kdWxlLCBNYXRTbGlkZVRvZ2dsZU1vZHVsZSwgTWF0U2xpZGVyTW9kdWxlLCBNYXRTaWRlbmF2TW9kdWxlLCBNYXRTbmFja0Jhck1vZHVsZSwgTWF0U3RlcHBlck1vZHVsZSwgTWF0VGFic01vZHVsZSwgTWF0VG9vbGJhck1vZHVsZSwgTWF0VG9vbHRpcE1vZHVsZSwgTWF0UGFnaW5hdG9yTW9kdWxlLCBNYXRTb3J0TW9kdWxlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcbmltcG9ydCB7IEJyb3dzZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEJyb3dzZXJBbmltYXRpb25zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci9hbmltYXRpb25zJztcbmltcG9ydCB7IENvdmFsZW50Q29tbW9uTW9kdWxlLCBDb3ZhbGVudENoaXBzTW9kdWxlLCBDb3ZhbGVudERpYWxvZ3NNb2R1bGUsIENvdmFsZW50RXhwYW5zaW9uUGFuZWxNb2R1bGUsIENvdmFsZW50UGFnaW5nTW9kdWxlIH0gZnJvbSAnQGNvdmFsZW50L2NvcmUnO1xuaW1wb3J0IHsgQ292YWxlbnRTdGVwc01vZHVsZSB9IGZyb20gJ0Bjb3ZhbGVudC9jb3JlL3N0ZXBzJztcbmltcG9ydCB7IENvdmFsZW50RGF0YVRhYmxlTW9kdWxlIH0gZnJvbSAnQGNvdmFsZW50L2NvcmUvZGF0YS10YWJsZSc7XG5pbXBvcnQgeyBGZHNEaWFsb2dzTW9kdWxlIH0gZnJvbSAnLi9kaWFsb2dzL2Zkcy1kaWFsb2dzLm1vZHVsZSc7XG5pbXBvcnQgeyBGZHNTbmFja0JhcnNNb2R1bGUgfSBmcm9tICcuL3NuYWNrYmFycy9mZHMtc25hY2tiYXJzLm1vZHVsZSc7XG4vKipcbiAqIEZsb3dEZXNpZ25TeXN0ZW1Nb2R1bGUgY29uc3RydWN0b3IuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gRmxvd0Rlc2lnblN5c3RlbU1vZHVsZSgpIHtcbiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgIC8vYWRkIGZkcyBhdHRyIHRvIGJvZHkgdGFnIHRvIGFsbG93IGZpbmUgZ3JhaW4gc3R5bGUgb3ZlcnJpZGVzXG4gICAgZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUoJ2ZkcycsICcnKTsgLy9vdmVycmlkZSB0aGUgaG92ZXIgc3R5bGVzIGZvciBjaGVja2JveCBib3JkZXJzXG5cbiAgICAkKGRvY3VtZW50LmJvZHkpLm9uKCdtb3VzZWVudGVyJywgJy5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgJCh0aGlzKS5maW5kKCcubWF0LWNoZWNrYm94LWZyYW1lJykuY3NzKCdib3JkZXItY29sb3InLCAnIzE0OTFDMScpO1xuICAgIH0pO1xuICAgICQoZG9jdW1lbnQuYm9keSkub24oJ21vdXNlbGVhdmUnLCAnLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLmZpbmQoJy5tYXQtY2hlY2tib3gtZnJhbWUnKS5jc3MoJ2JvcmRlci1jb2xvcicsICcjREREREREJyk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5GbG93RGVzaWduU3lzdGVtTW9kdWxlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZsb3dEZXNpZ25TeXN0ZW1Nb2R1bGVcbn07XG5GbG93RGVzaWduU3lzdGVtTW9kdWxlLmFubm90YXRpb25zID0gW25ldyBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtGbGV4TGF5b3V0TW9kdWxlLCBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSwgQ29tbW9uTW9kdWxlLCBCcm93c2VyTW9kdWxlLCBNYXRBdXRvY29tcGxldGVNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0QnV0dG9uVG9nZ2xlTW9kdWxlLCBNYXRDYXJkTW9kdWxlLCBNYXRDaGVja2JveE1vZHVsZSwgTWF0Q2hpcHNNb2R1bGUsIE1hdERhdGVwaWNrZXJNb2R1bGUsIE1hdERpYWxvZ01vZHVsZSwgTWF0RXhwYW5zaW9uTW9kdWxlLCBNYXRGb3JtRmllbGRNb2R1bGUsIE1hdEdyaWRMaXN0TW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0TGlzdE1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSwgTWF0UmFkaW9Nb2R1bGUsIE1hdFNlbGVjdE1vZHVsZSwgTWF0U2xpZGVUb2dnbGVNb2R1bGUsIE1hdFNsaWRlck1vZHVsZSwgTWF0U2lkZW5hdk1vZHVsZSwgTWF0U25hY2tCYXJNb2R1bGUsIE1hdFN0ZXBwZXJNb2R1bGUsIE1hdFRhYnNNb2R1bGUsIE1hdFRvb2xiYXJNb2R1bGUsIE1hdFRvb2x0aXBNb2R1bGUsIE1hdFBhZ2luYXRvck1vZHVsZSwgTWF0U29ydE1vZHVsZSwgTWF0VGFibGVNb2R1bGUsIENvdmFsZW50Q29tbW9uTW9kdWxlLCBDb3ZhbGVudENoaXBzTW9kdWxlLCBDb3ZhbGVudFN0ZXBzTW9kdWxlLCBDb3ZhbGVudERhdGFUYWJsZU1vZHVsZSwgQ292YWxlbnREaWFsb2dzTW9kdWxlLCBDb3ZhbGVudEV4cGFuc2lvblBhbmVsTW9kdWxlLCBDb3ZhbGVudFBhZ2luZ01vZHVsZSwgRmRzRGlhbG9nc01vZHVsZSwgRmRzU25hY2tCYXJzTW9kdWxlXSxcbiAgZXhwb3J0czogW0ZsZXhMYXlvdXRNb2R1bGUsIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlLCBDb21tb25Nb2R1bGUsIEJyb3dzZXJNb2R1bGUsIE1hdEF1dG9jb21wbGV0ZU1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRCdXR0b25Ub2dnbGVNb2R1bGUsIE1hdENhcmRNb2R1bGUsIE1hdENoZWNrYm94TW9kdWxlLCBNYXRDaGlwc01vZHVsZSwgTWF0RGF0ZXBpY2tlck1vZHVsZSwgTWF0RGlhbG9nTW9kdWxlLCBNYXRFeHBhbnNpb25Nb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0R3JpZExpc3RNb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRMaXN0TW9kdWxlLCBNYXRNZW51TW9kdWxlLCBNYXRQcm9ncmVzc0Jhck1vZHVsZSwgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLCBNYXRSYWRpb01vZHVsZSwgTWF0U2VsZWN0TW9kdWxlLCBNYXRTbGlkZVRvZ2dsZU1vZHVsZSwgTWF0U2xpZGVyTW9kdWxlLCBNYXRTaWRlbmF2TW9kdWxlLCBNYXRTbmFja0Jhck1vZHVsZSwgTWF0U3RlcHBlck1vZHVsZSwgTWF0VGFic01vZHVsZSwgTWF0VG9vbGJhck1vZHVsZSwgTWF0VG9vbHRpcE1vZHVsZSwgTWF0UGFnaW5hdG9yTW9kdWxlLCBNYXRTb3J0TW9kdWxlLCBNYXRUYWJsZU1vZHVsZSwgQ292YWxlbnRDb21tb25Nb2R1bGUsIENvdmFsZW50Q2hpcHNNb2R1bGUsIENvdmFsZW50U3RlcHNNb2R1bGUsIENvdmFsZW50RGF0YVRhYmxlTW9kdWxlLCBDb3ZhbGVudERpYWxvZ3NNb2R1bGUsIENvdmFsZW50RXhwYW5zaW9uUGFuZWxNb2R1bGUsIENvdmFsZW50UGFnaW5nTW9kdWxlLCBGZHNEaWFsb2dzTW9kdWxlLCBGZHNTbmFja0JhcnNNb2R1bGVdXG59KV07XG5leHBvcnQgZGVmYXVsdCBGbG93RGVzaWduU3lzdGVtTW9kdWxlOyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IEZkc0RpYWxvZ3NNb2R1bGUsIEZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQsIEZkc0RpYWxvZ0FjdGlvbnNEaXJlY3RpdmUsIEZkc0RpYWxvZ0NvbXBvbmVudCwgRmRzRGlhbG9nQ29udGVudERpcmVjdGl2ZSwgRmRzRGlhbG9nU2VydmljZSwgRmRzRGlhbG9nVGl0bGVEaXJlY3RpdmUsIElDb25maXJtQ29uZmlnIH0gZnJvbSAnLi9kaWFsb2dzL2Zkcy1kaWFsb2dzLm1vZHVsZSc7XG5pbXBvcnQgeyBGZHNDb21tb25zTW9kdWxlLCBGZHNTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vY29tbW9uL2Zkcy1jb21tb24ubW9kdWxlJztcbmltcG9ydCBGZHNBbmltYXRpb25zIGZyb20gJy4vY29tbW9uL2Zkcy5hbmltYXRpb25zJztcbmltcG9ydCB7IEZkc0NvYXN0ZXJDb21wb25lbnQsIEZkc1NuYWNrQmFyQWN0aW9uc0RpcmVjdGl2ZSwgRmRzU25hY2tCYXJDb21wb25lbnQsIEZkc1NuYWNrQmFyQ29udGVudERpcmVjdGl2ZSwgRmRzU25hY2tCYXJTZXJ2aWNlLCBGZHNTbmFja0JhcnNNb2R1bGUsIEZkc1NuYWNrQmFyVGl0bGVEaXJlY3RpdmUsIElDb2FzdGVyQ29uZmlnIH0gZnJvbSAnLi9zbmFja2JhcnMvZmRzLXNuYWNrYmFycy5tb2R1bGUnO1xuaW1wb3J0IEZsb3dEZXNpZ25TeXN0ZW1Nb2R1bGUgZnJvbSAnLi9mbG93LWRlc2lnbi1zeXN0ZW0ubW9kdWxlJztcbmV4cG9ydCB7IEZkc0RpYWxvZ3NNb2R1bGUsIEZkc0NvbmZpcm1EaWFsb2dDb21wb25lbnQsIEZkc0RpYWxvZ0FjdGlvbnNEaXJlY3RpdmUsIEZkc0RpYWxvZ0NvbXBvbmVudCwgRmRzRGlhbG9nQ29udGVudERpcmVjdGl2ZSwgRmRzRGlhbG9nU2VydmljZSwgRmRzRGlhbG9nVGl0bGVEaXJlY3RpdmUsIElDb25maXJtQ29uZmlnLCBGZHNDb21tb25zTW9kdWxlLCBGZHNTdG9yYWdlU2VydmljZSwgRmRzQW5pbWF0aW9ucywgRmRzQ29hc3RlckNvbXBvbmVudCwgRmRzU25hY2tCYXJBY3Rpb25zRGlyZWN0aXZlLCBGZHNTbmFja0JhckNvbXBvbmVudCwgRmRzU25hY2tCYXJDb250ZW50RGlyZWN0aXZlLCBGZHNTbmFja0JhclNlcnZpY2UsIEZkc1NuYWNrQmFyc01vZHVsZSwgRmRzU25hY2tCYXJUaXRsZURpcmVjdGl2ZSwgSUNvYXN0ZXJDb25maWcsIEZsb3dEZXNpZ25TeXN0ZW1Nb2R1bGUgYXMgRmRzQ29yZU1vZHVsZSB9OyIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tXFxuTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXFxuY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXFxudGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxcblRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXFxuKHRoZSBcXFwiTGljZW5zZVxcXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcXG50aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxcblxcbmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxcblxcblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcXFwiQVMgSVNcXFwiIEJBU0lTLFxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxcblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cXG4tLT5cXG5cXG48ZmRzLXNuYWNrYmFyPlxcbiAgICA8ZmRzLXNuYWNrYmFyLXRpdGxlICpuZ0lmPVxcXCJ0aXRsZVxcXCI+XFxuICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJjb2FzdGVyLWNsb3NlLWljb25cXFwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVxcXCJjYW5jZWwoKVxcXCI+XFxuICAgICAgICAgICAgPG1hdC1pY29uIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj5jbG9zZTwvbWF0LWljb24+XFxuICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgIDxpICpuZ0lmPVxcXCJpY29uXFxcIiBjbGFzcz1cXFwie3tpY29ufX0gZmRzLWNvYXN0ZXItaWNvblxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImVsbGlwc2lzXFxcIiBmeExheW91dD1cXFwicm93XFxcIiB0aXRsZT1cXFwie3t0aXRsZX19XFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAge3t0aXRsZX19XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9mZHMtc25hY2tiYXItdGl0bGU+XFxuICAgIDxmZHMtc25hY2tiYXItY29udGVudCB0aXRsZT1cXFwie3ttZXNzYWdlfX1cXFwiIGNsYXNzPVxcXCJmZHMtY29hc3Rlci1tZXNzYWdlIHRjLWdyZXktNzAwXFxcIj5cXG4gICAgICAgIHt7bWVzc2FnZX19XFxuICAgIDwvZmRzLXNuYWNrYmFyLWNvbnRlbnQ+XFxuICAgIDxmZHMtc25hY2tiYXItYWN0aW9ucz5cXG4gICAgPC9mZHMtc25hY2tiYXItYWN0aW9ucz5cXG48L2Zkcy1zbmFja2Jhcj5cXG5cIjsiLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG4vKipcbiAqIEZkc0NvYXN0ZXJDb21wb25lbnQgY29uc3RydWN0b3IuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gRmRzQ29hc3RlckNvbXBvbmVudCgpIHtcbiAgdGhpcy50aXRsZSA9ICcnO1xuICB0aGlzLm1lc3NhZ2UgPSAnJztcbiAgdGhpcy5pY29uID0gJyc7XG4gIHRoaXMuY29sb3IgPSAnJztcbiAgdGhpcy5zbmFja0JhclJlZiA9IHVuZGVmaW5lZDtcbiAgdGhpcy52aWV3Q29udGFpbmVyUmVmID0gdW5kZWZpbmVkO1xufVxuXG5GZHNDb2FzdGVyQ29tcG9uZW50LnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZkc0NvYXN0ZXJDb21wb25lbnQsXG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZDogZnVuY3Rpb24gbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgICQoJy5mZHMtc25hY2tiYXItd3JhcHBlcicpLmNzcygnYm9yZGVyLWNvbG9yJywgdGhpcy5jb2xvcik7XG4gICAgJCgnLmZkcy1zbmFja2Jhci10aXRsZScpLmNzcygnY29sb3InLCB0aGlzLmNvbG9yKTtcbiAgICAkKCcuZmRzLWNvYXN0ZXItaWNvbicpLmNzcygnY29sb3InLCB0aGlzLmNvbG9yKTtcblxuICAgIGlmICh0aGlzLmljb24pIHtcbiAgICAgICQoJy5mZHMtc25hY2tiYXItd3JhcHBlcicpLmNzcygncGFkZGluZycsICcxNXB4IDE1cHggMTVweCA0NXB4Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoJy5mZHMtc25hY2tiYXItd3JhcHBlcicpLmNzcygncGFkZGluZycsICcxNXB4IDE1cHggMTVweCAxNXB4Jyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgc25hY2tiYXIgYW5kIHNlbmQgYSBjYW5jZWwgcmVzcG9uc2UgdG8gYW55IHN1YnNjcmliZXJzLlxuICAgKi9cbiAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgdGhpcy5zbmFja0JhclJlZi5kaXNtaXNzKGZhbHNlKTtcbiAgfVxufTtcbkZkc0NvYXN0ZXJDb21wb25lbnQuYW5ub3RhdGlvbnMgPSBbbmV3IENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmRzLWNvYXN0ZXInLFxuICB0ZW1wbGF0ZTogcmVxdWlyZSgnLi9jb2FzdGVyLmNvbXBvbmVudC5odG1sJyl9KV07XG5GZHNDb2FzdGVyQ29tcG9uZW50LnBhcmFtZXRlcnMgPSBbXTtcbmV4cG9ydCB7IEZkc0NvYXN0ZXJDb21wb25lbnQgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLVxcbkxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxcbmNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxcbnRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cXG5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxcbih0aGUgXFxcIkxpY2Vuc2VcXFwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXFxudGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcXG5cXG5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcXG5cXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXFxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXFxcIkFTIElTXFxcIiBCQVNJUyxcXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXFxuLS0+XFxuXFxuPGRpdiBjbGFzcz1cXFwiZmRzLXNuYWNrYmFyLXdyYXBwZXJcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmZHMtc25hY2tiYXItdGl0bGVcXFwiICpuZ0lmPVxcXCJzbmFja0JhclRpdGxlLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVxcXCJmZHMtc25hY2tiYXItdGl0bGVcXFwiPjwvbmctY29udGVudD5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZkcy1zbmFja2Jhci1jb250ZW50XFxcIiAqbmdJZj1cXFwic25hY2tCYXJDb250ZW50Lmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVxcXCJmZHMtc25hY2tiYXItY29udGVudFxcXCI+PC9uZy1jb250ZW50PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZmRzLXNuYWNrYmFyLWFjdGlvbnNcXFwiICpuZ0lmPVxcXCJzbmFja0JhckFjdGlvbnMubGVuZ3RoID4gMFxcXCIgbGF5b3V0PVxcXCJyb3dcXFwiPlxcbiAgICAgICAgPHNwYW4gZmxleD48L3NwYW4+XFxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XFxcImZkcy1zbmFja2Jhci1hY3Rpb25zXFxcIj48L25nLWNvbnRlbnQ+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiOyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgRGlyZWN0aXZlLCBDb250ZW50Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmV4cG9ydCBmdW5jdGlvbiBGZHNTbmFja0JhclRpdGxlRGlyZWN0aXZlKCkge31cbkZkc1NuYWNrQmFyVGl0bGVEaXJlY3RpdmUucHJvdG90eXBlID0ge1xuICBjb250c3RydWN0b3I6IEZkc1NuYWNrQmFyVGl0bGVEaXJlY3RpdmVcbn07XG5GZHNTbmFja0JhclRpdGxlRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbe1xuICB0eXBlOiBEaXJlY3RpdmUsXG4gIGFyZ3M6IFt7XG4gICAgc2VsZWN0b3I6ICdmZHMtc25hY2tiYXItdGl0bGUnXG4gIH1dXG59XTtcbmV4cG9ydCBmdW5jdGlvbiBGZHNTbmFja0JhckNvbnRlbnREaXJlY3RpdmUoKSB7fVxuRmRzU25hY2tCYXJDb250ZW50RGlyZWN0aXZlLnByb3RvdHlwZSA9IHtcbiAgY29udHN0cnVjdG9yOiBGZHNTbmFja0JhckNvbnRlbnREaXJlY3RpdmVcbn07XG5GZHNTbmFja0JhckNvbnRlbnREaXJlY3RpdmUuZGVjb3JhdG9ycyA9IFt7XG4gIHR5cGU6IERpcmVjdGl2ZSxcbiAgYXJnczogW3tcbiAgICBzZWxlY3RvcjogJ2Zkcy1zbmFja2Jhci1jb250ZW50J1xuICB9XVxufV07XG5leHBvcnQgZnVuY3Rpb24gRmRzU25hY2tCYXJBY3Rpb25zRGlyZWN0aXZlKCkge31cbkZkc1NuYWNrQmFyQWN0aW9uc0RpcmVjdGl2ZS5wcm90b3R5cGUgPSB7XG4gIGNvbnRzdHJ1Y3RvcjogRmRzU25hY2tCYXJBY3Rpb25zRGlyZWN0aXZlXG59O1xuRmRzU25hY2tCYXJBY3Rpb25zRGlyZWN0aXZlLmRlY29yYXRvcnMgPSBbe1xuICB0eXBlOiBEaXJlY3RpdmUsXG4gIGFyZ3M6IFt7XG4gICAgc2VsZWN0b3I6ICdmZHMtc25hY2tiYXItYWN0aW9ucydcbiAgfV1cbn1dO1xuLyoqXG4gKiBGZHNTbmFja0JhckNvbXBvbmVudCBjb25zdHJ1Y3RvclxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIEZkc1NuYWNrQmFyQ29tcG9uZW50KCkge1xuICB0aGlzLnNuYWNrQmFyVGl0bGUgPSAnJztcbiAgdGhpcy5zbmFja0JhckNvbnRlbnQgPSAnJztcbiAgdGhpcy5zbmFja0JhckFjdGlvbnMgPSAnJztcbn1cblxuRmRzU25hY2tCYXJDb21wb25lbnQucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRmRzU25hY2tCYXJDb21wb25lbnQsXG5cbiAgLyoqXG4gICAqIFJlc3BvbmQgYWZ0ZXIgQW5ndWxhciBwcm9qZWN0cyBleHRlcm5hbCBjb250ZW50IGludG8gdGhlIGNvbXBvbmVudCdzIHZpZXcuXG4gICAqL1xuICBuZ0FmdGVyQ29udGVudEluaXQ6IGZ1bmN0aW9uIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICBpZiAodGhpcy5zbmFja0JhclRpdGxlLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRHVwbGljYXRlIGZkcy1zbmFja2Jhci10aXRsZSBjb21wb25lbnQgYXQgaW4gZmRzLXNuYWNrYmFyLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNuYWNrQmFyQ29udGVudC5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0R1cGxpY2F0ZSBmZHMtc25hY2tiYXItY29udGVudCBjb21wb25lbnQgYXQgaW4gZmRzLXNuYWNrYmFyLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNuYWNrQmFyQWN0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0R1cGxpY2F0ZSBmZHMtc25hY2tiYXItYWN0aW9ucyBjb21wb25lbnQgYXQgaW4gZmRzLXNuYWNrYmFyLicpO1xuICAgIH1cbiAgfVxufTtcbkZkc1NuYWNrQmFyQ29tcG9uZW50LmFubm90YXRpb25zID0gW25ldyBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Zkcy1zbmFja2JhcicsXG4gIHRlbXBsYXRlOiByZXF1aXJlKCcuL2Zkcy1zbmFja2Jhci5jb21wb25lbnQuaHRtbCcpLFxuICBxdWVyaWVzOiB7XG4gICAgc25hY2tCYXJUaXRsZTogbmV3IENvbnRlbnRDaGlsZHJlbihGZHNTbmFja0JhclRpdGxlRGlyZWN0aXZlKSxcbiAgICBzbmFja0JhckNvbnRlbnQ6IG5ldyBDb250ZW50Q2hpbGRyZW4oRmRzU25hY2tCYXJDb250ZW50RGlyZWN0aXZlKSxcbiAgICBzbmFja0JhckFjdGlvbnM6IG5ldyBDb250ZW50Q2hpbGRyZW4oRmRzU25hY2tCYXJBY3Rpb25zRGlyZWN0aXZlKVxuICB9XG59KV07XG5GZHNTbmFja0JhckNvbXBvbmVudC5wYXJhbWV0ZXJzID0gW107XG5leHBvcnQgeyBGZHNTbmFja0JhckNvbXBvbmVudCB9OyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGbGV4TGF5b3V0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZmxleC1sYXlvdXQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0SW5wdXRNb2R1bGUsIE1hdFNuYWNrQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGZHNTbmFja0JhckNvbXBvbmVudCwgRmRzU25hY2tCYXJUaXRsZURpcmVjdGl2ZSwgRmRzU25hY2tCYXJBY3Rpb25zRGlyZWN0aXZlLCBGZHNTbmFja0JhckNvbnRlbnREaXJlY3RpdmUgfSBmcm9tICcuL2Zkcy1zbmFja2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUNvYXN0ZXJDb25maWcsIEZkc1NuYWNrQmFyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvc25hY2tiYXIuc2VydmljZSc7XG5pbXBvcnQgeyBGZHNDb2FzdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb2FzdGVyL2NvYXN0ZXIuY29tcG9uZW50JztcbnZhciBGRFNfU05BQ0tCQVJTID0gW0Zkc1NuYWNrQmFyQ29tcG9uZW50LCBGZHNTbmFja0JhclRpdGxlRGlyZWN0aXZlLCBGZHNTbmFja0JhckFjdGlvbnNEaXJlY3RpdmUsIEZkc1NuYWNrQmFyQ29udGVudERpcmVjdGl2ZSwgRmRzQ29hc3RlckNvbXBvbmVudF07XG52YXIgRkRTX1NOQUNLQkFSU19FTlRSWV9DT01QT05FTlRTID0gW0Zkc0NvYXN0ZXJDb21wb25lbnRdO1xuLyoqXG4gKiBGZHNTbmFja0JhcnNNb2R1bGUgY29uc3RydWN0b3IuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gRmRzU25hY2tCYXJzTW9kdWxlKCkge31cblxuRmRzU25hY2tCYXJzTW9kdWxlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZkc1NuYWNrQmFyc01vZHVsZVxufTtcbkZkc1NuYWNrQmFyc01vZHVsZS5hbm5vdGF0aW9ucyA9IFtuZXcgTmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbRmxleExheW91dE1vZHVsZSwgRm9ybXNNb2R1bGUsIENvbW1vbk1vZHVsZSwgTWF0U25hY2tCYXJNb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdEljb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtGRFNfU05BQ0tCQVJTXSxcbiAgZXhwb3J0czogW0ZEU19TTkFDS0JBUlNdLFxuICBwcm92aWRlcnM6IFtGZHNTbmFja0JhclNlcnZpY2VdLFxuICBlbnRyeUNvbXBvbmVudHM6IFtGRFNfU05BQ0tCQVJTX0VOVFJZX0NPTVBPTkVOVFNdXG59KV07XG5leHBvcnQgeyBGZHNTbmFja0JhcnNNb2R1bGUsIElDb2FzdGVyQ29uZmlnLCBGZHNTbmFja0JhclNlcnZpY2UsIEZkc1NuYWNrQmFyQ29tcG9uZW50LCBGZHNTbmFja0JhclRpdGxlRGlyZWN0aXZlLCBGZHNTbmFja0JhckNvbnRlbnREaXJlY3RpdmUsIEZkc1NuYWNrQmFyQWN0aW9uc0RpcmVjdGl2ZSwgRmRzQ29hc3RlckNvbXBvbmVudCB9OyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcbiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IE1hdFNuYWNrQmFyQ29uZmlnLCBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBGZHNDb2FzdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29hc3Rlci9jb2FzdGVyLmNvbXBvbmVudCc7XG5leHBvcnQgZnVuY3Rpb24gSVNuYWNrQmFyQ29uZmlnKCkge1xuICB0aGlzLnRpdGxlID0gJyc7XG4gIHRoaXMubWVzc2FnZSA9ICcnO1xuICB0aGlzLnNuYWNrQmFyUmVmID0gdW5kZWZpbmVkO1xuICB0aGlzLnZpZXdDb250YWluZXJSZWYgPSB1bmRlZmluZWQ7XG59XG5JU25hY2tCYXJDb25maWcucHJvdG90eXBlID0ge1xuICBjb250c3RydWN0b3I6IElTbmFja0JhckNvbmZpZ1xufTtcbiQuZXh0ZW5kKElTbmFja0JhckNvbmZpZywgTWF0U25hY2tCYXJDb25maWcpO1xuZXhwb3J0IGZ1bmN0aW9uIElDb2FzdGVyQ29uZmlnKCkge1xuICB0aGlzLmljb24gPSAnJztcbiAgdGhpcy5jb2xvciA9ICcnO1xufVxuSUNvYXN0ZXJDb25maWcucHJvdG90eXBlID0ge1xuICBjb250c3RydWN0b3I6IElDb2FzdGVyQ29uZmlnXG59O1xuJC5leHRlbmQoSUNvYXN0ZXJDb25maWcsIElTbmFja0JhckNvbmZpZyk7XG4vKipcbiAqIEZkc1NuYWNrQmFyU2VydmljZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0gTWF0U25hY2tCYXIgICAgICBUaGUgYW5ndWxhciBtYXRlcmlhbCBNYXRTbmFja0Jhci5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBGZHNTbmFja0JhclNlcnZpY2UoTWF0U25hY2tCYXIpIHtcbiAgdGhpcy5zbmFja0JhclNlcnZpY2UgPSBNYXRTbmFja0Jhcjtcbn1cbkZkc1NuYWNrQmFyU2VydmljZS5wcm90b3R5cGUgPSB7XG4gIGNvbnRzdHJ1Y3RvcjogRmRzU25hY2tCYXJTZXJ2aWNlLFxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZ1bmN0aW9uIG92ZXIgdGhlIG9wZW4oKSBtZXRob2QgaW4gTWF0U25hY2tCYXIuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlICAgICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgc25hY2tiYXIuXG4gICAqIEBwYXJhbSBhY3Rpb24gICAgICAgICAgICAgICAgVGhlIGxhYmVsIGZvciB0aGUgc25hY2tiYXIgYWN0aW9uLlxuICAgKiBAcGFyYW0gY29uZmlnICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc25hY2tiYXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtNYXRTbmFja0JhclJlZn0gICAgVGhlIHJlZmVyZW5jZSB0byB0aGUgc25hY2tiYXIuXG4gICAqL1xuICBvcGVuOiBmdW5jdGlvbiBvcGVuKG1lc3NhZ2UsIGFjdGlvbiwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4obWVzc2FnZSwgYWN0aW9uLCBjb25maWcpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZ1bmN0aW9uIG92ZXIgdGhlIG9wZW5Gcm9tQ29tcG9uZW50KCkgbWV0aG9kIGluIE1hdFNuYWNrQmFyLlxuICAgKiBPcGVucyBhIHNuYWNrYmFyIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGNvbXBvbmVudCAgICAgVGhlIGFuZ3VsYXIgQ29tcG9uZW50VHlwZTxUPi5cbiAgICogQHBhcmFtIGNvbmZpZyAgICAgICAgVGhlIGFuZ3VsYXIgbWF0ZXJpYWwgTWF0U25hY2tCYXJDb25maWcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtNYXRTbmFja0JhclJlZn0gICAgVGhlIHJlZmVyZW5jZSB0byB0aGUgc25hY2tiYXIuXG4gICAqL1xuICBvcGVuRnJvbUNvbXBvbmVudDogZnVuY3Rpb24gb3BlbkZyb21Db21wb25lbnQoY29tcG9uZW50LCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbkZyb21Db21wb25lbnQoY29tcG9uZW50LCBjb25maWcpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZ1bmN0aW9uIG92ZXIgdGhlIGRpc21pc3MoKSBtZXRob2QgaW4gTWF0U25hY2tCYXIuXG4gICAqIERpc21pc3NlcyB0aGUgY3VycmVudGx5LW9wZW4gc25hY2tiYXIuXG4gICAqL1xuICBkaXNtaXNzOiBmdW5jdGlvbiBkaXNtaXNzKCkge1xuICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLmRpc21pc3MoKTtcbiAgfSxcblxuICAvKipcbiAgICogT3BlbnMgYSBjb2FzdGVyIHNuYWNrYmFyIHdpdGggdGhlIHByb3ZpZGVkIGNvbmZpZy5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAgICAgSUNvYXN0ZXJDb25maWcge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT86IHN0cmluZztcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hY2tCYXJSZWY/OiBNYXRTbmFja0JhclJlZjtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb250YWluZXJSZWY/OiBWaWV3Q29udGFpbmVyUmVmO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj86IHN0cmluZztcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPzogc3RyaW5nO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgKlxuICAgKiBAcmV0dXJucyB7TWF0U25hY2tCYXJSZWZ9ICAgIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNuYWNrYmFyLlxuICAgKi9cbiAgb3BlbkNvYXN0ZXI6IGZ1bmN0aW9uIG9wZW5Db2FzdGVyKGNvbmZpZykge1xuICAgIHZhciBzbmFja0JhckNvbmZpZyA9IG5ldyBJQ29hc3RlckNvbmZpZygpO1xuICAgIHNuYWNrQmFyQ29uZmlnLnZlcnRpY2FsUG9zaXRpb24gPSBjb25maWcudmVydGljYWxQb3NpdGlvbjtcbiAgICBzbmFja0JhckNvbmZpZy5ob3Jpem9udGFsUG9zaXRpb24gPSBjb25maWcuaG9yaXpvbnRhbFBvc2l0aW9uO1xuICAgIHNuYWNrQmFyQ29uZmlnLmR1cmF0aW9uID0gY29uZmlnLmR1cmF0aW9uO1xuICAgIHZhciBzbmFja0JhclJlZiA9IHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW5Gcm9tQ29tcG9uZW50KEZkc0NvYXN0ZXJDb21wb25lbnQsIHNuYWNrQmFyQ29uZmlnKTtcbiAgICB2YXIgY29hc3RlckNvbXBvbmVudCA9IHNuYWNrQmFyUmVmLmluc3RhbmNlO1xuICAgIGNvYXN0ZXJDb21wb25lbnQuc25hY2tCYXJSZWYgPSBzbmFja0JhclJlZjtcblxuICAgIGlmIChjb25maWcudGl0bGUpIHtcbiAgICAgIGNvYXN0ZXJDb21wb25lbnQudGl0bGUgPSBjb25maWcudGl0bGU7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5tZXNzYWdlKSB7XG4gICAgICBjb2FzdGVyQ29tcG9uZW50Lm1lc3NhZ2UgPSBjb25maWcubWVzc2FnZTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmljb24pIHtcbiAgICAgIGNvYXN0ZXJDb21wb25lbnQuaWNvbiA9IGNvbmZpZy5pY29uO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuY29sb3IpIHtcbiAgICAgIGNvYXN0ZXJDb21wb25lbnQuY29sb3IgPSBjb25maWcuY29sb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYWNrQmFyUmVmO1xuICB9XG59O1xuRmRzU25hY2tCYXJTZXJ2aWNlLnBhcmFtZXRlcnMgPSBbTWF0U25hY2tCYXJdOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tXFxuTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXFxuY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXFxudGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxcblRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXFxuKHRoZSBcXFwiTGljZW5zZVxcXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGhcXG50aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxcblxcbmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxcblxcblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcXFwiQVMgSVNcXFwiIEJBU0lTLFxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxcblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cXG4tLT5cXG5cXG48ZGl2PkhlbGxvIERpYWxvZyE8L2Rpdj5cXG5cIjsiLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLyoqXG4gKiBOZlJlZ2lzdHJ5RWRpdEJ1Y2tldFBvbGljeSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0gbmZSZWdpc3RyeUFwaSAgICAgICAgIFRoZSBhcGkgc2VydmljZS5cbiAqIEBwYXJhbSBuZlJlZ2lzdHJ5U2VydmljZSAgICAgVGhlIG5mLXJlZ2lzdHJ5LnNlcnZpY2UgbW9kdWxlLlxuICogQHBhcmFtIGFjdGl2YXRlZFJvdXRlICAgICAgICBUaGUgYW5ndWxhciByb3V0ZSBtb2R1bGUuXG4gKiBAcGFyYW0gbWF0RGlhbG9nUmVmICAgICAgICAgIFRoZSBhbmd1bGFyIG1hdGVyaWFsIGRpYWxvZyByZWYuXG4gKiBAcGFyYW0gZGF0YSAgICAgICAgICAgICAgICAgIFRoZSBkYXRhIHBhc3NlZCBpbnRvIHRoaXMgY29tcG9uZW50LlxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gRmRzRGVtb0RpYWxvZyhtYXREaWFsb2dSZWYsIGRhdGEpIHtcbiAgLy8gU2VydmljZXNcbiAgdGhpcy5kaWFsb2dSZWYgPSBtYXREaWFsb2dSZWY7XG4gIHRoaXMuZGF0YSA9IGRhdGE7XG59XG5cbkZkc0RlbW9EaWFsb2cucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRmRzRGVtb0RpYWxvZyxcblxuICAvKipcbiAgICogQ2FuY2VsIGNyZWF0aW9uIG9mIGEgbmV3IHBvbGljeSBhbmQgY2xvc2UgZGlhbG9nLlxuICAgKi9cbiAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgfVxufTtcbkZkc0RlbW9EaWFsb2cuYW5ub3RhdGlvbnMgPSBbbmV3IENvbXBvbmVudCh7XG4gIHRlbXBsYXRlOiByZXF1aXJlKCcuL2Zkcy1kZW1vLWRpYWxvZy5odG1sJyl9KV07XG5GZHNEZW1vRGlhbG9nLnBhcmFtZXRlcnMgPSBbTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEFdO1xuZXhwb3J0IGRlZmF1bHQgRmRzRGVtb0RpYWxvZzsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLVxcbkxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxcbmNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxcbnRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cXG5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxcbih0aGUgXFxcIkxpY2Vuc2VcXFwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXFxudGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcXG5cXG5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcXG5cXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXFxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXFxcIkFTIElTXFxcIiBCQVNJUyxcXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXFxuLS0+XFxuXFxuPG1hdC1zaWRlbmF2LWNvbnRhaW5lcj5cXG4gICAgPG1hdC1zaWRlbmF2ICNzaWRlbmF2IG1vZGU9XFxcIm92ZXJcXFwiIHBvc2l0aW9uPVxcXCJlbmRcXFwiIG9wZW5lZD1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgPGRpdiBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgPHA+WW91IGNhbiBhbHNvIG9wZW4gYSBkaWFsb2cgZnJvbSBhIHNpZGUgbmF2LjwvcD5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwib3BlbkRpYWxvZygpXFxcIj5TaG93IHNpbXBsZSBkaWFsb2c8L2J1dHRvbj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L21hdC1zaWRlbmF2PlxcbiAgICA8ZGl2IGlkPVxcXCJmZHMtZGVtb1xcXCI+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIj5BcGFjaGUgTmlGaSBGbG93IERlc2lnbiBTeXN0ZW08L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIj5cXG4gICAgICAgICAgICAgICAgPHA+V2l0aCB0aGUgQXBhY2hlIE5pRmkgRmxvdyBEZXNpZ24gU3lzdGVtIG1vZHVsZSwgd2UgZ2V0IGFuIGF0b21pYywgcmV1c2FibGUgY29tcG9uZW50IHBsYXRmb3JtIGZvclxcbiAgICAgICAgICAgICAgICAgICAgQXBhY2hlIE5pRmkgYW5kIGl0cyBzdWItcHJvamVjdHMgdG8gY29uc3VtZSwgd2hpbGUgY29sbGFib3JhdGluZyBpbiBhbiBvcGVuIHNvdXJjZSBtb2RlbC4gVGhpc1xcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlIHBhY2thZ2VzIHRoZSA8YSBjbGFzcz1cXFwibGlua1xcXCIgaHJlZj1cXFwiaHR0cHM6Ly9tYXRlcmlhbC5hbmd1bGFyLmlvL2NvbXBvbmVudHNcXFwiIHRhcmdldD1cXFwiX2JsYW5rXFxcIj5Bbmd1bGFyXFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0ZXJpYWw8L2E+IG1vZHVsZSBhcyB3ZWxsIGFzIHRoZSA8YSBjbGFzcz1cXFwibGlua1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XFxcImh0dHBzOi8vdGVyYWRhdGEuZ2l0aHViLmlvL2NvdmFsZW50LyMvY29tcG9uZW50c1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cXFwiX2JsYW5rXFxcIj5UZXJhZGF0YSBDb3ZhbGVudDwvYT4gbW9kdWxlLiBUaGVzZVxcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlcyBoYXZlIGJlZW4gdGhlbWVkIHRvIG1hdGNoIHRoZSBGRFMgY29sb3IgcGFsZXR0ZS48L3A+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJUeXBvZ3JhcGh5XFxcIj5UeXBvZ3JhcGh5IDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJUeXBvZ3JhcGh5XFxcIj5saW5rPC9tYXQtaWNvbj48L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cXFwibWF0LWJvZHktMVxcXCI+RkRTIHByb3ZpZGVzIHR5cG9ncmFwaHkgQ1NTIGNsYXNzZXMgeW91IGNhbiB1c2UgdG8gY3JlYXRlIHZpc3VhbCBjb25zaXN0ZW5jeSBhY3Jvc3MgeW91ciBhcHBsaWNhdGlvbi4gT3B0aW9uYWxseSBzdHlsZSB0YWdzIHdpdGggdGhlIGNsYXNzZXMgc2hvd24gYmVsb3c6PC9wPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGxheW91dC1hbGlnbj1cXFwiY2VudGVyIGVuZFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGUgZmxleD1cXFwiMTVcXFwiPi5tYXQtZGlzcGxheS00PC9jb2RlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYXQtZGlzcGxheS00XFxcIj5EaXNwbGF5IDQ8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwic3RhcnQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBmbGV4PVxcXCIxNVxcXCI+Lm1hdC1kaXNwbGF5LTM8L2NvZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTNcXFwiPkRpc3BsYXkgMzwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGZsZXg9XFxcIjE1XFxcIj4ubWF0LWRpc3BsYXktMjwvY29kZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWF0LWRpc3BsYXktMlxcXCI+RGlzcGxheSAyPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGUgZmxleD1cXFwiMTVcXFwiPi5tYXQtZGlzcGxheS0xPC9jb2RlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xXFxcIj5EaXNwbGF5IDE8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwic3RhcnQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBmbGV4PVxcXCIxNVxcXCI+Lm1hdC1oZWFkbGluZTwvY29kZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWF0LWhlYWRsaW5lXFxcIj5IZWFkbGluZTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGZsZXg9XFxcIjE1XFxcIj4ubWQtdGl0bGU8L2NvZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5UaXRsZTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGZsZXg9XFxcIjE1XFxcIj4ubWQtc3ViaGVhZDwvY29kZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWQtc3ViaGVhZFxcXCI+U3ViaGVhZDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGZsZXg9XFxcIjE1XFxcIj4ubGluazwvY29kZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibGlua1xcXCI+TGluazwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGZsZXg9XFxcIjE1XFxcIj4ubWF0LWJvZHktMTwvY29kZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWF0LWJvZHktMVxcXCI+Qm9keSAxPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGUgZmxleD1cXFwiMTVcXFwiPi5tYXQtYm9keS0yPC9jb2RlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYXQtYm9keS0yXFxcIj5Cb2R5IDI8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwic3RhcnQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBmbGV4PVxcXCIxNVxcXCI+Lm1hdC1jYXB0aW9uPC9jb2RlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYXQtY2FwdGlvblxcXCI+Q2FwdGlvbjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgPCFbQ0RBVEFbXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWF0LWRpc3BsYXktNFxcXCI+RGlzcGxheSA0PC9zcGFuPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTNcXFwiPkRpc3BsYXkgMzwvc3Bhbj5cXG4gICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYXQtZGlzcGxheS0yXFxcIj5EaXNwbGF5IDI8L3NwYW4+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWF0LWRpc3BsYXktMVxcXCI+RGlzcGxheSAxPC9zcGFuPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hdC1oZWFkbGluZVxcXCI+SGVhZGxpbmU8L3NwYW4+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlRpdGxlPC9zcGFuPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1kLXN1YmhlYWRcXFwiPlN1YmhlYWQ8L3NwYW4+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwibGlua1xcXCI+TGluazwvc3Bhbj5cXG4gICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtYXQtYm9keS0xXFxcIj5Cb2R5IDE8L3NwYW4+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWF0LWJvZHktMlxcXCI+Qm9keSAyPC9zcGFuPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1hdC1jYXB0aW9uXFxcIj5DYXB0aW9uPC9zcGFuPlxcbiAgICBdXT5cXG4gICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJSYWlzZWRCdXR0b25zXFxcIj5SYWlzZWQgQnV0dG9ucyA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiUmFpc2VkQnV0dG9uc1xcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPHA+VGlwOiBVc2UgVVBQRVJDQVNFIHRleHQgZm9yIDEtMiB3b3JkcywgYW5kIFRpdGxlY2FzZSB0ZXh0IGZvciAzKyB3b3Jkcy48L3A+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcInByaW1hcnlcXFwiPlByaW1hcnk8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiYWNjZW50XFxcIj5BY2NlbnQ8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwid2FyblxcXCI+V2FybjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCI+RkRTIFByaW1hcnk8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXNlY29uZGFyeVxcXCI+RkRTIFNlY29uZGFyeTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCI+RkRTIHJlZ3VsYXI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXdhcm5cXFwiPkZEUyB3YXJuPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1jcml0aWNhbFxcXCI+RkRTIGNyaXRpY2FsPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcInByaW1hcnlcXFwiPlByaW1hcnk8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwiYWNjZW50XFxcIj5BY2NlbnQ8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwid2FyblxcXCI+V2FybjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCI+RkRTIHByaW1hcnk8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwiZmRzLXNlY29uZGFyeVxcXCI+RkRTIFNlY29uZGFyeTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCI+RkRTIHJlZ3VsYXI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwiZmRzLXdhcm5cXFwiPkZEUyB3YXJuPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcImZkcy1jcml0aWNhbFxcXCI+RkRTIGNyaXRpY2FsPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPCEtLSBUaGVtZWQgUmFpc2VkIEJ1dHRvbnMgLS0+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj5QcmltYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJhY2NlbnRcXFwiPlNlY29uZGFyeTwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwid2FyblxcXCI+d2FybjwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiPkZEUyBQcmltYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtc2Vjb25kYXJ5XFxcIj5GRFMgU2Vjb25kYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCI+RkRTIHJlZ3VsYXI8L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy13YXJuXFxcIj5GRFMgd2FybjwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLWNyaXRpY2FsXFxcIj5GRFMgY3JpdGljYWw8L2J1dHRvbj5cXG4gICAgICAgIDwhLS0gRGlzYWJsZWQgUmFpc2VkIEJ1dHRvbnMgLS0+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj5QcmltYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJhY2NlbnRcXFwiPlNlY29uZGFyeTwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwid2FyblxcXCI+d2FybjwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiPkZEUyBwcmltYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJmZHMtc2Vjb25kYXJ5XFxcIj5GRFMgU2Vjb25kYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCI+RkRTIHJlZ3VsYXI8L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcImZkcy13YXJuXFxcIj5GRFMgd2FybjwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBkaXNhYmxlZCBjb2xvcj1cXFwiZmRzLWNyaXRpY2FsXFxcIj5GRFMgY3JpdGljYWw8L2J1dHRvbj5cXG4gICAgXV0+XFxuICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiRmxhdEJ1dHRvbnNcXFwiPkZsYXQgQnV0dG9ucyA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiRmxhdEJ1dHRvbnNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1hY3Rpb25zPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uPkRlZmF1bHQ8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cXFwicHJpbWFyeVxcXCI+UHJpbWFyeTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVxcXCJhY2NlbnRcXFwiPlNlY29uZGFyeTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVxcXCJ3YXJuXFxcIj5XYXJuPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gZGlzYWJsZWQ+RGlzYWJsZWQgRGVmYXVsdDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj5EaXNhYmxlZCBQcmltYXJ5PC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcImFjY2VudFxcXCI+RGlzYWJsZWQgU2Vjb25kYXJ5PC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcIndhcm5cXFwiPkRpc2FibGVkIFdhcm48L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICA8IVtDREFUQVtcXG4gICAgICAgIDwhLS0gVGhlbWVkIEZsYXQgQnV0dG9ucyAtLT5cXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbj5EZWZhdWx0PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XFxcInByaW1hcnlcXFwiPlByaW1hcnk8L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cXFwiYWNjZW50XFxcIj5TZWNvbmRhcnk8L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cXFwid2FyblxcXCI+d2FybjwvYnV0dG9uPlxcbiAgICAgICAgPCEtLSBEaXNhYmxlZCBGbGF0IEJ1dHRvbnMgLS0+XFxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gZGlzYWJsZWQ+ZGlzYWJsZWQgRGVmYXVsdDwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGRpc2FibGVkIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj5kaXNhYmxlZCBwcmltYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcImFjY2VudFxcXCI+ZGlzYWJsZWQgU2Vjb25kYXJ5PC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gZGlzYWJsZWQgY29sb3I9XFxcIndhcm5cXFwiPmRpc2FibGVkIHdhcm48L2J1dHRvbj5cXG4gICAgXV0+XFxuICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiRmFiQnV0dG9uc1xcXCI+RmFiIEJ1dHRvbnMgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIkZhYkJ1dHRvbnNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1hY3Rpb25zIGNsYXNzPVxcXCJwYWQtbGVmdC1zbVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBjb2xvcj1cXFwicHJpbWFyeVxcXCI+UDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgY29sb3I9XFxcImFjY2VudFxcXCI+QTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgY29sb3I9XFxcIndhcm5cXFwiPlc8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1pbmktZmFiIGRpc2FibGVkIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj5QPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBkaXNhYmxlZCBjb2xvcj1cXFwiYWNjZW50XFxcIj5BPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBkaXNhYmxlZCBjb2xvcj1cXFwid2FyblxcXCI+VzwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWFjdGlvbnM+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPCEtLSBUaGVtZWQgRmFiIEJ1dHRvbnMgLS0+XFxuICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBjb2xvcj1cXFwicHJpbWFyeVxcXCI+UDwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgY29sb3I9XFxcImFjY2VudFxcXCI+QTwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgY29sb3I9XFxcIndhcm5cXFwiPlc8L2J1dHRvbj5cXG4gICAgICAgIDwhLS0gRGlzYWJsZWQgRmFiIEJ1dHRvbnMgLS0+XFxuICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBkaXNhYmxlZCBjb2xvcj1cXFwicHJpbWFyeVxcXCI+UDwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgZGlzYWJsZWQgY29sb3I9XFxcImFjY2VudFxcXCI+QTwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgZGlzYWJsZWQgY29sb3I9XFxcIndhcm5cXFwiPlc8L2J1dHRvbj5cXG4gICAgXV0+XFxuICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiQnV0dG9uVG9nZ2xlc1xcXCI+QnV0dG9uIFRvZ2dsZXMgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIkJ1dHRvblRvZ2dsZXNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBuYW1lPVxcXCJhbGlnbm1lbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJsZWZ0XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2xlZnQ8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cXFwiY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2NlbnRlcjwvbWF0LWljb24+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJyaWdodFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9hbGlnbl9yaWdodDwvbWF0LWljb24+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJqdXN0aWZ5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2p1c3RpZnk8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cXG4gICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwicGFkLXRvcC1tZCBwYWQtYm90LW1kXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIG5hbWU9XFxcIm9uT2ZmVG9nZ2xlXFxcIiBjbGFzcz1cXFwib24tb2ZmLXRvZ2dsZS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XFxcIm9uXFxcIiBbY2hlY2tlZF09XFxcInRydWVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIE9OXFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJvZmZcXFwiIGNsYXNzPVxcXCJvZmYtdG9nZ2xlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBPRkZcXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XFxuICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgY2xhc3M9XFxcInBhZC10b3AtbWQgcGFkLWJvdC1tZFxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIGNlbnRlclxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJleHBhbnNpb24tcGFuZWwtZmlsdGVyLXRvZ2dsZS1ncm91cFxcXCIgbXVsdGlwbGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYXJvdW5kIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPjM0PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkFzc2V0czwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI1NVxcXCI+MzAwPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkV4dGVuc2lvbnM8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYXJvdW5kIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPjUwMDA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI0NVxcXCI+Rmxvd3M8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYXJvdW5kIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPjA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI0NVxcXCI+Q2VydGlmaWNhdGlvbnM8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XFxuICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgY2xhc3M9XFxcInBhZC10b3AtbWQgcGFkLWJvdC1tZFxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBuYW1lPVxcXCJmZHMtYWRtaW5pc3RyYXRpb24tcGVyc3BlY3RpdmVcXFwiIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJ0YWItdG9nZ2xlLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cXFwiZ2VuZXJhbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhbFxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgY2xhc3M9XFxcInBhZC1sZWZ0LW1kXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cXFwidXNlcnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJzXFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwicGFkLWxlZnQtbWRcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJ3b3JrZmxvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2Zsb3dcXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIG5hbWU9XFxcImFsaWdubWVudFxcXCI+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJsZWZ0XFxcIj5cXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9hbGlnbl9sZWZ0PC9tYXQtaWNvbj5cXG4gICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cXFwiY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9hbGlnbl9jZW50ZXI8L21hdC1pY29uPlxcbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJyaWdodFxcXCI+XFxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfYWxpZ25fcmlnaHQ8L21hdC1pY29uPlxcbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJqdXN0aWZ5XFxcIj5cXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9hbGlnbl9qdXN0aWZ5PC9tYXQtaWNvbj5cXG4gICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cXG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgY2xhc3M9XFxcInBhZC10b3AtbWQgcGFkLWJvdC1tZFxcXCI+PC9kaXY+XFxuICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgbmFtZT1cXFwib25PZmZUb2dnbGVcXFwiIGNsYXNzPVxcXCJvbi1vZmYtdG9nZ2xlLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XFxcIm9uXFxcIiBbY2hlY2tlZF09XFxcInRydWVcXFwiPlxcbiAgICAgICAgICAgICAgICBPTlxcbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJvZmZcXFwiIGNsYXNzPVxcXCJvZmYtdG9nZ2xlXFxcIj5cXG4gICAgICAgICAgICAgICAgT0ZGXFxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XFxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJwYWQtdG9wLW1kIHBhZC1ib3QtbWRcXFwiPjwvZGl2PlxcbiAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJleHBhbnNpb24tcGFuZWwtZmlsdGVyLXRvZ2dsZS1ncm91cFxcXCIgbXVsdGlwbGU+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPjM0PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5Bc3NldHM8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI1NVxcXCI+MzAwPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5FeHRlbnNpb25zPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPjUwMDA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkZsb3dzPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPjA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkNlcnRpZmljYXRpb25zPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxcbiAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwicGFkLXRvcC1tZCBwYWQtYm90LW1kXFxcIj48L2Rpdj5cXG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBuYW1lPVxcXCJmZHMtYWRtaW5pc3RyYXRpb24tcGVyc3BlY3RpdmVcXFwiIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJ0YWItdG9nZ2xlLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XFxcImdlbmVyYWxcXFwiPlxcbiAgICAgICAgICAgICAgICBnZW5lcmFsXFxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJwYWQtbGVmdC1tZFxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJ1c2Vyc1xcXCI+XFxuICAgICAgICAgICAgICAgIFVzZXJzXFxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJwYWQtbGVmdC1tZFxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVxcXCJ3b3JrZmxvd1xcXCI+XFxuICAgICAgICAgICAgICAgIFdvcmtmbG93XFxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XFxuICAgICAgICBdXT5cXG4gICAgICA8L3ByZT5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIklucHV0XFxcIj5JbnB1dCA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiSW5wdXRcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxmb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQ29tcGFueSAoZGlzYWJsZWQpXFxcIiBkaXNhYmxlZCB2YWx1ZT1cXFwiR29vZ2xlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtbWFyZ2luPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGRpc2FibGVkIHBsYWNlaG9sZGVyPVxcXCJGaXJzdCBuYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiTG9uZyBMYXN0IE5hbWUgVGhhdCBXaWxsIEJlIFRydW5jYXRlZFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZsZXggZnhMYXlvdXRBbGlnbj1cXFwic3RhcnQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQnV0dG9uIEFkZG9uIHdpdGggZHJvcGRvd25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJpbnB1dC1idXR0b25cXFwiIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCIgbWF0LXJhaXNlZC1idXR0b25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJpbnB1dEJ1dHRvbkRyb3Bkb3duQWRkb25NZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdDxpIGNsYXNzPVxcXCJmYSBmYS1jYXJldC1kb3duXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51IHhQb3NpdGlvbj1cXFwiYmVmb3JlXFxcIiAjaW5wdXRCdXR0b25Ecm9wZG93bkFkZG9uTWVudT1cXFwibWF0TWVudVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gUmVmcmVzaDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBTZXR0aW5nczwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBIZWxwPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gZGlzYWJsZWQ+IFNpZ24gT3V0PC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmbGV4IGZ4TGF5b3V0QWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQnV0dG9uIEFkZG9uXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwiaW5wdXQtYnV0dG9uXFxcIiBjb2xvcj1cXFwiZmRzLXJlZ3VsYXJcXFwiIG1hdC1yYWlzZWQtYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtbWFyZ2luPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZmxleCBmeExheW91dEFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGlzYWJsZWQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIkJ1dHRvbiBBZGRvbiB3aXRoIGRyb3Bkb3duXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkaXNhYmxlZCBjbGFzcz1cXFwiaW5wdXQtYnV0dG9uXFxcIiBjb2xvcj1cXFwiZmRzLXJlZ3VsYXJcXFwiIG1hdC1yYWlzZWQtYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0PGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZmxleCBmeExheW91dEFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGlzYWJsZWQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIkJ1dHRvbiBBZGRvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGlzYWJsZWQgY2xhc3M9XFxcImlucHV0LWJ1dHRvblxcXCIgY29sb3I9XFxcImZkcy1yZWd1bGFyXFxcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbGV4PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIkFkZHJlc3NcXFwiIHZhbHVlPVxcXCIxNjAwIEFtcGhpdGhlYXRyZSBQa3dheVxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtbWFyZ2luPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGRpc2FibGVkIHZhbHVlPVxcXCJBZGRyZXNzIDIgVmFsdWVcXFwiIG1hdElucHV0IHBsYWNlaG9sZGVyPVxcXCJBZGRyZXNzIDJcXFwiPjwvdGV4dGFyZWE+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQ2l0eVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiU3RhdGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxvYXRQbGFjZWhvbGRlcj1cXFwiYWx3YXlzXFxcIiBmbGV4PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgI3Bvc3RhbENvZGUgbWF4bGVuZ3RoPVxcXCI1XFxcIiBwbGFjZWhvbGRlcj1cXFwiUG9zdGFsIENvZGVcXFwiIHZhbHVlPVxcXCI5NDA0M1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludCBhbGlnbj1cXFwiZW5kXFxcIj57e3Bvc3RhbENvZGUudmFsdWUubGVuZ3RofX0gLyA1PC9tYXQtaGludD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZm9ybT5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgPCFbQ0RBVEFbXFxuICAgICAgICA8IS0tIElucHV0cyAtLT5cXG4gICAgICAgIDxmb3JtPlxcbiAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4+XFxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQ29tcGFueSAoZGlzYWJsZWQpXFxcIiBkaXNhYmxlZCB2YWx1ZT1cXFwiR29vZ2xlXFxcIj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtbWFyZ2luPlxcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZGlzYWJsZWQgcGxhY2Vob2xkZXI9XFxcIkZpcnN0IG5hbWVcXFwiPlxcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbGV4PlxcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVxcXCJMb25nIExhc3QgTmFtZSBUaGF0IFdpbGwgQmUgVHJ1bmNhdGVkXFxcIj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtbWFyZ2luPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZsZXggZnhMYXlvdXRBbGlnbj1cXFwic3RhcnQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVxcXCJCdXR0b24gQWRkb24gd2l0aCBkcm9wZG93blxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwiaW5wdXQtYnV0dG9uXFxcIiBjb2xvcj1cXFwiZmRzLXJlZ3VsYXJcXFwiIG1hdC1yYWlzZWQtYnV0dG9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XFxcImlucHV0QnV0dG9uRHJvcGRvd25BZGRvbk1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdDxpIGNsYXNzPVxcXCJmYSBmYS1jYXJldC1kb3duXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgeFBvc2l0aW9uPVxcXCJiZWZvcmVcXFwiICNpbnB1dEJ1dHRvbkRyb3Bkb3duQWRkb25NZW51PVxcXCJtYXRNZW51XFxcIiBbb3ZlcmxhcFRyaWdnZXJdPVxcXCJmYWxzZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBSZWZyZXNoIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gU2V0dGluZ3MgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBIZWxwIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBkaXNhYmxlZD4gU2lnbiBPdXQgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBmbGV4IGZ4TGF5b3V0QWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVxcXCJCdXR0b24gQWRkb25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcImlucHV0LWJ1dHRvblxcXCIgY29sb3I9XFxcImZkcy1yZWd1bGFyXFxcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hcXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtbWFyZ2luPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZsZXggZnhMYXlvdXRBbGlnbj1cXFwic3RhcnQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGlzYWJsZWQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIkJ1dHRvbiBBZGRvbiB3aXRoIGRyb3Bkb3duXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRpc2FibGVkIGNsYXNzPVxcXCJpbnB1dC1idXR0b25cXFwiIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCIgbWF0LXJhaXNlZC1idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0PGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgZmxleCBmeExheW91dEFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxvYXRQbGFjZWhvbGRlcj1cXFwiYWx3YXlzXFxcIiBmbGV4PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBkaXNhYmxlZCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQnV0dG9uIEFkZG9uXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRpc2FibGVkIGNsYXNzPVxcXCJpbnB1dC1idXR0b25cXFwiIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCIgbWF0LXJhaXNlZC1idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoXFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbj5cXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQWRkcmVzc1xcXCIgdmFsdWU9XFxcIjE2MDAgQW1waGl0aGVhdHJlIFBrd2F5XFxcIj48L3RleHRhcmVhPlxcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4+XFxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBkaXNhYmxlZCB2YWx1ZT1cXFwiQWRkcmVzcyAyIFZhbHVlXFxcIiBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQWRkcmVzcyAyXFxcIj48L3RleHRhcmVhPlxcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4+XFxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiQ2l0eVxcXCI+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cXFwiU3RhdGVcXFwiPlxcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbG9hdFBsYWNlaG9sZGVyPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgI3Bvc3RhbENvZGUgbWF4bGVuZ3RoPVxcXCI1XFxcIiBwbGFjZWhvbGRlcj1cXFwiUG9zdGFsIENvZGVcXFwiIHZhbHVlPVxcXCI5NDA0M1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWhpbnQgYWxpZ249XFxcImVuZFxcXCI+e3twb3N0YWxDb2RlLnZhbHVlLmxlbmd0aH19IC8gNTwvbWF0LWhpbnQ+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Zvcm0+XFxuICAgIF1dPlxcbiAgICA8L3ByZT5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIlRhYnNcXFwiPlRhYnMgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIlRhYnNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIGR5bmFtaWNIZWlnaHQgY29sb3I9XFxcImFjY2VudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5PbmU8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkZpcnN0IHRhYiBjb250ZW50PC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5QbGFpZCBlY2hvIHBhcmsga25hdXNnYWFyZCBub3JtY29yZSBmcmFuemVuIGNyb251dC4gUGlja2xlZCBodW1ibGVicmFnIHRvZnUgaG9vZGllLCB1bWFtaVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWx2aWEgZmFybS10by10YWJsZSBzY2hsaXR6IHRyeS1oYXJkIGZvb2QgdHJ1Y2sga25hdXNnYWFyZCBwYWJzdC4gWXVjY2llIHBvcnRsYW5kIGplYW5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRzLCBhdXRoZW50aWMgbWl4dGFwZSB3YWlzdGNvYXQgZ2VudHJpZnkgYmx1ZSBib3R0bGUuIEZpeGllIGtpY2tzdGFydGVyIGNodXJjaC1rZXkgc21hbGxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggc2VpdGFuLCBzaGFiYnkgY2hpYyB2ZWdhbiBsaXN0aWNsZSBiZWZvcmUgdGhleSBzb2xkIG91dC4gSGFtbW9jayByYXcgZGVuaW0gZmxhbm5lbFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VzbGVkIHNlaXRhbiB5b3UgcHJvYmFibHkgaGF2ZW4ndCBoZWFyZCBvZiB0aGVtLiBUcnVzdCBmdW5kIG1hbiBidW4gcHVnLCBraWNrc3RhcnRlclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpc2FuIHNlbHZhZ2UgbGV0dGVycHJlc3MgY29ybmhvbGUgdG90ZSBiYWcgYnV0Y2hlciBsb2Nhdm9yZS4gQWZmb2dhdG8gdHJ5LWhhcmRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2lja3N0YXJ0ZXIgc2VpdGFuLCBESVkgcGlja2xlZCBoZWxsYSBnb2RhcmQgcG9yayBiZWxseSBmb3VyIGxva28gdWdoLjwvcD5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlR3bzwvbmctdGVtcGxhdGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+U2Vjb25kIHRhYiBjb250ZW50PC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5IYXNodGFnIGRpc3RpbGxlcnkgc2thdGVib2FyZCBtYW4gYnVuIGdvY2h1amFuZywgc2FsdmlhIG1hbiBicmFpZCBhcnQgcGFydHkgbWVnZ2luZ3MgaGVpcmxvb21cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2l0c2NoIGZhcm0tdG8tdGFibGUuIEZyYW56ZW4gYmVhcmQgZmluZ2Vyc3RhY2hlIGdlbnRyaWZ5LCBoZWlybG9vbSBwb3J0bGFuZCBlbm51aSBYT1hPXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvZG9zaW5nIGtpdHNjaCBwbGFpZC4gQ2hpY2hhcnJvbmVzIGJ1c2h3aWNrIGNoaWEsIGJhbmggbWkgaXJvbnkgdGF0dG9vZWQgaGFtbW9jayBidXRjaGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWJieSBjaGljIHRheGlkZXJteSBzZW1pb3RpY3MgbWFyZmEgcG9zdC1pcm9uaWMuIEJsdWUgYm90dGxlIGtlZmZpeWVoIGZhcm0tdG8tdGFibGUgZW5udWksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW1icmF5IHBpdGNoZm9yayBhcnQgcGFydHkgcGludGVyZXN0IGFydGlzYW4gcG9wLXVwLiBFdHN5IGJhbmpvIG1hcmZhLCBibHVlIGJvdHRsZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrb21idWNoYSBjcnVjaWZpeCBYT1hPIHRvdXNsZWQgYmVhcmQuIFRpbGRlIGRpc3J1cHQga2FsZSBjaGlwcyBiaWN5Y2xlIHJpZ2h0cyBza2F0ZWJvYXJkXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlciBjbGVhbnNlIGhlbGxhIHNob3JlZGl0Y2gsIG1lZGl0YXRpb24gcmV0cm8gc2hhYmJ5IGNoaWMgdmljZSBoZWlybG9vbS4gRXRzeSBsaXN0aWNsZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWNlIGFjdHVhbGx5LCBpUGhvbmUgY2hpYSBob29kaWUgZm91ciBsb2tvLjwvcD5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPG1hdC10YWItZ3JvdXAgZHluYW1pY0hlaWdodCBjb2xvcj1cXFwiYWNjZW50XFxcIj5cXG4gICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+Rmlyc3QgdGFiIGNvbnRlbnQ8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgIDxoMT5GaXJzdCBjb250ZW50PC9oMT5cXG4gICAgICAgICAgICA8cD4uLi48L3A+XFxuICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+U2Vjb25kIHRhYiBjb250ZW50PC9uZy10ZW1wbGF0ZT5cXG4gICAgICAgICAgICA8aDE+U2Vjb25kIHRhYiBjb250ZW50PC9oMT5cXG4gICAgICAgICAgICA8cD4uLi48L3A+XFxuICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgIDwvbWF0LXRhYi1ncm91cD5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiU3RlcHBlclxcXCI+U3RlcHBlciA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiU3RlcHBlclxcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPHRkLXN0ZXBzIG1vZGU9XFxcInZlcnRpY2FsXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDx0ZC1zdGVwIGxhYmVsPVxcXCJWZXJzaW9uIDFcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJsYWJlbD1cXFwiYnkgQWRtaW5cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cXFwidHJ1ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJtZC1ib2R5LTJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudHMgZ28gaGVyZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwibWF0LWNhcHRpb25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW4gaG91ciBhZ29cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8L3RkLXN0ZXA+XFxuICAgICAgICAgICAgICAgICAgICA8dGQtc3RlcCBsYWJlbD1cXFwiVmVyc2lvbiAyXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibGFiZWw9XFxcImJ5IEFkbWluXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgY2xhc3M9XFxcIm1kLWJvZHktMlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50cyBnbyBoZXJlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGNsYXNzPVxcXCJtYXQtY2FwdGlvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIGRheSBhZ29cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8L3RkLXN0ZXA+XFxuICAgICAgICAgICAgICAgIDwvdGQtc3RlcHM+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8dGQtc3RlcHMgbW9kZT1cXFwidmVydGljYWxcXFwiPlxcbiAgICAgICAgICAgIDx0ZC1zdGVwIGxhYmVsPVxcXCJWZXJzaW9uIDFcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgc3VibGFiZWw9XFxcImJ5IEFkbWluXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVxcXCJ0cnVlXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwibWQtYm9keS0yXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBnb2VzIGhlcmVcXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwibWF0LWNhcHRpb25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFuIGhvdXIgYWdvXFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC90ZC1zdGVwPlxcbiAgICAgICAgICAgIDx0ZC1zdGVwIGxhYmVsPVxcXCJWZXJzaW9uIDJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgc3VibGFiZWw9XFxcImJ5IEFkbWluXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwibWQtYm9keS0yXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBnb2VzIGhlcmVcXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBjbGFzcz1cXFwibWF0LWNhcHRpb25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIEEgZGF5IGFnb1xcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvdGQtc3RlcD5cXG4gICAgICAgIDwvdGQtc3RlcHM+XFxuICAgICAgICBdXT5cXG4gICAgICA8L3ByZT5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIkF1dG9jb21wbGV0ZVxcXCI+QXV0b2NvbXBsZXRlIDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJBdXRvY29tcGxldGVcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGxheW91dD1cXFwicm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsZXg9XFxcIjUwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIlN0YXRlXFxcIiBbbWF0QXV0b2NvbXBsZXRlXT1cXFwidGRBdXRvXFxcIiBbKG5nTW9kZWwpXT1cXFwiY3VycmVudFN0YXRlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbW9kZWxEaXI9XFxcIm5nTW9kZWxcXFwiIChuZ01vZGVsQ2hhbmdlKT1cXFwidGhpcy50ZFN0YXRlcyA9IGZpbHRlclN0YXRlcyhjdXJyZW50U3RhdGUpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVxcXCJ0ZERpc2FibGVkXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwdXNoLXRvcFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cXFwibW9kZWxEaXIucmVzZXQoKVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlJlc2V0PC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cXFwiY3VycmVudFN0YXRlPSdDYWxpZm9ybmlhJ1xcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlNldCB2YWx1ZTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XFxcInRkRGlzYWJsZWQ9IXRkRGlzYWJsZWRcXFwiIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5Ub2dnbGUgZGlzYWJsZWQ8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICN0ZEF1dG89XFxcIm1hdEF1dG9jb21wbGV0ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XFxcImxldCBzdGF0ZSBvZiB0ZFN0YXRlc1xcXCIgW3ZhbHVlXT1cXFwic3RhdGUubmFtZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc3RhdGUubmFtZSB9fTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZGVtby1zZWNvbmRhcnktdGV4dFxcXCI+ICh7e3N0YXRlLmNvZGV9fSkgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxcbiAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBsYXlvdXQ9XFxcInJvd1xcXCI+XFxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxleD1cXFwiNTBcXFwiPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIlN0YXRlXFxcIiBbbWF0QXV0b2NvbXBsZXRlXT1cXFwidGRBdXRvXFxcIiBbKG5nTW9kZWwpXT1cXFwiY3VycmVudFN0YXRlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgI21vZGVsRGlyPVxcXCJuZ01vZGVsXFxcIiAobmdNb2RlbENoYW5nZSk9XFxcInRoaXMudGRTdGF0ZXMgPSBmaWx0ZXJTdGF0ZXMoY3VycmVudFN0YXRlKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XFxcInRkRGlzYWJsZWRcXFwiPlxcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInB1c2gtdG9wXFxcIj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cXFwibW9kZWxEaXIucmVzZXQoKVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlJlc2V0PC9idXR0b24+XFxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XFxcImN1cnJlbnRTdGF0ZT0nQ2FsaWZvcm5pYSdcXFwiIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5TZXQgdmFsdWU8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cXFwidGREaXNhYmxlZD0hdGREaXNhYmxlZFxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlRvZ2dsZSBkaXNhYmxlZDwvYnV0dG9uPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjdGRBdXRvPVxcXCJtYXRBdXRvY29tcGxldGVcXFwiPlxcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cXFwibGV0IHN0YXRlIG9mIHRkU3RhdGVzXFxcIiBbdmFsdWVdPVxcXCJzdGF0ZS5uYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgPHNwYW4+eyB7IHN0YXRlLm5hbWUgfSB9PC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZGVtby1zZWNvbmRhcnktdGV4dFxcXCI+ICh7IHtzdGF0ZS5jb2RlfSB9KSA8L3NwYW4+XFxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxcbiAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxcbiAgICAgICAgXV0+XFxuICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgIDxwPkphdmFzY3JpcHQ6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImphdmFzY3JpcHRcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSAnJztcXG4gICAgICAgIHRoaXMucmVhY3RpdmVTdGF0ZXMgPSAnJztcXG4gICAgICAgIHRoaXMudGRTdGF0ZXMgPSBbXTtcXG4gICAgICAgIHRoaXMudGREaXNhYmxlZCA9IGZhbHNlO1xcbiAgICAgICAgdGhpcy5zdGF0ZXMgPSBbXFxuICAgICAgICAgICAgeyBjb2RlOiAnQUwnLCBuYW1lOiAnQWxhYmFtYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdBSycsIG5hbWU6ICdBbGFza2EnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnQVonLCBuYW1lOiAnQXJpem9uYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdBUicsIG5hbWU6ICdBcmthbnNhcycgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdDQScsIG5hbWU6ICdDYWxpZm9ybmlhJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ0NPJywgbmFtZTogJ0NvbG9yYWRvJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ0NUJywgbmFtZTogJ0Nvbm5lY3RpY3V0JyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ0RFJywgbmFtZTogJ0RlbGF3YXJlJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ0ZMJywgbmFtZTogJ0Zsb3JpZGEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnR0EnLCBuYW1lOiAnR2VvcmdpYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdISScsIG5hbWU6ICdIYXdhaWknIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnSUQnLCBuYW1lOiAnSWRhaG8nIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnSUwnLCBuYW1lOiAnSWxsaW5vaXMnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnSU4nLCBuYW1lOiAnSW5kaWFuYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdJQScsIG5hbWU6ICdJb3dhJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ0tTJywgbmFtZTogJ0thbnNhcycgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdLWScsIG5hbWU6ICdLZW50dWNreScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdMQScsIG5hbWU6ICdMb3Vpc2lhbmEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTUUnLCBuYW1lOiAnTWFpbmUnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTUQnLCBuYW1lOiAnTWFyeWxhbmQnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTUEnLCBuYW1lOiAnTWFzc2FjaHVzZXR0cycgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdNSScsIG5hbWU6ICdNaWNoaWdhbicgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdNTicsIG5hbWU6ICdNaW5uZXNvdGEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTVMnLCBuYW1lOiAnTWlzc2lzc2lwcGknIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTU8nLCBuYW1lOiAnTWlzc291cmknIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTVQnLCBuYW1lOiAnTW9udGFuYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdORScsIG5hbWU6ICdOZWJyYXNrYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdOVicsIG5hbWU6ICdOZXZhZGEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTkgnLCBuYW1lOiAnTmV3IEhhbXBzaGlyZScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdOSicsIG5hbWU6ICdOZXcgSmVyc2V5JyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ05NJywgbmFtZTogJ05ldyBNZXhpY28nIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTlknLCBuYW1lOiAnTmV3IFlvcmsnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTkMnLCBuYW1lOiAnTm9ydGggQ2Fyb2xpbmEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnTkQnLCBuYW1lOiAnTm9ydGggRGFrb3RhJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ09IJywgbmFtZTogJ09oaW8nIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnT0snLCBuYW1lOiAnT2tsYWhvbWEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnT1InLCBuYW1lOiAnT3JlZ29uJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ1BBJywgbmFtZTogJ1Blbm5zeWx2YW5pYScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdSSScsIG5hbWU6ICdSaG9kZSBJc2xhbmQnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnU0MnLCBuYW1lOiAnU291dGggQ2Fyb2xpbmEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnU0QnLCBuYW1lOiAnU291dGggRGFrb3RhJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ1ROJywgbmFtZTogJ1Rlbm5lc3NlZScgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdUWCcsIG5hbWU6ICdUZXhhcycgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdVVCcsIG5hbWU6ICdVdGFoJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ1ZUJywgbmFtZTogJ1Zlcm1vbnQnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnVkEnLCBuYW1lOiAnVmlyZ2luaWEnIH0sXFxuICAgICAgICAgICAgeyBjb2RlOiAnV0EnLCBuYW1lOiAnV2FzaGluZ3RvbicgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdXVicsIG5hbWU6ICdXZXN0IFZpcmdpbmlhJyB9LFxcbiAgICAgICAgICAgIHsgY29kZTogJ1dJJywgbmFtZTogJ1dpc2NvbnNpbicgfSxcXG4gICAgICAgICAgICB7IGNvZGU6ICdXWScsIG5hbWU6ICdXeW9taW5nJyB9LFxcbiAgICAgICAgXTtcXG5cXG4gICAgICAgIC4uLlxcblxcbiAgICAgICAgZGlzcGxheUZuOiBmdW5jdGlvbih2YWx1ZSkge1xcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdmFsdWUubmFtZSA6IHZhbHVlO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIGZpbHRlclN0YXRlczogZnVuY3Rpb24odmFsKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHZhbCA/IHRoaXMuc3RhdGVzLmZpbHRlcigocykgPT4gcy5uYW1lLm1hdGNoKG5ldyBSZWdFeHAodmFsLCAnZ2knKSkpIDogdGhpcy5zdGF0ZXM7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgLi4uXFxuICAgICAgICBdXT5cXG4gICAgICA8L3ByZT5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIkZpbHRlclxcXCI+RmlsdGVyIDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJGaWx0ZXJcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkF1dG9jb21wbGV0ZSB3aXRoIGNoaXBzIGFuZCBubyBjdXN0b20gaW5wdXRzPC9oMz5cXG4gICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIG1hdC1zdHJldGNoLXRhYnMgZHluYW1pY0hlaWdodCBjb2xvcj1cXFwiYWNjZW50XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPkRlbW88L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInB1c2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtYm9keS0xXFxcIj5UeXBlIGFuZCBzZWxlY3QgYSBwcmVzZXQgb3B0aW9uOjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQtY2hpcHMgW2l0ZW1zXT1cXFwiaXRlbXNcXFwiIFsobmdNb2RlbCldPVxcXCJpdGVtc1JlcXVpcmVNYXRjaFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVxcXCJFbnRlciBhdXRvY29tcGxldGUgc3RyaW5nc1xcXCIgW2Rpc2FibGVkXT1cXFwicmVhZE9ubHlcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTWF0Y2g+PC90ZC1jaGlwcz5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPkNvZGU8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8dGQtY2hpcHMgW2l0ZW1zXT1cXFwiaXRlbXNcXFwiIFsobmdNb2RlbCldPVxcXCJpdGVtc1JlcXVpcmVNYXRjaFxcXCIgcGxhY2Vob2xkZXI9XFxcIkVudGVyIGF1dG9jb21wbGV0ZSBzdHJpbmdzXFxcIlxcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XFxcInJlYWRPbmx5XFxcIiByZXF1aXJlTWF0Y2g+PC90ZC1jaGlwcz5cXG4gICAgICAgICAgXV0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkphdmFzY3JpcHQ6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImphdmFzY3JpcHRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IVtDREFUQVtcXG4gICAgICAgIHRoaXMucmVhZE9ubHkgPSBmYWxzZTtcXG5cXG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXFxuICAgICAgICAgICAgJ3N0ZXBwZXInLFxcbiAgICAgICAgICAgICdleHBhbnNpb24tcGFuZWwnLFxcbiAgICAgICAgICAgICdtYXJrZG93bicsXFxuICAgICAgICAgICAgJ2hpZ2hsaWdodCcsXFxuICAgICAgICAgICAgJ2xvYWRpbmcnLFxcbiAgICAgICAgICAgICdtZWRpYScsXFxuICAgICAgICAgICAgJ2NoaXBzJyxcXG4gICAgICAgICAgICAnaHR0cCcsXFxuICAgICAgICAgICAgJ2pzb24tZm9ybWF0dGVyJyxcXG4gICAgICAgICAgICAncGlwZXMnLFxcbiAgICAgICAgICAgICduZWVkIG1vcmU/JyxcXG4gICAgICAgIF07XFxuXFxuICAgICAgICB0aGlzLml0ZW1zUmVxdWlyZU1hdGNoID0gdGhpcy5pdGVtcy5zbGljZSgwLCA2KTtcXG5cXG4gICAgICAgIC4uLlxcblxcbiAgICAgICAgdG9nZ2xlUmVhZE9ubHk6IGZ1bmN0aW9uKCkge1xcbiAgICAgICAgICAgIHRoaXMucmVhZE9ubHkgPSAhdGhpcy5yZWFkT25seTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAuLi5cXG4gICAgICAgICAgXV0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxcbiAgICAgICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XFxuICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgICAgICA8bWF0LWNhcmQtYWN0aW9ucz5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cXFwicHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwidG9nZ2xlUmVhZE9ubHkoKVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlRvZ2dsZSBSZWFkT25seVxcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtYWN0aW9ucz5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkF1dG9jb21wbGV0ZSB3aXRoIGN1c3RvbSBpbnB1dHM8L2gzPlxcbiAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICAgICAgPG1hdC10YWItZ3JvdXAgbWF0LXN0cmV0Y2gtdGFicyBkeW5hbWljSGVpZ2h0IGNvbG9yPVxcXCJhY2NlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+RGVtbzwvbmctdGVtcGxhdGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicHVzaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1ib2R5LTFcXFwiPlR5cGUgYW5kIHNlbGVjdCBvcHRpb24gb3IgZW50ZXIgY3VzdG9tIHRleHQgYW5kIHByZXNzIGVudGVyOjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQtY2hpcHMgW2l0ZW1zXT1cXFwiaXRlbXNcXFwiIHBsYWNlaG9sZGVyPVxcXCJFbnRlciBhbnkgc3RyaW5nXFxcIj48L3RkLWNoaXBzPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+Q29kZTwvbmctdGVtcGxhdGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IVtDREFUQVtcXG4gICAgICAgIDx0ZC1jaGlwcyBbaXRlbXNdPVxcXCJpdGVtc1xcXCIgcGxhY2Vob2xkZXI9XFxcIkVudGVyIGFueSBzdHJpbmdcXFwiPjwvdGQtY2hpcHM+XFxuICAgICAgICAgIF1dPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJqYXZhc2NyaXB0XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICB0aGlzLml0ZW1zID0gW1xcbiAgICAgICAgICAgICdzdGVwcGVyJyxcXG4gICAgICAgICAgICAnZXhwYW5zaW9uLXBhbmVsJyxcXG4gICAgICAgICAgICAnbWFya2Rvd24nLFxcbiAgICAgICAgICAgICdoaWdobGlnaHQnLFxcbiAgICAgICAgICAgICdsb2FkaW5nJyxcXG4gICAgICAgICAgICAnbWVkaWEnLFxcbiAgICAgICAgICAgICdjaGlwcycsXFxuICAgICAgICAgICAgJ2h0dHAnLFxcbiAgICAgICAgICAgICdqc29uLWZvcm1hdHRlcicsXFxuICAgICAgICAgICAgJ3BpcGVzJyxcXG4gICAgICAgICAgICAnbmVlZCBtb3JlPycsXFxuICAgICAgICBdO1xcbiAgICAgICAgICBdXT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XFxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkRlbW8gYWxsb3dpbmcgY3VzdG9tIGlucHV0cyBmb3IgdGFnczwvaDM+XFxuICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgICAgICA8bWF0LXRhYi1ncm91cCBtYXQtc3RyZXRjaC10YWJzIGR5bmFtaWNIZWlnaHQgY29sb3I9XFxcImFjY2VudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5EZW1vPC9uZy10ZW1wbGF0ZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwdXNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibWF0LWJvZHktMVxcXCI+VHlwZSBhbnkgdGVzdCBhbmQgcHJlc3MgZW50ZXI6PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZC1jaGlwcyBwbGFjZWhvbGRlcj1cXFwiRW50ZXIgYW55IHN0cmluZ1xcXCI+PC90ZC1jaGlwcz5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPkNvZGU8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8dGQtY2hpcHMgcGxhY2Vob2xkZXI9XFxcIkVudGVyIGFueSBzdHJpbmdcXFwiPjwvdGQtY2hpcHM+XFxuICAgICAgICAgIF1dPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiU2VhcmNoYWJsZUV4cGFuc2lvblBhbmVsc1xcXCI+U2VhcmNoYWJsZS9GaWx0ZXJhYmxlIEV4cGFuc2lvbiBQYW5lbHMgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIlNlYXJjaGFibGVFeHBhbnNpb25QYW5lbHNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIG1hdC1zdHJldGNoLXRhYnMgY29sb3I9XFxcImFjY2VudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5EZW1vPC9uZy10ZW1wbGF0ZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLW1kIHBhZC1ib3R0b20tbWQgcGFkLXJpZ2h0LXh4bCBwYWQtbGVmdC14eGxcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLW1kIHBhZC1ib3R0b20tc21cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJleHBhbnNpb24tcGFuZWwtZmlsdGVyLXRvZ2dsZS1ncm91cFxcXCIgbXVsdGlwbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcigndHlwZTphc3NldCcpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ3R5cGU6YXNzZXQnKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhGbGV4PVxcXCI1NVxcXCI+e3tnZXREcm9wbGV0VHlwZUNvdW50KCdhc3NldCcpfX08L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkFzc2V0czwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSAoY2hhbmdlKT1cXFwidG9nZ2xlRHJvcGxldHNGaWx0ZXIoJ3R5cGU6ZXh0ZW5zaW9uJylcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cXFwiaXNEcm9wbGV0RmlsdGVyQ2hlY2tlZCgndHlwZTpleHRlbnNpb24nKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhGbGV4PVxcXCI1NVxcXCI+e3tnZXREcm9wbGV0VHlwZUNvdW50KCdleHRlbnNpb24nKX19PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5FeHRlbnNpb25zPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcigndHlwZTpmbG93JylcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cXFwiaXNEcm9wbGV0RmlsdGVyQ2hlY2tlZCgndHlwZTpmbG93JylcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4RmxleD1cXFwiNTVcXFwiPnt7Z2V0RHJvcGxldFR5cGVDb3VudCgnZmxvdycpfX08L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkZsb3dzPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcignY29tcGxpYW50LmxhYmVsOkNvbXBsaWFudCcpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ2NvbXBsaWFudC5sYWJlbDpDb21wbGlhbnQnKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhGbGV4PVxcXCI1NVxcXCI+e3tnZXREcm9wbGV0Q2VydGlmaWNhdGlvbkNvdW50KCdjb21wbGlhbnQnKX19PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5Db21wbGlhbnQ8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgKGNoYW5nZSk9XFxcInRvZ2dsZURyb3BsZXRzRmlsdGVyKCdmbGVldC5sYWJlbDpGbGVldCcpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ2ZsZWV0LmxhYmVsOkZsZWV0JylcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4RmxleD1cXFwiNTVcXFwiPnt7Z2V0RHJvcGxldENlcnRpZmljYXRpb25Db3VudCgnZmxlZXQnKX19PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5GbGVldDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSAoY2hhbmdlKT1cXFwidG9nZ2xlRHJvcGxldHNGaWx0ZXIoJ3Byb2QubGFiZWw6UHJvZHVjdGlvbiBSZWFkeScpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ3Byb2QubGFiZWw6UHJvZHVjdGlvbiBSZWFkeScpXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYXJvdW5kIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibWF0LWRpc3BsYXktMSBwYWQtdG9wLXNtXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeEZsZXg9XFxcIjU1XFxcIj57e2dldERyb3BsZXRDZXJ0aWZpY2F0aW9uQ291bnQoJ3Byb2QnKX19PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5Qcm9kdWN0aW9uIFJlYWR5PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcignc2VjdXJlLmxhYmVsOlNlY3VyZScpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ3NlY3VyZS5sYWJlbDpTZWN1cmUnKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhGbGV4PVxcXCI1NVxcXCI+e3tnZXREcm9wbGV0Q2VydGlmaWNhdGlvbkNvdW50KCdzZWN1cmUnKX19PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjQ1XFxcIj5TZWN1cmU8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVxcXCJmZHMtZHJvcGxldC1maWx0ZXItY2xlYXItZ3JvdXBpbmctYnV0dG9uLWNvbnRhaW5lclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XFxcImRyb3BsZXRzU2VhcmNoVGVybXMubGVuZ3RoID4gMFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVxcXCJkcm9wbGV0c1NlYXJjaFRlcm1zID0gW107ZmlsdGVyRHJvcGxldHMoYWN0aXZlRHJvcGxldENvbHVtbi5uYW1lLCBhY3RpdmVEcm9wbGV0Q29sdW1uLnNvcnRPcmRlcik7XFxcIj48aVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwiZmEgZmEtcGx1cy1jaXJjbGUgZmEtcm90YXRlLTQ1XFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPjxzcGFuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJwYWQtbGVmdC1zbSBsaW5rXFxcIj5DbGVhciBHcm91cGluZzwvc3Bhbj48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmbGV4IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZC1jaGlwcyBbKG5nTW9kZWwpXT1cXFwiZHJvcGxldHNTZWFyY2hUZXJtc1xcXCIgW2l0ZW1zXT1cXFwiYXV0b0NvbXBsZXRlRHJvcGxldHNcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGQpPVxcXCJmaWx0ZXJEcm9wbGV0cyhhY3RpdmVEcm9wbGV0Q29sdW1uLm5hbWUsIGFjdGl2ZURyb3BsZXRDb2x1bW4uc29ydE9yZGVyKTtcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmUpPVxcXCJmaWx0ZXJEcm9wbGV0cyhhY3RpdmVEcm9wbGV0Q29sdW1uLm5hbWUsIGFjdGl2ZURyb3BsZXRDb2x1bW4uc29ydE9yZGVyKTtcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJwdXNoLXJpZ2h0LXNtXFxcIj48L3RkLWNoaXBzPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJwdXNoLXRvcC1zbSBwYWQtcmlnaHQtc21cXFwiPlNvcnQgYnk6PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcInB1c2gtdG9wLXNtXFxcIiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIG1hdC1yYWlzZWQtYnV0dG9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJkcm9wbGV0R3JpZFNvcnRNZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRTb3J0QnkoKX19PGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwiZmRzLXByaW1hcnktZHJvcGRvd24tYnV0dG9uLW1lbnVcXFwiICNkcm9wbGV0R3JpZFNvcnRNZW51PVxcXCJtYXRNZW51XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cXFwibGV0IGNvbHVtbiBvZiBkcm9wbGV0Q29sdW1uc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdJZj1cXFwiY29sdW1uLnNvcnRhYmxlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XFxcInNvcnREcm9wbGV0cyhjb2x1bW4pO1xcXCI+e3tjb2x1bW4ubGFiZWx9fSB7eyhjb2x1bW4uc29ydE9yZGVyID09PSAnQVNDJykgPyAnREVTQycgOiAnQVNDJ319PC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtcmlnaHQteHhsIHBhZC1sZWZ0LXh4bFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVxcXCJsZXQgZHJvcGxldCBvZiBmaWx0ZXJlZERyb3BsZXRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZC1leHBhbnNpb24tcGFuZWwgY2xhc3M9XFxcIm1hdC1lbGV2YXRpb24tejVcXFwiIGxhYmVsPXt7ZHJvcGxldC5sYWJlbH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmxhYmVsPXt7ZHJvcGxldC5zdWJsYWJlbH19IFtkaXNhYmxlZF09XFxcImRpc2FibGVkXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdGQtZXhwYW5zaW9uLXBhbmVsLWxhYmVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gc3RhcnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm1kLXRpdGxlIHRleHQtY2Fwc1xcXCI+e3tkcm9wbGV0LmRpc3BsYXlOYW1lfX08L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwibWQtc3ViaGVhZFxcXCI+e3tkcm9wbGV0LnR5cGV9fTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdGQtZXhwYW5zaW9uLXBhbmVsLXN1YmxhYmVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC1yaWdodC14eGwgcGFkLWxlZnQteHhsXFxcIiBmeExheW91dD1cXFwiY29sdW1uXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0YXJ0XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+VmVyc2lvbnM8L3NwYW4+IHt7ZHJvcGxldC52ZXJzaW9ucy5sZW5ndGh9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtcmlnaHQteHhsIHBhZC1sZWZ0LXh4bFxcXCIgZnhMYXlvdXQ9XFxcImNvbHVtblxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBzdGFydFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkZsb3dzPC9zcGFuPiB7e2Ryb3BsZXQuZmxvd3MubGVuZ3RofX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLXJpZ2h0LXh4bCBwYWQtbGVmdC14eGxcXFwiIGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gc3RhcnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5FeHRlbnNpb25zPC9zcGFuPiB7e2Ryb3BsZXQuZXh0ZW5zaW9ucy5sZW5ndGh9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtcmlnaHQteHhsIHBhZC1sZWZ0LXh4bFxcXCIgZnhMYXlvdXQ9XFxcImNvbHVtblxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBzdGFydFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkFzc2VzdHM8L3NwYW4+IHt7ZHJvcGxldC5hc3NldHMubGVuZ3RofX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1wYWRkaW5nXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwiZW5kIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJwcmltYXJ5QnV0dG9uRHJvcGRvd25NZW51XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbnM8aSBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgY2xhc3M9XFxcImZkcy1wcmltYXJ5LWRyb3Bkb3duLWJ1dHRvbi1tZW51XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbWFyeUJ1dHRvbkRyb3Bkb3duTWVudT1cXFwibWF0TWVudVxcXCIgW292ZXJsYXBUcmlnZ2VyXT1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKm5nRm9yPVxcXCJsZXQgYWN0aW9uIG9mIGRyb3BsZXQuYWN0aW9uc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2FjdGlvbi5uYW1lfX08L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XFxcIjI1XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkRlc2NyaXB0aW9uPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5CbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWhcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWhcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhLCBibGFoIGJsYWggYmxhPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4PVxcXCI1MFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZCBmeEZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cXFwicGFkLXRvcC1zbVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcInt7ZHJvcGxldC5pbWd9fVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XFxcIjI1XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkNoYW5nZSBMb2c8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkLWV4cGFuc2lvbi1wYW5lbD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPkNvZGU8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtdG9wLW1kIHBhZC1ib3R0b20tbWQgcGFkLXJpZ2h0LXh4bCBwYWQtbGVmdC14eGxcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3AtbWQgcGFkLWJvdHRvbS1zbVxcXCI+XFxuICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIGNlbnRlclxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJleHBhbnNpb24tcGFuZWwtZmlsdGVyLXRvZ2dsZS1ncm91cFxcXCIgbXVsdGlwbGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgKGNoYW5nZSk9XFxcInRvZ2dsZURyb3BsZXRzRmlsdGVyKCd0eXBlOmFzc2V0JylcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVxcXCJpc0Ryb3BsZXRGaWx0ZXJDaGVja2VkKCd0eXBlOmFzc2V0JylcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibWF0LWRpc3BsYXktMSBwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjU1XFxcIj57IHtnZXREcm9wbGV0VHlwZUNvdW50KCdhc3NldCcpfSB9PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkFzc2V0czwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSAoY2hhbmdlKT1cXFwidG9nZ2xlRHJvcGxldHNGaWx0ZXIoJ3R5cGU6ZXh0ZW5zaW9uJylcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVxcXCJpc0Ryb3BsZXRGaWx0ZXJDaGVja2VkKCd0eXBlOmV4dGVuc2lvbicpXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI1NVxcXCI+e1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2dldERyb3BsZXRUeXBlQ291bnQoJ2V4dGVuc2lvbicpfSB9PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkV4dGVuc2lvbnM8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgKGNoYW5nZSk9XFxcInRvZ2dsZURyb3BsZXRzRmlsdGVyKCd0eXBlOmZsb3cnKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ3R5cGU6ZmxvdycpXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI1NVxcXCI+eyB7Z2V0RHJvcGxldFR5cGVDb3VudCgnZmxvdycpfSB9PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkZsb3dzPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcignY29tcGxpYW50LmxhYmVsOkNvbXBsaWFudCcpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cXFwiaXNEcm9wbGV0RmlsdGVyQ2hlY2tlZCgnY29tcGxpYW50LmxhYmVsOkNvbXBsaWFudCcpXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleCBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1hcm91bmQgc3RyZXRjaFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hdC1kaXNwbGF5LTEgcGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI1NVxcXCI+eyB7Z2V0RHJvcGxldENlcnRpZmljYXRpb25Db3VudCgnY29tcGxpYW50Jyl9IH08L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI0NVxcXCI+Q29tcGxpYW50PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcignZmxlZXQubGFiZWw6RmxlZXQnKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ2ZsZWV0LmxhYmVsOkZsZWV0JylcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWFyb3VuZCBzdHJldGNoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibWF0LWRpc3BsYXktMSBwYWQtdG9wLXNtXFxcIiBmeEZsZXg9XFxcIjU1XFxcIj57IHtnZXREcm9wbGV0Q2VydGlmaWNhdGlvbkNvdW50KCdmbGVldCcpfSB9PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPkZsZWV0PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjaGFuZ2UpPVxcXCJ0b2dnbGVEcm9wbGV0c0ZpbHRlcigncHJvZC5sYWJlbDpQcm9kdWN0aW9uIFJlYWR5JylcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVxcXCJpc0Ryb3BsZXRGaWx0ZXJDaGVja2VkKCdwcm9kLmxhYmVsOlByb2R1Y3Rpb24gUmVhZHknKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYXJvdW5kIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPntcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtnZXREcm9wbGV0Q2VydGlmaWNhdGlvbkNvdW50KCdwcm9kJyl9IH08L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLXRvcC1zbVxcXCIgZnhGbGV4PVxcXCI0NVxcXCI+UHJvZHVjdGlvbiBSZWFkeTwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSAoY2hhbmdlKT1cXFwidG9nZ2xlRHJvcGxldHNGaWx0ZXIoJ3NlY3VyZS5sYWJlbDpTZWN1cmUnKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XFxcImlzRHJvcGxldEZpbHRlckNoZWNrZWQoJ3NlY3VyZS5sYWJlbDpTZWN1cmUnKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYXJvdW5kIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtZGlzcGxheS0xIHBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNTVcXFwiPnsge2dldERyb3BsZXRDZXJ0aWZpY2F0aW9uQ291bnQoJ3NlY3VyZScpfSB9PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC10b3Atc21cXFwiIGZ4RmxleD1cXFwiNDVcXFwiPlNlY3VyZTwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cXFwiYWN0aXZlRHJvcGxldENvbHVtblxcXCIgbWF0LWJ1dHRvbiBjb2xvcj1cXFwicHJpbWFyeVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVxcXCJkcm9wbGV0c1NlYXJjaFRlcm1zID0gW107ZmlsdGVyRHJvcGxldHMoYWN0aXZlRHJvcGxldENvbHVtbi5uYW1lLCBhY3RpdmVEcm9wbGV0Q29sdW1uLnNvcnRPcmRlcik7XFxcIj5DbGVhciBHcm91cGluZzwvYnV0dG9uPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZsZXggZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwiZW5kIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8dGQtY2hpcHMgWyhuZ01vZGVsKV09XFxcImRyb3BsZXRzU2VhcmNoVGVybXNcXFwiIFtpdGVtc109XFxcImF1dG9Db21wbGV0ZURyb3BsZXRzXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGQpPVxcXCJmaWx0ZXJEcm9wbGV0cyhhY3RpdmVEcm9wbGV0Q29sdW1uLm5hbWUsIGFjdGl2ZURyb3BsZXRDb2x1bW4uc29ydE9yZGVyKTtcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZSk9XFxcImZpbHRlckRyb3BsZXRzKGFjdGl2ZURyb3BsZXRDb2x1bW4ubmFtZSwgYWN0aXZlRHJvcGxldENvbHVtbi5zb3J0T3JkZXIpO1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwicHVzaC1yaWdodC1zbVxcXCI+PC90ZC1jaGlwcz5cXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJwYWQtcmlnaHQtc21cXFwiPlNvcnQgYnk6PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIG1hdC1yYWlzZWQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XFxcImRyb3BsZXRHcmlkU29ydE1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsge2dldFNvcnRCeSgpfSB9PGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwiZmRzLXByaW1hcnktZHJvcGRvd24tYnV0dG9uLW1lbnVcXFwiICNkcm9wbGV0R3JpZFNvcnRNZW51PVxcXCJtYXRNZW51XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW292ZXJsYXBUcmlnZ2VyXT1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XFxcImxldCBjb2x1bW4gb2YgZHJvcGxldENvbHVtbnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdJZj1cXFwiY29sdW1uLnNvcnRhYmxlXFxcIiAoY2xpY2spPVxcXCJzb3J0RHJvcGxldHMoY29sdW1uKTtcXFwiPntcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbHVtbi5sYWJlbH0gfSB7IHsoY29sdW1uLnNvcnRPcmRlciA9PT0gJ0FTQycpID8gJ0RFU0MnIDogJ0FTQyd9IH08L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtcmlnaHQteHhsIHBhZC1sZWZ0LXh4bFxcXCI+XFxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XFxcImxldCBkcm9wbGV0IG9mIGZpbHRlcmVkRHJvcGxldHNcXFwiPlxcbiAgICAgICAgICAgICAgICA8dGQtZXhwYW5zaW9uLXBhbmVsIGNsYXNzPVxcXCJtYXQtZWxldmF0aW9uLXo1XFxcIiBsYWJlbD17IHtkcm9wbGV0LmxhYmVsfSB9IHN1YmxhYmVsPXsge2Ryb3BsZXQuc3VibGFiZWx9IH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVxcXCJkaXNhYmxlZFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdGQtZXhwYW5zaW9uLXBhbmVsLWxhYmVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcImNvbHVtblxcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBzdGFydFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtZC10aXRsZSB0ZXh0LWNhcHNcXFwiPnsge2Ryb3BsZXQuZGlzcGxheU5hbWV9IH08L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtZC1zdWJoZWFkXFxcIj57IHtkcm9wbGV0LnR5cGV9IH08L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHRkLWV4cGFuc2lvbi1wYW5lbC1zdWJsYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLXJpZ2h0LXh4bCBwYWQtbGVmdC14eGxcXFwiIGZ4TGF5b3V0PVxcXCJjb2x1bW5cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBzdGFydFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+VmVyc2lvbnM8L3NwYW4+IHsge2Ryb3BsZXQudmVyc2lvbnMubGVuZ3RofSB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtcmlnaHQteHhsIHBhZC1sZWZ0LXh4bFxcXCIgZnhMYXlvdXQ9XFxcImNvbHVtblxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0YXJ0XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5GbG93czwvc3Bhbj4geyB7ZHJvcGxldC5mbG93cy5sZW5ndGh9IH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC1yaWdodC14eGwgcGFkLWxlZnQteHhsXFxcIiBmeExheW91dD1cXFwiY29sdW1uXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gc3RhcnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkV4dGVuc2lvbnM8L3NwYW4+IHsge2Ryb3BsZXQuZXh0ZW5zaW9ucy5sZW5ndGh9IH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC1yaWdodC14eGwgcGFkLWxlZnQteHhsXFxcIiBmeExheW91dD1cXFwiY29sdW1uXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gc3RhcnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkFzc2VzdHM8L3NwYW4+IHsge2Ryb3BsZXQuYXNzZXRzLmxlbmd0aH0gfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtcGFkZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwiY29sdW1uXFxcIiBmeExheW91dEFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIHN0cmV0Y2hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJwcmltYXJ5QnV0dG9uRHJvcGRvd25NZW51XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25zPGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwiZmRzLXByaW1hcnktZHJvcGRvd24tYnV0dG9uLW1lbnVcXFwiICNwcmltYXJ5QnV0dG9uRHJvcGRvd25NZW51PVxcXCJtYXRNZW51XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKm5nRm9yPVxcXCJsZXQgYWN0aW9uIG9mIGRyb3BsZXQuYWN0aW9uc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnsge2FjdGlvbi5uYW1lfSB9PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cXFwiMjVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5EZXNjcmlwdGlvbjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5CbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhQmxhaCBibGFoIGJsYSwgYmxhIGJsYSwgYmxhaCBibGFoIGJsYUJsYWggYmxhaCBibGEsIGJsYSBibGEsIGJsYWggYmxhaCBibGFCbGFoIGJsYWggYmxhLCBibGEgYmxhLCBibGFoIGJsYWggYmxhPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cXFwiNTBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZCBmeEZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVxcXCJwYWQtdG9wLXNtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCJ7IHtkcm9wbGV0LmltZ30gfVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cXFwiMjVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5DaGFuZ2UgTG9nPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvdGQtZXhwYW5zaW9uLXBhbmVsPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgICBdXT5cXG4gICAgICAgICAgICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkphdmFzY3JpcHQ6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiamF2YXNjcmlwdFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICB0aGlzLmRhdGFUYWJsZVNlcnZpY2UgPSBUZERhdGFUYWJsZVNlcnZpY2U7XFxuXFxuICAgICAgICB0aGlzLmRyb3BsZXRzID0gW1xcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgaWQ6ICcyM2Y2Y2M1OS0wMTU2LTEwMDAtMDliNC0yYjA2MTAwODkwOTAnLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBcXFwiRGVjb21wcmVzc2lvbl9DaXJjdWxhcl9GbG93XFxcIixcXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdEZWNvbXByZXNzZWQgQ2lyY3VsYXIgZmxvdycsXFxuICAgICAgICAgICAgICAgIHR5cGU6ICdmbG93JyxcXG4gICAgICAgICAgICAgICAgc3VibGFiZWw6ICdBIHN1YmxhYmVsJyxcXG4gICAgICAgICAgICAgICAgY29tcGxpYW50OiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogJzI1ZmQ2dnY4Ny0zNTQ5LTAwMDEtMDVnNi00ZDQ1Njc4OTA3NjUnLFxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDb21wbGlhbnQnLFxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NlcnRpZmljYXRpb24nXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGZsZWV0OiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogJzIzZjZjYzU5LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0ZsZWV0JyxcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjZXJ0aWZpY2F0aW9uJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBwcm9kOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogJzUyZmQ2dnY4Ny0zNTQ5LTAwMDEtMDVnNi00ZDQ1Njc4OTA3NjUnLFxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQcm9kdWN0aW9uIFJlYWR5JyxcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjZXJ0aWZpY2F0aW9uJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBzZWN1cmU6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnMzJmNmNjNTktMzU0OS0wMDAxLTA1ZzYtNGQ0NTY3ODkwNzY1JyxcXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnU2VjdXJlJyxcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjZXJ0aWZpY2F0aW9uJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uczogW1xcbiAgICAgICAgICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnMjNmNmNjNTktMDE1Ni0xMDAwLTA2YjQtMmIwODEwMDg5MDkwJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbjogJzEnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudEZsb3dzOiBbXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnMjVmZDZ2djg3LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NSdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZDogZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gMSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZDogbmV3IERhdGUoKVxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnMjVmZDZ2djg3LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb246ICcyJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGbG93czogW1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJzIzZjZjYzU5LTAxNTYtMTAwMC0wNmI0LTJiMDgxMDA4OTA5MCdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZDogbmV3IERhdGUoKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkOiBuZXcgRGF0ZSgpXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgICAgIGZsb3dzOiBbXSxcXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uczogW10sXFxuICAgICAgICAgICAgICAgIGFzc2V0czogW10sXFxuICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcXG4gICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdEZWxldGUnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLWNsb3NlJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdEZWxldGUgVXNlcidcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnTWFuYWdlJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnaWNvbic6ICdmYSBmYS11c2VyJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgVXNlcidcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDMnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLXF1ZXN0aW9uJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdXaGF0ZXZlciBlbHNlIHdlIHdhbnQgdG8gZG8uLi4nXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIF1cXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgaWQ6ICcyNWZkNnZ2ODctMzI0OS0wMDAxLTA1ZzYtNGQ0NzY3ODkwNzY1JyxcXG4gICAgICAgICAgICAgICAgbmFtZTogXFxcIkRhdGVDb252ZXJzaW9uXFxcIixcXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdEYXRlIGNvbnZlcnNpb24nLFxcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXNzZXQnLFxcbiAgICAgICAgICAgICAgICBzdWJsYWJlbDogJ0Egc3VibGFiZWwnLFxcbiAgICAgICAgICAgICAgICBjb21wbGlhbnQ6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnMjVmZDZ2djM0LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0NvbXBsaWFudCcsXFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2VydGlmaWNhdGlvbidcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgcHJvZDoge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICc1MnZuNnZ2ODctMzU0OS0wMDAxLTA1ZzYtNGQ0NTY3ODkwNzY1JyxcXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUHJvZHVjdGlvbiBSZWFkeScsXFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2VydGlmaWNhdGlvbidcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgdmVyc2lvbnM6IFtcXG4gICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogJzIzZjZpYzU5LTAxNTYtMTAwMC0wNmI0LTJiMDgxMDA4OTA5MCcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb246ICcxJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRGbG93czogW1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJzIzZjZjYzE5LTAxNTYtMTAwMC0wNmI0LTJiMDgxMDA4OTA5MCdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZDogbmV3IERhdGUoKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkOiBuZXcgRGF0ZSgpXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgICAgIGZsb3dzOiBbXSxcXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uczogW10sXFxuICAgICAgICAgICAgICAgIGFzc2V0czogW10sXFxuICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcXG4gICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdEZWxldGUnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLWNsb3NlJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdEZWxldGUgVXNlcidcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgXVxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICBpZDogJzUyZmQ2dnY4Ny0zMjk0LTAwMDEtMDVnNi00ZDQ3Njc4OTA3NjUnLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBcXFwibmlmaS1lbWFpbC1idW5kbGVcXFwiLFxcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ25pZmktZW1haWwtYnVuZGxlJyxcXG4gICAgICAgICAgICAgICAgdHlwZTogJ2V4dGVuc2lvbicsXFxuICAgICAgICAgICAgICAgIHN1YmxhYmVsOiAnQSBzdWJsYWJlbCcsXFxuICAgICAgICAgICAgICAgIGNvbXBsaWFudDoge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICczM2ZkNnZ2ODctMzU0OS0wMDAxLTA1ZzYtNGQ0NTY3ODkwNzY1JyxcXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ29tcGxpYW50JyxcXG4gICAgICAgICAgICAgICAgICAgIHRlc3Q6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ3Rlc3QnXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NlcnRpZmljYXRpb24nXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIHZlcnNpb25zOiBbXFxuICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICcyM2QzY2M1OS0wMTU2LTEwMDAtMDZiNC0yYjA4MTAwODkwOTAnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uOiAnMScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50Rmxvd3M6IFtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICcyM2Y2Y2M4OS0wMTU2LTEwMDAtMDZiNC0yYjA4MTAwODkwOTAnXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZDogbmV3IERhdGUoKVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBdLFxcbiAgICAgICAgICAgICAgICBmbG93czogW10sXFxuICAgICAgICAgICAgICAgIGV4dGVuc2lvbnM6IFtdLFxcbiAgICAgICAgICAgICAgICBhc3NldHM6IFtdLFxcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXFxuICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRGVsZXRlJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnaWNvbic6ICdmYSBmYS1jbG9zZScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Rvb2x0aXAnOiAnRGVsZXRlIFVzZXInXFxuICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnTWFuYWdlJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnaWNvbic6ICdmYSBmYS11c2VyJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgVXNlcidcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgXVxcbiAgICAgICAgfV07XFxuXFxuICAgICAgICB0aGlzLmZpbHRlcmVkRHJvcGxldHMgPSBbXTtcXG5cXG4gICAgICAgIHRoaXMuZHJvcGxldENvbHVtbnMgPSBbXFxuICAgICAgICAgICAgeyBuYW1lOiAnaWQnLCBsYWJlbDogJ0lEJywgc29ydGFibGU6IHRydWUgfSxcXG4gICAgICAgICAgICB7IG5hbWU6ICduYW1lJywgbGFiZWw6ICdOYW1lJywgc29ydGFibGU6IHRydWUgfSxcXG4gICAgICAgICAgICB7IG5hbWU6ICdkaXNwbGF5TmFtZScsIGxhYmVsOiAnRGlzcGxheSBOYW1lJywgc29ydGFibGU6IHRydWUgfSxcXG4gICAgICAgICAgICB7IG5hbWU6ICdzdWJsYWJlbCcsIGxhYmVsOiAnTGFiZWwnLCBzb3J0YWJsZTogdHJ1ZSB9LFxcbiAgICAgICAgICAgIHsgbmFtZTogJ3R5cGUnLCBsYWJlbDogJ1R5cGUnLCBzb3J0YWJsZTogdHJ1ZSB9XFxuICAgICAgICBdO1xcblxcbiAgICAgICAgdGhpcy5hdXRvQ29tcGxldGVEcm9wbGV0cyA9IFtdO1xcbiAgICAgICAgdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zID0gW107XFxuXFxuICAgICAgICAuLi5cXG5cXG4gICAgICAgIGlzRHJvcGxldEZpbHRlckNoZWNrZWQ6IGZ1bmN0aW9uKHRlcm0pIHtcXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuZHJvcGxldHNTZWFyY2hUZXJtcy5pbmRleE9mKHRlcm0pID4gLTEpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIGdldERyb3BsZXRUeXBlQ291bnQ6IGZ1bmN0aW9uKHR5cGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERyb3BsZXRzLmZpbHRlcihmdW5jdGlvbihkcm9wbGV0KSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBkcm9wbGV0LnR5cGUgPT09IHR5cGU7XFxuICAgICAgICAgICAgfSkubGVuZ3RoO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIGdldERyb3BsZXRDZXJ0aWZpY2F0aW9uQ291bnQ6IGZ1bmN0aW9uKGNlcnRpZmljYXRpb24pIHtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERyb3BsZXRzLmZpbHRlcihkcm9wbGV0ID0+IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGRyb3BsZXQpLmZpbmQoKGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gY2VydGlmaWNhdGlvbiAmJiBkcm9wbGV0W2NlcnRpZmljYXRpb25dLnR5cGUgPT09ICdjZXJ0aWZpY2F0aW9uJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkcm9wbGV0O1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9KS5sZW5ndGg7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgZ2V0U29ydEJ5OiBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICB2YXIgc29ydEJ5Q29sdW1uTGFiZWw7XFxuICAgICAgICAgICAgdmFyIGFycmF5TGVuZ3RoID0gdGhpcy5kcm9wbGV0Q29sdW1ucy5sZW5ndGg7XFxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyb3BsZXRDb2x1bW5zW2ldLmFjdGl2ZSA9PT0gdHJ1ZSkge1xcbiAgICAgICAgICAgICAgICAgICAgc29ydEJ5Q29sdW1uTGFiZWwgPSB0aGlzLmRyb3BsZXRDb2x1bW5zW2ldLmxhYmVsO1xcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIHNvcnRCeUNvbHVtbkxhYmVsO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHNvcnREcm9wbGV0czogZnVuY3Rpb24oY29sdW1uKSB7XFxuICAgICAgICAgICAgaWYgKGNvbHVtbi5zb3J0YWJsZSA9PT0gdHJ1ZSkge1xcbiAgICAgICAgICAgICAgICAvLyB0b2dnbGUgY29sdW1uIHNvcnQgb3JkZXJcXG4gICAgICAgICAgICAgICAgdmFyIHNvcnRPcmRlciA9IGNvbHVtbi5zb3J0T3JkZXIgPSAoY29sdW1uLnNvcnRPcmRlciA9PT0gJ0FTQycpID8gJ0RFU0MnIDogJ0FTQyc7XFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRHJvcGxldHMoY29sdW1uLm5hbWUsIHNvcnRPcmRlcik7XFxuXFxuICAgICAgICAgICAgICAgIC8vb25seSBvbmUgY29sdW1uIGNhbiBiZSBhY3RpdmVseSBzb3J0ZWQgc28gd2UgcmVzZXQgYWxsIHRvIGluYWN0aXZlXFxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGxldENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmFjdGl2ZSA9IGZhbHNlO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgLy9hbmQgc2V0IHRoaXMgY29sdW1uIGFzIHRoZSBhY3RpdmVseSBzb3J0ZWQgY29sdW1uXFxuICAgICAgICAgICAgICAgIGNvbHVtbi5hY3RpdmUgPSB0cnVlO1xcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURyb3BsZXRDb2x1bW4gPSBjb2x1bW47XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHRvZ2dsZURyb3BsZXRzRmlsdGVyOiBmdW5jdGlvbihzZWFyY2hUZXJtKSB7XFxuICAgICAgICAgICAgdmFyIGFwcGx5U2VhcmNoVGVybSA9IHRydWU7XFxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHNlYXJjaCB0ZXJtIGlzIGFscmVhZHkgYXBwbGllZCBhbmQgcmVtb3ZlIGl0IGlmIHRydWVcXG4gICAgICAgICAgICBpZiAodGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgdmFyIGFycmF5TGVuZ3RoID0gdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zLmxlbmd0aDtcXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmRyb3BsZXRzU2VhcmNoVGVybXMuaW5kZXhPZihzZWFyY2hUZXJtKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zLnNwbGljZShpbmRleCwgMSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTZWFyY2hUZXJtID0gZmFsc2U7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgLy8gaWYgd2UganVzdCByZW1vdmVkIHRoZSBzZWFyY2ggdGVybSBkbyBOT1QgYXBwbHkgaXQgYWdhaW5cXG4gICAgICAgICAgICBpZiAoYXBwbHlTZWFyY2hUZXJtKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGxldHNTZWFyY2hUZXJtcy5wdXNoKHNlYXJjaFRlcm0pO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICB0aGlzLmZpbHRlckRyb3BsZXRzKHRoaXMuYWN0aXZlRHJvcGxldENvbHVtbi5uYW1lLCB0aGlzLmFjdGl2ZURyb3BsZXRDb2x1bW4uc29ydE9yZGVyKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBmaWx0ZXJEcm9wbGV0czogZnVuY3Rpb24oc29ydEJ5LCBzb3J0T3JkZXIpIHtcXG4gICAgICAgICAgICAvLyBpZiBgc29ydEJ5YCBpcyBgdW5kZWZpbmVkYCB0aGVuIGZpbmQgdGhlIGZpcnN0IHNvcnRhYmxlIGNvbHVtbiBpbiB0aGlzLmRyb3BsZXRDb2x1bW5zXFxuICAgICAgICAgICAgaWYgKHNvcnRCeSA9PT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgIHZhciBhcnJheUxlbmd0aCA9IHRoaXMuZHJvcGxldENvbHVtbnMubGVuZ3RoO1xcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyb3BsZXRDb2x1bW5zW2ldLnNvcnRhYmxlID09PSB0cnVlKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydEJ5ID0gdGhpcy5kcm9wbGV0Q29sdW1uc1tpXS5uYW1lO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRHJvcGxldENvbHVtbiA9IHRoaXMuZHJvcGxldENvbHVtbnNbaV07XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9vbmx5IG9uZSBjb2x1bW4gY2FuIGJlIGFjdGl2ZWx5IHNvcnRlZCBzbyB3ZSByZXNldCBhbGwgdG8gaW5hY3RpdmVcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3BsZXRDb2x1bW5zLmZvckVhY2goYyA9PiBjLmFjdGl2ZSA9IGZhbHNlKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2FuZCBzZXQgdGhpcyBjb2x1bW4gYXMgdGhlIGFjdGl2ZWx5IHNvcnRlZCBjb2x1bW5cXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3BsZXRDb2x1bW5zW2ldLmFjdGl2ZSA9IHRydWU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgLy8gaWYgYHNvcnRPcmRlcmAgaXMgYHVuZGVmaW5lZGAgdGhlbiB1c2UgJ0FTQydcXG4gICAgICAgICAgICBpZiAoc29ydE9yZGVyID09PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgc29ydE9yZGVyID0gJ0FTQydcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSB0aGlzLmRyb3BsZXRzO1xcblxcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIG5ld0RhdGEgPSB0aGlzLmZpbHRlckRhdGEobmV3RGF0YSwgdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zW2ldLCB0cnVlLCB0aGlzLmFjdGl2ZURyb3BsZXRDb2x1bW4ubmFtZSk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIG5ld0RhdGEgPSB0aGlzLmRhdGFUYWJsZVNlcnZpY2Uuc29ydERhdGEobmV3RGF0YSwgc29ydEJ5LCBzb3J0T3JkZXIpO1xcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREcm9wbGV0cyA9IG5ld0RhdGE7XFxuICAgICAgICAgICAgdGhpcy5nZXRBdXRvQ29tcGxldGVEcm9wbGV0cygpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIGdldEF1dG9Db21wbGV0ZURyb3BsZXRzOiBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZURyb3BsZXRzID0gW107XFxuICAgICAgICAgICAgdGhpcy5kcm9wbGV0Q29sdW1ucy5mb3JFYWNoKGMgPT4gdGhpcy5maWx0ZXJlZERyb3BsZXRzLmZvckVhY2gociA9PiAocltjLm5hbWUudG9Mb3dlckNhc2UoKV0pID8gdGhpcy5hdXRvQ29tcGxldGVEcm9wbGV0cy5wdXNoKHJbYy5uYW1lLnRvTG93ZXJDYXNlKCldLnRvU3RyaW5nKCkpIDogJycpKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBmaWx0ZXJEYXRhOiBmdW5jdGlvbihkYXRhLCBzZWFyY2hUZXJtLCBpZ25vcmVDYXNlKSB7XFxuICAgICAgICAgICAgdmFyIGZpZWxkID0gJyc7XFxuICAgICAgICAgICAgaWYgKHNlYXJjaFRlcm0uaW5kZXhPZihcXFwiOlxcXCIpID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgZmllbGQgPSBzZWFyY2hUZXJtLnNwbGl0KCc6JylbMF0udHJpbSgpO1xcbiAgICAgICAgICAgICAgICBzZWFyY2hUZXJtID0gc2VhcmNoVGVybS5zcGxpdCgnOicpWzFdLnRyaW0oKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdmFyIGZpbHRlciA9IHNlYXJjaFRlcm0gPyAoaWdub3JlQ2FzZSA/IHNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKSA6IHNlYXJjaFRlcm0pIDogJyc7XFxuXFxuICAgICAgICAgICAgaWYgKGZpbHRlcikge1xcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5maWx0ZXIoaXRlbSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IE9iamVjdC5rZXlzKGl0ZW0pLmZpbmQoKGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pbmRleE9mKFxcXCIuXFxcIikgPiAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqQXJyYXkgPSBmaWVsZC5zcGxpdChcXFwiLlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gaXRlbTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFycmF5TGVuZ3RoID0gb2JqQXJyYXkubGVuZ3RoO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gb2JqW29iakFycmF5W2ldXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZUl0ZW1WYWx1ZSA9ICgnJyArIG9iaik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtVmFsdWUgPSBpZ25vcmVDYXNlID8gcHJlSXRlbVZhbHVlLnRvTG93ZXJDYXNlKCkgOiBwcmVJdGVtVmFsdWU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtVmFsdWUuaW5kZXhPZihmaWx0ZXIpID4gLTE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gZmllbGQgJiYgZmllbGQgIT09ICcnKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZUl0ZW1WYWx1ZSA9ICgnJyArIGl0ZW1ba2V5XSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtVmFsdWUgPSBpZ25vcmVDYXNlID8gcHJlSXRlbVZhbHVlLnRvTG93ZXJDYXNlKCkgOiBwcmVJdGVtVmFsdWU7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtVmFsdWUuaW5kZXhPZihmaWx0ZXIpID4gLTE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISh0eXBlb2YgcmVzID09PSAndW5kZWZpbmVkJyk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAuLi5cXG4gICAgICAgICAgXV0+XFxuICAgICAgICAgICAgICAgICAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiVGFibGVcXFwiPlRhYmxlIDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJUYWJsZVxcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPHA+RXhhbXBsZSB0YWJsZSB3aXRoOiBQYWdpbmcgQmFyIC8gRmlsdGVyIC8gU29ydGFibGUgQ29sdW1ucyAvIE11bHRpLXNlbGVjdCB3aXRoIGF2YWlsYWJsZSBBY3Rpb25zPC9wPlxcbiAgICAgICAgICAgICAgICA8bWF0LXRhYi1ncm91cCBtYXQtc3RyZXRjaC10YWJzIGNvbG9yPVxcXCJhY2NlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+RGVtbzwvbmctdGVtcGxhdGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzcGFjZS1iZXR3ZWVuIGNlbnRlclxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJwYWQtdG9wLW1kIHBhZC1ib3R0b20tc20gcGFkLWxlZnQtbWQgcGFkLXJpZ2h0LW1kXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRhYmxlLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+VGFibGUgdGl0bGU8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmbGV4IGNsYXNzPVxcXCJwdXNoLXJpZ2h0LXNtXFxcIiBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZC1jaGlwcyBbaXRlbXNdPVxcXCJhdXRvQ29tcGxldGVEYXRhXFxcIiAoYWRkKT1cXFwic2VhcmNoQWRkKCRldmVudClcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZSk9XFxcInNlYXJjaFJlbW92ZSgkZXZlbnQpXFxcIj48L3RkLWNoaXBzPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwicHVzaC10b3Atc21cXFwiIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgbWF0LXJhaXNlZC1idXR0b25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwiZGF0YVRhYmxlQWN0aW9uTWVudVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uczxpIGNsYXNzPVxcXCJmYSBmYS1jYXJldC1kb3duXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgY2xhc3M9XFxcImZkcy1wcmltYXJ5LWRyb3Bkb3duLWJ1dHRvbi1tZW51XFxcIiAjZGF0YVRhYmxlQWN0aW9uTWVudT1cXFwibWF0TWVudVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gT3B0aW9uIDE8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gT3B0aW9uIDI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYWQtbGVmdC1tZCBwYWQtcmlnaHQtbWRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIiBjbGFzcz1cXFwidGQtZGF0YS10YWJsZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ0ZC1kYXRhLXRhYmxlLWNvbHVtblxcXCIgKGNsaWNrKT1cXFwic29ydCgkZXZlbnQsIGNvbHVtbilcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cXFwiY29sdW1uLnRvb2x0aXBcXFwiICpuZ0Zvcj1cXFwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeEZsZXg9XFxcInt7Y29sdW1uLndpZHRofX1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVxcXCJjb2x1bW4uYWN0aXZlICYmIGNvbHVtbi5zb3J0YWJsZSAmJiBjb2x1bW4uc29ydE9yZGVyID09PSAnQVNDJ1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtdXBcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XFxcImNvbHVtbi5hY3RpdmUgJiYgY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0T3JkZXIgPT09ICdERVNDJ1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbHVtbi5sYWJlbH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInRkLWRhdGEtdGFibGUtY29sdW1uXFxcIiBmeEZsZXg9MTA+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cXFwicGFkLWxlZnQtc21cXFwiIFsobmdNb2RlbCldPVxcXCJhbGxSb3dzU2VsZWN0ZWRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWQpPVxcXCJhbGxSb3dzU2VsZWN0ZWRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdEFsbCgpXFxcIj48L21hdC1jaGVja2JveD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBjZW50ZXJcXFwiIGNsYXNzPVxcXCJ0ZC1kYXRhLXRhYmxlLXJvd1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVxcXCJ7J3NlbGVjdGVkJyA6IHJvdy5jaGVja2VkfVxcXCIgKm5nRm9yPVxcXCJsZXQgcm93IG9mIGZpbHRlcmVkRGF0YVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cXFwicm93LmNoZWNrZWQgPSAhcm93LmNoZWNrZWQ7dG9nZ2xlU2VsZWN0KHJvdylcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInRkLWRhdGEtdGFibGUtY2VsbFxcXCIgKm5nRm9yPVxcXCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeEZsZXg9XFxcInt7Y29sdW1uLndpZHRofX1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVxcXCJjb2x1bW4ubmFtZSAhPT0gJ2NvbW1lbnRzJyB8fCByb3dbJ2NvbW1lbnRzJ11cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb2x1bW4uZm9ybWF0ID8gY29sdW1uLmZvcm1hdChyb3dbY29sdW1uLm5hbWVdKSA6IHJvd1tjb2x1bW4ubmFtZV19fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ0ZC1kYXRhLXRhYmxlLWNlbGxcXFwiIGZ4RmxleD0xMD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cXFwicm93LmFjdGlvbnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cXFwicm93LmFjdGlvbnMubGVuZ3RoIDw9IDRcXFwiIGZ4TGF5b3V0PVxcXCJyb3dcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4TGF5b3V0QWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cXFwicm93LmNoZWNrZWQgPSAhcm93LmNoZWNrZWRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XFxcImxldCBhY3Rpb24gb2Ygcm93LmFjdGlvbnNcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVxcXCJ7e2FjdGlvbi50b29sdGlwfX1cXFwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cXFwiYWNjZW50XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cXFwiYWN0aW9uLmRpc2FibGVkID8gJycgOiBudWxsXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcInt7YWN0aW9uLmljb259fVxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVxcXCJwYWQtbGVmdC1zbVxcXCIgWyhuZ01vZGVsKV09XFxcInJvdy5jaGVja2VkXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVxcXCJyb3cuY2hlY2tlZFxcXCIgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdChyb3cpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cXFwicm93LmNoZWNrZWQgPSAhcm93LmNoZWNrZWQ7dG9nZ2xlU2VsZWN0KHJvdylcXFwiPjwvbWF0LWNoZWNrYm94PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVxcXCJyb3cuYWN0aW9ucy5sZW5ndGggPiA0XFxcIiBmeExheW91dD1cXFwicm93XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeExheW91dEFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XFxcInJvdy5jaGVja2VkID0gIXJvdy5jaGVja2VkXFxcIiBtYXRUb29sdGlwPVxcXCJBY3Rpb25zXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uIGNvbG9yPVxcXCJhY2NlbnRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJ0YWJsZUFjdGlvbk1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cXFwiZmEgZmEtZWxsaXBzaXMtaFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI3RhYmxlQWN0aW9uTWVudT1cXFwibWF0TWVudVxcXCIgW292ZXJsYXBUcmlnZ2VyXT1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cXFwibGV0IGFjdGlvbiBvZiByb3cuYWN0aW9uc1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVxcXCJ7e2FjdGlvbi50b29sdGlwfX1cXFwiIG1hdC1tZW51LWl0ZW1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVxcXCJhY3Rpb24uZGlzYWJsZWQgPyAnJyA6IG51bGxcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcInt7YWN0aW9uLmljb259fVxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7YWN0aW9uLm5hbWV9fTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVxcXCJwYWQtbGVmdC1zbVxcXCIgWyhuZ01vZGVsKV09XFxcInJvdy5jaGVja2VkXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVxcXCJyb3cuY2hlY2tlZFxcXCIgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdChyb3cpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cXFwicm93LmNoZWNrZWQgPSAhcm93LmNoZWNrZWQ7dG9nZ2xlU2VsZWN0KHJvdylcXFwiPjwvbWF0LWNoZWNrYm94PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVxcXCIhcm93LmFjdGlvbnNcXFwiIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cXFwicGFkLWxlZnQtc21cXFwiIFsobmdNb2RlbCldPVxcXCJyb3cuY2hlY2tlZFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVxcXCJyb3cuY2hlY2tlZFxcXCIgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdChyb3cpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVxcXCJyb3cuY2hlY2tlZCA9ICFyb3cuY2hlY2tlZDt0b2dnbGVTZWxlY3Qocm93KVxcXCI+PC9tYXQtY2hlY2tib3g+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtcGFkZGluZ1xcXCIgKm5nSWY9XFxcIiFmaWx0ZXJlZERhdGEubGVuZ3RoID4gMFxcXCIgbGF5b3V0PVxcXCJyb3dcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LWFsaWduPVxcXCJjZW50ZXIgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5ObyByZXN1bHRzIHRvIGRpc3BsYXkuPC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZC1wYWdpbmctYmFyICNwYWdpbmdCYXIgW2luaXRpYWxQYWdlXT1cXFwiMVxcXCIgW3BhZ2VTaXplXT1cXFwicGFnZVNpemVcXFwiIFt0b3RhbF09XFxcInBhZ2VDb3VudFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XFxcInBhZ2UoJGV2ZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBoaWRlLXhzPlJvdyBwZXIgcGFnZTo8L3NwYW4+IHt7cGFnaW5nQmFyLnJhbmdlfX0gPHNwYW5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGUteHM+b2Yge3twYWdpbmdCYXIudG90YWx9fTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZC1wYWdpbmctYmFyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+Q29kZTwvbmctdGVtcGxhdGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IVtDREFUQVtcXG4gICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwic3BhY2UtYmV0d2VlbiBjZW50ZXJcXFwiIGNsYXNzPVxcXCJwYWQtdG9wLW1kIHBhZC1ib3R0b20tc20gcGFkLWxlZnQtbWQgcGFkLXJpZ2h0LW1kXFxcIj5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGFibGUtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgIDxzcGFuPlRhYmxlIHRpdGxlPC9zcGFuPlxcbiAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8ZGl2IGZsZXggY2xhc3M9XFxcInB1c2gtcmlnaHQtc21cXFwiIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8dGQtY2hpcHMgW2l0ZW1zXT1cXFwiYXV0b0NvbXBsZXRlRGF0YVxcXCIgKGFkZCk9XFxcInNlYXJjaEFkZCgkZXZlbnQpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZSk9XFxcInNlYXJjaFJlbW92ZSgkZXZlbnQpXFxcIj48L3RkLWNoaXBzPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgbWF0LXJhaXNlZC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwiZGF0YVRhYmxlQWN0aW9uTWVudVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICBBY3Rpb25zPGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwiZmRzLXByaW1hcnktZHJvcGRvd24tYnV0dG9uLW1lbnVcXFwiICNkYXRhVGFibGVBY3Rpb25NZW51PVxcXCJtYXRNZW51XFxcIiBbb3ZlcmxhcFRyaWdnZXJdPVxcXCJmYWxzZVxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gT3B0aW9uIDEgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gT3B0aW9uIDIgPC9idXR0b24+XFxuICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFkLWxlZnQtbWQgcGFkLXJpZ2h0LW1kXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIiBjbGFzcz1cXFwidGQtZGF0YS10YWJsZVxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInRkLWRhdGEtdGFibGUtY29sdW1uXFxcIiAoY2xpY2spPVxcXCJzb3J0KCRldmVudCwgY29sdW1uKVxcXCIgW21hdFRvb2x0aXBdPVxcXCJjb2x1bW4udG9vbHRpcFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XFxcImxldCBjb2x1bW4gb2YgY29sdW1uc1xcXCIgZnhGbGV4PVxcXCJ7IHsgY29sdW1uLndpZHRoIH0gfVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICB7IHsgY29sdW1uLmxhYmVsIH0gfVxcbiAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XFxcImNvbHVtbi5hY3RpdmUgJiYgY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0T3JkZXIgPT09ICdBU0MnXFxcIiBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtdXBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XFxcImNvbHVtbi5hY3RpdmUgJiYgY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0T3JkZXIgPT09ICdERVNDJ1xcXCIgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidGQtZGF0YS10YWJsZS1jb2x1bW5cXFwiIGZ4RmxleD0xMD5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwiZW5kIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cXFwicGFkLWxlZnQtc21cXFwiIFsobmdNb2RlbCldPVxcXCJhbGxSb3dzU2VsZWN0ZWRcXFwiIChjaGVja2VkKT1cXFwiYWxsUm93c1NlbGVjdGVkXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdEFsbCgpXFxcIj48L21hdC1jaGVja2JveD5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2PlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcInNwYWNlLWJldHdlZW4gY2VudGVyXFxcIiBjbGFzcz1cXFwidGQtZGF0YS10YWJsZS1yb3dcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVxcXCJ7J3NlbGVjdGVkJyA6IHJvdy5jaGVja2VkfVxcXCIgKm5nRm9yPVxcXCJsZXQgcm93IG9mIGZpbHRlcmVkRGF0YVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVxcXCJyb3cuY2hlY2tlZCA9ICFyb3cuY2hlY2tlZDt0b2dnbGVTZWxlY3Qocm93KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ0ZC1kYXRhLXRhYmxlLWNlbGxcXFwiICpuZ0Zvcj1cXFwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXFxcIiBmeEZsZXg9XFxcInsgeyBjb2x1bW4ud2lkdGggfSB9XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVxcXCJjb2x1bW4ubmFtZSAhPT0gJ2NvbW1lbnRzJyB8fCByb3dbJ2NvbW1lbnRzJ11cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHsgY29sdW1uLmZvcm1hdCA/IGNvbHVtbi5mb3JtYXQocm93W2NvbHVtbi5uYW1lXSkgOiByb3dbY29sdW1uLm5hbWVdIH0gfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ0ZC1kYXRhLXRhYmxlLWNlbGxcXFwiIGZ4RmxleD0xMD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVxcXCJyb3cuYWN0aW9uc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XFxcInJvdy5hY3Rpb25zLmxlbmd0aCA8PSA0XFxcIiBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cXFwicm93LmNoZWNrZWQgPSAhcm93LmNoZWNrZWRcXFwiICpuZ0Zvcj1cXFwibGV0IGFjdGlvbiBvZiByb3cuYWN0aW9uc1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cXFwieyB7IGFjdGlvbi50b29sdGlwIH0gfVxcXCIgbWF0LWljb24tYnV0dG9uIGNvbG9yPVxcXCJhY2NlbnRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XFxcImFjdGlvbi5kaXNhYmxlZCA/ICcnIDogbnVsbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcInsgeyBhY3Rpb24uaWNvbiB9IH1cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggY2xhc3M9XFxcInBhZC1sZWZ0LXNtXFxcIiBbKG5nTW9kZWwpXT1cXFwicm93LmNoZWNrZWRcXFwiIFtjaGVja2VkXT1cXFwicm93LmNoZWNrZWRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVxcXCJ0b2dnbGVTZWxlY3Qocm93KVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cXFwicm93LmNoZWNrZWQgPSAhcm93LmNoZWNrZWQ7dG9nZ2xlU2VsZWN0KHJvdylcXFwiPjwvbWF0LWNoZWNrYm94PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cXFwicm93LmFjdGlvbnMubGVuZ3RoID4gNFxcXCIgZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwiZW5kIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XFxcInJvdy5jaGVja2VkID0gIXJvdy5jaGVja2VkXFxcIiBtYXRUb29sdGlwPVxcXCJBY3Rpb25zXFxcIiBtYXQtaWNvbi1idXR0b25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XFxcImFjY2VudFxcXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwidGFibGVBY3Rpb25NZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cXFwiZmEgZmEtZWxsaXBzaXMtaFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICN0YWJsZUFjdGlvbk1lbnU9XFxcIm1hdE1lbnVcXFwiIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cXFwibGV0IGFjdGlvbiBvZiByb3cuYWN0aW9uc1xcXCIgbWF0VG9vbHRpcD1cXFwieyB7IGFjdGlvbi50b29sdGlwIH0gfVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cXFwiYWN0aW9uLmRpc2FibGVkID8gJycgOiBudWxsXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcInsgeyBhY3Rpb24uaWNvbiB9IH1cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnsgeyBhY3Rpb24ubmFtZSB9IH08L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cXFwicGFkLWxlZnQtc21cXFwiIFsobmdNb2RlbCldPVxcXCJyb3cuY2hlY2tlZFxcXCIgW2NoZWNrZWRdPVxcXCJyb3cuY2hlY2tlZFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdChyb3cpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVxcXCJyb3cuY2hlY2tlZCA9ICFyb3cuY2hlY2tlZDt0b2dnbGVTZWxlY3Qocm93KVxcXCI+PC9tYXQtY2hlY2tib3g+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XFxcIiFyb3cuYWN0aW9uc1xcXCIgZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwiZW5kIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggY2xhc3M9XFxcInBhZC1sZWZ0LXNtXFxcIiBbKG5nTW9kZWwpXT1cXFwicm93LmNoZWNrZWRcXFwiIFtjaGVja2VkXT1cXFwicm93LmNoZWNrZWRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XFxcInRvZ2dsZVNlbGVjdChyb3cpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XFxcInJvdy5jaGVja2VkID0gIXJvdy5jaGVja2VkO3RvZ2dsZVNlbGVjdChyb3cpXFxcIj48L21hdC1jaGVja2JveD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtcGFkZGluZ1xcXCIgKm5nSWY9XFxcIiFmaWx0ZXJlZERhdGEubGVuZ3RoID4gMFxcXCIgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1hbGlnbj1cXFwiY2VudGVyIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgIDxoMz5ObyByZXN1bHRzIHRvIGRpc3BsYXkuPC9oMz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8dGQtcGFnaW5nLWJhciAjcGFnaW5nQmFyIFtpbml0aWFsUGFnZV09XFxcIjFcXFwiIFtwYWdlU2l6ZV09XFxcInBhZ2VTaXplXFxcIiBbdG90YWxdPVxcXCJwYWdlQ291bnRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XFxcInBhZ2UoJGV2ZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGhpZGUteHM+Um93IHBlciBwYWdlOjwvc3Bhbj4geyB7IHBhZ2luZ0Jhci5yYW5nZSB9IH0gPHNwYW4gaGlkZS14cz5vZiB7XFxuICAgICAgICAgICAgICAgIHsgcGFnaW5nQmFyLnRvdGFsIH0gfTwvc3Bhbj5cXG4gICAgICAgICAgICA8L3RkLXBhZ2luZy1iYXI+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgXV0+XFxuICAgICAgICAgICAgICAgICAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImphdmFzY3JpcHRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgdGhpcy5kYXRhVGFibGVTZXJ2aWNlID0gVGREYXRhVGFibGVTZXJ2aWNlO1xcblxcbiAgICAgICAgdGhpcy5kYXRhID0gW1xcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgJ2lkJzogMSxcXG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnRnJvemVuIHlvZ3VydCcsXFxuICAgICAgICAgICAgICAgICd0eXBlJzogJ0ljZSBjcmVhbScsXFxuICAgICAgICAgICAgICAgICdjYWxvcmllcyc6IDE1OS4wLFxcbiAgICAgICAgICAgICAgICAnZmF0JzogNi4wLFxcbiAgICAgICAgICAgICAgICAnY2FyYnMnOiAyNC4wLFxcbiAgICAgICAgICAgICAgICAncHJvdGVpbic6IDQuMCxcXG4gICAgICAgICAgICAgICAgJ3NvZGl1bSc6IDg3LjAsXFxuICAgICAgICAgICAgICAgICdjYWxjaXVtJzogMTQuMCxcXG4gICAgICAgICAgICAgICAgJ2lyb24nOiAxLjAsXFxuICAgICAgICAgICAgICAgICdjb21tZW50cyc6ICdJIGxvdmUgZnJveW8hJyxcXG4gICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbXFxuICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDEnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLXVzZXInLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ01hbmFnZSBVc2VycydcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdBY3Rpb24gMicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ljb24nOiAnZmEgZmEta2V5JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgUGVybWlzc2lvbnMnXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIF1cXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgJ2lkJzogMixcXG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnSWNlIGNyZWFtIHNhbmR3aWNoJyxcXG4gICAgICAgICAgICAgICAgJ3R5cGUnOiAnSWNlIGNyZWFtJyxcXG4gICAgICAgICAgICAgICAgJ2NhbG9yaWVzJzogMjM3LjAsXFxuICAgICAgICAgICAgICAgICdmYXQnOiA5LjAsXFxuICAgICAgICAgICAgICAgICdjYXJicyc6IDM3LjAsXFxuICAgICAgICAgICAgICAgICdwcm90ZWluJzogNC4zLFxcbiAgICAgICAgICAgICAgICAnc29kaXVtJzogMTI5LjAsXFxuICAgICAgICAgICAgICAgICdjYWxjaXVtJzogOC4wLFxcbiAgICAgICAgICAgICAgICAnaXJvbic6IDEuMCxcXG4gICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbXFxuICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDEnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLXVzZXInLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ01hbmFnZSBVc2VycydcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdBY3Rpb24gMicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ljb24nOiAnZmEgZmEta2V5JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgUGVybWlzc2lvbnMnXFxuICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDMnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ0FjdGlvbiAzJ1xcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbiA0JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGlzYWJsZWQnOiB0cnVlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ0FjdGlvbiA0J1xcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbiA1JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdBY3Rpb24gNSdcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgXVxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAnaWQnOiAzLFxcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdFY2xhaXInLFxcbiAgICAgICAgICAgICAgICAndHlwZSc6ICdQYXN0cnknLFxcbiAgICAgICAgICAgICAgICAnY2Fsb3JpZXMnOiAyNjIuMCxcXG4gICAgICAgICAgICAgICAgJ2ZhdCc6IDE2LjAsXFxuICAgICAgICAgICAgICAgICdjYXJicyc6IDI0LjAsXFxuICAgICAgICAgICAgICAgICdwcm90ZWluJzogNi4wLFxcbiAgICAgICAgICAgICAgICAnc29kaXVtJzogMzM3LjAsXFxuICAgICAgICAgICAgICAgICdjYWxjaXVtJzogNi4wLFxcbiAgICAgICAgICAgICAgICAnaXJvbic6IDcuMCxcXG4gICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbiAxJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnaWNvbic6ICdmYSBmYS11c2VyJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgVXNlcnMnXFxuICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDInLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLWtleScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Rvb2x0aXAnOiAnTWFuYWdlIFBlcm1pc3Npb25zJ1xcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbiAzJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdBY3Rpb24gMydcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdBY3Rpb24gNCcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc2FibGVkJzogdHJ1ZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdBY3Rpb24gNCdcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdBY3Rpb24gNScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Rvb2x0aXAnOiAnQWN0aW9uIDUnXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICdpZCc6IDQsXFxuICAgICAgICAgICAgICAgICduYW1lJzogJ0N1cGNha2UnLFxcbiAgICAgICAgICAgICAgICAndHlwZSc6ICdQYXN0cnknLFxcbiAgICAgICAgICAgICAgICAnY2Fsb3JpZXMnOiAzMDUuMCxcXG4gICAgICAgICAgICAgICAgJ2ZhdCc6IDMuNyxcXG4gICAgICAgICAgICAgICAgJ2NhcmJzJzogNjcuMCxcXG4gICAgICAgICAgICAgICAgJ3Byb3RlaW4nOiA0LjMsXFxuICAgICAgICAgICAgICAgICdzb2RpdW0nOiA0MTMuMCxcXG4gICAgICAgICAgICAgICAgJ2NhbGNpdW0nOiAzLjAsXFxuICAgICAgICAgICAgICAgICdpcm9uJzogOC4wLFxcbiAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDEnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpY29uJzogJ2ZhIGZhLXVzZXInLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ01hbmFnZSBVc2VycydcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdBY3Rpb24gMicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ljb24nOiAnZmEgZmEta2V5JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgUGVybWlzc2lvbnMnXFxuICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQWN0aW9uIDMnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ0FjdGlvbiAzJ1xcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbiA0JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGlzYWJsZWQnOiB0cnVlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b29sdGlwJzogJ0FjdGlvbiA0J1xcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbiA1JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9vbHRpcCc6ICdBY3Rpb24gNSdcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgXSxcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgJ2lkJzogNSxcXG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnSmVsbHkgYmVhbicsXFxuICAgICAgICAgICAgICAgICd0eXBlJzogJ0NhbmR5JyxcXG4gICAgICAgICAgICAgICAgJ2NhbG9yaWVzJzogMzc1LjAsXFxuICAgICAgICAgICAgICAgICdmYXQnOiAwLjAsXFxuICAgICAgICAgICAgICAgICdjYXJicyc6IDk0LjAsXFxuICAgICAgICAgICAgICAgICdwcm90ZWluJzogMC4wLFxcbiAgICAgICAgICAgICAgICAnc29kaXVtJzogNTAuMCxcXG4gICAgICAgICAgICAgICAgJ2NhbGNpdW0nOiAwLjAsXFxuICAgICAgICAgICAgICAgICdpcm9uJzogMC4wLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAnaWQnOiA2LFxcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdMb2xsaXBvcCcsXFxuICAgICAgICAgICAgICAgICd0eXBlJzogJ0NhbmR5JyxcXG4gICAgICAgICAgICAgICAgJ2NhbG9yaWVzJzogMzkyLjAsXFxuICAgICAgICAgICAgICAgICdmYXQnOiAwLjIsXFxuICAgICAgICAgICAgICAgICdjYXJicyc6IDk4LjAsXFxuICAgICAgICAgICAgICAgICdwcm90ZWluJzogMC4wLFxcbiAgICAgICAgICAgICAgICAnc29kaXVtJzogMzguMCxcXG4gICAgICAgICAgICAgICAgJ2NhbGNpdW0nOiAwLjAsXFxuICAgICAgICAgICAgICAgICdpcm9uJzogMi4wLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAnaWQnOiA3LFxcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdIb25leWNvbWInLFxcbiAgICAgICAgICAgICAgICAndHlwZSc6ICdPdGhlcicsXFxuICAgICAgICAgICAgICAgICdjYWxvcmllcyc6IDQwOC4wLFxcbiAgICAgICAgICAgICAgICAnZmF0JzogMy4yLFxcbiAgICAgICAgICAgICAgICAnY2FyYnMnOiA4Ny4wLFxcbiAgICAgICAgICAgICAgICAncHJvdGVpbic6IDYuNSxcXG4gICAgICAgICAgICAgICAgJ3NvZGl1bSc6IDU2Mi4wLFxcbiAgICAgICAgICAgICAgICAnY2FsY2l1bSc6IDAuMCxcXG4gICAgICAgICAgICAgICAgJ2lyb24nOiA0NS4wLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAnaWQnOiA4LFxcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdEb251dCcsXFxuICAgICAgICAgICAgICAgICd0eXBlJzogJ1Bhc3RyeScsXFxuICAgICAgICAgICAgICAgICdjYWxvcmllcyc6IDQ1Mi4wLFxcbiAgICAgICAgICAgICAgICAnZmF0JzogMjUuMCxcXG4gICAgICAgICAgICAgICAgJ2NhcmJzJzogNTEuMCxcXG4gICAgICAgICAgICAgICAgJ3Byb3RlaW4nOiA0LjksXFxuICAgICAgICAgICAgICAgICdzb2RpdW0nOiAzMjYuMCxcXG4gICAgICAgICAgICAgICAgJ2NhbGNpdW0nOiAyLjAsXFxuICAgICAgICAgICAgICAgICdpcm9uJzogMjIuMCxcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgJ2lkJzogOSxcXG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnS2l0S2F0JyxcXG4gICAgICAgICAgICAgICAgJ3R5cGUnOiAnQ2FuZHknLFxcbiAgICAgICAgICAgICAgICAnY2Fsb3JpZXMnOiA1MTguMCxcXG4gICAgICAgICAgICAgICAgJ2ZhdCc6IDI2LjAsXFxuICAgICAgICAgICAgICAgICdjYXJicyc6IDY1LjAsXFxuICAgICAgICAgICAgICAgICdwcm90ZWluJzogNy4wLFxcbiAgICAgICAgICAgICAgICAnc29kaXVtJzogNTQuMCxcXG4gICAgICAgICAgICAgICAgJ2NhbGNpdW0nOiAxMi4wLFxcbiAgICAgICAgICAgICAgICAnaXJvbic6IDYuMCxcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgJ2lkJzogMTAsXFxuICAgICAgICAgICAgICAgICduYW1lJzogJ0Nob2NvbGF0ZScsXFxuICAgICAgICAgICAgICAgICd0eXBlJzogJ0NhbmR5JyxcXG4gICAgICAgICAgICAgICAgJ2NhbG9yaWVzJzogNTE4LjAsXFxuICAgICAgICAgICAgICAgICdmYXQnOiAyNi4wLFxcbiAgICAgICAgICAgICAgICAnY2FyYnMnOiA2NS4wLFxcbiAgICAgICAgICAgICAgICAncHJvdGVpbic6IDcuMCxcXG4gICAgICAgICAgICAgICAgJ3NvZGl1bSc6IDU0LjAsXFxuICAgICAgICAgICAgICAgICdjYWxjaXVtJzogMTIuMCxcXG4gICAgICAgICAgICAgICAgJ2lyb24nOiA2LjAsXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICdpZCc6IDExLFxcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDaGFtb3knLFxcbiAgICAgICAgICAgICAgICAndHlwZSc6ICdDYW5keScsXFxuICAgICAgICAgICAgICAgICdjYWxvcmllcyc6IDUxOC4wLFxcbiAgICAgICAgICAgICAgICAnZmF0JzogMjYuMCxcXG4gICAgICAgICAgICAgICAgJ2NhcmJzJzogNjUuMCxcXG4gICAgICAgICAgICAgICAgJ3Byb3RlaW4nOiA3LjAsXFxuICAgICAgICAgICAgICAgICdzb2RpdW0nOiA1NC4wLFxcbiAgICAgICAgICAgICAgICAnY2FsY2l1bSc6IDEyLjAsXFxuICAgICAgICAgICAgICAgICdpcm9uJzogNi4wLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIF07XFxuXFxuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IHRoaXMuZGF0YTtcXG4gICAgICAgIHRoaXMuZmlsdGVyZWRUb3RhbCA9IHRoaXMuZGF0YS5sZW5ndGg7XFxuXFxuICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXFxuICAgICAgICAgICAgeyBuYW1lOiAnY29tbWVudHMnLCBsYWJlbDogJ0NvbW1lbnRzJyB9LFxcbiAgICAgICAgICAgIHsgbmFtZTogJ25hbWUnLCBsYWJlbDogJ0Rlc3NlcnQgKDEwMGcgc2VydmluZyknLCBzb3J0YWJsZTogdHJ1ZSB9LFxcbiAgICAgICAgICAgIHsgbmFtZTogJ3R5cGUnLCBsYWJlbDogJ1R5cGUnLCBzb3J0YWJsZTogdHJ1ZSB9LFxcbiAgICAgICAgICAgIHsgbmFtZTogJ2NhbG9yaWVzJywgbGFiZWw6ICdDYWxvcmllcycsIG51bWVyaWM6IHRydWUsIGZvcm1hdDogTlVNQkVSX0ZPUk1BVCwgc29ydGFibGU6IHRydWUgfSxcXG4gICAgICAgICAgICB7IG5hbWU6ICdmYXQnLCBsYWJlbDogJ0ZhdCAoZyknLCBudW1lcmljOiB0cnVlLCBmb3JtYXQ6IERFQ0lNQUxfRk9STUFULCBzb3J0YWJsZTogdHJ1ZSB9LFxcbiAgICAgICAgICAgIHsgbmFtZTogJ2NhcmJzJywgbGFiZWw6ICdDYXJicyAoZyknLCBudW1lcmljOiB0cnVlLCBmb3JtYXQ6IE5VTUJFUl9GT1JNQVQsIHNvcnRhYmxlOiB0cnVlIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgIG5hbWU6ICdwcm90ZWluJywgbGFiZWw6ICdQcm90ZWluIChnKScsIG51bWVyaWM6IHRydWUsIGZvcm1hdDogREVDSU1BTF9GT1JNQVQsIHNvcnRhYmxlOiB0cnVlIH0sXFxuICAgICAgICAgICAgeyBuYW1lOiAnc29kaXVtJywgbGFiZWw6ICdTb2RpdW0gKG1nKScsIG51bWVyaWM6IHRydWUsIGZvcm1hdDogTlVNQkVSX0ZPUk1BVCwgc29ydGFibGU6IHRydWUgfSxcXG4gICAgICAgICAgICB7bmFtZTogJ2NhbGNpdW0nLCBsYWJlbDogJ0NhbGNpdW0gKCUpJywgbnVtZXJpYzogdHJ1ZSwgZm9ybWF0OiBOVU1CRVJfRk9STUFULCBzb3J0YWJsZTogdHJ1ZSB9LFxcbiAgICAgICAgICAgIHsgbmFtZTogJ2lyb24nLCBsYWJlbDogJ0lyb24gKCUpJywgbnVtZXJpYzogdHJ1ZSwgZm9ybWF0OiBOVU1CRVJfRk9STUFUIH0sXFxuICAgICAgICBdO1xcblxcbiAgICAgICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcXG4gICAgICAgIHRoaXMuYXV0b0NvbXBsZXRlRGF0YSA9IFtdO1xcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBbXTtcXG5cXG4gICAgICAgIHRoaXMuc2VhcmNoVGVybSA9IFtdO1xcbiAgICAgICAgdGhpcy5mcm9tUm93ID0gMTtcXG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IDU7XFxuXFxuICAgICAgICAuLi5cXG5cXG4gICAgICAgIHNvcnQ6IGZ1bmN0aW9uKHNvcnRFdmVudCwgY29sdW1uKSB7XFxuICAgICAgICAgICAgaWYgKGNvbHVtbi5zb3J0YWJsZSkge1xcbiAgICAgICAgICAgICAgICB2YXIgc29ydEJ5ID0gY29sdW1uLm5hbWU7XFxuICAgICAgICAgICAgICAgIHZhciBzb3J0T3JkZXIgPSBjb2x1bW4uc29ydE9yZGVyID0gKGNvbHVtbi5zb3J0T3JkZXIgPT09ICdBU0MnKSA/ICdERVNDJyA6ICdBU0MnO1xcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcihzb3J0QnksIHNvcnRPcmRlcik7XFxuXFxuICAgICAgICAgICAgICAgIC8vb25seSBvbmUgY29sdW1uIGNhbiBiZSBhY3RpdmVseSBzb3J0ZWQgc28gd2UgcmVzZXQgYWxsIHRvIGluYWN0aXZlXFxuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGMgPT4gYy5hY3RpdmUgPSBmYWxzZSk7XFxuXFxuICAgICAgICAgICAgICAgIC8vYW5kIHNldCB0aGlzIGNvbHVtbiBhcyB0aGUgYWN0aXZlbHkgc29ydGVkIGNvbHVtblxcbiAgICAgICAgICAgICAgICBjb2x1bW4uYWN0aXZlID0gdHJ1ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgc2VhcmNoUmVtb3ZlOiBmdW5jdGlvbihzZWFyY2hUZXJtKSB7XFxuICAgICAgICAgICAgLy9vbmx5IHJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc2VhcmNoIHRlcm1cXG4gICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLnNlYXJjaFRlcm0uaW5kZXhPZihzZWFyY2hUZXJtKTtcXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGVybS5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLmZpbHRlcigpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHNlYXJjaEFkZDogZnVuY3Rpb24oc2VhcmNoVGVybSkge1xcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGVybS5wdXNoKHNlYXJjaFRlcm0pO1xcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyKCk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgcGFnZTogZnVuY3Rpb24ocGFnaW5nRXZlbnQpIHtcXG4gICAgICAgICAgICB0aGlzLmZyb21Sb3cgPSBwYWdpbmdFdmVudC5mcm9tUm93O1xcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdpbmdFdmVudC5wYWdlO1xcbiAgICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBwYWdpbmdFdmVudC5wYWdlU2l6ZTtcXG4gICAgICAgICAgICB0aGlzLmZpbHRlcigpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIGZpbHRlckRhdGE6IGZ1bmN0aW9uKGRhdGEsIHNlYXJjaFRlcm0sIGlnbm9yZUNhc2UpIHtcXG4gICAgICAgICAgICB2YXIgZmllbGQgPSAnJztcXG4gICAgICAgICAgICBpZiAoc2VhcmNoVGVybS5pbmRleE9mKFxcXCI6XFxcIikgPiAtMSkge1xcbiAgICAgICAgICAgICAgICBmaWVsZCA9IHNlYXJjaFRlcm0uc3BsaXQoJzonKVswXS50cmltKCk7XFxuICAgICAgICAgICAgICAgIHNlYXJjaFRlcm0gPSBzZWFyY2hUZXJtLnNwbGl0KCc6JylbMV0udHJpbSgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB2YXIgZmlsdGVyID0gc2VhcmNoVGVybSA/IChpZ25vcmVDYXNlID8gc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpIDogc2VhcmNoVGVybSkgOiAnJztcXG5cXG4gICAgICAgICAgICBpZiAoZmlsdGVyKSB7XFxuICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBPYmplY3Qua2V5cyhpdGVtKS5maW5kKChrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZihcXFwiLlxcXCIpID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iakFycmF5ID0gZmllbGQuc3BsaXQoXFxcIi5cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IGl0ZW07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnJheUxlbmd0aCA9IG9iakFycmF5Lmxlbmd0aDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IG9ialtvYmpBcnJheVtpXV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmVJdGVtVmFsdWUgPSAoJycgKyBvYmopO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbVZhbHVlID0gaWdub3JlQ2FzZSA/IHByZUl0ZW1WYWx1ZS50b0xvd2VyQ2FzZSgpIDogcHJlSXRlbVZhbHVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVZhbHVlLmluZGV4T2YoZmlsdGVyKSA+IC0xO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT09IGZpZWxkICYmIGZpZWxkICE9PSAnJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmVJdGVtVmFsdWUgPSAoJycgKyBpdGVtW2tleV0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbVZhbHVlID0gaWdub3JlQ2FzZSA/IHByZUl0ZW1WYWx1ZS50b0xvd2VyQ2FzZSgpIDogcHJlSXRlbVZhbHVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVZhbHVlLmluZGV4T2YoZmlsdGVyKSA+IC0xO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEodHlwZW9mIHJlcyA9PT0gJ3VuZGVmaW5lZCcpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgZmlsdGVyOiBmdW5jdGlvbihzb3J0QnksIHNvcnRPcmRlcikge1xcbiAgICAgICAgICAgIGlmICh0aGlzLmFsbFJvd3NTZWxlY3RlZCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZVNlbGVjdEFsbCgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0QWxsKCk7XFxuICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSB0aGlzLmRhdGE7XFxuXFxuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGVybS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZWFyY2hUZXJtLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICAvL2FjY291bnQgZm9yIGNvbHVtbi9maWVsZCBuYW1lIHNwZWNpZmljIHNlYXJjaCBzeW50YXhcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFRlcm1baV0uaW5kZXhPZihcXFwiOlxcXCIpID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhID0gdGhpcy5maWx0ZXJEYXRhKG5ld0RhdGEsIHRoaXMuc2VhcmNoVGVybVtpXS5zcGxpdCgnOicpWzFdLnRyaW0oKSwgdHJ1ZSwgdGhpcy5zZWFyY2hUZXJtW2ldLnNwbGl0KCc6JylbMF0udHJpbSgpKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vb3RoZXJ3aXNlIHNlYXJjaCBhbGwgY2VsbHNcXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhID0gdGhpcy5maWx0ZXJEYXRhKG5ld0RhdGEsIHRoaXMuc2VhcmNoVGVybVtpXSwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBuZXdEYXRhID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmZpbHRlckRhdGEobmV3RGF0YSwgJycsIHRydWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkVG90YWwgPSBuZXdEYXRhLmxlbmd0aDtcXG4gICAgICAgICAgICBuZXdEYXRhID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLnNvcnREYXRhKG5ld0RhdGEsIHNvcnRCeSwgc29ydE9yZGVyKTtcXG4gICAgICAgICAgICBuZXdEYXRhID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLnBhZ2VEYXRhKG5ld0RhdGEsIHRoaXMuZnJvbVJvdywgdGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucGFnZVNpemUpO1xcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gbmV3RGF0YTtcXG4gICAgICAgICAgICB0aGlzLmdldEF1dG9Db21wbGV0ZURhdGEoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICB0b2dnbGVTZWxlY3Q6IGZ1bmN0aW9uKHJvdykge1xcbiAgICAgICAgICAgIGlmICghcm93LmNoZWNrZWQpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbGxGaWx0ZXJlZFJvd3NTZWxlY3RlZCgpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IHRydWU7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHRvZ2dsZVNlbGVjdEFsbDogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSAhdGhpcy5hbGxSb3dzU2VsZWN0ZWQ7XFxuICAgICAgICAgICAgaWYgKHRoaXMuYWxsUm93c1NlbGVjdGVkKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsKCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdEFsbCgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBzZWxlY3RBbGw6IGZ1bmN0aW9uKCkge1xcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREYXRhLmZvckVhY2goYyA9PiBjLmNoZWNrZWQgPSB0cnVlKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBkZXNlbGVjdEFsbDogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEuZm9yRWFjaChjID0+IGMuY2hlY2tlZCA9IGZhbHNlKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBhbGxGaWx0ZXJlZFJvd3NTZWxlY3RlZDogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgdmFyIGFsbEZpbHRlcmVkUm93c1NlbGVjdGVkID0gdHJ1ZTtcXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGMpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGMuY2hlY2tlZCA9PT0gdW5kZWZpbmVkIHx8IGMuY2hlY2tlZCA9PT0gZmFsc2UpIHtcXG4gICAgICAgICAgICAgICAgICAgIGFsbEZpbHRlcmVkUm93c1NlbGVjdGVkID0gZmFsc2U7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICByZXR1cm4gYWxsRmlsdGVyZWRSb3dzU2VsZWN0ZWQ7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgYXJlVG9vbHRpcHNPbjogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uc1swXS5oYXNPd25Qcm9wZXJ0eSgndG9vbHRpcCcpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHRvZ2dsZVRvb2x0aXBzOiBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICBpZiAodGhpcy5jb2x1bW5zWzBdLnRvb2x0aXApIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goYyA9PiBkZWxldGUgYy50b29sdGlwKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjID0+IGMudG9vbHRpcCA9IGBUaGlzIGlzICR7Yy5sYWJlbH0hYCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIG9wZW5EYXRhVGFibGVQcm9tcHQ6IGZ1bmN0aW9uKHJvdywgbmFtZSkge1xcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuUHJvbXB0KHtcXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0VudGVyIGNvbW1lbnQ/JyxcXG4gICAgICAgICAgICAgICAgdmFsdWU6IHJvd1tuYW1lXSxcXG4gICAgICAgICAgICB9KS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XFxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgICAgICByb3dbbmFtZV0gPSB2YWx1ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9LFxcblxcbiAgICAgICAgZ2V0QXV0b0NvbXBsZXRlRGF0YTogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgdGhpcy5hdXRvQ29tcGxldGVEYXRhID0gW107XFxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goYyA9PiB0aGlzLmZpbHRlcmVkRGF0YS5mb3JFYWNoKHIgPT4gKHJbYy5uYW1lLnRvTG93ZXJDYXNlKCldKSA/IHRoaXMuYXV0b0NvbXBsZXRlRGF0YS5wdXNoKHJbYy5uYW1lLnRvTG93ZXJDYXNlKCldLnRvU3RyaW5nKCkpOicnKSk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLWFjdGlvbnM+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0VG9vbHRpcD1cXFwiQ29sdW1uIGZpZWxkIG5hbWUgdG9vbHRpcHMgdG9nZ2xlLlxcXCIgbWF0LWJ1dHRvbiBjb2xvcj1cXFwicHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwidG9nZ2xlVG9vbHRpcHMoKVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9vbHRpcHMgKHt7YXJlVG9vbHRpcHNPbigpID8gJ09OJyA6ICdPRkYnfX0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIkNoZWNrYm94ZXNcXFwiPkNoZWNrYm94IDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJDaGVja2JveGVzXFxcIj5saW5rPC9tYXQtaWNvbj48L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkJhc2ljIFVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGlzdD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1saXN0LWl0ZW0gKm5nRm9yPVxcXCJsZXQgZ3JvY2VyeSBvZiBncm9jZXJpZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cXFwiZ3JvY2VyeS5ib3VnaHRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tncm9jZXJ5Lm5hbWV9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGlzdD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IVtDREFUQVtcXG4gICAgICAgIDwhLS0gQmFzaWMgVXNhZ2UgLS0+XFxuICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cXFwiZ3JvY2VyeS5ib3VnaHRcXFwiPlxcbiAgICAgICAgICAgIHsge2dyb2NlcnkubmFtZX0gfVxcbiAgICAgICAgPC9tYXQtY2hlY2tib3g+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJqYXZhc2NyaXB0XFxcIj5cXG4gICAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgdGhpcy5ncm9jZXJpZXMgPSBbXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICBib3VnaHQ6IHRydWUsXFxuICAgICAgICAgICAgICAgIG5hbWU6ICdTZWl0YW4nLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICBib3VnaHQ6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICBuYW1lOiAnQWxtb25kIE1lYWwgRmxvdXInLFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICBib3VnaHQ6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICBuYW1lOiAnT3JnYW5pYyBFZ2dzJyxcXG4gICAgICAgICAgICB9XFxuICAgICAgICBdO1xcbiAgICAgICAgXV0+XFxuICAgICAgICAgICAgICAgICAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZSB3aXRoaW4gRm9ybXM8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGZsZXg9XFxcImluaXRpYWxcXFwiIFsobmdNb2RlbCldPVxcXCJ1c2VyLmFncmVlc1RvVE9TXFxcIiBuYW1lPVxcXCJhZ3JlZXNUb1RPU1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBhZ3JlZSB0byB0aGUgdGVybXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXNlY29uZGFyeVxcXCIgW2Rpc2FibGVkXT1cXFwiIXVzZXIuYWdyZWVzVG9UT1NcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJwYWQtcmlnaHQtc21cXFwiIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5TaWduIFVwXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCIgY2xhc3M9XFxcInBhZC10b3Atc20gcGFkLWJvdHRvbS1zbVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGxhYmVsUG9zaXRpb249XFxcImFmdGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIGNvbWUgYWZ0ZXIgbXkgbGFiZWwuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCIgY2xhc3M9XFxcInBhZC10b3Atc20gcGFkLWJvdHRvbS1zbVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGxhYmVsUG9zaXRpb249XFxcImJlZm9yZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBjb21lIGJlZm9yZSBteSBsYWJlbFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgICA8IVtDREFUQVtcXG4gICAgICAgIDwhLS0gVXNhZ2Ugd2l0aGluIEZvcm1zIC0tPlxcbiAgICAgICAgPGZvcm0+XFxuICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LWFsaWduPVxcXCJzdGFydCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGZsZXg9XFxcImluaXRpYWxcXFwiIFsobmdNb2RlbCldPVxcXCJ1c2VyLmFncmVlc1RvVE9TXFxcIiBuYW1lPVxcXCJhZ3JlZXNUb1RPU1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICBJIGFncmVlIHRvIHRoZSB0ZXJtc1xcbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXNlY29uZGFyeVxcXCIgW2Rpc2FibGVkXT1cXFwiIXVzZXIuYWdyZWVzVG9UT1NcXFwiIGNsYXNzPVxcXCJwYWQtcmlnaHQtc21cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlNpZ24gVXA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCIgY2xhc3M9XFxcInBhZC10b3Atc20gcGFkLWJvdHRvbS1zbVxcXCI+XFxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggbGFiZWxQb3NpdGlvbj1cXFwiYWZ0ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgSSBjb21lIGFmdGVyIG15IGxhYmVsLlxcbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ249XFxcInN0YXJ0IGNlbnRlclxcXCIgY2xhc3M9XFxcInBhZC10b3Atc20gcGFkLWJvdHRvbS1zbVxcXCI+XFxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggbGFiZWxQb3NpdGlvbj1cXFwiYmVmb3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIEkgY29tZSBiZWZvcmUgbXkgbGFiZWxcXG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICA8L2Zvcm0+XFxuICAgICAgICBdXT5cXG4gICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkphdmFzY3JpcHQ6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiamF2YXNjcmlwdFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICB0aGlzLnVzZXIgPSB7XFxuICAgICAgICAgICAgYWdyZWVzVG9UT1M6IGZhbHNlXFxuICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgICAgICAgIF1dPlxcbiAgICAgICAgICAgICAgICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJSYWRpb3NcXFwiPlJhZGlvcyA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiUmFkaW9zXFxcIj5saW5rPC9tYXQtaWNvbj48L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50IGxheW91dD1cXFwicm93XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBmbGV4PVxcXCI0OFxcXCIgY2xhc3M9XFxcInBhZC1yaWdodFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIEJhc2ljIFJhZGlvcyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkJhc2ljIFJhZGlvczwvaDM+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIG5hbWU9XFxcImdyb3VwMVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XFxcInBhZC1yaWdodC1zbVxcXCIgbmFtZT1cXFwiZ3JvdXAxXFxcIj5PcHRpb24gMTwvbWF0LXJhZGlvLWJ1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cXFwicGFkLXJpZ2h0LXNtXFxcIiBuYW1lPVxcXCJncm91cDFcXFwiPk9wdGlvbiAyPC9tYXQtcmFkaW8tYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNsYXNzPVxcXCJwYWQtcmlnaHQtc21cXFwiIG5hbWU9XFxcImdyb3VwMVxcXCIgZGlzYWJsZWQ9XFxcInRydWVcXFwiPk9wdGlvbiAzIChkaXNhYmxlZClcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICAgICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8IS0tIEJhc2ljIFJhZGlvcyAtLT5cXG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgbmFtZT1cXFwiZ3JvdXAxXFxcIj5cXG4gICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cXFwicGFkLXJpZ2h0LXNtXFxcIiBuYW1lPVxcXCJncm91cDFcXFwiPk9wdGlvbiAxIDwvbWF0LXJhZGlvLWJ1dHRvbj5cXG4gICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cXFwicGFkLXJpZ2h0LXNtXFxcIiBuYW1lPVxcXCJncm91cDFcXFwiPk9wdGlvbiAyIDwvbWF0LXJhZGlvLWJ1dHRvbj5cXG4gICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cXFwicGFkLXJpZ2h0LXNtXFxcIiBuYW1lPVxcXCJncm91cDFcXFwiIGRpc2FibGVkPVxcXCJ0cnVlXFxcIj5PcHRpb24gMyAoZGlzYWJsZWQpIDwvbWF0LXJhZGlvLWJ1dHRvbj5cXG4gICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxcbiAgICAgICAgICAgICAgICBdXT5cXG4gICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBmbGV4PVxcXCI0OFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIER5bmFtaWMgUmFkaW9zIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+RHluYW1pYyBSYWRpb3M8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBuYW1lPVxcXCJtb3JlX29wdGlvbnNcXFwiIFsobmdNb2RlbCldPVxcXCJmYXZvcml0ZVNlYXNvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XFxcImZkcy1yYWRpbyBwYWQtcmlnaHQtc21cXFwiICpuZ0Zvcj1cXFwibGV0IHNlYXNvbiBvZiBzZWFzb25PcHRpb25zXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XFxcIm1vcmVfb3B0aW9uc1xcXCIgW3ZhbHVlXT1cXFwic2Vhc29uXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzZWFzb259fVxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxcbiAgICAgICAgICAgICAgICAgICAgPHA+WW91ciBmYXZvcml0ZSBzZWFzb24gaXM6IDxzdHJvbmc+e3tmYXZvcml0ZVNlYXNvbn19PC9zdHJvbmc+PC9wPlxcbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPCEtLSBEeW5hbWljIFJhZGlvcyAtLT5cXG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgbmFtZT1cXFwibW9yZV9vcHRpb25zXFxcIiBbKG5nTW9kZWwpXT1cXFwiZmF2b3JpdGVTZWFzb25cXFwiPlxcbiAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cXFwiZmRzLXJhZGlvXFxcIiAqbmdGb3I9XFxcImxldCBzZWFzb24gb2Ygc2Vhc29uT3B0aW9uc1xcXCIgbmFtZT1cXFwibW9yZV9vcHRpb25zXFxcIiBbdmFsdWVdPVxcXCJzZWFzb25cXFwiPlxcbiAgICAgICAgICAgIHsge3NlYXNvbn0gfVxcbiAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XFxuICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cXG4gICAgICAgIDxwPllvdXIgZmF2b3JpdGUgc2Vhc29uIGlzOiA8c3Ryb25nPnsgeyBmYXZvcml0ZVNlYXNvbiB9IH08L3N0cm9uZz48L3A+XFxuICAgICAgXV0+XFxuICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiamF2YXNjcmlwdFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuXFxuICAgICAgICB0aGlzLmZhdm9yaXRlU2Vhc29uID0gJ0F1dHVtbic7XFxuXFxuICAgICAgICB0aGlzLnNlYXNvbk9wdGlvbnMgPSBbXFxuICAgICAgICAgICAgJ1dpbnRlcicsXFxuICAgICAgICAgICAgJ1NwcmluZycsXFxuICAgICAgICAgICAgJ1N1bW1lcicsXFxuICAgICAgICAgICAgJ0F1dHVtbicsXFxuICAgICAgICBdO1xcbiAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIlRvb2x0aXBzXFxcIj5Ub29sdGlwcyA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiVG9vbHRpcHNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBtYXRUb29sdGlwPVxcXCJJIHNob3cgYWJvdmVcXFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cXFwiYWJvdmVcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkFib3ZlIFRvb2x0aXBcXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBtYXRUb29sdGlwPVxcXCJJIHNob3cgYWZ0ZXJcXFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cXFwiYWZ0ZXJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkFmdGVyIFRvb2x0aXBcXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBtYXRUb29sdGlwPVxcXCJJIHNob3cgYmVsb3dcXFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cXFwiYmVsb3dcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkJlbG93IFRvb2x0aXBcXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBtYXRUb29sdGlwPVxcXCJJIHNob3cgYmVmb3JlXFxcIiBtYXRUb29sdGlwUG9zaXRpb249XFxcImJlZm9yZVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+QmVmb3JlIFRvb2x0aXBcXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgbWF0VG9vbHRpcD1cXFwiSSBzaG93IGFib3ZlXFxcIiBtYXRUb29sdGlwUG9zaXRpb249XFxcImFib3ZlXFxcIlxcbiAgICAgICAgICAgICAgICBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+Qm90dG9tIFRvb2x0aXA8L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBtYXRUb29sdGlwPVxcXCJJIHNob3cgYWZ0ZXJcXFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cXFwiYWZ0ZXJcXFwiXFxuICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5Cb3R0b20gVG9vbHRpcDwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIG1hdFRvb2x0aXA9XFxcIkkgc2hvdyBiZWxvd1xcXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVxcXCJiZWxvd1xcXCJcXG4gICAgICAgICAgICAgICAgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkJvdHRvbSBUb29sdGlwPC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgbWF0VG9vbHRpcD1cXFwiSSBzaG93IGJlZm9yZVxcXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVxcXCJiZWZvcmVcXFwiXFxuICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5Cb3R0b20gVG9vbHRpcDwvYnV0dG9uPlxcbiAgICAgICAgXV0+XFxuICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJQYW5lbHNcXFwiPlBhbmVscyA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiUGFuZWxzXFxcIj5saW5rPC9tYXQtaWNvbj48L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5TdGFuZGFyZCBDYXJkPC9oMz5cXG4gICAgICAgICAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwiZmRzLXBhbmVsLW1lbnUtYnV0dG9uXFxcIiBtYXRUb29sdGlwPVxcXCJTdGFuZGFyZCBDYXJkIE1lbnVcXFwiIG1hdC1pY29uLWJ1dHRvblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJzdGFuZGFyZENhcmRNZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cXFwiZmEgZmEtZWxsaXBzaXMtdiBcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwicHJpbWFyeS1pY29uLWJ1dHRvbi1tZW51XFxcIiAjc3RhbmRhcmRDYXJkTWVudT1cXFwibWF0TWVudVxcXCIgW292ZXJsYXBUcmlnZ2VyXT1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+T3B0aW9uMTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk9wdGlvbjI8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5UaXRsZTwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQ8L3A+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQtYWN0aW9ucyBmeExheW91dD1cXFwicm93XFxcIiBmeExheW91dEFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkFjdGlvbjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxcbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgICAgICAgICAgICA8IVtDREFUQVtcXG4gICAgICAgIDwhLS0gQmFzaWMgQ2FyZCAtLT5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJmZHMtcGFuZWwtbWVudS1idXR0b25cXFwiIG1hdFRvb2x0aXA9XFxcIlN0YW5kYXJkIENhcmQgTWVudVxcXCIgbWF0LWljb24tYnV0dG9uXFxuICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJzdGFuZGFyZENhcmRNZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcImZhIGZhLWVsbGlwc2lzLXYgXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwicHJpbWFyeS1pY29uLWJ1dHRvbi1tZW51XFxcIiAjc3RhbmRhcmRDYXJkTWVudT1cXFwibWF0TWVudVxcXCIgW292ZXJsYXBUcmlnZ2VyXT1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5PcHRpb24xPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPlxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+T3B0aW9uMjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiPlxcbiAgICAgICAgICAgICAgICA8c3Bhbj5UaXRsZTwvc3Bhbj5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICA8cD5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQ8L3A+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1hY3Rpb25zIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPkFjdGlvbjwvYnV0dG9uPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtYWN0aW9ucz5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICAgICAgICAgIF1dPlxcbiAgICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5UYWJiZWQgQ2FyZDwvaDM+XFxuICAgICAgICAgICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcImZkcy1wYW5lbC1tZW51LWJ1dHRvblxcXCIgbWF0VG9vbHRpcD1cXFwiU3RhbmRhcmQgQ2FyZCBNZW51XFxcIiBtYXQtaWNvbi1idXR0b25cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwic3RhbmRhcmRDYXJkTWVudVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcImZhIGZhLWVsbGlwc2lzLXYgXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9pPlxcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgY2xhc3M9XFxcInByaW1hcnktaWNvbi1idXR0b24tbWVudVxcXCIgI3N0YW5kYXJkQ2FyZE1lbnU9XFxcIm1hdE1lbnVcXFwiIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk9wdGlvbjE8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5PcHRpb24yPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIGR5bmFtaWNIZWlnaHQgY29sb3I9XFxcImFjY2VudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+T25lPC9uZy10ZW1wbGF0ZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPkZpcnN0IHRhYiBjb250ZW50PC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlBsYWlkIGVjaG8gcGFyayBrbmF1c2dhYXJkIG5vcm1jb3JlIGZyYW56ZW4gY3JvbnV0LiBQaWNrbGVkIGh1bWJsZWJyYWcgdG9mdSBob29kaWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW1hbWkgc2FsdmlhIGZhcm0tdG8tdGFibGUgc2NobGl0eiB0cnktaGFyZCBmb29kIHRydWNrIGtuYXVzZ2FhcmQgcGFic3QuIFl1Y2NpZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRsYW5kIGplYW4gc2hvcnRzLCBhdXRoZW50aWMgbWl4dGFwZSB3YWlzdGNvYXQgZ2VudHJpZnkgYmx1ZSBib3R0bGUuIEZpeGllXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2lja3N0YXJ0ZXIgY2h1cmNoLWtleSBzbWFsbCBiYXRjaCBzZWl0YW4sIHNoYWJieSBjaGljIHZlZ2FuIGxpc3RpY2xlIGJlZm9yZSB0aGV5XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29sZCBvdXQuIEhhbW1vY2sgcmF3IGRlbmltIGZsYW5uZWwgdG91c2xlZCBzZWl0YW4geW91IHByb2JhYmx5IGhhdmVuJ3QgaGVhcmQgb2ZcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtLiBUcnVzdCBmdW5kIG1hbiBidW4gcHVnLCBraWNrc3RhcnRlciBhcnRpc2FuIHNlbHZhZ2UgbGV0dGVycHJlc3MgY29ybmhvbGUgdG90ZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZyBidXRjaGVyIGxvY2F2b3JlLiBBZmZvZ2F0byB0cnktaGFyZCBraWNrc3RhcnRlciBzZWl0YW4sIERJWSBwaWNrbGVkIGhlbGxhIGdvZGFyZFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcmsgYmVsbHkgZm91ciBsb2tvIHVnaC48L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5Ud288L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+U2Vjb25kIHRhYiBjb250ZW50PC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhhc2h0YWcgZGlzdGlsbGVyeSBza2F0ZWJvYXJkIG1hbiBidW4gZ29jaHVqYW5nLCBzYWx2aWEgbWFuIGJyYWlkIGFydCBwYXJ0eSBtZWdnaW5nc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaXJsb29tIGtpdHNjaCBmYXJtLXRvLXRhYmxlLiBGcmFuemVuIGJlYXJkIGZpbmdlcnN0YWNoZSBnZW50cmlmeSwgaGVpcmxvb21cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0bGFuZCBlbm51aSBYT1hPIG1pY3JvZG9zaW5nIGtpdHNjaCBwbGFpZC4gQ2hpY2hhcnJvbmVzIGJ1c2h3aWNrIGNoaWEsIGJhbmggbWlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcm9ueSB0YXR0b29lZCBoYW1tb2NrIGJ1dGNoZXIgc2hhYmJ5IGNoaWMgdGF4aWRlcm15IHNlbWlvdGljcyBtYXJmYSBwb3N0LWlyb25pYy5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVlIGJvdHRsZSBrZWZmaXllaCBmYXJtLXRvLXRhYmxlIGVubnVpLCBjaGFtYnJheSBwaXRjaGZvcmsgYXJ0IHBhcnR5IHBpbnRlcmVzdFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlzYW4gcG9wLXVwLiBFdHN5IGJhbmpvIG1hcmZhLCBibHVlIGJvdHRsZSBrb21idWNoYSBjcnVjaWZpeCBYT1hPIHRvdXNsZWQgYmVhcmQuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlsZGUgZGlzcnVwdCBrYWxlIGNoaXBzIGJpY3ljbGUgcmlnaHRzIHNrYXRlYm9hcmQgbWFzdGVyIGNsZWFuc2UgaGVsbGEgc2hvcmVkaXRjaCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpdGF0aW9uIHJldHJvIHNoYWJieSBjaGljIHZpY2UgaGVpcmxvb20uIEV0c3kgbGlzdGljbGUgdmljZSBhY3R1YWxseSwgaVBob25lIGNoaWFcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob29kaWUgZm91ciBsb2tvLjwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1hY3Rpb25zIGZ4TGF5b3V0PVxcXCJyb3dcXFwiIGZ4TGF5b3V0QWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+QWN0aW9uPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWFjdGlvbnM+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgICAgICAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPCEtLSBCYXNpYyBDYXJkIC0tPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcImZkcy1wYW5lbC1tZW51LWJ1dHRvblxcXCIgbWF0VG9vbHRpcD1cXFwiU3RhbmRhcmQgQ2FyZCBNZW51XFxcIiBtYXQtaWNvbi1idXR0b25cXG4gICAgICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XFxcInN0YW5kYXJkQ2FyZE1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cXFwiZmEgZmEtZWxsaXBzaXMtdiBcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgPG1hdC1tZW51IGNsYXNzPVxcXCJwcmltYXJ5LWljb24tYnV0dG9uLW1lbnVcXFwiICNzdGFuZGFyZENhcmRNZW51PVxcXCJtYXRNZW51XFxcIiBbb3ZlcmxhcFRyaWdnZXJdPVxcXCJmYWxzZVxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPk9wdGlvbjE8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5PcHRpb24yPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICA8bWF0LXRhYi1ncm91cCBkeW5hbWljSGVpZ2h0IGNvbG9yPVxcXCJhY2NlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+T25lPC9uZy10ZW1wbGF0ZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5GaXJzdCB0YWIgY29udGVudDwvaDM+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+UGxhaWQgZWNobyBwYXJrIGtuYXVzZ2FhcmQgbm9ybWNvcmUgZnJhbnplbiBjcm9udXQuIFBpY2tsZWQgaHVtYmxlYnJhZyB0b2Z1IGhvb2RpZSwgdW1hbWkgc2FsdmlhIGZhcm0tdG8tdGFibGUgc2NobGl0eiB0cnktaGFyZCBmb29kIHRydWNrIGtuYXVzZ2FhcmQgcGFic3QuIFl1Y2NpZSBwb3J0bGFuZCBqZWFuIHNob3J0cywgYXV0aGVudGljIG1peHRhcGUgd2Fpc3Rjb2F0IGdlbnRyaWZ5IGJsdWUgYm90dGxlLiBGaXhpZSBraWNrc3RhcnRlciBjaHVyY2gta2V5IHNtYWxsIGJhdGNoIHNlaXRhbiwgc2hhYmJ5IGNoaWMgdmVnYW4gbGlzdGljbGUgYmVmb3JlIHRoZXkgc29sZCBvdXQuIEhhbW1vY2sgcmF3IGRlbmltIGZsYW5uZWwgdG91c2xlZCBzZWl0YW4geW91IHByb2JhYmx5IGhhdmVuJ3QgaGVhcmQgb2YgdGhlbS4gVHJ1c3QgZnVuZCBtYW4gYnVuIHB1Zywga2lja3N0YXJ0ZXIgYXJ0aXNhbiBzZWx2YWdlIGxldHRlcnByZXNzIGNvcm5ob2xlIHRvdGUgYmFnIGJ1dGNoZXIgbG9jYXZvcmUuIEFmZm9nYXRvIHRyeS1oYXJkIGtpY2tzdGFydGVyIHNlaXRhbiwgRElZIHBpY2tsZWQgaGVsbGEgZ29kYXJkIHBvcmsgYmVsbHkgZm91ciBsb2tvIHVnaC48L3A+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5Ud288L25nLXRlbXBsYXRlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlNlY29uZCB0YWIgY29udGVudDwvaDM+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+SGFzaHRhZyBkaXN0aWxsZXJ5IHNrYXRlYm9hcmQgbWFuIGJ1biBnb2NodWphbmcsIHNhbHZpYSBtYW4gYnJhaWQgYXJ0IHBhcnR5IG1lZ2dpbmdzIGhlaXJsb29tIGtpdHNjaCBmYXJtLXRvLXRhYmxlLiBGcmFuemVuIGJlYXJkIGZpbmdlcnN0YWNoZSBnZW50cmlmeSwgaGVpcmxvb20gcG9ydGxhbmQgZW5udWkgWE9YTyBtaWNyb2Rvc2luZyBraXRzY2ggcGxhaWQuIENoaWNoYXJyb25lcyBidXNod2ljayBjaGlhLCBiYW5oIG1pIGlyb255IHRhdHRvb2VkIGhhbW1vY2sgYnV0Y2hlciBzaGFiYnkgY2hpYyB0YXhpZGVybXkgc2VtaW90aWNzIG1hcmZhIHBvc3QtaXJvbmljLiBCbHVlIGJvdHRsZSBrZWZmaXllaCBmYXJtLXRvLXRhYmxlIGVubnVpLCBjaGFtYnJheSBwaXRjaGZvcmsgYXJ0IHBhcnR5IHBpbnRlcmVzdCBhcnRpc2FuIHBvcC11cC4gRXRzeSBiYW5qbyBtYXJmYSwgYmx1ZSBib3R0bGUga29tYnVjaGEgY3J1Y2lmaXggWE9YTyB0b3VzbGVkIGJlYXJkLiBUaWxkZSBkaXNydXB0IGthbGUgY2hpcHMgYmljeWNsZSByaWdodHMgc2thdGVib2FyZCBtYXN0ZXIgY2xlYW5zZSBoZWxsYSBzaG9yZWRpdGNoLCBtZWRpdGF0aW9uIHJldHJvIHNoYWJieSBjaGljIHZpY2UgaGVpcmxvb20uIEV0c3kgbGlzdGljbGUgdmljZSBhY3R1YWxseSwgaVBob25lIGNoaWEgaG9vZGllIGZvdXIgbG9rby48L3A+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XFxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWFjdGlvbnMgZnhMYXlvdXQ9XFxcInJvd1xcXCIgZnhMYXlvdXRBbGlnbj1cXFwiZW5kIGNlbnRlclxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+QWN0aW9uPC9idXR0b24+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgICAgICAgICAgXV0+XFxuICAgICAgICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJTZWxlY3RcXFwiPlNlbGVjdCA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiU2VsZWN0XFxcIj5saW5rPC9tYXQtaWNvbj48L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICA8Zm9ybT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgY29sb3I9XFxcImFjY2VudFxcXCIgZmxvYXRQbGFjZWhvbGRlcj1cXFwibmV2ZXJcXFwiIHBsYWNlaG9sZGVyPVxcXCJGYXZvcml0ZSBmb29kXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVxcXCJzZWxlY3RlZFZhbHVlXFxcIiBuYW1lPVxcXCJmb29kXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVxcXCJsZXQgZm9vZCBvZiBmb29kc1xcXCIgW3ZhbHVlXT1cXFwiZm9vZC52YWx1ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2Zvb2Qudmlld1ZhbHVlfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZsZXg+IFNlbGVjdGVkIGZvb2QgdmFsdWU6IHt7c2VsZWN0ZWRWYWx1ZX19IDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZm9ybT5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICA8IVtDREFUQVtcXG4gICAgICAgIDxmb3JtPlxcbiAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4+XFxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGNvbG9yPVxcXCJhY2NlbnRcXFwiIGZsb2F0UGxhY2Vob2xkZXI9XFxcIm5ldmVyXFxcIiBwbGFjZWhvbGRlcj1cXFwiRmF2b3JpdGUgZm9vZFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XFxcInNlbGVjdGVkVmFsdWVcXFwiIG5hbWU9XFxcImZvb2RcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVxcXCJsZXQgZm9vZCBvZiBmb29kc1xcXCIgW3ZhbHVlXT1cXFwiZm9vZC52YWx1ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgeyB7Zm9vZC52aWV3VmFsdWV9IH1cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4+XFxuICAgICAgICAgICAgICAgIDxkaXYgZmxleD4gU2VsZWN0ZWQgZm9vZCB2YWx1ZTogeyB7c2VsZWN0ZWRWYWx1ZX0gfSA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZm9ybT5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJqYXZhc2NyaXB0XFxcIj5cXG4gICAgICA8IVtDREFUQVtcXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9ICcnO1xcblxcbiAgICAgICAgdGhpcy5mb29kcyA9IFtcXG4gICAgICAgICAgICB7IHZhbHVlOiAnc3RlYWstMCcsIHZpZXdWYWx1ZTogJ1N0ZWFrJyB9LFxcbiAgICAgICAgICAgIHsgdmFsdWU6ICdwaXp6YS0xJywgdmlld1ZhbHVlOiAnUGl6emEnIH0sXFxuICAgICAgICAgICAgeyB2YWx1ZTogJ3RhY29zLTInLCB2aWV3VmFsdWU6ICdUYWNvcycgfSxcXG4gICAgICAgIF07XFxuICAgICAgICBdXT5cXG4gICAgICA8L3ByZT5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIk1lbnVzXFxcIj5NZW51cyAoZHJvcGRvd25zKSA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiTWVudXNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XFxcIm1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI21lbnU9XFxcIm1hdE1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBSZWZyZXNoIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBTZXR0aW5ncyA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gSGVscCA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBkaXNhYmxlZD4gU2lnbiBPdXQgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gY29sb3I9XFxcImZkcy1yZWd1bGFyXFxcIiBtYXQtcmFpc2VkLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJhYm92ZU1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgQWJvdmU8aSBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxtYXQtbWVudSB5UG9zaXRpb249XFxcImFib3ZlXFxcIiAjYWJvdmVNZW51PVxcXCJtYXRNZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gUmVmcmVzaCA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gU2V0dGluZ3MgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IEhlbHAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gZGlzYWJsZWQ+IFNpZ24gT3V0IDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCIgbWF0LXJhaXNlZC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwiaWNvbnNNZW51XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIEljb25zIGluIE1lbnU8aSBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjaWNvbnNNZW51PVxcXCJtYXRNZW51XFxcIiBbb3ZlcmxhcFRyaWdnZXJdPVxcXCJmYWxzZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRpYWxwYWQ8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlJlZGlhbDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIGRpc2FibGVkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj52b2ljZW1haWw8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkNoZWNrIHZvaWNlbWFpbDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5ub3RpZmljYXRpb25zX29mZjwvbWF0LWljb24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+RGlzYWJsZSBhbGVydHM8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIFttYXRNZW51VHJpZ2dlckZvcl09XFxcInByaW1hcnlCdXR0b25Ecm9wZG93bk1lbnVcXFwiIG1hdC1yYWlzZWQtYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgRkRTIFByaW1hcnk8aSBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxtYXQtbWVudSBjbGFzcz1cXFwiZmRzLXByaW1hcnktZHJvcGRvd24tYnV0dG9uLW1lbnVcXFwiICNwcmltYXJ5QnV0dG9uRHJvcGRvd25NZW51PVxcXCJtYXRNZW51XFxcIiBbb3ZlcmxhcFRyaWdnZXJdPVxcXCJmYWxzZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+T3B0aW9uIDE8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBkaXNhYmxlZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5PcHRpb24gMjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCIgbWF0LXJhaXNlZC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwicG9zWE1lbnVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgQmVmb3JlPGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8bWF0LW1lbnUgeFBvc2l0aW9uPVxcXCJiZWZvcmVcXFwiICNwb3NYTWVudT1cXFwibWF0TWVudVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IFJlZnJlc2ggPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IFNldHRpbmdzIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBIZWxwIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIGRpc2FibGVkPiBTaWduIE91dCA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICA8IVtDREFUQVtcXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XFxcIm1lbnVcXFwiPlxcbiAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxcbiAgICAgICAgPC9idXR0b24+XFxuICAgICAgICA8bWF0LW1lbnUgI21lbnU9XFxcIm1hdE1lbnVcXFwiPlxcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gUmVmcmVzaCA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IFNldHRpbmdzIDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gSGVscCA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gZGlzYWJsZWQ+IFNpZ24gT3V0IDwvYnV0dG9uPlxcbiAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgIDxidXR0b24gY29sb3I9XFxcImZkcy1yZWd1bGFyXFxcIiBtYXQtcmFpc2VkLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVxcXCJhYm92ZU1lbnVcXFwiPlxcbiAgICAgICAgICAgIEFib3ZlPGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgIDxtYXQtbWVudSB5UG9zaXRpb249XFxcImFib3ZlXFxcIiAjYWJvdmVNZW51PVxcXCJtYXRNZW51XFxcIj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IFJlZnJlc2ggPC9idXR0b24+XFxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPiBTZXR0aW5ncyA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IEhlbHAgPC9idXR0b24+XFxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIGRpc2FibGVkPiBTaWduIE91dCA8L2J1dHRvbj5cXG4gICAgICAgIDwvbWF0LW1lbnU+XFxuICAgICAgICA8YnV0dG9uIGNvbG9yPVxcXCJmZHMtcmVndWxhclxcXCIgbWF0LXJhaXNlZC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwiaWNvbnNNZW51XFxcIj5cXG4gICAgICAgICAgICBJY29ucyBpbiBNZW51PGkgY2xhc3M9XFxcImZhIGZhLWNhcmV0LWRvd25cXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L2k+XFxuICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgIDxtYXQtbWVudSAjaWNvbnNNZW51PVxcXCJtYXRNZW51XFxcIiBbb3ZlcmxhcFRyaWdnZXJdPVxcXCJmYWxzZVxcXCI+XFxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPlxcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZGlhbHBhZDwvbWF0LWljb24+XFxuICAgICAgICAgICAgICAgIDxzcGFuPlJlZGlhbDwvc3Bhbj5cXG4gICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gZGlzYWJsZWQ+XFxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj52b2ljZW1haWw8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICA8c3Bhbj5DaGVjayB2b2ljZW1haWw8L3NwYW4+XFxuICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPlxcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+bm90aWZpY2F0aW9uc19vZmY8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICA8c3Bhbj5EaXNhYmxlIGFsZXJ0czwvc3Bhbj5cXG4gICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgIDwvbWF0LW1lbnU+XFxuICAgICAgICA8YnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cXFwicHJpbWFyeUJ1dHRvbkRyb3Bkb3duTWVudVxcXCIgbWF0LXJhaXNlZC1idXR0b24+XFxuICAgICAgICAgICAgRkRTIFByaW1hcnk8aSBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgPG1hdC1tZW51IGNsYXNzPVxcXCJmZHMtcHJpbWFyeS1kcm9wZG93bi1idXR0b24tbWVudVxcXCIgI3ByaW1hcnlCdXR0b25Ecm9wZG93bk1lbnU9XFxcIm1hdE1lbnVcXFwiIFtvdmVybGFwVHJpZ2dlcl09XFxcImZhbHNlXFxcIj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XFxuICAgICAgICAgICAgICAgIDxzcGFuPk9wdGlvbiAxPC9zcGFuPlxcbiAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBkaXNhYmxlZD5cXG4gICAgICAgICAgICAgICAgPHNwYW4+T3B0aW9uIDI8L3NwYW4+XFxuICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICA8L21hdC1tZW51PlxcbiAgICAgICAgPGJ1dHRvbiBjb2xvcj1cXFwiZmRzLXJlZ3VsYXJcXFwiIG1hdC1yYWlzZWQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XFxcInBvc1hNZW51XFxcIj5cXG4gICAgICAgICAgICBCZWZvcmU8aSBjbGFzcz1cXFwiZmEgZmEtY2FyZXQtZG93blxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvaT5cXG4gICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgPG1hdC1tZW51IHhQb3NpdGlvbj1cXFwiYmVmb3JlXFxcIiAjcG9zWE1lbnU9XFxcIm1hdE1lbnVcXFwiPlxcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gUmVmcmVzaCA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+IFNldHRpbmdzIDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT4gSGVscCA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gZGlzYWJsZWQ+IFNpZ24gT3V0IDwvYnV0dG9uPlxcbiAgICAgICAgPC9tYXQtbWVudT5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiRGlhbG9nXFxcIj5EaWFsb2cgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIkRpYWxvZ1xcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIChjbGljayk9XFxcIm9wZW5EaWFsb2coKVxcXCI+U2hvdyBzaW1wbGUgZGlhbG9nPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwib3BlbkRpYWxvZygpXFxcIj5TaG93IHNpbXBsZSBkaWFsb2c8L2J1dHRvbj5cXG4gICAgICBdXT5cXG4gICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgIDxwPkphdmFzY3JpcHQ6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImphdmFzY3JpcHRcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgdmFyIG5nQ29yZSA9IHJlcXVpcmUoJ0Bhbmd1bGFyL2NvcmUnKTtcXG4gICAgICAgIGZ1bmN0aW9uIERpYWxvZ0NvbXBvbmVudCgpIHt9O1xcblxcbiAgICAgICAgRGlhbG9nQ29tcG9uZW50LnByb3RvdHlwZSA9IHtcXG4gICAgICAgICAgICBjb25zdHJ1Y3RvcjogRGlhbG9nQ29tcG9uZW50XFxuICAgICAgICB9O1xcblxcbiAgICAgICAgRGlhbG9nQ29tcG9uZW50LmFubm90YXRpb25zID0gW1xcbiAgICAgICAgICAgIG5ldyBuZ0NvcmUuQ29tcG9uZW50KHtcXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6ICdIZWxsbyBEaWFsb2cnXFxuICAgICAgICB9KV07XFxuXFxuICAgICAgICAuLi5cXG5cXG4gICAgICAgIGNvbnN0cnVjdG9yKE1hdERpYWxvZykge1xcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nID0gTWF0RGlhbG9nO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgLi4uXFxuXFxuICAgICAgICBvcGVuRGlhbG9nOiBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKERpYWxvZ0NvbXBvbmVudCwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnNTAlJywgLy8gY2FuIGJlIHB4IG9yICVcXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnNjAlJywgLy8gY2FuIGJlIHB4IG9yICVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICk7XFxuICAgICAgICB9XFxuXFxuICAgICAgICAuLi5cXG5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiU2ltcGxlRGlhbG9nc1xcXCI+U2ltcGxlIERpYWxvZ3MgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIlNpbXBsZURpYWxvZ3NcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhZC1sZWZ0LXNtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiAoY2xpY2spPVxcXCJvcGVuQ29uZmlybSgpXFxcIiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+T3BlblxcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpcm1cXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICA8IVtDREFUQVtcXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cXFwicHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwib3BlbkNvbmZpcm0oKVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPk9wZW4gQ29uZmlybTwvYnV0dG9uPlxcbiAgICAgICAgXV0+XFxuICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgIDxwPkphdmFzY3JpcHQ6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImphdmFzY3JpcHRcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgLi4uXFxuXFxuICAgICAgICBjb25zdHJ1Y3RvcihUZERpYWxvZ1NlcnZpY2UpIHtcXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UgPSBUZERpYWxvZ1NlcnZpY2VcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIC4uLlxcblxcbiAgICAgICAgb3BlbkNvbmZpcm06IGZ1bmN0aW9uKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbkNvbmZpcm0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0NvbmZpcm0nLFxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVGhpcyBpcyBob3cgc2ltcGxlIGl0IGlzIHRvIGNyZWF0ZSBhIGNvbmZpcm0gd2l0aCB0aGlzIHdyYXBwZXIgc2VydmljZS4gRG8geW91IGFncmVlPycsXFxuICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvbjogJ0Rpc2FncmVlJyxcXG4gICAgICAgICAgICAgICAgYWNjZXB0QnV0dG9uOiAnQWdyZWUnLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC4uLlxcbiAgICAgICAgXV0+XFxuICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJTbmFja0JhcnNcXFwiPlNuYWNrIEJhcnMgPG1hdC1pY29uIGNsYXNzPVxcXCJsaW5rLXRvLWNvbXBvbmVudFxcXCIgcm91dGVyTGluaz1cXFwiL1xcXCIgZnJhZ21lbnQ9XFxcIlNuYWNrQmFyc1xcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIChjbGljayk9XFxcInNob3dTdWNjZXNzU25hY2tCYXIoKVxcXCI+U3VjY2VzcyBTbmFjayBCYXI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIChjbGljayk9XFxcInNob3dXYXJuU25hY2tCYXIoKVxcXCI+V2FybmluZyBTbmFjayBCYXI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIChjbGljayk9XFxcInNob3dFcnJvclNuYWNrQmFyKClcXFwiPkVycm9yIFNuYWNrIEJhcjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwic2hvd1JlZ3VsYXJTbmFja0JhcigpXFxcIj5SZWd1bGFyIFNuYWNrIEJhcjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cXFwiZmRzLXByaW1hcnlcXFwiIChjbGljayk9XFxcInNob3dTdWNjZXNzU25hY2tCYXIoKVxcXCI+U3VjY2VzcyBTbmFjayBCYXI8L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XFxcImZkcy1wcmltYXJ5XFxcIiAoY2xpY2spPVxcXCJzaG93V2FyblNuYWNrQmFyKClcXFwiPldhcm5pbmcgU25hY2sgQmFyPC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwic2hvd0Vycm9yU25hY2tCYXIoKVxcXCI+RXJyb3IgU25hY2sgQmFyPC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwic2hvd1JlZ3VsYXJTbmFja0JhcigpXFxcIj5SZWd1bGFyIFNuYWNrIEJhcjwvYnV0dG9uPlxcbiAgICAgIF1dPlxcbiAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgPHA+SmF2YXNjcmlwdDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiamF2YXNjcmlwdFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICAuLi5cXG5cXG4gICAgICAgIGNvbnN0cnVjdG9yKEZkc1NuYWNrQmFyU2VydmljZSkge1xcbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlID0gRmRzU25hY2tCYXJTZXJ2aWNlO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC4uLlxcblxcbiAgICAgICAgLyoqIFBvc3NpYmxlIHZhbHVlcyBmb3IgaG9yaXpvbnRhbFBvc2l0aW9uIG9uIE1hdFNuYWNrQmFyQ29uZmlnIGFyZSAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJyB8ICdsZWZ0JyB8ICdyaWdodCcuICovXFxuICAgICAgICAvKiogUG9zc2libGUgdmFsdWVzIGZvciB2ZXJ0aWNhbFBvc2l0aW9uIG9uIE1hdFNuYWNrQmFyQ29uZmlnIGFyZSAndG9wJyB8ICdib3R0b20nLiAqL1xcbiAgICAgICAgLyoqIFBvc3NpYmxlIHZhbHVlcyBmb3IgaWNvbiBvbiBNYXRTbmFja0JhckNvbmZpZyBhcmUgYW55IGF2YWlsYWJsZSBpY29ucyBsb2FkZWQgb24gdGhlIHBhZ2UuICovXFxuXFxuICAgICAgICBzaG93U3VjY2Vzc1NuYWNrQmFyOiBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgICAgIHZhciBzbmFja0JhclJlZiA9IHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW5Db2FzdGVyKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdTdWNjZXNzJyxcXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1NvbWUgaGVscCB0ZXh0IHJlZ2FyZGluZyB0aGUgc3VjY2Vzc2Z1bCBldmVudC4nLFxcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbFBvc2l0aW9uOiAndG9wJyxcXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbFBvc2l0aW9uOiAncmlnaHQnLFxcbiAgICAgICAgICAgICAgICBpY29uOiAnZmEgZmEtY2hlY2stY2lyY2xlLW8nLFxcbiAgICAgICAgICAgICAgICBjb2xvcjogJyMxRUI0NzUnLFxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHNob3dXYXJuU25hY2tCYXI6IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHNuYWNrQmFyUmVmID0gdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbkNvYXN0ZXIoe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ1dhcm5pbmcnLFxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnU29tZSBoZWxwIHRleHQgcmVnYXJkaW5nIHRoZSB3YXJuaW5nLicsXFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsUG9zaXRpb246ICd0b3AnLFxcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsUG9zaXRpb246ICdsZWZ0JyxcXG4gICAgICAgICAgICAgICAgaWNvbjogJ2ZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJyxcXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjRTk4QTQwJyxcXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDBcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBzaG93RXJyb3JTbmFja0JhcjogZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgICAgICB2YXIgc25hY2tCYXJSZWYgPSB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuQ29hc3Rlcih7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnU29tZSBoZWxwIHRleHQgcmVnYXJkaW5nIHRoZSBjcml0aWNhbCBlcnJvci4gVGhpcyBjb2FzdGVyIHdpbGwgc3RheSBvcGVuIHVudGlsIGNsb3NlZCB3aXRoIHRoZSBgeGAgb3IgaWYgYW5vdGhlciBjb2FzdGVyIGlzIGNyZWF0ZWQuJyxcXG4gICAgICAgICAgICAgICAgdmVydGljYWxQb3NpdGlvbjogJ2JvdHRvbScsXFxuICAgICAgICAgICAgICAgIGhvcml6b250YWxQb3NpdGlvbjogJ3JpZ2h0JyxcXG4gICAgICAgICAgICAgICAgaWNvbjogJ2ZhIGZhLXRpbWVzLWNpcmNsZS1vJyxcXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjRUY2MTYyJ1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIHNob3dSZWd1bGFyU25hY2tCYXI6IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHNuYWNrQmFyUmVmID0gdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbkNvYXN0ZXIoe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ1JlZ3VsYXInLFxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnU29tZXRoaW5nIGludGVyZXN0aW5nLicsXFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsUG9zaXRpb246ICdib3R0b20nLFxcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsUG9zaXRpb246ICdsZWZ0JyxcXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjODA4NzkzJyxcXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDBcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAuLi5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgICAgICA8bWF0LWNhcmQ+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlIGNsYXNzPVxcXCJwYWQtYm90dG9tLXNtXFxcIiBpZD1cXFwiRXhwYW5zaW9uUGFuZWxzXFxcIj5FeHBhbnNpb24gUGFuZWxzIDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJFeHBhbnNpb25QYW5lbHNcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgIDxwPkV4cGFuZC9Db2xsYXBzZSBFdmVudCBmb3IgRXhwYW5zaW9uIDE6IHt7ZXhwYW5kQ29sbGFwc2VFeHBhbnNpb24xTXNnfX08L3A+XFxuICAgICAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XFxcInByaW1hcnlcXFwiIChjbGljayk9XFxcInRvZ2dsZURpc2FibGVkKClcXFwiIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5Ub2dnbGUgZGlzYWJsZVxcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XFxcInByaW1hcnlcXFwiIChjbGljayk9XFxcInRvZ2dsZUV4cGFuc2lvbjEoKVxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlRvZ2dsZSBmaXJzdFxcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8ZGl2IGxheW91dC1ndC14cz1cXFwicm93XFxcIiBsYXlvdXQtYWxpZ24tZ3QteHM9XFxcImNlbnRlciBzdGFydFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGZsZXgtZ3QteHM9XFxcIjkwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQtZXhwYW5zaW9uLXBhbmVsIGxhYmVsPVxcXCJHb29nbGVcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJsYWJlbD1cXFwiMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMsIFVTQVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtleHBhbmRdPVxcXCJleHBhbnNpb24xXFxcIiBbZGlzYWJsZWRdPVxcXCJkaXNhYmxlZFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHBhbmRlZCk9XFxcImV4cGFuZEV4cGFuc2lvbjFFdmVudCgpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbGxhcHNlZCk9XFxcImNvbGxhcHNlRXhwYW5zaW9uMUV2ZW50KClcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQtZXhwYW5zaW9uLXN1bW1hcnk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3Q+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1saXN0LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXQtbGlzdC1hdmF0YXI+cGluX2Ryb3A8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgbWF0LWxpbmU+R29vZ2xlPC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IG1hdC1saW5lPkhlYWRxdWFydGVyczwvaDQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIG1hdC1saW5lPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz5Nb3VudGFpbiBWaWV3LCBDQSA5NDA0MywgVVNBXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1saXN0LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1saXN0PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkLWV4cGFuc2lvbi1zdW1tYXJ5PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtcGFkZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cXFwibWF0LXBhZGRpbmdcXFwiIGxheW91dD1cXFwiY29sdW1uXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cXFwiYWx3YXlzXFxcIiBmbGV4PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIkNvbXBhbnkgKGRpc2FibGVkKVxcXCIgZGlzYWJsZWQgdmFsdWU9XFxcIkdvb2dsZVxcXCIvPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IHBsYWNlaG9sZGVyPVxcXCJEZXNjcmlwdGlvblxcXCIgcm93cz1cXFwiNFxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBsYXlvdXQ9XFxcInJvd1xcXCIgbGF5b3V0LW1hcmdpbiBsYXlvdXQtYWxpZ249XFxcImVuZCBjZW50ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+Q2FuY2VsPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVxcXCJhY2NlbnRcXFwiIGNsYXNzPVxcXCJ0ZXh0LXVwcGVyXFxcIj5TYXZlPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZC1leHBhbnNpb24tcGFuZWw+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlVzYWdlPC9oMz5cXG4gICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8dGQtZXhwYW5zaW9uLXBhbmVsIGxhYmVsPVxcXCJHb29nbGVcXFwiIHN1YmxhYmVsPVxcXCIxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MywgVVNBXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXhwYW5kXT1cXFwiZXhwYW5zaW9uMVxcXCIgW2Rpc2FibGVkXT1cXFwiZGlzYWJsZWRcXFwiIChleHBhbmRlZCk9XFxcImV4cGFuZEV4cGFuc2lvbjFFdmVudCgpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sbGFwc2VkKT1cXFwiY29sbGFwc2VFeHBhbnNpb24xRXZlbnQoKVxcXCI+XFxuICAgICAgICAgICAgPHRkLWV4cGFuc2lvbi1zdW1tYXJ5PlxcbiAgICAgICAgICAgICAgICA8bWF0LWxpc3Q+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0LWxpc3QtYXZhdGFyPnBpbl9kcm9wPC9tYXQtaWNvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgbWF0LWxpbmU+R29vZ2xlPC9oMz5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgbWF0LWxpbmU+SGVhZHF1YXJ0ZXJzPC9oND5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBtYXQtbGluZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPk1vdW50YWluIFZpZXcsIENBIDk0MDQzLCBVU0FcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1saXN0LWl0ZW0+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWxpc3Q+XFxuICAgICAgICAgICAgPC90ZC1leHBhbnNpb24tc3VtbWFyeT5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtYXQtcGFkZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVxcXCJtYXQtcGFkZGluZ1xcXCIgbGF5b3V0PVxcXCJjb2x1bW5cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XFxcImFsd2F5c1xcXCIgZmxleD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XFxcIkNvbXBhbnkgKGRpc2FibGVkKVxcXCIgZGlzYWJsZWQgdmFsdWU9XFxcIkdvb2dsZVxcXCIvPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVxcXCJhbHdheXNcXFwiIGZsZXg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IHBsYWNlaG9sZGVyPVxcXCJEZXNjcmlwdGlvblxcXCIgcm93cz1cXFwiNFxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XFxuICAgICAgICAgICAgICAgIDwvZm9ybT5cXG4gICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiIGxheW91dC1tYXJnaW4gbGF5b3V0LWFsaWduPVxcXCJlbmQgY2VudGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cXFwidGV4dC11cHBlclxcXCI+Q2FuY2VsPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XFxcImFjY2VudFxcXCIgY2xhc3M9XFxcInRleHQtdXBwZXJcXFwiPlNhdmU8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L3RkLWV4cGFuc2lvbi1wYW5lbD5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJqYXZhc2NyaXB0XFxcIj5cXG4gICAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICB0aGlzLmV4cGFuZENvbGxhcHNlRXhwYW5zaW9uMU1zZyA9ICdObyBleHBhbmRlZC9jb2xsYXBzZWQgZGV0ZWN0ZWQgeWV0JztcXG4gICAgICAgIHRoaXMuZXhwYW5zaW9uMSA9IGZhbHNlO1xcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xcblxcbiAgICAgICAgLi4uXFxuXFxuICAgICAgICB0b2dnbGVFeHBhbnNpb24xOiBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuc2lvbjEgPSAhdGhpcy5leHBhbnNpb24xO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuXFxuICAgICAgICB0b2dnbGVEaXNhYmxlZDogZnVuY3Rpb24oKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gIXRoaXMuZGlzYWJsZWQ7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgZXhwYW5kRXhwYW5zaW9uMUV2ZW50OiBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kQ29sbGFwc2VFeHBhbnNpb24xTXNnID0gJ0V4cGFuZCBldmVudCBlbWl0dGVkLic7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgY29sbGFwc2VFeHBhbnNpb24xRXZlbnQ6IGZ1bmN0aW9uKCkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmRDb2xsYXBzZUV4cGFuc2lvbjFNc2cgPSAnQ29sbGFwc2UgZXZlbnQgZW1pdHRlZC4nO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC4uLlxcbiAgICAgICAgICAgIF1dPlxcbiAgICAgICAgICA8L3ByZT5cXG4gICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XFxuICAgICAgICA8L21hdC1jYXJkPlxcbiAgICAgICAgPG1hdC1jYXJkPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC10aXRsZSBjbGFzcz1cXFwicGFkLWJvdHRvbS1zbVxcXCIgaWQ9XFxcIlByb2dyZXNzXFxcIj5Qcm9ncmVzcyA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiUHJvZ3Jlc3NcXFwiPmxpbms8L21hdC1pY29uPjwvbWF0LWNhcmQtdGl0bGU+XFxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XFxuICAgICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQgbGF5b3V0PVxcXCJyb3dcXFwiPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGZsZXg9XFxcIjQ4XFxcIiBjbGFzcz1cXFwicGFkLXJpZ2h0XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlByb2dyZXNzIEJhcnM8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgPGg0PkRldGVybWluYXRlPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XFxcImRldGVybWluYXRlXFxcIiB2YWx1ZT1cXFwiNDBcXFwiPjwvbWF0LXByb2dyZXNzLWJhcj5cXG4gICAgICAgICAgICAgICAgICAgIDxoND5JbmRldGVybWluYXRlPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XFxcImluZGV0ZXJtaW5hdGVcXFwiPjwvbWF0LXByb2dyZXNzLWJhcj5cXG4gICAgICAgICAgICAgICAgICAgIDxoND5CdWZmZXI8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cXFwiYnVmZmVyXFxcIiB2YWx1ZT1cXFwiMTVcXFwiIGJ1ZmZlclZhbHVlPVxcXCIxNVxcXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxcbiAgICAgICAgICAgICAgICAgICAgPGg0PlF1ZXJ5PC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XFxcInF1ZXJ5XFxcIj48L21hdC1wcm9ncmVzcy1iYXI+XFxuICAgICAgICAgICAgICAgICAgICA8aDQ+Q29sb3JzPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XFxcImluZGV0ZXJtaW5hdGVcXFwiIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj48L21hdC1wcm9ncmVzcy1iYXI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVxcXCJpbmRldGVybWluYXRlXFxcIiBjb2xvcj1cXFwiYWNjZW50XFxcIj48L21hdC1wcm9ncmVzcy1iYXI+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVxcXCJpbmRldGVybWluYXRlXFxcIiBjb2xvcj1cXFwid2FyblxcXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxcbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICAgICAgPHA+SFRNTDo8L3A+XFxuICAgICAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPCEtLSBEZXRlcm1pbmF0ZS0tPlxcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cXFwiZGV0ZXJtaW5hdGVcXFwiIHZhbHVlPVxcXCI0MFxcXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxcblxcbiAgICAgICAgPCEtLSBJbmRldGVybWluYXRlLS0+XFxuICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVxcXCJpbmRldGVybWluYXRlXFxcIj48L21hdC1wcm9ncmVzcy1iYXI+XFxuXFxuICAgICAgICA8IS0tIEJ1ZmZlci0tPlxcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cXFwiYnVmZmVyXFxcIiB2YWx1ZT1cXFwiMTVcXFwiIGJ1ZmZlclZhbHVlPVxcXCIxNVxcXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxcblxcbiAgICAgICAgPCEtLSBRdWVyeS0tPlxcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cXFwicXVlcnlcXFwiPjwvbWF0LXByb2dyZXNzLWJhcj5cXG5cXG4gICAgICAgIDwhLS0gQ29sb3JzLS0+XFxuICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVxcXCJpbmRldGVybWluYXRlXFxcIiBjb2xvcj1cXFwicHJpbWFyeVxcXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxcblxcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cXFwiaW5kZXRlcm1pbmF0ZVxcXCIgY29sb3I9XFxcImFjY2VudFxcXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxcblxcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cXFwiaW5kZXRlcm1pbmF0ZVxcXCIgY29sb3I9XFxcIndhcm5cXFwiPjwvbWF0LXByb2dyZXNzLWJhcj5cXG4gICAgICBdXT5cXG4gICAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgZmxleD1cXFwiNDhcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBQcm9ncmVzcyBjaXJjbGVzLS0+XFxuICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Qcm9ncmVzcyBTcGlubmVyPC9oMz5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgbGF5b3V0PVxcXCJyb3dcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5EZXRlcm1pbmF0ZTwvaDQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBtb2RlPVxcXCJkZXRlcm1pbmF0ZVxcXCIgdmFsdWU9XFxcIjY2XFxcIj48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5pbmRldGVybWluYXRlPC9oND5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XFxcImluZGV0ZXJtaW5hdGVcXFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PlNwaW5uZXI8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQ+Q29sb3JzPC9oND5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGxheW91dD1cXFwicm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XFxcImluZGV0ZXJtaW5hdGVcXFwiIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cXFwiaW5kZXRlcm1pbmF0ZVxcXCIgY29sb3I9XFxcImFjY2VudFxcXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XFxcImluZGV0ZXJtaW5hdGVcXFwiIGNvbG9yPVxcXCJ3YXJuXFxcIj48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgICAgIDxwcmUgbGFuZz1cXFwiaHRtbFxcXCI+XFxuICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8IS0tIERldGVybWluYXRlIC0tPlxcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XFxcImRldGVybWluYXRlXFxcIiB2YWx1ZT1cXFwiNjZcXFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XFxuICAgICAgICA8IS0tIEluZGV0ZXJtaW5hdGUgLS0+XFxuICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cXFwiaW5kZXRlcm1pbmF0ZVxcXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cXG4gICAgICAgIDwhLS0gU3Bpbm5lciAtLT5cXG4gICAgICAgIDxtYXQtc3Bpbm5lcj48L21hdC1zcGlubmVyPlxcbiAgICAgICAgPCEtLSBDb2xvcnMgLS0+XFxuICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cXFwiaW5kZXRlcm1pbmF0ZVxcXCIgY29sb3I9XFxcInByaW1hcnlcXFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XFxuICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cXFwiaW5kZXRlcm1pbmF0ZVxcXCIgY29sb3I9XFxcImFjY2VudFxcXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cXG4gICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBtb2RlPVxcXCJpbmRldGVybWluYXRlXFxcIiBjb2xvcj1cXFwid2FyblxcXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cXG4gICAgICBdXT5cXG4gICAgICA8L3ByZT5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJTaWRlTmF2XFxcIj5TaWRlIE5hdiA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiU2lkZU5hdlxcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPHA+VGhlIHNpZGUgbmF2IGNhbiBiZSBvcGVuZWQgYXQgdGhlIGBzdGFydGAgb3IgYGVuZGAgb2YgYSBjb250YWluZXIgYW5kIGNhbiBiZSBkaXNwbGF5ZWQgaW4gYG92ZXJgLFxcbiAgICAgICAgICAgICAgICAgICAgYHNpZGVgLCBvciBgcHVzaGAgbW9kZS4gWW91IGNhbiBhbHNvIGRlZmluZSBpdHMgd2lkdGguPC9wPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdFRvb2x0aXA9XFxcIk9wZW4gc2lkZSBuYXZcXFwiIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVxcXCJmZHMtcHJpbWFyeVxcXCIgKGNsaWNrKT1cXFwic2lkZW5hdi50b2dnbGUoKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICBPcGVuXFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8IS0tIEJhc2ljIFVzYWdlIC0tPlxcbiAgICAgICAgPG1hdC1zaWRlbmF2ICNzaWRlbmF2IG1vZGU9XFxcIm92ZXJcXFwiIGFsaWduPVxcXCJlbmRcXFwiIG9wZW5lZD1cXFwiZmFsc2VcXFwiPlxcbiAgICAgICAgICAgIC4uLlxcbiAgICAgICAgPC9tYXQtc2lkZW5hdj5cXG4gICAgICAgIF1dPlxcbiAgICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJTbGlkZVRvZ2dsZVxcXCI+U2xpZGUgVG9nZ2xlIDxtYXQtaWNvbiBjbGFzcz1cXFwibGluay10by1jb21wb25lbnRcXFwiIHJvdXRlckxpbms9XFxcIi9cXFwiIGZyYWdtZW50PVxcXCJTbGlkZVRvZ2dsZVxcXCI+bGluazwvbWF0LWljb24+PC9tYXQtY2FyZC10aXRsZT5cXG4gICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+QmFzaWMgVXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cXG4gICAgICAgICAgICAgICAgPG1hdC1saXN0PlxcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1saXN0LWl0ZW0gKm5nRm9yPVxcXCJsZXQgc3lzdGVtIG9mIHN5c3RlbXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFtjb2xvcl09XFxcInN5c3RlbS5jb2xvclxcXCIgWyhuZ01vZGVsKV09XFxcInN5c3RlbS5vblxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c3lzdGVtLm5hbWV9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgPC9tYXQtbGlzdD5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPCEtLSBCYXNpYyBVc2FnZSAtLT5cXG4gICAgICAgIDxtYXQtbGlzdD5cXG4gICAgICAgICAgICA8bWF0LWxpc3QtaXRlbSAqbmdGb3I9XFxcImxldCBzeXN0ZW0gb2Ygc3lzdGVtc1xcXCI+XFxuICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbY29sb3JdPVxcXCJzeXN0ZW0uY29sb3JcXFwiIFsobmdNb2RlbCldPVxcXCJzeXN0ZW0ub25cXFwiPlxcbiAgICAgICAgICAgICAgICB7IHtzeXN0ZW0ubmFtZX0gfVxcbiAgICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxcbiAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cXG4gICAgICAgIDwvbWF0LWxpc3Q+XFxuICAgICAgICBdXT5cXG4gICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJqYXZhc2NyaXB0XFxcIj5cXG4gICAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgdGhpcy5zeXN0ZW1zID0gW3tcXG4gICAgICAgICAgICBuYW1lOiAnTGlnaHRzJyxcXG4gICAgICAgICAgICBvbjogZmFsc2UsXFxuICAgICAgICAgICAgY29sb3I6ICdwcmltYXJ5JyxcXG4gICAgICAgIH0sIHtcXG4gICAgICAgICAgICBuYW1lOiAnU3Vycm91bmQgU291bmQnLFxcbiAgICAgICAgICAgIG9uOiB0cnVlLFxcbiAgICAgICAgICAgIGNvbG9yOiAnYWNjZW50JyxcXG4gICAgICAgIH0sIHtcXG4gICAgICAgICAgICBuYW1lOiAnVC5WLicsXFxuICAgICAgICAgICAgb246IHRydWUsXFxuICAgICAgICAgICAgY29sb3I6ICd3YXJuJyxcXG4gICAgICAgIH0sIF07XFxuICAgICAgICAgICAgXV0+XFxuICAgICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZSB3aXRoaW4gRm9ybXM8L2gzPlxcbiAgICAgICAgICAgICAgICA8Zm9ybT5cXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGlzdD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgY29sb3I9XFxcImFjY2VudFxcXCIgWyhuZ01vZGVsKV09XFxcImhvdXNlLmxvY2tIb3VzZVxcXCIgbmFtZT1cXFwibG9ja0hvdXNlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2s/XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVxcXCJob3VzZS5sb2NrSG91c2VcXFwiIGNsYXNzPVxcXCJwYWQtcmlnaHQtc21cXFwiPmxvY2s8L21hdC1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgZGlzYWJsZWQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIGFtIGRpc2FibGVkLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGlzdC1pdGVtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGlzdD5cXG4gICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgICAgPCFbQ0RBVEFbXFxuICAgICAgICA8IS0tIFVzYWdlIHdpdGhpbiBGb3JtcyAtLT5cXG4gICAgICAgIDxmb3JtPlxcbiAgICAgICAgICAgIDxtYXQtbGlzdD5cXG4gICAgICAgICAgICAgICAgPG1hdC1saXN0LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBjb2xvcj1cXFwiYWNjZW50XFxcIiBbKG5nTW9kZWwpXT1cXFwiaG91c2UubG9ja0hvdXNlXFxcIiBuYW1lPVxcXCJsb2NrSG91c2VcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIExvY2s/XFxuICAgICAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XFxcImhvdXNlLmxvY2tIb3VzZVxcXCIgY2xhc3M9XFxcInBhZC1yaWdodC1zbVxcXCI+bG9jazwvbWF0LWljb24+XFxuICAgICAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cXG4gICAgICAgICAgICAgICAgPG1hdC1saXN0LWl0ZW0+XFxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBkaXNhYmxlZD5cXG4gICAgICAgICAgICAgICAgICAgIEkgYW0gZGlzYWJsZWQuXFxuICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cXG4gICAgICAgICAgICAgICAgPC9tYXQtbGlzdC1pdGVtPlxcbiAgICAgICAgICAgIDwvbWF0LWxpc3Q+XFxuICAgICAgICA8L2Zvcm0+XFxuICAgICAgICBdXT5cXG4gICAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8cD5KYXZhc2NyaXB0OjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJqYXZhc2NyaXB0XFxcIj5cXG4gICAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgdGhpcy5ob3VzZSA9IHtcXG4gICAgICAgICAgICBsb2NrSG91c2U6IGZhbHNlLFxcbiAgICAgICAgfTtcXG4gICAgICAgICAgICBdXT5cXG4gICAgICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgPC9tYXQtY2FyZD5cXG4gICAgICAgIDxtYXQtY2FyZD5cXG4gICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgY2xhc3M9XFxcInBhZC1ib3R0b20tc21cXFwiIGlkPVxcXCJTbGlkZXJcXFwiPlNsaWRlciA8bWF0LWljb24gY2xhc3M9XFxcImxpbmstdG8tY29tcG9uZW50XFxcIiByb3V0ZXJMaW5rPVxcXCIvXFxcIiBmcmFnbWVudD1cXFwiU2xpZGVyXFxcIj5saW5rPC9tYXQtaWNvbj48L21hdC1jYXJkLXRpdGxlPlxcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxcbiAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Ib3Jpem9udGFsIFNsaWRlcjwvaDM+XFxuICAgICAgICAgICAgICAgIDxtYXQtc2xpZGVyIG1pbj1cXFwiMVxcXCIgbWF4PVxcXCI1XFxcIiB0aHVtYkxhYmVsIHRpY2tJbnRlcnZhbD1cXFwiMVxcXCIgdmFsdWU9XFxcIjJcXFwiIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj48L21hdC1zbGlkZXI+XFxuICAgICAgICAgICAgICAgIDxtYXQtc2xpZGVyIHN0ZXA9XFxcIjVcXFwiIHRodW1iTGFiZWwgdGlja0ludGVydmFsPVxcXCI1XFxcIiB2YWx1ZT1cXFwiMjBcXFwiIGNvbG9yPVxcXCJhY2NlbnRcXFwiPjwvbWF0LXNsaWRlcj5cXG4gICAgICAgICAgICAgICAgPG1hdC1zbGlkZXIgdGh1bWJMYWJlbCB0aWNrLWludGVydmFsPVxcXCJhdXRvXFxcIiB2YWx1ZT1cXFwiMlxcXCIgY29sb3I9XFxcIndhcm5cXFwiPjwvbWF0LXNsaWRlcj5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICA8IVtDREFUQVtcXG4gICAgICAgIDxtYXQtc2xpZGVyIG1pbj1cXFwiMVxcXCIgbWF4PVxcXCI1XFxcIiB0aHVtYkxhYmVsIHRpY2tJbnRlcnZhbD1cXFwiMVxcXCIgdmFsdWU9XFxcIjJcXFwiIGNvbG9yPVxcXCJwcmltYXJ5XFxcIj48L21hdC1zbGlkZXI+XFxuICAgICAgICA8bWF0LXNsaWRlciBzdGVwPVxcXCI1XFxcIiB0aHVtYkxhYmVsIHRpY2tJbnRlcnZhbD1cXFwiNVxcXCIgdmFsdWU9XFxcIjIwXFxcIiBjb2xvcj1cXFwiYWNjZW50XFxcIj48L21hdC1zbGlkZXI+XFxuICAgICAgICA8bWF0LXNsaWRlciB0aHVtYkxhYmVsIHRpY2staW50ZXJ2YWw9XFxcImF1dG9cXFwiIHZhbHVlPVxcXCIyXFxcIiBjb2xvcj1cXFwid2FyblxcXCI+PC9tYXQtc2xpZGVyPlxcbiAgICAgICAgXV0+XFxuICAgICAgPC9wcmU+XFxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cXFwibWQtdGl0bGVcXFwiPlZlcnRpY2FsIFNsaWRlcjwvaDM+XFxuICAgICAgICAgICAgICAgIDxtYXQtc2xpZGVyIHZlcnRpY2FsIG1pbj1cXFwiMVxcXCIgbWF4PVxcXCIxMDBcXFwiIHRodW1iTGFiZWwgdGlja0ludGVydmFsPVxcXCIxMFxcXCIgdmFsdWU9XFxcIjJcXFwiPjwvbWF0LXNsaWRlcj5cXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVxcXCJtZC10aXRsZVxcXCI+VXNhZ2U8L2gzPlxcbiAgICAgICAgICAgICAgICA8cD5IVE1MOjwvcD5cXG4gICAgICAgICAgICAgICAgPHByZSBsYW5nPVxcXCJodG1sXFxcIj5cXG4gICAgICA8IVtDREFUQVtcXG4gICAgICAgIDxtYXQtc2xpZGVyIHZlcnRpY2FsIG1pbj1cXFwiMVxcXCIgbWF4PVxcXCIxMDBcXFwiIHRodW1iTGFiZWwgdGlja0ludGVydmFsPVxcXCIxMFxcXCIgdmFsdWU9XFxcIjJcXFwiPjwvbWF0LXNsaWRlcj5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5JbnZlcnRlZCBTbGlkZXI8L2gzPlxcbiAgICAgICAgICAgICAgICA8bWF0LXNsaWRlciBpbnZlcnQgbWluPVxcXCIxXFxcIiBtYXg9XFxcIjEwMFxcXCIgdGh1bWJMYWJlbCB0aWNrSW50ZXJ2YWw9XFxcIjEwXFxcIiB2YWx1ZT1cXFwiMlxcXCI+PC9tYXQtc2xpZGVyPlxcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XFxcIm1kLXRpdGxlXFxcIj5Vc2FnZTwvaDM+XFxuICAgICAgICAgICAgICAgIDxwPkhUTUw6PC9wPlxcbiAgICAgICAgICAgICAgICA8cHJlIGxhbmc9XFxcImh0bWxcXFwiPlxcbiAgICAgIDwhW0NEQVRBW1xcbiAgICAgICAgPG1hdC1zbGlkZXIgaW52ZXJ0IG1pbj1cXFwiMVxcXCIgbWF4PVxcXCIxMDBcXFwiIHRodW1iTGFiZWwgdGlja0ludGVydmFsPVxcXCIxMFxcXCIgdmFsdWU9XFxcIjJcXFwiPjwvbWF0LXNsaWRlcj5cXG4gICAgICAgIF1dPlxcbiAgICAgIDwvcHJlPlxcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cXG4gICAgICAgIDwvbWF0LWNhcmQ+XFxuICAgIDwvZGl2PlxcbjwvbWF0LXNpZGVuYXYtY29udGFpbmVyPlxcblwiOyIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZERhdGFUYWJsZVNlcnZpY2UgfSBmcm9tICdAY292YWxlbnQvY29yZS9kYXRhLXRhYmxlJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcbmltcG9ydCB7IEZkc0RpYWxvZ1NlcnZpY2UsIEZkc1NuYWNrQmFyU2VydmljZSwgRmRzQW5pbWF0aW9ucyB9IGZyb20gJ0BuaWZpLWZkcy9jb3JlJztcbmltcG9ydCBGZHNTZXJ2aWNlIGZyb20gJ3dlYmFwcC9zZXJ2aWNlcy9mZHMuc2VydmljZS5qcyc7XG5pbXBvcnQgRmRzRGVtb0RpYWxvZyBmcm9tICd3ZWJhcHAvY29tcG9uZW50cy9mbG93LWRlc2lnbi1zeXN0ZW0vZGlhbG9ncy9kZW1vL2Zkcy1kZW1vLWRpYWxvZy5qcyc7XG5cbnZhciBOVU1CRVJfRk9STUFUID0gZnVuY3Rpb24gTlVNQkVSX0ZPUk1BVCh2KSB7XG4gIHJldHVybiB2O1xufTtcblxudmFyIERFQ0lNQUxfRk9STUFUID0gZnVuY3Rpb24gREVDSU1BTF9GT1JNQVQodikge1xuICByZXR1cm4gdi50b0ZpeGVkKDIpO1xufTtcblxudmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuLyoqXG4gKiBGZHNEZW1vIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSBGZHNTbmFja0JhclNlcnZpY2UgICAgVGhlIEZEUyBzbmFjayBiYXIgc2VydmljZSBtb2R1bGUuXG4gKiBAcGFyYW0gRmRzU2VydmljZSAgICAgICAgICAgIFRoZSBGRFMgc2VydmljZSBtb2R1bGUuXG4gKiBAcGFyYW0gZGlhbG9nICAgICAgICAgICAgICAgIFRoZSBhbmd1bGFyIG1hdGVyaWFsIGRpYWxvZyBtb2R1bGUuXG4gKiBAcGFyYW0gVGREaWFsb2dTZXJ2aWNlICAgICAgIFRoZSBjb3ZhbGVudCBkaWFsb2cgc2VydmljZSBtb2R1bGUuXG4gKiBAcGFyYW0gVGREYXRhVGFibGVTZXJ2aWNlICAgIFRoZSBjb3ZhbGVudCBkYXRhIHRhYmxlIHNlcnZpY2UgbW9kdWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gRmRzRGVtbyhGZHNTbmFja0JhclNlcnZpY2UsIEZkc1NlcnZpY2UsIGRpYWxvZywgVGREYXRhVGFibGVTZXJ2aWNlLCBGZHNEaWFsb2dTZXJ2aWNlKSB7XG4gIHRoaXMuZmRzU2VydmljZSA9IEZkc1NlcnZpY2U7IC8vPGVkaXRvci1mb2xkIGRlc2M9J1NuYWNrIEJhcnMnPlxuXG4gIHRoaXMuc25hY2tCYXJTZXJ2aWNlID0gRmRzU25hY2tCYXJTZXJ2aWNlOyAvLzwvZWRpdG9yLWZvbGQ+XG4gIC8vPGVkaXRvci1mb2xkIGRlc2M9J0RpYWxvZyc+XG5cbiAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7IC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nU2ltcGxlIERpYWxvZ3MnPlxuXG4gIHRoaXMuZGlhbG9nU2VydmljZSA9IEZkc0RpYWxvZ1NlcnZpY2U7IC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nRXhwYW5zaW9uIFBhbmVsJz5cblxuICB0aGlzLmV4cGFuZENvbGxhcHNlRXhwYW5zaW9uMU1zZyA9ICdObyBleHBhbmRlZC9jb2xsYXBzZWQgZGV0ZWN0ZWQgeWV0JztcbiAgdGhpcy5leHBhbnNpb24xID0gZmFsc2U7XG4gIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTsgLy88L2VkaXRvci1mb2xkPlxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdBdXRvY29tcGxldGUnPlxuXG4gIHRoaXMuY3VycmVudFN0YXRlID0gJyc7XG4gIHRoaXMucmVhY3RpdmVTdGF0ZXMgPSAnJztcbiAgdGhpcy50ZFN0YXRlcyA9IFtdO1xuICB0aGlzLnRkRGlzYWJsZWQgPSBmYWxzZTtcbiAgdGhpcy5zdGF0ZXMgPSBbe1xuICAgIGNvZGU6ICdBTCcsXG4gICAgbmFtZTogJ0FsYWJhbWEnXG4gIH0sIHtcbiAgICBjb2RlOiAnQUsnLFxuICAgIG5hbWU6ICdBbGFza2EnXG4gIH0sIHtcbiAgICBjb2RlOiAnQVonLFxuICAgIG5hbWU6ICdBcml6b25hJ1xuICB9LCB7XG4gICAgY29kZTogJ0FSJyxcbiAgICBuYW1lOiAnQXJrYW5zYXMnXG4gIH0sIHtcbiAgICBjb2RlOiAnQ0EnLFxuICAgIG5hbWU6ICdDYWxpZm9ybmlhJ1xuICB9LCB7XG4gICAgY29kZTogJ0NPJyxcbiAgICBuYW1lOiAnQ29sb3JhZG8nXG4gIH0sIHtcbiAgICBjb2RlOiAnQ1QnLFxuICAgIG5hbWU6ICdDb25uZWN0aWN1dCdcbiAgfSwge1xuICAgIGNvZGU6ICdERScsXG4gICAgbmFtZTogJ0RlbGF3YXJlJ1xuICB9LCB7XG4gICAgY29kZTogJ0ZMJyxcbiAgICBuYW1lOiAnRmxvcmlkYSdcbiAgfSwge1xuICAgIGNvZGU6ICdHQScsXG4gICAgbmFtZTogJ0dlb3JnaWEnXG4gIH0sIHtcbiAgICBjb2RlOiAnSEknLFxuICAgIG5hbWU6ICdIYXdhaWknXG4gIH0sIHtcbiAgICBjb2RlOiAnSUQnLFxuICAgIG5hbWU6ICdJZGFobydcbiAgfSwge1xuICAgIGNvZGU6ICdJTCcsXG4gICAgbmFtZTogJ0lsbGlub2lzJ1xuICB9LCB7XG4gICAgY29kZTogJ0lOJyxcbiAgICBuYW1lOiAnSW5kaWFuYSdcbiAgfSwge1xuICAgIGNvZGU6ICdJQScsXG4gICAgbmFtZTogJ0lvd2EnXG4gIH0sIHtcbiAgICBjb2RlOiAnS1MnLFxuICAgIG5hbWU6ICdLYW5zYXMnXG4gIH0sIHtcbiAgICBjb2RlOiAnS1knLFxuICAgIG5hbWU6ICdLZW50dWNreSdcbiAgfSwge1xuICAgIGNvZGU6ICdMQScsXG4gICAgbmFtZTogJ0xvdWlzaWFuYSdcbiAgfSwge1xuICAgIGNvZGU6ICdNRScsXG4gICAgbmFtZTogJ01haW5lJ1xuICB9LCB7XG4gICAgY29kZTogJ01EJyxcbiAgICBuYW1lOiAnTWFyeWxhbmQnXG4gIH0sIHtcbiAgICBjb2RlOiAnTUEnLFxuICAgIG5hbWU6ICdNYXNzYWNodXNldHRzJ1xuICB9LCB7XG4gICAgY29kZTogJ01JJyxcbiAgICBuYW1lOiAnTWljaGlnYW4nXG4gIH0sIHtcbiAgICBjb2RlOiAnTU4nLFxuICAgIG5hbWU6ICdNaW5uZXNvdGEnXG4gIH0sIHtcbiAgICBjb2RlOiAnTVMnLFxuICAgIG5hbWU6ICdNaXNzaXNzaXBwaSdcbiAgfSwge1xuICAgIGNvZGU6ICdNTycsXG4gICAgbmFtZTogJ01pc3NvdXJpJ1xuICB9LCB7XG4gICAgY29kZTogJ01UJyxcbiAgICBuYW1lOiAnTW9udGFuYSdcbiAgfSwge1xuICAgIGNvZGU6ICdORScsXG4gICAgbmFtZTogJ05lYnJhc2thJ1xuICB9LCB7XG4gICAgY29kZTogJ05WJyxcbiAgICBuYW1lOiAnTmV2YWRhJ1xuICB9LCB7XG4gICAgY29kZTogJ05IJyxcbiAgICBuYW1lOiAnTmV3IEhhbXBzaGlyZSdcbiAgfSwge1xuICAgIGNvZGU6ICdOSicsXG4gICAgbmFtZTogJ05ldyBKZXJzZXknXG4gIH0sIHtcbiAgICBjb2RlOiAnTk0nLFxuICAgIG5hbWU6ICdOZXcgTWV4aWNvJ1xuICB9LCB7XG4gICAgY29kZTogJ05ZJyxcbiAgICBuYW1lOiAnTmV3IFlvcmsnXG4gIH0sIHtcbiAgICBjb2RlOiAnTkMnLFxuICAgIG5hbWU6ICdOb3J0aCBDYXJvbGluYSdcbiAgfSwge1xuICAgIGNvZGU6ICdORCcsXG4gICAgbmFtZTogJ05vcnRoIERha290YSdcbiAgfSwge1xuICAgIGNvZGU6ICdPSCcsXG4gICAgbmFtZTogJ09oaW8nXG4gIH0sIHtcbiAgICBjb2RlOiAnT0snLFxuICAgIG5hbWU6ICdPa2xhaG9tYSdcbiAgfSwge1xuICAgIGNvZGU6ICdPUicsXG4gICAgbmFtZTogJ09yZWdvbidcbiAgfSwge1xuICAgIGNvZGU6ICdQQScsXG4gICAgbmFtZTogJ1Blbm5zeWx2YW5pYSdcbiAgfSwge1xuICAgIGNvZGU6ICdSSScsXG4gICAgbmFtZTogJ1Job2RlIElzbGFuZCdcbiAgfSwge1xuICAgIGNvZGU6ICdTQycsXG4gICAgbmFtZTogJ1NvdXRoIENhcm9saW5hJ1xuICB9LCB7XG4gICAgY29kZTogJ1NEJyxcbiAgICBuYW1lOiAnU291dGggRGFrb3RhJ1xuICB9LCB7XG4gICAgY29kZTogJ1ROJyxcbiAgICBuYW1lOiAnVGVubmVzc2VlJ1xuICB9LCB7XG4gICAgY29kZTogJ1RYJyxcbiAgICBuYW1lOiAnVGV4YXMnXG4gIH0sIHtcbiAgICBjb2RlOiAnVVQnLFxuICAgIG5hbWU6ICdVdGFoJ1xuICB9LCB7XG4gICAgY29kZTogJ1ZUJyxcbiAgICBuYW1lOiAnVmVybW9udCdcbiAgfSwge1xuICAgIGNvZGU6ICdWQScsXG4gICAgbmFtZTogJ1ZpcmdpbmlhJ1xuICB9LCB7XG4gICAgY29kZTogJ1dBJyxcbiAgICBuYW1lOiAnV2FzaGluZ3RvbidcbiAgfSwge1xuICAgIGNvZGU6ICdXVicsXG4gICAgbmFtZTogJ1dlc3QgVmlyZ2luaWEnXG4gIH0sIHtcbiAgICBjb2RlOiAnV0knLFxuICAgIG5hbWU6ICdXaXNjb25zaW4nXG4gIH0sIHtcbiAgICBjb2RlOiAnV1knLFxuICAgIG5hbWU6ICdXeW9taW5nJ1xuICB9XTsgLy88L2VkaXRvci1mb2xkPlxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdTZWFyY2hhYmxlIEV4cGFuc2lvbiBQYW5lbHMnPlxuXG4gIHRoaXMuZGF0YVRhYmxlU2VydmljZSA9IFRkRGF0YVRhYmxlU2VydmljZTtcbiAgdGhpcy5kcm9wbGV0cyA9IFt7XG4gICAgaWQ6ICcyM2Y2Y2M1OS0wMTU2LTEwMDAtMDliNC0yYjA2MTAwODkwOTAnLFxuICAgIG5hbWU6ICdEZWNvbXByZXNzaW9uX0NpcmN1bGFyX0Zsb3cnLFxuICAgIGRpc3BsYXlOYW1lOiAnRGVjb21wcmVzc2VkIENpcmN1bGFyIGZsb3cnLFxuICAgIHR5cGU6ICdmbG93JyxcbiAgICBzdWJsYWJlbDogJ0Egc3VibGFiZWwnLFxuICAgIGNvbXBsaWFudDoge1xuICAgICAgaWQ6ICcyNWZkNnZ2ODctMzU0OS0wMDAxLTA1ZzYtNGQ0NTY3ODkwNzY1JyxcbiAgICAgIGxhYmVsOiAnQ29tcGxpYW50JyxcbiAgICAgIHR5cGU6ICdjZXJ0aWZpY2F0aW9uJ1xuICAgIH0sXG4gICAgZmxlZXQ6IHtcbiAgICAgIGlkOiAnMjNmNmNjNTktMzU0OS0wMDAxLTA1ZzYtNGQ0NTY3ODkwNzY1JyxcbiAgICAgIGxhYmVsOiAnRmxlZXQnLFxuICAgICAgdHlwZTogJ2NlcnRpZmljYXRpb24nXG4gICAgfSxcbiAgICBwcm9kOiB7XG4gICAgICBpZDogJzUyZmQ2dnY4Ny0zNTQ5LTAwMDEtMDVnNi00ZDQ1Njc4OTA3NjUnLFxuICAgICAgbGFiZWw6ICdQcm9kdWN0aW9uIFJlYWR5JyxcbiAgICAgIHR5cGU6ICdjZXJ0aWZpY2F0aW9uJ1xuICAgIH0sXG4gICAgc2VjdXJlOiB7XG4gICAgICBpZDogJzMyZjZjYzU5LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXG4gICAgICBsYWJlbDogJ1NlY3VyZScsXG4gICAgICB0eXBlOiAnY2VydGlmaWNhdGlvbidcbiAgICB9LFxuICAgIHZlcnNpb25zOiBbe1xuICAgICAgaWQ6ICcyM2Y2Y2M1OS0wMTU2LTEwMDAtMDZiNC0yYjA4MTAwODkwOTAnLFxuICAgICAgcmV2aXNpb246ICcxJyxcbiAgICAgIGRlcGVuZGVudEZsb3dzOiBbe1xuICAgICAgICBpZDogJzI1ZmQ2dnY4Ny0zNTQ5LTAwMDEtMDVnNi00ZDQ1Njc4OTA3NjUnXG4gICAgICB9XSxcbiAgICAgIGNyZWF0ZWQ6IGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSAtIDEpLFxuICAgICAgdXBkYXRlZDogbmV3IERhdGUoKVxuICAgIH0sIHtcbiAgICAgIGlkOiAnMjVmZDZ2djg3LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXG4gICAgICByZXZpc2lvbjogJzInLFxuICAgICAgZGVwZW5kZW50Rmxvd3M6IFt7XG4gICAgICAgIGlkOiAnMjNmNmNjNTktMDE1Ni0xMDAwLTA2YjQtMmIwODEwMDg5MDkwJ1xuICAgICAgfV0sXG4gICAgICBjcmVhdGVkOiBuZXcgRGF0ZSgpLFxuICAgICAgdXBkYXRlZDogbmV3IERhdGUoKVxuICAgIH1dLFxuICAgIGZsb3dzOiBbXSxcbiAgICBleHRlbnNpb25zOiBbXSxcbiAgICBhc3NldHM6IFtdLFxuICAgIGFjdGlvbnM6IFt7XG4gICAgICAnbmFtZSc6ICdEZWxldGUnLFxuICAgICAgJ2ljb24nOiAnZmEgZmEtY2xvc2UnLFxuICAgICAgJ3Rvb2x0aXAnOiAnRGVsZXRlIFVzZXInXG4gICAgfSwge1xuICAgICAgJ25hbWUnOiAnTWFuYWdlJyxcbiAgICAgICdpY29uJzogJ2ZhIGZhLXVzZXInLFxuICAgICAgJ3Rvb2x0aXAnOiAnTWFuYWdlIFVzZXInXG4gICAgfSwge1xuICAgICAgJ25hbWUnOiAnQWN0aW9uIDMnLFxuICAgICAgJ2ljb24nOiAnZmEgZmEtcXVlc3Rpb24nLFxuICAgICAgJ3Rvb2x0aXAnOiAnV2hhdGV2ZXIgZWxzZSB3ZSB3YW50IHRvIGRvLi4uJ1xuICAgIH1dXG4gIH0sIHtcbiAgICBpZDogJzI1ZmQ2dnY4Ny0zMjQ5LTAwMDEtMDVnNi00ZDQ3Njc4OTA3NjUnLFxuICAgIG5hbWU6ICdEYXRlQ29udmVyc2lvbicsXG4gICAgZGlzcGxheU5hbWU6ICdEYXRlIGNvbnZlcnNpb24nLFxuICAgIHR5cGU6ICdhc3NldCcsXG4gICAgc3VibGFiZWw6ICdBIHN1YmxhYmVsJyxcbiAgICBjb21wbGlhbnQ6IHtcbiAgICAgIGlkOiAnMjVmZDZ2djM0LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXG4gICAgICBsYWJlbDogJ0NvbXBsaWFudCcsXG4gICAgICB0eXBlOiAnY2VydGlmaWNhdGlvbidcbiAgICB9LFxuICAgIHByb2Q6IHtcbiAgICAgIGlkOiAnNTJ2bjZ2djg3LTM1NDktMDAwMS0wNWc2LTRkNDU2Nzg5MDc2NScsXG4gICAgICBsYWJlbDogJ1Byb2R1Y3Rpb24gUmVhZHknLFxuICAgICAgdHlwZTogJ2NlcnRpZmljYXRpb24nXG4gICAgfSxcbiAgICB2ZXJzaW9uczogW3tcbiAgICAgIGlkOiAnMjNmNmljNTktMDE1Ni0xMDAwLTA2YjQtMmIwODEwMDg5MDkwJyxcbiAgICAgIHJldmlzaW9uOiAnMScsXG4gICAgICBkZXBlbmRlbnRGbG93czogW3tcbiAgICAgICAgaWQ6ICcyM2Y2Y2MxOS0wMTU2LTEwMDAtMDZiNC0yYjA4MTAwODkwOTAnXG4gICAgICB9XSxcbiAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKCksXG4gICAgICB1cGRhdGVkOiBuZXcgRGF0ZSgpXG4gICAgfV0sXG4gICAgZmxvd3M6IFtdLFxuICAgIGV4dGVuc2lvbnM6IFtdLFxuICAgIGFzc2V0czogW10sXG4gICAgYWN0aW9uczogW3tcbiAgICAgICduYW1lJzogJ0RlbGV0ZScsXG4gICAgICAnaWNvbic6ICdmYSBmYS1jbG9zZScsXG4gICAgICAndG9vbHRpcCc6ICdEZWxldGUgVXNlcidcbiAgICB9XVxuICB9LCB7XG4gICAgaWQ6ICc1MmZkNnZ2ODctMzI5NC0wMDAxLTA1ZzYtNGQ0NzY3ODkwNzY1JyxcbiAgICBuYW1lOiAnbmlmaS1lbWFpbC1idW5kbGUnLFxuICAgIGRpc3BsYXlOYW1lOiAnbmlmaS1lbWFpbC1idW5kbGUnLFxuICAgIHR5cGU6ICdleHRlbnNpb24nLFxuICAgIHN1YmxhYmVsOiAnQSBzdWJsYWJlbCcsXG4gICAgY29tcGxpYW50OiB7XG4gICAgICBpZDogJzMzZmQ2dnY4Ny0zNTQ5LTAwMDEtMDVnNi00ZDQ1Njc4OTA3NjUnLFxuICAgICAgbGFiZWw6ICdDb21wbGlhbnQnLFxuICAgICAgdGVzdDoge1xuICAgICAgICBsYWJlbDogJ3Rlc3QnXG4gICAgICB9LFxuICAgICAgdHlwZTogJ2NlcnRpZmljYXRpb24nXG4gICAgfSxcbiAgICB2ZXJzaW9uczogW3tcbiAgICAgIGlkOiAnMjNkM2NjNTktMDE1Ni0xMDAwLTA2YjQtMmIwODEwMDg5MDkwJyxcbiAgICAgIHJldmlzaW9uOiAnMScsXG4gICAgICBkZXBlbmRlbnRGbG93czogW3tcbiAgICAgICAgaWQ6ICcyM2Y2Y2M4OS0wMTU2LTEwMDAtMDZiNC0yYjA4MTAwODkwOTAnXG4gICAgICB9XSxcbiAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKCksXG4gICAgICB1cGRhdGVkOiBuZXcgRGF0ZSgpXG4gICAgfV0sXG4gICAgZmxvd3M6IFtdLFxuICAgIGV4dGVuc2lvbnM6IFtdLFxuICAgIGFzc2V0czogW10sXG4gICAgYWN0aW9uczogW3tcbiAgICAgICduYW1lJzogJ0RlbGV0ZScsXG4gICAgICAnaWNvbic6ICdmYSBmYS1jbG9zZScsXG4gICAgICAndG9vbHRpcCc6ICdEZWxldGUgVXNlcidcbiAgICB9LCB7XG4gICAgICAnbmFtZSc6ICdNYW5hZ2UnLFxuICAgICAgJ2ljb24nOiAnZmEgZmEtdXNlcicsXG4gICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgVXNlcidcbiAgICB9XVxuICB9XTtcbiAgdGhpcy5maWx0ZXJlZERyb3BsZXRzID0gW107XG4gIHRoaXMuZHJvcGxldENvbHVtbnMgPSBbe1xuICAgIG5hbWU6ICdpZCcsXG4gICAgbGFiZWw6ICdJRCcsXG4gICAgc29ydGFibGU6IHRydWVcbiAgfSwge1xuICAgIG5hbWU6ICduYW1lJyxcbiAgICBsYWJlbDogJ05hbWUnLFxuICAgIHNvcnRhYmxlOiB0cnVlXG4gIH0sIHtcbiAgICBuYW1lOiAnZGlzcGxheU5hbWUnLFxuICAgIGxhYmVsOiAnRGlzcGxheSBOYW1lJyxcbiAgICBzb3J0YWJsZTogdHJ1ZVxuICB9LCB7XG4gICAgbmFtZTogJ3N1YmxhYmVsJyxcbiAgICBsYWJlbDogJ0xhYmVsJyxcbiAgICBzb3J0YWJsZTogdHJ1ZVxuICB9LCB7XG4gICAgbmFtZTogJ3R5cGUnLFxuICAgIGxhYmVsOiAnVHlwZScsXG4gICAgc29ydGFibGU6IHRydWVcbiAgfV07XG4gIHRoaXMuYWN0aXZlRHJvcGxldENvbHVtbiA9IHRoaXMuZHJvcGxldENvbHVtbnNbMF07XG4gIHRoaXMuYXV0b0NvbXBsZXRlRHJvcGxldHMgPSBbXTtcbiAgdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zID0gW107IC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nRGF0YSBUYWJsZXMnPlxuXG4gIHRoaXMuZGF0YSA9IFt7XG4gICAgJ2lkJzogMSxcbiAgICAnbmFtZSc6ICdGcm96ZW4geW9ndXJ0JyxcbiAgICAndHlwZSc6ICdJY2UgY3JlYW0nLFxuICAgICdjYWxvcmllcyc6IDE1OS4wLFxuICAgICdmYXQnOiA2LjAsXG4gICAgJ2NhcmJzJzogMjQuMCxcbiAgICAncHJvdGVpbic6IDQuMCxcbiAgICAnc29kaXVtJzogODcuMCxcbiAgICAnY2FsY2l1bSc6IDE0LjAsXG4gICAgJ2lyb24nOiAxLjAsXG4gICAgJ2NvbW1lbnRzJzogJ0kgbG92ZSBmcm95byEnLFxuICAgICdhY3Rpb25zJzogW3tcbiAgICAgICduYW1lJzogJ0FjdGlvbiAxJyxcbiAgICAgICdpY29uJzogJ2ZhIGZhLXVzZXInLFxuICAgICAgJ3Rvb2x0aXAnOiAnTWFuYWdlIFVzZXJzJ1xuICAgIH0sIHtcbiAgICAgICduYW1lJzogJ0FjdGlvbiAyJyxcbiAgICAgICdpY29uJzogJ2ZhIGZhLWtleScsXG4gICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgUGVybWlzc2lvbnMnXG4gICAgfV1cbiAgfSwge1xuICAgICdpZCc6IDIsXG4gICAgJ25hbWUnOiAnSWNlIGNyZWFtIHNhbmR3aWNoJyxcbiAgICAndHlwZSc6ICdJY2UgY3JlYW0nLFxuICAgICdjYWxvcmllcyc6IDIzNy4wLFxuICAgICdmYXQnOiA5LjAsXG4gICAgJ2NhcmJzJzogMzcuMCxcbiAgICAncHJvdGVpbic6IDQuMyxcbiAgICAnc29kaXVtJzogMTI5LjAsXG4gICAgJ2NhbGNpdW0nOiA4LjAsXG4gICAgJ2lyb24nOiAxLjAsXG4gICAgJ2FjdGlvbnMnOiBbe1xuICAgICAgJ25hbWUnOiAnQWN0aW9uIDEnLFxuICAgICAgJ2ljb24nOiAnZmEgZmEtdXNlcicsXG4gICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgVXNlcnMnXG4gICAgfSwge1xuICAgICAgJ25hbWUnOiAnQWN0aW9uIDInLFxuICAgICAgJ2ljb24nOiAnZmEgZmEta2V5JyxcbiAgICAgICd0b29sdGlwJzogJ01hbmFnZSBQZXJtaXNzaW9ucydcbiAgICB9LCB7XG4gICAgICAnbmFtZSc6ICdBY3Rpb24gMycsXG4gICAgICAndG9vbHRpcCc6ICdBY3Rpb24gMydcbiAgICB9LCB7XG4gICAgICAnbmFtZSc6ICdBY3Rpb24gNCcsXG4gICAgICAnZGlzYWJsZWQnOiB0cnVlLFxuICAgICAgJ3Rvb2x0aXAnOiAnQWN0aW9uIDQnXG4gICAgfSwge1xuICAgICAgJ25hbWUnOiAnQWN0aW9uIDUnLFxuICAgICAgJ3Rvb2x0aXAnOiAnQWN0aW9uIDUnXG4gICAgfV1cbiAgfSwge1xuICAgICdpZCc6IDMsXG4gICAgJ25hbWUnOiAnRWNsYWlyJyxcbiAgICAndHlwZSc6ICdQYXN0cnknLFxuICAgICdjYWxvcmllcyc6IDI2Mi4wLFxuICAgICdmYXQnOiAxNi4wLFxuICAgICdjYXJicyc6IDI0LjAsXG4gICAgJ3Byb3RlaW4nOiA2LjAsXG4gICAgJ3NvZGl1bSc6IDMzNy4wLFxuICAgICdjYWxjaXVtJzogNi4wLFxuICAgICdpcm9uJzogNy4wLFxuICAgICdhY3Rpb25zJzogW3tcbiAgICAgICduYW1lJzogJ0FjdGlvbiAxJyxcbiAgICAgICdpY29uJzogJ2ZhIGZhLXVzZXInLFxuICAgICAgJ3Rvb2x0aXAnOiAnTWFuYWdlIFVzZXJzJ1xuICAgIH0sIHtcbiAgICAgICduYW1lJzogJ0FjdGlvbiAyJyxcbiAgICAgICdpY29uJzogJ2ZhIGZhLWtleScsXG4gICAgICAndG9vbHRpcCc6ICdNYW5hZ2UgUGVybWlzc2lvbnMnXG4gICAgfSwge1xuICAgICAgJ25hbWUnOiAnQWN0aW9uIDMnLFxuICAgICAgJ3Rvb2x0aXAnOiAnQWN0aW9uIDMnXG4gICAgfSwge1xuICAgICAgJ25hbWUnOiAnQWN0aW9uIDQnLFxuICAgICAgJ2Rpc2FibGVkJzogdHJ1ZSxcbiAgICAgICd0b29sdGlwJzogJ0FjdGlvbiA0J1xuICAgIH0sIHtcbiAgICAgICduYW1lJzogJ0FjdGlvbiA1JyxcbiAgICAgICd0b29sdGlwJzogJ0FjdGlvbiA1J1xuICAgIH1dXG4gIH0sIHtcbiAgICAnaWQnOiA0LFxuICAgICduYW1lJzogJ0N1cGNha2UnLFxuICAgICd0eXBlJzogJ1Bhc3RyeScsXG4gICAgJ2NhbG9yaWVzJzogMzA1LjAsXG4gICAgJ2ZhdCc6IDMuNyxcbiAgICAnY2FyYnMnOiA2Ny4wLFxuICAgICdwcm90ZWluJzogNC4zLFxuICAgICdzb2RpdW0nOiA0MTMuMCxcbiAgICAnY2FsY2l1bSc6IDMuMCxcbiAgICAnaXJvbic6IDguMCxcbiAgICAnYWN0aW9ucyc6IFt7XG4gICAgICAnbmFtZSc6ICdBY3Rpb24gMScsXG4gICAgICAnaWNvbic6ICdmYSBmYS11c2VyJyxcbiAgICAgICd0b29sdGlwJzogJ01hbmFnZSBVc2VycydcbiAgICB9LCB7XG4gICAgICAnbmFtZSc6ICdBY3Rpb24gMicsXG4gICAgICAnaWNvbic6ICdmYSBmYS1rZXknLFxuICAgICAgJ3Rvb2x0aXAnOiAnTWFuYWdlIFBlcm1pc3Npb25zJ1xuICAgIH0sIHtcbiAgICAgICduYW1lJzogJ0FjdGlvbiAzJyxcbiAgICAgICd0b29sdGlwJzogJ0FjdGlvbiAzJ1xuICAgIH0sIHtcbiAgICAgICduYW1lJzogJ0FjdGlvbiA0JyxcbiAgICAgICdkaXNhYmxlZCc6IHRydWUsXG4gICAgICAndG9vbHRpcCc6ICdBY3Rpb24gNCdcbiAgICB9LCB7XG4gICAgICAnbmFtZSc6ICdBY3Rpb24gNScsXG4gICAgICAndG9vbHRpcCc6ICdBY3Rpb24gNSdcbiAgICB9XVxuICB9LCB7XG4gICAgJ2lkJzogNSxcbiAgICAnbmFtZSc6ICdKZWxseSBiZWFuJyxcbiAgICAndHlwZSc6ICdDYW5keScsXG4gICAgJ2NhbG9yaWVzJzogMzc1LjAsXG4gICAgJ2ZhdCc6IDAuMCxcbiAgICAnY2FyYnMnOiA5NC4wLFxuICAgICdwcm90ZWluJzogMC4wLFxuICAgICdzb2RpdW0nOiA1MC4wLFxuICAgICdjYWxjaXVtJzogMC4wLFxuICAgICdpcm9uJzogMC4wXG4gIH0sIHtcbiAgICAnaWQnOiA2LFxuICAgICduYW1lJzogJ0xvbGxpcG9wJyxcbiAgICAndHlwZSc6ICdDYW5keScsXG4gICAgJ2NhbG9yaWVzJzogMzkyLjAsXG4gICAgJ2ZhdCc6IDAuMixcbiAgICAnY2FyYnMnOiA5OC4wLFxuICAgICdwcm90ZWluJzogMC4wLFxuICAgICdzb2RpdW0nOiAzOC4wLFxuICAgICdjYWxjaXVtJzogMC4wLFxuICAgICdpcm9uJzogMi4wXG4gIH0sIHtcbiAgICAnaWQnOiA3LFxuICAgICduYW1lJzogJ0hvbmV5Y29tYicsXG4gICAgJ3R5cGUnOiAnT3RoZXInLFxuICAgICdjYWxvcmllcyc6IDQwOC4wLFxuICAgICdmYXQnOiAzLjIsXG4gICAgJ2NhcmJzJzogODcuMCxcbiAgICAncHJvdGVpbic6IDYuNSxcbiAgICAnc29kaXVtJzogNTYyLjAsXG4gICAgJ2NhbGNpdW0nOiAwLjAsXG4gICAgJ2lyb24nOiA0NS4wXG4gIH0sIHtcbiAgICAnaWQnOiA4LFxuICAgICduYW1lJzogJ0RvbnV0JyxcbiAgICAndHlwZSc6ICdQYXN0cnknLFxuICAgICdjYWxvcmllcyc6IDQ1Mi4wLFxuICAgICdmYXQnOiAyNS4wLFxuICAgICdjYXJicyc6IDUxLjAsXG4gICAgJ3Byb3RlaW4nOiA0LjksXG4gICAgJ3NvZGl1bSc6IDMyNi4wLFxuICAgICdjYWxjaXVtJzogMi4wLFxuICAgICdpcm9uJzogMjIuMFxuICB9LCB7XG4gICAgJ2lkJzogOSxcbiAgICAnbmFtZSc6ICdLaXRLYXQnLFxuICAgICd0eXBlJzogJ0NhbmR5JyxcbiAgICAnY2Fsb3JpZXMnOiA1MTguMCxcbiAgICAnZmF0JzogMjYuMCxcbiAgICAnY2FyYnMnOiA2NS4wLFxuICAgICdwcm90ZWluJzogNy4wLFxuICAgICdzb2RpdW0nOiA1NC4wLFxuICAgICdjYWxjaXVtJzogMTIuMCxcbiAgICAnaXJvbic6IDYuMFxuICB9LCB7XG4gICAgJ2lkJzogMTAsXG4gICAgJ25hbWUnOiAnQ2hvY29sYXRlJyxcbiAgICAndHlwZSc6ICdDYW5keScsXG4gICAgJ2NhbG9yaWVzJzogNTE4LjAsXG4gICAgJ2ZhdCc6IDI2LjAsXG4gICAgJ2NhcmJzJzogNjUuMCxcbiAgICAncHJvdGVpbic6IDcuMCxcbiAgICAnc29kaXVtJzogNTQuMCxcbiAgICAnY2FsY2l1bSc6IDEyLjAsXG4gICAgJ2lyb24nOiA2LjBcbiAgfSwge1xuICAgICdpZCc6IDExLFxuICAgICduYW1lJzogJ0NoYW1veScsXG4gICAgJ3R5cGUnOiAnQ2FuZHknLFxuICAgICdjYWxvcmllcyc6IDUxOC4wLFxuICAgICdmYXQnOiAyNi4wLFxuICAgICdjYXJicyc6IDY1LjAsXG4gICAgJ3Byb3RlaW4nOiA3LjAsXG4gICAgJ3NvZGl1bSc6IDU0LjAsXG4gICAgJ2NhbGNpdW0nOiAxMi4wLFxuICAgICdpcm9uJzogNi4wXG4gIH1dO1xuICB0aGlzLmZpbHRlcmVkRGF0YSA9IHRoaXMuZGF0YTtcbiAgdGhpcy5maWx0ZXJlZFRvdGFsID0gdGhpcy5kYXRhLmxlbmd0aDtcbiAgdGhpcy5jb2x1bW5zID0gW3tcbiAgICBuYW1lOiAnY29tbWVudHMnLFxuICAgIGxhYmVsOiAnQ29tbWVudHMnLFxuICAgIHdpZHRoOiAxMFxuICB9LCB7XG4gICAgbmFtZTogJ25hbWUnLFxuICAgIGxhYmVsOiAnRGVzc2VydCAoMTAwZyBzZXJ2aW5nKScsXG4gICAgc29ydGFibGU6IHRydWUsXG4gICAgd2lkdGg6IDEwXG4gIH0sIHtcbiAgICBuYW1lOiAndHlwZScsXG4gICAgbGFiZWw6ICdUeXBlJyxcbiAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICB3aWR0aDogMTBcbiAgfSwge1xuICAgIG5hbWU6ICdjYWxvcmllcycsXG4gICAgbGFiZWw6ICdDYWxvcmllcycsXG4gICAgbnVtZXJpYzogdHJ1ZSxcbiAgICBmb3JtYXQ6IE5VTUJFUl9GT1JNQVQsXG4gICAgc29ydGFibGU6IHRydWUsXG4gICAgd2lkdGg6IDEwXG4gIH0sIHtcbiAgICBuYW1lOiAnZmF0JyxcbiAgICBsYWJlbDogJ0ZhdCAoZyknLFxuICAgIG51bWVyaWM6IHRydWUsXG4gICAgZm9ybWF0OiBERUNJTUFMX0ZPUk1BVCxcbiAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICB3aWR0aDogMTBcbiAgfSwge1xuICAgIG5hbWU6ICdjYXJicycsXG4gICAgbGFiZWw6ICdDYXJicyAoZyknLFxuICAgIG51bWVyaWM6IHRydWUsXG4gICAgZm9ybWF0OiBOVU1CRVJfRk9STUFULFxuICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgIHdpZHRoOiAxMFxuICB9LCB7XG4gICAgbmFtZTogJ3Byb3RlaW4nLFxuICAgIGxhYmVsOiAnUHJvdGVpbiAoZyknLFxuICAgIG51bWVyaWM6IHRydWUsXG4gICAgZm9ybWF0OiBERUNJTUFMX0ZPUk1BVCxcbiAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICB3aWR0aDogMTBcbiAgfSwge1xuICAgIG5hbWU6ICdzb2RpdW0nLFxuICAgIGxhYmVsOiAnU29kaXVtIChtZyknLFxuICAgIG51bWVyaWM6IHRydWUsXG4gICAgZm9ybWF0OiBOVU1CRVJfRk9STUFULFxuICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgIHdpZHRoOiAxMFxuICB9LCB7XG4gICAgbmFtZTogJ2NhbGNpdW0nLFxuICAgIGxhYmVsOiAnQ2FsY2l1bSAoJSknLFxuICAgIG51bWVyaWM6IHRydWUsXG4gICAgZm9ybWF0OiBOVU1CRVJfRk9STUFULFxuICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgIHdpZHRoOiAxMFxuICB9LCB7XG4gICAgbmFtZTogJ2lyb24nLFxuICAgIGxhYmVsOiAnSXJvbiAoJSknLFxuICAgIG51bWVyaWM6IHRydWUsXG4gICAgZm9ybWF0OiBOVU1CRVJfRk9STUFULFxuICAgIHdpZHRoOiAxMFxuICB9XTtcbiAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgdGhpcy5hdXRvQ29tcGxldGVEYXRhID0gW107XG4gIHRoaXMuc2VsZWN0ZWRSb3dzID0gW107XG4gIHRoaXMuc2VhcmNoVGVybSA9IFtdO1xuICB0aGlzLmZyb21Sb3cgPSAxO1xuICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgdGhpcy5wYWdlU2l6ZSA9IDU7XG4gIHRoaXMucGFnZUNvdW50ID0gMDsgLy88L2VkaXRvci1mb2xkPlxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdDaGlwcyAkIEF1dG9jb21wbGV0ZSc+XG5cbiAgdGhpcy5yZWFkT25seSA9IGZhbHNlO1xuICB0aGlzLml0ZW1zID0gWydzdGVwcGVyJywgJ2V4cGFuc2lvbi1wYW5lbCcsICdtYXJrZG93bicsICdoaWdobGlnaHQnLCAnbG9hZGluZycsICdtZWRpYScsICdjaGlwcycsICdodHRwJywgJ2pzb24tZm9ybWF0dGVyJywgJ3BpcGVzJywgJ25lZWQgbW9yZT8nXTtcbiAgdGhpcy5pdGVtc1JlcXVpcmVNYXRjaCA9IHRoaXMuaXRlbXMuc2xpY2UoMCwgNik7IC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nUmFkaW9zJz5cblxuICB0aGlzLmZhdm9yaXRlU2Vhc29uID0gJ0F1dHVtbic7XG4gIHRoaXMuc2Vhc29uT3B0aW9ucyA9IFsnV2ludGVyJywgJ1NwcmluZycsICdTdW1tZXInLCAnQXV0dW1uJ107IC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nU2VsZWN0Jz5cblxuICB0aGlzLnNlbGVjdGVkVmFsdWUgPSAnJztcbiAgdGhpcy5mb29kcyA9IFt7XG4gICAgdmFsdWU6ICdzdGVhay0wJyxcbiAgICB2aWV3VmFsdWU6ICdTdGVhaydcbiAgfSwge1xuICAgIHZhbHVlOiAncGl6emEtMScsXG4gICAgdmlld1ZhbHVlOiAnUGl6emEnXG4gIH0sIHtcbiAgICB2YWx1ZTogJ3RhY29zLTInLFxuICAgIHZpZXdWYWx1ZTogJ1RhY29zJ1xuICB9XTsgLy88L2VkaXRvci1mb2xkPlxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdDaGVja2JveCc+XG5cbiAgdGhpcy51c2VyID0ge1xuICAgIGFncmVlc1RvVE9TOiBmYWxzZVxuICB9O1xuICB0aGlzLmdyb2NlcmllcyA9IFt7XG4gICAgYm91Z2h0OiB0cnVlLFxuICAgIG5hbWU6ICdTZWl0YW4nXG4gIH0sIHtcbiAgICBib3VnaHQ6IGZhbHNlLFxuICAgIG5hbWU6ICdBbG1vbmQgTWVhbCBGbG91cidcbiAgfSwge1xuICAgIGJvdWdodDogZmFsc2UsXG4gICAgbmFtZTogJ09yZ2FuaWMgRWdncydcbiAgfV07IC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nU2xpZGUgVG9nZ2xlJz5cblxuICB0aGlzLnN5c3RlbXMgPSBbe1xuICAgIG5hbWU6ICdMaWdodHMnLFxuICAgIG9uOiBmYWxzZSxcbiAgICBjb2xvcjogJ3ByaW1hcnknXG4gIH0sIHtcbiAgICBuYW1lOiAnU3Vycm91bmQgU291bmQnLFxuICAgIG9uOiB0cnVlLFxuICAgIGNvbG9yOiAnYWNjZW50J1xuICB9LCB7XG4gICAgbmFtZTogJ1QuVi4nLFxuICAgIG9uOiB0cnVlLFxuICAgIGNvbG9yOiAnd2FybidcbiAgfV07XG4gIHRoaXMuaG91c2UgPSB7XG4gICAgbG9ja0hvdXNlOiBmYWxzZVxuICB9OyAvLzwvZWRpdG9yLWZvbGQ+XG59XG5cbkZkc0RlbW8ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRmRzRGVtbyxcbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nQXV0b2NvbXBsZXRlJz5cbiAgZGlzcGxheUZuOiBmdW5jdGlvbiBkaXNwbGF5Rm4odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgX3R5cGVvZih2YWx1ZSkgPT09ICdvYmplY3QnID8gdmFsdWUubmFtZSA6IHZhbHVlO1xuICB9LFxuICBmaWx0ZXJTdGF0ZXM6IGZ1bmN0aW9uIGZpbHRlclN0YXRlcyh2YWwpIHtcbiAgICByZXR1cm4gdmFsID8gdGhpcy5zdGF0ZXMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gcy5uYW1lLm1hdGNoKG5ldyBSZWdFeHAodmFsLCAnZ2knKSk7XG4gICAgfSkgOiB0aGlzLnN0YXRlcztcbiAgfSxcbiAgLy88L2VkaXRvci1mb2xkPlxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdTbmFjayBCYXJzJz5cbiAgc2hvd1N1Y2Nlc3NTbmFja0JhcjogZnVuY3Rpb24gc2hvd1N1Y2Nlc3NTbmFja0JhcigpIHtcbiAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuQ29hc3Rlcih7XG4gICAgICB0aXRsZTogJ1N1Y2Nlc3MnLFxuICAgICAgbWVzc2FnZTogJ1NvbWUgaGVscCB0ZXh0IHJlZ2FyZGluZyB0aGUgc3VjY2Vzc2Z1bCBldmVudC4nLFxuICAgICAgdmVydGljYWxQb3NpdGlvbjogJ3RvcCcsXG4gICAgICBob3Jpem9udGFsUG9zaXRpb246ICdyaWdodCcsXG4gICAgICBpY29uOiAnZmEgZmEtY2hlY2stY2lyY2xlLW8nLFxuICAgICAgY29sb3I6ICcjMUVCNDc1JyxcbiAgICAgIGR1cmF0aW9uOiAzMDAwXG4gICAgfSk7XG4gIH0sXG4gIHNob3dXYXJuU25hY2tCYXI6IGZ1bmN0aW9uIHNob3dXYXJuU25hY2tCYXIoKSB7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbkNvYXN0ZXIoe1xuICAgICAgdGl0bGU6ICdXYXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6ICdTb21lIGhlbHAgdGV4dCByZWdhcmRpbmcgdGhlIHdhcm5pbmcuJyxcbiAgICAgIHZlcnRpY2FsUG9zaXRpb246ICd0b3AnLFxuICAgICAgaG9yaXpvbnRhbFBvc2l0aW9uOiAnbGVmdCcsXG4gICAgICBpY29uOiAnZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLFxuICAgICAgY29sb3I6ICcjRTk4QTQwJyxcbiAgICAgIGR1cmF0aW9uOiAzMDAwXG4gICAgfSk7XG4gIH0sXG4gIHNob3dFcnJvclNuYWNrQmFyOiBmdW5jdGlvbiBzaG93RXJyb3JTbmFja0JhcigpIHtcbiAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuQ29hc3Rlcih7XG4gICAgICB0aXRsZTogJ0Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdTb21lIGhlbHAgdGV4dCByZWdhcmRpbmcgdGhlIGNyaXRpY2FsIGVycm9yLiBUaGlzIGNvYXN0ZXIgd2lsbCBzdGF5IG9wZW4gdW50aWwgY2xvc2VkIHdpdGggdGhlIGB4YCBvciBpZiBhbm90aGVyIGNvYXN0ZXIgaXMgY3JlYXRlZC4nLFxuICAgICAgdmVydGljYWxQb3NpdGlvbjogJ2JvdHRvbScsXG4gICAgICBob3Jpem9udGFsUG9zaXRpb246ICdyaWdodCcsXG4gICAgICBpY29uOiAnZmEgZmEtdGltZXMtY2lyY2xlLW8nLFxuICAgICAgY29sb3I6ICcjRUY2MTYyJ1xuICAgIH0pO1xuICB9LFxuICBzaG93UmVndWxhclNuYWNrQmFyOiBmdW5jdGlvbiBzaG93UmVndWxhclNuYWNrQmFyKCkge1xuICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW5Db2FzdGVyKHtcbiAgICAgIHRpdGxlOiAnUmVndWxhcicsXG4gICAgICBtZXNzYWdlOiAnU29tZXRoaW5nIGludGVyZXN0aW5nLicsXG4gICAgICB2ZXJ0aWNhbFBvc2l0aW9uOiAnYm90dG9tJyxcbiAgICAgIGhvcml6b250YWxQb3NpdGlvbjogJ2xlZnQnLFxuICAgICAgY29sb3I6ICcjODA4NzkzJyxcbiAgICAgIGR1cmF0aW9uOiAzMDAwXG4gICAgfSk7XG4gIH0sXG4gIC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nRGlhbG9nJz5cbiAgb3BlbkRpYWxvZzogZnVuY3Rpb24gb3BlbkRpYWxvZygpIHtcbiAgICB0aGlzLmRpYWxvZy5vcGVuKEZkc0RlbW9EaWFsb2cpO1xuICB9LFxuICAvLzwvZWRpdG9yLWZvbGQ+XG4gIC8vPGVkaXRvci1mb2xkIGRlc2M9J0V4cGFuc2lvbiBQYW5lbCc+XG4gIHRvZ2dsZUV4cGFuc2lvbjE6IGZ1bmN0aW9uIHRvZ2dsZUV4cGFuc2lvbjEoKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmV4cGFuc2lvbjEgPSAhdGhpcy5leHBhbnNpb24xO1xuICAgIH1cbiAgfSxcbiAgdG9nZ2xlRGlzYWJsZWQ6IGZ1bmN0aW9uIHRvZ2dsZURpc2FibGVkKCkge1xuICAgIHRoaXMuZGlzYWJsZWQgPSAhdGhpcy5kaXNhYmxlZDtcbiAgfSxcbiAgZXhwYW5kRXhwYW5zaW9uMUV2ZW50OiBmdW5jdGlvbiBleHBhbmRFeHBhbnNpb24xRXZlbnQoKSB7XG4gICAgdGhpcy5leHBhbmRDb2xsYXBzZUV4cGFuc2lvbjFNc2cgPSAnRXhwYW5kIGV2ZW50IGVtaXR0ZWQuJztcbiAgfSxcbiAgY29sbGFwc2VFeHBhbnNpb24xRXZlbnQ6IGZ1bmN0aW9uIGNvbGxhcHNlRXhwYW5zaW9uMUV2ZW50KCkge1xuICAgIHRoaXMuZXhwYW5kQ29sbGFwc2VFeHBhbnNpb24xTXNnID0gJ0NvbGxhcHNlIGV2ZW50IGVtaXR0ZWQuJztcbiAgfSxcbiAgLy88L2VkaXRvci1mb2xkPlxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdTaW1wbGUgRGlhbG9ncyc+XG4gIG9wZW5BbGVydDogZnVuY3Rpb24gb3BlbkFsZXJ0KCkge1xuICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuQWxlcnQoe1xuICAgICAgdGl0bGU6ICdBbGVydCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBtZXNzYWdlOiAnVGhpcyBpcyBob3cgc2ltcGxlIGl0IGlzIHRvIGNyZWF0ZSBhbiBhbGVydCB3aXRoIHRoaXMgd3JhcHBlciBzZXJ2aWNlLidcbiAgICB9KTtcbiAgfSxcbiAgb3BlbkNvbmZpcm06IGZ1bmN0aW9uIG9wZW5Db25maXJtKCkge1xuICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuQ29uZmlybSh7XG4gICAgICB0aXRsZTogJ0NvbmZpcm0nLFxuICAgICAgbWVzc2FnZTogJ1RoaXMgaXMgaG93IHNpbXBsZSBpdCBpcyB0byBjcmVhdGUgYSBjb25maXJtIHdpdGggdGhpcyB3cmFwcGVyIHNlcnZpY2UuIERvIHlvdSBhZ3JlZT8nLFxuICAgICAgY2FuY2VsQnV0dG9uOiAnRGlzYWdyZWUnLFxuICAgICAgYWNjZXB0QnV0dG9uOiAnQWdyZWUnXG4gICAgfSk7XG4gIH0sXG4gIG9wZW5Qcm9tcHQ6IGZ1bmN0aW9uIG9wZW5Qcm9tcHQoKSB7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW5Qcm9tcHQoe1xuICAgICAgdGl0bGU6ICdQcm9tcHQnLFxuICAgICAgbWVzc2FnZTogJ1RoaXMgaXMgaG93IHNpbXBsZSBpdCBpcyB0byBjcmVhdGUgYSBwcm9tcHQgd2l0aCB0aGlzIHdyYXBwZXIgc2VydmljZS4gUHJvbXB0IHNvbWV0aGluZy4nLFxuICAgICAgdmFsdWU6ICdQb3B1bGF0ZWQgdmFsdWUnLFxuICAgICAgY2FuY2VsQnV0dG9uOiAnQ2FuY2VsJyxcbiAgICAgIGFjY2VwdEJ1dHRvbjogJ09rJ1xuICAgIH0pO1xuICB9LFxuICAvLzwvZWRpdG9yLWZvbGQ+XG4gIC8vPGVkaXRvci1mb2xkIGRlc2M9J1NlYXJjaGFibGUgRXhwYW5zaW9uIFBhbmVscyc+XG4gIGlzRHJvcGxldEZpbHRlckNoZWNrZWQ6IGZ1bmN0aW9uIGlzRHJvcGxldEZpbHRlckNoZWNrZWQodGVybSkge1xuICAgIHJldHVybiB0aGlzLmRyb3BsZXRzU2VhcmNoVGVybXMuaW5kZXhPZih0ZXJtKSA+IC0xO1xuICB9LFxuICBnZXREcm9wbGV0VHlwZUNvdW50OiBmdW5jdGlvbiBnZXREcm9wbGV0VHlwZUNvdW50KHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERyb3BsZXRzLmZpbHRlcihmdW5jdGlvbiAoZHJvcGxldCkge1xuICAgICAgcmV0dXJuIGRyb3BsZXQudHlwZSA9PT0gdHlwZTtcbiAgICB9KS5sZW5ndGg7XG4gIH0sXG4gIGdldERyb3BsZXRDZXJ0aWZpY2F0aW9uQ291bnQ6IGZ1bmN0aW9uIGdldERyb3BsZXRDZXJ0aWZpY2F0aW9uQ291bnQoY2VydGlmaWNhdGlvbikge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkRHJvcGxldHMuZmlsdGVyKGZ1bmN0aW9uIChkcm9wbGV0KSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoZHJvcGxldCkuZmluZChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09IGNlcnRpZmljYXRpb24gJiYgZHJvcGxldFtjZXJ0aWZpY2F0aW9uXS50eXBlID09PSAnY2VydGlmaWNhdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZHJvcGxldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfSkubGVuZ3RoO1xuICB9LFxuICBnZXRTb3J0Qnk6IGZ1bmN0aW9uIGdldFNvcnRCeSgpIHtcbiAgICB2YXIgc29ydEJ5Q29sdW1uTGFiZWw7XG4gICAgdmFyIGFycmF5TGVuZ3RoID0gdGhpcy5kcm9wbGV0Q29sdW1ucy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmRyb3BsZXRDb2x1bW5zW2ldLmFjdGl2ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBzb3J0QnlDb2x1bW5MYWJlbCA9IHRoaXMuZHJvcGxldENvbHVtbnNbaV0ubGFiZWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3J0QnlDb2x1bW5MYWJlbDtcbiAgfSxcbiAgc29ydERyb3BsZXRzOiBmdW5jdGlvbiBzb3J0RHJvcGxldHMoY29sdW1uKSB7XG4gICAgaWYgKGNvbHVtbi5zb3J0YWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gdG9nZ2xlIGNvbHVtbiBzb3J0IG9yZGVyXG4gICAgICBjb2x1bW4uc29ydE9yZGVyID0gY29sdW1uLnNvcnRPcmRlciA9PT0gJ0FTQycgPyAnREVTQycgOiAnQVNDJztcbiAgICAgIHZhciBzb3J0T3JkZXIgPSBjb2x1bW4uc29ydE9yZGVyO1xuICAgICAgdGhpcy5maWx0ZXJEcm9wbGV0cyhjb2x1bW4ubmFtZSwgc29ydE9yZGVyKTsgLy9vbmx5IG9uZSBjb2x1bW4gY2FuIGJlIGFjdGl2ZWx5IHNvcnRlZCBzbyB3ZSByZXNldCBhbGwgdG8gaW5hY3RpdmVcblxuICAgICAgdGhpcy5kcm9wbGV0Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGMuYWN0aXZlID0gZmFsc2U7XG4gICAgICB9KTsgLy9hbmQgc2V0IHRoaXMgY29sdW1uIGFzIHRoZSBhY3RpdmVseSBzb3J0ZWQgY29sdW1uXG5cbiAgICAgIGNvbHVtbi5hY3RpdmUgPSB0cnVlO1xuICAgICAgdGhpcy5hY3RpdmVEcm9wbGV0Q29sdW1uID0gY29sdW1uO1xuICAgIH1cbiAgfSxcbiAgdG9nZ2xlRHJvcGxldHNGaWx0ZXI6IGZ1bmN0aW9uIHRvZ2dsZURyb3BsZXRzRmlsdGVyKHNlYXJjaFRlcm0pIHtcbiAgICB2YXIgYXBwbHlTZWFyY2hUZXJtID0gdHJ1ZTsgLy8gY2hlY2sgaWYgdGhlIHNlYXJjaCB0ZXJtIGlzIGFscmVhZHkgYXBwbGllZCBhbmQgcmVtb3ZlIGl0IGlmIHRydWVcblxuICAgIGlmICh0aGlzLmRyb3BsZXRzU2VhcmNoVGVybXMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGFycmF5TGVuZ3RoID0gdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuZHJvcGxldHNTZWFyY2hUZXJtcy5pbmRleE9mKHNlYXJjaFRlcm0pO1xuXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgdGhpcy5kcm9wbGV0c1NlYXJjaFRlcm1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgYXBwbHlTZWFyY2hUZXJtID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIGlmIHdlIGp1c3QgcmVtb3ZlZCB0aGUgc2VhcmNoIHRlcm0gZG8gTk9UIGFwcGx5IGl0IGFnYWluXG5cblxuICAgIGlmIChhcHBseVNlYXJjaFRlcm0pIHtcbiAgICAgIHRoaXMuZHJvcGxldHNTZWFyY2hUZXJtcy5wdXNoKHNlYXJjaFRlcm0pO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyRHJvcGxldHModGhpcy5hY3RpdmVEcm9wbGV0Q29sdW1uLm5hbWUsIHRoaXMuYWN0aXZlRHJvcGxldENvbHVtbi5zb3J0T3JkZXIpO1xuICB9LFxuICBmaWx0ZXJEcm9wbGV0czogZnVuY3Rpb24gZmlsdGVyRHJvcGxldHMoc29ydEJ5LCBzb3J0T3JkZXIpIHtcbiAgICAvLyBpZiBgc29ydE9yZGVyYCBpcyBgdW5kZWZpbmVkYCB0aGVuIHVzZSAnQVNDJ1xuICAgIGlmIChzb3J0T3JkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc29ydE9yZGVyID0gJ0FTQyc7XG4gICAgfSAvLyBpZiBgc29ydEJ5YCBpcyBgdW5kZWZpbmVkYCB0aGVuIGZpbmQgdGhlIGZpcnN0IHNvcnRhYmxlIGNvbHVtbiBpbiB0aGlzLmRyb3BsZXRDb2x1bW5zXG5cblxuICAgIGlmIChzb3J0QnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGFycmF5TGVuZ3RoID0gdGhpcy5kcm9wbGV0Q29sdW1ucy5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5kcm9wbGV0Q29sdW1uc1tpXS5zb3J0YWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHNvcnRCeSA9IHRoaXMuZHJvcGxldENvbHVtbnNbaV0ubmFtZTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZURyb3BsZXRDb2x1bW4gPSB0aGlzLmRyb3BsZXRDb2x1bW5zW2ldOyAvL29ubHkgb25lIGNvbHVtbiBjYW4gYmUgYWN0aXZlbHkgc29ydGVkIHNvIHdlIHJlc2V0IGFsbCB0byBpbmFjdGl2ZVxuXG4gICAgICAgICAgdGhpcy5kcm9wbGV0Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICBjLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgIH0pOyAvL2FuZCBzZXQgdGhpcyBjb2x1bW4gYXMgdGhlIGFjdGl2ZWx5IHNvcnRlZCBjb2x1bW5cblxuICAgICAgICAgIHRoaXMuZHJvcGxldENvbHVtbnNbaV0uYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmRyb3BsZXRDb2x1bW5zW2ldLnNvcnRPcmRlciA9IHNvcnRPcmRlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXdEYXRhID0gdGhpcy5kcm9wbGV0cztcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0aGlzLmRyb3BsZXRzU2VhcmNoVGVybXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBuZXdEYXRhID0gdGhpcy5maWx0ZXJEYXRhKG5ld0RhdGEsIHRoaXMuZHJvcGxldHNTZWFyY2hUZXJtc1tfaV0sIHRydWUsIHRoaXMuYWN0aXZlRHJvcGxldENvbHVtbi5uYW1lKTtcbiAgICB9XG5cbiAgICBuZXdEYXRhID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLnNvcnREYXRhKG5ld0RhdGEsIHNvcnRCeSwgc29ydE9yZGVyKTtcbiAgICB0aGlzLmZpbHRlcmVkRHJvcGxldHMgPSBuZXdEYXRhO1xuICAgIHRoaXMuZ2V0QXV0b0NvbXBsZXRlRHJvcGxldHMoKTtcbiAgfSxcbiAgZ2V0QXV0b0NvbXBsZXRlRHJvcGxldHM6IGZ1bmN0aW9uIGdldEF1dG9Db21wbGV0ZURyb3BsZXRzKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmF1dG9Db21wbGV0ZURyb3BsZXRzID0gW107XG4gICAgdGhpcy5kcm9wbGV0Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICBzZWxmLmZpbHRlcmVkRHJvcGxldHMuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgICByZXR1cm4gcltjLm5hbWUudG9Mb3dlckNhc2UoKV0gPyBzZWxmLmF1dG9Db21wbGV0ZURyb3BsZXRzLnB1c2gocltjLm5hbWUudG9Mb3dlckNhc2UoKV0udG9TdHJpbmcoKSkgOiAnJztcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICAvLzwvZWRpdG9yLWZvbGQ+XG4gIGZpbHRlckRhdGE6IGZ1bmN0aW9uIGZpbHRlckRhdGEoZGF0YSwgc2VhcmNoVGVybSwgaWdub3JlQ2FzZSkge1xuICAgIHZhciBmaWVsZCA9ICcnO1xuXG4gICAgaWYgKHNlYXJjaFRlcm0uaW5kZXhPZignOicpID4gLTEpIHtcbiAgICAgIGZpZWxkID0gc2VhcmNoVGVybS5zcGxpdCgnOicpWzBdLnRyaW0oKTtcbiAgICAgIHNlYXJjaFRlcm0gPSBzZWFyY2hUZXJtLnNwbGl0KCc6JylbMV0udHJpbSgpO1xuICAgIH1cblxuICAgIHZhciBmaWx0ZXIgPSBzZWFyY2hUZXJtID8gaWdub3JlQ2FzZSA/IHNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKSA6IHNlYXJjaFRlcm0gOiAnJztcblxuICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICB2YXIgcmVzID0gT2JqZWN0LmtleXMoaXRlbSkuZmluZChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgaWYgKGZpZWxkLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgICAgICB2YXIgb2JqQXJyYXkgPSBmaWVsZC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgdmFyIG9iaiA9IGl0ZW07XG4gICAgICAgICAgICB2YXIgYXJyYXlMZW5ndGggPSBvYmpBcnJheS5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9iaiA9IG9ialtvYmpBcnJheVtpXV07XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIF9wcmVJdGVtVmFsdWUgPSAnJyArIG9iajtcblxuICAgICAgICAgICAgdmFyIF9pdGVtVmFsdWUgPSBpZ25vcmVDYXNlID8gX3ByZUl0ZW1WYWx1ZS50b0xvd2VyQ2FzZSgpIDogX3ByZUl0ZW1WYWx1ZTtcblxuICAgICAgICAgICAgcmV0dXJuIF9pdGVtVmFsdWUuaW5kZXhPZihmaWx0ZXIpID4gLTE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGtleSAhPT0gZmllbGQgJiYgZmllbGQgIT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHByZUl0ZW1WYWx1ZSA9ICcnICsgaXRlbVtrZXldO1xuICAgICAgICAgIHZhciBpdGVtVmFsdWUgPSBpZ25vcmVDYXNlID8gcHJlSXRlbVZhbHVlLnRvTG93ZXJDYXNlKCkgOiBwcmVJdGVtVmFsdWU7XG4gICAgICAgICAgcmV0dXJuIGl0ZW1WYWx1ZS5pbmRleE9mKGZpbHRlcikgPiAtMTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAhKHR5cGVvZiByZXMgPT09ICd1bmRlZmluZWQnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9LFxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPSdEYXRhIFRhYmxlcyc+XG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoc29ydEV2ZW50LCBjb2x1bW4pIHtcbiAgICBpZiAoY29sdW1uLnNvcnRhYmxlKSB7XG4gICAgICB2YXIgc29ydEJ5ID0gY29sdW1uLm5hbWU7XG4gICAgICBjb2x1bW4uc29ydE9yZGVyID0gY29sdW1uLnNvcnRPcmRlciA9PT0gJ0FTQycgPyAnREVTQycgOiAnQVNDJztcbiAgICAgIHZhciBzb3J0T3JkZXIgPSBjb2x1bW4uc29ydE9yZGVyO1xuICAgICAgdGhpcy5maWx0ZXIoc29ydEJ5LCBzb3J0T3JkZXIpOyAvL29ubHkgb25lIGNvbHVtbiBjYW4gYmUgYWN0aXZlbHkgc29ydGVkIHNvIHdlIHJlc2V0IGFsbCB0byBpbmFjdGl2ZVxuXG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgICBjLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfSk7IC8vYW5kIHNldCB0aGlzIGNvbHVtbiBhcyB0aGUgYWN0aXZlbHkgc29ydGVkIGNvbHVtblxuXG4gICAgICBjb2x1bW4uYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIHNlYXJjaFJlbW92ZTogZnVuY3Rpb24gc2VhcmNoUmVtb3ZlKHNlYXJjaFRlcm0pIHtcbiAgICAvL29ubHkgcmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzZWFyY2ggdGVybVxuICAgIHZhciBpbmRleCA9IHRoaXMuc2VhcmNoVGVybS5pbmRleE9mKHNlYXJjaFRlcm0pO1xuXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5zZWFyY2hUZXJtLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgdGhpcy5mcm9tUm93ID0gMTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmZpbHRlcigpO1xuICB9LFxuICBzZWFyY2hBZGQ6IGZ1bmN0aW9uIHNlYXJjaEFkZChzZWFyY2hUZXJtKSB7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnB1c2goc2VhcmNoVGVybSk7XG4gICAgdGhpcy5mcm9tUm93ID0gMTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmZpbHRlcigpO1xuICB9LFxuICBwYWdlOiBmdW5jdGlvbiBwYWdlKHBhZ2luZ0V2ZW50KSB7XG4gICAgdGhpcy5mcm9tUm93ID0gcGFnaW5nRXZlbnQuZnJvbVJvdztcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnaW5nRXZlbnQucGFnZTtcbiAgICB0aGlzLnBhZ2VTaXplID0gcGFnaW5nRXZlbnQucGFnZVNpemU7XG4gICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmZpbHRlcigpO1xuICB9LFxuICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihzb3J0QnksIHNvcnRPcmRlcikge1xuICAgIGlmICh0aGlzLmFsbFJvd3NTZWxlY3RlZCkge1xuICAgICAgdGhpcy50b2dnbGVTZWxlY3RBbGwoKTtcbiAgICB9XG5cbiAgICB0aGlzLmRlc2VsZWN0QWxsKCk7XG4gICAgdmFyIG5ld0RhdGEgPSB0aGlzLmRhdGE7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2VhcmNoVGVybS5sZW5ndGg7IGkrKykge1xuICAgICAgbmV3RGF0YSA9IHRoaXMuZmlsdGVyRGF0YShuZXdEYXRhLCB0aGlzLnNlYXJjaFRlcm1baV0sIHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyZWRUb3RhbCA9IG5ld0RhdGEubGVuZ3RoO1xuICAgIG5ld0RhdGEgPSB0aGlzLmRhdGFUYWJsZVNlcnZpY2Uuc29ydERhdGEobmV3RGF0YSwgc29ydEJ5LCBzb3J0T3JkZXIpO1xuICAgIHRoaXMucGFnZUNvdW50ID0gbmV3RGF0YS5sZW5ndGg7XG4gICAgbmV3RGF0YSA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5wYWdlRGF0YShuZXdEYXRhLCB0aGlzLmZyb21Sb3csIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcbiAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IG5ld0RhdGE7XG4gICAgdGhpcy5nZXRBdXRvQ29tcGxldGVEYXRhKCk7XG4gIH0sXG4gIHRvZ2dsZVNlbGVjdDogZnVuY3Rpb24gdG9nZ2xlU2VsZWN0KHJvdykge1xuICAgIGlmICh0aGlzLmFsbEZpbHRlcmVkUm93c1NlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuYWxsUm93c1NlbGVjdGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIHRvZ2dsZVNlbGVjdEFsbDogZnVuY3Rpb24gdG9nZ2xlU2VsZWN0QWxsKCkge1xuICAgIGlmICh0aGlzLmFsbFJvd3NTZWxlY3RlZCkge1xuICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZXNlbGVjdEFsbCgpO1xuICAgIH1cbiAgfSxcbiAgc2VsZWN0QWxsOiBmdW5jdGlvbiBzZWxlY3RBbGwoKSB7XG4gICAgdGhpcy5maWx0ZXJlZERhdGEuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgYy5jaGVja2VkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfSxcbiAgZGVzZWxlY3RBbGw6IGZ1bmN0aW9uIGRlc2VsZWN0QWxsKCkge1xuICAgIHRoaXMuZmlsdGVyZWREYXRhLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgIGMuY2hlY2tlZCA9IGZhbHNlO1xuICAgIH0pO1xuICB9LFxuICBhbGxGaWx0ZXJlZFJvd3NTZWxlY3RlZDogZnVuY3Rpb24gYWxsRmlsdGVyZWRSb3dzU2VsZWN0ZWQoKSB7XG4gICAgdmFyIGFsbEZpbHRlcmVkUm93c1NlbGVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLmZpbHRlcmVkRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICBpZiAoYy5jaGVja2VkID09PSB1bmRlZmluZWQgfHwgYy5jaGVja2VkID09PSBmYWxzZSkge1xuICAgICAgICBhbGxGaWx0ZXJlZFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhbGxGaWx0ZXJlZFJvd3NTZWxlY3RlZDtcbiAgfSxcbiAgYXJlVG9vbHRpcHNPbjogZnVuY3Rpb24gYXJlVG9vbHRpcHNPbigpIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zWzBdLmhhc093blByb3BlcnR5KCd0b29sdGlwJyk7XG4gIH0sXG4gIHRvZ2dsZVRvb2x0aXBzOiBmdW5jdGlvbiB0b2dnbGVUb29sdGlwcygpIHtcbiAgICBpZiAodGhpcy5jb2x1bW5zWzBdLnRvb2x0aXApIHtcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGRlbGV0ZSBjLnRvb2x0aXA7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgYy50b29sdGlwID0gJ1RoaXMgaXMgJyArIGMubGFiZWwgKyAnISc7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIG9wZW5EYXRhVGFibGVQcm9tcHQ6IGZ1bmN0aW9uIG9wZW5EYXRhVGFibGVQcm9tcHQocm93LCBuYW1lKSB7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW5Qcm9tcHQoe1xuICAgICAgbWVzc2FnZTogJ0VudGVyIGNvbW1lbnQ/JyxcbiAgICAgIHZhbHVlOiByb3dbbmFtZV1cbiAgICB9KS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJvd1tuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICBnZXRBdXRvQ29tcGxldGVEYXRhOiBmdW5jdGlvbiBnZXRBdXRvQ29tcGxldGVEYXRhKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmF1dG9Db21wbGV0ZURhdGEgPSBbXTtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgc2VsZi5maWx0ZXJlZERhdGEuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgICByZXR1cm4gcltjLm5hbWUudG9Mb3dlckNhc2UoKV0gPyBzZWxmLmF1dG9Db21wbGV0ZURhdGEucHVzaChyW2MubmFtZS50b0xvd2VyQ2FzZSgpXS50b1N0cmluZygpKSA6ICcnO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIC8vPC9lZGl0b3ItZm9sZD5cbiAgLy88ZWRpdG9yLWZvbGQgZGVzYz0nQ2hpcHMgJCBBdXRvY29tcGxldGUnPlxuICB0b2dnbGVSZWFkT25seTogZnVuY3Rpb24gdG9nZ2xlUmVhZE9ubHkoKSB7XG4gICAgdGhpcy5yZWFkT25seSA9ICF0aGlzLnJlYWRPbmx5O1xuICB9LFxuICAvLzwvZWRpdG9yLWZvbGQ+XG4gIC8vPGVkaXRvci1mb2xkIGRlc2M9J0xpZmUgQ3ljbGUgTGlzdGVuZXJzJz5cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50XG4gICAqL1xuICBuZ09uSW5pdDogZnVuY3Rpb24gbmdPbkluaXQoKSB7XG4gICAgdGhpcy5maWx0ZXIoKTtcbiAgICB0aGlzLmZpbHRlckRyb3BsZXRzKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlc3BvbmQgYWZ0ZXIgQW5ndWxhciBjaGVja3MgdGhlIGNvbXBvbmVudCdzIHZpZXdzIGFuZCBjaGlsZCB2aWV3c1xuICAgKi9cbiAgbmdBZnRlclZpZXdDaGVja2VkOiBmdW5jdGlvbiBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgdGhpcy5mZHNTZXJ2aWNlLmluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgfSAvLzwvZWRpdG9yLWZvbGQ+XG5cbn07XG5GZHNEZW1vLmFubm90YXRpb25zID0gW25ldyBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogcmVxdWlyZSgnLi9mZHMtZGVtby5odG1sJyksXG4gIGFuaW1hdGlvbnM6IFtGZHNBbmltYXRpb25zLnNsaWRlSW5MZWZ0QW5pbWF0aW9uXSxcbiAgaG9zdDoge1xuICAgICdbQHJvdXRlQW5pbWF0aW9uXSc6ICdyb3V0ZUFuaW1hdGlvbidcbiAgfVxufSldO1xuRmRzRGVtby5wYXJhbWV0ZXJzID0gW0Zkc1NuYWNrQmFyU2VydmljZSwgRmRzU2VydmljZSwgTWF0RGlhbG9nLCBUZERhdGFUYWJsZVNlcnZpY2UsIEZkc0RpYWxvZ1NlcnZpY2VdO1xuZXhwb3J0IGRlZmF1bHQgRmRzRGVtbzsiLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlXG4gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGhcbiAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cbiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wXG4gKiAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgJ2NvcmUtanMnO1xuaW1wb3J0ICd6b25lLmpzJztcbmltcG9ydCAnaGFtbWVyanMnO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnO1xuaW1wb3J0IHsgZW5hYmxlUHJvZE1vZGUsIFRSQU5TTEFUSU9OUywgVFJBTlNMQVRJT05TX0ZPUk1BVCwgTE9DQUxFX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgRmRzTW9kdWxlIGZyb20gJ3dlYmFwcC9mZHMubW9kdWxlLmpzJzsgLy8gQ29tbWVudCBvdXQgdGhpcyBsaW5lIHdoZW4gZGV2ZWxvcGluZyB0byBhc3NlcnQgZm9yIHVuaWRpcmVjdGlvbmFsIGRhdGEgZmxvd1xuXG5lbmFibGVQcm9kTW9kZSgpOyAvLyBHZXQgdGhlIGxvY2FsZSBpZCBmcm9tIHRoZSBnbG9iYWxcblxudmFyIGxvY2FsZSA9IG5hdmlnYXRvci5sYW5ndWFnZTtcbnZhciBwcm92aWRlcnMgPSBbXTsgLy8gTm8gbG9jYWxlIG9yIFUuUy4gRW5nbGlzaDogbm8gdHJhbnNsYXRpb24gcHJvdmlkZXJzIHNvIGdvIGFoZWFkIGFuZCBib290c3RyYXAgdGhlIGFwcFxuXG5pZiAoIWxvY2FsZSB8fCBsb2NhbGUgPT09ICdlbi1VUycpIHtcbiAgcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShGZHNNb2R1bGUsIHtcbiAgICBwcm92aWRlcnM6IHByb3ZpZGVyc1xuICB9KTtcbn0gZWxzZSB7XG4gIC8vbG9hZCB0aGUgdHJhbnNsYXRpb24gcHJvdmlkZXJzIGFuZCBib290c3RyYXAgdGhlIG1vZHVsZVxuICB2YXIgdHJhbnNsYXRpb25GaWxlID0gJy9sb2NhbGUvbWVzc2FnZXMuJyArIGxvY2FsZSArICcueGxmJztcbiAgJC5hamF4KHtcbiAgICB1cmw6IHRyYW5zbGF0aW9uRmlsZVxuICB9KS5kb25lKGZ1bmN0aW9uICh0cmFuc2xhdGlvbnMpIHtcbiAgICAvLyBhZGQgcHJvdmlkZXJzIGlmIHRyYW5zbGF0aW9uIGZpbGUgZm9yIGxvY2FsZSBpcyBsb2FkZWRcbiAgICBpZiAodHJhbnNsYXRpb25zKSB7XG4gICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IFRSQU5TTEFUSU9OUyxcbiAgICAgICAgdXNlVmFsdWU6IHRyYW5zbGF0aW9uc1xuICAgICAgfSk7XG4gICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IFRSQU5TTEFUSU9OU19GT1JNQVQsXG4gICAgICAgIHVzZVZhbHVlOiAneGxmJ1xuICAgICAgfSk7XG4gICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IExPQ0FMRV9JRCxcbiAgICAgICAgdXNlVmFsdWU6IGxvY2FsZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShGZHNNb2R1bGUsIHtcbiAgICAgIHByb3ZpZGVyczogcHJvdmlkZXJzXG4gICAgfSk7XG4gIH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuICAgIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoRmRzTW9kdWxlLCB7XG4gICAgICBwcm92aWRlcnM6IHByb3ZpZGVyc1xuICAgIH0pO1xuICB9KTtcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLVxcbkxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxcbmNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxcbnRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5cXG5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxcbih0aGUgXFxcIkxpY2Vuc2VcXFwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXFxudGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcXG5cXG5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcXG5cXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXFxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXFxcIkFTIElTXFxcIiBCQVNJUyxcXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXFxuLS0+XFxuXFxuPG1hdC1wcm9ncmVzcy1zcGlubmVyIGlkPVxcXCJsb2FkaW5nLXNwaW5uZXJcXFwiICpuZ0lmPVxcXCJmZHNTZXJ2aWNlLmluUHJvZ3Jlc3NcXFwiIG1vZGU9XFxcImluZGV0ZXJtaW5hdGVcXFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XFxuPG1hdC1zaWRlbmF2LWNvbnRhaW5lcj5cXG4gICAgPG1hdC1zaWRlbmF2ICNzaWRlbmF2IG1vZGU9XFxcIm92ZXJcXFwiIGFsaWduPVxcXCJlbmRcXFwiIG9wZW5lZD1cXFwiZmFsc2VcXFwiIGRpc2FibGVDbG9zZT1cXFwidHJ1ZVxcXCI+XFxuICAgICAgICA8cm91dGVyLW91dGxldCBuYW1lPVxcXCJzaWRlbmF2XFxcIj48L3JvdXRlci1vdXRsZXQ+XFxuICAgIDwvbWF0LXNpZGVuYXY+XFxuICAgIDxkaXYgaWQ9XFxcImZkcy1hcHAtY29udGFpbmVyXFxcIj5cXG4gICAgICAgIDxtYXQtdG9vbGJhciBpZD1cXFwiZmRzLXRvb2xiYXJcXFwiPlxcbiAgICAgICAgICAgIDwhLS0gPGltZyBpZD1cXFwiZmRzLWxvZ29cXFwiIHNyYz1cXFwiZmRzL2ltYWdlcy9mZHMtbG9nby13ZWItYXBwLnN2Z1xcXCI+IC0tPlxcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XFxcImZkc1NlcnZpY2UucGVyc3BlY3RpdmUgIT09ICdsb2dpbicgJiYgZmRzU2VydmljZS5wZXJzcGVjdGl2ZSAhPT0gJ25vdC1mb3VuZCdcXFwiIGZ4RmxleD1cXFwiMSAxIGF1dG9cXFwiIGNsYXNzPVxcXCJwYWQtbGVmdC14bFxcXCIgW0BmbHlJbk91dF09XFxcImZkc1NlcnZpY2UuYnJlYWRDcnVtYlN0YXRlXFxcIj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInBvaW50ZXJcXFwiPnt7ZmRzU2VydmljZS50aXRsZX19PC9zcGFuPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9tYXQtdG9vbGJhcj5cXG4gICAgICAgIDxkaXYgaWQ9XFxcImZkcy1wZXJzcGVjdGl2ZXMtY29udGFpbmVyXFxcIj5cXG4gICAgICAgICAgICA8cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9tYXQtc2lkZW5hdi1jb250YWluZXI+XFxuXCI7IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgRmRzU2VydmljZSBmcm9tICd3ZWJhcHAvc2VydmljZXMvZmRzLnNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmRzQW5pbWF0aW9ucyB9IGZyb20gJ0BuaWZpLWZkcy9jb3JlJztcbi8qKlxuICogRmRzIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSBmZHNTZXJ2aWNlICAgICAgICAgICAgVGhlIGZkcyBzZXJ2aWNlLlxuICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmICAgICBUaGUgY2hhbmdlIGRldGVjdG9yIHJlZi5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIEZkcyhmZHNTZXJ2aWNlLCBjaGFuZ2VEZXRlY3RvclJlZikge1xuICB0aGlzLmZkc1NlcnZpY2UgPSBmZHNTZXJ2aWNlO1xuICB0aGlzLmNkID0gY2hhbmdlRGV0ZWN0b3JSZWY7XG59XG5cbkZkcy5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBGZHMsXG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgbmdPbkluaXQ6IGZ1bmN0aW9uIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZmRzU2VydmljZS5zaWRlbmF2ID0gdGhpcy5zaWRlbmF2OyAvL25nQ29yZS5WaWV3Q2hpbGRcbiAgfSxcblxuICAvKipcbiAgICogU2luY2UgdGhlIGNoaWxkIHZpZXdzIGFyZSB1cGRhdGluZyB0aGUgZmRzU2VydmljZSB2YWx1ZXMgdGhhdCBhcmUgdXNlZCB0byBkaXNwbGF5XG4gICAqIHRoZSBicmVhZGNydW1icyBpbiB0aGlzIGNvbXBvbmVudCdzIHZpZXcgd2UgbmVlZCB0byBtYW51YWxseSBkZXRlY3QgY2hhbmdlcyBhdCB0aGUgY29ycmVjdFxuICAgKiBwb2ludCBpbiB0aGUgbGlmZWN5Y2xlLlxuICAgKi9cbiAgbmdBZnRlclZpZXdDaGVja2VkOiBmdW5jdGlvbiBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbn07XG5GZHMuYW5ub3RhdGlvbnMgPSBbbmV3IENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmRzLWFwcCcsXG4gIHRlbXBsYXRlOiByZXF1aXJlKCcuL2Zkcy5odG1sJyksXG4gIHF1ZXJpZXM6IHtcbiAgICBzaWRlbmF2OiBuZXcgVmlld0NoaWxkKCdzaWRlbmF2JylcbiAgfSxcbiAgYW5pbWF0aW9uczogW0Zkc0FuaW1hdGlvbnMuZmx5SW5PdXRBbmltYXRpb25dXG59KV07XG5GZHMucGFyYW1ldGVycyA9IFtGZHNTZXJ2aWNlLCBDaGFuZ2VEZXRlY3RvclJlZl07XG5leHBvcnQgZGVmYXVsdCBGZHM7IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZkc0NvcmVNb2R1bGUgfSBmcm9tICdAbmlmaS1mZHMvY29yZSc7XG5pbXBvcnQgRmRzUm91dGVzIGZyb20gJ3dlYmFwcC9mZHMucm91dGVzLmpzJztcbmltcG9ydCBGZHMgZnJvbSAnd2ViYXBwL2Zkcy5qcyc7XG5pbXBvcnQgRmRzRGVtbyBmcm9tICd3ZWJhcHAvY29tcG9uZW50cy9mbG93LWRlc2lnbi1zeXN0ZW0vZmRzLWRlbW8uanMnO1xuaW1wb3J0IEZkc0RlbW9EaWFsb2cgZnJvbSAnd2ViYXBwL2NvbXBvbmVudHMvZmxvdy1kZXNpZ24tc3lzdGVtL2RpYWxvZ3MvZGVtby9mZHMtZGVtby1kaWFsb2cuanMnO1xuaW1wb3J0IEZkc1NlcnZpY2UgZnJvbSAnd2ViYXBwL3NlcnZpY2VzL2Zkcy5zZXJ2aWNlLmpzJztcblxuZnVuY3Rpb24gRmRzTW9kdWxlKCkge31cblxuRmRzTW9kdWxlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEZkc01vZHVsZVxufTtcbkZkc01vZHVsZS5hbm5vdGF0aW9ucyA9IFtuZXcgTmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbRmRzQ29yZU1vZHVsZSwgRmRzUm91dGVzXSxcbiAgZGVjbGFyYXRpb25zOiBbRmRzLCBGZHNEZW1vLCBGZHNEZW1vRGlhbG9nXSxcbiAgZW50cnlDb21wb25lbnRzOiBbRmRzRGVtb0RpYWxvZ10sXG4gIHByb3ZpZGVyczogW0Zkc1NlcnZpY2VdLFxuICBib290c3RyYXA6IFtGZHNdXG59KV07XG5leHBvcnQgZGVmYXVsdCBGZHNNb2R1bGU7IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZVxuICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoXG4gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuXG4gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMFxuICogKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aFxuICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCBGZHNEZW1vIGZyb20gJ3dlYmFwcC9jb21wb25lbnRzL2Zsb3ctZGVzaWduLXN5c3RlbS9mZHMtZGVtby5qcyc7XG52YXIgRmRzUm91dGVzID0gUm91dGVyTW9kdWxlLmZvclJvb3QoW3tcbiAgcGF0aDogJycsXG4gIGNvbXBvbmVudDogRmRzRGVtb1xufV0pO1xuZXhwb3J0IGRlZmF1bHQgRmRzUm91dGVzOyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmVcbiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aFxuICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlxuICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjBcbiAqICh0aGUgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoXG4gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgVGREYXRhVGFibGVTZXJ2aWNlIH0gZnJvbSAnQGNvdmFsZW50L2NvcmUvZGF0YS10YWJsZSc7XG5pbXBvcnQgeyBGZHNEaWFsb2dTZXJ2aWNlLCBGZHNTbmFja0JhclNlcnZpY2UgfSBmcm9tICdAbmlmaS1mZHMvY29yZSc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcbi8qKlxuICogRmRzU2VydmljZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0gdGREYXRhVGFibGVTZXJ2aWNlICAgIFRoZSBjb3ZhbGVudCBkYXRhIHRhYmxlIHNlcnZpY2UgbW9kdWxlLlxuICogQHBhcmFtIGZkc0RpYWxvZ1NlcnZpY2UgICAgICBUaGUgRkRTIGRpYWxvZyBzZXJ2aWNlLlxuICogQHBhcmFtIGZkc1NuYWNrQmFyU2VydmljZSAgICBUaGUgRkRTIHNuYWNrIGJhciBzZXJ2aWNlIG1vZHVsZS5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIEZkc1NlcnZpY2UodGREYXRhVGFibGVTZXJ2aWNlLCBmZHNEaWFsb2dTZXJ2aWNlLCBmZHNTbmFja0JhclNlcnZpY2UpIHtcbiAgLy8gU2VydmljZXNcbiAgdGhpcy5kaWFsb2dTZXJ2aWNlID0gZmRzRGlhbG9nU2VydmljZTtcbiAgdGhpcy5zbmFja0JhclNlcnZpY2UgPSBmZHNTbmFja0JhclNlcnZpY2U7XG4gIHRoaXMuZGF0YVRhYmxlU2VydmljZSA9IHRkRGF0YVRhYmxlU2VydmljZTsgLy8gR2VuZXJhbFxuXG4gIHRoaXMudGl0bGUgPSAnQXBhY2hlIE5pRmkgRmxvdyBEZXNpZ24gU3lzdGVtIERlbW8gdicgKyB2ZXJzaW9uO1xuICB0aGlzLmluUHJvZ3Jlc3MgPSB0cnVlO1xuICB0aGlzLnBlcnNwZWN0aXZlID0gJyc7XG59XG5cbkZkc1NlcnZpY2UucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRmRzU2VydmljZVxufTtcbkZkc1NlcnZpY2UucGFyYW1ldGVycyA9IFtUZERhdGFUYWJsZVNlcnZpY2UsIEZkc0RpYWxvZ1NlcnZpY2UsIEZkc1NuYWNrQmFyU2VydmljZV07XG5leHBvcnQgZGVmYXVsdCBGZHNTZXJ2aWNlOyJdLCJzb3VyY2VSb290IjoiIn0=