diff --git a/.gitignore b/.gitignore index 8b913d9..13e312c 100644 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,4 @@ skills-lock.json changes.diff # Exclude aider files -.aider* +.aider* \ No newline at end of file diff --git a/main.js b/main.js deleted file mode 100644 index 2b16754..0000000 --- a/main.js +++ /dev/null @@ -1,1579 +0,0 @@ -/* -THIS IS A GENERATED/BUNDLED FILE BY ESBUILD -if you want to view the source, please visit the github repository of this plugin -*/ - -"use strict"; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// src/main.ts -var main_exports = {}; -__export(main_exports, { - default: () => PopcornMD -}); -module.exports = __toCommonJS(main_exports); -var import_obsidian14 = require("obsidian"); - -// src/settings/settings.ts -var import_obsidian9 = require("obsidian"); - -// src/settings/suggester/FileSuggest.ts -var import_obsidian = require("obsidian"); -var FileSuggest = class extends import_obsidian.AbstractInputSuggest { - constructor(app, inputEl) { - super(app, inputEl); - this.inputEl = inputEl; - } - getSuggestions(inputStr) { - const files = this.app.vault.getFiles(); - const lowerInput = inputStr.toLowerCase(); - return files.filter( - (file) => file.extension === "md" && file.path.toLocaleLowerCase().includes(lowerInput) - ); - } - renderSuggestion(item, el) { - el.setText(item.path); - } - selectSuggestion(item) { - this.inputEl.value = item.path; - this.inputEl.trigger("input"); - } -}; - -// src/settings/components/TemplateFileSetting.ts -var import_obsidian2 = require("obsidian"); -function createTemplateFileSetting(containerEl, plugin) { - const templateFileDesc = activeDocument.createDocumentFragment(); - templateFileDesc.createDiv({ text: "Files will be available as templates." }); - templateFileDesc.createEl("p", { - text: "You can use variables like {{title}} and {{year}} in the template." - }); - new import_obsidian2.Setting(containerEl).setName("Template file").setDesc(templateFileDesc).addSearch((cb) => { - try { - new FileSuggest(plugin.app, cb.inputEl); - } catch { - } - ; - cb.setPlaceholder("Example: templates/template-file").setValue(plugin.settings.templateFile).onChange(async (newTemplateFile) => { - plugin.settings.templateFile = newTemplateFile; - await plugin.saveSettings(); - }); - cb.inputEl.addClass("popcorn-md-input"); - }); -} - -// src/settings/components/APIKeySetting.ts -var import_obsidian3 = require("obsidian"); -function createAPIKeySetting(containerEl, plugin) { - const APIKeyDesc = activeDocument.createDocumentFragment(); - APIKeyDesc.createEl("span"); - APIKeyDesc.appendText("Your TMDb API Key. "); - APIKeyDesc.createEl("a", { - text: "You can get one here", - href: "https://www.themoviedb.org/settings/api" - }); - new import_obsidian3.Setting(containerEl).setName("TMDb API Key").setDesc(APIKeyDesc).addText((text) => { - text.setPlaceholder("Enter your key").setValue(plugin.settings.APIKey).onChange(async (value) => { - plugin.settings.APIKey = value; - await plugin.saveSettings(); - }); - text.inputEl.addClass("popcorn-md-input"); - }); -} - -// src/settings/components/LangugeSetting.ts -var import_obsidian5 = require("obsidian"); - -// src/settings/suggester/LanguageSuggest.ts -var import_obsidian4 = require("obsidian"); - -// src/settings/language/Languages.json -var Languages_default = [ - { - iso_639_1: "kw", - english_name: "Cornish", - name: "" - }, - { - iso_639_1: "ff", - english_name: "Fulah", - name: "Fulfulde" - }, - { - iso_639_1: "gn", - english_name: "Guarani", - name: "" - }, - { - iso_639_1: "id", - english_name: "Indonesian", - name: "Bahasa indonesia" - }, - { - iso_639_1: "lu", - english_name: "Luba-Katanga", - name: "" - }, - { - iso_639_1: "nr", - english_name: "Ndebele", - name: "" - }, - { - iso_639_1: "os", - english_name: "Ossetian; Ossetic", - name: "" - }, - { - iso_639_1: "ru", - english_name: "Russian", - name: "P\u0443\u0441\u0441\u043A\u0438\u0439" - }, - { - iso_639_1: "se", - english_name: "Northern Sami", - name: "" - }, - { - iso_639_1: "so", - english_name: "Somali", - name: "Somali" - }, - { - iso_639_1: "es", - english_name: "Spanish", - name: "Espa\xF1ol" - }, - { - iso_639_1: "sv", - english_name: "Swedish", - name: "svenska" - }, - { - iso_639_1: "ta", - english_name: "Tamil", - name: "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD" - }, - { - iso_639_1: "te", - english_name: "Telugu", - name: "\u0C24\u0C46\u0C32\u0C41\u0C17\u0C41" - }, - { - iso_639_1: "tn", - english_name: "Tswana", - name: "" - }, - { - iso_639_1: "uk", - english_name: "Ukrainian", - name: "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0438\u0439" - }, - { - iso_639_1: "uz", - english_name: "Uzbek", - name: "ozbek" - }, - { - iso_639_1: "el", - english_name: "Greek", - name: "\u03B5\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC" - }, - { - iso_639_1: "co", - english_name: "Corsican", - name: "" - }, - { - iso_639_1: "dv", - english_name: "Divehi", - name: "" - }, - { - iso_639_1: "kk", - english_name: "Kazakh", - name: "\u049B\u0430\u0437\u0430\u049B" - }, - { - iso_639_1: "ki", - english_name: "Kikuyu", - name: "" - }, - { - iso_639_1: "or", - english_name: "Oriya", - name: "" - }, - { - iso_639_1: "si", - english_name: "Sinhalese", - name: "\u0DC3\u0DD2\u0D82\u0DC4\u0DBD" - }, - { - iso_639_1: "st", - english_name: "Sotho", - name: "" - }, - { - iso_639_1: "sr", - english_name: "Serbian", - name: "Srpski" - }, - { - iso_639_1: "ss", - english_name: "Swati", - name: "" - }, - { - iso_639_1: "tr", - english_name: "Turkish", - name: "T\xFCrk\xE7e" - }, - { - iso_639_1: "wa", - english_name: "Walloon", - name: "" - }, - { - iso_639_1: "cn", - english_name: "Cantonese", - name: "\u5E7F\u5DDE\u8BDD / \u5EE3\u5DDE\u8A71" - }, - { - iso_639_1: "bi", - english_name: "Bislama", - name: "Bislama" - }, - { - iso_639_1: "cr", - english_name: "Cree", - name: "" - }, - { - iso_639_1: "cy", - english_name: "Welsh", - name: "Cymraeg" - }, - { - iso_639_1: "eu", - english_name: "Basque", - name: "euskera" - }, - { - iso_639_1: "hz", - english_name: "Herero", - name: "" - }, - { - iso_639_1: "ho", - english_name: "Hiri Motu", - name: "" - }, - { - iso_639_1: "ka", - english_name: "Georgian", - name: "\u10E5\u10D0\u10E0\u10D7\u10E3\u10DA\u10D8" - }, - { - iso_639_1: "kr", - english_name: "Kanuri", - name: "" - }, - { - iso_639_1: "km", - english_name: "Khmer", - name: "" - }, - { - iso_639_1: "kj", - english_name: "Kuanyama", - name: "" - }, - { - iso_639_1: "to", - english_name: "Tonga", - name: "" - }, - { - iso_639_1: "vi", - english_name: "Vietnamese", - name: "Ti\u1EBFng Vi\u1EC7t" - }, - { - iso_639_1: "zu", - english_name: "Zulu", - name: "isiZulu" - }, - { - iso_639_1: "zh", - english_name: "Mandarin", - name: "\u666E\u901A\u8BDD" - }, - { - iso_639_1: "ps", - english_name: "Pushto", - name: "\u067E\u069A\u062A\u0648" - }, - { - iso_639_1: "mk", - english_name: "Macedonian", - name: "" - }, - { - iso_639_1: "ae", - english_name: "Avestan", - name: "Upastawaka\u0113na" - }, - { - iso_639_1: "az", - english_name: "Azerbaijani", - name: "Az\u0259rbaycan" - }, - { - iso_639_1: "ba", - english_name: "Bashkir", - name: "\u0411\u0430\u0448\u04A1\u043E\u0440\u0442 \u0442\u0435\u043B\u0435" - }, - { - iso_639_1: "sh", - english_name: "Serbo-Croatian", - name: "" - }, - { - iso_639_1: "lv", - english_name: "Latvian", - name: "Latvie\u0161u" - }, - { - iso_639_1: "lt", - english_name: "Lithuanian", - name: "Lietuvi\u0173" - }, - { - iso_639_1: "ms", - english_name: "Malay", - name: "Bahasa melayu" - }, - { - iso_639_1: "rm", - english_name: "Raeto-Romance", - name: "" - }, - { - iso_639_1: "as", - english_name: "Assamese", - name: "\u0985\u09B8\u09AE\u09C0\u09AF\u09BC\u09BE" - }, - { - iso_639_1: "gd", - english_name: "Gaelic", - name: "" - }, - { - iso_639_1: "ja", - english_name: "Japanese", - name: "\u65E5\u672C\u8A9E" - }, - { - iso_639_1: "ko", - english_name: "Korean", - name: "\uD55C\uAD6D\uC5B4/\uC870\uC120\uB9D0" - }, - { - iso_639_1: "ku", - english_name: "Kurdish", - name: "" - }, - { - iso_639_1: "mo", - english_name: "Moldavian", - name: "" - }, - { - iso_639_1: "mn", - english_name: "Mongolian", - name: "" - }, - { - iso_639_1: "nb", - english_name: "Norwegian Bokm\xE5l", - name: "Bokm\xE5l" - }, - { - iso_639_1: "om", - english_name: "Oromo", - name: "" - }, - { - iso_639_1: "pi", - english_name: "Pali", - name: "" - }, - { - iso_639_1: "sq", - english_name: "Albanian", - name: "shqip" - }, - { - iso_639_1: "vo", - english_name: "Volap\xFCk", - name: "" - }, - { - iso_639_1: "bo", - english_name: "Tibetan", - name: "\u0F56\u0F7C\u0F51\u0F0B\u0F66\u0F90\u0F51\u0F0B\u0F0D" - }, - { - iso_639_1: "da", - english_name: "Danish", - name: "Dansk" - }, - { - iso_639_1: "kl", - english_name: "Kalaallisut", - name: "" - }, - { - iso_639_1: "kn", - english_name: "Kannada", - name: "?????" - }, - { - iso_639_1: "nl", - english_name: "Dutch", - name: "Nederlands" - }, - { - iso_639_1: "nn", - english_name: "Norwegian Nynorsk", - name: "" - }, - { - iso_639_1: "sa", - english_name: "Sanskrit", - name: "" - }, - { - iso_639_1: "am", - english_name: "Amharic", - name: "" - }, - { - iso_639_1: "hy", - english_name: "Armenian", - name: "" - }, - { - iso_639_1: "bs", - english_name: "Bosnian", - name: "Bosanski" - }, - { - iso_639_1: "hr", - english_name: "Croatian", - name: "Hrvatski" - }, - { - iso_639_1: "mh", - english_name: "Marshall", - name: "" - }, - { - iso_639_1: "mg", - english_name: "Malagasy", - name: "" - }, - { - iso_639_1: "ne", - english_name: "Nepali", - name: "" - }, - { - iso_639_1: "su", - english_name: "Sundanese", - name: "" - }, - { - iso_639_1: "ts", - english_name: "Tsonga", - name: "Xitsonga" - }, - { - iso_639_1: "ug", - english_name: "Uighur", - name: "" - }, - { - iso_639_1: "cs", - english_name: "Czech", - name: "\u010Cesk\xFD" - }, - { - iso_639_1: "jv", - english_name: "Javanese", - name: "" - }, - { - iso_639_1: "ro", - english_name: "Romanian", - name: "Rom\xE2n\u0103" - }, - { - iso_639_1: "sm", - english_name: "Samoan", - name: "" - }, - { - iso_639_1: "tg", - english_name: "Tajik", - name: "" - }, - { - iso_639_1: "wo", - english_name: "Wolof", - name: "Wolof" - }, - { - iso_639_1: "br", - english_name: "Breton", - name: "Brezhoneg" - }, - { - iso_639_1: "fr", - english_name: "French", - name: "Fran\xE7ais" - }, - { - iso_639_1: "ga", - english_name: "Irish", - name: "Gaeilge" - }, - { - iso_639_1: "ht", - english_name: "Haitian; Haitian Creole", - name: "" - }, - { - iso_639_1: "kv", - english_name: "Komi", - name: "" - }, - { - iso_639_1: "mi", - english_name: "Maori", - name: "" - }, - { - iso_639_1: "th", - english_name: "Thai", - name: "\u0E20\u0E32\u0E29\u0E32\u0E44\u0E17\u0E22" - }, - { - iso_639_1: "xx", - english_name: "No Language", - name: "No Language" - }, - { - iso_639_1: "af", - english_name: "Afrikaans", - name: "Afrikaans" - }, - { - iso_639_1: "av", - english_name: "Avaric", - name: "\u043C\u0430\u0433\u04CF\u0430\u0440\u0443\u043B \u043C\u0430\u0446\u04CF" - }, - { - iso_639_1: "bm", - english_name: "Bambara", - name: "Bamanankan" - }, - { - iso_639_1: "ca", - english_name: "Catalan", - name: "Catal\xE0" - }, - { - iso_639_1: "ce", - english_name: "Chechen", - name: "" - }, - { - iso_639_1: "de", - english_name: "German", - name: "Deutsch" - }, - { - iso_639_1: "gv", - english_name: "Manx", - name: "" - }, - { - iso_639_1: "rw", - english_name: "Kinyarwanda", - name: "Kinyarwanda" - }, - { - iso_639_1: "ky", - english_name: "Kirghiz", - name: "??????" - }, - { - iso_639_1: "ln", - english_name: "Lingala", - name: "" - }, - { - iso_639_1: "sn", - english_name: "Shona", - name: "" - }, - { - iso_639_1: "yi", - english_name: "Yiddish", - name: "" - }, - { - iso_639_1: "be", - english_name: "Belarusian", - name: "\u0431\u0435\u043B\u0430\u0440\u0443\u0441\u043A\u0430\u044F \u043C\u043E\u0432\u0430" - }, - { - iso_639_1: "cu", - english_name: "Slavic", - name: "" - }, - { - iso_639_1: "dz", - english_name: "Dzongkha", - name: "" - }, - { - iso_639_1: "eo", - english_name: "Esperanto", - name: "Esperanto" - }, - { - iso_639_1: "fi", - english_name: "Finnish", - name: "suomi" - }, - { - iso_639_1: "fy", - english_name: "Frisian", - name: "" - }, - { - iso_639_1: "ie", - english_name: "Interlingue", - name: "" - }, - { - iso_639_1: "ia", - english_name: "Interlingua", - name: "" - }, - { - iso_639_1: "it", - english_name: "Italian", - name: "Italiano" - }, - { - iso_639_1: "ng", - english_name: "Ndonga", - name: "" - }, - { - iso_639_1: "pa", - english_name: "Punjabi", - name: "\u0A2A\u0A70\u0A1C\u0A3E\u0A2C\u0A40" - }, - { - iso_639_1: "pt", - english_name: "Portuguese", - name: "Portugu\xEAs" - }, - { - iso_639_1: "rn", - english_name: "Rundi", - name: "Kirundi" - }, - { - iso_639_1: "fa", - english_name: "Persian", - name: "\u0641\u0627\u0631\u0633\u06CC" - }, - { - iso_639_1: "ch", - english_name: "Chamorro", - name: "Finu' Chamorro" - }, - { - iso_639_1: "cv", - english_name: "Chuvash", - name: "" - }, - { - iso_639_1: "en", - english_name: "English", - name: "English" - }, - { - iso_639_1: "hu", - english_name: "Hungarian", - name: "Magyar" - }, - { - iso_639_1: "ii", - english_name: "Yi", - name: "" - }, - { - iso_639_1: "kg", - english_name: "Kongo", - name: "" - }, - { - iso_639_1: "li", - english_name: "Limburgish", - name: "" - }, - { - iso_639_1: "ml", - english_name: "Malayalam", - name: "" - }, - { - iso_639_1: "nv", - english_name: "Navajo", - name: "" - }, - { - iso_639_1: "ny", - english_name: "Chichewa; Nyanja", - name: "" - }, - { - iso_639_1: "sg", - english_name: "Sango", - name: "" - }, - { - iso_639_1: "tw", - english_name: "Twi", - name: "" - }, - { - iso_639_1: "ab", - english_name: "Abkhazian", - name: "" - }, - { - iso_639_1: "ar", - english_name: "Arabic", - name: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629" - }, - { - iso_639_1: "ee", - english_name: "Ewe", - name: "\xC8\u028Begbe" - }, - { - iso_639_1: "fo", - english_name: "Faroese", - name: "" - }, - { - iso_639_1: "ik", - english_name: "Inupiaq", - name: "" - }, - { - iso_639_1: "ks", - english_name: "Kashmiri", - name: "" - }, - { - iso_639_1: "lb", - english_name: "Letzeburgesch", - name: "" - }, - { - iso_639_1: "nd", - english_name: "Ndebele", - name: "" - }, - { - iso_639_1: "oc", - english_name: "Occitan", - name: "" - }, - { - iso_639_1: "sk", - english_name: "Slovak", - name: "Sloven\u010Dina" - }, - { - iso_639_1: "tt", - english_name: "Tatar", - name: "" - }, - { - iso_639_1: "ve", - english_name: "Venda", - name: "" - }, - { - iso_639_1: "ay", - english_name: "Aymara", - name: "Aymara" - }, - { - iso_639_1: "fj", - english_name: "Fijian", - name: "" - }, - { - iso_639_1: "gu", - english_name: "Gujarati", - name: "" - }, - { - iso_639_1: "io", - english_name: "Ido", - name: "" - }, - { - iso_639_1: "lo", - english_name: "Lao", - name: "" - }, - { - iso_639_1: "la", - english_name: "Latin", - name: "Latin" - }, - { - iso_639_1: "no", - english_name: "Norwegian", - name: "Norsk" - }, - { - iso_639_1: "oj", - english_name: "Ojibwa", - name: "" - }, - { - iso_639_1: "pl", - english_name: "Polish", - name: "Polski" - }, - { - iso_639_1: "qu", - english_name: "Quechua", - name: "" - }, - { - iso_639_1: "sl", - english_name: "Slovenian", - name: "Sloven\u0161\u010Dina" - }, - { - iso_639_1: "sc", - english_name: "Sardinian", - name: "" - }, - { - iso_639_1: "sw", - english_name: "Swahili", - name: "Kiswahili" - }, - { - iso_639_1: "tl", - english_name: "Tagalog", - name: "" - }, - { - iso_639_1: "ur", - english_name: "Urdu", - name: "\u0627\u0631\u062F\u0648" - }, - { - iso_639_1: "bg", - english_name: "Bulgarian", - name: "\u0431\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438 \u0435\u0437\u0438\u043A" - }, - { - iso_639_1: "hi", - english_name: "Hindi", - name: "\u0939\u093F\u0928\u094D\u0926\u0940" - }, - { - iso_639_1: "yo", - english_name: "Yoruba", - name: "\xC8d\xE8 Yor\xF9b\xE1" - }, - { - iso_639_1: "ak", - english_name: "Akan", - name: "\xC1k\xE1n" - }, - { - iso_639_1: "an", - english_name: "Aragonese", - name: "Aragon\xE9s" - }, - { - iso_639_1: "bn", - english_name: "Bengali", - name: "\u09AC\u09BE\u0982\u09B2\u09BE" - }, - { - iso_639_1: "et", - english_name: "Estonian", - name: "Eesti" - }, - { - iso_639_1: "gl", - english_name: "Galician", - name: "Galego" - }, - { - iso_639_1: "ha", - english_name: "Hausa", - name: "Hausa" - }, - { - iso_639_1: "ig", - english_name: "Igbo", - name: "" - }, - { - iso_639_1: "iu", - english_name: "Inuktitut", - name: "" - }, - { - iso_639_1: "lg", - english_name: "Ganda", - name: "" - }, - { - iso_639_1: "mr", - english_name: "Marathi", - name: "" - }, - { - iso_639_1: "mt", - english_name: "Maltese", - name: "Malti" - }, - { - iso_639_1: "my", - english_name: "Burmese", - name: "" - }, - { - iso_639_1: "na", - english_name: "Nauru", - name: "" - }, - { - iso_639_1: "sd", - english_name: "Sindhi", - name: "" - }, - { - iso_639_1: "xh", - english_name: "Xhosa", - name: "" - }, - { - iso_639_1: "za", - english_name: "Zhuang", - name: "" - }, - { - iso_639_1: "aa", - english_name: "Afar", - name: "Qafar af" - }, - { - iso_639_1: "is", - english_name: "Icelandic", - name: "\xCDslenska" - }, - { - iso_639_1: "ty", - english_name: "Tahitian", - name: "" - }, - { - iso_639_1: "ti", - english_name: "Tigrinya", - name: "" - }, - { - iso_639_1: "tk", - english_name: "Turkmen", - name: "" - }, - { - iso_639_1: "he", - english_name: "Hebrew", - name: "\u05E2\u05B4\u05D1\u05B0\u05E8\u05B4\u05D9\u05EA" - } -]; - -// src/settings/language/languages.ts -var LANGUAGES = Languages_default; - -// src/settings/suggester/LanguageSuggest.ts -var LanguageSuggest = class extends import_obsidian4.AbstractInputSuggest { - constructor(app, inputEl) { - super(app, inputEl); - this.inputEl = inputEl; - } - getSuggestions(inputStr) { - const lower = inputStr.toLowerCase(); - if (!lower) return LANGUAGES.slice(0, 50); - return LANGUAGES.filter( - (lang) => (lang.name || lang.english_name || "").toLowerCase().contains(lower) || lang.iso_639_1.toLowerCase().contains(lower) - ).slice(0, 50); - } - renderSuggestion(item, el) { - el.createDiv({ - text: item.name || item.english_name - }); - el.createDiv({ - cls: "suggestion-sub", - text: item.english_name - }); - } - selectSuggestion(item) { - this.inputEl.value = item.name || item.english_name; - this.inputEl.dataset["iso"] = item.iso_639_1; - this.inputEl.trigger("input"); - } -}; - -// src/settings/components/LangugeSetting.ts -function createLanguageSetting(containerEl, plugin) { - const desc = activeDocument.createDocumentFragment(); - desc.createEl("span", { - text: "Note language (if not available in the database, English will be used)." - }); - new import_obsidian5.Setting(containerEl).setName("Language preference").setDesc(desc).addSearch((cb) => { - try { - new LanguageSuggest(plugin.app, cb.inputEl); - } catch { - } - cb.setPlaceholder("For example: Ukrainian, \u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430, uk").setValue(getLanguageDisplayName(plugin.settings.language)).onChange(async (value) => { - const isoFromDataset = cb.inputEl.dataset["iso"]; - if (isoFromDataset) { - plugin.settings.language = isoFromDataset; - } else { - const found = LANGUAGES.find( - (l) => (l.name || l.english_name || "").toLowerCase() === value.toLowerCase() || l.iso_639_1.toLowerCase() === value.toLowerCase() - ); - plugin.settings.language = found ? found.iso_639_1 : "en"; - } - await plugin.saveSettings(); - delete cb.inputEl.dataset["iso"]; - }); - cb.inputEl.addClass("popcorn-md-input"); - }); -} -function getLanguageDisplayName(iso) { - const found = LANGUAGES.find((l) => l.iso_639_1 === iso); - return found ? found.name || found.english_name : "English"; -} - -// src/settings/suggester/FolderSuggest.ts -var import_obsidian6 = require("obsidian"); -var FolderSuggest = class extends import_obsidian6.AbstractInputSuggest { - constructor(app, inputEl) { - super(app, inputEl); - this.inputEl = inputEl; - } - getSuggestions(inputStr) { - const folders = this.app.vault.getAllLoadedFiles().filter((f) => f instanceof import_obsidian6.TFolder); - const lowerInput = inputStr.toLowerCase(); - return folders.filter( - (folder) => folder.path.toLowerCase().includes(lowerInput) - ); - } - renderSuggestion(item, el) { - el.setText(item.path); - } - selectSuggestion(item) { - this.inputEl.value = item.path; - this.inputEl.trigger("input"); - } -}; - -// src/settings/components/DefaultFolder.ts -var import_obsidian7 = require("obsidian"); -function createDefaultFolderSetting(containerEl, plugin) { - new import_obsidian7.Setting(containerEl).setName("Default folder").setDesc("Specify the folder where all movie notes will be stored").addSearch((cb) => { - try { - new FolderSuggest(plugin.app, cb.inputEl); - } catch { - } - ; - cb.setPlaceholder("Example: Movies/").setValue(plugin.settings.defaultFoder).onChange(async (newDefaultFolder) => { - plugin.settings.defaultFoder = newDefaultFolder; - await plugin.saveSettings(); - }); - cb.inputEl.addClass("popcorn-md-input"); - }); -} - -// src/settings/components/AdultSetting.ts -var import_obsidian8 = require("obsidian"); -function createAdultSetting(containerEl, plugin) { - new import_obsidian8.Setting(containerEl).setName("Adult titles").setDesc("Include adult content?").addToggle((toggle) => { - toggle.setValue(plugin.settings.adult_content).onChange(async (value) => { - plugin.settings.adult_content = value; - await plugin.saveSettings(); - }); - }); -} - -// src/settings/settings.ts -var DEFAULT_SETTINGS = { - APIKey: "", - templateFile: "", - language: "en", - defaultFoder: "", - adult_content: false -}; -var PopcornMDSettingTab = class extends import_obsidian9.PluginSettingTab { - constructor(app, plugin) { - super(app, plugin); - this.plugin = plugin; - } - display() { - const { containerEl } = this; - containerEl.empty(); - createTemplateFileSetting(containerEl, this.plugin); - createDefaultFolderSetting(containerEl, this.plugin); - createAPIKeySetting(containerEl, this.plugin); - createLanguageSetting(containerEl, this.plugin); - createAdultSetting(containerEl, this.plugin); - } -}; - -// src/views/searchModal.ts -var import_obsidian13 = require("obsidian"); - -// src/api/tmdbAPIService.ts -var import_obsidian10 = require("obsidian"); -var TMDbAPIService = class { - constructor(settings) { - this.BASE_URL = "https://api.themoviedb.org/3"; - this.apiKey = settings.APIKey; - this.language = settings.language; - } - async fetchFromTMDb(endpoint, params = {}) { - const url = new URL(`${this.BASE_URL}${endpoint}`); - url.searchParams.append("api_key", this.apiKey); - url.searchParams.append("language", this.language); - for (const [key, value] of Object.entries(params)) { - url.searchParams.append(key, value); - } - const response = await (0, import_obsidian10.requestUrl)(url.toString()); - if (response.status === 404) { - throw new Error(`TMDb API not found: ${endpoint}`); - } - if (response.status < 200 || response.status >= 300) { - throw new Error(`TMDb API error: ${response.status} ${response.text}`); - } - return response.json; - } - async checkAPIKey() { - const resp = await this.fetchFromTMDb("/authentication"); - return resp.success; - } -}; - -// src/api/tmdbGenreService.ts -var TMDbGanreService = class extends TMDbAPIService { - constructor(settings) { - super(settings); - this.genreMap = /* @__PURE__ */ new Map(); - } - async init() { - const data = await this.fetchFromTMDb(`/genre/movie/list`); - data.genres.forEach((g) => { - this.genreMap.set(g.id, g.name); - }); - } - mapGenreIds(ids) { - return ids.map((id) => ({ - id, - name: this.genreMap.get(id) ?? "Unknown" - })); - } -}; - -// src/api/tmdbMovieService.ts -var TMDbMovieService = class extends TMDbAPIService { - constructor(settings) { - super(settings); - this.adultContent = settings.adult_content; - } - async searchMovie(query) { - const imdbPattern = /^tt\d{7,}$/; - if (imdbPattern.test(query)) { - return await this.getMovieByIMDbId(query); - } else { - return await this.searchMovieByName(query); - } - } - async getMovieById(id) { - try { - return await this.fetchFromTMDb(`/movie/${id.toString()}`); - } catch (error) { - if (error instanceof Error && error.message.includes("404")) { - return null; - } - throw error; - } - } - async getMovieByIMDbId(query) { - let data; - let movies; - try { - data = await this.fetchFromTMDb(`/find/${query}`, { - external_source: "imdb_id" - }); - movies = (data.movie_results ?? []).map((raw) => raw); - return { - page: 1, - results: movies, - total_pages: 1, - total_results: movies.length - }; - } catch (error) { - if (error instanceof Error && error.message.includes("404")) { - return { - page: 1, - results: [], - total_pages: 1, - total_results: 0 - }; - } - throw error; - } - } - async searchMovieByName(query) { - const data = await this.fetchFromTMDb("/search/movie", { - query, - include_adult: String(this.adultContent) - }); - return data; - } -}; - -// src/commands/MovieNoteService.ts -var import_obsidian11 = require("obsidian"); -var MovieNoteService = class { - constructor(_vault, defaultFolderPath) { - this.vault = _vault; - this.defaultFolderPath = defaultFolderPath; - } - async createMovieNote(movie, templatePath) { - const templateFile = this.getAbstractFileByPath(templatePath); - if (!(templateFile instanceof import_obsidian11.TFile)) { - throw Error("Template file not found"); - } - ; - const fileName = `${movie.title.replace(/[\\/:*?"<>|]/g, "_")}`; - if (this.getAbstractFileByPath(`${this.defaultFolderPath}/${fileName}.md`)) { - throw Error("Movie note is already exist"); - } - const templateContent = await this.vault.read(templateFile); - const noteContent = this.renderMovieNoteFromTemplate(movie, templateContent); - const noteFile = await this.vault.create(`${this.defaultFolderPath}/${fileName}.md`, noteContent); - return noteFile; - } - getAbstractFileByPath(filePath) { - const file = this.vault.getAbstractFileByPath(filePath); - return file; - } - renderMovieNoteFromTemplate(movie, template) { - return template.replace('"{{adult}}"', movie.adult ? "true" : "false").replace('"{{collection}}"', `"${movie.belongs_to_collection?.name ?? ""}"`).replace('"{{budget}}"', `"${String(movie.budget ?? "")}"`).replace('"{{genres}}"', `[${movie.genres.map((g) => `"[[${g.name}]]"`).join(", ")}]`).replace('"{{homepage}}"', movie.homepage ?? "").replace('"{{id}}"', String(movie.id ?? "")).replace('"{{imdb_id}}"', movie.imdb_id ?? "").replace('"{{origin_country}}"', `[${movie.origin_country?.map((c) => `"[[${c}]]"`).join(", ") ?? ""}]`).replace('"{{original_language}}"', movie.original_language ?? "").replace('"{{original_title}}"', `'${movie.original_title ?? ""}'`).replace('"{{overview}}"', `'${movie.overview ?? ""}'`).replace('"{{popularity}}"', String(movie.popularity)).replace('"{{poster_path}}"', movie.poster_path ?? "").replace('"{{production_companies}}"', `[${movie.production_companies.map((c) => `"[[${c.name}]]"`).join(", ")}]`).replace('"{{production_countries}}"', `[${movie.production_countries.map((c) => `"[[${c.name}]]"`).join(", ")}]`).replace('"{{release_date}}"', this.formatDate(movie.release_date) ?? "").replace('"{{revenue}}"', String(movie.revenue)).replace('"{{runtime}}"', String(movie.runtime)).replace('"{{softcore}}"', String(movie.softcore ?? "")).replace('"{{spoken_languages}}"', `[${movie.spoken_languages.map((l) => `"[[${l.name}]]"`).join(", ")}]`).replace('"{{status}}"', movie.status ?? "").replace('"{{tagline}}"', `'${movie.tagline ?? ""}'`).replace('"{{title}}"', `'${movie.title ?? ""}'`).replace('"{{vote_average}}"', String(movie.vote_average)).replace('"{{vote_count}}"', String(movie.vote_count)); - } - formatDate(dateStr, locale = "default", options) { - const date = new Date(dateStr); - return date.toLocaleDateString(locale, options); - } -}; - -// src/controllers/SearchController.ts -var SearchController = class { - constructor(app, settings, plugin) { - this.genreService = new TMDbGanreService(settings); - this.movieService = new TMDbMovieService(settings); - this.movieNoteService = new MovieNoteService(plugin.app.vault, settings.defaultFoder); - this.templatePath = settings.templateFile; - } - async init() { - await this.genreService.init(); - } - async search(query) { - return await this.movieService.searchMovie(query); - } - async getMovieById(id) { - return await this.movieService.getMovieById(id); - } - async createNote(movieId) { - const movie = await this.movieService.getMovieById(movieId); - if (!movie) { - return null; - } - const note = await this.movieNoteService.createMovieNote(movie, this.templatePath); - return note; - } - buildGenresMap(genreIds) { - const genres = this.genreService.mapGenreIds(genreIds); - const genresMap = {}; - genres.forEach((g) => { - genresMap[g.id] = g.name; - }); - return genresMap; - } -}; - -// src/views/MovieCard.ts -var import_obsidian12 = require("obsidian"); -function createMovieCard(movie, genresMap) { - const card = activeDocument.createElement("div"); - card.className = "card"; - card.id = movie.id.toString(); - const photoDiv = activeDocument.createElement("div"); - photoDiv.className = "movie-photo"; - const img = activeDocument.createElement("img"); - img.src = `https://image.tmdb.org/t/p/w500${movie.poster_path}`; - img.alt = movie.title; - photoDiv.appendChild(img); - const infoDiv = activeDocument.createElement("div"); - infoDiv.className = "movie-info"; - const titleEl = activeDocument.createElement("h2"); - titleEl.textContent = movie.title; - infoDiv.appendChild(titleEl); - const originalTitleEl = activeDocument.createElement("span"); - originalTitleEl.textContent = `(${movie.original_title})`; - originalTitleEl.className = "original-name"; - infoDiv.appendChild(originalTitleEl); - const overviewEl = activeDocument.createElement("p"); - overviewEl.textContent = movie.overview; - infoDiv.appendChild(overviewEl); - if (movie.genre_ids?.length) { - const genresDiv = activeDocument.createElement("div"); - genresDiv.className = "genres"; - movie.genre_ids.forEach((id) => { - const genre = activeDocument.createElement("div"); - genre.className = "genre"; - const span = activeDocument.createElement("span"); - span.textContent = genresMap[id] ?? ""; - genre.appendChild(span); - genresDiv.appendChild(genre); - }); - infoDiv.appendChild(genresDiv); - } - ; - const subInfoDiv = activeDocument.createElement("div"); - subInfoDiv.className = "movie-subinfo"; - const yearSpan = activeDocument.createElement("span"); - yearSpan.className = "realise-year"; - yearSpan.textContent = movie.release_date ? movie.release_date.slice(0, 4) : ""; - subInfoDiv.appendChild(yearSpan); - const ratingEl = renderStars(movie.vote_average); - subInfoDiv.appendChild(ratingEl); - infoDiv.appendChild(subInfoDiv); - if (movie.adult) { - const adultEl = activeDocument.createElement("div"); - adultEl.className = "adult_element"; - (0, import_obsidian12.setIcon)(adultEl, "flame"); - card.appendChild(adultEl); - } - card.appendChild(photoDiv); - card.appendChild(infoDiv); - function renderStars(rating) { - const container = activeDocument.createElement("div"); - container.classList.add("rating"); - const fullStars = Math.floor(rating); - const partial = rating % 1; - const emptyStars = 10 - fullStars - (partial > 0 ? 1 : 0); - for (let i = 0; i < fullStars; i++) { - const star = activeDocument.createElement("span"); - star.classList.add("star", "full"); - star.textContent = "\u2605"; - container.appendChild(star); - } - if (partial > 0) { - const wrapper = activeDocument.createElement("span"); - wrapper.classList.add("star", "empty"); - wrapper.textContent = "\u2605"; - const overlay = activeDocument.createElement("span"); - overlay.classList.add("star", "part"); - overlay.textContent = "\u2605"; - overlay.style.width = `${partial * 100}%`; - wrapper.appendChild(overlay); - container.appendChild(wrapper); - } - for (let i = 0; i < emptyStars; i++) { - const star = activeDocument.createElement("span"); - star.classList.add("star", "empty"); - star.textContent = "\u2605"; - container.appendChild(star); - } - return container; - } - return card; -} - -// src/views/SearchView.ts -var SearchView = class { - constructor(movieListEl) { - this.movieListEl = movieListEl; - } - showLoading() { - this.movieListEl.empty(); - this.movieListEl.createEl("span", { text: "Loading..." }); - } - showResults(result, genresMap, onMovieClick) { - this.movieListEl.empty(); - if (result.results.length === 0) { - this.movieListEl.createDiv({ text: "Nothing found(" }); - return; - } - result.results.forEach((movie) => { - const card = createMovieCard(movie, genresMap); - card.addEventListener("click", () => { - onMovieClick(movie.id); - }); - this.movieListEl.appendChild(card); - }); - } - showError() { - this.movieListEl.empty(); - this.movieListEl.createDiv({ text: "Oops, something went wrong. Please try again." }); - } -}; - -// src/views/searchModal.ts -var SearchModal = class extends import_obsidian13.Modal { - constructor(app, settings, plugin) { - super(app); - this.controller = new SearchController(app, settings, plugin); - } - async onOpen() { - await this.controller.init(); - const { contentEl } = this; - const container = contentEl.createDiv("searchModal-container"); - container.createEl("h1", { text: "Popcorn-MD" }); - const input = container.createEl("input", { - type: "search", - placeholder: "Enter movie name or IMDb id" - }); - const movieList = container.createDiv("movie-list"); - this.view = new SearchView(movieList); - input.addEventListener("keydown", (event) => { - if (event.key === "Enter") { - void this.handleSearch(event); - } - ; - }); - } - onClose() { - this.contentEl.empty(); - } - async handleSearch(event) { - event.preventDefault(); - const query = event.target.value.trim(); - if (query.length === 0) { - return; - } - ; - this.view.showLoading(); - try { - const result = await this.controller.search(query); - const genresMap = this.controller.buildGenresMap( - result.results.flatMap((m) => m.genre_ids) - ); - this.view.showResults(result, genresMap, async (movieId) => { - void this.handleMovieSelection(movieId); - }); - } catch (error) { - console.error("Search error:", error); - this.view.showError(); - } - ; - } - async handleMovieSelection(movieId) { - let note = null; - try { - note = await this.controller.createNote(movieId); - } catch (error) { - const message = error instanceof Error ? error.message : String(error); - new import_obsidian13.Notice(message); - return; - } - if (note) { - await this.app.workspace.openLinkText(note.path, "", true); - } - ; - this.close(); - } -}; - -// src/main.ts -var PopcornMD = class extends import_obsidian14.Plugin { - async onload() { - await this.loadSettings(); - this.addRibbonIcon("popcorn", "Create new movie note", (_evt) => { - new SearchModal(this.app, this.settings, this).open(); - }); - this.addCommand({ - id: "open-modal-searh", - name: "Create new movie note", - callback: () => { - new SearchModal(this.app, this.settings, this).open(); - } - }); - this.addSettingTab(new PopcornMDSettingTab(this.app, this)); - } - onunload() { - } - async loadSettings() { - this.settings = Object.assign( - {}, - DEFAULT_SETTINGS, - await this.loadData() - ); - } - async saveSettings() { - await this.saveData(this.settings); - } -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzL3NldHRpbmdzLnRzIiwgInNyYy9zZXR0aW5ncy9zdWdnZXN0ZXIvRmlsZVN1Z2dlc3QudHMiLCAic3JjL3NldHRpbmdzL2NvbXBvbmVudHMvVGVtcGxhdGVGaWxlU2V0dGluZy50cyIsICJzcmMvc2V0dGluZ3MvY29tcG9uZW50cy9BUElLZXlTZXR0aW5nLnRzIiwgInNyYy9zZXR0aW5ncy9jb21wb25lbnRzL0xhbmd1Z2VTZXR0aW5nLnRzIiwgInNyYy9zZXR0aW5ncy9zdWdnZXN0ZXIvTGFuZ3VhZ2VTdWdnZXN0LnRzIiwgInNyYy9zZXR0aW5ncy9sYW5ndWFnZS9MYW5ndWFnZXMuanNvbiIsICJzcmMvc2V0dGluZ3MvbGFuZ3VhZ2UvbGFuZ3VhZ2VzLnRzIiwgInNyYy9zZXR0aW5ncy9zdWdnZXN0ZXIvRm9sZGVyU3VnZ2VzdC50cyIsICJzcmMvc2V0dGluZ3MvY29tcG9uZW50cy9EZWZhdWx0Rm9sZGVyLnRzIiwgInNyYy9zZXR0aW5ncy9jb21wb25lbnRzL0FkdWx0U2V0dGluZy50cyIsICJzcmMvdmlld3Mvc2VhcmNoTW9kYWwudHMiLCAic3JjL2FwaS90bWRiQVBJU2VydmljZS50cyIsICJzcmMvYXBpL3RtZGJHZW5yZVNlcnZpY2UudHMiLCAic3JjL2FwaS90bWRiTW92aWVTZXJ2aWNlLnRzIiwgInNyYy9jb21tYW5kcy9Nb3ZpZU5vdGVTZXJ2aWNlLnRzIiwgInNyYy9jb250cm9sbGVycy9TZWFyY2hDb250cm9sbGVyLnRzIiwgInNyYy92aWV3cy9Nb3ZpZUNhcmQudHMiLCAic3JjL3ZpZXdzL1NlYXJjaFZpZXcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG5cdFBsdWdpbixcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtcblx0REVGQVVMVF9TRVRUSU5HUyxcblx0UG9wY29ybk1EU2V0dGluZ3MsXG5cdFBvcGNvcm5NRFNldHRpbmdUYWIsXG59IGZyb20gJy4vc2V0dGluZ3Mvc2V0dGluZ3MnO1xuaW1wb3J0IHsgU2VhcmNoTW9kYWwgfSBmcm9tICcuL3ZpZXdzL3NlYXJjaE1vZGFsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9wY29ybk1EIGV4dGVuZHMgUGx1Z2luIHtcblx0c2V0dGluZ3MhOiBQb3Bjb3JuTURTZXR0aW5ncztcblxuXHRhc3luYyBvbmxvYWQoKSB7XG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcblx0XHR0aGlzLmFkZFJpYmJvbkljb24oJ3BvcGNvcm4nLCAnQ3JlYXRlIG5ldyBtb3ZpZSBub3RlJywgKF9ldnQ6IE1vdXNlRXZlbnQpID0+IHtcblx0XHRcdG5ldyBTZWFyY2hNb2RhbCh0aGlzLmFwcCwgdGhpcy5zZXR0aW5ncywgdGhpcykub3BlbigpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiAnb3Blbi1tb2RhbC1zZWFyaCcsXG5cdFx0XHRuYW1lOiAnQ3JlYXRlIG5ldyBtb3ZpZSBub3RlJyxcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB7XG5cdFx0XHRcdG5ldyBTZWFyY2hNb2RhbCh0aGlzLmFwcCwgdGhpcy5zZXR0aW5ncywgdGhpcykub3BlbigpO1xuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgUG9wY29ybk1EU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXHR9XG5cblx0b251bmxvYWQoKSB7fVxuXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbihcblx0XHRcdHt9LFxuXHRcdFx0REVGQVVMVF9TRVRUSU5HUyxcblx0XHRcdChhd2FpdCB0aGlzLmxvYWREYXRhKCkpIGFzIFBhcnRpYWw8UG9wY29ybk1EU2V0dGluZ3M+LFxuXHRcdCk7XG5cdH1cblxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcblx0fVxufVxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBQb3Bjb3JuTUQgZnJvbSAnLi4vbWFpbic7XG5pbXBvcnQgeyBjcmVhdGVUZW1wbGF0ZUZpbGVTZXR0aW5nIH0gZnJvbSAnLi9jb21wb25lbnRzL1RlbXBsYXRlRmlsZVNldHRpbmcnO1xuaW1wb3J0IHsgY3JlYXRlQVBJS2V5U2V0dGluZyB9IGZyb20gJy4vY29tcG9uZW50cy9BUElLZXlTZXR0aW5nJztcbmltcG9ydCB7IGNyZWF0ZUxhbmd1YWdlU2V0dGluZyB9IGZyb20gJy4vY29tcG9uZW50cy9MYW5ndWdlU2V0dGluZyc7XG5pbXBvcnQgeyBjcmVhdGVEZWZhdWx0Rm9sZGVyU2V0dGluZyB9IGZyb20gJy4vY29tcG9uZW50cy9EZWZhdWx0Rm9sZGVyJztcbmltcG9ydCB7IGNyZWF0ZUFkdWx0U2V0dGluZyB9IGZyb20gJy4vY29tcG9uZW50cy9BZHVsdFNldHRpbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBvcGNvcm5NRFNldHRpbmdzIHtcblx0QVBJS2V5OiBzdHJpbmc7XG5cdHRlbXBsYXRlRmlsZTogc3RyaW5nO1xuXHRsYW5ndWFnZTogc3RyaW5nO1xuXHRkZWZhdWx0Rm9kZXI6IHN0cmluZztcblx0YWR1bHRfY29udGVudDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFBvcGNvcm5NRFNldHRpbmdzID0ge1xuXHRBUElLZXk6ICcnLFxuXHR0ZW1wbGF0ZUZpbGU6ICcnLFxuXHRsYW5ndWFnZTogJ2VuJyxcblx0ZGVmYXVsdEZvZGVyOiAnJyxcblx0YWR1bHRfY29udGVudDogZmFsc2Vcbn07XG5cbmV4cG9ydCBjbGFzcyBQb3Bjb3JuTURTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG5cdHBsdWdpbjogUG9wY29ybk1EO1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFBvcGNvcm5NRCkge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cdFx0Y3JlYXRlVGVtcGxhdGVGaWxlU2V0dGluZyhjb250YWluZXJFbCwgdGhpcy5wbHVnaW4pO1xuXHRcdGNyZWF0ZURlZmF1bHRGb2xkZXJTZXR0aW5nKGNvbnRhaW5lckVsLCB0aGlzLnBsdWdpbik7XG5cdFx0Y3JlYXRlQVBJS2V5U2V0dGluZyhjb250YWluZXJFbCwgdGhpcy5wbHVnaW4pO1xuXHRcdGNyZWF0ZUxhbmd1YWdlU2V0dGluZyhjb250YWluZXJFbCwgdGhpcy5wbHVnaW4pO1xuXHRcdGNyZWF0ZUFkdWx0U2V0dGluZyhjb250YWluZXJFbCwgdGhpcy5wbHVnaW4pO1xuXHR9XG59XG4iLCAiaW1wb3J0IHsgQWJzdHJhY3RJbnB1dFN1Z2dlc3QsIFRGaWxlLCBBcHB9IGZyb20gJ29ic2lkaWFuJztcblxuZXhwb3J0IGNsYXNzIEZpbGVTdWdnZXN0IGV4dGVuZHMgQWJzdHJhY3RJbnB1dFN1Z2dlc3Q8VEZpbGU+IHtcbiAgICBwcml2YXRlIGlucHV0RWw6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgaW5wdXRFbDogSFRNTElucHV0RWxlbWVudCl7XG4gICAgICAgIHN1cGVyKGFwcCwgaW5wdXRFbCk7XG4gICAgICAgIHRoaXMuaW5wdXRFbCA9IGlucHV0RWw7XG4gICAgfVxuXG4gICAgZ2V0U3VnZ2VzdGlvbnMoaW5wdXRTdHI6IHN0cmluZyk6IFRGaWxlW10ge1xuICAgICAgICBjb25zdCBmaWxlcyA9IHRoaXMuYXBwLnZhdWx0LmdldEZpbGVzKCk7XG4gICAgICAgIGNvbnN0IGxvd2VySW5wdXQgPSBpbnB1dFN0ci50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIHJldHVybiBmaWxlcy5maWx0ZXIoZmlsZSA9PiBcbiAgICAgICAgICAgIGZpbGUuZXh0ZW5zaW9uID09PSBcIm1kXCIgXG4gICAgICAgICAgICAmJiBmaWxlLnBhdGgudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlcklucHV0KVxuICAgICAgICApO1xuXG4gICAgfVxuICAgIHJlbmRlclN1Z2dlc3Rpb24oaXRlbTogVEZpbGUsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBlbC5zZXRUZXh0KGl0ZW0ucGF0aCk7XG4gICAgfVxuICAgIHNlbGVjdFN1Z2dlc3Rpb24oaXRlbTogVEZpbGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dEVsLnZhbHVlID0gaXRlbS5wYXRoO1xuICAgICAgICB0aGlzLmlucHV0RWwudHJpZ2dlcihcImlucHV0XCIpO1xuICAgIH1cbn0iLCAiaW1wb3J0IFBvcGNvcm5NRCBmcm9tIFwiLi4vLi4vbWFpblwiO1xuaW1wb3J0IHsgRmlsZVN1Z2dlc3QgfSBmcm9tIFwiLi4vc3VnZ2VzdGVyL0ZpbGVTdWdnZXN0XCI7XG5pbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZW1wbGF0ZUZpbGVTZXR0aW5nKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCwgcGx1Z2luOiBQb3Bjb3JuTUQpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVGaWxlRGVzYyA9IGFjdGl2ZURvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgdGVtcGxhdGVGaWxlRGVzYy5jcmVhdGVEaXYoeyB0ZXh0OiAnRmlsZXMgd2lsbCBiZSBhdmFpbGFibGUgYXMgdGVtcGxhdGVzLicgfSk7XG4gICAgICAgIHRlbXBsYXRlRmlsZURlc2MuY3JlYXRlRWwoJ3AnLCB7XG4gICAgICAgICAgICB0ZXh0OiBcIllvdSBjYW4gdXNlIHZhcmlhYmxlcyBsaWtlIHt7dGl0bGV9fSBhbmQge3t5ZWFyfX0gaW4gdGhlIHRlbXBsYXRlLlwiLFxuICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgLnNldE5hbWUoJ1RlbXBsYXRlIGZpbGUnKVxuICAgICAgICAuc2V0RGVzYyh0ZW1wbGF0ZUZpbGVEZXNjKVxuICAgICAgICAuYWRkU2VhcmNoKGNiID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgRmlsZVN1Z2dlc3QocGx1Z2luLmFwcCwgY2IuaW5wdXRFbCk7XG4gICAgICAgICAgICB9IGNhdGNoIHt9O1xuXG4gICAgICAgICAgICBjYi5zZXRQbGFjZWhvbGRlcignRXhhbXBsZTogdGVtcGxhdGVzL3RlbXBsYXRlLWZpbGUnKVxuICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy50ZW1wbGF0ZUZpbGUpXG4gICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgbmV3VGVtcGxhdGVGaWxlID0+IHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MudGVtcGxhdGVGaWxlID0gbmV3VGVtcGxhdGVGaWxlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2IuaW5wdXRFbC5hZGRDbGFzcyhcInBvcGNvcm4tbWQtaW5wdXRcIik7XG4gICAgICAgIH0pO1xuICAgIH0iLCAiaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBQb3Bjb3JuTUQgZnJvbSAnLi4vLi4vbWFpbic7XG5cbmV4cG9ydCBmdW5jdGlvbiAgY3JlYXRlQVBJS2V5U2V0dGluZyhjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIHBsdWdpbjogUG9wY29ybk1EKSB7XG4gICAgY29uc3QgQVBJS2V5RGVzYyA9IGFjdGl2ZURvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICAgIEFQSUtleURlc2MuY3JlYXRlRWwoJ3NwYW4nKTtcbiAgICBBUElLZXlEZXNjLmFwcGVuZFRleHQoXCJZb3VyIFRNRGIgQVBJIEtleS4gXCIpO1xuICAgIEFQSUtleURlc2MuY3JlYXRlRWwoJ2EnLCB7XG4gICAgdGV4dDogXCJZb3UgY2FuIGdldCBvbmUgaGVyZVwiLFxuICAgICAgICBocmVmOiAnaHR0cHM6Ly93d3cudGhlbW92aWVkYi5vcmcvc2V0dGluZ3MvYXBpJ1xuICAgIH0pO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgIC5zZXROYW1lKCdUTURiIEFQSSBLZXknKVxuICAgICAgICAuc2V0RGVzYyhBUElLZXlEZXNjKVxuICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xuICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcignRW50ZXIgeW91ciBrZXknKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MuQVBJS2V5KVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLkFQSUtleSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0ZXh0LmlucHV0RWwuYWRkQ2xhc3MoXCJwb3Bjb3JuLW1kLWlucHV0XCIpO1xuICAgICAgICB9KTtcbn07IiwgImltcG9ydCB7IFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IExhbmd1YWdlU3VnZ2VzdCB9IGZyb20gXCIuLi9zdWdnZXN0ZXIvTGFuZ3VhZ2VTdWdnZXN0XCI7XG5pbXBvcnQgeyBMQU5HVUFHRVMgfSBmcm9tIFwiLi4vbGFuZ3VhZ2UvbGFuZ3VhZ2VzXCI7XG5pbXBvcnQgUG9wY29ybk1EIGZyb20gXCIuLi8uLi9tYWluXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVNldHRpbmcoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LCBwbHVnaW46IFBvcGNvcm5NRCkge1xuICAgIGNvbnN0IGRlc2MgPSBhY3RpdmVEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgZGVzYy5jcmVhdGVFbCgnc3BhbicsIHtcbiAgICAgICAgdGV4dDogJ05vdGUgbGFuZ3VhZ2UgKGlmIG5vdCBhdmFpbGFibGUgaW4gdGhlIGRhdGFiYXNlLCBFbmdsaXNoIHdpbGwgYmUgdXNlZCkuJ1xuICAgIH0pXG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgLnNldE5hbWUoJ0xhbmd1YWdlIHByZWZlcmVuY2UnKVxuICAgICAgICAuc2V0RGVzYyhkZXNjKVxuICAgICAgICAuYWRkU2VhcmNoKGNiID0+IHtcbiAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICBuZXcgTGFuZ3VhZ2VTdWdnZXN0KHBsdWdpbi5hcHAsIGNiLmlucHV0RWwpXG4gICAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgICAgICBjYi5zZXRQbGFjZWhvbGRlcignRm9yIGV4YW1wbGU6IFVrcmFpbmlhbiwgXHUwNDIzXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNEXHUwNDQxXHUwNDRDXHUwNDNBXHUwNDMwLCB1aycpXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKGdldExhbmd1YWdlRGlzcGxheU5hbWUocGx1Z2luLnNldHRpbmdzLmxhbmd1YWdlKSlcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzb0Zyb21EYXRhc2V0ID0gY2IuaW5wdXRFbC5kYXRhc2V0Wydpc28nXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzb0Zyb21EYXRhc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MubGFuZ3VhZ2UgPSBpc29Gcm9tRGF0YXNldDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gTEFOR1VBR0VTLmZpbmQobCA9PiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGwubmFtZSB8fCBsLmVuZ2xpc2hfbmFtZSkgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlLnRvTG93ZXJDYXNlKCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbC5pc29fNjM5XzEudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUudG9Mb3dlckNhc2UoKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MubGFuZ3VhZ2UgPSBmb3VuZCA/IGZvdW5kLmlzb182MzlfMSA6ICdlbic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2IuaW5wdXRFbC5kYXRhc2V0Wydpc28nXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNiLmlucHV0RWwuYWRkQ2xhc3MoXCJwb3Bjb3JuLW1kLWlucHV0XCIpO1xuICAgICAgICB9KVxufVxuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZURpc3BsYXlOYW1lKGlzbzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmb3VuZCA9IExBTkdVQUdFUy5maW5kKGwgPT4gbC5pc29fNjM5XzEgPT09IGlzbyk7XG4gICAgcmV0dXJuIGZvdW5kID8gKGZvdW5kLm5hbWUgfHwgZm91bmQuZW5nbGlzaF9uYW1lKSA6ICdFbmdsaXNoJ1xufSIsICJpbXBvcnQge0Fic3RyYWN0SW5wdXRTdWdnZXN0LCBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBMQU5HVUFHRVMsIHR5cGUgTGFuZ3VhZ2V9IGZyb20gJy4uL2xhbmd1YWdlL2xhbmd1YWdlcyc7XG5cbmV4cG9ydCBjbGFzcyBMYW5ndWFnZVN1Z2dlc3QgZXh0ZW5kcyBBYnN0cmFjdElucHV0U3VnZ2VzdDxMYW5ndWFnZT4ge1xuICAgIHByaXZhdGUgaW5wdXRFbDogSFRNTElucHV0RWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBpbnB1dEVsOiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgIHN1cGVyKGFwcCwgaW5wdXRFbCk7XG4gICAgICAgIHRoaXMuaW5wdXRFbCA9IGlucHV0RWw7XG4gICAgfVxuXG4gICAgZ2V0U3VnZ2VzdGlvbnMoaW5wdXRTdHI6IHN0cmluZyk6IExhbmd1YWdlW10ge1xuICAgICAgICBjb25zdCBsb3dlciA9IGlucHV0U3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghbG93ZXIpIHJldHVybiBMQU5HVUFHRVMuc2xpY2UoMCwgNTApO1xuXG4gICAgICAgIHJldHVybiBMQU5HVUFHRVMuZmlsdGVyKGxhbmcgPT4gXG4gICAgICAgICAgICAobGFuZy5uYW1lIHx8IGxhbmcuZW5nbGlzaF9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKGxvd2VyKVxuICAgICAgICAgICAgfHwgbGFuZy5pc29fNjM5XzEudG9Mb3dlckNhc2UoKS5jb250YWlucyhsb3dlcilcbiAgICAgICAgKS5zbGljZSgwLCA1MCk7XG4gICAgfVxuICAgIHJlbmRlclN1Z2dlc3Rpb24oaXRlbTogTGFuZ3VhZ2UsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBlbC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgdGV4dDogaXRlbS5uYW1lIHx8IGl0ZW0uZW5nbGlzaF9uYW1lXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGVsLmNyZWF0ZURpdih7XG4gICAgICAgICAgICBjbHM6IFwic3VnZ2VzdGlvbi1zdWJcIiwgXG4gICAgICAgICAgICB0ZXh0OiBpdGVtLmVuZ2xpc2hfbmFtZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2VsZWN0U3VnZ2VzdGlvbihpdGVtOiBMYW5ndWFnZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0RWwudmFsdWUgPSBpdGVtLm5hbWUgfHwgaXRlbS5lbmdsaXNoX25hbWU7XG4gICAgICAgIHRoaXMuaW5wdXRFbC5kYXRhc2V0Wydpc28nXSA9IGl0ZW0uaXNvXzYzOV8xO1xuICAgICAgICB0aGlzLmlucHV0RWwudHJpZ2dlcignaW5wdXQnKTtcbiAgICB9XG59IiwgIltcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwia3dcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJDb3JuaXNoXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiZmZcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJGdWxhaFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJGdWxmdWxkZVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiZ25cIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJHdWFyYW5pXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiaWRcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJJbmRvbmVzaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkJhaGFzYSBpbmRvbmVzaWFcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImx1XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiTHViYS1LYXRhbmdhXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwibnJcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJOZGViZWxlXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwib3NcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJPc3NldGlhbjsgT3NzZXRpY1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInJ1XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiUnVzc2lhblwiLFxuICAgICAgICBcIm5hbWVcIjogXCJQXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDM5XCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJzZVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIk5vcnRoZXJuIFNhbWlcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJzb1wiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlNvbWFsaVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJTb21hbGlcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImVzXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiU3BhbmlzaFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJFc3BhXHUwMEYxb2xcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInN2XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiU3dlZGlzaFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJzdmVuc2thXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJ0YVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlRhbWlsXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MEJBNFx1MEJBRVx1MEJCRlx1MEJCNFx1MEJDRFwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwidGVcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJUZWx1Z3VcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXHUwQzI0XHUwQzQ2XHUwQzMyXHUwQzQxXHUwQzE3XHUwQzQxXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJ0blwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlRzd2FuYVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInVrXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiVWtyYWluaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MDQyM1x1MDQzQVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzRFx1MDQ0MVx1MDQ0Q1x1MDQzQVx1MDQzOFx1MDQzOVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwidXpcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJVemJla1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJvemJla1wiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiZWxcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJHcmVla1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJcdTAzQjVcdTAzQkJcdTAzQkJcdTAzQjdcdTAzQkRcdTAzQjlcdTAzQkFcdTAzQUNcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImNvXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiQ29yc2ljYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJkdlwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkRpdmVoaVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImtrXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiS2F6YWtoXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MDQ5Qlx1MDQzMFx1MDQzN1x1MDQzMFx1MDQ5QlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwia2lcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJLaWt1eXVcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJvclwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIk9yaXlhXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwic2lcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJTaW5oYWxlc2VcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXHUwREMzXHUwREQyXHUwRDgyXHUwREM0XHUwREJEXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJzdFwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlNvdGhvXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwic3JcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJTZXJiaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlNycHNraVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwic3NcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJTd2F0aVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInRyXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiVHVya2lzaFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJUXHUwMEZDcmtcdTAwRTdlXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJ3YVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIldhbGxvb25cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJjblwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkNhbnRvbmVzZVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcdTVFN0ZcdTVEREVcdThCREQgLyBcdTVFRTNcdTVEREVcdThBNzFcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImJpXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiQmlzbGFtYVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJCaXNsYW1hXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJjclwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkNyZWVcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJjeVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIldlbHNoXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkN5bXJhZWdcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImV1XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiQmFzcXVlXCIsXG4gICAgICAgIFwibmFtZVwiOiBcImV1c2tlcmFcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImh6XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiSGVyZXJvXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiaG9cIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJIaXJpIE1vdHVcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJrYVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkdlb3JnaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MTBFNVx1MTBEMFx1MTBFMFx1MTBEN1x1MTBFM1x1MTBEQVx1MTBEOFwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwia3JcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJLYW51cmlcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJrbVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIktobWVyXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwia2pcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJLdWFueWFtYVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInRvXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiVG9uZ2FcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJ2aVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlZpZXRuYW1lc2VcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiVGlcdTFFQkZuZyBWaVx1MUVDN3RcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInp1XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiWnVsdVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJpc2ladWx1XCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJ6aFwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIk1hbmRhcmluXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1NjY2RVx1OTAxQVx1OEJERFwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwicHNcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJQdXNodG9cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXHUwNjdFXHUwNjlBXHUwNjJBXHUwNjQ4XCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJta1wiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIk1hY2Vkb25pYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJhZVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkF2ZXN0YW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiVXBhc3Rhd2FrYVx1MDExM25hXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJhelwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkF6ZXJiYWlqYW5pXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkF6XHUwMjU5cmJheWNhblwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiYmFcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJCYXNoa2lyXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRBMVx1MDQzRVx1MDQ0MFx1MDQ0MiBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0MzVcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInNoXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiU2VyYm8tQ3JvYXRpYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJsdlwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkxhdHZpYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiTGF0dmllXHUwMTYxdVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwibHRcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJMaXRodWFuaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkxpZXR1dmlcdTAxNzNcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcIm1zXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiTWFsYXlcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiQmFoYXNhIG1lbGF5dVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwicm1cIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJSYWV0by1Sb21hbmNlXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiYXNcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJBc3NhbWVzZVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcdTA5ODVcdTA5QjhcdTA5QUVcdTA5QzBcdTA5QUZcdTA5QkNcdTA5QkVcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImdkXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiR2FlbGljXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiamFcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJKYXBhbmVzZVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcdTY1RTVcdTY3MkNcdThBOUVcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImtvXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiS29yZWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1RDU1Q1x1QUQ2RFx1QzVCNC9cdUM4NzBcdUMxMjBcdUI5RDBcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImt1XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiS3VyZGlzaFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcIm1vXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiTW9sZGF2aWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwibW5cIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJNb25nb2xpYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJuYlwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIk5vcndlZ2lhbiBCb2ttXHUwMEU1bFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJCb2ttXHUwMEU1bFwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwib21cIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJPcm9tb1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInBpXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiUGFsaVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInNxXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiQWxiYW5pYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwic2hxaXBcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInZvXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiVm9sYXBcdTAwRkNrXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiYm9cIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJUaWJldGFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MEY1Nlx1MEY3Q1x1MEY1MVx1MEYwQlx1MEY2Nlx1MEY5MFx1MEY1MVx1MEYwQlx1MEYwRFwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiZGFcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJEYW5pc2hcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiRGFuc2tcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImtsXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiS2FsYWFsbGlzdXRcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJrblwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkthbm5hZGFcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiPz8/Pz9cIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcIm5sXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiRHV0Y2hcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiTmVkZXJsYW5kc1wiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwibm5cIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJOb3J3ZWdpYW4gTnlub3Jza1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInNhXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiU2Fuc2tyaXRcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJhbVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkFtaGFyaWNcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJoeVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkFybWVuaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiYnNcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJCb3NuaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkJvc2Fuc2tpXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJoclwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkNyb2F0aWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkhydmF0c2tpXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJtaFwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIk1hcnNoYWxsXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwibWdcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJNYWxhZ2FzeVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcIm5lXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiTmVwYWxpXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwic3VcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJTdW5kYW5lc2VcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJ0c1wiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlRzb25nYVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJYaXRzb25nYVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwidWdcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJVaWdodXJcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJjc1wiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkN6ZWNoXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MDEwQ2Vza1x1MDBGRFwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwianZcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJKYXZhbmVzZVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInJvXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiUm9tYW5pYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiUm9tXHUwMEUyblx1MDEwM1wiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwic21cIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJTYW1vYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJ0Z1wiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlRhamlrXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwid29cIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJXb2xvZlwiLFxuICAgICAgICBcIm5hbWVcIjogXCJXb2xvZlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiYnJcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJCcmV0b25cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiQnJlemhvbmVnXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJmclwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkZyZW5jaFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJGcmFuXHUwMEU3YWlzXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJnYVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIklyaXNoXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkdhZWlsZ2VcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImh0XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiSGFpdGlhbjsgSGFpdGlhbiBDcmVvbGVcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJrdlwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIktvbWlcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJtaVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIk1hb3JpXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwidGhcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJUaGFpXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MEUyMFx1MEUzMlx1MEUyOVx1MEUzMlx1MEU0NFx1MEUxN1x1MEUyMlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwieHhcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJObyBMYW5ndWFnZVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJObyBMYW5ndWFnZVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiYWZcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJBZnJpa2FhbnNcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiQWZyaWthYW5zXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJhdlwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkF2YXJpY1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJcdTA0M0NcdTA0MzBcdTA0MzNcdTA0Q0ZcdTA0MzBcdTA0NDBcdTA0NDNcdTA0M0IgXHUwNDNDXHUwNDMwXHUwNDQ2XHUwNENGXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJibVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkJhbWJhcmFcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiQmFtYW5hbmthblwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiY2FcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJDYXRhbGFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkNhdGFsXHUwMEUwXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJjZVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkNoZWNoZW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJkZVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkdlcm1hblwiLFxuICAgICAgICBcIm5hbWVcIjogXCJEZXV0c2NoXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJndlwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIk1hbnhcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJyd1wiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIktpbnlhcndhbmRhXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIktpbnlhcndhbmRhXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJreVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIktpcmdoaXpcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiPz8/Pz8/XCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJsblwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkxpbmdhbGFcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJzblwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlNob25hXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwieWlcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJZaWRkaXNoXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiYmVcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJCZWxhcnVzaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzQVx1MDQzMFx1MDQ0RiBcdTA0M0NcdTA0M0VcdTA0MzJcdTA0MzBcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImN1XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiU2xhdmljXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiZHpcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJEem9uZ2toYVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImVvXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiRXNwZXJhbnRvXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkVzcGVyYW50b1wiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiZmlcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJGaW5uaXNoXCIsXG4gICAgICAgIFwibmFtZVwiOiBcInN1b21pXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJmeVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkZyaXNpYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJpZVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkludGVybGluZ3VlXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiaWFcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJJbnRlcmxpbmd1YVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcIml0XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiSXRhbGlhblwiLFxuICAgICAgICBcIm5hbWVcIjogXCJJdGFsaWFub1wiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwibmdcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJOZG9uZ2FcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJwYVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlB1bmphYmlcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXHUwQTJBXHUwQTcwXHUwQTFDXHUwQTNFXHUwQTJDXHUwQTQwXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJwdFwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlBvcnR1Z3Vlc2VcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiUG9ydHVndVx1MDBFQXNcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInJuXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiUnVuZGlcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiS2lydW5kaVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiZmFcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJQZXJzaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZDQ1wiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiY2hcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJDaGFtb3Jyb1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJGaW51JyBDaGFtb3Jyb1wiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiY3ZcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJDaHV2YXNoXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiZW5cIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJFbmdsaXNoXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkVuZ2xpc2hcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImh1XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiSHVuZ2FyaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIk1hZ3lhclwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiaWlcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJZaVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImtnXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiS29uZ29cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJsaVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkxpbWJ1cmdpc2hcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJtbFwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIk1hbGF5YWxhbVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcIm52XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiTmF2YWpvXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwibnlcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJDaGljaGV3YTsgTnlhbmphXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwic2dcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJTYW5nb1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInR3XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiVHdpXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiYWJcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJBYmtoYXppYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJhclwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkFyYWJpY1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NEFcdTA2MjlcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImVlXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiRXdlXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MDBDOFx1MDI4QmVnYmVcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImZvXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiRmFyb2VzZVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImlrXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiSW51cGlhcVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImtzXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiS2FzaG1pcmlcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJsYlwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkxldHplYnVyZ2VzY2hcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJuZFwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIk5kZWJlbGVcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJvY1wiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIk9jY2l0YW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJza1wiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlNsb3Zha1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJTbG92ZW5cdTAxMERpbmFcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInR0XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiVGF0YXJcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJ2ZVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlZlbmRhXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiYXlcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJBeW1hcmFcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiQXltYXJhXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJmalwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkZpamlhblwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImd1XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiR3VqYXJhdGlcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJpb1wiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIklkb1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImxvXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiTGFvXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwibGFcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJMYXRpblwiLFxuICAgICAgICBcIm5hbWVcIjogXCJMYXRpblwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwibm9cIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJOb3J3ZWdpYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiTm9yc2tcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcIm9qXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiT2ppYndhXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwicGxcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJQb2xpc2hcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiUG9sc2tpXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJxdVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlF1ZWNodWFcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJzbFwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlNsb3ZlbmlhblwiLFxuICAgICAgICBcIm5hbWVcIjogXCJTbG92ZW5cdTAxNjFcdTAxMERpbmFcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInNjXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiU2FyZGluaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwic3dcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJTd2FoaWxpXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIktpc3dhaGlsaVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwidGxcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJUYWdhbG9nXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwidXJcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJVcmR1XCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MDYyN1x1MDYzMVx1MDYyRlx1MDY0OFwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiYmdcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJCdWxnYXJpYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXHUwNDMxXHUwNDRBXHUwNDNCXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNBXHUwNDM4IFx1MDQzNVx1MDQzN1x1MDQzOFx1MDQzQVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiaGlcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJIaW5kaVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJcdTA5MzlcdTA5M0ZcdTA5MjhcdTA5NERcdTA5MjZcdTA5NDBcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInlvXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiWW9ydWJhXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MDBDOGRcdTAwRTggWW9yXHUwMEY5Ylx1MDBFMVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiYWtcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJBa2FuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MDBDMWtcdTAwRTFuXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJhblwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkFyYWdvbmVzZVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJBcmFnb25cdTAwRTlzXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJiblwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkJlbmdhbGlcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXHUwOUFDXHUwOUJFXHUwOTgyXHUwOUIyXHUwOUJFXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJldFwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkVzdG9uaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkVlc3RpXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJnbFwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkdhbGljaWFuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkdhbGVnb1wiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiaGFcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJIYXVzYVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJIYXVzYVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiaWdcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJJZ2JvXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiaXVcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJJbnVrdGl0dXRcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJsZ1wiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkdhbmRhXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwibXJcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJNYXJhdGhpXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwibXRcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJNYWx0ZXNlXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIk1hbHRpXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJteVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkJ1cm1lc2VcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJuYVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIk5hdXJ1XCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwic2RcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJTaW5kaGlcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJ4aFwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlhob3NhXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiemFcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJaaHVhbmdcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJhYVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIkFmYXJcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiUWFmYXIgYWZcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcImlzXCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiSWNlbGFuZGljXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlx1MDBDRHNsZW5za2FcIlxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlzb182MzlfMVwiOiBcInR5XCIsXG4gICAgICAgIFwiZW5nbGlzaF9uYW1lXCI6IFwiVGFoaXRpYW5cIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpc29fNjM5XzFcIjogXCJ0aVwiLFxuICAgICAgICBcImVuZ2xpc2hfbmFtZVwiOiBcIlRpZ3JpbnlhXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwidGtcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJUdXJrbWVuXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaXNvXzYzOV8xXCI6IFwiaGVcIixcbiAgICAgICAgXCJlbmdsaXNoX25hbWVcIjogXCJIZWJyZXdcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiXHUwNUUyXHUwNUI0XHUwNUQxXHUwNUIwXHUwNUU4XHUwNUI0XHUwNUQ5XHUwNUVBXCJcbiAgICB9XG5dIiwgImltcG9ydCByYXcgZnJvbSAnLi9MYW5ndWFnZXMuanNvbic7XG5leHBvcnQgdHlwZSBMYW5ndWFnZSA9IHsgXG4gICAgaXNvXzYzOV8xOiBzdHJpbmc7IFxuICAgIGVuZ2xpc2hfbmFtZTogc3RyaW5nOyBcbiAgICBuYW1lOiBzdHJpbmcgXG59O1xuZXhwb3J0IGNvbnN0IExBTkdVQUdFUzogTGFuZ3VhZ2VbXSA9IHJhdyBhcyBMYW5ndWFnZVtdOyIsICJpbXBvcnQgeyBBYnN0cmFjdElucHV0U3VnZ2VzdCwgVEZvbGRlciwgQXBwfSBmcm9tICdvYnNpZGlhbic7XG5cbmV4cG9ydCBjbGFzcyBGb2xkZXJTdWdnZXN0IGV4dGVuZHMgQWJzdHJhY3RJbnB1dFN1Z2dlc3Q8VEZvbGRlcj4ge1xuICAgIHByaXZhdGUgaW5wdXRFbDogSFRNTElucHV0RWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBpbnB1dEVsOiBIVE1MSW5wdXRFbGVtZW50KXtcbiAgICAgICAgc3VwZXIoYXBwLCBpbnB1dEVsKTtcbiAgICAgICAgdGhpcy5pbnB1dEVsID0gaW5wdXRFbDtcbiAgICB9XG5cbiAgICBnZXRTdWdnZXN0aW9ucyhpbnB1dFN0cjogc3RyaW5nKTogVEZvbGRlcltdIHtcbiAgICAgICAgY29uc3QgZm9sZGVycyA9IHRoaXMuYXBwLnZhdWx0LmdldEFsbExvYWRlZEZpbGVzKClcbiAgICAgICAgICAgIC5maWx0ZXIoKGYpOiBmIGlzIFRGb2xkZXIgPT4gZiBpbnN0YW5jZW9mIFRGb2xkZXIpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgbG93ZXJJbnB1dCA9IGlucHV0U3RyLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgcmV0dXJuIGZvbGRlcnMuZmlsdGVyKGZvbGRlciA9PiBcbiAgICAgICAgICAgIGZvbGRlci5wYXRoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJJbnB1dClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZW5kZXJTdWdnZXN0aW9uKGl0ZW06IFRGb2xkZXIsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBlbC5zZXRUZXh0KGl0ZW0ucGF0aCk7XG4gICAgfVxuICAgIHNlbGVjdFN1Z2dlc3Rpb24oaXRlbTogVEZvbGRlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0RWwudmFsdWUgPSBpdGVtLnBhdGg7XG4gICAgICAgIHRoaXMuaW5wdXRFbC50cmlnZ2VyKFwiaW5wdXRcIik7XG4gICAgfVxufSIsICJpbXBvcnQgUG9wY29ybk1EIGZyb20gXCIuLi8uLi9tYWluXCI7XG5pbXBvcnQgeyBGb2xkZXJTdWdnZXN0IH0gZnJvbSBcIi4uL3N1Z2dlc3Rlci9Gb2xkZXJTdWdnZXN0XCJcbmltcG9ydCB7IFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRGb2xkZXJTZXR0aW5nKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCwgcGx1Z2luOiBQb3Bjb3JuTUQpIHtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgIC5zZXROYW1lKCdEZWZhdWx0IGZvbGRlcicpXG4gICAgICAgIC5zZXREZXNjKCdTcGVjaWZ5IHRoZSBmb2xkZXIgd2hlcmUgYWxsIG1vdmllIG5vdGVzIHdpbGwgYmUgc3RvcmVkJylcbiAgICAgICAgLmFkZFNlYXJjaChjYiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmV3IEZvbGRlclN1Z2dlc3QocGx1Z2luLmFwcCwgY2IuaW5wdXRFbCk7XG4gICAgICAgICAgICB9IGNhdGNoIHt9O1xuXG4gICAgICAgICAgICBjYi5zZXRQbGFjZWhvbGRlcignRXhhbXBsZTogTW92aWVzLycpXG4gICAgICAgICAgICAuc2V0VmFsdWUocGx1Z2luLnNldHRpbmdzLmRlZmF1bHRGb2RlcilcbiAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyBuZXdEZWZhdWx0Rm9sZGVyID0+IHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuZGVmYXVsdEZvZGVyID0gbmV3RGVmYXVsdEZvbGRlcjtcbiAgICAgICAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNiLmlucHV0RWwuYWRkQ2xhc3MoXCJwb3Bjb3JuLW1kLWlucHV0XCIpO1xuICAgICAgICB9KTtcbiAgICB9IiwgImltcG9ydCB7IFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgUG9wY29ybk1EIGZyb20gJy4uLy4uL21haW4nO1xuXG5leHBvcnQgZnVuY3Rpb24gIGNyZWF0ZUFkdWx0U2V0dGluZyhjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIHBsdWdpbjogUG9wY29ybk1EKSB7XG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgIC5zZXROYW1lKCdBZHVsdCB0aXRsZXMnKVxuICAgICAgICAuc2V0RGVzYyhcIkluY2x1ZGUgYWR1bHQgY29udGVudD9cIilcbiAgICAgICAgLmFkZFRvZ2dsZSh0b2dnbGUgPT4ge1xuICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5hZHVsdF9jb250ZW50KVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmFkdWx0X2NvbnRlbnQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbn07IiwgImltcG9ydCB7IEFwcCwgTW9kYWwsIFRGaWxlLCBOb3RpY2UgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IFBvcGNvcm5NRFNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL3NldHRpbmdzXCI7XG5pbXBvcnQgUG9wY29ybk1EIGZyb20gXCIuLi9tYWluXCI7XG5pbXBvcnQgeyBTZWFyY2hDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzL1NlYXJjaENvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFNlYXJjaFZpZXcgfSBmcm9tIFwiLi9TZWFyY2hWaWV3XCI7XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hNb2RhbCBleHRlbmRzIE1vZGFsIHtcbiAgICBwcml2YXRlIGNvbnRyb2xsZXI6IFNlYXJjaENvbnRyb2xsZXI7XG4gICAgcHJpdmF0ZSB2aWV3ITogU2VhcmNoVmlldztcblxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBzZXR0aW5nczogUG9wY29ybk1EU2V0dGluZ3MsIHBsdWdpbjogUG9wY29ybk1EKSB7XG4gICAgICAgIHN1cGVyKGFwcCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBTZWFyY2hDb250cm9sbGVyKGFwcCwgc2V0dGluZ3MsIHBsdWdpbik7XG4gICAgfVxuXG4gICAgYXN5bmMgb25PcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbnRyb2xsZXIuaW5pdCgpO1xuXG4gICAgICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBjb250ZW50RWwuY3JlYXRlRGl2KCdzZWFyY2hNb2RhbC1jb250YWluZXInKTtcblxuICAgICAgICBjb250YWluZXIuY3JlYXRlRWwoJ2gxJywgeyB0ZXh0OiBcIlBvcGNvcm4tTURcIiB9KTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250YWluZXIuY3JlYXRlRWwoXCJpbnB1dFwiLCB7XG4gICAgICAgICAgICB0eXBlOiBcInNlYXJjaFwiLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiRW50ZXIgbW92aWUgbmFtZSBvciBJTURiIGlkXCJcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG1vdmllTGlzdCA9IGNvbnRhaW5lci5jcmVhdGVEaXYoXCJtb3ZpZS1saXN0XCIpO1xuICAgICAgICB0aGlzLnZpZXcgPSBuZXcgU2VhcmNoVmlldyhtb3ZpZUxpc3QpO1xuXG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLmhhbmRsZVNlYXJjaChldmVudCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlU2VhcmNoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZS50cmltKCk7XG4gICAgICAgIGlmIChxdWVyeS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy52aWV3LnNob3dMb2FkaW5nKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbnRyb2xsZXIuc2VhcmNoKHF1ZXJ5KTtcbiAgICAgICAgICAgIGNvbnN0IGdlbnJlc01hcCA9IHRoaXMuY29udHJvbGxlci5idWlsZEdlbnJlc01hcChcbiAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0cy5mbGF0TWFwKG0gPT4gbS5nZW5yZV9pZHMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy52aWV3LnNob3dSZXN1bHRzKHJlc3VsdCwgZ2VucmVzTWFwLCBhc3luYyAobW92aWVJZDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLmhhbmRsZU1vdmllU2VsZWN0aW9uKG1vdmllSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiU2VhcmNoIGVycm9yOlwiLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLnZpZXcuc2hvd0Vycm9yKCk7XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlTW92aWVTZWxlY3Rpb24obW92aWVJZDogbnVtYmVyKSB7XG4gICAgICAgIGxldCBub3RlOiBURmlsZSB8IG51bGwgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbm90ZSA9IGF3YWl0IHRoaXMuY29udHJvbGxlci5jcmVhdGVOb3RlKG1vdmllSWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgICAgIG5ldyBOb3RpY2UobWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vdGUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobm90ZS5wYXRoLCBcIlwiLCB0cnVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH07XG59O1xuIiwgImltcG9ydCB7IHJlcXVlc3RVcmwgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IEF1dGhSZXNwb25zZSB9IGZyb20gXCIuLi9tb2RlbHMvQXV0aFJlc3BvbmNlXCI7XG5pbXBvcnQgeyBQb3Bjb3JuTURTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9zZXR0aW5nc1wiO1xuXG5leHBvcnQgY2xhc3MgVE1EYkFQSVNlcnZpY2Uge1xuICAgIHByaXZhdGUgYXBpS2V5OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBsYW5ndWFnZTogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgQkFTRV9VUkwgPSBcImh0dHBzOi8vYXBpLnRoZW1vdmllZGIub3JnLzNcIjtcblxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzOiBQb3Bjb3JuTURTZXR0aW5ncyl7XG4gICAgICAgIHRoaXMuYXBpS2V5ID0gc2V0dGluZ3MuQVBJS2V5O1xuICAgICAgICB0aGlzLmxhbmd1YWdlID0gc2V0dGluZ3MubGFuZ3VhZ2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGZldGNoRnJvbVRNRGI8VD4oZW5kcG9pbnQ6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCAoYCR7dGhpcy5CQVNFX1VSTH0ke2VuZHBvaW50fWApO1xuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImFwaV9rZXlcIiwgdGhpcy5hcGlLZXkpO1xuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImxhbmd1YWdlXCIsIHRoaXMubGFuZ3VhZ2UpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtcykpe1xuICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybCh1cmwudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KXtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVE1EYiBBUEkgbm90IGZvdW5kOiAke2VuZHBvaW50fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA8IDIwMCB8fCByZXNwb25zZS5zdGF0dXMgPj0gMzAwKXtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVE1EYiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnRleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24gYXMgVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2hlY2tBUElLZXkoKTogUHJvbWlzZTxib29sZWFuPntcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZmV0Y2hGcm9tVE1EYjxBdXRoUmVzcG9uc2U+KCcvYXV0aGVudGljYXRpb24nKTtcbiAgICAgICAgcmV0dXJuIHJlc3Auc3VjY2VzcztcbiAgICB9XG59IiwgImltcG9ydCB7IEdlbnJlLCBHZW5yZVJlc3BvbmNlfSBmcm9tIFwiLi4vbW9kZWxzL0dlbnJlXCI7XG5pbXBvcnQgeyBQb3Bjb3JuTURTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgVE1EYkFQSVNlcnZpY2UgfSBmcm9tIFwiLi90bWRiQVBJU2VydmljZVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBUTURiR2FucmVTZXJ2aWNlIGV4dGVuZHMgVE1EYkFQSVNlcnZpY2Uge1xuICAgIHByaXZhdGUgZ2VucmVNYXAgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IFBvcGNvcm5NRFNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+e1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5mZXRjaEZyb21UTURiPEdlbnJlUmVzcG9uY2U+KGAvZ2VucmUvbW92aWUvbGlzdGApO1xuICAgICAgICBkYXRhLmdlbnJlcy5mb3JFYWNoKChnOiBHZW5yZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZW5yZU1hcC5zZXQoZy5pZCwgZy5uYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBtYXBHZW5yZUlkcyhpZHM6IG51bWJlcltdKTogR2VucmVbXSB7XG4gICAgICAgIHJldHVybiBpZHMubWFwKGlkID0+ICh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2VucmVNYXAuZ2V0KGlkKSA/PyBcIlVua25vd25cIlxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIFxufSIsICJpbXBvcnQgeyBNb3ZpZSB9IGZyb20gXCIuLi9tb2RlbHMvTW92aWVcIjtcbmltcG9ydCB7IFNlYXJjaFJlc3VsdCwgU2VhcmNoTW92aWUsIEZpbmRSZXNwb25jZSB9IGZyb20gXCIuLi9tb2RlbHMvU2VhcmNoUmVzdWx0XCI7XG5pbXBvcnQgeyBQb3Bjb3JuTURTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgVE1EYkFQSVNlcnZpY2UgfSBmcm9tIFwiLi90bWRiQVBJU2VydmljZVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBUTURiTW92aWVTZXJ2aWNlIGV4dGVuZHMgVE1EYkFQSVNlcnZpY2Uge1xuICAgIHByaXZhdGUgYWR1bHRDb250ZW50OiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IFBvcGNvcm5NRFNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5hZHVsdENvbnRlbnQgPSBzZXR0aW5ncy5hZHVsdF9jb250ZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZWFyY2hNb3ZpZSAocXVlcnk6IHN0cmluZyk6IFByb21pc2U8U2VhcmNoUmVzdWx0PntcbiAgICAgICAgY29uc3QgaW1kYlBhdHRlcm4gPSAvXnR0XFxkezcsfSQvOyAvL3R0MDEzMzA5MyBJTURiX2lkIGZvcm1hdFxuXG4gICAgICAgIGlmIChpbWRiUGF0dGVybi50ZXN0KHF1ZXJ5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TW92aWVCeUlNRGJJZChxdWVyeSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlYXJjaE1vdmllQnlOYW1lKHF1ZXJ5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRNb3ZpZUJ5SWQoaWQ6IG51bWJlcik6IFByb21pc2U8TW92aWUgfCBudWxsPntcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoRnJvbVRNRGI8TW92aWU+KGAvbW92aWUvJHtpZC50b1N0cmluZygpfWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcil7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiNDA0XCIpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRNb3ZpZUJ5SU1EYklkKHF1ZXJ5OiBzdHJpbmcpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD57XG4gICAgICAgIGxldCBkYXRhOiBGaW5kUmVzcG9uY2U7XG4gICAgICAgIGxldCBtb3ZpZXM6IFNlYXJjaE1vdmllW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkYXRhID0gYXdhaXQgdGhpcy5mZXRjaEZyb21UTURiPEZpbmRSZXNwb25jZT4oYC9maW5kLyR7cXVlcnl9YCwge1xuICAgICAgICAgICAgICAgIGV4dGVybmFsX3NvdXJjZTogXCJpbWRiX2lkXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbW92aWVzID0gKGRhdGEubW92aWVfcmVzdWx0cyA/PyBbXSkubWFwKChyYXc6IFNlYXJjaE1vdmllKSA9PiByYXcpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwYWdlOiAxLFxuICAgICAgICAgICAgICAgIHJlc3VsdHM6IG1vdmllcyxcbiAgICAgICAgICAgICAgICB0b3RhbF9wYWdlczogMSxcbiAgICAgICAgICAgICAgICB0b3RhbF9yZXN1bHRzOiBtb3ZpZXMubGVuZ3RoLFxuICAgICAgICAgICAgfTsgIFxuICAgICAgICB9IGNhdGNoIChlcnJvcil7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiNDA0XCIpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBwYWdlOiAxLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxfcGFnZXM6IDEsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsX3Jlc3VsdHM6IDAsXG4gICAgICAgICAgICAgICAgfTsgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNlYXJjaE1vdmllQnlOYW1lKHF1ZXJ5OiBzdHJpbmcpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD57XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZldGNoRnJvbVRNRGI8U2VhcmNoUmVzdWx0PignL3NlYXJjaC9tb3ZpZScsIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeSxcbiAgICAgICAgICAgIGluY2x1ZGVfYWR1bHQ6IFN0cmluZyh0aGlzLmFkdWx0Q29udGVudClcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn0iLCAiaW1wb3J0IHsgVEFic3RyYWN0RmlsZSwgVEZpbGUsIFZhdWx0IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBNb3ZpZSB9IGZyb20gXCIuLi9tb2RlbHMvTW92aWVcIjtcblxuZXhwb3J0IGNsYXNzIE1vdmllTm90ZVNlcnZpY2Uge1xuICAgIHByaXZhdGUgdmF1bHQ6IFZhdWx0O1xuICAgIHByaXZhdGUgZGVmYXVsdEZvbGRlclBhdGg6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihfdmF1bHQ6IFZhdWx0LCBkZWZhdWx0Rm9sZGVyUGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudmF1bHQgPSBfdmF1bHQ7XG4gICAgICAgIHRoaXMuZGVmYXVsdEZvbGRlclBhdGggPSBkZWZhdWx0Rm9sZGVyUGF0aDtcbiAgICB9O1xuXG4gICAgYXN5bmMgY3JlYXRlTW92aWVOb3RlKG1vdmllOiBNb3ZpZSwgdGVtcGxhdGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFRGaWxlPiB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlRmlsZSA9IHRoaXMuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHRlbXBsYXRlUGF0aCk7XG4gICAgICAgIGlmICghKHRlbXBsYXRlRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJUZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBgJHttb3ZpZS50aXRsZS5yZXBsYWNlKC9bXFxcXC86Kj9cIjw+fF0vZywgXCJfXCIpfWA7XG5cbiAgICAgICAgaWYodGhpcy5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoYCR7dGhpcy5kZWZhdWx0Rm9sZGVyUGF0aH0vJHtmaWxlTmFtZX0ubWRgKSl7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIk1vdmllIG5vdGUgaXMgYWxyZWFkeSBleGlzdFwiKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0ZW1wbGF0ZUNvbnRlbnQgPSBhd2FpdCB0aGlzLnZhdWx0LnJlYWQodGVtcGxhdGVGaWxlKTtcbiAgICAgICAgY29uc3Qgbm90ZUNvbnRlbnQgPSB0aGlzLnJlbmRlck1vdmllTm90ZUZyb21UZW1wbGF0ZShtb3ZpZSwgdGVtcGxhdGVDb250ZW50KTtcbiAgICAgICAgY29uc3Qgbm90ZUZpbGUgPSBhd2FpdCB0aGlzLnZhdWx0LmNyZWF0ZShgJHt0aGlzLmRlZmF1bHRGb2xkZXJQYXRofS8ke2ZpbGVOYW1lfS5tZGAsIG5vdGVDb250ZW50KTtcbiAgICAgICAgcmV0dXJuIG5vdGVGaWxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBUQWJzdHJhY3RGaWxlIHwgbnVsbHtcbiAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIGZpbGVcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlck1vdmllTm90ZUZyb21UZW1wbGF0ZShtb3ZpZTogTW92aWUsIHRlbXBsYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGVtcGxhdGVcbiAgICAgICAgLnJlcGxhY2UoJ1wie3thZHVsdH19XCInLCBtb3ZpZS5hZHVsdCA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiKVxuICAgICAgICAucmVwbGFjZSgnXCJ7e2NvbGxlY3Rpb259fVwiJywgYFwiJHttb3ZpZS5iZWxvbmdzX3RvX2NvbGxlY3Rpb24/Lm5hbWUgPz8gXCJcIn1cImApXG4gICAgICAgIC5yZXBsYWNlKCdcInt7YnVkZ2V0fX1cIicsIGBcIiR7U3RyaW5nKG1vdmllLmJ1ZGdldCA/PyBcIlwiKX1cImApXG4gICAgICAgIC5yZXBsYWNlKCdcInt7Z2VucmVzfX1cIicsIGBbJHttb3ZpZS5nZW5yZXMubWFwKGcgPT4gYFwiW1ske2cubmFtZX1dXVwiYCkuam9pbihcIiwgXCIpfV1gKVxuICAgICAgICAucmVwbGFjZSgnXCJ7e2hvbWVwYWdlfX1cIicsIG1vdmllLmhvbWVwYWdlID8/IFwiXCIpXG4gICAgICAgIC5yZXBsYWNlKCdcInt7aWR9fVwiJywgU3RyaW5nKG1vdmllLmlkID8/IFwiXCIpKVxuICAgICAgICAucmVwbGFjZSgnXCJ7e2ltZGJfaWR9fVwiJywgbW92aWUuaW1kYl9pZCA/PyBcIlwiKVxuICAgICAgICAucmVwbGFjZSgnXCJ7e29yaWdpbl9jb3VudHJ5fX1cIicsIGBbJHttb3ZpZS5vcmlnaW5fY291bnRyeT8ubWFwKGMgPT4gYFwiW1ske2N9XV1cImApLmpvaW4oXCIsIFwiKSA/PyBcIlwifV1gKVxuICAgICAgICAucmVwbGFjZSgnXCJ7e29yaWdpbmFsX2xhbmd1YWdlfX1cIicsIG1vdmllLm9yaWdpbmFsX2xhbmd1YWdlID8/IFwiXCIpXG4gICAgICAgIC5yZXBsYWNlKCdcInt7b3JpZ2luYWxfdGl0bGV9fVwiJywgYCcke21vdmllLm9yaWdpbmFsX3RpdGxlID8/IFwiXCJ9J2ApXG4gICAgICAgIC5yZXBsYWNlKCdcInt7b3ZlcnZpZXd9fVwiJywgYCcke21vdmllLm92ZXJ2aWV3ID8/IFwiXCJ9J2ApXG4gICAgICAgIC5yZXBsYWNlKCdcInt7cG9wdWxhcml0eX19XCInLCBTdHJpbmcobW92aWUucG9wdWxhcml0eSkpXG4gICAgICAgIC5yZXBsYWNlKCdcInt7cG9zdGVyX3BhdGh9fVwiJywgbW92aWUucG9zdGVyX3BhdGggPz8gXCJcIilcbiAgICAgICAgLnJlcGxhY2UoJ1wie3twcm9kdWN0aW9uX2NvbXBhbmllc319XCInLCBgWyR7bW92aWUucHJvZHVjdGlvbl9jb21wYW5pZXMubWFwKGMgPT4gYFwiW1ske2MubmFtZX1dXVwiYCkuam9pbihcIiwgXCIpfV1gKVxuICAgICAgICAucmVwbGFjZSgnXCJ7e3Byb2R1Y3Rpb25fY291bnRyaWVzfX1cIicsIGBbJHttb3ZpZS5wcm9kdWN0aW9uX2NvdW50cmllcy5tYXAoYyA9PiBgXCJbWyR7Yy5uYW1lfV1dXCJgKS5qb2luKFwiLCBcIil9XWApXG4gICAgICAgIC5yZXBsYWNlKCdcInt7cmVsZWFzZV9kYXRlfX1cIicsIHRoaXMuZm9ybWF0RGF0ZShtb3ZpZS5yZWxlYXNlX2RhdGUpID8/IFwiXCIpXG4gICAgICAgIC5yZXBsYWNlKCdcInt7cmV2ZW51ZX19XCInLCBTdHJpbmcobW92aWUucmV2ZW51ZSkpXG4gICAgICAgIC5yZXBsYWNlKCdcInt7cnVudGltZX19XCInLCBTdHJpbmcobW92aWUucnVudGltZSkpXG4gICAgICAgIC5yZXBsYWNlKCdcInt7c29mdGNvcmV9fVwiJywgU3RyaW5nKG1vdmllLnNvZnRjb3JlID8/IFwiXCIpKVxuICAgICAgICAucmVwbGFjZSgnXCJ7e3Nwb2tlbl9sYW5ndWFnZXN9fVwiJywgYFske21vdmllLnNwb2tlbl9sYW5ndWFnZXMubWFwKGwgPT4gYFwiW1ske2wubmFtZX1dXVwiYCkuam9pbihcIiwgXCIpfV1gKVxuICAgICAgICAucmVwbGFjZSgnXCJ7e3N0YXR1c319XCInLCBtb3ZpZS5zdGF0dXMgPz8gXCJcIilcbiAgICAgICAgLnJlcGxhY2UoJ1wie3t0YWdsaW5lfX1cIicsIGAnJHttb3ZpZS50YWdsaW5lID8/IFwiXCJ9J2ApXG4gICAgICAgIC5yZXBsYWNlKCdcInt7dGl0bGV9fVwiJywgYCcke21vdmllLnRpdGxlID8/IFwiXCJ9J2ApXG4gICAgICAgIC5yZXBsYWNlKCdcInt7dm90ZV9hdmVyYWdlfX1cIicsIFN0cmluZyhtb3ZpZS52b3RlX2F2ZXJhZ2UpKVxuICAgICAgICAucmVwbGFjZSgnXCJ7e3ZvdGVfY291bnR9fVwiJywgU3RyaW5nKG1vdmllLnZvdGVfY291bnQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdERhdGUoZGF0ZVN0cjogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyA9IFwiZGVmYXVsdFwiLCBvcHRpb25zPzogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZVN0cik7XG4gICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyhsb2NhbGUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBcbn0iLCAiaW1wb3J0IHsgQXBwLCBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSBcIi4uL21vZGVscy9TZWFyY2hSZXN1bHRcIjtcbmltcG9ydCB7IFRNRGJHYW5yZVNlcnZpY2UgfSBmcm9tIFwiLi4vYXBpL3RtZGJHZW5yZVNlcnZpY2VcIjtcbmltcG9ydCB7IFRNRGJNb3ZpZVNlcnZpY2UgfSBmcm9tIFwiLi4vYXBpL3RtZGJNb3ZpZVNlcnZpY2VcIjtcbmltcG9ydCB7IE1vdmllTm90ZVNlcnZpY2UgfSBmcm9tIFwiLi4vY29tbWFuZHMvTW92aWVOb3RlU2VydmljZVwiO1xuaW1wb3J0IHsgUG9wY29ybk1EU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3Mvc2V0dGluZ3NcIjtcbmltcG9ydCBQb3Bjb3JuTUQgZnJvbSBcIi4uL21haW5cIjtcblxuZXhwb3J0IGNsYXNzIFNlYXJjaENvbnRyb2xsZXIge1xuICAgIHByaXZhdGUgZ2VucmVTZXJ2aWNlOiBUTURiR2FucmVTZXJ2aWNlO1xuICAgIHByaXZhdGUgbW92aWVTZXJ2aWNlOiBUTURiTW92aWVTZXJ2aWNlO1xuICAgIHByaXZhdGUgbW92aWVOb3RlU2VydmljZTogTW92aWVOb3RlU2VydmljZTtcbiAgICBwcml2YXRlIHRlbXBsYXRlUGF0aDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHNldHRpbmdzOiBQb3Bjb3JuTURTZXR0aW5ncywgcGx1Z2luOiBQb3Bjb3JuTUQpIHtcbiAgICAgICAgdGhpcy5nZW5yZVNlcnZpY2UgPSBuZXcgVE1EYkdhbnJlU2VydmljZShzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMubW92aWVTZXJ2aWNlID0gbmV3IFRNRGJNb3ZpZVNlcnZpY2Uoc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLm1vdmllTm90ZVNlcnZpY2UgPSBuZXcgTW92aWVOb3RlU2VydmljZShwbHVnaW4uYXBwLnZhdWx0LCBzZXR0aW5ncy5kZWZhdWx0Rm9kZXIpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlUGF0aCA9IHNldHRpbmdzLnRlbXBsYXRlRmlsZTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmdlbnJlU2VydmljZS5pbml0KCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tb3ZpZVNlcnZpY2Uuc2VhcmNoTW92aWUocXVlcnkpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1vdmllQnlJZChpZDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1vdmllU2VydmljZS5nZXRNb3ZpZUJ5SWQoaWQpO1xuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZU5vdGUobW92aWVJZDogbnVtYmVyKTogUHJvbWlzZTxURmlsZSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgbW92aWUgPSBhd2FpdCB0aGlzLm1vdmllU2VydmljZS5nZXRNb3ZpZUJ5SWQobW92aWVJZCk7XG4gICAgICAgIGlmICghbW92aWUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm90ZSA9IGF3YWl0IHRoaXMubW92aWVOb3RlU2VydmljZS5jcmVhdGVNb3ZpZU5vdGUobW92aWUsIHRoaXMudGVtcGxhdGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIG5vdGU7XG4gICAgfVxuXG4gICAgYnVpbGRHZW5yZXNNYXAoZ2VucmVJZHM6IG51bWJlcltdKTogUmVjb3JkPG51bWJlciwgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGdlbnJlcyA9IHRoaXMuZ2VucmVTZXJ2aWNlLm1hcEdlbnJlSWRzKGdlbnJlSWRzKTtcbiAgICAgICAgY29uc3QgZ2VucmVzTWFwOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGdlbnJlcy5mb3JFYWNoKGcgPT4ge1xuICAgICAgICAgICAgZ2VucmVzTWFwW2cuaWRdID0gZy5uYW1lO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGdlbnJlc01hcDtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQgeyBzZXRJY29uIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBTZWFyY2hNb3ZpZSB9IGZyb20gXCIuLi9tb2RlbHMvU2VhcmNoUmVzdWx0XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb3ZpZUNhcmQobW92aWU6IFNlYXJjaE1vdmllLCBnZW5yZXNNYXA6IFJlY29yZDxudW1iZXIsIHN0cmluZz4pOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0IGNhcmQgPSBhY3RpdmVEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjYXJkLmNsYXNzTmFtZSA9IFwiY2FyZFwiO1xuICBjYXJkLmlkID0gbW92aWUuaWQudG9TdHJpbmcoKTtcblxuICAvLyNyZWdpb24gUGhvdG9cbiAgY29uc3QgcGhvdG9EaXYgPSBhY3RpdmVEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBwaG90b0Rpdi5jbGFzc05hbWUgPSAnbW92aWUtcGhvdG8nO1xuICBjb25zdCBpbWcgPSBhY3RpdmVEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICBpbWcuc3JjID0gYGh0dHBzOi8vaW1hZ2UudG1kYi5vcmcvdC9wL3c1MDAke21vdmllLnBvc3Rlcl9wYXRofWA7XG4gIGltZy5hbHQgPSBtb3ZpZS50aXRsZTtcbiAgcGhvdG9EaXYuYXBwZW5kQ2hpbGQoaW1nKTtcbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEluZm9cbiAgY29uc3QgaW5mb0RpdiA9IGFjdGl2ZURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGluZm9EaXYuY2xhc3NOYW1lID0gXCJtb3ZpZS1pbmZvXCI7XG4gIFxuICBjb25zdCB0aXRsZUVsID0gYWN0aXZlRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImgyXCIpO1xuICB0aXRsZUVsLnRleHRDb250ZW50ID0gbW92aWUudGl0bGU7XG4gIGluZm9EaXYuYXBwZW5kQ2hpbGQodGl0bGVFbCk7XG5cbiAgY29uc3Qgb3JpZ2luYWxUaXRsZUVsID0gYWN0aXZlRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIG9yaWdpbmFsVGl0bGVFbC50ZXh0Q29udGVudCA9IGAoJHttb3ZpZS5vcmlnaW5hbF90aXRsZX0pYDtcbiAgb3JpZ2luYWxUaXRsZUVsLmNsYXNzTmFtZSA9IFwib3JpZ2luYWwtbmFtZVwiO1xuICBpbmZvRGl2LmFwcGVuZENoaWxkKG9yaWdpbmFsVGl0bGVFbCk7XG5cbiAgY29uc3Qgb3ZlcnZpZXdFbCA9IGFjdGl2ZURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xuICBvdmVydmlld0VsLnRleHRDb250ZW50ID0gbW92aWUub3ZlcnZpZXc7XG4gIGluZm9EaXYuYXBwZW5kQ2hpbGQob3ZlcnZpZXdFbCk7XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBHZW5yZXNcbiAgaWYobW92aWUuZ2VucmVfaWRzPy5sZW5ndGgpe1xuICAgIGNvbnN0IGdlbnJlc0RpdiA9IGFjdGl2ZURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZ2VucmVzRGl2LmNsYXNzTmFtZSA9IFwiZ2VucmVzXCI7XG4gICAgbW92aWUuZ2VucmVfaWRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgY29uc3QgZ2VucmUgPSBhY3RpdmVEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZ2VucmUuY2xhc3NOYW1lID0gXCJnZW5yZVwiO1xuICAgICAgY29uc3Qgc3BhbiA9IGFjdGl2ZURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGdlbnJlc01hcFtpZF0gPz8gXCJcIjtcbiAgICAgIGdlbnJlLmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgZ2VucmVzRGl2LmFwcGVuZENoaWxkKGdlbnJlKTtcbiAgICB9KTtcbiAgICBpbmZvRGl2LmFwcGVuZENoaWxkKGdlbnJlc0Rpdik7XG4gIH07XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFN1YmluZm9cbiAgY29uc3Qgc3ViSW5mb0RpdiA9IGFjdGl2ZURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHN1YkluZm9EaXYuY2xhc3NOYW1lID0gXCJtb3ZpZS1zdWJpbmZvXCI7XG4gIFxuICBjb25zdCB5ZWFyU3BhbiA9IGFjdGl2ZURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICB5ZWFyU3Bhbi5jbGFzc05hbWUgPSBcInJlYWxpc2UteWVhclwiO1xuICB5ZWFyU3Bhbi50ZXh0Q29udGVudCA9IG1vdmllLnJlbGVhc2VfZGF0ZSA/IG1vdmllLnJlbGVhc2VfZGF0ZS5zbGljZSgwLCA0KSA6IFwiXCI7XG4gIHN1YkluZm9EaXYuYXBwZW5kQ2hpbGQoeWVhclNwYW4pO1xuXG4gIGNvbnN0IHJhdGluZ0VsID0gcmVuZGVyU3RhcnMobW92aWUudm90ZV9hdmVyYWdlKTtcbiAgc3ViSW5mb0Rpdi5hcHBlbmRDaGlsZChyYXRpbmdFbCk7XG4gIGluZm9EaXYuYXBwZW5kQ2hpbGQoc3ViSW5mb0Rpdik7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIGFkdWx0XG4gIGlmKG1vdmllLmFkdWx0KXtcbiAgICBjb25zdCBhZHVsdEVsID0gYWN0aXZlRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBhZHVsdEVsLmNsYXNzTmFtZT0gXCJhZHVsdF9lbGVtZW50XCI7XG4gICAgc2V0SWNvbihhZHVsdEVsLCAnZmxhbWUnKTtcbiAgICBjYXJkLmFwcGVuZENoaWxkKGFkdWx0RWwpO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgY2FyZC5hcHBlbmRDaGlsZChwaG90b0Rpdik7XG4gIGNhcmQuYXBwZW5kQ2hpbGQoaW5mb0Rpdik7XG5cbiAgZnVuY3Rpb24gcmVuZGVyU3RhcnMocmF0aW5nOiBudW1iZXIpOiBIVE1MRGl2RWxlbWVudCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gYWN0aXZlRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChcInJhdGluZ1wiKTtcblxuICAgIGNvbnN0IGZ1bGxTdGFycyA9IE1hdGguZmxvb3IocmF0aW5nKTtcbiAgICBjb25zdCBwYXJ0aWFsID0gcmF0aW5nICUgMTtcbiAgICBjb25zdCBlbXB0eVN0YXJzID0gMTAgLSBmdWxsU3RhcnMgLSAocGFydGlhbCA+IDAgPyAxIDogMCk7XG5cbiAgICAvLyBmdWxsIHN0YXJzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmdWxsU3RhcnM7IGkrKykge1xuICAgICAgY29uc3Qgc3RhciA9IGFjdGl2ZURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgc3Rhci5jbGFzc0xpc3QuYWRkKFwic3RhclwiLCBcImZ1bGxcIik7XG4gICAgICBzdGFyLnRleHRDb250ZW50ID0gXCJcdTI2MDVcIjtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzdGFyKTtcbiAgICB9XG5cbiAgICAvLyBwYXJ0aWNhbCBzdGFyXG4gICAgaWYgKHBhcnRpYWwgPiAwKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gYWN0aXZlRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJzdGFyXCIsIFwiZW1wdHlcIik7XG4gICAgICB3cmFwcGVyLnRleHRDb250ZW50ID0gXCJcdTI2MDVcIjtcblxuICAgICAgY29uc3Qgb3ZlcmxheSA9IGFjdGl2ZURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKFwic3RhclwiLCBcInBhcnRcIik7XG4gICAgICBvdmVybGF5LnRleHRDb250ZW50ID0gXCJcdTI2MDVcIjtcbiAgICAgIG92ZXJsYXkuc3R5bGUud2lkdGggPSBgJHtwYXJ0aWFsICogMTAwfSVgO1xuXG4gICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuICAgIH1cblxuICAgIC8vIGVtcHR5IHN0YXJzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbXB0eVN0YXJzOyBpKyspIHtcbiAgICAgIGNvbnN0IHN0YXIgPSBhY3RpdmVEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIHN0YXIuY2xhc3NMaXN0LmFkZChcInN0YXJcIiwgXCJlbXB0eVwiKTtcbiAgICAgIHN0YXIudGV4dENvbnRlbnQgPSBcIlx1MjYwNVwiO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHN0YXIpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cblxuICByZXR1cm4gY2FyZDtcbn1cblxuIiwgImltcG9ydCB7IFNlYXJjaFJlc3VsdCwgU2VhcmNoTW92aWUgfSBmcm9tIFwiLi4vbW9kZWxzL1NlYXJjaFJlc3VsdFwiO1xuaW1wb3J0IHsgY3JlYXRlTW92aWVDYXJkIH0gZnJvbSBcIi4vTW92aWVDYXJkXCI7XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hWaWV3IHtcbiAgICBwcml2YXRlIG1vdmllTGlzdEVsOiBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKG1vdmllTGlzdEVsOiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0aGlzLm1vdmllTGlzdEVsID0gbW92aWVMaXN0RWw7XG4gICAgfVxuXG4gICAgc2hvd0xvYWRpbmcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW92aWVMaXN0RWwuZW1wdHkoKTtcbiAgICAgICAgdGhpcy5tb3ZpZUxpc3RFbC5jcmVhdGVFbCgnc3BhbicsIHsgdGV4dDogXCJMb2FkaW5nLi4uXCIgfSk7XG4gICAgfVxuXG4gICAgc2hvd1Jlc3VsdHMocmVzdWx0OiBTZWFyY2hSZXN1bHQsIGdlbnJlc01hcDogUmVjb3JkPG51bWJlciwgc3RyaW5nPiwgb25Nb3ZpZUNsaWNrOiAobW92aWVJZDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW92aWVMaXN0RWwuZW1wdHkoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5tb3ZpZUxpc3RFbC5jcmVhdGVEaXYoeyB0ZXh0OiBcIk5vdGhpbmcgZm91bmQoXCIgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnJlc3VsdHMuZm9yRWFjaCgobW92aWU6IFNlYXJjaE1vdmllKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYXJkID0gY3JlYXRlTW92aWVDYXJkKG1vdmllLCBnZW5yZXNNYXApO1xuICAgICAgICAgICAgY2FyZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBvbk1vdmllQ2xpY2sobW92aWUuaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLm1vdmllTGlzdEVsLmFwcGVuZENoaWxkKGNhcmQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaG93RXJyb3IoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW92aWVMaXN0RWwuZW1wdHkoKTtcbiAgICAgICAgdGhpcy5tb3ZpZUxpc3RFbC5jcmVhdGVEaXYoeyB0ZXh0OiBcIk9vcHMsIHNvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLlwiIH0pO1xuICAgIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUEsb0JBRU87OztBQ0ZQLElBQUFDLG1CQUFzQzs7O0FDQXRDLHNCQUFnRDtBQUV6QyxJQUFNLGNBQU4sY0FBMEIscUNBQTRCO0FBQUEsRUFHekQsWUFBWSxLQUFVLFNBQTBCO0FBQzVDLFVBQU0sS0FBSyxPQUFPO0FBQ2xCLFNBQUssVUFBVTtBQUFBLEVBQ25CO0FBQUEsRUFFQSxlQUFlLFVBQTJCO0FBQ3RDLFVBQU0sUUFBUSxLQUFLLElBQUksTUFBTSxTQUFTO0FBQ3RDLFVBQU0sYUFBYSxTQUFTLFlBQVk7QUFFeEMsV0FBTyxNQUFNO0FBQUEsTUFBTyxVQUNoQixLQUFLLGNBQWMsUUFDaEIsS0FBSyxLQUFLLGtCQUFrQixFQUFFLFNBQVMsVUFBVTtBQUFBLElBQ3hEO0FBQUEsRUFFSjtBQUFBLEVBQ0EsaUJBQWlCLE1BQWEsSUFBdUI7QUFDakQsT0FBRyxRQUFRLEtBQUssSUFBSTtBQUFBLEVBQ3hCO0FBQUEsRUFDQSxpQkFBaUIsTUFBbUI7QUFDaEMsU0FBSyxRQUFRLFFBQVEsS0FBSztBQUMxQixTQUFLLFFBQVEsUUFBUSxPQUFPO0FBQUEsRUFDaEM7QUFDSjs7O0FDekJBLElBQUFDLG1CQUF3QjtBQUVqQixTQUFTLDBCQUEwQixhQUEwQixRQUFtQjtBQUMvRSxRQUFNLG1CQUFtQixlQUFlLHVCQUF1QjtBQUMvRCxtQkFBaUIsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsbUJBQWlCLFNBQVMsS0FBSztBQUFBLElBQzNCLE1BQU07QUFBQSxFQUNWLENBQUM7QUFFRCxNQUFJLHlCQUFRLFdBQVcsRUFDdEIsUUFBUSxlQUFlLEVBQ3ZCLFFBQVEsZ0JBQWdCLEVBQ3hCLFVBQVUsUUFBTTtBQUNiLFFBQUk7QUFDSixVQUFJLFlBQVksT0FBTyxLQUFLLEdBQUcsT0FBTztBQUFBLElBQ3RDLFFBQVE7QUFBQSxJQUFDO0FBQUM7QUFFVixPQUFHLGVBQWUsa0NBQWtDLEVBQ25ELFNBQVMsT0FBTyxTQUFTLFlBQVksRUFDckMsU0FBUyxPQUFNLG9CQUFtQjtBQUMvQixhQUFPLFNBQVMsZUFBZTtBQUMvQixZQUFNLE9BQU8sYUFBYTtBQUFBLElBQzlCLENBQUM7QUFDRCxPQUFHLFFBQVEsU0FBUyxrQkFBa0I7QUFBQSxFQUMxQyxDQUFDO0FBQ0w7OztBQzNCSixJQUFBQyxtQkFBd0I7QUFHakIsU0FBVSxvQkFBb0IsYUFBMEIsUUFBbUI7QUFDOUUsUUFBTSxhQUFhLGVBQWUsdUJBQXVCO0FBRXpELGFBQVcsU0FBUyxNQUFNO0FBQzFCLGFBQVcsV0FBVyxxQkFBcUI7QUFDM0MsYUFBVyxTQUFTLEtBQUs7QUFBQSxJQUN6QixNQUFNO0FBQUEsSUFDRixNQUFNO0FBQUEsRUFDVixDQUFDO0FBRUQsTUFBSSx5QkFBUSxXQUFXLEVBQ2xCLFFBQVEsY0FBYyxFQUN0QixRQUFRLFVBQVUsRUFDbEIsUUFBUSxDQUFDLFNBQVM7QUFDZixTQUNLLGVBQWUsZ0JBQWdCLEVBQy9CLFNBQVMsT0FBTyxTQUFTLE1BQU0sRUFDL0IsU0FBUyxPQUFPLFVBQVU7QUFDdkIsYUFBTyxTQUFTLFNBQVM7QUFDekIsWUFBTSxPQUFPLGFBQWE7QUFBQSxJQUM5QixDQUFDO0FBQ0wsU0FBSyxRQUFRLFNBQVMsa0JBQWtCO0FBQUEsRUFDNUMsQ0FBQztBQUNUOzs7QUMxQkEsSUFBQUMsbUJBQXdCOzs7QUNBeEIsSUFBQUMsbUJBQXlDOzs7QUNBekM7QUFBQSxFQUNJO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLElBQ0ksV0FBYTtBQUFBLElBQ2IsY0FBZ0I7QUFBQSxJQUNoQixNQUFRO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxJQUNJLFdBQWE7QUFBQSxJQUNiLGNBQWdCO0FBQUEsSUFDaEIsTUFBUTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQUEsSUFDSSxXQUFhO0FBQUEsSUFDYixjQUFnQjtBQUFBLElBQ2hCLE1BQVE7QUFBQSxFQUNaO0FBQ0o7OztBQ2w2Qk8sSUFBTSxZQUF3Qjs7O0FGSDlCLElBQU0sa0JBQU4sY0FBOEIsc0NBQStCO0FBQUEsRUFHaEUsWUFBWSxLQUFVLFNBQTJCO0FBQzdDLFVBQU0sS0FBSyxPQUFPO0FBQ2xCLFNBQUssVUFBVTtBQUFBLEVBQ25CO0FBQUEsRUFFQSxlQUFlLFVBQThCO0FBQ3pDLFVBQU0sUUFBUSxTQUFTLFlBQVk7QUFDbkMsUUFBSSxDQUFDLE1BQU8sUUFBTyxVQUFVLE1BQU0sR0FBRyxFQUFFO0FBRXhDLFdBQU8sVUFBVTtBQUFBLE1BQU8sV0FDbkIsS0FBSyxRQUFRLEtBQUssZ0JBQWdCLElBQUksWUFBWSxFQUFFLFNBQVMsS0FBSyxLQUNoRSxLQUFLLFVBQVUsWUFBWSxFQUFFLFNBQVMsS0FBSztBQUFBLElBQ2xELEVBQUUsTUFBTSxHQUFHLEVBQUU7QUFBQSxFQUNqQjtBQUFBLEVBQ0EsaUJBQWlCLE1BQWdCLElBQXVCO0FBQ3BELE9BQUcsVUFBVTtBQUFBLE1BQ1QsTUFBTSxLQUFLLFFBQVEsS0FBSztBQUFBLElBQzVCLENBQUM7QUFFRCxPQUFHLFVBQVU7QUFBQSxNQUNULEtBQUs7QUFBQSxNQUNMLE1BQU0sS0FBSztBQUFBLElBQ2YsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUNBLGlCQUFpQixNQUFzQjtBQUNuQyxTQUFLLFFBQVEsUUFBUSxLQUFLLFFBQVEsS0FBSztBQUN2QyxTQUFLLFFBQVEsUUFBUSxLQUFLLElBQUksS0FBSztBQUNuQyxTQUFLLFFBQVEsUUFBUSxPQUFPO0FBQUEsRUFDaEM7QUFDSjs7O0FEOUJPLFNBQVMsc0JBQXNCLGFBQTBCLFFBQW1CO0FBQy9FLFFBQU0sT0FBTyxlQUFlLHVCQUF1QjtBQUNuRCxPQUFLLFNBQVMsUUFBUTtBQUFBLElBQ2xCLE1BQU07QUFBQSxFQUNWLENBQUM7QUFFRCxNQUFJLHlCQUFRLFdBQVcsRUFDbEIsUUFBUSxxQkFBcUIsRUFDN0IsUUFBUSxJQUFJLEVBQ1osVUFBVSxRQUFNO0FBQ2IsUUFBRztBQUNDLFVBQUksZ0JBQWdCLE9BQU8sS0FBSyxHQUFHLE9BQU87QUFBQSxJQUM5QyxRQUFRO0FBQUEsSUFBQztBQUNULE9BQUcsZUFBZSwwRkFBd0MsRUFDckQsU0FBUyx1QkFBdUIsT0FBTyxTQUFTLFFBQVEsQ0FBQyxFQUN6RCxTQUFTLE9BQU8sVUFBVTtBQUN2QixZQUFNLGlCQUFpQixHQUFHLFFBQVEsUUFBUSxLQUFLO0FBQy9DLFVBQUksZ0JBQWdCO0FBQ2hCLGVBQU8sU0FBUyxXQUFXO0FBQUEsTUFDL0IsT0FBTztBQUNILGNBQU0sUUFBUSxVQUFVO0FBQUEsVUFBSyxRQUN2QixFQUFFLFFBQVEsRUFBRSxnQkFBaUIsSUFBSSxZQUFZLE1BQU0sTUFBTSxZQUFZLEtBQ3BFLEVBQUUsVUFBVSxZQUFZLE1BQU0sTUFBTSxZQUFZO0FBQUEsUUFDdkQ7QUFDQSxlQUFPLFNBQVMsV0FBVyxRQUFRLE1BQU0sWUFBWTtBQUFBLE1BQ3pEO0FBQ0EsWUFBTSxPQUFPLGFBQWE7QUFDMUIsYUFBTyxHQUFHLFFBQVEsUUFBUSxLQUFLO0FBQUEsSUFDbkMsQ0FBQztBQUNMLE9BQUcsUUFBUSxTQUFTLGtCQUFrQjtBQUFBLEVBQzFDLENBQUM7QUFDVDtBQUVBLFNBQVMsdUJBQXVCLEtBQXFCO0FBQ2pELFFBQU0sUUFBUSxVQUFVLEtBQUssT0FBSyxFQUFFLGNBQWMsR0FBRztBQUNyRCxTQUFPLFFBQVMsTUFBTSxRQUFRLE1BQU0sZUFBZ0I7QUFDeEQ7OztBSXpDQSxJQUFBQyxtQkFBa0Q7QUFFM0MsSUFBTSxnQkFBTixjQUE0QixzQ0FBOEI7QUFBQSxFQUc3RCxZQUFZLEtBQVUsU0FBMEI7QUFDNUMsVUFBTSxLQUFLLE9BQU87QUFDbEIsU0FBSyxVQUFVO0FBQUEsRUFDbkI7QUFBQSxFQUVBLGVBQWUsVUFBNkI7QUFDeEMsVUFBTSxVQUFVLEtBQUssSUFBSSxNQUFNLGtCQUFrQixFQUM1QyxPQUFPLENBQUMsTUFBb0IsYUFBYSx3QkFBTztBQUVyRCxVQUFNLGFBQWEsU0FBUyxZQUFZO0FBRXhDLFdBQU8sUUFBUTtBQUFBLE1BQU8sWUFDbEIsT0FBTyxLQUFLLFlBQVksRUFBRSxTQUFTLFVBQVU7QUFBQSxJQUNqRDtBQUFBLEVBQ0o7QUFBQSxFQUVBLGlCQUFpQixNQUFlLElBQXVCO0FBQ25ELE9BQUcsUUFBUSxLQUFLLElBQUk7QUFBQSxFQUN4QjtBQUFBLEVBQ0EsaUJBQWlCLE1BQXFCO0FBQ2xDLFNBQUssUUFBUSxRQUFRLEtBQUs7QUFDMUIsU0FBSyxRQUFRLFFBQVEsT0FBTztBQUFBLEVBQ2hDO0FBQ0o7OztBQzFCQSxJQUFBQyxtQkFBd0I7QUFFakIsU0FBUywyQkFBMkIsYUFBMEIsUUFBbUI7QUFDaEYsTUFBSSx5QkFBUSxXQUFXLEVBQ3RCLFFBQVEsZ0JBQWdCLEVBQ3hCLFFBQVEseURBQXlELEVBQ2pFLFVBQVUsUUFBTTtBQUNiLFFBQUk7QUFDSixVQUFJLGNBQWMsT0FBTyxLQUFLLEdBQUcsT0FBTztBQUFBLElBQ3hDLFFBQVE7QUFBQSxJQUFDO0FBQUM7QUFFVixPQUFHLGVBQWUsa0JBQWtCLEVBQ25DLFNBQVMsT0FBTyxTQUFTLFlBQVksRUFDckMsU0FBUyxPQUFNLHFCQUFvQjtBQUNoQyxhQUFPLFNBQVMsZUFBZTtBQUMvQixZQUFNLE9BQU8sYUFBYTtBQUFBLElBQzlCLENBQUM7QUFDRCxPQUFHLFFBQVEsU0FBUyxrQkFBa0I7QUFBQSxFQUMxQyxDQUFDO0FBQ0w7OztBQ3JCSixJQUFBQyxtQkFBd0I7QUFHakIsU0FBVSxtQkFBbUIsYUFBMEIsUUFBbUI7QUFDN0UsTUFBSSx5QkFBUSxXQUFXLEVBQ2xCLFFBQVEsY0FBYyxFQUN0QixRQUFRLHdCQUF3QixFQUNoQyxVQUFVLFlBQVU7QUFDakIsV0FDSyxTQUFTLE9BQU8sU0FBUyxhQUFhLEVBQ3RDLFNBQVMsT0FBTyxVQUFVO0FBQ3ZCLGFBQU8sU0FBUyxnQkFBZ0I7QUFDaEMsWUFBTSxPQUFPLGFBQWE7QUFBQSxJQUM5QixDQUFDO0FBQUEsRUFDVCxDQUFDO0FBQ1Q7OztBVkNPLElBQU0sbUJBQXNDO0FBQUEsRUFDbEQsUUFBUTtBQUFBLEVBQ1IsY0FBYztBQUFBLEVBQ2QsVUFBVTtBQUFBLEVBQ1YsY0FBYztBQUFBLEVBQ2QsZUFBZTtBQUNoQjtBQUVPLElBQU0sc0JBQU4sY0FBa0Msa0NBQWlCO0FBQUEsRUFHekQsWUFBWSxLQUFVLFFBQW1CO0FBQ3hDLFVBQU0sS0FBSyxNQUFNO0FBQ2pCLFNBQUssU0FBUztBQUFBLEVBQ2Y7QUFBQSxFQUVBLFVBQWdCO0FBQ2YsVUFBTSxFQUFFLFlBQVksSUFBSTtBQUV4QixnQkFBWSxNQUFNO0FBQ2xCLDhCQUEwQixhQUFhLEtBQUssTUFBTTtBQUNsRCwrQkFBMkIsYUFBYSxLQUFLLE1BQU07QUFDbkQsd0JBQW9CLGFBQWEsS0FBSyxNQUFNO0FBQzVDLDBCQUFzQixhQUFhLEtBQUssTUFBTTtBQUM5Qyx1QkFBbUIsYUFBYSxLQUFLLE1BQU07QUFBQSxFQUM1QztBQUNEOzs7QVcxQ0EsSUFBQUMsb0JBQTBDOzs7QUNBMUMsSUFBQUMsb0JBQTJCO0FBSXBCLElBQU0saUJBQU4sTUFBcUI7QUFBQSxFQUt4QixZQUFZLFVBQTRCO0FBRnhDLFNBQWlCLFdBQVc7QUFHeEIsU0FBSyxTQUFTLFNBQVM7QUFDdkIsU0FBSyxXQUFXLFNBQVM7QUFBQSxFQUM3QjtBQUFBLEVBRUEsTUFBZ0IsY0FBaUIsVUFBa0IsU0FBaUMsQ0FBQyxHQUFlO0FBQ2hHLFVBQU0sTUFBTSxJQUFJLElBQUssR0FBRyxLQUFLLFFBQVEsR0FBRyxRQUFRLEVBQUU7QUFDbEQsUUFBSSxhQUFhLE9BQU8sV0FBVyxLQUFLLE1BQU07QUFDOUMsUUFBSSxhQUFhLE9BQU8sWUFBWSxLQUFLLFFBQVE7QUFFakQsZUFBVyxDQUFDLEtBQUssS0FBSyxLQUFLLE9BQU8sUUFBUSxNQUFNLEdBQUU7QUFDOUMsVUFBSSxhQUFhLE9BQU8sS0FBSyxLQUFLO0FBQUEsSUFDdEM7QUFFQSxVQUFNLFdBQVcsVUFBTSw4QkFBVyxJQUFJLFNBQVMsQ0FBQztBQUNoRCxRQUFHLFNBQVMsV0FBVyxLQUFJO0FBQ3ZCLFlBQU0sSUFBSSxNQUFNLHVCQUF1QixRQUFRLEVBQUU7QUFBQSxJQUNyRDtBQUVBLFFBQUksU0FBUyxTQUFTLE9BQU8sU0FBUyxVQUFVLEtBQUk7QUFDaEQsWUFBTSxJQUFJLE1BQU0sbUJBQW1CLFNBQVMsTUFBTSxJQUFJLFNBQVMsSUFBSSxFQUFFO0FBQUEsSUFDekU7QUFDQSxXQUFPLFNBQVM7QUFBQSxFQUNwQjtBQUFBLEVBRUEsTUFBYSxjQUErQjtBQUN4QyxVQUFNLE9BQU8sTUFBTSxLQUFLLGNBQTRCLGlCQUFpQjtBQUNyRSxXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUNKOzs7QUNqQ08sSUFBTSxtQkFBTixjQUErQixlQUFlO0FBQUEsRUFHakQsWUFBWSxVQUE2QjtBQUNyQyxVQUFNLFFBQVE7QUFIbEIsU0FBUSxXQUFXLG9CQUFJLElBQW9CO0FBQUEsRUFJM0M7QUFBQSxFQUVBLE1BQWEsT0FBcUI7QUFDOUIsVUFBTSxPQUFPLE1BQU0sS0FBSyxjQUE2QixtQkFBbUI7QUFDeEUsU0FBSyxPQUFPLFFBQVEsQ0FBQyxNQUFhO0FBQzlCLFdBQUssU0FBUyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7QUFBQSxJQUNsQyxDQUFDO0FBQUEsRUFDTDtBQUFBLEVBQ08sWUFBWSxLQUF3QjtBQUN2QyxXQUFPLElBQUksSUFBSSxTQUFPO0FBQUEsTUFDbEI7QUFBQSxNQUNBLE1BQU0sS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLO0FBQUEsSUFDbkMsRUFBRTtBQUFBLEVBQ047QUFFSjs7O0FDbkJPLElBQU0sbUJBQU4sY0FBK0IsZUFBZTtBQUFBLEVBR2pELFlBQVksVUFBNkI7QUFDckMsVUFBTSxRQUFRO0FBQ2QsU0FBSyxlQUFlLFNBQVM7QUFBQSxFQUNqQztBQUFBLEVBRUEsTUFBYSxZQUFhLE9BQXFDO0FBQzNELFVBQU0sY0FBYztBQUVwQixRQUFJLFlBQVksS0FBSyxLQUFLLEdBQUc7QUFDekIsYUFBTyxNQUFNLEtBQUssaUJBQWlCLEtBQUs7QUFBQSxJQUM1QyxPQUFPO0FBQ0gsYUFBTyxNQUFNLEtBQUssa0JBQWtCLEtBQUs7QUFBQSxJQUM3QztBQUFBLEVBQ0o7QUFBQSxFQUVBLE1BQWEsYUFBYSxJQUFrQztBQUN4RCxRQUFJO0FBQ0EsYUFBTyxNQUFNLEtBQUssY0FBcUIsVUFBVSxHQUFHLFNBQVMsQ0FBQyxFQUFFO0FBQUEsSUFDcEUsU0FBUyxPQUFNO0FBQ1gsVUFBSSxpQkFBaUIsU0FBUyxNQUFNLFFBQVEsU0FBUyxLQUFLLEdBQUU7QUFDeEQsZUFBTztBQUFBLE1BQ1g7QUFDQSxZQUFNO0FBQUEsSUFDVjtBQUFBLEVBQ0o7QUFBQSxFQUVBLE1BQWMsaUJBQWlCLE9BQXFDO0FBQ2hFLFFBQUk7QUFDSixRQUFJO0FBQ0osUUFBSTtBQUNBLGFBQU8sTUFBTSxLQUFLLGNBQTRCLFNBQVMsS0FBSyxJQUFJO0FBQUEsUUFDNUQsaUJBQWlCO0FBQUEsTUFDckIsQ0FBQztBQUNELGdCQUFVLEtBQUssaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBcUIsR0FBRztBQUNqRSxhQUFPO0FBQUEsUUFDSCxNQUFNO0FBQUEsUUFDTixTQUFTO0FBQUEsUUFDVCxhQUFhO0FBQUEsUUFDYixlQUFlLE9BQU87QUFBQSxNQUMxQjtBQUFBLElBQ0osU0FBUyxPQUFNO0FBQ1gsVUFBSSxpQkFBaUIsU0FBUyxNQUFNLFFBQVEsU0FBUyxLQUFLLEdBQUU7QUFDeEQsZUFBTztBQUFBLFVBQ0gsTUFBTTtBQUFBLFVBQ04sU0FBUyxDQUFDO0FBQUEsVUFDVixhQUFhO0FBQUEsVUFDYixlQUFlO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQ0EsWUFBTTtBQUFBLElBQ1Y7QUFBQSxFQUNKO0FBQUEsRUFFQSxNQUFjLGtCQUFrQixPQUFxQztBQUNqRSxVQUFNLE9BQU8sTUFBTSxLQUFLLGNBQTRCLGlCQUFpQjtBQUFBLE1BQ2pFO0FBQUEsTUFDQSxlQUFlLE9BQU8sS0FBSyxZQUFZO0FBQUEsSUFDM0MsQ0FBQztBQUNELFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQ3JFQSxJQUFBQyxvQkFBNEM7QUFHckMsSUFBTSxtQkFBTixNQUF1QjtBQUFBLEVBRzFCLFlBQVksUUFBZSxtQkFBMkI7QUFDbEQsU0FBSyxRQUFRO0FBQ2IsU0FBSyxvQkFBb0I7QUFBQSxFQUM3QjtBQUFBLEVBRUEsTUFBTSxnQkFBZ0IsT0FBYyxjQUFzQztBQUN0RSxVQUFNLGVBQWUsS0FBSyxzQkFBc0IsWUFBWTtBQUM1RCxRQUFJLEVBQUUsd0JBQXdCLDBCQUFRO0FBQ2xDLFlBQU0sTUFBTSx5QkFBeUI7QUFBQSxJQUN6QztBQUFDO0FBQ0QsVUFBTSxXQUFXLEdBQUcsTUFBTSxNQUFNLFFBQVEsaUJBQWlCLEdBQUcsQ0FBQztBQUU3RCxRQUFHLEtBQUssc0JBQXNCLEdBQUcsS0FBSyxpQkFBaUIsSUFBSSxRQUFRLEtBQUssR0FBRTtBQUN0RSxZQUFNLE1BQU0sNkJBQTZCO0FBQUEsSUFDN0M7QUFFQSxVQUFNLGtCQUFrQixNQUFNLEtBQUssTUFBTSxLQUFLLFlBQVk7QUFDMUQsVUFBTSxjQUFjLEtBQUssNEJBQTRCLE9BQU8sZUFBZTtBQUMzRSxVQUFNLFdBQVcsTUFBTSxLQUFLLE1BQU0sT0FBTyxHQUFHLEtBQUssaUJBQWlCLElBQUksUUFBUSxPQUFPLFdBQVc7QUFDaEcsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVRLHNCQUFzQixVQUF1QztBQUNqRSxVQUFNLE9BQU8sS0FBSyxNQUFNLHNCQUFzQixRQUFRO0FBQ3RELFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFUSw0QkFBNEIsT0FBYyxVQUEwQjtBQUN4RSxXQUFPLFNBQ04sUUFBUSxlQUFlLE1BQU0sUUFBUSxTQUFTLE9BQU8sRUFDckQsUUFBUSxvQkFBb0IsSUFBSSxNQUFNLHVCQUF1QixRQUFRLEVBQUUsR0FBRyxFQUMxRSxRQUFRLGdCQUFnQixJQUFJLE9BQU8sTUFBTSxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQ3pELFFBQVEsZ0JBQWdCLElBQUksTUFBTSxPQUFPLElBQUksT0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUNsRixRQUFRLGtCQUFrQixNQUFNLFlBQVksRUFBRSxFQUM5QyxRQUFRLFlBQVksT0FBTyxNQUFNLE1BQU0sRUFBRSxDQUFDLEVBQzFDLFFBQVEsaUJBQWlCLE1BQU0sV0FBVyxFQUFFLEVBQzVDLFFBQVEsd0JBQXdCLElBQUksTUFBTSxnQkFBZ0IsSUFBSSxPQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQ3BHLFFBQVEsMkJBQTJCLE1BQU0scUJBQXFCLEVBQUUsRUFDaEUsUUFBUSx3QkFBd0IsSUFBSSxNQUFNLGtCQUFrQixFQUFFLEdBQUcsRUFDakUsUUFBUSxrQkFBa0IsSUFBSSxNQUFNLFlBQVksRUFBRSxHQUFHLEVBQ3JELFFBQVEsb0JBQW9CLE9BQU8sTUFBTSxVQUFVLENBQUMsRUFDcEQsUUFBUSxxQkFBcUIsTUFBTSxlQUFlLEVBQUUsRUFDcEQsUUFBUSw4QkFBOEIsSUFBSSxNQUFNLHFCQUFxQixJQUFJLE9BQUssTUFBTSxFQUFFLElBQUksS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFDOUcsUUFBUSw4QkFBOEIsSUFBSSxNQUFNLHFCQUFxQixJQUFJLE9BQUssTUFBTSxFQUFFLElBQUksS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFDOUcsUUFBUSxzQkFBc0IsS0FBSyxXQUFXLE1BQU0sWUFBWSxLQUFLLEVBQUUsRUFDdkUsUUFBUSxpQkFBaUIsT0FBTyxNQUFNLE9BQU8sQ0FBQyxFQUM5QyxRQUFRLGlCQUFpQixPQUFPLE1BQU0sT0FBTyxDQUFDLEVBQzlDLFFBQVEsa0JBQWtCLE9BQU8sTUFBTSxZQUFZLEVBQUUsQ0FBQyxFQUN0RCxRQUFRLDBCQUEwQixJQUFJLE1BQU0saUJBQWlCLElBQUksT0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUN0RyxRQUFRLGdCQUFnQixNQUFNLFVBQVUsRUFBRSxFQUMxQyxRQUFRLGlCQUFpQixJQUFJLE1BQU0sV0FBVyxFQUFFLEdBQUcsRUFDbkQsUUFBUSxlQUFlLElBQUksTUFBTSxTQUFTLEVBQUUsR0FBRyxFQUMvQyxRQUFRLHNCQUFzQixPQUFPLE1BQU0sWUFBWSxDQUFDLEVBQ3hELFFBQVEsb0JBQW9CLE9BQU8sTUFBTSxVQUFVLENBQUM7QUFBQSxFQUN6RDtBQUFBLEVBRVEsV0FBVyxTQUFpQixTQUFpQixXQUFXLFNBQThDO0FBQzFHLFVBQU0sT0FBTyxJQUFJLEtBQUssT0FBTztBQUM3QixXQUFPLEtBQUssbUJBQW1CLFFBQVEsT0FBTztBQUFBLEVBQ2xEO0FBRUo7OztBQzNETyxJQUFNLG1CQUFOLE1BQXVCO0FBQUEsRUFNMUIsWUFBWSxLQUFVLFVBQTZCLFFBQW1CO0FBQ2xFLFNBQUssZUFBZSxJQUFJLGlCQUFpQixRQUFRO0FBQ2pELFNBQUssZUFBZSxJQUFJLGlCQUFpQixRQUFRO0FBQ2pELFNBQUssbUJBQW1CLElBQUksaUJBQWlCLE9BQU8sSUFBSSxPQUFPLFNBQVMsWUFBWTtBQUNwRixTQUFLLGVBQWUsU0FBUztBQUFBLEVBQ2pDO0FBQUEsRUFFQSxNQUFNLE9BQXNCO0FBQ3hCLFVBQU0sS0FBSyxhQUFhLEtBQUs7QUFBQSxFQUNqQztBQUFBLEVBRUEsTUFBTSxPQUFPLE9BQXNDO0FBQy9DLFdBQU8sTUFBTSxLQUFLLGFBQWEsWUFBWSxLQUFLO0FBQUEsRUFDcEQ7QUFBQSxFQUVBLE1BQU0sYUFBYSxJQUFZO0FBQzNCLFdBQU8sTUFBTSxLQUFLLGFBQWEsYUFBYSxFQUFFO0FBQUEsRUFDbEQ7QUFBQSxFQUVBLE1BQU0sV0FBVyxTQUF3QztBQUNyRCxVQUFNLFFBQVEsTUFBTSxLQUFLLGFBQWEsYUFBYSxPQUFPO0FBQzFELFFBQUksQ0FBQyxPQUFPO0FBQ1IsYUFBTztBQUFBLElBQ1g7QUFFQSxVQUFNLE9BQU8sTUFBTSxLQUFLLGlCQUFpQixnQkFBZ0IsT0FBTyxLQUFLLFlBQVk7QUFDakYsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLGVBQWUsVUFBNEM7QUFDdkQsVUFBTSxTQUFTLEtBQUssYUFBYSxZQUFZLFFBQVE7QUFDckQsVUFBTSxZQUFvQyxDQUFDO0FBQzNDLFdBQU8sUUFBUSxPQUFLO0FBQ2hCLGdCQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUU7QUFBQSxJQUN4QixDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDbkRBLElBQUFDLG9CQUF3QjtBQUdqQixTQUFTLGdCQUFnQixPQUFvQixXQUFnRDtBQUNsRyxRQUFNLE9BQU8sZUFBZSxjQUFjLEtBQUs7QUFDL0MsT0FBSyxZQUFZO0FBQ2pCLE9BQUssS0FBSyxNQUFNLEdBQUcsU0FBUztBQUc1QixRQUFNLFdBQVcsZUFBZSxjQUFjLEtBQUs7QUFDbkQsV0FBUyxZQUFZO0FBQ3JCLFFBQU0sTUFBTSxlQUFlLGNBQWMsS0FBSztBQUM5QyxNQUFJLE1BQU0sa0NBQWtDLE1BQU0sV0FBVztBQUM3RCxNQUFJLE1BQU0sTUFBTTtBQUNoQixXQUFTLFlBQVksR0FBRztBQUl4QixRQUFNLFVBQVUsZUFBZSxjQUFjLEtBQUs7QUFDbEQsVUFBUSxZQUFZO0FBRXBCLFFBQU0sVUFBVSxlQUFlLGNBQWMsSUFBSTtBQUNqRCxVQUFRLGNBQWMsTUFBTTtBQUM1QixVQUFRLFlBQVksT0FBTztBQUUzQixRQUFNLGtCQUFrQixlQUFlLGNBQWMsTUFBTTtBQUMzRCxrQkFBZ0IsY0FBYyxJQUFJLE1BQU0sY0FBYztBQUN0RCxrQkFBZ0IsWUFBWTtBQUM1QixVQUFRLFlBQVksZUFBZTtBQUVuQyxRQUFNLGFBQWEsZUFBZSxjQUFjLEdBQUc7QUFDbkQsYUFBVyxjQUFjLE1BQU07QUFDL0IsVUFBUSxZQUFZLFVBQVU7QUFJOUIsTUFBRyxNQUFNLFdBQVcsUUFBTztBQUN6QixVQUFNLFlBQVksZUFBZSxjQUFjLEtBQUs7QUFDcEQsY0FBVSxZQUFZO0FBQ3RCLFVBQU0sVUFBVSxRQUFRLFFBQU07QUFDNUIsWUFBTSxRQUFRLGVBQWUsY0FBYyxLQUFLO0FBQ2hELFlBQU0sWUFBWTtBQUNsQixZQUFNLE9BQU8sZUFBZSxjQUFjLE1BQU07QUFDaEQsV0FBSyxjQUFjLFVBQVUsRUFBRSxLQUFLO0FBQ3BDLFlBQU0sWUFBWSxJQUFJO0FBQ3RCLGdCQUFVLFlBQVksS0FBSztBQUFBLElBQzdCLENBQUM7QUFDRCxZQUFRLFlBQVksU0FBUztBQUFBLEVBQy9CO0FBQUM7QUFLRCxRQUFNLGFBQWEsZUFBZSxjQUFjLEtBQUs7QUFDckQsYUFBVyxZQUFZO0FBRXZCLFFBQU0sV0FBVyxlQUFlLGNBQWMsTUFBTTtBQUNwRCxXQUFTLFlBQVk7QUFDckIsV0FBUyxjQUFjLE1BQU0sZUFBZSxNQUFNLGFBQWEsTUFBTSxHQUFHLENBQUMsSUFBSTtBQUM3RSxhQUFXLFlBQVksUUFBUTtBQUUvQixRQUFNLFdBQVcsWUFBWSxNQUFNLFlBQVk7QUFDL0MsYUFBVyxZQUFZLFFBQVE7QUFDL0IsVUFBUSxZQUFZLFVBQVU7QUFLOUIsTUFBRyxNQUFNLE9BQU07QUFDYixVQUFNLFVBQVUsZUFBZSxjQUFjLEtBQUs7QUFDbEQsWUFBUSxZQUFXO0FBQ25CLG1DQUFRLFNBQVMsT0FBTztBQUN4QixTQUFLLFlBQVksT0FBTztBQUFBLEVBQzFCO0FBSUEsT0FBSyxZQUFZLFFBQVE7QUFDekIsT0FBSyxZQUFZLE9BQU87QUFFeEIsV0FBUyxZQUFZLFFBQWdDO0FBQ25ELFVBQU0sWUFBWSxlQUFlLGNBQWMsS0FBSztBQUNwRCxjQUFVLFVBQVUsSUFBSSxRQUFRO0FBRWhDLFVBQU0sWUFBWSxLQUFLLE1BQU0sTUFBTTtBQUNuQyxVQUFNLFVBQVUsU0FBUztBQUN6QixVQUFNLGFBQWEsS0FBSyxhQUFhLFVBQVUsSUFBSSxJQUFJO0FBR3ZELGFBQVMsSUFBSSxHQUFHLElBQUksV0FBVyxLQUFLO0FBQ2xDLFlBQU0sT0FBTyxlQUFlLGNBQWMsTUFBTTtBQUNoRCxXQUFLLFVBQVUsSUFBSSxRQUFRLE1BQU07QUFDakMsV0FBSyxjQUFjO0FBQ25CLGdCQUFVLFlBQVksSUFBSTtBQUFBLElBQzVCO0FBR0EsUUFBSSxVQUFVLEdBQUc7QUFDZixZQUFNLFVBQVUsZUFBZSxjQUFjLE1BQU07QUFDbkQsY0FBUSxVQUFVLElBQUksUUFBUSxPQUFPO0FBQ3JDLGNBQVEsY0FBYztBQUV0QixZQUFNLFVBQVUsZUFBZSxjQUFjLE1BQU07QUFDbkQsY0FBUSxVQUFVLElBQUksUUFBUSxNQUFNO0FBQ3BDLGNBQVEsY0FBYztBQUN0QixjQUFRLE1BQU0sUUFBUSxHQUFHLFVBQVUsR0FBRztBQUV0QyxjQUFRLFlBQVksT0FBTztBQUMzQixnQkFBVSxZQUFZLE9BQU87QUFBQSxJQUMvQjtBQUdBLGFBQVMsSUFBSSxHQUFHLElBQUksWUFBWSxLQUFLO0FBQ25DLFlBQU0sT0FBTyxlQUFlLGNBQWMsTUFBTTtBQUNoRCxXQUFLLFVBQVUsSUFBSSxRQUFRLE9BQU87QUFDbEMsV0FBSyxjQUFjO0FBQ25CLGdCQUFVLFlBQVksSUFBSTtBQUFBLElBQzVCO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPO0FBQ1Q7OztBQ3hITyxJQUFNLGFBQU4sTUFBaUI7QUFBQSxFQUdwQixZQUFZLGFBQTBCO0FBQ2xDLFNBQUssY0FBYztBQUFBLEVBQ3ZCO0FBQUEsRUFFQSxjQUFvQjtBQUNoQixTQUFLLFlBQVksTUFBTTtBQUN2QixTQUFLLFlBQVksU0FBUyxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFBQSxFQUM1RDtBQUFBLEVBRUEsWUFBWSxRQUFzQixXQUFtQyxjQUErQztBQUNoSCxTQUFLLFlBQVksTUFBTTtBQUN2QixRQUFJLE9BQU8sUUFBUSxXQUFXLEdBQUc7QUFDN0IsV0FBSyxZQUFZLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JEO0FBQUEsSUFDSjtBQUNBLFdBQU8sUUFBUSxRQUFRLENBQUMsVUFBdUI7QUFDM0MsWUFBTSxPQUFPLGdCQUFnQixPQUFPLFNBQVM7QUFDN0MsV0FBSyxpQkFBaUIsU0FBUyxNQUFNO0FBQ2pDLHFCQUFhLE1BQU0sRUFBRTtBQUFBLE1BQ3pCLENBQUM7QUFDRCxXQUFLLFlBQVksWUFBWSxJQUFJO0FBQUEsSUFDckMsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVBLFlBQWtCO0FBQ2QsU0FBSyxZQUFZLE1BQU07QUFDdkIsU0FBSyxZQUFZLFVBQVUsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQUEsRUFDeEY7QUFDSjs7O0FQNUJPLElBQU0sY0FBTixjQUEwQix3QkFBTTtBQUFBLEVBSW5DLFlBQVksS0FBVSxVQUE2QixRQUFtQjtBQUNsRSxVQUFNLEdBQUc7QUFDVCxTQUFLLGFBQWEsSUFBSSxpQkFBaUIsS0FBSyxVQUFVLE1BQU07QUFBQSxFQUNoRTtBQUFBLEVBRUEsTUFBTSxTQUF3QjtBQUMxQixVQUFNLEtBQUssV0FBVyxLQUFLO0FBRTNCLFVBQU0sRUFBRSxVQUFVLElBQUk7QUFDdEIsVUFBTSxZQUFZLFVBQVUsVUFBVSx1QkFBdUI7QUFFN0QsY0FBVSxTQUFTLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvQyxVQUFNLFFBQVEsVUFBVSxTQUFTLFNBQVM7QUFBQSxNQUN0QyxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsSUFDakIsQ0FBQztBQUNELFVBQU0sWUFBWSxVQUFVLFVBQVUsWUFBWTtBQUNsRCxTQUFLLE9BQU8sSUFBSSxXQUFXLFNBQVM7QUFFcEMsVUFBTSxpQkFBaUIsV0FBVyxDQUFDLFVBQXlCO0FBQ3hELFVBQUksTUFBTSxRQUFRLFNBQVM7QUFDdkIsYUFBSyxLQUFLLGFBQWEsS0FBSztBQUFBLE1BQ2hDO0FBQUM7QUFBQSxJQUNMLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFFQSxVQUFnQjtBQUNaLFNBQUssVUFBVSxNQUFNO0FBQUEsRUFDekI7QUFBQSxFQUVBLE1BQWMsYUFBYSxPQUFzQjtBQUM3QyxVQUFNLGVBQWU7QUFDckIsVUFBTSxRQUFTLE1BQU0sT0FBNEIsTUFBTSxLQUFLO0FBQzVELFFBQUksTUFBTSxXQUFXLEdBQUc7QUFDcEI7QUFBQSxJQUNKO0FBQUM7QUFDRCxTQUFLLEtBQUssWUFBWTtBQUN0QixRQUFJO0FBQ0EsWUFBTSxTQUFTLE1BQU0sS0FBSyxXQUFXLE9BQU8sS0FBSztBQUNqRCxZQUFNLFlBQVksS0FBSyxXQUFXO0FBQUEsUUFDOUIsT0FBTyxRQUFRLFFBQVEsT0FBSyxFQUFFLFNBQVM7QUFBQSxNQUMzQztBQUNBLFdBQUssS0FBSyxZQUFZLFFBQVEsV0FBVyxPQUFPLFlBQW9CO0FBQ2hFLGFBQUssS0FBSyxxQkFBcUIsT0FBTztBQUFBLE1BQzFDLENBQUM7QUFBQSxJQUNMLFNBQVMsT0FBTztBQUNaLGNBQVEsTUFBTSxpQkFBaUIsS0FBSztBQUNwQyxXQUFLLEtBQUssVUFBVTtBQUFBLElBQ3hCO0FBQUM7QUFBQSxFQUNMO0FBQUEsRUFFQSxNQUFjLHFCQUFxQixTQUFpQjtBQUNoRCxRQUFJLE9BQXFCO0FBQ3pCLFFBQUk7QUFDQSxhQUFPLE1BQU0sS0FBSyxXQUFXLFdBQVcsT0FBTztBQUFBLElBQ25ELFNBQVMsT0FBZ0I7QUFDckIsWUFBTSxVQUFVLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxPQUFPLEtBQUs7QUFDckUsVUFBSSx5QkFBTyxPQUFPO0FBQ2xCO0FBQUEsSUFDSjtBQUNBLFFBQUksTUFBTTtBQUNOLFlBQU0sS0FBSyxJQUFJLFVBQVUsYUFBYSxLQUFLLE1BQU0sSUFBSSxJQUFJO0FBQUEsSUFDN0Q7QUFBQztBQUNELFNBQUssTUFBTTtBQUFBLEVBQ2Y7QUFDSjs7O0FaakVBLElBQXFCLFlBQXJCLGNBQXVDLHlCQUFPO0FBQUEsRUFHN0MsTUFBTSxTQUFTO0FBQ2QsVUFBTSxLQUFLLGFBQWE7QUFDeEIsU0FBSyxjQUFjLFdBQVcseUJBQXlCLENBQUMsU0FBcUI7QUFDNUUsVUFBSSxZQUFZLEtBQUssS0FBSyxLQUFLLFVBQVUsSUFBSSxFQUFFLEtBQUs7QUFBQSxJQUNyRCxDQUFDO0FBRUQsU0FBSyxXQUFXO0FBQUEsTUFDZixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixVQUFVLE1BQU07QUFDZixZQUFJLFlBQVksS0FBSyxLQUFLLEtBQUssVUFBVSxJQUFJLEVBQUUsS0FBSztBQUFBLE1BQ3JEO0FBQUEsSUFDRCxDQUFDO0FBRUQsU0FBSyxjQUFjLElBQUksb0JBQW9CLEtBQUssS0FBSyxJQUFJLENBQUM7QUFBQSxFQUMzRDtBQUFBLEVBRUEsV0FBVztBQUFBLEVBQUM7QUFBQSxFQUVaLE1BQU0sZUFBZTtBQUNwQixTQUFLLFdBQVcsT0FBTztBQUFBLE1BQ3RCLENBQUM7QUFBQSxNQUNEO0FBQUEsTUFDQyxNQUFNLEtBQUssU0FBUztBQUFBLElBQ3RCO0FBQUEsRUFDRDtBQUFBLEVBRUEsTUFBTSxlQUFlO0FBQ3BCLFVBQU0sS0FBSyxTQUFTLEtBQUssUUFBUTtBQUFBLEVBQ2xDO0FBQ0Q7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiJdCn0K diff --git a/src/views/MovieCard.ts b/src/views/MovieCard.ts index 77e4013..98d043a 100644 --- a/src/views/MovieCard.ts +++ b/src/views/MovieCard.ts @@ -3,7 +3,7 @@ import { SearchMovie } from "../models/SearchResult"; export function createMovieCard(movie: SearchMovie, genresMap: Record): HTMLElement { const card = activeDocument.createElement("div"); - card.className = "card"; + card.className = "movie-item"; card.id = movie.id.toString(); //#region Photo diff --git a/src/views/SearchView.ts b/src/views/SearchView.ts index c70a671..0a6fb25 100644 --- a/src/views/SearchView.ts +++ b/src/views/SearchView.ts @@ -3,6 +3,8 @@ import { createMovieCard } from "./MovieCard"; export class SearchView { private movieListEl: HTMLElement; + private focusedIndex: number = -1; + private movieCards: HTMLElement[] = []; constructor(movieListEl: HTMLElement) { this.movieListEl = movieListEl; @@ -11,9 +13,15 @@ export class SearchView { showLoading(): void { this.movieListEl.empty(); this.movieListEl.createEl('span', { text: "Loading..." }); + this.movieCards = []; + this.focusedIndex = -1; } - showResults(result: SearchResult, genresMap: Record, onMovieClick: (movieId: number) => void): void { + showResults( + result: SearchResult, + genresMap: Record, + onMovieClick: (movieId: number) => void + ): void { this.movieListEl.empty(); if (result.results.length === 0) { this.movieListEl.createDiv({ text: "Nothing found(" }); @@ -21,15 +29,64 @@ export class SearchView { } result.results.forEach((movie: SearchMovie) => { const card = createMovieCard(movie, genresMap); + card.setAttribute('tabindex', '0'); card.addEventListener('click', () => { onMovieClick(movie.id); }); this.movieListEl.appendChild(card); + this.movieCards.push(card); }); } showError(): void { this.movieListEl.empty(); this.movieListEl.createDiv({ text: "Oops, something went wrong. Please try again." }); + this.movieCards = []; + this.focusedIndex = -1; + } + + focusNext(): void { + if (this.movieCards.length === 0) { + return; + }; + + this.clearFocus(); + this.focusedIndex = Math.min(this.focusedIndex + 1, this.movieCards.length - 1); + this.applyFocus(); + } + + focusPrevious(): void { + if (this.movieCards.length === 0) { + return; + }; + + this.clearFocus(); + this.focusedIndex = Math.max(this.focusedIndex - 1, 0); + this.applyFocus(); + } + + getFocusedMovieId(): number | null { + if (this.focusedIndex >= 0 && this.focusedIndex < this.movieCards.length) { + const id = this.movieCards[this.focusedIndex]?.id; + return id ? parseInt(id) : null; + } + return null; + } + + private clearFocus(): void { + if (this.focusedIndex >= 0 && this.focusedIndex < this.movieCards.length){ + this.movieCards[this.focusedIndex]?.classList.remove('fucused'); + } + } + + private applyFocus(): void { + if (this.focusedIndex >= 0 && this.focusedIndex < this.movieCards.length){ + this.movieCards[this.focusedIndex]?.classList.add('fucused'); + this.movieCards[this.focusedIndex]?.focus(); + this.movieCards[this.focusedIndex]?.scrollIntoView({ + block: 'center', + behavior: 'smooth' + }); + } } } diff --git a/src/views/searchModal.ts b/src/views/searchModal.ts index 859304d..4fbb565 100644 --- a/src/views/searchModal.ts +++ b/src/views/searchModal.ts @@ -7,6 +7,7 @@ import { SearchView } from "./SearchView"; export class SearchModal extends Modal { private controller: SearchController; private view!: SearchView; + private input!: HTMLInputElement; constructor(app: App, settings: PopcornMDSettings, plugin: PopcornMD) { super(app); @@ -20,19 +21,47 @@ export class SearchModal extends Modal { const container = contentEl.createDiv('searchModal-container'); container.createEl('h1', { text: "Popcorn-MD" }); - const input = container.createEl("input", { + this.input = container.createEl("input", { type: "search", placeholder: "Enter movie name or IMDb id" }); const movieList = container.createDiv("movie-list"); this.view = new SearchView(movieList); - input.addEventListener("keydown", (event: KeyboardEvent) => { + // Key handler for navigation (listen on the whole container) + container.addEventListener("keydown", (event: KeyboardEvent) => { + switch (event.key){ + case "ArrowDown": + event.preventDefault(); + this.view.focusNext(); // Fix typo here + break; + case "ArrowUp": + event.preventDefault(); + this.view.focusPrevious(); + break; + + case "Escape": + this.close(); + break; + + case "Enter": + this.handleKeyboardSelection() + break; + } + }); + + // Separate handler for the search input + this.input.addEventListener("keydown", (event: KeyboardEvent) => { if (event.key === "Enter") { + event.preventDefault(); void this.handleSearch(event); - input.blur(); - } else if (event.key === "Escape") { - this.close(); + // this.input.blur(); + } + // Let arrow keys propagate to container + if (event.key === "ArrowDown" || event.key === "ArrowUp") { + event.stopPropagation(); // Don't let container handle it here + // Trigger the container's event listener manually + container.dispatchEvent(new KeyboardEvent('keydown', { key: event.key })); } }); } @@ -62,6 +91,13 @@ export class SearchModal extends Modal { } } + private handleKeyboardSelection(): void{ + const movieId = this.view.getFocusedMovieId(); + if (movieId !== null) { + void this.handleMovieSelection(movieId); + } + } + private async handleMovieSelection(movieId: number) { let note: TFile | null = null; try { @@ -77,3 +113,4 @@ export class SearchModal extends Modal { this.close(); } } + diff --git a/styles.css b/styles.css index 7884cfd..71c54c9 100644 --- a/styles.css +++ b/styles.css @@ -14,28 +14,44 @@ .searchModal-container .movie-list { margin-top: 10px; overflow-x: auto; + scroll-behavior: smooth; + overscroll-behavior: contain; } -.card { +.movie-item { display: flex; cursor: pointer; font-size: 1rem; flex-direction: row; - margin: 5px 0px; + margin: 10px 0px; box-sizing: border-box; padding: 10px; position: relative; + border: 1px solid transparent; + border-radius: 4px; + background-color: var(--background-secondary); } -.card .movie-photo { + +.movie-item:hover { + outline: 2px solid var(--interactive-accent); + outline-offset: -2px; +} + +.movie-item.focused { + outline: 2px solid var(--interactive-accent); + outline-offset: -2px; +} + +.movie-item .movie-photo { flex-shrink: 0; padding: 10px; } -.card .movie-photo img{ +.movie-item .movie-photo img{ width: 80px; height: 120px; } -.card .movie-info { +.movie-item .movie-info { flex-grow: 1; flex-shrink: 1; padding: 5px; @@ -43,18 +59,18 @@ overflow: hidden; } -.card .movie-info h2{ +.movie-item .movie-info h2{ margin-top: 2px; margin-bottom: 3px; margin-right: 3px; display: inline-block; } -.card .movie-info span.original-name{ +.movie-item .movie-info span.original-name{ font-size: 0.8em; color: #7f7f7f; display: inline-block; } -.card .movie-info p { +.movie-item .movie-info p { font-size: 0.7em; margin-top: 3px; text-align: justify; @@ -63,7 +79,7 @@ max-width: 100%; } -.card .genres .genre { +.movie-item .genres .genre { display: inline-block; border-radius: 3px; padding: .2em .5em .3em;