diff --git a/.obsidian/plugins/obsidian-activity-history/data.json b/.obsidian/plugins/obsidian-activity-history/data.json
index 0bb5dd42..aab4b75d 100644
--- a/.obsidian/plugins/obsidian-activity-history/data.json
+++ b/.obsidian/plugins/obsidian-activity-history/data.json
@@ -12,8 +12,8 @@
"checkpointList": [
{
"path": "/",
- "date": "2022-04-18",
- "size": 4041085
+ "date": "2022-04-19",
+ "size": 4042722
}
],
"activityHistory": [
@@ -422,7 +422,11 @@
},
{
"date": "2022-04-18",
- "value": 2216
+ "value": 2740
+ },
+ {
+ "date": "2022-04-19",
+ "value": 1149
}
]
}
diff --git a/.obsidian/plugins/obsidian-commits/data.json b/.obsidian/plugins/obsidian-commits/data.json
index 61636c18..55c47a40 100644
--- a/.obsidian/plugins/obsidian-commits/data.json
+++ b/.obsidian/plugins/obsidian-commits/data.json
@@ -612,7 +612,7 @@
"03.03 Food & Wine/Udon in Buttery Tomato n Soy broth.md": {
"size": 3268,
"tags": 1,
- "links": 2
+ "links": 4
},
"03.03 Food & Wine/Aromatic Beef Pilaf.md": {
"size": 4232,
@@ -2297,7 +2297,7 @@
"00.03 News/Lovemaking for longevity a recipe from Tokyo’s imperial archives Aeon Essays.md": {
"size": 21130,
"tags": 2,
- "links": 1
+ "links": 2
},
"00.03 News/How the enigmatic Nefertiti came to be locked away in Germany Aeon Essays.md": {
"size": 20808,
@@ -2322,7 +2322,7 @@
"00.03 News/The 1918 flu didn’t end in 1918. Here’s what its third year can teach us..md": {
"size": 9566,
"tags": 3,
- "links": 1
+ "links": 2
},
"00.03 News/XXX-Files Who Torched the Pornhub Palace.md": {
"size": 37911,
@@ -2347,7 +2347,7 @@
"03.03 Food & Wine/Thai Basil Sauce Noodles with Jammy Eggs.md": {
"size": 3289,
"tags": 3,
- "links": 2
+ "links": 4
},
"00.03 News/Why it can be sublime to love someone who doesn’t love you back.md": {
"size": 10501,
@@ -2657,7 +2657,7 @@
"00.03 News/What i learnt during my 3 days offline.md": {
"size": 12408,
"tags": 3,
- "links": 1
+ "links": 2
},
"03.03 Food & Wine/Banana Foster.md": {
"size": 3528,
@@ -2781,7 +2781,7 @@
},
"03.03 Food & Wine/Fresh Tomato Eggs in Purgatory with Chickpeas.md": {
"size": 3521,
- "tags": 4,
+ "tags": 3,
"links": 2
},
"01.01 Life Orga/@Life Admin.md": {
@@ -3032,7 +3032,7 @@
"00.03 News/The Bullet and the Ballplayer.md": {
"size": 46208,
"tags": 3,
- "links": 1
+ "links": 2
},
"00.03 News/The dark side of Discord for teens.md": {
"size": 22338,
@@ -3685,51 +3685,56 @@
"links": 2
},
"00.01 Admin/Calendars/2022-04-18.md": {
- "size": 1208,
+ "size": 1639,
"tags": 0,
- "links": 6
+ "links": 9
+ },
+ "00.01 Admin/Calendars/2022-04-19.md": {
+ "size": 1016,
+ "tags": 0,
+ "links": 4
}
},
"commitTypes": {
"/": {
- "Refactor": 500,
- "Create": 394,
- "Link": 789,
- "Expand": 380
+ "Refactor": 501,
+ "Create": 395,
+ "Link": 797,
+ "Expand": 383
}
},
"dailyCommits": {
"/": {
"0": 50,
- "1": 20,
+ "1": 21,
"2": 1,
"3": 9,
"4": 12,
"5": 6,
"6": 17,
- "7": 134,
+ "7": 137,
"8": 210,
"9": 170,
"10": 91,
"11": 77,
"12": 99,
"13": 173,
- "14": 118,
+ "14": 123,
"15": 76,
"16": 62,
"17": 88,
- "18": 238,
- "19": 70,
- "20": 91,
+ "18": 239,
+ "19": 71,
+ "20": 92,
"21": 55,
"22": 155,
- "23": 41
+ "23": 42
}
},
"weeklyCommits": {
"/": {
- "Mon": 314,
- "Tue": 168,
+ "Mon": 323,
+ "Tue": 172,
"Wed": 193,
"Thu": 276,
"Fri": 172,
@@ -3740,6 +3745,9 @@
"recentCommits": {
"/": {
"Expanded": [
+ " 2022-04-19 ",
+ " 2022-04-18 ",
+ " 2022-04-18 ",
" 2022-04-16 ",
" Obsidian plugins ",
" 2022-04-18 ",
@@ -3787,12 +3795,10 @@
" 2022-04-09 Garde-meuble Granny ",
" 2022-04-10 ",
" 2022-04-08 Dej Ag ",
- " 2022-04-09 Garde-meuble Granny ",
- " 2022-04-09 ",
- " 2022-04-08 ",
- " 2022-04-07 "
+ " 2022-04-09 Garde-meuble Granny "
],
"Created": [
+ " 2022-04-19 ",
" 2022-04-18 ",
" 2022-04-17 ",
" The History of the Varsity Jacket, From Harvard to Hip-Hop ",
@@ -3842,8 +3848,7 @@
" 8 Endangered Places We Can Still Save From Climate Change ",
" One Last Trip ",
" ‘This Whole Thing Has F---ed Me Up’ ",
- " E-commerce giants couldn’t deliver. So these islanders built their own online shopping ecosystem ",
- " How did people sleep in the Middle Ages - Medievalists.net "
+ " E-commerce giants couldn’t deliver. So these islanders built their own online shopping ecosystem "
],
"Renamed": [
" The History of the Varsity Jacket, From Harvard to Hip-Hop ",
@@ -4040,6 +4045,14 @@
" Test "
],
"Linked": [
+ " 2022-04-19 ",
+ " What i learnt during my 3 days offline ",
+ " Lovemaking for longevity a recipe from Tokyo’s imperial archives Aeon Essays ",
+ " The Bullet and the Ballplayer ",
+ " 2022-04-18 ",
+ " The 1918 flu didn’t end in 1918. Here’s what its third year can teach us. ",
+ " Thai Basil Sauce Noodles with Jammy Eggs ",
+ " Udon in Buttery Tomato n Soy broth ",
" 2022-04-16 ",
" 2022-04-18 ",
" 2022-04-18 ",
@@ -4082,15 +4095,7 @@
" Big Shells With Spicy Lamb Sausage and Pistachios ",
" Churros with Bittersweet Chocolate Sauce ",
" 2022-04-24 2nd tour élections présidentielles ",
- " 2022-04-10 1er tour Présidentielle ",
- " 2022-04-12 ",
- " 2022-04-11 ",
- " Storj ",
- " Zint ",
- " 2022-04-11 ",
- " 2022-04-10 ",
- " H-Town United An Unlikely Soccer Power Rises in Texas ",
- " Meet the DIY Duo Behind the Amazon Labor Union’s Guerrilla Bid to Make History "
+ " 2022-04-10 1er tour Présidentielle "
],
"Removed Tags from": [
" Le Miel de Paris ",
@@ -4098,7 +4103,8 @@
" Migrants faced the worst of the gig economy, so they made their own delivery app ",
" Confessions of a Bitcoin Widow How a Dream Life Turned into a Nightmare The Walrus ",
" L’enquête « Suisse Secrets » relance le débat sur la liberté de la presse face au secret bancaire ",
- " A Vibe Shift Is Coming "
+ " A Vibe Shift Is Coming ",
+ " Fresh Tomato Eggs in Purgatory with Chickpeas "
],
"Removed Links from": [
" 2022-01-22 ",
diff --git a/.obsidian/plugins/obsidian-map-view/data.json b/.obsidian/plugins/obsidian-map-view/data.json
index 8531ed70..14ad8643 100644
--- a/.obsidian/plugins/obsidian-map-view/data.json
+++ b/.obsidian/plugins/obsidian-map-view/data.json
@@ -84,11 +84,11 @@
}
],
"zoomOnGoFromNote": 15,
- "tilesUrl": null,
"autoZoom": true,
"markerClickBehavior": "samePane",
"newNoteNameFormat": "Location added on {{date:YYYY-MM-DD}}T{{date:HH-mm}}",
- "snippetLines": 3,
+ "showNotePreview": true,
+ "showClusterPreview": false,
"debug": false,
"openIn": [
{
@@ -97,12 +97,6 @@
}
],
"urlParsingRules": [
- {
- "name": "Google Maps",
- "regExp": "https:\\/\\/\\S*\\@([0-9\\.\\-]+),([0-9\\.\\-]+)\\S*",
- "order": "latFirst",
- "preset": true
- },
{
"name": "OpenStreetMap Show Address",
"regExp": "https:\\/\\/www.openstreetmap.org\\S*query=([0-9\\.\\-]+%2C[0-9\\.\\-]+)\\S*",
@@ -123,6 +117,8 @@
}
],
"chosenMapMode": "auto",
+ "tilesUrl": null,
+ "snippetLines": 3,
"darkMode": false,
"markerIcons": null,
"defaultZoom": null,
diff --git a/.obsidian/plugins/obsidian-map-view/main.js b/.obsidian/plugins/obsidian-map-view/main.js
index 353f2d07..2f75da1f 100644
--- a/.obsidian/plugins/obsidian-map-view/main.js
+++ b/.obsidian/plugins/obsidian-map-view/main.js
@@ -58,8 +58,8 @@ function __awaiter(thisArg, _arguments, P, generator) {
const MAP_VIEW_NAME = 'map';
// SVG editor used: https://svgedit.netlify.app/editor/index.html
const RIBBON_ICON = '';
-const TILES_URL_OPENSTREETMAP = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png';
const SEARCH_RESULT_MARKER = { prefix: 'fas', icon: 'fa-search', markerColor: 'blue' };
+const MAX_CLUSTER_PREVIEW_ICONS = 4;
const LAT_LIMITS = [-90, 90];
const LNG_LIMITS = [-180, 180];
@@ -14145,9 +14145,18 @@ function formatWithTemplates(s, query = '') {
}
const CURSOR = '$CURSOR$';
function sanitizeFileName(s) {
- const illegalChars = /[\/\?<>\\:\*\|":]/g;
+ const illegalChars = /[\?<>\\:\*\|":]/g;
return s.replace(illegalChars, '-');
}
+/**
+ * Create a new markdown note and populate with the location
+ * @param app The Obsidian App instance
+ * @param newNoteType The location format to encode as
+ * @param directory The directory path to put the file in
+ * @param fileName The name of the file
+ * @param location The geolocation
+ * @param templatePath Optional path to a template to use for constructing the new file
+ */
function newNote(app, newNoteType, directory, fileName, location, templatePath) {
return __awaiter(this, void 0, void 0, function* () {
// `$CURSOR$` is used to set the cursor
@@ -14168,6 +14177,12 @@ function newNote(app, newNoteType, directory, fileName, location, templatePath)
}
});
}
+/**
+ * Go to a character index in the note
+ * @param editor The Obsidian Editor instance
+ * @param fileLocation The character index in the file to go to
+ * @param highlight If true will select the whole line
+ */
function goToEditorLocation(editor, fileLocation, highlight) {
return __awaiter(this, void 0, void 0, function* () {
if (fileLocation) {
@@ -14219,6 +14234,12 @@ function verifyOrAddFrontMatter(editor, fieldName, fieldValue) {
}
return false;
}
+/**
+ * Populate a context menu from the user configurable URLs
+ * @param menu The menu to attach
+ * @param location The geolocation to use in the menu item
+ * @param settings Plugin settings
+ */
function populateOpenInItems(menu, location, settings) {
for (let setting of settings.openIn) {
if (!setting.name || !setting.urlPattern)
@@ -14341,15 +14362,26 @@ class LocationSuggest extends obsidian.EditorSuggest {
}
}
+/** A class to convert a string (usually a URL) into geolocation format */
class UrlConvertor {
constructor(app, settings) {
this.settings = settings;
}
+ /**
+ * Parse the current editor line using the user defined URL parsers.
+ * Returns leaflet.LatLng on success and null on failure.
+ * @param editor The Obsidian Editor instance to use
+ */
findMatchInLine(editor) {
const cursor = editor.getCursor();
const result = this.parseLocationFromUrl(editor.getLine(cursor.line));
return result === null || result === void 0 ? void 0 : result.location;
}
+ /**
+ * Get geolocation from an encoded string (usually a URL).
+ * Will try each url parsing rule until one succeeds.
+ * @param line The string to decode
+ */
parseLocationFromUrl(line) {
for (const rule of this.settings.urlParsingRules) {
const regexp = RegExp(rule.regExp, 'g');
@@ -14368,6 +14400,13 @@ class UrlConvertor {
}
return null;
}
+ /**
+ * Insert a geo link into the editor at the cursor position
+ * @param location The geolocation to convert to text and insert
+ * @param editor The Obsidian Editor instance
+ * @param replaceStart The EditorPosition to start the replacement at. If null will replace any text selected
+ * @param replaceLength The EditorPosition to stop the replacement at. If null will replace any text selected
+ */
insertLocationToEditor(location, editor, replaceStart, replaceLength) {
const locationString = `[](geo:${location.lat},${location.lng})`;
const cursor = editor.getCursor();
@@ -14381,6 +14420,10 @@ class UrlConvertor {
editor.setCursor({ line: cursor.line, ch: newCursorPos });
verifyOrAddFrontMatter(editor, 'locations', '');
}
+ /**
+ * Replace the text at the cursor location with a geo link
+ * @param editor The Obsidian Editor instance
+ */
convertUrlAtCursorToGeolocation(editor) {
const cursor = editor.getCursor();
const result = this.parseLocationFromUrl(editor.getLine(cursor.line));
@@ -17347,21 +17390,22 @@ const DEFAULT_SETTINGS = {
{ ruleName: "#dogs", preset: false, iconDetails: { "prefix": "fas", "icon": "fa-paw" } },
],
zoomOnGoFromNote: 15,
- tilesUrl: TILES_URL_OPENSTREETMAP,
autoZoom: true,
markerClickBehavior: 'samePane',
newNoteNameFormat: 'Location added on {{date:YYYY-MM-DD}}T{{date:HH-mm}}',
- snippetLines: 3,
+ showNotePreview: true,
+ showClusterPreview: false,
debug: false,
openIn: [{ name: 'Google Maps', urlPattern: 'https://maps.google.com/?q={x},{y}' }],
urlParsingRules: [
- { name: 'Google Maps', regExp: /https:\/\/\S*\@([0-9\.\-]+),([0-9\.\-]+)\S*/.source, order: 'latFirst', preset: true },
- { name: 'OpenStreetMap Show Address', regExp: /https:\/\/www.openstreetmap.org\S*query=([0-9\.\-]+%2C[0-9\.\-]+)\S*/.source, order: 'latFirst', preset: true }
+ { name: 'OpenStreetMap Show Address', regExp: /https:\/\/www.openstreetmap.org\S*query=([0-9\.\-]+%2C[0-9\.\-]+)\S*/.source, order: 'latFirst', preset: true },
+ { name: 'Generic Lat,Lng', regExp: /([0-9\.\-]+), ([0-9\.\-]+)/.source, order: 'latFirst', preset: true }
],
mapControls: { filtersDisplayed: true, viewDisplayed: true, presetsDisplayed: false },
maxClusterRadiusPixels: 20,
searchProvider: 'osm',
- mapSources: [{ name: 'OpenStreetMap', urlLight: TILES_URL_OPENSTREETMAP }],
+ mapSources: [{ name: 'CartoDB', urlLight: 'https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png', preset: true }],
+ // mapSources: [{name: 'OpenStreetMap', urlLight: consts.TILES_URL_OPENSTREETMAP}],
chosenMapMode: 'auto'
};
function convertLegacyMarkerIcons(settings) {
@@ -17399,6 +17443,18 @@ function convertLegacyDefaultState(settings) {
}
return false;
}
+function removeLegacyPresets1(settings) {
+ const googleMapsParsingRule = settings.urlParsingRules.findIndex(rule => rule.name == 'Google Maps' && rule.preset);
+ if (googleMapsParsingRule > -1) {
+ settings.urlParsingRules.splice(googleMapsParsingRule, 1);
+ return true;
+ }
+ if (settings.mapSources.findIndex(item => item.name == DEFAULT_SETTINGS.mapSources[0].name) === -1) {
+ settings.mapSources.unshift(DEFAULT_SETTINGS.mapSources[0]);
+ return true;
+ }
+ return false;
+}
/* jshint node: true */
@@ -17681,8 +17737,15 @@ styleInject(css_248z);
// Ugly hack for obsidian-leaflet compatability, see https://github.com/esm7/obsidian-map-view/issues/6
// @ts-ignore
let localL = L;
+/** An object that represents a single marker in a file, which is either a complete note with a geolocation, or an inline geolocation inside a note */
class FileMarker {
+ /**
+ * Construct a new FileMarker object
+ * @param file The file the pin comes from
+ * @param location The geolocation
+ */
constructor(file, location) {
+ /** Tags that this marker includes */
this.tags = [];
this.file = file;
this.location = location;
@@ -17708,6 +17771,14 @@ class FileMarker {
return this.file.name + this.location.lat.toString() + this.location.lng.toString();
}
}
+/**
+ * Create a FileMarker for every front matter and inline geolocation in the given file.
+ * @param mapToAppendTo The list of file markers to append to
+ * @param file The file object to parse
+ * @param settings The plugin settings
+ * @param app The Obsidian App instance
+ * @param skipMetadata If true will not find markers in the front matter
+ */
function buildAndAppendFileMarkers(mapToAppendTo, file, settings, app, skipMetadata) {
return __awaiter(this, void 0, void 0, function* () {
const fileCache = app.metadataCache.getFileCache(file);
@@ -17729,6 +17800,12 @@ function buildAndAppendFileMarkers(mapToAppendTo, file, settings, app, skipMetad
}
});
}
+/**
+ * Create FileMarker instances for all the files in the given list
+ * @param files The list of file objects to find geolocations in.
+ * @param settings The plugin settings
+ * @param app The Obsidian App instance
+ */
function buildMarkers(files, settings, app) {
return __awaiter(this, void 0, void 0, function* () {
if (settings.debug)
@@ -17746,6 +17823,12 @@ function checkTagPatternMatch(tagPattern, tags) {
let match = wildcard(tagPattern, tags);
return match && match.length > 0;
}
+/**
+ * Create a leaflet icon for the marker
+ * @param marker The FileMarker to create the icon for
+ * @param settings The plugin settings
+ * @param app The Obsidian App instance
+ */
function getIconForMarker(marker, settings, app) {
const fileCache = app.metadataCache.getFileCache(marker.file);
// Combine the file tags with the marker-specific tags
@@ -17776,12 +17859,21 @@ function getIconFromOptions(iconSpec) {
L = backupL;
}
}
+/**
+ * Make sure that the coordinates are valid world coordinates
+ * -90 <= longitude <= 90 and -180 <= latitude <= 180
+ * @param location
+ */
function verifyLocation(location) {
if (location.lng < LNG_LIMITS[0] || location.lng > LNG_LIMITS[1])
throw Error(`Lng ${location.lng} is outside the allowed limits`);
if (location.lat < LAT_LIMITS[0] || location.lat > LAT_LIMITS[1])
throw Error(`Lat ${location.lat} is outside the allowed limits`);
}
+/**
+ * Find all inline geolocations in a string
+ * @param content The file contents to find the coordinates in
+ */
function matchInlineLocation(content) {
// Old syntax of ` `location: ... ` `. This syntax doesn't support a name so we leave an empty capture group
const locationRegex1 = /\`()location:\s*\[?([0-9.\-]+)\s*,\s*([0-9.\-]+)\]?\`/g;
@@ -17791,6 +17883,12 @@ function matchInlineLocation(content) {
const matches2 = content.matchAll(locationRegex2);
return Array.from(matches1).concat(Array.from(matches2));
}
+/**
+ * Build markers from inline locations in the file body
+ * @param file The file object to load
+ * @param settings The plugin settings
+ * @param app The Obsidian App instance
+ */
function getMarkersFromFileContent(file, settings, app) {
return __awaiter(this, void 0, void 0, function* () {
let markers = [];
@@ -17812,6 +17910,7 @@ function getMarkersFromFileContent(file, settings, app) {
marker.tags.push('#' + tag[1]);
}
marker.fileLocation = match.index;
+ marker.fileLine = content.substring(0, marker.fileLocation).split('\n').length - 1;
marker.icon = getIconForMarker(marker, settings, app);
marker.snippet = yield makeTextSnippet(file, content, marker.fileLocation, settings);
markers.push(marker);
@@ -17864,6 +17963,11 @@ function makeTextSnippet(file, fileContent, fileLocation, settings) {
return snippet;
});
}
+/**
+ * Get the geolocation stored in the front matter of a file
+ * @param file The file to load the front matter from
+ * @param app The Obsidian App instance
+ */
function getFrontMatterLocation(file, app) {
const fileCache = app.metadataCache.getFileCache(file);
const frontMatter = fileCache === null || fileCache === void 0 ? void 0 : fileCache.frontmatter;
@@ -18205,13 +18309,22 @@ class ViewControls {
}
class MapView extends obsidian.ItemView {
+ /**
+ * Construct a new map instance
+ * @param leaf The leaf the map should be put in
+ * @param settings The plugin settings
+ * @param plugin The plugin instance
+ */
constructor(leaf, settings, plugin) {
super(leaf);
+ /** The map data */
this.display = new class {
constructor() {
+ /** The markers currently on the map */
this.markers = new Map();
}
};
+ /** Is the view currently open */
this.isOpen = false;
this.navigation = true;
this.settings = settings;
@@ -18226,6 +18339,7 @@ class MapView extends obsidian.ItemView {
this.getState = () => {
return this.state;
};
+ // Listen to file changes so we can update markers accordingly
this.app.vault.on('delete', file => this.updateMarkersWithRelationToFile(file.path, null, true));
this.app.vault.on('rename', (file, oldPath) => this.updateMarkersWithRelationToFile(oldPath, file, true));
this.app.metadataCache.on('changed', file => this.updateMarkersWithRelationToFile(file.path, file, false));
@@ -18317,6 +18431,16 @@ class MapView extends obsidian.ItemView {
className: neededClassName
});
this.display.map.addLayer(this.display.tileLayer);
+ if (!(chosenMapSource === null || chosenMapSource === void 0 ? void 0 : chosenMapSource.ignoreErrors)) {
+ let recentTileError = false;
+ this.display.tileLayer.on('tileerror', (event) => {
+ if (!recentTileError) {
+ new obsidian.Notice(`Map view: unable to load map tiles. Try switching the map source using the View controls.`, 20000);
+ recentTileError = true;
+ setTimeout(() => { recentTileError = false; }, 5000);
+ }
+ });
+ }
}
}
refreshMap() {
@@ -18372,24 +18496,26 @@ class MapView extends obsidian.ItemView {
this.state.mapCenter = this.display.map.getCenter();
(_b = (_a = this.display) === null || _a === void 0 ? void 0 : _a.controls) === null || _b === void 0 ? void 0 : _b.invalidateActivePreset();
});
- // --- Work in progress ---
- // this.display.clusterGroup.on('clustermouseover', cluster => {
- // console.log(cluster.propagatedFrom.getAllChildMarkers());
- // let content = this.contentEl.createDiv();
- // for (const marker of cluster.propagatedFrom.getAllChildMarkers()) {
- // console.log(marker);
- // const iconElement = marker.options.icon.createIcon();
- // let style = iconElement.style;
- // style.marginLeft = style.marginTop = '0';
- // style.position = 'relative';
- // content.appendChild(iconElement);
- // }
- // cluster.propagatedFrom.bindPopup(content, {closeButton: false, autoPan: false}).openPopup();
- // cluster.propagatedFrom.activePopup = content;
- // });
- // this.display.clusterGroup.on('clustermouseout', cluster => {
- // // cluster.propagatedFrom.closePopup();
- // });
+ if (this.settings.showClusterPreview) {
+ this.display.clusterGroup.on('clustermouseover', cluster => {
+ let content = this.contentEl.createDiv();
+ content.classList.add('clusterPreviewContainer');
+ for (const m of cluster.propagatedFrom.getAllChildMarkers()) {
+ const marker = m;
+ const iconElement = marker.options.icon.createIcon();
+ iconElement.classList.add('clusterPreviewIcon');
+ content.appendChild(iconElement);
+ if (content.children.length >= MAX_CLUSTER_PREVIEW_ICONS)
+ break;
+ }
+ cluster.propagatedFrom.bindPopup(content, { closeButton: true, autoPan: false }).openPopup();
+ cluster.propagatedFrom.activePopup = content;
+ });
+ this.display.clusterGroup.on('clustermouseout', cluster => {
+ cluster.propagatedFrom.closePopup();
+ });
+ }
+ // Build the map marker right-click context menu
this.display.map.on('contextmenu', (event) => __awaiter(this, void 0, void 0, function* () {
let mapPopup = new obsidian.Menu(this.app);
mapPopup.setNoIcon();
@@ -18436,13 +18562,18 @@ class MapView extends obsidian.ItemView {
}));
});
}
- // Updates the map to the given state and then sets the state accordingly, but only if the given state version
- // is not lower than the current state version (so concurrent async updates always keep the latest one)
+ /**
+ * Set the map state
+ * @param state The map state to set
+ * @param force Force setting the state. Will ignore if the state is old
+ */
updateMarkersToState(state, force = false) {
return __awaiter(this, void 0, void 0, function* () {
if (this.settings.debug)
console.time('updateMarkersToState');
+ // Get a list of all files matching the tags
const files = this.getFileListByQuery(state.tags);
+ // Build the markers for all files matching the tag
let newMarkers = yield buildMarkers(files, this.settings, this.app);
// --- BEYOND THIS POINT NOTHING SHOULD BE ASYNC ---
// Saying it again: do not use 'await' below this line!
@@ -18454,6 +18585,10 @@ class MapView extends obsidian.ItemView {
console.timeEnd('updateMarkersToState');
});
}
+ /**
+ * Get a list of files containing at least one of the tags
+ * @param tags A list of string tags to match
+ */
getFileListByQuery(tags) {
let results = [];
const allFiles = this.app.vault.getFiles();
@@ -18474,6 +18609,11 @@ class MapView extends obsidian.ItemView {
}
return results;
}
+ /**
+ * Update the actual Leaflet markers of the map according to a new list of logical markers.
+ * Unchanged markers are not touched, new markers are created and old markers that are not in the updated list are removed.
+ * @param newMarkers The new array of FileMarkers
+ */
updateMapMarkers(newMarkers) {
let newMarkersMap = new Map();
let markersToAdd = [];
@@ -18506,11 +18646,18 @@ class MapView extends obsidian.ItemView {
this.goToMarker(marker, event.originalEvent.ctrlKey, true);
});
newMarker.on('mouseover', (event) => {
+ if (this.settings.showNotePreview) {
+ const previewDetails = {
+ scroll: marker.fileLine,
+ line: marker.fileLine,
+ startLoc: { line: marker.fileLine, col: 0, offset: marker.fileLocation },
+ endLoc: { line: marker.fileLine, col: 0, offset: marker.fileLocation }
+ };
+ this.app.workspace.trigger('link-hover', newMarker.getElement(), newMarker.getElement(), marker.file.path, '', previewDetails);
+ }
let content = `
${marker.file.name}
`;
if (marker.extraName)
content += ``;
- if (marker.snippet)
- content += `${marker.snippet}
`;
newMarker.bindPopup(content, { closeButton: true, autoPan: false }).openPopup();
});
newMarker.on('mouseout', (event) => {
@@ -18537,6 +18684,7 @@ class MapView extends obsidian.ItemView {
});
return newMarker;
}
+ /** Zoom the map to fit all markers on the screen */
autoFitMapToMarkers() {
return __awaiter(this, void 0, void 0, function* () {
if (this.display.markers.size > 0) {
@@ -18545,6 +18693,12 @@ class MapView extends obsidian.ItemView {
}
});
}
+ /**
+ * Open a file in an editor window
+ * @param file The file object to open
+ * @param useCtrlKeyBehavior If true will use the alternative behaviour, as set in the settings
+ * @param editorAction Optional callback to run when the file is opened
+ */
goToFile(file, useCtrlKeyBehavior, editorAction) {
return __awaiter(this, void 0, void 0, function* () {
let leafToUse = this.app.workspace.activeLeaf;
@@ -18585,21 +18739,36 @@ class MapView extends obsidian.ItemView {
yield editorAction(editor);
});
}
+ /**
+ * Open and go to the editor location represented by the marker
+ * @param marker The FileMarker to open
+ * @param useCtrlKeyBehavior If true will use the alternative behaviour, as set in the settings
+ * @param highlight If true will highlight the line
+ */
goToMarker(marker, useCtrlKeyBehavior, highlight) {
return __awaiter(this, void 0, void 0, function* () {
return this.goToFile(marker.file, useCtrlKeyBehavior, (editor) => __awaiter(this, void 0, void 0, function* () { yield goToEditorLocation(editor, marker.fileLocation, highlight); }));
});
}
+ /**
+ * Update the map markers with a list of markers not from the removed file plus the markers from the new file.
+ * Run when a file is deleted, renamed or changed.
+ * @param fileRemoved The old file path
+ * @param fileAddedOrChanged The new file data
+ */
updateMarkersWithRelationToFile(fileRemoved, fileAddedOrChanged, skipMetadata) {
return __awaiter(this, void 0, void 0, function* () {
if (!this.display.map || !this.isOpen)
+ // If the map has not been set up yet then do nothing
return;
let newMarkers = [];
+ // Create an array of all file markers not in the removed file
for (let [markerId, fileMarker] of this.display.markers) {
if (fileMarker.file.path !== fileRemoved)
newMarkers.push(fileMarker);
}
if (fileAddedOrChanged && fileAddedOrChanged instanceof obsidian.TFile)
+ // Add file markers from the added file
yield buildAndAppendFileMarkers(newMarkers, fileAddedOrChanged, this.settings, this.app);
this.updateMapMarkers(newMarkers);
});
@@ -18732,17 +18901,25 @@ class SettingsTab extends obsidian.PluginSettingTab {
}));
});
new obsidian.Setting(containerEl)
- .setName('Note lines to show on map marker popup')
- .setDesc('Number of total lines to show in the snippet displayed for inline geolocation notes.')
- .addSlider(slider => {
- var _a;
- slider
- .setLimits(0, 12, 1)
- .setDynamicTooltip()
- .setValue((_a = this.plugin.settings.snippetLines) !== null && _a !== void 0 ? _a : DEFAULT_SETTINGS.snippetLines)
+ .setName('Show note preview on map marker hover')
+ .setDesc('In addition to the note and internal link name, show the native Obsidian note preview.')
+ .addToggle(component => {
+ component
+ .setValue(this.plugin.settings.showNotePreview)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
- this.plugin.settings.snippetLines = value;
- this.plugin.saveSettings();
+ this.plugin.settings.showNotePreview = value;
+ yield this.plugin.saveSettings();
+ }));
+ });
+ new obsidian.Setting(containerEl)
+ .setName('Show preview for marker clusters')
+ .setDesc('Show a hover popup summarizing the icons inside a marker cluster. Changes are applied after restart.')
+ .addToggle(component => {
+ component
+ .setValue(this.plugin.settings.showClusterPreview)
+ .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+ this.plugin.settings.showClusterPreview = value;
+ yield this.plugin.saveSettings();
}));
});
new obsidian.Setting(containerEl)
@@ -18871,15 +19048,16 @@ class SettingsTab extends obsidian.PluginSettingTab {
this.refreshPluginOnHide = true;
yield this.plugin.saveSettings();
}));
- })
- .addButton(component => component
- .setButtonText('Delete')
- .onClick(() => __awaiter(this, void 0, void 0, function* () {
- this.plugin.settings.mapSources.remove(setting);
- this.refreshPluginOnHide = true;
- yield this.plugin.saveSettings();
- this.refreshMapSourceSettings(containerEl);
- })));
+ });
+ if (!setting.preset)
+ controls.addButton(component => component
+ .setButtonText('Delete')
+ .onClick(() => __awaiter(this, void 0, void 0, function* () {
+ this.plugin.settings.mapSources.remove(setting);
+ this.refreshPluginOnHide = true;
+ yield this.plugin.saveSettings();
+ this.refreshMapSourceSettings(containerEl);
+ })));
controls.settingEl.style.padding = '5px';
controls.settingEl.style.borderTop = 'none';
}
@@ -19252,7 +19430,9 @@ class MapViewPlugin extends obsidian.Plugin {
return __awaiter(this, void 0, void 0, function* () {
obsidian.addIcon('globe', RIBBON_ICON);
yield this.loadSettings();
+ // Add a new ribbon entry to the left bar
this.addRibbonIcon('globe', 'Open map view', () => {
+ // When clicked change the active view to the map
this.app.workspace.getLeaf().setViewState({ type: MAP_VIEW_NAME });
});
this.registerView(MAP_VIEW_NAME, (leaf) => {
@@ -19261,6 +19441,7 @@ class MapViewPlugin extends obsidian.Plugin {
this.suggestor = new LocationSuggest(this.app, this.settings);
this.urlConvertor = new UrlConvertor(this.app, this.settings);
this.registerEditorSuggest(this.suggestor);
+ // Convert old settings formats that are no longer supported
if (convertLegacyMarkerIcons(this.settings)) {
yield this.saveSettings();
new obsidian.Notice("Map View: legacy marker icons were converted to the new format");
@@ -19273,6 +19454,12 @@ class MapViewPlugin extends obsidian.Plugin {
yield this.saveSettings();
new obsidian.Notice("Map View: legacy default state was converted to the new format");
}
+ if (removeLegacyPresets1(this.settings)) {
+ yield this.saveSettings();
+ new obsidian.Notice("Map View: legacy URL parsing rules and/or map sources were converted. See the release notes");
+ }
+ // Register commands to the command palette
+ // Command that opens the map view (same as clicking the map icon)
this.addCommand({
id: 'open-map-view',
name: 'Open Map View',
@@ -19280,6 +19467,7 @@ class MapViewPlugin extends obsidian.Plugin {
this.app.workspace.getLeaf().setViewState({ type: MAP_VIEW_NAME });
},
});
+ // Command that looks up the selected text to find the location
this.addCommand({
id: 'convert-selection-to-location',
name: 'Convert Selection to Geolocation',
@@ -19289,6 +19477,7 @@ class MapViewPlugin extends obsidian.Plugin {
this.suggestor.selectionToLink(editor);
}
});
+ // Command that adds a blank inline location at the cursor location
this.addCommand({
id: 'insert-geolink',
name: 'Add inline geolocation link',
@@ -19298,6 +19487,7 @@ class MapViewPlugin extends obsidian.Plugin {
editor.setCursor({ line: positionBeforeInsert.line, ch: positionBeforeInsert.ch + 1 });
}
});
+ // Command that opens the location search dialog and creates a new note from this location
this.addCommand({
id: 'new-geolocation-note',
name: 'New geolocation note',
@@ -19306,6 +19496,7 @@ class MapViewPlugin extends obsidian.Plugin {
dialog.open();
}
});
+ // Command that opens the location search dialog and adds the location to the current note
this.addCommand({
id: 'add-frontmatter-geolocation',
name: 'Add geolocation (front matter) to current note',
@@ -19315,25 +19506,32 @@ class MapViewPlugin extends obsidian.Plugin {
}
});
this.addSettingTab(new SettingsTab(this.app, this));
+ // Add items to the file context menu (run when the context menu is built)
+ // This is the context menu in the File Explorer and clicking "More options" (three dots) from within a file.
this.app.workspace.on('file-menu', (menu, file, _source, leaf) => {
if (file instanceof obsidian.TFile) {
const location = getFrontMatterLocation(file, this.app);
if (location) {
+ // If there is a geolocation in the front matter of the file
+ // Add an option to open it in the map
menu.addItem((item) => {
item.setTitle('Show on map');
item.setIcon('globe');
item.onClick((evt) => __awaiter(this, void 0, void 0, function* () { return yield this.openMapWithLocation(location, evt.ctrlKey); }));
});
+ // Add an option to open it in the default app
menu.addItem((item) => {
item.setTitle('Open with default app');
item.onClick(_ev => {
open(`geo:${location.lat},${location.lng}`);
});
});
+ // Populate menu items from user defined "Open In" strings
populateOpenInItems(menu, location, this.settings);
}
else {
if (leaf && leaf.view instanceof obsidian.MarkdownView) {
+ // If there is no valid geolocation in the front matter, add a menu item to populate it.
const editor = leaf.view.editor;
menu.addItem((item) => {
item.setTitle('Add geolocation (front matter)');
@@ -19347,31 +19545,39 @@ class MapViewPlugin extends obsidian.Plugin {
}
}
});
+ // Add items to the editor context menu (run when the context menu is built)
+ // This is the context menu when right clicking within an editor view.
this.app.workspace.on('editor-menu', (menu, editor, view) => __awaiter(this, void 0, void 0, function* () {
var _a;
if (view instanceof obsidian.FileView) {
const location = this.getLocationOnEditorLine(editor, view);
if (location) {
+ // If there is a geolocation on the line
+ // Add an option to open it in the map
menu.addItem((item) => {
item.setTitle('Show on map');
item.setIcon('globe');
item.onClick((evt) => __awaiter(this, void 0, void 0, function* () { return yield this.openMapWithLocation(location, evt.ctrlKey); }));
});
+ // Add an option to open it in the default app
menu.addItem((item) => {
item.setTitle('Open with default app');
item.onClick(_ev => {
open(`geo:${location.lat},${location.lng}`);
});
});
+ // Populate menu items from user defined "Open In" strings
populateOpenInItems(menu, location, this.settings);
}
if (editor.getSelection()) {
+ // If there is text selected, add a menu item to convert it to coordinates using geosearch
menu.addItem((item) => {
item.setTitle('Convert to geolocation (geosearch)');
item.onClick(() => __awaiter(this, void 0, void 0, function* () { return yield this.suggestor.selectionToLink(editor); }));
});
}
if (this.urlConvertor.findMatchInLine(editor))
+ // If the line contains a recognized geolocation that can be converted from a URL parsing rule
menu.addItem((item) => {
item.setTitle('Convert to geolocation');
item.onClick(() => __awaiter(this, void 0, void 0, function* () {
@@ -19381,6 +19587,7 @@ class MapViewPlugin extends obsidian.Plugin {
const clipboard = yield navigator.clipboard.readText();
const clipboardLocation = (_a = this.urlConvertor.parseLocationFromUrl(clipboard)) === null || _a === void 0 ? void 0 : _a.location;
if (clipboardLocation) {
+ // If the clipboard contains a recognized geolocation that can be converted from a URL parsing rule
menu.addItem((item) => {
item.setTitle('Paste as geolocation');
item.onClick(() => __awaiter(this, void 0, void 0, function* () {
@@ -19392,6 +19599,11 @@ class MapViewPlugin extends obsidian.Plugin {
}));
});
}
+ /**
+ * Open an instance of the map at the given geolocation
+ * @param location The geolocation to open the map at
+ * @param ctrlKey Was the control key pressed
+ */
openMapWithLocation(location, ctrlKey) {
return __awaiter(this, void 0, void 0, function* () {
yield this.openMapWithState({ mapCenter: location, mapZoom: this.settings.zoomOnGoFromNote }, ctrlKey);
@@ -19413,6 +19625,12 @@ class MapViewPlugin extends obsidian.Plugin {
yield chosenLeaf.setViewState({ type: MAP_VIEW_NAME, state: state });
});
}
+ /**
+ * Get the geolocation on the current editor line
+ * @param editor obsidian Editor instance
+ * @param view obsidian FileView instance
+ * @private
+ */
getLocationOnEditorLine(editor, view) {
const line = editor.getLine(editor.getCursor().line);
const match = matchInlineLocation(line)[0];
@@ -19432,11 +19650,13 @@ class MapViewPlugin extends obsidian.Plugin {
}
onunload() {
}
+ /** Initialise the plugin settings from Obsidian's cache */
loadSettings() {
return __awaiter(this, void 0, void 0, function* () {
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
});
}
+ /** Save the plugin settings to Obsidian's cache so it can be reused later. */
saveSettings() {
return __awaiter(this, void 0, void 0, function* () {
yield this.saveData(this.settings);
diff --git a/.obsidian/plugins/obsidian-map-view/manifest.json b/.obsidian/plugins/obsidian-map-view/manifest.json
index 204f28a6..0c17952d 100644
--- a/.obsidian/plugins/obsidian-map-view/manifest.json
+++ b/.obsidian/plugins/obsidian-map-view/manifest.json
@@ -1,7 +1,7 @@
{
"id": "obsidian-map-view",
"name": "Map View",
- "version": "1.3.0",
+ "version": "1.4.0",
"minAppVersion": "0.12.10",
"description": "An interactive map view.",
"isDesktopOnly": false
diff --git a/.obsidian/plugins/obsidian-map-view/styles.css b/.obsidian/plugins/obsidian-map-view/styles.css
index d0cca90f..753e1ea0 100644
--- a/.obsidian/plugins/obsidian-map-view/styles.css
+++ b/.obsidian/plugins/obsidian-map-view/styles.css
@@ -53,3 +53,13 @@
.newPresetDialogLine {
display: inline-block;
}
+
+.clusterPreviewIcon {
+ margin-left: 0 !important;
+ margin-top: 0 !important;
+ position: relative !important;
+}
+
+.clusterPreviewContainer {
+ display: inline-flex;
+}
diff --git a/.obsidian/plugins/obsidian-reminder-plugin/data.json b/.obsidian/plugins/obsidian-reminder-plugin/data.json
index 1f9e086e..7871cbce 100644
--- a/.obsidian/plugins/obsidian-reminder-plugin/data.json
+++ b/.obsidian/plugins/obsidian-reminder-plugin/data.json
@@ -331,15 +331,15 @@
}
],
"01.02 Home/Household.md": [
- {
- "title": "[[Household]]: *Cardboard* recycling collection",
- "time": "2022-04-19",
- "rowNumber": 80
- },
{
"title": "[[Household]]: *Paper* recycling collection",
"time": "2022-04-26",
"rowNumber": 72
+ },
+ {
+ "title": "[[Household]]: *Cardboard* recycling collection",
+ "time": "2022-05-03",
+ "rowNumber": 80
}
],
"01.03 Family/Pia Bousquié.md": [
@@ -530,6 +530,21 @@
"title": "12:49 [[2022-04-18|Memo]], [[@Lifestyle]]: check the Tennis Club at the top of the mountain",
"time": "2022-04-23",
"rowNumber": 91
+ },
+ {
+ "title": "14:30 [[2022-04-18|Memo]], [[Selfhosting]], [[Server Alias]], [[Configuring Fail2ban]]: check (imported) nginx filters",
+ "time": "2022-04-23",
+ "rowNumber": 93
+ },
+ {
+ "title": "14:12 [[2022-04-18|Memo]], [[@Lifestyle]]: Find a cleaner",
+ "time": "2022-04-24",
+ "rowNumber": 92
+ },
+ {
+ "title": "17:54 [[2022-04-18|Memo]], [[@Lifestyle]]: Look up the afrench sailing circle",
+ "time": "2022-04-25",
+ "rowNumber": 94
}
]
},
diff --git a/.obsidian/plugins/obsidian-tasks-plugin/main.js b/.obsidian/plugins/obsidian-tasks-plugin/main.js
index d1010e0a..a6c22dca 100644
--- a/.obsidian/plugins/obsidian-tasks-plugin/main.js
+++ b/.obsidian/plugins/obsidian-tasks-plugin/main.js
@@ -8274,10 +8274,10 @@ var require_en = __commonJS({
return exports.casual.parse(text2, ref, option);
}
exports.parse = parse;
- function parseDate(text2, ref, option) {
+ function parseDate2(text2, ref, option) {
return exports.casual.parseDate(text2, ref, option);
}
- exports.parseDate = parseDate;
+ exports.parseDate = parseDate2;
function createCasualConfiguration(littleEndian = false) {
const option = createConfiguration(false, littleEndian);
option.parsers.unshift(new ENCasualDateParser_1.default());
@@ -8839,10 +8839,10 @@ var require_de = __commonJS({
return exports.casual.parse(text2, ref, option);
}
exports.parse = parse;
- function parseDate(text2, ref, option) {
+ function parseDate2(text2, ref, option) {
return exports.casual.parseDate(text2, ref, option);
}
- exports.parseDate = parseDate;
+ exports.parseDate = parseDate2;
function createCasualConfiguration(littleEndian = true) {
const option = createConfiguration(false, littleEndian);
option.parsers.unshift(new DECasualTimeParser_1.default());
@@ -9512,10 +9512,10 @@ var require_fr = __commonJS({
return exports.casual.parse(text2, ref, option);
}
exports.parse = parse;
- function parseDate(text2, ref, option) {
+ function parseDate2(text2, ref, option) {
return exports.casual.parseDate(text2, ref, option);
}
- exports.parseDate = parseDate;
+ exports.parseDate = parseDate2;
function createCasualConfiguration(littleEndian = true) {
const option = createConfiguration(false, littleEndian);
option.parsers.unshift(new FRCasualDateParser_1.default());
@@ -9724,10 +9724,10 @@ var require_ja = __commonJS({
return exports.casual.parse(text2, ref, option);
}
exports.parse = parse;
- function parseDate(text2, ref, option) {
+ function parseDate2(text2, ref, option) {
return exports.casual.parseDate(text2, ref, option);
}
- exports.parseDate = parseDate;
+ exports.parseDate = parseDate2;
function createCasualConfiguration() {
const option = createConfiguration();
option.parsers.unshift(new JPCasualDateParser_1.default());
@@ -10114,10 +10114,10 @@ var require_pt = __commonJS({
return exports.casual.parse(text2, ref, option);
}
exports.parse = parse;
- function parseDate(text2, ref, option) {
+ function parseDate2(text2, ref, option) {
return exports.casual.parseDate(text2, ref, option);
}
- exports.parseDate = parseDate;
+ exports.parseDate = parseDate2;
function createCasualConfiguration(littleEndian = true) {
const option = createConfiguration(false, littleEndian);
option.parsers.push(new PTCasualDateParser_1.default());
@@ -10831,10 +10831,10 @@ var require_nl = __commonJS({
return exports.casual.parse(text2, ref, option);
}
exports.parse = parse;
- function parseDate(text2, ref, option) {
+ function parseDate2(text2, ref, option) {
return exports.casual.parseDate(text2, ref, option);
}
- exports.parseDate = parseDate;
+ exports.parseDate = parseDate2;
function createCasualConfiguration(littleEndian = true) {
const option = createConfiguration(false, littleEndian);
option.parsers.unshift(new NLCasualDateParser_1.default());
@@ -10923,10 +10923,10 @@ var require_dist = __commonJS({
return exports.casual.parse(text2, ref, option);
}
exports.parse = parse;
- function parseDate(text2, ref, option) {
+ function parseDate2(text2, ref, option) {
return exports.casual.parseDate(text2, ref, option);
}
- exports.parseDate = parseDate;
+ exports.parseDate = parseDate2;
}
});
@@ -14124,6 +14124,7 @@ var Recurrence = class {
return text2;
}
next() {
+ var _a;
let next;
if (this.baseOnToday) {
const today = window.moment();
@@ -14132,7 +14133,7 @@ var Recurrence = class {
}));
next = ruleBasedOnToday.after(today.endOf("day").utc(true).toDate());
} else {
- const after = window.moment(this.referenceDate).endOf("day").utc(true);
+ const after = window.moment((_a = this.referenceDate) != null ? _a : void 0).endOf("day").utc(true);
next = this.rrule.after(after.toDate());
}
if (next !== null) {
@@ -14395,10 +14396,12 @@ var _Task = class {
const textSpan = li.createSpan();
textSpan.addClass("tasks-list-text");
yield import_obsidian2.MarkdownRenderer.renderMarkdown(taskAsString, textSpan, this.path, null);
- const pElement = textSpan.querySelector("p");
+ const blockQuote = textSpan.querySelector("blockquote");
+ const directParentOfPTag = blockQuote != null ? blockQuote : textSpan;
+ const pElement = directParentOfPTag.querySelector("p");
if (pElement !== null) {
while (pElement.firstChild) {
- textSpan.insertBefore(pElement.firstChild, pElement);
+ directParentOfPTag.insertBefore(pElement.firstChild, pElement);
}
pElement.remove();
}
@@ -16206,7 +16209,7 @@ var LivePreviewExtension = class {
var import_obsidian7 = __toModule(require("obsidian"));
// src/Query.ts
-var import_chrono_node2 = __toModule(require_dist());
+var chrono2 = __toModule(require_dist());
var Query = class {
constructor({ source }) {
this._limit = void 0;
@@ -16573,7 +16576,7 @@ var Query = class {
}
}
parseDate(input) {
- return window.moment(import_chrono_node2.default.parseDate(input)).startOf("day");
+ return window.moment(chrono2.parseDate(input)).startOf("day");
}
stringIncludesCaseInsensitive(haystack, needle) {
return haystack.toLocaleLowerCase().includes(needle.toLocaleLowerCase());
diff --git a/.obsidian/plugins/obsidian-tasks-plugin/manifest.json b/.obsidian/plugins/obsidian-tasks-plugin/manifest.json
index 1405981a..c8bfe247 100644
--- a/.obsidian/plugins/obsidian-tasks-plugin/manifest.json
+++ b/.obsidian/plugins/obsidian-tasks-plugin/manifest.json
@@ -1,7 +1,7 @@
{
"id": "obsidian-tasks-plugin",
"name": "Tasks",
- "version": "1.5.0",
+ "version": "1.5.1",
"minAppVersion": "0.13.21",
"description": "Task management for Obsidian",
"author": "Martin Schenck",
diff --git a/.obsidian/plugins/obsidian42-brat/main.js b/.obsidian/plugins/obsidian42-brat/main.js
index d1380405..b56f65ca 100644
--- a/.obsidian/plugins/obsidian42-brat/main.js
+++ b/.obsidian/plugins/obsidian42-brat/main.js
@@ -1,20 +1,20 @@
-var zt=Object.create;var _=Object.defineProperty;var qt=Object.getOwnPropertyDescriptor;var Vt=Object.getOwnPropertyNames;var Jt=Object.getPrototypeOf,Wt=Object.prototype.hasOwnProperty;var Qt=(i,n)=>()=>(n||i((n={exports:{}}).exports,n),n.exports),Gt=(i,n)=>{for(var e in n)_(i,e,{get:n[e],enumerable:!0})},ut=(i,n,e,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of Vt(n))!Wt.call(i,s)&&s!==e&&_(i,s,{get:()=>n[s],enumerable:!(t=qt(n,s))||t.enumerable});return i};var Kt=(i,n,e)=>(e=i!=null?zt(Jt(i)):{},ut(n||!i||!i.__esModule?_(e,"default",{value:i,enumerable:!0}):e,i)),Zt=i=>ut(_({},"__esModule",{value:!0}),i);var a=(i,n,e)=>new Promise((t,s)=>{var o=c=>{try{u(e.next(c))}catch(g){s(g)}},r=c=>{try{u(e.throw(c))}catch(g){s(g)}},u=c=>c.done?t(c.value):Promise.resolve(c.value).then(o,r);u((e=e.apply(i,n)).next())});var _t=Qt(l=>{"use strict";Object.defineProperty(l,"__esModule",{value:!0});var f=require("obsidian"),it="YYYY-MM-DD",st="gggg-[W]ww",Et="YYYY-MM",It="YYYY-[Q]Q",Ft="YYYY";function L(i){var e,t;let n=window.app.plugins.getPlugin("periodic-notes");return n&&((t=(e=n.settings)==null?void 0:e[i])==null?void 0:t.enabled)}function B(){var i,n,e,t;try{let{internalPlugins:s,plugins:o}=window.app;if(L("daily")){let{format:g,folder:d,template:p}=((n=(i=o.getPlugin("periodic-notes"))==null?void 0:i.settings)==null?void 0:n.daily)||{};return{format:g||it,folder:(d==null?void 0:d.trim())||"",template:(p==null?void 0:p.trim())||""}}let{folder:r,format:u,template:c}=((t=(e=s.getPluginById("daily-notes"))==null?void 0:e.instance)==null?void 0:t.options)||{};return{format:u||it,folder:(r==null?void 0:r.trim())||"",template:(c==null?void 0:c.trim())||""}}catch(s){console.info("No custom daily note settings found!",s)}}function R(){var i,n,e,t,s,o,r;try{let u=window.app.plugins,c=(i=u.getPlugin("calendar"))==null?void 0:i.options,g=(e=(n=u.getPlugin("periodic-notes"))==null?void 0:n.settings)==null?void 0:e.weekly;if(L("weekly"))return{format:g.format||st,folder:((t=g.folder)==null?void 0:t.trim())||"",template:((s=g.template)==null?void 0:s.trim())||""};let d=c||{};return{format:d.weeklyNoteFormat||st,folder:((o=d.weeklyNoteFolder)==null?void 0:o.trim())||"",template:((r=d.weeklyNoteTemplate)==null?void 0:r.trim())||""}}catch(u){console.info("No custom weekly note settings found!",u)}}function k(){var n,e,t,s;let i=window.app.plugins;try{let o=L("monthly")&&((e=(n=i.getPlugin("periodic-notes"))==null?void 0:n.settings)==null?void 0:e.monthly)||{};return{format:o.format||Et,folder:((t=o.folder)==null?void 0:t.trim())||"",template:((s=o.template)==null?void 0:s.trim())||""}}catch(o){console.info("No custom monthly note settings found!",o)}}function M(){var n,e,t,s;let i=window.app.plugins;try{let o=L("quarterly")&&((e=(n=i.getPlugin("periodic-notes"))==null?void 0:n.settings)==null?void 0:e.quarterly)||{};return{format:o.format||It,folder:((t=o.folder)==null?void 0:t.trim())||"",template:((s=o.template)==null?void 0:s.trim())||""}}catch(o){console.info("No custom quarterly note settings found!",o)}}function O(){var n,e,t,s;let i=window.app.plugins;try{let o=L("yearly")&&((e=(n=i.getPlugin("periodic-notes"))==null?void 0:n.settings)==null?void 0:e.yearly)||{};return{format:o.format||Ft,folder:((t=o.folder)==null?void 0:t.trim())||"",template:((s=o.template)==null?void 0:s.trim())||""}}catch(o){console.info("No custom yearly note settings found!",o)}}function Dt(...i){let n=[];for(let t=0,s=i.length;t{let X=t(),tt=i.clone().set({hour:X.get("hour"),minute:X.get("minute"),second:X.get("second")});return y&&tt.add(parseInt(N,10),b),h?tt.format(h.substring(1).trim()):tt.format(o)}).replace(/{{\s*yesterday\s*}}/gi,i.clone().subtract(1,"day").format(o)).replace(/{{\s*tomorrow\s*}}/gi,i.clone().add(1,"d").format(o)));return n.foldManager.save(p,c),p}catch(p){console.error(`Failed to create file: '${d}'`,p),new f.Notice("Unable to create new file.")}})}function oe(i,n){var e;return(e=n[C(i,"day")])!=null?e:null}function re(){let{vault:i}=window.app,{folder:n}=B(),e=i.getAbstractFileByPath(f.normalizePath(n));if(!e)throw new at("Failed to find daily notes folder");let t={};return f.Vault.recurseChildren(e,s=>{if(s instanceof f.TFile){let o=I(s,"day");if(o){let r=C(o,"day");t[r]=s}}}),t}var ot=class extends Error{};function le(){let{moment:i}=window,n=i.localeData()._week.dow,e=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"];for(;n;)e.push(e.shift()),n--;return e}function ge(i){return le().indexOf(i.toLowerCase())}function kt(i){return a(this,null,function*(){let{vault:n}=window.app,{template:e,format:t,folder:s}=R(),[o,r]=yield E(e),u=i.format(t),c=yield x(s,u);try{let g=yield n.create(c,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(d,p,P,w,y,N)=>{let b=window.moment(),h=i.clone().set({hour:b.get("hour"),minute:b.get("minute"),second:b.get("second")});return P&&h.add(parseInt(w,10),y),N?h.format(N.substring(1).trim()):h.format(t)}).replace(/{{\s*title\s*}}/gi,u).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi,(d,p,P)=>{let w=ge(p);return i.weekday(w).format(P.trim())}));return window.app.foldManager.save(g,r),g}catch(g){console.error(`Failed to create file: '${c}'`,g),new f.Notice("Unable to create new file.")}})}function ue(i,n){var e;return(e=n[C(i,"week")])!=null?e:null}function ce(){let i={};if(!Ot())return i;let{vault:n}=window.app,{folder:e}=R(),t=n.getAbstractFileByPath(f.normalizePath(e));if(!t)throw new ot("Failed to find weekly notes folder");return f.Vault.recurseChildren(t,s=>{if(s instanceof f.TFile){let o=I(s,"week");if(o){let r=C(o,"week");i[r]=s}}}),i}var rt=class extends Error{};function Mt(i){return a(this,null,function*(){let{vault:n}=window.app,{template:e,format:t,folder:s}=k(),[o,r]=yield E(e),u=i.format(t),c=yield x(s,u);try{let g=yield n.create(c,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(d,p,P,w,y,N)=>{let b=window.moment(),h=i.clone().set({hour:b.get("hour"),minute:b.get("minute"),second:b.get("second")});return P&&h.add(parseInt(w,10),y),N?h.format(N.substring(1).trim()):h.format(t)}).replace(/{{\s*date\s*}}/gi,u).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,u));return window.app.foldManager.save(g,r),g}catch(g){console.error(`Failed to create file: '${c}'`,g),new f.Notice("Unable to create new file.")}})}function de(i,n){var e;return(e=n[C(i,"month")])!=null?e:null}function me(){let i={};if(!xt())return i;let{vault:n}=window.app,{folder:e}=k(),t=n.getAbstractFileByPath(f.normalizePath(e));if(!t)throw new rt("Failed to find monthly notes folder");return f.Vault.recurseChildren(t,s=>{if(s instanceof f.TFile){let o=I(s,"month");if(o){let r=C(o,"month");i[r]=s}}}),i}var lt=class extends Error{};function pe(i){return a(this,null,function*(){let{vault:n}=window.app,{template:e,format:t,folder:s}=M(),[o,r]=yield E(e),u=i.format(t),c=yield x(s,u);try{let g=yield n.create(c,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(d,p,P,w,y,N)=>{let b=window.moment(),h=i.clone().set({hour:b.get("hour"),minute:b.get("minute"),second:b.get("second")});return P&&h.add(parseInt(w,10),y),N?h.format(N.substring(1).trim()):h.format(t)}).replace(/{{\s*date\s*}}/gi,u).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,u));return window.app.foldManager.save(g,r),g}catch(g){console.error(`Failed to create file: '${c}'`,g),new f.Notice("Unable to create new file.")}})}function fe(i,n){var e;return(e=n[C(i,"quarter")])!=null?e:null}function he(){let i={};if(!$t())return i;let{vault:n}=window.app,{folder:e}=M(),t=n.getAbstractFileByPath(f.normalizePath(e));if(!t)throw new lt("Failed to find quarterly notes folder");return f.Vault.recurseChildren(t,s=>{if(s instanceof f.TFile){let o=I(s,"quarter");if(o){let r=C(o,"quarter");i[r]=s}}}),i}var gt=class extends Error{};function be(i){return a(this,null,function*(){let{vault:n}=window.app,{template:e,format:t,folder:s}=O(),[o,r]=yield E(e),u=i.format(t),c=yield x(s,u);try{let g=yield n.create(c,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(d,p,P,w,y,N)=>{let b=window.moment(),h=i.clone().set({hour:b.get("hour"),minute:b.get("minute"),second:b.get("second")});return P&&h.add(parseInt(w,10),y),N?h.format(N.substring(1).trim()):h.format(t)}).replace(/{{\s*date\s*}}/gi,u).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,u));return window.app.foldManager.save(g,r),g}catch(g){console.error(`Failed to create file: '${c}'`,g),new f.Notice("Unable to create new file.")}})}function we(i,n){var e;return(e=n[C(i,"year")])!=null?e:null}function ye(){let i={};if(!Ut())return i;let{vault:n}=window.app,{folder:e}=O(),t=n.getAbstractFileByPath(f.normalizePath(e));if(!t)throw new gt("Failed to find yearly notes folder");return f.Vault.recurseChildren(t,s=>{if(s instanceof f.TFile){let o=I(s,"year");if(o){let r=C(o,"year");i[r]=s}}}),i}function Te(){var t,s;let{app:i}=window,n=i.internalPlugins.plugins["daily-notes"];if(n&&n.enabled)return!0;let e=i.plugins.getPlugin("periodic-notes");return e&&((s=(t=e.settings)==null?void 0:t.daily)==null?void 0:s.enabled)}function Ot(){var e,t;let{app:i}=window;if(i.plugins.getPlugin("calendar"))return!0;let n=i.plugins.getPlugin("periodic-notes");return n&&((t=(e=n.settings)==null?void 0:e.weekly)==null?void 0:t.enabled)}function xt(){var e,t;let{app:i}=window,n=i.plugins.getPlugin("periodic-notes");return n&&((t=(e=n.settings)==null?void 0:e.monthly)==null?void 0:t.enabled)}function $t(){var e,t;let{app:i}=window,n=i.plugins.getPlugin("periodic-notes");return n&&((t=(e=n.settings)==null?void 0:e.quarterly)==null?void 0:t.enabled)}function Ut(){var e,t;let{app:i}=window,n=i.plugins.getPlugin("periodic-notes");return n&&((t=(e=n.settings)==null?void 0:e.yearly)==null?void 0:t.enabled)}function Pe(i){return{day:B,week:R,month:k,quarter:M,year:O}[i]()}function ve(i,n){return{day:Rt,month:Mt,week:kt}[i](n)}l.DEFAULT_DAILY_NOTE_FORMAT=it;l.DEFAULT_MONTHLY_NOTE_FORMAT=Et;l.DEFAULT_QUARTERLY_NOTE_FORMAT=It;l.DEFAULT_WEEKLY_NOTE_FORMAT=st;l.DEFAULT_YEARLY_NOTE_FORMAT=Ft;l.appHasDailyNotesPluginLoaded=Te;l.appHasMonthlyNotesPluginLoaded=xt;l.appHasQuarterlyNotesPluginLoaded=$t;l.appHasWeeklyNotesPluginLoaded=Ot;l.appHasYearlyNotesPluginLoaded=Ut;l.createDailyNote=Rt;l.createMonthlyNote=Mt;l.createPeriodicNote=ve;l.createQuarterlyNote=pe;l.createWeeklyNote=kt;l.createYearlyNote=be;l.getAllDailyNotes=re;l.getAllMonthlyNotes=me;l.getAllQuarterlyNotes=he;l.getAllWeeklyNotes=ce;l.getAllYearlyNotes=ye;l.getDailyNote=oe;l.getDailyNoteSettings=B;l.getDateFromFile=I;l.getDateFromPath=ae;l.getDateUID=C;l.getMonthlyNote=de;l.getMonthlyNoteSettings=k;l.getPeriodicNoteSettings=Pe;l.getQuarterlyNote=fe;l.getQuarterlyNoteSettings=M;l.getTemplateInfo=E;l.getWeeklyNote=ue;l.getWeeklyNoteSettings=R;l.getYearlyNote=we;l.getYearlyNoteSettings=O});var Ne={};Gt(Ne,{default:()=>Z});module.exports=Zt(Ne);var jt=require("obsidian");var T=require("obsidian");var q=require("obsidian");var ct=require("obsidian"),v=class extends ct.FuzzySuggestModal{constructor(e){super(e.app);this.scope.register(["Shift"],"Enter",t=>this.enterTrigger(t)),this.scope.register(["Ctrl"],"Enter",t=>this.enterTrigger(t))}setSuggesterData(e){this.data=e}display(e){return a(this,null,function*(){this.callbackFunction=e,this.open()})}getItems(){return this.data}getItemText(e){return e.display}onChooseItem(){}renderSuggestion(e,t){t.createEl("div",{text:e.item.display})}enterTrigger(e){let t=document.querySelector(".suggestion-item.is-selected div").textContent,s=this.data.find(o=>o.display===t);s&&(this.invokeCallback(s,e),this.close())}onChooseSuggestion(e,t){this.invokeCallback(e.item,t)}invokeCallback(e,t){this.callbackFunction(e,t)}};var A=require("obsidian"),Xt="https://raw.githubusercontent.com/",H=(i,n,e)=>a(void 0,null,function*(){let t=`https://github.com/${i}/releases/download/${n}/${e}`;try{let s=yield(0,A.request)({url:t});return s==="Not Found"||s==='{"error":"Not Found"}'?null:s}catch(s){console.log("error in grabReleaseFileFromRepository",t,s)}}),dt=(i,n=!0)=>a(void 0,null,function*(){let e=Xt+i+(n===!0?"/HEAD/manifest.json":"/HEAD/manifest-beta.json");try{let t=yield(0,A.request)({url:e});return t==="404: Not Found"?null:yield JSON.parse(t)}catch(t){console.log(`error in grabManifestJsonFromRepository for ${e}`,t)}}),mt=()=>a(void 0,null,function*(){let i="https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json";try{let n=yield(0,A.request)({url:i});return n==="404: Not Found"?null:yield JSON.parse(n)}catch(n){console.log("error in grabCommmunityPluginList",n)}}),Y=()=>a(void 0,null,function*(){let i="https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-css-themes.json";try{let n=yield(0,A.request)({url:i});return n==="404: Not Found"?null:yield JSON.parse(n)}catch(n){console.log("error in grabCommmunityThemesList",n)}}),et=i=>a(void 0,null,function*(){let n=`https://raw.githubusercontent.com/${i}/HEAD/obsidian.css`;try{let e=yield(0,A.request)({url:n});return e==="404: Not Found"?null:e}catch(e){console.log("error in grabCommmunityThemesList",e)}}),te=(i,n)=>a(void 0,null,function*(){let e=`https://api.github.com/repos/${i}/commits?path=${n}&page=1&per_page=1`;try{let t=yield(0,A.request)({url:e});return t==="404: Not Found"?null:JSON.parse(t)}catch(t){console.log("error in grabCommmunityThemesList",t)}}),j=(i,n)=>a(void 0,null,function*(){let e=yield te(i,n);return e[0].commit.committer.date?e[0].commit.committer.date:""});var pt={pluginList:[],themesList:[],updateAtStartup:!1,updateThemesAtStartup:!1,ribbonIconEnabled:!0,loggingEnabled:!1,loggingPath:"BRAT-log",loggingVerboseEnabled:!1,debuggingMode:!0,notificationsEnabled:!0};function ft(i,n){return a(this,null,function*(){i.settings.pluginList.contains(n)||(i.settings.pluginList.unshift(n),i.saveSettings())})}function ht(i,n){return a(this,null,function*(){return i.settings.pluginList.contains(n)})}function bt(i,n){return a(this,null,function*(){let e={repo:n,lastUpdate:yield j(n,"obsidian.css")};i.settings.themesList.unshift(e),i.saveSettings()})}function wt(i,n){return a(this,null,function*(){return!!i.settings.themesList.find(t=>t.repo===n)})}function yt(i,n,e){i.settings.themesList.forEach(t=>{t.repo===n&&(t.lastUpdate=e,i.saveSettings())})}var Tt=require("obsidian");function m(i,n,e=10,t=null){if(i.settings.notificationsEnabled===!1)return;let s=t?"(click=dismiss, right-click=Info)":"",o=new Tt.Notice(`BRAT
-${n}
-${s}`,e*1e3);t&&(o.noticeEl.oncontextmenu=()=>a(this,null,function*(){t()}))}function z(){return a(this,null,function*(){try{let i=yield fetch("https://obsidian.md/?"+Math.random());return i.status>=200&&i.status<300}catch(i){return!1}})}var Pt=i=>(0,q.normalizePath)(i.app.vault.configDir+"/themes")+"/",nt=(i,n,e="")=>a(void 0,null,function*(){let t=yield et(n);if(!t)return m(i,"There is no obsidian.css file in the root path of this repository, so there is no theme to install."),!1;yield vt(i,e,t);let s=`${e} theme installed from ${n}. `;return i.log(s+`[Theme Info](https://github.com/${n})`,!1),m(i,`${s}`,10,()=>a(void 0,null,function*(){window.open(`https://github.com/${n}`)})),setTimeout(()=>{i.app.customCss.setTheme(e)},500),!0}),vt=(i,n,e)=>a(void 0,null,function*(){let t=Pt(i),s=i.app.vault.adapter;(yield s.exists(t))===!1&&(yield s.mkdir(t)),yield s.write(t+n+".css",e)}),Nt=i=>a(void 0,null,function*(){let n=yield Y(),e=Object.values(n).map(s=>({display:`Theme: ${s.name} (${s.repo})`,info:s})),t=new v(i);t.setSuggesterData(e),yield t.display(s=>a(void 0,null,function*(){yield nt(i,s.info.repo,s.info.name)}))}),V=i=>("BRAT-"+i.replace("/","----")).substr(0,100),Ct=(i,n)=>a(void 0,null,function*(){i.settings.themesList=i.settings.themesList.filter(t=>t.repo!=n),i.saveSettings(),yield i.app.vault.adapter.remove(Pt(i)+V(n)+".css");let e=`Removed ${n} from BRAT themes list and deleted from vault`;i.log(e,!0),m(i,`${e}`)}),J=(i,n)=>a(void 0,null,function*(){if((yield z())===!1){console.log("BRAT: No internet detected.");return}let e,t="Checking for beta theme updates STARTED";i.log(t,!0),n&&i.settings.notificationsEnabled&&(e=new q.Notice(`BRAT
-${t}`,3e4));for(let o of i.settings.themesList){let r=yield j(o.repo,"obsidian.css");r!==o.lastUpdate&&(yield ee(i,o.repo,o.lastUpdate,r))}let s="Checking for beta theme updates COMPLETED";i.log(s,!0),n&&(i.settings.notificationsEnabled&&e.hide(),m(i,s))}),ee=(i,n,e="",t="")=>a(void 0,null,function*(){let s=yield et(n);if(!s)return m(i,"There is no obsidian.css file in the root path of the ${cssGithubRepository} repository, so this theme cannot be updated."),!1;let o=V(n);yield vt(i,o,s),yt(i,n,t);let r=`${o} theme updated from ${n}. From date: ${e} to ${t} `;return i.log(r+`[Theme Info](https://github.com/${n})`,!1),m(i,`${r}`,20,()=>a(void 0,null,function*(){window.open(`https://github.com/${n}`)})),!0});var W=require("obsidian");var S=class extends W.Modal{constructor(e,t=!1){super(e.app);this.plugin=e,this.address="",this.openSettingsTabAfterwards=t}submitForm(){return a(this,null,function*(){if(this.address==="")return;let e=this.address.replace("https://github.com/","");if(yield wt(this.plugin,e)){m(this.plugin,"This plugin is already in the list for beta testing",10);return}(yield nt(this.plugin,e,V(e)))&&(yield bt(this.plugin,e),this.close())})}onOpen(){this.contentEl.createEl("h4",{text:"Github repository for beta theme:"}),this.contentEl.createEl("form",{},e=>{new W.Setting(e).addText(t=>{t.setPlaceholder("Repository (example: GitubUserName/repository-name"),t.onChange(s=>{this.address=s.trim()}),t.inputEl.addEventListener("keydown",s=>a(this,null,function*(){s.key==="Enter"&&this.address!==" "&&(s.preventDefault(),yield this.submitForm())})),t.inputEl.style.width="100%",window.setTimeout(()=>{let s=document.querySelector(".setting-item-info");s&&s.remove(),t.inputEl.focus()},10)}),e.createDiv("modal-button-container",t=>{t.createEl("button",{attr:{type:"button"},text:"Never mind"}).addEventListener("click",()=>this.close()),t.createEl("button",{attr:{type:"submit"},cls:"mod-cta",text:"Add Theme"})}),e.addEventListener("submit",t=>a(this,null,function*(){t.preventDefault(),this.address!==""&&(yield this.submitForm())}))})}onClose(){return a(this,null,function*(){this.openSettingsTabAfterwards&&(yield this.plugin.app.setting.open(),yield this.plugin.app.setting.openTabById("obsidian42-brat"))})}};var Q=class extends T.PluginSettingTab{constructor(e,t){super(e,t);this.plugin=t}display(){let{containerEl:e}=this;e.empty(),e.createEl("h2",{text:this.plugin.appName}),new T.Setting(e).setName("Auto-update plugins at startup").setDesc("If enabled all beta plugins will be checked for updates each time Obsidian starts.").addToggle(t=>{t.setValue(this.plugin.settings.updateAtStartup),t.onChange(s=>a(this,null,function*(){this.plugin.settings.updateAtStartup=s,yield this.plugin.saveSettings()}))}),new T.Setting(e).setName("Auto-update themes at startup").setDesc("If enabled all beta themes will be checked for updates each time Obsidian starts.").addToggle(t=>{t.setValue(this.plugin.settings.updateThemesAtStartup),t.onChange(s=>a(this,null,function*(){this.plugin.settings.updateThemesAtStartup=s,yield this.plugin.saveSettings()}))}),new T.Setting(e).setName("Ribbon Button").setDesc("Toggle ribbon button off and on.").addToggle(t=>{t.setValue(this.plugin.settings.ribbonIconEnabled),t.onChange(s=>a(this,null,function*(){this.plugin.settings.ribbonIconEnabled=s,this.plugin.settings.ribbonIconEnabled===!1?this.plugin.ribbonIcon.remove():this.plugin.showRibbonButton(),yield this.plugin.saveSettings()}))}),e.createEl("hr"),e.createEl("h2",{text:"Beta Plugin List"}),e.createEl("div",{text:'The following is a list of beta plugins added via the command palette "Add a beta plugin for testing". '}),e.createEl("p"),e.createEl("div",{text:"Click the x button next to a plugin to remove it from the list."}),e.createEl("p"),e.createEl("span").createEl("b",{text:"Note: "}),e.createSpan({text:"This does not delete the plugin, this should be done from the Community Plugins tab in Settings."}),new T.Setting(e).addButton(t=>{t.setButtonText("Add Beta plugin"),t.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),yield this.plugin.betaPlugins.displayAddNewPluginModal(!0)}))});for(let t of this.plugin.settings.pluginList)new T.Setting(e).setName(t).addButton(s=>{s.setIcon("cross"),s.setTooltip("Delete this beta plugin"),s.onClick(()=>a(this,null,function*(){s.buttonEl.textContent===""?s.setButtonText("Click once more to confirm removal"):(s.buttonEl.parentElement.parentElement.remove(),yield this.plugin.betaPlugins.deletePlugin(t))}))});e.createEl("hr"),e.createEl("h2",{text:"Beta Themes List"}),new T.Setting(e).addButton(t=>{t.setButtonText("Add Beta Theme"),t.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),new S(this.plugin).open()}))});for(let t of this.plugin.settings.themesList)new T.Setting(e).setName(t.repo).addButton(s=>{s.setIcon("cross"),s.setTooltip("Delete this beta theme"),s.onClick(()=>a(this,null,function*(){s.buttonEl.textContent===""?s.setButtonText("Click once more to confirm removal"):(s.buttonEl.parentElement.parentElement.remove(),yield Ct(this.plugin,t.repo))}))});e.createEl("hr"),e.createEl("h2",{text:"Monitoring"}),new T.Setting(e).setName("Enable Notifications").setDesc("BRAT will provide popup notifications for its various activities. Turn this off means no notifications from BRAT.").addToggle(t=>{t.setValue(this.plugin.settings.notificationsEnabled),t.onChange(s=>a(this,null,function*(){this.plugin.settings.notificationsEnabled=s,yield this.plugin.saveSettings()}))}),new T.Setting(e).setName("Enable Logging").setDesc("Plugin updates will be logged to a file in the log file.").addToggle(t=>{t.setValue(this.plugin.settings.loggingEnabled),t.onChange(s=>a(this,null,function*(){this.plugin.settings.loggingEnabled=s,yield this.plugin.saveSettings()}))}),new T.Setting(this.containerEl).setName("BRAT Log File Location").setDesc("Logs will be saved to this file. Don't add .md to the file name.").addSearch(t=>{t.setPlaceholder("Example: BRAT-log").setValue(this.plugin.settings.loggingPath).onChange(s=>a(this,null,function*(){this.plugin.settings.loggingPath=s,yield this.plugin.saveSettings()}))}),new T.Setting(e).setName("Enable Verbose Logging").setDesc("Get a lot more information in the log.").addToggle(t=>{t.setValue(this.plugin.settings.loggingVerboseEnabled),t.onChange(s=>a(this,null,function*(){this.plugin.settings.loggingVerboseEnabled=s,yield this.plugin.saveSettings()}))}),new T.Setting(e).setName("Debugging Mode").setDesc("Atomic Bomb level console logging. Can be used for troubleshoting and development.").addToggle(t=>{t.setValue(this.plugin.settings.debuggingMode),t.onChange(s=>a(this,null,function*(){this.plugin.settings.debuggingMode=s,yield this.plugin.saveSettings()}))})}};var G=require("obsidian");var F=class extends G.Modal{constructor(e,t,s=!1){super(e.app);this.plugin=e,this.betaPlugins=t,this.address="",this.openSettingsTabAfterwards=s}submitForm(){return a(this,null,function*(){if(this.address==="")return;let e=this.address.replace("https://github.com/","");if(yield ht(this.plugin,e)){m(this.plugin,"This plugin is already in the list for beta testing",10);return}(yield this.betaPlugins.addPlugin(e))&&this.close()})}onOpen(){this.contentEl.createEl("h4",{text:"Github repository for beta plugin:"}),this.contentEl.createEl("form",{},e=>{new G.Setting(e).addText(t=>{t.setPlaceholder("Repository (example: TfTHacker/obsidian-brat"),t.onChange(s=>{this.address=s.trim()}),t.inputEl.addEventListener("keydown",s=>a(this,null,function*(){s.key==="Enter"&&this.address!==" "&&(s.preventDefault(),yield this.submitForm())})),t.inputEl.style.width="100%",window.setTimeout(()=>{let s=document.querySelector(".setting-item-info");s&&s.remove(),t.inputEl.focus()},10)}),e.createDiv("modal-button-container",t=>{t.createEl("button",{attr:{type:"button"},text:"Never mind"}).addEventListener("click",()=>this.close()),t.createEl("button",{attr:{type:"submit"},cls:"mod-cta",text:"Add Plugin"})}),e.addEventListener("submit",t=>a(this,null,function*(){t.preventDefault(),this.address!==""&&(yield this.submitForm())}))})}onClose(){return a(this,null,function*(){this.openSettingsTabAfterwards&&(yield this.plugin.app.setting.open(),yield this.plugin.app.setting.openTabById("obsidian42-brat"))})}};var K=require("obsidian");var D=class{constructor(n){this.plugin=n}displayAddNewPluginModal(n=!1){return a(this,null,function*(){new F(this.plugin,this,n).open()})}validateRepository(n,e=!1,t=!1){return a(this,null,function*(){let o=yield dt(n,!e);return o?"id"in o?"version"in o?o:(t&&m(this.plugin,`${n}
-The version attribute for the release is missing from the manifest file`,15),null):(t&&m(this.plugin,`${n}
-The plugin id attribute for the release is missing from the manifest file`,15),null):(t&&m(this.plugin,`${n}
-This does not seem to be an obsidian plugin, as there is no manifest.json file.`,15),null)})}getAllReleaseFiles(n,e,t){return a(this,null,function*(){return{mainJs:yield H(n,e.version,"main.js"),manifest:t?yield H(n,e.version,"manifest.json"):null,styles:yield H(n,e.version,"styles.css")}})}writeReleaseFilesToPluginFolder(n,e){return a(this,null,function*(){let t=(0,K.normalizePath)(this.plugin.app.vault.configDir+"/plugins/"+n)+"/",s=this.plugin.app.vault.adapter;((yield s.exists(t))===!1||!(yield s.exists(t+"manifest.json")))&&(yield s.mkdir(t)),yield s.write(t+"main.js",e.mainJs),yield s.write(t+"manifest.json",e.manifest),e.styles&&(yield s.write(t+"styles.css",e.styles))})}addPlugin(n,e=!1,t=!1,s=!1){return a(this,null,function*(){var g;let r=yield this.validateRepository(n,!0,!1),u=!!r;if(u===!1&&(r=yield this.validateRepository(n,!1,!0)),r===null){let d=`${n}
-A manifest.json or manifest-beta.json file does not exist in the root directory of the repository. This plugin cannot be installed.`;return this.plugin.log(d,!0),m(this.plugin,`${d}`,10),!1}if(!r.hasOwnProperty("version")){let d=`${n}
-The manifest${u?"-beta":""}.json file in the root directory of the repository does not have a version number in the file. This plugin cannot be installed.`;return this.plugin.log(d,!0),m(this.plugin,`${d}`,10),!1}let c=()=>a(this,null,function*(){let d=yield this.getAllReleaseFiles(n,r,u);if((u||d.manifest===null)&&(d.manifest=JSON.stringify(r)),d.mainJs===null){let p=`${n}
-The release is not complete and cannot be download. main.js is missing from the Release`;return this.plugin.log(p,!0),m(this.plugin,`${p}`,10),null}return d});if(e===!1){let d=yield c();if(d===null)return;yield this.writeReleaseFilesToPluginFolder(r.id,d),yield ft(this.plugin,n),yield this.plugin.app.plugins.loadManifests();let p=`${n}
-The plugin has been registered with BRAT. You may still need to enable it the Community Plugin List.`;this.plugin.log(p,!0),m(this.plugin,p,10)}else{let d=this.plugin.app.vault.configDir+"/plugins/"+r.id+"/",p=null;try{p=yield this.plugin.app.vault.adapter.read(d+"manifest.json")}catch(w){if(w.errno===-4058)return yield this.addPlugin(n,!1,u),!0;console.log("BRAT - Local Manifest Load",r.id,JSON.stringify(w,null,2))}let P=yield JSON.parse(p);if(P.version!==r.version){let w=yield c();if(w===null)return;if(t){let y=`There is an update available for ${r.id} from version ${P.version} to ${r.version}. `;this.plugin.log(y+`[Release Info](https://github.com/${n}/releases/tag/${r.version})`,!1),m(this.plugin,y,30,()=>a(this,null,function*(){window.open(`https://github.com/${n}/releases/tag/${r.version}`)}))}else{yield this.writeReleaseFilesToPluginFolder(r.id,w),yield this.plugin.app.plugins.loadManifests(),(g=this.plugin.app.plugins.plugins[r.id])!=null&&g.manifest&&(yield this.reloadPlugin(r.id));let y=`${r.id}
-Plugin has been updated from version ${P.version} to ${r.version}. `;this.plugin.log(y+`[Release Info](https://github.com/${n}/releases/tag/${r.version})`,!1),m(this.plugin,y,30,()=>a(this,null,function*(){window.open(`https://github.com/${n}/releases/tag/${r.version}`)}))}}else s&&m(this.plugin,`No update available for ${n}`,3)}return!0})}reloadPlugin(n){return a(this,null,function*(){let e=this.plugin.app.plugins;try{yield e.disablePlugin(n),yield e.enablePlugin(n)}catch(t){console.log("reload plugin",t)}})}updatePlugin(n,e=!1,t=!1){return a(this,null,function*(){let s=yield this.addPlugin(n,!0,e,t);return s===!1&&e===!1&&m(this.plugin,`${n}
-Update of plugin failed.`),s})}checkForUpdatesAndInstallUpdates(n=!1,e=!1){return a(this,null,function*(){if((yield z())===!1){console.log("BRAT: No internet detected.");return}let t,s="Checking for plugin updates STARTED";this.plugin.log(s,!0),n&&this.plugin.settings.notificationsEnabled&&(t=new K.Notice(`BRAT
-${s}`,3e4));for(let r of this.plugin.settings.pluginList)yield this.updatePlugin(r,e);let o="Checking for plugin updates COMPLETED";this.plugin.log(o,!0),n&&(t.hide(),m(this.plugin,o,10))})}deletePlugin(n){return a(this,null,function*(){let e=`Removed ${n} from BRAT plugin list`;this.plugin.log(e,!0),this.plugin.settings.pluginList=this.plugin.settings.pluginList.filter(t=>t!=n),this.plugin.saveSettings()})}getEnabledDisabledPlugins(n){let e=this.plugin.app.plugins,t=Object.values(e.manifests),s=Object.values(e.plugins).map(o=>o.manifest);return n?t.filter(o=>s.find(r=>o.id===r.id)):t.filter(o=>!s.find(r=>o.id===r.id))}};var At=require("obsidian");function St(){(0,At.addIcon)("BratIcon",'')}var $=require("obsidian"),Ht=Kt(_t());function Yt(i,n,e=!1){if(i.settings.debuggingMode&&console.log("BRAT: "+n),i.settings.loggingEnabled){if(i.settings.loggingVerboseEnabled===!1&&e===!0)return;{let t=i.settings.loggingPath+".md",s="[["+(0,$.moment)().format((0,Ht.getDailyNoteSettings)().format).toString()+"]] "+(0,$.moment)().format("HH:mm"),o=$.Platform.isDesktop?window.require("os").hostname():"MOBILE",r=s+" "+o+" "+n.replace(`
+var Ve=Object.create;var _=Object.defineProperty;var je=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var Je=Object.getPrototypeOf,We=Object.prototype.hasOwnProperty;var Qe=(s,t)=>()=>(t||s((t={exports:{}}).exports,t),t.exports),Ge=(s,t)=>{for(var e in t)_(s,e,{get:t[e],enumerable:!0})},ge=(s,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of qe(t))!We.call(s,i)&&i!==e&&_(s,i,{get:()=>t[i],enumerable:!(n=je(t,i))||n.enumerable});return s};var Ke=(s,t,e)=>(e=s!=null?Ve(Je(s)):{},ge(t||!s||!s.__esModule?_(e,"default",{value:s,enumerable:!0}):e,s)),Ze=s=>ge(_({},"__esModule",{value:!0}),s);var a=(s,t,e)=>new Promise((n,i)=>{var o=c=>{try{l(e.next(c))}catch(g){i(g)}},r=c=>{try{l(e.throw(c))}catch(g){i(g)}},l=c=>c.done?n(c.value):Promise.resolve(c.value).then(o,r);l((e=e.apply(s,t)).next())});var ze=Qe(u=>{"use strict";Object.defineProperty(u,"__esModule",{value:!0});var p=require("obsidian"),ie="YYYY-MM-DD",se="gggg-[W]ww",Ae="YYYY-MM",Ee="YYYY-[Q]Q",Ie="YYYY";function D(s){var e,n;let t=window.app.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e[s])==null?void 0:n.enabled)}function R(){var s,t,e,n;try{let{internalPlugins:i,plugins:o}=window.app;if(D("daily")){let{format:g,folder:h,template:d}=((t=(s=o.getPlugin("periodic-notes"))==null?void 0:s.settings)==null?void 0:t.daily)||{};return{format:g||ie,folder:(h==null?void 0:h.trim())||"",template:(d==null?void 0:d.trim())||""}}let{folder:r,format:l,template:c}=((n=(e=i.getPluginById("daily-notes"))==null?void 0:e.instance)==null?void 0:n.options)||{};return{format:l||ie,folder:(r==null?void 0:r.trim())||"",template:(c==null?void 0:c.trim())||""}}catch(i){console.info("No custom daily note settings found!",i)}}function k(){var s,t,e,n,i,o,r;try{let l=window.app.plugins,c=(s=l.getPlugin("calendar"))==null?void 0:s.options,g=(e=(t=l.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.weekly;if(D("weekly"))return{format:g.format||se,folder:((n=g.folder)==null?void 0:n.trim())||"",template:((i=g.template)==null?void 0:i.trim())||""};let h=c||{};return{format:h.weeklyNoteFormat||se,folder:((o=h.weeklyNoteFolder)==null?void 0:o.trim())||"",template:((r=h.weeklyNoteTemplate)==null?void 0:r.trim())||""}}catch(l){console.info("No custom weekly note settings found!",l)}}function M(){var t,e,n,i;let s=window.app.plugins;try{let o=D("monthly")&&((e=(t=s.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.monthly)||{};return{format:o.format||Ae,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((i=o.template)==null?void 0:i.trim())||""}}catch(o){console.info("No custom monthly note settings found!",o)}}function x(){var t,e,n,i;let s=window.app.plugins;try{let o=D("quarterly")&&((e=(t=s.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.quarterly)||{};return{format:o.format||Ee,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((i=o.template)==null?void 0:i.trim())||""}}catch(o){console.info("No custom quarterly note settings found!",o)}}function O(){var t,e,n,i;let s=window.app.plugins;try{let o=D("yearly")&&((e=(t=s.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.yearly)||{};return{format:o.format||Ie,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((i=o.template)==null?void 0:i.trim())||""}}catch(o){console.info("No custom yearly note settings found!",o)}}function Le(...s){let t=[];for(let n=0,i=s.length;n{let X=n(),ee=s.clone().set({hour:X.get("hour"),minute:X.get("minute"),second:X.get("second")});return T&&ee.add(parseInt(f,10),P),w?ee.format(w.substring(1).trim()):ee.format(o)}).replace(/{{\s*yesterday\s*}}/gi,s.clone().subtract(1,"day").format(o)).replace(/{{\s*tomorrow\s*}}/gi,s.clone().add(1,"d").format(o)));return t.foldManager.save(d,c),d}catch(d){console.error(`Failed to create file: '${h}'`,d),new p.Notice("Unable to create new file.")}})}function at(s,t){var e;return(e=t[N(s,"day")])!=null?e:null}function rt(){let{vault:s}=window.app,{folder:t}=R(),e=s.getAbstractFileByPath(p.normalizePath(t));if(!e)throw new oe("Failed to find daily notes folder");let n={};return p.Vault.recurseChildren(e,i=>{if(i instanceof p.TFile){let o=E(i,"day");if(o){let r=N(o,"day");n[r]=i}}}),n}var ae=class extends Error{};function lt(){let{moment:s}=window,t=s.localeData()._week.dow,e=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"];for(;t;)e.push(e.shift()),t--;return e}function ut(s){return lt().indexOf(s.toLowerCase())}function ke(s){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:i}=k(),[o,r]=yield A(e),l=s.format(n),c=yield $(i,l);try{let g=yield t.create(c,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,d,b,y,T,f)=>{let P=window.moment(),w=s.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return b&&w.add(parseInt(y,10),T),f?w.format(f.substring(1).trim()):w.format(n)}).replace(/{{\s*title\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi,(h,d,b)=>{let y=ut(d);return s.weekday(y).format(b.trim())}));return window.app.foldManager.save(g,r),g}catch(g){console.error(`Failed to create file: '${c}'`,g),new p.Notice("Unable to create new file.")}})}function gt(s,t){var e;return(e=t[N(s,"week")])!=null?e:null}function ct(){let s={};if(!xe())return s;let{vault:t}=window.app,{folder:e}=k(),n=t.getAbstractFileByPath(p.normalizePath(e));if(!n)throw new ae("Failed to find weekly notes folder");return p.Vault.recurseChildren(n,i=>{if(i instanceof p.TFile){let o=E(i,"week");if(o){let r=N(o,"week");s[r]=i}}}),s}var re=class extends Error{};function Me(s){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:i}=M(),[o,r]=yield A(e),l=s.format(n),c=yield $(i,l);try{let g=yield t.create(c,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,d,b,y,T,f)=>{let P=window.moment(),w=s.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return b&&w.add(parseInt(y,10),T),f?w.format(f.substring(1).trim()):w.format(n)}).replace(/{{\s*date\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,l));return window.app.foldManager.save(g,r),g}catch(g){console.error(`Failed to create file: '${c}'`,g),new p.Notice("Unable to create new file.")}})}function dt(s,t){var e;return(e=t[N(s,"month")])!=null?e:null}function mt(){let s={};if(!Oe())return s;let{vault:t}=window.app,{folder:e}=M(),n=t.getAbstractFileByPath(p.normalizePath(e));if(!n)throw new re("Failed to find monthly notes folder");return p.Vault.recurseChildren(n,i=>{if(i instanceof p.TFile){let o=E(i,"month");if(o){let r=N(o,"month");s[r]=i}}}),s}var le=class extends Error{};function pt(s){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:i}=x(),[o,r]=yield A(e),l=s.format(n),c=yield $(i,l);try{let g=yield t.create(c,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,d,b,y,T,f)=>{let P=window.moment(),w=s.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return b&&w.add(parseInt(y,10),T),f?w.format(f.substring(1).trim()):w.format(n)}).replace(/{{\s*date\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,l));return window.app.foldManager.save(g,r),g}catch(g){console.error(`Failed to create file: '${c}'`,g),new p.Notice("Unable to create new file.")}})}function ft(s,t){var e;return(e=t[N(s,"quarter")])!=null?e:null}function ht(){let s={};if(!$e())return s;let{vault:t}=window.app,{folder:e}=x(),n=t.getAbstractFileByPath(p.normalizePath(e));if(!n)throw new le("Failed to find quarterly notes folder");return p.Vault.recurseChildren(n,i=>{if(i instanceof p.TFile){let o=E(i,"quarter");if(o){let r=N(o,"quarter");s[r]=i}}}),s}var ue=class extends Error{};function bt(s){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:i}=O(),[o,r]=yield A(e),l=s.format(n),c=yield $(i,l);try{let g=yield t.create(c,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,d,b,y,T,f)=>{let P=window.moment(),w=s.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return b&&w.add(parseInt(y,10),T),f?w.format(f.substring(1).trim()):w.format(n)}).replace(/{{\s*date\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,l));return window.app.foldManager.save(g,r),g}catch(g){console.error(`Failed to create file: '${c}'`,g),new p.Notice("Unable to create new file.")}})}function wt(s,t){var e;return(e=t[N(s,"year")])!=null?e:null}function yt(){let s={};if(!Ue())return s;let{vault:t}=window.app,{folder:e}=O(),n=t.getAbstractFileByPath(p.normalizePath(e));if(!n)throw new ue("Failed to find yearly notes folder");return p.Vault.recurseChildren(n,i=>{if(i instanceof p.TFile){let o=E(i,"year");if(o){let r=N(o,"year");s[r]=i}}}),s}function Tt(){var n,i;let{app:s}=window,t=s.internalPlugins.plugins["daily-notes"];if(t&&t.enabled)return!0;let e=s.plugins.getPlugin("periodic-notes");return e&&((i=(n=e.settings)==null?void 0:n.daily)==null?void 0:i.enabled)}function xe(){var e,n;let{app:s}=window;if(s.plugins.getPlugin("calendar"))return!0;let t=s.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.weekly)==null?void 0:n.enabled)}function Oe(){var e,n;let{app:s}=window,t=s.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.monthly)==null?void 0:n.enabled)}function $e(){var e,n;let{app:s}=window,t=s.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.quarterly)==null?void 0:n.enabled)}function Ue(){var e,n;let{app:s}=window,t=s.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.yearly)==null?void 0:n.enabled)}function Pt(s){return{day:R,week:k,month:M,quarter:x,year:O}[s]()}function vt(s,t){return{day:Re,month:Me,week:ke}[s](t)}u.DEFAULT_DAILY_NOTE_FORMAT=ie;u.DEFAULT_MONTHLY_NOTE_FORMAT=Ae;u.DEFAULT_QUARTERLY_NOTE_FORMAT=Ee;u.DEFAULT_WEEKLY_NOTE_FORMAT=se;u.DEFAULT_YEARLY_NOTE_FORMAT=Ie;u.appHasDailyNotesPluginLoaded=Tt;u.appHasMonthlyNotesPluginLoaded=Oe;u.appHasQuarterlyNotesPluginLoaded=$e;u.appHasWeeklyNotesPluginLoaded=xe;u.appHasYearlyNotesPluginLoaded=Ue;u.createDailyNote=Re;u.createMonthlyNote=Me;u.createPeriodicNote=vt;u.createQuarterlyNote=pt;u.createWeeklyNote=ke;u.createYearlyNote=bt;u.getAllDailyNotes=rt;u.getAllMonthlyNotes=mt;u.getAllQuarterlyNotes=ht;u.getAllWeeklyNotes=ct;u.getAllYearlyNotes=yt;u.getDailyNote=at;u.getDailyNoteSettings=R;u.getDateFromFile=E;u.getDateFromPath=ot;u.getDateUID=N;u.getMonthlyNote=dt;u.getMonthlyNoteSettings=M;u.getPeriodicNoteSettings=Pt;u.getQuarterlyNote=ft;u.getQuarterlyNoteSettings=x;u.getTemplateInfo=A;u.getWeeklyNote=gt;u.getWeeklyNoteSettings=k;u.getYearlyNote=wt;u.getYearlyNoteSettings=O});var St={};Ge(St,{default:()=>Z});module.exports=Ze(St);var Ye=require("obsidian");var v=require("obsidian");var q=require("obsidian");var ce=require("obsidian"),S=class extends ce.FuzzySuggestModal{constructor(e){super(e.app);this.scope.register(["Shift"],"Enter",n=>this.enterTrigger(n)),this.scope.register(["Ctrl"],"Enter",n=>this.enterTrigger(n))}setSuggesterData(e){this.data=e}display(e){return a(this,null,function*(){this.callbackFunction=e,this.open()})}getItems(){return this.data}getItemText(e){return e.display}onChooseItem(){}renderSuggestion(e,n){n.createEl("div",{text:e.item.display})}enterTrigger(e){let n=document.querySelector(".suggestion-item.is-selected div").textContent,i=this.data.find(o=>o.display===n);i&&(this.invokeCallback(i,e),this.close())}onChooseSuggestion(e,n){this.invokeCallback(e.item,n)}invokeCallback(e,n){this.callbackFunction(e,n)}};var F=require("obsidian"),Xe="https://raw.githubusercontent.com/",H=(s,t,e)=>a(void 0,null,function*(){let n=`https://github.com/${s}/releases/download/${t}/${e}`;try{let i=yield(0,F.request)({url:n});return i==="Not Found"||i==='{"error":"Not Found"}'?null:i}catch(i){console.log("error in grabReleaseFileFromRepository",n,i)}}),de=(s,t=!0)=>a(void 0,null,function*(){let e=Xe+s+(t===!0?"/HEAD/manifest.json":"/HEAD/manifest-beta.json");try{let n=yield(0,F.request)({url:e});return n==="404: Not Found"?null:yield JSON.parse(n)}catch(n){console.log(`error in grabManifestJsonFromRepository for ${e}`,n)}}),me=()=>a(void 0,null,function*(){let s="https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json";try{let t=yield(0,F.request)({url:s});return t==="404: Not Found"?null:yield JSON.parse(t)}catch(t){console.log("error in grabCommmunityPluginList",t)}}),Y=()=>a(void 0,null,function*(){let s="https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-css-themes.json";try{let t=yield(0,F.request)({url:s});return t==="404: Not Found"?null:yield JSON.parse(t)}catch(t){console.log("error in grabCommmunityThemesList",t)}}),te=s=>a(void 0,null,function*(){let t=`https://raw.githubusercontent.com/${s}/HEAD/obsidian.css`;try{let e=yield(0,F.request)({url:t});return e==="404: Not Found"?null:e}catch(e){console.log("error in grabCommmunityThemesList",e)}}),et=(s,t)=>a(void 0,null,function*(){let e=`https://api.github.com/repos/${s}/commits?path=${t}&page=1&per_page=1`;try{let n=yield(0,F.request)({url:e});return n==="404: Not Found"?null:JSON.parse(n)}catch(n){console.log("error in grabCommmunityThemesList",n)}}),V=(s,t)=>a(void 0,null,function*(){let e=yield et(s,t);return e[0].commit.committer.date?e[0].commit.committer.date:""});var pe={pluginList:[],pluginSubListFrozenVersion:[],themesList:[],updateAtStartup:!1,updateThemesAtStartup:!1,ribbonIconEnabled:!0,loggingEnabled:!1,loggingPath:"BRAT-log",loggingVerboseEnabled:!1,debuggingMode:!0,notificationsEnabled:!0};function fe(s,t,e=""){return a(this,null,function*(){let n=!1;s.settings.pluginList.contains(t)||(s.settings.pluginList.unshift(t),n=!0),e!==""&&s.settings.pluginSubListFrozenVersion.filter(i=>i.repo===t).length===0&&(s.settings.pluginSubListFrozenVersion.unshift({repo:t,version:e}),n=!0),n&&s.saveSettings()})}function he(s,t){return a(this,null,function*(){return s.settings.pluginList.contains(t)})}function be(s,t){return a(this,null,function*(){let e={repo:t,lastUpdate:yield V(t,"obsidian.css")};s.settings.themesList.unshift(e),s.saveSettings()})}function we(s,t){return a(this,null,function*(){return!!s.settings.themesList.find(n=>n.repo===t)})}function ye(s,t,e){s.settings.themesList.forEach(n=>{n.repo===t&&(n.lastUpdate=e,s.saveSettings())})}var Te=require("obsidian");function m(s,t,e=10,n=null){if(s.settings.notificationsEnabled===!1)return;let i=n?"(click=dismiss, right-click=Info)":"",o=new Te.Notice(`BRAT
+${t}
+${i}`,e*1e3);n&&(o.noticeEl.oncontextmenu=()=>a(this,null,function*(){n()}))}function j(){return a(this,null,function*(){try{let s=yield fetch("https://obsidian.md/?"+Math.random());return s.status>=200&&s.status<300}catch(s){return!1}})}var Pe=s=>(0,q.normalizePath)(s.app.vault.configDir+"/themes")+"/",ne=(s,t,e="")=>a(void 0,null,function*(){let n=yield te(t);if(!n)return m(s,"There is no obsidian.css file in the root path of this repository, so there is no theme to install."),!1;yield ve(s,e,n);let i=`${e} theme installed from ${t}. `;return s.log(i+`[Theme Info](https://github.com/${t})`,!1),m(s,`${i}`,10,()=>a(void 0,null,function*(){window.open(`https://github.com/${t}`)})),setTimeout(()=>{s.app.customCss.setTheme(e)},500),!0}),ve=(s,t,e)=>a(void 0,null,function*(){let n=Pe(s),i=s.app.vault.adapter;(yield i.exists(n))===!1&&(yield i.mkdir(n)),yield i.write(n+t+".css",e)}),Se=s=>a(void 0,null,function*(){let t=yield Y(),e=Object.values(t).map(i=>({display:`Theme: ${i.name} (${i.repo})`,info:i})),n=new S(s);n.setSuggesterData(e),yield n.display(i=>a(void 0,null,function*(){yield ne(s,i.info.repo,i.info.name)}))}),J=s=>("BRAT-"+s.replace("/","----")).substr(0,100),Ne=(s,t)=>a(void 0,null,function*(){s.settings.themesList=s.settings.themesList.filter(n=>n.repo!=t),s.saveSettings(),yield s.app.vault.adapter.remove(Pe(s)+J(t)+".css");let e=`Removed ${t} from BRAT themes list and deleted from vault`;s.log(e,!0),m(s,`${e}`)}),W=(s,t)=>a(void 0,null,function*(){if((yield j())===!1){console.log("BRAT: No internet detected.");return}let e,n="Checking for beta theme updates STARTED";s.log(n,!0),t&&s.settings.notificationsEnabled&&(e=new q.Notice(`BRAT
+${n}`,3e4));for(let o of s.settings.themesList){let r=yield V(o.repo,"obsidian.css");r!==o.lastUpdate&&(yield tt(s,o.repo,o.lastUpdate,r))}let i="Checking for beta theme updates COMPLETED";s.log(i,!0),t&&(s.settings.notificationsEnabled&&e.hide(),m(s,i))}),tt=(s,t,e="",n="")=>a(void 0,null,function*(){let i=yield te(t);if(!i)return m(s,"There is no obsidian.css file in the root path of the ${cssGithubRepository} repository, so this theme cannot be updated."),!1;let o=J(t);yield ve(s,o,i),ye(s,t,n);let r=`${o} theme updated from ${t}. From date: ${e} to ${n} `;return s.log(r+`[Theme Info](https://github.com/${t})`,!1),m(s,`${r}`,20,()=>a(void 0,null,function*(){window.open(`https://github.com/${t}`)})),!0});var Q=require("obsidian");var C=class extends Q.Modal{constructor(e,n=!1){super(e.app);this.plugin=e,this.address="",this.openSettingsTabAfterwards=n}submitForm(){return a(this,null,function*(){if(this.address==="")return;let e=this.address.replace("https://github.com/","");if(yield we(this.plugin,e)){m(this.plugin,"This plugin is already in the list for beta testing",10);return}(yield ne(this.plugin,e,J(e)))&&(yield be(this.plugin,e),this.close())})}onOpen(){this.contentEl.createEl("h4",{text:"Github repository for beta theme:"}),this.contentEl.createEl("form",{},e=>{new Q.Setting(e).addText(n=>{n.setPlaceholder("Repository (example: GitubUserName/repository-name"),n.onChange(i=>{this.address=i.trim()}),n.inputEl.addEventListener("keydown",i=>a(this,null,function*(){i.key==="Enter"&&this.address!==" "&&(i.preventDefault(),yield this.submitForm())})),n.inputEl.style.width="100%",window.setTimeout(()=>{let i=document.querySelector(".setting-item-info");i&&i.remove(),n.inputEl.focus()},10)}),e.createDiv("modal-button-container",n=>{n.createEl("button",{attr:{type:"button"},text:"Never mind"}).addEventListener("click",()=>this.close()),n.createEl("button",{attr:{type:"submit"},cls:"mod-cta",text:"Add Theme"})}),e.addEventListener("submit",n=>a(this,null,function*(){n.preventDefault(),this.address!==""&&(yield this.submitForm())}))})}onClose(){return a(this,null,function*(){this.openSettingsTabAfterwards&&(yield this.plugin.app.setting.open(),yield this.plugin.app.setting.openTabById("obsidian42-brat"))})}};var G=class extends v.PluginSettingTab{constructor(e,n){super(e,n);this.plugin=n}display(){let{containerEl:e}=this;e.empty(),e.createEl("h2",{text:this.plugin.appName}),new v.Setting(e).setName("Auto-update plugins at startup").setDesc("If enabled all beta plugins will be checked for updates each time Obsidian starts. Note: this does not update frozen version plugins.").addToggle(i=>{i.setValue(this.plugin.settings.updateAtStartup),i.onChange(o=>a(this,null,function*(){this.plugin.settings.updateAtStartup=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Auto-update themes at startup").setDesc("If enabled all beta themes will be checked for updates each time Obsidian starts.").addToggle(i=>{i.setValue(this.plugin.settings.updateThemesAtStartup),i.onChange(o=>a(this,null,function*(){this.plugin.settings.updateThemesAtStartup=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Ribbon Button").setDesc("Toggle ribbon button off and on.").addToggle(i=>{i.setValue(this.plugin.settings.ribbonIconEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.ribbonIconEnabled=o,this.plugin.settings.ribbonIconEnabled===!1?this.plugin.ribbonIcon.remove():this.plugin.showRibbonButton(),yield this.plugin.saveSettings()}))}),e.createEl("hr"),e.createEl("h2",{text:"Beta Plugin List"}),e.createEl("div",{text:'The following is a list of beta plugins added via the command palette "Add a beta plugin for testing" or "Add a beta plugin with frozen version for testing". A frozen version is a specific release of a plugin based on its releease tag. '}),e.createEl("p"),e.createEl("div",{text:"Click the x button next to a plugin to remove it from the list."}),e.createEl("p"),e.createEl("span").createEl("b",{text:"Note: "}),e.createSpan({text:"This does not delete the plugin, this should be done from the Community Plugins tab in Settings."}),new v.Setting(e).addButton(i=>{i.setButtonText("Add Beta plugin"),i.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),yield this.plugin.betaPlugins.displayAddNewPluginModal(!0,!1)}))});let n=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(i=>i.repo));for(let i of this.plugin.settings.pluginList)n.has(i)||new v.Setting(e).setName(i).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta plugin"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield this.plugin.betaPlugins.deletePlugin(i))}))});new v.Setting(e).addButton(i=>{i.setButtonText("Add Beta plugin with frozen version"),i.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),yield this.plugin.betaPlugins.displayAddNewPluginModal(!0,!0)}))});for(let i of this.plugin.settings.pluginSubListFrozenVersion)new v.Setting(e).setName(`${i.repo} (version ${i.version})`).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta plugin"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield this.plugin.betaPlugins.deletePlugin(i.repo))}))});e.createEl("hr"),e.createEl("h2",{text:"Beta Themes List"}),new v.Setting(e).addButton(i=>{i.setButtonText("Add Beta Theme"),i.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),new C(this.plugin).open()}))});for(let i of this.plugin.settings.themesList)new v.Setting(e).setName(i.repo).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta theme"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield Ne(this.plugin,i.repo))}))});e.createEl("hr"),e.createEl("h2",{text:"Monitoring"}),new v.Setting(e).setName("Enable Notifications").setDesc("BRAT will provide popup notifications for its various activities. Turn this off means no notifications from BRAT.").addToggle(i=>{i.setValue(this.plugin.settings.notificationsEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.notificationsEnabled=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Enable Logging").setDesc("Plugin updates will be logged to a file in the log file.").addToggle(i=>{i.setValue(this.plugin.settings.loggingEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.loggingEnabled=o,yield this.plugin.saveSettings()}))}),new v.Setting(this.containerEl).setName("BRAT Log File Location").setDesc("Logs will be saved to this file. Don't add .md to the file name.").addSearch(i=>{i.setPlaceholder("Example: BRAT-log").setValue(this.plugin.settings.loggingPath).onChange(o=>a(this,null,function*(){this.plugin.settings.loggingPath=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Enable Verbose Logging").setDesc("Get a lot more information in the log.").addToggle(i=>{i.setValue(this.plugin.settings.loggingVerboseEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.loggingVerboseEnabled=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Debugging Mode").setDesc("Atomic Bomb level console logging. Can be used for troubleshoting and development.").addToggle(i=>{i.setValue(this.plugin.settings.debuggingMode),i.onChange(o=>a(this,null,function*(){this.plugin.settings.debuggingMode=o,yield this.plugin.saveSettings()}))})}};var I=require("obsidian");var L=class extends I.Modal{constructor(e,n,i=!1,o=!1){super(e.app);this.plugin=e,this.betaPlugins=n,this.address="",this.openSettingsTabAfterwards=i,this.useFrozenVersion=o,this.version=""}submitForm(){return a(this,null,function*(){if(this.address==="")return;let e=this.address.replace("https://github.com/","");if(yield he(this.plugin,e)){m(this.plugin,"This plugin is already in the list for beta testing",10);return}(yield this.betaPlugins.addPlugin(e,!1,!1,!1,this.version))&&this.close()})}onOpen(){this.contentEl.createEl("h4",{text:"Github repository for beta plugin:"}),this.contentEl.createEl("form",{},e=>{new I.Setting(e).addText(n=>{n.setPlaceholder("Repository (example: TfTHacker/obsidian-brat)"),n.onChange(i=>{this.address=i.trim()}),n.inputEl.addEventListener("keydown",i=>a(this,null,function*(){i.key==="Enter"&&this.address!==" "&&(this.useFrozenVersion&&this.version!==""||!this.useFrozenVersion)&&(i.preventDefault(),yield this.submitForm())})),n.inputEl.style.width="100%",window.setTimeout(()=>{let i=document.querySelector(".setting-item-info");i&&i.remove(),n.inputEl.focus()},10)}),this.useFrozenVersion&&new I.Setting(e).addText(n=>{n.setPlaceholder("Specify the release version tag (example: 1.0.0)"),n.onChange(i=>{this.version=i.trim()}),n.inputEl.style.width="100%",window.setTimeout(()=>{let i=document.querySelector(".setting-item-info");i&&i.remove()},10)}),e.createDiv("modal-button-container",n=>{n.createEl("button",{attr:{type:"button"},text:"Never mind"}).addEventListener("click",()=>this.close()),n.createEl("button",{attr:{type:"submit"},cls:"mod-cta",text:"Add Plugin"})}),e.addEventListener("submit",n=>a(this,null,function*(){n.preventDefault(),this.address!==""&&(this.useFrozenVersion&&this.version!==""||!this.useFrozenVersion)&&(yield this.submitForm())}))})}onClose(){return a(this,null,function*(){this.openSettingsTabAfterwards&&(yield this.plugin.app.setting.open(),yield this.plugin.app.setting.openTabById("obsidian42-brat"))})}};var K=require("obsidian");var B=class{constructor(t){this.plugin=t}displayAddNewPluginModal(t=!1,e=!1){return a(this,null,function*(){new L(this.plugin,this,t,e).open()})}validateRepository(t,e=!1,n=!1){return a(this,null,function*(){let o=yield de(t,!e);return o?"id"in o?"version"in o?o:(n&&m(this.plugin,`${t}
+The version attribute for the release is missing from the manifest file`,15),null):(n&&m(this.plugin,`${t}
+The plugin id attribute for the release is missing from the manifest file`,15),null):(n&&m(this.plugin,`${t}
+This does not seem to be an obsidian plugin, as there is no manifest.json file.`,15),null)})}getAllReleaseFiles(t,e,n,i=""){return a(this,null,function*(){let o=i===""?e.version:i,r=n||i!=="";return{mainJs:yield H(t,o,"main.js"),manifest:r?yield H(t,o,"manifest.json"):null,styles:yield H(t,o,"styles.css")}})}writeReleaseFilesToPluginFolder(t,e){return a(this,null,function*(){let n=(0,K.normalizePath)(this.plugin.app.vault.configDir+"/plugins/"+t)+"/",i=this.plugin.app.vault.adapter;((yield i.exists(n))===!1||!(yield i.exists(n+"manifest.json")))&&(yield i.mkdir(n)),yield i.write(n+"main.js",e.mainJs),yield i.write(n+"manifest.json",e.manifest),e.styles&&(yield i.write(n+"styles.css",e.styles))})}addPlugin(t,e=!1,n=!1,i=!1,o=""){return a(this,null,function*(){var h;let l=yield this.validateRepository(t,!0,!1),c=!!l;if(c===!1&&(l=yield this.validateRepository(t,!1,!0)),l===null){let d=`${t}
+A manifest.json or manifest-beta.json file does not exist in the root directory of the repository. This plugin cannot be installed.`;return this.plugin.log(d,!0),m(this.plugin,`${d}`,10),!1}if(!l.hasOwnProperty("version")){let d=`${t}
+The manifest${c?"-beta":""}.json file in the root directory of the repository does not have a version number in the file. This plugin cannot be installed.`;return this.plugin.log(d,!0),m(this.plugin,`${d}`,10),!1}let g=()=>a(this,null,function*(){let d=yield this.getAllReleaseFiles(t,l,c,o);if((c||d.manifest===null)&&(d.manifest=JSON.stringify(l)),d.mainJs===null){let b=`${t}
+The release is not complete and cannot be download. main.js is missing from the Release`;return this.plugin.log(b,!0),m(this.plugin,`${b}`,10),null}return d});if(e===!1){let d=yield g();if(d===null)return;yield this.writeReleaseFilesToPluginFolder(l.id,d),yield fe(this.plugin,t,o),yield this.plugin.app.plugins.loadManifests();let b=o===""?"":` (version: ${o})`,y=`${t}${b}
+The plugin has been registered with BRAT. You may still need to enable it the Community Plugin List.`;this.plugin.log(y,!0),m(this.plugin,y,10)}else{let d=this.plugin.app.vault.configDir+"/plugins/"+l.id+"/",b=null;try{b=yield this.plugin.app.vault.adapter.read(d+"manifest.json")}catch(T){if(T.errno===-4058)return yield this.addPlugin(t,!1,c,!1,o),!0;console.log("BRAT - Local Manifest Load",l.id,JSON.stringify(T,null,2))}if(o!==""||this.plugin.settings.pluginSubListFrozenVersion.map(T=>T.repo).includes(t))return m(this.plugin,`The version of ${t} is frozen, not updating.`,3),!1;let y=yield JSON.parse(b);if(y.version!==l.version){let T=yield g();if(T===null)return;if(n){let f=`There is an update available for ${l.id} from version ${y.version} to ${l.version}. `;this.plugin.log(f+`[Release Info](https://github.com/${t}/releases/tag/${l.version})`,!1),m(this.plugin,f,30,()=>a(this,null,function*(){window.open(`https://github.com/${t}/releases/tag/${l.version}`)}))}else{yield this.writeReleaseFilesToPluginFolder(l.id,T),yield this.plugin.app.plugins.loadManifests(),(h=this.plugin.app.plugins.plugins[l.id])!=null&&h.manifest&&(yield this.reloadPlugin(l.id));let f=`${l.id}
+Plugin has been updated from version ${y.version} to ${l.version}. `;this.plugin.log(f+`[Release Info](https://github.com/${t}/releases/tag/${l.version})`,!1),m(this.plugin,f,30,()=>a(this,null,function*(){window.open(`https://github.com/${t}/releases/tag/${l.version}`)}))}}else i&&m(this.plugin,`No update available for ${t}`,3)}return!0})}reloadPlugin(t){return a(this,null,function*(){let e=this.plugin.app.plugins;try{yield e.disablePlugin(t),yield e.enablePlugin(t)}catch(n){console.log("reload plugin",n)}})}updatePlugin(t,e=!1,n=!1){return a(this,null,function*(){let i=yield this.addPlugin(t,!0,e,n);return i===!1&&e===!1&&m(this.plugin,`${t}
+Update of plugin failed.`),i})}checkForUpdatesAndInstallUpdates(t=!1,e=!1){return a(this,null,function*(){if((yield j())===!1){console.log("BRAT: No internet detected.");return}let n,i="Checking for plugin updates STARTED";this.plugin.log(i,!0),t&&this.plugin.settings.notificationsEnabled&&(n=new K.Notice(`BRAT
+${i}`,3e4));let o=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(l=>l.repo));for(let l of this.plugin.settings.pluginList)o.has(l)||(yield this.updatePlugin(l,e));let r="Checking for plugin updates COMPLETED";this.plugin.log(r,!0),t&&(n.hide(),m(this.plugin,r,10))})}deletePlugin(t){return a(this,null,function*(){let e=`Removed ${t} from BRAT plugin list`;this.plugin.log(e,!0),this.plugin.settings.pluginList=this.plugin.settings.pluginList.filter(n=>n!=t),this.plugin.settings.pluginSubListFrozenVersion=this.plugin.settings.pluginSubListFrozenVersion.filter(n=>n.repo!=t),this.plugin.saveSettings()})}getEnabledDisabledPlugins(t){let e=this.plugin.app.plugins,n=Object.values(e.manifests),i=Object.values(e.plugins).map(o=>o.manifest);return t?n.filter(o=>i.find(r=>o.id===r.id)):n.filter(o=>!i.find(r=>o.id===r.id))}};var Fe=require("obsidian");function Ce(){(0,Fe.addIcon)("BratIcon",'')}var U=require("obsidian"),_e=Ke(ze());function He(s,t,e=!1){if(s.settings.debuggingMode&&console.log("BRAT: "+t),s.settings.loggingEnabled){if(s.settings.loggingVerboseEnabled===!1&&e===!0)return;{let n=s.settings.loggingPath+".md",i="[["+(0,U.moment)().format((0,_e.getDailyNoteSettings)().format).toString()+"]] "+(0,U.moment)().format("HH:mm"),o=U.Platform.isDesktop?window.require("os").hostname():"MOBILE",r=i+" "+o+" "+t.replace(`
`," ")+`
-`;setTimeout(()=>a(this,null,function*(){if((yield i.app.vault.adapter.exists(t))===!0){let u=yield i.app.vault.adapter.read(t);r=r+u;let c=i.app.vault.getAbstractFileByPath(t);yield i.app.vault.modify(c,r)}else yield i.app.vault.create(t,r)}),10)}}}var U=class{constructor(n){this.bratCommands=[{id:"BRAT-AddBetaPlugin",icon:"BratIcon",name:"Plugins: Add a beta plugin for testing",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.displayAddNewPluginModal()})},{id:"BRAT-checkForUpdatesAndUpdate",icon:"BratIcon",name:"Plugins: Check for updates to all beta plugins and UPDATE",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(!0,!1)})},{id:"BRAT-checkForUpdatesAndDontUpdate",icon:"BratIcon",name:"Plugins: Only check for updates to beta plugins, but don't Update",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(!0,!0)})},{id:"BRAT-updateOnePlugin",icon:"BratIcon",name:"Plugins: Choose a single plugin to update",showInRibbon:!0,callback:()=>a(this,null,function*(){let n=Object.values(this.plugin.settings.pluginList).map(t=>({display:t,info:t})),e=new v(this.plugin);e.setSuggesterData(n),yield e.display(t=>a(this,null,function*(){let s=`Checking for updates for ${t.info}`;this.plugin.log(s,!0),m(this.plugin,`
-${s}`,3),yield this.plugin.betaPlugins.updatePlugin(t.info,!1,!0)}))})},{id:"BRAT-restartPlugin",icon:"BratIcon",name:"Plugins: Restart a plugin that is already installed",showInRibbon:!0,callback:()=>a(this,null,function*(){let n=Object.values(this.plugin.app.plugins.manifests).map(t=>({display:t.id,info:t.id})),e=new v(this.plugin);e.setSuggesterData(n),yield e.display(t=>a(this,null,function*(){m(this.plugin,`${t.info}
-Plugin reloading .....`,5),yield this.plugin.betaPlugins.reloadPlugin(t.info)}))})},{id:"BRAT-disablePlugin",icon:"BratIcon",name:"Plugins: Disable a plugin - toggle it off",showInRibbon:!0,callback:()=>a(this,null,function*(){let n=this.plugin.betaPlugins.getEnabledDisabledPlugins(!0).map(t=>({display:`${t.name} (${t.id})`,info:t.id})),e=new v(this.plugin);e.setSuggesterData(n),yield e.display(t=>a(this,null,function*(){this.plugin.log(`${t.display} plugin disabled`,!1),yield this.plugin.app.plugins.disablePlugin(t.info)}))})},{id:"BRAT-enablePlugin",icon:"BratIcon",name:"Plugins: Enable a plugin - toggle it on",showInRibbon:!0,callback:()=>a(this,null,function*(){let n=this.plugin.betaPlugins.getEnabledDisabledPlugins(!1).map(t=>({display:`${t.name} (${t.id})`,info:t.id})),e=new v(this.plugin);e.setSuggesterData(n),yield e.display(t=>a(this,null,function*(){this.plugin.log(`${t.display} plugin enabled`,!1),yield this.plugin.app.plugins.enablePlugin(t.info)}))})},{id:"BRAT-openGitHubZRepository",icon:"BratIcon",name:"Plugins: Open the GitHub repository for a plugin",showInRibbon:!0,callback:()=>a(this,null,function*(){let n=yield mt(),e=Object.values(n).map(o=>({display:`Plugin: ${o.name} (${o.repo})`,info:o.repo})),t=Object.values(this.plugin.settings.pluginList).map(o=>({display:"BRAT: "+o,info:o}));e.forEach(o=>t.push(o));let s=new v(this.plugin);s.setSuggesterData(t),yield s.display(o=>a(this,null,function*(){o.info&&window.open(`https://github.com/${o.info}`)}))})},{id:"BRAT-openGitHubRepoTheme",icon:"BratIcon",name:"Themes: Open the GitHub repository for a theme (appearance)",showInRibbon:!0,callback:()=>a(this,null,function*(){let n=yield Y(),e=Object.values(n).map(s=>({display:`Theme: ${s.name} (${s.repo})`,info:s.repo})),t=new v(this.plugin);t.setSuggesterData(e),yield t.display(s=>a(this,null,function*(){s.info&&window.open(`https://github.com/${s.info}`)}))})},{id:"BRAT-opentPluginSettings",icon:"BratIcon",name:"Plugins: Open Plugin Settings Tab",showInRibbon:!0,callback:()=>a(this,null,function*(){let n=this.plugin.app.setting,e=Object.values(n.pluginTabs).map(o=>({display:"Plugin: "+o.name,info:o.id})),t=new v(this.plugin),s=Object.values(n.settingTabs).map(o=>({display:"Core: "+o.name,info:o.id}));e.forEach(o=>s.push(o)),t.setSuggesterData(s),yield t.display(o=>a(this,null,function*(){n.open(),n.openTabById(o.info)}))})},{id:"BRAT-GrabCommunityTheme",icon:"BratIcon",name:"Themes: Grab a community theme",showInRibbon:!0,callback:()=>a(this,null,function*(){return yield Nt(this.plugin)})},{id:"BRAT-GrabBetaTheme",icon:"BratIcon",name:"Themes: Grab a beta theme for testing from a Github repository",showInRibbon:!0,callback:()=>a(this,null,function*(){new S(this.plugin).open()})},{id:"BRAT-updateBetaThemes",icon:"BratIcon",name:"Themes: Update beta themes",showInRibbon:!0,callback:()=>a(this,null,function*(){return yield J(this.plugin,!0)})},{id:"BRAT-switchTheme",icon:"BratIcon",name:"Themes: Switch Active Theme ",showInRibbon:!0,callback:()=>a(this,null,function*(){let n=Object.values(this.plugin.app.customCss.themes).map(t=>({display:t,info:t}));n.unshift({display:"Obsidian Default Theme",info:""});let e=new v(this.plugin);e.setSuggesterData(n),yield e.display(t=>a(this,null,function*(){this.plugin.log(`Switched to theme ${t.display}`,!1),this.plugin.app.customCss.setTheme(t.info)}))})},{id:"BRAT-allCommands",icon:"BratIcon",name:"All Commands list",showInRibbon:!1,callback:()=>a(this,null,function*(){return this.ribbonDisplayCommands()})}];this.plugin=n,this.bratCommands.forEach(e=>a(this,null,function*(){this.plugin.addCommand({id:e.id,name:e.name,icon:e.icon,callback:()=>a(this,null,function*(){yield e.callback()})})}))}ribbonDisplayCommands(){return a(this,null,function*(){let n=[];this.bratCommands.forEach(r=>{r.showInRibbon&&n.push({display:r.name,info:r.callback})});let e=new v(this.plugin),t=this.plugin.app.setting,s=Object.values(t.settingTabs).map(r=>({display:"Core: "+r.name,info:()=>a(this,null,function*(){t.open(),t.openTabById(r.id)})})),o=Object.values(t.pluginTabs).map(r=>({display:"Plugin: "+r.name,info:()=>a(this,null,function*(){t.open(),t.openTabById(r.id)})}));n.push({display:"---- Core Plugin Settings ----",info:()=>a(this,null,function*(){yield this.ribbonDisplayCommands()})}),s.forEach(r=>n.push(r)),n.push({display:"---- Plugin Settings ----",info:()=>a(this,null,function*(){yield this.ribbonDisplayCommands()})}),o.forEach(r=>n.push(r)),e.setSuggesterData(n),yield e.display(r=>a(this,null,function*(){return yield r.info()}))})}};var Z=class extends jt.Plugin{constructor(){super(...arguments);this.appName="Obsidian42 - Beta Reviewer's Auto-update Tool (BRAT)";this.appID="obsidian42-brat"}onload(){return a(this,null,function*(){console.log("loading Obsidian42 - BRAT"),yield this.loadSettings(),this.addSettingTab(new Q(this.app,this)),this.betaPlugins=new D(this),this.commands=new U(this),St(),this.settings.ribbonIconEnabled&&this.showRibbonButton(),this.app.workspace.onLayoutReady(()=>{this.settings.updateAtStartup&&setTimeout(()=>a(this,null,function*(){yield this.betaPlugins.checkForUpdatesAndInstallUpdates(!1)}),6e4),this.settings.updateThemesAtStartup&&setTimeout(()=>a(this,null,function*(){yield J(this,!1)}),12e4)})})}showRibbonButton(){this.ribbonIcon=this.addRibbonIcon("BratIcon","BRAT",()=>a(this,null,function*(){return this.commands.ribbonDisplayCommands()}))}log(e,t=!1){Yt(this,e,t)}onunload(){console.log("unloading "+this.appName)}loadSettings(){return a(this,null,function*(){this.settings=Object.assign({},pt,yield this.loadData())})}saveSettings(){return a(this,null,function*(){yield this.saveData(this.settings)})}};
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZS9kaXN0L21haW4uanMiLCAiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL3VpL1NldHRpbmdzVGFiLnRzIiwgIi4uL3NyYy9mZWF0dXJlcy90aGVtZXMudHMiLCAiLi4vc3JjL3VpL0dlbmVyaWNGdXp6eVN1Z2dlc3Rlci50cyIsICIuLi9zcmMvZmVhdHVyZXMvZ2l0aHViVXRpbHMudHMiLCAiLi4vc3JjL3VpL3NldHRpbmdzLnRzIiwgIi4uL3NyYy91dGlscy9ub3RpZmljYXRpb25zLnRzIiwgIi4uL3NyYy91dGlscy9pbnRlcm5ldGNvbm5lY3Rpb24udHMiLCAiLi4vc3JjL3VpL0FkZE5ld1RoZW1lLnRzIiwgIi4uL3NyYy91aS9BZGROZXdQbHVnaW5Nb2RhbC50cyIsICIuLi9zcmMvZmVhdHVyZXMvQmV0YVBsdWdpbnMudHMiLCAiLi4vc3JjL3VpL2ljb25zLnRzIiwgIi4uL3NyYy91dGlscy9sb2dnaW5nLnRzIiwgIi4uL3NyYy91aS9QbHVnaW5Db21tYW5kcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgb2JzaWRpYW4gPSByZXF1aXJlKCdvYnNpZGlhbicpO1xuXG5jb25zdCBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NLUREXCI7XG5jb25zdCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCA9IFwiZ2dnZy1bV113d1wiO1xuY29uc3QgREVGQVVMVF9NT05USExZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NXCI7XG5jb25zdCBERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWS1bUV1RXCI7XG5jb25zdCBERUZBVUxUX1lFQVJMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWVwiO1xuXG5mdW5jdGlvbiBzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MocGVyaW9kaWNpdHkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSB3aW5kb3cuYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8uW3BlcmlvZGljaXR5XT8uZW5hYmxlZDtcbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBkYWlseS1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgeyBpbnRlcm5hbFBsdWdpbnMsIHBsdWdpbnMgfSA9IHdpbmRvdy5hcHA7XG4gICAgICAgIGlmIChzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MoXCJkYWlseVwiKSkge1xuICAgICAgICAgICAgY29uc3QgeyBmb3JtYXQsIGZvbGRlciwgdGVtcGxhdGUgfSA9IHBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy5kYWlseSB8fCB7fTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgfHwgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IGZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBmb2xkZXIsIGZvcm1hdCwgdGVtcGxhdGUgfSA9IGludGVybmFsUGx1Z2lucy5nZXRQbHVnaW5CeUlkKFwiZGFpbHktbm90ZXNcIik/Lmluc3RhbmNlPy5vcHRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgfHwgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIGRhaWx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuLyoqXG4gKiBSZWFkIHRoZSB1c2VyIHNldHRpbmdzIGZvciB0aGUgYHdlZWtseS1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0V2Vla2x5Tm90ZVNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyU2V0dGluZ3MgPSBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcImNhbGVuZGFyXCIpPy5vcHRpb25zO1xuICAgICAgICBjb25zdCBwZXJpb2RpY05vdGVzU2V0dGluZ3MgPSBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ud2Vla2x5O1xuICAgICAgICBpZiAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwid2Vla2x5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogcGVyaW9kaWNOb3Rlc1NldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IHBlcmlvZGljTm90ZXNTZXR0aW5ncy5mb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBwZXJpb2RpY05vdGVzU2V0dGluZ3MudGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGNhbGVuZGFyU2V0dGluZ3MgfHwge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLndlZWtseU5vdGVGb3JtYXQgfHwgREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IHNldHRpbmdzLndlZWtseU5vdGVGb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHNldHRpbmdzLndlZWtseU5vdGVUZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHdlZWtseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBwZXJpb2RpYy1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0TW9udGhseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwibW9udGhseVwiKSAmJlxuICAgICAgICAgICAgcGx1Z2luTWFuYWdlci5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKT8uc2V0dGluZ3M/Lm1vbnRobHkpIHx8XG4gICAgICAgICAgICB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogc2V0dGluZ3MuZm9ybWF0IHx8IERFRkFVTFRfTU9OVEhMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogc2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy50ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIG1vbnRobHkgbm90ZSBzZXR0aW5ncyBmb3VuZCFcIiwgZXJyKTtcbiAgICB9XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgcGVyaW9kaWMtbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldFF1YXJ0ZXJseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwicXVhcnRlcmx5XCIpICYmXG4gICAgICAgICAgICBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ucXVhcnRlcmx5KSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogc2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy50ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHF1YXJ0ZXJseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBwZXJpb2RpYy1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0WWVhcmx5Tm90ZVNldHRpbmdzKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGx1Z2luTWFuYWdlciA9IHdpbmRvdy5hcHAucGx1Z2lucztcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IChzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MoXCJ5ZWFybHlcIikgJiZcbiAgICAgICAgICAgIHBsdWdpbk1hbmFnZXIuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy55ZWFybHkpIHx8XG4gICAgICAgICAgICB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogc2V0dGluZ3MuZm9ybWF0IHx8IERFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFULFxuICAgICAgICAgICAgZm9sZGVyOiBzZXR0aW5ncy5mb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHNldHRpbmdzLnRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmluZm8oXCJObyBjdXN0b20geWVhcmx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuXG4vLyBDcmVkaXQ6IEBjcmVhdGlvbml4L3BhdGguanNcbmZ1bmN0aW9uIGpvaW4oLi4ucGFydFNlZ21lbnRzKSB7XG4gICAgLy8gU3BsaXQgdGhlIGlucHV0cyBpbnRvIGEgbGlzdCBvZiBwYXRoIGNvbW1hbmRzLlxuICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcGFydFNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChwYXJ0U2VnbWVudHNbaV0uc3BsaXQoXCIvXCIpKTtcbiAgICB9XG4gICAgLy8gSW50ZXJwcmV0IHRoZSBwYXRoIGNvbW1hbmRzIHRvIGdldCB0aGUgbmV3IHJlc29sdmVkIHBhdGguXG4gICAgY29uc3QgbmV3UGFydHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgIC8vIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzXG4gICAgICAgIC8vIEFsc28gcmVtb3ZlIFwiLlwiIHNlZ21lbnRzXG4gICAgICAgIGlmICghcGFydCB8fCBwYXJ0ID09PSBcIi5cIilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAvLyBQdXNoIG5ldyBwYXRoIHNlZ21lbnRzLlxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdQYXJ0cy5wdXNoKHBhcnQpO1xuICAgIH1cbiAgICAvLyBQcmVzZXJ2ZSB0aGUgaW5pdGlhbCBzbGFzaCBpZiB0aGVyZSB3YXMgb25lLlxuICAgIGlmIChwYXJ0c1swXSA9PT0gXCJcIilcbiAgICAgICAgbmV3UGFydHMudW5zaGlmdChcIlwiKTtcbiAgICAvLyBUdXJuIGJhY2sgaW50byBhIHNpbmdsZSBzdHJpbmcgcGF0aC5cbiAgICByZXR1cm4gbmV3UGFydHMuam9pbihcIi9cIik7XG59XG5mdW5jdGlvbiBiYXNlbmFtZShmdWxsUGF0aCkge1xuICAgIGxldCBiYXNlID0gZnVsbFBhdGguc3Vic3RyaW5nKGZ1bGxQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuICAgIGlmIChiYXNlLmxhc3RJbmRleE9mKFwiLlwiKSAhPSAtMSlcbiAgICAgICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKDAsIGJhc2UubGFzdEluZGV4T2YoXCIuXCIpKTtcbiAgICByZXR1cm4gYmFzZTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZUZvbGRlckV4aXN0cyhwYXRoKSB7XG4gICAgY29uc3QgZGlycyA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikuc3BsaXQoXCIvXCIpO1xuICAgIGRpcnMucG9wKCk7IC8vIHJlbW92ZSBiYXNlbmFtZVxuICAgIGlmIChkaXJzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkaXIgPSBqb2luKC4uLmRpcnMpO1xuICAgICAgICBpZiAoIXdpbmRvdy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGRpcikpIHtcbiAgICAgICAgICAgIGF3YWl0IHdpbmRvdy5hcHAudmF1bHQuY3JlYXRlRm9sZGVyKGRpcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiBnZXROb3RlUGF0aChkaXJlY3RvcnksIGZpbGVuYW1lKSB7XG4gICAgaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChcIi5tZFwiKSkge1xuICAgICAgICBmaWxlbmFtZSArPSBcIi5tZFwiO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gb2JzaWRpYW4ubm9ybWFsaXplUGF0aChqb2luKGRpcmVjdG9yeSwgZmlsZW5hbWUpKTtcbiAgICBhd2FpdCBlbnN1cmVGb2xkZXJFeGlzdHMocGF0aCk7XG4gICAgcmV0dXJuIHBhdGg7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpIHtcbiAgICBjb25zdCB7IG1ldGFkYXRhQ2FjaGUsIHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgodGVtcGxhdGUpO1xuICAgIGlmICh0ZW1wbGF0ZVBhdGggPT09IFwiL1wiKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW1wiXCIsIG51bGxdKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCh0ZW1wbGF0ZVBhdGgsIFwiXCIpO1xuICAgICAgICBjb25zdCBjb250ZW50cyA9IGF3YWl0IHZhdWx0LmNhY2hlZFJlYWQodGVtcGxhdGVGaWxlKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgSUZvbGRJbmZvID0gd2luZG93LmFwcC5mb2xkTWFuYWdlci5sb2FkKHRlbXBsYXRlRmlsZSk7XG4gICAgICAgIHJldHVybiBbY29udGVudHMsIElGb2xkSW5mb107XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHJlYWQgdGhlIGRhaWx5IG5vdGUgdGVtcGxhdGUgJyR7dGVtcGxhdGVQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiRmFpbGVkIHRvIHJlYWQgdGhlIGRhaWx5IG5vdGUgdGVtcGxhdGVcIik7XG4gICAgICAgIHJldHVybiBbXCJcIiwgbnVsbF07XG4gICAgfVxufVxuXG4vKipcbiAqIGRhdGVVSUQgaXMgYSB3YXkgb2Ygd2Vla2x5IGlkZW50aWZ5aW5nIGRhaWx5L3dlZWtseS9tb250aGx5IG5vdGVzLlxuICogVGhleSBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgZ3JhbnVsYXJpdHkgdG8gYXZvaWQgYW1iaWd1aXR5LlxuICovXG5mdW5jdGlvbiBnZXREYXRlVUlEKGRhdGUsIGdyYW51bGFyaXR5ID0gXCJkYXlcIikge1xuICAgIGNvbnN0IHRzID0gZGF0ZS5jbG9uZSgpLnN0YXJ0T2YoZ3JhbnVsYXJpdHkpLmZvcm1hdCgpO1xuICAgIHJldHVybiBgJHtncmFudWxhcml0eX0tJHt0c31gO1xufVxuZnVuY3Rpb24gcmVtb3ZlRXNjYXBlZENoYXJhY3RlcnMoZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC9cXFtbXlxcXV0qXFxdL2csIFwiXCIpOyAvLyByZW1vdmUgZXZlcnl0aGluZyB3aXRoaW4gYnJhY2tldHNcbn1cbi8qKlxuICogWFhYOiBXaGVuIHBhcnNpbmcgZGF0ZXMgdGhhdCBjb250YWluIGJvdGggd2VlayBudW1iZXJzIGFuZCBtb250aHMsXG4gKiBNb21lbnQgY2hvc2VzIHRvIGlnbm9yZSB0aGUgd2VlayBudW1iZXJzLiBGb3IgdGhlIHdlZWsgZGF0ZVVJRCwgd2VcbiAqIHdhbnQgdGhlIG9wcG9zaXRlIGJlaGF2aW9yLiBTdHJpcCB0aGUgTU1NIGZyb20gdGhlIGZvcm1hdCB0byBwYXRjaC5cbiAqL1xuZnVuY3Rpb24gaXNGb3JtYXRBbWJpZ3VvdXMoZm9ybWF0LCBncmFudWxhcml0eSkge1xuICAgIGlmIChncmFudWxhcml0eSA9PT0gXCJ3ZWVrXCIpIHtcbiAgICAgICAgY29uc3QgY2xlYW5Gb3JtYXQgPSByZW1vdmVFc2NhcGVkQ2hhcmFjdGVycyhmb3JtYXQpO1xuICAgICAgICByZXR1cm4gKC93ezEsMn0vaS50ZXN0KGNsZWFuRm9ybWF0KSAmJlxuICAgICAgICAgICAgKC9NezEsNH0vLnRlc3QoY2xlYW5Gb3JtYXQpIHx8IC9EezEsNH0vLnRlc3QoY2xlYW5Gb3JtYXQpKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldERhdGVGcm9tRmlsZShmaWxlLCBncmFudWxhcml0eSkge1xuICAgIHJldHVybiBnZXREYXRlRnJvbUZpbGVuYW1lKGZpbGUuYmFzZW5hbWUsIGdyYW51bGFyaXR5KTtcbn1cbmZ1bmN0aW9uIGdldERhdGVGcm9tUGF0aChwYXRoLCBncmFudWxhcml0eSkge1xuICAgIHJldHVybiBnZXREYXRlRnJvbUZpbGVuYW1lKGJhc2VuYW1lKHBhdGgpLCBncmFudWxhcml0eSk7XG59XG5mdW5jdGlvbiBnZXREYXRlRnJvbUZpbGVuYW1lKGZpbGVuYW1lLCBncmFudWxhcml0eSkge1xuICAgIGNvbnN0IGdldFNldHRpbmdzID0ge1xuICAgICAgICBkYXk6IGdldERhaWx5Tm90ZVNldHRpbmdzLFxuICAgICAgICB3ZWVrOiBnZXRXZWVrbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIG1vbnRoOiBnZXRNb250aGx5Tm90ZVNldHRpbmdzLFxuICAgICAgICBxdWFydGVyOiBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHllYXI6IGdldFllYXJseU5vdGVTZXR0aW5ncyxcbiAgICB9O1xuICAgIGNvbnN0IGZvcm1hdCA9IGdldFNldHRpbmdzW2dyYW51bGFyaXR5XSgpLmZvcm1hdC5zcGxpdChcIi9cIikucG9wKCk7XG4gICAgY29uc3Qgbm90ZURhdGUgPSB3aW5kb3cubW9tZW50KGZpbGVuYW1lLCBmb3JtYXQsIHRydWUpO1xuICAgIGlmICghbm90ZURhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoaXNGb3JtYXRBbWJpZ3VvdXMoZm9ybWF0LCBncmFudWxhcml0eSkpIHtcbiAgICAgICAgaWYgKGdyYW51bGFyaXR5ID09PSBcIndlZWtcIikge1xuICAgICAgICAgICAgY29uc3QgY2xlYW5Gb3JtYXQgPSByZW1vdmVFc2NhcGVkQ2hhcmFjdGVycyhmb3JtYXQpO1xuICAgICAgICAgICAgaWYgKC93ezEsMn0vaS50ZXN0KGNsZWFuRm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubW9tZW50KGZpbGVuYW1lLCBcbiAgICAgICAgICAgICAgICAvLyBJZiBmb3JtYXQgY29udGFpbnMgd2VlaywgcmVtb3ZlIGRheSAmIG1vbnRoIGZvcm1hdHRpbmdcbiAgICAgICAgICAgICAgICBmb3JtYXQucmVwbGFjZSgvTXsxLDR9L2csIFwiXCIpLnJlcGxhY2UoL0R7MSw0fS9nLCBcIlwiKSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3RlRGF0ZTtcbn1cblxuY2xhc3MgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSBkYWlseS1ub3RlcyBwbHVnaW5cbiAqIHNvIGl0IHdpbGwgcmVwbGFjZSB7e2RhdGV9fSwge3t0aXRsZX19LCBhbmQge3t0aW1lfX0gd2l0aCB0aGVcbiAqIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gKlxuICogTm90ZTogaXQgaGFzIGFuIGFkZGVkIGJvbnVzIHRoYXQgaXQncyBub3QgJ3RvZGF5JyBzcGVjaWZpYy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGFpbHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCBhcHAgPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IGFwcDtcbiAgICBjb25zdCBtb21lbnQgPSB3aW5kb3cubW9tZW50O1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXREYWlseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKmRhdGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIG1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBtb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnllc3RlcmRheVxccyp9fS9naSwgZGF0ZS5jbG9uZSgpLnN1YnRyYWN0KDEsIFwiZGF5XCIpLmZvcm1hdChmb3JtYXQpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRvbW9ycm93XFxzKn19L2dpLCBkYXRlLmNsb25lKCkuYWRkKDEsIFwiZFwiKS5mb3JtYXQoZm9ybWF0KSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBhcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXREYWlseU5vdGUoZGF0ZSwgZGFpbHlOb3Rlcykge1xuICAgIHJldHVybiBkYWlseU5vdGVzW2dldERhdGVVSUQoZGF0ZSwgXCJkYXlcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxEYWlseU5vdGVzKCkge1xuICAgIC8qKlxuICAgICAqIEZpbmQgYWxsIGRhaWx5IG5vdGVzIGluIHRoZSBkYWlseSBub3RlIGZvbGRlclxuICAgICAqL1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldERhaWx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgZGFpbHlOb3Rlc0ZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICghZGFpbHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIGRhaWx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgY29uc3QgZGFpbHlOb3RlcyA9IHt9O1xuICAgIG9ic2lkaWFuLlZhdWx0LnJlY3Vyc2VDaGlsZHJlbihkYWlseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwiZGF5XCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICBkYWlseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYWlseU5vdGVzO1xufVxuXG5jbGFzcyBXZWVrbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbmZ1bmN0aW9uIGdldERheXNPZldlZWsoKSB7XG4gICAgY29uc3QgeyBtb21lbnQgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGxldCB3ZWVrU3RhcnQgPSBtb21lbnQubG9jYWxlRGF0YSgpLl93ZWVrLmRvdztcbiAgICBjb25zdCBkYXlzT2ZXZWVrID0gW1xuICAgICAgICBcInN1bmRheVwiLFxuICAgICAgICBcIm1vbmRheVwiLFxuICAgICAgICBcInR1ZXNkYXlcIixcbiAgICAgICAgXCJ3ZWRuZXNkYXlcIixcbiAgICAgICAgXCJ0aHVyc2RheVwiLFxuICAgICAgICBcImZyaWRheVwiLFxuICAgICAgICBcInNhdHVyZGF5XCIsXG4gICAgXTtcbiAgICB3aGlsZSAod2Vla1N0YXJ0KSB7XG4gICAgICAgIGRheXNPZldlZWsucHVzaChkYXlzT2ZXZWVrLnNoaWZ0KCkpO1xuICAgICAgICB3ZWVrU3RhcnQtLTtcbiAgICB9XG4gICAgcmV0dXJuIGRheXNPZldlZWs7XG59XG5mdW5jdGlvbiBnZXREYXlPZldlZWtOdW1lcmljYWxWYWx1ZShkYXlPZldlZWtOYW1lKSB7XG4gICAgcmV0dXJuIGdldERheXNPZldlZWsoKS5pbmRleE9mKGRheU9mV2Vla05hbWUudG9Mb3dlckNhc2UoKSk7XG59XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVXZWVrbHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRXZWVrbHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgd2luZG93Lm1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSlcXHMqOiguKj8pfX0vZ2ksIChfLCBkYXlPZldlZWssIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF5ID0gZ2V0RGF5T2ZXZWVrTnVtZXJpY2FsVmFsdWUoZGF5T2ZXZWVrKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRlLndlZWtkYXkoZGF5KS5mb3JtYXQobW9tZW50Rm9ybWF0LnRyaW0oKSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93LmFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFdlZWtseU5vdGUoZGF0ZSwgd2Vla2x5Tm90ZXMpIHtcbiAgICByZXR1cm4gd2Vla2x5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcIndlZWtcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxXZWVrbHlOb3RlcygpIHtcbiAgICBjb25zdCB3ZWVrbHlOb3RlcyA9IHt9O1xuICAgIGlmICghYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4gd2Vla2x5Tm90ZXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldFdlZWtseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IHdlZWtseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCF3ZWVrbHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgV2Vla2x5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCB3ZWVrbHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4od2Vla2x5Tm90ZXNGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJ3ZWVrXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcIndlZWtcIik7XG4gICAgICAgICAgICAgICAgd2Vla2x5Tm90ZXNbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdlZWtseU5vdGVzO1xufVxuXG5jbGFzcyBNb250aGx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGFpbHktbm90ZXMgcGx1Z2luXG4gKiBzbyBpdCB3aWxsIHJlcGxhY2Uge3tkYXRlfX0sIHt7dGl0bGV9fSwgYW5kIHt7dGltZX19IHdpdGggdGhlXG4gKiBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICpcbiAqIE5vdGU6IGl0IGhhcyBhbiBhZGRlZCBib251cyB0aGF0IGl0J3Mgbm90ICd0b2RheScgc3BlY2lmaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vbnRobHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRNb250aGx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgW3RlbXBsYXRlQ29udGVudHMsIElGb2xkSW5mb10gPSBhd2FpdCBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IGF3YWl0IGdldE5vdGVQYXRoKGZvbGRlciwgZmlsZW5hbWUpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlKG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZUNvbnRlbnRzXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqKGRhdGV8dGltZSlcXHMqKChbKy1dXFxkKykoW3lxbXdkaHNdKSk/XFxzKig6Lis/KT99fS9naSwgKF8sIF90aW1lT3JEYXRlLCBjYWxjLCB0aW1lRGVsdGEsIHVuaXQsIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gd2luZG93Lm1vbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBkYXRlLmNsb25lKCkuc2V0KHtcbiAgICAgICAgICAgICAgICBob3VyOiBub3cuZ2V0KFwiaG91clwiKSxcbiAgICAgICAgICAgICAgICBtaW51dGU6IG5vdy5nZXQoXCJtaW51dGVcIiksXG4gICAgICAgICAgICAgICAgc2Vjb25kOiBub3cuZ2V0KFwic2Vjb25kXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY2FsYykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlLmFkZChwYXJzZUludCh0aW1lRGVsdGEsIDEwKSwgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9tZW50Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChtb21lbnRGb3JtYXQuc3Vic3RyaW5nKDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqZGF0ZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgd2luZG93Lm1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB3aW5kb3cuYXBwLmZvbGRNYW5hZ2VyLnNhdmUoY3JlYXRlZEZpbGUsIElGb2xkSW5mbyk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke25vcm1hbGl6ZWRQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0TW9udGhseU5vdGUoZGF0ZSwgbW9udGhseU5vdGVzKSB7XG4gICAgcmV0dXJuIG1vbnRobHlOb3Rlc1tnZXREYXRlVUlEKGRhdGUsIFwibW9udGhcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxNb250aGx5Tm90ZXMoKSB7XG4gICAgY29uc3QgbW9udGhseU5vdGVzID0ge307XG4gICAgaWYgKCFhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4gbW9udGhseU5vdGVzO1xuICAgIH1cbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgZm9sZGVyIH0gPSBnZXRNb250aGx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgbW9udGhseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCFtb250aGx5Tm90ZXNGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1vbnRobHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIG1vbnRobHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4obW9udGhseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwibW9udGhcIik7XG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBnZXREYXRlVUlEKGRhdGUsIFwibW9udGhcIik7XG4gICAgICAgICAgICAgICAgbW9udGhseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtb250aGx5Tm90ZXM7XG59XG5cbmNsYXNzIFF1YXJ0ZXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRhaWx5LW5vdGVzIHBsdWdpblxuICogc28gaXQgd2lsbCByZXBsYWNlIHt7ZGF0ZX19LCB7e3RpdGxlfX0sIGFuZCB7e3RpbWV9fSB3aXRoIHRoZVxuICogZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqXG4gKiBOb3RlOiBpdCBoYXMgYW4gYWRkZWQgYm9udXMgdGhhdCBpdCdzIG5vdCAndG9kYXknIHNwZWNpZmljLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVRdWFydGVybHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccypkYXRlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aW1lXFxzKn19L2dpLCB3aW5kb3cubW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIikpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGl0bGVcXHMqfX0vZ2ksIGZpbGVuYW1lKSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHdpbmRvdy5hcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRRdWFydGVybHlOb3RlKGRhdGUsIHF1YXJ0ZXJseSkge1xuICAgIHJldHVybiBxdWFydGVybHlbZ2V0RGF0ZVVJRChkYXRlLCBcInF1YXJ0ZXJcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxRdWFydGVybHlOb3RlcygpIHtcbiAgICBjb25zdCBxdWFydGVybHkgPSB7fTtcbiAgICBpZiAoIWFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHF1YXJ0ZXJseTtcbiAgICB9XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IGZvbGRlciB9ID0gZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgcXVhcnRlcmx5Rm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCFxdWFydGVybHlGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFF1YXJ0ZXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKFwiRmFpbGVkIHRvIGZpbmQgcXVhcnRlcmx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgb2JzaWRpYW4uVmF1bHQucmVjdXJzZUNoaWxkcmVuKHF1YXJ0ZXJseUZvbGRlciwgKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKG5vdGUgaW5zdGFuY2VvZiBvYnNpZGlhbi5URmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IGdldERhdGVGcm9tRmlsZShub3RlLCBcInF1YXJ0ZXJcIik7XG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBnZXREYXRlVUlEKGRhdGUsIFwicXVhcnRlclwiKTtcbiAgICAgICAgICAgICAgICBxdWFydGVybHlbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHF1YXJ0ZXJseTtcbn1cblxuY2xhc3MgWWVhcmx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGFpbHktbm90ZXMgcGx1Z2luXG4gKiBzbyBpdCB3aWxsIHJlcGxhY2Uge3tkYXRlfX0sIHt7dGl0bGV9fSwgYW5kIHt7dGltZX19IHdpdGggdGhlXG4gKiBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICpcbiAqIE5vdGU6IGl0IGhhcyBhbiBhZGRlZCBib251cyB0aGF0IGl0J3Mgbm90ICd0b2RheScgc3BlY2lmaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVllYXJseU5vdGUoZGF0ZSkge1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyB0ZW1wbGF0ZSwgZm9ybWF0LCBmb2xkZXIgfSA9IGdldFllYXJseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihkYXRlfHRpbWUpXFxzKigoWystXVxcZCspKFt5cW13ZGhzXSkpP1xccyooOi4rPyk/fX0vZ2ksIChfLCBfdGltZU9yRGF0ZSwgY2FsYywgdGltZURlbHRhLCB1bml0LCBtb21lbnRGb3JtYXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHdpbmRvdy5tb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKmRhdGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoXCJISDptbVwiKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93LmFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFllYXJseU5vdGUoZGF0ZSwgeWVhcmx5Tm90ZXMpIHtcbiAgICByZXR1cm4geWVhcmx5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcInllYXJcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxZZWFybHlOb3RlcygpIHtcbiAgICBjb25zdCB5ZWFybHlOb3RlcyA9IHt9O1xuICAgIGlmICghYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4geWVhcmx5Tm90ZXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldFllYXJseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IHllYXJseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCF5ZWFybHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgWWVhcmx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCB5ZWFybHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4oeWVhcmx5Tm90ZXNGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgeWVhcmx5Tm90ZXNbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHllYXJseU5vdGVzO1xufVxuXG5mdW5jdGlvbiBhcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkKCkge1xuICAgIGNvbnN0IHsgYXBwIH0gPSB3aW5kb3c7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBkYWlseU5vdGVzUGx1Z2luID0gYXBwLmludGVybmFsUGx1Z2lucy5wbHVnaW5zW1wiZGFpbHktbm90ZXNcIl07XG4gICAgaWYgKGRhaWx5Tm90ZXNQbHVnaW4gJiYgZGFpbHlOb3Rlc1BsdWdpbi5lbmFibGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5kYWlseT8uZW5hYmxlZDtcbn1cbi8qKlxuICogWFhYOiBcIldlZWtseSBOb3Rlc1wiIGxpdmUgaW4gZWl0aGVyIHRoZSBDYWxlbmRhciBwbHVnaW4gb3IgdGhlIHBlcmlvZGljLW5vdGVzIHBsdWdpbi5cbiAqIENoZWNrIGJvdGggdW50aWwgdGhlIHdlZWtseSBub3RlcyBmZWF0dXJlIGlzIHJlbW92ZWQgZnJvbSB0aGUgQ2FsZW5kYXIgcGx1Z2luLlxuICovXG5mdW5jdGlvbiBhcHBIYXNXZWVrbHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKGFwcC5wbHVnaW5zLmdldFBsdWdpbihcImNhbGVuZGFyXCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy53ZWVrbHk/LmVuYWJsZWQ7XG59XG5mdW5jdGlvbiBhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5tb250aGx5Py5lbmFibGVkO1xufVxuZnVuY3Rpb24gYXBwSGFzUXVhcnRlcmx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5xdWFydGVybHk/LmVuYWJsZWQ7XG59XG5mdW5jdGlvbiBhcHBIYXNZZWFybHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGVyaW9kaWNOb3RlcyA9IGFwcC5wbHVnaW5zLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpO1xuICAgIHJldHVybiBwZXJpb2RpY05vdGVzICYmIHBlcmlvZGljTm90ZXMuc2V0dGluZ3M/LnllYXJseT8uZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGdldFBlcmlvZGljTm90ZVNldHRpbmdzKGdyYW51bGFyaXR5KSB7XG4gICAgY29uc3QgZ2V0U2V0dGluZ3MgPSB7XG4gICAgICAgIGRheTogZ2V0RGFpbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHdlZWs6IGdldFdlZWtseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgbW9udGg6IGdldE1vbnRobHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHF1YXJ0ZXI6IGdldFF1YXJ0ZXJseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgeWVhcjogZ2V0WWVhcmx5Tm90ZVNldHRpbmdzLFxuICAgIH1bZ3JhbnVsYXJpdHldO1xuICAgIHJldHVybiBnZXRTZXR0aW5ncygpO1xufVxuZnVuY3Rpb24gY3JlYXRlUGVyaW9kaWNOb3RlKGdyYW51bGFyaXR5LCBkYXRlKSB7XG4gICAgY29uc3QgY3JlYXRlRm4gPSB7XG4gICAgICAgIGRheTogY3JlYXRlRGFpbHlOb3RlLFxuICAgICAgICBtb250aDogY3JlYXRlTW9udGhseU5vdGUsXG4gICAgICAgIHdlZWs6IGNyZWF0ZVdlZWtseU5vdGUsXG4gICAgfTtcbiAgICByZXR1cm4gY3JlYXRlRm5bZ3JhbnVsYXJpdHldKGRhdGUpO1xufVxuXG5leHBvcnRzLkRFRkFVTFRfREFJTFlfTk9URV9GT1JNQVQgPSBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5ERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQgPSBERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfUVVBUlRFUkxZX05PVEVfRk9STUFUID0gREVGQVVMVF9RVUFSVEVSTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfV0VFS0xZX05PVEVfRk9STUFUID0gREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFUID0gREVGQVVMVF9ZRUFSTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLmFwcEhhc0RhaWx5Tm90ZXNQbHVnaW5Mb2FkZWQgPSBhcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5hcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQgPSBhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzUXVhcnRlcmx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1dlZWtseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1llYXJseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmNyZWF0ZURhaWx5Tm90ZSA9IGNyZWF0ZURhaWx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlTW9udGhseU5vdGUgPSBjcmVhdGVNb250aGx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlUGVyaW9kaWNOb3RlID0gY3JlYXRlUGVyaW9kaWNOb3RlO1xuZXhwb3J0cy5jcmVhdGVRdWFydGVybHlOb3RlID0gY3JlYXRlUXVhcnRlcmx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlV2Vla2x5Tm90ZSA9IGNyZWF0ZVdlZWtseU5vdGU7XG5leHBvcnRzLmNyZWF0ZVllYXJseU5vdGUgPSBjcmVhdGVZZWFybHlOb3RlO1xuZXhwb3J0cy5nZXRBbGxEYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcztcbmV4cG9ydHMuZ2V0QWxsTW9udGhseU5vdGVzID0gZ2V0QWxsTW9udGhseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxRdWFydGVybHlOb3RlcyA9IGdldEFsbFF1YXJ0ZXJseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxXZWVrbHlOb3RlcyA9IGdldEFsbFdlZWtseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxZZWFybHlOb3RlcyA9IGdldEFsbFllYXJseU5vdGVzO1xuZXhwb3J0cy5nZXREYWlseU5vdGUgPSBnZXREYWlseU5vdGU7XG5leHBvcnRzLmdldERhaWx5Tm90ZVNldHRpbmdzID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldERhdGVGcm9tRmlsZSA9IGdldERhdGVGcm9tRmlsZTtcbmV4cG9ydHMuZ2V0RGF0ZUZyb21QYXRoID0gZ2V0RGF0ZUZyb21QYXRoO1xuZXhwb3J0cy5nZXREYXRlVUlEID0gZ2V0RGF0ZVVJRDtcbmV4cG9ydHMuZ2V0TW9udGhseU5vdGUgPSBnZXRNb250aGx5Tm90ZTtcbmV4cG9ydHMuZ2V0TW9udGhseU5vdGVTZXR0aW5ncyA9IGdldE1vbnRobHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFBlcmlvZGljTm90ZVNldHRpbmdzID0gZ2V0UGVyaW9kaWNOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFF1YXJ0ZXJseU5vdGUgPSBnZXRRdWFydGVybHlOb3RlO1xuZXhwb3J0cy5nZXRRdWFydGVybHlOb3RlU2V0dGluZ3MgPSBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFRlbXBsYXRlSW5mbyA9IGdldFRlbXBsYXRlSW5mbztcbmV4cG9ydHMuZ2V0V2Vla2x5Tm90ZSA9IGdldFdlZWtseU5vdGU7XG5leHBvcnRzLmdldFdlZWtseU5vdGVTZXR0aW5ncyA9IGdldFdlZWtseU5vdGVTZXR0aW5ncztcbmV4cG9ydHMuZ2V0WWVhcmx5Tm90ZSA9IGdldFllYXJseU5vdGU7XG5leHBvcnRzLmdldFllYXJseU5vdGVTZXR0aW5ncyA9IGdldFllYXJseU5vdGVTZXR0aW5ncztcbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgQnJhdFNldHRpbmdzVGFiIH0gZnJvbSBcIi4vdWkvU2V0dGluZ3NUYWJcIjtcclxuaW1wb3J0IHsgU2V0dGluZ3MsIERFRkFVTFRfU0VUVElOR1MgfSBmcm9tIFwiLi91aS9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgQmV0YVBsdWdpbnMgZnJvbSBcIi4vZmVhdHVyZXMvQmV0YVBsdWdpbnNcIjtcclxuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tIFwiLi91aS9pY29uc1wiO1xyXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi91dGlscy9sb2dnaW5nXCI7XHJcbmltcG9ydCBQbHVnaW5Db21tYW5kcyBmcm9tIFwiLi91aS9QbHVnaW5Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyB0aGVtZXNlQ2hlY2tBbmRVcGRhdGVzIH0gZnJvbSBcIi4vZmVhdHVyZXMvdGhlbWVzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdGFwcE5hbWUgPSBcIk9ic2lkaWFuNDIgLSBCZXRhIFJldmlld2VyJ3MgQXV0by11cGRhdGUgVG9vbCAoQlJBVClcIjtcclxuXHRhcHBJRCA9IFwib2JzaWRpYW40Mi1icmF0XCI7XHJcblx0c2V0dGluZ3M6IFNldHRpbmdzO1xyXG5cdGJldGFQbHVnaW5zOiBCZXRhUGx1Z2lucztcclxuXHRyaWJib25JY29uOiBIVE1MRWxlbWVudDtcclxuXHRjb21tYW5kczogUGx1Z2luQ29tbWFuZHM7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGNvbnNvbGUubG9nKFwibG9hZGluZyBPYnNpZGlhbjQyIC0gQlJBVFwiKTtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEJyYXRTZXR0aW5nc1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cclxuXHRcdHRoaXMuYmV0YVBsdWdpbnMgPSBuZXcgQmV0YVBsdWdpbnModGhpcyk7XHJcblx0XHR0aGlzLmNvbW1hbmRzID0gbmV3IFBsdWdpbkNvbW1hbmRzKHRoaXMpO1xyXG5cclxuXHRcdGFkZEljb25zKCk7XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5yaWJib25JY29uRW5hYmxlZCkgdGhpcy5zaG93UmliYm9uQnV0dG9uKCk7XHJcblxyXG5cdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCk6IHZvaWQgPT4geyAvLyBsZXQgb2JzaWRpYW4gbG9hZCBhbmQgY2FsbSBkb3duIGJlZm9yZSBjaGVja1xyXG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy51cGRhdGVBdFN0YXJ0dXApIHsgXHJcblx0XHRcdFx0c2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJldGFQbHVnaW5zLmNoZWNrRm9yVXBkYXRlc0FuZEluc3RhbGxVcGRhdGVzKGZhbHNlKVxyXG5cdFx0XHRcdH0sIDYwMDAwKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy51cGRhdGVUaGVtZXNBdFN0YXJ0dXApIHsgXHJcblx0XHRcdFx0c2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGVtZXNlQ2hlY2tBbmRVcGRhdGVzKHRoaXMsIGZhbHNlKTtcclxuXHRcdFx0XHR9LCAxMjAwMDApO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHNob3dSaWJib25CdXR0b24oKTogdm9pZCB7IHRoaXMucmliYm9uSWNvbiA9IHRoaXMuYWRkUmliYm9uSWNvbihcIkJyYXRJY29uXCIsIFwiQlJBVFwiLCBhc3luYyAoKSA9PiB0aGlzLmNvbW1hbmRzLnJpYmJvbkRpc3BsYXlDb21tYW5kcygpKSB9XHJcblxyXG5cdGxvZyh0ZXh0VG9Mb2c6IHN0cmluZywgdmVyYm9zZSA9IGZhbHNlKTogdm9pZCB7IGxvZ2dlcih0aGlzLCB0ZXh0VG9Mb2csIHZlcmJvc2UpIH1cclxuXHRcclxuXHRvbnVubG9hZCgpOiB2b2lkIHsgY29uc29sZS5sb2coXCJ1bmxvYWRpbmcgXCIgKyB0aGlzLmFwcE5hbWUpIH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4geyB0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKSB9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHsgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKSB9XHJcbn0iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBUb2dnbGVDb21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgdGhlbWVzRGVsZXRlIH0gZnJvbSAnLi4vZmVhdHVyZXMvdGhlbWVzJztcclxuaW1wb3J0IFRoZVBsdWdpbiBmcm9tICcuLi9tYWluJztcclxuaW1wb3J0IEFkZE5ld1RoZW1lIGZyb20gJy4vQWRkTmV3VGhlbWUnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJyYXRTZXR0aW5nc1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogVGhlUGx1Z2luO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBUaGVQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XHJcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogdGhpcy5wbHVnaW4uYXBwTmFtZSB9KTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0F1dG8tdXBkYXRlIHBsdWdpbnMgYXQgc3RhcnR1cCcpXHJcblx0XHRcdC5zZXREZXNjKCdJZiBlbmFibGVkIGFsbCBiZXRhIHBsdWdpbnMgd2lsbCBiZSBjaGVja2VkIGZvciB1cGRhdGVzIGVhY2ggdGltZSBPYnNpZGlhbiBzdGFydHMuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVwZGF0ZUF0U3RhcnR1cCk7XHJcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51cGRhdGVBdFN0YXJ0dXAgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVxyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQXV0by11cGRhdGUgdGhlbWVzIGF0IHN0YXJ0dXAnKVxyXG5cdFx0XHQuc2V0RGVzYygnSWYgZW5hYmxlZCBhbGwgYmV0YSB0aGVtZXMgd2lsbCBiZSBjaGVja2VkIGZvciB1cGRhdGVzIGVhY2ggdGltZSBPYnNpZGlhbiBzdGFydHMuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVwZGF0ZVRoZW1lc0F0U3RhcnR1cCk7XHJcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51cGRhdGVUaGVtZXNBdFN0YXJ0dXAgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVxyXG5cclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1JpYmJvbiBCdXR0b24nKVxyXG5cdFx0XHQuc2V0RGVzYygnVG9nZ2xlIHJpYmJvbiBidXR0b24gb2ZmIGFuZCBvbi4nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKChjYjogVG9nZ2xlQ29tcG9uZW50KSA9PiB7XHJcblx0XHRcdFx0Y2Iuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucmliYm9uSWNvbkVuYWJsZWQpO1xyXG5cdFx0XHRcdGNiLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucmliYm9uSWNvbkVuYWJsZWQgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5yaWJib25JY29uRW5hYmxlZCA9PT0gZmFsc2UpXHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnJpYmJvbkljb24ucmVtb3ZlKCk7XHJcblx0XHRcdFx0XHRlbHNlXHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNob3dSaWJib25CdXR0b24oKTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVx0XHRcdFxyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaHJcIik7XHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogXCJCZXRhIFBsdWdpbiBMaXN0XCIgfSk7XHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImRpdlwiLCB7IHRleHQ6IGBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBiZXRhIHBsdWdpbnMgYWRkZWQgdmlhIHRoZSBjb21tYW5kIHBhbGV0dGUgXCJBZGQgYSBiZXRhIHBsdWdpbiBmb3IgdGVzdGluZ1wiLiBgIH0pO1xyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIpO1xyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJkaXZcIiwgeyB0ZXh0OiBgQ2xpY2sgdGhlIHggYnV0dG9uIG5leHQgdG8gYSBwbHVnaW4gdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QuYCB9KTtcclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiKTtcclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwic3BhblwiKVxyXG5cdFx0XHQuY3JlYXRlRWwoXCJiXCIsIHsgdGV4dDogXCJOb3RlOiBcIiB9KVxyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlU3Bhbih7IHRleHQ6IFwiVGhpcyBkb2VzIG5vdCBkZWxldGUgdGhlIHBsdWdpbiwgdGhpcyBzaG91bGQgYmUgZG9uZSBmcm9tIHRoZSAgQ29tbXVuaXR5IFBsdWdpbnMgdGFiIGluIFNldHRpbmdzLlwiIH0pO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuYWRkQnV0dG9uKChjYjogQnV0dG9uQ29tcG9uZW50KT0+e1xyXG5cdFx0XHRcdGNiLnNldEJ1dHRvblRleHQoXCJBZGQgQmV0YSBwbHVnaW5cIilcclxuXHRcdFx0XHRjYi5vbkNsaWNrKGFzeW5jICgpPT57XHJcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5hcHAuc2V0dGluZy5jbG9zZSgpO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGlzcGxheUFkZE5ld1BsdWdpbk1vZGFsKHRydWUpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdGZvciAoY29uc3QgYnAgb2YgdGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdCkge1xyXG5cdFx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0XHQuc2V0TmFtZShicClcclxuXHRcdFx0XHQuYWRkQnV0dG9uKChidG46IEJ1dHRvbkNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdFx0YnRuLnNldEljb24oXCJjcm9zc1wiKTtcclxuXHRcdFx0XHRcdGJ0bi5zZXRUb29sdGlwKFwiRGVsZXRlIHRoaXMgYmV0YSBwbHVnaW5cIik7XHJcblx0XHRcdFx0XHRidG4ub25DbGljayhhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdC8vIGF3YWl0IHRoaXMucGx1Z2luLmJldGFQbHVnaW5zLmRlbGV0ZVBsdWdpbihicCk7XHJcblx0XHRcdFx0XHRcdGlmIChidG4uYnV0dG9uRWwudGV4dENvbnRlbnQgPT09IFwiXCIpXHJcblx0XHRcdFx0XHRcdFx0YnRuLnNldEJ1dHRvblRleHQoXCJDbGljayBvbmNlIG1vcmUgdG8gY29uZmlybSByZW1vdmFsXCIpO1xyXG5cdFx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRidG4uYnV0dG9uRWwucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZSgpO1xyXG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLmJldGFQbHVnaW5zLmRlbGV0ZVBsdWdpbihicClcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSlcclxuXHRcdH1cclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImhyXCIpO1xyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiQmV0YSBUaGVtZXMgTGlzdFwiIH0pO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuYWRkQnV0dG9uKChjYjogQnV0dG9uQ29tcG9uZW50KT0+e1xyXG5cdFx0XHRcdGNiLnNldEJ1dHRvblRleHQoXCJBZGQgQmV0YSBUaGVtZVwiKVxyXG5cdFx0XHRcdGNiLm9uQ2xpY2soYXN5bmMgKCk9PntcclxuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLmFwcC5zZXR0aW5nLmNsb3NlKCk7XHJcblx0XHRcdFx0XHQobmV3IEFkZE5ld1RoZW1lKHRoaXMucGx1Z2luKSkub3BlbigpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdH0pO1x0XHRcclxuXHJcblxyXG5cdFx0Zm9yIChjb25zdCBicCBvZiB0aGlzLnBsdWdpbi5zZXR0aW5ncy50aGVtZXNMaXN0KSB7XHJcblx0XHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHRcdC5zZXROYW1lKGJwLnJlcG8pXHJcblx0XHRcdFx0LmFkZEJ1dHRvbigoYnRuOiBCdXR0b25Db21wb25lbnQpID0+IHtcclxuXHRcdFx0XHRcdGJ0bi5zZXRJY29uKFwiY3Jvc3NcIik7XHJcblx0XHRcdFx0XHRidG4uc2V0VG9vbHRpcChcIkRlbGV0ZSB0aGlzIGJldGEgdGhlbWVcIik7XHJcblx0XHRcdFx0XHRidG4ub25DbGljayhhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChidG4uYnV0dG9uRWwudGV4dENvbnRlbnQgPT09IFwiXCIpXHJcblx0XHRcdFx0XHRcdFx0YnRuLnNldEJ1dHRvblRleHQoXCJDbGljayBvbmNlIG1vcmUgdG8gY29uZmlybSByZW1vdmFsXCIpO1xyXG5cdFx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRidG4uYnV0dG9uRWwucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZSgpO1xyXG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoZW1lc0RlbGV0ZSh0aGlzLnBsdWdpbiwgYnAucmVwbyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pXHJcblx0XHR9XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJoclwiKTtcclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDJcIiwgeyB0ZXh0OiBcIk1vbml0b3JpbmdcIiB9KTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0VuYWJsZSBOb3RpZmljYXRpb25zJylcclxuXHRcdFx0LnNldERlc2MoJ0JSQVQgd2lsbCBwcm92aWRlIHBvcHVwIG5vdGlmaWNhdGlvbnMgZm9yIGl0cyB2YXJpb3VzIGFjdGl2aXRpZXMuIFR1cm4gdGhpcyBvZmYgbWVhbnMgIG5vIG5vdGlmaWNhdGlvbnMgZnJvbSBCUkFULicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKGNiOiBUb2dnbGVDb21wb25lbnQpID0+IHtcclxuXHRcdFx0XHRjYi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5ub3RpZmljYXRpb25zRW5hYmxlZCk7XHJcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5ub3RpZmljYXRpb25zRW5hYmxlZCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pXHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdFbmFibGUgTG9nZ2luZycpXHJcblx0XHRcdC5zZXREZXNjKCdQbHVnaW4gdXBkYXRlcyB3aWxsIGJlIGxvZ2dlZCB0byBhIGZpbGUgaW4gdGhlIGxvZyBmaWxlLicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKGNiOiBUb2dnbGVDb21wb25lbnQpID0+IHtcclxuXHRcdFx0XHRjYi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5sb2dnaW5nRW5hYmxlZCk7XHJcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5sb2dnaW5nRW5hYmxlZCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pXHJcblxyXG5cdFx0bmV3IFNldHRpbmcodGhpcy5jb250YWluZXJFbClcclxuICAgICAgICAgICAgLnNldE5hbWUoXCJCUkFUIExvZyBGaWxlIExvY2F0aW9uXCIpXHJcbiAgICAgICAgICAgIC5zZXREZXNjKFwiTG9ncyB3aWxsIGJlIHNhdmVkIHRvIHRoaXMgZmlsZS4gRG9uJ3QgYWRkIC5tZCB0byB0aGUgZmlsZSBuYW1lLlwiKVxyXG4gICAgICAgICAgICAuYWRkU2VhcmNoKChjYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2Iuc2V0UGxhY2Vob2xkZXIoXCJFeGFtcGxlOiBCUkFULWxvZ1wiKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5sb2dnaW5nUGF0aClcclxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKG5ld19mb2xkZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MubG9nZ2luZ1BhdGggPSBuZXdfZm9sZGVyO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHRcdFxyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnRW5hYmxlIFZlcmJvc2UgTG9nZ2luZycpXHJcblx0XHRcdC5zZXREZXNjKCdHZXQgYSBsb3QgIG1vcmUgaW5mb3JtYXRpb24gaW4gIHRoZSBsb2cuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdWZXJib3NlRW5hYmxlZCk7XHJcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5sb2dnaW5nVmVyYm9zZUVuYWJsZWQgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVxyXG5cclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0RlYnVnZ2luZyBNb2RlJylcclxuXHRcdFx0LnNldERlc2MoJ0F0b21pYyBCb21iIGxldmVsIGNvbnNvbGUgbG9nZ2luZy4gQ2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG90aW5nIGFuZCBkZXZlbG9wbWVudC4nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKChjYjogVG9nZ2xlQ29tcG9uZW50KSA9PiB7XHJcblx0XHRcdFx0Y2Iuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdnaW5nTW9kZSk7XHJcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z2dpbmdNb2RlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSlcdFx0XHRcclxuXHRcclxuXHR9XHJcbn1cclxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZVBhdGgsIE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgVGhlUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IEdlbmVyaWNGdXp6eVN1Z2dlc3RlciwgU3VnZ2VzdGVySXRlbSB9IGZyb20gXCIuLi91aS9HZW5lcmljRnV6enlTdWdnZXN0ZXJcIjtcclxuaW1wb3J0IHsgdXBkYXRlQmV0YVRoZW1lTGFzdFVwZGF0ZURhdGUgfSBmcm9tIFwiLi4vdWkvc2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgZ3JhYkNvbW1tdW5pdHlUaGVtZU9ic2lkaWFuQ3NzLCBncmFiQ29tbW11bml0eVRoZW1lc0xpc3QsIGdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlIH0gZnJvbSBcIi4vZ2l0aHViVXRpbHNcIjtcclxuaW1wb3J0IHsgVG9hc3RNZXNzYWdlIH0gZnJvbSBcIi4uL3V0aWxzL25vdGlmaWNhdGlvbnNcIjtcclxuaW1wb3J0IHsgaXNDb25uZWN0ZWRUb0ludGVybmV0IH0gZnJvbSBcIi4uL3V0aWxzL2ludGVybmV0Y29ubmVjdGlvblwiO1xyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgcGF0aCB0byB0aGUgdGhlbWVzIGZvbGRlciBmbyBydGhpcyB2YXVsdFxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgcGx1Z2luICBUaFBsdWdpblxyXG4gKlxyXG4gKiBAcmV0dXJuICB7c3RyaW5nfSAgICAgICAgICAgICBwYXRoIHRvIHRoZW1lcyBmb2xkZXJcclxuICovXHJcbmV4cG9ydCBjb25zdCB0aGVtZXNSb290UGF0aCA9IChwbHVnaW46IFRoZVBsdWdpbik6IHN0cmluZyA9PiB7XHJcbiAgICByZXR1cm4gbm9ybWFsaXplUGF0aChwbHVnaW4uYXBwLnZhdWx0LmNvbmZpZ0RpciArIFwiL3RoZW1lc1wiKSArIFwiL1wiO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIEluc3RhbGxzIGEgdGhlbWUsIGluY2x1ZGluZyBkb3dubG9hZGluZyBhbmQgcmVnaXN0cmluZyBpdCB3aXRoIEJSQVRcclxuICpcclxuICogQHBhcmFtICAge1RoZVBsdWdpbn0gICAgICAgICAgIHBsdWdpbiAgICAgICAgICAgICAgIFRoZVBsdWdpblxyXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgICAgICAgY3NzR2l0aHViUmVwb3NpdG9yeSAgVGhlIHJlcG9zaXRvcnkgd2l0aCB0aGUgdGhlbWVcclxuICogQHBhcmFtICAge3VuZGVmaW5lZDxib29sZWFuPn0gIGNzc0ZpbGVOYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIGNzcyBmaWxlIHRoYXQgd2lsbCBiZSBzYXZlZCB0byB0aGUgdGhlbWVzIGZvbGRlciBpbnRoZSB2YXVsdFxyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTxib29sZWFuPn0gICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSBmb3Igc3VjY2Nlc3NcclxuICovXHJcbmV4cG9ydCBjb25zdCB0aGVtZUluc3RhbGxUaGVtZSA9IGFzeW5jIChwbHVnaW46IFRoZVBsdWdpbiwgY3NzR2l0aHViUmVwb3NpdG9yeTogc3RyaW5nLCBjc3NGaWxlTmFtZSA9IFwiXCIpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcclxuICAgIGNvbnN0IHRoZW1lQ1NTID0gYXdhaXQgZ3JhYkNvbW1tdW5pdHlUaGVtZU9ic2lkaWFuQ3NzKGNzc0dpdGh1YlJlcG9zaXRvcnkpO1xyXG4gICAgaWYoIXRoZW1lQ1NTKSB7XHJcbiAgICAgICAgVG9hc3RNZXNzYWdlKHBsdWdpbixcIlRoZXJlIGlzIG5vIG9ic2lkaWFuLmNzcyBmaWxlIGluIHRoZSByb290IHBhdGggb2YgdGhpcyByZXBvc2l0b3J5LCBzbyB0aGVyZSBpcyBubyB0aGVtZSB0byBpbnN0YWxsLlwiKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoZW1lc1NhdmVUaGVtZShwbHVnaW4sIGNzc0ZpbGVOYW1lLCB0aGVtZUNTUyk7XHJcbiAgICBjb25zdCBtc2cgPSBgJHtjc3NGaWxlTmFtZX0gdGhlbWUgaW5zdGFsbGVkIGZyb20gJHtjc3NHaXRodWJSZXBvc2l0b3J5fS4gYDtcclxuICAgIHBsdWdpbi5sb2cobXNnICsgYFtUaGVtZSBJbmZvXShodHRwczovL2dpdGh1Yi5jb20vJHtjc3NHaXRodWJSZXBvc2l0b3J5fSlgLCBmYWxzZSk7XHJcbiAgICBUb2FzdE1lc3NhZ2UocGx1Z2luLGAke21zZ31gLDEwLCBhc3luYyAoKT0+eyB3aW5kb3cub3BlbihgaHR0cHM6Ly9naXRodWIuY29tLyR7Y3NzR2l0aHViUmVwb3NpdG9yeX1gKX0pO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZSAgICAgICAgICAgIFxyXG4gICAgICAgIHBsdWdpbi5hcHAuY3VzdG9tQ3NzLnNldFRoZW1lKGNzc0ZpbGVOYW1lKTtcclxuICAgIH0sIDUwMCk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNhdmVzIHRoZSAgdGhlbWUgZmlsZSB0byB0aGUgdmF1bHRcclxuICpcclxuICogQHBhcmFtICAge1RoZVBsdWdpbn0gICAgICBwbHVnaW4gICAgICAgVGhlUGx1Z2luXHJcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgY3NzRmlsZU5hbWUgIGZpbGUgbmFtZSB0byBiZSB1c2VkIGluIHRoZSB0aGVtZXMgZm9sZGVyXHJcbiAqIEBwYXJhbSAgIHtzdHJpbmc8dm9pZD59ICAgY3NzVGV4dCAgICAgIHRoZSBjc3MgZmlsZSBjb250ZW50c1xyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTx2b2lkPn0gICAgICAgICAgICAgICBcclxuICovXHJcbmV4cG9ydCBjb25zdCB0aGVtZXNTYXZlVGhlbWUgPSBhc3luYyAocGx1Z2luOiBUaGVQbHVnaW4sIGNzc0ZpbGVOYW1lOiBzdHJpbmcsIGNzc1RleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgY29uc3QgdGhlbWVzVGFyZ2V0Rm9sZGVyUGF0aCA9IHRoZW1lc1Jvb3RQYXRoKHBsdWdpbik7XHJcbiAgICBjb25zdCBhZGFwdGVyID0gcGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyO1xyXG4gICAgaWYgKGF3YWl0IGFkYXB0ZXIuZXhpc3RzKHRoZW1lc1RhcmdldEZvbGRlclBhdGgpID09PSBmYWxzZSkgYXdhaXQgYWRhcHRlci5ta2Rpcih0aGVtZXNUYXJnZXRGb2xkZXJQYXRoKTtcclxuICAgIGF3YWl0IGFkYXB0ZXIud3JpdGUodGhlbWVzVGFyZ2V0Rm9sZGVyUGF0aCArIGNzc0ZpbGVOYW1lICsgXCIuY3NzXCIsIGNzc1RleHQpO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIEluc3RhbGwgYSB0aGVtZSBmcm9tIHRoZSBjb21tdW5pdHkgbGlzdC4gdGhpcyBpcyBkb2luZyB0aGUgc2FtZSB0aGluZyBhcyB0aGUgYnVpbHQgaW4gdGhlbWUgaW5zdGFsbGVyIGluIG9ic2lkaWFuLCBidXQgdGhpcyBtYWtlcyBpdCBmYXN0IHRvIGRvIHRocm91Z2ggY29tbWFuZCBwYWxldHRlXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW48dm9pZD59ICBwbHVnaW4gIFRoZVBsdWdpblxyXG4gKlxyXG4gKiBAcmV0dXJuICB7fSAgICAgICAgICAgIFtyZXR1cm4gZGVzY3JpcHRpb25dXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGhlbWVzSW5zdGFsbEZyb21Db21tdW5pdHlMaXN0ID0gYXN5bmMgKHBsdWdpbjogVGhlUGx1Z2luKTogUHJvbWlzZTx2b2lkPiA9PntcclxuICAgIGNvbnN0IGNvbW11bml0eVRoZW1lID0gYXdhaXQgZ3JhYkNvbW1tdW5pdHlUaGVtZXNMaXN0KCk7XHJcbiAgICBjb25zdCBjb21tdW5pdHlUaGVtZUxpc3Q6IFN1Z2dlc3Rlckl0ZW1bXSA9IE9iamVjdC52YWx1ZXMoY29tbXVuaXR5VGhlbWUpLm1hcCgocCkgPT4geyByZXR1cm4geyBkaXNwbGF5OiBgVGhlbWU6ICR7cC5uYW1lfSAgKCR7cC5yZXBvfSlgLCBpbmZvOiBwIH0gfSk7XHJcbiAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHBsdWdpbik7XHJcbiAgICBnZnMuc2V0U3VnZ2VzdGVyRGF0YShjb21tdW5pdHlUaGVtZUxpc3QpO1xyXG4gICAgYXdhaXQgZ2ZzLmRpc3BsYXkoYXN5bmMgKHJlc3VsdHMpID0+IHtcclxuICAgICAgICBhd2FpdCB0aGVtZUluc3RhbGxUaGVtZShwbHVnaW4sIHJlc3VsdHMuaW5mby5yZXBvLCByZXN1bHRzLmluZm8ubmFtZSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBmaWxlIG5hbWUgZm9yIHRoZSB0aGVtZS4gSXQgaXMgYmFzZWQgb24gdGhlIGdpdGh1YiByZXBvc2l0b3J5IHRoZW1lIG5hbWVcclxuICpcclxuICogQHBhcmFtICAge3N0cmluZ30gIGNzc0dpdGh1YlJlcG9zaXRvcnkgIFtjc3NHaXRodWJSZXBvc2l0b3J5IGRlc2NyaXB0aW9uXVxyXG4gKlxyXG4gKiBAcmV0dXJuICB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgW3JldHVybiBkZXNjcmlwdGlvbl1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0aGVtZXNEZXJpdmVCZXRhTmFtZUZyb21SZXBvc2l0b3J5ID0gKGNzc0dpdGh1YlJlcG9zaXRvcnk6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgICBjb25zdCBiZXRhTmFtZSA9IFwiQlJBVC1cIiArIGNzc0dpdGh1YlJlcG9zaXRvcnkucmVwbGFjZShcIi9cIiwgXCItLS0tXCIpO1xyXG4gICAgcmV0dXJuIGJldGFOYW1lLnN1YnN0cigwLCAxMDApO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIERlbGV0ZXMgYSB0aGVtIGZyb20gdGhlIEJSQVQgbGlzdCBhbmQgYWxzbyB0aGUgcGh5c2ljYWwgdGhlbWUgY3NzIGZpbGUgaW4gdGhlIHZhdWx0XHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICBwbHVnaW4gICAgICAgICAgICAgICBUaGVQbHVnaW5cclxuICogQHBhcmFtICAge3N0cmluZ30gICAgIGNzc0dpdGh1YlJlcG9zaXRvcnkgIFJlcG9zaXRvcnkgcGF0aFxyXG4gKlxyXG4gKiBAcmV0dXJuICB7dm9pZH1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0aGVtZXNEZWxldGUgPSBhc3luYyAocGx1Z2luOiBUaGVQbHVnaW4sIGNzc0dpdGh1YlJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgcGx1Z2luLnNldHRpbmdzLnRoZW1lc0xpc3QgPSBwbHVnaW4uc2V0dGluZ3MudGhlbWVzTGlzdC5maWx0ZXIoKHQpID0+IHQucmVwbyAhPSBjc3NHaXRodWJSZXBvc2l0b3J5KTtcclxuICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgIGF3YWl0IHBsdWdpbi5hcHAudmF1bHQuYWRhcHRlci5yZW1vdmUodGhlbWVzUm9vdFBhdGgocGx1Z2luKSArIHRoZW1lc0Rlcml2ZUJldGFOYW1lRnJvbVJlcG9zaXRvcnkoY3NzR2l0aHViUmVwb3NpdG9yeSkgKyBcIi5jc3NcIik7XHJcbiAgICBjb25zdCBtc2cgPSBgUmVtb3ZlZCAke2Nzc0dpdGh1YlJlcG9zaXRvcnl9IGZyb20gQlJBVCB0aGVtZXMgbGlzdCBhbmQgZGVsZXRlZCBmcm9tIHZhdWx0YDtcclxuICAgIHBsdWdpbi5sb2cobXNnLCB0cnVlKTtcclxuICAgIFRvYXN0TWVzc2FnZShwbHVnaW4sIGAke21zZ31gKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyAgaWYgdGhlcmUgIGFyZSB0aGVtZSB1cGRhdGVzIGJhc2VkIG9uIHRoZSBjb21taXQgZGF0ZSBvZiB0aGUgb2JzaWRpYW4uY3NzIGZpbGUgb24gZ2l0aHViIGluIGNvbXBhcmlzb24gdG8gd2hhdCBpcyBzdG9yZWQgaW4gdGhlIEJSQVQgdGhlbWUgbGlzdFxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgIHBsdWdpbiAgICBUaGVQbHVnaW5cclxuICogQHBhcmFtICAge2Jvb2xlYW48dm9pZD59ICBzaG93SW5mbyAgcHJvdmlkZSAgbm90aWNlcyBkdXJpbmcgdGhlIHVwZGF0ZSBwcm9jZXNcclxuICpcclxuICogQHJldHVybiAge1Byb21pc2U8dm9pZD59ICAgICAgICAgICAgXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGhlbWVzZUNoZWNrQW5kVXBkYXRlcyA9IGFzeW5jIChwbHVnaW46IFRoZVBsdWdpbiwgc2hvd0luZm86Ym9vbGVhbik6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgaWYoYXdhaXQgaXNDb25uZWN0ZWRUb0ludGVybmV0KCk9PT1mYWxzZSkgeyBcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkJSQVQ6IE5vIGludGVybmV0IGRldGVjdGVkLlwiKSBcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgbmV3Tm90aWNlOiBOb3RpY2U7XHJcbiAgICBjb25zdCBtc2cxID0gYENoZWNraW5nIGZvciBiZXRhIHRoZW1lIHVwZGF0ZXMgU1RBUlRFRGA7XHJcbiAgICBwbHVnaW4ubG9nKG1zZzEsIHRydWUpO1xyXG4gICAgaWYgKHNob3dJbmZvICYmIHBsdWdpbi5zZXR0aW5ncy5ub3RpZmljYXRpb25zRW5hYmxlZCkgbmV3Tm90aWNlID0gbmV3IE5vdGljZShgQlJBVFxcbiR7bXNnMX1gLCAzMDAwMCk7XHJcbiAgICBmb3IoY29uc3QgdCBvZiBwbHVnaW4uc2V0dGluZ3MudGhlbWVzTGlzdCkge1xyXG4gICAgICAgIGNvbnN0IGxhc3RVcGRhdGVPbmxpbmUgPSBhd2FpdCBncmFiTGFzdENvbW1pdERhdGVGb3JBRmlsZSh0LnJlcG8sIFwib2JzaWRpYW4uY3NzXCIpO1xyXG4gICAgICAgIGlmKGxhc3RVcGRhdGVPbmxpbmUhPT10Lmxhc3RVcGRhdGUpIFxyXG4gICAgICAgICAgICBhd2FpdCB0aGVtZVVwZGF0ZVRoZW1lKHBsdWdpbiwgdC5yZXBvLCB0Lmxhc3RVcGRhdGUsIGxhc3RVcGRhdGVPbmxpbmUpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbXNnMiA9IGBDaGVja2luZyBmb3IgYmV0YSB0aGVtZSB1cGRhdGVzIENPTVBMRVRFRGA7XHJcbiAgICBwbHVnaW4ubG9nKG1zZzIsIHRydWUpO1xyXG4gICAgaWYgKHNob3dJbmZvKSB7XHJcbiAgICAgICAgaWYocGx1Z2luLnNldHRpbmdzLm5vdGlmaWNhdGlvbnNFbmFibGVkKSBuZXdOb3RpY2UuaGlkZSgpO1xyXG4gICAgICAgIFRvYXN0TWVzc2FnZShwbHVnaW4sIG1zZzIpO1xyXG4gICAgfVxyXG59IFxyXG5cclxuLyoqXHJcbiAqIFVwZGF0ZXMgYSB0aGVtZSBhbHJlYWR5IHJlZ2lzdGVyZWQgIHdpdGggQlJBVFxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgICAgICAgcGx1Z2luICAgICAgICAgICAgICAgVGhlUGx1Z2luXHJcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICBjc3NHaXRodWJSZXBvc2l0b3J5ICBSZXBvc2l0b3J5IHBhdGhcclxuICogQHBhcmFtICAge1t0eXBlXX0gICAgICAgICAgICAgIG9sZEZpbGVEYXRlICAgICAgICAgIE9sZCBmaWxlIGRhdGUgIGZyb20gdGhlIEJSQVQgdGhlbWUgbGlzdFxyXG4gKiBAcGFyYW0gICB7dW5kZWZpbmVkPGJvb2xlYW4+fSAgbmV3RmlsZURhdGUgICAgICAgICAgbmV3IGRhdGUgdG8gdXNlIGZvciB0aGlzIHVwZGF0ZVxyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTxib29sZWFuPn0gICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSBpZiBzdWNjZWVkc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRoZW1lVXBkYXRlVGhlbWUgPSBhc3luYyAocGx1Z2luOiBUaGVQbHVnaW4sIGNzc0dpdGh1YlJlcG9zaXRvcnk6IHN0cmluZywgb2xkRmlsZURhdGUgPSBcIlwiLCBuZXdGaWxlRGF0ZSA9IFwiXCIpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcclxuICAgIGNvbnN0IHRoZW1lQ1NTID0gYXdhaXQgZ3JhYkNvbW1tdW5pdHlUaGVtZU9ic2lkaWFuQ3NzKGNzc0dpdGh1YlJlcG9zaXRvcnkpO1xyXG4gICAgaWYoIXRoZW1lQ1NTKSB7XHJcbiAgICAgICAgVG9hc3RNZXNzYWdlKHBsdWdpbiwgXCJUaGVyZSBpcyBubyBvYnNpZGlhbi5jc3MgZmlsZSBpbiB0aGUgcm9vdCBwYXRoIG9mIHRoZSAke2Nzc0dpdGh1YlJlcG9zaXRvcnl9IHJlcG9zaXRvcnksIHNvIHRoaXMgdGhlbWUgY2Fubm90IGJlIHVwZGF0ZWQuXCIpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY3NzRmlsZU5hbWUgPSB0aGVtZXNEZXJpdmVCZXRhTmFtZUZyb21SZXBvc2l0b3J5KGNzc0dpdGh1YlJlcG9zaXRvcnkpO1xyXG4gICAgYXdhaXQgdGhlbWVzU2F2ZVRoZW1lKHBsdWdpbiwgY3NzRmlsZU5hbWUsIHRoZW1lQ1NTKTtcclxuICAgIHVwZGF0ZUJldGFUaGVtZUxhc3RVcGRhdGVEYXRlKHBsdWdpbiwgY3NzR2l0aHViUmVwb3NpdG9yeSwgbmV3RmlsZURhdGUpO1xyXG4gICAgY29uc3QgbXNnID0gYCR7Y3NzRmlsZU5hbWV9IHRoZW1lIHVwZGF0ZWQgZnJvbSAke2Nzc0dpdGh1YlJlcG9zaXRvcnl9LiBGcm9tIGRhdGU6ICR7b2xkRmlsZURhdGV9IHRvICR7bmV3RmlsZURhdGV9IGA7XHJcbiAgICBwbHVnaW4ubG9nKG1zZyArIGBbVGhlbWUgSW5mb10oaHR0cHM6Ly9naXRodWIuY29tLyR7Y3NzR2l0aHViUmVwb3NpdG9yeX0pYCwgZmFsc2UpO1xyXG4gICAgVG9hc3RNZXNzYWdlKHBsdWdpbiwgYCR7bXNnfWAsIDIwLCBhc3luYyAoKT0+e3dpbmRvdy5vcGVuKGBodHRwczovL2dpdGh1Yi5jb20vJHtjc3NHaXRodWJSZXBvc2l0b3J5fWApfSAgICk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufSIsICJpbXBvcnQgeyBGdXp6eVN1Z2dlc3RNb2RhbCwgRnV6enlNYXRjaCB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IFRoZVBsdWdpbiBmcm9tICcuLi9tYWluJztcclxuXHJcbi8qKlxyXG4gKiBTaW1wbGUgaW50ZXJmYWNlIGZvciB3aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgYW5kIHN0b3JlZCBmb3Igc3VnZ2VzdGVyXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1Z2dlc3Rlckl0ZW0ge1xyXG4gICAgZGlzcGxheTogc3RyaW5nLCAgICAgICAgLy8gZGlzcGxheWVkIHRvIHVzZXJcclxuICAgIGluZm86IGFueSAgICAgICAgICAgICAgIC8vIHN1cHBsbWVudGFsIGluZm8gZm9yIHRoZSBjYWxsYmFja1xyXG59XHJcblxyXG4vKipcclxuICogR2VuZXJpYyBzdWdnZXN0ZXIgZm9yIHF1aWNrIHJldXNlXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyIGV4dGVuZHMgRnV6enlTdWdnZXN0TW9kYWw8U3VnZ2VzdGVySXRlbT57XHJcbiAgICBkYXRhOiBTdWdnZXN0ZXJJdGVtW107XHJcbiAgICBjYWxsYmFja0Z1bmN0aW9uOiBhbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3IocGx1Z2luOiBUaGVQbHVnaW4pIHtcclxuICAgICAgICBzdXBlcihwbHVnaW4uYXBwKTtcclxuICAgICAgICB0aGlzLnNjb3BlLnJlZ2lzdGVyKFtcIlNoaWZ0XCJdLCBcIkVudGVyXCIsIGV2dCA9PiB0aGlzLmVudGVyVHJpZ2dlcihldnQpKTtcclxuICAgICAgICB0aGlzLnNjb3BlLnJlZ2lzdGVyKFtcIkN0cmxcIl0sIFwiRW50ZXJcIiwgZXZ0ID0+IHRoaXMuZW50ZXJUcmlnZ2VyKGV2dCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFN1Z2dlc3RlckRhdGEoc3VnZ2VzdGVyRGF0YTogQXJyYXk8U3VnZ2VzdGVySXRlbT4pOiB2b2lkIHsgdGhpcy5kYXRhID0gc3VnZ2VzdGVyRGF0YSB9XHJcblxyXG4gICAgYXN5bmMgZGlzcGxheShjYWxsQmFjazogKGl0ZW06IFN1Z2dlc3Rlckl0ZW0sIGV2dDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQpID0+IHZvaWQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tGdW5jdGlvbiA9IGNhbGxCYWNrO1xyXG4gICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEl0ZW1zKCk6IFN1Z2dlc3Rlckl0ZW1bXSB7IHJldHVybiB0aGlzLmRhdGEgfVxyXG5cclxuICAgIGdldEl0ZW1UZXh0KGl0ZW06IFN1Z2dlc3Rlckl0ZW0pOiBzdHJpbmcgeyByZXR1cm4gaXRlbS5kaXNwbGF5IH1cclxuXHJcbiAgICBvbkNob29zZUl0ZW0oKTogdm9pZCB7IHJldHVybiB9IC8vIHJlcXVpcmVkIGJ5IFRTLCBidXQgbm90IHVzaW5nXHJcblxyXG4gICAgcmVuZGVyU3VnZ2VzdGlvbihpdGVtOiBGdXp6eU1hdGNoPFN1Z2dlc3Rlckl0ZW0+LCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHsgZWwuY3JlYXRlRWwoJ2RpdicsIHsgdGV4dDogaXRlbS5pdGVtLmRpc3BsYXkgfSkgfVxyXG5cclxuICAgIGVudGVyVHJpZ2dlcihldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnN1Z2dlc3Rpb24taXRlbS5pcy1zZWxlY3RlZCBkaXZcIikudGV4dENvbnRlbnQ7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZGF0YS5maW5kKGkgPT4gaS5kaXNwbGF5ID09PSBzZWxlY3RlZFRleHQpO1xyXG4gICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW52b2tlQ2FsbGJhY2soaXRlbSwgZXZ0KTtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNob29zZVN1Z2dlc3Rpb24oaXRlbTogRnV6enlNYXRjaDxTdWdnZXN0ZXJJdGVtPiwgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQgeyB0aGlzLmludm9rZUNhbGxiYWNrKGl0ZW0uaXRlbSwgZXZ0KSB9XHJcblxyXG4gICAgaW52b2tlQ2FsbGJhY2soaXRlbTogU3VnZ2VzdGVySXRlbSwgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQgeyB0aGlzLmNhbGxiYWNrRnVuY3Rpb24oaXRlbSwgZXZ0KSB9XHJcbn1cclxuIiwgImltcG9ydCB7IFBsdWdpbk1hbmlmZXN0LCByZXF1ZXN0IH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcblxyXG5jb25zdCBHSVRIVUJfUkFXX1VTRVJDT05URU5UX1BBVEggPSBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9cIjtcclxuXHJcbi8qKlxyXG4gKiBwdWxscyBmcm9tIGdpdGh1YiBhIHJlbGVhc2UgZmlsZSBieSBpdHMgdmVyc2lvbiBudW1iZXJcclxuICpcclxuICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgIHJlcG9zaXRvcnkgIHBhdGggdG8gR2l0SHViIHJlcG9zaXRvcnkgaW4gZm9ybWF0IFVTRVJOQU1FL3JlcG9zaXRvcnlcclxuICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgIHZlcnNpb24gICAgIHZlcnNpb24gb2YgcmVsZWFzZSB0byByZXRyaXZlXHJcbiAqIEBwYXJhbSAgIHtzdHJpbmc8c3RyaW5nPn0gICBmaWxlTmFtZSAgICBuYW1lIG9mIGZpbGUgdG8gcmV0cmlldmUgZnJvbSByZWxlYXNlXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPHN0cmluZz59ICAgICAgICAgICAgICBjb250ZW50cyBvZiBmaWxlIGFzIHN0cmluZyBmcm9tIHRoZSByZXBvc2l0b3J5J3MgcmVsZWFzZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdyYWJSZWxlYXNlRmlsZUZyb21SZXBvc2l0b3J5ID0gYXN5bmMgKHJlcG9zaXRvcnk6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcclxuICAgIGNvbnN0IFVSTCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259LyR7ZmlsZU5hbWV9YDtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgZG93bmxvYWQgPSBhd2FpdCByZXF1ZXN0KHsgdXJsOiBVUkwgfSk7XHJcbiAgICAgICAgcmV0dXJuICgoZG93bmxvYWQgPT09IFwiTm90IEZvdW5kXCIgfHwgZG93bmxvYWQgPT09IGB7XCJlcnJvclwiOlwiTm90IEZvdW5kXCJ9YCkgPyBudWxsIDogZG93bmxvYWQpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIGdyYWJSZWxlYXNlRmlsZUZyb21SZXBvc2l0b3J5XCIsIFVSTCwgZXJyb3IpXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBncmFicyB0aGUgbWFuaWZlc3QuanNvbiBmcm9tIHRoZSByZXBvc2l0b3J5LiByb290TWFuaWZlc3QgLSBpZiB0cnVlIGdyYWJzIG1hbmlmZXN0Lmpzb24gaWYgZmFsc2UgZ3JhYnMgbWFuaWZlc3QtYmV0YS5qc29uXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeVBhdGggIHBhdGggdG8gR2l0SHViIHJlcG9zaXRvcnkgaW4gZm9ybWF0IFVTRVJOQU1FL3JlcG9zaXRvcnlcclxuICogQHBhcmFtICAge1t0eXBlXX0gICAgICAgICAgICAgICAgICAgICByb290TWFuaWZlc3QgICAgaWYgdHJ1ZSBncmFicyBtYW5pZmVzdC5qc29uIGlmIGZhbHNlIGdyYWJzIG1hbmlmZXN0LWJldGEuanNvblxyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTxQbHVnaW5NYW5pZmVzdD59ICAgICAgICAgICAgICAgICAgICByZXR1cm5zIG1hbmlmZXN0IGZpbGUgZm9yICBhIHBsdWdpblxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdyYWJNYW5pZmVzdEpzb25Gcm9tUmVwb3NpdG9yeSA9IGFzeW5jIChyZXBvc2l0b3J5UGF0aDogc3RyaW5nLCByb290TWFuaWZlc3QgPSB0cnVlKTogUHJvbWlzZTxQbHVnaW5NYW5pZmVzdD4gPT4ge1xyXG4gICAgY29uc3QgbWFuaWZlc3RKc29uUGF0aCA9IEdJVEhVQl9SQVdfVVNFUkNPTlRFTlRfUEFUSCArIHJlcG9zaXRvcnlQYXRoICtcclxuICAgICAgICAocm9vdE1hbmlmZXN0ID09PSB0cnVlID8gXCIvSEVBRC9tYW5pZmVzdC5qc29uXCIgOiBcIi9IRUFEL21hbmlmZXN0LWJldGEuanNvblwiKTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0KHsgdXJsOiBtYW5pZmVzdEpzb25QYXRoIH0pO1xyXG4gICAgICAgIHJldHVybiAocmVzcG9uc2UgPT09IFwiNDA0OiBOb3QgRm91bmRcIiA/IG51bGwgOiBhd2FpdCBKU09OLnBhcnNlKHJlc3BvbnNlKSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBlcnJvciBpbiBncmFiTWFuaWZlc3RKc29uRnJvbVJlcG9zaXRvcnkgZm9yICR7bWFuaWZlc3RKc29uUGF0aH1gLCBlcnJvcik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY29uc3QgZ3JhYkNvbW1tdW5pdHlQbHVnaW5MaXN0ID0gYXN5bmMgKCk6IFByb21pc2U8SlNPTj4gPT4ge1xyXG4gICAgY29uc3QgcGx1Z2luTGlzdFVSTCA9IGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9IRUFEL2NvbW11bml0eS1wbHVnaW5zLmpzb25gO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoeyB1cmw6IHBsdWdpbkxpc3RVUkwgfSk7XHJcbiAgICAgICAgcmV0dXJuIChyZXNwb25zZSA9PT0gXCI0MDQ6IE5vdCBGb3VuZFwiID8gbnVsbCA6IGF3YWl0IEpTT04ucGFyc2UocmVzcG9uc2UpKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnJvciBpbiBncmFiQ29tbW11bml0eVBsdWdpbkxpc3RcIiwgZXJyb3IpXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBncmFiQ29tbW11bml0eVRoZW1lc0xpc3QgPSBhc3luYyAoKTogUHJvbWlzZTxKU09OPiA9PiB7XHJcbiAgICBjb25zdCB0aGVtZXNVUkwgPSBgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29ic2lkaWFubWQvb2JzaWRpYW4tcmVsZWFzZXMvSEVBRC9jb21tdW5pdHktY3NzLXRoZW1lcy5qc29uYDtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0KHsgdXJsOiB0aGVtZXNVUkwgfSk7XHJcbiAgICAgICAgcmV0dXJuIChyZXNwb25zZSA9PT0gXCI0MDQ6IE5vdCBGb3VuZFwiID8gbnVsbCA6IGF3YWl0IEpTT04ucGFyc2UocmVzcG9uc2UpKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnJvciBpbiBncmFiQ29tbW11bml0eVRoZW1lc0xpc3RcIiwgZXJyb3IpXHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY29uc3QgZ3JhYkNvbW1tdW5pdHlUaGVtZU9ic2lkaWFuQ3NzID0gYXN5bmMgKHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xyXG4gICAgY29uc3QgdGhlbWVzVVJMID0gYGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8ke3JlcG9zaXRvcnlQYXRofS9IRUFEL29ic2lkaWFuLmNzc2A7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdCh7IHVybDogdGhlbWVzVVJMIH0pO1xyXG4gICAgICAgIHJldHVybiAocmVzcG9uc2UgPT09IFwiNDA0OiBOb3QgRm91bmRcIiA/IG51bGwgOiByZXNwb25zZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgaW4gZ3JhYkNvbW1tdW5pdHlUaGVtZXNMaXN0XCIsIGVycm9yKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ3JhYkxhc3RDb21taXRJbmZvRm9yQUZpbGUgPSBhc3luYyAocmVwb3NpdG9yeVBhdGg6IHN0cmluZywgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcclxuICAgIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7cmVwb3NpdG9yeVBhdGh9L2NvbW1pdHM/cGF0aD0ke3BhdGh9JnBhZ2U9MSZwZXJfcGFnZT0xYDtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0KHsgdXJsOiB1cmwgfSk7XHJcbiAgICAgICAgcmV0dXJuIChyZXNwb25zZSA9PT0gXCI0MDQ6IE5vdCBGb3VuZFwiID8gbnVsbCA6IEpTT04ucGFyc2UocmVzcG9uc2UpKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnJvciBpbiBncmFiQ29tbW11bml0eVRoZW1lc0xpc3RcIiwgZXJyb3IpXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBncmFiTGFzdENvbW1pdERhdGVGb3JBRmlsZSA9IGFzeW5jIChyZXBvc2l0b3J5UGF0aDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xyXG4gICAgY29uc3QgdGVzdCA9IGF3YWl0IGdyYWJMYXN0Q29tbWl0SW5mb0ZvckFGaWxlKHJlcG9zaXRvcnlQYXRoLCBwYXRoKTtcclxuICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgaWYodGVzdFswXS5jb21taXQuY29tbWl0dGVyLmRhdGUpe1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIHJldHVybiB0ZXN0WzBdLmNvbW1pdC5jb21taXR0ZXIuZGF0ZVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICAgIHJldHVybiBcIlwiO1xyXG59XHJcbiIsICJpbXBvcnQgeyBncmFiTGFzdENvbW1pdERhdGVGb3JBRmlsZSB9IGZyb20gXCIuLi9mZWF0dXJlcy9naXRodWJVdGlsc1wiO1xyXG5pbXBvcnQgVGhlUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRoZW1lSW5mb3JhbXRpb24ge1xyXG4gICAgcmVwbzogc3RyaW5nO1xyXG4gICAgbGFzdFVwZGF0ZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICAgIHBsdWdpbkxpc3Q6IHN0cmluZ1tdO1xyXG4gICAgdGhlbWVzTGlzdDogVGhlbWVJbmZvcmFtdGlvbltdO1xyXG4gICAgdXBkYXRlQXRTdGFydHVwOiBib29sZWFuO1xyXG4gICAgdXBkYXRlVGhlbWVzQXRTdGFydHVwOiAgYm9vbGVhbjtcclxuICAgIHJpYmJvbkljb25FbmFibGVkOiBib29sZWFuO1xyXG4gICAgbG9nZ2luZ0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICBsb2dnaW5nUGF0aDogc3RyaW5nO1xyXG4gICAgbG9nZ2luZ1ZlcmJvc2VFbmFibGVkOiBib29sZWFuO1xyXG4gICAgZGVidWdnaW5nTW9kZTogYm9vbGVhbjtcclxuICAgIG5vdGlmaWNhdGlvbnNFbmFibGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogU2V0dGluZ3MgPSB7XHJcbiAgICBwbHVnaW5MaXN0OiBbXSxcclxuICAgIHRoZW1lc0xpc3Q6IFtdLFxyXG4gICAgdXBkYXRlQXRTdGFydHVwOiBmYWxzZSxcclxuICAgIHVwZGF0ZVRoZW1lc0F0U3RhcnR1cDogZmFsc2UsXHJcbiAgICByaWJib25JY29uRW5hYmxlZDogdHJ1ZSxcclxuICAgIGxvZ2dpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgIGxvZ2dpbmdQYXRoOiBcIkJSQVQtbG9nXCIsXHJcbiAgICBsb2dnaW5nVmVyYm9zZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgZGVidWdnaW5nTW9kZTogdHJ1ZSxcclxuICAgIG5vdGlmaWNhdGlvbnNFbmFibGVkOiB0cnVlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgcGx1Z2luIGZvciBiZXRhIHRlc3RpbmcgdG8gdGhlIGRhdGEuanNvbiBmaWxlIG9mIHRoaXMgIHBsdWdpblxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgIHBsdWdpbiAgICAgICAgIFxyXG4gKiBAcGFyYW0gICB7c3RyaW5nPHZvaWQ+fSAgIHJlcG9zaXRvcnlQYXRoICBwYXRoIHRvIHRoZSBHaXRIdWIgcmVwb3NpdG9yeVxyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTx2b2lkPn0gICAgICAgICAgICAgICAgICBcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRCZXRhUGx1Z2luVG9MaXN0KHBsdWdpbjogVGhlUGx1Z2luLCByZXBvc2l0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXBsdWdpbi5zZXR0aW5ncy5wbHVnaW5MaXN0LmNvbnRhaW5zKHJlcG9zaXRvcnlQYXRoKSkge1xyXG4gICAgICAgIHBsdWdpbi5zZXR0aW5ncy5wbHVnaW5MaXN0LnVuc2hpZnQocmVwb3NpdG9yeVBhdGgpO1xyXG4gICAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmICBhICBwbHVnaW4gIGlzIGluIGRhdGEuanNvblxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgICAgIHBsdWdpbiAgICAgICAgICBcclxuICogQHBhcmFtICAge3N0cmluZzxib29sZWFuPn0gICByZXBvc2l0b3J5UGF0aCAgcGF0aCB0byB0aGUgR2l0SHViIHJlcG9zaXRvcnlcclxuICpcclxuICogQHJldHVybiAge1Byb21pc2U8Ym9vbGVhbj59ICB0cnVlIGlmIGV4aXN0cyAgICAgIFxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4aXN0QmV0YVBsdWdpbkluTGlzdChwbHVnaW46IFRoZVBsdWdpbiwgcmVwb3NpdG9yeVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHBsdWdpbi5zZXR0aW5ncy5wbHVnaW5MaXN0LmNvbnRhaW5zKHJlcG9zaXRvcnlQYXRoKTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgdGhlbWUgZm9yIGJldGEgdGVzdGluZyB0byB0aGUgZGF0YS5qc29uIGZpbGUgb2YgdGhpcyAgcGx1Z2luXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICAgICAgcGx1Z2luICAgICAgICAgXHJcbiAqIEBwYXJhbSAgIHtzdHJpbmc8dm9pZD59ICAgcmVwb3NpdG9yeVBhdGggIHBhdGggdG8gdGhlIEdpdEh1YiByZXBvc2l0b3J5XHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPHZvaWQ+fSAgICAgICAgICAgICAgICAgIFxyXG4gKi9cclxuIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRCZXRhVGhlbWVUb0xpc3QocGx1Z2luOiBUaGVQbHVnaW4sIHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICBjb25zdCBuZXdUaGVtZTogVGhlbWVJbmZvcmFtdGlvbiA9IHsgXHJcbiAgICAgICAgIHJlcG86IHJlcG9zaXRvcnlQYXRoLCBcclxuICAgICAgICAgbGFzdFVwZGF0ZTogYXdhaXQgZ3JhYkxhc3RDb21taXREYXRlRm9yQUZpbGUocmVwb3NpdG9yeVBhdGgsIFwib2JzaWRpYW4uY3NzXCIpXHJcbiAgICB9XHJcbiAgICBwbHVnaW4uc2V0dGluZ3MudGhlbWVzTGlzdC51bnNoaWZ0KG5ld1RoZW1lKTtcclxuICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIGEgIHRoZW1lICBpcyBpbiBkYXRhLmpzb25cclxuICpcclxuICogQHBhcmFtICAge1RoZVBsdWdpbn0gICAgICAgICBwbHVnaW4gICAgICAgICAgXHJcbiAqIEBwYXJhbSAgIHtzdHJpbmc8Ym9vbGVhbj59ICAgcmVwb3NpdG9yeVBhdGggIHBhdGggdG8gdGhlIEdpdEh1YiByZXBvc2l0b3J5XHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPGJvb2xlYW4+fSAgdHJ1ZSBpZiBleGlzdHMgICAgICBcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGlzdEJldGFUaGVtZWluSW5MaXN0KHBsdWdpbjogVGhlUGx1Z2luLCByZXBvc2l0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCB0ZXN0SWZUaGVtRXhpc3RzID0gcGx1Z2luLnNldHRpbmdzLnRoZW1lc0xpc3QuZmluZCh0PT4gdC5yZXBvID09PSByZXBvc2l0b3J5UGF0aCk7XHJcbiAgICByZXR1cm4gdGVzdElmVGhlbUV4aXN0cyA/IHRydWUgOiBmYWxzZTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBVcGRhdGUgdGhlIGxhc3RVcGF0ZSBmaWVsZCBmb3IgdGhlIHRoZW1lXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICAgICAgICAgcGx1Z2luICAgICAgICAgIFxyXG4gKiBAcGFyYW0gICB7c3RyaW5nPGJvb2xlYW4+fSAgIHJlcG9zaXRvcnlQYXRoICBwYXRoIHRvIHRoZSBHaXRIdWIgcmVwb3NpdG9yeVxyXG4gKiBAcGFyYW0gICB7c3RyaW5nPG5ld0RhdGU+fSAgIG5ld0RhdGUgIGxhc3QgdXBkYXRlIGZvciB0aGlzIHRoZW1lXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPGJvb2xlYW4+fSAgdHJ1ZSBpZiBleGlzdHMgICAgICBcclxuICovXHJcbiBleHBvcnQgZnVuY3Rpb24gdXBkYXRlQmV0YVRoZW1lTGFzdFVwZGF0ZURhdGUocGx1Z2luOiBUaGVQbHVnaW4sIHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIG5ld0RhdGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgcGx1Z2luLnNldHRpbmdzLnRoZW1lc0xpc3QuZm9yRWFjaCh0PT57XHJcbiAgICAgICAgaWYodC5yZXBvID09PSByZXBvc2l0b3J5UGF0aCkge1xyXG4gICAgICAgICAgICB0Lmxhc3RVcGRhdGUgPSBuZXdEYXRlO1xyXG4gICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxufVxyXG5cclxuIiwgImltcG9ydCB7IE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgVGhlUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcblxyXG4vKipcclxuICogRGlzcGxheXMgYSBub3RpY2UgdG8gdGhlIHVzZXJcclxuICpcclxuICogQHBhcmFtICAge1RoZVBsdWdpbn0gIHBsdWdpbiAgICAgICAgICAgIFBsdWdpbiBvYmplY3RcclxuICogQHBhcmFtICAge3N0cmluZ30gICAgIG1zZyAgICAgICAgICAgICAgIHRleHQgdG8gZGlzcGxheSB0byB0aGUgdXNlclxyXG4gKiBAcGFyYW0gICB7W3R5cGVdfSAgICAgdmVyYm9zZUxvZ2dpbmdPbiAgVHJ1ZSBpZiBzaG91bGQgb25seSBiZSBsb2dnZWQgaWYgdmVyYm9zZSBsb2dnaW5nIGlzIGVuYWJsZWRcclxuICpcclxuICogQHJldHVybiAge3ZvaWR9ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFRvYXN0TWVzc2FnZShwbHVnaW46IFRoZVBsdWdpbiwgbXNnOiBzdHJpbmcsIHRpbWVvdXRJblNlY29uZHMgPSAxMCwgY29udGV4dE1lbnVDYWxsYmFjayA9IG51bGwpOiB2b2lkIHtcclxuICAgIGlmKHBsdWdpbi5zZXR0aW5ncy5ub3RpZmljYXRpb25zRW5hYmxlZD09PWZhbHNlKSByZXR1cm47XHJcbiAgICBjb25zdCBhZGRpdGlvbmFsSW5mbyA9IGNvbnRleHRNZW51Q2FsbGJhY2sgPyBcIihjbGljaz1kaXNtaXNzLCByaWdodC1jbGljaz1JbmZvKVwiIDogXCJcIjtcclxuICAgIGNvbnN0IG5ld05vdGljZTogTm90aWNlID0gbmV3IE5vdGljZShgQlJBVFxcbiR7bXNnfVxcbiR7YWRkaXRpb25hbEluZm99YCwgdGltZW91dEluU2Vjb25kcyoxMDAwKTtcclxuICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgaWYoY29udGV4dE1lbnVDYWxsYmFjaykgbmV3Tm90aWNlLm5vdGljZUVsLm9uY29udGV4dG1lbnUgPSBhc3luYyAoKSA9PiB7IGNvbnRleHRNZW51Q2FsbGJhY2soKSB9O1xyXG59IiwgIlxyXG4vKipcclxuICogVGVzdHMgaWYgdGhlcmUgaXMgYW4gaW50ZXJuZXQgY29ubmVjdGlvblxyXG4gKiBAcmV0dXJucyB0cnVlIGlmIGNvbm5lY3RlZCwgZmFsc2UgaWYgbm8gaW50ZXJuZXRcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0Nvbm5lY3RlZFRvSW50ZXJuZXQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IG9ubGluZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9vYnNpZGlhbi5tZC8/XCIgKyBNYXRoLnJhbmRvbSgpKTtcclxuICAgICAgICByZXR1cm4gb25saW5lLnN0YXR1cyA+PSAyMDAgJiYgb25saW5lLnN0YXR1cyA8IDMwMDtcclxuICAgIH0gY2F0Y2goZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59IiwgImltcG9ydCB7IE1vZGFsLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyB0aGVtZUluc3RhbGxUaGVtZSwgdGhlbWVzRGVyaXZlQmV0YU5hbWVGcm9tUmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZlYXR1cmVzL3RoZW1lcyc7XHJcbmltcG9ydCBUaGVQbHVnaW4gZnJvbSAnLi4vbWFpbic7XHJcbmltcG9ydCB7IFRvYXN0TWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL25vdGlmaWNhdGlvbnMnO1xyXG5pbXBvcnQgeyBhZGRCZXRhVGhlbWVUb0xpc3QsIGV4aXN0QmV0YVRoZW1laW5Jbkxpc3QgfSBmcm9tICcuL3NldHRpbmdzJztcclxuXHJcbi8qKlxyXG4gKiBBZGQgYSBiZXRhIHRoZW1lIHRvIHRoZSBsaXN0IG9mIHBsdWdpbnMgYmVpbmcgdHJhY2tlZCBhbmQgdXBkYXRlZFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRkTmV3VGhlbWUgZXh0ZW5kcyBNb2RhbCB7XHJcbiAgICBwbHVnaW46IFRoZVBsdWdpbjtcclxuICAgIGFkZHJlc3M6IHN0cmluZztcclxuICAgIG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHM6IGJvb2xlYW47XHJcblxyXG4gICAgY29uc3RydWN0b3IocGx1Z2luOiBUaGVQbHVnaW4sIG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMgPSBmYWxzZSkge1xyXG4gICAgICAgIHN1cGVyKHBsdWdpbi5hcHApO1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5vcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzID0gb3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdWJtaXRGb3JtKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICh0aGlzLmFkZHJlc3MgPT09IFwiXCIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBzY3J1YmJlZEFkZHJlc3MgPSB0aGlzLmFkZHJlc3MucmVwbGFjZShcImh0dHBzOi8vZ2l0aHViLmNvbS9cIiwgXCJcIik7XHJcbiAgICAgICAgaWYgKGF3YWl0IGV4aXN0QmV0YVRoZW1laW5Jbkxpc3QodGhpcy5wbHVnaW4sIHNjcnViYmVkQWRkcmVzcykpIHtcclxuICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgVGhpcyBwbHVnaW4gaXMgYWxyZWFkeSBpbiB0aGUgbGlzdCBmb3IgYmV0YSB0ZXN0aW5nYCwgMTApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKGF3YWl0IHRoZW1lSW5zdGFsbFRoZW1lKHRoaXMucGx1Z2luLCBzY3J1YmJlZEFkZHJlc3MsIHRoZW1lc0Rlcml2ZUJldGFOYW1lRnJvbVJlcG9zaXRvcnkoc2NydWJiZWRBZGRyZXNzKSkpIHtcclxuICAgICAgICAgICAgYXdhaXQgYWRkQmV0YVRoZW1lVG9MaXN0KHRoaXMucGx1Z2luLCBzY3J1YmJlZEFkZHJlc3MpO1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7ICAgIFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbk9wZW4oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50RWwuY3JlYXRlRWwoJ2g0JywgeyB0ZXh0OiBcIkdpdGh1YiByZXBvc2l0b3J5IGZvciBiZXRhIHRoZW1lOlwiIH0pO1xyXG4gICAgICAgIHRoaXMuY29udGVudEVsLmNyZWF0ZUVsKCdmb3JtJywge30sIChmb3JtRWwpID0+IHtcclxuICAgICAgICAgICAgbmV3IFNldHRpbmcoZm9ybUVsKVxyXG4gICAgICAgICAgICAgICAgLmFkZFRleHQoKHRleHRFbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHRFbC5zZXRQbGFjZWhvbGRlcignUmVwb3NpdG9yeSAoZXhhbXBsZTogR2l0dWJVc2VyTmFtZS9yZXBvc2l0b3J5LW5hbWUnKTtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzcyA9IHZhbHVlLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgYXN5bmMgKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmIHRoaXMuYWRkcmVzcyAhPT0gJyAnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN1Ym1pdEZvcm0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHRFbC5pbnB1dEVsLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2V0dGluZy1pdGVtLWluZm9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aXRsZSkgdGl0bGUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbC5pbnB1dEVsLmZvY3VzKClcclxuICAgICAgICAgICAgICAgICAgICB9LCAxMCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGZvcm1FbC5jcmVhdGVEaXYoJ21vZGFsLWJ1dHRvbi1jb250YWluZXInLCAoYnV0dG9uQ29udGFpbmVyRWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lckVsXHJcbiAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUVsKCdidXR0b24nLCB7IGF0dHI6IHsgdHlwZTogJ2J1dHRvbicgfSwgdGV4dDogJ05ldmVyIG1pbmQnIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKTtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lckVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0cjogeyB0eXBlOiAnc3VibWl0JyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGNsczogJ21vZC1jdGEnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdBZGQgVGhlbWUnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gaW52b2tlZCB3aGVuIGJ1dHRvbiBpcyBjbGlja2VkLiBcclxuICAgICAgICAgICAgZm9ybUVsLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGFzeW5jIChlOiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRkcmVzcyAhPT0gJycpIGF3YWl0IHRoaXMuc3VibWl0Rm9ybSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICh0aGlzLm9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMpIHtcclxuICAgICAgICAgICAgYXdhaXQgKHRoaXMucGx1Z2luIGFzIGFueSkuYXBwLnNldHRpbmcub3BlbigpO1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5wbHVnaW4gYXMgYW55KS5hcHAuc2V0dGluZy5vcGVuVGFiQnlJZChcIm9ic2lkaWFuNDItYnJhdFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59IiwgImltcG9ydCB7IE1vZGFsLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgQmV0YVBsdWdpbnMgZnJvbSAnLi4vZmVhdHVyZXMvQmV0YVBsdWdpbnMnO1xyXG5pbXBvcnQgVGhlUGx1Z2luIGZyb20gJy4uL21haW4nO1xyXG5pbXBvcnQgeyBUb2FzdE1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9ub3RpZmljYXRpb25zJztcclxuaW1wb3J0IHsgZXhpc3RCZXRhUGx1Z2luSW5MaXN0IH0gZnJvbSAnLi9zZXR0aW5ncyc7XHJcblxyXG4vKipcclxuICogQWRkIGEgYmV0YSBwbHVnaW4gdG8gdGhlIGxpc3Qgb2YgcGx1Z2lucyBiZWluZyB0cmFja2VkIGFuZCB1cGRhdGVkXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZGROZXdQbHVnaW5Nb2RhbCBleHRlbmRzIE1vZGFsIHtcclxuICAgIHBsdWdpbjogVGhlUGx1Z2luO1xyXG4gICAgYmV0YVBsdWdpbnM6IEJldGFQbHVnaW5zO1xyXG4gICAgYWRkcmVzczogc3RyaW5nO1xyXG4gICAgb3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkczogYm9vbGVhbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IFRoZVBsdWdpbiwgYmV0YVBsdWdpbnM6IEJldGFQbHVnaW5zLCBvcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzID0gZmFsc2UpIHtcclxuICAgICAgICBzdXBlcihwbHVnaW4uYXBwKTtcclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgICAgICB0aGlzLmJldGFQbHVnaW5zID0gYmV0YVBsdWdpbnM7XHJcbiAgICAgICAgdGhpcy5hZGRyZXNzID0gXCJcIjtcclxuICAgICAgICB0aGlzLm9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMgPSBvcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHN1Ym1pdEZvcm0oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWRkcmVzcyA9PT0gXCJcIikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHNjcnViYmVkQWRkcmVzcyA9IHRoaXMuYWRkcmVzcy5yZXBsYWNlKFwiaHR0cHM6Ly9naXRodWIuY29tL1wiLFwiXCIpO1xyXG4gICAgICAgIGlmIChhd2FpdCBleGlzdEJldGFQbHVnaW5Jbkxpc3QodGhpcy5wbHVnaW4sIHNjcnViYmVkQWRkcmVzcykpIHtcclxuICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgVGhpcyBwbHVnaW4gaXMgYWxyZWFkeSBpbiB0aGUgbGlzdCBmb3IgYmV0YSB0ZXN0aW5nYCwgMTApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYmV0YVBsdWdpbnMuYWRkUGx1Z2luKHNjcnViYmVkQWRkcmVzcyk7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uT3BlbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbnRlbnRFbC5jcmVhdGVFbCgnaDQnLCB7IHRleHQ6IFwiR2l0aHViIHJlcG9zaXRvcnkgZm9yIGJldGEgcGx1Z2luOlwiIH0pO1xyXG4gICAgICAgIHRoaXMuY29udGVudEVsLmNyZWF0ZUVsKCdmb3JtJywge30sIChmb3JtRWwpID0+IHtcclxuICAgICAgICAgICAgbmV3IFNldHRpbmcoZm9ybUVsKVxyXG4gICAgICAgICAgICAgICAgLmFkZFRleHQoKHRleHRFbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHRFbC5zZXRQbGFjZWhvbGRlcignUmVwb3NpdG9yeSAoZXhhbXBsZTogVGZUSGFja2VyL29ic2lkaWFuLWJyYXQnKTtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzcyA9IHZhbHVlLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgYXN5bmMgKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmIHRoaXMuYWRkcmVzcyAhPT0gJyAnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN1Ym1pdEZvcm0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHRFbC5pbnB1dEVsLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2V0dGluZy1pdGVtLWluZm9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aXRsZSkgdGl0bGUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbC5pbnB1dEVsLmZvY3VzKClcclxuICAgICAgICAgICAgICAgICAgICB9LCAxMCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGZvcm1FbC5jcmVhdGVEaXYoJ21vZGFsLWJ1dHRvbi1jb250YWluZXInLCAoYnV0dG9uQ29udGFpbmVyRWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lckVsXHJcbiAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUVsKCdidXR0b24nLCB7IGF0dHI6IHsgdHlwZTogJ2J1dHRvbicgfSwgdGV4dDogJ05ldmVyIG1pbmQnIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKTtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lckVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0cjogeyB0eXBlOiAnc3VibWl0JyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGNsczogJ21vZC1jdGEnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdBZGQgUGx1Z2luJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIGludm9rZWQgd2hlbiBidXR0b24gaXMgY2xpY2tlZC4gXHJcbiAgICAgICAgICAgIGZvcm1FbC5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBhc3luYyAoZTogRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZHJlc3MgIT09ICcnKSBhd2FpdCB0aGlzLnN1Ym1pdEZvcm0oKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGFzeW5jIG9uQ2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYodGhpcy5vcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzKSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLnBsdWdpbiBhcyBhbnkpLmFwcC5zZXR0aW5nLm9wZW4oKTtcclxuICAgICAgICAgICAgYXdhaXQgKHRoaXMucGx1Z2luIGFzIGFueSkuYXBwLnNldHRpbmcub3BlblRhYkJ5SWQoXCJvYnNpZGlhbjQyLWJyYXRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSIsICJpbXBvcnQgVGhlUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCBBZGROZXdQbHVnaW5Nb2RhbCBmcm9tIFwiLi4vdWkvQWRkTmV3UGx1Z2luTW9kYWxcIjtcclxuaW1wb3J0IHsgZ3JhYk1hbmlmZXN0SnNvbkZyb21SZXBvc2l0b3J5LCBncmFiUmVsZWFzZUZpbGVGcm9tUmVwb3NpdG9yeSB9IGZyb20gXCIuL2dpdGh1YlV0aWxzXCI7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGgsIFBsdWdpbk1hbmlmZXN0LCBOb3RpY2UgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgYWRkQmV0YVBsdWdpblRvTGlzdCB9IGZyb20gXCIuLi91aS9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBUb2FzdE1lc3NhZ2UgfSBmcm9tIFwiLi4vdXRpbHMvbm90aWZpY2F0aW9uc1wiO1xyXG5pbXBvcnQgeyBpc0Nvbm5lY3RlZFRvSW50ZXJuZXQgfSBmcm9tIFwiLi4vdXRpbHMvaW50ZXJuZXRjb25uZWN0aW9uXCI7XHJcblxyXG4vKipcclxuICogYWxsIHRoZSBmaWxlcyBuZWVkZWQgZm9yIGEgcGx1Z2luIGJhc2VkIG9uIHRoZSByZWxlYXNlIGZpbGVzIGFyZSBocmVcclxuICovXHJcbmludGVyZmFjZSBSZWxlYXNlRmlsZXMge1xyXG4gICAgbWFpbkpzOiBzdHJpbmc7XHJcbiAgICBtYW5pZmVzdDogc3RyaW5nO1xyXG4gICAgc3R5bGVzOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcmltYXJ5IGhhbmRsZXIgZm9yIGFkZGluZywgdXBkYXRpbmcsIGRlbGV0aW5nIGJldGEgcGx1Z2lucyB0cmFja2VkIGJ5IHRoaXMgcGx1Z2luXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCZXRhUGx1Z2lucyB7XHJcbiAgICBwbHVnaW46IFRoZVBsdWdpbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IFRoZVBsdWdpbikge1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogb3BlbnMgdGhlIEFkZE5ld1BsdWdpbk1vZGFsIHRvIGdldCBpbmZvIGZvciAgYSBuZXcgYmV0YSBwbHVnaW5cclxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgIG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMgd2lsbCBvcGVuIHNldHRpbmdzIHNjcmVlbiBhZnRlcndhcmRzLiBVc2VkIHdoZW4gdGhpcyBjb21tYW5kIGlzIGNhbGxlZCBmcm9tIHNldHRpbmdzIHRhYlxyXG4gICAgICogQHJldHVybiAgezxQcm9taXNlPjx2b2lkPn1cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZGlzcGxheUFkZE5ld1BsdWdpbk1vZGFsKG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMgPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IG5ld1BsdWdpbiA9IG5ldyBBZGROZXdQbHVnaW5Nb2RhbCh0aGlzLnBsdWdpbiwgdGhpcywgb3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcyk7XHJcbiAgICAgICAgbmV3UGx1Z2luLm9wZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXRlcyB0aGF0IGEgR2l0SHViIHJlcG9zaXRvcnkgaXMgcGx1Z2luXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5UGF0aCAgIEdpdGh1YlVzZXIvUmVwb3NpdG9yeU5hbWUgKGV4YW1wbGU6IFRmVGhhY2tlci9vYnNpZGlhbjQyLWJyYXQpXHJcbiAgICAgKiBAcGFyYW0gICB7W3R5cGVdfSAgICAgICAgICAgICAgICAgICAgIGdldEJldGFNYW5pZmVzdCAgdGVzdCB0aGUgYmV0YSB2ZXJzaW9uIG9mIHRoZSBtYW5pZmVzdCwgbm90IGF0IHRoZSByb290XHJcbiAgICAgKiBAcGFyYW0gICB7W3R5cGVdfSAgICAgICAgICAgICAgICAgICAgIGZhbHNlICAgICAgICAgICAgW2ZhbHNlIGRlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtICAge1t0eXBlXX0gICAgICAgICAgICAgICAgICAgICByZXBvcnRJc3N1ZXMgICAgICB3aWxsIGRpc3BsYXkgbm90aWNlcyBhcyBpdCBmaW5kcyBpc3N1ZXNcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuICB7UHJvbWlzZTxQbHVnaW5NYW5pZmVzdD59ICAgICAgICAgICAgICAgICAgICAgdGhlIG1hbmlmZXN0IGZpbGUgaWYgZm91bmQsIG9yIG51bGwgaWYgaXRzIGluY29tcGxldGVcclxuICAgICAqL1xyXG4gICAgYXN5bmMgdmFsaWRhdGVSZXBvc2l0b3J5KHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIGdldEJldGFNYW5pZmVzdCA9IGZhbHNlLCByZXBvcnRJc3N1ZXMgPSBmYWxzZSk6IFByb21pc2U8UGx1Z2luTWFuaWZlc3Q+IHtcclxuICAgICAgICBjb25zdCBub3RpY2VUaW1lb3V0ID0gMTU7XHJcbiAgICAgICAgY29uc3QgbWFuaWZlc3RKc29uID0gYXdhaXQgZ3JhYk1hbmlmZXN0SnNvbkZyb21SZXBvc2l0b3J5KHJlcG9zaXRvcnlQYXRoLCAhZ2V0QmV0YU1hbmlmZXN0KTtcclxuICAgICAgICBpZiAoIW1hbmlmZXN0SnNvbikgeyAvLyB0aGlzIGlzIGEgcGx1Z2luIHdpdGggYSBtYW5pZmVzdCBqc29uLCB0cnkgdG8gc2VlIGlmIHRoZXJlIGlzIGEgYmV0YSB2ZXJzaW9uXHJcbiAgICAgICAgICAgIGlmIChyZXBvcnRJc3N1ZXMpIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYCR7cmVwb3NpdG9yeVBhdGh9XFxuVGhpcyBkb2VzIG5vdCBzZWVtIHRvIGJlIGFuIG9ic2lkaWFuIHBsdWdpbiwgYXMgdGhlcmUgaXMgbm8gbWFuaWZlc3QuanNvbiBmaWxlLmAsIG5vdGljZVRpbWVvdXQpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBtYWluZmVzdCBoYXMgc29tZSBrZXkgZWxlbWVudHMsIGxpa2UgSUQgYW5kIHZlcnNpb25cclxuICAgICAgICBpZiAoIShcImlkXCIgaW4gbWFuaWZlc3RKc29uKSkgeyAvLyB0aGlzIGlzIGEgcGx1Z2luIHdpdGggYSBtYW5pZmVzdCBqc29uLCB0cnkgdG8gc2VlIGlmIHRoZXJlIGlzIGEgYmV0YSB2ZXJzaW9uXHJcbiAgICAgICAgICAgIGlmIChyZXBvcnRJc3N1ZXMpIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbixgJHtyZXBvc2l0b3J5UGF0aH1cXG5UaGUgcGx1Z2luIGlkIGF0dHJpYnV0ZSBmb3IgdGhlIHJlbGVhc2UgaXMgbWlzc2luZyBmcm9tIHRoZSBtYW5pZmVzdCBmaWxlYCwgbm90aWNlVGltZW91dCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIShcInZlcnNpb25cIiBpbiBtYW5pZmVzdEpzb24pKSB7IC8vIHRoaXMgaXMgYSBwbHVnaW4gd2l0aCBhIG1hbmlmZXN0IGpzb24sIHRyeSB0byBzZWUgaWYgdGhlcmUgaXMgYSBiZXRhIHZlcnNpb25cclxuICAgICAgICAgICAgaWYgKHJlcG9ydElzc3VlcykgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLGAke3JlcG9zaXRvcnlQYXRofVxcblRoZSB2ZXJzaW9uIGF0dHJpYnV0ZSBmb3IgdGhlIHJlbGVhc2UgaXMgbWlzc2luZyBmcm9tIHRoZSBtYW5pZmVzdCBmaWxlYCwgbm90aWNlVGltZW91dCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWFuaWZlc3RKc29uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgdGhlIHJlbGVzZSBmaWxlcyBiYXNlZCBvbiB0aGUgdmVyc2lvbiBudW1iZXIgaW4gdGhlIG1hbmlmZXN0XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5UGF0aCAgcGF0aCB0byB0aGUgR2l0SHViIHJlcG9zaXRvcnlcclxuICAgICAqIEBwYXJhbSAgIHtQbHVnaW5NYW5pZmVzdDxSZWxlYXNlRmlsZXM+fSAgbWFuaWZlc3QgICAgICAgIG1hbmlmZXN0IGZpbGVcclxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFuaWZlc3QgICAgIGdyYWIgdGhlIHJlbW90ZSBtYW5pZmVzdCBmaWxlXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiAge1Byb21pc2U8UmVsZWFzZUZpbGVzPn0gICAgICAgICAgICAgICAgICAgICAgICAgYWxsIHJlbGFzZSBmaWxlcyBhcyBzdHJpbmdzIGJhc2VkIG9uIHRoZSBSZWxlYXNlRmlsZXMgaW50ZXJhZmFjZVxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRBbGxSZWxlYXNlRmlsZXMocmVwb3NpdG9yeVBhdGg6IHN0cmluZywgbWFuaWZlc3Q6IFBsdWdpbk1hbmlmZXN0LCBnZXRNYW5pZmVzdDogYm9vbGVhbik6IFByb21pc2U8UmVsZWFzZUZpbGVzPiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbWFpbkpzOiBhd2FpdCBncmFiUmVsZWFzZUZpbGVGcm9tUmVwb3NpdG9yeShyZXBvc2l0b3J5UGF0aCwgbWFuaWZlc3QudmVyc2lvbiwgXCJtYWluLmpzXCIpLFxyXG4gICAgICAgICAgICBtYW5pZmVzdDogZ2V0TWFuaWZlc3QgPyBhd2FpdCBncmFiUmVsZWFzZUZpbGVGcm9tUmVwb3NpdG9yeShyZXBvc2l0b3J5UGF0aCwgbWFuaWZlc3QudmVyc2lvbiwgXCJtYW5pZmVzdC5qc29uXCIpIDogbnVsbCxcclxuICAgICAgICAgICAgc3R5bGVzOiBhd2FpdCBncmFiUmVsZWFzZUZpbGVGcm9tUmVwb3NpdG9yeShyZXBvc2l0b3J5UGF0aCwgbWFuaWZlc3QudmVyc2lvbiwgXCJzdHlsZXMuY3NzXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JpdGVzIHRoZSBwbHVnaW4gcmVsZWFzZSBmaWxlcyB0byB0aGUgbG9jYWwgb2JzaWRpYW4gLnBsdWdpbnMgZm9sZGVyXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgICAgIGJldGFQbHVnaW5JRCAgdGhlIGlkIG9mIHRoZSBwbHVnaW4gKG5vdCB0aGUgcmVwb3NpdG9yeSBwYXRoKVxyXG4gICAgICogQHBhcmFtICAge1JlbGVhc2VGaWxlczx2b2lkPn0gIHJlbEZpbGVzICAgICAgcmVsZWFzZSBmaWxlIGFzIHN0cmluZ3MsIGJhc2VkIG9uIHRoZSBSZWxlYXNlRmlsZXMgaW50ZXJmYWNlXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiAge1Byb21pc2U8dm9pZD59ICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdyaXRlUmVsZWFzZUZpbGVzVG9QbHVnaW5Gb2xkZXIoYmV0YVBsdWdpbklEOiBzdHJpbmcsIHJlbEZpbGVzOiBSZWxlYXNlRmlsZXMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBwbHVnaW5UYXJnZXRGb2xkZXJQYXRoID0gbm9ybWFsaXplUGF0aCh0aGlzLnBsdWdpbi5hcHAudmF1bHQuY29uZmlnRGlyICsgXCIvcGx1Z2lucy9cIiArIGJldGFQbHVnaW5JRCkgKyBcIi9cIjtcclxuICAgICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5wbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXI7XHJcbiAgICAgICAgaWYgKGF3YWl0IGFkYXB0ZXIuZXhpc3RzKHBsdWdpblRhcmdldEZvbGRlclBhdGgpID09PSBmYWxzZSB8fFxyXG4gICAgICAgICAgICAhKGF3YWl0IGFkYXB0ZXIuZXhpc3RzKHBsdWdpblRhcmdldEZvbGRlclBhdGggKyBcIm1hbmlmZXN0Lmpzb25cIikpKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHBsdWdpbiBmb2xkZXIgZG9lc250IGV4aXN0IG9yIG1hbmlmZXN0Lmpzb24gZG9lc24ndCBleGlzdCwgY3JlYXRlIGl0IGFuZCBzYXZlIHRoZSBwbHVnaW4gZmlsZXNcclxuICAgICAgICAgICAgYXdhaXQgYWRhcHRlci5ta2RpcihwbHVnaW5UYXJnZXRGb2xkZXJQYXRoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgYWRhcHRlci53cml0ZShwbHVnaW5UYXJnZXRGb2xkZXJQYXRoICsgXCJtYWluLmpzXCIsIHJlbEZpbGVzLm1haW5Kcyk7XHJcbiAgICAgICAgYXdhaXQgYWRhcHRlci53cml0ZShwbHVnaW5UYXJnZXRGb2xkZXJQYXRoICsgXCJtYW5pZmVzdC5qc29uXCIsIHJlbEZpbGVzLm1hbmlmZXN0KTtcclxuICAgICAgICBpZiAocmVsRmlsZXMuc3R5bGVzKSBhd2FpdCBhZGFwdGVyLndyaXRlKHBsdWdpblRhcmdldEZvbGRlclBhdGggKyBcInN0eWxlcy5jc3NcIiwgcmVsRmlsZXMuc3R5bGVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaW1hcnkgZnVuY3Rpb24gZm9yIGFkZGluZyBhIG5ldyBiZXRhIHBsdWdpbiB0byBvYnNpZGlhbi4gQWxzbyB0aGlzIGZ1bmN0aW9uIGlzIHVzZSBmb3IgdXBkYXRpbmdcclxuICAgICAqIGV4aXN0aW5nIHBsdWdpbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgICAgIHJlcG9zaXRvcnlQYXRoICAgICBwYXRoIHRvIEdpdEh1YiByZXBvc2l0b3J5IGZvcm1hdGVkIGFzIFVTRVJOQU1FL3JlcG9zaXRvcnlcclxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgICAgICAgICAgICB1cGRhdGVQbHVnaW5GaWxlcyAgdHJ1ZSBpZiB0aGlzIGlzIGp1c3QgYW4gdXBkYXRlIG5vdCBhbiBpbnN0YWxsXHJcbiAgICAgKiBAcGFyYW0gICB7Ym9vbGVhbn0gICAgICAgICAgICAgc2VlSWZVcGRhdGVkT25seSAgIGlmIHRydWUsIGFuZCB1cGRhdGVQbHVnaW5GaWxlcyB0cnVlLCB3aWxsIGp1c3QgY2hlY2sgZm9yIHVwZGF0ZXMsIGJ1dCBub3QgZG8gdGhlIHVwZGF0ZS4gd2lsbCByZXBvcnQgdG8gdXNlciB0aGF0IHRoZXJlIGlzIGEgbmV3IHBsdWdpblxyXG4gICAgICogQHBhcmFtICAge2Jvb2xlYW59ICAgICAgICAgICAgIHJlcG9ydElmTm90VXBkdGVkICBpZiB0cnVlLCByZXBvcnQgaWYgYW4gdXBkYXRlIGhhcyBub3Qgc3VjY2VkXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiAge1Byb21pc2U8Ym9vbGVhbj59ICAgICAgICAgICAgICAgICAgICAgICB0cnVlIGlmIHN1Y2NlZWRzXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFkZFBsdWdpbihyZXBvc2l0b3J5UGF0aDogc3RyaW5nLCB1cGRhdGVQbHVnaW5GaWxlcyA9IGZhbHNlLCBzZWVJZlVwZGF0ZWRPbmx5ID0gZmFsc2UsIHJlcG9ydElmTm90VXBkdGVkID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBub3RpY2VUaW1lb3V0ID0gMTA7XHJcbiAgICAgICAgbGV0IHByaW1hcnlNYW5pZmVzdCA9IGF3YWl0IHRoaXMudmFsaWRhdGVSZXBvc2l0b3J5KHJlcG9zaXRvcnlQYXRoLCB0cnVlLCBmYWxzZSk7IC8vIGF0dGVtcHQgdG8gZ2V0IG1hbmlmZXN0LWJldGEuanNvblxyXG4gICAgICAgIGNvbnN0IHVzaW5nQmV0YU1hbmlmZXN0OiBib29sZWFuID0gcHJpbWFyeU1hbmlmZXN0ID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIGlmICh1c2luZ0JldGFNYW5pZmVzdCA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgIHByaW1hcnlNYW5pZmVzdCA9IGF3YWl0IHRoaXMudmFsaWRhdGVSZXBvc2l0b3J5KHJlcG9zaXRvcnlQYXRoLCBmYWxzZSwgdHJ1ZSk7IC8vIGF0dGVtcHQgdG8gZ2V0IG1hbmlmZXN0Lmpzb25cclxuXHJcbiAgICAgICAgaWYgKHByaW1hcnlNYW5pZmVzdCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgJHtyZXBvc2l0b3J5UGF0aH1cXG5BIG1hbmlmZXN0Lmpzb24gb3IgbWFuaWZlc3QtYmV0YS5qc29uIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSByZXBvc2l0b3J5LiBUaGlzIHBsdWdpbiBjYW5ub3QgYmUgaW5zdGFsbGVkLmA7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2csIHRydWUpO1xyXG4gICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGAke21zZ31gLCBub3RpY2VUaW1lb3V0KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwcmltYXJ5TWFuaWZlc3QuaGFzT3duUHJvcGVydHkoJ3ZlcnNpb24nKSkge1xyXG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgJHtyZXBvc2l0b3J5UGF0aH1cXG5UaGUgbWFuaWZlc3Qke3VzaW5nQmV0YU1hbmlmZXN0ID8gXCItYmV0YVwiIDogXCJcIn0uanNvbiBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcmVwb3NpdG9yeSBkb2VzIG5vdCBoYXZlIGEgdmVyc2lvbiBudW1iZXIgaW4gdGhlIGZpbGUuIFRoaXMgcGx1Z2luIGNhbm5vdCBiZSBpbnN0YWxsZWQuYDtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYCR7bXNnfWAsIG5vdGljZVRpbWVvdXQpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBnZXRSZWxlYXNlID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByRmlsZXMgPSBhd2FpdCB0aGlzLmdldEFsbFJlbGVhc2VGaWxlcyhyZXBvc2l0b3J5UGF0aCwgcHJpbWFyeU1hbmlmZXN0LCB1c2luZ0JldGFNYW5pZmVzdCk7XHJcbiAgICAgICAgICAgIGlmICh1c2luZ0JldGFNYW5pZmVzdCB8fCByRmlsZXMubWFuaWZlc3QgPT09IG51bGwpICAvL2lmIGJldGEsIHVzZSB0aGF0IG1hbmlmZXN0LCBvciBpZiB0aGVyZSBpcyBubyBtYW5pZmVzdCBpbiByZWxlYXNlLCB1c2UgdGhlIHByaW1hcnlNYW5pZmVzdFxyXG4gICAgICAgICAgICAgICAgckZpbGVzLm1hbmlmZXN0ID0gSlNPTi5zdHJpbmdpZnkocHJpbWFyeU1hbmlmZXN0KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyRmlsZXMubWFpbkpzID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgJHtyZXBvc2l0b3J5UGF0aH1cXG5UaGUgcmVsZWFzZSBpcyBub3QgY29tcGxldGUgYW5kIGNhbm5vdCBiZSBkb3dubG9hZC4gbWFpbi5qcyBpcyBtaXNzaW5nIGZyb20gdGhlIFJlbGVhc2VgO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGAke21zZ31gLCBub3RpY2VUaW1lb3V0KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByRmlsZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodXBkYXRlUGx1Z2luRmlsZXMgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbGVhc2VGaWxlcyA9IGF3YWl0IGdldFJlbGVhc2UoKTtcclxuICAgICAgICAgICAgaWYgKHJlbGVhc2VGaWxlcyA9PT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlUmVsZWFzZUZpbGVzVG9QbHVnaW5Gb2xkZXIocHJpbWFyeU1hbmlmZXN0LmlkLCByZWxlYXNlRmlsZXMpO1xyXG4gICAgICAgICAgICBhd2FpdCBhZGRCZXRhUGx1Z2luVG9MaXN0KHRoaXMucGx1Z2luLCByZXBvc2l0b3J5UGF0aCk7XHJcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5hcHAucGx1Z2lucy5sb2FkTWFuaWZlc3RzKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3JlcG9zaXRvcnlQYXRofVxcblRoZSBwbHVnaW4gaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIEJSQVQuIFlvdSBtYXkgc3RpbGwgbmVlZCB0byBlbmFibGUgaXQgdGhlIENvbW11bml0eSBQbHVnaW4gTGlzdC5gO1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnLCB0cnVlKTtcclxuICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBtc2csIG5vdGljZVRpbWVvdXQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHRlc3QgaWYgdGhlIHBsdWdpbiBuZWVkcyB0byBiZSB1cGRhdGVkXHJcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpblRhcmdldEZvbGRlclBhdGggPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuY29uZmlnRGlyICsgXCIvcGx1Z2lucy9cIiArIHByaW1hcnlNYW5pZmVzdC5pZCArIFwiL1wiO1xyXG4gICAgICAgICAgICBsZXQgbG9jYWxNYW5pZmVzdENvbnRlbnRzID0gbnVsbDtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxvY2FsTWFuaWZlc3RDb250ZW50cyA9IGF3YWl0IHRoaXMucGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyLnJlYWQocGx1Z2luVGFyZ2V0Rm9sZGVyUGF0aCArIFwibWFuaWZlc3QuanNvblwiKVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZS5lcnJubyA9PT0gLTQwNTgpIHsgLy8gZmlsZSBkb2VzIG5vdCBleGlzdCwgdHJ5IGluc3RhbGxpbmcgdGhlIHBsdWdpblxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkUGx1Z2luKHJlcG9zaXRvcnlQYXRoLCBmYWxzZSwgdXNpbmdCZXRhTWFuaWZlc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBldmVuIHRob3VnaCBmYWlsZWQsIHJldHVybiB0cnVlIHNpbmNlIGluc3RhbGwgd2lsbCBiZSBhdHRlbXB0ZWRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkJSQVQgLSBMb2NhbCBNYW5pZmVzdCBMb2FkXCIsIHByaW1hcnlNYW5pZmVzdC5pZCwgSlNPTi5zdHJpbmdpZnkoZSwgbnVsbCwgMikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsTWFuaWZlc3RKU09OID0gYXdhaXQgSlNPTi5wYXJzZShsb2NhbE1hbmlmZXN0Q29udGVudHMpO1xyXG4gICAgICAgICAgICBpZiAobG9jYWxNYW5pZmVzdEpTT04udmVyc2lvbiAhPT0gcHJpbWFyeU1hbmlmZXN0LnZlcnNpb24pIHsgLy9tYW5pZmVzdCBmaWxlcyBhcmUgbm90IHRoZSBzYW1lLCBkbyBhbiB1cGRhdGVcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGVhc2VGaWxlcyA9IGF3YWl0IGdldFJlbGVhc2UoKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZWxlYXNlRmlsZXMgPT09IG51bGwpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VlSWZVcGRhdGVkT25seSkgeyAvLyBkb250IHVwZGF0ZSwganVzdCByZXBvcnQgaXRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgVGhlcmUgaXMgYW4gdXBkYXRlIGF2YWlsYWJsZSBmb3IgJHtwcmltYXJ5TWFuaWZlc3QuaWR9IGZyb20gdmVyc2lvbiAke2xvY2FsTWFuaWZlc3RKU09OLnZlcnNpb259IHRvICR7cHJpbWFyeU1hbmlmZXN0LnZlcnNpb259LiBgO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2cgKyBgW1JlbGVhc2UgSW5mb10oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeVBhdGh9L3JlbGVhc2VzL3RhZy8ke3ByaW1hcnlNYW5pZmVzdC52ZXJzaW9ufSlgLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBtc2csIDMwLCBhc3luYyAoKSA9PiB7IHdpbmRvdy5vcGVuKGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5UGF0aH0vcmVsZWFzZXMvdGFnLyR7cHJpbWFyeU1hbmlmZXN0LnZlcnNpb259YCl9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZVJlbGVhc2VGaWxlc1RvUGx1Z2luRm9sZGVyKHByaW1hcnlNYW5pZmVzdC5pZCwgcmVsZWFzZUZpbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5hcHAucGx1Z2lucy5sb2FkTWFuaWZlc3RzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGx1Z2luLmFwcC5wbHVnaW5zLnBsdWdpbnNbcHJpbWFyeU1hbmlmZXN0LmlkXT8ubWFuaWZlc3QpIGF3YWl0IHRoaXMucmVsb2FkUGx1Z2luKHByaW1hcnlNYW5pZmVzdC5pZCk7IC8vcmVsb2FkIGlmIGVuYWJsZWRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgJHtwcmltYXJ5TWFuaWZlc3QuaWR9XFxuUGx1Z2luIGhhcyBiZWVuIHVwZGF0ZWQgZnJvbSB2ZXJzaW9uICR7bG9jYWxNYW5pZmVzdEpTT04udmVyc2lvbn0gdG8gJHtwcmltYXJ5TWFuaWZlc3QudmVyc2lvbn0uIGA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZyArIGBbUmVsZWFzZSBJbmZvXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5UGF0aH0vcmVsZWFzZXMvdGFnLyR7cHJpbWFyeU1hbmlmZXN0LnZlcnNpb259KWAsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIG1zZywgMzAsIGFzeW5jICgpID0+IHsgd2luZG93Lm9wZW4oYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnlQYXRofS9yZWxlYXNlcy90YWcvJHtwcmltYXJ5TWFuaWZlc3QudmVyc2lvbn1gKSB9ICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydElmTm90VXBkdGVkKSBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGBObyB1cGRhdGUgYXZhaWxhYmxlIGZvciAke3JlcG9zaXRvcnlQYXRofWAsIDMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJlbG9hZHMgYSBwbHVnaW4gKGFzc3VtaW5nIGl0IGhhcyBiZWVuIGVuYWJsZWQgYnkgdXNlcilcclxuICAgICAqIHBqZWJ5LCBUaGFua3MgQnJvIGh0dHBzOi8vZ2l0aHViLmNvbS9wamVieS9ob3QtcmVsb2FkL2Jsb2IvbWFzdGVyL21haW4uanNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtICAge3N0cmluZzx2b2lkPn0gICBwbHVnaW5OYW1lICBuYW1lIG9mIHBsdWdpblxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gIHtQcm9taXNlPHZvaWQ+fSAgICAgICAgICAgICAgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlbG9hZFBsdWdpbihwbHVnaW5OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMucGx1Z2luLmFwcC5wbHVnaW5zO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbnMuZGlzYWJsZVBsdWdpbihwbHVnaW5OYW1lKTtcclxuICAgICAgICAgICAgYXdhaXQgcGx1Z2lucy5lbmFibGVQbHVnaW4ocGx1Z2luTmFtZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmxvZyhcInJlbG9hZCBwbHVnaW5cIiwgZSkgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogdXBkYXRlcyBhIGJldGEgcGx1Z2luXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtICAge3N0cmluZ30gICByZXBvc2l0b3J5UGF0aCAgcmVwb3NpdG9yeSBwYXRoIG9uIEdpdEh1YlxyXG4gICAgICogQHBhcmFtICAge2Jvb2xlYW59ICBvbmx5Q2hlY2tEb250VXBkYXRlIG9ubHkgbG9va3MgZm9yIHVwZGF0ZVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gIHtQcm9taXNlPHZvaWQ+fSAgICAgICAgICAgICAgICAgIFxyXG4gICAgICovXHJcbiAgICBhc3luYyB1cGRhdGVQbHVnaW4ocmVwb3NpdG9yeVBhdGg6IHN0cmluZywgb25seUNoZWNrRG9udFVwZGF0ZSA9IGZhbHNlLCByZXBvcnRJZk5vdFVwZHRlZCA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGRQbHVnaW4ocmVwb3NpdG9yeVBhdGgsIHRydWUsIG9ubHlDaGVja0RvbnRVcGRhdGUsIHJlcG9ydElmTm90VXBkdGVkKTtcclxuICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSAmJiBvbmx5Q2hlY2tEb250VXBkYXRlID09PSBmYWxzZSlcclxuICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGAke3JlcG9zaXRvcnlQYXRofVxcblVwZGF0ZSBvZiBwbHVnaW4gZmFpbGVkLmApXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHdhbGtzIHRocm91Z2ggdGhlIGxpc3QgIG9mIHBsdWdpbnMgYW5kIHBlcmZvcm1zIGFuIHVwZGF0ZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgICAgICAgICAgc2hvd0luZm8gIHNob3VsZCB0aGlzIHdpdGggYSBzdGFydGVkL2NvbXBsZXRlZCBtZXNzYWdlIC0gdXNlZnVsIHdoZW4gcmFuIGZyb20gQ1BcclxuICAgICAqIEByZXR1cm4gIHtQcm9taXNlPHZvaWQ+fSAgICAgICAgICAgICAgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGNoZWNrRm9yVXBkYXRlc0FuZEluc3RhbGxVcGRhdGVzKHNob3dJbmZvID0gZmFsc2UsIG9ubHlDaGVja0RvbnRVcGRhdGUgPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmKGF3YWl0IGlzQ29ubmVjdGVkVG9JbnRlcm5ldCgpPT09ZmFsc2UpIHsgXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQlJBVDogTm8gaW50ZXJuZXQgZGV0ZWN0ZWQuXCIpIFxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBuZXdOb3RpY2U6IE5vdGljZTtcclxuICAgICAgICBjb25zdCBtc2cxID0gYENoZWNraW5nIGZvciBwbHVnaW4gdXBkYXRlcyBTVEFSVEVEYDtcclxuICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnMSwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKHNob3dJbmZvICYmIHRoaXMucGx1Z2luLnNldHRpbmdzLm5vdGlmaWNhdGlvbnNFbmFibGVkKSBuZXdOb3RpY2UgPSBuZXcgTm90aWNlKGBCUkFUXFxuJHttc2cxfWAsIDMwMDAwKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGJwIG9mIHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkxpc3QpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVQbHVnaW4oYnAsIG9ubHlDaGVja0RvbnRVcGRhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtc2cyID0gYENoZWNraW5nIGZvciBwbHVnaW4gdXBkYXRlcyBDT01QTEVURURgO1xyXG4gICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2cyLCB0cnVlKTtcclxuICAgICAgICBpZiAoc2hvd0luZm8pIHtcclxuICAgICAgICAgICAgbmV3Tm90aWNlLmhpZGUoKTtcclxuICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBtc2cyLCAxMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgYmV0YSBwbHVnaW4gZnJvbSB0aGUgbGlzdCBvZiBiZXRhIHBsdWdpbnMgKGRvZXMgbm90IGRlbGV0ZSB0aGVtIGZyb20gZGlzaylcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gICB7c3RyaW5nPHZvaWQ+fSAgIGJldGFQbHVnaW5JRCAgcmVwb3NpdG9yeSBwYXRoXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiAge1Byb21pc2U8dm9pZD59ICAgICAgICAgICAgICAgIFtyZXR1cm4gZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRlbGV0ZVBsdWdpbihyZXBvc2l0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgbXNnID0gYFJlbW92ZWQgJHtyZXBvc2l0b3J5UGF0aH0gZnJvbSBCUkFUIHBsdWdpbiBsaXN0YDtcclxuICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnLCB0cnVlKTtcclxuICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5MaXN0ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdC5maWx0ZXIoKGIpID0+IGIgIT0gcmVwb3NpdG9yeVBhdGgpO1xyXG4gICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgcGx1Z2lucyB0aGF0IGFyZSBjdXJyZW50bHkgZW5hYmxlZCBvciBjdXJyZW50bHkgZGlzYWJsZWRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gICB7Ym9vbGVhbltdfSAgICAgICAgZW5hYmxlZCAgdHJ1ZSBmb3IgZW5hYmxlZCBwbHVnaW5zLCBmYWxzZSBmb3IgZGlzYWJsZWQgcGx1dGluZ3NcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuICB7UGx1Z2luTWFuaWZlc3RbXX0gICAgICAgICAgIG1hbmlmZXN0cyAgb2YgcGx1Z2luc1xyXG4gICAgICovXHJcbiAgICBnZXRFbmFibGVkRGlzYWJsZWRQbHVnaW5zKGVuYWJsZWQ6IGJvb2xlYW4pOiBQbHVnaW5NYW5pZmVzdFtdIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgY29uc3QgcGwgPSB0aGlzLnBsdWdpbi5hcHAucGx1Z2lucztcclxuICAgICAgICBjb25zdCBtYW5pZmVzdHM6IFBsdWdpbk1hbmlmZXN0W10gPSBPYmplY3QudmFsdWVzKHBsLm1hbmlmZXN0cyk7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGNvbnN0IGVuYWJsZWRQbHVnaW5zOiBQbHVnaW5NYW5pZmVzdFtdID0gT2JqZWN0LnZhbHVlcyhwbC5wbHVnaW5zKS5tYXAocCA9PiBwLm1hbmlmZXN0KTtcclxuICAgICAgICByZXR1cm4gZW5hYmxlZCA/XHJcbiAgICAgICAgICAgIG1hbmlmZXN0cy5maWx0ZXIobWFuaWZlc3QgPT4gZW5hYmxlZFBsdWdpbnMuZmluZChwbHVnaW5OYW1lID0+IG1hbmlmZXN0LmlkID09PSBwbHVnaW5OYW1lLmlkKSkgOlxyXG4gICAgICAgICAgICBtYW5pZmVzdHMuZmlsdGVyKG1hbmlmZXN0ID0+ICFlbmFibGVkUGx1Z2lucy5maW5kKHBsdWdpbk5hbWUgPT4gbWFuaWZlc3QuaWQgPT09IHBsdWdpbk5hbWUuaWQpKTtcclxuICAgIH1cclxufSIsICJpbXBvcnQgeyBhZGRJY29uIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEljb25zKCk6IHZvaWQge1xyXG4gICAgYWRkSWNvbihcclxuICAgICAgICBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgYDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiAgZD1cIk0gNDEuNjY3OTY5IDQxLjY2Nzk2OSBDIDQxLjY2Nzk2OSAzOS4zNjcxODggMzkuODAwNzgxIDM3LjUgMzcuNSAzNy41IEMgMzUuMTk5MjE5IDM3LjUgMzMuMzMyMDMxIDM5LjM2NzE4OCAzMy4zMzIwMzEgNDEuNjY3OTY5IEMgMzMuMzMyMDMxIDQzLjk2ODc1IDM1LjE5OTIxOSA0NS44MzIwMzEgMzcuNSA0NS44MzIwMzEgQyAzOS44MDA3ODEgNDUuODMyMDMxIDQxLjY2Nzk2OSA0My45Njg3NSA0MS42Njc5NjkgNDEuNjY3OTY5IFogTSA2MC40MTc5NjkgNTguNTgyMDMxIEMgNTkuNDYwOTM4IDU4LjAyMzQzOCA1OC4zMjAzMTIgNTcuODY3MTg4IDU3LjI1IDU4LjE0ODQzOCBDIDU2LjE3OTY4OCA1OC40Mjk2ODggNTUuMjY1NjI1IDU5LjEyNSA1NC43MDcwMzEgNjAuMDgyMDMxIEMgNTMuNzQ2MDk0IDYxLjc3NzM0NCA1MS45NDkyMTkgNjIuODIwMzEyIDUwIDYyLjgyMDMxMiBDIDQ4LjA1MDc4MSA2Mi44MjAzMTIgNDYuMjUzOTA2IDYxLjc3NzM0NCA0NS4yOTI5NjkgNjAuMDgyMDMxIEMgNDQuNzM0Mzc1IDU5LjEyNSA0My44MjAzMTIgNTguNDI5Njg4IDQyLjc1IDU4LjE0ODQzOCBDIDQxLjY3OTY4OCA1Ny44NjcxODggNDAuNTM5MDYyIDU4LjAyMzQzOCAzOS41ODIwMzEgNTguNTgyMDMxIEMgMzcuNTk3NjU2IDU5LjcyNjU2MiAzNi45MTAxNTYgNjIuMjU3ODEyIDM4LjA0Mjk2OSA2NC4yNSBDIDQwLjUgNjguNTMxMjUgNDUuMDYyNSA3MS4xNzE4NzUgNTAgNzEuMTcxODc1IEMgNTQuOTM3NSA3MS4xNzE4NzUgNTkuNSA2OC41MzEyNSA2MS45NTcwMzEgNjQuMjUgQyA2My4wODk4NDQgNjIuMjU3ODEyIDYyLjQwMjM0NCA1OS43MjY1NjIgNjAuNDE3OTY5IDU4LjU4MjAzMSBaIE0gNjIuNSAzNy41IEMgNjAuMTk5MjE5IDM3LjUgNTguMzMyMDMxIDM5LjM2NzE4OCA1OC4zMzIwMzEgNDEuNjY3OTY5IEMgNTguMzMyMDMxIDQzLjk2ODc1IDYwLjE5OTIxOSA0NS44MzIwMzEgNjIuNSA0NS44MzIwMzEgQyA2NC44MDA3ODEgNDUuODMyMDMxIDY2LjY2Nzk2OSA0My45Njg3NSA2Ni42Njc5NjkgNDEuNjY3OTY5IEMgNjYuNjY3OTY5IDM5LjM2NzE4OCA2NC44MDA3ODEgMzcuNSA2Mi41IDM3LjUgWiBNIDUwIDguMzMyMDMxIEMgMjYuOTg4MjgxIDguMzMyMDMxIDguMzMyMDMxIDI2Ljk4ODI4MSA4LjMzMjAzMSA1MCBDIDguMzMyMDMxIDczLjAxMTcxOSAyNi45ODgyODEgOTEuNjY3OTY5IDUwIDkxLjY2Nzk2OSBDIDczLjAxMTcxOSA5MS42Njc5NjkgOTEuNjY3OTY5IDczLjAxMTcxOSA5MS42Njc5NjkgNTAgQyA5MS42Njc5NjkgMjYuOTg4MjgxIDczLjAxMTcxOSA4LjMzMjAzMSA1MCA4LjMzMjAzMSBaIE0gNTAgODMuMzMyMDMxIEMgMzMuOTg4MjgxIDgzLjQwMjM0NCAyMC4xOTE0MDYgNzIuMDc4MTI1IDE3LjEzNjcxOSA1Ni4zNjMyODEgQyAxNC4wNzgxMjUgNDAuNjQ0NTMxIDIyLjYyODkwNiAyNC45NzY1NjIgMzcuNSAxOS4wNDI5NjkgQyAzNy40NTcwMzEgMTkuNjM2NzE5IDM3LjQ1NzAzMSAyMC4yMzgyODEgMzcuNSAyMC44MzIwMzEgQyAzNy41IDI3LjczODI4MSA0My4wOTc2NTYgMzMuMzMyMDMxIDUwIDMzLjMzMjAzMSBDIDUyLjMwMDc4MSAzMy4zMzIwMzEgNTQuMTY3OTY5IDMxLjQ2ODc1IDU0LjE2Nzk2OSAyOS4xNjc5NjkgQyA1NC4xNjc5NjkgMjYuODY3MTg4IDUyLjMwMDc4MSAyNSA1MCAyNSBDIDQ3LjY5OTIxOSAyNSA0NS44MzIwMzEgMjMuMTMyODEyIDQ1LjgzMjAzMSAyMC44MzIwMzEgQyA0NS44MzIwMzEgMTguNTMxMjUgNDcuNjk5MjE5IDE2LjY2Nzk2OSA1MCAxNi42Njc5NjkgQyA2OC40MTAxNTYgMTYuNjY3OTY5IDgzLjMzMjAzMSAzMS41ODk4NDQgODMuMzMyMDMxIDUwIEMgODMuMzMyMDMxIDY4LjQxMDE1NiA2OC40MTAxNTYgODMuMzMyMDMxIDUwIDgzLjMzMjAzMSBaIE0gNTAgODMuMzMyMDMxIFwiIC8+YFxyXG4gICAgKTtcclxufSIsICJpbXBvcnQgeyBtb21lbnQsIFRGaWxlLCBQbGF0Zm9ybSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBnZXREYWlseU5vdGVTZXR0aW5ncyB9IGZyb20gXCJvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2VcIjtcclxuaW1wb3J0IFRoZVBsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5cclxuLyoqXHJcbiAqIExvZ3MgZXZlbnRzIHRvIGEgbG9nIGZpbGVcclxuICpcclxuICogQHBhcmFtICAge1RoZVBsdWdpbn0gIHBsdWdpbiAgICAgICAgICAgIFBsdWdpbiBvYmplY3RcclxuICogQHBhcmFtICAge3N0cmluZ30gICAgIHRleHRUb0xvZyAgICAgICAgIHRleHQgdG8gYmUgc2F2ZWQgdG8gbG9nIGZpbGVcclxuICogQHBhcmFtICAge1t0eXBlXX0gICAgIHZlcmJvc2VMb2dnaW5nT24gIFRydWUgaWYgc2hvdWxkIG9ubHkgYmUgbG9nZ2VkIGlmIHZlcmJvc2UgbG9nZ2luZyBpcyBlbmFibGVkXHJcbiAqXHJcbiAqIEByZXR1cm4gIHt2b2lkfSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2dnZXIocGx1Z2luOiBUaGVQbHVnaW4sIHRleHRUb0xvZzogc3RyaW5nLCB2ZXJib3NlTG9nZ2luZ09uID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGlmKHBsdWdpbi5zZXR0aW5ncy5kZWJ1Z2dpbmdNb2RlKSBjb25zb2xlLmxvZyhcIkJSQVQ6IFwiICsgdGV4dFRvTG9nKTtcclxuICAgIGlmIChwbHVnaW4uc2V0dGluZ3MubG9nZ2luZ0VuYWJsZWQpIHtcclxuICAgICAgICBpZiAocGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdWZXJib3NlRW5hYmxlZCA9PT0gZmFsc2UgJiYgdmVyYm9zZUxvZ2dpbmdPbiA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBwbHVnaW4uc2V0dGluZ3MubG9nZ2luZ1BhdGggKyBcIi5tZFwiO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlT3V0cHV0ID0gXCJbW1wiICsgbW9tZW50KCkuZm9ybWF0KGdldERhaWx5Tm90ZVNldHRpbmdzKCkuZm9ybWF0KS50b1N0cmluZygpICsgXCJdXSBcIiArXHJcbiAgICAgICAgICAgICAgICBtb21lbnQoKS5mb3JtYXQoXCJISDptbVwiKTtcclxuICAgICAgICAgICAgY29uc3QgbWFjaGluZU5hbWUgPSBQbGF0Zm9ybS5pc0Rlc2t0b3AgPyB3aW5kb3cucmVxdWlyZShcIm9zXCIpLmhvc3RuYW1lKCkgOiBcIk1PQklMRVwiO1xyXG4gICAgICAgICAgICBsZXQgb3V0cHV0ID0gZGF0ZU91dHB1dCArIFwiIFwiICsgbWFjaGluZU5hbWUgKyBcIiBcIiArIHRleHRUb0xvZy5yZXBsYWNlKFwiXFxuXCIsXCIgXCIpICsgXCJcXG5cXG5cIjtcclxuICAgICAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgcGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhmaWxlTmFtZSkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXIucmVhZChmaWxlTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0ICsgZmlsZUNvbnRlbnRzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBwbHVnaW4uYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmaWxlTmFtZSkgYXMgVEZpbGU7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luLmFwcC52YXVsdC5tb2RpZnkoZmlsZSwgb3V0cHV0KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5hcHAudmF1bHQuY3JlYXRlKGZpbGVOYW1lLCBvdXRwdXQpO1xyXG4gICAgICAgICAgICB9LCAxMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwgImltcG9ydCBUaGVQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyLCBTdWdnZXN0ZXJJdGVtIH0gZnJvbSBcIi4vR2VuZXJpY0Z1enp5U3VnZ2VzdGVyXCI7XHJcbmltcG9ydCB7IGdyYWJDb21tbXVuaXR5UGx1Z2luTGlzdCwgZ3JhYkNvbW1tdW5pdHlUaGVtZXNMaXN0IH0gZnJvbSBcIi4uL2ZlYXR1cmVzL2dpdGh1YlV0aWxzXCI7XHJcbmltcG9ydCB7IHRoZW1lc2VDaGVja0FuZFVwZGF0ZXMsIHRoZW1lc0luc3RhbGxGcm9tQ29tbXVuaXR5TGlzdCB9IGZyb20gXCIuLi9mZWF0dXJlcy90aGVtZXNcIjtcclxuaW1wb3J0IEFkZE5ld1RoZW1lIGZyb20gXCIuL0FkZE5ld1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvYXN0TWVzc2FnZSB9IGZyb20gXCIuLi91dGlscy9ub3RpZmljYXRpb25zXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5Db21tYW5kcyB7XHJcbiAgICBwbHVnaW46IFRoZVBsdWdpbjtcclxuICAgIGJyYXRDb21tYW5kcyA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtQWRkQmV0YVBsdWdpblwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiUGx1Z2luczogQWRkIGEgYmV0YSBwbHVnaW4gZm9yIHRlc3RpbmdcIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4geyBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5kaXNwbGF5QWRkTmV3UGx1Z2luTW9kYWwoKSB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtY2hlY2tGb3JVcGRhdGVzQW5kVXBkYXRlXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJQbHVnaW5zOiBDaGVjayBmb3IgdXBkYXRlcyB0byBhbGwgYmV0YSBwbHVnaW5zIGFuZCBVUERBVEVcIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4geyBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5jaGVja0ZvclVwZGF0ZXNBbmRJbnN0YWxsVXBkYXRlcyh0cnVlLCBmYWxzZSkgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULWNoZWNrRm9yVXBkYXRlc0FuZERvbnRVcGRhdGVcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IE9ubHkgY2hlY2sgZm9yIHVwZGF0ZXMgdG8gYmV0YSBwbHVnaW5zLCBidXQgZG9uJ3QgVXBkYXRlXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuY2hlY2tGb3JVcGRhdGVzQW5kSW5zdGFsbFVwZGF0ZXModHJ1ZSwgdHJ1ZSkgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULXVwZGF0ZU9uZVBsdWdpblwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiUGx1Z2luczogQ2hvb3NlIGEgc2luZ2xlIHBsdWdpbiB0byB1cGRhdGVcIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luTGlzdDogU3VnZ2VzdGVySXRlbVtdID0gT2JqZWN0LnZhbHVlcyh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5MaXN0KS5tYXAoKG0pID0+IHsgcmV0dXJuIHsgZGlzcGxheTogbSwgaW5mbzogbSB9IH0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XHJcbiAgICAgICAgICAgICAgICBnZnMuc2V0U3VnZ2VzdGVyRGF0YShwbHVnaW5MaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYENoZWNraW5nIGZvciB1cGRhdGVzIGZvciAke3Jlc3VsdHMuaW5mb31gO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2csdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgXFxuJHttc2d9YCwgMyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMudXBkYXRlUGx1Z2luKHJlc3VsdHMuaW5mbywgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWQ6IFwiQlJBVC1yZXN0YXJ0UGx1Z2luXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJQbHVnaW5zOiBSZXN0YXJ0IGEgcGx1Z2luIHRoYXQgaXMgYWxyZWFkeSBpbnN0YWxsZWRcIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luTGlzdDogU3VnZ2VzdGVySXRlbVtdID0gT2JqZWN0LnZhbHVlcyh0aGlzLnBsdWdpbi5hcHAucGx1Z2lucy5tYW5pZmVzdHMpLm1hcCgobSkgPT4geyByZXR1cm4geyBkaXNwbGF5OiBtLmlkLCBpbmZvOiBtLmlkIH0gfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHRoaXMucGx1Z2luKTtcclxuICAgICAgICAgICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKHBsdWdpbkxpc3QpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2ZzLmRpc3BsYXkoYXN5bmMgKHJlc3VsdHMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGAke3Jlc3VsdHMuaW5mb31cXG5QbHVnaW4gcmVsb2FkaW5nIC4uLi4uYCwgNSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMucmVsb2FkUGx1Z2luKHJlc3VsdHMuaW5mbyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULWRpc2FibGVQbHVnaW5cIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IERpc2FibGUgYSBwbHVnaW4gLSB0b2dnbGUgaXQgb2ZmXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpbkxpc3QgPSB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5nZXRFbmFibGVkRGlzYWJsZWRQbHVnaW5zKHRydWUpLm1hcChtYW5pZmVzdCA9PiB7IHJldHVybiB7IGRpc3BsYXk6IGAke21hbmlmZXN0Lm5hbWV9ICgke21hbmlmZXN0LmlkfSlgLCBpbmZvOiBtYW5pZmVzdC5pZCB9IH0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XHJcbiAgICAgICAgICAgICAgICBnZnMuc2V0U3VnZ2VzdGVyRGF0YShwbHVnaW5MaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKGAke3Jlc3VsdHMuZGlzcGxheX0gcGx1Z2luIGRpc2FibGVkYCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5hcHAucGx1Z2lucy5kaXNhYmxlUGx1Z2luKHJlc3VsdHMuaW5mbyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULWVuYWJsZVBsdWdpblwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiUGx1Z2luczogRW5hYmxlIGEgcGx1Z2luIC0gdG9nZ2xlIGl0IG9uXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpbkxpc3QgPSB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5nZXRFbmFibGVkRGlzYWJsZWRQbHVnaW5zKGZhbHNlKS5tYXAobWFuaWZlc3QgPT4geyByZXR1cm4geyBkaXNwbGF5OiBgJHttYW5pZmVzdC5uYW1lfSAoJHttYW5pZmVzdC5pZH0pYCwgaW5mbzogbWFuaWZlc3QuaWQgfSB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdmcyA9IG5ldyBHZW5lcmljRnV6enlTdWdnZXN0ZXIodGhpcy5wbHVnaW4pO1xyXG4gICAgICAgICAgICAgICAgZ2ZzLnNldFN1Z2dlc3RlckRhdGEocGx1Z2luTGlzdCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZyhgJHtyZXN1bHRzLmRpc3BsYXl9IHBsdWdpbiBlbmFibGVkYCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5hcHAucGx1Z2lucy5lbmFibGVQbHVnaW4ocmVzdWx0cy5pbmZvKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtb3BlbkdpdEh1YlpSZXBvc2l0b3J5XCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJQbHVnaW5zOiBPcGVuIHRoZSBHaXRIdWIgcmVwb3NpdG9yeSBmb3IgYSBwbHVnaW5cIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbXVuaXR5UGx1Z2lucyA9IGF3YWl0IGdyYWJDb21tbXVuaXR5UGx1Z2luTGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbXVuaXR5UGx1Z2luTGlzdDogU3VnZ2VzdGVySXRlbVtdID0gT2JqZWN0LnZhbHVlcyhjb21tdW5pdHlQbHVnaW5zKS5tYXAoKHApID0+IHsgcmV0dXJuIHsgZGlzcGxheTogYFBsdWdpbjogJHtwLm5hbWV9ICAoJHtwLnJlcG99KWAsIGluZm86IHAucmVwbyB9IH0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYnJhdExpc3Q6IFN1Z2dlc3Rlckl0ZW1bXSA9IE9iamVjdC52YWx1ZXModGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdCkubWFwKChwKSA9PiB7IHJldHVybiB7IGRpc3BsYXk6IFwiQlJBVDogXCIgKyBwLCBpbmZvOiBwIH0gfSk7XHJcbiAgICAgICAgICAgICAgICBjb21tdW5pdHlQbHVnaW5MaXN0LmZvckVhY2goc2kgPT4gYnJhdExpc3QucHVzaChzaSkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XHJcbiAgICAgICAgICAgICAgICBnZnMuc2V0U3VnZ2VzdGVyRGF0YShicmF0TGlzdCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLmluZm8pIHdpbmRvdy5vcGVuKGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXN1bHRzLmluZm99YClcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtb3BlbkdpdEh1YlJlcG9UaGVtZVwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiVGhlbWVzOiBPcGVuIHRoZSBHaXRIdWIgcmVwb3NpdG9yeSBmb3IgYSB0aGVtZSAoYXBwZWFyYW5jZSlcIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbXVuaXR5VGhlbWUgPSBhd2FpdCBncmFiQ29tbW11bml0eVRoZW1lc0xpc3QoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW11bml0eVRoZW1lTGlzdDogU3VnZ2VzdGVySXRlbVtdID0gT2JqZWN0LnZhbHVlcyhjb21tdW5pdHlUaGVtZSkubWFwKChwKSA9PiB7IHJldHVybiB7IGRpc3BsYXk6IGBUaGVtZTogJHtwLm5hbWV9ICAoJHtwLnJlcG99KWAsIGluZm86IHAucmVwbyB9IH0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XHJcbiAgICAgICAgICAgICAgICBnZnMuc2V0U3VnZ2VzdGVyRGF0YShjb21tdW5pdHlUaGVtZUxpc3QpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2ZzLmRpc3BsYXkoYXN5bmMgKHJlc3VsdHMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5pbmZvKSB3aW5kb3cub3BlbihgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVzdWx0cy5pbmZvfWApXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULW9wZW50UGx1Z2luU2V0dGluZ3NcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IE9wZW4gUGx1Z2luIFNldHRpbmdzIFRhYlwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMucGx1Z2luLmFwcC5zZXR0aW5nO1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdE9mUGx1Z2luU2V0dGluZ3NUYWJzOiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKHNldHRpbmdzLnBsdWdpblRhYnMpLm1hcCgodCkgPT4geyByZXR1cm4geyBkaXNwbGF5OiBcIlBsdWdpbjogXCIgKyB0Lm5hbWUsIGluZm86IHQuaWQgfSB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdmcyA9IG5ldyBHZW5lcmljRnV6enlTdWdnZXN0ZXIodGhpcy5wbHVnaW4pO1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdE9mQ29yZVNldHRpbmdzVGFiczogU3VnZ2VzdGVySXRlbVtdID0gT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5zZXR0aW5nVGFicykubWFwKCh0KSA9PiB7IHJldHVybiB7IGRpc3BsYXk6IFwiQ29yZTogXCIgKyB0Lm5hbWUsIGluZm86IHQuaWQgfSB9KTtcclxuICAgICAgICAgICAgICAgIGxpc3RPZlBsdWdpblNldHRpbmdzVGFicy5mb3JFYWNoKHNpID0+IGxpc3RPZkNvcmVTZXR0aW5nc1RhYnMucHVzaChzaSkpO1xyXG4gICAgICAgICAgICAgICAgZ2ZzLnNldFN1Z2dlc3RlckRhdGEobGlzdE9mQ29yZVNldHRpbmdzVGFicyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm9wZW4oKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5vcGVuVGFiQnlJZChyZXN1bHRzLmluZm8pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWQ6IFwiQlJBVC1HcmFiQ29tbXVuaXR5VGhlbWVcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlRoZW1lczogR3JhYiBhIGNvbW11bml0eSB0aGVtZVwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCB0aGVtZXNJbnN0YWxsRnJvbUNvbW11bml0eUxpc3QodGhpcy5wbHVnaW4pXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtR3JhYkJldGFUaGVtZVwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiVGhlbWVzOiBHcmFiIGEgYmV0YSB0aGVtZSBmb3IgdGVzdGluZyBmcm9tIGEgR2l0aHViIHJlcG9zaXRvcnlcIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4geyAobmV3IEFkZE5ld1RoZW1lKHRoaXMucGx1Z2luKSkub3BlbigpIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWQ6IFwiQlJBVC11cGRhdGVCZXRhVGhlbWVzXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJUaGVtZXM6IFVwZGF0ZSBiZXRhIHRoZW1lc1wiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCB0aGVtZXNlQ2hlY2tBbmRVcGRhdGVzKHRoaXMucGx1Z2luLCB0cnVlKSBcclxuICAgICAgICB9LCAgICAgICAgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULXN3aXRjaFRoZW1lXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJUaGVtZXM6IFN3aXRjaCBBY3RpdmUgVGhlbWUgXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW11bml0eVRoZW1lTGlzdDogU3VnZ2VzdGVySXRlbVtdID0gT2JqZWN0LnZhbHVlcyh0aGlzLnBsdWdpbi5hcHAuY3VzdG9tQ3NzLnRoZW1lcykubWFwKCh0KSA9PiB7IHJldHVybiB7IGRpc3BsYXk6IHQsIGluZm86IHQgfSB9KTtcclxuICAgICAgICAgICAgICAgIGNvbW11bml0eVRoZW1lTGlzdC51bnNoaWZ0KHsgZGlzcGxheTogXCJPYnNpZGlhbiBEZWZhdWx0IFRoZW1lXCIsIGluZm86IFwiXCIgfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHRoaXMucGx1Z2luKTtcclxuICAgICAgICAgICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKGNvbW11bml0eVRoZW1lTGlzdCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZyhgU3dpdGNoZWQgdG8gdGhlbWUgJHtyZXN1bHRzLmRpc3BsYXl9YCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5hcHAuY3VzdG9tQ3NzLnNldFRoZW1lKHJlc3VsdHMuaW5mbyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULWFsbENvbW1hbmRzXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJBbGwgQ29tbWFuZHMgbGlzdFwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IGZhbHNlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4gdGhpcy5yaWJib25EaXNwbGF5Q29tbWFuZHMoKVxyXG4gICAgICAgIH0sXHJcbiAgICBdXHJcblxyXG4gICAgYXN5bmMgcmliYm9uRGlzcGxheUNvbW1hbmRzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IGJyYXRDb21tYW5kTGlzdDogU3VnZ2VzdGVySXRlbVtdID0gW107XHJcbiAgICAgICAgdGhpcy5icmF0Q29tbWFuZHMuZm9yRWFjaChjbWQgPT4geyBpZiAoY21kLnNob3dJblJpYmJvbikgYnJhdENvbW1hbmRMaXN0LnB1c2goeyBkaXNwbGF5OiBjbWQubmFtZSwgaW5mbzogY21kLmNhbGxiYWNrIH0pIH0pO1xyXG4gICAgICAgIGNvbnN0IGdmcyA9IG5ldyBHZW5lcmljRnV6enlTdWdnZXN0ZXIodGhpcy5wbHVnaW4pO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMucGx1Z2luLmFwcC5zZXR0aW5nO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBjb25zdCBsaXN0T2ZDb3JlU2V0dGluZ3NUYWJzOiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKHNldHRpbmdzLnNldHRpbmdUYWJzKS5tYXAoKHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJDb3JlOiBcIiArIHQubmFtZSxcclxuICAgICAgICAgICAgICAgIGluZm86IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub3BlblRhYkJ5SWQodC5pZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgY29uc3QgbGlzdE9mUGx1Z2luU2V0dGluZ3NUYWJzOiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKHNldHRpbmdzLnBsdWdpblRhYnMpLm1hcCgodDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBcIlBsdWdpbjogXCIgKyB0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICBpbmZvOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm9wZW5UYWJCeUlkKHQuaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGJyYXRDb21tYW5kTGlzdC5wdXNoKHsgZGlzcGxheTogXCItLS0tIENvcmUgUGx1Z2luIFNldHRpbmdzIC0tLS1cIiwgaW5mbzogYXN5bmMgKCkgPT4geyBhd2FpdCB0aGlzLnJpYmJvbkRpc3BsYXlDb21tYW5kcygpIH0gfSlcclxuICAgICAgICBsaXN0T2ZDb3JlU2V0dGluZ3NUYWJzLmZvckVhY2goc2kgPT4gYnJhdENvbW1hbmRMaXN0LnB1c2goc2kpKTtcclxuICAgICAgICBicmF0Q29tbWFuZExpc3QucHVzaCh7IGRpc3BsYXk6IFwiLS0tLSBQbHVnaW4gU2V0dGluZ3MgLS0tLVwiLCBpbmZvOiBhc3luYyAoKSA9PiB7IGF3YWl0IHRoaXMucmliYm9uRGlzcGxheUNvbW1hbmRzKCkgfSB9KVxyXG4gICAgICAgIGxpc3RPZlBsdWdpblNldHRpbmdzVGFicy5mb3JFYWNoKHNpID0+IGJyYXRDb21tYW5kTGlzdC5wdXNoKHNpKSk7XHJcblxyXG4gICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKGJyYXRDb21tYW5kTGlzdCk7XHJcbiAgICAgICAgYXdhaXQgZ2ZzLmRpc3BsYXkoYXN5bmMgKHJlc3VsdHMpID0+IGF3YWl0IHJlc3VsdHMuaW5mbygpKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IFRoZVBsdWdpbikge1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cclxuICAgICAgICB0aGlzLmJyYXRDb21tYW5kcy5mb3JFYWNoKGFzeW5jIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmFkZENvbW1hbmQoe1xyXG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBpY29uOiBpdGVtLmljb24sXHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4geyBhd2FpdCBpdGVtLmNhbGxiYWNrKCkgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuIl0sCiAgIm1hcHBpbmdzIjogInEwQkFBQSwyQkFFQSxPQUFPLGVBQWUsRUFBUyxhQUFjLENBQUUsTUFBTyxFQUFLLENBQUMsRUFFNUQsR0FBSSxHQUFXLFFBQVEsWUFFakIsR0FBNEIsYUFDNUIsR0FBNkIsYUFDN0IsR0FBOEIsVUFDOUIsR0FBZ0MsWUFDaEMsR0FBNkIsT0FFbkMsV0FBd0MsRUFBYSxDQVpyRCxRQWNJLEdBQU0sR0FBZ0IsT0FBTyxJQUFJLFFBQVEsVUFBVSxnQkFBZ0IsRUFDbkUsTUFBTyxJQUFpQixTQUFjLFdBQWQsY0FBeUIsS0FBekIsY0FBdUMsUUFDbkUsQ0FLQSxZQUFnQyxDQXJCaEMsWUFzQkksR0FBSSxDQUVBLEdBQU0sQ0FBRSxrQkFBaUIsV0FBWSxPQUFPLElBQzVDLEdBQUksRUFBK0IsT0FBTyxFQUFHLENBQ3pDLEdBQU0sQ0FBRSxTQUFRLFNBQVEsWUFBYSxTQUFRLFVBQVUsZ0JBQWdCLElBQWxDLGNBQXFDLFdBQXJDLGNBQStDLFFBQVMsQ0FBQyxFQUM5RixNQUFPLENBQ0gsT0FBUSxHQUFVLEdBQ2xCLE9BQVEsa0JBQVEsU0FBVSxHQUMxQixTQUFVLGtCQUFVLFNBQVUsRUFDbEMsQ0FDSixDQUNBLEdBQU0sQ0FBRSxTQUFRLFNBQVEsWUFBYSxTQUFnQixjQUFjLGFBQWEsSUFBM0MsY0FBOEMsV0FBOUMsY0FBd0QsVUFBVyxDQUFDLEVBQ3pHLE1BQU8sQ0FDSCxPQUFRLEdBQVUsR0FDbEIsT0FBUSxrQkFBUSxTQUFVLEdBQzFCLFNBQVUsa0JBQVUsU0FBVSxFQUNsQyxDQUNKLE9BQ08sRUFBUCxDQUNJLFFBQVEsS0FBSyx1Q0FBd0MsQ0FBRyxDQUM1RCxDQUNKLENBS0EsWUFBaUMsQ0FoRGpDLGtCQWlESSxHQUFJLENBRUEsR0FBTSxHQUFnQixPQUFPLElBQUksUUFDM0IsRUFBbUIsS0FBYyxVQUFVLFVBQVUsSUFBbEMsY0FBcUMsUUFDeEQsRUFBd0IsUUFBYyxVQUFVLGdCQUFnQixJQUF4QyxjQUEyQyxXQUEzQyxjQUFxRCxPQUNuRixHQUFJLEVBQStCLFFBQVEsRUFDdkMsTUFBTyxDQUNILE9BQVEsRUFBc0IsUUFBVSxHQUN4QyxPQUFRLE1BQXNCLFNBQXRCLGNBQThCLFNBQVUsR0FDaEQsU0FBVSxNQUFzQixXQUF0QixjQUFnQyxTQUFVLEVBQ3hELEVBRUosR0FBTSxHQUFXLEdBQW9CLENBQUMsRUFDdEMsTUFBTyxDQUNILE9BQVEsRUFBUyxrQkFBb0IsR0FDckMsT0FBUSxNQUFTLG1CQUFULGNBQTJCLFNBQVUsR0FDN0MsU0FBVSxNQUFTLHFCQUFULGNBQTZCLFNBQVUsRUFDckQsQ0FDSixPQUNPLEVBQVAsQ0FDSSxRQUFRLEtBQUssd0NBQXlDLENBQUcsQ0FDN0QsQ0FDSixDQUtBLFlBQWtDLENBNUVsQyxZQThFSSxHQUFNLEdBQWdCLE9BQU8sSUFBSSxRQUNqQyxHQUFJLENBQ0EsR0FBTSxHQUFZLEVBQStCLFNBQVMsR0FDdEQsU0FBYyxVQUFVLGdCQUFnQixJQUF4QyxjQUEyQyxXQUEzQyxjQUFxRCxVQUNyRCxDQUFDLEVBQ0wsTUFBTyxDQUNILE9BQVEsRUFBUyxRQUFVLEdBQzNCLE9BQVEsTUFBUyxTQUFULGNBQWlCLFNBQVUsR0FDbkMsU0FBVSxNQUFTLFdBQVQsY0FBbUIsU0FBVSxFQUMzQyxDQUNKLE9BQ08sRUFBUCxDQUNJLFFBQVEsS0FBSyx5Q0FBMEMsQ0FBRyxDQUM5RCxDQUNKLENBS0EsWUFBb0MsQ0FqR3BDLFlBbUdJLEdBQU0sR0FBZ0IsT0FBTyxJQUFJLFFBQ2pDLEdBQUksQ0FDQSxHQUFNLEdBQVksRUFBK0IsV0FBVyxHQUN4RCxTQUFjLFVBQVUsZ0JBQWdCLElBQXhDLGNBQTJDLFdBQTNDLGNBQXFELFlBQ3JELENBQUMsRUFDTCxNQUFPLENBQ0gsT0FBUSxFQUFTLFFBQVUsR0FDM0IsT0FBUSxNQUFTLFNBQVQsY0FBaUIsU0FBVSxHQUNuQyxTQUFVLE1BQVMsV0FBVCxjQUFtQixTQUFVLEVBQzNDLENBQ0osT0FDTyxFQUFQLENBQ0ksUUFBUSxLQUFLLDJDQUE0QyxDQUFHLENBQ2hFLENBQ0osQ0FLQSxZQUFpQyxDQXRIakMsWUF3SEksR0FBTSxHQUFnQixPQUFPLElBQUksUUFDakMsR0FBSSxDQUNBLEdBQU0sR0FBWSxFQUErQixRQUFRLEdBQ3JELFNBQWMsVUFBVSxnQkFBZ0IsSUFBeEMsY0FBMkMsV0FBM0MsY0FBcUQsU0FDckQsQ0FBQyxFQUNMLE1BQU8sQ0FDSCxPQUFRLEVBQVMsUUFBVSxHQUMzQixPQUFRLE1BQVMsU0FBVCxjQUFpQixTQUFVLEdBQ25DLFNBQVUsTUFBUyxXQUFULGNBQW1CLFNBQVUsRUFDM0MsQ0FDSixPQUNPLEVBQVAsQ0FDSSxRQUFRLEtBQUssd0NBQXlDLENBQUcsQ0FDN0QsQ0FDSixDQUdBLGVBQWlCLEVBQWMsQ0FFM0IsR0FBSSxHQUFRLENBQUMsRUFDYixPQUFTLEdBQUksRUFBRyxFQUFJLEVBQWEsT0FBUSxFQUFJLEVBQUcsSUFDNUMsRUFBUSxFQUFNLE9BQU8sRUFBYSxHQUFHLE1BQU0sR0FBRyxDQUFDLEVBR25ELEdBQU0sR0FBVyxDQUFDLEVBQ2xCLE9BQVMsR0FBSSxFQUFHLEVBQUksRUFBTSxPQUFRLEVBQUksRUFBRyxJQUFLLENBQzFDLEdBQU0sR0FBTyxFQUFNLEdBR25CLEFBQUksQ0FBQyxHQUFRLElBQVMsS0FJbEIsRUFBUyxLQUFLLENBQUksQ0FDMUIsQ0FFQSxNQUFJLEdBQU0sS0FBTyxJQUNiLEVBQVMsUUFBUSxFQUFFLEVBRWhCLEVBQVMsS0FBSyxHQUFHLENBQzVCLENBQ0EsWUFBa0IsRUFBVSxDQUN4QixHQUFJLEdBQU8sRUFBUyxVQUFVLEVBQVMsWUFBWSxHQUFHLEVBQUksQ0FBQyxFQUMzRCxNQUFJLEdBQUssWUFBWSxHQUFHLEdBQUssSUFDekIsR0FBTyxFQUFLLFVBQVUsRUFBRyxFQUFLLFlBQVksR0FBRyxDQUFDLEdBQzNDLENBQ1gsQ0FDQSxZQUFrQyxFQUFNLGdDQUNwQyxHQUFNLEdBQU8sRUFBSyxRQUFRLE1BQU8sR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUUvQyxHQURBLEVBQUssSUFBSSxFQUNMLEVBQUssT0FBUSxDQUNiLEdBQU0sR0FBTSxHQUFLLEdBQUcsQ0FBSSxFQUN4QixBQUFLLE9BQU8sSUFBSSxNQUFNLHNCQUFzQixDQUFHLEdBQzNDLE1BQU0sUUFBTyxJQUFJLE1BQU0sYUFBYSxDQUFHLEVBRS9DLENBQ0osR0FDQSxXQUEyQixFQUFXLEVBQVUsZ0NBQzVDLEFBQUssRUFBUyxTQUFTLEtBQUssR0FDeEIsSUFBWSxPQUVoQixHQUFNLEdBQU8sRUFBUyxjQUFjLEdBQUssRUFBVyxDQUFRLENBQUMsRUFDN0QsWUFBTSxJQUFtQixDQUFJLEVBQ3RCLENBQ1gsR0FDQSxXQUErQixFQUFVLGdDQUNyQyxHQUFNLENBQUUsZ0JBQWUsU0FBVSxPQUFPLElBQ2xDLEVBQWUsRUFBUyxjQUFjLENBQVEsRUFDcEQsR0FBSSxJQUFpQixJQUNqQixNQUFPLFNBQVEsUUFBUSxDQUFDLEdBQUksSUFBSSxDQUFDLEVBRXJDLEdBQUksQ0FDQSxHQUFNLEdBQWUsRUFBYyxxQkFBcUIsRUFBYyxFQUFFLEVBQ2xFLEVBQVcsS0FBTSxHQUFNLFdBQVcsQ0FBWSxFQUU5QyxFQUFZLE9BQU8sSUFBSSxZQUFZLEtBQUssQ0FBWSxFQUMxRCxNQUFPLENBQUMsRUFBVSxDQUFTLENBQy9CLE9BQ08sRUFBUCxDQUNJLGVBQVEsTUFBTSwyQ0FBMkMsS0FBaUIsQ0FBRyxFQUM3RSxHQUFJLEdBQVMsT0FBTyx3Q0FBd0MsRUFDckQsQ0FBQyxHQUFJLElBQUksQ0FDcEIsQ0FDSixHQU1BLFdBQW9CLEVBQU0sRUFBYyxNQUFPLENBQzNDLEdBQU0sR0FBSyxFQUFLLE1BQU0sRUFBRSxRQUFRLENBQVcsRUFBRSxPQUFPLEVBQ3BELE1BQU8sR0FBRyxLQUFlLEdBQzdCLENBQ0EsWUFBaUMsRUFBUSxDQUNyQyxNQUFPLEdBQU8sUUFBUSxjQUFlLEVBQUUsQ0FDM0MsQ0FNQSxZQUEyQixFQUFRLEVBQWEsQ0FDNUMsR0FBSSxJQUFnQixPQUFRLENBQ3hCLEdBQU0sR0FBYyxHQUF3QixDQUFNLEVBQ2xELE1BQVEsVUFBVSxLQUFLLENBQVcsR0FDN0IsVUFBUyxLQUFLLENBQVcsR0FBSyxTQUFTLEtBQUssQ0FBVyxFQUNoRSxDQUNBLE1BQU8sRUFDWCxDQUNBLFdBQXlCLEVBQU0sRUFBYSxDQUN4QyxNQUFPLElBQW9CLEVBQUssU0FBVSxDQUFXLENBQ3pELENBQ0EsWUFBeUIsRUFBTSxFQUFhLENBQ3hDLE1BQU8sSUFBb0IsR0FBUyxDQUFJLEVBQUcsQ0FBVyxDQUMxRCxDQUNBLFlBQTZCLEVBQVUsRUFBYSxDQVFoRCxHQUFNLEdBQVMsQUFQSyxDQUNoQixJQUFLLEVBQ0wsS0FBTSxFQUNOLE1BQU8sRUFDUCxRQUFTLEVBQ1QsS0FBTSxDQUNWLEVBQzJCLEdBQWEsRUFBRSxPQUFPLE1BQU0sR0FBRyxFQUFFLElBQUksRUFDMUQsRUFBVyxPQUFPLE9BQU8sRUFBVSxFQUFRLEVBQUksRUFDckQsR0FBSSxDQUFDLEVBQVMsUUFBUSxFQUNsQixNQUFPLE1BRVgsR0FBSSxHQUFrQixFQUFRLENBQVcsR0FDakMsSUFBZ0IsT0FBUSxDQUN4QixHQUFNLEdBQWMsR0FBd0IsQ0FBTSxFQUNsRCxHQUFJLFVBQVUsS0FBSyxDQUFXLEVBQzFCLE1BQU8sUUFBTyxPQUFPLEVBRXJCLEVBQU8sUUFBUSxVQUFXLEVBQUUsRUFBRSxRQUFRLFVBQVcsRUFBRSxFQUFHLEVBQUssQ0FFbkUsQ0FFSixNQUFPLEVBQ1gsQ0FFQSxvQkFBMkMsTUFBTSxDQUNqRCxFQVFBLFlBQStCLEVBQU0sZ0NBQ2pDLEdBQU0sR0FBTSxPQUFPLElBQ2IsQ0FBRSxTQUFVLEVBQ1osRUFBUyxPQUFPLE9BQ2hCLENBQUUsV0FBVSxTQUFRLFVBQVcsRUFBcUIsRUFDcEQsQ0FBQyxFQUFrQixHQUFhLEtBQU0sR0FBZ0IsQ0FBUSxFQUM5RCxFQUFXLEVBQUssT0FBTyxDQUFNLEVBQzdCLEVBQWlCLEtBQU0sR0FBWSxFQUFRLENBQVEsRUFDekQsR0FBSSxDQUNBLEdBQU0sR0FBYyxLQUFNLEdBQU0sT0FBTyxFQUFnQixFQUNsRCxRQUFRLG1CQUFvQixDQUFRLEVBQ3BDLFFBQVEsbUJBQW9CLEVBQU8sRUFBRSxPQUFPLE9BQU8sQ0FBQyxFQUNwRCxRQUFRLG9CQUFxQixDQUFRLEVBQ3JDLFFBQVEsMkRBQTRELENBQUMsRUFBRyxFQUFhLEVBQU0sRUFBVyxFQUFNLElBQWlCLENBQzlILEdBQU0sR0FBTSxFQUFPLEVBQ2IsR0FBYyxFQUFLLE1BQU0sRUFBRSxJQUFJLENBQ2pDLEtBQU0sRUFBSSxJQUFJLE1BQU0sRUFDcEIsT0FBUSxFQUFJLElBQUksUUFBUSxFQUN4QixPQUFRLEVBQUksSUFBSSxRQUFRLENBQzVCLENBQUMsRUFJRCxNQUhJLElBQ0EsR0FBWSxJQUFJLFNBQVMsRUFBVyxFQUFFLEVBQUcsQ0FBSSxFQUU3QyxFQUNPLEdBQVksT0FBTyxFQUFhLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUV2RCxHQUFZLE9BQU8sQ0FBTSxDQUNwQyxDQUFDLEVBQ0ksUUFBUSx3QkFBeUIsRUFBSyxNQUFNLEVBQUUsU0FBUyxFQUFHLEtBQUssRUFBRSxPQUFPLENBQU0sQ0FBQyxFQUMvRSxRQUFRLHVCQUF3QixFQUFLLE1BQU0sRUFBRSxJQUFJLEVBQUcsR0FBRyxFQUFFLE9BQU8sQ0FBTSxDQUFDLENBQUMsRUFFN0UsU0FBSSxZQUFZLEtBQUssRUFBYSxDQUFTLEVBQ3BDLENBQ1gsT0FDTyxFQUFQLENBQ0ksUUFBUSxNQUFNLDJCQUEyQixLQUFtQixDQUFHLEVBQy9ELEdBQUksR0FBUyxPQUFPLDRCQUE0QixDQUNwRCxDQUNKLEdBQ0EsWUFBc0IsRUFBTSxFQUFZLENBclR4QyxNQXNUSSxNQUFPLEtBQVcsRUFBVyxFQUFNLEtBQUssS0FBakMsT0FBdUMsSUFDbEQsQ0FDQSxhQUE0QixDQUl4QixHQUFNLENBQUUsU0FBVSxPQUFPLElBQ25CLENBQUUsVUFBVyxFQUFxQixFQUNsQyxFQUFtQixFQUFNLHNCQUFzQixFQUFTLGNBQWMsQ0FBTSxDQUFDLEVBQ25GLEdBQUksQ0FBQyxFQUNELEtBQU0sSUFBSSxJQUE2QixtQ0FBbUMsRUFFOUUsR0FBTSxHQUFhLENBQUMsRUFDcEIsU0FBUyxNQUFNLGdCQUFnQixFQUFrQixBQUFDLEdBQVMsQ0FDdkQsR0FBSSxZQUFnQixHQUFTLE1BQU8sQ0FDaEMsR0FBTSxHQUFPLEVBQWdCLEVBQU0sS0FBSyxFQUN4QyxHQUFJLEVBQU0sQ0FDTixHQUFNLEdBQWEsRUFBVyxFQUFNLEtBQUssRUFDekMsRUFBVyxHQUFjLENBQzdCLENBQ0osQ0FDSixDQUFDLEVBQ00sQ0FDWCxDQUVBLG9CQUE0QyxNQUFNLENBQ2xELEVBQ0EsYUFBeUIsQ0FDckIsR0FBTSxDQUFFLFVBQVcsT0FFZixFQUFZLEVBQU8sV0FBVyxFQUFFLE1BQU0sSUFDcEMsRUFBYSxDQUNmLFNBQ0EsU0FDQSxVQUNBLFlBQ0EsV0FDQSxTQUNBLFVBQ0osRUFDQSxLQUFPLEdBQ0gsRUFBVyxLQUFLLEVBQVcsTUFBTSxDQUFDLEVBQ2xDLElBRUosTUFBTyxFQUNYLENBQ0EsWUFBb0MsRUFBZSxDQUMvQyxNQUFPLElBQWMsRUFBRSxRQUFRLEVBQWMsWUFBWSxDQUFDLENBQzlELENBQ0EsWUFBZ0MsRUFBTSxnQ0FDbEMsR0FBTSxDQUFFLFNBQVUsT0FBTyxJQUNuQixDQUFFLFdBQVUsU0FBUSxVQUFXLEVBQXNCLEVBQ3JELENBQUMsRUFBa0IsR0FBYSxLQUFNLEdBQWdCLENBQVEsRUFDOUQsRUFBVyxFQUFLLE9BQU8sQ0FBTSxFQUM3QixFQUFpQixLQUFNLEdBQVksRUFBUSxDQUFRLEVBQ3pELEdBQUksQ0FDQSxHQUFNLEdBQWMsS0FBTSxHQUFNLE9BQU8sRUFBZ0IsRUFDbEQsUUFBUSwyREFBNEQsQ0FBQyxFQUFHLEVBQWEsRUFBTSxFQUFXLEVBQU0sSUFBaUIsQ0FDOUgsR0FBTSxHQUFNLE9BQU8sT0FBTyxFQUNwQixFQUFjLEVBQUssTUFBTSxFQUFFLElBQUksQ0FDakMsS0FBTSxFQUFJLElBQUksTUFBTSxFQUNwQixPQUFRLEVBQUksSUFBSSxRQUFRLEVBQ3hCLE9BQVEsRUFBSSxJQUFJLFFBQVEsQ0FDNUIsQ0FBQyxFQUlELE1BSEksSUFDQSxFQUFZLElBQUksU0FBUyxFQUFXLEVBQUUsRUFBRyxDQUFJLEVBRTdDLEVBQ08sRUFBWSxPQUFPLEVBQWEsVUFBVSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBRXZELEVBQVksT0FBTyxDQUFNLENBQ3BDLENBQUMsRUFDSSxRQUFRLG9CQUFxQixDQUFRLEVBQ3JDLFFBQVEsbUJBQW9CLE9BQU8sT0FBTyxFQUFFLE9BQU8sT0FBTyxDQUFDLEVBQzNELFFBQVEsK0VBQWdGLENBQUMsRUFBRyxFQUFXLElBQWlCLENBQ3pILEdBQU0sR0FBTSxHQUEyQixDQUFTLEVBQ2hELE1BQU8sR0FBSyxRQUFRLENBQUcsRUFBRSxPQUFPLEVBQWEsS0FBSyxDQUFDLENBQ3ZELENBQUMsQ0FBQyxFQUVGLGNBQU8sSUFBSSxZQUFZLEtBQUssRUFBYSxDQUFTLEVBQzNDLENBQ1gsT0FDTyxFQUFQLENBQ0ksUUFBUSxNQUFNLDJCQUEyQixLQUFtQixDQUFHLEVBQy9ELEdBQUksR0FBUyxPQUFPLDRCQUE0QixDQUNwRCxDQUNKLEdBQ0EsWUFBdUIsRUFBTSxFQUFhLENBN1kxQyxNQThZSSxNQUFPLEtBQVksRUFBVyxFQUFNLE1BQU0sS0FBbkMsT0FBeUMsSUFDcEQsQ0FDQSxhQUE2QixDQUN6QixHQUFNLEdBQWMsQ0FBQyxFQUNyQixHQUFJLENBQUMsR0FBOEIsRUFDL0IsTUFBTyxHQUVYLEdBQU0sQ0FBRSxTQUFVLE9BQU8sSUFDbkIsQ0FBRSxVQUFXLEVBQXNCLEVBQ25DLEVBQW9CLEVBQU0sc0JBQXNCLEVBQVMsY0FBYyxDQUFNLENBQUMsRUFDcEYsR0FBSSxDQUFDLEVBQ0QsS0FBTSxJQUFJLElBQThCLG9DQUFvQyxFQUVoRixTQUFTLE1BQU0sZ0JBQWdCLEVBQW1CLEFBQUMsR0FBUyxDQUN4RCxHQUFJLFlBQWdCLEdBQVMsTUFBTyxDQUNoQyxHQUFNLEdBQU8sRUFBZ0IsRUFBTSxNQUFNLEVBQ3pDLEdBQUksRUFBTSxDQUNOLEdBQU0sR0FBYSxFQUFXLEVBQU0sTUFBTSxFQUMxQyxFQUFZLEdBQWMsQ0FDOUIsQ0FDSixDQUNKLENBQUMsRUFDTSxDQUNYLENBRUEsb0JBQTZDLE1BQU0sQ0FDbkQsRUFRQSxZQUFpQyxFQUFNLGdDQUNuQyxHQUFNLENBQUUsU0FBVSxPQUFPLElBQ25CLENBQUUsV0FBVSxTQUFRLFVBQVcsRUFBdUIsRUFDdEQsQ0FBQyxFQUFrQixHQUFhLEtBQU0sR0FBZ0IsQ0FBUSxFQUM5RCxFQUFXLEVBQUssT0FBTyxDQUFNLEVBQzdCLEVBQWlCLEtBQU0sR0FBWSxFQUFRLENBQVEsRUFDekQsR0FBSSxDQUNBLEdBQU0sR0FBYyxLQUFNLEdBQU0sT0FBTyxFQUFnQixFQUNsRCxRQUFRLDJEQUE0RCxDQUFDLEVBQUcsRUFBYSxFQUFNLEVBQVcsRUFBTSxJQUFpQixDQUM5SCxHQUFNLEdBQU0sT0FBTyxPQUFPLEVBQ3BCLEVBQWMsRUFBSyxNQUFNLEVBQUUsSUFBSSxDQUNqQyxLQUFNLEVBQUksSUFBSSxNQUFNLEVBQ3BCLE9BQVEsRUFBSSxJQUFJLFFBQVEsRUFDeEIsT0FBUSxFQUFJLElBQUksUUFBUSxDQUM1QixDQUFDLEVBSUQsTUFISSxJQUNBLEVBQVksSUFBSSxTQUFTLEVBQVcsRUFBRSxFQUFHLENBQUksRUFFN0MsRUFDTyxFQUFZLE9BQU8sRUFBYSxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUMsRUFFdkQsRUFBWSxPQUFPLENBQU0sQ0FDcEMsQ0FBQyxFQUNJLFFBQVEsbUJBQW9CLENBQVEsRUFDcEMsUUFBUSxtQkFBb0IsT0FBTyxPQUFPLEVBQUUsT0FBTyxPQUFPLENBQUMsRUFDM0QsUUFBUSxvQkFBcUIsQ0FBUSxDQUFDLEVBRTNDLGNBQU8sSUFBSSxZQUFZLEtBQUssRUFBYSxDQUFTLEVBQzNDLENBQ1gsT0FDTyxFQUFQLENBQ0ksUUFBUSxNQUFNLDJCQUEyQixLQUFtQixDQUFHLEVBQy9ELEdBQUksR0FBUyxPQUFPLDRCQUE0QixDQUNwRCxDQUNKLEdBQ0EsWUFBd0IsRUFBTSxFQUFjLENBbmQ1QyxNQW9kSSxNQUFPLEtBQWEsRUFBVyxFQUFNLE9BQU8sS0FBckMsT0FBMkMsSUFDdEQsQ0FDQSxhQUE4QixDQUMxQixHQUFNLEdBQWUsQ0FBQyxFQUN0QixHQUFJLENBQUMsR0FBK0IsRUFDaEMsTUFBTyxHQUVYLEdBQU0sQ0FBRSxTQUFVLE9BQU8sSUFDbkIsQ0FBRSxVQUFXLEVBQXVCLEVBQ3BDLEVBQXFCLEVBQU0sc0JBQXNCLEVBQVMsY0FBYyxDQUFNLENBQUMsRUFDckYsR0FBSSxDQUFDLEVBQ0QsS0FBTSxJQUFJLElBQStCLHFDQUFxQyxFQUVsRixTQUFTLE1BQU0sZ0JBQWdCLEVBQW9CLEFBQUMsR0FBUyxDQUN6RCxHQUFJLFlBQWdCLEdBQVMsTUFBTyxDQUNoQyxHQUFNLEdBQU8sRUFBZ0IsRUFBTSxPQUFPLEVBQzFDLEdBQUksRUFBTSxDQUNOLEdBQU0sR0FBYSxFQUFXLEVBQU0sT0FBTyxFQUMzQyxFQUFhLEdBQWMsQ0FDL0IsQ0FDSixDQUNKLENBQUMsRUFDTSxDQUNYLENBRUEsb0JBQStDLE1BQU0sQ0FDckQsRUFRQSxZQUFtQyxFQUFNLGdDQUNyQyxHQUFNLENBQUUsU0FBVSxPQUFPLElBQ25CLENBQUUsV0FBVSxTQUFRLFVBQVcsRUFBeUIsRUFDeEQsQ0FBQyxFQUFrQixHQUFhLEtBQU0sR0FBZ0IsQ0FBUSxFQUM5RCxFQUFXLEVBQUssT0FBTyxDQUFNLEVBQzdCLEVBQWlCLEtBQU0sR0FBWSxFQUFRLENBQVEsRUFDekQsR0FBSSxDQUNBLEdBQU0sR0FBYyxLQUFNLEdBQU0sT0FBTyxFQUFnQixFQUNsRCxRQUFRLDJEQUE0RCxDQUFDLEVBQUcsRUFBYSxFQUFNLEVBQVcsRUFBTSxJQUFpQixDQUM5SCxHQUFNLEdBQU0sT0FBTyxPQUFPLEVBQ3BCLEVBQWMsRUFBSyxNQUFNLEVBQUUsSUFBSSxDQUNqQyxLQUFNLEVBQUksSUFBSSxNQUFNLEVBQ3BCLE9BQVEsRUFBSSxJQUFJLFFBQVEsRUFDeEIsT0FBUSxFQUFJLElBQUksUUFBUSxDQUM1QixDQUFDLEVBSUQsTUFISSxJQUNBLEVBQVksSUFBSSxTQUFTLEVBQVcsRUFBRSxFQUFHLENBQUksRUFFN0MsRUFDTyxFQUFZLE9BQU8sRUFBYSxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUMsRUFFdkQsRUFBWSxPQUFPLENBQU0sQ0FDcEMsQ0FBQyxFQUNJLFFBQVEsbUJBQW9CLENBQVEsRUFDcEMsUUFBUSxtQkFBb0IsT0FBTyxPQUFPLEVBQUUsT0FBTyxPQUFPLENBQUMsRUFDM0QsUUFBUSxvQkFBcUIsQ0FBUSxDQUFDLEVBRTNDLGNBQU8sSUFBSSxZQUFZLEtBQUssRUFBYSxDQUFTLEVBQzNDLENBQ1gsT0FDTyxFQUFQLENBQ0ksUUFBUSxNQUFNLDJCQUEyQixLQUFtQixDQUFHLEVBQy9ELEdBQUksR0FBUyxPQUFPLDRCQUE0QixDQUNwRCxDQUNKLEdBQ0EsWUFBMEIsRUFBTSxFQUFXLENBemhCM0MsTUEwaEJJLE1BQU8sS0FBVSxFQUFXLEVBQU0sU0FBUyxLQUFwQyxPQUEwQyxJQUNyRCxDQUNBLGFBQWdDLENBQzVCLEdBQU0sR0FBWSxDQUFDLEVBQ25CLEdBQUksQ0FBQyxHQUFpQyxFQUNsQyxNQUFPLEdBRVgsR0FBTSxDQUFFLFNBQVUsT0FBTyxJQUNuQixDQUFFLFVBQVcsRUFBeUIsRUFDdEMsRUFBa0IsRUFBTSxzQkFBc0IsRUFBUyxjQUFjLENBQU0sQ0FBQyxFQUNsRixHQUFJLENBQUMsRUFDRCxLQUFNLElBQUksSUFBaUMsdUNBQXVDLEVBRXRGLFNBQVMsTUFBTSxnQkFBZ0IsRUFBaUIsQUFBQyxHQUFTLENBQ3RELEdBQUksWUFBZ0IsR0FBUyxNQUFPLENBQ2hDLEdBQU0sR0FBTyxFQUFnQixFQUFNLFNBQVMsRUFDNUMsR0FBSSxFQUFNLENBQ04sR0FBTSxHQUFhLEVBQVcsRUFBTSxTQUFTLEVBQzdDLEVBQVUsR0FBYyxDQUM1QixDQUNKLENBQ0osQ0FBQyxFQUNNLENBQ1gsQ0FFQSxvQkFBNEMsTUFBTSxDQUNsRCxFQVFBLFlBQWdDLEVBQU0sZ0NBQ2xDLEdBQU0sQ0FBRSxTQUFVLE9BQU8sSUFDbkIsQ0FBRSxXQUFVLFNBQVEsVUFBVyxFQUFzQixFQUNyRCxDQUFDLEVBQWtCLEdBQWEsS0FBTSxHQUFnQixDQUFRLEVBQzlELEVBQVcsRUFBSyxPQUFPLENBQU0sRUFDN0IsRUFBaUIsS0FBTSxHQUFZLEVBQVEsQ0FBUSxFQUN6RCxHQUFJLENBQ0EsR0FBTSxHQUFjLEtBQU0sR0FBTSxPQUFPLEVBQWdCLEVBQ2xELFFBQVEsMkRBQTRELENBQUMsRUFBRyxFQUFhLEVBQU0sRUFBVyxFQUFNLElBQWlCLENBQzlILEdBQU0sR0FBTSxPQUFPLE9BQU8sRUFDcEIsRUFBYyxFQUFLLE1BQU0sRUFBRSxJQUFJLENBQ2pDLEtBQU0sRUFBSSxJQUFJLE1BQU0sRUFDcEIsT0FBUSxFQUFJLElBQUksUUFBUSxFQUN4QixPQUFRLEVBQUksSUFBSSxRQUFRLENBQzVCLENBQUMsRUFJRCxNQUhJLElBQ0EsRUFBWSxJQUFJLFNBQVMsRUFBVyxFQUFFLEVBQUcsQ0FBSSxFQUU3QyxFQUNPLEVBQVksT0FBTyxFQUFhLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUV2RCxFQUFZLE9BQU8sQ0FBTSxDQUNwQyxDQUFDLEVBQ0ksUUFBUSxtQkFBb0IsQ0FBUSxFQUNwQyxRQUFRLG1CQUFvQixPQUFPLE9BQU8sRUFBRSxPQUFPLE9BQU8sQ0FBQyxFQUMzRCxRQUFRLG9CQUFxQixDQUFRLENBQUMsRUFFM0MsY0FBTyxJQUFJLFlBQVksS0FBSyxFQUFhLENBQVMsRUFDM0MsQ0FDWCxPQUNPLEVBQVAsQ0FDSSxRQUFRLE1BQU0sMkJBQTJCLEtBQW1CLENBQUcsRUFDL0QsR0FBSSxHQUFTLE9BQU8sNEJBQTRCLENBQ3BELENBQ0osR0FDQSxZQUF1QixFQUFNLEVBQWEsQ0EvbEIxQyxNQWdtQkksTUFBTyxLQUFZLEVBQVcsRUFBTSxNQUFNLEtBQW5DLE9BQXlDLElBQ3BELENBQ0EsYUFBNkIsQ0FDekIsR0FBTSxHQUFjLENBQUMsRUFDckIsR0FBSSxDQUFDLEdBQThCLEVBQy9CLE1BQU8sR0FFWCxHQUFNLENBQUUsU0FBVSxPQUFPLElBQ25CLENBQUUsVUFBVyxFQUFzQixFQUNuQyxFQUFvQixFQUFNLHNCQUFzQixFQUFTLGNBQWMsQ0FBTSxDQUFDLEVBQ3BGLEdBQUksQ0FBQyxFQUNELEtBQU0sSUFBSSxJQUE4QixvQ0FBb0MsRUFFaEYsU0FBUyxNQUFNLGdCQUFnQixFQUFtQixBQUFDLEdBQVMsQ0FDeEQsR0FBSSxZQUFnQixHQUFTLE1BQU8sQ0FDaEMsR0FBTSxHQUFPLEVBQWdCLEVBQU0sTUFBTSxFQUN6QyxHQUFJLEVBQU0sQ0FDTixHQUFNLEdBQWEsRUFBVyxFQUFNLE1BQU0sRUFDMUMsRUFBWSxHQUFjLENBQzlCLENBQ0osQ0FDSixDQUFDLEVBQ00sQ0FDWCxDQUVBLGFBQXdDLENBem5CeEMsUUEwbkJJLEdBQU0sQ0FBRSxPQUFRLE9BRVYsRUFBbUIsRUFBSSxnQkFBZ0IsUUFBUSxlQUNyRCxHQUFJLEdBQW9CLEVBQWlCLFFBQ3JDLE1BQU8sR0FHWCxHQUFNLEdBQWdCLEVBQUksUUFBUSxVQUFVLGdCQUFnQixFQUM1RCxNQUFPLElBQWlCLFNBQWMsV0FBZCxjQUF3QixRQUF4QixjQUErQixRQUMzRCxDQUtBLGFBQXlDLENBeG9CekMsUUF5b0JJLEdBQU0sQ0FBRSxPQUFRLE9BRWhCLEdBQUksRUFBSSxRQUFRLFVBQVUsVUFBVSxFQUNoQyxNQUFPLEdBR1gsR0FBTSxHQUFnQixFQUFJLFFBQVEsVUFBVSxnQkFBZ0IsRUFDNUQsTUFBTyxJQUFpQixTQUFjLFdBQWQsY0FBd0IsU0FBeEIsY0FBZ0MsUUFDNUQsQ0FDQSxhQUEwQyxDQWxwQjFDLFFBbXBCSSxHQUFNLENBQUUsT0FBUSxPQUVWLEVBQWdCLEVBQUksUUFBUSxVQUFVLGdCQUFnQixFQUM1RCxNQUFPLElBQWlCLFNBQWMsV0FBZCxjQUF3QixVQUF4QixjQUFpQyxRQUM3RCxDQUNBLGFBQTRDLENBeHBCNUMsUUF5cEJJLEdBQU0sQ0FBRSxPQUFRLE9BRVYsRUFBZ0IsRUFBSSxRQUFRLFVBQVUsZ0JBQWdCLEVBQzVELE1BQU8sSUFBaUIsU0FBYyxXQUFkLGNBQXdCLFlBQXhCLGNBQW1DLFFBQy9ELENBQ0EsYUFBeUMsQ0E5cEJ6QyxRQStwQkksR0FBTSxDQUFFLE9BQVEsT0FFVixFQUFnQixFQUFJLFFBQVEsVUFBVSxnQkFBZ0IsRUFDNUQsTUFBTyxJQUFpQixTQUFjLFdBQWQsY0FBd0IsU0FBeEIsY0FBZ0MsUUFDNUQsQ0FDQSxZQUFpQyxFQUFhLENBUTFDLE1BQU8sQUFQYSxDQUNoQixJQUFLLEVBQ0wsS0FBTSxFQUNOLE1BQU8sRUFDUCxRQUFTLEVBQ1QsS0FBTSxDQUNWLEVBQUUsR0FDaUIsQ0FDdkIsQ0FDQSxZQUE0QixFQUFhLEVBQU0sQ0FNM0MsTUFBTyxBQUxVLENBQ2IsSUFBSyxHQUNMLE1BQU8sR0FDUCxLQUFNLEVBQ1YsRUFDZ0IsR0FBYSxDQUFJLENBQ3JDLENBRUEsRUFBUSwwQkFBNEIsR0FDcEMsRUFBUSw0QkFBOEIsR0FDdEMsRUFBUSw4QkFBZ0MsR0FDeEMsRUFBUSwyQkFBNkIsR0FDckMsRUFBUSwyQkFBNkIsR0FDckMsRUFBUSw2QkFBK0IsR0FDdkMsRUFBUSwrQkFBaUMsR0FDekMsRUFBUSxpQ0FBbUMsR0FDM0MsRUFBUSw4QkFBZ0MsR0FDeEMsRUFBUSw4QkFBZ0MsR0FDeEMsRUFBUSxnQkFBa0IsR0FDMUIsRUFBUSxrQkFBb0IsR0FDNUIsRUFBUSxtQkFBcUIsR0FDN0IsRUFBUSxvQkFBc0IsR0FDOUIsRUFBUSxpQkFBbUIsR0FDM0IsRUFBUSxpQkFBbUIsR0FDM0IsRUFBUSxpQkFBbUIsR0FDM0IsRUFBUSxtQkFBcUIsR0FDN0IsRUFBUSxxQkFBdUIsR0FDL0IsRUFBUSxrQkFBb0IsR0FDNUIsRUFBUSxrQkFBb0IsR0FDNUIsRUFBUSxhQUFlLEdBQ3ZCLEVBQVEscUJBQXVCLEVBQy9CLEVBQVEsZ0JBQWtCLEVBQzFCLEVBQVEsZ0JBQWtCLEdBQzFCLEVBQVEsV0FBYSxFQUNyQixFQUFRLGVBQWlCLEdBQ3pCLEVBQVEsdUJBQXlCLEVBQ2pDLEVBQVEsd0JBQTBCLEdBQ2xDLEVBQVEsaUJBQW1CLEdBQzNCLEVBQVEseUJBQTJCLEVBQ25DLEVBQVEsZ0JBQWtCLEVBQzFCLEVBQVEsY0FBZ0IsR0FDeEIsRUFBUSxzQkFBd0IsRUFDaEMsRUFBUSxjQUFnQixHQUN4QixFQUFRLHNCQUF3QixJQzF0QmhDLDhEQUF1QixvQkNBdkIsTUFBaUYsb0JDQWpGLE1BQXNDLG9CQ0F0QyxPQUE4QyxvQkFjdkMsZUFBb0MscUJBQWdDLENBSXZFLFlBQVksRUFBbUIsQ0FDM0IsTUFBTSxFQUFPLEdBQUcsRUFDaEIsS0FBSyxNQUFNLFNBQVMsQ0FBQyxPQUFPLEVBQUcsUUFBUyxHQUFPLEtBQUssYUFBYSxDQUFHLENBQUMsRUFDckUsS0FBSyxNQUFNLFNBQVMsQ0FBQyxNQUFNLEVBQUcsUUFBUyxHQUFPLEtBQUssYUFBYSxDQUFHLENBQUMsQ0FDeEUsQ0FFQSxpQkFBaUIsRUFBMkMsQ0FBRSxLQUFLLEtBQU8sQ0FBYyxDQUVsRixRQUFRLEVBQXdGLGdDQUNsRyxLQUFLLGlCQUFtQixFQUN4QixLQUFLLEtBQUssQ0FDZCxHQUVBLFVBQTRCLENBQUUsTUFBTyxNQUFLLElBQUssQ0FFL0MsWUFBWSxFQUE2QixDQUFFLE1BQU8sR0FBSyxPQUFRLENBRS9ELGNBQXFCLENBQVMsQ0FFOUIsaUJBQWlCLEVBQWlDLEVBQXVCLENBQUUsRUFBRyxTQUFTLE1BQU8sQ0FBRSxLQUFNLEVBQUssS0FBSyxPQUFRLENBQUMsQ0FBRSxDQUUzSCxhQUFhLEVBQTBCLENBQ25DLEdBQU0sR0FBZSxTQUFTLGNBQWMsa0NBQWtDLEVBQUUsWUFDMUUsRUFBTyxLQUFLLEtBQUssS0FBSyxHQUFLLEVBQUUsVUFBWSxDQUFZLEVBQzNELEFBQUksR0FDQSxNQUFLLGVBQWUsRUFBTSxDQUFHLEVBQzdCLEtBQUssTUFBTSxFQUVuQixDQUVBLG1CQUFtQixFQUFpQyxFQUF1QyxDQUFFLEtBQUssZUFBZSxFQUFLLEtBQU0sQ0FBRyxDQUFFLENBRWpJLGVBQWUsRUFBcUIsRUFBdUMsQ0FBRSxLQUFLLGlCQUFpQixFQUFNLENBQUcsQ0FBRSxDQUNsSCxFQ25EQSxNQUF3QyxvQkFFbEMsR0FBOEIscUNBV3ZCLEVBQWdDLENBQU8sRUFBb0IsRUFBaUIsSUFBc0MsMEJBQzNILEdBQU0sR0FBTSxzQkFBc0IsdUJBQWdDLEtBQVcsSUFDN0UsR0FBSSxDQUNBLEdBQU0sR0FBVyxLQUFNLGNBQVEsQ0FBRSxJQUFLLENBQUksQ0FBQyxFQUMzQyxNQUFTLEtBQWEsYUFBZSxJQUFhLHdCQUEyQixLQUFPLENBQ3hGLE9BQVMsRUFBUCxDQUNFLFFBQVEsSUFBSSx5Q0FBMEMsRUFBSyxDQUFLLENBQ3BFLENBQ0osR0FVYSxHQUFpQyxDQUFPLEVBQXdCLEVBQWUsS0FBa0MsMEJBQzFILEdBQU0sR0FBbUIsR0FBOEIsRUFDbEQsS0FBaUIsR0FBTyxzQkFBd0IsNEJBQ3JELEdBQUksQ0FDQSxHQUFNLEdBQVcsS0FBTSxjQUFRLENBQUUsSUFBSyxDQUFpQixDQUFDLEVBQ3hELE1BQVEsS0FBYSxpQkFBbUIsS0FBTyxLQUFNLE1BQUssTUFBTSxDQUFRLENBQzVFLE9BQVMsRUFBUCxDQUNFLFFBQVEsSUFBSSwrQ0FBK0MsSUFBb0IsQ0FBSyxDQUN4RixDQUNKLEdBR2EsR0FBMkIsSUFBMkIsMEJBQy9ELEdBQU0sR0FBZ0IsNkZBQ3RCLEdBQUksQ0FDQSxHQUFNLEdBQVcsS0FBTSxjQUFRLENBQUUsSUFBSyxDQUFjLENBQUMsRUFDckQsTUFBUSxLQUFhLGlCQUFtQixLQUFPLEtBQU0sTUFBSyxNQUFNLENBQVEsQ0FDNUUsT0FBUyxFQUFQLENBQ0UsUUFBUSxJQUFJLG9DQUFxQyxDQUFLLENBQzFELENBQ0osR0FFYSxFQUEyQixJQUEyQiwwQkFDL0QsR0FBTSxHQUFZLGdHQUNsQixHQUFJLENBQ0EsR0FBTSxHQUFXLEtBQU0sY0FBUSxDQUFFLElBQUssQ0FBVSxDQUFDLEVBQ2pELE1BQVEsS0FBYSxpQkFBbUIsS0FBTyxLQUFNLE1BQUssTUFBTSxDQUFRLENBQzVFLE9BQVMsRUFBUCxDQUNFLFFBQVEsSUFBSSxvQ0FBcUMsQ0FBSyxDQUMxRCxDQUNKLEdBR2EsR0FBaUMsQUFBTyxHQUE0QywwQkFDN0YsR0FBTSxHQUFZLHFDQUFxQyxzQkFDdkQsR0FBSSxDQUNBLEdBQU0sR0FBVyxLQUFNLGNBQVEsQ0FBRSxJQUFLLENBQVUsQ0FBQyxFQUNqRCxNQUFRLEtBQWEsaUJBQW1CLEtBQU8sQ0FDbkQsT0FBUyxFQUFQLENBQ0UsUUFBUSxJQUFJLG9DQUFxQyxDQUFLLENBQzFELENBQ0osR0FFYSxHQUE2QixDQUFPLEVBQXdCLElBQWtDLDBCQUN2RyxHQUFNLEdBQU0sZ0NBQWdDLGtCQUErQixzQkFDM0UsR0FBSSxDQUNBLEdBQU0sR0FBVyxLQUFNLGNBQVEsQ0FBRSxJQUFLLENBQUksQ0FBQyxFQUMzQyxNQUFRLEtBQWEsaUJBQW1CLEtBQU8sS0FBSyxNQUFNLENBQVEsQ0FDdEUsT0FBUyxFQUFQLENBQ0UsUUFBUSxJQUFJLG9DQUFxQyxDQUFLLENBQzFELENBQ0osR0FFYSxFQUE2QixDQUFPLEVBQXdCLElBQWtDLDBCQUN2RyxHQUFNLEdBQU8sS0FBTSxJQUEyQixFQUFnQixDQUFJLEVBRWxFLE1BQUcsR0FBSyxHQUFHLE9BQU8sVUFBVSxLQUVqQixFQUFLLEdBQUcsT0FBTyxVQUFVLEtBR3pCLEVBQ2YsR0N4RU8sR0FBTSxJQUE2QixDQUN0QyxXQUFZLENBQUMsRUFDYixXQUFZLENBQUMsRUFDYixnQkFBaUIsR0FDakIsc0JBQXVCLEdBQ3ZCLGtCQUFtQixHQUNuQixlQUFnQixHQUNoQixZQUFhLFdBQ2Isc0JBQXVCLEdBQ3ZCLGNBQWUsR0FDZixxQkFBc0IsRUFDMUIsRUFVQSxZQUEwQyxFQUFtQixFQUF1QyxnQ0FDaEcsQUFBSyxFQUFPLFNBQVMsV0FBVyxTQUFTLENBQWMsR0FDbkQsR0FBTyxTQUFTLFdBQVcsUUFBUSxDQUFjLEVBQ2pELEVBQU8sYUFBYSxFQUU1QixHQVVBLFlBQTRDLEVBQW1CLEVBQTBDLGdDQUNyRyxNQUFPLEdBQU8sU0FBUyxXQUFXLFNBQVMsQ0FBYyxDQUM3RCxHQVdDLFlBQXlDLEVBQW1CLEVBQXVDLGdDQUMvRixHQUFNLEdBQTZCLENBQy9CLEtBQU0sRUFDTixXQUFZLEtBQU0sR0FBMkIsRUFBZ0IsY0FBYyxDQUNoRixFQUNBLEVBQU8sU0FBUyxXQUFXLFFBQVEsQ0FBUSxFQUMzQyxFQUFPLGFBQWEsQ0FDeEIsR0FVQSxZQUE2QyxFQUFtQixFQUEwQyxnQ0FFdEcsTUFBTyxFQURrQixFQUFPLFNBQVMsV0FBVyxLQUFLLEdBQUksRUFBRSxPQUFTLENBQWMsQ0FFMUYsR0FZUSxZQUF1QyxFQUFtQixFQUF3QixFQUF1QixDQUM3RyxFQUFPLFNBQVMsV0FBVyxRQUFRLEdBQUcsQ0FDbEMsQUFBRyxFQUFFLE9BQVMsR0FDVixHQUFFLFdBQWEsRUFDZixFQUFPLGFBQWEsRUFFNUIsQ0FBQyxDQUdMLENDL0dBLE9BQXVCLG9CQVloQixXQUFzQixFQUFtQixFQUFhLEVBQW1CLEdBQUksRUFBc0IsS0FBWSxDQUNsSCxHQUFHLEVBQU8sU0FBUyx1QkFBdUIsR0FBTyxPQUNqRCxHQUFNLEdBQWlCLEVBQXNCLG9DQUFzQyxHQUM3RSxFQUFvQixHQUFJLFdBQU87QUFBQSxFQUFTO0FBQUEsRUFBUSxJQUFrQixFQUFpQixHQUFJLEVBRTdGLEFBQUcsR0FBcUIsR0FBVSxTQUFTLGNBQWdCLElBQVksd0JBQUUsRUFBb0IsQ0FBRSxHQUNuRyxDQ2JBLFlBQWdFLGdDQUM1RCxHQUFJLENBQ0EsR0FBTSxHQUFTLEtBQU0sT0FBTSx3QkFBMEIsS0FBSyxPQUFPLENBQUMsRUFDbEUsTUFBTyxHQUFPLFFBQVUsS0FBTyxFQUFPLE9BQVMsR0FDbkQsT0FBUSxFQUFOLENBQ0UsTUFBTyxFQUNYLENBQ0osR0xHTyxHQUFNLElBQWlCLEFBQUMsR0FDcEIsb0JBQWMsRUFBTyxJQUFJLE1BQU0sVUFBWSxTQUFTLEVBQUksSUFhdEQsR0FBb0IsQ0FBTyxFQUFtQixFQUE2QixFQUFjLEtBQXlCLDBCQUMzSCxHQUFNLEdBQVcsS0FBTSxJQUErQixDQUFtQixFQUN6RSxHQUFHLENBQUMsRUFDQSxTQUFhLEVBQU8scUdBQXFHLEVBQ2xILEdBRVgsS0FBTSxJQUFnQixFQUFRLEVBQWEsQ0FBUSxFQUNuRCxHQUFNLEdBQU0sR0FBRywwQkFBb0MsTUFDbkQsU0FBTyxJQUFJLEVBQU0sbUNBQW1DLEtBQXdCLEVBQUssRUFDakYsRUFBYSxFQUFPLEdBQUcsSUFBTSxHQUFJLElBQVUsMEJBQUUsT0FBTyxLQUFLLHNCQUFzQixHQUFxQixDQUFDLEVBQUMsRUFDdEcsV0FBVyxJQUFNLENBRWIsRUFBTyxJQUFJLFVBQVUsU0FBUyxDQUFXLENBQzdDLEVBQUcsR0FBRyxFQUNDLEVBQ1gsR0FXYSxHQUFrQixDQUFPLEVBQW1CLEVBQXFCLElBQW1DLDBCQUM3RyxHQUFNLEdBQXlCLEdBQWUsQ0FBTSxFQUM5QyxFQUFVLEVBQU8sSUFBSSxNQUFNLFFBQ2pDLEFBQUksTUFBTSxHQUFRLE9BQU8sQ0FBc0IsS0FBTSxJQUFPLE1BQU0sR0FBUSxNQUFNLENBQXNCLEdBQ3RHLEtBQU0sR0FBUSxNQUFNLEVBQXlCLEVBQWMsT0FBUSxDQUFPLENBQzlFLEdBVWEsR0FBaUMsQUFBTyxHQUFvQywwQkFDckYsR0FBTSxHQUFpQixLQUFNLEdBQXlCLEVBQ2hELEVBQXNDLE9BQU8sT0FBTyxDQUFjLEVBQUUsSUFBSSxBQUFDLEdBQWUsRUFBRSxRQUFTLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUyxLQUFNLENBQUUsRUFBRyxFQUMvSSxFQUFNLEdBQUksR0FBc0IsQ0FBTSxFQUM1QyxFQUFJLGlCQUFpQixDQUFrQixFQUN2QyxLQUFNLEdBQUksUUFBUSxBQUFPLEdBQVksMEJBQ2pDLEtBQU0sSUFBa0IsRUFBUSxFQUFRLEtBQUssS0FBTSxFQUFRLEtBQUssSUFBSSxDQUN4RSxFQUFDLENBQ0wsR0FVYSxFQUFxQyxBQUFDLEdBRXhDLEFBRFUsU0FBVSxFQUFvQixRQUFRLElBQUssTUFBTSxHQUNsRCxPQUFPLEVBQUcsR0FBRyxFQVlwQixHQUFlLENBQU8sRUFBbUIsSUFBK0MsMEJBQ2pHLEVBQU8sU0FBUyxXQUFhLEVBQU8sU0FBUyxXQUFXLE9BQU8sQUFBQyxHQUFNLEVBQUUsTUFBUSxDQUFtQixFQUNuRyxFQUFPLGFBQWEsRUFDcEIsS0FBTSxHQUFPLElBQUksTUFBTSxRQUFRLE9BQU8sR0FBZSxDQUFNLEVBQUksRUFBbUMsQ0FBbUIsRUFBSSxNQUFNLEVBQy9ILEdBQU0sR0FBTSxXQUFXLGlEQUN2QixFQUFPLElBQUksRUFBSyxFQUFJLEVBQ3BCLEVBQWEsRUFBUSxHQUFHLEdBQUssQ0FDakMsR0FVYSxFQUF5QixDQUFPLEVBQW1CLElBQW9DLDBCQUNoRyxHQUFHLE1BQU0sR0FBc0IsS0FBSSxHQUFPLENBQ3RDLFFBQVEsSUFBSSw2QkFBNkIsRUFDekMsTUFDSixDQUNBLEdBQUksR0FDRSxFQUFPLDBDQUNiLEVBQU8sSUFBSSxFQUFNLEVBQUksRUFDakIsR0FBWSxFQUFPLFNBQVMsc0JBQXNCLEdBQVksR0FBSSxVQUFPO0FBQUEsRUFBUyxJQUFRLEdBQUssR0FDbkcsT0FBVSxLQUFLLEdBQU8sU0FBUyxXQUFZLENBQ3ZDLEdBQU0sR0FBbUIsS0FBTSxHQUEyQixFQUFFLEtBQU0sY0FBYyxFQUNoRixBQUFHLElBQW1CLEVBQUUsWUFDcEIsTUFBTSxJQUFpQixFQUFRLEVBQUUsS0FBTSxFQUFFLFdBQVksQ0FBZ0IsRUFDN0UsQ0FDQSxHQUFNLEdBQU8sNENBQ2IsRUFBTyxJQUFJLEVBQU0sRUFBSSxFQUNqQixHQUNHLEdBQU8sU0FBUyxzQkFBc0IsRUFBVSxLQUFLLEVBQ3hELEVBQWEsRUFBUSxDQUFJLEVBRWpDLEdBWWEsR0FBbUIsQ0FBTyxFQUFtQixFQUE2QixFQUFjLEdBQUksRUFBYyxLQUF5QiwwQkFDNUksR0FBTSxHQUFXLEtBQU0sSUFBK0IsQ0FBbUIsRUFDekUsR0FBRyxDQUFDLEVBQ0EsU0FBYSxFQUFRLDJIQUEySCxFQUN6SSxHQUVYLEdBQU0sR0FBYyxFQUFtQyxDQUFtQixFQUMxRSxLQUFNLElBQWdCLEVBQVEsRUFBYSxDQUFRLEVBQ25ELEdBQThCLEVBQVEsRUFBcUIsQ0FBVyxFQUN0RSxHQUFNLEdBQU0sR0FBRyx3QkFBa0MsaUJBQW1DLFFBQWtCLEtBQ3RHLFNBQU8sSUFBSSxFQUFNLG1DQUFtQyxLQUF3QixFQUFLLEVBQ2pGLEVBQWEsRUFBUSxHQUFHLElBQU8sR0FBSSxJQUFVLDBCQUFDLE9BQU8sS0FBSyxzQkFBc0IsR0FBcUIsQ0FBQyxFQUFJLEVBQ25HLEVBQ1gsR01wS0EsTUFBK0Isb0JBUy9CLG1CQUF5QyxRQUFNLENBSzNDLFlBQVksRUFBbUIsRUFBNEIsR0FBTyxDQUM5RCxNQUFNLEVBQU8sR0FBRyxFQUNoQixLQUFLLE9BQVMsRUFDZCxLQUFLLFFBQVUsR0FDZixLQUFLLDBCQUE0QixDQUNyQyxDQUVNLFlBQTRCLGdDQUM5QixHQUFJLEtBQUssVUFBWSxHQUFJLE9BQ3pCLEdBQU0sR0FBa0IsS0FBSyxRQUFRLFFBQVEsc0JBQXVCLEVBQUUsRUFDdEUsR0FBSSxLQUFNLElBQXVCLEtBQUssT0FBUSxDQUFlLEVBQUcsQ0FDNUQsRUFBYSxLQUFLLE9BQVEsc0RBQXVELEVBQUUsRUFDbkYsTUFDSixDQUVBLEFBQUcsTUFBTSxJQUFrQixLQUFLLE9BQVEsRUFBaUIsRUFBbUMsQ0FBZSxDQUFDLElBQ3hHLE1BQU0sSUFBbUIsS0FBSyxPQUFRLENBQWUsRUFDckQsS0FBSyxNQUFNLEVBRW5CLEdBRUEsUUFBZSxDQUNYLEtBQUssVUFBVSxTQUFTLEtBQU0sQ0FBRSxLQUFNLG1DQUFvQyxDQUFDLEVBQzNFLEtBQUssVUFBVSxTQUFTLE9BQVEsQ0FBQyxFQUFHLEFBQUMsR0FBVyxDQUM1QyxHQUFJLFdBQVEsQ0FBTSxFQUNiLFFBQVEsQUFBQyxHQUFXLENBQ2pCLEVBQU8sZUFBZSxvREFBb0QsRUFDMUUsRUFBTyxTQUFTLEFBQUMsR0FBVSxDQUN2QixLQUFLLFFBQVUsRUFBTSxLQUFLLENBQzlCLENBQUMsRUFDRCxFQUFPLFFBQVEsaUJBQWlCLFVBQVcsQUFBTyxHQUFxQix3QkFDbkUsQUFBSSxFQUFFLE1BQVEsU0FBVyxLQUFLLFVBQVksS0FDdEMsR0FBRSxlQUFlLEVBQ2pCLEtBQU0sTUFBSyxXQUFXLEVBRTlCLEVBQUMsRUFDRCxFQUFPLFFBQVEsTUFBTSxNQUFRLE9BQzdCLE9BQU8sV0FBVyxJQUFNLENBQ3BCLEdBQU0sR0FBUSxTQUFTLGNBQWMsb0JBQW9CLEVBQ3pELEFBQUksR0FBTyxFQUFNLE9BQU8sRUFDeEIsRUFBTyxRQUFRLE1BQU0sQ0FDekIsRUFBRyxFQUFFLENBQ1QsQ0FBQyxFQUVMLEVBQU8sVUFBVSx5QkFBMEIsQUFBQyxHQUFzQixDQUM5RCxFQUNLLFNBQVMsU0FBVSxDQUFFLEtBQU0sQ0FBRSxLQUFNLFFBQVMsRUFBRyxLQUFNLFlBQWEsQ0FBQyxFQUNuRSxpQkFBaUIsUUFBUyxJQUFNLEtBQUssTUFBTSxDQUFDLEVBQ2pELEVBQWtCLFNBQVMsU0FBVSxDQUNqQyxLQUFNLENBQUUsS0FBTSxRQUFTLEVBQ3ZCLElBQUssVUFDTCxLQUFNLFdBQ1YsQ0FBQyxDQUNMLENBQUMsRUFHRCxFQUFPLGlCQUFpQixTQUFVLEFBQU8sR0FBYSx3QkFDbEQsRUFBRSxlQUFlLEVBQ2IsS0FBSyxVQUFZLElBQUksTUFBTSxNQUFLLFdBQVcsRUFDbkQsRUFBQyxDQUNMLENBQUMsQ0FDTCxDQUVNLFNBQXlCLGdDQUMzQixBQUFJLEtBQUssMkJBQ0wsTUFBTyxNQUFLLE9BQWUsSUFBSSxRQUFRLEtBQUssRUFDNUMsS0FBTyxNQUFLLE9BQWUsSUFBSSxRQUFRLFlBQVksaUJBQWlCLEVBRzVFLEdBQ0osRVAvRU8sbUJBQThCLG1CQUFpQixDQUdyRCxZQUFZLEVBQVUsRUFBbUIsQ0FDeEMsTUFBTSxFQUFLLENBQU0sRUFDakIsS0FBSyxPQUFTLENBQ2YsQ0FFQSxTQUFnQixDQUNmLEdBQU0sQ0FBRSxlQUFnQixLQUN4QixFQUFZLE1BQU0sRUFFbEIsRUFBWSxTQUFTLEtBQU0sQ0FBRSxLQUFNLEtBQUssT0FBTyxPQUFRLENBQUMsRUFFeEQsR0FBSSxXQUFRLENBQVcsRUFDckIsUUFBUSxnQ0FBZ0MsRUFDeEMsUUFBUSxvRkFBb0YsRUFDNUYsVUFBVSxBQUFDLEdBQXdCLENBQ25DLEVBQUcsU0FBUyxLQUFLLE9BQU8sU0FBUyxlQUFlLEVBQ2hELEVBQUcsU0FBUyxBQUFPLEdBQW1CLHdCQUNyQyxLQUFLLE9BQU8sU0FBUyxnQkFBa0IsRUFDdkMsS0FBTSxNQUFLLE9BQU8sYUFBYSxDQUNoQyxFQUFDLENBQ0YsQ0FBQyxFQUVGLEdBQUksV0FBUSxDQUFXLEVBQ3JCLFFBQVEsK0JBQStCLEVBQ3ZDLFFBQVEsbUZBQW1GLEVBQzNGLFVBQVUsQUFBQyxHQUF3QixDQUNuQyxFQUFHLFNBQVMsS0FBSyxPQUFPLFNBQVMscUJBQXFCLEVBQ3RELEVBQUcsU0FBUyxBQUFPLEdBQW1CLHdCQUNyQyxLQUFLLE9BQU8sU0FBUyxzQkFBd0IsRUFDN0MsS0FBTSxNQUFLLE9BQU8sYUFBYSxDQUNoQyxFQUFDLENBQ0YsQ0FBQyxFQUdGLEdBQUksV0FBUSxDQUFXLEVBQ3JCLFFBQVEsZUFBZSxFQUN2QixRQUFRLGtDQUFrQyxFQUMxQyxVQUFVLEFBQUMsR0FBd0IsQ0FDbkMsRUFBRyxTQUFTLEtBQUssT0FBTyxTQUFTLGlCQUFpQixFQUNsRCxFQUFHLFNBQVMsQUFBTyxHQUFtQix3QkFDckMsS0FBSyxPQUFPLFNBQVMsa0JBQW9CLEVBQ3pDLEFBQUksS0FBSyxPQUFPLFNBQVMsb0JBQXNCLEdBQzlDLEtBQUssT0FBTyxXQUFXLE9BQU8sRUFFOUIsS0FBSyxPQUFPLGlCQUFpQixFQUM5QixLQUFNLE1BQUssT0FBTyxhQUFhLENBQ2hDLEVBQUMsQ0FDRixDQUFDLEVBRUYsRUFBWSxTQUFTLElBQUksRUFDekIsRUFBWSxTQUFTLEtBQU0sQ0FBRSxLQUFNLGtCQUFtQixDQUFDLEVBQ3ZELEVBQVksU0FBUyxNQUFPLENBQUUsS0FBTSx5R0FBMEcsQ0FBQyxFQUMvSSxFQUFZLFNBQVMsR0FBRyxFQUN4QixFQUFZLFNBQVMsTUFBTyxDQUFFLEtBQU0saUVBQWtFLENBQUMsRUFDdkcsRUFBWSxTQUFTLEdBQUcsRUFDeEIsRUFBWSxTQUFTLE1BQU0sRUFDekIsU0FBUyxJQUFLLENBQUUsS0FBTSxRQUFTLENBQUMsRUFDbEMsRUFBWSxXQUFXLENBQUUsS0FBTSxtR0FBb0csQ0FBQyxFQUVwSSxHQUFJLFdBQVEsQ0FBVyxFQUNyQixVQUFVLEFBQUMsR0FBc0IsQ0FDakMsRUFBRyxjQUFjLGlCQUFpQixFQUNsQyxFQUFHLFFBQVEsSUFBVSx3QkFFcEIsS0FBSyxPQUFPLElBQUksUUFBUSxNQUFNLEVBQzlCLEtBQU0sTUFBSyxPQUFPLFlBQVkseUJBQXlCLEVBQUksQ0FDNUQsRUFBQyxDQUNGLENBQUMsRUFFRixPQUFXLEtBQU0sTUFBSyxPQUFPLFNBQVMsV0FDckMsR0FBSSxXQUFRLENBQVcsRUFDckIsUUFBUSxDQUFFLEVBQ1YsVUFBVSxBQUFDLEdBQXlCLENBQ3BDLEVBQUksUUFBUSxPQUFPLEVBQ25CLEVBQUksV0FBVyx5QkFBeUIsRUFDeEMsRUFBSSxRQUFRLElBQVksd0JBRXZCLEFBQUksRUFBSSxTQUFTLGNBQWdCLEdBQ2hDLEVBQUksY0FBYyxvQ0FBb0MsRUFFdEQsR0FBSSxTQUFTLGNBQWMsY0FBYyxPQUFPLEVBQ2hELEtBQU0sTUFBSyxPQUFPLFlBQVksYUFBYSxDQUFFLEVBRS9DLEVBQUMsQ0FDRixDQUFDLEVBR0gsRUFBWSxTQUFTLElBQUksRUFDekIsRUFBWSxTQUFTLEtBQU0sQ0FBRSxLQUFNLGtCQUFtQixDQUFDLEVBRXZELEdBQUksV0FBUSxDQUFXLEVBQ3JCLFVBQVUsQUFBQyxHQUFzQixDQUNqQyxFQUFHLGNBQWMsZ0JBQWdCLEVBQ2pDLEVBQUcsUUFBUSxJQUFVLHdCQUVwQixLQUFLLE9BQU8sSUFBSSxRQUFRLE1BQU0sRUFDN0IsR0FBSSxHQUFZLEtBQUssTUFBTSxFQUFHLEtBQUssQ0FDckMsRUFBQyxDQUNGLENBQUMsRUFHRixPQUFXLEtBQU0sTUFBSyxPQUFPLFNBQVMsV0FDckMsR0FBSSxXQUFRLENBQVcsRUFDckIsUUFBUSxFQUFHLElBQUksRUFDZixVQUFVLEFBQUMsR0FBeUIsQ0FDcEMsRUFBSSxRQUFRLE9BQU8sRUFDbkIsRUFBSSxXQUFXLHdCQUF3QixFQUN2QyxFQUFJLFFBQVEsSUFBWSx3QkFDdkIsQUFBSSxFQUFJLFNBQVMsY0FBZ0IsR0FDaEMsRUFBSSxjQUFjLG9DQUFvQyxFQUV0RCxHQUFJLFNBQVMsY0FBYyxjQUFjLE9BQU8sRUFDaEQsS0FBTSxJQUFhLEtBQUssT0FBUSxFQUFHLElBQUksRUFFekMsRUFBQyxDQUNGLENBQUMsRUFHSCxFQUFZLFNBQVMsSUFBSSxFQUN6QixFQUFZLFNBQVMsS0FBTSxDQUFFLEtBQU0sWUFBYSxDQUFDLEVBRWpELEdBQUksV0FBUSxDQUFXLEVBQ3JCLFFBQVEsc0JBQXNCLEVBQzlCLFFBQVEsb0hBQW9ILEVBQzVILFVBQVUsQUFBQyxHQUF3QixDQUNuQyxFQUFHLFNBQVMsS0FBSyxPQUFPLFNBQVMsb0JBQW9CLEVBQ3JELEVBQUcsU0FBUyxBQUFPLEdBQW1CLHdCQUNyQyxLQUFLLE9BQU8sU0FBUyxxQkFBdUIsRUFDNUMsS0FBTSxNQUFLLE9BQU8sYUFBYSxDQUNoQyxFQUFDLENBQ0YsQ0FBQyxFQUVGLEdBQUksV0FBUSxDQUFXLEVBQ3JCLFFBQVEsZ0JBQWdCLEVBQ3hCLFFBQVEsMERBQTBELEVBQ2xFLFVBQVUsQUFBQyxHQUF3QixDQUNuQyxFQUFHLFNBQVMsS0FBSyxPQUFPLFNBQVMsY0FBYyxFQUMvQyxFQUFHLFNBQVMsQUFBTyxHQUFtQix3QkFDckMsS0FBSyxPQUFPLFNBQVMsZUFBaUIsRUFDdEMsS0FBTSxNQUFLLE9BQU8sYUFBYSxDQUNoQyxFQUFDLENBQ0YsQ0FBQyxFQUVGLEdBQUksV0FBUSxLQUFLLFdBQVcsRUFDakIsUUFBUSx3QkFBd0IsRUFDaEMsUUFBUSxrRUFBa0UsRUFDMUUsVUFBVSxBQUFDLEdBQU8sQ0FDZixFQUFHLGVBQWUsbUJBQW1CLEVBQ2hDLFNBQVMsS0FBSyxPQUFPLFNBQVMsV0FBVyxFQUN6QyxTQUFTLEFBQU8sR0FBZSx3QkFDNUIsS0FBSyxPQUFPLFNBQVMsWUFBYyxFQUNyRCxLQUFNLE1BQUssT0FBTyxhQUFhLENBQ2pCLEVBQUMsQ0FDVCxDQUFDLEVBRVgsR0FBSSxXQUFRLENBQVcsRUFDckIsUUFBUSx3QkFBd0IsRUFDaEMsUUFBUSwwQ0FBMEMsRUFDbEQsVUFBVSxBQUFDLEdBQXdCLENBQ25DLEVBQUcsU0FBUyxLQUFLLE9BQU8sU0FBUyxxQkFBcUIsRUFDdEQsRUFBRyxTQUFTLEFBQU8sR0FBbUIsd0JBQ3JDLEtBQUssT0FBTyxTQUFTLHNCQUF3QixFQUM3QyxLQUFNLE1BQUssT0FBTyxhQUFhLENBQ2hDLEVBQUMsQ0FDRixDQUFDLEVBR0YsR0FBSSxXQUFRLENBQVcsRUFDckIsUUFBUSxnQkFBZ0IsRUFDeEIsUUFBUSxvRkFBb0YsRUFDNUYsVUFBVSxBQUFDLEdBQXdCLENBQ25DLEVBQUcsU0FBUyxLQUFLLE9BQU8sU0FBUyxhQUFhLEVBQzlDLEVBQUcsU0FBUyxBQUFPLEdBQW1CLHdCQUNyQyxLQUFLLE9BQU8sU0FBUyxjQUFnQixFQUNyQyxLQUFNLE1BQUssT0FBTyxhQUFhLENBQ2hDLEVBQUMsQ0FDRixDQUFDLENBRUgsQ0FDRCxFUTNMQSxNQUErQixvQkFTL0IsbUJBQStDLFFBQU0sQ0FNakQsWUFBWSxFQUFtQixFQUEwQixFQUE0QixHQUFPLENBQ3hGLE1BQU0sRUFBTyxHQUFHLEVBQ2hCLEtBQUssT0FBUyxFQUNkLEtBQUssWUFBYyxFQUNuQixLQUFLLFFBQVUsR0FDZixLQUFLLDBCQUE0QixDQUNyQyxDQUVNLFlBQTRCLGdDQUM5QixHQUFJLEtBQUssVUFBWSxHQUFJLE9BQ3pCLEdBQU0sR0FBa0IsS0FBSyxRQUFRLFFBQVEsc0JBQXNCLEVBQUUsRUFDckUsR0FBSSxLQUFNLElBQXNCLEtBQUssT0FBUSxDQUFlLEVBQUcsQ0FDM0QsRUFBYSxLQUFLLE9BQVEsc0RBQXVELEVBQUUsRUFDbkYsTUFDSixDQUVBLEFBQUksQUFEVyxNQUFNLE1BQUssWUFBWSxVQUFVLENBQWUsSUFFM0QsS0FBSyxNQUFNLENBRW5CLEdBRUEsUUFBZSxDQUNYLEtBQUssVUFBVSxTQUFTLEtBQU0sQ0FBRSxLQUFNLG9DQUFxQyxDQUFDLEVBQzVFLEtBQUssVUFBVSxTQUFTLE9BQVEsQ0FBQyxFQUFHLEFBQUMsR0FBVyxDQUM1QyxHQUFJLFdBQVEsQ0FBTSxFQUNiLFFBQVEsQUFBQyxHQUFXLENBQ2pCLEVBQU8sZUFBZSw4Q0FBOEMsRUFDcEUsRUFBTyxTQUFTLEFBQUMsR0FBVSxDQUN2QixLQUFLLFFBQVUsRUFBTSxLQUFLLENBQzlCLENBQUMsRUFDRCxFQUFPLFFBQVEsaUJBQWlCLFVBQVcsQUFBTyxHQUFxQix3QkFDbkUsQUFBSSxFQUFFLE1BQVEsU0FBVyxLQUFLLFVBQVksS0FDdEMsR0FBRSxlQUFlLEVBQ2pCLEtBQU0sTUFBSyxXQUFXLEVBRTlCLEVBQUMsRUFDRCxFQUFPLFFBQVEsTUFBTSxNQUFRLE9BQzdCLE9BQU8sV0FBVyxJQUFNLENBQ3BCLEdBQU0sR0FBUSxTQUFTLGNBQWMsb0JBQW9CLEVBQ3pELEFBQUksR0FBTyxFQUFNLE9BQU8sRUFDeEIsRUFBTyxRQUFRLE1BQU0sQ0FDekIsRUFBRyxFQUFFLENBQ1QsQ0FBQyxFQUVMLEVBQU8sVUFBVSx5QkFBMEIsQUFBQyxHQUFzQixDQUM5RCxFQUNLLFNBQVMsU0FBVSxDQUFFLEtBQU0sQ0FBRSxLQUFNLFFBQVMsRUFBRyxLQUFNLFlBQWEsQ0FBQyxFQUNuRSxpQkFBaUIsUUFBUyxJQUFNLEtBQUssTUFBTSxDQUFDLEVBQ2pELEVBQWtCLFNBQVMsU0FBVSxDQUNqQyxLQUFNLENBQUUsS0FBTSxRQUFTLEVBQ3ZCLElBQUssVUFDTCxLQUFNLFlBQ1YsQ0FBQyxDQUNMLENBQUMsRUFHRCxFQUFPLGlCQUFpQixTQUFVLEFBQU8sR0FBYSx3QkFDbEQsRUFBRSxlQUFlLEVBQ2IsS0FBSyxVQUFZLElBQUksTUFBTSxNQUFLLFdBQVcsRUFDbkQsRUFBQyxDQUNMLENBQUMsQ0FDTCxDQUVNLFNBQXlCLGdDQUMzQixBQUFHLEtBQUssMkJBQ0osTUFBTyxNQUFLLE9BQWUsSUFBSSxRQUFRLEtBQUssRUFDNUMsS0FBTyxNQUFLLE9BQWUsSUFBSSxRQUFRLFlBQVksaUJBQWlCLEVBRzVFLEdBQ0osRUNsRkEsTUFBc0Qsb0JBaUJ0RCxXQUFpQyxDQUc3QixZQUFZLEVBQW1CLENBQzNCLEtBQUssT0FBUyxDQUNsQixDQU9NLHlCQUF5QixFQUE0QixHQUFzQixnQ0FFN0UsQUFEa0IsR0FBSSxHQUFrQixLQUFLLE9BQVEsS0FBTSxDQUF5QixFQUMxRSxLQUFLLENBQ25CLEdBWU0sbUJBQW1CLEVBQXdCLEVBQWtCLEdBQU8sRUFBZSxHQUFnQyxnQ0FFckgsR0FBTSxHQUFlLEtBQU0sSUFBK0IsRUFBZ0IsQ0FBQyxDQUFlLEVBQzFGLE1BQUssR0FLQyxNQUFRLEdBSVIsV0FBYSxHQUlaLEVBSEMsSUFBYyxFQUFhLEtBQUssT0FBTyxHQUFHO0FBQUEseUVBQTJGLEVBQWEsRUFDL0ksTUFMSCxJQUFjLEVBQWEsS0FBSyxPQUFPLEdBQUc7QUFBQSwyRUFBNkYsRUFBYSxFQUNqSixNQU5ILElBQWMsRUFBYSxLQUFLLE9BQVEsR0FBRztBQUFBLGlGQUFtRyxFQUFhLEVBQ3hKLEtBWWYsR0FXTSxtQkFBbUIsRUFBd0IsRUFBMEIsRUFBNkMsZ0NBQ3BILE1BQU8sQ0FDSCxPQUFRLEtBQU0sR0FBOEIsRUFBZ0IsRUFBUyxRQUFTLFNBQVMsRUFDdkYsU0FBVSxFQUFjLEtBQU0sR0FBOEIsRUFBZ0IsRUFBUyxRQUFTLGVBQWUsRUFBSSxLQUNqSCxPQUFRLEtBQU0sR0FBOEIsRUFBZ0IsRUFBUyxRQUFTLFlBQVksQ0FDOUYsQ0FDSixHQVVNLGdDQUFnQyxFQUFzQixFQUF1QyxnQ0FDL0YsR0FBTSxHQUF5QixvQkFBYyxLQUFLLE9BQU8sSUFBSSxNQUFNLFVBQVksWUFBYyxDQUFZLEVBQUksSUFDdkcsRUFBVSxLQUFLLE9BQU8sSUFBSSxNQUFNLFFBQ3RDLEFBQUksT0FBTSxHQUFRLE9BQU8sQ0FBc0IsS0FBTSxJQUNqRCxDQUFFLE1BQU0sR0FBUSxPQUFPLEVBQXlCLGVBQWUsS0FFL0QsTUFBTSxHQUFRLE1BQU0sQ0FBc0IsR0FFOUMsS0FBTSxHQUFRLE1BQU0sRUFBeUIsVUFBVyxFQUFTLE1BQU0sRUFDdkUsS0FBTSxHQUFRLE1BQU0sRUFBeUIsZ0JBQWlCLEVBQVMsUUFBUSxFQUMzRSxFQUFTLFFBQVEsTUFBTSxHQUFRLE1BQU0sRUFBeUIsYUFBYyxFQUFTLE1BQU0sRUFDbkcsR0FhTSxVQUFVLEVBQXdCLEVBQW9CLEdBQU8sRUFBbUIsR0FBTyxFQUFvQixHQUF5QixnQ0FuSDlJLE1BcUhRLEdBQUksR0FBa0IsS0FBTSxNQUFLLG1CQUFtQixFQUFnQixHQUFNLEVBQUssRUFDekUsRUFBNkIsSUFJbkMsR0FISSxJQUFzQixJQUN0QixHQUFrQixLQUFNLE1BQUssbUJBQW1CLEVBQWdCLEdBQU8sRUFBSSxHQUUzRSxJQUFvQixLQUFNLENBQzFCLEdBQU0sR0FBTSxHQUFHO0FBQUEscUlBQ2YsWUFBSyxPQUFPLElBQUksRUFBSyxFQUFJLEVBQ3pCLEVBQWEsS0FBSyxPQUFRLEdBQUcsSUFBTyxFQUFhLEVBQzFDLEVBQ1gsQ0FFQSxHQUFJLENBQUMsRUFBZ0IsZUFBZSxTQUFTLEVBQUcsQ0FDNUMsR0FBTSxHQUFNLEdBQUc7QUFBQSxjQUErQixFQUFvQixRQUFVLG9JQUM1RSxZQUFLLE9BQU8sSUFBSSxFQUFLLEVBQUksRUFDekIsRUFBYSxLQUFLLE9BQVEsR0FBRyxJQUFPLEVBQWEsRUFDMUMsRUFDWCxDQUVBLEdBQU0sR0FBYSxJQUFZLHdCQUMzQixHQUFNLEdBQVMsS0FBTSxNQUFLLG1CQUFtQixFQUFnQixFQUFpQixDQUFpQixFQUkvRixHQUhJLElBQXFCLEVBQU8sV0FBYSxPQUN6QyxHQUFPLFNBQVcsS0FBSyxVQUFVLENBQWUsR0FFaEQsRUFBTyxTQUFXLEtBQU0sQ0FDeEIsR0FBTSxHQUFNLEdBQUc7QUFBQSx5RkFDZixZQUFLLE9BQU8sSUFBSSxFQUFLLEVBQUksRUFDekIsRUFBYSxLQUFLLE9BQVEsR0FBRyxJQUFPLEVBQWEsRUFDMUMsSUFDWCxDQUNBLE1BQU8sRUFDWCxHQUVBLEdBQUksSUFBc0IsR0FBTyxDQUM3QixHQUFNLEdBQWUsS0FBTSxHQUFXLEVBQ3RDLEdBQUksSUFBaUIsS0FBTSxPQUMzQixLQUFNLE1BQUssZ0NBQWdDLEVBQWdCLEdBQUksQ0FBWSxFQUMzRSxLQUFNLElBQW9CLEtBQUssT0FBUSxDQUFjLEVBRXJELEtBQU0sTUFBSyxPQUFPLElBQUksUUFBUSxjQUFjLEVBQzVDLEdBQU0sR0FBTSxHQUFHO0FBQUEsc0dBQ2YsS0FBSyxPQUFPLElBQUksRUFBSyxFQUFJLEVBQ3pCLEVBQWEsS0FBSyxPQUFRLEVBQUssRUFBYSxDQUNoRCxLQUFPLENBRUgsR0FBTSxHQUF5QixLQUFLLE9BQU8sSUFBSSxNQUFNLFVBQVksWUFBYyxFQUFnQixHQUFLLElBQ2hHLEVBQXdCLEtBQzVCLEdBQUksQ0FDQSxFQUF3QixLQUFNLE1BQUssT0FBTyxJQUFJLE1BQU0sUUFBUSxLQUFLLEVBQXlCLGVBQWUsQ0FDN0csT0FBUyxFQUFQLENBQ0UsR0FBSSxFQUFFLFFBQVUsTUFDWixZQUFNLE1BQUssVUFBVSxFQUFnQixHQUFPLENBQWlCLEVBQ3RELEdBR1AsUUFBUSxJQUFJLDZCQUE4QixFQUFnQixHQUFJLEtBQUssVUFBVSxFQUFHLEtBQU0sQ0FBQyxDQUFDLENBQ2hHLENBQ0EsR0FBTSxHQUFvQixLQUFNLE1BQUssTUFBTSxDQUFxQixFQUNoRSxHQUFJLEVBQWtCLFVBQVksRUFBZ0IsUUFBUyxDQUN2RCxHQUFNLEdBQWUsS0FBTSxHQUFXLEVBQ3RDLEdBQUksSUFBaUIsS0FBTSxPQUUzQixHQUFJLEVBQWtCLENBQ2xCLEdBQU0sR0FBTSxvQ0FBb0MsRUFBZ0IsbUJBQW1CLEVBQWtCLGNBQWMsRUFBZ0IsWUFDbkksS0FBSyxPQUFPLElBQUksRUFBTSxxQ0FBcUMsa0JBQStCLEVBQWdCLFdBQVksRUFBSyxFQUMzSCxFQUFhLEtBQUssT0FBUSxFQUFLLEdBQUksSUFBWSx3QkFBRSxPQUFPLEtBQUssc0JBQXNCLGtCQUErQixFQUFnQixTQUFTLENBQUMsRUFBQyxDQUNqSixLQUFPLENBQ0gsS0FBTSxNQUFLLGdDQUFnQyxFQUFnQixHQUFJLENBQVksRUFFM0UsS0FBTSxNQUFLLE9BQU8sSUFBSSxRQUFRLGNBQWMsRUFFeEMsUUFBSyxPQUFPLElBQUksUUFBUSxRQUFRLEVBQWdCLE1BQWhELFFBQXFELFVBQVUsTUFBTSxNQUFLLGFBQWEsRUFBZ0IsRUFBRSxHQUM3RyxHQUFNLEdBQU0sR0FBRyxFQUFnQjtBQUFBLHVDQUE0QyxFQUFrQixjQUFjLEVBQWdCLFlBQzNILEtBQUssT0FBTyxJQUFJLEVBQU0scUNBQXFDLGtCQUErQixFQUFnQixXQUFZLEVBQUssRUFDM0gsRUFBYSxLQUFLLE9BQVEsRUFBSyxHQUFJLElBQVksd0JBQUUsT0FBTyxLQUFLLHNCQUFzQixrQkFBK0IsRUFBZ0IsU0FBUyxDQUFFLEVBQUUsQ0FDbkosQ0FDSixLQUNJLEFBQUksSUFBbUIsRUFBYSxLQUFLLE9BQVEsMkJBQTJCLElBQWtCLENBQUMsQ0FDdkcsQ0FDQSxNQUFPLEVBQ1gsR0FVTSxhQUFhLEVBQW1DLGdDQUVsRCxHQUFNLEdBQVUsS0FBSyxPQUFPLElBQUksUUFDaEMsR0FBSSxDQUNBLEtBQU0sR0FBUSxjQUFjLENBQVUsRUFDdEMsS0FBTSxHQUFRLGFBQWEsQ0FBVSxDQUN6QyxPQUFTLEVBQVAsQ0FBWSxRQUFRLElBQUksZ0JBQWlCLENBQUMsQ0FBRSxDQUNsRCxHQVVNLGFBQWEsRUFBd0IsRUFBc0IsR0FBTyxFQUFvQixHQUF5QixnQ0FDakgsR0FBTSxHQUFTLEtBQU0sTUFBSyxVQUFVLEVBQWdCLEdBQU0sRUFBcUIsQ0FBaUIsRUFDaEcsTUFBSSxLQUFXLElBQVMsSUFBd0IsSUFDaEQsRUFBYSxLQUFLLE9BQVEsR0FBRztBQUFBLHlCQUEwQyxFQUNoRSxDQUNYLEdBUU0saUNBQWlDLEVBQVcsR0FBTyxFQUFzQixHQUFzQixnQ0FDakcsR0FBRyxNQUFNLEdBQXNCLEtBQUksR0FBTyxDQUN0QyxRQUFRLElBQUksNkJBQTZCLEVBQ3pDLE1BQ0osQ0FDQSxHQUFJLEdBQ0UsRUFBTyxzQ0FDYixLQUFLLE9BQU8sSUFBSSxFQUFNLEVBQUksRUFDdEIsR0FBWSxLQUFLLE9BQU8sU0FBUyxzQkFBc0IsR0FBWSxHQUFJLFVBQU87QUFBQSxFQUFTLElBQVEsR0FBSyxHQUN4RyxPQUFXLEtBQU0sTUFBSyxPQUFPLFNBQVMsV0FDbEMsS0FBTSxNQUFLLGFBQWEsRUFBSSxDQUFtQixFQUVuRCxHQUFNLEdBQU8sd0NBQ2IsS0FBSyxPQUFPLElBQUksRUFBTSxFQUFJLEVBQ3RCLEdBQ0EsR0FBVSxLQUFLLEVBQ2YsRUFBYSxLQUFLLE9BQVEsRUFBTSxFQUFFLEVBRTFDLEdBU00sYUFBYSxFQUF1QyxnQ0FDdEQsR0FBTSxHQUFNLFdBQVcsMEJBQ3ZCLEtBQUssT0FBTyxJQUFJLEVBQUssRUFBSSxFQUN6QixLQUFLLE9BQU8sU0FBUyxXQUFhLEtBQUssT0FBTyxTQUFTLFdBQVcsT0FBTyxBQUFDLEdBQU0sR0FBSyxDQUFjLEVBQ25HLEtBQUssT0FBTyxhQUFhLENBQzdCLEdBU0EsMEJBQTBCLEVBQW9DLENBRTFELEdBQU0sR0FBSyxLQUFLLE9BQU8sSUFBSSxRQUNyQixFQUE4QixPQUFPLE9BQU8sRUFBRyxTQUFTLEVBRXhELEVBQW1DLE9BQU8sT0FBTyxFQUFHLE9BQU8sRUFBRSxJQUFJLEdBQUssRUFBRSxRQUFRLEVBQ3RGLE1BQU8sR0FDSCxFQUFVLE9BQU8sR0FBWSxFQUFlLEtBQUssR0FBYyxFQUFTLEtBQU8sRUFBVyxFQUFFLENBQUMsRUFDN0YsRUFBVSxPQUFPLEdBQVksQ0FBQyxFQUFlLEtBQUssR0FBYyxFQUFTLEtBQU8sRUFBVyxFQUFFLENBQUMsQ0FDdEcsQ0FDSixFQ2hTQSxPQUF3QixvQkFFakIsYUFBMEIsQ0FDN0IsZUFDSSxXQUNBLG01REFDSixDQUNKLENDUEEsTUFBd0Msb0JBQ3hDLEdBQXFDLFNBWTlCLFlBQWdCLEVBQW1CLEVBQW1CLEVBQW1CLEdBQWEsQ0FFekYsR0FERyxFQUFPLFNBQVMsZUFBZSxRQUFRLElBQUksU0FBVyxDQUFTLEVBQzlELEVBQU8sU0FBUyxlQUFnQixDQUNoQyxHQUFJLEVBQU8sU0FBUyx3QkFBMEIsSUFBUyxJQUFxQixHQUN4RSxPQUNHLENBQ0gsR0FBTSxHQUFXLEVBQU8sU0FBUyxZQUFjLE1BQ3pDLEVBQWEsS0FBTyxhQUFPLEVBQUUsT0FBTyw0QkFBcUIsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFJLE1BQ2xGLGFBQU8sRUFBRSxPQUFPLE9BQU8sRUFDckIsRUFBYyxXQUFTLFVBQVksT0FBTyxRQUFRLElBQUksRUFBRSxTQUFTLEVBQUksU0FDdkUsRUFBUyxFQUFhLElBQU0sRUFBYyxJQUFNLEVBQVUsUUFBUTtBQUFBLEVBQUssR0FBRyxFQUFJO0FBQUE7QUFBQSxFQUNsRixXQUFXLElBQVksd0JBQ25CLEdBQUksTUFBTSxHQUFPLElBQUksTUFBTSxRQUFRLE9BQU8sQ0FBUSxLQUFNLEdBQU0sQ0FDMUQsR0FBTSxHQUFlLEtBQU0sR0FBTyxJQUFJLE1BQU0sUUFBUSxLQUFLLENBQVEsRUFDakUsRUFBUyxFQUFTLEVBQ2xCLEdBQU0sR0FBTyxFQUFPLElBQUksTUFBTSxzQkFBc0IsQ0FBUSxFQUM1RCxLQUFNLEdBQU8sSUFBSSxNQUFNLE9BQU8sRUFBTSxDQUFNLENBQzlDLEtBQ0ksTUFBTSxHQUFPLElBQUksTUFBTSxPQUFPLEVBQVUsQ0FBTSxDQUN0RCxHQUFHLEVBQUUsQ0FDVCxDQUNKLENBQ0osQ0M1QkEsV0FBb0MsQ0FrT2hDLFlBQVksRUFBbUIsQ0FoTy9CLGtCQUFlLENBQ1gsQ0FDSSxHQUFJLHFCQUNKLEtBQU0sV0FDTixLQUFNLHlDQUNOLGFBQWMsR0FDZCxTQUFVLElBQVksd0JBQUUsS0FBTSxNQUFLLE9BQU8sWUFBWSx5QkFBeUIsQ0FBRSxFQUNyRixFQUNBLENBQ0ksR0FBSSxnQ0FDSixLQUFNLFdBQ04sS0FBTSw0REFDTixhQUFjLEdBQ2QsU0FBVSxJQUFZLHdCQUFFLEtBQU0sTUFBSyxPQUFPLFlBQVksaUNBQWlDLEdBQU0sRUFBSyxDQUFFLEVBQ3hHLEVBQ0EsQ0FDSSxHQUFJLG9DQUNKLEtBQU0sV0FDTixLQUFNLG9FQUNOLGFBQWMsR0FDZCxTQUFVLElBQVksd0JBQUUsS0FBTSxNQUFLLE9BQU8sWUFBWSxpQ0FBaUMsR0FBTSxFQUFJLENBQUUsRUFDdkcsRUFDQSxDQUNJLEdBQUksdUJBQ0osS0FBTSxXQUNOLEtBQU0sNENBQ04sYUFBYyxHQUNkLFNBQVUsSUFBWSx3QkFDbEIsR0FBTSxHQUE4QixPQUFPLE9BQU8sS0FBSyxPQUFPLFNBQVMsVUFBVSxFQUFFLElBQUksQUFBQyxHQUFlLEVBQUUsUUFBUyxFQUFHLEtBQU0sQ0FBRSxFQUFHLEVBQzFILEVBQU0sR0FBSSxHQUFzQixLQUFLLE1BQU0sRUFDakQsRUFBSSxpQkFBaUIsQ0FBVSxFQUMvQixLQUFNLEdBQUksUUFBUSxBQUFPLEdBQVksd0JBQ2pDLEdBQU0sR0FBTSw0QkFBNEIsRUFBUSxPQUNoRCxLQUFLLE9BQU8sSUFBSSxFQUFJLEVBQUksRUFDeEIsRUFBYSxLQUFLLE9BQVE7QUFBQSxFQUFLLElBQU8sQ0FBQyxFQUN2QyxLQUFNLE1BQUssT0FBTyxZQUFZLGFBQWEsRUFBUSxLQUFNLEdBQU8sRUFBSSxDQUN4RSxFQUFDLENBQ0wsRUFDSixFQUNBLENBQ0ksR0FBSSxxQkFDSixLQUFNLFdBQ04sS0FBTSxzREFDTixhQUFjLEdBQ2QsU0FBVSxJQUFZLHdCQUVsQixHQUFNLEdBQThCLE9BQU8sT0FBTyxLQUFLLE9BQU8sSUFBSSxRQUFRLFNBQVMsRUFBRSxJQUFJLEFBQUMsR0FBZSxFQUFFLFFBQVMsRUFBRSxHQUFJLEtBQU0sRUFBRSxFQUFHLEVBQUcsRUFDbEksRUFBTSxHQUFJLEdBQXNCLEtBQUssTUFBTSxFQUNqRCxFQUFJLGlCQUFpQixDQUFVLEVBQy9CLEtBQU0sR0FBSSxRQUFRLEFBQU8sR0FBWSx3QkFDakMsRUFBYSxLQUFLLE9BQVEsR0FBRyxFQUFRO0FBQUEsd0JBQWdDLENBQUMsRUFDdEUsS0FBTSxNQUFLLE9BQU8sWUFBWSxhQUFhLEVBQVEsSUFBSSxDQUMzRCxFQUFDLENBQ0wsRUFDSixFQUNBLENBQ0ksR0FBSSxxQkFDSixLQUFNLFdBQ04sS0FBTSw0Q0FDTixhQUFjLEdBQ2QsU0FBVSxJQUFZLHdCQUNsQixHQUFNLEdBQWEsS0FBSyxPQUFPLFlBQVksMEJBQTBCLEVBQUksRUFBRSxJQUFJLEdBQXFCLEVBQUUsUUFBUyxHQUFHLEVBQVMsU0FBUyxFQUFTLE1BQU8sS0FBTSxFQUFTLEVBQUcsRUFBRyxFQUNuSyxFQUFNLEdBQUksR0FBc0IsS0FBSyxNQUFNLEVBQ2pELEVBQUksaUJBQWlCLENBQVUsRUFDL0IsS0FBTSxHQUFJLFFBQVEsQUFBTyxHQUFZLHdCQUNqQyxLQUFLLE9BQU8sSUFBSSxHQUFHLEVBQVEsMEJBQTJCLEVBQUssRUFFM0QsS0FBTSxNQUFLLE9BQU8sSUFBSSxRQUFRLGNBQWMsRUFBUSxJQUFJLENBQzVELEVBQUMsQ0FDTCxFQUNKLEVBQ0EsQ0FDSSxHQUFJLG9CQUNKLEtBQU0sV0FDTixLQUFNLDBDQUNOLGFBQWMsR0FDZCxTQUFVLElBQVksd0JBQ2xCLEdBQU0sR0FBYSxLQUFLLE9BQU8sWUFBWSwwQkFBMEIsRUFBSyxFQUFFLElBQUksR0FBcUIsRUFBRSxRQUFTLEdBQUcsRUFBUyxTQUFTLEVBQVMsTUFBTyxLQUFNLEVBQVMsRUFBRyxFQUFHLEVBQ3BLLEVBQU0sR0FBSSxHQUFzQixLQUFLLE1BQU0sRUFDakQsRUFBSSxpQkFBaUIsQ0FBVSxFQUMvQixLQUFNLEdBQUksUUFBUSxBQUFPLEdBQVksd0JBQ2pDLEtBQUssT0FBTyxJQUFJLEdBQUcsRUFBUSx5QkFBMEIsRUFBSyxFQUUxRCxLQUFNLE1BQUssT0FBTyxJQUFJLFFBQVEsYUFBYSxFQUFRLElBQUksQ0FDM0QsRUFBQyxDQUNMLEVBQ0osRUFDQSxDQUNJLEdBQUksNkJBQ0osS0FBTSxXQUNOLEtBQU0sbURBQ04sYUFBYyxHQUNkLFNBQVUsSUFBWSx3QkFDbEIsR0FBTSxHQUFtQixLQUFNLElBQXlCLEVBQ2xELEVBQXVDLE9BQU8sT0FBTyxDQUFnQixFQUFFLElBQUksQUFBQyxHQUFlLEVBQUUsUUFBUyxXQUFXLEVBQUUsVUFBVSxFQUFFLFFBQVMsS0FBTSxFQUFFLElBQUssRUFBRyxFQUN4SixFQUE0QixPQUFPLE9BQU8sS0FBSyxPQUFPLFNBQVMsVUFBVSxFQUFFLElBQUksQUFBQyxHQUFlLEVBQUUsUUFBUyxTQUFXLEVBQUcsS0FBTSxDQUFFLEVBQUcsRUFDekksRUFBb0IsUUFBUSxHQUFNLEVBQVMsS0FBSyxDQUFFLENBQUMsRUFDbkQsR0FBTSxHQUFNLEdBQUksR0FBc0IsS0FBSyxNQUFNLEVBQ2pELEVBQUksaUJBQWlCLENBQVEsRUFDN0IsS0FBTSxHQUFJLFFBQVEsQUFBTyxHQUFZLHdCQUNqQyxBQUFJLEVBQVEsTUFBTSxPQUFPLEtBQUssc0JBQXNCLEVBQVEsTUFBTSxDQUN0RSxFQUFDLENBQ0wsRUFDSixFQUNBLENBQ0ksR0FBSSwyQkFDSixLQUFNLFdBQ04sS0FBTSw4REFDTixhQUFjLEdBQ2QsU0FBVSxJQUFZLHdCQUNsQixHQUFNLEdBQWlCLEtBQU0sR0FBeUIsRUFDaEQsRUFBc0MsT0FBTyxPQUFPLENBQWMsRUFBRSxJQUFJLEFBQUMsR0FBZSxFQUFFLFFBQVMsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFTLEtBQU0sRUFBRSxJQUFLLEVBQUcsRUFDcEosRUFBTSxHQUFJLEdBQXNCLEtBQUssTUFBTSxFQUNqRCxFQUFJLGlCQUFpQixDQUFrQixFQUN2QyxLQUFNLEdBQUksUUFBUSxBQUFPLEdBQVksd0JBQ2pDLEFBQUksRUFBUSxNQUFNLE9BQU8sS0FBSyxzQkFBc0IsRUFBUSxNQUFNLENBQ3RFLEVBQUMsQ0FDTCxFQUNKLEVBQ0EsQ0FDSSxHQUFJLDJCQUNKLEtBQU0sV0FDTixLQUFNLG9DQUNOLGFBQWMsR0FDZCxTQUFVLElBQVksd0JBRWxCLEdBQU0sR0FBVyxLQUFLLE9BQU8sSUFBSSxRQUUzQixFQUE0QyxPQUFPLE9BQU8sRUFBUyxVQUFVLEVBQUUsSUFBSSxBQUFDLEdBQWUsRUFBRSxRQUFTLFdBQWEsRUFBRSxLQUFNLEtBQU0sRUFBRSxFQUFHLEVBQUcsRUFDakosRUFBTSxHQUFJLEdBQXNCLEtBQUssTUFBTSxFQUUzQyxFQUEwQyxPQUFPLE9BQU8sRUFBUyxXQUFXLEVBQUUsSUFBSSxBQUFDLEdBQWUsRUFBRSxRQUFTLFNBQVcsRUFBRSxLQUFNLEtBQU0sRUFBRSxFQUFHLEVBQUcsRUFDcEosRUFBeUIsUUFBUSxHQUFNLEVBQXVCLEtBQUssQ0FBRSxDQUFDLEVBQ3RFLEVBQUksaUJBQWlCLENBQXNCLEVBQzNDLEtBQU0sR0FBSSxRQUFRLEFBQU8sR0FBWSx3QkFDakMsRUFBUyxLQUFLLEVBQ2QsRUFBUyxZQUFZLEVBQVEsSUFBSSxDQUNyQyxFQUFDLENBQ0wsRUFDSixFQUNBLENBQ0ksR0FBSSwwQkFDSixLQUFNLFdBQ04sS0FBTSxpQ0FDTixhQUFjLEdBQ2QsU0FBVSxJQUFTLHdCQUFHLFlBQU0sSUFBK0IsS0FBSyxNQUFNLEdBQzFFLEVBQ0EsQ0FDSSxHQUFJLHFCQUNKLEtBQU0sV0FDTixLQUFNLGlFQUNOLGFBQWMsR0FDZCxTQUFVLElBQVksd0JBQUUsQUFBQyxHQUFJLEdBQVksS0FBSyxNQUFNLEVBQUcsS0FBSyxDQUFFLEVBQ2xFLEVBQ0EsQ0FDSSxHQUFJLHdCQUNKLEtBQU0sV0FDTixLQUFNLDZCQUNOLGFBQWMsR0FDZCxTQUFVLElBQVMsd0JBQUcsWUFBTSxHQUF1QixLQUFLLE9BQVEsRUFBSSxHQUN4RSxFQUNBLENBQ0ksR0FBSSxtQkFDSixLQUFNLFdBQ04sS0FBTSwrQkFDTixhQUFjLEdBQ2QsU0FBVSxJQUFZLHdCQUVsQixHQUFNLEdBQXNDLE9BQU8sT0FBTyxLQUFLLE9BQU8sSUFBSSxVQUFVLE1BQU0sRUFBRSxJQUFJLEFBQUMsR0FBZSxFQUFFLFFBQVMsRUFBRyxLQUFNLENBQUUsRUFBRyxFQUN6SSxFQUFtQixRQUFRLENBQUUsUUFBUyx5QkFBMEIsS0FBTSxFQUFHLENBQUMsRUFDMUUsR0FBTSxHQUFNLEdBQUksR0FBc0IsS0FBSyxNQUFNLEVBQ2pELEVBQUksaUJBQWlCLENBQWtCLEVBQ3ZDLEtBQU0sR0FBSSxRQUFRLEFBQU8sR0FBWSx3QkFDakMsS0FBSyxPQUFPLElBQUkscUJBQXFCLEVBQVEsVUFBVyxFQUFLLEVBRTdELEtBQUssT0FBTyxJQUFJLFVBQVUsU0FBUyxFQUFRLElBQUksQ0FDbkQsRUFBQyxDQUNMLEVBQ0osRUFDQSxDQUNJLEdBQUksbUJBQ0osS0FBTSxXQUNOLEtBQU0sb0JBQ04sYUFBYyxHQUNkLFNBQVUsSUFBUyx3QkFBRyxZQUFLLHNCQUFzQixHQUNyRCxDQUNKLEVBdUNJLEtBQUssT0FBUyxFQUVkLEtBQUssYUFBYSxRQUFRLEFBQU8sR0FBUyx3QkFDdEMsS0FBSyxPQUFPLFdBQVcsQ0FDbkIsR0FBSSxFQUFLLEdBQ1QsS0FBTSxFQUFLLEtBQ1gsS0FBTSxFQUFLLEtBQ1gsU0FBVSxJQUFZLHdCQUFFLEtBQU0sR0FBSyxTQUFTLENBQUUsRUFDbEQsQ0FBQyxDQUNMLEVBQUMsQ0FDTCxDQS9DTSx1QkFBdUMsZ0NBQ3pDLEdBQU0sR0FBbUMsQ0FBQyxFQUMxQyxLQUFLLGFBQWEsUUFBUSxHQUFPLENBQUUsQUFBSSxFQUFJLGNBQWMsRUFBZ0IsS0FBSyxDQUFFLFFBQVMsRUFBSSxLQUFNLEtBQU0sRUFBSSxRQUFTLENBQUMsQ0FBRSxDQUFDLEVBQzFILEdBQU0sR0FBTSxHQUFJLEdBQXNCLEtBQUssTUFBTSxFQUUzQyxFQUFXLEtBQUssT0FBTyxJQUFJLFFBRTNCLEVBQTBDLE9BQU8sT0FBTyxFQUFTLFdBQVcsRUFBRSxJQUFJLEFBQUMsR0FDOUUsRUFDSCxRQUFTLFNBQVcsRUFBRSxLQUN0QixLQUFNLElBQVksd0JBQ2QsRUFBUyxLQUFLLEVBQ2QsRUFBUyxZQUFZLEVBQUUsRUFBRSxDQUM3QixFQUNKLEVBQ0gsRUFFSyxFQUE0QyxPQUFPLE9BQU8sRUFBUyxVQUFVLEVBQUUsSUFBSSxBQUFDLEdBQy9FLEVBQ0gsUUFBUyxXQUFhLEVBQUUsS0FDeEIsS0FBTSxJQUFZLHdCQUNkLEVBQVMsS0FBSyxFQUNkLEVBQVMsWUFBWSxFQUFFLEVBQUUsQ0FDN0IsRUFDSixFQUNILEVBRUQsRUFBZ0IsS0FBSyxDQUFFLFFBQVMsaUNBQWtDLEtBQU0sSUFBWSx3QkFBRSxLQUFNLE1BQUssc0JBQXNCLENBQUUsRUFBRSxDQUFDLEVBQzVILEVBQXVCLFFBQVEsR0FBTSxFQUFnQixLQUFLLENBQUUsQ0FBQyxFQUM3RCxFQUFnQixLQUFLLENBQUUsUUFBUyw0QkFBNkIsS0FBTSxJQUFZLHdCQUFFLEtBQU0sTUFBSyxzQkFBc0IsQ0FBRSxFQUFFLENBQUMsRUFDdkgsRUFBeUIsUUFBUSxHQUFNLEVBQWdCLEtBQUssQ0FBRSxDQUFDLEVBRS9ELEVBQUksaUJBQWlCLENBQWUsRUFDcEMsS0FBTSxHQUFJLFFBQVEsQUFBTyxHQUFTLHdCQUFHLFlBQU0sR0FBUSxLQUFLLEdBQUMsQ0FDN0QsR0FlSixFYjdPQSxtQkFBdUMsVUFBTyxDQUE5QyxrQ0FDQyxhQUFVLHVEQUNWLFdBQVEsa0JBTUYsUUFBd0IsZ0NBQzdCLFFBQVEsSUFBSSwyQkFBMkIsRUFDdkMsS0FBTSxNQUFLLGFBQWEsRUFDeEIsS0FBSyxjQUFjLEdBQUksR0FBZ0IsS0FBSyxJQUFLLElBQUksQ0FBQyxFQUV0RCxLQUFLLFlBQWMsR0FBSSxHQUFZLElBQUksRUFDdkMsS0FBSyxTQUFXLEdBQUksR0FBZSxJQUFJLEVBRXZDLEdBQVMsRUFDTCxLQUFLLFNBQVMsbUJBQW1CLEtBQUssaUJBQWlCLEVBRTNELEtBQUssSUFBSSxVQUFVLGNBQWMsSUFBWSxDQUM1QyxBQUFJLEtBQUssU0FBUyxpQkFDakIsV0FBVyxJQUFZLHdCQUN0QixLQUFNLE1BQUssWUFBWSxpQ0FBaUMsRUFBSyxDQUM5RCxHQUFHLEdBQUssRUFFTCxLQUFLLFNBQVMsdUJBQ2pCLFdBQVcsSUFBWSx3QkFDdEIsS0FBTSxHQUF1QixLQUFNLEVBQUssQ0FDekMsR0FBRyxJQUFNLENBRVgsQ0FBQyxDQUNGLEdBRUEsa0JBQXlCLENBQUUsS0FBSyxXQUFhLEtBQUssY0FBYyxXQUFZLE9BQVEsSUFBUyx3QkFBRyxZQUFLLFNBQVMsc0JBQXNCLEdBQUMsQ0FBRSxDQUV2SSxJQUFJLEVBQW1CLEVBQVUsR0FBYSxDQUFFLEdBQU8sS0FBTSxFQUFXLENBQU8sQ0FBRSxDQUVqRixVQUFpQixDQUFFLFFBQVEsSUFBSSxhQUFlLEtBQUssT0FBTyxDQUFFLENBRXRELGNBQThCLGdDQUFFLEtBQUssU0FBVyxPQUFPLE9BQU8sQ0FBQyxFQUFHLEdBQWtCLEtBQU0sTUFBSyxTQUFTLENBQUMsQ0FBRSxHQUUzRyxjQUE4QixnQ0FBRSxLQUFNLE1BQUssU0FBUyxLQUFLLFFBQVEsQ0FBRSxHQUMxRSIsCiAgIm5hbWVzIjogW10KfQo=
+`;setTimeout(()=>a(this,null,function*(){if((yield s.app.vault.adapter.exists(n))===!0){let l=yield s.app.vault.adapter.read(n);r=r+l;let c=s.app.vault.getAbstractFileByPath(n);yield s.app.vault.modify(c,r)}else yield s.app.vault.create(n,r)}),10)}}}var z=class{constructor(t){this.bratCommands=[{id:"BRAT-AddBetaPlugin",icon:"BratIcon",name:"Plugins: Add a beta plugin for testing",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.displayAddNewPluginModal(!1,!1)})},{id:"BRAT-AddBetaPluginWithFrozenVersion",icon:"BratIcon",name:"Plugins: Add a beta plugin with frozen version based on a release tag",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.displayAddNewPluginModal(!1,!0)})},{id:"BRAT-checkForUpdatesAndUpdate",icon:"BratIcon",name:"Plugins: Check for updates to all beta plugins and UPDATE",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(!0,!1)})},{id:"BRAT-checkForUpdatesAndDontUpdate",icon:"BratIcon",name:"Plugins: Only check for updates to beta plugins, but don't Update",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(!0,!0)})},{id:"BRAT-updateOnePlugin",icon:"BratIcon",name:"Plugins: Choose a single plugin version to update",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(i=>i.repo)),e=Object.values(this.plugin.settings.pluginList).filter(i=>!t.has(i)).map(i=>({display:i,info:i})),n=new S(this.plugin);n.setSuggesterData(e),yield n.display(i=>a(this,null,function*(){let o=`Checking for updates for ${i.info}`;this.plugin.log(o,!0),m(this.plugin,`
+${o}`,3),yield this.plugin.betaPlugins.updatePlugin(i.info,!1,!0)}))})},{id:"BRAT-restartPlugin",icon:"BratIcon",name:"Plugins: Restart a plugin that is already installed",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=Object.values(this.plugin.app.plugins.manifests).map(n=>({display:n.id,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){m(this.plugin,`${n.info}
+Plugin reloading .....`,5),yield this.plugin.betaPlugins.reloadPlugin(n.info)}))})},{id:"BRAT-disablePlugin",icon:"BratIcon",name:"Plugins: Disable a plugin - toggle it off",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.betaPlugins.getEnabledDisabledPlugins(!0).map(n=>({display:`${n.name} (${n.id})`,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`${n.display} plugin disabled`,!1),yield this.plugin.app.plugins.disablePlugin(n.info)}))})},{id:"BRAT-enablePlugin",icon:"BratIcon",name:"Plugins: Enable a plugin - toggle it on",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.betaPlugins.getEnabledDisabledPlugins(!1).map(n=>({display:`${n.name} (${n.id})`,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`${n.display} plugin enabled`,!1),yield this.plugin.app.plugins.enablePlugin(n.info)}))})},{id:"BRAT-openGitHubZRepository",icon:"BratIcon",name:"Plugins: Open the GitHub repository for a plugin",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=yield me(),e=Object.values(t).map(o=>({display:`Plugin: ${o.name} (${o.repo})`,info:o.repo})),n=Object.values(this.plugin.settings.pluginList).map(o=>({display:"BRAT: "+o,info:o}));e.forEach(o=>n.push(o));let i=new S(this.plugin);i.setSuggesterData(n),yield i.display(o=>a(this,null,function*(){o.info&&window.open(`https://github.com/${o.info}`)}))})},{id:"BRAT-openGitHubRepoTheme",icon:"BratIcon",name:"Themes: Open the GitHub repository for a theme (appearance)",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=yield Y(),e=Object.values(t).map(i=>({display:`Theme: ${i.name} (${i.repo})`,info:i.repo})),n=new S(this.plugin);n.setSuggesterData(e),yield n.display(i=>a(this,null,function*(){i.info&&window.open(`https://github.com/${i.info}`)}))})},{id:"BRAT-opentPluginSettings",icon:"BratIcon",name:"Plugins: Open Plugin Settings Tab",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.app.setting,e=Object.values(t.pluginTabs).map(o=>({display:"Plugin: "+o.name,info:o.id})),n=new S(this.plugin),i=Object.values(t.settingTabs).map(o=>({display:"Core: "+o.name,info:o.id}));e.forEach(o=>i.push(o)),n.setSuggesterData(i),yield n.display(o=>a(this,null,function*(){t.open(),t.openTabById(o.info)}))})},{id:"BRAT-GrabCommunityTheme",icon:"BratIcon",name:"Themes: Grab a community theme",showInRibbon:!0,callback:()=>a(this,null,function*(){return yield Se(this.plugin)})},{id:"BRAT-GrabBetaTheme",icon:"BratIcon",name:"Themes: Grab a beta theme for testing from a Github repository",showInRibbon:!0,callback:()=>a(this,null,function*(){new C(this.plugin).open()})},{id:"BRAT-updateBetaThemes",icon:"BratIcon",name:"Themes: Update beta themes",showInRibbon:!0,callback:()=>a(this,null,function*(){return yield W(this.plugin,!0)})},{id:"BRAT-switchTheme",icon:"BratIcon",name:"Themes: Switch Active Theme ",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=Object.values(this.plugin.app.customCss.themes).map(n=>({display:n,info:n}));t.unshift({display:"Obsidian Default Theme",info:""});let e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`Switched to theme ${n.display}`,!1),this.plugin.app.customCss.setTheme(n.info)}))})},{id:"BRAT-allCommands",icon:"BratIcon",name:"All Commands list",showInRibbon:!1,callback:()=>a(this,null,function*(){return this.ribbonDisplayCommands()})}];this.plugin=t,this.bratCommands.forEach(e=>a(this,null,function*(){this.plugin.addCommand({id:e.id,name:e.name,icon:e.icon,callback:()=>a(this,null,function*(){yield e.callback()})})}))}ribbonDisplayCommands(){return a(this,null,function*(){let t=[];this.bratCommands.forEach(r=>{r.showInRibbon&&t.push({display:r.name,info:r.callback})});let e=new S(this.plugin),n=this.plugin.app.setting,i=Object.values(n.settingTabs).map(r=>({display:"Core: "+r.name,info:()=>a(this,null,function*(){n.open(),n.openTabById(r.id)})})),o=Object.values(n.pluginTabs).map(r=>({display:"Plugin: "+r.name,info:()=>a(this,null,function*(){n.open(),n.openTabById(r.id)})}));t.push({display:"---- Core Plugin Settings ----",info:()=>a(this,null,function*(){yield this.ribbonDisplayCommands()})}),i.forEach(r=>t.push(r)),t.push({display:"---- Plugin Settings ----",info:()=>a(this,null,function*(){yield this.ribbonDisplayCommands()})}),o.forEach(r=>t.push(r)),e.setSuggesterData(t),yield e.display(r=>a(this,null,function*(){return yield r.info()}))})}};var Z=class extends Ye.Plugin{constructor(){super(...arguments);this.appName="Obsidian42 - Beta Reviewer's Auto-update Tool (BRAT)";this.appID="obsidian42-brat"}onload(){return a(this,null,function*(){console.log("loading Obsidian42 - BRAT"),yield this.loadSettings(),this.addSettingTab(new G(this.app,this)),this.betaPlugins=new B(this),this.commands=new z(this),Ce(),this.settings.ribbonIconEnabled&&this.showRibbonButton(),this.app.workspace.onLayoutReady(()=>{this.settings.updateAtStartup&&setTimeout(()=>a(this,null,function*(){yield this.betaPlugins.checkForUpdatesAndInstallUpdates(!1)}),6e4),this.settings.updateThemesAtStartup&&setTimeout(()=>a(this,null,function*(){yield W(this,!1)}),12e4)})})}showRibbonButton(){this.ribbonIcon=this.addRibbonIcon("BratIcon","BRAT",()=>a(this,null,function*(){return this.commands.ribbonDisplayCommands()}))}log(e,n=!1){He(this,e,n)}onunload(){console.log("unloading "+this.appName)}loadSettings(){return a(this,null,function*(){this.settings=Object.assign({},pe,yield this.loadData())})}saveSettings(){return a(this,null,function*(){yield this.saveData(this.settings)})}};
+//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZS9kaXN0L21haW4uanMiLCAiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL3VpL1NldHRpbmdzVGFiLnRzIiwgIi4uL3NyYy9mZWF0dXJlcy90aGVtZXMudHMiLCAiLi4vc3JjL3VpL0dlbmVyaWNGdXp6eVN1Z2dlc3Rlci50cyIsICIuLi9zcmMvZmVhdHVyZXMvZ2l0aHViVXRpbHMudHMiLCAiLi4vc3JjL3VpL3NldHRpbmdzLnRzIiwgIi4uL3NyYy91dGlscy9ub3RpZmljYXRpb25zLnRzIiwgIi4uL3NyYy91dGlscy9pbnRlcm5ldGNvbm5lY3Rpb24udHMiLCAiLi4vc3JjL3VpL0FkZE5ld1RoZW1lLnRzIiwgIi4uL3NyYy91aS9BZGROZXdQbHVnaW5Nb2RhbC50cyIsICIuLi9zcmMvZmVhdHVyZXMvQmV0YVBsdWdpbnMudHMiLCAiLi4vc3JjL3VpL2ljb25zLnRzIiwgIi4uL3NyYy91dGlscy9sb2dnaW5nLnRzIiwgIi4uL3NyYy91aS9QbHVnaW5Db21tYW5kcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgb2JzaWRpYW4gPSByZXF1aXJlKCdvYnNpZGlhbicpO1xuXG5jb25zdCBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NLUREXCI7XG5jb25zdCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCA9IFwiZ2dnZy1bV113d1wiO1xuY29uc3QgREVGQVVMVF9NT05USExZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NXCI7XG5jb25zdCBERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWS1bUV1RXCI7XG5jb25zdCBERUZBVUxUX1lFQVJMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWVwiO1xuXG5mdW5jdGlvbiBzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MocGVyaW9kaWNpdHkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSB3aW5kb3cuYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8uW3BlcmlvZGljaXR5XT8uZW5hYmxlZDtcbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBkYWlseS1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgeyBpbnRlcm5hbFBsdWdpbnMsIHBsdWdpbnMgfSA9IHdpbmRvdy5hcHA7XG4gICAgICAgIGlmIChzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MoXCJkYWlseVwiKSkge1xuICAgICAgICAgICAgY29uc3QgeyBmb3JtYXQsIGZvbGRlciwgdGVtcGxhdGUgfSA9IHBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy5kYWlseSB8fCB7fTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgfHwgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IGZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBmb2xkZXIsIGZvcm1hdCwgdGVtcGxhdGUgfSA9IGludGVybmFsUGx1Z2lucy5nZXRQbHVnaW5CeUlkKFwiZGFpbHktbm90ZXNcIik/Lmluc3RhbmNlPy5vcHRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgfHwgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIGRhaWx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuLyoqXG4gKiBSZWFkIHRoZSB1c2VyIHNldHRpbmdzIGZvciB0aGUgYHdlZWtseS1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0V2Vla2x5Tm90ZVNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyU2V0dGluZ3MgPSBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcImNhbGVuZGFyXCIpPy5vcHRpb25zO1xuICAgICAgICBjb25zdCBwZXJpb2RpY05vdGVzU2V0dGluZ3MgPSBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ud2Vla2x5O1xuICAgICAgICBpZiAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwid2Vla2x5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogcGVyaW9kaWNOb3Rlc1NldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IHBlcmlvZGljTm90ZXNTZXR0aW5ncy5mb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBwZXJpb2RpY05vdGVzU2V0dGluZ3MudGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGNhbGVuZGFyU2V0dGluZ3MgfHwge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLndlZWtseU5vdGVGb3JtYXQgfHwgREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IHNldHRpbmdzLndlZWtseU5vdGVGb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHNldHRpbmdzLndlZWtseU5vdGVUZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHdlZWtseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBwZXJpb2RpYy1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0TW9udGhseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwibW9udGhseVwiKSAmJlxuICAgICAgICAgICAgcGx1Z2luTWFuYWdlci5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKT8uc2V0dGluZ3M/Lm1vbnRobHkpIHx8XG4gICAgICAgICAgICB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogc2V0dGluZ3MuZm9ybWF0IHx8IERFRkFVTFRfTU9OVEhMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogc2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy50ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIG1vbnRobHkgbm90ZSBzZXR0aW5ncyBmb3VuZCFcIiwgZXJyKTtcbiAgICB9XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgcGVyaW9kaWMtbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldFF1YXJ0ZXJseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwicXVhcnRlcmx5XCIpICYmXG4gICAgICAgICAgICBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ucXVhcnRlcmx5KSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogc2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy50ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHF1YXJ0ZXJseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBwZXJpb2RpYy1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0WWVhcmx5Tm90ZVNldHRpbmdzKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGx1Z2luTWFuYWdlciA9IHdpbmRvdy5hcHAucGx1Z2lucztcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IChzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MoXCJ5ZWFybHlcIikgJiZcbiAgICAgICAgICAgIHBsdWdpbk1hbmFnZXIuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy55ZWFybHkpIHx8XG4gICAgICAgICAgICB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogc2V0dGluZ3MuZm9ybWF0IHx8IERFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFULFxuICAgICAgICAgICAgZm9sZGVyOiBzZXR0aW5ncy5mb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHNldHRpbmdzLnRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmluZm8oXCJObyBjdXN0b20geWVhcmx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuXG4vLyBDcmVkaXQ6IEBjcmVhdGlvbml4L3BhdGguanNcbmZ1bmN0aW9uIGpvaW4oLi4ucGFydFNlZ21lbnRzKSB7XG4gICAgLy8gU3BsaXQgdGhlIGlucHV0cyBpbnRvIGEgbGlzdCBvZiBwYXRoIGNvbW1hbmRzLlxuICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcGFydFNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChwYXJ0U2VnbWVudHNbaV0uc3BsaXQoXCIvXCIpKTtcbiAgICB9XG4gICAgLy8gSW50ZXJwcmV0IHRoZSBwYXRoIGNvbW1hbmRzIHRvIGdldCB0aGUgbmV3IHJlc29sdmVkIHBhdGguXG4gICAgY29uc3QgbmV3UGFydHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgIC8vIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzXG4gICAgICAgIC8vIEFsc28gcmVtb3ZlIFwiLlwiIHNlZ21lbnRzXG4gICAgICAgIGlmICghcGFydCB8fCBwYXJ0ID09PSBcIi5cIilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAvLyBQdXNoIG5ldyBwYXRoIHNlZ21lbnRzLlxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdQYXJ0cy5wdXNoKHBhcnQpO1xuICAgIH1cbiAgICAvLyBQcmVzZXJ2ZSB0aGUgaW5pdGlhbCBzbGFzaCBpZiB0aGVyZSB3YXMgb25lLlxuICAgIGlmIChwYXJ0c1swXSA9PT0gXCJcIilcbiAgICAgICAgbmV3UGFydHMudW5zaGlmdChcIlwiKTtcbiAgICAvLyBUdXJuIGJhY2sgaW50byBhIHNpbmdsZSBzdHJpbmcgcGF0aC5cbiAgICByZXR1cm4gbmV3UGFydHMuam9pbihcIi9cIik7XG59XG5mdW5jdGlvbiBiYXNlbmFtZShmdWxsUGF0aCkge1xuICAgIGxldCBiYXNlID0gZnVsbFBhdGguc3Vic3RyaW5nKGZ1bGxQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuICAgIGlmIChiYXNlLmxhc3RJbmRleE9mKFwiLlwiKSAhPSAtMSlcbiAgICAgICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKDAsIGJhc2UubGFzdEluZGV4T2YoXCIuXCIpKTtcbiAgICByZXR1cm4gYmFzZTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZUZvbGRlckV4aXN0cyhwYXRoKSB7XG4gICAgY29uc3QgZGlycyA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikuc3BsaXQoXCIvXCIpO1xuICAgIGRpcnMucG9wKCk7IC8vIHJlbW92ZSBiYXNlbmFtZVxuICAgIGlmIChkaXJzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkaXIgPSBqb2luKC4uLmRpcnMpO1xuICAgICAgICBpZiAoIXdpbmRvdy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGRpcikpIHtcbiAgICAgICAgICAgIGF3YWl0IHdpbmRvdy5hcHAudmF1bHQuY3JlYXRlRm9sZGVyKGRpcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiBnZXROb3RlUGF0aChkaXJlY3RvcnksIGZpbGVuYW1lKSB7XG4gICAgaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChcIi5tZFwiKSkge1xuICAgICAgICBmaWxlbmFtZSArPSBcIi5tZFwiO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gb2JzaWRpYW4ubm9ybWFsaXplUGF0aChqb2luKGRpcmVjdG9yeSwgZmlsZW5hbWUpKTtcbiAgICBhd2FpdCBlbnN1cmVGb2xkZXJFeGlzdHMocGF0aCk7XG4gICAgcmV0dXJuIHBhdGg7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpIHtcbiAgICBjb25zdCB7IG1ldGFkYXRhQ2FjaGUsIHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgodGVtcGxhdGUpO1xuICAgIGlmICh0ZW1wbGF0ZVBhdGggPT09IFwiL1wiKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW1wiXCIsIG51bGxdKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCh0ZW1wbGF0ZVBhdGgsIFwiXCIpO1xuICAgICAgICBjb25zdCBjb250ZW50cyA9IGF3YWl0IHZhdWx0LmNhY2hlZFJlYWQodGVtcGxhdGVGaWxlKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgSUZvbGRJbmZvID0gd2luZG93LmFwcC5mb2xkTWFuYWdlci5sb2FkKHRlbXBsYXRlRmlsZSk7XG4gICAgICAgIHJldHVybiBbY29udGVudHMsIElGb2xkSW5mb107XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHJlYWQgdGhlIGRhaWx5IG5vdGUgdGVtcGxhdGUgJyR7dGVtcGxhdGVQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiRmFpbGVkIHRvIHJlYWQgdGhlIGRhaWx5IG5vdGUgdGVtcGxhdGVcIik7XG4gICAgICAgIHJldHVybiBbXCJcIiwgbnVsbF07XG4gICAgfVxufVxuXG4vKipcbiAqIGRhdGVVSUQgaXMgYSB3YXkgb2Ygd2Vla2x5IGlkZW50aWZ5aW5nIGRhaWx5L3dlZWtseS9tb250aGx5IG5vdGVzLlxuICogVGhleSBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgZ3JhbnVsYXJpdHkgdG8gYXZvaWQgYW1iaWd1aXR5LlxuICovXG5mdW5jdGlvbiBnZXREYXRlVUlEKGRhdGUsIGdyYW51bGFyaXR5ID0gXCJkYXlcIikge1xuICAgIGNvbnN0IHRzID0gZGF0ZS5jbG9uZSgpLnN0YXJ0T2YoZ3JhbnVsYXJpdHkpLmZvcm1hdCgpO1xuICAgIHJldHVybiBgJHtncmFudWxhcml0eX0tJHt0c31gO1xufVxuZnVuY3Rpb24gcmVtb3ZlRXNjYXBlZENoYXJhY3RlcnMoZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC9cXFtbXlxcXV0qXFxdL2csIFwiXCIpOyAvLyByZW1vdmUgZXZlcnl0aGluZyB3aXRoaW4gYnJhY2tldHNcbn1cbi8qKlxuICogWFhYOiBXaGVuIHBhcnNpbmcgZGF0ZXMgdGhhdCBjb250YWluIGJvdGggd2VlayBudW1iZXJzIGFuZCBtb250aHMsXG4gKiBNb21lbnQgY2hvc2VzIHRvIGlnbm9yZSB0aGUgd2VlayBudW1iZXJzLiBGb3IgdGhlIHdlZWsgZGF0ZVVJRCwgd2VcbiAqIHdhbnQgdGhlIG9wcG9zaXRlIGJlaGF2aW9yLiBTdHJpcCB0aGUgTU1NIGZyb20gdGhlIGZvcm1hdCB0byBwYXRjaC5cbiAqL1xuZnVuY3Rpb24gaXNGb3JtYXRBbWJpZ3VvdXMoZm9ybWF0LCBncmFudWxhcml0eSkge1xuICAgIGlmIChncmFudWxhcml0eSA9PT0gXCJ3ZWVrXCIpIHtcbiAgICAgICAgY29uc3QgY2xlYW5Gb3JtYXQgPSByZW1vdmVFc2NhcGVkQ2hhcmFjdGVycyhmb3JtYXQpO1xuICAgICAgICByZXR1cm4gKC93ezEsMn0vaS50ZXN0KGNsZWFuRm9ybWF0KSAmJlxuICAgICAgICAgICAgKC9NezEsNH0vLnRlc3QoY2xlYW5Gb3JtYXQpIHx8IC9EezEsNH0vLnRlc3QoY2xlYW5Gb3JtYXQpKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldERhdGVGcm9tRmlsZShmaWxlLCBncmFudWxhcml0eSkge1xuICAgIHJldHVybiBnZXREYXRlRnJvbUZpbGVuYW1lKGZpbGUuYmFzZW5hbWUsIGdyYW51bGFyaXR5KTtcbn1cbmZ1bmN0aW9uIGdldERhdGVGcm9tUGF0aChwYXRoLCBncmFudWxhcml0eSkge1xuICAgIHJldHVybiBnZXREYXRlRnJvbUZpbGVuYW1lKGJhc2VuYW1lKHBhdGgpLCBncmFudWxhcml0eSk7XG59XG5mdW5jdGlvbiBnZXREYXRlRnJvbUZpbGVuYW1lKGZpbGVuYW1lLCBncmFudWxhcml0eSkge1xuICAgIGNvbnN0IGdldFNldHRpbmdzID0ge1xuICAgICAgICBkYXk6IGdldERhaWx5Tm90ZVNldHRpbmdzLFxuICAgICAgICB3ZWVrOiBnZXRXZWVrbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIG1vbnRoOiBnZXRNb250aGx5Tm90ZVNldHRpbmdzLFxuICAgICAgICBxdWFydGVyOiBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHllYXI6IGdldFllYXJseU5vdGVTZXR0aW5ncyxcbiAgICB9O1xuICAgIGNvbnN0IGZvcm1hdCA9IGdldFNldHRpbmdzW2dyYW51bGFyaXR5XSgpLmZvcm1hdC5zcGxpdChcIi9cIikucG9wKCk7XG4gICAgY29uc3Qgbm90ZURhdGUgPSB3aW5kb3cubW9tZW50KGZpbGVuYW1lLCBmb3JtYXQsIHRydWUpO1xuICAgIGlmICghbm90ZURhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoaXNGb3JtYXRBbWJpZ3VvdXMoZm9ybWF0LCBncmFudWxhcml0eSkpIHtcbiAgICAgICAgaWYgKGdyYW51bGFyaXR5ID09PSBcIndlZWtcIikge1xuICAgICAgICAgICAgY29uc3QgY2xlYW5Gb3JtYXQgPSByZW1vdmVFc2NhcGVkQ2hhcmFjdGVycyhmb3JtYXQpO1xuICAgICAgICAgICAgaWYgKC93ezEsMn0vaS50ZXN0KGNsZWFuRm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubW9tZW50KGZpbGVuYW1lLCBcbiAgICAgICAgICAgICAgICAvLyBJZiBmb3JtYXQgY29udGFpbnMgd2VlaywgcmVtb3ZlIGRheSAmIG1vbnRoIGZvcm1hdHRpbmdcbiAgICAgICAgICAgICAgICBmb3JtYXQucmVwbGFjZSgvTXsxLDR9L2csIFwiXCIpLnJlcGxhY2UoL0R7MSw0fS9nLCBcIlwiKSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3RlRGF0ZTtcbn1cblxuY2xhc3MgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSBkYWlseS1ub3RlcyBwbHVnaW5cbiAqIHNvIGl0IHdpbGwgcmVwbGFjZSB7e2RhdGV9fSwge3t0aXRsZX19LCBhbmQge3t0aW1lfX0gd2l0aCB0aGVcbiAqIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gKlxuICogTm90ZTogaXQgaGFzIGFuIGFkZGVkIGJvbnVzIHRoYXQgaXQncyBub3QgJ3RvZGF5JyBzcGVjaWZpYy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGFpbHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCBhcHAgPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IGFwcDtcbiAgICBjb25zdCBtb21lbnQgPSB3aW5kb3cubW9tZW50O1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXREYWlseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKmRhdGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIG1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBtb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnllc3RlcmRheVxccyp9fS9naSwgZGF0ZS5jbG9uZSgpLnN1YnRyYWN0KDEsIFwiZGF5XCIpLmZvcm1hdChmb3JtYXQpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRvbW9ycm93XFxzKn19L2dpLCBkYXRlLmNsb25lKCkuYWRkKDEsIFwiZFwiKS5mb3JtYXQoZm9ybWF0KSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBhcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXREYWlseU5vdGUoZGF0ZSwgZGFpbHlOb3Rlcykge1xuICAgIHJldHVybiBkYWlseU5vdGVzW2dldERhdGVVSUQoZGF0ZSwgXCJkYXlcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxEYWlseU5vdGVzKCkge1xuICAgIC8qKlxuICAgICAqIEZpbmQgYWxsIGRhaWx5IG5vdGVzIGluIHRoZSBkYWlseSBub3RlIGZvbGRlclxuICAgICAqL1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldERhaWx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgZGFpbHlOb3Rlc0ZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICghZGFpbHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIGRhaWx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgY29uc3QgZGFpbHlOb3RlcyA9IHt9O1xuICAgIG9ic2lkaWFuLlZhdWx0LnJlY3Vyc2VDaGlsZHJlbihkYWlseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwiZGF5XCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICBkYWlseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYWlseU5vdGVzO1xufVxuXG5jbGFzcyBXZWVrbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbmZ1bmN0aW9uIGdldERheXNPZldlZWsoKSB7XG4gICAgY29uc3QgeyBtb21lbnQgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGxldCB3ZWVrU3RhcnQgPSBtb21lbnQubG9jYWxlRGF0YSgpLl93ZWVrLmRvdztcbiAgICBjb25zdCBkYXlzT2ZXZWVrID0gW1xuICAgICAgICBcInN1bmRheVwiLFxuICAgICAgICBcIm1vbmRheVwiLFxuICAgICAgICBcInR1ZXNkYXlcIixcbiAgICAgICAgXCJ3ZWRuZXNkYXlcIixcbiAgICAgICAgXCJ0aHVyc2RheVwiLFxuICAgICAgICBcImZyaWRheVwiLFxuICAgICAgICBcInNhdHVyZGF5XCIsXG4gICAgXTtcbiAgICB3aGlsZSAod2Vla1N0YXJ0KSB7XG4gICAgICAgIGRheXNPZldlZWsucHVzaChkYXlzT2ZXZWVrLnNoaWZ0KCkpO1xuICAgICAgICB3ZWVrU3RhcnQtLTtcbiAgICB9XG4gICAgcmV0dXJuIGRheXNPZldlZWs7XG59XG5mdW5jdGlvbiBnZXREYXlPZldlZWtOdW1lcmljYWxWYWx1ZShkYXlPZldlZWtOYW1lKSB7XG4gICAgcmV0dXJuIGdldERheXNPZldlZWsoKS5pbmRleE9mKGRheU9mV2Vla05hbWUudG9Mb3dlckNhc2UoKSk7XG59XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVXZWVrbHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRXZWVrbHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgd2luZG93Lm1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSlcXHMqOiguKj8pfX0vZ2ksIChfLCBkYXlPZldlZWssIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF5ID0gZ2V0RGF5T2ZXZWVrTnVtZXJpY2FsVmFsdWUoZGF5T2ZXZWVrKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRlLndlZWtkYXkoZGF5KS5mb3JtYXQobW9tZW50Rm9ybWF0LnRyaW0oKSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93LmFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFdlZWtseU5vdGUoZGF0ZSwgd2Vla2x5Tm90ZXMpIHtcbiAgICByZXR1cm4gd2Vla2x5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcIndlZWtcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxXZWVrbHlOb3RlcygpIHtcbiAgICBjb25zdCB3ZWVrbHlOb3RlcyA9IHt9O1xuICAgIGlmICghYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4gd2Vla2x5Tm90ZXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldFdlZWtseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IHdlZWtseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCF3ZWVrbHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgV2Vla2x5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCB3ZWVrbHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4od2Vla2x5Tm90ZXNGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJ3ZWVrXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcIndlZWtcIik7XG4gICAgICAgICAgICAgICAgd2Vla2x5Tm90ZXNbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdlZWtseU5vdGVzO1xufVxuXG5jbGFzcyBNb250aGx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGFpbHktbm90ZXMgcGx1Z2luXG4gKiBzbyBpdCB3aWxsIHJlcGxhY2Uge3tkYXRlfX0sIHt7dGl0bGV9fSwgYW5kIHt7dGltZX19IHdpdGggdGhlXG4gKiBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICpcbiAqIE5vdGU6IGl0IGhhcyBhbiBhZGRlZCBib251cyB0aGF0IGl0J3Mgbm90ICd0b2RheScgc3BlY2lmaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vbnRobHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRNb250aGx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgW3RlbXBsYXRlQ29udGVudHMsIElGb2xkSW5mb10gPSBhd2FpdCBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IGF3YWl0IGdldE5vdGVQYXRoKGZvbGRlciwgZmlsZW5hbWUpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlKG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZUNvbnRlbnRzXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqKGRhdGV8dGltZSlcXHMqKChbKy1dXFxkKykoW3lxbXdkaHNdKSk/XFxzKig6Lis/KT99fS9naSwgKF8sIF90aW1lT3JEYXRlLCBjYWxjLCB0aW1lRGVsdGEsIHVuaXQsIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gd2luZG93Lm1vbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBkYXRlLmNsb25lKCkuc2V0KHtcbiAgICAgICAgICAgICAgICBob3VyOiBub3cuZ2V0KFwiaG91clwiKSxcbiAgICAgICAgICAgICAgICBtaW51dGU6IG5vdy5nZXQoXCJtaW51dGVcIiksXG4gICAgICAgICAgICAgICAgc2Vjb25kOiBub3cuZ2V0KFwic2Vjb25kXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY2FsYykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlLmFkZChwYXJzZUludCh0aW1lRGVsdGEsIDEwKSwgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9tZW50Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChtb21lbnRGb3JtYXQuc3Vic3RyaW5nKDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqZGF0ZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgd2luZG93Lm1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB3aW5kb3cuYXBwLmZvbGRNYW5hZ2VyLnNhdmUoY3JlYXRlZEZpbGUsIElGb2xkSW5mbyk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke25vcm1hbGl6ZWRQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0TW9udGhseU5vdGUoZGF0ZSwgbW9udGhseU5vdGVzKSB7XG4gICAgcmV0dXJuIG1vbnRobHlOb3Rlc1tnZXREYXRlVUlEKGRhdGUsIFwibW9udGhcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxNb250aGx5Tm90ZXMoKSB7XG4gICAgY29uc3QgbW9udGhseU5vdGVzID0ge307XG4gICAgaWYgKCFhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4gbW9udGhseU5vdGVzO1xuICAgIH1cbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgZm9sZGVyIH0gPSBnZXRNb250aGx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgbW9udGhseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCFtb250aGx5Tm90ZXNGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1vbnRobHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIG1vbnRobHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4obW9udGhseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwibW9udGhcIik7XG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBnZXREYXRlVUlEKGRhdGUsIFwibW9udGhcIik7XG4gICAgICAgICAgICAgICAgbW9udGhseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtb250aGx5Tm90ZXM7XG59XG5cbmNsYXNzIFF1YXJ0ZXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRhaWx5LW5vdGVzIHBsdWdpblxuICogc28gaXQgd2lsbCByZXBsYWNlIHt7ZGF0ZX19LCB7e3RpdGxlfX0sIGFuZCB7e3RpbWV9fSB3aXRoIHRoZVxuICogZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqXG4gKiBOb3RlOiBpdCBoYXMgYW4gYWRkZWQgYm9udXMgdGhhdCBpdCdzIG5vdCAndG9kYXknIHNwZWNpZmljLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVRdWFydGVybHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccypkYXRlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aW1lXFxzKn19L2dpLCB3aW5kb3cubW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIikpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGl0bGVcXHMqfX0vZ2ksIGZpbGVuYW1lKSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHdpbmRvdy5hcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRRdWFydGVybHlOb3RlKGRhdGUsIHF1YXJ0ZXJseSkge1xuICAgIHJldHVybiBxdWFydGVybHlbZ2V0RGF0ZVVJRChkYXRlLCBcInF1YXJ0ZXJcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxRdWFydGVybHlOb3RlcygpIHtcbiAgICBjb25zdCBxdWFydGVybHkgPSB7fTtcbiAgICBpZiAoIWFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHF1YXJ0ZXJseTtcbiAgICB9XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IGZvbGRlciB9ID0gZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgcXVhcnRlcmx5Rm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCFxdWFydGVybHlGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFF1YXJ0ZXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKFwiRmFpbGVkIHRvIGZpbmQgcXVhcnRlcmx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgb2JzaWRpYW4uVmF1bHQucmVjdXJzZUNoaWxkcmVuKHF1YXJ0ZXJseUZvbGRlciwgKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKG5vdGUgaW5zdGFuY2VvZiBvYnNpZGlhbi5URmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IGdldERhdGVGcm9tRmlsZShub3RlLCBcInF1YXJ0ZXJcIik7XG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBnZXREYXRlVUlEKGRhdGUsIFwicXVhcnRlclwiKTtcbiAgICAgICAgICAgICAgICBxdWFydGVybHlbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHF1YXJ0ZXJseTtcbn1cblxuY2xhc3MgWWVhcmx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGFpbHktbm90ZXMgcGx1Z2luXG4gKiBzbyBpdCB3aWxsIHJlcGxhY2Uge3tkYXRlfX0sIHt7dGl0bGV9fSwgYW5kIHt7dGltZX19IHdpdGggdGhlXG4gKiBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICpcbiAqIE5vdGU6IGl0IGhhcyBhbiBhZGRlZCBib251cyB0aGF0IGl0J3Mgbm90ICd0b2RheScgc3BlY2lmaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVllYXJseU5vdGUoZGF0ZSkge1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyB0ZW1wbGF0ZSwgZm9ybWF0LCBmb2xkZXIgfSA9IGdldFllYXJseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihkYXRlfHRpbWUpXFxzKigoWystXVxcZCspKFt5cW13ZGhzXSkpP1xccyooOi4rPyk/fX0vZ2ksIChfLCBfdGltZU9yRGF0ZSwgY2FsYywgdGltZURlbHRhLCB1bml0LCBtb21lbnRGb3JtYXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHdpbmRvdy5tb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKmRhdGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoXCJISDptbVwiKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93LmFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFllYXJseU5vdGUoZGF0ZSwgeWVhcmx5Tm90ZXMpIHtcbiAgICByZXR1cm4geWVhcmx5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcInllYXJcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxZZWFybHlOb3RlcygpIHtcbiAgICBjb25zdCB5ZWFybHlOb3RlcyA9IHt9O1xuICAgIGlmICghYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4geWVhcmx5Tm90ZXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldFllYXJseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IHllYXJseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCF5ZWFybHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgWWVhcmx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCB5ZWFybHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4oeWVhcmx5Tm90ZXNGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgeWVhcmx5Tm90ZXNbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHllYXJseU5vdGVzO1xufVxuXG5mdW5jdGlvbiBhcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkKCkge1xuICAgIGNvbnN0IHsgYXBwIH0gPSB3aW5kb3c7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBkYWlseU5vdGVzUGx1Z2luID0gYXBwLmludGVybmFsUGx1Z2lucy5wbHVnaW5zW1wiZGFpbHktbm90ZXNcIl07XG4gICAgaWYgKGRhaWx5Tm90ZXNQbHVnaW4gJiYgZGFpbHlOb3Rlc1BsdWdpbi5lbmFibGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5kYWlseT8uZW5hYmxlZDtcbn1cbi8qKlxuICogWFhYOiBcIldlZWtseSBOb3Rlc1wiIGxpdmUgaW4gZWl0aGVyIHRoZSBDYWxlbmRhciBwbHVnaW4gb3IgdGhlIHBlcmlvZGljLW5vdGVzIHBsdWdpbi5cbiAqIENoZWNrIGJvdGggdW50aWwgdGhlIHdlZWtseSBub3RlcyBmZWF0dXJlIGlzIHJlbW92ZWQgZnJvbSB0aGUgQ2FsZW5kYXIgcGx1Z2luLlxuICovXG5mdW5jdGlvbiBhcHBIYXNXZWVrbHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKGFwcC5wbHVnaW5zLmdldFBsdWdpbihcImNhbGVuZGFyXCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy53ZWVrbHk/LmVuYWJsZWQ7XG59XG5mdW5jdGlvbiBhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5tb250aGx5Py5lbmFibGVkO1xufVxuZnVuY3Rpb24gYXBwSGFzUXVhcnRlcmx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5xdWFydGVybHk/LmVuYWJsZWQ7XG59XG5mdW5jdGlvbiBhcHBIYXNZZWFybHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGVyaW9kaWNOb3RlcyA9IGFwcC5wbHVnaW5zLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpO1xuICAgIHJldHVybiBwZXJpb2RpY05vdGVzICYmIHBlcmlvZGljTm90ZXMuc2V0dGluZ3M/LnllYXJseT8uZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGdldFBlcmlvZGljTm90ZVNldHRpbmdzKGdyYW51bGFyaXR5KSB7XG4gICAgY29uc3QgZ2V0U2V0dGluZ3MgPSB7XG4gICAgICAgIGRheTogZ2V0RGFpbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHdlZWs6IGdldFdlZWtseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgbW9udGg6IGdldE1vbnRobHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHF1YXJ0ZXI6IGdldFF1YXJ0ZXJseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgeWVhcjogZ2V0WWVhcmx5Tm90ZVNldHRpbmdzLFxuICAgIH1bZ3JhbnVsYXJpdHldO1xuICAgIHJldHVybiBnZXRTZXR0aW5ncygpO1xufVxuZnVuY3Rpb24gY3JlYXRlUGVyaW9kaWNOb3RlKGdyYW51bGFyaXR5LCBkYXRlKSB7XG4gICAgY29uc3QgY3JlYXRlRm4gPSB7XG4gICAgICAgIGRheTogY3JlYXRlRGFpbHlOb3RlLFxuICAgICAgICBtb250aDogY3JlYXRlTW9udGhseU5vdGUsXG4gICAgICAgIHdlZWs6IGNyZWF0ZVdlZWtseU5vdGUsXG4gICAgfTtcbiAgICByZXR1cm4gY3JlYXRlRm5bZ3JhbnVsYXJpdHldKGRhdGUpO1xufVxuXG5leHBvcnRzLkRFRkFVTFRfREFJTFlfTk9URV9GT1JNQVQgPSBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5ERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQgPSBERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfUVVBUlRFUkxZX05PVEVfRk9STUFUID0gREVGQVVMVF9RVUFSVEVSTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfV0VFS0xZX05PVEVfRk9STUFUID0gREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFUID0gREVGQVVMVF9ZRUFSTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLmFwcEhhc0RhaWx5Tm90ZXNQbHVnaW5Mb2FkZWQgPSBhcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5hcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQgPSBhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzUXVhcnRlcmx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1dlZWtseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1llYXJseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmNyZWF0ZURhaWx5Tm90ZSA9IGNyZWF0ZURhaWx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlTW9udGhseU5vdGUgPSBjcmVhdGVNb250aGx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlUGVyaW9kaWNOb3RlID0gY3JlYXRlUGVyaW9kaWNOb3RlO1xuZXhwb3J0cy5jcmVhdGVRdWFydGVybHlOb3RlID0gY3JlYXRlUXVhcnRlcmx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlV2Vla2x5Tm90ZSA9IGNyZWF0ZVdlZWtseU5vdGU7XG5leHBvcnRzLmNyZWF0ZVllYXJseU5vdGUgPSBjcmVhdGVZZWFybHlOb3RlO1xuZXhwb3J0cy5nZXRBbGxEYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcztcbmV4cG9ydHMuZ2V0QWxsTW9udGhseU5vdGVzID0gZ2V0QWxsTW9udGhseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxRdWFydGVybHlOb3RlcyA9IGdldEFsbFF1YXJ0ZXJseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxXZWVrbHlOb3RlcyA9IGdldEFsbFdlZWtseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxZZWFybHlOb3RlcyA9IGdldEFsbFllYXJseU5vdGVzO1xuZXhwb3J0cy5nZXREYWlseU5vdGUgPSBnZXREYWlseU5vdGU7XG5leHBvcnRzLmdldERhaWx5Tm90ZVNldHRpbmdzID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldERhdGVGcm9tRmlsZSA9IGdldERhdGVGcm9tRmlsZTtcbmV4cG9ydHMuZ2V0RGF0ZUZyb21QYXRoID0gZ2V0RGF0ZUZyb21QYXRoO1xuZXhwb3J0cy5nZXREYXRlVUlEID0gZ2V0RGF0ZVVJRDtcbmV4cG9ydHMuZ2V0TW9udGhseU5vdGUgPSBnZXRNb250aGx5Tm90ZTtcbmV4cG9ydHMuZ2V0TW9udGhseU5vdGVTZXR0aW5ncyA9IGdldE1vbnRobHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFBlcmlvZGljTm90ZVNldHRpbmdzID0gZ2V0UGVyaW9kaWNOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFF1YXJ0ZXJseU5vdGUgPSBnZXRRdWFydGVybHlOb3RlO1xuZXhwb3J0cy5nZXRRdWFydGVybHlOb3RlU2V0dGluZ3MgPSBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFRlbXBsYXRlSW5mbyA9IGdldFRlbXBsYXRlSW5mbztcbmV4cG9ydHMuZ2V0V2Vla2x5Tm90ZSA9IGdldFdlZWtseU5vdGU7XG5leHBvcnRzLmdldFdlZWtseU5vdGVTZXR0aW5ncyA9IGdldFdlZWtseU5vdGVTZXR0aW5ncztcbmV4cG9ydHMuZ2V0WWVhcmx5Tm90ZSA9IGdldFllYXJseU5vdGU7XG5leHBvcnRzLmdldFllYXJseU5vdGVTZXR0aW5ncyA9IGdldFllYXJseU5vdGVTZXR0aW5ncztcbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgQnJhdFNldHRpbmdzVGFiIH0gZnJvbSBcIi4vdWkvU2V0dGluZ3NUYWJcIjtcclxuaW1wb3J0IHsgU2V0dGluZ3MsIERFRkFVTFRfU0VUVElOR1MgfSBmcm9tIFwiLi91aS9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgQmV0YVBsdWdpbnMgZnJvbSBcIi4vZmVhdHVyZXMvQmV0YVBsdWdpbnNcIjtcclxuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tIFwiLi91aS9pY29uc1wiO1xyXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi91dGlscy9sb2dnaW5nXCI7XHJcbmltcG9ydCBQbHVnaW5Db21tYW5kcyBmcm9tIFwiLi91aS9QbHVnaW5Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyB0aGVtZXNlQ2hlY2tBbmRVcGRhdGVzIH0gZnJvbSBcIi4vZmVhdHVyZXMvdGhlbWVzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdGFwcE5hbWUgPSBcIk9ic2lkaWFuNDIgLSBCZXRhIFJldmlld2VyJ3MgQXV0by11cGRhdGUgVG9vbCAoQlJBVClcIjtcclxuXHRhcHBJRCA9IFwib2JzaWRpYW40Mi1icmF0XCI7XHJcblx0c2V0dGluZ3M6IFNldHRpbmdzO1xyXG5cdGJldGFQbHVnaW5zOiBCZXRhUGx1Z2lucztcclxuXHRyaWJib25JY29uOiBIVE1MRWxlbWVudDtcclxuXHRjb21tYW5kczogUGx1Z2luQ29tbWFuZHM7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGNvbnNvbGUubG9nKFwibG9hZGluZyBPYnNpZGlhbjQyIC0gQlJBVFwiKTtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEJyYXRTZXR0aW5nc1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cclxuXHRcdHRoaXMuYmV0YVBsdWdpbnMgPSBuZXcgQmV0YVBsdWdpbnModGhpcyk7XHJcblx0XHR0aGlzLmNvbW1hbmRzID0gbmV3IFBsdWdpbkNvbW1hbmRzKHRoaXMpO1xyXG5cclxuXHRcdGFkZEljb25zKCk7XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5yaWJib25JY29uRW5hYmxlZCkgdGhpcy5zaG93UmliYm9uQnV0dG9uKCk7XHJcblxyXG5cdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCk6IHZvaWQgPT4geyAvLyBsZXQgb2JzaWRpYW4gbG9hZCBhbmQgY2FsbSBkb3duIGJlZm9yZSBjaGVja1xyXG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy51cGRhdGVBdFN0YXJ0dXApIHsgXHJcblx0XHRcdFx0c2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJldGFQbHVnaW5zLmNoZWNrRm9yVXBkYXRlc0FuZEluc3RhbGxVcGRhdGVzKGZhbHNlKVxyXG5cdFx0XHRcdH0sIDYwMDAwKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy51cGRhdGVUaGVtZXNBdFN0YXJ0dXApIHsgXHJcblx0XHRcdFx0c2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGVtZXNlQ2hlY2tBbmRVcGRhdGVzKHRoaXMsIGZhbHNlKTtcclxuXHRcdFx0XHR9LCAxMjAwMDApO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHNob3dSaWJib25CdXR0b24oKTogdm9pZCB7IHRoaXMucmliYm9uSWNvbiA9IHRoaXMuYWRkUmliYm9uSWNvbihcIkJyYXRJY29uXCIsIFwiQlJBVFwiLCBhc3luYyAoKSA9PiB0aGlzLmNvbW1hbmRzLnJpYmJvbkRpc3BsYXlDb21tYW5kcygpKSB9XHJcblxyXG5cdGxvZyh0ZXh0VG9Mb2c6IHN0cmluZywgdmVyYm9zZSA9IGZhbHNlKTogdm9pZCB7IGxvZ2dlcih0aGlzLCB0ZXh0VG9Mb2csIHZlcmJvc2UpIH1cclxuXHRcclxuXHRvbnVubG9hZCgpOiB2b2lkIHsgY29uc29sZS5sb2coXCJ1bmxvYWRpbmcgXCIgKyB0aGlzLmFwcE5hbWUpIH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4geyB0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKSB9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHsgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKSB9XHJcbn0iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBUb2dnbGVDb21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgdGhlbWVzRGVsZXRlIH0gZnJvbSAnLi4vZmVhdHVyZXMvdGhlbWVzJztcclxuaW1wb3J0IFRoZVBsdWdpbiBmcm9tICcuLi9tYWluJztcclxuaW1wb3J0IEFkZE5ld1RoZW1lIGZyb20gJy4vQWRkTmV3VGhlbWUnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJyYXRTZXR0aW5nc1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogVGhlUGx1Z2luO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBUaGVQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XHJcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogdGhpcy5wbHVnaW4uYXBwTmFtZSB9KTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0F1dG8tdXBkYXRlIHBsdWdpbnMgYXQgc3RhcnR1cCcpXHJcblx0XHRcdC5zZXREZXNjKCdJZiBlbmFibGVkIGFsbCBiZXRhIHBsdWdpbnMgd2lsbCBiZSBjaGVja2VkIGZvciB1cGRhdGVzIGVhY2ggdGltZSBPYnNpZGlhbiBzdGFydHMuIE5vdGU6IHRoaXMgZG9lcyBub3QgdXBkYXRlIGZyb3plbiB2ZXJzaW9uIHBsdWdpbnMuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVwZGF0ZUF0U3RhcnR1cCk7XHJcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51cGRhdGVBdFN0YXJ0dXAgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVxyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQXV0by11cGRhdGUgdGhlbWVzIGF0IHN0YXJ0dXAnKVxyXG5cdFx0XHQuc2V0RGVzYygnSWYgZW5hYmxlZCBhbGwgYmV0YSB0aGVtZXMgd2lsbCBiZSBjaGVja2VkIGZvciB1cGRhdGVzIGVhY2ggdGltZSBPYnNpZGlhbiBzdGFydHMuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVwZGF0ZVRoZW1lc0F0U3RhcnR1cCk7XHJcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51cGRhdGVUaGVtZXNBdFN0YXJ0dXAgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVxyXG5cclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1JpYmJvbiBCdXR0b24nKVxyXG5cdFx0XHQuc2V0RGVzYygnVG9nZ2xlIHJpYmJvbiBidXR0b24gb2ZmIGFuZCBvbi4nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKChjYjogVG9nZ2xlQ29tcG9uZW50KSA9PiB7XHJcblx0XHRcdFx0Y2Iuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucmliYm9uSWNvbkVuYWJsZWQpO1xyXG5cdFx0XHRcdGNiLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucmliYm9uSWNvbkVuYWJsZWQgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5yaWJib25JY29uRW5hYmxlZCA9PT0gZmFsc2UpXHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnJpYmJvbkljb24ucmVtb3ZlKCk7XHJcblx0XHRcdFx0XHRlbHNlXHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNob3dSaWJib25CdXR0b24oKTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVx0XHRcdFxyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaHJcIik7XHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogXCJCZXRhIFBsdWdpbiBMaXN0XCIgfSk7XHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImRpdlwiLCB7IHRleHQ6IGBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBiZXRhIHBsdWdpbnMgYWRkZWQgdmlhIHRoZSBjb21tYW5kIHBhbGV0dGUgXCJBZGQgYSBiZXRhIHBsdWdpbiBmb3IgdGVzdGluZ1wiIG9yIFwiQWRkIGEgYmV0YSBwbHVnaW4gd2l0aCBmcm96ZW4gdmVyc2lvbiBmb3IgdGVzdGluZ1wiLiBBIGZyb3plbiB2ZXJzaW9uIGlzIGEgc3BlY2lmaWMgcmVsZWFzZSBvZiBhIHBsdWdpbiBiYXNlZCBvbiBpdHMgcmVsZWVhc2UgdGFnLiBgIH0pO1xyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIpO1xyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJkaXZcIiwgeyB0ZXh0OiBgQ2xpY2sgdGhlIHggYnV0dG9uIG5leHQgdG8gYSBwbHVnaW4gdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QuYCB9KTtcclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiKTtcclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwic3BhblwiKVxyXG5cdFx0XHQuY3JlYXRlRWwoXCJiXCIsIHsgdGV4dDogXCJOb3RlOiBcIiB9KVxyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlU3Bhbih7IHRleHQ6IFwiVGhpcyBkb2VzIG5vdCBkZWxldGUgdGhlIHBsdWdpbiwgdGhpcyBzaG91bGQgYmUgZG9uZSBmcm9tIHRoZSAgQ29tbXVuaXR5IFBsdWdpbnMgdGFiIGluIFNldHRpbmdzLlwiIH0pO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuYWRkQnV0dG9uKChjYjogQnV0dG9uQ29tcG9uZW50KT0+e1xyXG5cdFx0XHRcdGNiLnNldEJ1dHRvblRleHQoXCJBZGQgQmV0YSBwbHVnaW5cIilcclxuXHRcdFx0XHRjYi5vbkNsaWNrKGFzeW5jICgpPT57XHJcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5hcHAuc2V0dGluZy5jbG9zZSgpO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGlzcGxheUFkZE5ld1BsdWdpbk1vZGFsKHRydWUsIGZhbHNlKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRjb25zdCBwbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbk5hbWVzXHJcblx0XHRcdD0gbmV3IFNldCh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbi5tYXAoeCA9PiB4LnJlcG8pKTtcclxuXHRcdGZvciAoY29uc3QgYnAgb2YgdGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdCkge1xyXG5cdFx0XHRpZiAocGx1Z2luU3ViTGlzdEZyb3plblZlcnNpb25OYW1lcy5oYXMoYnApKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdFx0LnNldE5hbWUoYnApXHJcblx0XHRcdFx0LmFkZEJ1dHRvbigoYnRuOiBCdXR0b25Db21wb25lbnQpID0+IHtcclxuXHRcdFx0XHRcdGJ0bi5zZXRJY29uKFwiY3Jvc3NcIik7XHJcblx0XHRcdFx0XHRidG4uc2V0VG9vbHRpcChcIkRlbGV0ZSB0aGlzIGJldGEgcGx1Z2luXCIpO1xyXG5cdFx0XHRcdFx0YnRuLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHQvLyBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5kZWxldGVQbHVnaW4oYnApO1xyXG5cdFx0XHRcdFx0XHRpZiAoYnRuLmJ1dHRvbkVsLnRleHRDb250ZW50ID09PSBcIlwiKVxyXG5cdFx0XHRcdFx0XHRcdGJ0bi5zZXRCdXR0b25UZXh0KFwiQ2xpY2sgb25jZSBtb3JlIHRvIGNvbmZpcm0gcmVtb3ZhbFwiKTtcclxuXHRcdFx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0YnRuLmJ1dHRvbkVsLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5yZW1vdmUoKTtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5kZWxldGVQbHVnaW4oYnApXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pXHJcblx0XHR9XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5hZGRCdXR0b24oKGNiOiBCdXR0b25Db21wb25lbnQpPT57XHJcblx0XHRcdFx0Y2Iuc2V0QnV0dG9uVGV4dChcIkFkZCBCZXRhIHBsdWdpbiB3aXRoIGZyb3plbiB2ZXJzaW9uXCIpXHJcblx0XHRcdFx0Y2Iub25DbGljayhhc3luYyAoKT0+e1xyXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uYXBwLnNldHRpbmcuY2xvc2UoKTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLmJldGFQbHVnaW5zLmRpc3BsYXlBZGROZXdQbHVnaW5Nb2RhbCh0cnVlLCB0cnVlKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHR9KTtcclxuXHRcdGZvciAoY29uc3QgYnAgb2YgdGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luU3ViTGlzdEZyb3plblZlcnNpb24pIHtcclxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdFx0LnNldE5hbWUoYCR7YnAucmVwb30gKHZlcnNpb24gJHticC52ZXJzaW9ufSlgKVxyXG5cdFx0XHRcdC5hZGRCdXR0b24oKGJ0bjogQnV0dG9uQ29tcG9uZW50KSA9PiB7XHJcblx0XHRcdFx0XHRidG4uc2V0SWNvbihcImNyb3NzXCIpO1xyXG5cdFx0XHRcdFx0YnRuLnNldFRvb2x0aXAoXCJEZWxldGUgdGhpcyBiZXRhIHBsdWdpblwiKTtcclxuXHRcdFx0XHRcdGJ0bi5vbkNsaWNrKGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0Ly8gYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGVsZXRlUGx1Z2luKGJwKTtcclxuXHRcdFx0XHRcdFx0aWYgKGJ0bi5idXR0b25FbC50ZXh0Q29udGVudCA9PT0gXCJcIilcclxuXHRcdFx0XHRcdFx0XHRidG4uc2V0QnV0dG9uVGV4dChcIkNsaWNrIG9uY2UgbW9yZSB0byBjb25maXJtIHJlbW92YWxcIik7XHJcblx0XHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGJ0bi5idXR0b25FbC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGVsZXRlUGx1Z2luKGJwLnJlcG8pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaHJcIik7XHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogXCJCZXRhIFRoZW1lcyBMaXN0XCIgfSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5hZGRCdXR0b24oKGNiOiBCdXR0b25Db21wb25lbnQpPT57XHJcblx0XHRcdFx0Y2Iuc2V0QnV0dG9uVGV4dChcIkFkZCBCZXRhIFRoZW1lXCIpXHJcblx0XHRcdFx0Y2Iub25DbGljayhhc3luYyAoKT0+e1xyXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uYXBwLnNldHRpbmcuY2xvc2UoKTtcclxuXHRcdFx0XHRcdChuZXcgQWRkTmV3VGhlbWUodGhpcy5wbHVnaW4pKS5vcGVuKCk7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0fSk7XHRcdFxyXG5cclxuXHJcblx0XHRmb3IgKGNvbnN0IGJwIG9mIHRoaXMucGx1Z2luLnNldHRpbmdzLnRoZW1lc0xpc3QpIHtcclxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdFx0LnNldE5hbWUoYnAucmVwbylcclxuXHRcdFx0XHQuYWRkQnV0dG9uKChidG46IEJ1dHRvbkNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdFx0YnRuLnNldEljb24oXCJjcm9zc1wiKTtcclxuXHRcdFx0XHRcdGJ0bi5zZXRUb29sdGlwKFwiRGVsZXRlIHRoaXMgYmV0YSB0aGVtZVwiKTtcclxuXHRcdFx0XHRcdGJ0bi5vbkNsaWNrKGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0aWYgKGJ0bi5idXR0b25FbC50ZXh0Q29udGVudCA9PT0gXCJcIilcclxuXHRcdFx0XHRcdFx0XHRidG4uc2V0QnV0dG9uVGV4dChcIkNsaWNrIG9uY2UgbW9yZSB0byBjb25maXJtIHJlbW92YWxcIik7XHJcblx0XHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGJ0bi5idXR0b25FbC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhlbWVzRGVsZXRlKHRoaXMucGx1Z2luLCBicC5yZXBvKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSlcclxuXHRcdH1cclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImhyXCIpO1xyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiTW9uaXRvcmluZ1wiIH0pO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnRW5hYmxlIE5vdGlmaWNhdGlvbnMnKVxyXG5cdFx0XHQuc2V0RGVzYygnQlJBVCB3aWxsIHByb3ZpZGUgcG9wdXAgbm90aWZpY2F0aW9ucyBmb3IgaXRzIHZhcmlvdXMgYWN0aXZpdGllcy4gVHVybiB0aGlzIG9mZiBtZWFucyAgbm8gbm90aWZpY2F0aW9ucyBmcm9tIEJSQVQuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm5vdGlmaWNhdGlvbnNFbmFibGVkKTtcclxuXHRcdFx0XHRjYi5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLm5vdGlmaWNhdGlvbnNFbmFibGVkID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSlcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0VuYWJsZSBMb2dnaW5nJylcclxuXHRcdFx0LnNldERlc2MoJ1BsdWdpbiB1cGRhdGVzIHdpbGwgYmUgbG9nZ2VkIHRvIGEgZmlsZSBpbiB0aGUgbG9nIGZpbGUuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdFbmFibGVkKTtcclxuXHRcdFx0XHRjYi5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdFbmFibGVkID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSlcclxuXHJcblx0XHRuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxyXG4gICAgICAgICAgICAuc2V0TmFtZShcIkJSQVQgTG9nIEZpbGUgTG9jYXRpb25cIilcclxuICAgICAgICAgICAgLnNldERlc2MoXCJMb2dzIHdpbGwgYmUgc2F2ZWQgdG8gdGhpcyBmaWxlLiBEb24ndCBhZGQgLm1kIHRvIHRoZSBmaWxlIG5hbWUuXCIpXHJcbiAgICAgICAgICAgIC5hZGRTZWFyY2goKGNiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjYi5zZXRQbGFjZWhvbGRlcihcIkV4YW1wbGU6IEJSQVQtbG9nXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdQYXRoKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAobmV3X2ZvbGRlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5sb2dnaW5nUGF0aCA9IG5ld19mb2xkZXI7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcdFx0XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdFbmFibGUgVmVyYm9zZSBMb2dnaW5nJylcclxuXHRcdFx0LnNldERlc2MoJ0dldCBhIGxvdCAgbW9yZSBpbmZvcm1hdGlvbiBpbiAgdGhlIGxvZy4nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKChjYjogVG9nZ2xlQ29tcG9uZW50KSA9PiB7XHJcblx0XHRcdFx0Y2Iuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MubG9nZ2luZ1ZlcmJvc2VFbmFibGVkKTtcclxuXHRcdFx0XHRjYi5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdWZXJib3NlRW5hYmxlZCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pXHJcblxyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnRGVidWdnaW5nIE1vZGUnKVxyXG5cdFx0XHQuc2V0RGVzYygnQXRvbWljIEJvbWIgbGV2ZWwgY29uc29sZSBsb2dnaW5nLiBDYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob3RpbmcgYW5kIGRldmVsb3BtZW50LicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKGNiOiBUb2dnbGVDb21wb25lbnQpID0+IHtcclxuXHRcdFx0XHRjYi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z2dpbmdNb2RlKTtcclxuXHRcdFx0XHRjYi5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnZ2luZ01vZGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVx0XHRcdFxyXG5cdFxyXG5cdH1cclxufVxyXG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplUGF0aCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCBUaGVQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyLCBTdWdnZXN0ZXJJdGVtIH0gZnJvbSBcIi4uL3VpL0dlbmVyaWNGdXp6eVN1Z2dlc3RlclwiO1xyXG5pbXBvcnQgeyB1cGRhdGVCZXRhVGhlbWVMYXN0VXBkYXRlRGF0ZSB9IGZyb20gXCIuLi91aS9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBncmFiQ29tbW11bml0eVRoZW1lT2JzaWRpYW5Dc3MsIGdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdCwgZ3JhYkxhc3RDb21taXREYXRlRm9yQUZpbGUgfSBmcm9tIFwiLi9naXRodWJVdGlsc1wiO1xyXG5pbXBvcnQgeyBUb2FzdE1lc3NhZ2UgfSBmcm9tIFwiLi4vdXRpbHMvbm90aWZpY2F0aW9uc1wiO1xyXG5pbXBvcnQgeyBpc0Nvbm5lY3RlZFRvSW50ZXJuZXQgfSBmcm9tIFwiLi4vdXRpbHMvaW50ZXJuZXRjb25uZWN0aW9uXCI7XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBwYXRoIHRvIHRoZSB0aGVtZXMgZm9sZGVyIGZvIHJ0aGlzIHZhdWx0XHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICBwbHVnaW4gIFRoUGx1Z2luXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtzdHJpbmd9ICAgICAgICAgICAgIHBhdGggdG8gdGhlbWVzIGZvbGRlclxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRoZW1lc1Jvb3RQYXRoID0gKHBsdWdpbjogVGhlUGx1Z2luKTogc3RyaW5nID0+IHtcclxuICAgIHJldHVybiBub3JtYWxpemVQYXRoKHBsdWdpbi5hcHAudmF1bHQuY29uZmlnRGlyICsgXCIvdGhlbWVzXCIpICsgXCIvXCI7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogSW5zdGFsbHMgYSB0aGVtZSwgaW5jbHVkaW5nIGRvd25sb2FkaW5nIGFuZCByZWdpc3RyaW5nIGl0IHdpdGggQlJBVFxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgICAgICAgcGx1Z2luICAgICAgICAgICAgICAgVGhlUGx1Z2luXHJcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICBjc3NHaXRodWJSZXBvc2l0b3J5ICBUaGUgcmVwb3NpdG9yeSB3aXRoIHRoZSB0aGVtZVxyXG4gKiBAcGFyYW0gICB7dW5kZWZpbmVkPGJvb2xlYW4+fSAgY3NzRmlsZU5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgY3NzIGZpbGUgdGhhdCB3aWxsIGJlIHNhdmVkIHRvIHRoZSB0aGVtZXMgZm9sZGVyIGludGhlIHZhdWx0XHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPGJvb2xlYW4+fSAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIGZvciBzdWNjY2Vzc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRoZW1lSW5zdGFsbFRoZW1lID0gYXN5bmMgKHBsdWdpbjogVGhlUGx1Z2luLCBjc3NHaXRodWJSZXBvc2l0b3J5OiBzdHJpbmcsIGNzc0ZpbGVOYW1lID0gXCJcIik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gICAgY29uc3QgdGhlbWVDU1MgPSBhd2FpdCBncmFiQ29tbW11bml0eVRoZW1lT2JzaWRpYW5Dc3MoY3NzR2l0aHViUmVwb3NpdG9yeSk7XHJcbiAgICBpZighdGhlbWVDU1MpIHtcclxuICAgICAgICBUb2FzdE1lc3NhZ2UocGx1Z2luLFwiVGhlcmUgaXMgbm8gb2JzaWRpYW4uY3NzIGZpbGUgaW4gdGhlIHJvb3QgcGF0aCBvZiB0aGlzIHJlcG9zaXRvcnksIHNvIHRoZXJlIGlzIG5vIHRoZW1lIHRvIGluc3RhbGwuXCIpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhlbWVzU2F2ZVRoZW1lKHBsdWdpbiwgY3NzRmlsZU5hbWUsIHRoZW1lQ1NTKTtcclxuICAgIGNvbnN0IG1zZyA9IGAke2Nzc0ZpbGVOYW1lfSB0aGVtZSBpbnN0YWxsZWQgZnJvbSAke2Nzc0dpdGh1YlJlcG9zaXRvcnl9LiBgO1xyXG4gICAgcGx1Z2luLmxvZyhtc2cgKyBgW1RoZW1lIEluZm9dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke2Nzc0dpdGh1YlJlcG9zaXRvcnl9KWAsIGZhbHNlKTtcclxuICAgIFRvYXN0TWVzc2FnZShwbHVnaW4sYCR7bXNnfWAsMTAsIGFzeW5jICgpPT57IHdpbmRvdy5vcGVuKGBodHRwczovL2dpdGh1Yi5jb20vJHtjc3NHaXRodWJSZXBvc2l0b3J5fWApfSk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlICAgICAgICAgICAgXHJcbiAgICAgICAgcGx1Z2luLmFwcC5jdXN0b21Dc3Muc2V0VGhlbWUoY3NzRmlsZU5hbWUpO1xyXG4gICAgfSwgNTAwKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG4vKipcclxuICogU2F2ZXMgdGhlICB0aGVtZSBmaWxlIHRvIHRoZSB2YXVsdFxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgIHBsdWdpbiAgICAgICBUaGVQbHVnaW5cclxuICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICBjc3NGaWxlTmFtZSAgZmlsZSBuYW1lIHRvIGJlIHVzZWQgaW4gdGhlIHRoZW1lcyBmb2xkZXJcclxuICogQHBhcmFtICAge3N0cmluZzx2b2lkPn0gICBjc3NUZXh0ICAgICAgdGhlIGNzcyBmaWxlIGNvbnRlbnRzXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPHZvaWQ+fSAgICAgICAgICAgICAgIFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRoZW1lc1NhdmVUaGVtZSA9IGFzeW5jIChwbHVnaW46IFRoZVBsdWdpbiwgY3NzRmlsZU5hbWU6IHN0cmluZywgY3NzVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICBjb25zdCB0aGVtZXNUYXJnZXRGb2xkZXJQYXRoID0gdGhlbWVzUm9vdFBhdGgocGx1Z2luKTtcclxuICAgIGNvbnN0IGFkYXB0ZXIgPSBwbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXI7XHJcbiAgICBpZiAoYXdhaXQgYWRhcHRlci5leGlzdHModGhlbWVzVGFyZ2V0Rm9sZGVyUGF0aCkgPT09IGZhbHNlKSBhd2FpdCBhZGFwdGVyLm1rZGlyKHRoZW1lc1RhcmdldEZvbGRlclBhdGgpO1xyXG4gICAgYXdhaXQgYWRhcHRlci53cml0ZSh0aGVtZXNUYXJnZXRGb2xkZXJQYXRoICsgY3NzRmlsZU5hbWUgKyBcIi5jc3NcIiwgY3NzVGV4dCk7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogSW5zdGFsbCBhIHRoZW1lIGZyb20gdGhlIGNvbW11bml0eSBsaXN0LiB0aGlzIGlzIGRvaW5nIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBidWlsdCBpbiB0aGVtZSBpbnN0YWxsZXIgaW4gb2JzaWRpYW4sIGJ1dCB0aGlzIG1ha2VzIGl0IGZhc3QgdG8gZG8gdGhyb3VnaCBjb21tYW5kIHBhbGV0dGVcclxuICpcclxuICogQHBhcmFtICAge1RoZVBsdWdpbjx2b2lkPn0gIHBsdWdpbiAgVGhlUGx1Z2luXHJcbiAqXHJcbiAqIEByZXR1cm4gIHt9ICAgICAgICAgICAgW3JldHVybiBkZXNjcmlwdGlvbl1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0aGVtZXNJbnN0YWxsRnJvbUNvbW11bml0eUxpc3QgPSBhc3luYyAocGx1Z2luOiBUaGVQbHVnaW4pOiBQcm9taXNlPHZvaWQ+ID0+e1xyXG4gICAgY29uc3QgY29tbXVuaXR5VGhlbWUgPSBhd2FpdCBncmFiQ29tbW11bml0eVRoZW1lc0xpc3QoKTtcclxuICAgIGNvbnN0IGNvbW11bml0eVRoZW1lTGlzdDogU3VnZ2VzdGVySXRlbVtdID0gT2JqZWN0LnZhbHVlcyhjb21tdW5pdHlUaGVtZSkubWFwKChwKSA9PiB7IHJldHVybiB7IGRpc3BsYXk6IGBUaGVtZTogJHtwLm5hbWV9ICAoJHtwLnJlcG99KWAsIGluZm86IHAgfSB9KTtcclxuICAgIGNvbnN0IGdmcyA9IG5ldyBHZW5lcmljRnV6enlTdWdnZXN0ZXIocGx1Z2luKTtcclxuICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKGNvbW11bml0eVRoZW1lTGlzdCk7XHJcbiAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4ge1xyXG4gICAgICAgIGF3YWl0IHRoZW1lSW5zdGFsbFRoZW1lKHBsdWdpbiwgcmVzdWx0cy5pbmZvLnJlcG8sIHJlc3VsdHMuaW5mby5uYW1lKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIGZpbGUgbmFtZSBmb3IgdGhlIHRoZW1lLiBJdCBpcyBiYXNlZCBvbiB0aGUgZ2l0aHViIHJlcG9zaXRvcnkgdGhlbWUgbmFtZVxyXG4gKlxyXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgY3NzR2l0aHViUmVwb3NpdG9yeSAgW2Nzc0dpdGh1YlJlcG9zaXRvcnkgZGVzY3JpcHRpb25dXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICBbcmV0dXJuIGRlc2NyaXB0aW9uXVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRoZW1lc0Rlcml2ZUJldGFOYW1lRnJvbVJlcG9zaXRvcnkgPSAoY3NzR2l0aHViUmVwb3NpdG9yeTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICAgIGNvbnN0IGJldGFOYW1lID0gXCJCUkFULVwiICsgY3NzR2l0aHViUmVwb3NpdG9yeS5yZXBsYWNlKFwiL1wiLCBcIi0tLS1cIik7XHJcbiAgICByZXR1cm4gYmV0YU5hbWUuc3Vic3RyKDAsIDEwMCk7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogRGVsZXRlcyBhIHRoZW0gZnJvbSB0aGUgQlJBVCBsaXN0IGFuZCBhbHNvIHRoZSBwaHlzaWNhbCB0aGVtZSBjc3MgZmlsZSBpbiB0aGUgdmF1bHRcclxuICpcclxuICogQHBhcmFtICAge1RoZVBsdWdpbn0gIHBsdWdpbiAgICAgICAgICAgICAgIFRoZVBsdWdpblxyXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgY3NzR2l0aHViUmVwb3NpdG9yeSAgUmVwb3NpdG9yeSBwYXRoXHJcbiAqXHJcbiAqIEByZXR1cm4gIHt2b2lkfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRoZW1lc0RlbGV0ZSA9IGFzeW5jIChwbHVnaW46IFRoZVBsdWdpbiwgY3NzR2l0aHViUmVwb3NpdG9yeTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICBwbHVnaW4uc2V0dGluZ3MudGhlbWVzTGlzdCA9IHBsdWdpbi5zZXR0aW5ncy50aGVtZXNMaXN0LmZpbHRlcigodCkgPT4gdC5yZXBvICE9IGNzc0dpdGh1YlJlcG9zaXRvcnkpO1xyXG4gICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgYXdhaXQgcGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyLnJlbW92ZSh0aGVtZXNSb290UGF0aChwbHVnaW4pICsgdGhlbWVzRGVyaXZlQmV0YU5hbWVGcm9tUmVwb3NpdG9yeShjc3NHaXRodWJSZXBvc2l0b3J5KSArIFwiLmNzc1wiKTtcclxuICAgIGNvbnN0IG1zZyA9IGBSZW1vdmVkICR7Y3NzR2l0aHViUmVwb3NpdG9yeX0gZnJvbSBCUkFUIHRoZW1lcyBsaXN0IGFuZCBkZWxldGVkIGZyb20gdmF1bHRgO1xyXG4gICAgcGx1Z2luLmxvZyhtc2csIHRydWUpO1xyXG4gICAgVG9hc3RNZXNzYWdlKHBsdWdpbiwgYCR7bXNnfWApO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzICBpZiB0aGVyZSAgYXJlIHRoZW1lIHVwZGF0ZXMgYmFzZWQgb24gdGhlIGNvbW1pdCBkYXRlIG9mIHRoZSBvYnNpZGlhbi5jc3MgZmlsZSBvbiBnaXRodWIgaW4gY29tcGFyaXNvbiB0byB3aGF0IGlzIHN0b3JlZCBpbiB0aGUgQlJBVCB0aGVtZSBsaXN0XHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICAgICAgcGx1Z2luICAgIFRoZVBsdWdpblxyXG4gKiBAcGFyYW0gICB7Ym9vbGVhbjx2b2lkPn0gIHNob3dJbmZvICBwcm92aWRlICBub3RpY2VzIGR1cmluZyB0aGUgdXBkYXRlIHByb2Nlc1xyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTx2b2lkPn0gICAgICAgICAgICBcclxuICovXHJcbmV4cG9ydCBjb25zdCB0aGVtZXNlQ2hlY2tBbmRVcGRhdGVzID0gYXN5bmMgKHBsdWdpbjogVGhlUGx1Z2luLCBzaG93SW5mbzpib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICBpZihhd2FpdCBpc0Nvbm5lY3RlZFRvSW50ZXJuZXQoKT09PWZhbHNlKSB7IFxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQlJBVDogTm8gaW50ZXJuZXQgZGV0ZWN0ZWQuXCIpIFxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBuZXdOb3RpY2U6IE5vdGljZTtcclxuICAgIGNvbnN0IG1zZzEgPSBgQ2hlY2tpbmcgZm9yIGJldGEgdGhlbWUgdXBkYXRlcyBTVEFSVEVEYDtcclxuICAgIHBsdWdpbi5sb2cobXNnMSwgdHJ1ZSk7XHJcbiAgICBpZiAoc2hvd0luZm8gJiYgcGx1Z2luLnNldHRpbmdzLm5vdGlmaWNhdGlvbnNFbmFibGVkKSBuZXdOb3RpY2UgPSBuZXcgTm90aWNlKGBCUkFUXFxuJHttc2cxfWAsIDMwMDAwKTtcclxuICAgIGZvcihjb25zdCB0IG9mIHBsdWdpbi5zZXR0aW5ncy50aGVtZXNMaXN0KSB7XHJcbiAgICAgICAgY29uc3QgbGFzdFVwZGF0ZU9ubGluZSA9IGF3YWl0IGdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlKHQucmVwbywgXCJvYnNpZGlhbi5jc3NcIik7XHJcbiAgICAgICAgaWYobGFzdFVwZGF0ZU9ubGluZSE9PXQubGFzdFVwZGF0ZSkgXHJcbiAgICAgICAgICAgIGF3YWl0IHRoZW1lVXBkYXRlVGhlbWUocGx1Z2luLCB0LnJlcG8sIHQubGFzdFVwZGF0ZSwgbGFzdFVwZGF0ZU9ubGluZSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtc2cyID0gYENoZWNraW5nIGZvciBiZXRhIHRoZW1lIHVwZGF0ZXMgQ09NUExFVEVEYDtcclxuICAgIHBsdWdpbi5sb2cobXNnMiwgdHJ1ZSk7XHJcbiAgICBpZiAoc2hvd0luZm8pIHtcclxuICAgICAgICBpZihwbHVnaW4uc2V0dGluZ3Mubm90aWZpY2F0aW9uc0VuYWJsZWQpIG5ld05vdGljZS5oaWRlKCk7XHJcbiAgICAgICAgVG9hc3RNZXNzYWdlKHBsdWdpbiwgbXNnMik7XHJcbiAgICB9XHJcbn0gXHJcblxyXG4vKipcclxuICogVXBkYXRlcyBhIHRoZW1lIGFscmVhZHkgcmVnaXN0ZXJlZCAgd2l0aCBCUkFUXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICAgICAgICAgICBwbHVnaW4gICAgICAgICAgICAgICBUaGVQbHVnaW5cclxuICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgICAgIGNzc0dpdGh1YlJlcG9zaXRvcnkgIFJlcG9zaXRvcnkgcGF0aFxyXG4gKiBAcGFyYW0gICB7W3R5cGVdfSAgICAgICAgICAgICAgb2xkRmlsZURhdGUgICAgICAgICAgT2xkIGZpbGUgZGF0ZSAgZnJvbSB0aGUgQlJBVCB0aGVtZSBsaXN0XHJcbiAqIEBwYXJhbSAgIHt1bmRlZmluZWQ8Ym9vbGVhbj59ICBuZXdGaWxlRGF0ZSAgICAgICAgICBuZXcgZGF0ZSB0byB1c2UgZm9yIHRoaXMgdXBkYXRlXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPGJvb2xlYW4+fSAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIGlmIHN1Y2NlZWRzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGhlbWVVcGRhdGVUaGVtZSA9IGFzeW5jIChwbHVnaW46IFRoZVBsdWdpbiwgY3NzR2l0aHViUmVwb3NpdG9yeTogc3RyaW5nLCBvbGRGaWxlRGF0ZSA9IFwiXCIsIG5ld0ZpbGVEYXRlID0gXCJcIik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gICAgY29uc3QgdGhlbWVDU1MgPSBhd2FpdCBncmFiQ29tbW11bml0eVRoZW1lT2JzaWRpYW5Dc3MoY3NzR2l0aHViUmVwb3NpdG9yeSk7XHJcbiAgICBpZighdGhlbWVDU1MpIHtcclxuICAgICAgICBUb2FzdE1lc3NhZ2UocGx1Z2luLCBcIlRoZXJlIGlzIG5vIG9ic2lkaWFuLmNzcyBmaWxlIGluIHRoZSByb290IHBhdGggb2YgdGhlICR7Y3NzR2l0aHViUmVwb3NpdG9yeX0gcmVwb3NpdG9yeSwgc28gdGhpcyB0aGVtZSBjYW5ub3QgYmUgdXBkYXRlZC5cIilcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjc3NGaWxlTmFtZSA9IHRoZW1lc0Rlcml2ZUJldGFOYW1lRnJvbVJlcG9zaXRvcnkoY3NzR2l0aHViUmVwb3NpdG9yeSk7XHJcbiAgICBhd2FpdCB0aGVtZXNTYXZlVGhlbWUocGx1Z2luLCBjc3NGaWxlTmFtZSwgdGhlbWVDU1MpO1xyXG4gICAgdXBkYXRlQmV0YVRoZW1lTGFzdFVwZGF0ZURhdGUocGx1Z2luLCBjc3NHaXRodWJSZXBvc2l0b3J5LCBuZXdGaWxlRGF0ZSk7XHJcbiAgICBjb25zdCBtc2cgPSBgJHtjc3NGaWxlTmFtZX0gdGhlbWUgdXBkYXRlZCBmcm9tICR7Y3NzR2l0aHViUmVwb3NpdG9yeX0uIEZyb20gZGF0ZTogJHtvbGRGaWxlRGF0ZX0gdG8gJHtuZXdGaWxlRGF0ZX0gYDtcclxuICAgIHBsdWdpbi5sb2cobXNnICsgYFtUaGVtZSBJbmZvXShodHRwczovL2dpdGh1Yi5jb20vJHtjc3NHaXRodWJSZXBvc2l0b3J5fSlgLCBmYWxzZSk7XHJcbiAgICBUb2FzdE1lc3NhZ2UocGx1Z2luLCBgJHttc2d9YCwgMjAsIGFzeW5jICgpPT57d2luZG93Lm9wZW4oYGh0dHBzOi8vZ2l0aHViLmNvbS8ke2Nzc0dpdGh1YlJlcG9zaXRvcnl9YCl9ICAgKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG59IiwgImltcG9ydCB7IEZ1enp5U3VnZ2VzdE1vZGFsLCBGdXp6eU1hdGNoIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgVGhlUGx1Z2luIGZyb20gJy4uL21haW4nO1xyXG5cclxuLyoqXHJcbiAqIFNpbXBsZSBpbnRlcmZhY2UgZm9yIHdoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBhbmQgc3RvcmVkIGZvciBzdWdnZXN0ZXJcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3VnZ2VzdGVySXRlbSB7XHJcbiAgICBkaXNwbGF5OiBzdHJpbmcsICAgICAgICAvLyBkaXNwbGF5ZWQgdG8gdXNlclxyXG4gICAgaW5mbzogYW55ICAgICAgICAgICAgICAgLy8gc3VwcGxtZW50YWwgaW5mbyBmb3IgdGhlIGNhbGxiYWNrXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmljIHN1Z2dlc3RlciBmb3IgcXVpY2sgcmV1c2VcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmljRnV6enlTdWdnZXN0ZXIgZXh0ZW5kcyBGdXp6eVN1Z2dlc3RNb2RhbDxTdWdnZXN0ZXJJdGVtPntcclxuICAgIGRhdGE6IFN1Z2dlc3Rlckl0ZW1bXTtcclxuICAgIGNhbGxiYWNrRnVuY3Rpb246IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IFRoZVBsdWdpbikge1xyXG4gICAgICAgIHN1cGVyKHBsdWdpbi5hcHApO1xyXG4gICAgICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiU2hpZnRcIl0sIFwiRW50ZXJcIiwgZXZ0ID0+IHRoaXMuZW50ZXJUcmlnZ2VyKGV2dCkpO1xyXG4gICAgICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiQ3RybFwiXSwgXCJFbnRlclwiLCBldnQgPT4gdGhpcy5lbnRlclRyaWdnZXIoZXZ0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U3VnZ2VzdGVyRGF0YShzdWdnZXN0ZXJEYXRhOiBBcnJheTxTdWdnZXN0ZXJJdGVtPik6IHZvaWQgeyB0aGlzLmRhdGEgPSBzdWdnZXN0ZXJEYXRhIH1cclxuXHJcbiAgICBhc3luYyBkaXNwbGF5KGNhbGxCYWNrOiAoaXRlbTogU3VnZ2VzdGVySXRlbSwgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCkgPT4gdm9pZCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja0Z1bmN0aW9uID0gY2FsbEJhY2s7XHJcbiAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SXRlbXMoKTogU3VnZ2VzdGVySXRlbVtdIHsgcmV0dXJuIHRoaXMuZGF0YSB9XHJcblxyXG4gICAgZ2V0SXRlbVRleHQoaXRlbTogU3VnZ2VzdGVySXRlbSk6IHN0cmluZyB7IHJldHVybiBpdGVtLmRpc3BsYXkgfVxyXG5cclxuICAgIG9uQ2hvb3NlSXRlbSgpOiB2b2lkIHsgcmV0dXJuIH0gLy8gcmVxdWlyZWQgYnkgVFMsIGJ1dCBub3QgdXNpbmdcclxuXHJcbiAgICByZW5kZXJTdWdnZXN0aW9uKGl0ZW06IEZ1enp5TWF0Y2g8U3VnZ2VzdGVySXRlbT4sIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQgeyBlbC5jcmVhdGVFbCgnZGl2JywgeyB0ZXh0OiBpdGVtLml0ZW0uZGlzcGxheSB9KSB9XHJcblxyXG4gICAgZW50ZXJUcmlnZ2VyKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc3VnZ2VzdGlvbi1pdGVtLmlzLXNlbGVjdGVkIGRpdlwiKS50ZXh0Q29udGVudDtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5kYXRhLmZpbmQoaSA9PiBpLmRpc3BsYXkgPT09IHNlbGVjdGVkVGV4dCk7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5pbnZva2VDYWxsYmFjayhpdGVtLCBldnQpO1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hvb3NlU3VnZ2VzdGlvbihpdGVtOiBGdXp6eU1hdGNoPFN1Z2dlc3Rlckl0ZW0+LCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7IHRoaXMuaW52b2tlQ2FsbGJhY2soaXRlbS5pdGVtLCBldnQpIH1cclxuXHJcbiAgICBpbnZva2VDYWxsYmFjayhpdGVtOiBTdWdnZXN0ZXJJdGVtLCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7IHRoaXMuY2FsbGJhY2tGdW5jdGlvbihpdGVtLCBldnQpIH1cclxufVxyXG4iLCAiaW1wb3J0IHsgUGx1Z2luTWFuaWZlc3QsIHJlcXVlc3QgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuXHJcbmNvbnN0IEdJVEhVQl9SQVdfVVNFUkNPTlRFTlRfUEFUSCA9IFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1wiO1xyXG5cclxuLyoqXHJcbiAqIHB1bGxzIGZyb20gZ2l0aHViIGEgcmVsZWFzZSBmaWxlIGJ5IGl0cyB2ZXJzaW9uIG51bWJlclxyXG4gKlxyXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgICAgcmVwb3NpdG9yeSAgcGF0aCB0byBHaXRIdWIgcmVwb3NpdG9yeSBpbiBmb3JtYXQgVVNFUk5BTUUvcmVwb3NpdG9yeVxyXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgICAgdmVyc2lvbiAgICAgdmVyc2lvbiBvZiByZWxlYXNlIHRvIHJldHJpdmVcclxuICogQHBhcmFtICAge3N0cmluZzxzdHJpbmc+fSAgIGZpbGVOYW1lICAgIG5hbWUgb2YgZmlsZSB0byByZXRyaWV2ZSBmcm9tIHJlbGVhc2VcclxuICpcclxuICogQHJldHVybiAge1Byb21pc2U8c3RyaW5nPn0gICAgICAgICAgICAgIGNvbnRlbnRzIG9mIGZpbGUgYXMgc3RyaW5nIGZyb20gdGhlIHJlcG9zaXRvcnkncyByZWxlYXNlXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnkgPSBhc3luYyAocmVwb3NpdG9yeTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xyXG4gICAgY29uc3QgVVJMID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L3JlbGVhc2VzL2Rvd25sb2FkLyR7dmVyc2lvbn0vJHtmaWxlTmFtZX1gO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBkb3dubG9hZCA9IGF3YWl0IHJlcXVlc3QoeyB1cmw6IFVSTCB9KTtcclxuICAgICAgICByZXR1cm4gKChkb3dubG9hZCA9PT0gXCJOb3QgRm91bmRcIiB8fCBkb3dubG9hZCA9PT0gYHtcImVycm9yXCI6XCJOb3QgRm91bmRcIn1gKSA/IG51bGwgOiBkb3dubG9hZCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgaW4gZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnlcIiwgVVJMLCBlcnJvcilcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIGdyYWJzIHRoZSBtYW5pZmVzdC5qc29uIGZyb20gdGhlIHJlcG9zaXRvcnkuIHJvb3RNYW5pZmVzdCAtIGlmIHRydWUgZ3JhYnMgbWFuaWZlc3QuanNvbiBpZiBmYWxzZSBncmFicyBtYW5pZmVzdC1iZXRhLmpzb25cclxuICpcclxuICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5UGF0aCAgcGF0aCB0byBHaXRIdWIgcmVwb3NpdG9yeSBpbiBmb3JtYXQgVVNFUk5BTUUvcmVwb3NpdG9yeVxyXG4gKiBAcGFyYW0gICB7W3R5cGVdfSAgICAgICAgICAgICAgICAgICAgIHJvb3RNYW5pZmVzdCAgICBpZiB0cnVlIGdyYWJzIG1hbmlmZXN0Lmpzb24gaWYgZmFsc2UgZ3JhYnMgbWFuaWZlc3QtYmV0YS5qc29uXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPFBsdWdpbk1hbmlmZXN0Pn0gICAgICAgICAgICAgICAgICAgIHJldHVybnMgbWFuaWZlc3QgZmlsZSBmb3IgIGEgcGx1Z2luXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ3JhYk1hbmlmZXN0SnNvbkZyb21SZXBvc2l0b3J5ID0gYXN5bmMgKHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIHJvb3RNYW5pZmVzdCA9IHRydWUpOiBQcm9taXNlPFBsdWdpbk1hbmlmZXN0PiA9PiB7XHJcbiAgICBjb25zdCBtYW5pZmVzdEpzb25QYXRoID0gR0lUSFVCX1JBV19VU0VSQ09OVEVOVF9QQVRIICsgcmVwb3NpdG9yeVBhdGggK1xyXG4gICAgICAgIChyb290TWFuaWZlc3QgPT09IHRydWUgPyBcIi9IRUFEL21hbmlmZXN0Lmpzb25cIiA6IFwiL0hFQUQvbWFuaWZlc3QtYmV0YS5qc29uXCIpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoeyB1cmw6IG1hbmlmZXN0SnNvblBhdGggfSk7XHJcbiAgICAgICAgcmV0dXJuIChyZXNwb25zZSA9PT0gXCI0MDQ6IE5vdCBGb3VuZFwiID8gbnVsbCA6IGF3YWl0IEpTT04ucGFyc2UocmVzcG9uc2UpKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYGVycm9yIGluIGdyYWJNYW5pZmVzdEpzb25Gcm9tUmVwb3NpdG9yeSBmb3IgJHttYW5pZmVzdEpzb25QYXRofWAsIGVycm9yKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBncmFiQ29tbW11bml0eVBsdWdpbkxpc3QgPSBhc3luYyAoKTogUHJvbWlzZTxKU09OPiA9PiB7XHJcbiAgICBjb25zdCBwbHVnaW5MaXN0VVJMID0gYGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL0hFQUQvY29tbXVuaXR5LXBsdWdpbnMuanNvbmA7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdCh7IHVybDogcGx1Z2luTGlzdFVSTCB9KTtcclxuICAgICAgICByZXR1cm4gKHJlc3BvbnNlID09PSBcIjQwNDogTm90IEZvdW5kXCIgPyBudWxsIDogYXdhaXQgSlNPTi5wYXJzZShyZXNwb25zZSkpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIGdyYWJDb21tbXVuaXR5UGx1Z2luTGlzdFwiLCBlcnJvcilcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdCA9IGFzeW5jICgpOiBQcm9taXNlPEpTT04+ID0+IHtcclxuICAgIGNvbnN0IHRoZW1lc1VSTCA9IGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9IRUFEL2NvbW11bml0eS1jc3MtdGhlbWVzLmpzb25gO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoeyB1cmw6IHRoZW1lc1VSTCB9KTtcclxuICAgICAgICByZXR1cm4gKHJlc3BvbnNlID09PSBcIjQwNDogTm90IEZvdW5kXCIgPyBudWxsIDogYXdhaXQgSlNPTi5wYXJzZShyZXNwb25zZSkpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIGdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdFwiLCBlcnJvcilcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBncmFiQ29tbW11bml0eVRoZW1lT2JzaWRpYW5Dc3MgPSBhc3luYyAocmVwb3NpdG9yeVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgICBjb25zdCB0aGVtZXNVUkwgPSBgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLyR7cmVwb3NpdG9yeVBhdGh9L0hFQUQvb2JzaWRpYW4uY3NzYDtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0KHsgdXJsOiB0aGVtZXNVUkwgfSk7XHJcbiAgICAgICAgcmV0dXJuIChyZXNwb25zZSA9PT0gXCI0MDQ6IE5vdCBGb3VuZFwiID8gbnVsbCA6IHJlc3BvbnNlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnJvciBpbiBncmFiQ29tbW11bml0eVRoZW1lc0xpc3RcIiwgZXJyb3IpXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBncmFiTGFzdENvbW1pdEluZm9Gb3JBRmlsZSA9IGFzeW5jIChyZXBvc2l0b3J5UGF0aDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xyXG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvc2l0b3J5UGF0aH0vY29tbWl0cz9wYXRoPSR7cGF0aH0mcGFnZT0xJnBlcl9wYWdlPTFgO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoeyB1cmw6IHVybCB9KTtcclxuICAgICAgICByZXR1cm4gKHJlc3BvbnNlID09PSBcIjQwNDogTm90IEZvdW5kXCIgPyBudWxsIDogSlNPTi5wYXJzZShyZXNwb25zZSkpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIGdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdFwiLCBlcnJvcilcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlID0gYXN5bmMgKHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgICBjb25zdCB0ZXN0ID0gYXdhaXQgZ3JhYkxhc3RDb21taXRJbmZvRm9yQUZpbGUocmVwb3NpdG9yeVBhdGgsIHBhdGgpO1xyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBpZih0ZXN0WzBdLmNvbW1pdC5jb21taXR0ZXIuZGF0ZSl7XHJcbiAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgcmV0dXJuIHRlc3RbMF0uY29tbWl0LmNvbW1pdHRlci5kYXRlXHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbn1cclxuIiwgImltcG9ydCB7IGdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlIH0gZnJvbSBcIi4uL2ZlYXR1cmVzL2dpdGh1YlV0aWxzXCI7XHJcbmltcG9ydCBUaGVQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhlbWVJbmZvcmFtdGlvbiB7XHJcbiAgICByZXBvOiBzdHJpbmc7XHJcbiAgICBsYXN0VXBkYXRlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRnJvemVuVmVyc2lvbiB7XHJcbiAgICByZXBvOiBzdHJpbmc7XHJcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3Mge1xyXG4gICAgcGx1Z2luTGlzdDogc3RyaW5nW107XHJcbiAgICBwbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbjogUGx1Z2luRnJvemVuVmVyc2lvbltdLFxyXG4gICAgdGhlbWVzTGlzdDogVGhlbWVJbmZvcmFtdGlvbltdO1xyXG4gICAgdXBkYXRlQXRTdGFydHVwOiBib29sZWFuO1xyXG4gICAgdXBkYXRlVGhlbWVzQXRTdGFydHVwOiAgYm9vbGVhbjtcclxuICAgIHJpYmJvbkljb25FbmFibGVkOiBib29sZWFuO1xyXG4gICAgbG9nZ2luZ0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICBsb2dnaW5nUGF0aDogc3RyaW5nO1xyXG4gICAgbG9nZ2luZ1ZlcmJvc2VFbmFibGVkOiBib29sZWFuO1xyXG4gICAgZGVidWdnaW5nTW9kZTogYm9vbGVhbjtcclxuICAgIG5vdGlmaWNhdGlvbnNFbmFibGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogU2V0dGluZ3MgPSB7XHJcbiAgICBwbHVnaW5MaXN0OiBbXSxcclxuICAgIHBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uOiBbXSxcclxuICAgIHRoZW1lc0xpc3Q6IFtdLFxyXG4gICAgdXBkYXRlQXRTdGFydHVwOiBmYWxzZSxcclxuICAgIHVwZGF0ZVRoZW1lc0F0U3RhcnR1cDogZmFsc2UsXHJcbiAgICByaWJib25JY29uRW5hYmxlZDogdHJ1ZSxcclxuICAgIGxvZ2dpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgIGxvZ2dpbmdQYXRoOiBcIkJSQVQtbG9nXCIsXHJcbiAgICBsb2dnaW5nVmVyYm9zZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgZGVidWdnaW5nTW9kZTogdHJ1ZSxcclxuICAgIG5vdGlmaWNhdGlvbnNFbmFibGVkOiB0cnVlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgcGx1Z2luIGZvciBiZXRhIHRlc3RpbmcgdG8gdGhlIGRhdGEuanNvbiBmaWxlIG9mIHRoaXMgIHBsdWdpblxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgIHBsdWdpbiAgICAgICAgIFxyXG4gKiBAcGFyYW0gICB7c3RyaW5nPHZvaWQ+fSAgIHJlcG9zaXRvcnlQYXRoICBwYXRoIHRvIHRoZSBHaXRIdWIgcmVwb3NpdG9yeVxyXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgIHNwZWNpZnlWZXJzaW9uICBpZiB0aGUgcGx1Z2luIG5lZWRzIHRvIHN0YXkgYXQgdGhlIGZyb3plbiB2ZXJzaW9uLCB3ZSBuZWVkIHRvIGFsc28gcmVjb3JkIHRoZSB2ZXJzaW9uXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPHZvaWQ+fSAgICAgICAgICAgICAgICAgIFxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZEJldGFQbHVnaW5Ub0xpc3QocGx1Z2luOiBUaGVQbHVnaW4sIHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIHNwZWNpZnlWZXJzaW9uID0gXCJcIik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHNhdmUgPSBmYWxzZTtcclxuICAgIGlmICghcGx1Z2luLnNldHRpbmdzLnBsdWdpbkxpc3QuY29udGFpbnMocmVwb3NpdG9yeVBhdGgpKSB7XHJcbiAgICAgICAgcGx1Z2luLnNldHRpbmdzLnBsdWdpbkxpc3QudW5zaGlmdChyZXBvc2l0b3J5UGF0aCk7XHJcbiAgICAgICAgc2F2ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgICAgc3BlY2lmeVZlcnNpb24gIT09IFwiXCIgXHJcbiAgICAgICAgJiYgKHBsdWdpbi5zZXR0aW5ncy5wbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbi5maWx0ZXIoeCA9PiB4LnJlcG8gPT09IHJlcG9zaXRvcnlQYXRoKS5sZW5ndGggPT09IDApXHJcbiAgICApIHtcclxuICAgICAgICBwbHVnaW4uc2V0dGluZ3MucGx1Z2luU3ViTGlzdEZyb3plblZlcnNpb24udW5zaGlmdCh7XHJcbiAgICAgICAgICAgIHJlcG86IHJlcG9zaXRvcnlQYXRoLFxyXG4gICAgICAgICAgICB2ZXJzaW9uOiBzcGVjaWZ5VmVyc2lvblxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNhdmUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHNhdmUpIHtcclxuICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiAgYSAgcGx1Z2luICBpcyBpbiBkYXRhLmpzb25cclxuICpcclxuICogQHBhcmFtICAge1RoZVBsdWdpbn0gICAgICAgICBwbHVnaW4gICAgICAgICAgXHJcbiAqIEBwYXJhbSAgIHtzdHJpbmc8Ym9vbGVhbj59ICAgcmVwb3NpdG9yeVBhdGggIHBhdGggdG8gdGhlIEdpdEh1YiByZXBvc2l0b3J5XHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPGJvb2xlYW4+fSAgdHJ1ZSBpZiBleGlzdHMgICAgICBcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGlzdEJldGFQbHVnaW5Jbkxpc3QocGx1Z2luOiBUaGVQbHVnaW4sIHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBwbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdC5jb250YWlucyhyZXBvc2l0b3J5UGF0aCk7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogQWRkcyBhIHRoZW1lIGZvciBiZXRhIHRlc3RpbmcgdG8gdGhlIGRhdGEuanNvbiBmaWxlIG9mIHRoaXMgIHBsdWdpblxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgIHBsdWdpbiAgICAgICAgIFxyXG4gKiBAcGFyYW0gICB7c3RyaW5nPHZvaWQ+fSAgIHJlcG9zaXRvcnlQYXRoICBwYXRoIHRvIHRoZSBHaXRIdWIgcmVwb3NpdG9yeVxyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTx2b2lkPn0gICAgICAgICAgICAgICAgICBcclxuICovXHJcbiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkQmV0YVRoZW1lVG9MaXN0KHBsdWdpbjogVGhlUGx1Z2luLCByZXBvc2l0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgY29uc3QgbmV3VGhlbWU6IFRoZW1lSW5mb3JhbXRpb24gPSB7IFxyXG4gICAgICAgICByZXBvOiByZXBvc2l0b3J5UGF0aCwgXHJcbiAgICAgICAgIGxhc3RVcGRhdGU6IGF3YWl0IGdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlKHJlcG9zaXRvcnlQYXRoLCBcIm9ic2lkaWFuLmNzc1wiKVxyXG4gICAgfVxyXG4gICAgcGx1Z2luLnNldHRpbmdzLnRoZW1lc0xpc3QudW5zaGlmdChuZXdUaGVtZSk7XHJcbiAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiBhICB0aGVtZSAgaXMgaW4gZGF0YS5qc29uXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICAgICAgICAgcGx1Z2luICAgICAgICAgIFxyXG4gKiBAcGFyYW0gICB7c3RyaW5nPGJvb2xlYW4+fSAgIHJlcG9zaXRvcnlQYXRoICBwYXRoIHRvIHRoZSBHaXRIdWIgcmVwb3NpdG9yeVxyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTxib29sZWFuPn0gIHRydWUgaWYgZXhpc3RzICAgICAgXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhpc3RCZXRhVGhlbWVpbkluTGlzdChwbHVnaW46IFRoZVBsdWdpbiwgcmVwb3NpdG9yeVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgdGVzdElmVGhlbUV4aXN0cyA9IHBsdWdpbi5zZXR0aW5ncy50aGVtZXNMaXN0LmZpbmQodD0+IHQucmVwbyA9PT0gcmVwb3NpdG9yeVBhdGgpO1xyXG4gICAgcmV0dXJuIHRlc3RJZlRoZW1FeGlzdHMgPyB0cnVlIDogZmFsc2U7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogVXBkYXRlIHRoZSBsYXN0VXBhdGUgZmllbGQgZm9yIHRoZSB0aGVtZVxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgICAgIHBsdWdpbiAgICAgICAgICBcclxuICogQHBhcmFtICAge3N0cmluZzxib29sZWFuPn0gICByZXBvc2l0b3J5UGF0aCAgcGF0aCB0byB0aGUgR2l0SHViIHJlcG9zaXRvcnlcclxuICogQHBhcmFtICAge3N0cmluZzxuZXdEYXRlPn0gICBuZXdEYXRlICBsYXN0IHVwZGF0ZSBmb3IgdGhpcyB0aGVtZVxyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTxib29sZWFuPn0gIHRydWUgaWYgZXhpc3RzICAgICAgXHJcbiAqL1xyXG4gZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUJldGFUaGVtZUxhc3RVcGRhdGVEYXRlKHBsdWdpbjogVGhlUGx1Z2luLCByZXBvc2l0b3J5UGF0aDogc3RyaW5nLCBuZXdEYXRlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHBsdWdpbi5zZXR0aW5ncy50aGVtZXNMaXN0LmZvckVhY2godD0+e1xyXG4gICAgICAgIGlmKHQucmVwbyA9PT0gcmVwb3NpdG9yeVBhdGgpIHtcclxuICAgICAgICAgICAgdC5sYXN0VXBkYXRlID0gbmV3RGF0ZTtcclxuICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbn1cclxuXHJcbiIsICJpbXBvcnQgeyBOb3RpY2UgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IFRoZVBsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5cclxuLyoqXHJcbiAqIERpc3BsYXlzIGEgbm90aWNlIHRvIHRoZSB1c2VyXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICBwbHVnaW4gICAgICAgICAgICBQbHVnaW4gb2JqZWN0XHJcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICBtc2cgICAgICAgICAgICAgICB0ZXh0IHRvIGRpc3BsYXkgdG8gdGhlIHVzZXJcclxuICogQHBhcmFtICAge1t0eXBlXX0gICAgIHZlcmJvc2VMb2dnaW5nT24gIFRydWUgaWYgc2hvdWxkIG9ubHkgYmUgbG9nZ2VkIGlmIHZlcmJvc2UgbG9nZ2luZyBpcyBlbmFibGVkXHJcbiAqXHJcbiAqIEByZXR1cm4gIHt2b2lkfSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBUb2FzdE1lc3NhZ2UocGx1Z2luOiBUaGVQbHVnaW4sIG1zZzogc3RyaW5nLCB0aW1lb3V0SW5TZWNvbmRzID0gMTAsIGNvbnRleHRNZW51Q2FsbGJhY2sgPSBudWxsKTogdm9pZCB7XHJcbiAgICBpZihwbHVnaW4uc2V0dGluZ3Mubm90aWZpY2F0aW9uc0VuYWJsZWQ9PT1mYWxzZSkgcmV0dXJuO1xyXG4gICAgY29uc3QgYWRkaXRpb25hbEluZm8gPSBjb250ZXh0TWVudUNhbGxiYWNrID8gXCIoY2xpY2s9ZGlzbWlzcywgcmlnaHQtY2xpY2s9SW5mbylcIiA6IFwiXCI7XHJcbiAgICBjb25zdCBuZXdOb3RpY2U6IE5vdGljZSA9IG5ldyBOb3RpY2UoYEJSQVRcXG4ke21zZ31cXG4ke2FkZGl0aW9uYWxJbmZvfWAsIHRpbWVvdXRJblNlY29uZHMqMTAwMCk7XHJcbiAgICAvL0B0cy1pZ25vcmVcclxuICAgIGlmKGNvbnRleHRNZW51Q2FsbGJhY2spIG5ld05vdGljZS5ub3RpY2VFbC5vbmNvbnRleHRtZW51ID0gYXN5bmMgKCkgPT4geyBjb250ZXh0TWVudUNhbGxiYWNrKCkgfTtcclxufSIsICJcclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoZXJlIGlzIGFuIGludGVybmV0IGNvbm5lY3Rpb25cclxuICogQHJldHVybnMgdHJ1ZSBpZiBjb25uZWN0ZWQsIGZhbHNlIGlmIG5vIGludGVybmV0XHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNDb25uZWN0ZWRUb0ludGVybmV0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBvbmxpbmUgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vb2JzaWRpYW4ubWQvP1wiICsgTWF0aC5yYW5kb20oKSk7XHJcbiAgICAgICAgcmV0dXJuIG9ubGluZS5zdGF0dXMgPj0gMjAwICYmIG9ubGluZS5zdGF0dXMgPCAzMDA7XHJcbiAgICB9IGNhdGNoKGVycikge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufSIsICJpbXBvcnQgeyBNb2RhbCwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgdGhlbWVJbnN0YWxsVGhlbWUsIHRoZW1lc0Rlcml2ZUJldGFOYW1lRnJvbVJlcG9zaXRvcnkgfSBmcm9tICcuLi9mZWF0dXJlcy90aGVtZXMnO1xyXG5pbXBvcnQgVGhlUGx1Z2luIGZyb20gJy4uL21haW4nO1xyXG5pbXBvcnQgeyBUb2FzdE1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9ub3RpZmljYXRpb25zJztcclxuaW1wb3J0IHsgYWRkQmV0YVRoZW1lVG9MaXN0LCBleGlzdEJldGFUaGVtZWluSW5MaXN0IH0gZnJvbSAnLi9zZXR0aW5ncyc7XHJcblxyXG4vKipcclxuICogQWRkIGEgYmV0YSB0aGVtZSB0byB0aGUgbGlzdCBvZiBwbHVnaW5zIGJlaW5nIHRyYWNrZWQgYW5kIHVwZGF0ZWRcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFkZE5ld1RoZW1lIGV4dGVuZHMgTW9kYWwge1xyXG4gICAgcGx1Z2luOiBUaGVQbHVnaW47XHJcbiAgICBhZGRyZXNzOiBzdHJpbmc7XHJcbiAgICBvcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzOiBib29sZWFuO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbjogVGhlUGx1Z2luLCBvcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzID0gZmFsc2UpIHtcclxuICAgICAgICBzdXBlcihwbHVnaW4uYXBwKTtcclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgICAgICB0aGlzLmFkZHJlc3MgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMub3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcyA9IG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3VibWl0Rm9ybSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5hZGRyZXNzID09PSBcIlwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgc2NydWJiZWRBZGRyZXNzID0gdGhpcy5hZGRyZXNzLnJlcGxhY2UoXCJodHRwczovL2dpdGh1Yi5jb20vXCIsIFwiXCIpO1xyXG4gICAgICAgIGlmIChhd2FpdCBleGlzdEJldGFUaGVtZWluSW5MaXN0KHRoaXMucGx1Z2luLCBzY3J1YmJlZEFkZHJlc3MpKSB7XHJcbiAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYFRoaXMgcGx1Z2luIGlzIGFscmVhZHkgaW4gdGhlIGxpc3QgZm9yIGJldGEgdGVzdGluZ2AsIDEwKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZihhd2FpdCB0aGVtZUluc3RhbGxUaGVtZSh0aGlzLnBsdWdpbiwgc2NydWJiZWRBZGRyZXNzLCB0aGVtZXNEZXJpdmVCZXRhTmFtZUZyb21SZXBvc2l0b3J5KHNjcnViYmVkQWRkcmVzcykpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGFkZEJldGFUaGVtZVRvTGlzdCh0aGlzLnBsdWdpbiwgc2NydWJiZWRBZGRyZXNzKTtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpOyAgICBcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25PcGVuKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGVudEVsLmNyZWF0ZUVsKCdoNCcsIHsgdGV4dDogXCJHaXRodWIgcmVwb3NpdG9yeSBmb3IgYmV0YSB0aGVtZTpcIiB9KTtcclxuICAgICAgICB0aGlzLmNvbnRlbnRFbC5jcmVhdGVFbCgnZm9ybScsIHt9LCAoZm9ybUVsKSA9PiB7XHJcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGZvcm1FbClcclxuICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0RWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuc2V0UGxhY2Vob2xkZXIoJ1JlcG9zaXRvcnkgKGV4YW1wbGU6IEdpdHViVXNlck5hbWUvcmVwb3NpdG9yeS1uYW1lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEVsLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3MgPSB2YWx1ZS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEVsLmlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGFzeW5jIChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiB0aGlzLmFkZHJlc3MgIT09ICcgJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdWJtaXRGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnNldHRpbmctaXRlbS1pbmZvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHRpdGxlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5mb2N1cygpXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBmb3JtRWwuY3JlYXRlRGl2KCdtb2RhbC1idXR0b24tY29udGFpbmVyJywgKGJ1dHRvbkNvbnRhaW5lckVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBidXR0b25Db250YWluZXJFbFxyXG4gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVFbCgnYnV0dG9uJywgeyBhdHRyOiB7IHR5cGU6ICdidXR0b24nIH0sIHRleHQ6ICdOZXZlciBtaW5kJyB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoKSk7XHJcbiAgICAgICAgICAgICAgICBidXR0b25Db250YWluZXJFbC5jcmVhdGVFbCgnYnV0dG9uJywge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dHI6IHsgdHlwZTogJ3N1Ym1pdCcgfSxcclxuICAgICAgICAgICAgICAgICAgICBjbHM6ICdtb2QtY3RhJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQWRkIFRoZW1lJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIGludm9rZWQgd2hlbiBidXR0b24gaXMgY2xpY2tlZC4gXHJcbiAgICAgICAgICAgIGZvcm1FbC5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBhc3luYyAoZTogRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZHJlc3MgIT09ICcnKSBhd2FpdCB0aGlzLnN1Ym1pdEZvcm0oKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5vcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzKSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLnBsdWdpbiBhcyBhbnkpLmFwcC5zZXR0aW5nLm9wZW4oKTtcclxuICAgICAgICAgICAgYXdhaXQgKHRoaXMucGx1Z2luIGFzIGFueSkuYXBwLnNldHRpbmcub3BlblRhYkJ5SWQoXCJvYnNpZGlhbjQyLWJyYXRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSIsICJpbXBvcnQgeyBNb2RhbCwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IEJldGFQbHVnaW5zIGZyb20gJy4uL2ZlYXR1cmVzL0JldGFQbHVnaW5zJztcclxuaW1wb3J0IFRoZVBsdWdpbiBmcm9tICcuLi9tYWluJztcclxuaW1wb3J0IHsgVG9hc3RNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvbm90aWZpY2F0aW9ucyc7XHJcbmltcG9ydCB7IGV4aXN0QmV0YVBsdWdpbkluTGlzdCB9IGZyb20gJy4vc2V0dGluZ3MnO1xyXG5cclxuLyoqXHJcbiAqIEFkZCBhIGJldGEgcGx1Z2luIHRvIHRoZSBsaXN0IG9mIHBsdWdpbnMgYmVpbmcgdHJhY2tlZCBhbmQgdXBkYXRlZFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRkTmV3UGx1Z2luTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XHJcbiAgICBwbHVnaW46IFRoZVBsdWdpbjtcclxuICAgIGJldGFQbHVnaW5zOiBCZXRhUGx1Z2lucztcclxuICAgIGFkZHJlc3M6IHN0cmluZztcclxuICAgIG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHM6IGJvb2xlYW47XHJcbiAgICByZWFkb25seSB1c2VGcm96ZW5WZXJzaW9uOiBib29sZWFuO1xyXG4gICAgdmVyc2lvbjogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbjogVGhlUGx1Z2luLCBiZXRhUGx1Z2luczogQmV0YVBsdWdpbnMsIG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMgPSBmYWxzZSwgdXNlRnJvemVuVmVyc2lvbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgc3VwZXIocGx1Z2luLmFwcCk7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICAgICAgdGhpcy5iZXRhUGx1Z2lucyA9IGJldGFQbHVnaW5zO1xyXG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5vcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzID0gb3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcztcclxuICAgICAgICB0aGlzLnVzZUZyb3plblZlcnNpb24gPSB1c2VGcm96ZW5WZXJzaW9uO1xyXG4gICAgICAgIHRoaXMudmVyc2lvbiA9IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3VibWl0Rm9ybSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5hZGRyZXNzID09PSBcIlwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgc2NydWJiZWRBZGRyZXNzID0gdGhpcy5hZGRyZXNzLnJlcGxhY2UoXCJodHRwczovL2dpdGh1Yi5jb20vXCIsXCJcIik7XHJcbiAgICAgICAgaWYgKGF3YWl0IGV4aXN0QmV0YVBsdWdpbkluTGlzdCh0aGlzLnBsdWdpbiwgc2NydWJiZWRBZGRyZXNzKSkge1xyXG4gICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGBUaGlzIHBsdWdpbiBpcyBhbHJlYWR5IGluIHRoZSBsaXN0IGZvciBiZXRhIHRlc3RpbmdgLCAxMCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5iZXRhUGx1Z2lucy5hZGRQbHVnaW4oc2NydWJiZWRBZGRyZXNzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0aGlzLnZlcnNpb24pO1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbk9wZW4oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50RWwuY3JlYXRlRWwoJ2g0JywgeyB0ZXh0OiBcIkdpdGh1YiByZXBvc2l0b3J5IGZvciBiZXRhIHBsdWdpbjpcIiB9KTtcclxuICAgICAgICB0aGlzLmNvbnRlbnRFbC5jcmVhdGVFbCgnZm9ybScsIHt9LCAoZm9ybUVsKSA9PiB7XHJcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGZvcm1FbClcclxuICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0RWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuc2V0UGxhY2Vob2xkZXIoJ1JlcG9zaXRvcnkgKGV4YW1wbGU6IFRmVEhhY2tlci9vYnNpZGlhbi1icmF0KScpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHRFbC5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzID0gdmFsdWUudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHRFbC5pbnB1dEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBhc3luYyAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgdGhpcy5hZGRyZXNzICE9PSAnICcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy51c2VGcm96ZW5WZXJzaW9uICYmIHRoaXMudmVyc2lvbiAhPT0gXCJcIikgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCF0aGlzLnVzZUZyb3plblZlcnNpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdWJtaXRGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnNldHRpbmctaXRlbS1pbmZvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHRpdGxlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5mb2N1cygpXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy51c2VGcm96ZW5WZXJzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBuZXcgU2V0dGluZyhmb3JtRWwpXHJcbiAgICAgICAgICAgICAgICAgICAgLmFkZFRleHQoKHRleHRFbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuc2V0UGxhY2Vob2xkZXIoJ1NwZWNpZnkgdGhlIHJlbGVhc2UgdmVyc2lvbiB0YWcgKGV4YW1wbGU6IDEuMC4wKScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB2YWx1ZS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2V0dGluZy1pdGVtLWluZm9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHRpdGxlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvcm1FbC5jcmVhdGVEaXYoJ21vZGFsLWJ1dHRvbi1jb250YWluZXInLCAoYnV0dG9uQ29udGFpbmVyRWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lckVsXHJcbiAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUVsKCdidXR0b24nLCB7IGF0dHI6IHsgdHlwZTogJ2J1dHRvbicgfSwgdGV4dDogJ05ldmVyIG1pbmQnIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKTtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lckVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0cjogeyB0eXBlOiAnc3VibWl0JyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGNsczogJ21vZC1jdGEnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdBZGQgUGx1Z2luJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIGludm9rZWQgd2hlbiBidXR0b24gaXMgY2xpY2tlZC4gXHJcbiAgICAgICAgICAgIGZvcm1FbC5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBhc3luYyAoZTogRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZHJlc3MgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy51c2VGcm96ZW5WZXJzaW9uICYmIHRoaXMudmVyc2lvbiAhPT0gXCJcIikgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghdGhpcy51c2VGcm96ZW5WZXJzaW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN1Ym1pdEZvcm0oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhc3luYyBvbkNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmKHRoaXMub3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcykge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5wbHVnaW4gYXMgYW55KS5hcHAuc2V0dGluZy5vcGVuKCk7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLnBsdWdpbiBhcyBhbnkpLmFwcC5zZXR0aW5nLm9wZW5UYWJCeUlkKFwib2JzaWRpYW40Mi1icmF0XCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn0iLCAiaW1wb3J0IFRoZVBsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgQWRkTmV3UGx1Z2luTW9kYWwgZnJvbSBcIi4uL3VpL0FkZE5ld1BsdWdpbk1vZGFsXCI7XHJcbmltcG9ydCB7IGdyYWJNYW5pZmVzdEpzb25Gcm9tUmVwb3NpdG9yeSwgZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnkgfSBmcm9tIFwiLi9naXRodWJVdGlsc1wiO1xyXG5pbXBvcnQgeyBub3JtYWxpemVQYXRoLCBQbHVnaW5NYW5pZmVzdCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGFkZEJldGFQbHVnaW5Ub0xpc3QgfSBmcm9tIFwiLi4vdWkvc2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgVG9hc3RNZXNzYWdlIH0gZnJvbSBcIi4uL3V0aWxzL25vdGlmaWNhdGlvbnNcIjtcclxuaW1wb3J0IHsgaXNDb25uZWN0ZWRUb0ludGVybmV0IH0gZnJvbSBcIi4uL3V0aWxzL2ludGVybmV0Y29ubmVjdGlvblwiO1xyXG5cclxuLyoqXHJcbiAqIGFsbCB0aGUgZmlsZXMgbmVlZGVkIGZvciBhIHBsdWdpbiBiYXNlZCBvbiB0aGUgcmVsZWFzZSBmaWxlcyBhcmUgaHJlXHJcbiAqL1xyXG5pbnRlcmZhY2UgUmVsZWFzZUZpbGVzIHtcclxuICAgIG1haW5Kczogc3RyaW5nO1xyXG4gICAgbWFuaWZlc3Q6IHN0cmluZztcclxuICAgIHN0eWxlczogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogUHJpbWFyeSBoYW5kbGVyIGZvciBhZGRpbmcsIHVwZGF0aW5nLCBkZWxldGluZyBiZXRhIHBsdWdpbnMgdHJhY2tlZCBieSB0aGlzIHBsdWdpblxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmV0YVBsdWdpbnMge1xyXG4gICAgcGx1Z2luOiBUaGVQbHVnaW47XHJcblxyXG4gICAgY29uc3RydWN0b3IocGx1Z2luOiBUaGVQbHVnaW4pIHtcclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIG9wZW5zIHRoZSBBZGROZXdQbHVnaW5Nb2RhbCB0byBnZXQgaW5mbyBmb3IgIGEgbmV3IGJldGEgcGx1Z2luXHJcbiAgICAgKiBAcGFyYW0gICB7Ym9vbGVhbn0gICBvcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzIHdpbGwgb3BlbiBzZXR0aW5ncyBzY3JlZW4gYWZ0ZXJ3YXJkcy4gVXNlZCB3aGVuIHRoaXMgY29tbWFuZCBpcyBjYWxsZWQgZnJvbSBzZXR0aW5ncyB0YWJcclxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgIHVzZUZyb3plblZlcnNpb24gICAgICAgICAgaW5zdGFsbCB0aGUgcGx1Z2luIHVzaW5nIGZyb3plbiB2ZXJzaW9uLlxyXG4gICAgICogQHJldHVybiAgezxQcm9taXNlPjx2b2lkPn1cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZGlzcGxheUFkZE5ld1BsdWdpbk1vZGFsKG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMgPSBmYWxzZSwgdXNlRnJvemVuVmVyc2lvbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgbmV3UGx1Z2luID0gbmV3IEFkZE5ld1BsdWdpbk1vZGFsKHRoaXMucGx1Z2luLCB0aGlzLCBvcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzLCB1c2VGcm96ZW5WZXJzaW9uKTtcclxuICAgICAgICBuZXdQbHVnaW4ub3BlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGVzIHRoYXQgYSBHaXRIdWIgcmVwb3NpdG9yeSBpcyBwbHVnaW5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlQYXRoICAgR2l0aHViVXNlci9SZXBvc2l0b3J5TmFtZSAoZXhhbXBsZTogVGZUaGFja2VyL29ic2lkaWFuNDItYnJhdClcclxuICAgICAqIEBwYXJhbSAgIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICAgZ2V0QmV0YU1hbmlmZXN0ICB0ZXN0IHRoZSBiZXRhIHZlcnNpb24gb2YgdGhlIG1hbmlmZXN0LCBub3QgYXQgdGhlIHJvb3RcclxuICAgICAqIEBwYXJhbSAgIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICAgZmFsc2UgICAgICAgICAgICBbZmFsc2UgZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0gICB7W3R5cGVdfSAgICAgICAgICAgICAgICAgICAgIHJlcG9ydElzc3VlcyAgICAgIHdpbGwgZGlzcGxheSBub3RpY2VzIGFzIGl0IGZpbmRzIGlzc3Vlc1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gIHtQcm9taXNlPFBsdWdpbk1hbmlmZXN0Pn0gICAgICAgICAgICAgICAgICAgICB0aGUgbWFuaWZlc3QgZmlsZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBpdHMgaW5jb21wbGV0ZVxyXG4gICAgICovXHJcbiAgICBhc3luYyB2YWxpZGF0ZVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGg6IHN0cmluZywgZ2V0QmV0YU1hbmlmZXN0ID0gZmFsc2UsIHJlcG9ydElzc3VlcyA9IGZhbHNlKTogUHJvbWlzZTxQbHVnaW5NYW5pZmVzdD4ge1xyXG4gICAgICAgIGNvbnN0IG5vdGljZVRpbWVvdXQgPSAxNTtcclxuICAgICAgICBjb25zdCBtYW5pZmVzdEpzb24gPSBhd2FpdCBncmFiTWFuaWZlc3RKc29uRnJvbVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGgsICFnZXRCZXRhTWFuaWZlc3QpO1xyXG4gICAgICAgIGlmICghbWFuaWZlc3RKc29uKSB7IC8vIHRoaXMgaXMgYSBwbHVnaW4gd2l0aCBhIG1hbmlmZXN0IGpzb24sIHRyeSB0byBzZWUgaWYgdGhlcmUgaXMgYSBiZXRhIHZlcnNpb25cclxuICAgICAgICAgICAgaWYgKHJlcG9ydElzc3VlcykgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgJHtyZXBvc2l0b3J5UGF0aH1cXG5UaGlzIGRvZXMgbm90IHNlZW0gdG8gYmUgYW4gb2JzaWRpYW4gcGx1Z2luLCBhcyB0aGVyZSBpcyBubyBtYW5pZmVzdC5qc29uIGZpbGUuYCwgbm90aWNlVGltZW91dCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUZXN0IHRoYXQgdGhlIG1haW5mZXN0IGhhcyBzb21lIGtleSBlbGVtZW50cywgbGlrZSBJRCBhbmQgdmVyc2lvblxyXG4gICAgICAgIGlmICghKFwiaWRcIiBpbiBtYW5pZmVzdEpzb24pKSB7IC8vIHRoaXMgaXMgYSBwbHVnaW4gd2l0aCBhIG1hbmlmZXN0IGpzb24sIHRyeSB0byBzZWUgaWYgdGhlcmUgaXMgYSBiZXRhIHZlcnNpb25cclxuICAgICAgICAgICAgaWYgKHJlcG9ydElzc3VlcykgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLGAke3JlcG9zaXRvcnlQYXRofVxcblRoZSBwbHVnaW4gaWQgYXR0cmlidXRlIGZvciB0aGUgcmVsZWFzZSBpcyBtaXNzaW5nIGZyb20gdGhlIG1hbmlmZXN0IGZpbGVgLCBub3RpY2VUaW1lb3V0KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghKFwidmVyc2lvblwiIGluIG1hbmlmZXN0SnNvbikpIHsgLy8gdGhpcyBpcyBhIHBsdWdpbiB3aXRoIGEgbWFuaWZlc3QganNvbiwgdHJ5IHRvIHNlZSBpZiB0aGVyZSBpcyBhIGJldGEgdmVyc2lvblxyXG4gICAgICAgICAgICBpZiAocmVwb3J0SXNzdWVzKSBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sYCR7cmVwb3NpdG9yeVBhdGh9XFxuVGhlIHZlcnNpb24gYXR0cmlidXRlIGZvciB0aGUgcmVsZWFzZSBpcyBtaXNzaW5nIGZyb20gdGhlIG1hbmlmZXN0IGZpbGVgLCBub3RpY2VUaW1lb3V0KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYW5pZmVzdEpzb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCB0aGUgcmVsZXNlIGZpbGVzIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIG51bWJlciBpbiB0aGUgbWFuaWZlc3RcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlQYXRoICBwYXRoIHRvIHRoZSBHaXRIdWIgcmVwb3NpdG9yeVxyXG4gICAgICogQHBhcmFtICAge1BsdWdpbk1hbmlmZXN0PFJlbGVhc2VGaWxlcz59ICBtYW5pZmVzdCAgICAgICAgbWFuaWZlc3QgZmlsZVxyXG4gICAgICogQHBhcmFtICAge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICAgICBnZXRNYW5pZmVzdCAgICAgZ3JhYiB0aGUgcmVtb3RlIG1hbmlmZXN0IGZpbGVcclxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeVZlcnNpb24gIGdyYWIgdGhlIHNwZWNpZmllZCB2ZXJzaW9uIGlmIHNldFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gIHtQcm9taXNlPFJlbGVhc2VGaWxlcz59ICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCByZWxhc2UgZmlsZXMgYXMgc3RyaW5ncyBiYXNlZCBvbiB0aGUgUmVsZWFzZUZpbGVzIGludGVyYWZhY2VcclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0QWxsUmVsZWFzZUZpbGVzKHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIG1hbmlmZXN0OiBQbHVnaW5NYW5pZmVzdCwgZ2V0TWFuaWZlc3Q6IGJvb2xlYW4sIHNwZWNpZnlWZXJzaW9uID0gXCJcIik6IFByb21pc2U8UmVsZWFzZUZpbGVzPiB7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHNwZWNpZnlWZXJzaW9uID09PSBcIlwiID8gbWFuaWZlc3QudmVyc2lvbiA6IHNwZWNpZnlWZXJzaW9uO1xyXG5cclxuICAgICAgICAvLyBpZiB3ZSBoYXZlIHZlcnNpb24gc3BlY2lmaWVkLCB3ZSBhbHdheXMgd2FudCB0byBnZXQgdGhlIHJlbW90ZSBtYW5pZmVzdCBmaWxlLlxyXG4gICAgICAgIGNvbnN0IHJlYWxseUdldE1hbmlmZXN0T3JOb3QgPSBnZXRNYW5pZmVzdCB8fCAoc3BlY2lmeVZlcnNpb24gIT09IFwiXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBtYWluSnM6IGF3YWl0IGdyYWJSZWxlYXNlRmlsZUZyb21SZXBvc2l0b3J5KHJlcG9zaXRvcnlQYXRoLCB2ZXJzaW9uLCBcIm1haW4uanNcIiksXHJcbiAgICAgICAgICAgIG1hbmlmZXN0OiByZWFsbHlHZXRNYW5pZmVzdE9yTm90ID8gYXdhaXQgZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGgsIHZlcnNpb24sIFwibWFuaWZlc3QuanNvblwiKSA6IG51bGwsXHJcbiAgICAgICAgICAgIHN0eWxlczogYXdhaXQgZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGgsIHZlcnNpb24sIFwic3R5bGVzLmNzc1wiKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlcyB0aGUgcGx1Z2luIHJlbGVhc2UgZmlsZXMgdG8gdGhlIGxvY2FsIG9ic2lkaWFuIC5wbHVnaW5zIGZvbGRlclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICBiZXRhUGx1Z2luSUQgIHRoZSBpZCBvZiB0aGUgcGx1Z2luIChub3QgdGhlIHJlcG9zaXRvcnkgcGF0aClcclxuICAgICAqIEBwYXJhbSAgIHtSZWxlYXNlRmlsZXM8dm9pZD59ICByZWxGaWxlcyAgICAgIHJlbGVhc2UgZmlsZSBhcyBzdHJpbmdzLCBiYXNlZCBvbiB0aGUgUmVsZWFzZUZpbGVzIGludGVyZmFjZVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gIHtQcm9taXNlPHZvaWQ+fSAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICovXHJcbiAgICBhc3luYyB3cml0ZVJlbGVhc2VGaWxlc1RvUGx1Z2luRm9sZGVyKGJldGFQbHVnaW5JRDogc3RyaW5nLCByZWxGaWxlczogUmVsZWFzZUZpbGVzKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgcGx1Z2luVGFyZ2V0Rm9sZGVyUGF0aCA9IG5vcm1hbGl6ZVBhdGgodGhpcy5wbHVnaW4uYXBwLnZhdWx0LmNvbmZpZ0RpciArIFwiL3BsdWdpbnMvXCIgKyBiZXRhUGx1Z2luSUQpICsgXCIvXCI7XHJcbiAgICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyO1xyXG4gICAgICAgIGlmIChhd2FpdCBhZGFwdGVyLmV4aXN0cyhwbHVnaW5UYXJnZXRGb2xkZXJQYXRoKSA9PT0gZmFsc2UgfHxcclxuICAgICAgICAgICAgIShhd2FpdCBhZGFwdGVyLmV4aXN0cyhwbHVnaW5UYXJnZXRGb2xkZXJQYXRoICsgXCJtYW5pZmVzdC5qc29uXCIpKSkge1xyXG4gICAgICAgICAgICAvLyBpZiBwbHVnaW4gZm9sZGVyIGRvZXNudCBleGlzdCBvciBtYW5pZmVzdC5qc29uIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBpdCBhbmQgc2F2ZSB0aGUgcGx1Z2luIGZpbGVzXHJcbiAgICAgICAgICAgIGF3YWl0IGFkYXB0ZXIubWtkaXIocGx1Z2luVGFyZ2V0Rm9sZGVyUGF0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IGFkYXB0ZXIud3JpdGUocGx1Z2luVGFyZ2V0Rm9sZGVyUGF0aCArIFwibWFpbi5qc1wiLCByZWxGaWxlcy5tYWluSnMpO1xyXG4gICAgICAgIGF3YWl0IGFkYXB0ZXIud3JpdGUocGx1Z2luVGFyZ2V0Rm9sZGVyUGF0aCArIFwibWFuaWZlc3QuanNvblwiLCByZWxGaWxlcy5tYW5pZmVzdCk7XHJcbiAgICAgICAgaWYgKHJlbEZpbGVzLnN0eWxlcykgYXdhaXQgYWRhcHRlci53cml0ZShwbHVnaW5UYXJnZXRGb2xkZXJQYXRoICsgXCJzdHlsZXMuY3NzXCIsIHJlbEZpbGVzLnN0eWxlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmltYXJ5IGZ1bmN0aW9uIGZvciBhZGRpbmcgYSBuZXcgYmV0YSBwbHVnaW4gdG8gb2JzaWRpYW4uIEFsc28gdGhpcyBmdW5jdGlvbiBpcyB1c2UgZm9yIHVwZGF0aW5nXHJcbiAgICAgKiBleGlzdGluZyBwbHVnaW5zLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICByZXBvc2l0b3J5UGF0aCAgICAgcGF0aCB0byBHaXRIdWIgcmVwb3NpdG9yeSBmb3JtYXRlZCBhcyBVU0VSTkFNRS9yZXBvc2l0b3J5XHJcbiAgICAgKiBAcGFyYW0gICB7Ym9vbGVhbn0gICAgICAgICAgICAgdXBkYXRlUGx1Z2luRmlsZXMgIHRydWUgaWYgdGhpcyBpcyBqdXN0IGFuIHVwZGF0ZSBub3QgYW4gaW5zdGFsbFxyXG4gICAgICogQHBhcmFtICAge2Jvb2xlYW59ICAgICAgICAgICAgIHNlZUlmVXBkYXRlZE9ubHkgICBpZiB0cnVlLCBhbmQgdXBkYXRlUGx1Z2luRmlsZXMgdHJ1ZSwgd2lsbCBqdXN0IGNoZWNrIGZvciB1cGRhdGVzLCBidXQgbm90IGRvIHRoZSB1cGRhdGUuIHdpbGwgcmVwb3J0IHRvIHVzZXIgdGhhdCB0aGVyZSBpcyBhIG5ldyBwbHVnaW5cclxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgICAgICAgICAgICByZXBvcnRJZk5vdFVwZHRlZCAgaWYgdHJ1ZSwgcmVwb3J0IGlmIGFuIHVwZGF0ZSBoYXMgbm90IHN1Y2NlZFxyXG4gICAgICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgICAgIHNwZWNpZnlWZXJzaW9uICAgICBpZiBub3QgZW1wdHksIG5lZWQgdG8gaW5zdGFsbCBhIHNwZWNpZmllZCB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIHZhbHVlIGluIG1hbmlmZXN0ey1iZXRhfS5qc29uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiAge1Byb21pc2U8Ym9vbGVhbj59ICAgICAgICAgICAgICAgICAgICAgICB0cnVlIGlmIHN1Y2NlZWRzXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFkZFBsdWdpbihyZXBvc2l0b3J5UGF0aDogc3RyaW5nLCB1cGRhdGVQbHVnaW5GaWxlcyA9IGZhbHNlLCBzZWVJZlVwZGF0ZWRPbmx5ID0gZmFsc2UsIHJlcG9ydElmTm90VXBkdGVkID0gZmFsc2UsIHNwZWNpZnlWZXJzaW9uID0gXCJcIik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IG5vdGljZVRpbWVvdXQgPSAxMDtcclxuICAgICAgICBsZXQgcHJpbWFyeU1hbmlmZXN0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGgsIHRydWUsIGZhbHNlKTsgLy8gYXR0ZW1wdCB0byBnZXQgbWFuaWZlc3QtYmV0YS5qc29uXHJcbiAgICAgICAgY29uc3QgdXNpbmdCZXRhTWFuaWZlc3Q6IGJvb2xlYW4gPSBwcmltYXJ5TWFuaWZlc3QgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgaWYgKHVzaW5nQmV0YU1hbmlmZXN0ID09PSBmYWxzZSlcclxuICAgICAgICAgICAgcHJpbWFyeU1hbmlmZXN0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGgsIGZhbHNlLCB0cnVlKTsgLy8gYXR0ZW1wdCB0byBnZXQgbWFuaWZlc3QuanNvblxyXG5cclxuICAgICAgICBpZiAocHJpbWFyeU1hbmlmZXN0ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3JlcG9zaXRvcnlQYXRofVxcbkEgbWFuaWZlc3QuanNvbiBvciBtYW5pZmVzdC1iZXRhLmpzb24gZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHJlcG9zaXRvcnkuIFRoaXMgcGx1Z2luIGNhbm5vdCBiZSBpbnN0YWxsZWQuYDtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYCR7bXNnfWAsIG5vdGljZVRpbWVvdXQpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXByaW1hcnlNYW5pZmVzdC5oYXNPd25Qcm9wZXJ0eSgndmVyc2lvbicpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3JlcG9zaXRvcnlQYXRofVxcblRoZSBtYW5pZmVzdCR7dXNpbmdCZXRhTWFuaWZlc3QgPyBcIi1iZXRhXCIgOiBcIlwifS5qc29uIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSByZXBvc2l0b3J5IGRvZXMgbm90IGhhdmUgYSB2ZXJzaW9uIG51bWJlciBpbiB0aGUgZmlsZS4gVGhpcyBwbHVnaW4gY2Fubm90IGJlIGluc3RhbGxlZC5gO1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnLCB0cnVlKTtcclxuICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgJHttc2d9YCwgbm90aWNlVGltZW91dCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGdldFJlbGVhc2UgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0QWxsUmVsZWFzZUZpbGVzKHJlcG9zaXRvcnlQYXRoLCBwcmltYXJ5TWFuaWZlc3QsIHVzaW5nQmV0YU1hbmlmZXN0LCBzcGVjaWZ5VmVyc2lvbik7XHJcbiAgICAgICAgICAgIGlmICh1c2luZ0JldGFNYW5pZmVzdCB8fCByRmlsZXMubWFuaWZlc3QgPT09IG51bGwpICAvL2lmIGJldGEsIHVzZSB0aGF0IG1hbmlmZXN0LCBvciBpZiB0aGVyZSBpcyBubyBtYW5pZmVzdCBpbiByZWxlYXNlLCB1c2UgdGhlIHByaW1hcnlNYW5pZmVzdFxyXG4gICAgICAgICAgICAgICAgckZpbGVzLm1hbmlmZXN0ID0gSlNPTi5zdHJpbmdpZnkocHJpbWFyeU1hbmlmZXN0KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyRmlsZXMubWFpbkpzID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgJHtyZXBvc2l0b3J5UGF0aH1cXG5UaGUgcmVsZWFzZSBpcyBub3QgY29tcGxldGUgYW5kIGNhbm5vdCBiZSBkb3dubG9hZC4gbWFpbi5qcyBpcyBtaXNzaW5nIGZyb20gdGhlIFJlbGVhc2VgO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGAke21zZ31gLCBub3RpY2VUaW1lb3V0KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByRmlsZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodXBkYXRlUGx1Z2luRmlsZXMgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbGVhc2VGaWxlcyA9IGF3YWl0IGdldFJlbGVhc2UoKTtcclxuICAgICAgICAgICAgaWYgKHJlbGVhc2VGaWxlcyA9PT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlUmVsZWFzZUZpbGVzVG9QbHVnaW5Gb2xkZXIocHJpbWFyeU1hbmlmZXN0LmlkLCByZWxlYXNlRmlsZXMpO1xyXG4gICAgICAgICAgICBhd2FpdCBhZGRCZXRhUGx1Z2luVG9MaXN0KHRoaXMucGx1Z2luLCByZXBvc2l0b3J5UGF0aCwgc3BlY2lmeVZlcnNpb24pO1xyXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uYXBwLnBsdWdpbnMubG9hZE1hbmlmZXN0cygpO1xyXG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uVGV4dCA9IHNwZWNpZnlWZXJzaW9uID09PSBcIlwiID8gXCJcIiA6IGAgKHZlcnNpb246ICR7c3BlY2lmeVZlcnNpb259KWA7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3JlcG9zaXRvcnlQYXRofSR7dmVyc2lvblRleHR9XFxuVGhlIHBsdWdpbiBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGggQlJBVC4gWW91IG1heSBzdGlsbCBuZWVkIHRvIGVuYWJsZSBpdCB0aGUgQ29tbXVuaXR5IFBsdWdpbiBMaXN0LmA7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2csIHRydWUpO1xyXG4gICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIG1zZywgbm90aWNlVGltZW91dCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdGVzdCBpZiB0aGUgcGx1Z2luIG5lZWRzIHRvIGJlIHVwZGF0ZWRcclxuICAgICAgICAgICAgLy8gaWYgYSBzcGVjaWZpZWQgdmVyc2lvbiBpcyBwcm92aWRlZCwgdGhlbiB3ZSBzaGFsbCBza2lwIHRoZSB1cGRhdGVcclxuICAgICAgICAgICAgY29uc3QgcGx1Z2luVGFyZ2V0Rm9sZGVyUGF0aCA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5jb25maWdEaXIgKyBcIi9wbHVnaW5zL1wiICsgcHJpbWFyeU1hbmlmZXN0LmlkICsgXCIvXCI7XHJcbiAgICAgICAgICAgIGxldCBsb2NhbE1hbmlmZXN0Q29udGVudHMgPSBudWxsO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgbG9jYWxNYW5pZmVzdENvbnRlbnRzID0gYXdhaXQgdGhpcy5wbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXIucmVhZChwbHVnaW5UYXJnZXRGb2xkZXJQYXRoICsgXCJtYW5pZmVzdC5qc29uXCIpXHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlLmVycm5vID09PSAtNDA1OCkgeyAvLyBmaWxlIGRvZXMgbm90IGV4aXN0LCB0cnkgaW5zdGFsbGluZyB0aGUgcGx1Z2luXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRQbHVnaW4ocmVwb3NpdG9yeVBhdGgsIGZhbHNlLCB1c2luZ0JldGFNYW5pZmVzdCwgZmFsc2UsIHNwZWNpZnlWZXJzaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZXZlbiB0aG91Z2ggZmFpbGVkLCByZXR1cm4gdHJ1ZSBzaW5jZSBpbnN0YWxsIHdpbGwgYmUgYXR0ZW1wdGVkXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJCUkFUIC0gTG9jYWwgTWFuaWZlc3QgTG9hZFwiLCBwcmltYXJ5TWFuaWZlc3QuaWQsIEpTT04uc3RyaW5naWZ5KGUsIG51bGwsIDIpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgc3BlY2lmeVZlcnNpb24gIT09IFwiXCIgXHJcbiAgICAgICAgICAgICAgICB8fCB0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbi5tYXAoeD0+eC5yZXBvKS5pbmNsdWRlcyhyZXBvc2l0b3J5UGF0aClcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBza2lwIHRoZSBmcm96ZW4gdmVyc2lvbiBwbHVnaW5cclxuICAgICAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYFRoZSB2ZXJzaW9uIG9mICR7cmVwb3NpdG9yeVBhdGh9IGlzIGZyb3plbiwgbm90IHVwZGF0aW5nLmAsIDMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2NhbE1hbmlmZXN0SlNPTiA9IGF3YWl0IEpTT04ucGFyc2UobG9jYWxNYW5pZmVzdENvbnRlbnRzKTtcclxuICAgICAgICAgICAgaWYgKGxvY2FsTWFuaWZlc3RKU09OLnZlcnNpb24gIT09IHByaW1hcnlNYW5pZmVzdC52ZXJzaW9uKSB7IC8vbWFuaWZlc3QgZmlsZXMgYXJlIG5vdCB0aGUgc2FtZSwgZG8gYW4gdXBkYXRlXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWxlYXNlRmlsZXMgPSBhd2FpdCBnZXRSZWxlYXNlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVsZWFzZUZpbGVzID09PSBudWxsKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNlZUlmVXBkYXRlZE9ubHkpIHsgLy8gZG9udCB1cGRhdGUsIGp1c3QgcmVwb3J0IGl0XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYFRoZXJlIGlzIGFuIHVwZGF0ZSBhdmFpbGFibGUgZm9yICR7cHJpbWFyeU1hbmlmZXN0LmlkfSBmcm9tIHZlcnNpb24gJHtsb2NhbE1hbmlmZXN0SlNPTi52ZXJzaW9ufSB0byAke3ByaW1hcnlNYW5pZmVzdC52ZXJzaW9ufS4gYDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnICsgYFtSZWxlYXNlIEluZm9dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnlQYXRofS9yZWxlYXNlcy90YWcvJHtwcmltYXJ5TWFuaWZlc3QudmVyc2lvbn0pYCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgbXNnLCAzMCwgYXN5bmMgKCkgPT4geyB3aW5kb3cub3BlbihgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeVBhdGh9L3JlbGVhc2VzL3RhZy8ke3ByaW1hcnlNYW5pZmVzdC52ZXJzaW9ufWApfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGVSZWxlYXNlRmlsZXNUb1BsdWdpbkZvbGRlcihwcmltYXJ5TWFuaWZlc3QuaWQsIHJlbGVhc2VGaWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uYXBwLnBsdWdpbnMubG9hZE1hbmlmZXN0cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbi5hcHAucGx1Z2lucy5wbHVnaW5zW3ByaW1hcnlNYW5pZmVzdC5pZF0/Lm1hbmlmZXN0KSBhd2FpdCB0aGlzLnJlbG9hZFBsdWdpbihwcmltYXJ5TWFuaWZlc3QuaWQpOyAvL3JlbG9hZCBpZiBlbmFibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7cHJpbWFyeU1hbmlmZXN0LmlkfVxcblBsdWdpbiBoYXMgYmVlbiB1cGRhdGVkIGZyb20gdmVyc2lvbiAke2xvY2FsTWFuaWZlc3RKU09OLnZlcnNpb259IHRvICR7cHJpbWFyeU1hbmlmZXN0LnZlcnNpb259LiBgO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2cgKyBgW1JlbGVhc2UgSW5mb10oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeVBhdGh9L3JlbGVhc2VzL3RhZy8ke3ByaW1hcnlNYW5pZmVzdC52ZXJzaW9ufSlgLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBtc2csIDMwLCBhc3luYyAoKSA9PiB7IHdpbmRvdy5vcGVuKGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5UGF0aH0vcmVsZWFzZXMvdGFnLyR7cHJpbWFyeU1hbmlmZXN0LnZlcnNpb259YCkgfSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIGlmIChyZXBvcnRJZk5vdFVwZHRlZCkgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgTm8gdXBkYXRlIGF2YWlsYWJsZSBmb3IgJHtyZXBvc2l0b3J5UGF0aH1gLCAzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZWxvYWRzIGEgcGx1Z2luIChhc3N1bWluZyBpdCBoYXMgYmVlbiBlbmFibGVkIGJ5IHVzZXIpXHJcbiAgICAgKiBwamVieSwgVGhhbmtzIEJybyBodHRwczovL2dpdGh1Yi5jb20vcGplYnkvaG90LXJlbG9hZC9ibG9iL21hc3Rlci9tYWluLmpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmc8dm9pZD59ICAgcGx1Z2luTmFtZSAgbmFtZSBvZiBwbHVnaW5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuICB7UHJvbWlzZTx2b2lkPn0gICAgICAgICAgICAgIFxyXG4gICAgICovXHJcbiAgICBhc3luYyByZWxvYWRQbHVnaW4ocGx1Z2luTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLnBsdWdpbi5hcHAucGx1Z2lucztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBwbHVnaW5zLmRpc2FibGVQbHVnaW4ocGx1Z2luTmFtZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbnMuZW5hYmxlUGx1Z2luKHBsdWdpbk5hbWUpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgY29uc29sZS5sb2coXCJyZWxvYWQgcGx1Z2luXCIsIGUpIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHVwZGF0ZXMgYSBiZXRhIHBsdWdpblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgcmVwb3NpdG9yeVBhdGggIHJlcG9zaXRvcnkgcGF0aCBvbiBHaXRIdWJcclxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgb25seUNoZWNrRG9udFVwZGF0ZSBvbmx5IGxvb2tzIGZvciB1cGRhdGVcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuICB7UHJvbWlzZTx2b2lkPn0gICAgICAgICAgICAgICAgICBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgdXBkYXRlUGx1Z2luKHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIG9ubHlDaGVja0RvbnRVcGRhdGUgPSBmYWxzZSwgcmVwb3J0SWZOb3RVcGR0ZWQgPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkUGx1Z2luKHJlcG9zaXRvcnlQYXRoLCB0cnVlLCBvbmx5Q2hlY2tEb250VXBkYXRlLCByZXBvcnRJZk5vdFVwZHRlZCk7XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UgJiYgb25seUNoZWNrRG9udFVwZGF0ZSA9PT0gZmFsc2UpXHJcbiAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgJHtyZXBvc2l0b3J5UGF0aH1cXG5VcGRhdGUgb2YgcGx1Z2luIGZhaWxlZC5gKVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB3YWxrcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHBsdWdpbnMgd2l0aG91dCBmcm96ZW4gdmVyc2lvbiBhbmQgcGVyZm9ybXMgYW4gdXBkYXRlXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtICAge2Jvb2xlYW59ICAgICAgICAgICBzaG93SW5mbyAgc2hvdWxkIHRoaXMgd2l0aCBhIHN0YXJ0ZWQvY29tcGxldGVkIG1lc3NhZ2UgLSB1c2VmdWwgd2hlbiByYW4gZnJvbSBDUFxyXG4gICAgICogQHJldHVybiAge1Byb21pc2U8dm9pZD59ICAgICAgICAgICAgICBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgY2hlY2tGb3JVcGRhdGVzQW5kSW5zdGFsbFVwZGF0ZXMoc2hvd0luZm8gPSBmYWxzZSwgb25seUNoZWNrRG9udFVwZGF0ZSA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYoYXdhaXQgaXNDb25uZWN0ZWRUb0ludGVybmV0KCk9PT1mYWxzZSkgeyBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJCUkFUOiBObyBpbnRlcm5ldCBkZXRlY3RlZC5cIikgXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG5ld05vdGljZTogTm90aWNlO1xyXG4gICAgICAgIGNvbnN0IG1zZzEgPSBgQ2hlY2tpbmcgZm9yIHBsdWdpbiB1cGRhdGVzIFNUQVJURURgO1xyXG4gICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2cxLCB0cnVlKTtcclxuICAgICAgICBpZiAoc2hvd0luZm8gJiYgdGhpcy5wbHVnaW4uc2V0dGluZ3Mubm90aWZpY2F0aW9uc0VuYWJsZWQpIG5ld05vdGljZSA9IG5ldyBOb3RpY2UoYEJSQVRcXG4ke21zZzF9YCwgMzAwMDApO1xyXG4gICAgICAgIGNvbnN0IHBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uTmFtZXMgPSBcclxuICAgICAgICAgICAgbmV3IFNldCh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbi5tYXAoZiA9PiBmLnJlcG8pKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGJwIG9mIHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkxpc3QpIHtcclxuICAgICAgICAgICAgaWYgKHBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uTmFtZXMuaGFzKGJwKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVQbHVnaW4oYnAsIG9ubHlDaGVja0RvbnRVcGRhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtc2cyID0gYENoZWNraW5nIGZvciBwbHVnaW4gdXBkYXRlcyBDT01QTEVURURgO1xyXG4gICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2cyLCB0cnVlKTtcclxuICAgICAgICBpZiAoc2hvd0luZm8pIHtcclxuICAgICAgICAgICAgbmV3Tm90aWNlLmhpZGUoKTtcclxuICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBtc2cyLCAxMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgYmV0YSBwbHVnaW4gZnJvbSB0aGUgbGlzdCBvZiBiZXRhIHBsdWdpbnMgKGRvZXMgbm90IGRlbGV0ZSB0aGVtIGZyb20gZGlzaylcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gICB7c3RyaW5nPHZvaWQ+fSAgIGJldGFQbHVnaW5JRCAgcmVwb3NpdG9yeSBwYXRoXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiAge1Byb21pc2U8dm9pZD59ICAgICAgICAgICAgICAgIFtyZXR1cm4gZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRlbGV0ZVBsdWdpbihyZXBvc2l0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgbXNnID0gYFJlbW92ZWQgJHtyZXBvc2l0b3J5UGF0aH0gZnJvbSBCUkFUIHBsdWdpbiBsaXN0YDtcclxuICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnLCB0cnVlKTtcclxuICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5MaXN0ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdC5maWx0ZXIoKGIpID0+IGIgIT0gcmVwb3NpdG9yeVBhdGgpO1xyXG4gICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uID0gXHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uLmZpbHRlcihcclxuICAgICAgICAgICAgICAgIChiKSA9PiBiLnJlcG8gIT0gcmVwb3NpdG9yeVBhdGhcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHBsdWdpbnMgdGhhdCBhcmUgY3VycmVudGx5IGVuYWJsZWQgb3IgY3VycmVudGx5IGRpc2FibGVkXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtICAge2Jvb2xlYW5bXX0gICAgICAgIGVuYWJsZWQgIHRydWUgZm9yIGVuYWJsZWQgcGx1Z2lucywgZmFsc2UgZm9yIGRpc2FibGVkIHBsdXRpbmdzXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiAge1BsdWdpbk1hbmlmZXN0W119ICAgICAgICAgICBtYW5pZmVzdHMgIG9mIHBsdWdpbnNcclxuICAgICAqL1xyXG4gICAgZ2V0RW5hYmxlZERpc2FibGVkUGx1Z2lucyhlbmFibGVkOiBib29sZWFuKTogUGx1Z2luTWFuaWZlc3RbXSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGNvbnN0IHBsID0gdGhpcy5wbHVnaW4uYXBwLnBsdWdpbnM7XHJcbiAgICAgICAgY29uc3QgbWFuaWZlc3RzOiBQbHVnaW5NYW5pZmVzdFtdID0gT2JqZWN0LnZhbHVlcyhwbC5tYW5pZmVzdHMpO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBjb25zdCBlbmFibGVkUGx1Z2luczogUGx1Z2luTWFuaWZlc3RbXSA9IE9iamVjdC52YWx1ZXMocGwucGx1Z2lucykubWFwKHAgPT4gcC5tYW5pZmVzdCk7XHJcbiAgICAgICAgcmV0dXJuIGVuYWJsZWQgP1xyXG4gICAgICAgICAgICBtYW5pZmVzdHMuZmlsdGVyKG1hbmlmZXN0ID0+IGVuYWJsZWRQbHVnaW5zLmZpbmQocGx1Z2luTmFtZSA9PiBtYW5pZmVzdC5pZCA9PT0gcGx1Z2luTmFtZS5pZCkpIDpcclxuICAgICAgICAgICAgbWFuaWZlc3RzLmZpbHRlcihtYW5pZmVzdCA9PiAhZW5hYmxlZFBsdWdpbnMuZmluZChwbHVnaW5OYW1lID0+IG1hbmlmZXN0LmlkID09PSBwbHVnaW5OYW1lLmlkKSk7XHJcbiAgICB9XHJcbn0iLCAiaW1wb3J0IHsgYWRkSWNvbiB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRJY29ucygpOiB2b2lkIHtcclxuICAgIGFkZEljb24oXHJcbiAgICAgICAgXCJCcmF0SWNvblwiLFxyXG4gICAgICAgIGA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgIGQ9XCJNIDQxLjY2Nzk2OSA0MS42Njc5NjkgQyA0MS42Njc5NjkgMzkuMzY3MTg4IDM5LjgwMDc4MSAzNy41IDM3LjUgMzcuNSBDIDM1LjE5OTIxOSAzNy41IDMzLjMzMjAzMSAzOS4zNjcxODggMzMuMzMyMDMxIDQxLjY2Nzk2OSBDIDMzLjMzMjAzMSA0My45Njg3NSAzNS4xOTkyMTkgNDUuODMyMDMxIDM3LjUgNDUuODMyMDMxIEMgMzkuODAwNzgxIDQ1LjgzMjAzMSA0MS42Njc5NjkgNDMuOTY4NzUgNDEuNjY3OTY5IDQxLjY2Nzk2OSBaIE0gNjAuNDE3OTY5IDU4LjU4MjAzMSBDIDU5LjQ2MDkzOCA1OC4wMjM0MzggNTguMzIwMzEyIDU3Ljg2NzE4OCA1Ny4yNSA1OC4xNDg0MzggQyA1Ni4xNzk2ODggNTguNDI5Njg4IDU1LjI2NTYyNSA1OS4xMjUgNTQuNzA3MDMxIDYwLjA4MjAzMSBDIDUzLjc0NjA5NCA2MS43NzczNDQgNTEuOTQ5MjE5IDYyLjgyMDMxMiA1MCA2Mi44MjAzMTIgQyA0OC4wNTA3ODEgNjIuODIwMzEyIDQ2LjI1MzkwNiA2MS43NzczNDQgNDUuMjkyOTY5IDYwLjA4MjAzMSBDIDQ0LjczNDM3NSA1OS4xMjUgNDMuODIwMzEyIDU4LjQyOTY4OCA0Mi43NSA1OC4xNDg0MzggQyA0MS42Nzk2ODggNTcuODY3MTg4IDQwLjUzOTA2MiA1OC4wMjM0MzggMzkuNTgyMDMxIDU4LjU4MjAzMSBDIDM3LjU5NzY1NiA1OS43MjY1NjIgMzYuOTEwMTU2IDYyLjI1NzgxMiAzOC4wNDI5NjkgNjQuMjUgQyA0MC41IDY4LjUzMTI1IDQ1LjA2MjUgNzEuMTcxODc1IDUwIDcxLjE3MTg3NSBDIDU0LjkzNzUgNzEuMTcxODc1IDU5LjUgNjguNTMxMjUgNjEuOTU3MDMxIDY0LjI1IEMgNjMuMDg5ODQ0IDYyLjI1NzgxMiA2Mi40MDIzNDQgNTkuNzI2NTYyIDYwLjQxNzk2OSA1OC41ODIwMzEgWiBNIDYyLjUgMzcuNSBDIDYwLjE5OTIxOSAzNy41IDU4LjMzMjAzMSAzOS4zNjcxODggNTguMzMyMDMxIDQxLjY2Nzk2OSBDIDU4LjMzMjAzMSA0My45Njg3NSA2MC4xOTkyMTkgNDUuODMyMDMxIDYyLjUgNDUuODMyMDMxIEMgNjQuODAwNzgxIDQ1LjgzMjAzMSA2Ni42Njc5NjkgNDMuOTY4NzUgNjYuNjY3OTY5IDQxLjY2Nzk2OSBDIDY2LjY2Nzk2OSAzOS4zNjcxODggNjQuODAwNzgxIDM3LjUgNjIuNSAzNy41IFogTSA1MCA4LjMzMjAzMSBDIDI2Ljk4ODI4MSA4LjMzMjAzMSA4LjMzMjAzMSAyNi45ODgyODEgOC4zMzIwMzEgNTAgQyA4LjMzMjAzMSA3My4wMTE3MTkgMjYuOTg4MjgxIDkxLjY2Nzk2OSA1MCA5MS42Njc5NjkgQyA3My4wMTE3MTkgOTEuNjY3OTY5IDkxLjY2Nzk2OSA3My4wMTE3MTkgOTEuNjY3OTY5IDUwIEMgOTEuNjY3OTY5IDI2Ljk4ODI4MSA3My4wMTE3MTkgOC4zMzIwMzEgNTAgOC4zMzIwMzEgWiBNIDUwIDgzLjMzMjAzMSBDIDMzLjk4ODI4MSA4My40MDIzNDQgMjAuMTkxNDA2IDcyLjA3ODEyNSAxNy4xMzY3MTkgNTYuMzYzMjgxIEMgMTQuMDc4MTI1IDQwLjY0NDUzMSAyMi42Mjg5MDYgMjQuOTc2NTYyIDM3LjUgMTkuMDQyOTY5IEMgMzcuNDU3MDMxIDE5LjYzNjcxOSAzNy40NTcwMzEgMjAuMjM4MjgxIDM3LjUgMjAuODMyMDMxIEMgMzcuNSAyNy43MzgyODEgNDMuMDk3NjU2IDMzLjMzMjAzMSA1MCAzMy4zMzIwMzEgQyA1Mi4zMDA3ODEgMzMuMzMyMDMxIDU0LjE2Nzk2OSAzMS40Njg3NSA1NC4xNjc5NjkgMjkuMTY3OTY5IEMgNTQuMTY3OTY5IDI2Ljg2NzE4OCA1Mi4zMDA3ODEgMjUgNTAgMjUgQyA0Ny42OTkyMTkgMjUgNDUuODMyMDMxIDIzLjEzMjgxMiA0NS44MzIwMzEgMjAuODMyMDMxIEMgNDUuODMyMDMxIDE4LjUzMTI1IDQ3LjY5OTIxOSAxNi42Njc5NjkgNTAgMTYuNjY3OTY5IEMgNjguNDEwMTU2IDE2LjY2Nzk2OSA4My4zMzIwMzEgMzEuNTg5ODQ0IDgzLjMzMjAzMSA1MCBDIDgzLjMzMjAzMSA2OC40MTAxNTYgNjguNDEwMTU2IDgzLjMzMjAzMSA1MCA4My4zMzIwMzEgWiBNIDUwIDgzLjMzMjAzMSBcIiAvPmBcclxuICAgICk7XHJcbn0iLCAiaW1wb3J0IHsgbW9tZW50LCBURmlsZSwgUGxhdGZvcm0gfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZ2V0RGFpbHlOb3RlU2V0dGluZ3MgfSBmcm9tIFwib2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlXCI7XHJcbmltcG9ydCBUaGVQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuXHJcbi8qKlxyXG4gKiBMb2dzIGV2ZW50cyB0byBhIGxvZyBmaWxlXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICBwbHVnaW4gICAgICAgICAgICBQbHVnaW4gb2JqZWN0XHJcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICB0ZXh0VG9Mb2cgICAgICAgICB0ZXh0IHRvIGJlIHNhdmVkIHRvIGxvZyBmaWxlXHJcbiAqIEBwYXJhbSAgIHtbdHlwZV19ICAgICB2ZXJib3NlTG9nZ2luZ09uICBUcnVlIGlmIHNob3VsZCBvbmx5IGJlIGxvZ2dlZCBpZiB2ZXJib3NlIGxvZ2dpbmcgaXMgZW5hYmxlZFxyXG4gKlxyXG4gKiBAcmV0dXJuICB7dm9pZH0gICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbG9nZ2VyKHBsdWdpbjogVGhlUGx1Z2luLCB0ZXh0VG9Mb2c6IHN0cmluZywgdmVyYm9zZUxvZ2dpbmdPbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICBpZihwbHVnaW4uc2V0dGluZ3MuZGVidWdnaW5nTW9kZSkgY29uc29sZS5sb2coXCJCUkFUOiBcIiArIHRleHRUb0xvZyk7XHJcbiAgICBpZiAocGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdFbmFibGVkKSB7XHJcbiAgICAgICAgaWYgKHBsdWdpbi5zZXR0aW5ncy5sb2dnaW5nVmVyYm9zZUVuYWJsZWQgPT09IGZhbHNlICYmIHZlcmJvc2VMb2dnaW5nT24gPT09IHRydWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdQYXRoICsgXCIubWRcIjtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZU91dHB1dCA9IFwiW1tcIiArIG1vbWVudCgpLmZvcm1hdChnZXREYWlseU5vdGVTZXR0aW5ncygpLmZvcm1hdCkudG9TdHJpbmcoKSArIFwiXV0gXCIgK1xyXG4gICAgICAgICAgICAgICAgbW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIik7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hY2hpbmVOYW1lID0gUGxhdGZvcm0uaXNEZXNrdG9wID8gd2luZG93LnJlcXVpcmUoXCJvc1wiKS5ob3N0bmFtZSgpIDogXCJNT0JJTEVcIjtcclxuICAgICAgICAgICAgbGV0IG91dHB1dCA9IGRhdGVPdXRwdXQgKyBcIiBcIiArIG1hY2hpbmVOYW1lICsgXCIgXCIgKyB0ZXh0VG9Mb2cucmVwbGFjZShcIlxcblwiLFwiIFwiKSArIFwiXFxuXFxuXCI7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHBsdWdpbi5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMoZmlsZU5hbWUpID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgcGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyLnJlYWQoZmlsZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dCArIGZpbGVDb250ZW50cztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gcGx1Z2luLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZmlsZU5hbWUpIGFzIFRGaWxlO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5hcHAudmF1bHQubW9kaWZ5KGZpbGUsIG91dHB1dCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmNyZWF0ZShmaWxlTmFtZSwgb3V0cHV0KTtcclxuICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsICJpbXBvcnQgVGhlUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IEdlbmVyaWNGdXp6eVN1Z2dlc3RlciwgU3VnZ2VzdGVySXRlbSB9IGZyb20gXCIuL0dlbmVyaWNGdXp6eVN1Z2dlc3RlclwiO1xyXG5pbXBvcnQgeyBncmFiQ29tbW11bml0eVBsdWdpbkxpc3QsIGdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdCB9IGZyb20gXCIuLi9mZWF0dXJlcy9naXRodWJVdGlsc1wiO1xyXG5pbXBvcnQgeyB0aGVtZXNlQ2hlY2tBbmRVcGRhdGVzLCB0aGVtZXNJbnN0YWxsRnJvbUNvbW11bml0eUxpc3QgfSBmcm9tIFwiLi4vZmVhdHVyZXMvdGhlbWVzXCI7XHJcbmltcG9ydCBBZGROZXdUaGVtZSBmcm9tIFwiLi9BZGROZXdUaGVtZVwiO1xyXG5pbXBvcnQgeyBUb2FzdE1lc3NhZ2UgfSBmcm9tIFwiLi4vdXRpbHMvbm90aWZpY2F0aW9uc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luQ29tbWFuZHMge1xyXG4gICAgcGx1Z2luOiBUaGVQbHVnaW47XHJcbiAgICBicmF0Q29tbWFuZHMgPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULUFkZEJldGFQbHVnaW5cIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IEFkZCBhIGJldGEgcGx1Z2luIGZvciB0ZXN0aW5nXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGlzcGxheUFkZE5ld1BsdWdpbk1vZGFsKGZhbHNlLCBmYWxzZSkgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULUFkZEJldGFQbHVnaW5XaXRoRnJvemVuVmVyc2lvblwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiUGx1Z2luczogQWRkIGEgYmV0YSBwbHVnaW4gd2l0aCBmcm96ZW4gdmVyc2lvbiBiYXNlZCBvbiBhIHJlbGVhc2UgdGFnXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGlzcGxheUFkZE5ld1BsdWdpbk1vZGFsKGZhbHNlLCB0cnVlKSB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtY2hlY2tGb3JVcGRhdGVzQW5kVXBkYXRlXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJQbHVnaW5zOiBDaGVjayBmb3IgdXBkYXRlcyB0byBhbGwgYmV0YSBwbHVnaW5zIGFuZCBVUERBVEVcIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4geyBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5jaGVja0ZvclVwZGF0ZXNBbmRJbnN0YWxsVXBkYXRlcyh0cnVlLCBmYWxzZSkgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULWNoZWNrRm9yVXBkYXRlc0FuZERvbnRVcGRhdGVcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IE9ubHkgY2hlY2sgZm9yIHVwZGF0ZXMgdG8gYmV0YSBwbHVnaW5zLCBidXQgZG9uJ3QgVXBkYXRlXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuY2hlY2tGb3JVcGRhdGVzQW5kSW5zdGFsbFVwZGF0ZXModHJ1ZSwgdHJ1ZSkgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULXVwZGF0ZU9uZVBsdWdpblwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiUGx1Z2luczogQ2hvb3NlIGEgc2luZ2xlIHBsdWdpbiB2ZXJzaW9uIHRvIHVwZGF0ZVwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbk5hbWVzID0gXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IFNldCh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbi5tYXAoZiA9PiBmLnJlcG8pKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpbkxpc3Q6IFN1Z2dlc3Rlckl0ZW1bXSA9IFxyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkxpc3QpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGYpID0+ICFwbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbk5hbWVzLmhhcyhmKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgobSkgPT4geyByZXR1cm4geyBkaXNwbGF5OiBtLCBpbmZvOiBtIH0gfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHRoaXMucGx1Z2luKTtcclxuICAgICAgICAgICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKHBsdWdpbkxpc3QpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2ZzLmRpc3BsYXkoYXN5bmMgKHJlc3VsdHMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgQ2hlY2tpbmcgZm9yIHVwZGF0ZXMgZm9yICR7cmVzdWx0cy5pbmZvfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZyx0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGBcXG4ke21zZ31gLCAzKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy51cGRhdGVQbHVnaW4ocmVzdWx0cy5pbmZvLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULXJlc3RhcnRQbHVnaW5cIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IFJlc3RhcnQgYSBwbHVnaW4gdGhhdCBpcyBhbHJlYWR5IGluc3RhbGxlZFwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwbHVnaW5MaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKHRoaXMucGx1Z2luLmFwcC5wbHVnaW5zLm1hbmlmZXN0cykubWFwKChtKSA9PiB7IHJldHVybiB7IGRpc3BsYXk6IG0uaWQsIGluZm86IG0uaWQgfSB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdmcyA9IG5ldyBHZW5lcmljRnV6enlTdWdnZXN0ZXIodGhpcy5wbHVnaW4pO1xyXG4gICAgICAgICAgICAgICAgZ2ZzLnNldFN1Z2dlc3RlckRhdGEocGx1Z2luTGlzdCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYCR7cmVzdWx0cy5pbmZvfVxcblBsdWdpbiByZWxvYWRpbmcgLi4uLi5gLCA1KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5yZWxvYWRQbHVnaW4ocmVzdWx0cy5pbmZvKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtZGlzYWJsZVBsdWdpblwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiUGx1Z2luczogRGlzYWJsZSBhIHBsdWdpbiAtIHRvZ2dsZSBpdCBvZmZcIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luLmJldGFQbHVnaW5zLmdldEVuYWJsZWREaXNhYmxlZFBsdWdpbnModHJ1ZSkubWFwKG1hbmlmZXN0ID0+IHsgcmV0dXJuIHsgZGlzcGxheTogYCR7bWFuaWZlc3QubmFtZX0gKCR7bWFuaWZlc3QuaWR9KWAsIGluZm86IG1hbmlmZXN0LmlkIH0gfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHRoaXMucGx1Z2luKTtcclxuICAgICAgICAgICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKHBsdWdpbkxpc3QpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2ZzLmRpc3BsYXkoYXN5bmMgKHJlc3VsdHMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2coYCR7cmVzdWx0cy5kaXNwbGF5fSBwbHVnaW4gZGlzYWJsZWRgLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLmFwcC5wbHVnaW5zLmRpc2FibGVQbHVnaW4ocmVzdWx0cy5pbmZvKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtZW5hYmxlUGx1Z2luXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJQbHVnaW5zOiBFbmFibGUgYSBwbHVnaW4gLSB0b2dnbGUgaXQgb25cIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luLmJldGFQbHVnaW5zLmdldEVuYWJsZWREaXNhYmxlZFBsdWdpbnMoZmFsc2UpLm1hcChtYW5pZmVzdCA9PiB7IHJldHVybiB7IGRpc3BsYXk6IGAke21hbmlmZXN0Lm5hbWV9ICgke21hbmlmZXN0LmlkfSlgLCBpbmZvOiBtYW5pZmVzdC5pZCB9IH0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XHJcbiAgICAgICAgICAgICAgICBnZnMuc2V0U3VnZ2VzdGVyRGF0YShwbHVnaW5MaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKGAke3Jlc3VsdHMuZGlzcGxheX0gcGx1Z2luIGVuYWJsZWRgLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLmFwcC5wbHVnaW5zLmVuYWJsZVBsdWdpbihyZXN1bHRzLmluZm8pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWQ6IFwiQlJBVC1vcGVuR2l0SHViWlJlcG9zaXRvcnlcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IE9wZW4gdGhlIEdpdEh1YiByZXBvc2l0b3J5IGZvciBhIHBsdWdpblwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tdW5pdHlQbHVnaW5zID0gYXdhaXQgZ3JhYkNvbW1tdW5pdHlQbHVnaW5MaXN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tdW5pdHlQbHVnaW5MaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKGNvbW11bml0eVBsdWdpbnMpLm1hcCgocCkgPT4geyByZXR1cm4geyBkaXNwbGF5OiBgUGx1Z2luOiAke3AubmFtZX0gICgke3AucmVwb30pYCwgaW5mbzogcC5yZXBvIH0gfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBicmF0TGlzdDogU3VnZ2VzdGVySXRlbVtdID0gT2JqZWN0LnZhbHVlcyh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5MaXN0KS5tYXAoKHApID0+IHsgcmV0dXJuIHsgZGlzcGxheTogXCJCUkFUOiBcIiArIHAsIGluZm86IHAgfSB9KTtcclxuICAgICAgICAgICAgICAgIGNvbW11bml0eVBsdWdpbkxpc3QuZm9yRWFjaChzaSA9PiBicmF0TGlzdC5wdXNoKHNpKSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHRoaXMucGx1Z2luKTtcclxuICAgICAgICAgICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKGJyYXRMaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMuaW5mbykgd2luZG93Lm9wZW4oYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3Jlc3VsdHMuaW5mb31gKVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWQ6IFwiQlJBVC1vcGVuR2l0SHViUmVwb1RoZW1lXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJUaGVtZXM6IE9wZW4gdGhlIEdpdEh1YiByZXBvc2l0b3J5IGZvciBhIHRoZW1lIChhcHBlYXJhbmNlKVwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tdW5pdHlUaGVtZSA9IGF3YWl0IGdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbXVuaXR5VGhlbWVMaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKGNvbW11bml0eVRoZW1lKS5tYXAoKHApID0+IHsgcmV0dXJuIHsgZGlzcGxheTogYFRoZW1lOiAke3AubmFtZX0gICgke3AucmVwb30pYCwgaW5mbzogcC5yZXBvIH0gfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHRoaXMucGx1Z2luKTtcclxuICAgICAgICAgICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKGNvbW11bml0eVRoZW1lTGlzdCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLmluZm8pIHdpbmRvdy5vcGVuKGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXN1bHRzLmluZm99YClcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtb3BlbnRQbHVnaW5TZXR0aW5nc1wiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiUGx1Z2luczogT3BlbiBQbHVnaW4gU2V0dGluZ3MgVGFiXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5wbHVnaW4uYXBwLnNldHRpbmc7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0T2ZQbHVnaW5TZXR0aW5nc1RhYnM6IFN1Z2dlc3Rlckl0ZW1bXSA9IE9iamVjdC52YWx1ZXMoc2V0dGluZ3MucGx1Z2luVGFicykubWFwKCh0KSA9PiB7IHJldHVybiB7IGRpc3BsYXk6IFwiUGx1Z2luOiBcIiArIHQubmFtZSwgaW5mbzogdC5pZCB9IH0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0T2ZDb3JlU2V0dGluZ3NUYWJzOiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKHNldHRpbmdzLnNldHRpbmdUYWJzKS5tYXAoKHQpID0+IHsgcmV0dXJuIHsgZGlzcGxheTogXCJDb3JlOiBcIiArIHQubmFtZSwgaW5mbzogdC5pZCB9IH0pO1xyXG4gICAgICAgICAgICAgICAgbGlzdE9mUGx1Z2luU2V0dGluZ3NUYWJzLmZvckVhY2goc2kgPT4gbGlzdE9mQ29yZVNldHRpbmdzVGFicy5wdXNoKHNpKSk7XHJcbiAgICAgICAgICAgICAgICBnZnMuc2V0U3VnZ2VzdGVyRGF0YShsaXN0T2ZDb3JlU2V0dGluZ3NUYWJzKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm9wZW5UYWJCeUlkKHJlc3VsdHMuaW5mbyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULUdyYWJDb21tdW5pdHlUaGVtZVwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiVGhlbWVzOiBHcmFiIGEgY29tbXVuaXR5IHRoZW1lXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHRoZW1lc0luc3RhbGxGcm9tQ29tbXVuaXR5TGlzdCh0aGlzLnBsdWdpbilcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWQ6IFwiQlJBVC1HcmFiQmV0YVRoZW1lXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJUaGVtZXM6IEdyYWIgYSBiZXRhIHRoZW1lIGZvciB0ZXN0aW5nIGZyb20gYSBHaXRodWIgcmVwb3NpdG9yeVwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7IChuZXcgQWRkTmV3VGhlbWUodGhpcy5wbHVnaW4pKS5vcGVuKCkgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULXVwZGF0ZUJldGFUaGVtZXNcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlRoZW1lczogVXBkYXRlIGJldGEgdGhlbWVzXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHRoZW1lc2VDaGVja0FuZFVwZGF0ZXModGhpcy5wbHVnaW4sIHRydWUpIFxyXG4gICAgICAgIH0sICAgICAgICBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtc3dpdGNoVGhlbWVcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlRoZW1lczogU3dpdGNoIEFjdGl2ZSBUaGVtZSBcIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbXVuaXR5VGhlbWVMaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKHRoaXMucGx1Z2luLmFwcC5jdXN0b21Dc3MudGhlbWVzKS5tYXAoKHQpID0+IHsgcmV0dXJuIHsgZGlzcGxheTogdCwgaW5mbzogdCB9IH0pO1xyXG4gICAgICAgICAgICAgICAgY29tbXVuaXR5VGhlbWVMaXN0LnVuc2hpZnQoeyBkaXNwbGF5OiBcIk9ic2lkaWFuIERlZmF1bHQgVGhlbWVcIiwgaW5mbzogXCJcIiB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdmcyA9IG5ldyBHZW5lcmljRnV6enlTdWdnZXN0ZXIodGhpcy5wbHVnaW4pO1xyXG4gICAgICAgICAgICAgICAgZ2ZzLnNldFN1Z2dlc3RlckRhdGEoY29tbXVuaXR5VGhlbWVMaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKGBTd2l0Y2hlZCB0byB0aGVtZSAke3Jlc3VsdHMuZGlzcGxheX1gLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmFwcC5jdXN0b21Dc3Muc2V0VGhlbWUocmVzdWx0cy5pbmZvKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtYWxsQ29tbWFuZHNcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIkFsbCBDb21tYW5kcyBsaXN0XCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB0aGlzLnJpYmJvbkRpc3BsYXlDb21tYW5kcygpXHJcbiAgICAgICAgfSxcclxuICAgIF1cclxuXHJcbiAgICBhc3luYyByaWJib25EaXNwbGF5Q29tbWFuZHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgYnJhdENvbW1hbmRMaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBbXTtcclxuICAgICAgICB0aGlzLmJyYXRDb21tYW5kcy5mb3JFYWNoKGNtZCA9PiB7IGlmIChjbWQuc2hvd0luUmliYm9uKSBicmF0Q29tbWFuZExpc3QucHVzaCh7IGRpc3BsYXk6IGNtZC5uYW1lLCBpbmZvOiBjbWQuY2FsbGJhY2sgfSkgfSk7XHJcbiAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5wbHVnaW4uYXBwLnNldHRpbmc7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGNvbnN0IGxpc3RPZkNvcmVTZXR0aW5nc1RhYnM6IFN1Z2dlc3Rlckl0ZW1bXSA9IE9iamVjdC52YWx1ZXMoc2V0dGluZ3Muc2V0dGluZ1RhYnMpLm1hcCgodDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBcIkNvcmU6IFwiICsgdC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgaW5mbzogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm9wZW4oKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5vcGVuVGFiQnlJZCh0LmlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBjb25zdCBsaXN0T2ZQbHVnaW5TZXR0aW5nc1RhYnM6IFN1Z2dlc3Rlckl0ZW1bXSA9IE9iamVjdC52YWx1ZXMoc2V0dGluZ3MucGx1Z2luVGFicykubWFwKCh0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiUGx1Z2luOiBcIiArIHQubmFtZSxcclxuICAgICAgICAgICAgICAgIGluZm86IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub3BlblRhYkJ5SWQodC5pZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYnJhdENvbW1hbmRMaXN0LnB1c2goeyBkaXNwbGF5OiBcIi0tLS0gQ29yZSBQbHVnaW4gU2V0dGluZ3MgLS0tLVwiLCBpbmZvOiBhc3luYyAoKSA9PiB7IGF3YWl0IHRoaXMucmliYm9uRGlzcGxheUNvbW1hbmRzKCkgfSB9KVxyXG4gICAgICAgIGxpc3RPZkNvcmVTZXR0aW5nc1RhYnMuZm9yRWFjaChzaSA9PiBicmF0Q29tbWFuZExpc3QucHVzaChzaSkpO1xyXG4gICAgICAgIGJyYXRDb21tYW5kTGlzdC5wdXNoKHsgZGlzcGxheTogXCItLS0tIFBsdWdpbiBTZXR0aW5ncyAtLS0tXCIsIGluZm86IGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5yaWJib25EaXNwbGF5Q29tbWFuZHMoKSB9IH0pXHJcbiAgICAgICAgbGlzdE9mUGx1Z2luU2V0dGluZ3NUYWJzLmZvckVhY2goc2kgPT4gYnJhdENvbW1hbmRMaXN0LnB1c2goc2kpKTtcclxuXHJcbiAgICAgICAgZ2ZzLnNldFN1Z2dlc3RlckRhdGEoYnJhdENvbW1hbmRMaXN0KTtcclxuICAgICAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4gYXdhaXQgcmVzdWx0cy5pbmZvKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbjogVGhlUGx1Z2luKSB7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblxyXG4gICAgICAgIHRoaXMuYnJhdENvbW1hbmRzLmZvckVhY2goYXN5bmMgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uYWRkQ29tbWFuZCh7XHJcbiAgICAgICAgICAgICAgICBpZDogaXRlbS5pZCxcclxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcclxuICAgICAgICAgICAgICAgIGljb246IGl0ZW0uaWNvbixcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7IGF3YWl0IGl0ZW0uY2FsbGJhY2soKSB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4iXSwKICAibWFwcGluZ3MiOiAicTBCQUFBLDJCQUVBLE9BQU8sZUFBZSxFQUFTLGFBQWMsQ0FBRSxNQUFPLEVBQUssQ0FBQyxFQUU1RCxHQUFJLEdBQVcsUUFBUSxZQUVqQixHQUE0QixhQUM1QixHQUE2QixhQUM3QixHQUE4QixV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
diff --git a/.obsidian/plugins/obsidian42-brat/manifest.json b/.obsidian/plugins/obsidian42-brat/manifest.json
index 35516cd9..b0070919 100644
--- a/.obsidian/plugins/obsidian42-brat/manifest.json
+++ b/.obsidian/plugins/obsidian42-brat/manifest.json
@@ -1,7 +1,7 @@
{
"id": "obsidian42-brat",
"name": "Obsidian42 - BRAT",
- "version": "0.6.33",
+ "version": "0.6.34",
"minAppVersion": "0.13.21",
"description": "Easily install a beta version of a plugin for testing.",
"author": "TfTHacker",
diff --git a/.obsidian/workspace b/.obsidian/workspace
index 73c15f1d..4fe339e8 100644
--- a/.obsidian/workspace
+++ b/.obsidian/workspace
@@ -4,7 +4,7 @@
"type": "split",
"children": [
{
- "id": "f296e98f595bb35a",
+ "id": "8be92ac6d74448d7",
"type": "leaf",
"state": {
"type": "markdown",
@@ -151,17 +151,17 @@
],
"currentTab": 2
},
- "active": "f296e98f595bb35a",
+ "active": "8be92ac6d74448d7",
"lastOpenFiles": [
"01.02 Home/@Main Dashboard.md",
- "03.03 Food & Wine/Thai Basil Sauce Noodles with Jammy Eggs.md",
- "03.03 Food & Wine/Udon in Buttery Tomato n Soy broth.md",
+ "00.01 Admin/Calendars/2022-04-19.md",
"00.01 Admin/Calendars/2022-04-18.md",
- "00.01 Admin/Calendars/2022-04-16.md",
- "05.02 Networks/Configuring Fail2ban.md",
- "00.01 Admin/Obsidian plugins.md",
- "00.01 Admin/Test sheet.md",
- "00.01 Admin/Calendars/2022-04-17.md",
- "03.03 Food & Wine/@Main dishes.md"
+ "00.03 News/What i learnt during my 3 days offline.md",
+ "03.03 Food & Wine/Fresh Tomato Eggs in Purgatory with Chickpeas.md",
+ "00.03 News/Lovemaking for longevity a recipe from Tokyo’s imperial archives Aeon Essays.md",
+ "00.03 News/The Bullet and the Ballplayer.md",
+ "00.03 News/The 1918 flu didn’t end in 1918. Here’s what its third year can teach us..md",
+ "03.03 Food & Wine/Thai Basil Sauce Noodles with Jammy Eggs.md",
+ "03.03 Food & Wine/Udon in Buttery Tomato n Soy broth.md"
]
}
\ No newline at end of file
diff --git a/00.01 Admin/Calendars/2022-04-18.md b/00.01 Admin/Calendars/2022-04-18.md
index f0affb4f..10cf0ee0 100644
--- a/00.01 Admin/Calendars/2022-04-18.md
+++ b/00.01 Admin/Calendars/2022-04-18.md
@@ -13,9 +13,9 @@ Stress: 40
FrontHeadBar: 5
EarHeadBar: 45
BackHeadBar: 35
-Water: 0.525
-Coffee: 3
-Steps:
+Water: 2.325
+Coffee: 4
+Steps: 12248
Ski:
Riding:
Racket:
@@ -90,6 +90,9 @@ This section does serve for quick memos.
%% ### %%
- [ ] 12:49 [[2022-04-18|Memo]], [[@Lifestyle]]: check the Tennis Club at the top of the mountain 📆2022-04-23
+- [ ] 14:12 [[2022-04-18|Memo]], [[@Lifestyle]]: Find a cleaner 📆2022-04-24
+- [ ] 14:30 [[2022-04-18|Memo]], [[Selfhosting]], [[Server Alias]], [[Configuring Fail2ban]]: check (imported) nginx filters 📆2022-04-23
+- [ ] 17:54 [[2022-04-18|Memo]], [[@Lifestyle]]: Look up the afrench sailing circle 📆2022-04-25
---
diff --git a/00.01 Admin/Calendars/2022-04-19.md b/00.01 Admin/Calendars/2022-04-19.md
new file mode 100644
index 00000000..54758734
--- /dev/null
+++ b/00.01 Admin/Calendars/2022-04-19.md
@@ -0,0 +1,104 @@
+---
+
+Date: 2022-04-19
+DocType: Note
+Hierarchy:
+TimeStamp:
+location:
+CollapseMetaTable: Yes
+Sleep: 7
+Happiness: 90
+Gratefulness: 90
+Stress: 35
+FrontHeadBar: 5
+EarHeadBar: 40
+BackHeadBar: 35
+Water: 2.18
+Coffee: 5
+Steps:
+Ski:
+Riding:
+Racket:
+Football:
+title: "Daily Note"
+allDay: true
+date: 2022-04-19
+
+---
+
+%% Parent:: [[@Life Admin]] %%
+
+---
+
+[[2022-04-18|<< 🗓 Previous ]] [[@Main Dashboard|Back]] [[2022-04-20|🗓 Next >>]]
+
+---
+
+
+
+```button
+name Record today's health
+type command
+action MetaEdit: Run MetaEdit
+id EditMetaData
+```
+^button-2022-04-19Edit
+
+```button
+name Save
+type command
+action Save current file
+id Save
+```
+^button-2022-04-19NSave
+
+
+
+# 2022-04-19
+
+
+
+```ad-abstract
+title: Summary
+collapse: open
+Note Description
+```
+
+
+
+```toc
+style: number
+```
+
+
+
+---
+
+
+
+### Memos
+
+
+
+#### Memos
+
+This section does serve for quick memos.
+
+
+
+
+%% ### %%
+
+
+---
+
+
+
+### Notes
+
+
+
+Loret ipsum
+
+
+
\ No newline at end of file
diff --git a/00.03 News/Lovemaking for longevity a recipe from Tokyo’s imperial archives Aeon Essays.md b/00.03 News/Lovemaking for longevity a recipe from Tokyo’s imperial archives Aeon Essays.md
index 7553660e..dbd3d540 100644
--- a/00.03 News/Lovemaking for longevity a recipe from Tokyo’s imperial archives Aeon Essays.md
+++ b/00.03 News/Lovemaking for longevity a recipe from Tokyo’s imperial archives Aeon Essays.md
@@ -13,7 +13,7 @@ CollapseMetaTable: Yes
---
Parent:: [[@News|News]]
-Read:: No
+Read:: [[2022-04-18]]
---
diff --git a/00.03 News/The 1918 flu didn’t end in 1918. Here’s what its third year can teach us..md b/00.03 News/The 1918 flu didn’t end in 1918. Here’s what its third year can teach us..md
index ede6b966..3355b02c 100644
--- a/00.03 News/The 1918 flu didn’t end in 1918. Here’s what its third year can teach us..md
+++ b/00.03 News/The 1918 flu didn’t end in 1918. Here’s what its third year can teach us..md
@@ -13,7 +13,7 @@ CollapseMetaTable: Yes
---
Parent:: [[@News|News]]
-Read:: No
+Read:: [[2022-04-18]]
---
diff --git a/00.03 News/The Bullet and the Ballplayer.md b/00.03 News/The Bullet and the Ballplayer.md
index 364f5427..4db16900 100644
--- a/00.03 News/The Bullet and the Ballplayer.md
+++ b/00.03 News/The Bullet and the Ballplayer.md
@@ -14,7 +14,7 @@ CollapseMetaTable: Yes
---
Parent:: [[@News|News]]
-Read:: No
+Read:: [[2022-04-18]]
---
diff --git a/00.03 News/What i learnt during my 3 days offline.md b/00.03 News/What i learnt during my 3 days offline.md
index 7dc97a7b..b8c31038 100644
--- a/00.03 News/What i learnt during my 3 days offline.md
+++ b/00.03 News/What i learnt during my 3 days offline.md
@@ -15,7 +15,7 @@ CollapseMetaTable: "Yes"
---
Parent:: [[@News|News]]
-Read:: No
+Read:: [[2022-04-18]]
---
diff --git a/01.02 Home/@Main Dashboard.md b/01.02 Home/@Main Dashboard.md
index 2454219b..9b25cf32 100644
--- a/01.02 Home/@Main Dashboard.md
+++ b/01.02 Home/@Main Dashboard.md
@@ -192,16 +192,16 @@ limit 6
``` tracker
searchType: frontmatter
-searchTarget: Happiness, Gratefulness, Ski, Riding, Racket, Football
+searchTarget: Happiness, Steps, Ski, Riding, Racket, Football
folder: /00.01 Admin/Calendars
month:
mode: annotation
startWeekOn: 'Mon'
- threshold: 75, 75, 0, 0, 0, 0
+ threshold: 75, 10000, 0, 0, 0, 0
color: green
headerMonthColor: orange
dimNotInMonth: false
- annotation: ☀️,🥳,⛷,🏇,🎾,⚽
+ annotation: ☀️,🏃,⛷,🏇,🎾,⚽
showAnnotationOfAllTargets: true
```
diff --git a/01.02 Home/Household.md b/01.02 Home/Household.md
index a51af7e4..20c32cd9 100644
--- a/01.02 Home/Household.md
+++ b/01.02 Home/Household.md
@@ -78,7 +78,8 @@ This section on different household obligations.
- [x] [[Household]]: *Paper* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-02-15 ✅ 2022-02-14
- [x] [[Household]]: *Paper* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-02-01 ✅ 2022-01-31
- [x] [[Household]]: *Paper* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-01-18 ✅ 2022-01-17
-- [ ] [[Household]]: *Cardboard* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-04-19
+- [ ] [[Household]]: *Cardboard* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-05-03
+- [x] [[Household]]: *Cardboard* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-04-19 ✅ 2022-04-18
- [x] [[Household]]: *Cardboard* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-04-05 ✅ 2022-04-05
- [x] [[Household]]: *Cardboard* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-03-22 ✅ 2022-03-21
- [x] [[Household]]: *Cardboard* recycling collection 🔁 every 2 weeks on Tuesday 📅 2022-03-08 ✅ 2022-03-07
diff --git a/03.03 Food & Wine/Fresh Tomato Eggs in Purgatory with Chickpeas.md b/03.03 Food & Wine/Fresh Tomato Eggs in Purgatory with Chickpeas.md
index 9e282294..b630ca1d 100644
--- a/03.03 Food & Wine/Fresh Tomato Eggs in Purgatory with Chickpeas.md
+++ b/03.03 Food & Wine/Fresh Tomato Eggs in Purgatory with Chickpeas.md
@@ -2,7 +2,7 @@
ServingSize: 2
Alias: []
-Tag: ["NotYetTested", "Breakfast", "Healthy", "Vegetarian"]
+Tag: ["Breakfast", "Healthy", "Vegetarian"]
Date: 2022-03-13
DocType: "Recipe"
Hierarchy: "NonRoot"
@@ -10,7 +10,7 @@ location:
CollapseMetaTable: Yes
Meta:
IsFavourite: False
- Rating:
+ Rating: 3
Recipe:
Courses: "Main dish"
Categories: "Egg"