├── .DS_Store ├── .gitattributes ├── BBKB ├── .DS_Store ├── .obsidian │ ├── config │ ├── daily-notes.json │ ├── plugins │ │ ├── mrj-backlinks-in-document │ │ │ ├── data.json │ │ │ ├── main.js │ │ │ ├── manifest.json │ │ │ └── styles.css │ │ ├── tag-wrangler │ │ │ ├── main.js │ │ │ ├── manifest.json │ │ │ └── styles.css │ │ └── templater-obsidian │ │ │ ├── data.json │ │ │ ├── main.js │ │ │ ├── manifest.json │ │ │ └── styles.css │ └── workspace ├── _templates │ ├── fleeting.md │ ├── note.md │ └── reference.md ├── fleeting │ └── 2021-05-16.md ├── notes │ ├── .DS_Store │ ├── 202104021522 - Creating a knowledgebase.md │ ├── 202105160042 - File Upload Vulnerabilities.md │ ├── 202105160045 - Path Traversal.md │ └── 202105160048 - Image Tragik.md ├── payloads │ └── XSS.md └── references │ ├── File Upload Attacks Part 1.md │ └── How to take smart notes.md ├── LICENSE └── README.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InsiderPhD/BugBountyKnowledgeBase/40c4b94b3db3f7b5632ef4f064f099de8786ffee/.DS_Store -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /BBKB/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InsiderPhD/BugBountyKnowledgeBase/40c4b94b3db3f7b5632ef4f064f099de8786ffee/BBKB/.DS_Store -------------------------------------------------------------------------------- /BBKB/.obsidian/config: -------------------------------------------------------------------------------- 1 | {"baseFontSize":16,"pluginEnabledStatus":{"file-explorer":true,"global-search":true,"switcher":true,"graph":true,"backlink":true,"page-preview":true,"command-palette":true,"markdown-importer":true,"word-count":true,"open-with-default-app":true,"file-recovery":true,"zk-prefixer":true,"daily-notes":true,"outline":true},"enabledPlugins":["mrj-backlinks-in-document","tag-wrangler","templater-obsidian"],"promptDelete":false} -------------------------------------------------------------------------------- /BBKB/.obsidian/daily-notes.json: -------------------------------------------------------------------------------- 1 | {"folder":"fleeting","template":"_templates/fleeting","autorun":true} -------------------------------------------------------------------------------- /BBKB/.obsidian/plugins/mrj-backlinks-in-document/data.json: -------------------------------------------------------------------------------- 1 | {"ids":["5c7a9910160235af","94119827253f12be"]} -------------------------------------------------------------------------------- /BBKB/.obsidian/plugins/mrj-backlinks-in-document/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var obsidian = require('obsidian'); 4 | 5 | /*! ***************************************************************************** 6 | Copyright (c) Microsoft Corporation. 7 | 8 | Permission to use, copy, modify, and/or distribute this software for any 9 | purpose with or without fee is hereby granted. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 12 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 13 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 14 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 15 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 16 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 | PERFORMANCE OF THIS SOFTWARE. 18 | ***************************************************************************** */ 19 | /* global Reflect, Promise */ 20 | 21 | var extendStatics = function(d, b) { 22 | extendStatics = Object.setPrototypeOf || 23 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || 24 | function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; 25 | return extendStatics(d, b); 26 | }; 27 | 28 | function __extends(d, b) { 29 | if (typeof b !== "function" && b !== null) 30 | throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); 31 | extendStatics(d, b); 32 | function __() { this.constructor = d; } 33 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); 34 | } 35 | 36 | function __awaiter(thisArg, _arguments, P, generator) { 37 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 38 | return new (P || (P = Promise))(function (resolve, reject) { 39 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 40 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 41 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 42 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 43 | }); 44 | } 45 | 46 | function __generator(thisArg, body) { 47 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; 48 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 49 | function verb(n) { return function (v) { return step([n, v]); }; } 50 | function step(op) { 51 | if (f) throw new TypeError("Generator is already executing."); 52 | while (_) try { 53 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 54 | if (y = 0, t) op = [op[0] & 2, t.value]; 55 | switch (op[0]) { 56 | case 0: case 1: t = op; break; 57 | case 4: _.label++; return { value: op[1], done: false }; 58 | case 5: _.label++; y = op[1]; op = [0]; continue; 59 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 60 | default: 61 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 62 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 63 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 64 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 65 | if (t[2]) _.ops.pop(); 66 | _.trys.pop(); continue; 67 | } 68 | op = body.call(thisArg, _); 69 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 70 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 71 | } 72 | } 73 | 74 | var defaultData = { 75 | prBacklinkLeaf: null, 76 | mdBacklinkLeaf: null 77 | }; 78 | var BacklinksInDocument = /** @class */ (function (_super) { 79 | __extends(BacklinksInDocument, _super); 80 | function BacklinksInDocument() { 81 | var _this = _super !== null && _super.apply(this, arguments) || this; 82 | _this.data = defaultData; 83 | return _this; 84 | } 85 | Object.defineProperty(BacklinksInDocument.prototype, "hasOpenedMdFiles", { 86 | get: function () { 87 | return this.app.workspace.getLeavesOfType('markdown').length !== 0; 88 | }, 89 | enumerable: false, 90 | configurable: true 91 | }); 92 | Object.defineProperty(BacklinksInDocument.prototype, "isPluginLeafExists", { 93 | get: function () { 94 | var _a, _b; 95 | var openedBacklinksLeaves = this.app.workspace.getLeavesOfType('backlink').map(function (e) { return e === null || e === void 0 ? void 0 : e.id; }); 96 | return openedBacklinksLeaves.includes((_a = this.data.prBacklinkLeaf) === null || _a === void 0 ? void 0 : _a.id) 97 | && openedBacklinksLeaves.includes((_b = this.data.mdBacklinkLeaf) === null || _b === void 0 ? void 0 : _b.id); 98 | }, 99 | enumerable: false, 100 | configurable: true 101 | }); 102 | BacklinksInDocument.prototype.createPluginLeaf = function () { 103 | var workspace = this.app.workspace; 104 | var root = workspace.rootSplit; 105 | this.data.mdBacklinkLeaf = workspace.createLeafInParent(root); 106 | this.data.prBacklinkLeaf = workspace.createLeafInParent(root); 107 | }; 108 | BacklinksInDocument.prototype.removeLeaf = function (id) { 109 | var leaf = this.app.workspace.getLeafById(id); 110 | leaf === null || leaf === void 0 ? void 0 : leaf.detach(); 111 | }; 112 | BacklinksInDocument.prototype.clear = function () { 113 | var _a, _b; 114 | (_a = this.data.prBacklinkLeaf) === null || _a === void 0 ? void 0 : _a.detach(); 115 | (_b = this.data.mdBacklinkLeaf) === null || _b === void 0 ? void 0 : _b.detach(); 116 | }; 117 | BacklinksInDocument.prototype.updateBacklinks = function (file) { 118 | return __awaiter(this, void 0, void 0, function () { 119 | var _a, prBacklinkLeaf, mdBacklinkLeaf; 120 | return __generator(this, function (_b) { 121 | switch (_b.label) { 122 | case 0: 123 | if (!file) { 124 | return [2 /*return*/]; 125 | } 126 | _a = this.data, prBacklinkLeaf = _a.prBacklinkLeaf, mdBacklinkLeaf = _a.mdBacklinkLeaf; 127 | return [4 /*yield*/, (prBacklinkLeaf === null || prBacklinkLeaf === void 0 ? void 0 : prBacklinkLeaf.setViewState({ 128 | type: 'backlink', 129 | state: { 130 | file: file.path, 131 | } 132 | }))]; 133 | case 1: 134 | _b.sent(); 135 | return [4 /*yield*/, (mdBacklinkLeaf === null || mdBacklinkLeaf === void 0 ? void 0 : mdBacklinkLeaf.setViewState({ 136 | type: 'backlink', 137 | state: { 138 | file: file.path, 139 | } 140 | }))]; 141 | case 2: 142 | _b.sent(); 143 | return [2 /*return*/]; 144 | } 145 | }); 146 | }); 147 | }; 148 | BacklinksInDocument.prototype.onload = function () { 149 | return __awaiter(this, void 0, void 0, function () { 150 | var saved; 151 | var _this = this; 152 | return __generator(this, function (_a) { 153 | switch (_a.label) { 154 | case 0: return [4 /*yield*/, this.loadData()]; 155 | case 1: 156 | saved = _a.sent(); 157 | this.app.workspace.on('layout-ready', function () { 158 | saved.ids.forEach(function (id) { return _this.removeLeaf(id); }); 159 | }); 160 | this.app.workspace.on('file-open', function (file) { return __awaiter(_this, void 0, void 0, function () { 161 | var activeLeaf, activeView, isAllowedView, isBacklinkView, _a, prBacklinkLeaf, mdBacklinkLeaf, mdLeafEl, prLeafEl, mdEl, prEl; 162 | return __generator(this, function (_b) { 163 | switch (_b.label) { 164 | case 0: 165 | activeLeaf = this.app.workspace.activeLeaf; 166 | if (!activeLeaf) { 167 | return [2 /*return*/]; 168 | } 169 | activeView = activeLeaf.view; 170 | isAllowedView = activeView instanceof obsidian.MarkdownView || activeView instanceof obsidian.MarkdownPreviewView; 171 | isBacklinkView = activeView.getState().hasOwnProperty('backlinkCollapsed'); 172 | if (!this.hasOpenedMdFiles) { 173 | this.clear(); 174 | return [2 /*return*/]; 175 | } 176 | if (isBacklinkView) { 177 | return [2 /*return*/]; 178 | } 179 | if (!isAllowedView) { 180 | this.clear(); 181 | return [2 /*return*/]; 182 | } 183 | if (!this.isPluginLeafExists) { 184 | this.clear(); 185 | this.createPluginLeaf(); 186 | } 187 | _a = this.data, prBacklinkLeaf = _a.prBacklinkLeaf, mdBacklinkLeaf = _a.mdBacklinkLeaf; 188 | mdLeafEl = mdBacklinkLeaf.view.containerEl.parentNode; 189 | prLeafEl = prBacklinkLeaf.view.containerEl.parentNode; 190 | mdEl = activeView.containerEl.querySelector('.mod-active .markdown-source-view .CodeMirror-lines') 191 | || document.querySelector(".mod-active .markdown-source-view"); 192 | prEl = activeView.containerEl.querySelector('.mod-active .markdown-preview-view'); 193 | mdEl === null || mdEl === void 0 ? void 0 : mdEl.appendChild(mdLeafEl); 194 | prEl === null || prEl === void 0 ? void 0 : prEl.appendChild(prLeafEl); 195 | return [4 /*yield*/, this.updateBacklinks(file) 196 | // @ts-ignore 197 | ]; 198 | case 1: 199 | _b.sent(); 200 | // @ts-ignore 201 | return [4 /*yield*/, this.saveData({ ids: [mdBacklinkLeaf.id, prBacklinkLeaf.id] })]; 202 | case 2: 203 | // @ts-ignore 204 | _b.sent(); 205 | return [2 /*return*/]; 206 | } 207 | }); 208 | }); }); 209 | return [2 /*return*/]; 210 | } 211 | }); 212 | }); 213 | }; 214 | BacklinksInDocument.prototype.onunload = function () { 215 | console.log('unloading plugin'); 216 | this.clear(); 217 | }; 218 | return BacklinksInDocument; 219 | }(obsidian.Plugin)); 220 | 221 | module.exports = BacklinksInDocument; 222 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20pIHtcclxuICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKVxyXG4gICAgICAgIHRvW2pdID0gZnJvbVtpXTtcclxuICAgIHJldHVybiB0bztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcbiIsImltcG9ydCB7TWFya2Rvd25QcmV2aWV3VmlldywgTWFya2Rvd25WaWV3LCBQbHVnaW4sIFRGaWxlLCBXb3Jrc3BhY2UsIFdvcmtzcGFjZUxlYWZ9IGZyb20gJ29ic2lkaWFuJztcblxuaW50ZXJmYWNlIFdvcmtzcGFjZUxlYWZFeHQgZXh0ZW5kcyBXb3Jrc3BhY2VMZWFmIHtcbiAgICBpZDogc3RyaW5nXG59XG5cbmludGVyZmFjZSBXb3Jrc3BhY2VFeHQgZXh0ZW5kcyBXb3Jrc3BhY2Uge1xuICAgIHJvb3RTcGxpdDogV29ya3NwYWNlTGVhZlxuICAgIGNyZWF0ZUxlYWZJblBhcmVudDogKHc6IFdvcmtzcGFjZUxlYWYpID0+IFdvcmtzcGFjZUxlYWZFeHRcbn1cblxuaW50ZXJmYWNlIFBsdWdpbkRhdGEge1xuICAgIHByQmFja2xpbmtMZWFmOiBXb3Jrc3BhY2VMZWFmRXh0IHwgbnVsbFxuICAgIG1kQmFja2xpbmtMZWFmOiBXb3Jrc3BhY2VMZWFmRXh0IHwgbnVsbFxufVxuXG5jb25zdCBkZWZhdWx0RGF0YTogUGx1Z2luRGF0YSA9IHtcbiAgICBwckJhY2tsaW5rTGVhZjogbnVsbCxcbiAgICBtZEJhY2tsaW5rTGVhZjogbnVsbFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYWNrbGlua3NJbkRvY3VtZW50IGV4dGVuZHMgUGx1Z2luIHtcbiAgICBkYXRhOiBQbHVnaW5EYXRhID0gZGVmYXVsdERhdGFcblxuICAgIGdldCBoYXNPcGVuZWRNZEZpbGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZSgnbWFya2Rvd24nKS5sZW5ndGggIT09IDBcbiAgICB9XG5cbiAgICBnZXQgaXNQbHVnaW5MZWFmRXhpc3RzKCkge1xuICAgICAgICBjb25zdCBvcGVuZWRCYWNrbGlua3NMZWF2ZXMgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKCdiYWNrbGluaycpLm1hcCgoZTogV29ya3NwYWNlTGVhZiAmIHtpZDogc3RyaW5nfSkgPT4gZT8uaWQpXG4gICAgICAgIHJldHVybiBvcGVuZWRCYWNrbGlua3NMZWF2ZXMuaW5jbHVkZXModGhpcy5kYXRhLnByQmFja2xpbmtMZWFmPy5pZClcbiAgICAgICAgICAgICYmIG9wZW5lZEJhY2tsaW5rc0xlYXZlcy5pbmNsdWRlcyh0aGlzLmRhdGEubWRCYWNrbGlua0xlYWY/LmlkKVxuICAgIH1cblxuICAgIGNyZWF0ZVBsdWdpbkxlYWYoKSB7XG4gICAgICAgIGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMuYXBwLndvcmtzcGFjZSBhcyBXb3Jrc3BhY2VFeHRcbiAgICAgICAgY29uc3Qgcm9vdCA9IHdvcmtzcGFjZS5yb290U3BsaXRcbiAgICAgICAgdGhpcy5kYXRhLm1kQmFja2xpbmtMZWFmID0gd29ya3NwYWNlLmNyZWF0ZUxlYWZJblBhcmVudChyb290KVxuICAgICAgICB0aGlzLmRhdGEucHJCYWNrbGlua0xlYWYgPSB3b3Jrc3BhY2UuY3JlYXRlTGVhZkluUGFyZW50KHJvb3QpXG4gICAgfVxuXG4gICAgcmVtb3ZlTGVhZihpZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhZkJ5SWQoaWQpXG4gICAgICAgIGxlYWY/LmRldGFjaCgpXG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wckJhY2tsaW5rTGVhZj8uZGV0YWNoKClcbiAgICAgICAgdGhpcy5kYXRhLm1kQmFja2xpbmtMZWFmPy5kZXRhY2goKVxuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZUJhY2tsaW5rcyhmaWxlOiBURmlsZSkge1xuICAgICAgICBpZiAoIWZpbGUpIHsgcmV0dXJuIH1cbiAgICAgICAgY29uc3QgeyBwckJhY2tsaW5rTGVhZiwgbWRCYWNrbGlua0xlYWYgfSA9IHRoaXMuZGF0YVxuXG4gICAgICAgIGF3YWl0IHByQmFja2xpbmtMZWFmPy5zZXRWaWV3U3RhdGUoe1xuICAgICAgICAgICAgdHlwZTogJ2JhY2tsaW5rJyxcbiAgICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICAgICAgZmlsZTogZmlsZS5wYXRoLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IG1kQmFja2xpbmtMZWFmPy5zZXRWaWV3U3RhdGUoe1xuICAgICAgICAgICAgdHlwZTogJ2JhY2tsaW5rJyxcbiAgICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICAgICAgZmlsZTogZmlsZS5wYXRoLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgfVxuXG4gICAgYXN5bmMgb25sb2FkKCkge1xuICAgICAgICBjb25zdCBzYXZlZCA9IGF3YWl0IHRoaXMubG9hZERhdGEoKVxuXG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LXJlYWR5JywgKCkgPT4ge1xuICAgICAgICAgICAgc2F2ZWQuaWRzLmZvckVhY2goKGlkOiBzdHJpbmcpID0+IHRoaXMucmVtb3ZlTGVhZihpZCkpXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCBhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlTGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmXG5cbiAgICAgICAgICAgIGlmICghYWN0aXZlTGVhZikgeyByZXR1cm4gfVxuXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVWaWV3ID0gYWN0aXZlTGVhZi52aWV3XG5cbiAgICAgICAgICAgIGNvbnN0IGlzQWxsb3dlZFZpZXcgPSBhY3RpdmVWaWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3IHx8IGFjdGl2ZVZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blByZXZpZXdWaWV3XG5cbiAgICAgICAgICAgIGNvbnN0IGlzQmFja2xpbmtWaWV3ID0gYWN0aXZlVmlldy5nZXRTdGF0ZSgpLmhhc093blByb3BlcnR5KCdiYWNrbGlua0NvbGxhcHNlZCcpXG5cbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNPcGVuZWRNZEZpbGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhcigpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0JhY2tsaW5rVmlldykge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlzQWxsb3dlZFZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKClcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzUGx1Z2luTGVhZkV4aXN0cykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXIoKVxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUGx1Z2luTGVhZigpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHsgcHJCYWNrbGlua0xlYWYsIG1kQmFja2xpbmtMZWFmIH0gPSB0aGlzLmRhdGFcblxuICAgICAgICAgICAgY29uc3QgbWRMZWFmRWwgPSBtZEJhY2tsaW5rTGVhZi52aWV3LmNvbnRhaW5lckVsLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgICAgIGNvbnN0IHByTGVhZkVsID0gcHJCYWNrbGlua0xlYWYudmlldy5jb250YWluZXJFbC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50XG5cbiAgICAgICAgICAgIGNvbnN0IG1kRWwgPVxuICAgICAgICAgICAgICAgIGFjdGl2ZVZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLm1vZC1hY3RpdmUgLm1hcmtkb3duLXNvdXJjZS12aWV3IC5Db2RlTWlycm9yLWxpbmVzJylcbiAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLm1vZC1hY3RpdmUgLm1hcmtkb3duLXNvdXJjZS12aWV3XCIpXG4gICAgICAgICAgICBjb25zdCBwckVsID0gYWN0aXZlVmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcubW9kLWFjdGl2ZSAubWFya2Rvd24tcHJldmlldy12aWV3JylcblxuICAgICAgICAgICAgbWRFbD8uYXBwZW5kQ2hpbGQobWRMZWFmRWwpXG4gICAgICAgICAgICBwckVsPy5hcHBlbmRDaGlsZChwckxlYWZFbClcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVCYWNrbGlua3MoZmlsZSlcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEoeyBpZHM6IFttZEJhY2tsaW5rTGVhZi5pZCwgcHJCYWNrbGlua0xlYWYuaWRdIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgb251bmxvYWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd1bmxvYWRpbmcgcGx1Z2luJyk7XG4gICAgICAgIHRoaXMuY2xlYXIoKVxuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJNYXJrZG93blZpZXciLCJNYXJrZG93blByZXZpZXdWaWV3IiwiUGx1Z2luIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWM7QUFDekMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3BGLFFBQVEsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzFHLElBQUksT0FBTyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQUNGO0FBQ08sU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNoQyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssVUFBVSxJQUFJLENBQUMsS0FBSyxJQUFJO0FBQzdDLFFBQVEsTUFBTSxJQUFJLFNBQVMsQ0FBQyxzQkFBc0IsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsK0JBQStCLENBQUMsQ0FBQztBQUNsRyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEIsSUFBSSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDM0MsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUF1Q0Q7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ3RHLFFBQVEsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3RILFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEO0FBQ08sU0FBUyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUMzQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckgsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxNQUFNLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3SixJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3RFLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ3RFLFFBQVEsT0FBTyxDQUFDLEVBQUUsSUFBSTtBQUN0QixZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pLLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwRCxZQUFZLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixnQkFBZ0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdB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 223 | -------------------------------------------------------------------------------- /BBKB/.obsidian/plugins/mrj-backlinks-in-document/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "mrj-backlinks-in-document", 3 | "name": "Backlinks in document", 4 | "version": "0.0.9", 5 | "description": "A hacky workaround which put backlinks section into the document", 6 | "isDesktopOnly": false, 7 | "author": "MrJackphil", 8 | "authorUrl": "https://mrjackphil.com" 9 | } 10 | -------------------------------------------------------------------------------- /BBKB/.obsidian/plugins/mrj-backlinks-in-document/styles.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-lines > .workspace-leaf { 2 | margin-top: 50px; 3 | contain: content; 4 | } 5 | 6 | .markdown-preview-view > .workspace-leaf { 7 | margin-top: -30vh; 8 | height: 100%; 9 | } 10 | 11 | .markdown-preview-view.is-readable-line-width > .workspace-leaf { 12 | max-width: 700px; 13 | margin-left: auto; 14 | margin-right: auto; 15 | } 16 | 17 | .CodeMirror-lines > .workspace-leaf .backlink-pane { 18 | overflow-y: visible; 19 | } 20 | .is-mobile .mod-active .markdown-source-view { 21 | overflow: auto; 22 | } 23 | .is-mobile .mod-active .markdown-source-view .cm-content { 24 | padding-bottom: 1rem !important; 25 | } 26 | 27 | .is-mobile .mod-active .markdown-source-view .workspace-leaf, 28 | .is-mobile .mod-active .markdown-source-view .workspace-leaf .backlink-pane { 29 | min-height: 100vh; 30 | } 31 | -------------------------------------------------------------------------------- /BBKB/.obsidian/plugins/tag-wrangler/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "tag-wrangler", 3 | "name": "Tag Wrangler", 4 | "version": "0.4.4", 5 | "minAppVersion": "0.11.13", 6 | "description": "Rename, merge, toggle, and search tags from the tag pane", 7 | "isDesktopOnly": true 8 | } 9 | -------------------------------------------------------------------------------- /BBKB/.obsidian/plugins/tag-wrangler/styles.css: -------------------------------------------------------------------------------- 1 | .smalltalk { 2 | display: flex; 3 | 4 | align-items: center; 5 | flex-direction: column; 6 | justify-content: center; 7 | 8 | transition: 200ms opacity; 9 | 10 | bottom: 0; 11 | left: 0; 12 | overflow: auto; 13 | padding: 20px; 14 | position: fixed; 15 | right: 0; 16 | top: 0; 17 | 18 | z-index: 100; 19 | } 20 | 21 | .smalltalk + .smalltalk { 22 | transition: ease 1s; 23 | } 24 | 25 | .smalltalk .page { 26 | border-radius: 3px; 27 | background: white; 28 | box-shadow: 0 4px 23px 5px rgba(0, 0, 0, .2), 0 2px 6px rgba(0, 0, 0, .15); 29 | color: #333; 30 | min-width: 400px; 31 | padding: 0; 32 | position: relative; 33 | z-index: 0; 34 | } 35 | 36 | @media only screen and (max-width: 500px) { 37 | .smalltalk .page { 38 | min-width: 0; 39 | } 40 | } 41 | 42 | .smalltalk .page > .close-button { 43 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAQAAAC1QeVaAAAAUklEQVR4XqXPYQrAIAhAYW/gXd8NJxTopVqsGEhtf+L9/ERU2k/HSMFQpKcYJeNFI9Be0LCMij8cYyjj5EHIivGBkwLfrbX3IF8PqumVmnDpEG+eDsKibPG2JwAAAABJRU5ErkJggg==); 44 | background-position: center; 45 | background-repeat: no-repeat; 46 | height: 14px; 47 | position: absolute; 48 | right: 7px; 49 | top: 7px; 50 | width: 14px; 51 | z-index: 1; 52 | } 53 | 54 | .smalltalk .page > .close-button:hover { 55 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAQAAAC1QeVaAAAAnUlEQVR4XoWQQQ6CQAxFewjkJkMCyXgJPMk7AiYczyBeZEAX6AKctGIaN+bt+trk9wtGQc/IkhnoKGxqqiWxOSZalapWFZ6VrIUDExsN0a5JRBq9LoVOR0eEQMoEhKizXhhsn0p1sCWVo7CwOf1RytPL8CPvwuBUoHL6ugeK30CVD1TqK7V/hdpe+VNChhOzV8xWny/+xosHF8578W/Hmc1OOC3wmwAAAABJRU5ErkJggg==); 56 | } 57 | 58 | .smalltalk .progress { 59 | display: block; 60 | width: 100%; 61 | } 62 | 63 | .smalltalk .page header { 64 | overflow: hidden; 65 | text-overflow: ellipsis; 66 | white-space: nowrap; 67 | max-width: 500px; 68 | 69 | user-select: none; 70 | color: #333; 71 | font-size: 120%; 72 | font-weight: bold; 73 | margin: 0; 74 | padding: 14px 17px; 75 | text-shadow: white 0 1px 2px; 76 | } 77 | 78 | .smalltalk .page .content-area { 79 | overflow: hidden; 80 | text-overflow: ellipsis; 81 | 82 | padding: 6px 17px; 83 | position: relative; 84 | } 85 | 86 | .smalltalk .page .action-area { 87 | padding: 14px 17px; 88 | } 89 | 90 | button { 91 | font-family: Ubuntu, Arial, sans-serif; 92 | } 93 | 94 | .smalltalk button, .smalltalk .smalltalk { 95 | min-height: 2em; 96 | min-width: 4em; 97 | } 98 | 99 | .smalltalk button { 100 | appearance: none; 101 | user-select: none; 102 | background-image: linear-gradient(#ededed, #ededed 38%, #dedede); 103 | 104 | border: 1px solid rgba(0, 0, 0, 0.25); 105 | border-radius: 2px; 106 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.75); 107 | color: #444; 108 | font: inherit; 109 | margin: 0 1px 0 0; 110 | text-shadow: 0 1px 0 rgb(240, 240, 240); 111 | } 112 | 113 | .smalltalk button::-moz-focus-inner { 114 | border: 0; 115 | } 116 | 117 | .smalltalk button:enabled:active { 118 | background-image: linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7); 119 | box-shadow: none; 120 | text-shadow: none; 121 | } 122 | 123 | .smalltalk .page .button-strip { 124 | display: flex; 125 | 126 | flex-direction: row; 127 | justify-content: flex-end; 128 | } 129 | 130 | .smalltalk .page .button-strip > button { 131 | margin-left: 10px; 132 | } 133 | 134 | .smalltalk input { 135 | width: 100%; 136 | border: 1px solid #bfbfbf; 137 | border-radius: 2px; 138 | box-sizing: border-box; 139 | color: #444; 140 | font: inherit; 141 | margin: 0; 142 | min-height: 2em; 143 | padding: 3px; 144 | outline: none; 145 | } 146 | 147 | .smalltalk button:enabled:focus, .smalltalk input:enabled:focus { 148 | transition: border-color 200ms; 149 | border-color: rgb(77, 144, 254); 150 | outline: none; 151 | } 152 | 153 | 154 | .smalltalk input[pattern]:invalid, .smalltalk input[pattern]:invalid:enabled:focus, .smalltalk input[pattern][aria-invalid='true'], .smalltalk input[pattern][aria-invalid='true']:enabled:focus { 155 | border-color: var(--text-error); 156 | background-color: var(--background-modifier-error); } 157 | 158 | .smalltalk .page, .smalltalk .page header, .smalltalk input, .smalltalk button { 159 | color: var(--text-normal); 160 | text-shadow: none; } 161 | 162 | .smalltalk .page { 163 | background: var(--background-primary); } 164 | 165 | .smalltalk button[data-name="js-ok"] { 166 | background: var(--background-modifier-error); } 167 | 168 | .smalltalk button[data-name="js-cancel"] { 169 | background: var(--background-secondary-alt); } 170 | 171 | .smalltalk button { 172 | box-shadow: none; } 173 | -------------------------------------------------------------------------------- /BBKB/.obsidian/plugins/templater-obsidian/data.json: -------------------------------------------------------------------------------- 1 | {"command_timeout":5,"template_folder":"/_templates/","templates_pairs":[["",""]],"trigger_on_file_creation":true,"enable_system_commands":false,"shell_path":""} -------------------------------------------------------------------------------- /BBKB/.obsidian/plugins/templater-obsidian/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "templater-obsidian", 3 | "name": "Templater", 4 | "version": "1.6.0", 5 | "description": "Create and use templates", 6 | "minAppVersion": "0.11.13", 7 | "author": "SilentVoid", 8 | "authorUrl": "https://github.com/SilentVoid13", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /BBKB/.obsidian/plugins/templater-obsidian/styles.css: -------------------------------------------------------------------------------- 1 | .templater_div { 2 | border-top: 1px solid var(--background-modifier-border); 3 | } 4 | 5 | .templater_div > .setting-item { 6 | border-top: none !important; 7 | align-self: center; 8 | } 9 | 10 | .templater_div > .setting-item > .setting-item-control { 11 | justify-content: space-around; 12 | padding: 0; 13 | width: 100%; 14 | } 15 | 16 | .templater_div > .setting-item > .setting-item-control > .setting-editor-extra-setting-button { 17 | align-self: center; 18 | } 19 | 20 | .templater_title { 21 | margin: 0; 22 | padding: 0; 23 | margin-top: 5px; 24 | text-align: center; 25 | } 26 | 27 | .templater_template { 28 | align-self: center; 29 | margin-left: 5px; 30 | margin-right: 5px; 31 | width: 70%; 32 | } 33 | 34 | .templater_cmd { 35 | margin-left: 5px; 36 | margin-right: 5px; 37 | font-size: 14px; 38 | width: 100%; 39 | } 40 | 41 | .templater_div2 > .setting-item { 42 | align-content: center; 43 | justify-content: center; 44 | } 45 | 46 | .templater_button:hover { 47 | background-color: #00496A !important; 48 | } 49 | 50 | .templater-prompt-div { 51 | display: flex; 52 | } 53 | 54 | .templater-prompt-form { 55 | display: flex; 56 | flex-grow: 1; 57 | } 58 | 59 | .templater-prompt-input { 60 | flex-grow: 1; 61 | } -------------------------------------------------------------------------------- /BBKB/.obsidian/workspace: -------------------------------------------------------------------------------- 1 | { 2 | "main": { 3 | "id": "38728355c5303f48", 4 | "type": "split", 5 | "children": [ 6 | { 7 | "id": "94119827253f12be", 8 | "type": "leaf", 9 | "state": { 10 | "type": "backlink", 11 | "state": { 12 | "file": "payloads/XSS.md", 13 | "collapseAll": false, 14 | "extraContext": false, 15 | "sortOrder": "alphabetical", 16 | "showSearch": false, 17 | "searchQuery": "", 18 | "backlinkCollapsed": false, 19 | "unlinkedCollapsed": true 20 | } 21 | } 22 | }, 23 | { 24 | "id": "5c7a9910160235af", 25 | "type": "leaf", 26 | "state": { 27 | "type": "backlink", 28 | "state": { 29 | "file": "payloads/XSS.md", 30 | "collapseAll": false, 31 | "extraContext": false, 32 | "sortOrder": "alphabetical", 33 | "showSearch": false, 34 | "searchQuery": "", 35 | "backlinkCollapsed": false, 36 | "unlinkedCollapsed": true 37 | } 38 | } 39 | }, 40 | { 41 | "id": "b72f658c81d808a9", 42 | "type": "leaf", 43 | "state": { 44 | "type": "markdown", 45 | "state": { 46 | "file": "payloads/XSS.md", 47 | "mode": "source" 48 | } 49 | } 50 | } 51 | ], 52 | "direction": "vertical" 53 | }, 54 | "left": { 55 | "id": "76b4b97d83ae72b6", 56 | "type": "split", 57 | "children": [ 58 | { 59 | "id": "666bfc8c678605f7", 60 | "type": "tabs", 61 | "children": [ 62 | { 63 | "id": "28c312cd65e2be84", 64 | "type": "leaf", 65 | "state": { 66 | "type": "file-explorer", 67 | "state": {} 68 | } 69 | }, 70 | { 71 | "id": "43f9f0ffd66a0d5d", 72 | "type": "leaf", 73 | "state": { 74 | "type": "search", 75 | "state": { 76 | "query": "", 77 | "matchingCase": false, 78 | "explainSearch": false, 79 | "collapseAll": false, 80 | "extraContext": false, 81 | "sortOrder": "alphabetical" 82 | } 83 | } 84 | } 85 | ] 86 | } 87 | ], 88 | "direction": "horizontal", 89 | "width": 300 90 | }, 91 | "right": { 92 | "id": "0c799eff9ce64e70", 93 | "type": "split", 94 | "children": [ 95 | { 96 | "id": "9742c9b00d58c373", 97 | "type": "tabs", 98 | "children": [ 99 | { 100 | "id": "917c0cd5d129cc2a", 101 | "type": "leaf", 102 | "state": { 103 | "type": "backlink", 104 | "state": { 105 | "file": "payloads/XSS.md", 106 | "collapseAll": false, 107 | "extraContext": false, 108 | "sortOrder": "alphabetical", 109 | "showSearch": false, 110 | "searchQuery": "", 111 | "backlinkCollapsed": false, 112 | "unlinkedCollapsed": true 113 | } 114 | } 115 | }, 116 | { 117 | "id": "0de81b41e1216049", 118 | "type": "leaf", 119 | "state": { 120 | "type": "outline", 121 | "state": { 122 | "file": "payloads/XSS.md" 123 | } 124 | } 125 | } 126 | ] 127 | } 128 | ], 129 | "direction": "horizontal", 130 | "width": 300, 131 | "collapsed": true 132 | }, 133 | "active": "b72f658c81d808a9", 134 | "lastOpenFiles": [ 135 | "payloads/Untitled.md", 136 | "notes/202104021522 - Creating a knowledgebase.md", 137 | "notes/202105160048 - Image Tragik.md", 138 | "references/How to take smart notes.md", 139 | "notes/202105160042 - File Upload Vulnerabilities.md", 140 | "notes/Untitled.md", 141 | "fleeting/2021-05-16.md", 142 | "notes/202105160045 - Path Traversal.md" 143 | ] 144 | } -------------------------------------------------------------------------------- /BBKB/_templates/fleeting.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InsiderPhD/BugBountyKnowledgeBase/40c4b94b3db3f7b5632ef4f064f099de8786ffee/BBKB/_templates/fleeting.md -------------------------------------------------------------------------------- /BBKB/_templates/note.md: -------------------------------------------------------------------------------- 1 | ### Title 2 | Tags: 3 | Related to: 4 | See also: 5 | Previous: 6 | 7 | ### Body 8 | Summary: Should be short, no prose 9 | 10 | Notes 11 | Try to write in full sentences, and assume no one else has looked at this befoe 12 | 13 | ### References 14 | - [[]] -------------------------------------------------------------------------------- /BBKB/_templates/reference.md: -------------------------------------------------------------------------------- 1 | ### Title 2 | Tags: 3 | Author: 4 | Reference: 5 | 6 | ### Notes 7 | Summary: 1-2 sentence overview 8 | Notes: 9 | - More quick notes 10 | - Refer to pages/quotes if required 11 | 12 | -------------------------------------------------------------------------------- /BBKB/fleeting/2021-05-16.md: -------------------------------------------------------------------------------- 1 | Yes we hack blog on file upload attacks - I don't know much about them but I think it would be an interesting place to level up my skills 2 | https://blog.yeswehack.com/yeswerhackers/exploitation/file-upload-attacks-part-1/ 3 | 4 | Mass assignment - I feel like I know this quite well but this has a real example and that's always good to better understand a bug 5 | https://galnagli.com/Mass_Assignment/ 6 | 7 | Example nuclei scanning - looking at scanners like this might be a neat thing to do in the future... 8 | https://twitter.com/nav1n0x/status/1393278370163699719 -------------------------------------------------------------------------------- /BBKB/notes/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InsiderPhD/BugBountyKnowledgeBase/40c4b94b3db3f7b5632ef4f064f099de8786ffee/BBKB/notes/.DS_Store -------------------------------------------------------------------------------- /BBKB/notes/202104021522 - Creating a knowledgebase.md: -------------------------------------------------------------------------------- 1 | ### Creating a knowledgebase 2 | Tags: #organisation 3 | Related to: 4 | See also: 5 | Previous: 6 | 7 | ### Body 8 | Summary: How and why you should create a knowledge base 9 | 10 | Notes 11 | Structuring your notes as a Knowledgebase can be useful for recall, specifically in not getting stressed about remembering things, but also in realising the connections between what you read. 12 | Taking notes this way can be extremely useful for building upon what you know and exploring it, for example how do you react when you see an API? What approach should you take? 13 | This approach allows you to build on what you know 14 | 15 | ### References 16 | - [[Building a Bug Bounty Knowledgebase]] -------------------------------------------------------------------------------- /BBKB/notes/202105160042 - File Upload Vulnerabilities.md: -------------------------------------------------------------------------------- 1 | ### File Upload Vulnerabilities 2 | Tags: #file-upload #techniques 3 | Related to: 4 | See also: 5 | Previous: 6 | 7 | ### Body 8 | Summary: File upload vulnerabilities occur when a file upload may be poorly implemented, as they directly access the file system, primarily this involves path traversal, however this could also cause RCEs in the case of Image Tradgik 9 | 10 | Notes 11 | The main vulnerabilities that file uploads face are path traversal related... 12 | 13 | ### References 14 | - [[File Upload Attacks Part 1]] -------------------------------------------------------------------------------- /BBKB/notes/202105160045 - Path Traversal.md: -------------------------------------------------------------------------------- 1 | ### Path Traversal 2 | Tags: #techniques 3 | Related to: [[202105160042 - File Upload Vulnerabilities]] 4 | See also: 5 | Previous: 6 | 7 | ### Body 8 | Summary: Path traversal is the ability to access files we shouldn't, primarily by abusing how a web server may load up content. This is usually done by using ../../../.. to access directories above where the page is 9 | 10 | Notes 11 | 12 | 13 | ### References 14 | - [[]] -------------------------------------------------------------------------------- /BBKB/notes/202105160048 - Image Tragik.md: -------------------------------------------------------------------------------- 1 | ### Image Tragik 2 | Tags: #file-upload #RCE 3 | Related to: 4 | See also: 5 | Previous: [[202105160042 - File Upload Vulnerabilities]] 6 | 7 | ### Body 8 | Summary: Image Tradik is a fairly easily exploit for file uploads which use a vulnerable form of Image Magik, the payload is freely avaliable 9 | 10 | Notes 11 | Image tragik is a vulnerability which affects Image magik file uploads. It is a collection of CVEs... 12 | 13 | ### References 14 | - https://imagetragick.com/ - hosts the exploits -------------------------------------------------------------------------------- /BBKB/payloads/XSS.md: -------------------------------------------------------------------------------- 1 | ">