diff --git a/.gitignore b/.gitignore index b6e4761..7b7b241 100644 --- a/.gitignore +++ b/.gitignore @@ -1,129 +1,3 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class +# 忽略 Obsidian folder: ./obsidian -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ +./obsidian \ No newline at end of file diff --git a/.obsidian/config b/.obsidian/config new file mode 100644 index 0000000..c9e3de6 --- /dev/null +++ b/.obsidian/config @@ -0,0 +1 @@ +{"theme":"obsidian","pluginEnabledStatus":{"file-explorer":true,"global-search":true,"switcher":true,"graph":true,"backlink":true,"command-palette":true,"markdown-importer":false,"word-count":true,"open-with-default-app":true,"tag-pane":true,"outline":true,"templates":true,"starred":true},"obsidianCss":false,"enabledPlugins":["obsidian-hider","obsidian-git","cm-show-whitespace-obsidian","wikilinks-to-mdlinks-obsidian"],"spellcheck":true,"enabledCssSnippets":["Ruby-Interlinear"],"hotkeys":{"workspace:split-vertical":[{"modifiers":["Alt"],"key":"v"}],"workspace:split-horizontal":[{"modifiers":["Alt"],"key":"h"}],"app:toggle-left-sidebar":[{"modifiers":["Alt"],"key":"l"}],"app:toggle-right-sidebar":[{"modifiers":["Alt"],"key":"r"}],"editor:save-file":[{"modifiers":["Mod"],"key":"S"}],"editor:swap-line-down":[{"modifiers":["Alt"],"key":"D"}],"editor:swap-line-up":[{"modifiers":["Alt"],"key":"U"}],"editor:toggle-fold":[{"modifiers":["Alt"],"key":"F"}],"editor:toggle-highlight":[{"modifiers":["Alt"],"key":"M"}],"wikilinks-to-mdlinks-obsidian:toggle-wiki-md-links":[{"modifiers":["Mod","Shift"],"key":"L"}],"workspace:close":[],"editor:delete-paragraph":[{"modifiers":["Mod"],"key":"D"}],"editor:insert-link":[],"app:go-back":[{"modifiers":["Alt"],"key":"ArrowLeft"}],"app:go-forward":[{"modifiers":["Alt"],"key":"ArrowRight"}],"obsidian-git:push":[{"modifiers":["Mod","Shift"],"key":"G"}],"switcher:open":[{"modifiers":["Mod","Shift"],"key":"S"}],"obsidian-hider:toggle-hider-status":[{"modifiers":["Alt"],"key":"S"}],"obsidian-hider:toggle-app-ribbon":[{"modifiers":["Alt"],"key":"A"}],"command-palette:open":[{"modifiers":["Mod","Shift"],"key":"P"}],"editor:open-link-in-new-leaf":[],"app:open-settings":[],"editor:toggle-checklist-status":[],"workspace:toggle-pin":[{"modifiers":["Mod"],"key":"E"}],"workspace:export-pdf":[{"modifiers":["Mod"],"key":"P"}]},"promptDelete":false,"newLinkFormat":"relative","useMarkdownLinks":false,"strictLineBreaks":true,"foldHeading":true,"foldIndent":true,"alwaysUpdateLinks":true,"newFileLocation":"current","attachmentFolderPath":"images","pdfExportSettings":{"pageSize":"A4","landscape":false,"margin":"0","downscalePercent":100},"spellcheckDictionary":["imperfective","Elative","Anaphoric","Epexegetical","Substantival","Ingressive","Aorist","Constative"],"fileSortOrder":"alphabetical","showUnsupportedFiles":true} \ No newline at end of file diff --git a/.obsidian/graph.json b/.obsidian/graph.json new file mode 100644 index 0000000..3ae0a1d --- /dev/null +++ b/.obsidian/graph.json @@ -0,0 +1 @@ +{"search":"","showTags":false,"showAttachments":false,"hideUnresolved":false,"showOrphans":true,"showArrow":false,"textFadeMultiplier":0,"nodeSizeMultiplier":1,"lineSizeMultiplier":1,"centerStrength":0.518713248970312,"repelStrength":10,"linkStrength":1,"linkDistance":250,"scale":1} \ No newline at end of file diff --git a/.obsidian/plugins/cm-show-whitespace-obsidian/data.json b/.obsidian/plugins/cm-show-whitespace-obsidian/data.json new file mode 100644 index 0000000..3d5df10 --- /dev/null +++ b/.obsidian/plugins/cm-show-whitespace-obsidian/data.json @@ -0,0 +1 @@ +{"enabled":true,"showNewline":true,"showTab":true,"showSpace":true,"showSingleSpace":true,"showTrailingSpace":true,"showStrictLineBreak":false} \ No newline at end of file diff --git a/.obsidian/plugins/cm-show-whitespace-obsidian/main.js b/.obsidian/plugins/cm-show-whitespace-obsidian/main.js new file mode 100644 index 0000000..cb92d40 --- /dev/null +++ b/.obsidian/plugins/cm-show-whitespace-obsidian/main.js @@ -0,0 +1,344 @@ +'use strict'; + +var obsidian = require('obsidian'); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + 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; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +CodeMirror.defineOption('showInvisibles', false, (cm, val, prev) => { + let Count = 0; + const Maximum = cm.getOption('maxInvisibles') || 16; + if (prev === CodeMirror.Init) + prev = false; + if (prev && !val) { + cm.removeOverlay('invisibles'); + return; + } + if (!prev && val) { + //add(Maximum); + cm.addOverlay({ + name: 'invisibles', + token: function nextToken(stream) { + let spaces = 0; + let peek = stream.peek() === ' '; + if (peek) { + while (peek && spaces < Maximum) { + ++spaces; + stream.next(); + peek = stream.peek() === ' '; + } + let ret = 'whitespace whitespace-' + spaces; + /* + * styles should be different + * could not be two same styles + * beside because of this check in runmode + * function in `codemirror.js`: + * + * 6624: if (!flattenSpans || curStyle != style) {} + */ + if (spaces === Maximum) + ret += ' whitespace-rand-' + Count++; + return ret; + } + while (!stream.eol() && !peek) { + stream.next(); + peek = stream.peek() === ' '; + } + return 'cm-eol'; + }, + }); + } +}); + +var DEFAULT_SETTINGS = { + enabled: true, + showNewline: true, + showTab: true, + showSpace: true, + showSingleSpace: true, + showTrailingSpace: true, + showStrictLineBreak: false +}; +var CMShowWhitespacePlugin = /** @class */ (function (_super) { + __extends(CMShowWhitespacePlugin, _super); + function CMShowWhitespacePlugin() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.disable = function () { + document.body.classList.remove('plugin-cm-show-whitespace'); + // @ts-ignore + _this.app.workspace.iterateCodeMirrors(function (cm) { return cm.setOption("showInvisibles", false); }); + _this.saveSettings({ enabled: false }); + }; + _this.enable = function () { + document.body.classList.add('plugin-cm-show-whitespace'); + // @ts-ignore + _this.registerCodeMirror(function (cm) { return cm.setOption("showInvisibles", true); }); + _this.saveSettings({ enabled: true }); + }; + _this.updateHiddenChars = function () { + var _a = _this.settings, showNewline = _a.showNewline, showSingleSpace = _a.showSingleSpace, showSpace = _a.showSpace, showTab = _a.showTab, showTrailingSpace = _a.showTrailingSpace, showStrictLineBreak = _a.showStrictLineBreak; + var classList = document.body.classList; + classList.toggle('plugin-cm-show-whitespace-hide-newline', !showNewline); + classList.toggle('plugin-cm-show-whitespace-hide-tab', !showTab); + classList.toggle('plugin-cm-show-whitespace-hide-space', !showSpace); + classList.toggle('plugin-cm-show-whitespace-hide-single-space', !showSingleSpace); + classList.toggle('plugin-cm-show-whitespace-hide-trailing-space', !showTrailingSpace); + classList.toggle('plugin-cm-show-whitespace-show-strict-line-break', showStrictLineBreak); + }; + return _this; + } + CMShowWhitespacePlugin.prototype.onload = function () { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.loadSettings()]; + case 1: + _a.sent(); + if (this.settings.enabled) { + this.app.workspace.layoutReady ? this.enable() : this.app.workspace.on('layout-ready', this.enable); + } + // add the toggle on/off command + this.addCommand({ + id: 'toggle-show-whitespace', + name: 'Toggle On/Off', + callback: function () { + // disable or enable as necessary + _this.settings.enabled ? _this.disable() : _this.enable(); + } + }); + this.addSettingTab(new CMShowWhitespacePluginSettingTab(this.app, this)); + return [2 /*return*/]; + } + }); + }); + }; + CMShowWhitespacePlugin.prototype.onunload = function () { + this.disable(); + }; + CMShowWhitespacePlugin.prototype.loadSettings = function () { + return __awaiter(this, void 0, void 0, function () { + var _a, _b, _c, _d; + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + _a = this; + _c = (_b = Object).assign; + _d = [DEFAULT_SETTINGS]; + return [4 /*yield*/, this.loadData()]; + case 1: + _a.settings = _c.apply(_b, _d.concat([_e.sent()])); + return [2 /*return*/]; + } + }); + }); + }; + CMShowWhitespacePlugin.prototype.saveSettings = function (newSettings) { + if (newSettings === void 0) { newSettings = {}; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.settings = Object.assign(this.settings, newSettings); + return [4 /*yield*/, this.saveData(this.settings)]; + case 1: + _a.sent(); + this.updateHiddenChars(); + return [2 /*return*/]; + } + }); + }); + }; + return CMShowWhitespacePlugin; +}(obsidian.Plugin)); +var CMShowWhitespacePluginSettingTab = /** @class */ (function (_super) { + __extends(CMShowWhitespacePluginSettingTab, _super); + function CMShowWhitespacePluginSettingTab(app, plugin) { + var _this = _super.call(this, app, plugin) || this; + _this.plugin = plugin; + return _this; + } + CMShowWhitespacePluginSettingTab.prototype.display = function () { + var _this = this; + var _a = this, containerEl = _a.containerEl, settings = _a.plugin.settings; + containerEl.empty(); + containerEl.classList.add('plugin-cm-show-whitespace-settings'); + new obsidian.Setting(containerEl) + .setName("Toggle Show Whitespace") + .setDesc("Turns show whitespace on or off globally") + .addToggle(function (toggle) { + return toggle.setValue(_this.plugin.settings.enabled) + .onChange(function (newValue) { newValue ? _this.plugin.enable() : _this.plugin.disable(); }); + }); + // --- + new obsidian.Setting(containerEl).setHeading().setName('Spaces'); + // --- + new obsidian.Setting(containerEl) + .setName('Show space characters') + .setDesc('Show or hide the space character. Note: This will also hide single space characters.') + .addToggle(function (toggle) { + return toggle.setValue(_this.plugin.settings.showSpace).onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.plugin.saveSettings({ showSpace: value, showSingleSpace: value })]; + case 1: + _a.sent(); + this.display(); + return [2 /*return*/]; + } + }); + }); }); + }); + var singleSpaceSetting = new obsidian.Setting(containerEl) + .setName('Show single space characters') + .setDesc('Show or hide single space characters') + .addToggle(function (toggle) { + toggle.setValue(_this.plugin.settings.showSingleSpace).onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.plugin.saveSettings({ showSingleSpace: value })]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); }); + }); + if (!settings.showSpace) { + // if general spaces are off it doesn't make sense to change the setting + // to show or hide single spaces between words + singleSpaceSetting.setClass('plugin-cm-show-whitespace-disabled'); + } + new obsidian.Setting(containerEl) + .setName('Show trailing space characters') + .setDesc('Show or hide trailing space characters') + .addToggle(function (toggle) { + return toggle.setValue(_this.plugin.settings.showTrailingSpace).onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.plugin.saveSettings({ showTrailingSpace: value })]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); }); + }); + // --- + new obsidian.Setting(containerEl).setHeading().setName('Other whitespace characters'); + // --- + new obsidian.Setting(containerEl) + .setName('Show newline characters') + .setDesc('Show or hide the newline character') + .addToggle(function (toggle) { + return toggle.setValue(_this.plugin.settings.showNewline).onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.plugin.saveSettings({ showNewline: value })]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); }); + }); + new obsidian.Setting(containerEl) + .setName('Show strict line break characters') + .setDesc('Show or hide a different character for strict line breaks (two spaces followed by new line)') + .addToggle(function (toggle) { + return toggle.setValue(_this.plugin.settings.showStrictLineBreak).onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.plugin.saveSettings({ showStrictLineBreak: value })]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); }); + }); + new obsidian.Setting(containerEl) + .setName('Show tab characters') + .setDesc('Show or hide the tab character') + .addToggle(function (toggle) { + return toggle.setValue(_this.plugin.settings.showTab).onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.plugin.saveSettings({ showTab: value })]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); }); + }); + }; + return CMShowWhitespacePluginSettingTab; +}(obsidian.PluginSettingTab)); + +module.exports = CMShowWhitespacePlugin; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsImNtLXNob3ctaW52aXNpYmxlcy5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuIiwiQ29kZU1pcnJvci5kZWZpbmVPcHRpb24oJ3Nob3dJbnZpc2libGVzJywgZmFsc2UsIChjbSwgdmFsLCBwcmV2KSA9PiB7XG4gIGxldCBDb3VudCA9IDA7XG4gIGNvbnN0IE1heGltdW0gPSBjbS5nZXRPcHRpb24oJ21heEludmlzaWJsZXMnKSB8fCAxNjtcbiAgaWYgKHByZXYgPT09IENvZGVNaXJyb3IuSW5pdClcbiAgICBwcmV2ID0gZmFsc2U7XG4gIGlmIChwcmV2ICYmICF2YWwpIHtcbiAgICBjbS5yZW1vdmVPdmVybGF5KCdpbnZpc2libGVzJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghcHJldiAmJiB2YWwpIHtcbiAgICAvL2FkZChNYXhpbXVtKTtcbiAgICBjbS5hZGRPdmVybGF5KHtcbiAgICAgIG5hbWU6ICdpbnZpc2libGVzJyxcbiAgICAgIHRva2VuOiBmdW5jdGlvbiBuZXh0VG9rZW4oc3RyZWFtKSB7XG4gICAgICAgIGxldCBzcGFjZXMgPSAwO1xuICAgICAgICBsZXQgcGVlayA9IHN0cmVhbS5wZWVrKCkgPT09ICcgJztcbiAgICAgICAgaWYgKHBlZWspIHtcbiAgICAgICAgICB3aGlsZSAocGVlayAmJiBzcGFjZXMgPCBNYXhpbXVtKSB7XG4gICAgICAgICAgICArK3NwYWNlcztcbiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgICAgICBwZWVrID0gc3RyZWFtLnBlZWsoKSA9PT0gJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgcmV0ID0gJ3doaXRlc3BhY2Ugd2hpdGVzcGFjZS0nICsgc3BhY2VzO1xuICAgICAgICAgIC8qXG4gICAgICAgICAgICogc3R5bGVzIHNob3VsZCBiZSBkaWZmZXJlbnRcbiAgICAgICAgICAgKiBjb3VsZCBub3QgYmUgdHdvIHNhbWUgc3R5bGVzXG4gICAgICAgICAgICogYmVzaWRlIGJlY2F1c2Ugb2YgdGhpcyBjaGVjayBpbiBydW5tb2RlXG4gICAgICAgICAgICogZnVuY3Rpb24gaW4gYGNvZGVtaXJyb3IuanNgOlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogNjYyNDogaWYgKCFmbGF0dGVuU3BhbnMgfHwgY3VyU3R5bGUgIT0gc3R5bGUpIHt9XG4gICAgICAgICAgICovXG4gICAgICAgICAgaWYgKHNwYWNlcyA9PT0gTWF4aW11bSlcbiAgICAgICAgICAgIHJldCArPSAnIHdoaXRlc3BhY2UtcmFuZC0nICsgQ291bnQrKztcbiAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpICYmICFwZWVrKSB7XG4gICAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgICBwZWVrID0gc3RyZWFtLnBlZWsoKSA9PT0gJyAnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnY20tZW9sJztcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn0pOyIsImltcG9ydCAnLi9zdHlsZXMuc2NzcydcbmltcG9ydCAnLi9jbS1zaG93LWludmlzaWJsZXMnXG5pbXBvcnQgeyBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIEFwcCwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW50ZXJmYWNlIENNU2hvd1doaXRlc3BhY2VQbHVnaW5TZXR0aW5ncyB7XG4gIGVuYWJsZWQ6IGJvb2xlYW47XG4gIHNob3dOZXdsaW5lOiBib29sZWFuO1xuICBzaG93VGFiOiBib29sZWFuO1xuICBzaG93U3BhY2U6IGJvb2xlYW47XG4gIHNob3dTaW5nbGVTcGFjZTogYm9vbGVhbjtcbiAgc2hvd1RyYWlsaW5nU3BhY2U6IGJvb2xlYW47XG4gIHNob3dTdHJpY3RMaW5lQnJlYWs6IGJvb2xlYW47XG59XG5cbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IENNU2hvd1doaXRlc3BhY2VQbHVnaW5TZXR0aW5ncyA9IHtcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgc2hvd05ld2xpbmU6IHRydWUsXG4gIHNob3dUYWI6IHRydWUsXG4gIHNob3dTcGFjZTogdHJ1ZSxcbiAgc2hvd1NpbmdsZVNwYWNlOiB0cnVlLFxuICBzaG93VHJhaWxpbmdTcGFjZTogdHJ1ZSxcbiAgc2hvd1N0cmljdExpbmVCcmVhazogZmFsc2Vcbn07XG4gICAgXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDTVNob3dXaGl0ZXNwYWNlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcblxuICBzZXR0aW5nczogQ01TaG93V2hpdGVzcGFjZVBsdWdpblNldHRpbmdzO1xuXG4gIGFzeW5jIG9ubG9hZCgpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgKHRoaXMuYXBwLndvcmtzcGFjZSBhcyBhbnkpLmxheW91dFJlYWR5ID8gdGhpcy5lbmFibGUoKSA6IHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LXJlYWR5JywgdGhpcy5lbmFibGUpO1xuICAgIH1cblxuICAgIC8vIGFkZCB0aGUgdG9nZ2xlIG9uL29mZiBjb21tYW5kXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgIGlkOiAndG9nZ2xlLXNob3ctd2hpdGVzcGFjZScsXG4gICAgICBuYW1lOiAnVG9nZ2xlIE9uL09mZicsXG4gICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAvLyBkaXNhYmxlIG9yIGVuYWJsZSBhcyBuZWNlc3NhcnlcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5lbmFibGVkID8gdGhpcy5kaXNhYmxlKCkgOiB0aGlzLmVuYWJsZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBDTVNob3dXaGl0ZXNwYWNlUGx1Z2luU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuICB9XG5cbiAgb251bmxvYWQoKSB7XG4gICAgdGhpcy5kaXNhYmxlKCk7XG4gIH1cblxuICBkaXNhYmxlID0gKCkgPT4ge1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgncGx1Z2luLWNtLXNob3ctd2hpdGVzcGFjZScpO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuYXBwLndvcmtzcGFjZS5pdGVyYXRlQ29kZU1pcnJvcnMoY20gPT4gY20uc2V0T3B0aW9uKFwic2hvd0ludmlzaWJsZXNcIiwgZmFsc2UpKTtcblxuICAgIHRoaXMuc2F2ZVNldHRpbmdzKHtlbmFibGVkOmZhbHNlfSk7XG4gIH1cblxuICBlbmFibGUgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdwbHVnaW4tY20tc2hvdy13aGl0ZXNwYWNlJyk7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5yZWdpc3RlckNvZGVNaXJyb3IoY20gPT4gY20uc2V0T3B0aW9uKFwic2hvd0ludmlzaWJsZXNcIiwgdHJ1ZSkpO1xuXG4gICAgdGhpcy5zYXZlU2V0dGluZ3Moe2VuYWJsZWQ6dHJ1ZX0pO1xuICB9XG5cbiAgdXBkYXRlSGlkZGVuQ2hhcnMgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzaG93TmV3bGluZSwgc2hvd1NpbmdsZVNwYWNlLCBzaG93U3BhY2UsIHNob3dUYWIsIHNob3dUcmFpbGluZ1NwYWNlLCBzaG93U3RyaWN0TGluZUJyZWFrIH0gPSB0aGlzLnNldHRpbmdzO1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0O1xuXG4gICAgY2xhc3NMaXN0LnRvZ2dsZSgncGx1Z2luLWNtLXNob3ctd2hpdGVzcGFjZS1oaWRlLW5ld2xpbmUnLCAhc2hvd05ld2xpbmUpO1xuICAgIGNsYXNzTGlzdC50b2dnbGUoJ3BsdWdpbi1jbS1zaG93LXdoaXRlc3BhY2UtaGlkZS10YWInLCAhc2hvd1RhYik7XG4gICAgY2xhc3NMaXN0LnRvZ2dsZSgncGx1Z2luLWNtLXNob3ctd2hpdGVzcGFjZS1oaWRlLXNwYWNlJywgIXNob3dTcGFjZSk7XG4gICAgY2xhc3NMaXN0LnRvZ2dsZSgncGx1Z2luLWNtLXNob3ctd2hpdGVzcGFjZS1oaWRlLXNpbmdsZS1zcGFjZScsICFzaG93U2luZ2xlU3BhY2UpO1xuICAgIGNsYXNzTGlzdC50b2dnbGUoJ3BsdWdpbi1jbS1zaG93LXdoaXRlc3BhY2UtaGlkZS10cmFpbGluZy1zcGFjZScsICFzaG93VHJhaWxpbmdTcGFjZSk7XG4gICAgY2xhc3NMaXN0LnRvZ2dsZSgncGx1Z2luLWNtLXNob3ctd2hpdGVzcGFjZS1zaG93LXN0cmljdC1saW5lLWJyZWFrJywgc2hvd1N0cmljdExpbmVCcmVhayk7XG4gIH1cblxuICBhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVTZXR0aW5ncyhuZXdTZXR0aW5ncyA9IHt9KSB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24odGhpcy5zZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG4gICAgdGhpcy51cGRhdGVIaWRkZW5DaGFycygpO1xuICB9XG59XG5cbmNsYXNzIENNU2hvd1doaXRlc3BhY2VQbHVnaW5TZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHBsdWdpbjogQ01TaG93V2hpdGVzcGFjZVBsdWdpbjtcblxuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBDTVNob3dXaGl0ZXNwYWNlUGx1Z2luKSB7XG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICB9XG5cbiAgZGlzcGxheSgpOiB2b2lkIHtcbiAgICBsZXQge1xuICAgICAgY29udGFpbmVyRWwsXG4gICAgICBwbHVnaW46IHsgc2V0dGluZ3MgfSxcbiAgICB9ID0gdGhpcztcblxuICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG4gICAgY29udGFpbmVyRWwuY2xhc3NMaXN0LmFkZCgncGx1Z2luLWNtLXNob3ctd2hpdGVzcGFjZS1zZXR0aW5ncycpO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZShcIlRvZ2dsZSBTaG93IFdoaXRlc3BhY2VcIilcbiAgICAgIC5zZXREZXNjKFwiVHVybnMgc2hvdyB3aGl0ZXNwYWNlIG9uIG9yIG9mZiBnbG9iYWxseVwiKVxuICAgICAgLmFkZFRvZ2dsZSh0b2dnbGUgPT5cbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZWQpXG4gICAgICAgICAgLm9uQ2hhbmdlKChuZXdWYWx1ZSkgPT4geyBuZXdWYWx1ZSA/IHRoaXMucGx1Z2luLmVuYWJsZSgpIDogdGhpcy5wbHVnaW4uZGlzYWJsZSgpIH0pXG4gICAgICApO1xuICAgIFxuICAgIC8vIC0tLVxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKS5zZXRIZWFkaW5nKCkuc2V0TmFtZSgnU3BhY2VzJyk7XG4gICAgLy8gLS0tXG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKCdTaG93IHNwYWNlIGNoYXJhY3RlcnMnKVxuICAgICAgLnNldERlc2MoJ1Nob3cgb3IgaGlkZSB0aGUgc3BhY2UgY2hhcmFjdGVyLiBOb3RlOiBUaGlzIHdpbGwgYWxzbyBoaWRlIHNpbmdsZSBzcGFjZSBjaGFyYWN0ZXJzLicpXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93U3BhY2UpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncyh7IHNob3dTcGFjZTogdmFsdWUsIHNob3dTaW5nbGVTcGFjZTogdmFsdWV9KTtcbiAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICAgIFxuICAgIGNvbnN0IHNpbmdsZVNwYWNlU2V0dGluZyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoJ1Nob3cgc2luZ2xlIHNwYWNlIGNoYXJhY3RlcnMnKVxuICAgICAgLnNldERlc2MoJ1Nob3cgb3IgaGlkZSBzaW5nbGUgc3BhY2UgY2hhcmFjdGVycycpXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dTaW5nbGVTcGFjZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKHsgc2hvd1NpbmdsZVNwYWNlOiB2YWx1ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICBpZiAoIXNldHRpbmdzLnNob3dTcGFjZSkge1xuICAgICAgLy8gaWYgZ2VuZXJhbCBzcGFjZXMgYXJlIG9mZiBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gY2hhbmdlIHRoZSBzZXR0aW5nXG4gICAgICAvLyB0byBzaG93IG9yIGhpZGUgc2luZ2xlIHNwYWNlcyBiZXR3ZWVuIHdvcmRzXG4gICAgICBzaW5nbGVTcGFjZVNldHRpbmcuc2V0Q2xhc3MoJ3BsdWdpbi1jbS1zaG93LXdoaXRlc3BhY2UtZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKCdTaG93IHRyYWlsaW5nIHNwYWNlIGNoYXJhY3RlcnMnKVxuICAgICAgLnNldERlc2MoJ1Nob3cgb3IgaGlkZSB0cmFpbGluZyBzcGFjZSBjaGFyYWN0ZXJzJylcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dUcmFpbGluZ1NwYWNlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoeyBzaG93VHJhaWxpbmdTcGFjZTogdmFsdWV9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAvLyAtLS1cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbCkuc2V0SGVhZGluZygpLnNldE5hbWUoJ090aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycycpO1xuICAgIC8vIC0tLVxuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZSgnU2hvdyBuZXdsaW5lIGNoYXJhY3RlcnMnKVxuICAgICAgLnNldERlc2MoJ1Nob3cgb3IgaGlkZSB0aGUgbmV3bGluZSBjaGFyYWN0ZXInKVxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd05ld2xpbmUpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncyh7IHNob3dOZXdsaW5lOiB2YWx1ZSB9KTtcbiAgICAgICAgfSlcbiAgICApO1xuICAgIFxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoJ1Nob3cgc3RyaWN0IGxpbmUgYnJlYWsgY2hhcmFjdGVycycpXG4gICAgICAuc2V0RGVzYygnU2hvdyBvciBoaWRlIGEgZGlmZmVyZW50IGNoYXJhY3RlciBmb3Igc3RyaWN0IGxpbmUgYnJlYWtzICh0d28gc3BhY2VzIGZvbGxvd2VkIGJ5IG5ldyBsaW5lKScpXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93U3RyaWN0TGluZUJyZWFrKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoeyBzaG93U3RyaWN0TGluZUJyZWFrOiB2YWx1ZSB9KTtcbiAgICAgICAgfSlcbiAgICApO1xuICAgIFxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoJ1Nob3cgdGFiIGNoYXJhY3RlcnMnKVxuICAgICAgLnNldERlc2MoJ1Nob3cgb3IgaGlkZSB0aGUgdGFiIGNoYXJhY3RlcicpXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93VGFiKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoeyBzaG93VGFiOiB2YWx1ZSB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJQbHVnaW4iLCJTZXR0aW5nIiwiUGx1Z2luU2V0dGluZ1RhYiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjO0FBQ3pDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNwRixRQUFRLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMxRyxJQUFJLE9BQU8sYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFDRjtBQUNPLFNBQVMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLElBQUksU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQzNDLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBdUNEO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUN0RyxRQUFRLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUN0SCxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RSxLQUFLLENBQUMsQ0FBQztBQUNQLENBQUM7QUFDRDtBQUNPLFNBQVMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDM0MsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JILElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sTUFBTSxLQUFLLFVBQVUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0osSUFBSSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0RSxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsRUFBRTtBQUN0QixRQUFRLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUN0RSxRQUFRLE9BQU8sQ0FBQyxFQUFFLElBQUk7QUFDdEIsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6SyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEQsWUFBWSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07QUFDOUMsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN4RSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0I7QUFDaEIsb0JBQW9CLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7QUFDaEksb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDMUcsb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUN6RixvQkFBb0IsSUFBSSxD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 diff --git a/.obsidian/plugins/cm-show-whitespace-obsidian/manifest.json b/.obsidian/plugins/cm-show-whitespace-obsidian/manifest.json new file mode 100644 index 0000000..d665557 --- /dev/null +++ b/.obsidian/plugins/cm-show-whitespace-obsidian/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "cm-show-whitespace-obsidian", + "name": "Show Whitespace", + "author": "death_au", + "authorUrl": "https://github.com/deathau", + "description": "Show whitespace in the editor", + "isDesktopOnly": false, + "version": "0.3.1", + "minAppVersion": "0.10.0" +} \ No newline at end of file diff --git a/.obsidian/plugins/cm-show-whitespace-obsidian/styles.css b/.obsidian/plugins/cm-show-whitespace-obsidian/styles.css new file mode 100644 index 0000000..92bda0f --- /dev/null +++ b/.obsidian/plugins/cm-show-whitespace-obsidian/styles.css @@ -0,0 +1,122 @@ +@charset "UTF-8"; +.plugin-cm-show-whitespace-settings .plugin-cm-show-whitespace-disabled { + opacity: 0.6; +} +.plugin-cm-show-whitespace-settings .plugin-cm-show-whitespace-disabled .checkbox-container { + cursor: not-allowed; + pointer-events: none; +} + +body.plugin-cm-show-whitespace { + /* feel free to override these characters if you want */ + --spaceChar: "·"; + --trailingSpaceChar: "·"; + --singleSpaceChar: var(--spaceChar); + --tabChar: "→"; + --newlineChar: "¬"; + --strictLineBreakChar: var(--newlineChar); +} +body.plugin-cm-show-whitespace.plugin-cm-show-whitespace-hide-space { + --spaceChar: ""; +} +body.plugin-cm-show-whitespace.plugin-cm-show-whitespace-hide-tab { + --tabChar: ""; +} +body.plugin-cm-show-whitespace.plugin-cm-show-whitespace-hide-newline { + --newlineChar: ""; +} +body.plugin-cm-show-whitespace.plugin-cm-show-whitespace-hide-single-space { + --singleSpaceChar: ""; +} +body.plugin-cm-show-whitespace.plugin-cm-show-whitespace-hide-trailing-space { + --trailingSpaceChar: ""; +} +body.plugin-cm-show-whitespace.plugin-cm-show-whitespace-show-strict-line-break { + --strictLineBreakChar: "↲"; +} +body.plugin-cm-show-whitespace .cm-whitespace::before, +body.plugin-cm-show-whitespace .cm-tab::before, +body.plugin-cm-show-whitespace .CodeMirror-code > div > pre > span > :last-child:after, +body.plugin-cm-show-whitespace .CodeMirror-line > span > :last-child::after, +body.plugin-cm-show-whitespace [class*=cm-trailing-space] + [class*=cm-trailing-space]:last-child::after { + pointer-events: none; + color: var(--text-faint); + font-weight: bolder; +} +body.plugin-cm-show-whitespace [class*=cm-trailing-space]::before { + content: var(--trailingSpaceChar); +} +body.plugin-cm-show-whitespace .cm-tab::before { + content: var(--tabChar); +} +body.plugin-cm-show-whitespace .CodeMirror-code > div > pre > span > :last-child:after, +body.plugin-cm-show-whitespace .CodeMirror-line > span > :last-child::after { + content: var(--newlineChar); + position: unset; +} +body.plugin-cm-show-whitespace [class*=cm-trailing-space] + [class*=cm-trailing-space]:last-child::after { + content: var(--strictLineBreakChar); + position: unset; +} +body.plugin-cm-show-whitespace .cm-whitespace::before, +body.plugin-cm-show-whitespace .cm-tab::before { + position: absolute; +} +body.plugin-cm-show-whitespace .cm-s-obsidian span.cm-inline-code.cm-whitespace::before { + line-height: 2em; +} +body.plugin-cm-show-whitespace .CodeMirror-code > div:last-child > pre > span::after, +body.plugin-cm-show-whitespace .CodeMirror-code > pre:last-child > span::after { + display: none; +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-1:not([class*=cm-trailing-space-])::before { + content: var(--singleSpaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-2:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-3:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-4:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-5:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-6:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-7:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-8:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-9:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-10:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-11:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-12:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-13:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-14:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-15:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-16:not([class*=cm-trailing-space-])::before { + content: var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar) var(--spaceChar); +} +body.plugin-cm-show-whitespace .CodeMirror .cm-whitespace-1:last-of-type::before { + content: var(--trailingSpaceChar); +} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-git/data.json b/.obsidian/plugins/obsidian-git/data.json new file mode 100644 index 0000000..0f9065a --- /dev/null +++ b/.obsidian/plugins/obsidian-git/data.json @@ -0,0 +1 @@ +{"commitMessage":"vault backup: {{date}}","commitDateFormat":"YYYY-MM-DD HH:mm:ss","autoSaveInterval":30,"autoPullOnBoot":true,"disablePopups":false,"currentBranch":"master","remote":"origin"} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-git/main.js b/.obsidian/plugins/obsidian-git/main.js new file mode 100644 index 0000000..8abe2f0 --- /dev/null +++ b/.obsidian/plugins/obsidian-git/main.js @@ -0,0 +1,5929 @@ +'use strict'; + +var obsidian = require('obsidian'); +var child_process_1 = require('child_process'); +var fs_1 = require('fs'); +var tty = require('tty'); +var util$1 = require('util'); +var os = require('os'); + +function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + +var child_process_1__default = /*#__PURE__*/_interopDefaultLegacy(child_process_1); +var fs_1__default = /*#__PURE__*/_interopDefaultLegacy(fs_1); +var tty__default = /*#__PURE__*/_interopDefaultLegacy(tty); +var util__default = /*#__PURE__*/_interopDefaultLegacy(util$1); +var os__default = /*#__PURE__*/_interopDefaultLegacy(os); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + 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; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +function createCommonjsModule(fn, basedir, module) { + return module = { + path: basedir, + exports: {}, + require: function (path, base) { + return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); + } + }, fn(module, module.exports), module.exports; +} + +function commonjsRequire () { + throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); +} + +var gitError = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitError = void 0; +/** + * The `GitError` is thrown when the underlying `git` process throws a + * fatal exception (eg an `ENOENT` exception when attempting to use a + * non-writable directory as the root for your repo), and acts as the + * base class for more specific errors thrown by the parsing of the + * git response or errors in the configuration of the task about to + * be run. + * + * When an exception is thrown, pending tasks in the same instance will + * not be executed. The recommended way to run a series of tasks that + * can independently fail without needing to prevent future tasks from + * running is to catch them individually: + * + * ```typescript + import { gitP, SimpleGit, GitError, PullResult } from 'simple-git'; + + function catchTask (e: GitError) { + return e. + } + + const git = gitP(repoWorkingDir); + const pulled: PullResult | GitError = await git.pull().catch(catchTask); + const pushed: string | GitError = await git.pushTags().catch(catchTask); + ``` + */ +class GitError extends Error { + constructor(task, message) { + super(message); + this.task = task; + Object.setPrototypeOf(this, new.target.prototype); + } +} +exports.GitError = GitError; + +}); + +var gitResponseError = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitResponseError = void 0; + +/** + * The `GitResponseError` is the wrapper for a parsed response that is treated as + * a fatal error, for example attempting a `merge` can leave the repo in a corrupted + * state when there are conflicts so the task will reject rather than resolve. + * + * For example, catching the merge conflict exception: + * + * ```typescript + import { gitP, SimpleGit, GitResponseError, MergeSummary } from 'simple-git'; + + const git = gitP(repoRoot); + const mergeOptions: string[] = ['--no-ff', 'other-branch']; + const mergeSummary: MergeSummary = await git.merge(mergeOptions) + .catch((e: GitResponseError) => e.git); + + if (mergeSummary.failed) { + // deal with the error + } + ``` + */ +class GitResponseError extends gitError.GitError { + constructor( + /** + * `.git` access the parsed response that is treated as being an error + */ + git, message) { + super(undefined, message || String(git)); + this.git = git; + } +} +exports.GitResponseError = GitResponseError; + +}); + +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var w = d * 7; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +var ms = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); +} + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + */ + +function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = ms; + createDebug.destroy = destroy; + + Object.keys(env).forEach(key => { + createDebug[key] = env[key]; + }); + + /** + * The currently active debug mode names, and names to skip. + */ + + createDebug.names = []; + createDebug.skips = []; + + /** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + createDebug.formatters = {}; + + /** + * Selects a color for a debug namespace + * @param {String} namespace The namespace string for the for the debug instance to be colored + * @return {Number|String} An ANSI color code for the given namespace + * @api private + */ + function selectColor(namespace) { + let hash = 0; + + for (let i = 0; i < namespace.length; i++) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + + /** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + + function debug(...args) { + // Disabled? + if (!debug.enabled) { + return; + } + + const self = debug; + + // Set `diff` timestamp + const curr = Number(new Date()); + const ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + args[0] = createDebug.coerce(args[0]); + + if (typeof args[0] !== 'string') { + // Anything else let's inspect with %O + args.unshift('%O'); + } + + // Apply any `formatters` transformations + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + // If we encounter an escaped % then don't increase the array index + if (match === '%%') { + return '%'; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === 'function') { + const val = args[index]; + match = formatter.call(self, val); + + // Now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // Apply env-specific formatting (colors, etc.) + createDebug.formatArgs.call(self, args); + + const logFn = self.log || createDebug.log; + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.useColors = createDebug.useColors(); + debug.color = createDebug.selectColor(namespace); + debug.extend = extend; + debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. + + Object.defineProperty(debug, 'enabled', { + enumerable: true, + configurable: false, + get: () => enableOverride === null ? createDebug.enabled(namespace) : enableOverride, + set: v => { + enableOverride = v; + } + }); + + // Env-specific initialization logic for debug instances + if (typeof createDebug.init === 'function') { + createDebug.init(debug); + } + + return debug; + } + + function extend(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + + /** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + function enable(namespaces) { + createDebug.save(namespaces); + + createDebug.names = []; + createDebug.skips = []; + + let i; + const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + const len = split.length; + + for (i = 0; i < len; i++) { + if (!split[i]) { + // ignore empty strings + continue; + } + + namespaces = split[i].replace(/\*/g, '.*?'); + + if (namespaces[0] === '-') { + createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + createDebug.names.push(new RegExp('^' + namespaces + '$')); + } + } + } + + /** + * Disable debug output. + * + * @return {String} namespaces + * @api public + */ + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) + ].join(','); + createDebug.enable(''); + return namespaces; + } + + /** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + function enabled(name) { + if (name[name.length - 1] === '*') { + return true; + } + + let i; + let len; + + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + + return false; + } + + /** + * Convert regexp to namespace + * + * @param {RegExp} regxep + * @return {String} namespace + * @api private + */ + function toNamespace(regexp) { + return regexp.toString() + .substring(2, regexp.toString().length - 2) + .replace(/\.\*\?$/, '*'); + } + + /** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + + /** + * XXX DO NOT USE. This is a temporary stub function. + * XXX It WILL be removed in the next major release. + */ + function destroy() { + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + + createDebug.enable(createDebug.load()); + + return createDebug; +} + +var common = setup; + +var browser = createCommonjsModule(function (module, exports) { +/* eslint-env browser */ + +/** + * This is the web browser implementation of `debug()`. + */ + +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = localstorage(); +exports.destroy = (() => { + let warned = false; + + return () => { + if (!warned) { + warned = true; + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + }; +})(); + +/** + * Colors. + */ + +exports.colors = [ + '#0000CC', + '#0000FF', + '#0033CC', + '#0033FF', + '#0066CC', + '#0066FF', + '#0099CC', + '#0099FF', + '#00CC00', + '#00CC33', + '#00CC66', + '#00CC99', + '#00CCCC', + '#00CCFF', + '#3300CC', + '#3300FF', + '#3333CC', + '#3333FF', + '#3366CC', + '#3366FF', + '#3399CC', + '#3399FF', + '#33CC00', + '#33CC33', + '#33CC66', + '#33CC99', + '#33CCCC', + '#33CCFF', + '#6600CC', + '#6600FF', + '#6633CC', + '#6633FF', + '#66CC00', + '#66CC33', + '#9900CC', + '#9900FF', + '#9933CC', + '#9933FF', + '#99CC00', + '#99CC33', + '#CC0000', + '#CC0033', + '#CC0066', + '#CC0099', + '#CC00CC', + '#CC00FF', + '#CC3300', + '#CC3333', + '#CC3366', + '#CC3399', + '#CC33CC', + '#CC33FF', + '#CC6600', + '#CC6633', + '#CC9900', + '#CC9933', + '#CCCC00', + '#CCCC33', + '#FF0000', + '#FF0033', + '#FF0066', + '#FF0099', + '#FF00CC', + '#FF00FF', + '#FF3300', + '#FF3333', + '#FF3366', + '#FF3399', + '#FF33CC', + '#FF33FF', + '#FF6600', + '#FF6633', + '#FF9900', + '#FF9933', + '#FFCC00', + '#FFCC33' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +// eslint-disable-next-line complexity +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { + return true; + } + + // Internet Explorer and Edge do not support colors. + if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + + // Is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // Is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // Double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + args[0] = (this.useColors ? '%c' : '') + + this.namespace + + (this.useColors ? ' %c' : ' ') + + args[0] + + (this.useColors ? '%c ' : ' ') + + '+' + module.exports.humanize(this.diff); + + if (!this.useColors) { + return; + } + + const c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit'); + + // The final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, match => { + if (match === '%%') { + return; + } + index++; + if (match === '%c') { + // We only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.debug()` when available. + * No-op when `console.debug` is not a "function". + * If `console.debug` is not available, falls back + * to `console.log`. + * + * @api public + */ +exports.log = console.debug || console.log || (() => {}); + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem('debug', namespaces); + } else { + exports.storage.removeItem('debug'); + } + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ +function load() { + let r; + try { + r = exports.storage.getItem('debug'); + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context + // The Browser also has localStorage in the global context. + return localStorage; + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } +} + +module.exports = common(exports); + +const {formatters} = module.exports; + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +formatters.j = function (v) { + try { + return JSON.stringify(v); + } catch (error) { + return '[UnexpectedJSONParseError]: ' + error.message; + } +}; +}); + +var hasFlag = (flag, argv = process.argv) => { + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const position = argv.indexOf(prefix + flag); + const terminatorPosition = argv.indexOf('--'); + return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); +}; + +const {env} = process; + +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false') || + hasFlag('color=never')) { + forceColor = 0; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = 1; +} + +if ('FORCE_COLOR' in env) { + if (env.FORCE_COLOR === 'true') { + forceColor = 1; + } else if (env.FORCE_COLOR === 'false') { + forceColor = 0; + } else { + forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); + } +} + +function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} + +function supportsColor(haveStream, streamIsTTY) { + if (forceColor === 0) { + return 0; + } + + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } + + if (hasFlag('color=256')) { + return 2; + } + + if (haveStream && !streamIsTTY && forceColor === undefined) { + return 0; + } + + const min = forceColor || 0; + + if (env.TERM === 'dumb') { + return min; + } + + if (process.platform === 'win32') { + // Windows 10 build 10586 is the first Windows release that supports 256 colors. + // Windows 10 build 14931 is the first release that supports 16m/TrueColor. + const osRelease = os__default['default'].release().split('.'); + if ( + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + + return 1; + } + + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } + + return min; + } + + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + + if (env.COLORTERM === 'truecolor') { + return 3; + } + + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } + + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + + if ('COLORTERM' in env) { + return 1; + } + + return min; +} + +function getSupportLevel(stream) { + const level = supportsColor(stream, stream && stream.isTTY); + return translateLevel(level); +} + +var supportsColor_1 = { + supportsColor: getSupportLevel, + stdout: translateLevel(supportsColor(true, tty__default['default'].isatty(1))), + stderr: translateLevel(supportsColor(true, tty__default['default'].isatty(2))) +}; + +var node = createCommonjsModule(function (module, exports) { +/** + * Module dependencies. + */ + + + + +/** + * This is the Node.js implementation of `debug()`. + */ + +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.destroy = util__default['default'].deprecate( + () => {}, + 'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.' +); + +/** + * Colors. + */ + +exports.colors = [6, 2, 3, 4, 5, 1]; + +try { + // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json) + // eslint-disable-next-line import/no-extraneous-dependencies + const supportsColor = supportsColor_1; + + if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { + exports.colors = [ + 20, + 21, + 26, + 27, + 32, + 33, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 56, + 57, + 62, + 63, + 68, + 69, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 92, + 93, + 98, + 99, + 112, + 113, + 128, + 129, + 134, + 135, + 148, + 149, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 178, + 179, + 184, + 185, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 214, + 215, + 220, + 221 + ]; + } +} catch (error) { + // Swallow - we only care if `supports-color` is available; it doesn't have to be. +} + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(key => { + return /^debug_/i.test(key); +}).reduce((obj, key) => { + // Camel-case + const prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, (_, k) => { + return k.toUpperCase(); + }); + + // Coerce string value into JS value + let val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) { + val = true; + } else if (/^(no|off|false|disabled)$/i.test(val)) { + val = false; + } else if (val === 'null') { + val = null; + } else { + val = Number(val); + } + + obj[prop] = val; + return obj; +}, {}); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts ? + Boolean(exports.inspectOpts.colors) : + tty__default['default'].isatty(process.stderr.fd); +} + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + const {namespace: name, useColors} = this; + + if (useColors) { + const c = this.color; + const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c); + const prefix = ` ${colorCode};1m${name} \u001B[0m`; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m'); + } else { + args[0] = getDate() + name + ' ' + args[0]; + } +} + +function getDate() { + if (exports.inspectOpts.hideDate) { + return ''; + } + return new Date().toISOString() + ' '; +} + +/** + * Invokes `util.format()` with the specified arguments and writes to stderr. + */ + +function log(...args) { + return process.stderr.write(util__default['default'].format(...args) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + if (namespaces) { + process.env.DEBUG = namespaces; + } else { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init(debug) { + debug.inspectOpts = {}; + + const keys = Object.keys(exports.inspectOpts); + for (let i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +module.exports = common(exports); + +const {formatters} = module.exports; + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +formatters.o = function (v) { + this.inspectOpts.colors = this.useColors; + return util__default['default'].inspect(v, this.inspectOpts) + .split('\n') + .map(str => str.trim()) + .join(' '); +}; + +/** + * Map %O to `util.inspect()`, allowing multiple lines if needed. + */ + +formatters.O = function (v) { + this.inspectOpts.colors = this.useColors; + return util__default['default'].inspect(v, this.inspectOpts); +}; +}); + +var src = createCommonjsModule(function (module) { +/** + * Detect Electron renderer / nwjs process, which is node, but we should + * treat as a browser. + */ + +if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) { + module.exports = browser; +} else { + module.exports = node; +} +}); + +var src$1 = createCommonjsModule(function (module, exports) { +var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); + +const debug_1 = __importDefault(src); +const log = debug_1.default('@kwsites/file-exists'); +function check(path, isFile, isDirectory) { + log(`checking %s`, path); + try { + const stat = fs_1__default['default'].statSync(path); + if (stat.isFile() && isFile) { + log(`[OK] path represents a file`); + return true; + } + if (stat.isDirectory() && isDirectory) { + log(`[OK] path represents a directory`); + return true; + } + log(`[FAIL] path represents something other than a file or directory`); + return false; + } + catch (e) { + if (e.code === 'ENOENT') { + log(`[FAIL] path is not accessible: %o`, e); + return false; + } + log(`[FATAL] %o`, e); + throw e; + } +} +/** + * Synchronous validation of a path existing either as a file or as a directory. + * + * @param {string} path The path to check + * @param {number} type One or both of the exported numeric constants + */ +function exists(path, type = exports.READABLE) { + return check(path, (type & exports.FILE) > 0, (type & exports.FOLDER) > 0); +} +exports.exists = exists; +/** + * Constant representing a file + */ +exports.FILE = 1; +/** + * Constant representing a folder + */ +exports.FOLDER = 2; +/** + * Constant representing either a file or a folder + */ +exports.READABLE = exports.FILE + exports.FOLDER; + +}); + +var dist = createCommonjsModule(function (module, exports) { +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(src$1); + +}); + +var util = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.asNumber = exports.asStringArray = exports.asArray = exports.objectToString = exports.remove = exports.append = exports.folderExists = exports.forEachLineWithContent = exports.toLinesWithContent = exports.last = exports.first = exports.splitOn = exports.isUserFunction = exports.asFunction = exports.NOOP = void 0; + +const NOOP = () => { +}; +exports.NOOP = NOOP; +/** + * Returns either the source argument when it is a `Function`, or the default + * `NOOP` function constant + */ +function asFunction(source) { + return typeof source === 'function' ? source : exports.NOOP; +} +exports.asFunction = asFunction; +/** + * Determines whether the supplied argument is both a function, and is not + * the `NOOP` function. + */ +function isUserFunction(source) { + return (typeof source === 'function' && source !== exports.NOOP); +} +exports.isUserFunction = isUserFunction; +function splitOn(input, char) { + const index = input.indexOf(char); + if (index <= 0) { + return [input, '']; + } + return [ + input.substr(0, index), + input.substr(index + 1), + ]; +} +exports.splitOn = splitOn; +function first(input, offset = 0) { + return isArrayLike(input) && input.length > offset ? input[offset] : undefined; +} +exports.first = first; +function last(input, offset = 0) { + if (isArrayLike(input) && input.length > offset) { + return input[input.length - 1 - offset]; + } +} +exports.last = last; +function isArrayLike(input) { + return !!(input && typeof input.length === 'number'); +} +function toLinesWithContent(input, trimmed = true, separator = '\n') { + return input.split(separator) + .reduce((output, line) => { + const lineContent = trimmed ? line.trim() : line; + if (lineContent) { + output.push(lineContent); + } + return output; + }, []); +} +exports.toLinesWithContent = toLinesWithContent; +function forEachLineWithContent(input, callback) { + return toLinesWithContent(input, true).map(line => callback(line)); +} +exports.forEachLineWithContent = forEachLineWithContent; +function folderExists(path) { + return dist.exists(path, dist.FOLDER); +} +exports.folderExists = folderExists; +/** + * Adds `item` into the `target` `Array` or `Set` when it is not already present. + */ +function append(target, item) { + if (Array.isArray(target)) { + if (!target.includes(item)) { + target.push(item); + } + } + else { + target.add(item); + } + return item; +} +exports.append = append; +function remove(target, item) { + if (Array.isArray(target)) { + const index = target.indexOf(item); + if (index >= 0) { + target.splice(index, 1); + } + } + else { + target.delete(item); + } + return item; +} +exports.remove = remove; +exports.objectToString = Object.prototype.toString.call.bind(Object.prototype.toString); +function asArray(source) { + return Array.isArray(source) ? source : [source]; +} +exports.asArray = asArray; +function asStringArray(source) { + return asArray(source).map(String); +} +exports.asStringArray = asStringArray; +function asNumber(source, onNaN = 0) { + if (source == null) { + return onNaN; + } + const num = parseInt(source, 10); + return isNaN(num) ? onNaN : num; +} +exports.asNumber = asNumber; + +}); + +var argumentFilters = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.filterHasLength = exports.filterFunction = exports.filterPlainObject = exports.filterStringOrStringArray = exports.filterStringArray = exports.filterString = exports.filterPrimitives = exports.filterArray = exports.filterType = void 0; + +function filterType(input, filter, def) { + if (filter(input)) { + return input; + } + return (arguments.length > 2) ? def : undefined; +} +exports.filterType = filterType; +const filterArray = (input) => { + return Array.isArray(input); +}; +exports.filterArray = filterArray; +function filterPrimitives(input, omit) { + return /number|string|boolean/.test(typeof input) && (!omit || !omit.includes((typeof input))); +} +exports.filterPrimitives = filterPrimitives; +const filterString = (input) => { + return typeof input === 'string'; +}; +exports.filterString = filterString; +const filterStringArray = (input) => { + return Array.isArray(input) && input.every(exports.filterString); +}; +exports.filterStringArray = filterStringArray; +const filterStringOrStringArray = (input) => { + return exports.filterString(input) || (Array.isArray(input) && input.every(exports.filterString)); +}; +exports.filterStringOrStringArray = filterStringOrStringArray; +function filterPlainObject(input) { + return !!input && util.objectToString(input) === '[object Object]'; +} +exports.filterPlainObject = filterPlainObject; +function filterFunction(input) { + return typeof input === 'function'; +} +exports.filterFunction = filterFunction; +const filterHasLength = (input) => { + if (input == null || 'number|boolean|function'.includes(typeof input)) { + return false; + } + return Array.isArray(input) || typeof input === 'string' || typeof input.length === 'number'; +}; +exports.filterHasLength = filterHasLength; + +}); + +var exitCodes = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ExitCodes = void 0; +/** + * Known process exit codes used by the task parsers to determine whether an error + * was one they can automatically handle + */ +var ExitCodes; +(function (ExitCodes) { + ExitCodes[ExitCodes["SUCCESS"] = 0] = "SUCCESS"; + ExitCodes[ExitCodes["ERROR"] = 1] = "ERROR"; + ExitCodes[ExitCodes["UNCLEAN"] = 128] = "UNCLEAN"; +})(ExitCodes = exports.ExitCodes || (exports.ExitCodes = {})); + +}); + +var gitOutputStreams = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitOutputStreams = void 0; +class GitOutputStreams { + constructor(stdOut, stdErr) { + this.stdOut = stdOut; + this.stdErr = stdErr; + } + asStrings() { + return new GitOutputStreams(this.stdOut.toString('utf8'), this.stdErr.toString('utf8')); + } +} +exports.GitOutputStreams = GitOutputStreams; + +}); + +var lineParser = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RemoteLineParser = exports.LineParser = void 0; +class LineParser { + constructor(regExp, useMatches) { + this.matches = []; + this.parse = (line, target) => { + this.resetMatches(); + if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) { + return false; + } + return this.useMatches(target, this.prepareMatches()) !== false; + }; + this._regExp = Array.isArray(regExp) ? regExp : [regExp]; + if (useMatches) { + this.useMatches = useMatches; + } + } + // @ts-ignore + useMatches(target, match) { + throw new Error(`LineParser:useMatches not implemented`); + } + resetMatches() { + this.matches.length = 0; + } + prepareMatches() { + return this.matches; + } + addMatch(reg, index, line) { + const matched = line && reg.exec(line); + if (matched) { + this.pushMatch(index, matched); + } + return !!matched; + } + pushMatch(_index, matched) { + this.matches.push(...matched.slice(1)); + } +} +exports.LineParser = LineParser; +class RemoteLineParser extends LineParser { + addMatch(reg, index, line) { + return /^remote:\s/.test(String(line)) && super.addMatch(reg, index, line); + } + pushMatch(index, matched) { + if (index > 0 || matched.length > 1) { + super.pushMatch(index, matched); + } + } +} +exports.RemoteLineParser = RemoteLineParser; + +}); + +var simpleGitOptions = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createInstanceConfig = void 0; +const defaultOptions = { + binary: 'git', + maxConcurrentProcesses: 5, +}; +function createInstanceConfig(...options) { + const baseDir = process.cwd(); + const config = Object.assign(Object.assign({ baseDir }, defaultOptions), ...(options.filter(o => typeof o === 'object' && o))); + config.baseDir = config.baseDir || baseDir; + return config; +} +exports.createInstanceConfig = createInstanceConfig; + +}); + +var taskOptions = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.trailingFunctionArgument = exports.trailingOptionsArgument = exports.getTrailingOptions = exports.appendTaskOptions = void 0; + + +function appendTaskOptions(options, commands = []) { + if (!argumentFilters.filterPlainObject(options)) { + return commands; + } + return Object.keys(options).reduce((commands, key) => { + const value = options[key]; + if (argumentFilters.filterPrimitives(value, ['boolean'])) { + commands.push(key + '=' + value); + } + else { + commands.push(key); + } + return commands; + }, commands); +} +exports.appendTaskOptions = appendTaskOptions; +function getTrailingOptions(args, initialPrimitive = 0, objectOnly = false) { + const command = []; + for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) { + if ('string|number'.includes(typeof args[i])) { + command.push(String(args[i])); + } + } + appendTaskOptions(trailingOptionsArgument(args), command); + if (!objectOnly) { + command.push(...trailingArrayArgument(args)); + } + return command; +} +exports.getTrailingOptions = getTrailingOptions; +function trailingArrayArgument(args) { + const hasTrailingCallback = typeof util.last(args) === 'function'; + return argumentFilters.filterType(util.last(args, hasTrailingCallback ? 1 : 0), argumentFilters.filterArray, []); +} +/** + * Given any number of arguments, returns the trailing options argument, ignoring a trailing function argument + * if there is one. When not found, the return value is null. + */ +function trailingOptionsArgument(args) { + const hasTrailingCallback = argumentFilters.filterFunction(util.last(args)); + return argumentFilters.filterType(util.last(args, hasTrailingCallback ? 1 : 0), argumentFilters.filterPlainObject); +} +exports.trailingOptionsArgument = trailingOptionsArgument; +/** + * Returns either the source argument when it is a `Function`, or the default + * `NOOP` function constant + */ +function trailingFunctionArgument(args, includeNoop = true) { + const callback = util.asFunction(util.last(args)); + return includeNoop || util.isUserFunction(callback) ? callback : undefined; +} +exports.trailingFunctionArgument = trailingFunctionArgument; + +}); + +var taskParser = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseStringResponse = exports.callTaskParser = void 0; + +function callTaskParser(parser, streams) { + return parser(streams.stdOut, streams.stdErr); +} +exports.callTaskParser = callTaskParser; +function parseStringResponse(result, parsers, ...texts) { + texts.forEach(text => { + for (let lines = util.toLinesWithContent(text), i = 0, max = lines.length; i < max; i++) { + const line = (offset = 0) => { + if ((i + offset) >= max) { + return; + } + return lines[i + offset]; + }; + parsers.some(({ parse }) => parse(line, result)); + } + }); + return result; +} +exports.parseStringResponse = parseStringResponse; + +}); + +var utils = createCommonjsModule(function (module, exports) { +var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (commonjsGlobal && commonjsGlobal.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(argumentFilters, exports); +__exportStar(exitCodes, exports); +__exportStar(gitOutputStreams, exports); +__exportStar(lineParser, exports); +__exportStar(simpleGitOptions, exports); +__exportStar(taskOptions, exports); +__exportStar(taskParser, exports); +__exportStar(util, exports); + +}); + +var CleanSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.cleanSummaryParser = exports.CleanResponse = void 0; + +class CleanResponse { + constructor(dryRun) { + this.dryRun = dryRun; + this.paths = []; + this.files = []; + this.folders = []; + } +} +exports.CleanResponse = CleanResponse; +const removalRegexp = /^[a-z]+\s*/i; +const dryRunRemovalRegexp = /^[a-z]+\s+[a-z]+\s*/i; +const isFolderRegexp = /\/$/; +function cleanSummaryParser(dryRun, text) { + const summary = new CleanResponse(dryRun); + const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp; + utils.toLinesWithContent(text).forEach(line => { + const removed = line.replace(regexp, ''); + summary.paths.push(removed); + (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed); + }); + return summary; +} +exports.cleanSummaryParser = cleanSummaryParser; + +}); + +var taskConfigurationError = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TaskConfigurationError = void 0; + +/** + * The `TaskConfigurationError` is thrown when a command was incorrectly + * configured. An error of this kind means that no attempt was made to + * run your command through the underlying `git` binary. + * + * Check the `.message` property for more detail on why your configuration + * resulted in an error. + */ +class TaskConfigurationError extends gitError.GitError { + constructor(message) { + super(undefined, message); + } +} +exports.TaskConfigurationError = TaskConfigurationError; + +}); + +var task = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isEmptyTask = exports.isBufferTask = exports.straightThroughStringTask = exports.configurationErrorTask = exports.adhocExecTask = exports.EMPTY_COMMANDS = void 0; + +exports.EMPTY_COMMANDS = []; +function adhocExecTask(parser) { + return { + commands: exports.EMPTY_COMMANDS, + format: 'utf-8', + parser, + }; +} +exports.adhocExecTask = adhocExecTask; +function configurationErrorTask(error) { + return { + commands: exports.EMPTY_COMMANDS, + format: 'utf-8', + parser() { + throw typeof error === 'string' ? new taskConfigurationError.TaskConfigurationError(error) : error; + } + }; +} +exports.configurationErrorTask = configurationErrorTask; +function straightThroughStringTask(commands, trimmed = false) { + return { + commands, + format: 'utf-8', + parser(text) { + return trimmed ? String(text).trim() : text; + }, + }; +} +exports.straightThroughStringTask = straightThroughStringTask; +function isBufferTask(task) { + return task.format === 'buffer'; +} +exports.isBufferTask = isBufferTask; +function isEmptyTask(task) { + return !task.commands.length; +} +exports.isEmptyTask = isEmptyTask; + +}); + +var clean = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isCleanOptionsArray = exports.cleanTask = exports.cleanWithOptionsTask = exports.CleanOptions = exports.CONFIG_ERROR_UNKNOWN_OPTION = exports.CONFIG_ERROR_MODE_REQUIRED = exports.CONFIG_ERROR_INTERACTIVE_MODE = void 0; + + + +exports.CONFIG_ERROR_INTERACTIVE_MODE = 'Git clean interactive mode is not supported'; +exports.CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter ("n" or "f") is required'; +exports.CONFIG_ERROR_UNKNOWN_OPTION = 'Git clean unknown option found in: '; +/** + * All supported option switches available for use in a `git.clean` operation + */ +var CleanOptions; +(function (CleanOptions) { + CleanOptions["DRY_RUN"] = "n"; + CleanOptions["FORCE"] = "f"; + CleanOptions["IGNORED_INCLUDED"] = "x"; + CleanOptions["IGNORED_ONLY"] = "X"; + CleanOptions["EXCLUDING"] = "e"; + CleanOptions["QUIET"] = "q"; + CleanOptions["RECURSIVE"] = "d"; +})(CleanOptions = exports.CleanOptions || (exports.CleanOptions = {})); +const CleanOptionValues = new Set(['i', ...utils.asStringArray(Object.values(CleanOptions))]); +function cleanWithOptionsTask(mode, customArgs) { + const { cleanMode, options, valid } = getCleanOptions(mode); + if (!cleanMode) { + return task.configurationErrorTask(exports.CONFIG_ERROR_MODE_REQUIRED); + } + if (!valid.options) { + return task.configurationErrorTask(exports.CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode)); + } + options.push(...customArgs); + if (options.some(isInteractiveMode)) { + return task.configurationErrorTask(exports.CONFIG_ERROR_INTERACTIVE_MODE); + } + return cleanTask(cleanMode, options); +} +exports.cleanWithOptionsTask = cleanWithOptionsTask; +function cleanTask(mode, customArgs) { + const commands = ['clean', `-${mode}`, ...customArgs]; + return { + commands, + format: 'utf-8', + parser(text) { + return CleanSummary.cleanSummaryParser(mode === CleanOptions.DRY_RUN, text); + } + }; +} +exports.cleanTask = cleanTask; +function isCleanOptionsArray(input) { + return Array.isArray(input) && input.every(test => CleanOptionValues.has(test)); +} +exports.isCleanOptionsArray = isCleanOptionsArray; +function getCleanOptions(input) { + let cleanMode; + let options = []; + let valid = { cleanMode: false, options: true }; + input.replace(/[^a-z]i/g, '').split('').forEach(char => { + if (isCleanMode(char)) { + cleanMode = char; + valid.cleanMode = true; + } + else { + valid.options = valid.options && isKnownOption(options[options.length] = (`-${char}`)); + } + }); + return { + cleanMode, + options, + valid, + }; +} +function isCleanMode(cleanMode) { + return cleanMode === CleanOptions.FORCE || cleanMode === CleanOptions.DRY_RUN; +} +function isKnownOption(option) { + return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1)); +} +function isInteractiveMode(option) { + if (/^-[^\-]/.test(option)) { + return option.indexOf('i') > 0; + } + return option === '--interactive'; +} + +}); + +var checkIsRepo = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.checkIsBareRepoTask = exports.checkIsRepoRootTask = exports.checkIsRepoTask = exports.CheckRepoActions = void 0; + +var CheckRepoActions; +(function (CheckRepoActions) { + CheckRepoActions["BARE"] = "bare"; + CheckRepoActions["IN_TREE"] = "tree"; + CheckRepoActions["IS_REPO_ROOT"] = "root"; +})(CheckRepoActions = exports.CheckRepoActions || (exports.CheckRepoActions = {})); +const onError = (exitCode, stdErr, done, fail) => { + if (exitCode === utils.ExitCodes.UNCLEAN && isNotRepoMessage(stdErr)) { + return done('false'); + } + fail(stdErr); +}; +const parser = (text) => { + return text.trim() === 'true'; +}; +function checkIsRepoTask(action) { + switch (action) { + case CheckRepoActions.BARE: + return checkIsBareRepoTask(); + case CheckRepoActions.IS_REPO_ROOT: + return checkIsRepoRootTask(); + } + const commands = ['rev-parse', '--is-inside-work-tree']; + return { + commands, + format: 'utf-8', + onError, + parser, + }; +} +exports.checkIsRepoTask = checkIsRepoTask; +function checkIsRepoRootTask() { + const commands = ['rev-parse', '--git-dir']; + return { + commands, + format: 'utf-8', + onError, + parser(path) { + return /^\.(git)?$/.test(path.trim()); + }, + }; +} +exports.checkIsRepoRootTask = checkIsRepoRootTask; +function checkIsBareRepoTask() { + const commands = ['rev-parse', '--is-bare-repository']; + return { + commands, + format: 'utf-8', + onError, + parser, + }; +} +exports.checkIsBareRepoTask = checkIsBareRepoTask; +function isNotRepoMessage(message) { + return /(Not a git repository|Kein Git-Repository)/i.test(message); +} + +}); + +var reset = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getResetMode = exports.resetTask = exports.ResetMode = void 0; + +var ResetMode; +(function (ResetMode) { + ResetMode["MIXED"] = "mixed"; + ResetMode["SOFT"] = "soft"; + ResetMode["HARD"] = "hard"; + ResetMode["MERGE"] = "merge"; + ResetMode["KEEP"] = "keep"; +})(ResetMode = exports.ResetMode || (exports.ResetMode = {})); +const ResetModes = Array.from(Object.values(ResetMode)); +function resetTask(mode, customArgs) { + const commands = ['reset']; + if (isValidResetMode(mode)) { + commands.push(`--${mode}`); + } + commands.push(...customArgs); + return task.straightThroughStringTask(commands); +} +exports.resetTask = resetTask; +function getResetMode(mode) { + if (isValidResetMode(mode)) { + return mode; + } + switch (typeof mode) { + case 'string': + case 'undefined': + return ResetMode.SOFT; + } + return; +} +exports.getResetMode = getResetMode; +function isValidResetMode(mode) { + return ResetModes.includes(mode); +} + +}); + +var gitConstructError = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitConstructError = void 0; + +/** + * The `GitConstructError` is thrown when an error occurs in the constructor + * of the `simple-git` instance itself. Most commonly as a result of using + * a `baseDir` option that points to a folder that either does not exist, + * or cannot be read by the user the node script is running as. + * + * Check the `.message` property for more detail including the properties + * passed to the constructor. + */ +class GitConstructError extends gitError.GitError { + constructor(config, message) { + super(undefined, message); + this.config = config; + } +} +exports.GitConstructError = GitConstructError; + +}); + +var api = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TaskConfigurationError = exports.GitResponseError = exports.GitError = exports.GitConstructError = exports.ResetMode = exports.CheckRepoActions = exports.CleanOptions = void 0; + +Object.defineProperty(exports, "CleanOptions", { enumerable: true, get: function () { return clean.CleanOptions; } }); + +Object.defineProperty(exports, "CheckRepoActions", { enumerable: true, get: function () { return checkIsRepo.CheckRepoActions; } }); + +Object.defineProperty(exports, "ResetMode", { enumerable: true, get: function () { return reset.ResetMode; } }); + +Object.defineProperty(exports, "GitConstructError", { enumerable: true, get: function () { return gitConstructError.GitConstructError; } }); + +Object.defineProperty(exports, "GitError", { enumerable: true, get: function () { return gitError.GitError; } }); + +Object.defineProperty(exports, "GitResponseError", { enumerable: true, get: function () { return gitResponseError.GitResponseError; } }); + +Object.defineProperty(exports, "TaskConfigurationError", { enumerable: true, get: function () { return taskConfigurationError.TaskConfigurationError; } }); + +}); + +var gitLogger = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitLogger = exports.createLogger = exports.log = void 0; + + +src.default.formatters.L = (value) => String(utils.filterHasLength(value) ? value.length : '-'); +src.default.formatters.B = (value) => { + if (Buffer.isBuffer(value)) { + return value.toString('utf8'); + } + return utils.objectToString(value); +}; +/** + * The shared debug logging instance + */ +exports.log = src.default('simple-git'); +function prefixedLogger(to, prefix, forward) { + if (!prefix || !String(prefix).replace(/\s*/, '')) { + return !forward ? to : (message, ...args) => { + to(message, ...args); + forward(message, ...args); + }; + } + return (message, ...args) => { + to(`%s ${message}`, prefix, ...args); + if (forward) { + forward(message, ...args); + } + }; +} +function childLoggerName(name, childDebugger, { namespace: parentNamespace }) { + if (typeof name === 'string') { + return name; + } + const childNamespace = childDebugger && childDebugger.namespace || ''; + if (childNamespace.startsWith(parentNamespace)) { + return childNamespace.substr(parentNamespace.length + 1); + } + return childNamespace || parentNamespace; +} +function createLogger(label, verbose, initialStep, infoDebugger = exports.log) { + const labelPrefix = label && `[${label}]` || ''; + const spawned = []; + const debugDebugger = (typeof verbose === 'string') ? infoDebugger.extend(verbose) : verbose; + const key = childLoggerName(utils.filterType(verbose, utils.filterString), debugDebugger, infoDebugger); + return step(initialStep); + function destroy() { + spawned.forEach(logger => logger.destroy()); + spawned.length = 0; + } + function child(name) { + return utils.append(spawned, createLogger(label, debugDebugger && debugDebugger.extend(name) || name)); + } + function sibling(name, initial) { + return utils.append(spawned, createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)); + } + function step(phase) { + const stepPrefix = phase && `[${phase}]` || ''; + const debug = debugDebugger && prefixedLogger(debugDebugger, stepPrefix) || utils.NOOP; + const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug); + return Object.assign(debugDebugger ? debug : info, { + key, + label, + child, + sibling, + debug, + info, + step, + destroy, + }); + } +} +exports.createLogger = createLogger; +/** + * The `GitLogger` is used by the main `SimpleGit` runner to handle logging + * any warnings or errors. + */ +class GitLogger { + constructor(_out = exports.log) { + this._out = _out; + this.error = prefixedLogger(_out, '[ERROR]'); + this.warn = prefixedLogger(_out, '[WARN]'); + } + silent(silence = false) { + if (silence !== this._out.enabled) { + return; + } + const { namespace } = this._out; + const env = (process.env.DEBUG || '').split(',').filter(s => !!s); + const hasOn = env.includes(namespace); + const hasOff = env.includes(`-${namespace}`); + // enabling the log + if (!silence) { + if (hasOff) { + utils.remove(env, `-${namespace}`); + } + else { + env.push(namespace); + } + } + else { + if (hasOn) { + utils.remove(env, namespace); + } + else { + env.push(`-${namespace}`); + } + } + src.default.enable(env.join(',')); + } +} +exports.GitLogger = GitLogger; + +}); + +var tasksPendingQueue = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TasksPendingQueue = void 0; + + +class TasksPendingQueue { + constructor(logLabel = 'GitExecutor') { + this.logLabel = logLabel; + this._queue = new Map(); + } + withProgress(task) { + return this._queue.get(task); + } + createProgress(task) { + const name = TasksPendingQueue.getName(task.commands[0]); + const logger = gitLogger.createLogger(this.logLabel, name); + return { + task, + logger, + name, + }; + } + push(task) { + const progress = this.createProgress(task); + progress.logger('Adding task to the queue, commands = %o', task.commands); + this._queue.set(task, progress); + return progress; + } + fatal(err) { + for (const [task, { logger }] of Array.from(this._queue.entries())) { + if (task === err.task) { + logger.info(`Failed %o`, err); + logger(`Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`); + } + else { + logger.info(`A fatal exception occurred in a previous task, the queue has been purged: %o`, err.message); + } + this.complete(task); + } + if (this._queue.size !== 0) { + throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`); + } + } + complete(task) { + const progress = this.withProgress(task); + if (progress) { + progress.logger.destroy(); + this._queue.delete(task); + } + } + attempt(task) { + const progress = this.withProgress(task); + if (!progress) { + throw new api.GitError(undefined, 'TasksPendingQueue: attempt called for an unknown task'); + } + progress.logger('Starting task'); + return progress; + } + static getName(name = 'empty') { + return `task:${name}:${++TasksPendingQueue.counter}`; + } +} +exports.TasksPendingQueue = TasksPendingQueue; +TasksPendingQueue.counter = 0; + +}); + +var gitExecutorChain = createCommonjsModule(function (module, exports) { +var __awaiter = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitExecutorChain = void 0; + + + + + +class GitExecutorChain { + constructor(_executor, _scheduler) { + this._executor = _executor; + this._scheduler = _scheduler; + this._chain = Promise.resolve(); + this._queue = new tasksPendingQueue.TasksPendingQueue(); + } + get binary() { + return this._executor.binary; + } + get outputHandler() { + return this._executor.outputHandler; + } + get cwd() { + return this._executor.cwd; + } + get env() { + return this._executor.env; + } + push(task) { + this._queue.push(task); + return this._chain = this._chain.then(() => this.attemptTask(task)); + } + attemptTask(task$1) { + return __awaiter(this, void 0, void 0, function* () { + const onScheduleComplete = yield this._scheduler.next(); + const onQueueComplete = () => this._queue.complete(task$1); + try { + const { logger } = this._queue.attempt(task$1); + return yield (task.isEmptyTask(task$1) + ? this.attemptEmptyTask(task$1, logger) + : this.attemptRemoteTask(task$1, logger)); + } + catch (e) { + throw this.onFatalException(task$1, e); + } + finally { + onQueueComplete(); + onScheduleComplete(); + } + }); + } + onFatalException(task, e) { + const gitError = (e instanceof api.GitError) ? Object.assign(e, { task }) : new api.GitError(task, e && String(e)); + this._chain = Promise.resolve(); + this._queue.fatal(gitError); + return gitError; + } + attemptRemoteTask(task$1, logger) { + return __awaiter(this, void 0, void 0, function* () { + const raw = yield this.gitResponse(this.binary, task$1.commands, this.outputHandler, logger.step('SPAWN')); + const outputStreams = yield this.handleTaskData(task$1, raw, logger.step('HANDLE')); + logger(`passing response to task's parser as a %s`, task$1.format); + if (task.isBufferTask(task$1)) { + return utils.callTaskParser(task$1.parser, outputStreams); + } + return utils.callTaskParser(task$1.parser, outputStreams.asStrings()); + }); + } + attemptEmptyTask(task, logger) { + return __awaiter(this, void 0, void 0, function* () { + logger(`empty task bypassing child process to call to task's parser`); + return task.parser(); + }); + } + handleTaskData({ onError, concatStdErr }, { exitCode, stdOut, stdErr }, logger) { + return new Promise((done, fail) => { + logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode); + if (exitCode && stdErr.length && onError) { + logger.info(`exitCode=%s handling with custom error handler`); + logger(`concatenate stdErr to stdOut: %j`, concatStdErr); + return onError(exitCode, Buffer.concat([...(concatStdErr ? stdOut : []), ...stdErr]).toString('utf-8'), (result) => { + logger.info(`custom error handler treated as success`); + logger(`custom error returned a %s`, utils.objectToString(result)); + done(new utils.GitOutputStreams(Buffer.isBuffer(result) ? result : Buffer.from(String(result)), Buffer.concat(stdErr))); + }, fail); + } + if (exitCode && stdErr.length) { + logger.info(`exitCode=%s treated as error when then child process has written to stdErr`); + return fail(Buffer.concat(stdErr).toString('utf-8')); + } + if (concatStdErr) { + logger(`concatenating stdErr onto stdOut before processing`); + logger(`stdErr: $O`, stdErr); + stdOut.push(...stdErr); + } + logger.info(`retrieving task output complete`); + done(new utils.GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr))); + }); + } + gitResponse(command, args, outputHandler, logger) { + return __awaiter(this, void 0, void 0, function* () { + const outputLogger = logger.sibling('output'); + const spawnOptions = { + cwd: this.cwd, + env: this.env, + windowsHide: true, + }; + return new Promise((done) => { + const stdOut = []; + const stdErr = []; + let attempted = false; + function attemptClose(exitCode, event = 'retry') { + // closing when there is content, terminate immediately + if (attempted || stdErr.length || stdOut.length) { + logger.info(`exitCode=%s event=%s`, exitCode, event); + done({ + stdOut, + stdErr, + exitCode, + }); + attempted = true; + outputLogger.destroy(); + } + // first attempt at closing but no content yet, wait briefly for the close/exit that may follow + if (!attempted) { + attempted = true; + setTimeout(() => attemptClose(exitCode, 'deferred'), 50); + logger('received %s event before content on stdOut/stdErr', event); + } + } + logger.info(`%s %o`, command, args); + logger('%O', spawnOptions); + const spawned = child_process_1__default['default'].spawn(command, args, spawnOptions); + spawned.stdout.on('data', onDataReceived(stdOut, 'stdOut', logger, outputLogger.step('stdOut'))); + spawned.stderr.on('data', onDataReceived(stdErr, 'stdErr', logger, outputLogger.step('stdErr'))); + spawned.on('error', onErrorReceived(stdErr, logger)); + spawned.on('close', (code) => attemptClose(code, 'close')); + spawned.on('exit', (code) => attemptClose(code, 'exit')); + if (outputHandler) { + logger(`Passing child process stdOut/stdErr to custom outputHandler`); + outputHandler(command, spawned.stdout, spawned.stderr, [...args]); + } + }); + }); + } +} +exports.GitExecutorChain = GitExecutorChain; +function onErrorReceived(target, logger) { + return (err) => { + logger(`[ERROR] child process exception %o`, err); + target.push(Buffer.from(String(err.stack), 'ascii')); + }; +} +function onDataReceived(target, name, logger, output) { + return (buffer) => { + logger(`%s received %L bytes`, name, buffer); + output(`%B`, buffer); + target.push(buffer); + }; +} + +}); + +var gitExecutor = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitExecutor = void 0; + +class GitExecutor { + constructor(binary = 'git', cwd, _scheduler) { + this.binary = binary; + this.cwd = cwd; + this._scheduler = _scheduler; + this._chain = new gitExecutorChain.GitExecutorChain(this, this._scheduler); + } + chain() { + return new gitExecutorChain.GitExecutorChain(this, this._scheduler); + } + push(task) { + return this._chain.push(task); + } +} +exports.GitExecutor = GitExecutor; + +}); + +var dist$1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createDeferred = exports.deferred = void 0; +/** + * Creates a new `DeferredPromise` + * + * ```typescript + import {deferred} from '@kwsites/promise-deferred`; + ``` + */ +function deferred() { + let done; + let fail; + let status = 'pending'; + const promise = new Promise((_done, _fail) => { + done = _done; + fail = _fail; + }); + return { + promise, + done(result) { + if (status === 'pending') { + status = 'resolved'; + done(result); + } + }, + fail(error) { + if (status === 'pending') { + status = 'rejected'; + fail(error); + } + }, + get fulfilled() { + return status !== 'pending'; + }, + get status() { + return status; + }, + }; +} +exports.deferred = deferred; +/** + * Alias of the exported `deferred` function, to help consumers wanting to use `deferred` as the + * local variable name rather than the factory import name, without needing to rename on import. + * + * ```typescript + import {createDeferred} from '@kwsites/promise-deferred`; + ``` + */ +exports.createDeferred = deferred; +/** + * Default export allows use as: + * + * ```typescript + import deferred from '@kwsites/promise-deferred`; + ``` + */ +exports.default = deferred; + +}); + +var scheduler = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Scheduler = void 0; + + + +const logger = gitLogger.createLogger('', 'scheduler'); +const createScheduledTask = (() => { + let id = 0; + return () => { + id++; + const { promise, done } = dist$1.createDeferred(); + return { + promise, + done, + id, + }; + }; +})(); +class Scheduler { + constructor(concurrency = 2) { + this.concurrency = concurrency; + this.pending = []; + this.running = []; + logger(`Constructed, concurrency=%s`, concurrency); + } + schedule() { + if (!this.pending.length || this.running.length >= this.concurrency) { + logger(`Schedule attempt ignored, pending=%s running=%s concurrency=%s`, this.pending.length, this.running.length, this.concurrency); + return; + } + const task = utils.append(this.running, this.pending.shift()); + logger(`Attempting id=%s`, task.id); + task.done(() => { + logger(`Completing id=`, task.id); + utils.remove(this.running, task); + this.schedule(); + }); + } + next() { + const { promise, id } = utils.append(this.pending, createScheduledTask()); + logger(`Scheduling id=%s`, id); + this.schedule(); + return promise; + } +} +exports.Scheduler = Scheduler; + +}); + +var BranchDeleteSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isSingleBranchDeleteFailure = exports.branchDeletionFailure = exports.branchDeletionSuccess = exports.BranchDeletionBatch = void 0; +class BranchDeletionBatch { + constructor() { + this.all = []; + this.branches = {}; + this.errors = []; + } + get success() { + return !this.errors.length; + } +} +exports.BranchDeletionBatch = BranchDeletionBatch; +function branchDeletionSuccess(branch, hash) { + return { + branch, hash, success: true, + }; +} +exports.branchDeletionSuccess = branchDeletionSuccess; +function branchDeletionFailure(branch) { + return { + branch, hash: null, success: false, + }; +} +exports.branchDeletionFailure = branchDeletionFailure; +function isSingleBranchDeleteFailure(test) { + return test.success; +} +exports.isSingleBranchDeleteFailure = isSingleBranchDeleteFailure; + +}); + +var parseBranchDelete = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.hasBranchDeletionError = exports.parseBranchDeletions = void 0; + + +const deleteSuccessRegex = /(\S+)\s+\(\S+\s([^)]+)\)/; +const deleteErrorRegex = /^error[^']+'([^']+)'/m; +const parsers = [ + new utils.LineParser(deleteSuccessRegex, (result, [branch, hash]) => { + const deletion = BranchDeleteSummary.branchDeletionSuccess(branch, hash); + result.all.push(deletion); + result.branches[branch] = deletion; + }), + new utils.LineParser(deleteErrorRegex, (result, [branch]) => { + const deletion = BranchDeleteSummary.branchDeletionFailure(branch); + result.errors.push(deletion); + result.all.push(deletion); + result.branches[branch] = deletion; + }), +]; +const parseBranchDeletions = (stdOut) => { + return utils.parseStringResponse(new BranchDeleteSummary.BranchDeletionBatch(), parsers, stdOut); +}; +exports.parseBranchDeletions = parseBranchDeletions; +function hasBranchDeletionError(data, processExitCode) { + return processExitCode === utils.ExitCodes.ERROR && deleteErrorRegex.test(data); +} +exports.hasBranchDeletionError = hasBranchDeletionError; + +}); + +var BranchSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BranchSummaryResult = void 0; +class BranchSummaryResult { + constructor() { + this.all = []; + this.branches = {}; + this.current = ''; + this.detached = false; + } + push(current, detached, name, commit, label) { + if (current) { + this.detached = detached; + this.current = name; + } + this.all.push(name); + this.branches[name] = { + current: current, + name: name, + commit: commit, + label: label + }; + } +} +exports.BranchSummaryResult = BranchSummaryResult; + +}); + +var parseBranch = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseBranchSummary = void 0; + + +const parsers = [ + new utils.LineParser(/^(\*\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, (result, [current, name, commit, label]) => { + result.push(!!current, true, name, commit, label); + }), + new utils.LineParser(/^(\*\s)?(\S+)\s+([a-z0-9]+)\s(.*)$/, (result, [current, name, commit, label]) => { + result.push(!!current, false, name, commit, label); + }) +]; +function parseBranchSummary(stdOut) { + return utils.parseStringResponse(new BranchSummary.BranchSummaryResult(), parsers, stdOut); +} +exports.parseBranchSummary = parseBranchSummary; + +}); + +var branch = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.deleteBranchTask = exports.deleteBranchesTask = exports.branchLocalTask = exports.branchTask = exports.containsDeleteBranchCommand = void 0; + + + +function containsDeleteBranchCommand(commands) { + const deleteCommands = ['-d', '-D', '--delete']; + return commands.some(command => deleteCommands.includes(command)); +} +exports.containsDeleteBranchCommand = containsDeleteBranchCommand; +function branchTask(customArgs) { + const isDelete = containsDeleteBranchCommand(customArgs); + const commands = ['branch', ...customArgs]; + if (commands.length === 1) { + commands.push('-a'); + } + if (!commands.includes('-v')) { + commands.splice(1, 0, '-v'); + } + return { + format: 'utf-8', + commands, + parser(stdOut, stdErr) { + if (isDelete) { + return parseBranchDelete.parseBranchDeletions(stdOut, stdErr).all[0]; + } + return parseBranch.parseBranchSummary(stdOut); + }, + }; +} +exports.branchTask = branchTask; +function branchLocalTask() { + const parser = parseBranch.parseBranchSummary; + return { + format: 'utf-8', + commands: ['branch', '-v'], + parser, + }; +} +exports.branchLocalTask = branchLocalTask; +function deleteBranchesTask(branches, forceDelete = false) { + return { + format: 'utf-8', + commands: ['branch', '-v', forceDelete ? '-D' : '-d', ...branches], + parser(stdOut, stdErr) { + return parseBranchDelete.parseBranchDeletions(stdOut, stdErr); + }, + onError(exitCode, error, done, fail) { + if (!parseBranchDelete.hasBranchDeletionError(error, exitCode)) { + return fail(error); + } + done(error); + }, + concatStdErr: true, + }; +} +exports.deleteBranchesTask = deleteBranchesTask; +function deleteBranchTask(branch, forceDelete = false) { + const task = { + format: 'utf-8', + commands: ['branch', '-v', forceDelete ? '-D' : '-d', branch], + parser(stdOut, stdErr) { + return parseBranchDelete.parseBranchDeletions(stdOut, stdErr).branches[branch]; + }, + onError(exitCode, error, _, fail) { + if (!parseBranchDelete.hasBranchDeletionError(error, exitCode)) { + return fail(error); + } + throw new gitResponseError.GitResponseError(task.parser(error, ''), error); + }, + concatStdErr: true, + }; + return task; +} +exports.deleteBranchTask = deleteBranchTask; + +}); + +var taskCallback_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.taskCallback = void 0; + + +function taskCallback(task, response, callback = utils.NOOP) { + const onSuccess = (data) => { + callback(null, data); + }; + const onError = (err) => { + if ((err === null || err === void 0 ? void 0 : err.task) === task) { + if (err instanceof api.GitResponseError) { + return callback(addDeprecationNoticeToError(err)); + } + callback(err); + } + }; + response.then(onSuccess, onError); +} +exports.taskCallback = taskCallback; +function addDeprecationNoticeToError(err) { + let log = (name) => { + console.warn(`simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`); + log = utils.NOOP; + }; + return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {})); + function descriptorReducer(all, name) { + if (name in err) { + return all; + } + all[name] = { + enumerable: false, + configurable: false, + get() { + log(name); + return err.git[name]; + }, + }; + return all; + } +} + +}); + +var clone = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.cloneMirrorTask = exports.cloneTask = void 0; + + +function cloneTask(repo, directory, customArgs) { + const commands = ['clone', ...customArgs]; + if (typeof repo === 'string') { + commands.push(repo); + } + if (typeof directory === 'string') { + commands.push(directory); + } + return task.straightThroughStringTask(commands); +} +exports.cloneTask = cloneTask; +function cloneMirrorTask(repo, directory, customArgs) { + utils.append(customArgs, '--mirror'); + return cloneTask(repo, directory, customArgs); +} +exports.cloneMirrorTask = cloneMirrorTask; + +}); + +var ConfigList_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.configListParser = exports.ConfigList = void 0; + +class ConfigList { + constructor() { + this.files = []; + this.values = Object.create(null); + } + get all() { + if (!this._all) { + this._all = this.files.reduce((all, file) => { + return Object.assign(all, this.values[file]); + }, {}); + } + return this._all; + } + addFile(file) { + if (!(file in this.values)) { + const latest = utils.last(this.files); + this.values[file] = latest ? Object.create(this.values[latest]) : {}; + this.files.push(file); + } + return this.values[file]; + } + addValue(file, key, value) { + const values = this.addFile(file); + if (!values.hasOwnProperty(key)) { + values[key] = value; + } + else if (Array.isArray(values[key])) { + values[key].push(value); + } + else { + values[key] = [values[key], value]; + } + this._all = undefined; + } +} +exports.ConfigList = ConfigList; +function configListParser(text) { + const config = new ConfigList(); + const lines = text.split('\0'); + for (let i = 0, max = lines.length - 1; i < max;) { + const file = configFilePath(lines[i++]); + const [key, value] = utils.splitOn(lines[i++], '\n'); + config.addValue(file, key, value); + } + return config; +} +exports.configListParser = configListParser; +function configFilePath(filePath) { + return filePath.replace(/^(file):/, ''); +} + +}); + +var config = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.listConfigTask = exports.addConfigTask = void 0; + +function addConfigTask(key, value, append = false) { + const commands = ['config', '--local']; + if (append) { + commands.push('--add'); + } + commands.push(key, value); + return { + commands, + format: 'utf-8', + parser(text) { + return text; + } + }; +} +exports.addConfigTask = addConfigTask; +function listConfigTask() { + return { + commands: ['config', '--list', '--show-origin', '--null'], + format: 'utf-8', + parser(text) { + return ConfigList_1.configListParser(text); + }, + }; +} +exports.listConfigTask = listConfigTask; + +}); + +var parseCommit = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseCommitResult = void 0; + +const parsers = [ + new utils.LineParser(/\[([^\s]+) ([^\]]+)/, (result, [branch, commit]) => { + result.branch = branch; + result.commit = commit; + }), + new utils.LineParser(/\s*Author:\s(.+)/i, (result, [author]) => { + const parts = author.split('<'); + const email = parts.pop(); + if (!email || !email.includes('@')) { + return; + } + result.author = { + email: email.substr(0, email.length - 1), + name: parts.join('<').trim() + }; + }), + new utils.LineParser(/(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, (result, [changes, insertions, deletions]) => { + result.summary.changes = parseInt(changes, 10) || 0; + result.summary.insertions = parseInt(insertions, 10) || 0; + result.summary.deletions = parseInt(deletions, 10) || 0; + }), + new utils.LineParser(/^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, (result, [changes, lines, direction]) => { + result.summary.changes = parseInt(changes, 10) || 0; + const count = parseInt(lines, 10) || 0; + if (direction === '-') { + result.summary.deletions = count; + } + else if (direction === '+') { + result.summary.insertions = count; + } + }), +]; +function parseCommitResult(stdOut) { + const result = { + author: null, + branch: '', + commit: '', + summary: { + changes: 0, + insertions: 0, + deletions: 0, + }, + }; + return utils.parseStringResponse(result, parsers, stdOut); +} +exports.parseCommitResult = parseCommitResult; + +}); + +var commit = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.commitTask = void 0; + +function commitTask(message, files, customArgs) { + const commands = [ + 'commit', + ...(message.flatMap(m => ['-m', m])), + ...files, + ...customArgs, + ]; + return { + commands, + format: 'utf-8', + parser: parseCommit.parseCommitResult, + }; +} +exports.commitTask = commitTask; + +}); + +var DiffSummary_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DiffSummary = void 0; +/*** + * The DiffSummary is returned as a response to getting `git().status()` + */ +class DiffSummary { + constructor() { + this.changed = 0; + this.deletions = 0; + this.insertions = 0; + this.files = []; + } +} +exports.DiffSummary = DiffSummary; + +}); + +var parseDiffSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseDiffResult = void 0; + +function parseDiffResult(stdOut) { + const lines = stdOut.trim().split('\n'); + const status = new DiffSummary_1.DiffSummary(); + readSummaryLine(status, lines.pop()); + for (let i = 0, max = lines.length; i < max; i++) { + const line = lines[i]; + textFileChange(line, status) || binaryFileChange(line, status); + } + return status; +} +exports.parseDiffResult = parseDiffResult; +function readSummaryLine(status, summary) { + (summary || '') + .trim() + .split(', ') + .forEach(function (text) { + const summary = /(\d+)\s([a-z]+)/.exec(text); + if (!summary) { + return; + } + summaryType(status, summary[2], parseInt(summary[1], 10)); + }); +} +function summaryType(status, key, value) { + const match = (/([a-z]+?)s?\b/.exec(key)); + if (!match || !statusUpdate[match[1]]) { + return; + } + statusUpdate[match[1]](status, value); +} +const statusUpdate = { + file(status, value) { + status.changed = value; + }, + deletion(status, value) { + status.deletions = value; + }, + insertion(status, value) { + status.insertions = value; + } +}; +function textFileChange(input, { files }) { + const line = input.trim().match(/^(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/); + if (line) { + var alterations = (line[3] || '').trim(); + files.push({ + file: line[1].trim(), + changes: parseInt(line[2], 10), + insertions: alterations.replace(/-/g, '').length, + deletions: alterations.replace(/\+/g, '').length, + binary: false + }); + return true; + } + return false; +} +function binaryFileChange(input, { files }) { + const line = input.match(/^(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)$/); + if (line) { + files.push({ + file: line[1].trim(), + before: +line[2], + after: +line[3], + binary: true + }); + return true; + } + return false; +} + +}); + +var diff = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.diffSummaryTask = void 0; + +function diffSummaryTask(customArgs) { + return { + commands: ['diff', '--stat=4096', ...customArgs], + format: 'utf-8', + parser(stdOut) { + return parseDiffSummary.parseDiffResult(stdOut); + } + }; +} +exports.diffSummaryTask = diffSummaryTask; + +}); + +var parseFetch = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseFetchResult = void 0; + +const parsers = [ + new utils.LineParser(/From (.+)$/, (result, [remote]) => { + result.remote = remote; + }), + new utils.LineParser(/\* \[new branch]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { + result.branches.push({ + name, + tracking, + }); + }), + new utils.LineParser(/\* \[new tag]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { + result.tags.push({ + name, + tracking, + }); + }) +]; +function parseFetchResult(stdOut, stdErr) { + const result = { + raw: stdOut, + remote: null, + branches: [], + tags: [], + }; + return utils.parseStringResponse(result, parsers, stdOut, stdErr); +} +exports.parseFetchResult = parseFetchResult; + +}); + +var fetch = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fetchTask = void 0; + +function fetchTask(remote, branch, customArgs) { + const commands = ['fetch', ...customArgs]; + if (remote && branch) { + commands.push(remote, branch); + } + return { + commands, + format: 'utf-8', + parser: parseFetch.parseFetchResult, + }; +} +exports.fetchTask = fetchTask; + +}); + +var hashObject = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.hashObjectTask = void 0; + +/** + * Task used by `git.hashObject` + */ +function hashObjectTask(filePath, write) { + const commands = ['hash-object', filePath]; + if (write) { + commands.push('-w'); + } + return task.straightThroughStringTask(commands, true); +} +exports.hashObjectTask = hashObjectTask; + +}); + +var InitSummary_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseInit = exports.InitSummary = void 0; +class InitSummary { + constructor(bare, path, existing, gitDir) { + this.bare = bare; + this.path = path; + this.existing = existing; + this.gitDir = gitDir; + } +} +exports.InitSummary = InitSummary; +const initResponseRegex = /^Init.+ repository in (.+)$/; +const reInitResponseRegex = /^Rein.+ in (.+)$/; +function parseInit(bare, path, text) { + const response = String(text).trim(); + let result; + if ((result = initResponseRegex.exec(response))) { + return new InitSummary(bare, path, false, result[1]); + } + if ((result = reInitResponseRegex.exec(response))) { + return new InitSummary(bare, path, true, result[1]); + } + let gitDir = ''; + const tokens = response.split(' '); + while (tokens.length) { + const token = tokens.shift(); + if (token === 'in') { + gitDir = tokens.join(' '); + break; + } + } + return new InitSummary(bare, path, /^re/i.test(response), gitDir); +} +exports.parseInit = parseInit; + +}); + +var init = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.initTask = void 0; + +const bareCommand = '--bare'; +function hasBareCommand(command) { + return command.includes(bareCommand); +} +function initTask(bare = false, path, customArgs) { + const commands = ['init', ...customArgs]; + if (bare && !hasBareCommand(commands)) { + commands.splice(1, 0, bareCommand); + } + return { + commands, + concatStdErr: false, + format: 'utf-8', + parser(text) { + return InitSummary_1.parseInit(commands.includes('--bare'), path, text); + } + }; +} +exports.initTask = initTask; + +}); + +var parseListLogSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createListLogSummaryParser = exports.SPLITTER = exports.COMMIT_BOUNDARY = exports.START_BOUNDARY = void 0; + + +exports.START_BOUNDARY = 'òòòòòò '; +exports.COMMIT_BOUNDARY = ' òò'; +exports.SPLITTER = ' ò '; +const defaultFieldNames = ['hash', 'date', 'message', 'refs', 'author_name', 'author_email']; +function lineBuilder(tokens, fields) { + return fields.reduce((line, field, index) => { + line[field] = tokens[index] || ''; + return line; + }, Object.create({ diff: null })); +} +function createListLogSummaryParser(splitter = exports.SPLITTER, fields = defaultFieldNames) { + return function (stdOut) { + const all = utils.toLinesWithContent(stdOut, true, exports.START_BOUNDARY) + .map(function (item) { + const lineDetail = item.trim().split(exports.COMMIT_BOUNDARY); + const listLogLine = lineBuilder(lineDetail[0].trim().split(splitter), fields); + if (lineDetail.length > 1 && !!lineDetail[1].trim()) { + listLogLine.diff = parseDiffSummary.parseDiffResult(lineDetail[1]); + } + return listLogLine; + }); + return { + all, + latest: all.length && all[0] || null, + total: all.length, + }; + }; +} +exports.createListLogSummaryParser = createListLogSummaryParser; + +}); + +var log = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.logTask = exports.parseLogOptions = void 0; + + +const excludeOptions = new Set([ + '--pretty', + 'max-count', + 'maxCount', + 'n', + 'file', + 'format', + 'from', + 'to', + 'splitter', + 'symmetric', + 'multiLine', + 'strictDate', +]); +function prettyFormat(format, splitter) { + const fields = []; + const formatStr = []; + Object.entries(format).forEach(([field, format]) => { + fields.push(field); + formatStr.push(format); + }); + return [ + fields, formatStr.join(splitter) + ]; +} +function userOptions(options) { + return Object.fromEntries(Object.entries(options).filter(([key]) => !excludeOptions.has(key))); +} +function parseLogOptions(opt = {}, customArgs = []) { + const splitter = opt.splitter || parseListLogSummary.SPLITTER; + const format = opt.format || { + hash: '%H', + date: opt.strictDate === false ? '%ai' : '%aI', + message: '%s', + refs: '%D', + body: opt.multiLine ? '%B' : '%b', + author_name: '%aN', + author_email: '%ae' + }; + const [fields, formatStr] = prettyFormat(format, splitter); + const suffix = []; + const command = [ + `--pretty=format:${parseListLogSummary.START_BOUNDARY}${formatStr}${parseListLogSummary.COMMIT_BOUNDARY}`, + ...customArgs, + ]; + const maxCount = opt.n || opt['max-count'] || opt.maxCount; + if (maxCount) { + command.push(`--max-count=${maxCount}`); + } + if (opt.from && opt.to) { + const rangeOperator = (opt.symmetric !== false) ? '...' : '..'; + suffix.push(`${opt.from}${rangeOperator}${opt.to}`); + } + if (opt.file) { + suffix.push('--follow', opt.file); + } + utils.appendTaskOptions(userOptions(opt), command); + return { + fields, + splitter, + commands: [ + ...command, + ...suffix, + ], + }; +} +exports.parseLogOptions = parseLogOptions; +function logTask(splitter, fields, customArgs) { + return { + commands: ['log', ...customArgs], + format: 'utf-8', + parser: parseListLogSummary.createListLogSummaryParser(splitter, fields), + }; +} +exports.logTask = logTask; + +}); + +var MergeSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MergeSummaryDetail = exports.MergeSummaryConflict = void 0; +class MergeSummaryConflict { + constructor(reason, file = null, meta) { + this.reason = reason; + this.file = file; + this.meta = meta; + } + toString() { + return `${this.file}:${this.reason}`; + } +} +exports.MergeSummaryConflict = MergeSummaryConflict; +class MergeSummaryDetail { + constructor() { + this.conflicts = []; + this.merges = []; + this.result = 'success'; + } + get failed() { + return this.conflicts.length > 0; + } + get reason() { + return this.result; + } + toString() { + if (this.conflicts.length) { + return `CONFLICTS: ${this.conflicts.join(', ')}`; + } + return 'OK'; + } +} +exports.MergeSummaryDetail = MergeSummaryDetail; + +}); + +var PullSummary_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PullSummary = void 0; +class PullSummary { + constructor() { + this.remoteMessages = { + all: [], + }; + this.created = []; + this.deleted = []; + this.files = []; + this.deletions = {}; + this.insertions = {}; + this.summary = { + changes: 0, + deletions: 0, + insertions: 0, + }; + } +} +exports.PullSummary = PullSummary; + +}); + +var parseRemoteObjects = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.remoteMessagesObjectParsers = void 0; + +function objectEnumerationResult(remoteMessages) { + return (remoteMessages.objects = remoteMessages.objects || { + compressing: 0, + counting: 0, + enumerating: 0, + packReused: 0, + reused: { count: 0, delta: 0 }, + total: { count: 0, delta: 0 } + }); +} +function asObjectCount(source) { + const count = /^\s*(\d+)/.exec(source); + const delta = /delta (\d+)/i.exec(source); + return { + count: utils.asNumber(count && count[1] || '0'), + delta: utils.asNumber(delta && delta[1] || '0'), + }; +} +exports.remoteMessagesObjectParsers = [ + new utils.RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, (result, [action, count]) => { + const key = action.toLowerCase(); + const enumeration = objectEnumerationResult(result.remoteMessages); + Object.assign(enumeration, { [key]: utils.asNumber(count) }); + }), + new utils.RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, (result, [action, count]) => { + const key = action.toLowerCase(); + const enumeration = objectEnumerationResult(result.remoteMessages); + Object.assign(enumeration, { [key]: utils.asNumber(count) }); + }), + new utils.RemoteLineParser(/total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, (result, [total, reused, packReused]) => { + const objects = objectEnumerationResult(result.remoteMessages); + objects.total = asObjectCount(total); + objects.reused = asObjectCount(reused); + objects.packReused = utils.asNumber(packReused); + }), +]; + +}); + +var parseRemoteMessages_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RemoteMessageSummary = exports.parseRemoteMessages = void 0; + + +const parsers = [ + new utils.RemoteLineParser(/^remote:\s*(.+)$/, (result, [text]) => { + result.remoteMessages.all.push(text.trim()); + return false; + }), + ...parseRemoteObjects.remoteMessagesObjectParsers, + new utils.RemoteLineParser([/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], (result, [pullRequestUrl]) => { + result.remoteMessages.pullRequestUrl = pullRequestUrl; + }), + new utils.RemoteLineParser([/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], (result, [count, summary, url]) => { + result.remoteMessages.vulnerabilities = { + count: utils.asNumber(count), + summary, + url, + }; + }), +]; +function parseRemoteMessages(_stdOut, stdErr) { + return utils.parseStringResponse({ remoteMessages: new RemoteMessageSummary() }, parsers, stdErr); +} +exports.parseRemoteMessages = parseRemoteMessages; +class RemoteMessageSummary { + constructor() { + this.all = []; + } +} +exports.RemoteMessageSummary = RemoteMessageSummary; + +}); + +var parsePull = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parsePullResult = exports.parsePullDetail = void 0; + + + +const FILE_UPDATE_REGEX = /^\s*(.+?)\s+\|\s+\d+\s*(\+*)(-*)/; +const SUMMARY_REGEX = /(\d+)\D+((\d+)\D+\(\+\))?(\D+(\d+)\D+\(-\))?/; +const ACTION_REGEX = /^(create|delete) mode \d+ (.+)/; +const parsers = [ + new utils.LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => { + result.files.push(file); + if (insertions) { + result.insertions[file] = insertions.length; + } + if (deletions) { + result.deletions[file] = deletions.length; + } + }), + new utils.LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => { + if (insertions !== undefined || deletions !== undefined) { + result.summary.changes = +changes || 0; + result.summary.insertions = +insertions || 0; + result.summary.deletions = +deletions || 0; + return true; + } + return false; + }), + new utils.LineParser(ACTION_REGEX, (result, [action, file]) => { + utils.append(result.files, file); + utils.append((action === 'create') ? result.created : result.deleted, file); + }), +]; +const parsePullDetail = (stdOut, stdErr) => { + return utils.parseStringResponse(new PullSummary_1.PullSummary(), parsers, stdOut, stdErr); +}; +exports.parsePullDetail = parsePullDetail; +const parsePullResult = (stdOut, stdErr) => { + return Object.assign(new PullSummary_1.PullSummary(), exports.parsePullDetail(stdOut, stdErr), parseRemoteMessages_1.parseRemoteMessages(stdOut, stdErr)); +}; +exports.parsePullResult = parsePullResult; + +}); + +var parseMerge = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseMergeDetail = exports.parseMergeResult = void 0; + + + +const parsers = [ + new utils.LineParser(/^Auto-merging\s+(.+)$/, (summary, [autoMerge]) => { + summary.merges.push(autoMerge); + }), + new utils.LineParser(/^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, (summary, [reason, file]) => { + summary.conflicts.push(new MergeSummary.MergeSummaryConflict(reason, file)); + }), + new utils.LineParser(/^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, (summary, [reason, file, deleteRef]) => { + summary.conflicts.push(new MergeSummary.MergeSummaryConflict(reason, file, { deleteRef })); + }), + new utils.LineParser(/^CONFLICT\s+\((.+)\):/, (summary, [reason]) => { + summary.conflicts.push(new MergeSummary.MergeSummaryConflict(reason, null)); + }), + new utils.LineParser(/^Automatic merge failed;\s+(.+)$/, (summary, [result]) => { + summary.result = result; + }), +]; +/** + * Parse the complete response from `git.merge` + */ +const parseMergeResult = (stdOut, stdErr) => { + return Object.assign(exports.parseMergeDetail(stdOut, stdErr), parsePull.parsePullResult(stdOut, stdErr)); +}; +exports.parseMergeResult = parseMergeResult; +/** + * Parse the merge specific detail (ie: not the content also available in the pull detail) from `git.mnerge` + * @param stdOut + */ +const parseMergeDetail = (stdOut) => { + return utils.parseStringResponse(new MergeSummary.MergeSummaryDetail(), parsers, stdOut); +}; +exports.parseMergeDetail = parseMergeDetail; + +}); + +var merge = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mergeTask = void 0; + + + +function mergeTask(customArgs) { + if (!customArgs.length) { + return task.configurationErrorTask('Git.merge requires at least one option'); + } + return { + commands: ['merge', ...customArgs], + format: 'utf-8', + parser(stdOut, stdErr) { + const merge = parseMerge.parseMergeResult(stdOut, stdErr); + if (merge.failed) { + throw new api.GitResponseError(merge); + } + return merge; + } + }; +} +exports.mergeTask = mergeTask; + +}); + +var parseMove = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseMoveResult = void 0; + +const parsers = [ + new utils.LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => { + result.moves.push({ from, to }); + }), +]; +function parseMoveResult(stdOut) { + return utils.parseStringResponse({ moves: [] }, parsers, stdOut); +} +exports.parseMoveResult = parseMoveResult; + +}); + +var move = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.moveTask = void 0; + + +function moveTask(from, to) { + return { + commands: ['mv', '-v', ...utils.asArray(from), to], + format: 'utf-8', + parser: parseMove.parseMoveResult, + }; +} +exports.moveTask = moveTask; + +}); + +var pull = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.pullTask = void 0; + +function pullTask(remote, branch, customArgs) { + const commands = ['pull', ...customArgs]; + if (remote && branch) { + commands.splice(1, 0, remote, branch); + } + return { + commands, + format: 'utf-8', + parser(stdOut, stdErr) { + return parsePull.parsePullResult(stdOut, stdErr); + } + }; +} +exports.pullTask = pullTask; + +}); + +var parsePush = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parsePushDetail = exports.parsePushResult = void 0; + + +function pushResultPushedItem(local, remote, status) { + const deleted = status.includes('deleted'); + const tag = status.includes('tag') || /^refs\/tags/.test(local); + const alreadyUpdated = !status.includes('new'); + return { + deleted, + tag, + branch: !tag, + new: !alreadyUpdated, + alreadyUpdated, + local, + remote, + }; +} +const parsers = [ + new utils.LineParser(/^Pushing to (.+)$/, (result, [repo]) => { + result.repo = repo; + }), + new utils.LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => { + result.ref = Object.assign(Object.assign({}, (result.ref || {})), { local }); + }), + new utils.LineParser(/^[*-=]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => { + result.pushed.push(pushResultPushedItem(local, remote, type)); + }), + new utils.LineParser(/^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, (result, [local, remote, remoteName]) => { + result.branch = Object.assign(Object.assign({}, (result.branch || {})), { local, + remote, + remoteName }); + }), + new utils.LineParser(/^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, (result, [local, remote, from, to]) => { + result.update = { + head: { + local, + remote, + }, + hash: { + from, + to, + }, + }; + }), +]; +const parsePushResult = (stdOut, stdErr) => { + const pushDetail = exports.parsePushDetail(stdOut, stdErr); + const responseDetail = parseRemoteMessages_1.parseRemoteMessages(stdOut, stdErr); + return Object.assign(Object.assign({}, pushDetail), responseDetail); +}; +exports.parsePushResult = parsePushResult; +const parsePushDetail = (stdOut, stdErr) => { + return utils.parseStringResponse({ pushed: [] }, parsers, stdOut, stdErr); +}; +exports.parsePushDetail = parsePushDetail; + +}); + +var push = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.pushTask = exports.pushTagsTask = void 0; + + +function pushTagsTask(ref = {}, customArgs) { + utils.append(customArgs, '--tags'); + return pushTask(ref, customArgs); +} +exports.pushTagsTask = pushTagsTask; +function pushTask(ref = {}, customArgs) { + const commands = ['push', ...customArgs]; + if (ref.branch) { + commands.splice(1, 0, ref.branch); + } + if (ref.remote) { + commands.splice(1, 0, ref.remote); + } + utils.remove(commands, '-v'); + utils.append(commands, '--verbose'); + utils.append(commands, '--porcelain'); + return { + commands, + format: 'utf-8', + parser: parsePush.parsePushResult, + }; +} +exports.pushTask = pushTask; + +}); + +var GetRemoteSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseGetRemotesVerbose = exports.parseGetRemotes = void 0; + +function parseGetRemotes(text) { + const remotes = {}; + forEach(text, ([name]) => remotes[name] = { name }); + return Object.values(remotes); +} +exports.parseGetRemotes = parseGetRemotes; +function parseGetRemotesVerbose(text) { + const remotes = {}; + forEach(text, ([name, url, purpose]) => { + if (!remotes.hasOwnProperty(name)) { + remotes[name] = { + name: name, + refs: { fetch: '', push: '' }, + }; + } + if (purpose && url) { + remotes[name].refs[purpose.replace(/[^a-z]/g, '')] = url; + } + }); + return Object.values(remotes); +} +exports.parseGetRemotesVerbose = parseGetRemotesVerbose; +function forEach(text, handler) { + utils.forEachLineWithContent(text, (line) => handler(line.split(/\s+/))); +} + +}); + +var remote = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.removeRemoteTask = exports.remoteTask = exports.listRemotesTask = exports.getRemotesTask = exports.addRemoteTask = void 0; + + +function addRemoteTask(remoteName, remoteRepo, customArgs = []) { + return task.straightThroughStringTask(['remote', 'add', ...customArgs, remoteName, remoteRepo]); +} +exports.addRemoteTask = addRemoteTask; +function getRemotesTask(verbose) { + const commands = ['remote']; + if (verbose) { + commands.push('-v'); + } + return { + commands, + format: 'utf-8', + parser: verbose ? GetRemoteSummary.parseGetRemotesVerbose : GetRemoteSummary.parseGetRemotes, + }; +} +exports.getRemotesTask = getRemotesTask; +function listRemotesTask(customArgs = []) { + const commands = [...customArgs]; + if (commands[0] !== 'ls-remote') { + commands.unshift('ls-remote'); + } + return task.straightThroughStringTask(commands); +} +exports.listRemotesTask = listRemotesTask; +function remoteTask(customArgs = []) { + const commands = [...customArgs]; + if (commands[0] !== 'remote') { + commands.unshift('remote'); + } + return task.straightThroughStringTask(commands); +} +exports.remoteTask = remoteTask; +function removeRemoteTask(remoteName) { + return task.straightThroughStringTask(['remote', 'remove', remoteName]); +} +exports.removeRemoteTask = removeRemoteTask; + +}); + +var stashList = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.stashListTask = void 0; + + +function stashListTask(opt = {}, customArgs) { + const options = log.parseLogOptions(opt); + const parser = parseListLogSummary.createListLogSummaryParser(options.splitter, options.fields); + return { + commands: ['stash', 'list', ...options.commands, ...customArgs], + format: 'utf-8', + parser, + }; +} +exports.stashListTask = stashListTask; + +}); + +var FileStatusSummary_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FileStatusSummary = exports.fromPathRegex = void 0; +exports.fromPathRegex = /^(.+) -> (.+)$/; +class FileStatusSummary { + constructor(path, index, working_dir) { + this.path = path; + this.index = index; + this.working_dir = working_dir; + if ('R' === (index + working_dir)) { + const detail = exports.fromPathRegex.exec(path) || [null, path, path]; + this.from = detail[1] || ''; + this.path = detail[2] || ''; + } + } +} +exports.FileStatusSummary = FileStatusSummary; + +}); + +var StatusSummary_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseStatusSummary = exports.StatusSummaryParsers = exports.StatusSummary = void 0; + +/** + * The StatusSummary is returned as a response to getting `git().status()` + */ +class StatusSummary { + constructor() { + this.not_added = []; + this.conflicted = []; + this.created = []; + this.deleted = []; + this.modified = []; + this.renamed = []; + /** + * All files represented as an array of objects containing the `path` and status in `index` and + * in the `working_dir`. + */ + this.files = []; + this.staged = []; + /** + * Number of commits ahead of the tracked branch + */ + this.ahead = 0; + /** + *Number of commits behind the tracked branch + */ + this.behind = 0; + /** + * Name of the current branch + */ + this.current = null; + /** + * Name of the branch being tracked + */ + this.tracking = null; + } + /** + * Gets whether this StatusSummary represents a clean working branch. + */ + isClean() { + return !this.files.length; + } +} +exports.StatusSummary = StatusSummary; +exports.StatusSummaryParsers = { + '##': function (line, status) { + const aheadReg = /ahead (\d+)/; + const behindReg = /behind (\d+)/; + const currentReg = /^(.+?(?=(?:\.{3}|\s|$)))/; + const trackingReg = /\.{3}(\S*)/; + const onEmptyBranchReg = /\son\s([\S]+)$/; + let regexResult; + regexResult = aheadReg.exec(line); + status.ahead = regexResult && +regexResult[1] || 0; + regexResult = behindReg.exec(line); + status.behind = regexResult && +regexResult[1] || 0; + regexResult = currentReg.exec(line); + status.current = regexResult && regexResult[1]; + regexResult = trackingReg.exec(line); + status.tracking = regexResult && regexResult[1]; + regexResult = onEmptyBranchReg.exec(line); + status.current = regexResult && regexResult[1] || status.current; + }, + '??': function (line, status) { + status.not_added.push(line); + }, + A: function (line, status) { + status.created.push(line); + }, + AM: function (line, status) { + status.created.push(line); + }, + D: function (line, status) { + status.deleted.push(line); + }, + M: function (line, status, indexState) { + status.modified.push(line); + if (indexState === 'M') { + status.staged.push(line); + } + }, + R: function (line, status) { + const detail = /^(.+) -> (.+)$/.exec(line) || [null, line, line]; + status.renamed.push({ + from: String(detail[1]), + to: String(detail[2]) + }); + }, + UU: function (line, status) { + status.conflicted.push(line); + } +}; +exports.StatusSummaryParsers.MM = exports.StatusSummaryParsers.M; +/* Map all unmerged status code combinations to UU to mark as conflicted */ +exports.StatusSummaryParsers.AA = exports.StatusSummaryParsers.UU; +exports.StatusSummaryParsers.UD = exports.StatusSummaryParsers.UU; +exports.StatusSummaryParsers.DU = exports.StatusSummaryParsers.UU; +exports.StatusSummaryParsers.DD = exports.StatusSummaryParsers.UU; +exports.StatusSummaryParsers.AU = exports.StatusSummaryParsers.UU; +exports.StatusSummaryParsers.UA = exports.StatusSummaryParsers.UU; +const parseStatusSummary = function (text) { + let file; + const lines = text.trim().split('\n'); + const status = new StatusSummary(); + for (let i = 0, l = lines.length; i < l; i++) { + file = splitLine(lines[i]); + if (!file) { + continue; + } + if (file.handler) { + file.handler(file.path, status, file.index, file.workingDir); + } + if (file.code !== '##') { + status.files.push(new FileStatusSummary_1.FileStatusSummary(file.path, file.index, file.workingDir)); + } + } + return status; +}; +exports.parseStatusSummary = parseStatusSummary; +function splitLine(lineStr) { + let line = lineStr.trim().match(/(..?)(\s+)(.*)/); + if (!line || !line[1].trim()) { + line = lineStr.trim().match(/(..?)\s+(.*)/); + } + if (!line) { + return; + } + let code = line[1]; + if (line[2].length > 1) { + code += ' '; + } + if (code.length === 1 && line[2].length === 1) { + code = ' ' + code; + } + return { + raw: code, + code: code.trim(), + index: code.charAt(0), + workingDir: code.charAt(1), + handler: exports.StatusSummaryParsers[code.trim()], + path: line[3] + }; +} + +}); + +var status = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.statusTask = void 0; + +function statusTask(customArgs) { + return { + format: 'utf-8', + commands: ['status', '--porcelain', '-b', '-u', ...customArgs], + parser(text) { + return StatusSummary_1.parseStatusSummary(text); + } + }; +} +exports.statusTask = statusTask; + +}); + +var subModule = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.updateSubModuleTask = exports.subModuleTask = exports.initSubModuleTask = exports.addSubModuleTask = void 0; + +function addSubModuleTask(repo, path) { + return subModuleTask(['add', repo, path]); +} +exports.addSubModuleTask = addSubModuleTask; +function initSubModuleTask(customArgs) { + return subModuleTask(['init', ...customArgs]); +} +exports.initSubModuleTask = initSubModuleTask; +function subModuleTask(customArgs) { + const commands = [...customArgs]; + if (commands[0] !== 'submodule') { + commands.unshift('submodule'); + } + return task.straightThroughStringTask(commands); +} +exports.subModuleTask = subModuleTask; +function updateSubModuleTask(customArgs) { + return subModuleTask(['update', ...customArgs]); +} +exports.updateSubModuleTask = updateSubModuleTask; + +}); + +var TagList_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseTagList = exports.TagList = void 0; +class TagList { + constructor(all, latest) { + this.all = all; + this.latest = latest; + } +} +exports.TagList = TagList; +const parseTagList = function (data, customSort = false) { + const tags = data + .split('\n') + .map(trimmed) + .filter(Boolean); + if (!customSort) { + tags.sort(function (tagA, tagB) { + const partsA = tagA.split('.'); + const partsB = tagB.split('.'); + if (partsA.length === 1 || partsB.length === 1) { + return singleSorted(toNumber(partsA[0]), toNumber(partsB[0])); + } + for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) { + const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i])); + if (diff) { + return diff; + } + } + return 0; + }); + } + const latest = customSort ? tags[0] : [...tags].reverse().find((tag) => tag.indexOf('.') >= 0); + return new TagList(tags, latest); +}; +exports.parseTagList = parseTagList; +function singleSorted(a, b) { + const aIsNum = isNaN(a); + const bIsNum = isNaN(b); + if (aIsNum !== bIsNum) { + return aIsNum ? 1 : -1; + } + return aIsNum ? sorted(a, b) : 0; +} +function sorted(a, b) { + return a === b ? 0 : a > b ? 1 : -1; +} +function trimmed(input) { + return input.trim(); +} +function toNumber(input) { + if (typeof input === 'string') { + return parseInt(input.replace(/^\D+/g, ''), 10) || 0; + } + return 0; +} + +}); + +var tag = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.addAnnotatedTagTask = exports.addTagTask = exports.tagListTask = void 0; + +/** + * Task used by `git.tags` + */ +function tagListTask(customArgs = []) { + const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option)); + return { + format: 'utf-8', + commands: ['tag', '-l', ...customArgs], + parser(text) { + return TagList_1.parseTagList(text, hasCustomSort); + }, + }; +} +exports.tagListTask = tagListTask; +/** + * Task used by `git.addTag` + */ +function addTagTask(name) { + return { + format: 'utf-8', + commands: ['tag', name], + parser() { + return { name }; + } + }; +} +exports.addTagTask = addTagTask; +/** + * Task used by `git.addTag` + */ +function addAnnotatedTagTask(name, tagMessage) { + return { + format: 'utf-8', + commands: ['tag', '-a', '-m', tagMessage, name], + parser() { + return { name }; + } + }; +} +exports.addAnnotatedTagTask = addAnnotatedTagTask; + +}); + +var CheckIgnore = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseCheckIgnore = void 0; +/** + * Parser for the `check-ignore` command - returns each file as a string array + */ +const parseCheckIgnore = (text) => { + return text.split(/\n/g) + .map(line => line.trim()) + .filter(file => !!file); +}; +exports.parseCheckIgnore = parseCheckIgnore; + +}); + +const {GitExecutor} = gitExecutor; + +const {Scheduler} = scheduler; +const {GitLogger} = gitLogger; +const {adhocExecTask, configurationErrorTask} = task; +const {NOOP, appendTaskOptions, asArray, filterArray, filterPrimitives, filterString, filterStringOrStringArray, filterType, folderExists, getTrailingOptions, trailingFunctionArgument, trailingOptionsArgument} = utils; +const {branchTask, branchLocalTask, deleteBranchesTask, deleteBranchTask} = branch; +const {taskCallback} = taskCallback_1; +const {checkIsRepoTask} = checkIsRepo; +const {cloneTask, cloneMirrorTask} = clone; +const {addConfigTask, listConfigTask} = config; +const {cleanWithOptionsTask, isCleanOptionsArray} = clean; +const {commitTask} = commit; +const {diffSummaryTask} = diff; +const {fetchTask} = fetch; +const {hashObjectTask} = hashObject; +const {initTask} = init; +const {logTask, parseLogOptions} = log; +const {mergeTask} = merge; +const {moveTask} = move; +const {pullTask} = pull; +const {pushTagsTask, pushTask} = push; +const {addRemoteTask, getRemotesTask, listRemotesTask, remoteTask, removeRemoteTask} = remote; +const {getResetMode, resetTask} = reset; +const {stashListTask} = stashList; +const {statusTask} = status; +const {addSubModuleTask, initSubModuleTask, subModuleTask, updateSubModuleTask} = subModule; +const {addAnnotatedTagTask, addTagTask, tagListTask} = tag; +const {straightThroughStringTask} = task; +const {parseCheckIgnore} = CheckIgnore; + +const ChainedExecutor = Symbol('ChainedExecutor'); + +/** + * Git handling for node. All public functions can be chained and all `then` handlers are optional. + * + * @param {SimpleGitOptions} options Configuration settings for this instance + * + * @constructor + */ +function Git (options) { + this._executor = new GitExecutor( + options.binary, options.baseDir, + new Scheduler(options.maxConcurrentProcesses) + ); + this._logger = new GitLogger(); +} + +/** + * The executor that runs each of the added commands + * @type {GitExecutor} + * @private + */ +Git.prototype._executor = null; + +/** + * Logging utility for printing out info or error messages to the user + * @type {GitLogger} + * @private + */ +Git.prototype._logger = null; + +/** + * Sets the path to a custom git binary, should either be `git` when there is an installation of git available on + * the system path, or a fully qualified path to the executable. + * + * @param {string} command + * @returns {Git} + */ +Git.prototype.customBinary = function (command) { + this._executor.binary = command; + return this; +}; + +/** + * Sets an environment variable for the spawned child process, either supply both a name and value as strings or + * a single object to entirely replace the current environment variables. + * + * @param {string|Object} name + * @param {string} [value] + * @returns {Git} + */ +Git.prototype.env = function (name, value) { + if (arguments.length === 1 && typeof name === 'object') { + this._executor.env = name; + } else { + (this._executor.env = this._executor.env || {})[name] = value; + } + + return this; +}; + +/** + * Sets the working directory of the subsequent commands. + */ +Git.prototype.cwd = function (workingDirectory) { + const task = (typeof workingDirectory !== 'string') + ? configurationErrorTask('Git.cwd: workingDirectory must be supplied as a string') + : adhocExecTask(() => { + if (!folderExists(workingDirectory)) { + throw new Error(`Git.cwd: cannot change to non-directory "${ workingDirectory }"`); + } + + return (this._executor.cwd = workingDirectory); + }); + + return this._runTask(task, trailingFunctionArgument(arguments) || NOOP); +}; + +/** + * Sets a handler function to be called whenever a new child process is created, the handler function will be called + * with the name of the command being run and the stdout & stderr streams used by the ChildProcess. + * + * @example + * require('simple-git') + * .outputHandler(function (command, stdout, stderr) { + * stdout.pipe(process.stdout); + * }) + * .checkout('https://github.com/user/repo.git'); + * + * @see https://nodejs.org/api/child_process.html#child_process_class_childprocess + * @see https://nodejs.org/api/stream.html#stream_class_stream_readable + * @param {Function} outputHandler + * @returns {Git} + */ +Git.prototype.outputHandler = function (outputHandler) { + this._executor.outputHandler = outputHandler; + return this; +}; + +/** + * Initialize a git repo + * + * @param {Boolean} [bare=false] + * @param {Function} [then] + */ +Git.prototype.init = function (bare, then) { + return this._runTask( + initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Check the status of the local repo + */ +Git.prototype.status = function () { + return this._runTask( + statusTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * List the stash(s) of the local repo + */ +Git.prototype.stashList = function (options) { + return this._runTask( + stashListTask( + trailingOptionsArgument(arguments) || {}, + filterArray(options) && options || [] + ), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Stash the local repo + * + * @param {Object|Array} [options] + * @param {Function} [then] + */ +Git.prototype.stash = function (options, then) { + return this._runTask( + straightThroughStringTask(['stash', ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments), + ); +}; + +function createCloneTask (api, task, repoPath, localPath) { + if (typeof repoPath !== 'string') { + return configurationErrorTask(`git.${ api }() requires a string 'repoPath'`); + } + + return task(repoPath, filterType(localPath, filterString), getTrailingOptions(arguments)); +} + + +/** + * Clone a git repo + */ +Git.prototype.clone = function () { + return this._runTask( + createCloneTask('clone', cloneTask, ...arguments), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Mirror a git repo + */ +Git.prototype.mirror = function () { + return this._runTask( + createCloneTask('mirror', cloneMirrorTask, ...arguments), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Moves one or more files to a new destination. + * + * @see https://git-scm.com/docs/git-mv + * + * @param {string|string[]} from + * @param {string} to + */ +Git.prototype.mv = function (from, to) { + return this._runTask(moveTask(from, to), trailingFunctionArgument(arguments)); +}; + +/** + * Internally uses pull and tags to get the list of tags then checks out the latest tag. + * + * @param {Function} [then] + */ +Git.prototype.checkoutLatestTag = function (then) { + var git = this; + return this.pull(function () { + git.tags(function (err, tags) { + git.checkout(tags.latest, then); + }); + }); +}; + +/** + * Adds one or more files to source control + */ +Git.prototype.add = function (files) { + return this._run( + ['add'].concat(files), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Commits changes in the current working directory - when specific file paths are supplied, only changes on those + * files will be committed. + * + * @param {string|string[]} message + * @param {string|string[]} [files] + * @param {Object} [options] + * @param {Function} [then] + */ +Git.prototype.commit = function (message, files, options, then) { + const next = trailingFunctionArgument(arguments); + const messages = []; + + if (filterStringOrStringArray(message)) { + messages.push(...asArray(message)); + } + else { + console.warn('simple-git deprecation notice: git.commit: requires the commit message to be supplied as a string/string[], this will be an error in version 3'); + } + + return this._runTask( + commitTask( + messages, + asArray(filterType(files, filterStringOrStringArray, [])), + [...filterType(options, filterArray, []), ...getTrailingOptions(arguments, 0, true)] + ), + next + ); +}; + +/** + * Pull the updated contents of the current repo + */ +Git.prototype.pull = function (remote, branch, options, then) { + return this._runTask( + pullTask(filterType(remote, filterString), filterType(branch, filterString), getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Fetch the updated contents of the current repo. + * + * @example + * .fetch('upstream', 'master') // fetches from master on remote named upstream + * .fetch(function () {}) // runs fetch against default remote and branch and calls function + * + * @param {string} [remote] + * @param {string} [branch] + */ +Git.prototype.fetch = function (remote, branch) { + return this._runTask( + fetchTask(filterType(remote, filterString), filterType(branch, filterString), getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Disables/enables the use of the console for printing warnings and errors, by default messages are not shown in + * a production environment. + * + * @param {boolean} silence + * @returns {Git} + */ +Git.prototype.silent = function (silence) { + this._logger.silent(!!silence); + return this; +}; + +/** + * List all tags. When using git 2.7.0 or above, include an options object with `"--sort": "property-name"` to + * sort the tags by that property instead of using the default semantic versioning sort. + * + * Note, supplying this option when it is not supported by your Git version will cause the operation to fail. + * + * @param {Object} [options] + * @param {Function} [then] + */ +Git.prototype.tags = function (options, then) { + return this._runTask( + tagListTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Rebases the current working copy. Options can be supplied either as an array of string parameters + * to be sent to the `git rebase` command, or a standard options object. + */ +Git.prototype.rebase = function () { + return this._run( + ['rebase'].concat(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments) + ); +}; + +/** + * Reset a repo + * + * @param {string|string[]} [mode=soft] Either an array of arguments supported by the 'git reset' command, or the + * string value 'soft' or 'hard' to set the reset mode. + * @param {Function} [then] + */ +Git.prototype.reset = function (mode, then) { + return this._runTask( + resetTask(getResetMode(mode), getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Revert one or more commits in the local working copy + */ +Git.prototype.revert = function (commit) { + const next = trailingFunctionArgument(arguments); + + if (typeof commit !== 'string') { + return this._runTask( + configurationErrorTask('Commit must be a string'), + next, + ); + } + + return this._run([ + 'revert', + ...getTrailingOptions(arguments, 0, true), + commit + ], next); +}; + +/** + * Add a lightweight tag to the head of the current branch + * + * @param {string} name + * @param {Function} [then] + */ +Git.prototype.addTag = function (name, then) { + const task = (typeof name === 'string') + ? addTagTask(name) + : configurationErrorTask('Git.addTag requires a tag name'); + + return this._runTask(task, trailingFunctionArgument(arguments)); +}; + +/** + * Add an annotated tag to the head of the current branch + * + * @param {string} tagName + * @param {string} tagMessage + * @param {Function} [then] + */ +Git.prototype.addAnnotatedTag = function (tagName, tagMessage, then) { + return this._runTask( + addAnnotatedTagTask(tagName, tagMessage), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Check out a tag or revision, any number of additional arguments can be passed to the `git checkout` command + * by supplying either a string or array of strings as the `what` parameter. + * + * @param {string|string[]} what One or more commands to pass to `git checkout` + * @param {Function} [then] + */ +Git.prototype.checkout = function (what, then) { + const commands = ['checkout', ...getTrailingOptions(arguments, true)]; + return this._runTask( + straightThroughStringTask(commands), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Check out a remote branch + * + * @param {string} branchName name of branch + * @param {string} startPoint (e.g origin/development) + * @param {Function} [then] + */ +Git.prototype.checkoutBranch = function (branchName, startPoint, then) { + return this.checkout(['-b', branchName, startPoint], trailingFunctionArgument(arguments)); +}; + +/** + * Check out a local branch + */ +Git.prototype.checkoutLocalBranch = function (branchName, then) { + return this.checkout(['-b', branchName], trailingFunctionArgument(arguments)); +}; + +/** + * Delete a local branch + */ +Git.prototype.deleteLocalBranch = function (branchName, forceDelete, then) { + return this._runTask( + deleteBranchTask(branchName, typeof forceDelete === "boolean" ? forceDelete : false), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Delete one or more local branches + */ +Git.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) { + return this._runTask( + deleteBranchesTask(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), + trailingFunctionArgument(arguments), + ); +}; + +/** + * List all branches + * + * @param {Object | string[]} [options] + * @param {Function} [then] + */ +Git.prototype.branch = function (options, then) { + return this._runTask( + branchTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Return list of local branches + * + * @param {Function} [then] + */ +Git.prototype.branchLocal = function (then) { + return this._runTask( + branchLocalTask(), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Add config to local git instance + * + * @param {string} key configuration key (e.g user.name) + * @param {string} value for the given key (e.g your name) + * @param {boolean} [append=false] optionally append the key/value pair (equivalent of passing `--add` option). + * @param {Function} [then] + */ +Git.prototype.addConfig = function (key, value, append, then) { + return this._runTask( + addConfigTask(key, value, typeof append === "boolean" ? append : false), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.listConfig = function () { + return this._runTask(listConfigTask(), trailingFunctionArgument(arguments)); +}; + +/** + * Executes any command against the git binary. + */ +Git.prototype.raw = function (commands) { + const createRestCommands = !Array.isArray(commands); + const command = [].slice.call(createRestCommands ? arguments : commands, 0); + + for (let i = 0; i < command.length && createRestCommands; i++) { + if (!filterPrimitives(command[i])) { + command.splice(i, command.length - i); + break; + } + } + + command.push( + ...getTrailingOptions(arguments, 0, true), + ); + + var next = trailingFunctionArgument(arguments); + + if (!command.length) { + return this._runTask( + configurationErrorTask('Raw: must supply one or more command to execute'), + next, + ); + } + + return this._run(command, next); +}; + +Git.prototype.submoduleAdd = function (repo, path, then) { + return this._runTask( + addSubModuleTask(repo, path), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.submoduleUpdate = function (args, then) { + return this._runTask( + updateSubModuleTask(getTrailingOptions(arguments, true)), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.submoduleInit = function (args, then) { + return this._runTask( + initSubModuleTask(getTrailingOptions(arguments, true)), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.subModule = function (options, then) { + return this._runTask( + subModuleTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.listRemote = function () { + return this._runTask( + listRemotesTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Adds a remote to the list of remotes. + */ +Git.prototype.addRemote = function (remoteName, remoteRepo, then) { + return this._runTask( + addRemoteTask(remoteName, remoteRepo, getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Removes an entry by name from the list of remotes. + */ +Git.prototype.removeRemote = function (remoteName, then) { + return this._runTask( + removeRemoteTask(remoteName), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Gets the currently available remotes, setting the optional verbose argument to true includes additional + * detail on the remotes themselves. + */ +Git.prototype.getRemotes = function (verbose, then) { + return this._runTask( + getRemotesTask(verbose === true), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Compute object ID from a file + */ +Git.prototype.hashObject = function (path, write) { + return this._runTask( + hashObjectTask(path, write === true), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Call any `git remote` function with arguments passed as an array of strings. + * + * @param {string[]} options + * @param {Function} [then] + */ +Git.prototype.remote = function (options, then) { + return this._runTask( + remoteTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Merges from one branch to another, equivalent to running `git merge ${from} $[to}`, the `options` argument can + * either be an array of additional parameters to pass to the command or null / omitted to be ignored. + * + * @param {string} from + * @param {string} to + */ +Git.prototype.mergeFromTo = function (from, to) { + if (!(filterString(from) && filterString(to))) { + return this._runTask(configurationErrorTask( + `Git.mergeFromTo requires that the 'from' and 'to' arguments are supplied as strings` + )); + } + + return this._runTask( + mergeTask([from, to, ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments, false), + ); +}; + +/** + * Runs a merge, `options` can be either an array of arguments + * supported by the [`git merge`](https://git-scm.com/docs/git-merge) + * or an options object. + * + * Conflicts during the merge result in an error response, + * the response type whether it was an error or success will be a MergeSummary instance. + * When successful, the MergeSummary has all detail from a the PullSummary + * + * @param {Object | string[]} [options] + * @param {Function} [then] + * @returns {*} + * + * @see ./responses/MergeSummary.js + * @see ./responses/PullSummary.js + */ +Git.prototype.merge = function () { + return this._runTask( + mergeTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Call any `git tag` function with arguments passed as an array of strings. + * + * @param {string[]} options + * @param {Function} [then] + */ +Git.prototype.tag = function (options, then) { + const command = getTrailingOptions(arguments); + + if (command[0] !== 'tag') { + command.unshift('tag'); + } + + return this._run(command, trailingFunctionArgument(arguments)); +}; + +/** + * Updates repository server info + * + * @param {Function} [then] + */ +Git.prototype.updateServerInfo = function (then) { + return this._run(["update-server-info"], trailingFunctionArgument(arguments)); +}; + +/** + * Pushes the current committed changes to a remote, optionally specify the names of the remote and branch to use + * when pushing. Supply multiple options as an array of strings in the first argument - see examples below. + */ +Git.prototype.push = function (remote, branch, then) { + const task = pushTask( + {remote: filterType(remote, filterString), branch: filterType(branch, filterString)}, + getTrailingOptions(arguments), + ); + return this._runTask(task, trailingFunctionArgument(arguments)); +}; + +/** + * Pushes the current tag changes to a remote which can be either a URL or named remote. When not specified uses the + * default configured remote spec. + * + * @param {string} [remote] + * @param {Function} [then] + */ +Git.prototype.pushTags = function (remote, then) { + const task = pushTagsTask({remote: filterType(remote, filterString)}, getTrailingOptions(arguments)); + + return this._runTask(task, trailingFunctionArgument(arguments)); +}; + +/** + * Removes the named files from source control. + * + * @param {string|string[]} files + * @param {Function} [then] + */ +Git.prototype.rm = function (files, then) { + return this._rm(files, '-f', then); +}; + +/** + * Removes the named files from source control but keeps them on disk rather than deleting them entirely. To + * completely remove the files, use `rm`. + * + * @param {string|string[]} files + * @param {Function} [then] + */ +Git.prototype.rmKeepLocal = function (files, then) { + return this._rm(files, '--cached', then); +}; + +/** + * Returns a list of objects in a tree based on commit hash. Passing in an object hash returns the object's content, + * size, and type. + * + * Passing "-p" will instruct cat-file to determine the object type, and display its formatted contents. + * + * @param {string[]} [options] + * @param {Function} [then] + */ +Git.prototype.catFile = function (options, then) { + return this._catFile('utf-8', arguments); +}; + +/** + * Equivalent to `catFile` but will return the native `Buffer` of content from the git command's stdout. + * + * @param {string[]} options + * @param then + */ +Git.prototype.binaryCatFile = function (options, then) { + return this._catFile('buffer', arguments); +}; + +Git.prototype._catFile = function (format, args) { + var handler = trailingFunctionArgument(args); + var command = ['cat-file']; + var options = args[0]; + + if (typeof options === 'string') { + return this._runTask( + configurationErrorTask('Git#catFile: options must be supplied as an array of strings'), + handler, + ); + } + + if (Array.isArray(options)) { + command.push.apply(command, options); + } + + return this._run(command, handler, { + format: format + }); +}; + +Git.prototype.diff = function (options, then) { + const command = ['diff', ...getTrailingOptions(arguments)]; + + if (typeof options === 'string') { + command.splice(1, 0, options); + this._logger.warn('Git#diff: supplying options as a single string is now deprecated, switch to an array of strings'); + } + + return this._runTask( + straightThroughStringTask(command), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.diffSummary = function () { + return this._runTask( + diffSummaryTask(getTrailingOptions(arguments, 1)), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.revparse = function () { + const commands = ['rev-parse', ...getTrailingOptions(arguments, true)]; + return this._runTask( + straightThroughStringTask(commands, true), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Show various types of objects, for example the file at a certain commit + * + * @param {string[]} [options] + * @param {Function} [then] + */ +Git.prototype.show = function (options, then) { + return this._runTask( + straightThroughStringTask(['show', ...getTrailingOptions(arguments, 1)]), + trailingFunctionArgument(arguments) + ); +}; + +/** + */ +Git.prototype.clean = function (mode, options, then) { + const usingCleanOptionsArray = isCleanOptionsArray(mode); + const cleanMode = usingCleanOptionsArray && mode.join('') || filterType(mode, filterString) || ''; + const customArgs = getTrailingOptions([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0)); + + return this._runTask( + cleanWithOptionsTask(cleanMode, customArgs), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Call a simple function at the next step in the chain. + * @param {Function} [then] + */ +Git.prototype.exec = function (then) { + const task = { + commands: [], + format: 'utf-8', + parser () { + if (typeof then === 'function') { + then(); + } + } + }; + + return this._runTask(task); +}; + +/** + * Show commit logs from `HEAD` to the first commit. + * If provided between `options.from` and `options.to` tags or branch. + * + * Additionally you can provide options.file, which is the path to a file in your repository. Then only this file will be considered. + * + * To use a custom splitter in the log format, set `options.splitter` to be the string the log should be split on. + * + * Options can also be supplied as a standard options object for adding custom properties supported by the git log command. + * For any other set of options, supply options as an array of strings to be appended to the git log command. + */ +Git.prototype.log = function (options) { + const next = trailingFunctionArgument(arguments); + + if (filterString(arguments[0]) && filterString(arguments[1])) { + return this._runTask( + configurationErrorTask(`git.log(string, string) should be replaced with git.log({ from: string, to: string })`), + next + ); + } + + const parsedOptions = parseLogOptions( + trailingOptionsArgument(arguments) || {}, + filterArray(options) && options || [] + ); + + return this._runTask( + logTask(parsedOptions.splitter, parsedOptions.fields, parsedOptions.commands) + ) +}; + +/** + * Clears the queue of pending commands and returns the wrapper instance for chaining. + * + * @returns {Git} + */ +Git.prototype.clearQueue = function () { + // TODO: + // this._executor.clear(); + return this; +}; + +/** + * Check if a pathname or pathnames are excluded by .gitignore + * + * @param {string|string[]} pathnames + * @param {Function} [then] + */ +Git.prototype.checkIgnore = function (pathnames, then) { + return this._run( + ["check-ignore", ...asArray((filterType(pathnames, filterStringOrStringArray, [])))], + trailingFunctionArgument(arguments), + { + parser: parseCheckIgnore + } + ) +}; + +Git.prototype.checkIsRepo = function (checkType, then) { + return this._runTask( + checkIsRepoTask(filterType(checkType, filterString)), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype._rm = function (_files, options, then) { + var files = [].concat(_files); + var args = ['rm', options]; + args.push.apply(args, files); + + return this._run(args, trailingFunctionArgument(arguments)); +}; + +/** + * Schedules the supplied command to be run, the command should not include the name of the git binary and should + * be an array of strings passed as the arguments to the git binary. + * + * @param {string[]} command + * @param {Function} then + * @param {Object} [opt] + * @param {boolean} [opt.concatStdErr=false] Optionally concatenate stderr output into the stdout + * @param {boolean} [opt.format="utf-8"] The format to use when reading the content of stdout + * @param {Function} [opt.onError] Optional error handler for this command - can be used to allow non-clean exits + * without killing the remaining stack of commands + * @param {Function} [opt.parser] Optional parser function + * @param {number} [opt.onError.exitCode] + * @param {string} [opt.onError.stdErr] + * + * @returns {Git} + */ +Git.prototype._run = function (command, then, opt) { + + const task = Object.assign({ + concatStdErr: false, + onError: undefined, + format: 'utf-8', + parser (data) { + return data; + } + }, opt || {}, { + commands: command, + }); + + return this._runTask(task, then); +}; + +Git.prototype._runTask = function (task, then) { + const executor = this[ChainedExecutor] || this._executor.chain(); + const promise = executor.push(task); + + taskCallback( + task, + promise, + then); + + return Object.create(this, { + then: {value: promise.then.bind(promise)}, + catch: {value: promise.catch.bind(promise)}, + [ChainedExecutor]: {value: executor}, + }); +}; + +var git = Git; + +var gitFactory = createCommonjsModule(function (module) { +const {GitConstructError} = api; +const {createInstanceConfig, folderExists} = utils; + +const api$1 = Object.create(null); +for (let imported = api, keys = Object.keys(imported), i = 0; i < keys.length; i++) { + const name = keys[i]; + if (/^[A-Z]/.test(name)) { + api$1[name] = imported[name]; + } +} + +/** + * Adds the necessary properties to the supplied object to enable it for use as + * the default export of a module. + * + * Eg: `module.exports = esModuleFactory({ something () {} })` + */ +module.exports.esModuleFactory = function esModuleFactory (defaultExport) { + return Object.defineProperties(defaultExport, { + __esModule: {value: true}, + default: {value: defaultExport}, + }); +}; + +module.exports.gitExportFactory = function gitExportFactory (factory, extra) { + return Object.assign(function () { + return factory.apply(null, arguments); + }, + api$1, + extra || {}, + ); +}; + +module.exports.gitInstanceFactory = function gitInstanceFactory (baseDir, options) { + const config = createInstanceConfig( + baseDir && (typeof baseDir === 'string' ? {baseDir} : baseDir), + options + ); + + if (!folderExists(config.baseDir)) { + throw new GitConstructError(config, `Cannot use simple-git on a directory that does not exist`); + } + + return new git(config); +}; +}); + +var promiseWrapped = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.gitP = void 0; + +const functionNamesBuilderApi = [ + 'customBinary', 'env', 'outputHandler', 'silent', +]; +const functionNamesPromiseApi = [ + 'add', + 'addAnnotatedTag', + 'addConfig', + 'addRemote', + 'addTag', + 'binaryCatFile', + 'branch', + 'branchLocal', + 'catFile', + 'checkIgnore', + 'checkIsRepo', + 'checkout', + 'checkoutBranch', + 'checkoutLatestTag', + 'checkoutLocalBranch', + 'clean', + 'clone', + 'commit', + 'cwd', + 'deleteLocalBranch', + 'deleteLocalBranches', + 'diff', + 'diffSummary', + 'exec', + 'fetch', + 'getRemotes', + 'init', + 'listConfig', + 'listRemote', + 'log', + 'merge', + 'mergeFromTo', + 'mirror', + 'mv', + 'pull', + 'push', + 'pushTags', + 'raw', + 'rebase', + 'remote', + 'removeRemote', + 'reset', + 'revert', + 'revparse', + 'rm', + 'rmKeepLocal', + 'show', + 'stash', + 'stashList', + 'status', + 'subModule', + 'submoduleAdd', + 'submoduleInit', + 'submoduleUpdate', + 'tag', + 'tags', + 'updateServerInfo' +]; +const { gitInstanceFactory } = gitFactory; +function gitP(...args) { + let git; + let chain = Promise.resolve(); + try { + git = gitInstanceFactory(...args); + } + catch (e) { + chain = Promise.reject(e); + } + function builderReturn() { + return promiseApi; + } + function chainReturn() { + return chain; + } + const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce((api, name) => { + const isAsync = functionNamesPromiseApi.includes(name); + const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api); + const alternative = isAsync ? chainReturn : builderReturn; + Object.defineProperty(api, name, { + enumerable: false, + configurable: false, + value: git ? valid : alternative, + }); + return api; + }, {}); + return promiseApi; + function asyncWrapper(fn, git) { + return function (...args) { + if (typeof args[args.length] === 'function') { + throw new TypeError('Promise interface requires that handlers are not supplied inline, ' + + 'trailing function not allowed in call to ' + fn); + } + return chain.then(function () { + return new Promise(function (resolve, reject) { + const callback = (err, result) => { + if (err) { + return reject(toError(err)); + } + resolve(result); + }; + args.push(callback); + git[fn].apply(git, args); + }); + }); + }; + } + function syncWrapper(fn, git, api) { + return (...args) => { + git[fn](...args); + return api; + }; + } +} +exports.gitP = gitP; +function toError(error) { + if (error instanceof Error) { + return error; + } + if (typeof error === 'string') { + return new Error(error); + } + return new gitResponseError.GitResponseError(error); +} + +}); + +const {gitP} = promiseWrapped; +const {esModuleFactory, gitInstanceFactory, gitExportFactory} = gitFactory; + +var src$2 = esModuleFactory( + gitExportFactory(gitInstanceFactory, {gitP}) +); + +var PluginState; +(function (PluginState) { + PluginState[PluginState["idle"] = 0] = "idle"; + PluginState[PluginState["status"] = 1] = "status"; + PluginState[PluginState["pull"] = 2] = "pull"; + PluginState[PluginState["add"] = 3] = "add"; + PluginState[PluginState["commit"] = 4] = "commit"; + PluginState[PluginState["push"] = 5] = "push"; +})(PluginState || (PluginState = {})); +var ObsidianGit = /** @class */ (function (_super) { + __extends(ObsidianGit, _super); + function ObsidianGit() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.state = PluginState.idle; + return _this; + // endregion: displaying / formatting stuff + } + ObsidianGit.prototype.setState = function (state) { + this.state = state; + this.statusBar.display(); + }; + ObsidianGit.prototype.getState = function () { + return this.state; + }; + ObsidianGit.prototype.onload = function () { + return __awaiter(this, void 0, void 0, function () { + var statusBarEl, adapter, git, isValidRepo, _a, branchInfo, remote; + var _this = this; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + statusBarEl = this.addStatusBarItem(); + this.statusBar = new StatusBar(statusBarEl, this); + this.setState(PluginState.idle); + this.registerInterval(window.setInterval(function () { return _this.statusBar.display(); }, 1000)); + adapter = this.app.vault.adapter; + git = src$2(adapter.basePath); + isValidRepo = git.checkIsRepo(src$2.CheckRepoActions.IS_REPO_ROOT); + if (!isValidRepo) { + this.displayMessage("Valid git repository not found.", 0); + return [2 /*return*/]; + } + this.git = git; + _a = this; + return [4 /*yield*/, this.loadData()]; + case 1: + _a.settings = (_b.sent()) || new ObsidianGitSettings(); + return [4 /*yield*/, git.branch()]; + case 2: + branchInfo = _b.sent(); + this.settings.currentBranch = branchInfo.current; + return [4 /*yield*/, git.remote([])]; + case 3: + remote = _b.sent(); + if (typeof remote === "string") { + this.settings.remote = remote.trim(); + } + else { + this.displayMessage("Failed to detect remote.", 0); + return [2 /*return*/]; + } + if (!this.settings.autoPullOnBoot) return [3 /*break*/, 5]; + return [4 /*yield*/, this.pull().then(function (filesUpdated) { + _this.setState(PluginState.idle); + var message = filesUpdated > 0 + ? "Pulled new changes. " + filesUpdated + " files updated" + : "Everything up-to-date"; + _this.displayMessage(message); + })]; + case 4: + _b.sent(); + _b.label = 5; + case 5: + if (this.settings.autoSaveInterval > 0) { + this.enableAutoBackup(); + } + this.addSettingTab(new ObsidianGitSettingsTab(this.app, this)); + this.addCommand({ + id: "pull", + name: "Pull from remote repository", + callback: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { + return [2 /*return*/, this.pullChangesFromRemote()]; + }); }); }, + }); + this.addCommand({ + id: "push", + name: "Commit *all* changes and push to remote repository", + callback: function () { return __awaiter(_this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getFilesChanged().then(function (files) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!files.length) { + this.displayMessage("No changes detected"); + this.setState(PluginState.idle); + return [2 /*return*/]; + } + return [4 /*yield*/, this.createBackup()]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); })]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); }, + }); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.pullChangesFromRemote = function () { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.pull().then(function (filesUpdated) { + if (filesUpdated > 0) { + _this.displayMessage("Pulled new changes. " + filesUpdated + " files updated"); + } + else { + _this.displayMessage("Everything is up-to-date"); + } + })]; + case 1: + _a.sent(); + this.lastUpdate = Date.now(); + this.setState(PluginState.idle); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.createBackup = function () { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getFilesChanged().then(function (files) { return __awaiter(_this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (files.length === 0) { + this.setState(PluginState.idle); + return [2 /*return*/]; + } + return [4 /*yield*/, this.add() + .then(function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.commit()]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); }); }) + .then(function () { + return _this.displayMessage("Committed " + files.length + " files"); + })]; + case 1: + _a.sent(); + if (!!this.settings.disablePush) return [3 /*break*/, 3]; + return [4 /*yield*/, this.push().then(function () { + return _this.displayMessage("Pushed " + files.length + " files to remote"); + })]; + case 2: + _a.sent(); + _a.label = 3; + case 3: return [2 /*return*/]; + } + }); + }); })]; + case 1: + _a.sent(); + this.lastUpdate = Date.now(); + this.setState(PluginState.idle); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.onunload = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.saveData(this.settings)]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); + }; + // region: main methods + ObsidianGit.prototype.getFilesChanged = function () { + return __awaiter(this, void 0, void 0, function () { + var status; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.setState(PluginState.status); + return [4 /*yield*/, this.git.status()]; + case 1: + status = _a.sent(); + return [2 /*return*/, status.files]; + } + }); + }); + }; + ObsidianGit.prototype.add = function () { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.setState(PluginState.add); + return [4 /*yield*/, this.git.add("./*", function (err) { + return err && _this.displayError("Cannot add files: " + err.message); + })]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.commit = function () { + return __awaiter(this, void 0, void 0, function () { + var commitMessage; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.setState(PluginState.commit); + return [4 /*yield*/, this.formatCommitMessage(this.settings.commitMessage)]; + case 1: + commitMessage = _a.sent(); + return [4 /*yield*/, this.git.commit(commitMessage)]; + case 2: + _a.sent(); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.push = function () { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.setState(PluginState.push); + return [4 /*yield*/, this.git.push(this.settings.remote, this.settings.currentBranch, null, function (err) { + err && _this.displayError("Push failed " + err.message); + })]; + case 1: + _a.sent(); + this.lastUpdate = Date.now(); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.pull = function () { + return __awaiter(this, void 0, void 0, function () { + var pullResult; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.setState(PluginState.pull); + return [4 /*yield*/, this.git.pull(null, null, null, function (err) { + return err && _this.displayError("Pull failed " + err.message); + })]; + case 1: + pullResult = _a.sent(); + this.lastUpdate = Date.now(); + return [2 /*return*/, pullResult.files.length]; + } + }); + }); + }; + // endregion: main methods + ObsidianGit.prototype.enableAutoBackup = function () { + var _this = this; + var minutes = this.settings.autoSaveInterval; + this.intervalID = window.setInterval(function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.createBackup()]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); }); }, minutes * 60000); + this.registerInterval(this.intervalID); + }; + ObsidianGit.prototype.disableAutoBackup = function () { + if (this.intervalID) { + clearInterval(this.intervalID); + return true; + } + return false; + }; + // region: displaying / formatting messages + ObsidianGit.prototype.displayMessage = function (message, timeout) { + if (timeout === void 0) { timeout = 4 * 1000; } + this.statusBar.displayMessage(message.toLowerCase(), timeout); + if (!this.settings.disablePopups) { + new obsidian.Notice(message); + } + console.log("git obsidian: " + message); + }; + ObsidianGit.prototype.displayError = function (message, timeout) { + if (timeout === void 0) { timeout = 0; } + new obsidian.Notice(message); + this.statusBar.displayMessage(message.toLowerCase(), timeout); + }; + ObsidianGit.prototype.formatCommitMessage = function (template) { + return __awaiter(this, void 0, void 0, function () { + var status_1, numFiles, status_2, changeset_1, chunks, _i, _a, _b, action, files_1, files, moment; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + if (!template.includes("{{numFiles}}")) return [3 /*break*/, 2]; + return [4 /*yield*/, this.git.status()]; + case 1: + status_1 = _c.sent(); + numFiles = status_1.files.length; + template = template.replace("{{numFiles}}", String(numFiles)); + _c.label = 2; + case 2: + if (!template.includes("{{files}}")) return [3 /*break*/, 4]; + return [4 /*yield*/, this.git.status()]; + case 3: + status_2 = _c.sent(); + changeset_1 = {}; + status_2.files.forEach(function (value) { + if (value.index in changeset_1) { + changeset_1[value.index].push(value.path); + } + else { + changeset_1[value.index] = [value.path]; + } + }); + chunks = []; + for (_i = 0, _a = Object.entries(changeset_1); _i < _a.length; _i++) { + _b = _a[_i], action = _b[0], files_1 = _b[1]; + chunks.push(action + " " + files_1.join(" ")); + } + files = chunks.join(", "); + template = template.replace("{{files}}", files); + _c.label = 4; + case 4: + moment = window.moment; + return [2 /*return*/, template.replace("{{date}}", moment().format(this.settings.commitDateFormat))]; + } + }); + }); + }; + return ObsidianGit; +}(obsidian.Plugin)); +var ObsidianGitSettings = /** @class */ (function () { + function ObsidianGitSettings() { + this.commitMessage = "vault backup: {{date}}"; + this.commitDateFormat = "YYYY-MM-DD HH:mm:ss"; + this.autoSaveInterval = 0; + this.autoPullOnBoot = false; + this.disablePush = true; + this.disablePopups = false; + } + return ObsidianGitSettings; +}()); +var ObsidianGitSettingsTab = /** @class */ (function (_super) { + __extends(ObsidianGitSettingsTab, _super); + function ObsidianGitSettingsTab() { + return _super !== null && _super.apply(this, arguments) || this; + } + ObsidianGitSettingsTab.prototype.display = function () { + var _this = this; + var containerEl = this.containerEl; + var plugin = this.plugin; + containerEl.empty(); + containerEl.createEl("h2", { text: "Git Backup settings" }); + new obsidian.Setting(containerEl) + .setName("Vault backup interval (minutes)") + .setDesc("Commit and push changes every X minutes. To disable automatic backup, specify negative value or zero (default)") + .addText(function (text) { + return text + .setValue(String(plugin.settings.autoSaveInterval)) + .onChange(function (value) { + if (!isNaN(Number(value))) { + plugin.settings.autoSaveInterval = Number(value); + plugin.saveData(plugin.settings); + if (plugin.settings.autoSaveInterval > 0) { + plugin.disableAutoBackup(); // call clearInterval() before setting up a new one + plugin.enableAutoBackup(); + new obsidian.Notice("Automatic backup enabled! Every " + plugin.settings.autoSaveInterval + " minutes."); + } + else if (plugin.settings.autoSaveInterval <= 0 && + plugin.intervalID) { + plugin.disableAutoBackup() && + new obsidian.Notice("Automatic backup disabled!"); + } + } + else { + new obsidian.Notice("Please specify a valid number."); + } + }); + }); + new obsidian.Setting(containerEl) + .setName("Commit message") + .setDesc("Specify custom commit message. Available placeholders: {{date}}" + + " (see below) and {{numFiles}} (number of changed files in the commit)") + .addText(function (text) { + return text + .setPlaceholder("vault backup") + .setValue(plugin.settings.commitMessage + ? plugin.settings.commitMessage + : "") + .onChange(function (value) { + plugin.settings.commitMessage = value; + plugin.saveData(plugin.settings); + }); + }); + new obsidian.Setting(containerEl) + .setName("{{date}} placeholder format") + .setDesc('Specify custom date format. E.g. "YYYY-MM-DD HH:mm:ss"') + .addText(function (text) { + return text + .setPlaceholder(plugin.settings.commitDateFormat) + .setValue(plugin.settings.commitDateFormat) + .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + plugin.settings.commitDateFormat = value; + return [4 /*yield*/, plugin.saveData(plugin.settings)]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); }); + }); + new obsidian.Setting(containerEl) + .setName("Preview commit message") + .addButton(function (button) { + return button.setButtonText("Preview").onClick(function () { return __awaiter(_this, void 0, void 0, function () { + var commitMessagePreview; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, plugin.formatCommitMessage(plugin.settings.commitMessage)]; + case 1: + commitMessagePreview = _a.sent(); + new obsidian.Notice("" + commitMessagePreview); + return [2 /*return*/]; + } + }); + }); }); + }); + new obsidian.Setting(containerEl) + .setName("Current branch") + .setDesc("Switch to a different branch") + .addDropdown(function (dropdown) { return __awaiter(_this, void 0, void 0, function () { + var branchInfo, _i, _a, branch; + var _this = this; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, plugin.git.branchLocal()]; + case 1: + branchInfo = _b.sent(); + for (_i = 0, _a = branchInfo.all; _i < _a.length; _i++) { + branch = _a[_i]; + dropdown.addOption(branch, branch); + } + dropdown.setValue(branchInfo.current); + dropdown.onChange(function (option) { return __awaiter(_this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, plugin.git.checkout(option, [], function (err) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!err) return [3 /*break*/, 1]; + new obsidian.Notice(err.message); + dropdown.setValue(branchInfo.current); + return [3 /*break*/, 3]; + case 1: + new obsidian.Notice("Checked out to " + option); + plugin.settings.currentBranch = option; + return [4 /*yield*/, plugin.saveData(plugin.settings)]; + case 2: + _a.sent(); + _a.label = 3; + case 3: return [2 /*return*/]; + } + }); + }); })]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); }); + return [2 /*return*/]; + } + }); + }); }); + new obsidian.Setting(containerEl) + .setName("Pull updates on startup") + .setDesc("Automatically pull updates when Obsidian starts") + .addToggle(function (toggle) { + return toggle + .setValue(plugin.settings.autoPullOnBoot) + .onChange(function (value) { + plugin.settings.autoPullOnBoot = value; + plugin.saveData(plugin.settings); + }); + }); + new obsidian.Setting(containerEl) + .setName("Disable push") + .setDesc("Do not push changes to the remote repository") + .addToggle(function (toggle) { + return toggle + .setValue(plugin.settings.disablePush) + .onChange(function (value) { + plugin.settings.disablePush = value; + plugin.saveData(plugin.settings); + }); + }); + new obsidian.Setting(containerEl) + .setName("Disable notifications") + .setDesc("Disable notifications for git operations to minimize distraction (refer to status bar for updates)") + .addToggle(function (toggle) { + return toggle + .setValue(plugin.settings.disablePopups) + .onChange(function (value) { + plugin.settings.disablePopups = value; + plugin.saveData(plugin.settings); + }); + }); + }; + return ObsidianGitSettingsTab; +}(obsidian.PluginSettingTab)); +var StatusBar = /** @class */ (function () { + function StatusBar(statusBarEl, plugin) { + this.messages = []; + this.statusBarEl = statusBarEl; + this.plugin = plugin; + } + StatusBar.prototype.displayMessage = function (message, timeout) { + this.messages.push({ + message: "git: " + message.slice(0, 100), + timeout: timeout, + }); + this.display(); + }; + StatusBar.prototype.display = function () { + if (this.messages.length > 0 && !this.currentMessage) { + this.currentMessage = this.messages.shift(); + this.statusBarEl.setText(this.currentMessage.message); + this.lastMessageTimestamp = Date.now(); + } + else if (this.currentMessage) { + var messageAge = Date.now() - this.lastMessageTimestamp; + if (messageAge >= this.currentMessage.timeout) { + this.currentMessage = null; + this.lastMessageTimestamp = null; + } + } + else { + this.displayState(); + } + }; + StatusBar.prototype.displayState = function () { + var state = this.plugin.getState(); + switch (state) { + case PluginState.idle: + this.displayFromNow(this.plugin.lastUpdate); + break; + case PluginState.status: + this.statusBarEl.setText("git: checking repo status.."); + break; + case PluginState.add: + this.statusBarEl.setText("git: adding files to repo.."); + break; + case PluginState.commit: + this.statusBarEl.setText("git: committing changes.."); + break; + case PluginState.push: + this.statusBarEl.setText("git: pushing changes.."); + break; + case PluginState.pull: + this.statusBarEl.setText("git: pulling changes.."); + break; + } + }; + StatusBar.prototype.displayFromNow = function (timestamp) { + if (timestamp) { + var moment = window.moment; + var fromNow = moment(timestamp).fromNow(); + this.statusBarEl.setText("git: last update " + fromNow + ".."); + } + else { + this.statusBarEl.setText("git: ready"); + } + }; + return StatusBar; +}()); + +module.exports = ObsidianGit; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZXJyb3JzL2dpdC1lcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZXJyb3JzL2dpdC1yZXNwb25zZS1lcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvY29tbW9uLmpzIiwibm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2hhcy1mbGFnL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N1cHBvcnRzLWNvbG9yL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9ub2RlLmpzIiwibm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9Aa3dzaXRlcy9maWxlLWV4aXN0cy9kaXN0L3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9Aa3dzaXRlcy9maWxlLWV4aXN0cy9kaXN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi91dGlscy91dGlsLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi91dGlscy9hcmd1bWVudC1maWx0ZXJzLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi91dGlscy9leGl0LWNvZGVzLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi91dGlscy9naXQtb3V0cHV0LXN0cmVhbXMuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL2xpbmUtcGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi91dGlscy9zaW1wbGUtZ2l0LW9wdGlvbnMuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL3Rhc2stb3B0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdXRpbHMvdGFzay1wYXJzZXIuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvQ2xlYW5TdW1tYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9lcnJvcnMvdGFzay1jb25maWd1cmF0aW9uLWVycm9yLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy90YXNrLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9jbGVhbi5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvY2hlY2staXMtcmVwby5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvcmVzZXQuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL2Vycm9ycy9naXQtY29uc3RydWN0LWVycm9yLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9hcGkuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL2dpdC1sb2dnZXIuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3J1bm5lcnMvdGFza3MtcGVuZGluZy1xdWV1ZS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcnVubmVycy9naXQtZXhlY3V0b3ItY2hhaW4uanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3J1bm5lcnMvZ2l0LWV4ZWN1dG9yLmpzIiwibm9kZV9tb2R1bGVzL0Brd3NpdGVzL3Byb21pc2UtZGVmZXJyZWQvZGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcnVubmVycy9zY2hlZHVsZXIuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9CcmFuY2hEZWxldGVTdW1tYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLWJyYW5jaC1kZWxldGUuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9CcmFuY2hTdW1tYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLWJyYW5jaC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvYnJhbmNoLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrLWNhbGxiYWNrLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9jbG9uZS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcmVzcG9uc2VzL0NvbmZpZ0xpc3QuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2NvbmZpZy5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1jb21taXQuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2NvbW1pdC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcmVzcG9uc2VzL0RpZmZTdW1tYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLWRpZmYtc3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvZGlmZi5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1mZXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvZmV0Y2guanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2hhc2gtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvSW5pdFN1bW1hcnkuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2luaXQuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtbGlzdC1sb2ctc3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvbG9nLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvTWVyZ2VTdW1tYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvUHVsbFN1bW1hcnkuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtcmVtb3RlLW9iamVjdHMuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtcmVtb3RlLW1lc3NhZ2VzLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLXB1bGwuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtbWVyZ2UuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL21lcmdlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLW1vdmUuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL21vdmUuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL3B1bGwuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtcHVzaC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvcHVzaC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcmVzcG9uc2VzL0dldFJlbW90ZVN1bW1hcnkuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL3JlbW90ZS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3Mvc3Rhc2gtbGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcmVzcG9uc2VzL0ZpbGVTdGF0dXNTdW1tYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvU3RhdHVzU3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3Mvc3RhdHVzLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9zdWItbW9kdWxlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvVGFnTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvdGFnLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvQ2hlY2tJZ25vcmUuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvZ2l0LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2dpdC1mYWN0b3J5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9ydW5uZXJzL3Byb21pc2Utd3JhcHBlZC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9pbmRleC5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkdpdEVycm9yID0gdm9pZCAwO1xuLyoqXG4gKiBUaGUgYEdpdEVycm9yYCBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBgZ2l0YCBwcm9jZXNzIHRocm93cyBhXG4gKiBmYXRhbCBleGNlcHRpb24gKGVnIGFuIGBFTk9FTlRgIGV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gdXNlIGFcbiAqIG5vbi13cml0YWJsZSBkaXJlY3RvcnkgYXMgdGhlIHJvb3QgZm9yIHlvdXIgcmVwbyksIGFuZCBhY3RzIGFzIHRoZVxuICogYmFzZSBjbGFzcyBmb3IgbW9yZSBzcGVjaWZpYyBlcnJvcnMgdGhyb3duIGJ5IHRoZSBwYXJzaW5nIG9mIHRoZVxuICogZ2l0IHJlc3BvbnNlIG9yIGVycm9ycyBpbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFzayBhYm91dCB0b1xuICogYmUgcnVuLlxuICpcbiAqIFdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biwgcGVuZGluZyB0YXNrcyBpbiB0aGUgc2FtZSBpbnN0YW5jZSB3aWxsXG4gKiBub3QgYmUgZXhlY3V0ZWQuIFRoZSByZWNvbW1lbmRlZCB3YXkgdG8gcnVuIGEgc2VyaWVzIG9mIHRhc2tzIHRoYXRcbiAqIGNhbiBpbmRlcGVuZGVudGx5IGZhaWwgd2l0aG91dCBuZWVkaW5nIHRvIHByZXZlbnQgZnV0dXJlIHRhc2tzIGZyb21cbiAqIHJ1bm5pbmcgaXMgdG8gY2F0Y2ggdGhlbSBpbmRpdmlkdWFsbHk6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuIGltcG9ydCB7IGdpdFAsIFNpbXBsZUdpdCwgR2l0RXJyb3IsIFB1bGxSZXN1bHQgfSBmcm9tICdzaW1wbGUtZ2l0JztcblxuIGZ1bmN0aW9uIGNhdGNoVGFzayAoZTogR2l0RXJyb3IpIHtcbiAgIHJldHVybiBlLlxuIH1cblxuIGNvbnN0IGdpdCA9IGdpdFAocmVwb1dvcmtpbmdEaXIpO1xuIGNvbnN0IHB1bGxlZDogUHVsbFJlc3VsdCB8IEdpdEVycm9yID0gYXdhaXQgZ2l0LnB1bGwoKS5jYXRjaChjYXRjaFRhc2spO1xuIGNvbnN0IHB1c2hlZDogc3RyaW5nIHwgR2l0RXJyb3IgPSBhd2FpdCBnaXQucHVzaFRhZ3MoKS5jYXRjaChjYXRjaFRhc2spO1xuIGBgYFxuICovXG5jbGFzcyBHaXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih0YXNrLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnRhc2sgPSB0YXNrO1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpO1xuICAgIH1cbn1cbmV4cG9ydHMuR2l0RXJyb3IgPSBHaXRFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdpdC1lcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuR2l0UmVzcG9uc2VFcnJvciA9IHZvaWQgMDtcbmNvbnN0IGdpdF9lcnJvcl8xID0gcmVxdWlyZShcIi4vZ2l0LWVycm9yXCIpO1xuLyoqXG4gKiBUaGUgYEdpdFJlc3BvbnNlRXJyb3JgIGlzIHRoZSB3cmFwcGVyIGZvciBhIHBhcnNlZCByZXNwb25zZSB0aGF0IGlzIHRyZWF0ZWQgYXNcbiAqIGEgZmF0YWwgZXJyb3IsIGZvciBleGFtcGxlIGF0dGVtcHRpbmcgYSBgbWVyZ2VgIGNhbiBsZWF2ZSB0aGUgcmVwbyBpbiBhIGNvcnJ1cHRlZFxuICogc3RhdGUgd2hlbiB0aGVyZSBhcmUgY29uZmxpY3RzIHNvIHRoZSB0YXNrIHdpbGwgcmVqZWN0IHJhdGhlciB0aGFuIHJlc29sdmUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGNhdGNoaW5nIHRoZSBtZXJnZSBjb25mbGljdCBleGNlcHRpb246XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuIGltcG9ydCB7IGdpdFAsIFNpbXBsZUdpdCwgR2l0UmVzcG9uc2VFcnJvciwgTWVyZ2VTdW1tYXJ5IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5cbiBjb25zdCBnaXQgPSBnaXRQKHJlcG9Sb290KTtcbiBjb25zdCBtZXJnZU9wdGlvbnM6IHN0cmluZ1tdID0gWyctLW5vLWZmJywgJ290aGVyLWJyYW5jaCddO1xuIGNvbnN0IG1lcmdlU3VtbWFyeTogTWVyZ2VTdW1tYXJ5ID0gYXdhaXQgZ2l0Lm1lcmdlKG1lcmdlT3B0aW9ucylcbiAgICAgIC5jYXRjaCgoZTogR2l0UmVzcG9uc2VFcnJvcjxNZXJnZVN1bW1hcnk+KSA9PiBlLmdpdCk7XG5cbiBpZiAobWVyZ2VTdW1tYXJ5LmZhaWxlZCkge1xuICAgLy8gZGVhbCB3aXRoIHRoZSBlcnJvclxuIH1cbiBgYGBcbiAqL1xuY2xhc3MgR2l0UmVzcG9uc2VFcnJvciBleHRlbmRzIGdpdF9lcnJvcl8xLkdpdEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBgLmdpdGAgYWNjZXNzIHRoZSBwYXJzZWQgcmVzcG9uc2UgdGhhdCBpcyB0cmVhdGVkIGFzIGJlaW5nIGFuIGVycm9yXG4gICAgICovXG4gICAgZ2l0LCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKHVuZGVmaW5lZCwgbWVzc2FnZSB8fCBTdHJpbmcoZ2l0KSk7XG4gICAgICAgIHRoaXMuZ2l0ID0gZ2l0O1xuICAgIH1cbn1cbmV4cG9ydHMuR2l0UmVzcG9uc2VFcnJvciA9IEdpdFJlc3BvbnNlRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1naXQtcmVzcG9uc2UtZXJyb3IuanMubWFwIiwiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXG5cdFx0ZnVuY3Rpb24gZGVidWcoLi4uYXJncykge1xuXHRcdFx0Ly8gRGlzYWJsZWQ/XG5cdFx0XHRpZiAoIWRlYnVnLmVuYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzZWxmID0gZGVidWc7XG5cblx0XHRcdC8vIFNldCBgZGlmZmAgdGltZXN0YW1wXG5cdFx0XHRjb25zdCBjdXJyID0gTnVtYmVyKG5ldyBEYXRlKCkpO1xuXHRcdFx0Y29uc3QgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuXHRcdFx0c2VsZi5kaWZmID0gbXM7XG5cdFx0XHRzZWxmLnByZXYgPSBwcmV2VGltZTtcblx0XHRcdHNlbGYuY3VyciA9IGN1cnI7XG5cdFx0XHRwcmV2VGltZSA9IGN1cnI7XG5cblx0XHRcdGFyZ3NbMF0gPSBjcmVhdGVEZWJ1Zy5jb2VyY2UoYXJnc1swXSk7XG5cblx0XHRcdGlmICh0eXBlb2YgYXJnc1swXSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cblx0XHRcdFx0YXJncy51bnNoaWZ0KCclTycpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuXHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCAobWF0Y2gsIGZvcm1hdCkgPT4ge1xuXHRcdFx0XHQvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0XHRcdHJldHVybiAnJSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0Y29uc3QgZm9ybWF0dGVyID0gY3JlYXRlRGVidWcuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdGNvbnN0IHZhbCA9IGFyZ3NbaW5kZXhdO1xuXHRcdFx0XHRcdG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuXHRcdFx0XHRcdC8vIE5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcblx0XHRcdFx0XHRhcmdzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHRcdFx0aW5kZXgtLTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcblx0XHRcdGNyZWF0ZURlYnVnLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuXHRcdFx0Y29uc3QgbG9nRm4gPSBzZWxmLmxvZyB8fCBjcmVhdGVEZWJ1Zy5sb2c7XG5cdFx0XHRsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcblx0XHR9XG5cblx0XHRkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdFx0ZGVidWcudXNlQ29sb3JzID0gY3JlYXRlRGVidWcudXNlQ29sb3JzKCk7XG5cdFx0ZGVidWcuY29sb3IgPSBjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXHRcdGRlYnVnLmV4dGVuZCA9IGV4dGVuZDtcblx0XHRkZWJ1Zy5kZXN0cm95ID0gY3JlYXRlRGVidWcuZGVzdHJveTsgLy8gWFhYIFRlbXBvcmFyeS4gV2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVidWcsICdlbmFibGVkJywge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6ICgpID0+IGVuYWJsZU92ZXJyaWRlID09PSBudWxsID8gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpIDogZW5hYmxlT3ZlcnJpZGUsXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zdWJzdHIoMSkgKyAnJCcpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG5cdCpcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBkaXNhYmxlKCkge1xuXHRcdGNvbnN0IG5hbWVzcGFjZXMgPSBbXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5uYW1lcy5tYXAodG9OYW1lc3BhY2UpLFxuXHRcdFx0Li4uY3JlYXRlRGVidWcuc2tpcHMubWFwKHRvTmFtZXNwYWNlKS5tYXAobmFtZXNwYWNlID0+ICctJyArIG5hbWVzcGFjZSlcblx0XHRdLmpvaW4oJywnKTtcblx0XHRjcmVhdGVEZWJ1Zy5lbmFibGUoJycpO1xuXHRcdHJldHVybiBuYW1lc3BhY2VzO1xuXHR9XG5cblx0LyoqXG5cdCogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0KiBAcmV0dXJuIHtCb29sZWFufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuXHRcdGlmIChuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcqJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0bGV0IGk7XG5cdFx0bGV0IGxlbjtcblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQqIENvbnZlcnQgcmVnZXhwIHRvIG5hbWVzcGFjZVxuXHQqXG5cdCogQHBhcmFtIHtSZWdFeHB9IHJlZ3hlcFxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHRvTmFtZXNwYWNlKHJlZ2V4cCkge1xuXHRcdHJldHVybiByZWdleHAudG9TdHJpbmcoKVxuXHRcdFx0LnN1YnN0cmluZygyLCByZWdleHAudG9TdHJpbmcoKS5sZW5ndGggLSAyKVxuXHRcdFx0LnJlcGxhY2UoL1xcLlxcKlxcPyQvLCAnKicpO1xuXHR9XG5cblx0LyoqXG5cdCogQ29lcmNlIGB2YWxgLlxuXHQqXG5cdCogQHBhcmFtIHtNaXhlZH0gdmFsXG5cdCogQHJldHVybiB7TWl4ZWR9XG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcblx0XHRpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHQvKipcblx0KiBYWFggRE8gTk9UIFVTRS4gVGhpcyBpcyBhIHRlbXBvcmFyeSBzdHViIGZ1bmN0aW9uLlxuXHQqIFhYWCBJdCBXSUxMIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblx0Ki9cblx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0fVxuXG5cdGNyZWF0ZURlYnVnLmVuYWJsZShjcmVhdGVEZWJ1Zy5sb2FkKCkpO1xuXG5cdHJldHVybiBjcmVhdGVEZWJ1Zztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXR1cDtcbiIsIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGZsYWcsIGFyZ3YgPSBwcm9jZXNzLmFyZ3YpID0+IHtcblx0Y29uc3QgcHJlZml4ID0gZmxhZy5zdGFydHNXaXRoKCctJykgPyAnJyA6IChmbGFnLmxlbmd0aCA9PT0gMSA/ICctJyA6ICctLScpO1xuXHRjb25zdCBwb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcblx0Y29uc3QgdGVybWluYXRvclBvc2l0aW9uID0gYXJndi5pbmRleE9mKCctLScpO1xuXHRyZXR1cm4gcG9zaXRpb24gIT09IC0xICYmICh0ZXJtaW5hdG9yUG9zaXRpb24gPT09IC0xIHx8IHBvc2l0aW9uIDwgdGVybWluYXRvclBvc2l0aW9uKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBvcyA9IHJlcXVpcmUoJ29zJyk7XG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IGhhc0ZsYWcgPSByZXF1aXJlKCdoYXMtZmxhZycpO1xuXG5jb25zdCB7ZW52fSA9IHByb2Nlc3M7XG5cbmxldCBmb3JjZUNvbG9yO1xuaWYgKGhhc0ZsYWcoJ25vLWNvbG9yJykgfHxcblx0aGFzRmxhZygnbm8tY29sb3JzJykgfHxcblx0aGFzRmxhZygnY29sb3I9ZmFsc2UnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1uZXZlcicpKSB7XG5cdGZvcmNlQ29sb3IgPSAwO1xufSBlbHNlIGlmIChoYXNGbGFnKCdjb2xvcicpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9ycycpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPXRydWUnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1hbHdheXMnKSkge1xuXHRmb3JjZUNvbG9yID0gMTtcbn1cblxuaWYgKCdGT1JDRV9DT0xPUicgaW4gZW52KSB7XG5cdGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICd0cnVlJykge1xuXHRcdGZvcmNlQ29sb3IgPSAxO1xuXHR9IGVsc2UgaWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ2ZhbHNlJykge1xuXHRcdGZvcmNlQ29sb3IgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdGZvcmNlQ29sb3IgPSBlbnYuRk9SQ0VfQ09MT1IubGVuZ3RoID09PSAwID8gMSA6IE1hdGgubWluKHBhcnNlSW50KGVudi5GT1JDRV9DT0xPUiwgMTApLCAzKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVMZXZlbChsZXZlbCkge1xuXHRpZiAobGV2ZWwgPT09IDApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGxldmVsLFxuXHRcdGhhc0Jhc2ljOiB0cnVlLFxuXHRcdGhhczI1NjogbGV2ZWwgPj0gMixcblx0XHRoYXMxNm06IGxldmVsID49IDNcblx0fTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNDb2xvcihoYXZlU3RyZWFtLCBzdHJlYW1Jc1RUWSkge1xuXHRpZiAoZm9yY2VDb2xvciA9PT0gMCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTE2bScpIHx8XG5cdFx0aGFzRmxhZygnY29sb3I9ZnVsbCcpIHx8XG5cdFx0aGFzRmxhZygnY29sb3I9dHJ1ZWNvbG9yJykpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmIChoYXNGbGFnKCdjb2xvcj0yNTYnKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKGhhdmVTdHJlYW0gJiYgIXN0cmVhbUlzVFRZICYmIGZvcmNlQ29sb3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y29uc3QgbWluID0gZm9yY2VDb2xvciB8fCAwO1xuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ2R1bWInKSB7XG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxMDU4NiBpcyB0aGUgZmlyc3QgV2luZG93cyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMjU2IGNvbG9ycy5cblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDE0OTMxIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMTZtL1RydWVDb2xvci5cblx0XHRjb25zdCBvc1JlbGVhc2UgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKTtcblx0XHRpZiAoXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzBdKSA+PSAxMCAmJlxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTA1ODZcblx0XHQpIHtcblx0XHRcdHJldHVybiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxNDkzMSA/IDMgOiAyO1xuXHRcdH1cblxuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDSScgaW4gZW52KSB7XG5cdFx0aWYgKFsnVFJBVklTJywgJ0NJUkNMRUNJJywgJ0FQUFZFWU9SJywgJ0dJVExBQl9DSScsICdHSVRIVUJfQUNUSU9OUycsICdCVUlMREtJVEUnXS5zb21lKHNpZ24gPT4gc2lnbiBpbiBlbnYpIHx8IGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKCdURUFNQ0lUWV9WRVJTSU9OJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gL14oOVxcLigwKlsxLTldXFxkKilcXC58XFxkezIsfVxcLikvLnRlc3QoZW52LlRFQU1DSVRZX1ZFUlNJT04pID8gMSA6IDA7XG5cdH1cblxuXHRpZiAoZW52LkNPTE9SVEVSTSA9PT0gJ3RydWVjb2xvcicpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmICgnVEVSTV9QUk9HUkFNJyBpbiBlbnYpIHtcblx0XHRjb25zdCB2ZXJzaW9uID0gcGFyc2VJbnQoKGVudi5URVJNX1BST0dSQU1fVkVSU0lPTiB8fCAnJykuc3BsaXQoJy4nKVswXSwgMTApO1xuXG5cdFx0c3dpdGNoIChlbnYuVEVSTV9QUk9HUkFNKSB7XG5cdFx0XHRjYXNlICdpVGVybS5hcHAnOlxuXHRcdFx0XHRyZXR1cm4gdmVyc2lvbiA+PSAzID8gMyA6IDI7XG5cdFx0XHRjYXNlICdBcHBsZV9UZXJtaW5hbCc6XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0Ly8gTm8gZGVmYXVsdFxuXHRcdH1cblx0fVxuXG5cdGlmICgvLTI1Nihjb2xvcik/JC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoL15zY3JlZW58Xnh0ZXJtfF52dDEwMHxednQyMjB8XnJ4dnR8Y29sb3J8YW5zaXxjeWd3aW58bGludXgvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDT0xPUlRFUk0nIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0cmV0dXJuIG1pbjtcbn1cblxuZnVuY3Rpb24gZ2V0U3VwcG9ydExldmVsKHN0cmVhbSkge1xuXHRjb25zdCBsZXZlbCA9IHN1cHBvcnRzQ29sb3Ioc3RyZWFtLCBzdHJlYW0gJiYgc3RyZWFtLmlzVFRZKTtcblx0cmV0dXJuIHRyYW5zbGF0ZUxldmVsKGxldmVsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHN1cHBvcnRzQ29sb3I6IGdldFN1cHBvcnRMZXZlbCxcblx0c3Rkb3V0OiB0cmFuc2xhdGVMZXZlbChzdXBwb3J0c0NvbG9yKHRydWUsIHR0eS5pc2F0dHkoMSkpKSxcblx0c3RkZXJyOiB0cmFuc2xhdGVMZXZlbChzdXBwb3J0c0NvbG9yKHRydWUsIHR0eS5pc2F0dHkoMikpKVxufTtcbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLmRlc3Ryb3kgPSB1dGlsLmRlcHJlY2F0ZShcblx0KCkgPT4ge30sXG5cdCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJ1xuKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbNiwgMiwgMywgNCwgNSwgMV07XG5cbnRyeSB7XG5cdC8vIE9wdGlvbmFsIGRlcGVuZGVuY3kgKGFzIGluLCBkb2Vzbid0IG5lZWQgdG8gYmUgaW5zdGFsbGVkLCBOT1QgbGlrZSBvcHRpb25hbERlcGVuZGVuY2llcyBpbiBwYWNrYWdlLmpzb24pXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcblx0Y29uc3Qgc3VwcG9ydHNDb2xvciA9IHJlcXVpcmUoJ3N1cHBvcnRzLWNvbG9yJyk7XG5cblx0aWYgKHN1cHBvcnRzQ29sb3IgJiYgKHN1cHBvcnRzQ29sb3Iuc3RkZXJyIHx8IHN1cHBvcnRzQ29sb3IpLmxldmVsID49IDIpIHtcblx0XHRleHBvcnRzLmNvbG9ycyA9IFtcblx0XHRcdDIwLFxuXHRcdFx0MjEsXG5cdFx0XHQyNixcblx0XHRcdDI3LFxuXHRcdFx0MzIsXG5cdFx0XHQzMyxcblx0XHRcdDM4LFxuXHRcdFx0MzksXG5cdFx0XHQ0MCxcblx0XHRcdDQxLFxuXHRcdFx0NDIsXG5cdFx0XHQ0Myxcblx0XHRcdDQ0LFxuXHRcdFx0NDUsXG5cdFx0XHQ1Nixcblx0XHRcdDU3LFxuXHRcdFx0NjIsXG5cdFx0XHQ2Myxcblx0XHRcdDY4LFxuXHRcdFx0NjksXG5cdFx0XHQ3NCxcblx0XHRcdDc1LFxuXHRcdFx0NzYsXG5cdFx0XHQ3Nyxcblx0XHRcdDc4LFxuXHRcdFx0NzksXG5cdFx0XHQ4MCxcblx0XHRcdDgxLFxuXHRcdFx0OTIsXG5cdFx0XHQ5Myxcblx0XHRcdDk4LFxuXHRcdFx0OTksXG5cdFx0XHQxMTIsXG5cdFx0XHQxMTMsXG5cdFx0XHQxMjgsXG5cdFx0XHQxMjksXG5cdFx0XHQxMzQsXG5cdFx0XHQxMzUsXG5cdFx0XHQxNDgsXG5cdFx0XHQxNDksXG5cdFx0XHQxNjAsXG5cdFx0XHQxNjEsXG5cdFx0XHQxNjIsXG5cdFx0XHQxNjMsXG5cdFx0XHQxNjQsXG5cdFx0XHQxNjUsXG5cdFx0XHQxNjYsXG5cdFx0XHQxNjcsXG5cdFx0XHQxNjgsXG5cdFx0XHQxNjksXG5cdFx0XHQxNzAsXG5cdFx0XHQxNzEsXG5cdFx0XHQxNzIsXG5cdFx0XHQxNzMsXG5cdFx0XHQxNzgsXG5cdFx0XHQxNzksXG5cdFx0XHQxODQsXG5cdFx0XHQxODUsXG5cdFx0XHQxOTYsXG5cdFx0XHQxOTcsXG5cdFx0XHQxOTgsXG5cdFx0XHQxOTksXG5cdFx0XHQyMDAsXG5cdFx0XHQyMDEsXG5cdFx0XHQyMDIsXG5cdFx0XHQyMDMsXG5cdFx0XHQyMDQsXG5cdFx0XHQyMDUsXG5cdFx0XHQyMDYsXG5cdFx0XHQyMDcsXG5cdFx0XHQyMDgsXG5cdFx0XHQyMDksXG5cdFx0XHQyMTQsXG5cdFx0XHQyMTUsXG5cdFx0XHQyMjAsXG5cdFx0XHQyMjFcblx0XHRdO1xuXHR9XG59IGNhdGNoIChlcnJvcikge1xuXHQvLyBTd2FsbG93IC0gd2Ugb25seSBjYXJlIGlmIGBzdXBwb3J0cy1jb2xvcmAgaXMgYXZhaWxhYmxlOyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUuXG59XG5cbi8qKlxuICogQnVpbGQgdXAgdGhlIGRlZmF1bHQgYGluc3BlY3RPcHRzYCBvYmplY3QgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqICAgJCBERUJVR19DT0xPUlM9bm8gREVCVUdfREVQVEg9MTAgREVCVUdfU0hPV19ISURERU49ZW5hYmxlZCBub2RlIHNjcmlwdC5qc1xuICovXG5cbmV4cG9ydHMuaW5zcGVjdE9wdHMgPSBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikuZmlsdGVyKGtleSA9PiB7XG5cdHJldHVybiAvXmRlYnVnXy9pLnRlc3Qoa2V5KTtcbn0pLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcblx0Ly8gQ2FtZWwtY2FzZVxuXHRjb25zdCBwcm9wID0ga2V5XG5cdFx0LnN1YnN0cmluZyg2KVxuXHRcdC50b0xvd2VyQ2FzZSgpXG5cdFx0LnJlcGxhY2UoL18oW2Etel0pL2csIChfLCBrKSA9PiB7XG5cdFx0XHRyZXR1cm4gay50b1VwcGVyQ2FzZSgpO1xuXHRcdH0pO1xuXG5cdC8vIENvZXJjZSBzdHJpbmcgdmFsdWUgaW50byBKUyB2YWx1ZVxuXHRsZXQgdmFsID0gcHJvY2Vzcy5lbnZba2V5XTtcblx0aWYgKC9eKHllc3xvbnx0cnVlfGVuYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdHZhbCA9IHRydWU7XG5cdH0gZWxzZSBpZiAoL14obm98b2ZmfGZhbHNlfGRpc2FibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSBmYWxzZTtcblx0fSBlbHNlIGlmICh2YWwgPT09ICdudWxsJykge1xuXHRcdHZhbCA9IG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0dmFsID0gTnVtYmVyKHZhbCk7XG5cdH1cblxuXHRvYmpbcHJvcF0gPSB2YWw7XG5cdHJldHVybiBvYmo7XG59LCB7fSk7XG5cbi8qKlxuICogSXMgc3Rkb3V0IGEgVFRZPyBDb2xvcmVkIG91dHB1dCBpcyBlbmFibGVkIHdoZW4gYHRydWVgLlxuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0cmV0dXJuICdjb2xvcnMnIGluIGV4cG9ydHMuaW5zcGVjdE9wdHMgP1xuXHRcdEJvb2xlYW4oZXhwb3J0cy5pbnNwZWN0T3B0cy5jb2xvcnMpIDpcblx0XHR0dHkuaXNhdHR5KHByb2Nlc3Muc3RkZXJyLmZkKTtcbn1cblxuLyoqXG4gKiBBZGRzIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0Y29uc3Qge25hbWVzcGFjZTogbmFtZSwgdXNlQ29sb3JzfSA9IHRoaXM7XG5cblx0aWYgKHVzZUNvbG9ycykge1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNvbG9yO1xuXHRcdGNvbnN0IGNvbG9yQ29kZSA9ICdcXHUwMDFCWzMnICsgKGMgPCA4ID8gYyA6ICc4OzU7JyArIGMpO1xuXHRcdGNvbnN0IHByZWZpeCA9IGAgICR7Y29sb3JDb2RlfTsxbSR7bmFtZX0gXFx1MDAxQlswbWA7XG5cblx0XHRhcmdzWzBdID0gcHJlZml4ICsgYXJnc1swXS5zcGxpdCgnXFxuJykuam9pbignXFxuJyArIHByZWZpeCk7XG5cdFx0YXJncy5wdXNoKGNvbG9yQ29kZSArICdtKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpICsgJ1xcdTAwMUJbMG0nKTtcblx0fSBlbHNlIHtcblx0XHRhcmdzWzBdID0gZ2V0RGF0ZSgpICsgbmFtZSArICcgJyArIGFyZ3NbMF07XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZSgpIHtcblx0aWYgKGV4cG9ydHMuaW5zcGVjdE9wdHMuaGlkZURhdGUpIHtcblx0XHRyZXR1cm4gJyc7XG5cdH1cblx0cmV0dXJuIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSArICcgJztcbn1cblxuLyoqXG4gKiBJbnZva2VzIGB1dGlsLmZvcm1hdCgpYCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFuZCB3cml0ZXMgdG8gc3RkZXJyLlxuICovXG5cbmZ1bmN0aW9uIGxvZyguLi5hcmdzKSB7XG5cdHJldHVybiBwcm9jZXNzLnN0ZGVyci53cml0ZSh1dGlsLmZvcm1hdCguLi5hcmdzKSArICdcXG4nKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHRpZiAobmFtZXNwYWNlcykge1xuXHRcdHByb2Nlc3MuZW52LkRFQlVHID0gbmFtZXNwYWNlcztcblx0fSBlbHNlIHtcblx0XHQvLyBJZiB5b3Ugc2V0IGEgcHJvY2Vzcy5lbnYgZmllbGQgdG8gbnVsbCBvciB1bmRlZmluZWQsIGl0IGdldHMgY2FzdCB0byB0aGVcblx0XHQvLyBzdHJpbmcgJ251bGwnIG9yICd1bmRlZmluZWQnLiBKdXN0IGRlbGV0ZSBpbnN0ZWFkLlxuXHRcdGRlbGV0ZSBwcm9jZXNzLmVudi5ERUJVRztcblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG5cdHJldHVybiBwcm9jZXNzLmVudi5ERUJVRztcbn1cblxuLyoqXG4gKiBJbml0IGxvZ2ljIGZvciBgZGVidWdgIGluc3RhbmNlcy5cbiAqXG4gKiBDcmVhdGUgYSBuZXcgYGluc3BlY3RPcHRzYCBvYmplY3QgaW4gY2FzZSBgdXNlQ29sb3JzYCBpcyBzZXRcbiAqIGRpZmZlcmVudGx5IGZvciBhIHBhcnRpY3VsYXIgYGRlYnVnYCBpbnN0YW5jZS5cbiAqL1xuXG5mdW5jdGlvbiBpbml0KGRlYnVnKSB7XG5cdGRlYnVnLmluc3BlY3RPcHRzID0ge307XG5cblx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHMuaW5zcGVjdE9wdHMpO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRkZWJ1Zy5pbnNwZWN0T3B0c1trZXlzW2ldXSA9IGV4cG9ydHMuaW5zcGVjdE9wdHNba2V5c1tpXV07XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsIG9uIGEgc2luZ2xlIGxpbmUuXG4gKi9cblxuZm9ybWF0dGVycy5vID0gZnVuY3Rpb24gKHYpIHtcblx0dGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblx0cmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKVxuXHRcdC5zcGxpdCgnXFxuJylcblx0XHQubWFwKHN0ciA9PiBzdHIudHJpbSgpKVxuXHRcdC5qb2luKCcgJyk7XG59O1xuXG4vKipcbiAqIE1hcCAlTyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGxvd2luZyBtdWx0aXBsZSBsaW5lcyBpZiBuZWVkZWQuXG4gKi9cblxuZm9ybWF0dGVycy5PID0gZnVuY3Rpb24gKHYpIHtcblx0dGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblx0cmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKTtcbn07XG4iLCIvKipcbiAqIERldGVjdCBFbGVjdHJvbiByZW5kZXJlciAvIG53anMgcHJvY2Vzcywgd2hpY2ggaXMgbm9kZSwgYnV0IHdlIHNob3VsZFxuICogdHJlYXQgYXMgYSBicm93c2VyLlxuICovXG5cbmlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHByb2Nlc3MuYnJvd3NlciA9PT0gdHJ1ZSB8fCBwcm9jZXNzLl9fbndqcykge1xuXHRtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYnJvd3Nlci5qcycpO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL25vZGUuanMnKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IGxvZyA9IGRlYnVnXzEuZGVmYXVsdCgnQGt3c2l0ZXMvZmlsZS1leGlzdHMnKTtcbmZ1bmN0aW9uIGNoZWNrKHBhdGgsIGlzRmlsZSwgaXNEaXJlY3RvcnkpIHtcbiAgICBsb2coYGNoZWNraW5nICVzYCwgcGF0aCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdCA9IGZzXzEuc3RhdFN5bmMocGF0aCk7XG4gICAgICAgIGlmIChzdGF0LmlzRmlsZSgpICYmIGlzRmlsZSkge1xuICAgICAgICAgICAgbG9nKGBbT0tdIHBhdGggcmVwcmVzZW50cyBhIGZpbGVgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkgJiYgaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIGxvZyhgW09LXSBwYXRoIHJlcHJlc2VudHMgYSBkaXJlY3RvcnlgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxvZyhgW0ZBSUxdIHBhdGggcmVwcmVzZW50cyBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIGZpbGUgb3IgZGlyZWN0b3J5YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgIGxvZyhgW0ZBSUxdIHBhdGggaXMgbm90IGFjY2Vzc2libGU6ICVvYCwgZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKGBbRkFUQUxdICVvYCwgZSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxufVxuLyoqXG4gKiBTeW5jaHJvbm91cyB2YWxpZGF0aW9uIG9mIGEgcGF0aCBleGlzdGluZyBlaXRoZXIgYXMgYSBmaWxlIG9yIGFzIGEgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZSBPbmUgb3IgYm90aCBvZiB0aGUgZXhwb3J0ZWQgbnVtZXJpYyBjb25zdGFudHNcbiAqL1xuZnVuY3Rpb24gZXhpc3RzKHBhdGgsIHR5cGUgPSBleHBvcnRzLlJFQURBQkxFKSB7XG4gICAgcmV0dXJuIGNoZWNrKHBhdGgsICh0eXBlICYgZXhwb3J0cy5GSUxFKSA+IDAsICh0eXBlICYgZXhwb3J0cy5GT0xERVIpID4gMCk7XG59XG5leHBvcnRzLmV4aXN0cyA9IGV4aXN0cztcbi8qKlxuICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgZmlsZVxuICovXG5leHBvcnRzLkZJTEUgPSAxO1xuLyoqXG4gKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBmb2xkZXJcbiAqL1xuZXhwb3J0cy5GT0xERVIgPSAyO1xuLyoqXG4gKiBDb25zdGFudCByZXByZXNlbnRpbmcgZWl0aGVyIGEgZmlsZSBvciBhIGZvbGRlclxuICovXG5leHBvcnRzLlJFQURBQkxFID0gZXhwb3J0cy5GSUxFICsgZXhwb3J0cy5GT0xERVI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmZ1bmN0aW9uIF9fZXhwb3J0KG0pIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydChyZXF1aXJlKFwiLi9zcmNcIikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFzTnVtYmVyID0gZXhwb3J0cy5hc1N0cmluZ0FycmF5ID0gZXhwb3J0cy5hc0FycmF5ID0gZXhwb3J0cy5vYmplY3RUb1N0cmluZyA9IGV4cG9ydHMucmVtb3ZlID0gZXhwb3J0cy5hcHBlbmQgPSBleHBvcnRzLmZvbGRlckV4aXN0cyA9IGV4cG9ydHMuZm9yRWFjaExpbmVXaXRoQ29udGVudCA9IGV4cG9ydHMudG9MaW5lc1dpdGhDb250ZW50ID0gZXhwb3J0cy5sYXN0ID0gZXhwb3J0cy5maXJzdCA9IGV4cG9ydHMuc3BsaXRPbiA9IGV4cG9ydHMuaXNVc2VyRnVuY3Rpb24gPSBleHBvcnRzLmFzRnVuY3Rpb24gPSBleHBvcnRzLk5PT1AgPSB2b2lkIDA7XG5jb25zdCBmaWxlX2V4aXN0c18xID0gcmVxdWlyZShcIkBrd3NpdGVzL2ZpbGUtZXhpc3RzXCIpO1xuY29uc3QgTk9PUCA9ICgpID0+IHtcbn07XG5leHBvcnRzLk5PT1AgPSBOT09QO1xuLyoqXG4gKiBSZXR1cm5zIGVpdGhlciB0aGUgc291cmNlIGFyZ3VtZW50IHdoZW4gaXQgaXMgYSBgRnVuY3Rpb25gLCBvciB0aGUgZGVmYXVsdFxuICogYE5PT1BgIGZ1bmN0aW9uIGNvbnN0YW50XG4gKi9cbmZ1bmN0aW9uIGFzRnVuY3Rpb24oc291cmNlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicgPyBzb3VyY2UgOiBleHBvcnRzLk5PT1A7XG59XG5leHBvcnRzLmFzRnVuY3Rpb24gPSBhc0Z1bmN0aW9uO1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN1cHBsaWVkIGFyZ3VtZW50IGlzIGJvdGggYSBmdW5jdGlvbiwgYW5kIGlzIG5vdFxuICogdGhlIGBOT09QYCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gaXNVc2VyRnVuY3Rpb24oc291cmNlKSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygc291cmNlID09PSAnZnVuY3Rpb24nICYmIHNvdXJjZSAhPT0gZXhwb3J0cy5OT09QKTtcbn1cbmV4cG9ydHMuaXNVc2VyRnVuY3Rpb24gPSBpc1VzZXJGdW5jdGlvbjtcbmZ1bmN0aW9uIHNwbGl0T24oaW5wdXQsIGNoYXIpIHtcbiAgICBjb25zdCBpbmRleCA9IGlucHV0LmluZGV4T2YoY2hhcik7XG4gICAgaWYgKGluZGV4IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIFtpbnB1dCwgJyddO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgICBpbnB1dC5zdWJzdHIoMCwgaW5kZXgpLFxuICAgICAgICBpbnB1dC5zdWJzdHIoaW5kZXggKyAxKSxcbiAgICBdO1xufVxuZXhwb3J0cy5zcGxpdE9uID0gc3BsaXRPbjtcbmZ1bmN0aW9uIGZpcnN0KGlucHV0LCBvZmZzZXQgPSAwKSB7XG4gICAgcmV0dXJuIGlzQXJyYXlMaWtlKGlucHV0KSAmJiBpbnB1dC5sZW5ndGggPiBvZmZzZXQgPyBpbnB1dFtvZmZzZXRdIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0cy5maXJzdCA9IGZpcnN0O1xuZnVuY3Rpb24gbGFzdChpbnB1dCwgb2Zmc2V0ID0gMCkge1xuICAgIGlmIChpc0FycmF5TGlrZShpbnB1dCkgJiYgaW5wdXQubGVuZ3RoID4gb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dFtpbnB1dC5sZW5ndGggLSAxIC0gb2Zmc2V0XTtcbiAgICB9XG59XG5leHBvcnRzLmxhc3QgPSBsYXN0O1xuZnVuY3Rpb24gaXNBcnJheUxpa2UoaW5wdXQpIHtcbiAgICByZXR1cm4gISEoaW5wdXQgJiYgdHlwZW9mIGlucHV0Lmxlbmd0aCA9PT0gJ251bWJlcicpO1xufVxuZnVuY3Rpb24gdG9MaW5lc1dpdGhDb250ZW50KGlucHV0LCB0cmltbWVkID0gdHJ1ZSwgc2VwYXJhdG9yID0gJ1xcbicpIHtcbiAgICByZXR1cm4gaW5wdXQuc3BsaXQoc2VwYXJhdG9yKVxuICAgICAgICAucmVkdWNlKChvdXRwdXQsIGxpbmUpID0+IHtcbiAgICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSB0cmltbWVkID8gbGluZS50cmltKCkgOiBsaW5lO1xuICAgICAgICBpZiAobGluZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKGxpbmVDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0sIFtdKTtcbn1cbmV4cG9ydHMudG9MaW5lc1dpdGhDb250ZW50ID0gdG9MaW5lc1dpdGhDb250ZW50O1xuZnVuY3Rpb24gZm9yRWFjaExpbmVXaXRoQ29udGVudChpbnB1dCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdG9MaW5lc1dpdGhDb250ZW50KGlucHV0LCB0cnVlKS5tYXAobGluZSA9PiBjYWxsYmFjayhsaW5lKSk7XG59XG5leHBvcnRzLmZvckVhY2hMaW5lV2l0aENvbnRlbnQgPSBmb3JFYWNoTGluZVdpdGhDb250ZW50O1xuZnVuY3Rpb24gZm9sZGVyRXhpc3RzKHBhdGgpIHtcbiAgICByZXR1cm4gZmlsZV9leGlzdHNfMS5leGlzdHMocGF0aCwgZmlsZV9leGlzdHNfMS5GT0xERVIpO1xufVxuZXhwb3J0cy5mb2xkZXJFeGlzdHMgPSBmb2xkZXJFeGlzdHM7XG4vKipcbiAqIEFkZHMgYGl0ZW1gIGludG8gdGhlIGB0YXJnZXRgIGBBcnJheWAgb3IgYFNldGAgd2hlbiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50LlxuICovXG5mdW5jdGlvbiBhcHBlbmQodGFyZ2V0LCBpdGVtKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRhcmdldC5hZGQoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xufVxuZXhwb3J0cy5hcHBlbmQgPSBhcHBlbmQ7XG5mdW5jdGlvbiByZW1vdmUodGFyZ2V0LCBpdGVtKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRhcmdldC5pbmRleE9mKGl0ZW0pO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGFyZ2V0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRhcmdldC5kZWxldGUoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xufVxuZXhwb3J0cy5yZW1vdmUgPSByZW1vdmU7XG5leHBvcnRzLm9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyk7XG5mdW5jdGlvbiBhc0FycmF5KHNvdXJjZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNvdXJjZSkgPyBzb3VyY2UgOiBbc291cmNlXTtcbn1cbmV4cG9ydHMuYXNBcnJheSA9IGFzQXJyYXk7XG5mdW5jdGlvbiBhc1N0cmluZ0FycmF5KHNvdXJjZSkge1xuICAgIHJldHVybiBhc0FycmF5KHNvdXJjZSkubWFwKFN0cmluZyk7XG59XG5leHBvcnRzLmFzU3RyaW5nQXJyYXkgPSBhc1N0cmluZ0FycmF5O1xuZnVuY3Rpb24gYXNOdW1iZXIoc291cmNlLCBvbk5hTiA9IDApIHtcbiAgICBpZiAoc291cmNlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG9uTmFOO1xuICAgIH1cbiAgICBjb25zdCBudW0gPSBwYXJzZUludChzb3VyY2UsIDEwKTtcbiAgICByZXR1cm4gaXNOYU4obnVtKSA/IG9uTmFOIDogbnVtO1xufVxuZXhwb3J0cy5hc051bWJlciA9IGFzTnVtYmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZmlsdGVySGFzTGVuZ3RoID0gZXhwb3J0cy5maWx0ZXJGdW5jdGlvbiA9IGV4cG9ydHMuZmlsdGVyUGxhaW5PYmplY3QgPSBleHBvcnRzLmZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXkgPSBleHBvcnRzLmZpbHRlclN0cmluZ0FycmF5ID0gZXhwb3J0cy5maWx0ZXJTdHJpbmcgPSBleHBvcnRzLmZpbHRlclByaW1pdGl2ZXMgPSBleHBvcnRzLmZpbHRlckFycmF5ID0gZXhwb3J0cy5maWx0ZXJUeXBlID0gdm9pZCAwO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbmZ1bmN0aW9uIGZpbHRlclR5cGUoaW5wdXQsIGZpbHRlciwgZGVmKSB7XG4gICAgaWYgKGZpbHRlcihpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgICByZXR1cm4gKGFyZ3VtZW50cy5sZW5ndGggPiAyKSA/IGRlZiA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydHMuZmlsdGVyVHlwZSA9IGZpbHRlclR5cGU7XG5jb25zdCBmaWx0ZXJBcnJheSA9IChpbnB1dCkgPT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KTtcbn07XG5leHBvcnRzLmZpbHRlckFycmF5ID0gZmlsdGVyQXJyYXk7XG5mdW5jdGlvbiBmaWx0ZXJQcmltaXRpdmVzKGlucHV0LCBvbWl0KSB7XG4gICAgcmV0dXJuIC9udW1iZXJ8c3RyaW5nfGJvb2xlYW4vLnRlc3QodHlwZW9mIGlucHV0KSAmJiAoIW9taXQgfHwgIW9taXQuaW5jbHVkZXMoKHR5cGVvZiBpbnB1dCkpKTtcbn1cbmV4cG9ydHMuZmlsdGVyUHJpbWl0aXZlcyA9IGZpbHRlclByaW1pdGl2ZXM7XG5jb25zdCBmaWx0ZXJTdHJpbmcgPSAoaW5wdXQpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJztcbn07XG5leHBvcnRzLmZpbHRlclN0cmluZyA9IGZpbHRlclN0cmluZztcbmNvbnN0IGZpbHRlclN0cmluZ0FycmF5ID0gKGlucHV0KSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIGlucHV0LmV2ZXJ5KGV4cG9ydHMuZmlsdGVyU3RyaW5nKTtcbn07XG5leHBvcnRzLmZpbHRlclN0cmluZ0FycmF5ID0gZmlsdGVyU3RyaW5nQXJyYXk7XG5jb25zdCBmaWx0ZXJTdHJpbmdPclN0cmluZ0FycmF5ID0gKGlucHV0KSA9PiB7XG4gICAgcmV0dXJuIGV4cG9ydHMuZmlsdGVyU3RyaW5nKGlucHV0KSB8fCAoQXJyYXkuaXNBcnJheShpbnB1dCkgJiYgaW5wdXQuZXZlcnkoZXhwb3J0cy5maWx0ZXJTdHJpbmcpKTtcbn07XG5leHBvcnRzLmZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXkgPSBmaWx0ZXJTdHJpbmdPclN0cmluZ0FycmF5O1xuZnVuY3Rpb24gZmlsdGVyUGxhaW5PYmplY3QoaW5wdXQpIHtcbiAgICByZXR1cm4gISFpbnB1dCAmJiB1dGlsXzEub2JqZWN0VG9TdHJpbmcoaW5wdXQpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cbmV4cG9ydHMuZmlsdGVyUGxhaW5PYmplY3QgPSBmaWx0ZXJQbGFpbk9iamVjdDtcbmZ1bmN0aW9uIGZpbHRlckZ1bmN0aW9uKGlucHV0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZmlsdGVyRnVuY3Rpb24gPSBmaWx0ZXJGdW5jdGlvbjtcbmNvbnN0IGZpbHRlckhhc0xlbmd0aCA9IChpbnB1dCkgPT4ge1xuICAgIGlmIChpbnB1dCA9PSBudWxsIHx8ICdudW1iZXJ8Ym9vbGVhbnxmdW5jdGlvbicuaW5jbHVkZXModHlwZW9mIGlucHV0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSB8fCB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBpbnB1dC5sZW5ndGggPT09ICdudW1iZXInO1xufTtcbmV4cG9ydHMuZmlsdGVySGFzTGVuZ3RoID0gZmlsdGVySGFzTGVuZ3RoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJndW1lbnQtZmlsdGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRXhpdENvZGVzID0gdm9pZCAwO1xuLyoqXG4gKiBLbm93biBwcm9jZXNzIGV4aXQgY29kZXMgdXNlZCBieSB0aGUgdGFzayBwYXJzZXJzIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGVycm9yXG4gKiB3YXMgb25lIHRoZXkgY2FuIGF1dG9tYXRpY2FsbHkgaGFuZGxlXG4gKi9cbnZhciBFeGl0Q29kZXM7XG4oZnVuY3Rpb24gKEV4aXRDb2Rlcykge1xuICAgIEV4aXRDb2Rlc1tFeGl0Q29kZXNbXCJTVUNDRVNTXCJdID0gMF0gPSBcIlNVQ0NFU1NcIjtcbiAgICBFeGl0Q29kZXNbRXhpdENvZGVzW1wiRVJST1JcIl0gPSAxXSA9IFwiRVJST1JcIjtcbiAgICBFeGl0Q29kZXNbRXhpdENvZGVzW1wiVU5DTEVBTlwiXSA9IDEyOF0gPSBcIlVOQ0xFQU5cIjtcbn0pKEV4aXRDb2RlcyA9IGV4cG9ydHMuRXhpdENvZGVzIHx8IChleHBvcnRzLkV4aXRDb2RlcyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leGl0LWNvZGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HaXRPdXRwdXRTdHJlYW1zID0gdm9pZCAwO1xuY2xhc3MgR2l0T3V0cHV0U3RyZWFtcyB7XG4gICAgY29uc3RydWN0b3Ioc3RkT3V0LCBzdGRFcnIpIHtcbiAgICAgICAgdGhpcy5zdGRPdXQgPSBzdGRPdXQ7XG4gICAgICAgIHRoaXMuc3RkRXJyID0gc3RkRXJyO1xuICAgIH1cbiAgICBhc1N0cmluZ3MoKSB7XG4gICAgICAgIHJldHVybiBuZXcgR2l0T3V0cHV0U3RyZWFtcyh0aGlzLnN0ZE91dC50b1N0cmluZygndXRmOCcpLCB0aGlzLnN0ZEVyci50b1N0cmluZygndXRmOCcpKTtcbiAgICB9XG59XG5leHBvcnRzLkdpdE91dHB1dFN0cmVhbXMgPSBHaXRPdXRwdXRTdHJlYW1zO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0LW91dHB1dC1zdHJlYW1zLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZW1vdGVMaW5lUGFyc2VyID0gZXhwb3J0cy5MaW5lUGFyc2VyID0gdm9pZCAwO1xuY2xhc3MgTGluZVBhcnNlciB7XG4gICAgY29uc3RydWN0b3IocmVnRXhwLCB1c2VNYXRjaGVzKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlcyA9IFtdO1xuICAgICAgICB0aGlzLnBhcnNlID0gKGxpbmUsIHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNldE1hdGNoZXMoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcmVnRXhwLmV2ZXJ5KChyZWcsIGluZGV4KSA9PiB0aGlzLmFkZE1hdGNoKHJlZywgaW5kZXgsIGxpbmUoaW5kZXgpKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51c2VNYXRjaGVzKHRhcmdldCwgdGhpcy5wcmVwYXJlTWF0Y2hlcygpKSAhPT0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3JlZ0V4cCA9IEFycmF5LmlzQXJyYXkocmVnRXhwKSA/IHJlZ0V4cCA6IFtyZWdFeHBdO1xuICAgICAgICBpZiAodXNlTWF0Y2hlcykge1xuICAgICAgICAgICAgdGhpcy51c2VNYXRjaGVzID0gdXNlTWF0Y2hlcztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdXNlTWF0Y2hlcyh0YXJnZXQsIG1hdGNoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGluZVBhcnNlcjp1c2VNYXRjaGVzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgIH1cbiAgICByZXNldE1hdGNoZXMoKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlcy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICBwcmVwYXJlTWF0Y2hlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcztcbiAgICB9XG4gICAgYWRkTWF0Y2gocmVnLCBpbmRleCwgbGluZSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkID0gbGluZSAmJiByZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaE1hdGNoKGluZGV4LCBtYXRjaGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFtYXRjaGVkO1xuICAgIH1cbiAgICBwdXNoTWF0Y2goX2luZGV4LCBtYXRjaGVkKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlcy5wdXNoKC4uLm1hdGNoZWQuc2xpY2UoMSkpO1xuICAgIH1cbn1cbmV4cG9ydHMuTGluZVBhcnNlciA9IExpbmVQYXJzZXI7XG5jbGFzcyBSZW1vdGVMaW5lUGFyc2VyIGV4dGVuZHMgTGluZVBhcnNlciB7XG4gICAgYWRkTWF0Y2gocmVnLCBpbmRleCwgbGluZSkge1xuICAgICAgICByZXR1cm4gL15yZW1vdGU6XFxzLy50ZXN0KFN0cmluZyhsaW5lKSkgJiYgc3VwZXIuYWRkTWF0Y2gocmVnLCBpbmRleCwgbGluZSk7XG4gICAgfVxuICAgIHB1c2hNYXRjaChpbmRleCwgbWF0Y2hlZCkge1xuICAgICAgICBpZiAoaW5kZXggPiAwIHx8IG1hdGNoZWQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgc3VwZXIucHVzaE1hdGNoKGluZGV4LCBtYXRjaGVkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuUmVtb3RlTGluZVBhcnNlciA9IFJlbW90ZUxpbmVQYXJzZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5lLXBhcnNlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlSW5zdGFuY2VDb25maWcgPSB2b2lkIDA7XG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBiaW5hcnk6ICdnaXQnLFxuICAgIG1heENvbmN1cnJlbnRQcm9jZXNzZXM6IDUsXG59O1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VDb25maWcoLi4ub3B0aW9ucykge1xuICAgIGNvbnN0IGJhc2VEaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IGJhc2VEaXIgfSwgZGVmYXVsdE9wdGlvbnMpLCAuLi4ob3B0aW9ucy5maWx0ZXIobyA9PiB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgbykpKTtcbiAgICBjb25maWcuYmFzZURpciA9IGNvbmZpZy5iYXNlRGlyIHx8IGJhc2VEaXI7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmV4cG9ydHMuY3JlYXRlSW5zdGFuY2VDb25maWcgPSBjcmVhdGVJbnN0YW5jZUNvbmZpZztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpbXBsZS1naXQtb3B0aW9ucy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50ID0gZXhwb3J0cy50cmFpbGluZ09wdGlvbnNBcmd1bWVudCA9IGV4cG9ydHMuZ2V0VHJhaWxpbmdPcHRpb25zID0gZXhwb3J0cy5hcHBlbmRUYXNrT3B0aW9ucyA9IHZvaWQgMDtcbmNvbnN0IGFyZ3VtZW50X2ZpbHRlcnNfMSA9IHJlcXVpcmUoXCIuL2FyZ3VtZW50LWZpbHRlcnNcIik7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuZnVuY3Rpb24gYXBwZW5kVGFza09wdGlvbnMob3B0aW9ucywgY29tbWFuZHMgPSBbXSkge1xuICAgIGlmICghYXJndW1lbnRfZmlsdGVyc18xLmZpbHRlclBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcztcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9wdGlvbnMpLnJlZHVjZSgoY29tbWFuZHMsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNba2V5XTtcbiAgICAgICAgaWYgKGFyZ3VtZW50X2ZpbHRlcnNfMS5maWx0ZXJQcmltaXRpdmVzKHZhbHVlLCBbJ2Jvb2xlYW4nXSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goa2V5ICsgJz0nICsgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21tYW5kcztcbiAgICB9LCBjb21tYW5kcyk7XG59XG5leHBvcnRzLmFwcGVuZFRhc2tPcHRpb25zID0gYXBwZW5kVGFza09wdGlvbnM7XG5mdW5jdGlvbiBnZXRUcmFpbGluZ09wdGlvbnMoYXJncywgaW5pdGlhbFByaW1pdGl2ZSA9IDAsIG9iamVjdE9ubHkgPSBmYWxzZSkge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbWF4ID0gaW5pdGlhbFByaW1pdGl2ZSA8IDAgPyBhcmdzLmxlbmd0aCA6IGluaXRpYWxQcmltaXRpdmU7IGkgPCBtYXg7IGkrKykge1xuICAgICAgICBpZiAoJ3N0cmluZ3xudW1iZXInLmluY2x1ZGVzKHR5cGVvZiBhcmdzW2ldKSkge1xuICAgICAgICAgICAgY29tbWFuZC5wdXNoKFN0cmluZyhhcmdzW2ldKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwZW5kVGFza09wdGlvbnModHJhaWxpbmdPcHRpb25zQXJndW1lbnQoYXJncyksIGNvbW1hbmQpO1xuICAgIGlmICghb2JqZWN0T25seSkge1xuICAgICAgICBjb21tYW5kLnB1c2goLi4udHJhaWxpbmdBcnJheUFyZ3VtZW50KGFyZ3MpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1hbmQ7XG59XG5leHBvcnRzLmdldFRyYWlsaW5nT3B0aW9ucyA9IGdldFRyYWlsaW5nT3B0aW9ucztcbmZ1bmN0aW9uIHRyYWlsaW5nQXJyYXlBcmd1bWVudChhcmdzKSB7XG4gICAgY29uc3QgaGFzVHJhaWxpbmdDYWxsYmFjayA9IHR5cGVvZiB1dGlsXzEubGFzdChhcmdzKSA9PT0gJ2Z1bmN0aW9uJztcbiAgICByZXR1cm4gYXJndW1lbnRfZmlsdGVyc18xLmZpbHRlclR5cGUodXRpbF8xLmxhc3QoYXJncywgaGFzVHJhaWxpbmdDYWxsYmFjayA/IDEgOiAwKSwgYXJndW1lbnRfZmlsdGVyc18xLmZpbHRlckFycmF5LCBbXSk7XG59XG4vKipcbiAqIEdpdmVuIGFueSBudW1iZXIgb2YgYXJndW1lbnRzLCByZXR1cm5zIHRoZSB0cmFpbGluZyBvcHRpb25zIGFyZ3VtZW50LCBpZ25vcmluZyBhIHRyYWlsaW5nIGZ1bmN0aW9uIGFyZ3VtZW50XG4gKiBpZiB0aGVyZSBpcyBvbmUuIFdoZW4gbm90IGZvdW5kLCB0aGUgcmV0dXJuIHZhbHVlIGlzIG51bGwuXG4gKi9cbmZ1bmN0aW9uIHRyYWlsaW5nT3B0aW9uc0FyZ3VtZW50KGFyZ3MpIHtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NhbGxiYWNrID0gYXJndW1lbnRfZmlsdGVyc18xLmZpbHRlckZ1bmN0aW9uKHV0aWxfMS5sYXN0KGFyZ3MpKTtcbiAgICByZXR1cm4gYXJndW1lbnRfZmlsdGVyc18xLmZpbHRlclR5cGUodXRpbF8xLmxhc3QoYXJncywgaGFzVHJhaWxpbmdDYWxsYmFjayA/IDEgOiAwKSwgYXJndW1lbnRfZmlsdGVyc18xLmZpbHRlclBsYWluT2JqZWN0KTtcbn1cbmV4cG9ydHMudHJhaWxpbmdPcHRpb25zQXJndW1lbnQgPSB0cmFpbGluZ09wdGlvbnNBcmd1bWVudDtcbi8qKlxuICogUmV0dXJucyBlaXRoZXIgdGhlIHNvdXJjZSBhcmd1bWVudCB3aGVuIGl0IGlzIGEgYEZ1bmN0aW9uYCwgb3IgdGhlIGRlZmF1bHRcbiAqIGBOT09QYCBmdW5jdGlvbiBjb25zdGFudFxuICovXG5mdW5jdGlvbiB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJncywgaW5jbHVkZU5vb3AgPSB0cnVlKSB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSB1dGlsXzEuYXNGdW5jdGlvbih1dGlsXzEubGFzdChhcmdzKSk7XG4gICAgcmV0dXJuIGluY2x1ZGVOb29wIHx8IHV0aWxfMS5pc1VzZXJGdW5jdGlvbihjYWxsYmFjaykgPyBjYWxsYmFjayA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydHMudHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50ID0gdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFzay1vcHRpb25zLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZVN0cmluZ1Jlc3BvbnNlID0gZXhwb3J0cy5jYWxsVGFza1BhcnNlciA9IHZvaWQgMDtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5mdW5jdGlvbiBjYWxsVGFza1BhcnNlcihwYXJzZXIsIHN0cmVhbXMpIHtcbiAgICByZXR1cm4gcGFyc2VyKHN0cmVhbXMuc3RkT3V0LCBzdHJlYW1zLnN0ZEVycik7XG59XG5leHBvcnRzLmNhbGxUYXNrUGFyc2VyID0gY2FsbFRhc2tQYXJzZXI7XG5mdW5jdGlvbiBwYXJzZVN0cmluZ1Jlc3BvbnNlKHJlc3VsdCwgcGFyc2VycywgLi4udGV4dHMpIHtcbiAgICB0ZXh0cy5mb3JFYWNoKHRleHQgPT4ge1xuICAgICAgICBmb3IgKGxldCBsaW5lcyA9IHV0aWxfMS50b0xpbmVzV2l0aENvbnRlbnQodGV4dCksIGkgPSAwLCBtYXggPSBsaW5lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IChvZmZzZXQgPSAwKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKChpICsgb2Zmc2V0KSA+PSBtYXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGluZXNbaSArIG9mZnNldF07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcGFyc2Vycy5zb21lKCh7IHBhcnNlIH0pID0+IHBhcnNlKGxpbmUsIHJlc3VsdCkpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydHMucGFyc2VTdHJpbmdSZXNwb25zZSA9IHBhcnNlU3RyaW5nUmVzcG9uc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXNrLXBhcnNlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2FyZ3VtZW50LWZpbHRlcnNcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2V4aXQtY29kZXNcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2dpdC1vdXRwdXQtc3RyZWFtc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vbGluZS1wYXJzZXJcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3NpbXBsZS1naXQtb3B0aW9uc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdGFzay1vcHRpb25zXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi90YXNrLXBhcnNlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdXRpbFwiKSwgZXhwb3J0cyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2xlYW5TdW1tYXJ5UGFyc2VyID0gZXhwb3J0cy5DbGVhblJlc3BvbnNlID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNsYXNzIENsZWFuUmVzcG9uc2Uge1xuICAgIGNvbnN0cnVjdG9yKGRyeVJ1bikge1xuICAgICAgICB0aGlzLmRyeVJ1biA9IGRyeVJ1bjtcbiAgICAgICAgdGhpcy5wYXRocyA9IFtdO1xuICAgICAgICB0aGlzLmZpbGVzID0gW107XG4gICAgICAgIHRoaXMuZm9sZGVycyA9IFtdO1xuICAgIH1cbn1cbmV4cG9ydHMuQ2xlYW5SZXNwb25zZSA9IENsZWFuUmVzcG9uc2U7XG5jb25zdCByZW1vdmFsUmVnZXhwID0gL15bYS16XStcXHMqL2k7XG5jb25zdCBkcnlSdW5SZW1vdmFsUmVnZXhwID0gL15bYS16XStcXHMrW2Etel0rXFxzKi9pO1xuY29uc3QgaXNGb2xkZXJSZWdleHAgPSAvXFwvJC87XG5mdW5jdGlvbiBjbGVhblN1bW1hcnlQYXJzZXIoZHJ5UnVuLCB0ZXh0KSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IG5ldyBDbGVhblJlc3BvbnNlKGRyeVJ1bik7XG4gICAgY29uc3QgcmVnZXhwID0gZHJ5UnVuID8gZHJ5UnVuUmVtb3ZhbFJlZ2V4cCA6IHJlbW92YWxSZWdleHA7XG4gICAgdXRpbHNfMS50b0xpbmVzV2l0aENvbnRlbnQodGV4dCkuZm9yRWFjaChsaW5lID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGxpbmUucmVwbGFjZShyZWdleHAsICcnKTtcbiAgICAgICAgc3VtbWFyeS5wYXRocy5wdXNoKHJlbW92ZWQpO1xuICAgICAgICAoaXNGb2xkZXJSZWdleHAudGVzdChyZW1vdmVkKSA/IHN1bW1hcnkuZm9sZGVycyA6IHN1bW1hcnkuZmlsZXMpLnB1c2gocmVtb3ZlZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG59XG5leHBvcnRzLmNsZWFuU3VtbWFyeVBhcnNlciA9IGNsZWFuU3VtbWFyeVBhcnNlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsZWFuU3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVGFza0NvbmZpZ3VyYXRpb25FcnJvciA9IHZvaWQgMDtcbmNvbnN0IGdpdF9lcnJvcl8xID0gcmVxdWlyZShcIi4vZ2l0LWVycm9yXCIpO1xuLyoqXG4gKiBUaGUgYFRhc2tDb25maWd1cmF0aW9uRXJyb3JgIGlzIHRocm93biB3aGVuIGEgY29tbWFuZCB3YXMgaW5jb3JyZWN0bHlcbiAqIGNvbmZpZ3VyZWQuIEFuIGVycm9yIG9mIHRoaXMga2luZCBtZWFucyB0aGF0IG5vIGF0dGVtcHQgd2FzIG1hZGUgdG9cbiAqIHJ1biB5b3VyIGNvbW1hbmQgdGhyb3VnaCB0aGUgdW5kZXJseWluZyBgZ2l0YCBiaW5hcnkuXG4gKlxuICogQ2hlY2sgdGhlIGAubWVzc2FnZWAgcHJvcGVydHkgZm9yIG1vcmUgZGV0YWlsIG9uIHdoeSB5b3VyIGNvbmZpZ3VyYXRpb25cbiAqIHJlc3VsdGVkIGluIGFuIGVycm9yLlxuICovXG5jbGFzcyBUYXNrQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgZ2l0X2Vycm9yXzEuR2l0RXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIodW5kZWZpbmVkLCBtZXNzYWdlKTtcbiAgICB9XG59XG5leHBvcnRzLlRhc2tDb25maWd1cmF0aW9uRXJyb3IgPSBUYXNrQ29uZmlndXJhdGlvbkVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFzay1jb25maWd1cmF0aW9uLWVycm9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0VtcHR5VGFzayA9IGV4cG9ydHMuaXNCdWZmZXJUYXNrID0gZXhwb3J0cy5zdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrID0gZXhwb3J0cy5jb25maWd1cmF0aW9uRXJyb3JUYXNrID0gZXhwb3J0cy5hZGhvY0V4ZWNUYXNrID0gZXhwb3J0cy5FTVBUWV9DT01NQU5EUyA9IHZvaWQgMDtcbmNvbnN0IHRhc2tfY29uZmlndXJhdGlvbl9lcnJvcl8xID0gcmVxdWlyZShcIi4uL2Vycm9ycy90YXNrLWNvbmZpZ3VyYXRpb24tZXJyb3JcIik7XG5leHBvcnRzLkVNUFRZX0NPTU1BTkRTID0gW107XG5mdW5jdGlvbiBhZGhvY0V4ZWNUYXNrKHBhcnNlcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzOiBleHBvcnRzLkVNUFRZX0NPTU1BTkRTLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcixcbiAgICB9O1xufVxuZXhwb3J0cy5hZGhvY0V4ZWNUYXNrID0gYWRob2NFeGVjVGFzaztcbmZ1bmN0aW9uIGNvbmZpZ3VyYXRpb25FcnJvclRhc2soZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogZXhwb3J0cy5FTVBUWV9DT01NQU5EUyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIoKSB7XG4gICAgICAgICAgICB0aHJvdyB0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnID8gbmV3IHRhc2tfY29uZmlndXJhdGlvbl9lcnJvcl8xLlRhc2tDb25maWd1cmF0aW9uRXJyb3IoZXJyb3IpIDogZXJyb3I7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5jb25maWd1cmF0aW9uRXJyb3JUYXNrID0gY29uZmlndXJhdGlvbkVycm9yVGFzaztcbmZ1bmN0aW9uIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMsIHRyaW1tZWQgPSBmYWxzZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcih0ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJpbW1lZCA/IFN0cmluZyh0ZXh0KS50cmltKCkgOiB0ZXh0O1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnRzLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2sgPSBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrO1xuZnVuY3Rpb24gaXNCdWZmZXJUYXNrKHRhc2spIHtcbiAgICByZXR1cm4gdGFzay5mb3JtYXQgPT09ICdidWZmZXInO1xufVxuZXhwb3J0cy5pc0J1ZmZlclRhc2sgPSBpc0J1ZmZlclRhc2s7XG5mdW5jdGlvbiBpc0VtcHR5VGFzayh0YXNrKSB7XG4gICAgcmV0dXJuICF0YXNrLmNvbW1hbmRzLmxlbmd0aDtcbn1cbmV4cG9ydHMuaXNFbXB0eVRhc2sgPSBpc0VtcHR5VGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhc2suanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzQ2xlYW5PcHRpb25zQXJyYXkgPSBleHBvcnRzLmNsZWFuVGFzayA9IGV4cG9ydHMuY2xlYW5XaXRoT3B0aW9uc1Rhc2sgPSBleHBvcnRzLkNsZWFuT3B0aW9ucyA9IGV4cG9ydHMuQ09ORklHX0VSUk9SX1VOS05PV05fT1BUSU9OID0gZXhwb3J0cy5DT05GSUdfRVJST1JfTU9ERV9SRVFVSVJFRCA9IGV4cG9ydHMuQ09ORklHX0VSUk9SX0lOVEVSQUNUSVZFX01PREUgPSB2b2lkIDA7XG5jb25zdCBDbGVhblN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvQ2xlYW5TdW1tYXJ5XCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNvbnN0IHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG5leHBvcnRzLkNPTkZJR19FUlJPUl9JTlRFUkFDVElWRV9NT0RFID0gJ0dpdCBjbGVhbiBpbnRlcmFjdGl2ZSBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQnO1xuZXhwb3J0cy5DT05GSUdfRVJST1JfTU9ERV9SRVFVSVJFRCA9ICdHaXQgY2xlYW4gbW9kZSBwYXJhbWV0ZXIgKFwiblwiIG9yIFwiZlwiKSBpcyByZXF1aXJlZCc7XG5leHBvcnRzLkNPTkZJR19FUlJPUl9VTktOT1dOX09QVElPTiA9ICdHaXQgY2xlYW4gdW5rbm93biBvcHRpb24gZm91bmQgaW46ICc7XG4vKipcbiAqIEFsbCBzdXBwb3J0ZWQgb3B0aW9uIHN3aXRjaGVzIGF2YWlsYWJsZSBmb3IgdXNlIGluIGEgYGdpdC5jbGVhbmAgb3BlcmF0aW9uXG4gKi9cbnZhciBDbGVhbk9wdGlvbnM7XG4oZnVuY3Rpb24gKENsZWFuT3B0aW9ucykge1xuICAgIENsZWFuT3B0aW9uc1tcIkRSWV9SVU5cIl0gPSBcIm5cIjtcbiAgICBDbGVhbk9wdGlvbnNbXCJGT1JDRVwiXSA9IFwiZlwiO1xuICAgIENsZWFuT3B0aW9uc1tcIklHTk9SRURfSU5DTFVERURcIl0gPSBcInhcIjtcbiAgICBDbGVhbk9wdGlvbnNbXCJJR05PUkVEX09OTFlcIl0gPSBcIlhcIjtcbiAgICBDbGVhbk9wdGlvbnNbXCJFWENMVURJTkdcIl0gPSBcImVcIjtcbiAgICBDbGVhbk9wdGlvbnNbXCJRVUlFVFwiXSA9IFwicVwiO1xuICAgIENsZWFuT3B0aW9uc1tcIlJFQ1VSU0lWRVwiXSA9IFwiZFwiO1xufSkoQ2xlYW5PcHRpb25zID0gZXhwb3J0cy5DbGVhbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ2xlYW5PcHRpb25zID0ge30pKTtcbmNvbnN0IENsZWFuT3B0aW9uVmFsdWVzID0gbmV3IFNldChbJ2knLCAuLi51dGlsc18xLmFzU3RyaW5nQXJyYXkoT2JqZWN0LnZhbHVlcyhDbGVhbk9wdGlvbnMpKV0pO1xuZnVuY3Rpb24gY2xlYW5XaXRoT3B0aW9uc1Rhc2sobW9kZSwgY3VzdG9tQXJncykge1xuICAgIGNvbnN0IHsgY2xlYW5Nb2RlLCBvcHRpb25zLCB2YWxpZCB9ID0gZ2V0Q2xlYW5PcHRpb25zKG1vZGUpO1xuICAgIGlmICghY2xlYW5Nb2RlKSB7XG4gICAgICAgIHJldHVybiB0YXNrXzEuY29uZmlndXJhdGlvbkVycm9yVGFzayhleHBvcnRzLkNPTkZJR19FUlJPUl9NT0RFX1JFUVVJUkVEKTtcbiAgICB9XG4gICAgaWYgKCF2YWxpZC5vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0YXNrXzEuY29uZmlndXJhdGlvbkVycm9yVGFzayhleHBvcnRzLkNPTkZJR19FUlJPUl9VTktOT1dOX09QVElPTiArIEpTT04uc3RyaW5naWZ5KG1vZGUpKTtcbiAgICB9XG4gICAgb3B0aW9ucy5wdXNoKC4uLmN1c3RvbUFyZ3MpO1xuICAgIGlmIChvcHRpb25zLnNvbWUoaXNJbnRlcmFjdGl2ZU1vZGUpKSB7XG4gICAgICAgIHJldHVybiB0YXNrXzEuY29uZmlndXJhdGlvbkVycm9yVGFzayhleHBvcnRzLkNPTkZJR19FUlJPUl9JTlRFUkFDVElWRV9NT0RFKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsZWFuVGFzayhjbGVhbk1vZGUsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jbGVhbldpdGhPcHRpb25zVGFzayA9IGNsZWFuV2l0aE9wdGlvbnNUYXNrO1xuZnVuY3Rpb24gY2xlYW5UYXNrKG1vZGUsIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsnY2xlYW4nLCBgLSR7bW9kZX1gLCAuLi5jdXN0b21BcmdzXTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIodGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIENsZWFuU3VtbWFyeV8xLmNsZWFuU3VtbWFyeVBhcnNlcihtb2RlID09PSBDbGVhbk9wdGlvbnMuRFJZX1JVTiwgdGV4dCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5jbGVhblRhc2sgPSBjbGVhblRhc2s7XG5mdW5jdGlvbiBpc0NsZWFuT3B0aW9uc0FycmF5KGlucHV0KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIGlucHV0LmV2ZXJ5KHRlc3QgPT4gQ2xlYW5PcHRpb25WYWx1ZXMuaGFzKHRlc3QpKTtcbn1cbmV4cG9ydHMuaXNDbGVhbk9wdGlvbnNBcnJheSA9IGlzQ2xlYW5PcHRpb25zQXJyYXk7XG5mdW5jdGlvbiBnZXRDbGVhbk9wdGlvbnMoaW5wdXQpIHtcbiAgICBsZXQgY2xlYW5Nb2RlO1xuICAgIGxldCBvcHRpb25zID0gW107XG4gICAgbGV0IHZhbGlkID0geyBjbGVhbk1vZGU6IGZhbHNlLCBvcHRpb25zOiB0cnVlIH07XG4gICAgaW5wdXQucmVwbGFjZSgvW15hLXpdaS9nLCAnJykuc3BsaXQoJycpLmZvckVhY2goY2hhciA9PiB7XG4gICAgICAgIGlmIChpc0NsZWFuTW9kZShjaGFyKSkge1xuICAgICAgICAgICAgY2xlYW5Nb2RlID0gY2hhcjtcbiAgICAgICAgICAgIHZhbGlkLmNsZWFuTW9kZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWxpZC5vcHRpb25zID0gdmFsaWQub3B0aW9ucyAmJiBpc0tub3duT3B0aW9uKG9wdGlvbnNbb3B0aW9ucy5sZW5ndGhdID0gKGAtJHtjaGFyfWApKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNsZWFuTW9kZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgdmFsaWQsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGlzQ2xlYW5Nb2RlKGNsZWFuTW9kZSkge1xuICAgIHJldHVybiBjbGVhbk1vZGUgPT09IENsZWFuT3B0aW9ucy5GT1JDRSB8fCBjbGVhbk1vZGUgPT09IENsZWFuT3B0aW9ucy5EUllfUlVOO1xufVxuZnVuY3Rpb24gaXNLbm93bk9wdGlvbihvcHRpb24pIHtcbiAgICByZXR1cm4gL14tW2Etel0kL2kudGVzdChvcHRpb24pICYmIENsZWFuT3B0aW9uVmFsdWVzLmhhcyhvcHRpb24uY2hhckF0KDEpKTtcbn1cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmVNb2RlKG9wdGlvbikge1xuICAgIGlmICgvXi1bXlxcLV0vLnRlc3Qob3B0aW9uKSkge1xuICAgICAgICByZXR1cm4gb3B0aW9uLmluZGV4T2YoJ2knKSA+IDA7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb24gPT09ICctLWludGVyYWN0aXZlJztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsZWFuLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jaGVja0lzQmFyZVJlcG9UYXNrID0gZXhwb3J0cy5jaGVja0lzUmVwb1Jvb3RUYXNrID0gZXhwb3J0cy5jaGVja0lzUmVwb1Rhc2sgPSBleHBvcnRzLkNoZWNrUmVwb0FjdGlvbnMgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xudmFyIENoZWNrUmVwb0FjdGlvbnM7XG4oZnVuY3Rpb24gKENoZWNrUmVwb0FjdGlvbnMpIHtcbiAgICBDaGVja1JlcG9BY3Rpb25zW1wiQkFSRVwiXSA9IFwiYmFyZVwiO1xuICAgIENoZWNrUmVwb0FjdGlvbnNbXCJJTl9UUkVFXCJdID0gXCJ0cmVlXCI7XG4gICAgQ2hlY2tSZXBvQWN0aW9uc1tcIklTX1JFUE9fUk9PVFwiXSA9IFwicm9vdFwiO1xufSkoQ2hlY2tSZXBvQWN0aW9ucyA9IGV4cG9ydHMuQ2hlY2tSZXBvQWN0aW9ucyB8fCAoZXhwb3J0cy5DaGVja1JlcG9BY3Rpb25zID0ge30pKTtcbmNvbnN0IG9uRXJyb3IgPSAoZXhpdENvZGUsIHN0ZEVyciwgZG9uZSwgZmFpbCkgPT4ge1xuICAgIGlmIChleGl0Q29kZSA9PT0gdXRpbHNfMS5FeGl0Q29kZXMuVU5DTEVBTiAmJiBpc05vdFJlcG9NZXNzYWdlKHN0ZEVycikpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUoJ2ZhbHNlJyk7XG4gICAgfVxuICAgIGZhaWwoc3RkRXJyKTtcbn07XG5jb25zdCBwYXJzZXIgPSAodGV4dCkgPT4ge1xuICAgIHJldHVybiB0ZXh0LnRyaW0oKSA9PT0gJ3RydWUnO1xufTtcbmZ1bmN0aW9uIGNoZWNrSXNSZXBvVGFzayhhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICBjYXNlIENoZWNrUmVwb0FjdGlvbnMuQkFSRTpcbiAgICAgICAgICAgIHJldHVybiBjaGVja0lzQmFyZVJlcG9UYXNrKCk7XG4gICAgICAgIGNhc2UgQ2hlY2tSZXBvQWN0aW9ucy5JU19SRVBPX1JPT1Q6XG4gICAgICAgICAgICByZXR1cm4gY2hlY2tJc1JlcG9Sb290VGFzaygpO1xuICAgIH1cbiAgICBjb25zdCBjb21tYW5kcyA9IFsncmV2LXBhcnNlJywgJy0taXMtaW5zaWRlLXdvcmstdHJlZSddO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIG9uRXJyb3IsXG4gICAgICAgIHBhcnNlcixcbiAgICB9O1xufVxuZXhwb3J0cy5jaGVja0lzUmVwb1Rhc2sgPSBjaGVja0lzUmVwb1Rhc2s7XG5mdW5jdGlvbiBjaGVja0lzUmVwb1Jvb3RUYXNrKCkge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydyZXYtcGFyc2UnLCAnLS1naXQtZGlyJ107XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgb25FcnJvcixcbiAgICAgICAgcGFyc2VyKHBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiAvXlxcLihnaXQpPyQvLnRlc3QocGF0aC50cmltKCkpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnRzLmNoZWNrSXNSZXBvUm9vdFRhc2sgPSBjaGVja0lzUmVwb1Jvb3RUYXNrO1xuZnVuY3Rpb24gY2hlY2tJc0JhcmVSZXBvVGFzaygpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsncmV2LXBhcnNlJywgJy0taXMtYmFyZS1yZXBvc2l0b3J5J107XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgb25FcnJvcixcbiAgICAgICAgcGFyc2VyLFxuICAgIH07XG59XG5leHBvcnRzLmNoZWNrSXNCYXJlUmVwb1Rhc2sgPSBjaGVja0lzQmFyZVJlcG9UYXNrO1xuZnVuY3Rpb24gaXNOb3RSZXBvTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgcmV0dXJuIC8oTm90IGEgZ2l0IHJlcG9zaXRvcnl8S2VpbiBHaXQtUmVwb3NpdG9yeSkvaS50ZXN0KG1lc3NhZ2UpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hlY2staXMtcmVwby5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0UmVzZXRNb2RlID0gZXhwb3J0cy5yZXNldFRhc2sgPSBleHBvcnRzLlJlc2V0TW9kZSA9IHZvaWQgMDtcbmNvbnN0IHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG52YXIgUmVzZXRNb2RlO1xuKGZ1bmN0aW9uIChSZXNldE1vZGUpIHtcbiAgICBSZXNldE1vZGVbXCJNSVhFRFwiXSA9IFwibWl4ZWRcIjtcbiAgICBSZXNldE1vZGVbXCJTT0ZUXCJdID0gXCJzb2Z0XCI7XG4gICAgUmVzZXRNb2RlW1wiSEFSRFwiXSA9IFwiaGFyZFwiO1xuICAgIFJlc2V0TW9kZVtcIk1FUkdFXCJdID0gXCJtZXJnZVwiO1xuICAgIFJlc2V0TW9kZVtcIktFRVBcIl0gPSBcImtlZXBcIjtcbn0pKFJlc2V0TW9kZSA9IGV4cG9ydHMuUmVzZXRNb2RlIHx8IChleHBvcnRzLlJlc2V0TW9kZSA9IHt9KSk7XG5jb25zdCBSZXNldE1vZGVzID0gQXJyYXkuZnJvbShPYmplY3QudmFsdWVzKFJlc2V0TW9kZSkpO1xuZnVuY3Rpb24gcmVzZXRUYXNrKG1vZGUsIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsncmVzZXQnXTtcbiAgICBpZiAoaXNWYWxpZFJlc2V0TW9kZShtb2RlKSkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKGAtLSR7bW9kZX1gKTtcbiAgICB9XG4gICAgY29tbWFuZHMucHVzaCguLi5jdXN0b21BcmdzKTtcbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMpO1xufVxuZXhwb3J0cy5yZXNldFRhc2sgPSByZXNldFRhc2s7XG5mdW5jdGlvbiBnZXRSZXNldE1vZGUobW9kZSkge1xuICAgIGlmIChpc1ZhbGlkUmVzZXRNb2RlKG1vZGUpKSB7XG4gICAgICAgIHJldHVybiBtb2RlO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGVvZiBtb2RlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICByZXR1cm4gUmVzZXRNb2RlLlNPRlQ7XG4gICAgfVxuICAgIHJldHVybjtcbn1cbmV4cG9ydHMuZ2V0UmVzZXRNb2RlID0gZ2V0UmVzZXRNb2RlO1xuZnVuY3Rpb24gaXNWYWxpZFJlc2V0TW9kZShtb2RlKSB7XG4gICAgcmV0dXJuIFJlc2V0TW9kZXMuaW5jbHVkZXMobW9kZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNldC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuR2l0Q29uc3RydWN0RXJyb3IgPSB2b2lkIDA7XG5jb25zdCBnaXRfZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2dpdC1lcnJvclwiKTtcbi8qKlxuICogVGhlIGBHaXRDb25zdHJ1Y3RFcnJvcmAgaXMgdGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGluIHRoZSBjb25zdHJ1Y3RvclxuICogb2YgdGhlIGBzaW1wbGUtZ2l0YCBpbnN0YW5jZSBpdHNlbGYuIE1vc3QgY29tbW9ubHkgYXMgYSByZXN1bHQgb2YgdXNpbmdcbiAqIGEgYGJhc2VEaXJgIG9wdGlvbiB0aGF0IHBvaW50cyB0byBhIGZvbGRlciB0aGF0IGVpdGhlciBkb2VzIG5vdCBleGlzdCxcbiAqIG9yIGNhbm5vdCBiZSByZWFkIGJ5IHRoZSB1c2VyIHRoZSBub2RlIHNjcmlwdCBpcyBydW5uaW5nIGFzLlxuICpcbiAqIENoZWNrIHRoZSBgLm1lc3NhZ2VgIHByb3BlcnR5IGZvciBtb3JlIGRldGFpbCBpbmNsdWRpbmcgdGhlIHByb3BlcnRpZXNcbiAqIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gKi9cbmNsYXNzIEdpdENvbnN0cnVjdEVycm9yIGV4dGVuZHMgZ2l0X2Vycm9yXzEuR2l0RXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZywgbWVzc2FnZSkge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsIG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB9XG59XG5leHBvcnRzLkdpdENvbnN0cnVjdEVycm9yID0gR2l0Q29uc3RydWN0RXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1naXQtY29uc3RydWN0LWVycm9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UYXNrQ29uZmlndXJhdGlvbkVycm9yID0gZXhwb3J0cy5HaXRSZXNwb25zZUVycm9yID0gZXhwb3J0cy5HaXRFcnJvciA9IGV4cG9ydHMuR2l0Q29uc3RydWN0RXJyb3IgPSBleHBvcnRzLlJlc2V0TW9kZSA9IGV4cG9ydHMuQ2hlY2tSZXBvQWN0aW9ucyA9IGV4cG9ydHMuQ2xlYW5PcHRpb25zID0gdm9pZCAwO1xudmFyIGNsZWFuXzEgPSByZXF1aXJlKFwiLi90YXNrcy9jbGVhblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNsZWFuT3B0aW9uc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY2xlYW5fMS5DbGVhbk9wdGlvbnM7IH0gfSk7XG52YXIgY2hlY2tfaXNfcmVwb18xID0gcmVxdWlyZShcIi4vdGFza3MvY2hlY2staXMtcmVwb1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNoZWNrUmVwb0FjdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNoZWNrX2lzX3JlcG9fMS5DaGVja1JlcG9BY3Rpb25zOyB9IH0pO1xudmFyIHJlc2V0XzEgPSByZXF1aXJlKFwiLi90YXNrcy9yZXNldFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlc2V0TW9kZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzZXRfMS5SZXNldE1vZGU7IH0gfSk7XG52YXIgZ2l0X2NvbnN0cnVjdF9lcnJvcl8xID0gcmVxdWlyZShcIi4vZXJyb3JzL2dpdC1jb25zdHJ1Y3QtZXJyb3JcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJHaXRDb25zdHJ1Y3RFcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2l0X2NvbnN0cnVjdF9lcnJvcl8xLkdpdENvbnN0cnVjdEVycm9yOyB9IH0pO1xudmFyIGdpdF9lcnJvcl8xID0gcmVxdWlyZShcIi4vZXJyb3JzL2dpdC1lcnJvclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkdpdEVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBnaXRfZXJyb3JfMS5HaXRFcnJvcjsgfSB9KTtcbnZhciBnaXRfcmVzcG9uc2VfZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2Vycm9ycy9naXQtcmVzcG9uc2UtZXJyb3JcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJHaXRSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBnaXRfcmVzcG9uc2VfZXJyb3JfMS5HaXRSZXNwb25zZUVycm9yOyB9IH0pO1xudmFyIHRhc2tfY29uZmlndXJhdGlvbl9lcnJvcl8xID0gcmVxdWlyZShcIi4vZXJyb3JzL3Rhc2stY29uZmlndXJhdGlvbi1lcnJvclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRhc2tDb25maWd1cmF0aW9uRXJyb3JcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRhc2tfY29uZmlndXJhdGlvbl9lcnJvcl8xLlRhc2tDb25maWd1cmF0aW9uRXJyb3I7IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcGkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkdpdExvZ2dlciA9IGV4cG9ydHMuY3JlYXRlTG9nZ2VyID0gZXhwb3J0cy5sb2cgPSB2b2lkIDA7XG5jb25zdCBkZWJ1Z18xID0gcmVxdWlyZShcImRlYnVnXCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuZGVidWdfMS5kZWZhdWx0LmZvcm1hdHRlcnMuTCA9ICh2YWx1ZSkgPT4gU3RyaW5nKHV0aWxzXzEuZmlsdGVySGFzTGVuZ3RoKHZhbHVlKSA/IHZhbHVlLmxlbmd0aCA6ICctJyk7XG5kZWJ1Z18xLmRlZmF1bHQuZm9ybWF0dGVycy5CID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgfVxuICAgIHJldHVybiB1dGlsc18xLm9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn07XG4vKipcbiAqIFRoZSBzaGFyZWQgZGVidWcgbG9nZ2luZyBpbnN0YW5jZVxuICovXG5leHBvcnRzLmxvZyA9IGRlYnVnXzEuZGVmYXVsdCgnc2ltcGxlLWdpdCcpO1xuZnVuY3Rpb24gcHJlZml4ZWRMb2dnZXIodG8sIHByZWZpeCwgZm9yd2FyZCkge1xuICAgIGlmICghcHJlZml4IHx8ICFTdHJpbmcocHJlZml4KS5yZXBsYWNlKC9cXHMqLywgJycpKSB7XG4gICAgICAgIHJldHVybiAhZm9yd2FyZCA/IHRvIDogKG1lc3NhZ2UsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgIHRvKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgZm9yd2FyZChtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIChtZXNzYWdlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIHRvKGAlcyAke21lc3NhZ2V9YCwgcHJlZml4LCAuLi5hcmdzKTtcbiAgICAgICAgaWYgKGZvcndhcmQpIHtcbiAgICAgICAgICAgIGZvcndhcmQobWVzc2FnZSwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY2hpbGRMb2dnZXJOYW1lKG5hbWUsIGNoaWxkRGVidWdnZXIsIHsgbmFtZXNwYWNlOiBwYXJlbnROYW1lc3BhY2UgfSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkTmFtZXNwYWNlID0gY2hpbGREZWJ1Z2dlciAmJiBjaGlsZERlYnVnZ2VyLm5hbWVzcGFjZSB8fCAnJztcbiAgICBpZiAoY2hpbGROYW1lc3BhY2Uuc3RhcnRzV2l0aChwYXJlbnROYW1lc3BhY2UpKSB7XG4gICAgICAgIHJldHVybiBjaGlsZE5hbWVzcGFjZS5zdWJzdHIocGFyZW50TmFtZXNwYWNlLmxlbmd0aCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGROYW1lc3BhY2UgfHwgcGFyZW50TmFtZXNwYWNlO1xufVxuZnVuY3Rpb24gY3JlYXRlTG9nZ2VyKGxhYmVsLCB2ZXJib3NlLCBpbml0aWFsU3RlcCwgaW5mb0RlYnVnZ2VyID0gZXhwb3J0cy5sb2cpIHtcbiAgICBjb25zdCBsYWJlbFByZWZpeCA9IGxhYmVsICYmIGBbJHtsYWJlbH1dYCB8fCAnJztcbiAgICBjb25zdCBzcGF3bmVkID0gW107XG4gICAgY29uc3QgZGVidWdEZWJ1Z2dlciA9ICh0eXBlb2YgdmVyYm9zZSA9PT0gJ3N0cmluZycpID8gaW5mb0RlYnVnZ2VyLmV4dGVuZCh2ZXJib3NlKSA6IHZlcmJvc2U7XG4gICAgY29uc3Qga2V5ID0gY2hpbGRMb2dnZXJOYW1lKHV0aWxzXzEuZmlsdGVyVHlwZSh2ZXJib3NlLCB1dGlsc18xLmZpbHRlclN0cmluZyksIGRlYnVnRGVidWdnZXIsIGluZm9EZWJ1Z2dlcik7XG4gICAgcmV0dXJuIHN0ZXAoaW5pdGlhbFN0ZXApO1xuICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIHNwYXduZWQuZm9yRWFjaChsb2dnZXIgPT4gbG9nZ2VyLmRlc3Ryb3koKSk7XG4gICAgICAgIHNwYXduZWQubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hpbGQobmFtZSkge1xuICAgICAgICByZXR1cm4gdXRpbHNfMS5hcHBlbmQoc3Bhd25lZCwgY3JlYXRlTG9nZ2VyKGxhYmVsLCBkZWJ1Z0RlYnVnZ2VyICYmIGRlYnVnRGVidWdnZXIuZXh0ZW5kKG5hbWUpIHx8IG5hbWUpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2libGluZyhuYW1lLCBpbml0aWFsKSB7XG4gICAgICAgIHJldHVybiB1dGlsc18xLmFwcGVuZChzcGF3bmVkLCBjcmVhdGVMb2dnZXIobGFiZWwsIGtleS5yZXBsYWNlKC9eW146XSsvLCBuYW1lKSwgaW5pdGlhbCwgaW5mb0RlYnVnZ2VyKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0ZXAocGhhc2UpIHtcbiAgICAgICAgY29uc3Qgc3RlcFByZWZpeCA9IHBoYXNlICYmIGBbJHtwaGFzZX1dYCB8fCAnJztcbiAgICAgICAgY29uc3QgZGVidWcgPSBkZWJ1Z0RlYnVnZ2VyICYmIHByZWZpeGVkTG9nZ2VyKGRlYnVnRGVidWdnZXIsIHN0ZXBQcmVmaXgpIHx8IHV0aWxzXzEuTk9PUDtcbiAgICAgICAgY29uc3QgaW5mbyA9IHByZWZpeGVkTG9nZ2VyKGluZm9EZWJ1Z2dlciwgYCR7bGFiZWxQcmVmaXh9ICR7c3RlcFByZWZpeH1gLCBkZWJ1Zyk7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGRlYnVnRGVidWdnZXIgPyBkZWJ1ZyA6IGluZm8sIHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICBzaWJsaW5nLFxuICAgICAgICAgICAgZGVidWcsXG4gICAgICAgICAgICBpbmZvLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIGRlc3Ryb3ksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuY3JlYXRlTG9nZ2VyID0gY3JlYXRlTG9nZ2VyO1xuLyoqXG4gKiBUaGUgYEdpdExvZ2dlcmAgaXMgdXNlZCBieSB0aGUgbWFpbiBgU2ltcGxlR2l0YCBydW5uZXIgdG8gaGFuZGxlIGxvZ2dpbmdcbiAqIGFueSB3YXJuaW5ncyBvciBlcnJvcnMuXG4gKi9cbmNsYXNzIEdpdExvZ2dlciB7XG4gICAgY29uc3RydWN0b3IoX291dCA9IGV4cG9ydHMubG9nKSB7XG4gICAgICAgIHRoaXMuX291dCA9IF9vdXQ7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBwcmVmaXhlZExvZ2dlcihfb3V0LCAnW0VSUk9SXScpO1xuICAgICAgICB0aGlzLndhcm4gPSBwcmVmaXhlZExvZ2dlcihfb3V0LCAnW1dBUk5dJyk7XG4gICAgfVxuICAgIHNpbGVudChzaWxlbmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHNpbGVuY2UgIT09IHRoaXMuX291dC5lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IHRoaXMuX291dDtcbiAgICAgICAgY29uc3QgZW52ID0gKHByb2Nlc3MuZW52LkRFQlVHIHx8ICcnKS5zcGxpdCgnLCcpLmZpbHRlcihzID0+ICEhcyk7XG4gICAgICAgIGNvbnN0IGhhc09uID0gZW52LmluY2x1ZGVzKG5hbWVzcGFjZSk7XG4gICAgICAgIGNvbnN0IGhhc09mZiA9IGVudi5pbmNsdWRlcyhgLSR7bmFtZXNwYWNlfWApO1xuICAgICAgICAvLyBlbmFibGluZyB0aGUgbG9nXG4gICAgICAgIGlmICghc2lsZW5jZSkge1xuICAgICAgICAgICAgaWYgKGhhc09mZikge1xuICAgICAgICAgICAgICAgIHV0aWxzXzEucmVtb3ZlKGVudiwgYC0ke25hbWVzcGFjZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVudi5wdXNoKG5hbWVzcGFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaGFzT24pIHtcbiAgICAgICAgICAgICAgICB1dGlsc18xLnJlbW92ZShlbnYsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbnYucHVzaChgLSR7bmFtZXNwYWNlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlYnVnXzEuZGVmYXVsdC5lbmFibGUoZW52LmpvaW4oJywnKSk7XG4gICAgfVxufVxuZXhwb3J0cy5HaXRMb2dnZXIgPSBHaXRMb2dnZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1naXQtbG9nZ2VyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UYXNrc1BlbmRpbmdRdWV1ZSA9IHZvaWQgMDtcbmNvbnN0IGdpdF9sb2dnZXJfMSA9IHJlcXVpcmUoXCIuLi9naXQtbG9nZ2VyXCIpO1xuY29uc3QgYXBpXzEgPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuY2xhc3MgVGFza3NQZW5kaW5nUXVldWUge1xuICAgIGNvbnN0cnVjdG9yKGxvZ0xhYmVsID0gJ0dpdEV4ZWN1dG9yJykge1xuICAgICAgICB0aGlzLmxvZ0xhYmVsID0gbG9nTGFiZWw7XG4gICAgICAgIHRoaXMuX3F1ZXVlID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICB3aXRoUHJvZ3Jlc3ModGFzaykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcXVldWUuZ2V0KHRhc2spO1xuICAgIH1cbiAgICBjcmVhdGVQcm9ncmVzcyh0YXNrKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBUYXNrc1BlbmRpbmdRdWV1ZS5nZXROYW1lKHRhc2suY29tbWFuZHNbMF0pO1xuICAgICAgICBjb25zdCBsb2dnZXIgPSBnaXRfbG9nZ2VyXzEuY3JlYXRlTG9nZ2VyKHRoaXMubG9nTGFiZWwsIG5hbWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGFzayxcbiAgICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1c2godGFzaykge1xuICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHRoaXMuY3JlYXRlUHJvZ3Jlc3ModGFzayk7XG4gICAgICAgIHByb2dyZXNzLmxvZ2dlcignQWRkaW5nIHRhc2sgdG8gdGhlIHF1ZXVlLCBjb21tYW5kcyA9ICVvJywgdGFzay5jb21tYW5kcyk7XG4gICAgICAgIHRoaXMuX3F1ZXVlLnNldCh0YXNrLCBwcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBwcm9ncmVzcztcbiAgICB9XG4gICAgZmF0YWwoZXJyKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3Rhc2ssIHsgbG9nZ2VyIH1dIG9mIEFycmF5LmZyb20odGhpcy5fcXVldWUuZW50cmllcygpKSkge1xuICAgICAgICAgICAgaWYgKHRhc2sgPT09IGVyci50YXNrKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEZhaWxlZCAlb2AsIGVycik7XG4gICAgICAgICAgICAgICAgbG9nZ2VyKGBGYXRhbCBleGNlcHRpb24sIGFueSBhcy15ZXQgdW4tc3RhcnRlZCB0YXNrcyBydW4gdGhyb3VnaCB0aGlzIGV4ZWN1dG9yIHdpbGwgbm90IGJlIGF0dGVtcHRlZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEEgZmF0YWwgZXhjZXB0aW9uIG9jY3VycmVkIGluIGEgcHJldmlvdXMgdGFzaywgdGhlIHF1ZXVlIGhhcyBiZWVuIHB1cmdlZDogJW9gLCBlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlKHRhc2spO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9xdWV1ZS5zaXplICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1ZXVlIHNpemUgc2hvdWxkIGJlIHplcm8gYWZ0ZXIgZmF0YWw6ICR7dGhpcy5fcXVldWUuc2l6ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21wbGV0ZSh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy53aXRoUHJvZ3Jlc3ModGFzayk7XG4gICAgICAgIGlmIChwcm9ncmVzcykge1xuICAgICAgICAgICAgcHJvZ3Jlc3MubG9nZ2VyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXVlLmRlbGV0ZSh0YXNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhdHRlbXB0KHRhc2spIHtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aGlzLndpdGhQcm9ncmVzcyh0YXNrKTtcbiAgICAgICAgaWYgKCFwcm9ncmVzcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGFwaV8xLkdpdEVycm9yKHVuZGVmaW5lZCwgJ1Rhc2tzUGVuZGluZ1F1ZXVlOiBhdHRlbXB0IGNhbGxlZCBmb3IgYW4gdW5rbm93biB0YXNrJyk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvZ3Jlc3MubG9nZ2VyKCdTdGFydGluZyB0YXNrJyk7XG4gICAgICAgIHJldHVybiBwcm9ncmVzcztcbiAgICB9XG4gICAgc3RhdGljIGdldE5hbWUobmFtZSA9ICdlbXB0eScpIHtcbiAgICAgICAgcmV0dXJuIGB0YXNrOiR7bmFtZX06JHsrK1Rhc2tzUGVuZGluZ1F1ZXVlLmNvdW50ZXJ9YDtcbiAgICB9XG59XG5leHBvcnRzLlRhc2tzUGVuZGluZ1F1ZXVlID0gVGFza3NQZW5kaW5nUXVldWU7XG5UYXNrc1BlbmRpbmdRdWV1ZS5jb3VudGVyID0gMDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhc2tzLXBlbmRpbmctcXVldWUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuR2l0RXhlY3V0b3JDaGFpbiA9IHZvaWQgMDtcbmNvbnN0IGNoaWxkX3Byb2Nlc3NfMSA9IHJlcXVpcmUoXCJjaGlsZF9wcm9jZXNzXCIpO1xuY29uc3QgYXBpXzEgPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuY29uc3QgdGFza18xID0gcmVxdWlyZShcIi4uL3Rhc2tzL3Rhc2tcIik7XG5jb25zdCB0YXNrc19wZW5kaW5nX3F1ZXVlXzEgPSByZXF1aXJlKFwiLi90YXNrcy1wZW5kaW5nLXF1ZXVlXCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNsYXNzIEdpdEV4ZWN1dG9yQ2hhaW4ge1xuICAgIGNvbnN0cnVjdG9yKF9leGVjdXRvciwgX3NjaGVkdWxlcikge1xuICAgICAgICB0aGlzLl9leGVjdXRvciA9IF9leGVjdXRvcjtcbiAgICAgICAgdGhpcy5fc2NoZWR1bGVyID0gX3NjaGVkdWxlcjtcbiAgICAgICAgdGhpcy5fY2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBuZXcgdGFza3NfcGVuZGluZ19xdWV1ZV8xLlRhc2tzUGVuZGluZ1F1ZXVlKCk7XG4gICAgfVxuICAgIGdldCBiaW5hcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGVjdXRvci5iaW5hcnk7XG4gICAgfVxuICAgIGdldCBvdXRwdXRIYW5kbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhlY3V0b3Iub3V0cHV0SGFuZGxlcjtcbiAgICB9XG4gICAgZ2V0IGN3ZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dG9yLmN3ZDtcbiAgICB9XG4gICAgZ2V0IGVudigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dG9yLmVudjtcbiAgICB9XG4gICAgcHVzaCh0YXNrKSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlLnB1c2godGFzayk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFpbiA9IHRoaXMuX2NoYWluLnRoZW4oKCkgPT4gdGhpcy5hdHRlbXB0VGFzayh0YXNrKSk7XG4gICAgfVxuICAgIGF0dGVtcHRUYXNrKHRhc2spIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9uU2NoZWR1bGVDb21wbGV0ZSA9IHlpZWxkIHRoaXMuX3NjaGVkdWxlci5uZXh0KCk7XG4gICAgICAgICAgICBjb25zdCBvblF1ZXVlQ29tcGxldGUgPSAoKSA9PiB0aGlzLl9xdWV1ZS5jb21wbGV0ZSh0YXNrKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBsb2dnZXIgfSA9IHRoaXMuX3F1ZXVlLmF0dGVtcHQodGFzayk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkICh0YXNrXzEuaXNFbXB0eVRhc2sodGFzaylcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmF0dGVtcHRFbXB0eVRhc2sodGFzaywgbG9nZ2VyKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuYXR0ZW1wdFJlbW90ZVRhc2sodGFzaywgbG9nZ2VyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRocm93IHRoaXMub25GYXRhbEV4Y2VwdGlvbih0YXNrLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIG9uUXVldWVDb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIG9uU2NoZWR1bGVDb21wbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb25GYXRhbEV4Y2VwdGlvbih0YXNrLCBlKSB7XG4gICAgICAgIGNvbnN0IGdpdEVycm9yID0gKGUgaW5zdGFuY2VvZiBhcGlfMS5HaXRFcnJvcikgPyBPYmplY3QuYXNzaWduKGUsIHsgdGFzayB9KSA6IG5ldyBhcGlfMS5HaXRFcnJvcih0YXNrLCBlICYmIFN0cmluZyhlKSk7XG4gICAgICAgIHRoaXMuX2NoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHRoaXMuX3F1ZXVlLmZhdGFsKGdpdEVycm9yKTtcbiAgICAgICAgcmV0dXJuIGdpdEVycm9yO1xuICAgIH1cbiAgICBhdHRlbXB0UmVtb3RlVGFzayh0YXNrLCBsb2dnZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhdyA9IHlpZWxkIHRoaXMuZ2l0UmVzcG9uc2UodGhpcy5iaW5hcnksIHRhc2suY29tbWFuZHMsIHRoaXMub3V0cHV0SGFuZGxlciwgbG9nZ2VyLnN0ZXAoJ1NQQVdOJykpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U3RyZWFtcyA9IHlpZWxkIHRoaXMuaGFuZGxlVGFza0RhdGEodGFzaywgcmF3LCBsb2dnZXIuc3RlcCgnSEFORExFJykpO1xuICAgICAgICAgICAgbG9nZ2VyKGBwYXNzaW5nIHJlc3BvbnNlIHRvIHRhc2sncyBwYXJzZXIgYXMgYSAlc2AsIHRhc2suZm9ybWF0KTtcbiAgICAgICAgICAgIGlmICh0YXNrXzEuaXNCdWZmZXJUYXNrKHRhc2spKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzXzEuY2FsbFRhc2tQYXJzZXIodGFzay5wYXJzZXIsIG91dHB1dFN0cmVhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHV0aWxzXzEuY2FsbFRhc2tQYXJzZXIodGFzay5wYXJzZXIsIG91dHB1dFN0cmVhbXMuYXNTdHJpbmdzKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXR0ZW1wdEVtcHR5VGFzayh0YXNrLCBsb2dnZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxvZ2dlcihgZW1wdHkgdGFzayBieXBhc3NpbmcgY2hpbGQgcHJvY2VzcyB0byBjYWxsIHRvIHRhc2sncyBwYXJzZXJgKTtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLnBhcnNlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlVGFza0RhdGEoeyBvbkVycm9yLCBjb25jYXRTdGRFcnIgfSwgeyBleGl0Q29kZSwgc3RkT3V0LCBzdGRFcnIgfSwgbG9nZ2VyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZG9uZSwgZmFpbCkgPT4ge1xuICAgICAgICAgICAgbG9nZ2VyKGBQcmVwYXJpbmcgdG8gaGFuZGxlIHByb2Nlc3MgcmVzcG9uc2UgZXhpdENvZGU9JWQgc3RkT3V0PWAsIGV4aXRDb2RlKTtcbiAgICAgICAgICAgIGlmIChleGl0Q29kZSAmJiBzdGRFcnIubGVuZ3RoICYmIG9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgZXhpdENvZGU9JXMgaGFuZGxpbmcgd2l0aCBjdXN0b20gZXJyb3IgaGFuZGxlcmApO1xuICAgICAgICAgICAgICAgIGxvZ2dlcihgY29uY2F0ZW5hdGUgc3RkRXJyIHRvIHN0ZE91dDogJWpgLCBjb25jYXRTdGRFcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKGV4aXRDb2RlLCBCdWZmZXIuY29uY2F0KFsuLi4oY29uY2F0U3RkRXJyID8gc3RkT3V0IDogW10pLCAuLi5zdGRFcnJdKS50b1N0cmluZygndXRmLTgnKSwgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgY3VzdG9tIGVycm9yIGhhbmRsZXIgdHJlYXRlZCBhcyBzdWNjZXNzYCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlcihgY3VzdG9tIGVycm9yIHJldHVybmVkIGEgJXNgLCB1dGlsc18xLm9iamVjdFRvU3RyaW5nKHJlc3VsdCkpO1xuICAgICAgICAgICAgICAgICAgICBkb25lKG5ldyB1dGlsc18xLkdpdE91dHB1dFN0cmVhbXMoQnVmZmVyLmlzQnVmZmVyKHJlc3VsdCkgPyByZXN1bHQgOiBCdWZmZXIuZnJvbShTdHJpbmcocmVzdWx0KSksIEJ1ZmZlci5jb25jYXQoc3RkRXJyKSkpO1xuICAgICAgICAgICAgICAgIH0sIGZhaWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4aXRDb2RlICYmIHN0ZEVyci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgZXhpdENvZGU9JXMgdHJlYXRlZCBhcyBlcnJvciB3aGVuIHRoZW4gY2hpbGQgcHJvY2VzcyBoYXMgd3JpdHRlbiB0byBzdGRFcnJgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChCdWZmZXIuY29uY2F0KHN0ZEVycikudG9TdHJpbmcoJ3V0Zi04JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmNhdFN0ZEVycikge1xuICAgICAgICAgICAgICAgIGxvZ2dlcihgY29uY2F0ZW5hdGluZyBzdGRFcnIgb250byBzdGRPdXQgYmVmb3JlIHByb2Nlc3NpbmdgKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIoYHN0ZEVycjogJE9gLCBzdGRFcnIpO1xuICAgICAgICAgICAgICAgIHN0ZE91dC5wdXNoKC4uLnN0ZEVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgcmV0cmlldmluZyB0YXNrIG91dHB1dCBjb21wbGV0ZWApO1xuICAgICAgICAgICAgZG9uZShuZXcgdXRpbHNfMS5HaXRPdXRwdXRTdHJlYW1zKEJ1ZmZlci5jb25jYXQoc3RkT3V0KSwgQnVmZmVyLmNvbmNhdChzdGRFcnIpKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnaXRSZXNwb25zZShjb21tYW5kLCBhcmdzLCBvdXRwdXRIYW5kbGVyLCBsb2dnZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dExvZ2dlciA9IGxvZ2dlci5zaWJsaW5nKCdvdXRwdXQnKTtcbiAgICAgICAgICAgIGNvbnN0IHNwYXduT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgICAgICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgICAgICAgICAgd2luZG93c0hpZGU6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChkb25lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RkT3V0ID0gW107XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RkRXJyID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGF0dGVtcHRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGF0dGVtcHRDbG9zZShleGl0Q29kZSwgZXZlbnQgPSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNsb3Npbmcgd2hlbiB0aGVyZSBpcyBjb250ZW50LCB0ZXJtaW5hdGUgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGVtcHRlZCB8fCBzdGRFcnIubGVuZ3RoIHx8IHN0ZE91dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBleGl0Q29kZT0lcyBldmVudD0lc2AsIGV4aXRDb2RlLCBldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRPdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkRXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TG9nZ2VyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBhdHRlbXB0IGF0IGNsb3NpbmcgYnV0IG5vIGNvbnRlbnQgeWV0LCB3YWl0IGJyaWVmbHkgZm9yIHRoZSBjbG9zZS9leGl0IHRoYXQgbWF5IGZvbGxvd1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dGVtcHRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gYXR0ZW1wdENsb3NlKGV4aXRDb2RlLCAnZGVmZXJyZWQnKSwgNTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyKCdyZWNlaXZlZCAlcyBldmVudCBiZWZvcmUgY29udGVudCBvbiBzdGRPdXQvc3RkRXJyJywgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAlcyAlb2AsIGNvbW1hbmQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGxvZ2dlcignJU8nLCBzcGF3bk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwYXduZWQgPSBjaGlsZF9wcm9jZXNzXzEuc3Bhd24oY29tbWFuZCwgYXJncywgc3Bhd25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICBzcGF3bmVkLnN0ZG91dC5vbignZGF0YScsIG9uRGF0YVJlY2VpdmVkKHN0ZE91dCwgJ3N0ZE91dCcsIGxvZ2dlciwgb3V0cHV0TG9nZ2VyLnN0ZXAoJ3N0ZE91dCcpKSk7XG4gICAgICAgICAgICAgICAgc3Bhd25lZC5zdGRlcnIub24oJ2RhdGEnLCBvbkRhdGFSZWNlaXZlZChzdGRFcnIsICdzdGRFcnInLCBsb2dnZXIsIG91dHB1dExvZ2dlci5zdGVwKCdzdGRFcnInKSkpO1xuICAgICAgICAgICAgICAgIHNwYXduZWQub24oJ2Vycm9yJywgb25FcnJvclJlY2VpdmVkKHN0ZEVyciwgbG9nZ2VyKSk7XG4gICAgICAgICAgICAgICAgc3Bhd25lZC5vbignY2xvc2UnLCAoY29kZSkgPT4gYXR0ZW1wdENsb3NlKGNvZGUsICdjbG9zZScpKTtcbiAgICAgICAgICAgICAgICBzcGF3bmVkLm9uKCdleGl0JywgKGNvZGUpID0+IGF0dGVtcHRDbG9zZShjb2RlLCAnZXhpdCcpKTtcbiAgICAgICAgICAgICAgICBpZiAob3V0cHV0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIoYFBhc3NpbmcgY2hpbGQgcHJvY2VzcyBzdGRPdXQvc3RkRXJyIHRvIGN1c3RvbSBvdXRwdXRIYW5kbGVyYCk7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIoY29tbWFuZCwgc3Bhd25lZC5zdGRvdXQsIHNwYXduZWQuc3RkZXJyLCBbLi4uYXJnc10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkdpdEV4ZWN1dG9yQ2hhaW4gPSBHaXRFeGVjdXRvckNoYWluO1xuZnVuY3Rpb24gb25FcnJvclJlY2VpdmVkKHRhcmdldCwgbG9nZ2VyKSB7XG4gICAgcmV0dXJuIChlcnIpID0+IHtcbiAgICAgICAgbG9nZ2VyKGBbRVJST1JdIGNoaWxkIHByb2Nlc3MgZXhjZXB0aW9uICVvYCwgZXJyKTtcbiAgICAgICAgdGFyZ2V0LnB1c2goQnVmZmVyLmZyb20oU3RyaW5nKGVyci5zdGFjayksICdhc2NpaScpKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gb25EYXRhUmVjZWl2ZWQodGFyZ2V0LCBuYW1lLCBsb2dnZXIsIG91dHB1dCkge1xuICAgIHJldHVybiAoYnVmZmVyKSA9PiB7XG4gICAgICAgIGxvZ2dlcihgJXMgcmVjZWl2ZWQgJUwgYnl0ZXNgLCBuYW1lLCBidWZmZXIpO1xuICAgICAgICBvdXRwdXQoYCVCYCwgYnVmZmVyKTtcbiAgICAgICAgdGFyZ2V0LnB1c2goYnVmZmVyKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0LWV4ZWN1dG9yLWNoYWluLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HaXRFeGVjdXRvciA9IHZvaWQgMDtcbmNvbnN0IGdpdF9leGVjdXRvcl9jaGFpbl8xID0gcmVxdWlyZShcIi4vZ2l0LWV4ZWN1dG9yLWNoYWluXCIpO1xuY2xhc3MgR2l0RXhlY3V0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGJpbmFyeSA9ICdnaXQnLCBjd2QsIF9zY2hlZHVsZXIpIHtcbiAgICAgICAgdGhpcy5iaW5hcnkgPSBiaW5hcnk7XG4gICAgICAgIHRoaXMuY3dkID0gY3dkO1xuICAgICAgICB0aGlzLl9zY2hlZHVsZXIgPSBfc2NoZWR1bGVyO1xuICAgICAgICB0aGlzLl9jaGFpbiA9IG5ldyBnaXRfZXhlY3V0b3JfY2hhaW5fMS5HaXRFeGVjdXRvckNoYWluKHRoaXMsIHRoaXMuX3NjaGVkdWxlcik7XG4gICAgfVxuICAgIGNoYWluKCkge1xuICAgICAgICByZXR1cm4gbmV3IGdpdF9leGVjdXRvcl9jaGFpbl8xLkdpdEV4ZWN1dG9yQ2hhaW4odGhpcywgdGhpcy5fc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgcHVzaCh0YXNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFpbi5wdXNoKHRhc2spO1xuICAgIH1cbn1cbmV4cG9ydHMuR2l0RXhlY3V0b3IgPSBHaXRFeGVjdXRvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdpdC1leGVjdXRvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlRGVmZXJyZWQgPSBleHBvcnRzLmRlZmVycmVkID0gdm9pZCAwO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGBEZWZlcnJlZFByb21pc2VgXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuIGltcG9ydCB7ZGVmZXJyZWR9IGZyb20gJ0Brd3NpdGVzL3Byb21pc2UtZGVmZXJyZWRgO1xuIGBgYFxuICovXG5mdW5jdGlvbiBkZWZlcnJlZCgpIHtcbiAgICBsZXQgZG9uZTtcbiAgICBsZXQgZmFpbDtcbiAgICBsZXQgc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX2RvbmUsIF9mYWlsKSA9PiB7XG4gICAgICAgIGRvbmUgPSBfZG9uZTtcbiAgICAgICAgZmFpbCA9IF9mYWlsO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2UsXG4gICAgICAgIGRvbmUocmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSAncGVuZGluZycpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAncmVzb2x2ZWQnO1xuICAgICAgICAgICAgICAgIGRvbmUocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZmFpbChlcnJvcikge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gJ3JlamVjdGVkJztcbiAgICAgICAgICAgICAgICBmYWlsKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGZ1bGZpbGxlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXMgIT09ICdwZW5kaW5nJztcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHN0YXR1cygpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmV4cG9ydHMuZGVmZXJyZWQgPSBkZWZlcnJlZDtcbi8qKlxuICogQWxpYXMgb2YgdGhlIGV4cG9ydGVkIGBkZWZlcnJlZGAgZnVuY3Rpb24sIHRvIGhlbHAgY29uc3VtZXJzIHdhbnRpbmcgdG8gdXNlIGBkZWZlcnJlZGAgYXMgdGhlXG4gKiBsb2NhbCB2YXJpYWJsZSBuYW1lIHJhdGhlciB0aGFuIHRoZSBmYWN0b3J5IGltcG9ydCBuYW1lLCB3aXRob3V0IG5lZWRpbmcgdG8gcmVuYW1lIG9uIGltcG9ydC5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gaW1wb3J0IHtjcmVhdGVEZWZlcnJlZH0gZnJvbSAnQGt3c2l0ZXMvcHJvbWlzZS1kZWZlcnJlZGA7XG4gYGBgXG4gKi9cbmV4cG9ydHMuY3JlYXRlRGVmZXJyZWQgPSBkZWZlcnJlZDtcbi8qKlxuICogRGVmYXVsdCBleHBvcnQgYWxsb3dzIHVzZSBhczpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gaW1wb3J0IGRlZmVycmVkIGZyb20gJ0Brd3NpdGVzL3Byb21pc2UtZGVmZXJyZWRgO1xuIGBgYFxuICovXG5leHBvcnRzLmRlZmF1bHQgPSBkZWZlcnJlZDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TY2hlZHVsZXIgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgcHJvbWlzZV9kZWZlcnJlZF8xID0gcmVxdWlyZShcIkBrd3NpdGVzL3Byb21pc2UtZGVmZXJyZWRcIik7XG5jb25zdCBnaXRfbG9nZ2VyXzEgPSByZXF1aXJlKFwiLi4vZ2l0LWxvZ2dlclwiKTtcbmNvbnN0IGxvZ2dlciA9IGdpdF9sb2dnZXJfMS5jcmVhdGVMb2dnZXIoJycsICdzY2hlZHVsZXInKTtcbmNvbnN0IGNyZWF0ZVNjaGVkdWxlZFRhc2sgPSAoKCkgPT4ge1xuICAgIGxldCBpZCA9IDA7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWQrKztcbiAgICAgICAgY29uc3QgeyBwcm9taXNlLCBkb25lIH0gPSBwcm9taXNlX2RlZmVycmVkXzEuY3JlYXRlRGVmZXJyZWQoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByb21pc2UsXG4gICAgICAgICAgICBkb25lLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgfTtcbn0pKCk7XG5jbGFzcyBTY2hlZHVsZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvbmN1cnJlbmN5ID0gMikge1xuICAgICAgICB0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG4gICAgICAgIHRoaXMucGVuZGluZyA9IFtdO1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBbXTtcbiAgICAgICAgbG9nZ2VyKGBDb25zdHJ1Y3RlZCwgY29uY3VycmVuY3k9JXNgLCBjb25jdXJyZW5jeSk7XG4gICAgfVxuICAgIHNjaGVkdWxlKCkge1xuICAgICAgICBpZiAoIXRoaXMucGVuZGluZy5sZW5ndGggfHwgdGhpcy5ydW5uaW5nLmxlbmd0aCA+PSB0aGlzLmNvbmN1cnJlbmN5KSB7XG4gICAgICAgICAgICBsb2dnZXIoYFNjaGVkdWxlIGF0dGVtcHQgaWdub3JlZCwgcGVuZGluZz0lcyBydW5uaW5nPSVzIGNvbmN1cnJlbmN5PSVzYCwgdGhpcy5wZW5kaW5nLmxlbmd0aCwgdGhpcy5ydW5uaW5nLmxlbmd0aCwgdGhpcy5jb25jdXJyZW5jeSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFzayA9IHV0aWxzXzEuYXBwZW5kKHRoaXMucnVubmluZywgdGhpcy5wZW5kaW5nLnNoaWZ0KCkpO1xuICAgICAgICBsb2dnZXIoYEF0dGVtcHRpbmcgaWQ9JXNgLCB0YXNrLmlkKTtcbiAgICAgICAgdGFzay5kb25lKCgpID0+IHtcbiAgICAgICAgICAgIGxvZ2dlcihgQ29tcGxldGluZyBpZD1gLCB0YXNrLmlkKTtcbiAgICAgICAgICAgIHV0aWxzXzEucmVtb3ZlKHRoaXMucnVubmluZywgdGFzayk7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBjb25zdCB7IHByb21pc2UsIGlkIH0gPSB1dGlsc18xLmFwcGVuZCh0aGlzLnBlbmRpbmcsIGNyZWF0ZVNjaGVkdWxlZFRhc2soKSk7XG4gICAgICAgIGxvZ2dlcihgU2NoZWR1bGluZyBpZD0lc2AsIGlkKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZSgpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG59XG5leHBvcnRzLlNjaGVkdWxlciA9IFNjaGVkdWxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjaGVkdWxlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNTaW5nbGVCcmFuY2hEZWxldGVGYWlsdXJlID0gZXhwb3J0cy5icmFuY2hEZWxldGlvbkZhaWx1cmUgPSBleHBvcnRzLmJyYW5jaERlbGV0aW9uU3VjY2VzcyA9IGV4cG9ydHMuQnJhbmNoRGVsZXRpb25CYXRjaCA9IHZvaWQgMDtcbmNsYXNzIEJyYW5jaERlbGV0aW9uQmF0Y2gge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFsbCA9IFtdO1xuICAgICAgICB0aGlzLmJyYW5jaGVzID0ge307XG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgfVxuICAgIGdldCBzdWNjZXNzKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZXJyb3JzLmxlbmd0aDtcbiAgICB9XG59XG5leHBvcnRzLkJyYW5jaERlbGV0aW9uQmF0Y2ggPSBCcmFuY2hEZWxldGlvbkJhdGNoO1xuZnVuY3Rpb24gYnJhbmNoRGVsZXRpb25TdWNjZXNzKGJyYW5jaCwgaGFzaCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGJyYW5jaCwgaGFzaCwgc3VjY2VzczogdHJ1ZSxcbiAgICB9O1xufVxuZXhwb3J0cy5icmFuY2hEZWxldGlvblN1Y2Nlc3MgPSBicmFuY2hEZWxldGlvblN1Y2Nlc3M7XG5mdW5jdGlvbiBicmFuY2hEZWxldGlvbkZhaWx1cmUoYnJhbmNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYnJhbmNoLCBoYXNoOiBudWxsLCBzdWNjZXNzOiBmYWxzZSxcbiAgICB9O1xufVxuZXhwb3J0cy5icmFuY2hEZWxldGlvbkZhaWx1cmUgPSBicmFuY2hEZWxldGlvbkZhaWx1cmU7XG5mdW5jdGlvbiBpc1NpbmdsZUJyYW5jaERlbGV0ZUZhaWx1cmUodGVzdCkge1xuICAgIHJldHVybiB0ZXN0LnN1Y2Nlc3M7XG59XG5leHBvcnRzLmlzU2luZ2xlQnJhbmNoRGVsZXRlRmFpbHVyZSA9IGlzU2luZ2xlQnJhbmNoRGVsZXRlRmFpbHVyZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyYW5jaERlbGV0ZVN1bW1hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmhhc0JyYW5jaERlbGV0aW9uRXJyb3IgPSBleHBvcnRzLnBhcnNlQnJhbmNoRGVsZXRpb25zID0gdm9pZCAwO1xuY29uc3QgQnJhbmNoRGVsZXRlU3VtbWFyeV8xID0gcmVxdWlyZShcIi4uL3Jlc3BvbnNlcy9CcmFuY2hEZWxldGVTdW1tYXJ5XCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNvbnN0IGRlbGV0ZVN1Y2Nlc3NSZWdleCA9IC8oXFxTKylcXHMrXFwoXFxTK1xccyhbXildKylcXCkvO1xuY29uc3QgZGVsZXRlRXJyb3JSZWdleCA9IC9eZXJyb3JbXiddKycoW14nXSspJy9tO1xuY29uc3QgcGFyc2VycyA9IFtcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKGRlbGV0ZVN1Y2Nlc3NSZWdleCwgKHJlc3VsdCwgW2JyYW5jaCwgaGFzaF0pID0+IHtcbiAgICAgICAgY29uc3QgZGVsZXRpb24gPSBCcmFuY2hEZWxldGVTdW1tYXJ5XzEuYnJhbmNoRGVsZXRpb25TdWNjZXNzKGJyYW5jaCwgaGFzaCk7XG4gICAgICAgIHJlc3VsdC5hbGwucHVzaChkZWxldGlvbik7XG4gICAgICAgIHJlc3VsdC5icmFuY2hlc1ticmFuY2hdID0gZGVsZXRpb247XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcihkZWxldGVFcnJvclJlZ2V4LCAocmVzdWx0LCBbYnJhbmNoXSkgPT4ge1xuICAgICAgICBjb25zdCBkZWxldGlvbiA9IEJyYW5jaERlbGV0ZVN1bW1hcnlfMS5icmFuY2hEZWxldGlvbkZhaWx1cmUoYnJhbmNoKTtcbiAgICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKGRlbGV0aW9uKTtcbiAgICAgICAgcmVzdWx0LmFsbC5wdXNoKGRlbGV0aW9uKTtcbiAgICAgICAgcmVzdWx0LmJyYW5jaGVzW2JyYW5jaF0gPSBkZWxldGlvbjtcbiAgICB9KSxcbl07XG5jb25zdCBwYXJzZUJyYW5jaERlbGV0aW9ucyA9IChzdGRPdXQpID0+IHtcbiAgICByZXR1cm4gdXRpbHNfMS5wYXJzZVN0cmluZ1Jlc3BvbnNlKG5ldyBCcmFuY2hEZWxldGVTdW1tYXJ5XzEuQnJhbmNoRGVsZXRpb25CYXRjaCgpLCBwYXJzZXJzLCBzdGRPdXQpO1xufTtcbmV4cG9ydHMucGFyc2VCcmFuY2hEZWxldGlvbnMgPSBwYXJzZUJyYW5jaERlbGV0aW9ucztcbmZ1bmN0aW9uIGhhc0JyYW5jaERlbGV0aW9uRXJyb3IoZGF0YSwgcHJvY2Vzc0V4aXRDb2RlKSB7XG4gICAgcmV0dXJuIHByb2Nlc3NFeGl0Q29kZSA9PT0gdXRpbHNfMS5FeGl0Q29kZXMuRVJST1IgJiYgZGVsZXRlRXJyb3JSZWdleC50ZXN0KGRhdGEpO1xufVxuZXhwb3J0cy5oYXNCcmFuY2hEZWxldGlvbkVycm9yID0gaGFzQnJhbmNoRGVsZXRpb25FcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLWJyYW5jaC1kZWxldGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJyYW5jaFN1bW1hcnlSZXN1bHQgPSB2b2lkIDA7XG5jbGFzcyBCcmFuY2hTdW1tYXJ5UmVzdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hbGwgPSBbXTtcbiAgICAgICAgdGhpcy5icmFuY2hlcyA9IHt9O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSAnJztcbiAgICAgICAgdGhpcy5kZXRhY2hlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBwdXNoKGN1cnJlbnQsIGRldGFjaGVkLCBuYW1lLCBjb21taXQsIGxhYmVsKSB7XG4gICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaGVkID0gZGV0YWNoZWQ7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsLnB1c2gobmFtZSk7XG4gICAgICAgIHRoaXMuYnJhbmNoZXNbbmFtZV0gPSB7XG4gICAgICAgICAgICBjdXJyZW50OiBjdXJyZW50LFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGNvbW1pdDogY29tbWl0LFxuICAgICAgICAgICAgbGFiZWw6IGxhYmVsXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5CcmFuY2hTdW1tYXJ5UmVzdWx0ID0gQnJhbmNoU3VtbWFyeVJlc3VsdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyYW5jaFN1bW1hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlQnJhbmNoU3VtbWFyeSA9IHZvaWQgMDtcbmNvbnN0IEJyYW5jaFN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvQnJhbmNoU3VtbWFyeVwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL14oXFwqXFxzKT9cXCgoPzpIRUFEICk/ZGV0YWNoZWQgKD86ZnJvbXxhdCkgKFxcUyspXFwpXFxzKyhbYS16MC05XSspXFxzKC4qKSQvLCAocmVzdWx0LCBbY3VycmVudCwgbmFtZSwgY29tbWl0LCBsYWJlbF0pID0+IHtcbiAgICAgICAgcmVzdWx0LnB1c2goISFjdXJyZW50LCB0cnVlLCBuYW1lLCBjb21taXQsIGxhYmVsKTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eKFxcKlxccyk/KFxcUyspXFxzKyhbYS16MC05XSspXFxzKC4qKSQvLCAocmVzdWx0LCBbY3VycmVudCwgbmFtZSwgY29tbWl0LCBsYWJlbF0pID0+IHtcbiAgICAgICAgcmVzdWx0LnB1c2goISFjdXJyZW50LCBmYWxzZSwgbmFtZSwgY29tbWl0LCBsYWJlbCk7XG4gICAgfSlcbl07XG5mdW5jdGlvbiBwYXJzZUJyYW5jaFN1bW1hcnkoc3RkT3V0KSB7XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZShuZXcgQnJhbmNoU3VtbWFyeV8xLkJyYW5jaFN1bW1hcnlSZXN1bHQoKSwgcGFyc2Vycywgc3RkT3V0KTtcbn1cbmV4cG9ydHMucGFyc2VCcmFuY2hTdW1tYXJ5ID0gcGFyc2VCcmFuY2hTdW1tYXJ5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2UtYnJhbmNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWxldGVCcmFuY2hUYXNrID0gZXhwb3J0cy5kZWxldGVCcmFuY2hlc1Rhc2sgPSBleHBvcnRzLmJyYW5jaExvY2FsVGFzayA9IGV4cG9ydHMuYnJhbmNoVGFzayA9IGV4cG9ydHMuY29udGFpbnNEZWxldGVCcmFuY2hDb21tYW5kID0gdm9pZCAwO1xuY29uc3QgZ2l0X3Jlc3BvbnNlX2Vycm9yXzEgPSByZXF1aXJlKFwiLi4vZXJyb3JzL2dpdC1yZXNwb25zZS1lcnJvclwiKTtcbmNvbnN0IHBhcnNlX2JyYW5jaF9kZWxldGVfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLWJyYW5jaC1kZWxldGVcIik7XG5jb25zdCBwYXJzZV9icmFuY2hfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLWJyYW5jaFwiKTtcbmZ1bmN0aW9uIGNvbnRhaW5zRGVsZXRlQnJhbmNoQ29tbWFuZChjb21tYW5kcykge1xuICAgIGNvbnN0IGRlbGV0ZUNvbW1hbmRzID0gWyctZCcsICctRCcsICctLWRlbGV0ZSddO1xuICAgIHJldHVybiBjb21tYW5kcy5zb21lKGNvbW1hbmQgPT4gZGVsZXRlQ29tbWFuZHMuaW5jbHVkZXMoY29tbWFuZCkpO1xufVxuZXhwb3J0cy5jb250YWluc0RlbGV0ZUJyYW5jaENvbW1hbmQgPSBjb250YWluc0RlbGV0ZUJyYW5jaENvbW1hbmQ7XG5mdW5jdGlvbiBicmFuY2hUYXNrKGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBpc0RlbGV0ZSA9IGNvbnRhaW5zRGVsZXRlQnJhbmNoQ29tbWFuZChjdXN0b21BcmdzKTtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsnYnJhbmNoJywgLi4uY3VzdG9tQXJnc107XG4gICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCctYScpO1xuICAgIH1cbiAgICBpZiAoIWNvbW1hbmRzLmluY2x1ZGVzKCctdicpKSB7XG4gICAgICAgIGNvbW1hbmRzLnNwbGljZSgxLCAwLCAnLXYnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgcGFyc2VyKHN0ZE91dCwgc3RkRXJyKSB7XG4gICAgICAgICAgICBpZiAoaXNEZWxldGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VfYnJhbmNoX2RlbGV0ZV8xLnBhcnNlQnJhbmNoRGVsZXRpb25zKHN0ZE91dCwgc3RkRXJyKS5hbGxbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VfYnJhbmNoXzEucGFyc2VCcmFuY2hTdW1tYXJ5KHN0ZE91dCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmV4cG9ydHMuYnJhbmNoVGFzayA9IGJyYW5jaFRhc2s7XG5mdW5jdGlvbiBicmFuY2hMb2NhbFRhc2soKSB7XG4gICAgY29uc3QgcGFyc2VyID0gcGFyc2VfYnJhbmNoXzEucGFyc2VCcmFuY2hTdW1tYXJ5O1xuICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgY29tbWFuZHM6IFsnYnJhbmNoJywgJy12J10sXG4gICAgICAgIHBhcnNlcixcbiAgICB9O1xufVxuZXhwb3J0cy5icmFuY2hMb2NhbFRhc2sgPSBicmFuY2hMb2NhbFRhc2s7XG5mdW5jdGlvbiBkZWxldGVCcmFuY2hlc1Rhc2soYnJhbmNoZXMsIGZvcmNlRGVsZXRlID0gZmFsc2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIGNvbW1hbmRzOiBbJ2JyYW5jaCcsICctdicsIGZvcmNlRGVsZXRlID8gJy1EJyA6ICctZCcsIC4uLmJyYW5jaGVzXSxcbiAgICAgICAgcGFyc2VyKHN0ZE91dCwgc3RkRXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VfYnJhbmNoX2RlbGV0ZV8xLnBhcnNlQnJhbmNoRGVsZXRpb25zKHN0ZE91dCwgc3RkRXJyKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcihleGl0Q29kZSwgZXJyb3IsIGRvbmUsIGZhaWwpIHtcbiAgICAgICAgICAgIGlmICghcGFyc2VfYnJhbmNoX2RlbGV0ZV8xLmhhc0JyYW5jaERlbGV0aW9uRXJyb3IoZXJyb3IsIGV4aXRDb2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbmUoZXJyb3IpO1xuICAgICAgICB9LFxuICAgICAgICBjb25jYXRTdGRFcnI6IHRydWUsXG4gICAgfTtcbn1cbmV4cG9ydHMuZGVsZXRlQnJhbmNoZXNUYXNrID0gZGVsZXRlQnJhbmNoZXNUYXNrO1xuZnVuY3Rpb24gZGVsZXRlQnJhbmNoVGFzayhicmFuY2gsIGZvcmNlRGVsZXRlID0gZmFsc2UpIHtcbiAgICBjb25zdCB0YXNrID0ge1xuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIGNvbW1hbmRzOiBbJ2JyYW5jaCcsICctdicsIGZvcmNlRGVsZXRlID8gJy1EJyA6ICctZCcsIGJyYW5jaF0sXG4gICAgICAgIHBhcnNlcihzdGRPdXQsIHN0ZEVycikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlX2JyYW5jaF9kZWxldGVfMS5wYXJzZUJyYW5jaERlbGV0aW9ucyhzdGRPdXQsIHN0ZEVycikuYnJhbmNoZXNbYnJhbmNoXTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcihleGl0Q29kZSwgZXJyb3IsIF8sIGZhaWwpIHtcbiAgICAgICAgICAgIGlmICghcGFyc2VfYnJhbmNoX2RlbGV0ZV8xLmhhc0JyYW5jaERlbGV0aW9uRXJyb3IoZXJyb3IsIGV4aXRDb2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBnaXRfcmVzcG9uc2VfZXJyb3JfMS5HaXRSZXNwb25zZUVycm9yKHRhc2sucGFyc2VyKGVycm9yLCAnJyksIGVycm9yKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uY2F0U3RkRXJyOiB0cnVlLFxuICAgIH07XG4gICAgcmV0dXJuIHRhc2s7XG59XG5leHBvcnRzLmRlbGV0ZUJyYW5jaFRhc2sgPSBkZWxldGVCcmFuY2hUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJhbmNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50YXNrQ2FsbGJhY2sgPSB2b2lkIDA7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuL2FwaVwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmZ1bmN0aW9uIHRhc2tDYWxsYmFjayh0YXNrLCByZXNwb25zZSwgY2FsbGJhY2sgPSB1dGlsc18xLk5PT1ApIHtcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YSkgPT4ge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIGlmICgoZXJyID09PSBudWxsIHx8IGVyciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyLnRhc2spID09PSB0YXNrKSB7XG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgYXBpXzEuR2l0UmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhhZGREZXByZWNhdGlvbk5vdGljZVRvRXJyb3IoZXJyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXNwb25zZS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7XG59XG5leHBvcnRzLnRhc2tDYWxsYmFjayA9IHRhc2tDYWxsYmFjaztcbmZ1bmN0aW9uIGFkZERlcHJlY2F0aW9uTm90aWNlVG9FcnJvcihlcnIpIHtcbiAgICBsZXQgbG9nID0gKG5hbWUpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKGBzaW1wbGUtZ2l0IGRlcHJlY2F0aW9uIG5vdGljZTogYWNjZXNzaW5nIEdpdFJlc3BvbnNlRXJyb3IuJHtuYW1lfSBzaG91bGQgYmUgR2l0UmVzcG9uc2VFcnJvci5naXQuJHtuYW1lfSwgdGhpcyB3aWxsIG5vIGxvbmdlciBiZSBhdmFpbGFibGUgaW4gdmVyc2lvbiAzYCk7XG4gICAgICAgIGxvZyA9IHV0aWxzXzEuTk9PUDtcbiAgICB9O1xuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKGVyciwgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXJyLmdpdCkucmVkdWNlKGRlc2NyaXB0b3JSZWR1Y2VyLCB7fSkpO1xuICAgIGZ1bmN0aW9uIGRlc2NyaXB0b3JSZWR1Y2VyKGFsbCwgbmFtZSkge1xuICAgICAgICBpZiAobmFtZSBpbiBlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGw7XG4gICAgICAgIH1cbiAgICAgICAgYWxsW25hbWVdID0ge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgIGxvZyhuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyLmdpdFtuYW1lXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBhbGw7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFzay1jYWxsYmFjay5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2xvbmVNaXJyb3JUYXNrID0gZXhwb3J0cy5jbG9uZVRhc2sgPSB2b2lkIDA7XG5jb25zdCB0YXNrXzEgPSByZXF1aXJlKFwiLi90YXNrXCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmZ1bmN0aW9uIGNsb25lVGFzayhyZXBvLCBkaXJlY3RvcnksIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsnY2xvbmUnLCAuLi5jdXN0b21BcmdzXTtcbiAgICBpZiAodHlwZW9mIHJlcG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2gocmVwbyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlyZWN0b3J5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb21tYW5kcy5wdXNoKGRpcmVjdG9yeSk7XG4gICAgfVxuICAgIHJldHVybiB0YXNrXzEuc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhjb21tYW5kcyk7XG59XG5leHBvcnRzLmNsb25lVGFzayA9IGNsb25lVGFzaztcbmZ1bmN0aW9uIGNsb25lTWlycm9yVGFzayhyZXBvLCBkaXJlY3RvcnksIGN1c3RvbUFyZ3MpIHtcbiAgICB1dGlsc18xLmFwcGVuZChjdXN0b21BcmdzLCAnLS1taXJyb3InKTtcbiAgICByZXR1cm4gY2xvbmVUYXNrKHJlcG8sIGRpcmVjdG9yeSwgY3VzdG9tQXJncyk7XG59XG5leHBvcnRzLmNsb25lTWlycm9yVGFzayA9IGNsb25lTWlycm9yVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsb25lLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jb25maWdMaXN0UGFyc2VyID0gZXhwb3J0cy5Db25maWdMaXN0ID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNsYXNzIENvbmZpZ0xpc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmZpbGVzID0gW107XG4gICAgICAgIHRoaXMudmFsdWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gICAgZ2V0IGFsbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9hbGwpIHtcbiAgICAgICAgICAgIHRoaXMuX2FsbCA9IHRoaXMuZmlsZXMucmVkdWNlKChhbGwsIGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhbGwsIHRoaXMudmFsdWVzW2ZpbGVdKTtcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWxsO1xuICAgIH1cbiAgICBhZGRGaWxlKGZpbGUpIHtcbiAgICAgICAgaWYgKCEoZmlsZSBpbiB0aGlzLnZhbHVlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhdGVzdCA9IHV0aWxzXzEubGFzdCh0aGlzLmZpbGVzKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzW2ZpbGVdID0gbGF0ZXN0ID8gT2JqZWN0LmNyZWF0ZSh0aGlzLnZhbHVlc1tsYXRlc3RdKSA6IHt9O1xuICAgICAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlc1tmaWxlXTtcbiAgICB9XG4gICAgYWRkVmFsdWUoZmlsZSwga2V5LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmFkZEZpbGUoZmlsZSk7XG4gICAgICAgIGlmICghdmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXNba2V5XSkpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSBbdmFsdWVzW2tleV0sIHZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hbGwgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuZXhwb3J0cy5Db25maWdMaXN0ID0gQ29uZmlnTGlzdDtcbmZ1bmN0aW9uIGNvbmZpZ0xpc3RQYXJzZXIodGV4dCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBDb25maWdMaXN0KCk7XG4gICAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXDAnKTtcbiAgICBmb3IgKGxldCBpID0gMCwgbWF4ID0gbGluZXMubGVuZ3RoIC0gMTsgaSA8IG1heDspIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IGNvbmZpZ0ZpbGVQYXRoKGxpbmVzW2krK10pO1xuICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSB1dGlsc18xLnNwbGl0T24obGluZXNbaSsrXSwgJ1xcbicpO1xuICAgICAgICBjb25maWcuYWRkVmFsdWUoZmlsZSwga2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59XG5leHBvcnRzLmNvbmZpZ0xpc3RQYXJzZXIgPSBjb25maWdMaXN0UGFyc2VyO1xuZnVuY3Rpb24gY29uZmlnRmlsZVBhdGgoZmlsZVBhdGgpIHtcbiAgICByZXR1cm4gZmlsZVBhdGgucmVwbGFjZSgvXihmaWxlKTovLCAnJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25maWdMaXN0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5saXN0Q29uZmlnVGFzayA9IGV4cG9ydHMuYWRkQ29uZmlnVGFzayA9IHZvaWQgMDtcbmNvbnN0IENvbmZpZ0xpc3RfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvQ29uZmlnTGlzdFwiKTtcbmZ1bmN0aW9uIGFkZENvbmZpZ1Rhc2soa2V5LCB2YWx1ZSwgYXBwZW5kID0gZmFsc2UpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsnY29uZmlnJywgJy0tbG9jYWwnXTtcbiAgICBpZiAoYXBwZW5kKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJy0tYWRkJyk7XG4gICAgfVxuICAgIGNvbW1hbmRzLnB1c2goa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyKHRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMuYWRkQ29uZmlnVGFzayA9IGFkZENvbmZpZ1Rhc2s7XG5mdW5jdGlvbiBsaXN0Q29uZmlnVGFzaygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogWydjb25maWcnLCAnLS1saXN0JywgJy0tc2hvdy1vcmlnaW4nLCAnLS1udWxsJ10sXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyKHRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBDb25maWdMaXN0XzEuY29uZmlnTGlzdFBhcnNlcih0ZXh0KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0cy5saXN0Q29uZmlnVGFzayA9IGxpc3RDb25maWdUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZmlnLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZUNvbW1pdFJlc3VsdCA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL1xcWyhbXlxcc10rKSAoW15cXF1dKykvLCAocmVzdWx0LCBbYnJhbmNoLCBjb21taXRdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5icmFuY2ggPSBicmFuY2g7XG4gICAgICAgIHJlc3VsdC5jb21taXQgPSBjb21taXQ7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXFxzKkF1dGhvcjpcXHMoLispL2ksIChyZXN1bHQsIFthdXRob3JdKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gYXV0aG9yLnNwbGl0KCc8Jyk7XG4gICAgICAgIGNvbnN0IGVtYWlsID0gcGFydHMucG9wKCk7XG4gICAgICAgIGlmICghZW1haWwgfHwgIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQuYXV0aG9yID0ge1xuICAgICAgICAgICAgZW1haWw6IGVtYWlsLnN1YnN0cigwLCBlbWFpbC5sZW5ndGggLSAxKSxcbiAgICAgICAgICAgIG5hbWU6IHBhcnRzLmpvaW4oJzwnKS50cmltKClcbiAgICAgICAgfTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC8oXFxkKylbXixdKig/OixcXHMqKFxcZCspW14sXSopKD86LFxccyooXFxkKykpL2csIChyZXN1bHQsIFtjaGFuZ2VzLCBpbnNlcnRpb25zLCBkZWxldGlvbnNdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5zdW1tYXJ5LmNoYW5nZXMgPSBwYXJzZUludChjaGFuZ2VzLCAxMCkgfHwgMDtcbiAgICAgICAgcmVzdWx0LnN1bW1hcnkuaW5zZXJ0aW9ucyA9IHBhcnNlSW50KGluc2VydGlvbnMsIDEwKSB8fCAwO1xuICAgICAgICByZXN1bHQuc3VtbWFyeS5kZWxldGlvbnMgPSBwYXJzZUludChkZWxldGlvbnMsIDEwKSB8fCAwO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL14oXFxkKylbXixdKig/OixcXHMqKFxcZCspW14oXStcXCgoWystXSkpPy8sIChyZXN1bHQsIFtjaGFuZ2VzLCBsaW5lcywgZGlyZWN0aW9uXSkgPT4ge1xuICAgICAgICByZXN1bHQuc3VtbWFyeS5jaGFuZ2VzID0gcGFyc2VJbnQoY2hhbmdlcywgMTApIHx8IDA7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcGFyc2VJbnQobGluZXMsIDEwKSB8fCAwO1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnLScpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdW1tYXJ5LmRlbGV0aW9ucyA9IGNvdW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJysnKSB7XG4gICAgICAgICAgICByZXN1bHQuc3VtbWFyeS5pbnNlcnRpb25zID0gY291bnQ7XG4gICAgICAgIH1cbiAgICB9KSxcbl07XG5mdW5jdGlvbiBwYXJzZUNvbW1pdFJlc3VsdChzdGRPdXQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIGF1dGhvcjogbnVsbCxcbiAgICAgICAgYnJhbmNoOiAnJyxcbiAgICAgICAgY29tbWl0OiAnJyxcbiAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgY2hhbmdlczogMCxcbiAgICAgICAgICAgIGluc2VydGlvbnM6IDAsXG4gICAgICAgICAgICBkZWxldGlvbnM6IDAsXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gdXRpbHNfMS5wYXJzZVN0cmluZ1Jlc3BvbnNlKHJlc3VsdCwgcGFyc2Vycywgc3RkT3V0KTtcbn1cbmV4cG9ydHMucGFyc2VDb21taXRSZXN1bHQgPSBwYXJzZUNvbW1pdFJlc3VsdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLWNvbW1pdC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY29tbWl0VGFzayA9IHZvaWQgMDtcbmNvbnN0IHBhcnNlX2NvbW1pdF8xID0gcmVxdWlyZShcIi4uL3BhcnNlcnMvcGFyc2UtY29tbWl0XCIpO1xuZnVuY3Rpb24gY29tbWl0VGFzayhtZXNzYWdlLCBmaWxlcywgY3VzdG9tQXJncykge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgICAgICAnY29tbWl0JyxcbiAgICAgICAgLi4uKG1lc3NhZ2UuZmxhdE1hcChtID0+IFsnLW0nLCBtXSkpLFxuICAgICAgICAuLi5maWxlcyxcbiAgICAgICAgLi4uY3VzdG9tQXJncyxcbiAgICBdO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcjogcGFyc2VfY29tbWl0XzEucGFyc2VDb21taXRSZXN1bHQsXG4gICAgfTtcbn1cbmV4cG9ydHMuY29tbWl0VGFzayA9IGNvbW1pdFRhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21taXQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRpZmZTdW1tYXJ5ID0gdm9pZCAwO1xuLyoqKlxuICogVGhlIERpZmZTdW1tYXJ5IGlzIHJldHVybmVkIGFzIGEgcmVzcG9uc2UgdG8gZ2V0dGluZyBgZ2l0KCkuc3RhdHVzKClgXG4gKi9cbmNsYXNzIERpZmZTdW1tYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gMDtcbiAgICAgICAgdGhpcy5kZWxldGlvbnMgPSAwO1xuICAgICAgICB0aGlzLmluc2VydGlvbnMgPSAwO1xuICAgICAgICB0aGlzLmZpbGVzID0gW107XG4gICAgfVxufVxuZXhwb3J0cy5EaWZmU3VtbWFyeSA9IERpZmZTdW1tYXJ5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGlmZlN1bW1hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlRGlmZlJlc3VsdCA9IHZvaWQgMDtcbmNvbnN0IERpZmZTdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcmVzcG9uc2VzL0RpZmZTdW1tYXJ5XCIpO1xuZnVuY3Rpb24gcGFyc2VEaWZmUmVzdWx0KHN0ZE91dCkge1xuICAgIGNvbnN0IGxpbmVzID0gc3RkT3V0LnRyaW0oKS5zcGxpdCgnXFxuJyk7XG4gICAgY29uc3Qgc3RhdHVzID0gbmV3IERpZmZTdW1tYXJ5XzEuRGlmZlN1bW1hcnkoKTtcbiAgICByZWFkU3VtbWFyeUxpbmUoc3RhdHVzLCBsaW5lcy5wb3AoKSk7XG4gICAgZm9yIChsZXQgaSA9IDAsIG1heCA9IGxpbmVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgdGV4dEZpbGVDaGFuZ2UobGluZSwgc3RhdHVzKSB8fCBiaW5hcnlGaWxlQ2hhbmdlKGxpbmUsIHN0YXR1cyk7XG4gICAgfVxuICAgIHJldHVybiBzdGF0dXM7XG59XG5leHBvcnRzLnBhcnNlRGlmZlJlc3VsdCA9IHBhcnNlRGlmZlJlc3VsdDtcbmZ1bmN0aW9uIHJlYWRTdW1tYXJ5TGluZShzdGF0dXMsIHN1bW1hcnkpIHtcbiAgICAoc3VtbWFyeSB8fCAnJylcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuc3BsaXQoJywgJylcbiAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IC8oXFxkKylcXHMoW2Etel0rKS8uZXhlYyh0ZXh0KTtcbiAgICAgICAgaWYgKCFzdW1tYXJ5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3VtbWFyeVR5cGUoc3RhdHVzLCBzdW1tYXJ5WzJdLCBwYXJzZUludChzdW1tYXJ5WzFdLCAxMCkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gc3VtbWFyeVR5cGUoc3RhdHVzLCBrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSAoLyhbYS16XSs/KXM/XFxiLy5leGVjKGtleSkpO1xuICAgIGlmICghbWF0Y2ggfHwgIXN0YXR1c1VwZGF0ZVttYXRjaFsxXV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0dXNVcGRhdGVbbWF0Y2hbMV1dKHN0YXR1cywgdmFsdWUpO1xufVxuY29uc3Qgc3RhdHVzVXBkYXRlID0ge1xuICAgIGZpbGUoc3RhdHVzLCB2YWx1ZSkge1xuICAgICAgICBzdGF0dXMuY2hhbmdlZCA9IHZhbHVlO1xuICAgIH0sXG4gICAgZGVsZXRpb24oc3RhdHVzLCB2YWx1ZSkge1xuICAgICAgICBzdGF0dXMuZGVsZXRpb25zID0gdmFsdWU7XG4gICAgfSxcbiAgICBpbnNlcnRpb24oc3RhdHVzLCB2YWx1ZSkge1xuICAgICAgICBzdGF0dXMuaW5zZXJ0aW9ucyA9IHZhbHVlO1xuICAgIH1cbn07XG5mdW5jdGlvbiB0ZXh0RmlsZUNoYW5nZShpbnB1dCwgeyBmaWxlcyB9KSB7XG4gICAgY29uc3QgbGluZSA9IGlucHV0LnRyaW0oKS5tYXRjaCgvXiguKylcXHMrXFx8XFxzKyhcXGQrKShcXHMrWytcXC1dKyk/JC8pO1xuICAgIGlmIChsaW5lKSB7XG4gICAgICAgIHZhciBhbHRlcmF0aW9ucyA9IChsaW5lWzNdIHx8ICcnKS50cmltKCk7XG4gICAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICAgICAgZmlsZTogbGluZVsxXS50cmltKCksXG4gICAgICAgICAgICBjaGFuZ2VzOiBwYXJzZUludChsaW5lWzJdLCAxMCksXG4gICAgICAgICAgICBpbnNlcnRpb25zOiBhbHRlcmF0aW9ucy5yZXBsYWNlKC8tL2csICcnKS5sZW5ndGgsXG4gICAgICAgICAgICBkZWxldGlvbnM6IGFsdGVyYXRpb25zLnJlcGxhY2UoL1xcKy9nLCAnJykubGVuZ3RoLFxuICAgICAgICAgICAgYmluYXJ5OiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGJpbmFyeUZpbGVDaGFuZ2UoaW5wdXQsIHsgZmlsZXMgfSkge1xuICAgIGNvbnN0IGxpbmUgPSBpbnB1dC5tYXRjaCgvXiguKykgXFx8XFxzK0JpbiAoWzAtOS5dKykgLT4gKFswLTkuXSspIChbYS16XSspJC8pO1xuICAgIGlmIChsaW5lKSB7XG4gICAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICAgICAgZmlsZTogbGluZVsxXS50cmltKCksXG4gICAgICAgICAgICBiZWZvcmU6ICtsaW5lWzJdLFxuICAgICAgICAgICAgYWZ0ZXI6ICtsaW5lWzNdLFxuICAgICAgICAgICAgYmluYXJ5OiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2UtZGlmZi1zdW1tYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kaWZmU3VtbWFyeVRhc2sgPSB2b2lkIDA7XG5jb25zdCBwYXJzZV9kaWZmX3N1bW1hcnlfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLWRpZmYtc3VtbWFyeVwiKTtcbmZ1bmN0aW9uIGRpZmZTdW1tYXJ5VGFzayhjdXN0b21BcmdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHM6IFsnZGlmZicsICctLXN0YXQ9NDA5NicsIC4uLmN1c3RvbUFyZ3NdLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcihzdGRPdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZV9kaWZmX3N1bW1hcnlfMS5wYXJzZURpZmZSZXN1bHQoc3RkT3V0KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnRzLmRpZmZTdW1tYXJ5VGFzayA9IGRpZmZTdW1tYXJ5VGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpZmYuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlRmV0Y2hSZXN1bHQgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgcGFyc2VycyA9IFtcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9Gcm9tICguKykkLywgKHJlc3VsdCwgW3JlbW90ZV0pID0+IHtcbiAgICAgICAgcmVzdWx0LnJlbW90ZSA9IHJlbW90ZTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9cXCogXFxbbmV3IGJyYW5jaF1cXHMrKFxcUyspXFxzKi0+ICguKykkLywgKHJlc3VsdCwgW25hbWUsIHRyYWNraW5nXSkgPT4ge1xuICAgICAgICByZXN1bHQuYnJhbmNoZXMucHVzaCh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdHJhY2tpbmcsXG4gICAgICAgIH0pO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL1xcKiBcXFtuZXcgdGFnXVxccysoXFxTKylcXHMqLT4gKC4rKSQvLCAocmVzdWx0LCBbbmFtZSwgdHJhY2tpbmddKSA9PiB7XG4gICAgICAgIHJlc3VsdC50YWdzLnB1c2goe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRyYWNraW5nLFxuICAgICAgICB9KTtcbiAgICB9KVxuXTtcbmZ1bmN0aW9uIHBhcnNlRmV0Y2hSZXN1bHQoc3RkT3V0LCBzdGRFcnIpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIHJhdzogc3RkT3V0LFxuICAgICAgICByZW1vdGU6IG51bGwsXG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgICAgdGFnczogW10sXG4gICAgfTtcbiAgICByZXR1cm4gdXRpbHNfMS5wYXJzZVN0cmluZ1Jlc3BvbnNlKHJlc3VsdCwgcGFyc2Vycywgc3RkT3V0LCBzdGRFcnIpO1xufVxuZXhwb3J0cy5wYXJzZUZldGNoUmVzdWx0ID0gcGFyc2VGZXRjaFJlc3VsdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLWZldGNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5mZXRjaFRhc2sgPSB2b2lkIDA7XG5jb25zdCBwYXJzZV9mZXRjaF8xID0gcmVxdWlyZShcIi4uL3BhcnNlcnMvcGFyc2UtZmV0Y2hcIik7XG5mdW5jdGlvbiBmZXRjaFRhc2socmVtb3RlLCBicmFuY2gsIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsnZmV0Y2gnLCAuLi5jdXN0b21BcmdzXTtcbiAgICBpZiAocmVtb3RlICYmIGJyYW5jaCkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKHJlbW90ZSwgYnJhbmNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyOiBwYXJzZV9mZXRjaF8xLnBhcnNlRmV0Y2hSZXN1bHQsXG4gICAgfTtcbn1cbmV4cG9ydHMuZmV0Y2hUYXNrID0gZmV0Y2hUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmV0Y2guanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmhhc2hPYmplY3RUYXNrID0gdm9pZCAwO1xuY29uc3QgdGFza18xID0gcmVxdWlyZShcIi4vdGFza1wiKTtcbi8qKlxuICogVGFzayB1c2VkIGJ5IGBnaXQuaGFzaE9iamVjdGBcbiAqL1xuZnVuY3Rpb24gaGFzaE9iamVjdFRhc2soZmlsZVBhdGgsIHdyaXRlKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbJ2hhc2gtb2JqZWN0JywgZmlsZVBhdGhdO1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCctdycpO1xuICAgIH1cbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMsIHRydWUpO1xufVxuZXhwb3J0cy5oYXNoT2JqZWN0VGFzayA9IGhhc2hPYmplY3RUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC1vYmplY3QuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlSW5pdCA9IGV4cG9ydHMuSW5pdFN1bW1hcnkgPSB2b2lkIDA7XG5jbGFzcyBJbml0U3VtbWFyeSB7XG4gICAgY29uc3RydWN0b3IoYmFyZSwgcGF0aCwgZXhpc3RpbmcsIGdpdERpcikge1xuICAgICAgICB0aGlzLmJhcmUgPSBiYXJlO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLmV4aXN0aW5nID0gZXhpc3Rpbmc7XG4gICAgICAgIHRoaXMuZ2l0RGlyID0gZ2l0RGlyO1xuICAgIH1cbn1cbmV4cG9ydHMuSW5pdFN1bW1hcnkgPSBJbml0U3VtbWFyeTtcbmNvbnN0IGluaXRSZXNwb25zZVJlZ2V4ID0gL15Jbml0LisgcmVwb3NpdG9yeSBpbiAoLispJC87XG5jb25zdCByZUluaXRSZXNwb25zZVJlZ2V4ID0gL15SZWluLisgaW4gKC4rKSQvO1xuZnVuY3Rpb24gcGFyc2VJbml0KGJhcmUsIHBhdGgsIHRleHQpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IFN0cmluZyh0ZXh0KS50cmltKCk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoKHJlc3VsdCA9IGluaXRSZXNwb25zZVJlZ2V4LmV4ZWMocmVzcG9uc2UpKSkge1xuICAgICAgICByZXR1cm4gbmV3IEluaXRTdW1tYXJ5KGJhcmUsIHBhdGgsIGZhbHNlLCByZXN1bHRbMV0pO1xuICAgIH1cbiAgICBpZiAoKHJlc3VsdCA9IHJlSW5pdFJlc3BvbnNlUmVnZXguZXhlYyhyZXNwb25zZSkpKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5pdFN1bW1hcnkoYmFyZSwgcGF0aCwgdHJ1ZSwgcmVzdWx0WzFdKTtcbiAgICB9XG4gICAgbGV0IGdpdERpciA9ICcnO1xuICAgIGNvbnN0IHRva2VucyA9IHJlc3BvbnNlLnNwbGl0KCcgJyk7XG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKTtcbiAgICAgICAgaWYgKHRva2VuID09PSAnaW4nKSB7XG4gICAgICAgICAgICBnaXREaXIgPSB0b2tlbnMuam9pbignICcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbml0U3VtbWFyeShiYXJlLCBwYXRoLCAvXnJlL2kudGVzdChyZXNwb25zZSksIGdpdERpcik7XG59XG5leHBvcnRzLnBhcnNlSW5pdCA9IHBhcnNlSW5pdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUluaXRTdW1tYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pbml0VGFzayA9IHZvaWQgMDtcbmNvbnN0IEluaXRTdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcmVzcG9uc2VzL0luaXRTdW1tYXJ5XCIpO1xuY29uc3QgYmFyZUNvbW1hbmQgPSAnLS1iYXJlJztcbmZ1bmN0aW9uIGhhc0JhcmVDb21tYW5kKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcyhiYXJlQ29tbWFuZCk7XG59XG5mdW5jdGlvbiBpbml0VGFzayhiYXJlID0gZmFsc2UsIHBhdGgsIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsnaW5pdCcsIC4uLmN1c3RvbUFyZ3NdO1xuICAgIGlmIChiYXJlICYmICFoYXNCYXJlQ29tbWFuZChjb21tYW5kcykpIHtcbiAgICAgICAgY29tbWFuZHMuc3BsaWNlKDEsIDAsIGJhcmVDb21tYW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGNvbmNhdFN0ZEVycjogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyKHRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBJbml0U3VtbWFyeV8xLnBhcnNlSW5pdChjb21tYW5kcy5pbmNsdWRlcygnLS1iYXJlJyksIHBhdGgsIHRleHQpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMuaW5pdFRhc2sgPSBpbml0VGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluaXQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUxpc3RMb2dTdW1tYXJ5UGFyc2VyID0gZXhwb3J0cy5TUExJVFRFUiA9IGV4cG9ydHMuQ09NTUlUX0JPVU5EQVJZID0gZXhwb3J0cy5TVEFSVF9CT1VOREFSWSA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwYXJzZV9kaWZmX3N1bW1hcnlfMSA9IHJlcXVpcmUoXCIuL3BhcnNlLWRpZmYtc3VtbWFyeVwiKTtcbmV4cG9ydHMuU1RBUlRfQk9VTkRBUlkgPSAnw7LDssOyw7LDssOyICc7XG5leHBvcnRzLkNPTU1JVF9CT1VOREFSWSA9ICcgw7LDsic7XG5leHBvcnRzLlNQTElUVEVSID0gJyDDsiAnO1xuY29uc3QgZGVmYXVsdEZpZWxkTmFtZXMgPSBbJ2hhc2gnLCAnZGF0ZScsICdtZXNzYWdlJywgJ3JlZnMnLCAnYXV0aG9yX25hbWUnLCAnYXV0aG9yX2VtYWlsJ107XG5mdW5jdGlvbiBsaW5lQnVpbGRlcih0b2tlbnMsIGZpZWxkcykge1xuICAgIHJldHVybiBmaWVsZHMucmVkdWNlKChsaW5lLCBmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgbGluZVtmaWVsZF0gPSB0b2tlbnNbaW5kZXhdIHx8ICcnO1xuICAgICAgICByZXR1cm4gbGluZTtcbiAgICB9LCBPYmplY3QuY3JlYXRlKHsgZGlmZjogbnVsbCB9KSk7XG59XG5mdW5jdGlvbiBjcmVhdGVMaXN0TG9nU3VtbWFyeVBhcnNlcihzcGxpdHRlciA9IGV4cG9ydHMuU1BMSVRURVIsIGZpZWxkcyA9IGRlZmF1bHRGaWVsZE5hbWVzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGRPdXQpIHtcbiAgICAgICAgY29uc3QgYWxsID0gdXRpbHNfMS50b0xpbmVzV2l0aENvbnRlbnQoc3RkT3V0LCB0cnVlLCBleHBvcnRzLlNUQVJUX0JPVU5EQVJZKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgY29uc3QgbGluZURldGFpbCA9IGl0ZW0udHJpbSgpLnNwbGl0KGV4cG9ydHMuQ09NTUlUX0JPVU5EQVJZKTtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RMb2dMaW5lID0gbGluZUJ1aWxkZXIobGluZURldGFpbFswXS50cmltKCkuc3BsaXQoc3BsaXR0ZXIpLCBmaWVsZHMpO1xuICAgICAgICAgICAgaWYgKGxpbmVEZXRhaWwubGVuZ3RoID4gMSAmJiAhIWxpbmVEZXRhaWxbMV0udHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgbGlzdExvZ0xpbmUuZGlmZiA9IHBhcnNlX2RpZmZfc3VtbWFyeV8xLnBhcnNlRGlmZlJlc3VsdChsaW5lRGV0YWlsWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsaXN0TG9nTGluZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGwsXG4gICAgICAgICAgICBsYXRlc3Q6IGFsbC5sZW5ndGggJiYgYWxsWzBdIHx8IG51bGwsXG4gICAgICAgICAgICB0b3RhbDogYWxsLmxlbmd0aCxcbiAgICAgICAgfTtcbiAgICB9O1xufVxuZXhwb3J0cy5jcmVhdGVMaXN0TG9nU3VtbWFyeVBhcnNlciA9IGNyZWF0ZUxpc3RMb2dTdW1tYXJ5UGFyc2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2UtbGlzdC1sb2ctc3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubG9nVGFzayA9IGV4cG9ydHMucGFyc2VMb2dPcHRpb25zID0gdm9pZCAwO1xuY29uc3QgcGFyc2VfbGlzdF9sb2dfc3VtbWFyeV8xID0gcmVxdWlyZShcIi4uL3BhcnNlcnMvcGFyc2UtbGlzdC1sb2ctc3VtbWFyeVwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBleGNsdWRlT3B0aW9ucyA9IG5ldyBTZXQoW1xuICAgICctLXByZXR0eScsXG4gICAgJ21heC1jb3VudCcsXG4gICAgJ21heENvdW50JyxcbiAgICAnbicsXG4gICAgJ2ZpbGUnLFxuICAgICdmb3JtYXQnLFxuICAgICdmcm9tJyxcbiAgICAndG8nLFxuICAgICdzcGxpdHRlcicsXG4gICAgJ3N5bW1ldHJpYycsXG4gICAgJ211bHRpTGluZScsXG4gICAgJ3N0cmljdERhdGUnLFxuXSk7XG5mdW5jdGlvbiBwcmV0dHlGb3JtYXQoZm9ybWF0LCBzcGxpdHRlcikge1xuICAgIGNvbnN0IGZpZWxkcyA9IFtdO1xuICAgIGNvbnN0IGZvcm1hdFN0ciA9IFtdO1xuICAgIE9iamVjdC5lbnRyaWVzKGZvcm1hdCkuZm9yRWFjaCgoW2ZpZWxkLCBmb3JtYXRdKSA9PiB7XG4gICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgZm9ybWF0U3RyLnB1c2goZm9ybWF0KTtcbiAgICB9KTtcbiAgICByZXR1cm4gW1xuICAgICAgICBmaWVsZHMsIGZvcm1hdFN0ci5qb2luKHNwbGl0dGVyKVxuICAgIF07XG59XG5mdW5jdGlvbiB1c2VyT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhvcHRpb25zKS5maWx0ZXIoKFtrZXldKSA9PiAhZXhjbHVkZU9wdGlvbnMuaGFzKGtleSkpKTtcbn1cbmZ1bmN0aW9uIHBhcnNlTG9nT3B0aW9ucyhvcHQgPSB7fSwgY3VzdG9tQXJncyA9IFtdKSB7XG4gICAgY29uc3Qgc3BsaXR0ZXIgPSBvcHQuc3BsaXR0ZXIgfHwgcGFyc2VfbGlzdF9sb2dfc3VtbWFyeV8xLlNQTElUVEVSO1xuICAgIGNvbnN0IGZvcm1hdCA9IG9wdC5mb3JtYXQgfHwge1xuICAgICAgICBoYXNoOiAnJUgnLFxuICAgICAgICBkYXRlOiBvcHQuc3RyaWN0RGF0ZSA9PT0gZmFsc2UgPyAnJWFpJyA6ICclYUknLFxuICAgICAgICBtZXNzYWdlOiAnJXMnLFxuICAgICAgICByZWZzOiAnJUQnLFxuICAgICAgICBib2R5OiBvcHQubXVsdGlMaW5lID8gJyVCJyA6ICclYicsXG4gICAgICAgIGF1dGhvcl9uYW1lOiAnJWFOJyxcbiAgICAgICAgYXV0aG9yX2VtYWlsOiAnJWFlJ1xuICAgIH07XG4gICAgY29uc3QgW2ZpZWxkcywgZm9ybWF0U3RyXSA9IHByZXR0eUZvcm1hdChmb3JtYXQsIHNwbGl0dGVyKTtcbiAgICBjb25zdCBzdWZmaXggPSBbXTtcbiAgICBjb25zdCBjb21tYW5kID0gW1xuICAgICAgICBgLS1wcmV0dHk9Zm9ybWF0OiR7cGFyc2VfbGlzdF9sb2dfc3VtbWFyeV8xLlNUQVJUX0JPVU5EQVJZfSR7Zm9ybWF0U3RyfSR7cGFyc2VfbGlzdF9sb2dfc3VtbWFyeV8xLkNPTU1JVF9CT1VOREFSWX1gLFxuICAgICAgICAuLi5jdXN0b21BcmdzLFxuICAgIF07XG4gICAgY29uc3QgbWF4Q291bnQgPSBvcHQubiB8fCBvcHRbJ21heC1jb3VudCddIHx8IG9wdC5tYXhDb3VudDtcbiAgICBpZiAobWF4Q291bnQpIHtcbiAgICAgICAgY29tbWFuZC5wdXNoKGAtLW1heC1jb3VudD0ke21heENvdW50fWApO1xuICAgIH1cbiAgICBpZiAob3B0LmZyb20gJiYgb3B0LnRvKSB7XG4gICAgICAgIGNvbnN0IHJhbmdlT3BlcmF0b3IgPSAob3B0LnN5bW1ldHJpYyAhPT0gZmFsc2UpID8gJy4uLicgOiAnLi4nO1xuICAgICAgICBzdWZmaXgucHVzaChgJHtvcHQuZnJvbX0ke3JhbmdlT3BlcmF0b3J9JHtvcHQudG99YCk7XG4gICAgfVxuICAgIGlmIChvcHQuZmlsZSkge1xuICAgICAgICBzdWZmaXgucHVzaCgnLS1mb2xsb3cnLCBvcHQuZmlsZSk7XG4gICAgfVxuICAgIHV0aWxzXzEuYXBwZW5kVGFza09wdGlvbnModXNlck9wdGlvbnMob3B0KSwgY29tbWFuZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmllbGRzLFxuICAgICAgICBzcGxpdHRlcixcbiAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgIC4uLmNvbW1hbmQsXG4gICAgICAgICAgICAuLi5zdWZmaXgsXG4gICAgICAgIF0sXG4gICAgfTtcbn1cbmV4cG9ydHMucGFyc2VMb2dPcHRpb25zID0gcGFyc2VMb2dPcHRpb25zO1xuZnVuY3Rpb24gbG9nVGFzayhzcGxpdHRlciwgZmllbGRzLCBjdXN0b21BcmdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHM6IFsnbG9nJywgLi4uY3VzdG9tQXJnc10sXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyOiBwYXJzZV9saXN0X2xvZ19zdW1tYXJ5XzEuY3JlYXRlTGlzdExvZ1N1bW1hcnlQYXJzZXIoc3BsaXR0ZXIsIGZpZWxkcyksXG4gICAgfTtcbn1cbmV4cG9ydHMubG9nVGFzayA9IGxvZ1Rhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2cuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lcmdlU3VtbWFyeURldGFpbCA9IGV4cG9ydHMuTWVyZ2VTdW1tYXJ5Q29uZmxpY3QgPSB2b2lkIDA7XG5jbGFzcyBNZXJnZVN1bW1hcnlDb25mbGljdCB7XG4gICAgY29uc3RydWN0b3IocmVhc29uLCBmaWxlID0gbnVsbCwgbWV0YSkge1xuICAgICAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICAgICAgdGhpcy5tZXRhID0gbWV0YTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmZpbGV9OiR7dGhpcy5yZWFzb259YDtcbiAgICB9XG59XG5leHBvcnRzLk1lcmdlU3VtbWFyeUNvbmZsaWN0ID0gTWVyZ2VTdW1tYXJ5Q29uZmxpY3Q7XG5jbGFzcyBNZXJnZVN1bW1hcnlEZXRhaWwge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNvbmZsaWN0cyA9IFtdO1xuICAgICAgICB0aGlzLm1lcmdlcyA9IFtdO1xuICAgICAgICB0aGlzLnJlc3VsdCA9ICdzdWNjZXNzJztcbiAgICB9XG4gICAgZ2V0IGZhaWxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmxpY3RzLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGdldCByZWFzb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZsaWN0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBgQ09ORkxJQ1RTOiAke3RoaXMuY29uZmxpY3RzLmpvaW4oJywgJyl9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ09LJztcbiAgICB9XG59XG5leHBvcnRzLk1lcmdlU3VtbWFyeURldGFpbCA9IE1lcmdlU3VtbWFyeURldGFpbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1lcmdlU3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHVsbFN1bW1hcnkgPSB2b2lkIDA7XG5jbGFzcyBQdWxsU3VtbWFyeSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucmVtb3RlTWVzc2FnZXMgPSB7XG4gICAgICAgICAgICBhbGw6IFtdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNyZWF0ZWQgPSBbXTtcbiAgICAgICAgdGhpcy5kZWxldGVkID0gW107XG4gICAgICAgIHRoaXMuZmlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5kZWxldGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5pbnNlcnRpb25zID0ge307XG4gICAgICAgIHRoaXMuc3VtbWFyeSA9IHtcbiAgICAgICAgICAgIGNoYW5nZXM6IDAsXG4gICAgICAgICAgICBkZWxldGlvbnM6IDAsXG4gICAgICAgICAgICBpbnNlcnRpb25zOiAwLFxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMuUHVsbFN1bW1hcnkgPSBQdWxsU3VtbWFyeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVB1bGxTdW1tYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZW1vdGVNZXNzYWdlc09iamVjdFBhcnNlcnMgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gb2JqZWN0RW51bWVyYXRpb25SZXN1bHQocmVtb3RlTWVzc2FnZXMpIHtcbiAgICByZXR1cm4gKHJlbW90ZU1lc3NhZ2VzLm9iamVjdHMgPSByZW1vdGVNZXNzYWdlcy5vYmplY3RzIHx8IHtcbiAgICAgICAgY29tcHJlc3Npbmc6IDAsXG4gICAgICAgIGNvdW50aW5nOiAwLFxuICAgICAgICBlbnVtZXJhdGluZzogMCxcbiAgICAgICAgcGFja1JldXNlZDogMCxcbiAgICAgICAgcmV1c2VkOiB7IGNvdW50OiAwLCBkZWx0YTogMCB9LFxuICAgICAgICB0b3RhbDogeyBjb3VudDogMCwgZGVsdGE6IDAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gYXNPYmplY3RDb3VudChzb3VyY2UpIHtcbiAgICBjb25zdCBjb3VudCA9IC9eXFxzKihcXGQrKS8uZXhlYyhzb3VyY2UpO1xuICAgIGNvbnN0IGRlbHRhID0gL2RlbHRhIChcXGQrKS9pLmV4ZWMoc291cmNlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb3VudDogdXRpbHNfMS5hc051bWJlcihjb3VudCAmJiBjb3VudFsxXSB8fCAnMCcpLFxuICAgICAgICBkZWx0YTogdXRpbHNfMS5hc051bWJlcihkZWx0YSAmJiBkZWx0YVsxXSB8fCAnMCcpLFxuICAgIH07XG59XG5leHBvcnRzLnJlbW90ZU1lc3NhZ2VzT2JqZWN0UGFyc2VycyA9IFtcbiAgICBuZXcgdXRpbHNfMS5SZW1vdGVMaW5lUGFyc2VyKC9ecmVtb3RlOlxccyooZW51bWVyYXRpbmd8Y291bnRpbmd8Y29tcHJlc3NpbmcpIG9iamVjdHM6IChcXGQrKSwvaSwgKHJlc3VsdCwgW2FjdGlvbiwgY291bnRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGFjdGlvbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBlbnVtZXJhdGlvbiA9IG9iamVjdEVudW1lcmF0aW9uUmVzdWx0KHJlc3VsdC5yZW1vdGVNZXNzYWdlcyk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZW51bWVyYXRpb24sIHsgW2tleV06IHV0aWxzXzEuYXNOdW1iZXIoY291bnQpIH0pO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLlJlbW90ZUxpbmVQYXJzZXIoL15yZW1vdGU6XFxzKihlbnVtZXJhdGluZ3xjb3VudGluZ3xjb21wcmVzc2luZykgb2JqZWN0czogXFxkKyUgXFwoXFxkK1xcLyhcXGQrKVxcKSwvaSwgKHJlc3VsdCwgW2FjdGlvbiwgY291bnRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGFjdGlvbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBlbnVtZXJhdGlvbiA9IG9iamVjdEVudW1lcmF0aW9uUmVzdWx0KHJlc3VsdC5yZW1vdGVNZXNzYWdlcyk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZW51bWVyYXRpb24sIHsgW2tleV06IHV0aWxzXzEuYXNOdW1iZXIoY291bnQpIH0pO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLlJlbW90ZUxpbmVQYXJzZXIoL3RvdGFsIChbXixdKyksIHJldXNlZCAoW14sXSspLCBwYWNrLXJldXNlZCAoXFxkKykvaSwgKHJlc3VsdCwgW3RvdGFsLCByZXVzZWQsIHBhY2tSZXVzZWRdKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iamVjdHMgPSBvYmplY3RFbnVtZXJhdGlvblJlc3VsdChyZXN1bHQucmVtb3RlTWVzc2FnZXMpO1xuICAgICAgICBvYmplY3RzLnRvdGFsID0gYXNPYmplY3RDb3VudCh0b3RhbCk7XG4gICAgICAgIG9iamVjdHMucmV1c2VkID0gYXNPYmplY3RDb3VudChyZXVzZWQpO1xuICAgICAgICBvYmplY3RzLnBhY2tSZXVzZWQgPSB1dGlsc18xLmFzTnVtYmVyKHBhY2tSZXVzZWQpO1xuICAgIH0pLFxuXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLXJlbW90ZS1vYmplY3RzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZW1vdGVNZXNzYWdlU3VtbWFyeSA9IGV4cG9ydHMucGFyc2VSZW1vdGVNZXNzYWdlcyA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwYXJzZV9yZW1vdGVfb2JqZWN0c18xID0gcmVxdWlyZShcIi4vcGFyc2UtcmVtb3RlLW9iamVjdHNcIik7XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLlJlbW90ZUxpbmVQYXJzZXIoL15yZW1vdGU6XFxzKiguKykkLywgKHJlc3VsdCwgW3RleHRdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5yZW1vdGVNZXNzYWdlcy5hbGwucHVzaCh0ZXh0LnRyaW0oKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KSxcbiAgICAuLi5wYXJzZV9yZW1vdGVfb2JqZWN0c18xLnJlbW90ZU1lc3NhZ2VzT2JqZWN0UGFyc2VycyxcbiAgICBuZXcgdXRpbHNfMS5SZW1vdGVMaW5lUGFyc2VyKFsvY3JlYXRlIGEgKD86cHVsbHxtZXJnZSkgcmVxdWVzdC9pLCAvXFxzKGh0dHBzPzpcXC9cXC9cXFMrKSQvXSwgKHJlc3VsdCwgW3B1bGxSZXF1ZXN0VXJsXSkgPT4ge1xuICAgICAgICByZXN1bHQucmVtb3RlTWVzc2FnZXMucHVsbFJlcXVlc3RVcmwgPSBwdWxsUmVxdWVzdFVybDtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5SZW1vdGVMaW5lUGFyc2VyKFsvZm91bmQgKFxcZCspIHZ1bG5lcmFiaWxpdGllcy4rXFwoKFteKV0rKVxcKS9pLCAvXFxzKGh0dHBzPzpcXC9cXC9cXFMrKSQvXSwgKHJlc3VsdCwgW2NvdW50LCBzdW1tYXJ5LCB1cmxdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5yZW1vdGVNZXNzYWdlcy52dWxuZXJhYmlsaXRpZXMgPSB7XG4gICAgICAgICAgICBjb3VudDogdXRpbHNfMS5hc051bWJlcihjb3VudCksXG4gICAgICAgICAgICBzdW1tYXJ5LFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICB9O1xuICAgIH0pLFxuXTtcbmZ1bmN0aW9uIHBhcnNlUmVtb3RlTWVzc2FnZXMoX3N0ZE91dCwgc3RkRXJyKSB7XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZSh7IHJlbW90ZU1lc3NhZ2VzOiBuZXcgUmVtb3RlTWVzc2FnZVN1bW1hcnkoKSB9LCBwYXJzZXJzLCBzdGRFcnIpO1xufVxuZXhwb3J0cy5wYXJzZVJlbW90ZU1lc3NhZ2VzID0gcGFyc2VSZW1vdGVNZXNzYWdlcztcbmNsYXNzIFJlbW90ZU1lc3NhZ2VTdW1tYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hbGwgPSBbXTtcbiAgICB9XG59XG5leHBvcnRzLlJlbW90ZU1lc3NhZ2VTdW1tYXJ5ID0gUmVtb3RlTWVzc2FnZVN1bW1hcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1yZW1vdGUtbWVzc2FnZXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlUHVsbFJlc3VsdCA9IGV4cG9ydHMucGFyc2VQdWxsRGV0YWlsID0gdm9pZCAwO1xuY29uc3QgUHVsbFN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvUHVsbFN1bW1hcnlcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgcGFyc2VfcmVtb3RlX21lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9wYXJzZS1yZW1vdGUtbWVzc2FnZXNcIik7XG5jb25zdCBGSUxFX1VQREFURV9SRUdFWCA9IC9eXFxzKiguKz8pXFxzK1xcfFxccytcXGQrXFxzKihcXCsqKSgtKikvO1xuY29uc3QgU1VNTUFSWV9SRUdFWCA9IC8oXFxkKylcXEQrKChcXGQrKVxcRCtcXChcXCtcXCkpPyhcXEQrKFxcZCspXFxEK1xcKC1cXCkpPy87XG5jb25zdCBBQ1RJT05fUkVHRVggPSAvXihjcmVhdGV8ZGVsZXRlKSBtb2RlIFxcZCsgKC4rKS87XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoRklMRV9VUERBVEVfUkVHRVgsIChyZXN1bHQsIFtmaWxlLCBpbnNlcnRpb25zLCBkZWxldGlvbnNdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICBpZiAoaW5zZXJ0aW9ucykge1xuICAgICAgICAgICAgcmVzdWx0Lmluc2VydGlvbnNbZmlsZV0gPSBpbnNlcnRpb25zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVsZXRpb25zKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVsZXRpb25zW2ZpbGVdID0gZGVsZXRpb25zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoU1VNTUFSWV9SRUdFWCwgKHJlc3VsdCwgW2NoYW5nZXMsICwgaW5zZXJ0aW9ucywgLCBkZWxldGlvbnNdKSA9PiB7XG4gICAgICAgIGlmIChpbnNlcnRpb25zICE9PSB1bmRlZmluZWQgfHwgZGVsZXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdW1tYXJ5LmNoYW5nZXMgPSArY2hhbmdlcyB8fCAwO1xuICAgICAgICAgICAgcmVzdWx0LnN1bW1hcnkuaW5zZXJ0aW9ucyA9ICtpbnNlcnRpb25zIHx8IDA7XG4gICAgICAgICAgICByZXN1bHQuc3VtbWFyeS5kZWxldGlvbnMgPSArZGVsZXRpb25zIHx8IDA7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcihBQ1RJT05fUkVHRVgsIChyZXN1bHQsIFthY3Rpb24sIGZpbGVdKSA9PiB7XG4gICAgICAgIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5maWxlcywgZmlsZSk7XG4gICAgICAgIHV0aWxzXzEuYXBwZW5kKChhY3Rpb24gPT09ICdjcmVhdGUnKSA/IHJlc3VsdC5jcmVhdGVkIDogcmVzdWx0LmRlbGV0ZWQsIGZpbGUpO1xuICAgIH0pLFxuXTtcbmNvbnN0IHBhcnNlUHVsbERldGFpbCA9IChzdGRPdXQsIHN0ZEVycikgPT4ge1xuICAgIHJldHVybiB1dGlsc18xLnBhcnNlU3RyaW5nUmVzcG9uc2UobmV3IFB1bGxTdW1tYXJ5XzEuUHVsbFN1bW1hcnkoKSwgcGFyc2Vycywgc3RkT3V0LCBzdGRFcnIpO1xufTtcbmV4cG9ydHMucGFyc2VQdWxsRGV0YWlsID0gcGFyc2VQdWxsRGV0YWlsO1xuY29uc3QgcGFyc2VQdWxsUmVzdWx0ID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFB1bGxTdW1tYXJ5XzEuUHVsbFN1bW1hcnkoKSwgZXhwb3J0cy5wYXJzZVB1bGxEZXRhaWwoc3RkT3V0LCBzdGRFcnIpLCBwYXJzZV9yZW1vdGVfbWVzc2FnZXNfMS5wYXJzZVJlbW90ZU1lc3NhZ2VzKHN0ZE91dCwgc3RkRXJyKSk7XG59O1xuZXhwb3J0cy5wYXJzZVB1bGxSZXN1bHQgPSBwYXJzZVB1bGxSZXN1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1wdWxsLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZU1lcmdlRGV0YWlsID0gZXhwb3J0cy5wYXJzZU1lcmdlUmVzdWx0ID0gdm9pZCAwO1xuY29uc3QgTWVyZ2VTdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcmVzcG9uc2VzL01lcmdlU3VtbWFyeVwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwYXJzZV9wdWxsXzEgPSByZXF1aXJlKFwiLi9wYXJzZS1wdWxsXCIpO1xuY29uc3QgcGFyc2VycyA9IFtcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eQXV0by1tZXJnaW5nXFxzKyguKykkLywgKHN1bW1hcnksIFthdXRvTWVyZ2VdKSA9PiB7XG4gICAgICAgIHN1bW1hcnkubWVyZ2VzLnB1c2goYXV0b01lcmdlKTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eQ09ORkxJQ1RcXHMrXFwoKC4rKVxcKTogTWVyZ2UgY29uZmxpY3QgaW4gKC4rKSQvLCAoc3VtbWFyeSwgW3JlYXNvbiwgZmlsZV0pID0+IHtcbiAgICAgICAgc3VtbWFyeS5jb25mbGljdHMucHVzaChuZXcgTWVyZ2VTdW1tYXJ5XzEuTWVyZ2VTdW1tYXJ5Q29uZmxpY3QocmVhc29uLCBmaWxlKSk7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXkNPTkZMSUNUXFxzK1xcKCguK1xcL2RlbGV0ZSlcXCk6ICguKykgZGVsZXRlZCBpbiAoLispIGFuZC8sIChzdW1tYXJ5LCBbcmVhc29uLCBmaWxlLCBkZWxldGVSZWZdKSA9PiB7XG4gICAgICAgIHN1bW1hcnkuY29uZmxpY3RzLnB1c2gobmV3IE1lcmdlU3VtbWFyeV8xLk1lcmdlU3VtbWFyeUNvbmZsaWN0KHJlYXNvbiwgZmlsZSwgeyBkZWxldGVSZWYgfSkpO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL15DT05GTElDVFxccytcXCgoLispXFwpOi8sIChzdW1tYXJ5LCBbcmVhc29uXSkgPT4ge1xuICAgICAgICBzdW1tYXJ5LmNvbmZsaWN0cy5wdXNoKG5ldyBNZXJnZVN1bW1hcnlfMS5NZXJnZVN1bW1hcnlDb25mbGljdChyZWFzb24sIG51bGwpKTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eQXV0b21hdGljIG1lcmdlIGZhaWxlZDtcXHMrKC4rKSQvLCAoc3VtbWFyeSwgW3Jlc3VsdF0pID0+IHtcbiAgICAgICAgc3VtbWFyeS5yZXN1bHQgPSByZXN1bHQ7XG4gICAgfSksXG5dO1xuLyoqXG4gKiBQYXJzZSB0aGUgY29tcGxldGUgcmVzcG9uc2UgZnJvbSBgZ2l0Lm1lcmdlYFxuICovXG5jb25zdCBwYXJzZU1lcmdlUmVzdWx0ID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZXhwb3J0cy5wYXJzZU1lcmdlRGV0YWlsKHN0ZE91dCwgc3RkRXJyKSwgcGFyc2VfcHVsbF8xLnBhcnNlUHVsbFJlc3VsdChzdGRPdXQsIHN0ZEVycikpO1xufTtcbmV4cG9ydHMucGFyc2VNZXJnZVJlc3VsdCA9IHBhcnNlTWVyZ2VSZXN1bHQ7XG4vKipcbiAqIFBhcnNlIHRoZSBtZXJnZSBzcGVjaWZpYyBkZXRhaWwgKGllOiBub3QgdGhlIGNvbnRlbnQgYWxzbyBhdmFpbGFibGUgaW4gdGhlIHB1bGwgZGV0YWlsKSBmcm9tIGBnaXQubW5lcmdlYFxuICogQHBhcmFtIHN0ZE91dFxuICovXG5jb25zdCBwYXJzZU1lcmdlRGV0YWlsID0gKHN0ZE91dCkgPT4ge1xuICAgIHJldHVybiB1dGlsc18xLnBhcnNlU3RyaW5nUmVzcG9uc2UobmV3IE1lcmdlU3VtbWFyeV8xLk1lcmdlU3VtbWFyeURldGFpbCgpLCBwYXJzZXJzLCBzdGRPdXQpO1xufTtcbmV4cG9ydHMucGFyc2VNZXJnZURldGFpbCA9IHBhcnNlTWVyZ2VEZXRhaWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1tZXJnZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubWVyZ2VUYXNrID0gdm9pZCAwO1xuY29uc3QgYXBpXzEgPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuY29uc3QgcGFyc2VfbWVyZ2VfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLW1lcmdlXCIpO1xuY29uc3QgdGFza18xID0gcmVxdWlyZShcIi4vdGFza1wiKTtcbmZ1bmN0aW9uIG1lcmdlVGFzayhjdXN0b21BcmdzKSB7XG4gICAgaWYgKCFjdXN0b21BcmdzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGFza18xLmNvbmZpZ3VyYXRpb25FcnJvclRhc2soJ0dpdC5tZXJnZSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgb3B0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzOiBbJ21lcmdlJywgLi4uY3VzdG9tQXJnc10sXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyKHN0ZE91dCwgc3RkRXJyKSB7XG4gICAgICAgICAgICBjb25zdCBtZXJnZSA9IHBhcnNlX21lcmdlXzEucGFyc2VNZXJnZVJlc3VsdChzdGRPdXQsIHN0ZEVycik7XG4gICAgICAgICAgICBpZiAobWVyZ2UuZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGFwaV8xLkdpdFJlc3BvbnNlRXJyb3IobWVyZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMubWVyZ2VUYXNrID0gbWVyZ2VUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVyZ2UuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlTW92ZVJlc3VsdCA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL15SZW5hbWluZyAoLispIHRvICguKykkLywgKHJlc3VsdCwgW2Zyb20sIHRvXSkgPT4ge1xuICAgICAgICByZXN1bHQubW92ZXMucHVzaCh7IGZyb20sIHRvIH0pO1xuICAgIH0pLFxuXTtcbmZ1bmN0aW9uIHBhcnNlTW92ZVJlc3VsdChzdGRPdXQpIHtcbiAgICByZXR1cm4gdXRpbHNfMS5wYXJzZVN0cmluZ1Jlc3BvbnNlKHsgbW92ZXM6IFtdIH0sIHBhcnNlcnMsIHN0ZE91dCk7XG59XG5leHBvcnRzLnBhcnNlTW92ZVJlc3VsdCA9IHBhcnNlTW92ZVJlc3VsdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLW1vdmUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLm1vdmVUYXNrID0gdm9pZCAwO1xuY29uc3QgcGFyc2VfbW92ZV8xID0gcmVxdWlyZShcIi4uL3BhcnNlcnMvcGFyc2UtbW92ZVwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5mdW5jdGlvbiBtb3ZlVGFzayhmcm9tLCB0bykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzOiBbJ212JywgJy12JywgLi4udXRpbHNfMS5hc0FycmF5KGZyb20pLCB0b10sXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyOiBwYXJzZV9tb3ZlXzEucGFyc2VNb3ZlUmVzdWx0LFxuICAgIH07XG59XG5leHBvcnRzLm1vdmVUYXNrID0gbW92ZVRhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb3ZlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wdWxsVGFzayA9IHZvaWQgMDtcbmNvbnN0IHBhcnNlX3B1bGxfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLXB1bGxcIik7XG5mdW5jdGlvbiBwdWxsVGFzayhyZW1vdGUsIGJyYW5jaCwgY3VzdG9tQXJncykge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydwdWxsJywgLi4uY3VzdG9tQXJnc107XG4gICAgaWYgKHJlbW90ZSAmJiBicmFuY2gpIHtcbiAgICAgICAgY29tbWFuZHMuc3BsaWNlKDEsIDAsIHJlbW90ZSwgYnJhbmNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyKHN0ZE91dCwgc3RkRXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VfcHVsbF8xLnBhcnNlUHVsbFJlc3VsdChzdGRPdXQsIHN0ZEVycik7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5wdWxsVGFzayA9IHB1bGxUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVsbC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VQdXNoRGV0YWlsID0gZXhwb3J0cy5wYXJzZVB1c2hSZXN1bHQgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgcGFyc2VfcmVtb3RlX21lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9wYXJzZS1yZW1vdGUtbWVzc2FnZXNcIik7XG5mdW5jdGlvbiBwdXNoUmVzdWx0UHVzaGVkSXRlbShsb2NhbCwgcmVtb3RlLCBzdGF0dXMpIHtcbiAgICBjb25zdCBkZWxldGVkID0gc3RhdHVzLmluY2x1ZGVzKCdkZWxldGVkJyk7XG4gICAgY29uc3QgdGFnID0gc3RhdHVzLmluY2x1ZGVzKCd0YWcnKSB8fCAvXnJlZnNcXC90YWdzLy50ZXN0KGxvY2FsKTtcbiAgICBjb25zdCBhbHJlYWR5VXBkYXRlZCA9ICFzdGF0dXMuaW5jbHVkZXMoJ25ldycpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlbGV0ZWQsXG4gICAgICAgIHRhZyxcbiAgICAgICAgYnJhbmNoOiAhdGFnLFxuICAgICAgICBuZXc6ICFhbHJlYWR5VXBkYXRlZCxcbiAgICAgICAgYWxyZWFkeVVwZGF0ZWQsXG4gICAgICAgIGxvY2FsLFxuICAgICAgICByZW1vdGUsXG4gICAgfTtcbn1cbmNvbnN0IHBhcnNlcnMgPSBbXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXlB1c2hpbmcgdG8gKC4rKSQvLCAocmVzdWx0LCBbcmVwb10pID0+IHtcbiAgICAgICAgcmVzdWx0LnJlcG8gPSByZXBvO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL151cGRhdGluZyBsb2NhbCB0cmFja2luZyByZWYgJyguKyknLywgKHJlc3VsdCwgW2xvY2FsXSkgPT4ge1xuICAgICAgICByZXN1bHQucmVmID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAocmVzdWx0LnJlZiB8fCB7fSkpLCB7IGxvY2FsIH0pO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL15bKi09XVxccysoW146XSspOihcXFMrKVxccytcXFsoLispXSQvLCAocmVzdWx0LCBbbG9jYWwsIHJlbW90ZSwgdHlwZV0pID0+IHtcbiAgICAgICAgcmVzdWx0LnB1c2hlZC5wdXNoKHB1c2hSZXN1bHRQdXNoZWRJdGVtKGxvY2FsLCByZW1vdGUsIHR5cGUpKTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eQnJhbmNoICcoW14nXSspJyBzZXQgdXAgdG8gdHJhY2sgcmVtb3RlIGJyYW5jaCAnKFteJ10rKScgZnJvbSAnKFteJ10rKScvLCAocmVzdWx0LCBbbG9jYWwsIHJlbW90ZSwgcmVtb3RlTmFtZV0pID0+IHtcbiAgICAgICAgcmVzdWx0LmJyYW5jaCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHJlc3VsdC5icmFuY2ggfHwge30pKSwgeyBsb2NhbCxcbiAgICAgICAgICAgIHJlbW90ZSxcbiAgICAgICAgICAgIHJlbW90ZU5hbWUgfSk7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXihbXjpdKyk6KFxcUyspXFxzKyhbYS16MC05XSspXFwuXFwuKFthLXowLTldKykkLywgKHJlc3VsdCwgW2xvY2FsLCByZW1vdGUsIGZyb20sIHRvXSkgPT4ge1xuICAgICAgICByZXN1bHQudXBkYXRlID0ge1xuICAgICAgICAgICAgaGVhZDoge1xuICAgICAgICAgICAgICAgIGxvY2FsLFxuICAgICAgICAgICAgICAgIHJlbW90ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYXNoOiB7XG4gICAgICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfSksXG5dO1xuY29uc3QgcGFyc2VQdXNoUmVzdWx0ID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICAgY29uc3QgcHVzaERldGFpbCA9IGV4cG9ydHMucGFyc2VQdXNoRGV0YWlsKHN0ZE91dCwgc3RkRXJyKTtcbiAgICBjb25zdCByZXNwb25zZURldGFpbCA9IHBhcnNlX3JlbW90ZV9tZXNzYWdlc18xLnBhcnNlUmVtb3RlTWVzc2FnZXMoc3RkT3V0LCBzdGRFcnIpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHB1c2hEZXRhaWwpLCByZXNwb25zZURldGFpbCk7XG59O1xuZXhwb3J0cy5wYXJzZVB1c2hSZXN1bHQgPSBwYXJzZVB1c2hSZXN1bHQ7XG5jb25zdCBwYXJzZVB1c2hEZXRhaWwgPSAoc3RkT3V0LCBzdGRFcnIpID0+IHtcbiAgICByZXR1cm4gdXRpbHNfMS5wYXJzZVN0cmluZ1Jlc3BvbnNlKHsgcHVzaGVkOiBbXSB9LCBwYXJzZXJzLCBzdGRPdXQsIHN0ZEVycik7XG59O1xuZXhwb3J0cy5wYXJzZVB1c2hEZXRhaWwgPSBwYXJzZVB1c2hEZXRhaWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1wdXNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wdXNoVGFzayA9IGV4cG9ydHMucHVzaFRhZ3NUYXNrID0gdm9pZCAwO1xuY29uc3QgcGFyc2VfcHVzaF8xID0gcmVxdWlyZShcIi4uL3BhcnNlcnMvcGFyc2UtcHVzaFwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5mdW5jdGlvbiBwdXNoVGFnc1Rhc2socmVmID0ge30sIGN1c3RvbUFyZ3MpIHtcbiAgICB1dGlsc18xLmFwcGVuZChjdXN0b21BcmdzLCAnLS10YWdzJyk7XG4gICAgcmV0dXJuIHB1c2hUYXNrKHJlZiwgY3VzdG9tQXJncyk7XG59XG5leHBvcnRzLnB1c2hUYWdzVGFzayA9IHB1c2hUYWdzVGFzaztcbmZ1bmN0aW9uIHB1c2hUYXNrKHJlZiA9IHt9LCBjdXN0b21BcmdzKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbJ3B1c2gnLCAuLi5jdXN0b21BcmdzXTtcbiAgICBpZiAocmVmLmJyYW5jaCkge1xuICAgICAgICBjb21tYW5kcy5zcGxpY2UoMSwgMCwgcmVmLmJyYW5jaCk7XG4gICAgfVxuICAgIGlmIChyZWYucmVtb3RlKSB7XG4gICAgICAgIGNvbW1hbmRzLnNwbGljZSgxLCAwLCByZWYucmVtb3RlKTtcbiAgICB9XG4gICAgdXRpbHNfMS5yZW1vdmUoY29tbWFuZHMsICctdicpO1xuICAgIHV0aWxzXzEuYXBwZW5kKGNvbW1hbmRzLCAnLS12ZXJib3NlJyk7XG4gICAgdXRpbHNfMS5hcHBlbmQoY29tbWFuZHMsICctLXBvcmNlbGFpbicpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcjogcGFyc2VfcHVzaF8xLnBhcnNlUHVzaFJlc3VsdCxcbiAgICB9O1xufVxuZXhwb3J0cy5wdXNoVGFzayA9IHB1c2hUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVzaC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VHZXRSZW1vdGVzVmVyYm9zZSA9IGV4cG9ydHMucGFyc2VHZXRSZW1vdGVzID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmZ1bmN0aW9uIHBhcnNlR2V0UmVtb3Rlcyh0ZXh0KSB7XG4gICAgY29uc3QgcmVtb3RlcyA9IHt9O1xuICAgIGZvckVhY2godGV4dCwgKFtuYW1lXSkgPT4gcmVtb3Rlc1tuYW1lXSA9IHsgbmFtZSB9KTtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyZW1vdGVzKTtcbn1cbmV4cG9ydHMucGFyc2VHZXRSZW1vdGVzID0gcGFyc2VHZXRSZW1vdGVzO1xuZnVuY3Rpb24gcGFyc2VHZXRSZW1vdGVzVmVyYm9zZSh0ZXh0KSB7XG4gICAgY29uc3QgcmVtb3RlcyA9IHt9O1xuICAgIGZvckVhY2godGV4dCwgKFtuYW1lLCB1cmwsIHB1cnBvc2VdKSA9PiB7XG4gICAgICAgIGlmICghcmVtb3Rlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgcmVtb3Rlc1tuYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgIHJlZnM6IHsgZmV0Y2g6ICcnLCBwdXNoOiAnJyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHVycG9zZSAmJiB1cmwpIHtcbiAgICAgICAgICAgIHJlbW90ZXNbbmFtZV0ucmVmc1twdXJwb3NlLnJlcGxhY2UoL1teYS16XS9nLCAnJyldID0gdXJsO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVtb3Rlcyk7XG59XG5leHBvcnRzLnBhcnNlR2V0UmVtb3Rlc1ZlcmJvc2UgPSBwYXJzZUdldFJlbW90ZXNWZXJib3NlO1xuZnVuY3Rpb24gZm9yRWFjaCh0ZXh0LCBoYW5kbGVyKSB7XG4gICAgdXRpbHNfMS5mb3JFYWNoTGluZVdpdGhDb250ZW50KHRleHQsIChsaW5lKSA9PiBoYW5kbGVyKGxpbmUuc3BsaXQoL1xccysvKSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2V0UmVtb3RlU3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVtb3ZlUmVtb3RlVGFzayA9IGV4cG9ydHMucmVtb3RlVGFzayA9IGV4cG9ydHMubGlzdFJlbW90ZXNUYXNrID0gZXhwb3J0cy5nZXRSZW1vdGVzVGFzayA9IGV4cG9ydHMuYWRkUmVtb3RlVGFzayA9IHZvaWQgMDtcbmNvbnN0IEdldFJlbW90ZVN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvR2V0UmVtb3RlU3VtbWFyeVwiKTtcbmNvbnN0IHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG5mdW5jdGlvbiBhZGRSZW1vdGVUYXNrKHJlbW90ZU5hbWUsIHJlbW90ZVJlcG8sIGN1c3RvbUFyZ3MgPSBbXSkge1xuICAgIHJldHVybiB0YXNrXzEuc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhbJ3JlbW90ZScsICdhZGQnLCAuLi5jdXN0b21BcmdzLCByZW1vdGVOYW1lLCByZW1vdGVSZXBvXSk7XG59XG5leHBvcnRzLmFkZFJlbW90ZVRhc2sgPSBhZGRSZW1vdGVUYXNrO1xuZnVuY3Rpb24gZ2V0UmVtb3Rlc1Rhc2sodmVyYm9zZSkge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydyZW1vdGUnXTtcbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCctdicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXI6IHZlcmJvc2UgPyBHZXRSZW1vdGVTdW1tYXJ5XzEucGFyc2VHZXRSZW1vdGVzVmVyYm9zZSA6IEdldFJlbW90ZVN1bW1hcnlfMS5wYXJzZUdldFJlbW90ZXMsXG4gICAgfTtcbn1cbmV4cG9ydHMuZ2V0UmVtb3Rlc1Rhc2sgPSBnZXRSZW1vdGVzVGFzaztcbmZ1bmN0aW9uIGxpc3RSZW1vdGVzVGFzayhjdXN0b21BcmdzID0gW10pIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsuLi5jdXN0b21BcmdzXTtcbiAgICBpZiAoY29tbWFuZHNbMF0gIT09ICdscy1yZW1vdGUnKSB7XG4gICAgICAgIGNvbW1hbmRzLnVuc2hpZnQoJ2xzLXJlbW90ZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMpO1xufVxuZXhwb3J0cy5saXN0UmVtb3Rlc1Rhc2sgPSBsaXN0UmVtb3Rlc1Rhc2s7XG5mdW5jdGlvbiByZW1vdGVUYXNrKGN1c3RvbUFyZ3MgPSBbXSkge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWy4uLmN1c3RvbUFyZ3NdO1xuICAgIGlmIChjb21tYW5kc1swXSAhPT0gJ3JlbW90ZScpIHtcbiAgICAgICAgY29tbWFuZHMudW5zaGlmdCgncmVtb3RlJyk7XG4gICAgfVxuICAgIHJldHVybiB0YXNrXzEuc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhjb21tYW5kcyk7XG59XG5leHBvcnRzLnJlbW90ZVRhc2sgPSByZW1vdGVUYXNrO1xuZnVuY3Rpb24gcmVtb3ZlUmVtb3RlVGFzayhyZW1vdGVOYW1lKSB7XG4gICAgcmV0dXJuIHRhc2tfMS5zdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKFsncmVtb3RlJywgJ3JlbW92ZScsIHJlbW90ZU5hbWVdKTtcbn1cbmV4cG9ydHMucmVtb3ZlUmVtb3RlVGFzayA9IHJlbW92ZVJlbW90ZVRhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZW1vdGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnN0YXNoTGlzdFRhc2sgPSB2b2lkIDA7XG5jb25zdCBwYXJzZV9saXN0X2xvZ19zdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcGFyc2Vycy9wYXJzZS1saXN0LWxvZy1zdW1tYXJ5XCIpO1xuY29uc3QgbG9nXzEgPSByZXF1aXJlKFwiLi9sb2dcIik7XG5mdW5jdGlvbiBzdGFzaExpc3RUYXNrKG9wdCA9IHt9LCBjdXN0b21BcmdzKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGxvZ18xLnBhcnNlTG9nT3B0aW9ucyhvcHQpO1xuICAgIGNvbnN0IHBhcnNlciA9IHBhcnNlX2xpc3RfbG9nX3N1bW1hcnlfMS5jcmVhdGVMaXN0TG9nU3VtbWFyeVBhcnNlcihvcHRpb25zLnNwbGl0dGVyLCBvcHRpb25zLmZpZWxkcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHM6IFsnc3Rhc2gnLCAnbGlzdCcsIC4uLm9wdGlvbnMuY29tbWFuZHMsIC4uLmN1c3RvbUFyZ3NdLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcixcbiAgICB9O1xufVxuZXhwb3J0cy5zdGFzaExpc3RUYXNrID0gc3Rhc2hMaXN0VGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0YXNoLWxpc3QuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkZpbGVTdGF0dXNTdW1tYXJ5ID0gZXhwb3J0cy5mcm9tUGF0aFJlZ2V4ID0gdm9pZCAwO1xuZXhwb3J0cy5mcm9tUGF0aFJlZ2V4ID0gL14oLispIC0+ICguKykkLztcbmNsYXNzIEZpbGVTdGF0dXNTdW1tYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcihwYXRoLCBpbmRleCwgd29ya2luZ19kaXIpIHtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLndvcmtpbmdfZGlyID0gd29ya2luZ19kaXI7XG4gICAgICAgIGlmICgnUicgPT09IChpbmRleCArIHdvcmtpbmdfZGlyKSkge1xuICAgICAgICAgICAgY29uc3QgZGV0YWlsID0gZXhwb3J0cy5mcm9tUGF0aFJlZ2V4LmV4ZWMocGF0aCkgfHwgW251bGwsIHBhdGgsIHBhdGhdO1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gZGV0YWlsWzFdIHx8ICcnO1xuICAgICAgICAgICAgdGhpcy5wYXRoID0gZGV0YWlsWzJdIHx8ICcnO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5GaWxlU3RhdHVzU3VtbWFyeSA9IEZpbGVTdGF0dXNTdW1tYXJ5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZVN0YXR1c1N1bW1hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlU3RhdHVzU3VtbWFyeSA9IGV4cG9ydHMuU3RhdHVzU3VtbWFyeVBhcnNlcnMgPSBleHBvcnRzLlN0YXR1c1N1bW1hcnkgPSB2b2lkIDA7XG5jb25zdCBGaWxlU3RhdHVzU3VtbWFyeV8xID0gcmVxdWlyZShcIi4vRmlsZVN0YXR1c1N1bW1hcnlcIik7XG4vKipcbiAqIFRoZSBTdGF0dXNTdW1tYXJ5IGlzIHJldHVybmVkIGFzIGEgcmVzcG9uc2UgdG8gZ2V0dGluZyBgZ2l0KCkuc3RhdHVzKClgXG4gKi9cbmNsYXNzIFN0YXR1c1N1bW1hcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm5vdF9hZGRlZCA9IFtdO1xuICAgICAgICB0aGlzLmNvbmZsaWN0ZWQgPSBbXTtcbiAgICAgICAgdGhpcy5jcmVhdGVkID0gW107XG4gICAgICAgIHRoaXMuZGVsZXRlZCA9IFtdO1xuICAgICAgICB0aGlzLm1vZGlmaWVkID0gW107XG4gICAgICAgIHRoaXMucmVuYW1lZCA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQWxsIGZpbGVzIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB0aGUgYHBhdGhgIGFuZCBzdGF0dXMgaW4gYGluZGV4YCBhbmRcbiAgICAgICAgICogaW4gdGhlIGB3b3JraW5nX2RpcmAuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpbGVzID0gW107XG4gICAgICAgIHRoaXMuc3RhZ2VkID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOdW1iZXIgb2YgY29tbWl0cyBhaGVhZCBvZiB0aGUgdHJhY2tlZCBicmFuY2hcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWhlYWQgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICpOdW1iZXIgb2YgY29tbWl0cyBiZWhpbmQgdGhlIHRyYWNrZWQgYnJhbmNoXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJlaGluZCA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOYW1lIG9mIHRoZSBjdXJyZW50IGJyYW5jaFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5hbWUgb2YgdGhlIGJyYW5jaCBiZWluZyB0cmFja2VkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYWNraW5nID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoaXMgU3RhdHVzU3VtbWFyeSByZXByZXNlbnRzIGEgY2xlYW4gd29ya2luZyBicmFuY2guXG4gICAgICovXG4gICAgaXNDbGVhbigpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmZpbGVzLmxlbmd0aDtcbiAgICB9XG59XG5leHBvcnRzLlN0YXR1c1N1bW1hcnkgPSBTdGF0dXNTdW1tYXJ5O1xuZXhwb3J0cy5TdGF0dXNTdW1tYXJ5UGFyc2VycyA9IHtcbiAgICAnIyMnOiBmdW5jdGlvbiAobGluZSwgc3RhdHVzKSB7XG4gICAgICAgIGNvbnN0IGFoZWFkUmVnID0gL2FoZWFkIChcXGQrKS87XG4gICAgICAgIGNvbnN0IGJlaGluZFJlZyA9IC9iZWhpbmQgKFxcZCspLztcbiAgICAgICAgY29uc3QgY3VycmVudFJlZyA9IC9eKC4rPyg/PSg/OlxcLnszfXxcXHN8JCkpKS87XG4gICAgICAgIGNvbnN0IHRyYWNraW5nUmVnID0gL1xcLnszfShcXFMqKS87XG4gICAgICAgIGNvbnN0IG9uRW1wdHlCcmFuY2hSZWcgPSAvXFxzb25cXHMoW1xcU10rKSQvO1xuICAgICAgICBsZXQgcmVnZXhSZXN1bHQ7XG4gICAgICAgIHJlZ2V4UmVzdWx0ID0gYWhlYWRSZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgc3RhdHVzLmFoZWFkID0gcmVnZXhSZXN1bHQgJiYgK3JlZ2V4UmVzdWx0WzFdIHx8IDA7XG4gICAgICAgIHJlZ2V4UmVzdWx0ID0gYmVoaW5kUmVnLmV4ZWMobGluZSk7XG4gICAgICAgIHN0YXR1cy5iZWhpbmQgPSByZWdleFJlc3VsdCAmJiArcmVnZXhSZXN1bHRbMV0gfHwgMDtcbiAgICAgICAgcmVnZXhSZXN1bHQgPSBjdXJyZW50UmVnLmV4ZWMobGluZSk7XG4gICAgICAgIHN0YXR1cy5jdXJyZW50ID0gcmVnZXhSZXN1bHQgJiYgcmVnZXhSZXN1bHRbMV07XG4gICAgICAgIHJlZ2V4UmVzdWx0ID0gdHJhY2tpbmdSZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgc3RhdHVzLnRyYWNraW5nID0gcmVnZXhSZXN1bHQgJiYgcmVnZXhSZXN1bHRbMV07XG4gICAgICAgIHJlZ2V4UmVzdWx0ID0gb25FbXB0eUJyYW5jaFJlZy5leGVjKGxpbmUpO1xuICAgICAgICBzdGF0dXMuY3VycmVudCA9IHJlZ2V4UmVzdWx0ICYmIHJlZ2V4UmVzdWx0WzFdIHx8IHN0YXR1cy5jdXJyZW50O1xuICAgIH0sXG4gICAgJz8/JzogZnVuY3Rpb24gKGxpbmUsIHN0YXR1cykge1xuICAgICAgICBzdGF0dXMubm90X2FkZGVkLnB1c2gobGluZSk7XG4gICAgfSxcbiAgICBBOiBmdW5jdGlvbiAobGluZSwgc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy5jcmVhdGVkLnB1c2gobGluZSk7XG4gICAgfSxcbiAgICBBTTogZnVuY3Rpb24gKGxpbmUsIHN0YXR1cykge1xuICAgICAgICBzdGF0dXMuY3JlYXRlZC5wdXNoKGxpbmUpO1xuICAgIH0sXG4gICAgRDogZnVuY3Rpb24gKGxpbmUsIHN0YXR1cykge1xuICAgICAgICBzdGF0dXMuZGVsZXRlZC5wdXNoKGxpbmUpO1xuICAgIH0sXG4gICAgTTogZnVuY3Rpb24gKGxpbmUsIHN0YXR1cywgaW5kZXhTdGF0ZSkge1xuICAgICAgICBzdGF0dXMubW9kaWZpZWQucHVzaChsaW5lKTtcbiAgICAgICAgaWYgKGluZGV4U3RhdGUgPT09ICdNJykge1xuICAgICAgICAgICAgc3RhdHVzLnN0YWdlZC5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBSOiBmdW5jdGlvbiAobGluZSwgc3RhdHVzKSB7XG4gICAgICAgIGNvbnN0IGRldGFpbCA9IC9eKC4rKSAtPiAoLispJC8uZXhlYyhsaW5lKSB8fCBbbnVsbCwgbGluZSwgbGluZV07XG4gICAgICAgIHN0YXR1cy5yZW5hbWVkLnB1c2goe1xuICAgICAgICAgICAgZnJvbTogU3RyaW5nKGRldGFpbFsxXSksXG4gICAgICAgICAgICB0bzogU3RyaW5nKGRldGFpbFsyXSlcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBVVTogZnVuY3Rpb24gKGxpbmUsIHN0YXR1cykge1xuICAgICAgICBzdGF0dXMuY29uZmxpY3RlZC5wdXNoKGxpbmUpO1xuICAgIH1cbn07XG5leHBvcnRzLlN0YXR1c1N1bW1hcnlQYXJzZXJzLk1NID0gZXhwb3J0cy5TdGF0dXNTdW1tYXJ5UGFyc2Vycy5NO1xuLyogTWFwIGFsbCB1bm1lcmdlZCBzdGF0dXMgY29kZSBjb21iaW5hdGlvbnMgdG8gVVUgdG8gbWFyayBhcyBjb25mbGljdGVkICovXG5leHBvcnRzLlN0YXR1c1N1bW1hcnlQYXJzZXJzLkFBID0gZXhwb3J0cy5TdGF0dXNTdW1tYXJ5UGFyc2Vycy5VVTtcbmV4cG9ydHMuU3RhdHVzU3VtbWFyeVBhcnNlcnMuVUQgPSBleHBvcnRzLlN0YXR1c1N1bW1hcnlQYXJzZXJzLlVVO1xuZXhwb3J0cy5TdGF0dXNTdW1tYXJ5UGFyc2Vycy5EVSA9IGV4cG9ydHMuU3RhdHVzU3VtbWFyeVBhcnNlcnMuVVU7XG5leHBvcnRzLlN0YXR1c1N1bW1hcnlQYXJzZXJzLkREID0gZXhwb3J0cy5TdGF0dXNTdW1tYXJ5UGFyc2Vycy5VVTtcbmV4cG9ydHMuU3RhdHVzU3VtbWFyeVBhcnNlcnMuQVUgPSBleHBvcnRzLlN0YXR1c1N1bW1hcnlQYXJzZXJzLlVVO1xuZXhwb3J0cy5TdGF0dXNTdW1tYXJ5UGFyc2Vycy5VQSA9IGV4cG9ydHMuU3RhdHVzU3VtbWFyeVBhcnNlcnMuVVU7XG5jb25zdCBwYXJzZVN0YXR1c1N1bW1hcnkgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgIGxldCBmaWxlO1xuICAgIGNvbnN0IGxpbmVzID0gdGV4dC50cmltKCkuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBTdGF0dXNTdW1tYXJ5KCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgZmlsZSA9IHNwbGl0TGluZShsaW5lc1tpXSk7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGUuaGFuZGxlcikge1xuICAgICAgICAgICAgZmlsZS5oYW5kbGVyKGZpbGUucGF0aCwgc3RhdHVzLCBmaWxlLmluZGV4LCBmaWxlLndvcmtpbmdEaXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlLmNvZGUgIT09ICcjIycpIHtcbiAgICAgICAgICAgIHN0YXR1cy5maWxlcy5wdXNoKG5ldyBGaWxlU3RhdHVzU3VtbWFyeV8xLkZpbGVTdGF0dXNTdW1tYXJ5KGZpbGUucGF0aCwgZmlsZS5pbmRleCwgZmlsZS53b3JraW5nRGlyKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXR1cztcbn07XG5leHBvcnRzLnBhcnNlU3RhdHVzU3VtbWFyeSA9IHBhcnNlU3RhdHVzU3VtbWFyeTtcbmZ1bmN0aW9uIHNwbGl0TGluZShsaW5lU3RyKSB7XG4gICAgbGV0IGxpbmUgPSBsaW5lU3RyLnRyaW0oKS5tYXRjaCgvKC4uPykoXFxzKykoLiopLyk7XG4gICAgaWYgKCFsaW5lIHx8ICFsaW5lWzFdLnRyaW0oKSkge1xuICAgICAgICBsaW5lID0gbGluZVN0ci50cmltKCkubWF0Y2goLyguLj8pXFxzKyguKikvKTtcbiAgICB9XG4gICAgaWYgKCFsaW5lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGNvZGUgPSBsaW5lWzFdO1xuICAgIGlmIChsaW5lWzJdLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29kZSArPSAnICc7XG4gICAgfVxuICAgIGlmIChjb2RlLmxlbmd0aCA9PT0gMSAmJiBsaW5lWzJdLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb2RlID0gJyAnICsgY29kZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmF3OiBjb2RlLFxuICAgICAgICBjb2RlOiBjb2RlLnRyaW0oKSxcbiAgICAgICAgaW5kZXg6IGNvZGUuY2hhckF0KDApLFxuICAgICAgICB3b3JraW5nRGlyOiBjb2RlLmNoYXJBdCgxKSxcbiAgICAgICAgaGFuZGxlcjogZXhwb3J0cy5TdGF0dXNTdW1tYXJ5UGFyc2Vyc1tjb2RlLnRyaW0oKV0sXG4gICAgICAgIHBhdGg6IGxpbmVbM11cbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RhdHVzU3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RhdHVzVGFzayA9IHZvaWQgMDtcbmNvbnN0IFN0YXR1c1N1bW1hcnlfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvU3RhdHVzU3VtbWFyeVwiKTtcbmZ1bmN0aW9uIHN0YXR1c1Rhc2soY3VzdG9tQXJncykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgY29tbWFuZHM6IFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJywgJy1iJywgJy11JywgLi4uY3VzdG9tQXJnc10sXG4gICAgICAgIHBhcnNlcih0ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzU3VtbWFyeV8xLnBhcnNlU3RhdHVzU3VtbWFyeSh0ZXh0KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnRzLnN0YXR1c1Rhc2sgPSBzdGF0dXNUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RhdHVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51cGRhdGVTdWJNb2R1bGVUYXNrID0gZXhwb3J0cy5zdWJNb2R1bGVUYXNrID0gZXhwb3J0cy5pbml0U3ViTW9kdWxlVGFzayA9IGV4cG9ydHMuYWRkU3ViTW9kdWxlVGFzayA9IHZvaWQgMDtcbmNvbnN0IHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG5mdW5jdGlvbiBhZGRTdWJNb2R1bGVUYXNrKHJlcG8sIHBhdGgpIHtcbiAgICByZXR1cm4gc3ViTW9kdWxlVGFzayhbJ2FkZCcsIHJlcG8sIHBhdGhdKTtcbn1cbmV4cG9ydHMuYWRkU3ViTW9kdWxlVGFzayA9IGFkZFN1Yk1vZHVsZVRhc2s7XG5mdW5jdGlvbiBpbml0U3ViTW9kdWxlVGFzayhjdXN0b21BcmdzKSB7XG4gICAgcmV0dXJuIHN1Yk1vZHVsZVRhc2soWydpbml0JywgLi4uY3VzdG9tQXJnc10pO1xufVxuZXhwb3J0cy5pbml0U3ViTW9kdWxlVGFzayA9IGluaXRTdWJNb2R1bGVUYXNrO1xuZnVuY3Rpb24gc3ViTW9kdWxlVGFzayhjdXN0b21BcmdzKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbLi4uY3VzdG9tQXJnc107XG4gICAgaWYgKGNvbW1hbmRzWzBdICE9PSAnc3VibW9kdWxlJykge1xuICAgICAgICBjb21tYW5kcy51bnNoaWZ0KCdzdWJtb2R1bGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhc2tfMS5zdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzKTtcbn1cbmV4cG9ydHMuc3ViTW9kdWxlVGFzayA9IHN1Yk1vZHVsZVRhc2s7XG5mdW5jdGlvbiB1cGRhdGVTdWJNb2R1bGVUYXNrKGN1c3RvbUFyZ3MpIHtcbiAgICByZXR1cm4gc3ViTW9kdWxlVGFzayhbJ3VwZGF0ZScsIC4uLmN1c3RvbUFyZ3NdKTtcbn1cbmV4cG9ydHMudXBkYXRlU3ViTW9kdWxlVGFzayA9IHVwZGF0ZVN1Yk1vZHVsZVRhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdWItbW9kdWxlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZVRhZ0xpc3QgPSBleHBvcnRzLlRhZ0xpc3QgPSB2b2lkIDA7XG5jbGFzcyBUYWdMaXN0IHtcbiAgICBjb25zdHJ1Y3RvcihhbGwsIGxhdGVzdCkge1xuICAgICAgICB0aGlzLmFsbCA9IGFsbDtcbiAgICAgICAgdGhpcy5sYXRlc3QgPSBsYXRlc3Q7XG4gICAgfVxufVxuZXhwb3J0cy5UYWdMaXN0ID0gVGFnTGlzdDtcbmNvbnN0IHBhcnNlVGFnTGlzdCA9IGZ1bmN0aW9uIChkYXRhLCBjdXN0b21Tb3J0ID0gZmFsc2UpIHtcbiAgICBjb25zdCB0YWdzID0gZGF0YVxuICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5tYXAodHJpbW1lZClcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoIWN1c3RvbVNvcnQpIHtcbiAgICAgICAgdGFncy5zb3J0KGZ1bmN0aW9uICh0YWdBLCB0YWdCKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0c0EgPSB0YWdBLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBjb25zdCBwYXJ0c0IgPSB0YWdCLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBpZiAocGFydHNBLmxlbmd0aCA9PT0gMSB8fCBwYXJ0c0IubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpbmdsZVNvcnRlZCh0b051bWJlcihwYXJ0c0FbMF0pLCB0b051bWJlcihwYXJ0c0JbMF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gTWF0aC5tYXgocGFydHNBLmxlbmd0aCwgcGFydHNCLmxlbmd0aCk7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gc29ydGVkKHRvTnVtYmVyKHBhcnRzQVtpXSksIHRvTnVtYmVyKHBhcnRzQltpXSkpO1xuICAgICAgICAgICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkaWZmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgbGF0ZXN0ID0gY3VzdG9tU29ydCA/IHRhZ3NbMF0gOiBbLi4udGFnc10ucmV2ZXJzZSgpLmZpbmQoKHRhZykgPT4gdGFnLmluZGV4T2YoJy4nKSA+PSAwKTtcbiAgICByZXR1cm4gbmV3IFRhZ0xpc3QodGFncywgbGF0ZXN0KTtcbn07XG5leHBvcnRzLnBhcnNlVGFnTGlzdCA9IHBhcnNlVGFnTGlzdDtcbmZ1bmN0aW9uIHNpbmdsZVNvcnRlZChhLCBiKSB7XG4gICAgY29uc3QgYUlzTnVtID0gaXNOYU4oYSk7XG4gICAgY29uc3QgYklzTnVtID0gaXNOYU4oYik7XG4gICAgaWYgKGFJc051bSAhPT0gYklzTnVtKSB7XG4gICAgICAgIHJldHVybiBhSXNOdW0gPyAxIDogLTE7XG4gICAgfVxuICAgIHJldHVybiBhSXNOdW0gPyBzb3J0ZWQoYSwgYikgOiAwO1xufVxuZnVuY3Rpb24gc29ydGVkKGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PT0gYiA/IDAgOiBhID4gYiA/IDEgOiAtMTtcbn1cbmZ1bmN0aW9uIHRyaW1tZWQoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQudHJpbSgpO1xufVxuZnVuY3Rpb24gdG9OdW1iZXIoaW5wdXQpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQoaW5wdXQucmVwbGFjZSgvXlxcRCsvZywgJycpLCAxMCkgfHwgMDtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWdMaXN0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hZGRBbm5vdGF0ZWRUYWdUYXNrID0gZXhwb3J0cy5hZGRUYWdUYXNrID0gZXhwb3J0cy50YWdMaXN0VGFzayA9IHZvaWQgMDtcbmNvbnN0IFRhZ0xpc3RfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvVGFnTGlzdFwiKTtcbi8qKlxuICogVGFzayB1c2VkIGJ5IGBnaXQudGFnc2BcbiAqL1xuZnVuY3Rpb24gdGFnTGlzdFRhc2soY3VzdG9tQXJncyA9IFtdKSB7XG4gICAgY29uc3QgaGFzQ3VzdG9tU29ydCA9IGN1c3RvbUFyZ3Muc29tZSgob3B0aW9uKSA9PiAvXi0tc29ydD0vLnRlc3Qob3B0aW9uKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBjb21tYW5kczogWyd0YWcnLCAnLWwnLCAuLi5jdXN0b21BcmdzXSxcbiAgICAgICAgcGFyc2VyKHRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBUYWdMaXN0XzEucGFyc2VUYWdMaXN0KHRleHQsIGhhc0N1c3RvbVNvcnQpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnRzLnRhZ0xpc3RUYXNrID0gdGFnTGlzdFRhc2s7XG4vKipcbiAqIFRhc2sgdXNlZCBieSBgZ2l0LmFkZFRhZ2BcbiAqL1xuZnVuY3Rpb24gYWRkVGFnVGFzayhuYW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBjb21tYW5kczogWyd0YWcnLCBuYW1lXSxcbiAgICAgICAgcGFyc2VyKCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZSB9O1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMuYWRkVGFnVGFzayA9IGFkZFRhZ1Rhc2s7XG4vKipcbiAqIFRhc2sgdXNlZCBieSBgZ2l0LmFkZFRhZ2BcbiAqL1xuZnVuY3Rpb24gYWRkQW5ub3RhdGVkVGFnVGFzayhuYW1lLCB0YWdNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBjb21tYW5kczogWyd0YWcnLCAnLWEnLCAnLW0nLCB0YWdNZXNzYWdlLCBuYW1lXSxcbiAgICAgICAgcGFyc2VyKCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZSB9O1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMuYWRkQW5ub3RhdGVkVGFnVGFzayA9IGFkZEFubm90YXRlZFRhZ1Rhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWcuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlQ2hlY2tJZ25vcmUgPSB2b2lkIDA7XG4vKipcbiAqIFBhcnNlciBmb3IgdGhlIGBjaGVjay1pZ25vcmVgIGNvbW1hbmQgLSByZXR1cm5zIGVhY2ggZmlsZSBhcyBhIHN0cmluZyBhcnJheVxuICovXG5jb25zdCBwYXJzZUNoZWNrSWdub3JlID0gKHRleHQpID0+IHtcbiAgICByZXR1cm4gdGV4dC5zcGxpdCgvXFxuL2cpXG4gICAgICAgIC5tYXAobGluZSA9PiBsaW5lLnRyaW0oKSlcbiAgICAgICAgLmZpbHRlcihmaWxlID0+ICEhZmlsZSk7XG59O1xuZXhwb3J0cy5wYXJzZUNoZWNrSWdub3JlID0gcGFyc2VDaGVja0lnbm9yZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoZWNrSWdub3JlLmpzLm1hcCIsImNvbnN0IHtHaXRFeGVjdXRvcn0gPSByZXF1aXJlKCcuL2xpYi9ydW5uZXJzL2dpdC1leGVjdXRvcicpO1xuXG5jb25zdCB7U2NoZWR1bGVyfSA9IHJlcXVpcmUoJy4vbGliL3J1bm5lcnMvc2NoZWR1bGVyJyk7XG5jb25zdCB7R2l0TG9nZ2VyfSA9IHJlcXVpcmUoJy4vbGliL2dpdC1sb2dnZXInKTtcbmNvbnN0IHthZGhvY0V4ZWNUYXNrLCBjb25maWd1cmF0aW9uRXJyb3JUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3Rhc2snKTtcbmNvbnN0IHtOT09QLCBhcHBlbmRUYXNrT3B0aW9ucywgYXNBcnJheSwgZmlsdGVyQXJyYXksIGZpbHRlclByaW1pdGl2ZXMsIGZpbHRlclN0cmluZywgZmlsdGVyU3RyaW5nT3JTdHJpbmdBcnJheSwgZmlsdGVyVHlwZSwgZm9sZGVyRXhpc3RzLCBnZXRUcmFpbGluZ09wdGlvbnMsIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudCwgdHJhaWxpbmdPcHRpb25zQXJndW1lbnR9ID0gcmVxdWlyZSgnLi9saWIvdXRpbHMnKTtcbmNvbnN0IHticmFuY2hUYXNrLCBicmFuY2hMb2NhbFRhc2ssIGRlbGV0ZUJyYW5jaGVzVGFzaywgZGVsZXRlQnJhbmNoVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9icmFuY2gnKTtcbmNvbnN0IHt0YXNrQ2FsbGJhY2t9ID0gcmVxdWlyZSgnLi9saWIvdGFzay1jYWxsYmFjaycpO1xuY29uc3Qge2NoZWNrSXNSZXBvVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9jaGVjay1pcy1yZXBvJyk7XG5jb25zdCB7Y2xvbmVUYXNrLCBjbG9uZU1pcnJvclRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvY2xvbmUnKTtcbmNvbnN0IHthZGRDb25maWdUYXNrLCBsaXN0Q29uZmlnVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9jb25maWcnKTtcbmNvbnN0IHtjbGVhbldpdGhPcHRpb25zVGFzaywgaXNDbGVhbk9wdGlvbnNBcnJheX0gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9jbGVhbicpO1xuY29uc3Qge2NvbW1pdFRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvY29tbWl0Jyk7XG5jb25zdCB7ZGlmZlN1bW1hcnlUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2RpZmYnKTtcbmNvbnN0IHtmZXRjaFRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvZmV0Y2gnKTtcbmNvbnN0IHtoYXNoT2JqZWN0VGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9oYXNoLW9iamVjdCcpO1xuY29uc3Qge2luaXRUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2luaXQnKTtcbmNvbnN0IHtsb2dUYXNrLCBwYXJzZUxvZ09wdGlvbnN9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvbG9nJyk7XG5jb25zdCB7bWVyZ2VUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL21lcmdlJyk7XG5jb25zdCB7bW92ZVRhc2t9ID0gcmVxdWlyZShcIi4vbGliL3Rhc2tzL21vdmVcIik7XG5jb25zdCB7cHVsbFRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvcHVsbCcpO1xuY29uc3Qge3B1c2hUYWdzVGFzaywgcHVzaFRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvcHVzaCcpO1xuY29uc3Qge2FkZFJlbW90ZVRhc2ssIGdldFJlbW90ZXNUYXNrLCBsaXN0UmVtb3Rlc1Rhc2ssIHJlbW90ZVRhc2ssIHJlbW92ZVJlbW90ZVRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvcmVtb3RlJyk7XG5jb25zdCB7Z2V0UmVzZXRNb2RlLCByZXNldFRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvcmVzZXQnKTtcbmNvbnN0IHtzdGFzaExpc3RUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3N0YXNoLWxpc3QnKTtcbmNvbnN0IHtzdGF0dXNUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3N0YXR1cycpO1xuY29uc3Qge2FkZFN1Yk1vZHVsZVRhc2ssIGluaXRTdWJNb2R1bGVUYXNrLCBzdWJNb2R1bGVUYXNrLCB1cGRhdGVTdWJNb2R1bGVUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3N1Yi1tb2R1bGUnKTtcbmNvbnN0IHthZGRBbm5vdGF0ZWRUYWdUYXNrLCBhZGRUYWdUYXNrLCB0YWdMaXN0VGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy90YWcnKTtcbmNvbnN0IHtzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3Rhc2snKTtcbmNvbnN0IHtwYXJzZUNoZWNrSWdub3JlfSA9IHJlcXVpcmUoJy4vbGliL3Jlc3BvbnNlcy9DaGVja0lnbm9yZScpO1xuXG5jb25zdCBDaGFpbmVkRXhlY3V0b3IgPSBTeW1ib2woJ0NoYWluZWRFeGVjdXRvcicpO1xuXG4vKipcbiAqIEdpdCBoYW5kbGluZyBmb3Igbm9kZS4gQWxsIHB1YmxpYyBmdW5jdGlvbnMgY2FuIGJlIGNoYWluZWQgYW5kIGFsbCBgdGhlbmAgaGFuZGxlcnMgYXJlIG9wdGlvbmFsLlxuICpcbiAqIEBwYXJhbSB7U2ltcGxlR2l0T3B0aW9uc30gb3B0aW9ucyBDb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGlzIGluc3RhbmNlXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEdpdCAob3B0aW9ucykge1xuICAgdGhpcy5fZXhlY3V0b3IgPSBuZXcgR2l0RXhlY3V0b3IoXG4gICAgICBvcHRpb25zLmJpbmFyeSwgb3B0aW9ucy5iYXNlRGlyLFxuICAgICAgbmV3IFNjaGVkdWxlcihvcHRpb25zLm1heENvbmN1cnJlbnRQcm9jZXNzZXMpXG4gICApO1xuICAgdGhpcy5fbG9nZ2VyID0gbmV3IEdpdExvZ2dlcigpO1xufVxuXG4vKipcbiAqIFRoZSBleGVjdXRvciB0aGF0IHJ1bnMgZWFjaCBvZiB0aGUgYWRkZWQgY29tbWFuZHNcbiAqIEB0eXBlIHtHaXRFeGVjdXRvcn1cbiAqIEBwcml2YXRlXG4gKi9cbkdpdC5wcm90b3R5cGUuX2V4ZWN1dG9yID0gbnVsbDtcblxuLyoqXG4gKiBMb2dnaW5nIHV0aWxpdHkgZm9yIHByaW50aW5nIG91dCBpbmZvIG9yIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSB1c2VyXG4gKiBAdHlwZSB7R2l0TG9nZ2VyfVxuICogQHByaXZhdGVcbiAqL1xuR2l0LnByb3RvdHlwZS5fbG9nZ2VyID0gbnVsbDtcblxuLyoqXG4gKiBTZXRzIHRoZSBwYXRoIHRvIGEgY3VzdG9tIGdpdCBiaW5hcnksIHNob3VsZCBlaXRoZXIgYmUgYGdpdGAgd2hlbiB0aGVyZSBpcyBhbiBpbnN0YWxsYXRpb24gb2YgZ2l0IGF2YWlsYWJsZSBvblxuICogdGhlIHN5c3RlbSBwYXRoLCBvciBhIGZ1bGx5IHF1YWxpZmllZCBwYXRoIHRvIHRoZSBleGVjdXRhYmxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kXG4gKiBAcmV0dXJucyB7R2l0fVxuICovXG5HaXQucHJvdG90eXBlLmN1c3RvbUJpbmFyeSA9IGZ1bmN0aW9uIChjb21tYW5kKSB7XG4gICB0aGlzLl9leGVjdXRvci5iaW5hcnkgPSBjb21tYW5kO1xuICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MsIGVpdGhlciBzdXBwbHkgYm90aCBhIG5hbWUgYW5kIHZhbHVlIGFzIHN0cmluZ3Mgb3JcbiAqIGEgc2luZ2xlIG9iamVjdCB0byBlbnRpcmVseSByZXBsYWNlIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdXG4gKiBAcmV0dXJucyB7R2l0fVxuICovXG5HaXQucHJvdG90eXBlLmVudiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLl9leGVjdXRvci5lbnYgPSBuYW1lO1xuICAgfSBlbHNlIHtcbiAgICAgICh0aGlzLl9leGVjdXRvci5lbnYgPSB0aGlzLl9leGVjdXRvci5lbnYgfHwge30pW25hbWVdID0gdmFsdWU7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgc3Vic2VxdWVudCBjb21tYW5kcy5cbiAqL1xuR2l0LnByb3RvdHlwZS5jd2QgPSBmdW5jdGlvbiAod29ya2luZ0RpcmVjdG9yeSkge1xuICAgY29uc3QgdGFzayA9ICh0eXBlb2Ygd29ya2luZ0RpcmVjdG9yeSAhPT0gJ3N0cmluZycpXG4gICAgICA/IGNvbmZpZ3VyYXRpb25FcnJvclRhc2soJ0dpdC5jd2Q6IHdvcmtpbmdEaXJlY3RvcnkgbXVzdCBiZSBzdXBwbGllZCBhcyBhIHN0cmluZycpXG4gICAgICA6IGFkaG9jRXhlY1Rhc2soKCkgPT4ge1xuICAgICAgICAgaWYgKCFmb2xkZXJFeGlzdHMod29ya2luZ0RpcmVjdG9yeSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0LmN3ZDogY2Fubm90IGNoYW5nZSB0byBub24tZGlyZWN0b3J5IFwiJHsgd29ya2luZ0RpcmVjdG9yeSB9XCJgKTtcbiAgICAgICAgIH1cblxuICAgICAgICAgcmV0dXJuICh0aGlzLl9leGVjdXRvci5jd2QgPSB3b3JraW5nRGlyZWN0b3J5KTtcbiAgICAgIH0pO1xuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSB8fCBOT09QKTtcbn07XG5cbi8qKlxuICogU2V0cyBhIGhhbmRsZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGEgbmV3IGNoaWxkIHByb2Nlc3MgaXMgY3JlYXRlZCwgdGhlIGhhbmRsZXIgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWRcbiAqIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgYmVpbmcgcnVuIGFuZCB0aGUgc3Rkb3V0ICYgc3RkZXJyIHN0cmVhbXMgdXNlZCBieSB0aGUgQ2hpbGRQcm9jZXNzLlxuICpcbiAqIEBleGFtcGxlXG4gKiByZXF1aXJlKCdzaW1wbGUtZ2l0JylcbiAqICAgIC5vdXRwdXRIYW5kbGVyKGZ1bmN0aW9uIChjb21tYW5kLCBzdGRvdXQsIHN0ZGVycikge1xuICogICAgICAgc3Rkb3V0LnBpcGUocHJvY2Vzcy5zdGRvdXQpO1xuICogICAgfSlcbiAqICAgIC5jaGVja291dCgnaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwby5naXQnKTtcbiAqXG4gKiBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvY2hpbGRfcHJvY2Vzcy5odG1sI2NoaWxkX3Byb2Nlc3NfY2xhc3NfY2hpbGRwcm9jZXNzXG4gKiBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvc3RyZWFtLmh0bWwjc3RyZWFtX2NsYXNzX3N0cmVhbV9yZWFkYWJsZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3V0cHV0SGFuZGxlclxuICogQHJldHVybnMge0dpdH1cbiAqL1xuR2l0LnByb3RvdHlwZS5vdXRwdXRIYW5kbGVyID0gZnVuY3Rpb24gKG91dHB1dEhhbmRsZXIpIHtcbiAgIHRoaXMuX2V4ZWN1dG9yLm91dHB1dEhhbmRsZXIgPSBvdXRwdXRIYW5kbGVyO1xuICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBnaXQgcmVwb1xuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2JhcmU9ZmFsc2VdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKGJhcmUsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgaW5pdFRhc2soYmFyZSA9PT0gdHJ1ZSwgdGhpcy5fZXhlY3V0b3IuY3dkLCBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIGxvY2FsIHJlcG9cbiAqL1xuR2l0LnByb3RvdHlwZS5zdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0YXR1c1Rhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBMaXN0IHRoZSBzdGFzaChzKSBvZiB0aGUgbG9jYWwgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLnN0YXNoTGlzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0YXNoTGlzdFRhc2soXG4gICAgICAgICB0cmFpbGluZ09wdGlvbnNBcmd1bWVudChhcmd1bWVudHMpIHx8IHt9LFxuICAgICAgICAgZmlsdGVyQXJyYXkob3B0aW9ucykgJiYgb3B0aW9ucyB8fCBbXVxuICAgICAgKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogU3Rhc2ggdGhlIGxvY2FsIHJlcG9cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5zdGFzaCA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydzdGFzaCcsIC4uLmdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpXSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVDbG9uZVRhc2sgKGFwaSwgdGFzaywgcmVwb1BhdGgsIGxvY2FsUGF0aCkge1xuICAgaWYgKHR5cGVvZiByZXBvUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBjb25maWd1cmF0aW9uRXJyb3JUYXNrKGBnaXQuJHsgYXBpIH0oKSByZXF1aXJlcyBhIHN0cmluZyAncmVwb1BhdGgnYCk7XG4gICB9XG5cbiAgIHJldHVybiB0YXNrKHJlcG9QYXRoLCBmaWx0ZXJUeXBlKGxvY2FsUGF0aCwgZmlsdGVyU3RyaW5nKSwgZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpO1xufVxuXG5cbi8qKlxuICogQ2xvbmUgYSBnaXQgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBjcmVhdGVDbG9uZVRhc2soJ2Nsb25lJywgY2xvbmVUYXNrLCAuLi5hcmd1bWVudHMpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBNaXJyb3IgYSBnaXQgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLm1pcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgY3JlYXRlQ2xvbmVUYXNrKCdtaXJyb3InLCBjbG9uZU1pcnJvclRhc2ssIC4uLmFyZ3VtZW50cyksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIE1vdmVzIG9uZSBvciBtb3JlIGZpbGVzIHRvIGEgbmV3IGRlc3RpbmF0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1tdlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBmcm9tXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9cbiAqL1xuR2l0LnByb3RvdHlwZS5tdiA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2sobW92ZVRhc2soZnJvbSwgdG8pLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSk7XG59O1xuXG4vKipcbiAqIEludGVybmFsbHkgdXNlcyBwdWxsIGFuZCB0YWdzIHRvIGdldCB0aGUgbGlzdCBvZiB0YWdzIHRoZW4gY2hlY2tzIG91dCB0aGUgbGF0ZXN0IHRhZy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5jaGVja291dExhdGVzdFRhZyA9IGZ1bmN0aW9uICh0aGVuKSB7XG4gICB2YXIgZ2l0ID0gdGhpcztcbiAgIHJldHVybiB0aGlzLnB1bGwoZnVuY3Rpb24gKCkge1xuICAgICAgZ2l0LnRhZ3MoZnVuY3Rpb24gKGVyciwgdGFncykge1xuICAgICAgICAgZ2l0LmNoZWNrb3V0KHRhZ3MubGF0ZXN0LCB0aGVuKTtcbiAgICAgIH0pO1xuICAgfSk7XG59O1xuXG4vKipcbiAqIEFkZHMgb25lIG9yIG1vcmUgZmlsZXMgdG8gc291cmNlIGNvbnRyb2xcbiAqL1xuR2l0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZmlsZXMpIHtcbiAgIHJldHVybiB0aGlzLl9ydW4oXG4gICAgICBbJ2FkZCddLmNvbmNhdChmaWxlcyksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIENvbW1pdHMgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAtIHdoZW4gc3BlY2lmaWMgZmlsZSBwYXRocyBhcmUgc3VwcGxpZWQsIG9ubHkgY2hhbmdlcyBvbiB0aG9zZVxuICogZmlsZXMgd2lsbCBiZSBjb21taXR0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IG1lc3NhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbZmlsZXNdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5jb21taXQgPSBmdW5jdGlvbiAobWVzc2FnZSwgZmlsZXMsIG9wdGlvbnMsIHRoZW4pIHtcbiAgIGNvbnN0IG5leHQgPSB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKTtcbiAgIGNvbnN0IG1lc3NhZ2VzID0gW107XG5cbiAgIGlmIChmaWx0ZXJTdHJpbmdPclN0cmluZ0FycmF5KG1lc3NhZ2UpKSB7XG4gICAgICBtZXNzYWdlcy5wdXNoKC4uLmFzQXJyYXkobWVzc2FnZSkpO1xuICAgfVxuICAgZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3NpbXBsZS1naXQgZGVwcmVjYXRpb24gbm90aWNlOiBnaXQuY29tbWl0OiByZXF1aXJlcyB0aGUgY29tbWl0IG1lc3NhZ2UgdG8gYmUgc3VwcGxpZWQgYXMgYSBzdHJpbmcvc3RyaW5nW10sIHRoaXMgd2lsbCBiZSBhbiBlcnJvciBpbiB2ZXJzaW9uIDMnKTtcbiAgIH1cblxuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBjb21taXRUYXNrKFxuICAgICAgICAgbWVzc2FnZXMsXG4gICAgICAgICBhc0FycmF5KGZpbHRlclR5cGUoZmlsZXMsIGZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXksIFtdKSksXG4gICAgICAgICBbLi4uZmlsdGVyVHlwZShvcHRpb25zLCBmaWx0ZXJBcnJheSwgW10pLCAuLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCAwLCB0cnVlKV1cbiAgICAgICksXG4gICAgICBuZXh0XG4gICApO1xufTtcblxuLyoqXG4gKiBQdWxsIHRoZSB1cGRhdGVkIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IHJlcG9cbiAqL1xuR2l0LnByb3RvdHlwZS5wdWxsID0gZnVuY3Rpb24gKHJlbW90ZSwgYnJhbmNoLCBvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHB1bGxUYXNrKGZpbHRlclR5cGUocmVtb3RlLCBmaWx0ZXJTdHJpbmcpLCBmaWx0ZXJUeXBlKGJyYW5jaCwgZmlsdGVyU3RyaW5nKSwgZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBGZXRjaCB0aGUgdXBkYXRlZCBjb250ZW50cyBvZiB0aGUgY3VycmVudCByZXBvLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIC5mZXRjaCgndXBzdHJlYW0nLCAnbWFzdGVyJykgLy8gZmV0Y2hlcyBmcm9tIG1hc3RlciBvbiByZW1vdGUgbmFtZWQgdXBzdHJlYW1cbiAqICAgLmZldGNoKGZ1bmN0aW9uICgpIHt9KSAvLyBydW5zIGZldGNoIGFnYWluc3QgZGVmYXVsdCByZW1vdGUgYW5kIGJyYW5jaCBhbmQgY2FsbHMgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3JlbW90ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYnJhbmNoXVxuICovXG5HaXQucHJvdG90eXBlLmZldGNoID0gZnVuY3Rpb24gKHJlbW90ZSwgYnJhbmNoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGZldGNoVGFzayhmaWx0ZXJUeXBlKHJlbW90ZSwgZmlsdGVyU3RyaW5nKSwgZmlsdGVyVHlwZShicmFuY2gsIGZpbHRlclN0cmluZyksIGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogRGlzYWJsZXMvZW5hYmxlcyB0aGUgdXNlIG9mIHRoZSBjb25zb2xlIGZvciBwcmludGluZyB3YXJuaW5ncyBhbmQgZXJyb3JzLCBieSBkZWZhdWx0IG1lc3NhZ2VzIGFyZSBub3Qgc2hvd24gaW5cbiAqIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNpbGVuY2VcbiAqIEByZXR1cm5zIHtHaXR9XG4gKi9cbkdpdC5wcm90b3R5cGUuc2lsZW50ID0gZnVuY3Rpb24gKHNpbGVuY2UpIHtcbiAgIHRoaXMuX2xvZ2dlci5zaWxlbnQoISFzaWxlbmNlKTtcbiAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBMaXN0IGFsbCB0YWdzLiBXaGVuIHVzaW5nIGdpdCAyLjcuMCBvciBhYm92ZSwgaW5jbHVkZSBhbiBvcHRpb25zIG9iamVjdCB3aXRoIGBcIi0tc29ydFwiOiBcInByb3BlcnR5LW5hbWVcImAgdG9cbiAqIHNvcnQgdGhlIHRhZ3MgYnkgdGhhdCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBkZWZhdWx0IHNlbWFudGljIHZlcnNpb25pbmcgc29ydC5cbiAqXG4gKiBOb3RlLCBzdXBwbHlpbmcgdGhpcyBvcHRpb24gd2hlbiBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHlvdXIgR2l0IHZlcnNpb24gd2lsbCBjYXVzZSB0aGUgb3BlcmF0aW9uIHRvIGZhaWwuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUudGFncyA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHRhZ0xpc3RUYXNrKGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogUmViYXNlcyB0aGUgY3VycmVudCB3b3JraW5nIGNvcHkuIE9wdGlvbnMgY2FuIGJlIHN1cHBsaWVkIGVpdGhlciBhcyBhbiBhcnJheSBvZiBzdHJpbmcgcGFyYW1ldGVyc1xuICogdG8gYmUgc2VudCB0byB0aGUgYGdpdCByZWJhc2VgIGNvbW1hbmQsIG9yIGEgc3RhbmRhcmQgb3B0aW9ucyBvYmplY3QuXG4gKi9cbkdpdC5wcm90b3R5cGUucmViYXNlID0gZnVuY3Rpb24gKCkge1xuICAgcmV0dXJuIHRoaXMuX3J1bihcbiAgICAgIFsncmViYXNlJ10uY29uY2F0KGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKiBSZXNldCBhIHJlcG9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW21vZGU9c29mdF0gRWl0aGVyIGFuIGFycmF5IG9mIGFyZ3VtZW50cyBzdXBwb3J0ZWQgYnkgdGhlICdnaXQgcmVzZXQnIGNvbW1hbmQsIG9yIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZhbHVlICdzb2Z0JyBvciAnaGFyZCcgdG8gc2V0IHRoZSByZXNldCBtb2RlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAobW9kZSwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICByZXNldFRhc2soZ2V0UmVzZXRNb2RlKG1vZGUpLCBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIFJldmVydCBvbmUgb3IgbW9yZSBjb21taXRzIGluIHRoZSBsb2NhbCB3b3JraW5nIGNvcHlcbiAqL1xuR2l0LnByb3RvdHlwZS5yZXZlcnQgPSBmdW5jdGlvbiAoY29tbWl0KSB7XG4gICBjb25zdCBuZXh0ID0gdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyk7XG5cbiAgIGlmICh0eXBlb2YgY29tbWl0ICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICBjb25maWd1cmF0aW9uRXJyb3JUYXNrKCdDb21taXQgbXVzdCBiZSBhIHN0cmluZycpLFxuICAgICAgICAgbmV4dCxcbiAgICAgICk7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzLl9ydW4oW1xuICAgICAgJ3JldmVydCcsXG4gICAgICAuLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCAwLCB0cnVlKSxcbiAgICAgIGNvbW1pdFxuICAgXSwgbmV4dCk7XG59O1xuXG4vKipcbiAqIEFkZCBhIGxpZ2h0d2VpZ2h0IHRhZyB0byB0aGUgaGVhZCBvZiB0aGUgY3VycmVudCBicmFuY2hcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUuYWRkVGFnID0gZnVuY3Rpb24gKG5hbWUsIHRoZW4pIHtcbiAgIGNvbnN0IHRhc2sgPSAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKVxuICAgICAgPyBhZGRUYWdUYXNrKG5hbWUpXG4gICAgICA6IGNvbmZpZ3VyYXRpb25FcnJvclRhc2soJ0dpdC5hZGRUYWcgcmVxdWlyZXMgYSB0YWcgbmFtZScpO1xuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSk7XG59O1xuXG4vKipcbiAqIEFkZCBhbiBhbm5vdGF0ZWQgdGFnIHRvIHRoZSBoZWFkIG9mIHRoZSBjdXJyZW50IGJyYW5jaFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnTWVzc2FnZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUuYWRkQW5ub3RhdGVkVGFnID0gZnVuY3Rpb24gKHRhZ05hbWUsIHRhZ01lc3NhZ2UsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgYWRkQW5ub3RhdGVkVGFnVGFzayh0YWdOYW1lLCB0YWdNZXNzYWdlKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgb3V0IGEgdGFnIG9yIHJldmlzaW9uLCBhbnkgbnVtYmVyIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGNhbiBiZSBwYXNzZWQgdG8gdGhlIGBnaXQgY2hlY2tvdXRgIGNvbW1hbmRcbiAqIGJ5IHN1cHBseWluZyBlaXRoZXIgYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyBhcyB0aGUgYHdoYXRgIHBhcmFtZXRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gd2hhdCBPbmUgb3IgbW9yZSBjb21tYW5kcyB0byBwYXNzIHRvIGBnaXQgY2hlY2tvdXRgXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5jaGVja291dCA9IGZ1bmN0aW9uICh3aGF0LCB0aGVuKSB7XG4gICBjb25zdCBjb21tYW5kcyA9IFsnY2hlY2tvdXQnLCAuLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCB0cnVlKV07XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBDaGVjayBvdXQgYSByZW1vdGUgYnJhbmNoXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJyYW5jaE5hbWUgbmFtZSBvZiBicmFuY2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGFydFBvaW50IChlLmcgb3JpZ2luL2RldmVsb3BtZW50KVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUuY2hlY2tvdXRCcmFuY2ggPSBmdW5jdGlvbiAoYnJhbmNoTmFtZSwgc3RhcnRQb2ludCwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuY2hlY2tvdXQoWyctYicsIGJyYW5jaE5hbWUsIHN0YXJ0UG9pbnRdLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSk7XG59O1xuXG4vKipcbiAqIENoZWNrIG91dCBhIGxvY2FsIGJyYW5jaFxuICovXG5HaXQucHJvdG90eXBlLmNoZWNrb3V0TG9jYWxCcmFuY2ggPSBmdW5jdGlvbiAoYnJhbmNoTmFtZSwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuY2hlY2tvdXQoWyctYicsIGJyYW5jaE5hbWVdLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSk7XG59O1xuXG4vKipcbiAqIERlbGV0ZSBhIGxvY2FsIGJyYW5jaFxuICovXG5HaXQucHJvdG90eXBlLmRlbGV0ZUxvY2FsQnJhbmNoID0gZnVuY3Rpb24gKGJyYW5jaE5hbWUsIGZvcmNlRGVsZXRlLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGRlbGV0ZUJyYW5jaFRhc2soYnJhbmNoTmFtZSwgdHlwZW9mIGZvcmNlRGVsZXRlID09PSBcImJvb2xlYW5cIiA/IGZvcmNlRGVsZXRlIDogZmFsc2UpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBEZWxldGUgb25lIG9yIG1vcmUgbG9jYWwgYnJhbmNoZXNcbiAqL1xuR2l0LnByb3RvdHlwZS5kZWxldGVMb2NhbEJyYW5jaGVzID0gZnVuY3Rpb24gKGJyYW5jaE5hbWVzLCBmb3JjZURlbGV0ZSwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBkZWxldGVCcmFuY2hlc1Rhc2soYnJhbmNoTmFtZXMsIHR5cGVvZiBmb3JjZURlbGV0ZSA9PT0gXCJib29sZWFuXCIgPyBmb3JjZURlbGV0ZSA6IGZhbHNlKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogTGlzdCBhbGwgYnJhbmNoZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdCB8IHN0cmluZ1tdfSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmJyYW5jaCA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGJyYW5jaFRhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gbGlzdCBvZiBsb2NhbCBicmFuY2hlc1xuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmJyYW5jaExvY2FsID0gZnVuY3Rpb24gKHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgYnJhbmNoTG9jYWxUYXNrKCksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIEFkZCBjb25maWcgdG8gbG9jYWwgZ2l0IGluc3RhbmNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBjb25maWd1cmF0aW9uIGtleSAoZS5nIHVzZXIubmFtZSlcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSAoZS5nIHlvdXIgbmFtZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FwcGVuZD1mYWxzZV0gb3B0aW9uYWxseSBhcHBlbmQgdGhlIGtleS92YWx1ZSBwYWlyIChlcXVpdmFsZW50IG9mIHBhc3NpbmcgYC0tYWRkYCBvcHRpb24pLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUuYWRkQ29uZmlnID0gZnVuY3Rpb24gKGtleSwgdmFsdWUsIGFwcGVuZCwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBhZGRDb25maWdUYXNrKGtleSwgdmFsdWUsIHR5cGVvZiBhcHBlbmQgPT09IFwiYm9vbGVhblwiID8gYXBwZW5kIDogZmFsc2UpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuR2l0LnByb3RvdHlwZS5saXN0Q29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2sobGlzdENvbmZpZ1Rhc2soKSwgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlcyBhbnkgY29tbWFuZCBhZ2FpbnN0IHRoZSBnaXQgYmluYXJ5LlxuICovXG5HaXQucHJvdG90eXBlLnJhdyA9IGZ1bmN0aW9uIChjb21tYW5kcykge1xuICAgY29uc3QgY3JlYXRlUmVzdENvbW1hbmRzID0gIUFycmF5LmlzQXJyYXkoY29tbWFuZHMpO1xuICAgY29uc3QgY29tbWFuZCA9IFtdLnNsaWNlLmNhbGwoY3JlYXRlUmVzdENvbW1hbmRzID8gYXJndW1lbnRzIDogY29tbWFuZHMsIDApO1xuXG4gICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1hbmQubGVuZ3RoICYmIGNyZWF0ZVJlc3RDb21tYW5kczsgaSsrKSB7XG4gICAgICBpZiAoIWZpbHRlclByaW1pdGl2ZXMoY29tbWFuZFtpXSkpIHtcbiAgICAgICAgIGNvbW1hbmQuc3BsaWNlKGksIGNvbW1hbmQubGVuZ3RoIC0gaSk7XG4gICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgIH1cblxuICAgY29tbWFuZC5wdXNoKFxuICAgICAgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgMCwgdHJ1ZSksXG4gICApO1xuXG4gICB2YXIgbmV4dCA9IHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpO1xuXG4gICBpZiAoIWNvbW1hbmQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgICAgIGNvbmZpZ3VyYXRpb25FcnJvclRhc2soJ1JhdzogbXVzdCBzdXBwbHkgb25lIG9yIG1vcmUgY29tbWFuZCB0byBleGVjdXRlJyksXG4gICAgICAgICBuZXh0LFxuICAgICAgKTtcbiAgIH1cblxuICAgcmV0dXJuIHRoaXMuX3J1bihjb21tYW5kLCBuZXh0KTtcbn07XG5cbkdpdC5wcm90b3R5cGUuc3VibW9kdWxlQWRkID0gZnVuY3Rpb24gKHJlcG8sIHBhdGgsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgYWRkU3ViTW9kdWxlVGFzayhyZXBvLCBwYXRoKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuc3VibW9kdWxlVXBkYXRlID0gZnVuY3Rpb24gKGFyZ3MsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgdXBkYXRlU3ViTW9kdWxlVGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCB0cnVlKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG5HaXQucHJvdG90eXBlLnN1Ym1vZHVsZUluaXQgPSBmdW5jdGlvbiAoYXJncywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBpbml0U3ViTW9kdWxlVGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCB0cnVlKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG5HaXQucHJvdG90eXBlLnN1Yk1vZHVsZSA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN1Yk1vZHVsZVRhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuR2l0LnByb3RvdHlwZS5saXN0UmVtb3RlID0gZnVuY3Rpb24gKCkge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBsaXN0UmVtb3Rlc1Rhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBBZGRzIGEgcmVtb3RlIHRvIHRoZSBsaXN0IG9mIHJlbW90ZXMuXG4gKi9cbkdpdC5wcm90b3R5cGUuYWRkUmVtb3RlID0gZnVuY3Rpb24gKHJlbW90ZU5hbWUsIHJlbW90ZVJlcG8sIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgYWRkUmVtb3RlVGFzayhyZW1vdGVOYW1lLCByZW1vdGVSZXBvLCBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgYW4gZW50cnkgYnkgbmFtZSBmcm9tIHRoZSBsaXN0IG9mIHJlbW90ZXMuXG4gKi9cbkdpdC5wcm90b3R5cGUucmVtb3ZlUmVtb3RlID0gZnVuY3Rpb24gKHJlbW90ZU5hbWUsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgcmVtb3ZlUmVtb3RlVGFzayhyZW1vdGVOYW1lKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSByZW1vdGVzLCBzZXR0aW5nIHRoZSBvcHRpb25hbCB2ZXJib3NlIGFyZ3VtZW50IHRvIHRydWUgaW5jbHVkZXMgYWRkaXRpb25hbFxuICogZGV0YWlsIG9uIHRoZSByZW1vdGVzIHRoZW1zZWx2ZXMuXG4gKi9cbkdpdC5wcm90b3R5cGUuZ2V0UmVtb3RlcyA9IGZ1bmN0aW9uICh2ZXJib3NlLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGdldFJlbW90ZXNUYXNrKHZlcmJvc2UgPT09IHRydWUpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBDb21wdXRlIG9iamVjdCBJRCBmcm9tIGEgZmlsZVxuICovXG5HaXQucHJvdG90eXBlLmhhc2hPYmplY3QgPSBmdW5jdGlvbiAocGF0aCwgd3JpdGUpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgaGFzaE9iamVjdFRhc2socGF0aCwgd3JpdGUgPT09IHRydWUpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBDYWxsIGFueSBgZ2l0IHJlbW90ZWAgZnVuY3Rpb24gd2l0aCBhcmd1bWVudHMgcGFzc2VkIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gb3B0aW9uc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUucmVtb3RlID0gZnVuY3Rpb24gKG9wdGlvbnMsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgcmVtb3RlVGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIE1lcmdlcyBmcm9tIG9uZSBicmFuY2ggdG8gYW5vdGhlciwgZXF1aXZhbGVudCB0byBydW5uaW5nIGBnaXQgbWVyZ2UgJHtmcm9tfSAkW3RvfWAsIHRoZSBgb3B0aW9uc2AgYXJndW1lbnQgY2FuXG4gKiBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGNvbW1hbmQgb3IgbnVsbCAvIG9taXR0ZWQgdG8gYmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZnJvbVxuICogQHBhcmFtIHtzdHJpbmd9IHRvXG4gKi9cbkdpdC5wcm90b3R5cGUubWVyZ2VGcm9tVG8gPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgIGlmICghKGZpbHRlclN0cmluZyhmcm9tKSAmJiBmaWx0ZXJTdHJpbmcodG8pKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soY29uZmlndXJhdGlvbkVycm9yVGFzayhcbiAgICAgICAgIGBHaXQubWVyZ2VGcm9tVG8gcmVxdWlyZXMgdGhhdCB0aGUgJ2Zyb20nIGFuZCAndG8nIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQgYXMgc3RyaW5nc2BcbiAgICAgICkpO1xuICAgfVxuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIG1lcmdlVGFzayhbZnJvbSwgdG8sIC4uLmdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpXSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzLCBmYWxzZSksXG4gICApO1xufTtcblxuLyoqXG4gKiBSdW5zIGEgbWVyZ2UsIGBvcHRpb25zYCBjYW4gYmUgZWl0aGVyIGFuIGFycmF5IG9mIGFyZ3VtZW50c1xuICogc3VwcG9ydGVkIGJ5IHRoZSBbYGdpdCBtZXJnZWBdKGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtbWVyZ2UpXG4gKiBvciBhbiBvcHRpb25zIG9iamVjdC5cbiAqXG4gKiBDb25mbGljdHMgZHVyaW5nIHRoZSBtZXJnZSByZXN1bHQgaW4gYW4gZXJyb3IgcmVzcG9uc2UsXG4gKiB0aGUgcmVzcG9uc2UgdHlwZSB3aGV0aGVyIGl0IHdhcyBhbiBlcnJvciBvciBzdWNjZXNzIHdpbGwgYmUgYSBNZXJnZVN1bW1hcnkgaW5zdGFuY2UuXG4gKiBXaGVuIHN1Y2Nlc3NmdWwsIHRoZSBNZXJnZVN1bW1hcnkgaGFzIGFsbCBkZXRhaWwgZnJvbSBhIHRoZSBQdWxsU3VtbWFyeVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0IHwgc3RyaW5nW119IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKiBAcmV0dXJucyB7Kn1cbiAqXG4gKiBAc2VlIC4vcmVzcG9uc2VzL01lcmdlU3VtbWFyeS5qc1xuICogQHNlZSAuL3Jlc3BvbnNlcy9QdWxsU3VtbWFyeS5qc1xuICovXG5HaXQucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24gKCkge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBtZXJnZVRhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBDYWxsIGFueSBgZ2l0IHRhZ2AgZnVuY3Rpb24gd2l0aCBhcmd1bWVudHMgcGFzc2VkIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gb3B0aW9uc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUudGFnID0gZnVuY3Rpb24gKG9wdGlvbnMsIHRoZW4pIHtcbiAgIGNvbnN0IGNvbW1hbmQgPSBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKTtcblxuICAgaWYgKGNvbW1hbmRbMF0gIT09ICd0YWcnKSB7XG4gICAgICBjb21tYW5kLnVuc2hpZnQoJ3RhZycpO1xuICAgfVxuXG4gICByZXR1cm4gdGhpcy5fcnVuKGNvbW1hbmQsIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpKTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyByZXBvc2l0b3J5IHNlcnZlciBpbmZvXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUudXBkYXRlU2VydmVySW5mbyA9IGZ1bmN0aW9uICh0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuKFtcInVwZGF0ZS1zZXJ2ZXItaW5mb1wiXSwgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuLyoqXG4gKiBQdXNoZXMgdGhlIGN1cnJlbnQgY29tbWl0dGVkIGNoYW5nZXMgdG8gYSByZW1vdGUsIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgbmFtZXMgb2YgdGhlIHJlbW90ZSBhbmQgYnJhbmNoIHRvIHVzZVxuICogd2hlbiBwdXNoaW5nLiBTdXBwbHkgbXVsdGlwbGUgb3B0aW9ucyBhcyBhbiBhcnJheSBvZiBzdHJpbmdzIGluIHRoZSBmaXJzdCBhcmd1bWVudCAtIHNlZSBleGFtcGxlcyBiZWxvdy5cbiAqL1xuR2l0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHJlbW90ZSwgYnJhbmNoLCB0aGVuKSB7XG4gICBjb25zdCB0YXNrID0gcHVzaFRhc2soXG4gICAgICB7cmVtb3RlOiBmaWx0ZXJUeXBlKHJlbW90ZSwgZmlsdGVyU3RyaW5nKSwgYnJhbmNoOiBmaWx0ZXJUeXBlKGJyYW5jaCwgZmlsdGVyU3RyaW5nKX0sXG4gICAgICBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSxcbiAgICk7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSk7XG59O1xuXG4vKipcbiAqIFB1c2hlcyB0aGUgY3VycmVudCB0YWcgY2hhbmdlcyB0byBhIHJlbW90ZSB3aGljaCBjYW4gYmUgZWl0aGVyIGEgVVJMIG9yIG5hbWVkIHJlbW90ZS4gV2hlbiBub3Qgc3BlY2lmaWVkIHVzZXMgdGhlXG4gKiBkZWZhdWx0IGNvbmZpZ3VyZWQgcmVtb3RlIHNwZWMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtyZW1vdGVdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5wdXNoVGFncyA9IGZ1bmN0aW9uIChyZW1vdGUsIHRoZW4pIHtcbiAgIGNvbnN0IHRhc2sgPSBwdXNoVGFnc1Rhc2soe3JlbW90ZTogZmlsdGVyVHlwZShyZW1vdGUsIGZpbHRlclN0cmluZyl9LCBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSk7XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKHRhc2ssIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgbmFtZWQgZmlsZXMgZnJvbSBzb3VyY2UgY29udHJvbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gZmlsZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLnJtID0gZnVuY3Rpb24gKGZpbGVzLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcm0oZmlsZXMsICctZicsIHRoZW4pO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBuYW1lZCBmaWxlcyBmcm9tIHNvdXJjZSBjb250cm9sIGJ1dCBrZWVwcyB0aGVtIG9uIGRpc2sgcmF0aGVyIHRoYW4gZGVsZXRpbmcgdGhlbSBlbnRpcmVseS4gVG9cbiAqIGNvbXBsZXRlbHkgcmVtb3ZlIHRoZSBmaWxlcywgdXNlIGBybWAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IGZpbGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5ybUtlZXBMb2NhbCA9IGZ1bmN0aW9uIChmaWxlcywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3JtKGZpbGVzLCAnLS1jYWNoZWQnLCB0aGVuKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cyBpbiBhIHRyZWUgYmFzZWQgb24gY29tbWl0IGhhc2guIFBhc3NpbmcgaW4gYW4gb2JqZWN0IGhhc2ggcmV0dXJucyB0aGUgb2JqZWN0J3MgY29udGVudCxcbiAqIHNpemUsIGFuZCB0eXBlLlxuICpcbiAqIFBhc3NpbmcgXCItcFwiIHdpbGwgaW5zdHJ1Y3QgY2F0LWZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBvYmplY3QgdHlwZSwgYW5kIGRpc3BsYXkgaXRzIGZvcm1hdHRlZCBjb250ZW50cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmNhdEZpbGUgPSBmdW5jdGlvbiAob3B0aW9ucywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX2NhdEZpbGUoJ3V0Zi04JywgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBgY2F0RmlsZWAgYnV0IHdpbGwgcmV0dXJuIHRoZSBuYXRpdmUgYEJ1ZmZlcmAgb2YgY29udGVudCBmcm9tIHRoZSBnaXQgY29tbWFuZCdzIHN0ZG91dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcHRpb25zXG4gKiBAcGFyYW0gdGhlblxuICovXG5HaXQucHJvdG90eXBlLmJpbmFyeUNhdEZpbGUgPSBmdW5jdGlvbiAob3B0aW9ucywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX2NhdEZpbGUoJ2J1ZmZlcicsIGFyZ3VtZW50cyk7XG59O1xuXG5HaXQucHJvdG90eXBlLl9jYXRGaWxlID0gZnVuY3Rpb24gKGZvcm1hdCwgYXJncykge1xuICAgdmFyIGhhbmRsZXIgPSB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJncyk7XG4gICB2YXIgY29tbWFuZCA9IFsnY2F0LWZpbGUnXTtcbiAgIHZhciBvcHRpb25zID0gYXJnc1swXTtcblxuICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICBjb25maWd1cmF0aW9uRXJyb3JUYXNrKCdHaXQjY2F0RmlsZTogb3B0aW9ucyBtdXN0IGJlIHN1cHBsaWVkIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MnKSxcbiAgICAgICAgIGhhbmRsZXIsXG4gICAgICApO1xuICAgfVxuXG4gICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgY29tbWFuZC5wdXNoLmFwcGx5KGNvbW1hbmQsIG9wdGlvbnMpO1xuICAgfVxuXG4gICByZXR1cm4gdGhpcy5fcnVuKGNvbW1hbmQsIGhhbmRsZXIsIHtcbiAgICAgIGZvcm1hdDogZm9ybWF0XG4gICB9KTtcbn07XG5cbkdpdC5wcm90b3R5cGUuZGlmZiA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICBjb25zdCBjb21tYW5kID0gWydkaWZmJywgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cyldO1xuXG4gICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb21tYW5kLnNwbGljZSgxLCAwLCBvcHRpb25zKTtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdHaXQjZGlmZjogc3VwcGx5aW5nIG9wdGlvbnMgYXMgYSBzaW5nbGUgc3RyaW5nIGlzIG5vdyBkZXByZWNhdGVkLCBzd2l0Y2ggdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgfVxuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZCksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG5HaXQucHJvdG90eXBlLmRpZmZTdW1tYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBkaWZmU3VtbWFyeVRhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgMSkpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuR2l0LnByb3RvdHlwZS5yZXZwYXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgIGNvbnN0IGNvbW1hbmRzID0gWydyZXYtcGFyc2UnLCAuLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCB0cnVlKV07XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMsIHRydWUpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBTaG93IHZhcmlvdXMgdHlwZXMgb2Ygb2JqZWN0cywgZm9yIGV4YW1wbGUgdGhlIGZpbGUgYXQgYSBjZXJ0YWluIGNvbW1pdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydzaG93JywgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgMSldKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKi9cbkdpdC5wcm90b3R5cGUuY2xlYW4gPSBmdW5jdGlvbiAobW9kZSwgb3B0aW9ucywgdGhlbikge1xuICAgY29uc3QgdXNpbmdDbGVhbk9wdGlvbnNBcnJheSA9IGlzQ2xlYW5PcHRpb25zQXJyYXkobW9kZSk7XG4gICBjb25zdCBjbGVhbk1vZGUgPSB1c2luZ0NsZWFuT3B0aW9uc0FycmF5ICYmIG1vZGUuam9pbignJykgfHwgZmlsdGVyVHlwZShtb2RlLCBmaWx0ZXJTdHJpbmcpIHx8ICcnO1xuICAgY29uc3QgY3VzdG9tQXJncyA9IGdldFRyYWlsaW5nT3B0aW9ucyhbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgdXNpbmdDbGVhbk9wdGlvbnNBcnJheSA/IDEgOiAwKSk7XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgY2xlYW5XaXRoT3B0aW9uc1Rhc2soY2xlYW5Nb2RlLCBjdXN0b21BcmdzKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogQ2FsbCBhIHNpbXBsZSBmdW5jdGlvbiBhdCB0aGUgbmV4dCBzdGVwIGluIHRoZSBjaGFpbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmV4ZWMgPSBmdW5jdGlvbiAodGhlbikge1xuICAgY29uc3QgdGFzayA9IHtcbiAgICAgIGNvbW1hbmRzOiBbXSxcbiAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgIHBhcnNlciAoKSB7XG4gICAgICAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoZW4oKTtcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgIH07XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKHRhc2spO1xufTtcblxuLyoqXG4gKiBTaG93IGNvbW1pdCBsb2dzIGZyb20gYEhFQURgIHRvIHRoZSBmaXJzdCBjb21taXQuXG4gKiBJZiBwcm92aWRlZCBiZXR3ZWVuIGBvcHRpb25zLmZyb21gIGFuZCBgb3B0aW9ucy50b2AgdGFncyBvciBicmFuY2guXG4gKlxuICogQWRkaXRpb25hbGx5IHlvdSBjYW4gcHJvdmlkZSBvcHRpb25zLmZpbGUsIHdoaWNoIGlzIHRoZSBwYXRoIHRvIGEgZmlsZSBpbiB5b3VyIHJlcG9zaXRvcnkuIFRoZW4gb25seSB0aGlzIGZpbGUgd2lsbCBiZSBjb25zaWRlcmVkLlxuICpcbiAqIFRvIHVzZSBhIGN1c3RvbSBzcGxpdHRlciBpbiB0aGUgbG9nIGZvcm1hdCwgc2V0IGBvcHRpb25zLnNwbGl0dGVyYCB0byBiZSB0aGUgc3RyaW5nIHRoZSBsb2cgc2hvdWxkIGJlIHNwbGl0IG9uLlxuICpcbiAqIE9wdGlvbnMgY2FuIGFsc28gYmUgc3VwcGxpZWQgYXMgYSBzdGFuZGFyZCBvcHRpb25zIG9iamVjdCBmb3IgYWRkaW5nIGN1c3RvbSBwcm9wZXJ0aWVzIHN1cHBvcnRlZCBieSB0aGUgZ2l0IGxvZyBjb21tYW5kLlxuICogRm9yIGFueSBvdGhlciBzZXQgb2Ygb3B0aW9ucywgc3VwcGx5IG9wdGlvbnMgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBiZSBhcHBlbmRlZCB0byB0aGUgZ2l0IGxvZyBjb21tYW5kLlxuICovXG5HaXQucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICBjb25zdCBuZXh0ID0gdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyk7XG5cbiAgIGlmIChmaWx0ZXJTdHJpbmcoYXJndW1lbnRzWzBdKSAmJiBmaWx0ZXJTdHJpbmcoYXJndW1lbnRzWzFdKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICBjb25maWd1cmF0aW9uRXJyb3JUYXNrKGBnaXQubG9nKHN0cmluZywgc3RyaW5nKSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBnaXQubG9nKHsgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nIH0pYCksXG4gICAgICAgICBuZXh0XG4gICAgICApO1xuICAgfVxuXG4gICBjb25zdCBwYXJzZWRPcHRpb25zID0gcGFyc2VMb2dPcHRpb25zKFxuICAgICAgdHJhaWxpbmdPcHRpb25zQXJndW1lbnQoYXJndW1lbnRzKSB8fCB7fSxcbiAgICAgIGZpbHRlckFycmF5KG9wdGlvbnMpICYmIG9wdGlvbnMgfHwgW11cbiAgICk7XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgbG9nVGFzayhwYXJzZWRPcHRpb25zLnNwbGl0dGVyLCBwYXJzZWRPcHRpb25zLmZpZWxkcywgcGFyc2VkT3B0aW9ucy5jb21tYW5kcylcbiAgIClcbn07XG5cbi8qKlxuICogQ2xlYXJzIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIGNvbW1hbmRzIGFuZCByZXR1cm5zIHRoZSB3cmFwcGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJucyB7R2l0fVxuICovXG5HaXQucHJvdG90eXBlLmNsZWFyUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gICAvLyBUT0RPOlxuICAgLy8gdGhpcy5fZXhlY3V0b3IuY2xlYXIoKTtcbiAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhdGhuYW1lIG9yIHBhdGhuYW1lcyBhcmUgZXhjbHVkZWQgYnkgLmdpdGlnbm9yZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBwYXRobmFtZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmNoZWNrSWdub3JlID0gZnVuY3Rpb24gKHBhdGhuYW1lcywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1bihcbiAgICAgIFtcImNoZWNrLWlnbm9yZVwiLCAuLi5hc0FycmF5KChmaWx0ZXJUeXBlKHBhdGhuYW1lcywgZmlsdGVyU3RyaW5nT3JTdHJpbmdBcnJheSwgW10pKSldLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICAgICB7XG4gICAgICAgICBwYXJzZXI6IHBhcnNlQ2hlY2tJZ25vcmVcbiAgICAgIH1cbiAgIClcbn07XG5cbkdpdC5wcm90b3R5cGUuY2hlY2tJc1JlcG8gPSBmdW5jdGlvbiAoY2hlY2tUeXBlLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGNoZWNrSXNSZXBvVGFzayhmaWx0ZXJUeXBlKGNoZWNrVHlwZSwgZmlsdGVyU3RyaW5nKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG5HaXQucHJvdG90eXBlLl9ybSA9IGZ1bmN0aW9uIChfZmlsZXMsIG9wdGlvbnMsIHRoZW4pIHtcbiAgIHZhciBmaWxlcyA9IFtdLmNvbmNhdChfZmlsZXMpO1xuICAgdmFyIGFyZ3MgPSBbJ3JtJywgb3B0aW9uc107XG4gICBhcmdzLnB1c2guYXBwbHkoYXJncywgZmlsZXMpO1xuXG4gICByZXR1cm4gdGhpcy5fcnVuKGFyZ3MsIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpKTtcbn07XG5cbi8qKlxuICogU2NoZWR1bGVzIHRoZSBzdXBwbGllZCBjb21tYW5kIHRvIGJlIHJ1biwgdGhlIGNvbW1hbmQgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBuYW1lIG9mIHRoZSBnaXQgYmluYXJ5IGFuZCBzaG91bGRcbiAqIGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgcGFzc2VkIGFzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGdpdCBiaW5hcnkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gY29tbWFuZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGhlblxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHQuY29uY2F0U3RkRXJyPWZhbHNlXSBPcHRpb25hbGx5IGNvbmNhdGVuYXRlIHN0ZGVyciBvdXRwdXQgaW50byB0aGUgc3Rkb3V0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHQuZm9ybWF0PVwidXRmLThcIl0gVGhlIGZvcm1hdCB0byB1c2Ugd2hlbiByZWFkaW5nIHRoZSBjb250ZW50IG9mIHN0ZG91dFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdC5vbkVycm9yXSBPcHRpb25hbCBlcnJvciBoYW5kbGVyIGZvciB0aGlzIGNvbW1hbmQgLSBjYW4gYmUgdXNlZCB0byBhbGxvdyBub24tY2xlYW4gZXhpdHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQga2lsbGluZyB0aGUgcmVtYWluaW5nIHN0YWNrIG9mIGNvbW1hbmRzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0LnBhcnNlcl0gT3B0aW9uYWwgcGFyc2VyIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC5vbkVycm9yLmV4aXRDb2RlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHQub25FcnJvci5zdGRFcnJdXG4gKlxuICogQHJldHVybnMge0dpdH1cbiAqL1xuR2l0LnByb3RvdHlwZS5fcnVuID0gZnVuY3Rpb24gKGNvbW1hbmQsIHRoZW4sIG9wdCkge1xuXG4gICBjb25zdCB0YXNrID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBjb25jYXRTdGRFcnI6IGZhbHNlLFxuICAgICAgb25FcnJvcjogdW5kZWZpbmVkLFxuICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgcGFyc2VyIChkYXRhKSB7XG4gICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgIH0sIG9wdCB8fCB7fSwge1xuICAgICAgY29tbWFuZHM6IGNvbW1hbmQsXG4gICB9KTtcblxuICAgcmV0dXJuIHRoaXMuX3J1blRhc2sodGFzaywgdGhlbik7XG59O1xuXG5HaXQucHJvdG90eXBlLl9ydW5UYXNrID0gZnVuY3Rpb24gKHRhc2ssIHRoZW4pIHtcbiAgIGNvbnN0IGV4ZWN1dG9yID0gdGhpc1tDaGFpbmVkRXhlY3V0b3JdIHx8IHRoaXMuX2V4ZWN1dG9yLmNoYWluKCk7XG4gICBjb25zdCBwcm9taXNlID0gZXhlY3V0b3IucHVzaCh0YXNrKTtcblxuICAgdGFza0NhbGxiYWNrKFxuICAgICAgdGFzayxcbiAgICAgIHByb21pc2UsXG4gICAgICB0aGVuKTtcblxuICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcywge1xuICAgICAgdGhlbjoge3ZhbHVlOiBwcm9taXNlLnRoZW4uYmluZChwcm9taXNlKX0sXG4gICAgICBjYXRjaDoge3ZhbHVlOiBwcm9taXNlLmNhdGNoLmJpbmQocHJvbWlzZSl9LFxuICAgICAgW0NoYWluZWRFeGVjdXRvcl06IHt2YWx1ZTogZXhlY3V0b3J9LFxuICAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdpdDtcbiIsImNvbnN0IEdpdCA9IHJlcXVpcmUoJy4vZ2l0Jyk7XG5jb25zdCB7R2l0Q29uc3RydWN0RXJyb3J9ID0gcmVxdWlyZSgnLi9saWIvYXBpJyk7XG5jb25zdCB7Y3JlYXRlSW5zdGFuY2VDb25maWcsIGZvbGRlckV4aXN0c30gPSByZXF1aXJlKCcuL2xpYi91dGlscycpO1xuXG5jb25zdCBhcGkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuZm9yIChsZXQgaW1wb3J0ZWQgPSByZXF1aXJlKCcuL2xpYi9hcGknKSwga2V5cyA9IE9iamVjdC5rZXlzKGltcG9ydGVkKSwgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICBjb25zdCBuYW1lID0ga2V5c1tpXTtcbiAgIGlmICgvXltBLVpdLy50ZXN0KG5hbWUpKSB7XG4gICAgICBhcGlbbmFtZV0gPSBpbXBvcnRlZFtuYW1lXTtcbiAgIH1cbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBuZWNlc3NhcnkgcHJvcGVydGllcyB0byB0aGUgc3VwcGxpZWQgb2JqZWN0IHRvIGVuYWJsZSBpdCBmb3IgdXNlIGFzXG4gKiB0aGUgZGVmYXVsdCBleHBvcnQgb2YgYSBtb2R1bGUuXG4gKlxuICogRWc6IGBtb2R1bGUuZXhwb3J0cyA9IGVzTW9kdWxlRmFjdG9yeSh7IHNvbWV0aGluZyAoKSB7fSB9KWBcbiAqL1xubW9kdWxlLmV4cG9ydHMuZXNNb2R1bGVGYWN0b3J5ID0gZnVuY3Rpb24gZXNNb2R1bGVGYWN0b3J5IChkZWZhdWx0RXhwb3J0KSB7XG4gICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGVmYXVsdEV4cG9ydCwge1xuICAgICAgX19lc01vZHVsZToge3ZhbHVlOiB0cnVlfSxcbiAgICAgIGRlZmF1bHQ6IHt2YWx1ZTogZGVmYXVsdEV4cG9ydH0sXG4gICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMuZ2l0RXhwb3J0RmFjdG9yeSA9IGZ1bmN0aW9uIGdpdEV4cG9ydEZhY3RvcnkgKGZhY3RvcnksIGV4dHJhKSB7XG4gICByZXR1cm4gT2JqZWN0LmFzc2lnbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICByZXR1cm4gZmFjdG9yeS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGFwaSxcbiAgICAgIGV4dHJhIHx8IHt9LFxuICAgKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmdpdEluc3RhbmNlRmFjdG9yeSA9IGZ1bmN0aW9uIGdpdEluc3RhbmNlRmFjdG9yeSAoYmFzZURpciwgb3B0aW9ucykge1xuICAgY29uc3QgY29uZmlnID0gY3JlYXRlSW5zdGFuY2VDb25maWcoXG4gICAgICBiYXNlRGlyICYmICh0eXBlb2YgYmFzZURpciA9PT0gJ3N0cmluZycgPyB7YmFzZURpcn0gOiBiYXNlRGlyKSxcbiAgICAgIG9wdGlvbnNcbiAgICk7XG5cbiAgIGlmICghZm9sZGVyRXhpc3RzKGNvbmZpZy5iYXNlRGlyKSkge1xuICAgICAgdGhyb3cgbmV3IEdpdENvbnN0cnVjdEVycm9yKGNvbmZpZywgYENhbm5vdCB1c2Ugc2ltcGxlLWdpdCBvbiBhIGRpcmVjdG9yeSB0aGF0IGRvZXMgbm90IGV4aXN0YCk7XG4gICB9XG5cbiAgIHJldHVybiBuZXcgR2l0KGNvbmZpZyk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdpdFAgPSB2b2lkIDA7XG5jb25zdCBnaXRfcmVzcG9uc2VfZXJyb3JfMSA9IHJlcXVpcmUoXCIuLi9lcnJvcnMvZ2l0LXJlc3BvbnNlLWVycm9yXCIpO1xuY29uc3QgZnVuY3Rpb25OYW1lc0J1aWxkZXJBcGkgPSBbXG4gICAgJ2N1c3RvbUJpbmFyeScsICdlbnYnLCAnb3V0cHV0SGFuZGxlcicsICdzaWxlbnQnLFxuXTtcbmNvbnN0IGZ1bmN0aW9uTmFtZXNQcm9taXNlQXBpID0gW1xuICAgICdhZGQnLFxuICAgICdhZGRBbm5vdGF0ZWRUYWcnLFxuICAgICdhZGRDb25maWcnLFxuICAgICdhZGRSZW1vdGUnLFxuICAgICdhZGRUYWcnLFxuICAgICdiaW5hcnlDYXRGaWxlJyxcbiAgICAnYnJhbmNoJyxcbiAgICAnYnJhbmNoTG9jYWwnLFxuICAgICdjYXRGaWxlJyxcbiAgICAnY2hlY2tJZ25vcmUnLFxuICAgICdjaGVja0lzUmVwbycsXG4gICAgJ2NoZWNrb3V0JyxcbiAgICAnY2hlY2tvdXRCcmFuY2gnLFxuICAgICdjaGVja291dExhdGVzdFRhZycsXG4gICAgJ2NoZWNrb3V0TG9jYWxCcmFuY2gnLFxuICAgICdjbGVhbicsXG4gICAgJ2Nsb25lJyxcbiAgICAnY29tbWl0JyxcbiAgICAnY3dkJyxcbiAgICAnZGVsZXRlTG9jYWxCcmFuY2gnLFxuICAgICdkZWxldGVMb2NhbEJyYW5jaGVzJyxcbiAgICAnZGlmZicsXG4gICAgJ2RpZmZTdW1tYXJ5JyxcbiAgICAnZXhlYycsXG4gICAgJ2ZldGNoJyxcbiAgICAnZ2V0UmVtb3RlcycsXG4gICAgJ2luaXQnLFxuICAgICdsaXN0Q29uZmlnJyxcbiAgICAnbGlzdFJlbW90ZScsXG4gICAgJ2xvZycsXG4gICAgJ21lcmdlJyxcbiAgICAnbWVyZ2VGcm9tVG8nLFxuICAgICdtaXJyb3InLFxuICAgICdtdicsXG4gICAgJ3B1bGwnLFxuICAgICdwdXNoJyxcbiAgICAncHVzaFRhZ3MnLFxuICAgICdyYXcnLFxuICAgICdyZWJhc2UnLFxuICAgICdyZW1vdGUnLFxuICAgICdyZW1vdmVSZW1vdGUnLFxuICAgICdyZXNldCcsXG4gICAgJ3JldmVydCcsXG4gICAgJ3JldnBhcnNlJyxcbiAgICAncm0nLFxuICAgICdybUtlZXBMb2NhbCcsXG4gICAgJ3Nob3cnLFxuICAgICdzdGFzaCcsXG4gICAgJ3N0YXNoTGlzdCcsXG4gICAgJ3N0YXR1cycsXG4gICAgJ3N1Yk1vZHVsZScsXG4gICAgJ3N1Ym1vZHVsZUFkZCcsXG4gICAgJ3N1Ym1vZHVsZUluaXQnLFxuICAgICdzdWJtb2R1bGVVcGRhdGUnLFxuICAgICd0YWcnLFxuICAgICd0YWdzJyxcbiAgICAndXBkYXRlU2VydmVySW5mbydcbl07XG5jb25zdCB7IGdpdEluc3RhbmNlRmFjdG9yeSB9ID0gcmVxdWlyZSgnLi4vLi4vZ2l0LWZhY3RvcnknKTtcbmZ1bmN0aW9uIGdpdFAoLi4uYXJncykge1xuICAgIGxldCBnaXQ7XG4gICAgbGV0IGNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgZ2l0ID0gZ2l0SW5zdGFuY2VGYWN0b3J5KC4uLmFyZ3MpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBjaGFpbiA9IFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBidWlsZGVyUmV0dXJuKCkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZUFwaTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hhaW5SZXR1cm4oKSB7XG4gICAgICAgIHJldHVybiBjaGFpbjtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZUFwaSA9IFsuLi5mdW5jdGlvbk5hbWVzQnVpbGRlckFwaSwgLi4uZnVuY3Rpb25OYW1lc1Byb21pc2VBcGldLnJlZHVjZSgoYXBpLCBuYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzQXN5bmMgPSBmdW5jdGlvbk5hbWVzUHJvbWlzZUFwaS5pbmNsdWRlcyhuYW1lKTtcbiAgICAgICAgY29uc3QgdmFsaWQgPSBpc0FzeW5jID8gYXN5bmNXcmFwcGVyKG5hbWUsIGdpdCkgOiBzeW5jV3JhcHBlcihuYW1lLCBnaXQsIGFwaSk7XG4gICAgICAgIGNvbnN0IGFsdGVybmF0aXZlID0gaXNBc3luYyA/IGNoYWluUmV0dXJuIDogYnVpbGRlclJldHVybjtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwaSwgbmFtZSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IGdpdCA/IHZhbGlkIDogYWx0ZXJuYXRpdmUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgIH0sIHt9KTtcbiAgICByZXR1cm4gcHJvbWlzZUFwaTtcbiAgICBmdW5jdGlvbiBhc3luY1dyYXBwZXIoZm4sIGdpdCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlIGludGVyZmFjZSByZXF1aXJlcyB0aGF0IGhhbmRsZXJzIGFyZSBub3Qgc3VwcGxpZWQgaW5saW5lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3RyYWlsaW5nIGZ1bmN0aW9uIG5vdCBhbGxvd2VkIGluIGNhbGwgdG8gJyArIGZuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjaGFpbi50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QodG9FcnJvcihlcnIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgZ2l0W2ZuXS5hcHBseShnaXQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN5bmNXcmFwcGVyKGZuLCBnaXQsIGFwaSkge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgIGdpdFtmbl0oLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMuZ2l0UCA9IGdpdFA7XG5mdW5jdGlvbiB0b0Vycm9yKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBnaXRfcmVzcG9uc2VfZXJyb3JfMS5HaXRSZXNwb25zZUVycm9yKGVycm9yKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb21pc2Utd3JhcHBlZC5qcy5tYXAiLCJcbmNvbnN0IHtnaXRQfSA9IHJlcXVpcmUoJy4vbGliL3J1bm5lcnMvcHJvbWlzZS13cmFwcGVkJyk7XG5jb25zdCB7ZXNNb2R1bGVGYWN0b3J5LCBnaXRJbnN0YW5jZUZhY3RvcnksIGdpdEV4cG9ydEZhY3Rvcnl9ID0gcmVxdWlyZSgnLi9naXQtZmFjdG9yeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVzTW9kdWxlRmFjdG9yeShcbiAgIGdpdEV4cG9ydEZhY3RvcnkoZ2l0SW5zdGFuY2VGYWN0b3J5LCB7Z2l0UH0pXG4pO1xuIiwiaW1wb3J0IHsgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBzaW1wbGVHaXQsIHsgQ2hlY2tSZXBvQWN0aW9ucywgU2ltcGxlR2l0IH0gZnJvbSBcInNpbXBsZS1naXRcIjtcbmltcG9ydCB7IEZpbGVTdGF0dXNSZXN1bHQgfSBmcm9tIFwic2ltcGxlLWdpdC90eXBpbmdzL3Jlc3BvbnNlXCI7XG5cbmVudW0gUGx1Z2luU3RhdGUge1xuICAgIGlkbGUsXG4gICAgc3RhdHVzLFxuICAgIHB1bGwsXG4gICAgYWRkLFxuICAgIGNvbW1pdCxcbiAgICBwdXNoLFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPYnNpZGlhbkdpdCBleHRlbmRzIFBsdWdpbiB7XG4gICAgcHVibGljIGdpdDogU2ltcGxlR2l0O1xuICAgIHB1YmxpYyBzZXR0aW5nczogT2JzaWRpYW5HaXRTZXR0aW5ncztcbiAgICBwdWJsaWMgc3RhdHVzQmFyOiBTdGF0dXNCYXI7XG4gICAgcHVibGljIHN0YXRlOiBQbHVnaW5TdGF0ZSA9IFBsdWdpblN0YXRlLmlkbGU7XG4gICAgcHVibGljIGludGVydmFsSUQ6IG51bWJlcjtcbiAgICBwdWJsaWMgbGFzdFVwZGF0ZTogbnVtYmVyO1xuXG4gICAgc2V0U3RhdGUoc3RhdGU6IFBsdWdpblN0YXRlKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5zdGF0dXNCYXIuZGlzcGxheSgpO1xuICAgIH1cblxuICAgIGdldFN0YXRlKCk6IFBsdWdpblN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgYXN5bmMgb25sb2FkKCkge1xuICAgICAgICBsZXQgc3RhdHVzQmFyRWwgPSB0aGlzLmFkZFN0YXR1c0Jhckl0ZW0oKTtcbiAgICAgICAgdGhpcy5zdGF0dXNCYXIgPSBuZXcgU3RhdHVzQmFyKHN0YXR1c0JhckVsLCB0aGlzKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5pZGxlKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckludGVydmFsKFxuICAgICAgICAgICAgd2luZG93LnNldEludGVydmFsKCgpID0+IHRoaXMuc3RhdHVzQmFyLmRpc3BsYXkoKSwgMTAwMClcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBhZGFwdGVyOiBhbnkgPSB0aGlzLmFwcC52YXVsdC5hZGFwdGVyO1xuICAgICAgICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoYWRhcHRlci5iYXNlUGF0aCk7XG5cbiAgICAgICAgbGV0IGlzVmFsaWRSZXBvID0gZ2l0LmNoZWNrSXNSZXBvKENoZWNrUmVwb0FjdGlvbnMuSVNfUkVQT19ST09UKTtcbiAgICAgICAgaWYgKCFpc1ZhbGlkUmVwbykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShcIlZhbGlkIGdpdCByZXBvc2l0b3J5IG5vdCBmb3VuZC5cIiwgMCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdpdCA9IGdpdDtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IChhd2FpdCB0aGlzLmxvYWREYXRhKCkpIHx8IG5ldyBPYnNpZGlhbkdpdFNldHRpbmdzKCk7XG5cbiAgICAgICAgLy8gcmVzb2x2ZSBjdXJyZW50IGJyYW5jaCBhbmQgcmVtb3RlXG4gICAgICAgIGxldCBicmFuY2hJbmZvID0gYXdhaXQgZ2l0LmJyYW5jaCgpO1xuICAgICAgICB0aGlzLnNldHRpbmdzLmN1cnJlbnRCcmFuY2ggPSBicmFuY2hJbmZvLmN1cnJlbnQ7XG5cbiAgICAgICAgbGV0IHJlbW90ZSA9IGF3YWl0IGdpdC5yZW1vdGUoW10pO1xuICAgICAgICBpZiAodHlwZW9mIHJlbW90ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5yZW1vdGUgPSByZW1vdGUudHJpbSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShcIkZhaWxlZCB0byBkZXRlY3QgcmVtb3RlLlwiLCAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9QdWxsT25Cb290KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnB1bGwoKS50aGVuKChmaWxlc1VwZGF0ZWQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgZmlsZXNVcGRhdGVkID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgUHVsbGVkIG5ldyBjaGFuZ2VzLiAke2ZpbGVzVXBkYXRlZH0gZmlsZXMgdXBkYXRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJFdmVyeXRoaW5nIHVwLXRvLWRhdGVcIjtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5hdXRvU2F2ZUludGVydmFsID4gMCkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVBdXRvQmFja3VwKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IE9ic2lkaWFuR2l0U2V0dGluZ3NUYWIodGhpcy5hcHAsIHRoaXMpKTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwicHVsbFwiLFxuICAgICAgICAgICAgbmFtZTogXCJQdWxsIGZyb20gcmVtb3RlIHJlcG9zaXRvcnlcIixcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB0aGlzLnB1bGxDaGFuZ2VzRnJvbVJlbW90ZSgpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwicHVzaFwiLFxuICAgICAgICAgICAgbmFtZTogXCJDb21taXQgKmFsbCogY2hhbmdlcyBhbmQgcHVzaCB0byByZW1vdGUgcmVwb3NpdG9yeVwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRGaWxlc0NoYW5nZWQoKS50aGVuKGFzeW5jIChmaWxlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShcIk5vIGNoYW5nZXMgZGV0ZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXAoKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcHVsbENoYW5nZXNGcm9tUmVtb3RlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnB1bGwoKS50aGVuKChmaWxlc1VwZGF0ZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWxlc1VwZGF0ZWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgYFB1bGxlZCBuZXcgY2hhbmdlcy4gJHtmaWxlc1VwZGF0ZWR9IGZpbGVzIHVwZGF0ZWRgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShcIkV2ZXJ5dGhpbmcgaXMgdXAtdG8tZGF0ZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5pZGxlKTtcbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGVCYWNrdXAoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0RmlsZXNDaGFuZ2VkKCkudGhlbihhc3luYyAoZmlsZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGQoKVxuICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuY29tbWl0KCkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShgQ29tbWl0dGVkICR7ZmlsZXMubGVuZ3RofSBmaWxlc2ApXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmRpc2FibGVQdXNoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wdXNoKCkudGhlbigoKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFB1c2hlZCAke2ZpbGVzLmxlbmd0aH0gZmlsZXMgdG8gcmVtb3RlYFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5pZGxlKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbnVubG9hZCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvLyByZWdpb246IG1haW4gbWV0aG9kc1xuICAgIGFzeW5jIGdldEZpbGVzQ2hhbmdlZCgpOiBQcm9taXNlPEZpbGVTdGF0dXNSZXN1bHRbXT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLnN0YXR1cyk7XG4gICAgICAgIGxldCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdpdC5zdGF0dXMoKTtcbiAgICAgICAgcmV0dXJuIHN0YXR1cy5maWxlcztcbiAgICB9XG5cbiAgICBhc3luYyBhZGQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuYWRkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5naXQuYWRkKFxuICAgICAgICAgICAgXCIuLypcIixcbiAgICAgICAgICAgIChlcnI6IEVycm9yIHwgbnVsbCkgPT5cbiAgICAgICAgICAgICAgICBlcnIgJiYgdGhpcy5kaXNwbGF5RXJyb3IoYENhbm5vdCBhZGQgZmlsZXM6ICR7ZXJyLm1lc3NhZ2V9YClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhc3luYyBjb21taXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuY29tbWl0KTtcbiAgICAgICAgbGV0IGNvbW1pdE1lc3NhZ2UgPSBhd2FpdCB0aGlzLmZvcm1hdENvbW1pdE1lc3NhZ2UoXG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLmNvbW1pdE1lc3NhZ2VcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5naXQuY29tbWl0KGNvbW1pdE1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHB1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUucHVzaCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2l0LnB1c2goXG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLnJlbW90ZSxcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuY3VycmVudEJyYW5jaCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAoZXJyOiBFcnJvciB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBlcnIgJiYgdGhpcy5kaXNwbGF5RXJyb3IoYFB1c2ggZmFpbGVkICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5sYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdWxsKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUucHVsbCk7XG4gICAgICAgIGxldCBwdWxsUmVzdWx0ID0gYXdhaXQgdGhpcy5naXQucHVsbChcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIChlcnI6IEVycm9yIHwgbnVsbCkgPT5cbiAgICAgICAgICAgICAgICBlcnIgJiYgdGhpcy5kaXNwbGF5RXJyb3IoYFB1bGwgZmFpbGVkICR7ZXJyLm1lc3NhZ2V9YClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgcmV0dXJuIHB1bGxSZXN1bHQuZmlsZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIGVuZHJlZ2lvbjogbWFpbiBtZXRob2RzXG5cbiAgICBlbmFibGVBdXRvQmFja3VwKCkge1xuICAgICAgICBsZXQgbWludXRlcyA9IHRoaXMuc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbDtcbiAgICAgICAgdGhpcy5pbnRlcnZhbElEID0gd2luZG93LnNldEludGVydmFsKFxuICAgICAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXAoKSxcbiAgICAgICAgICAgIG1pbnV0ZXMgKiA2MDAwMFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElEKTtcbiAgICB9XG5cbiAgICBkaXNhYmxlQXV0b0JhY2t1cCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWxJRCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSUQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcmVnaW9uOiBkaXNwbGF5aW5nIC8gZm9ybWF0dGluZyBtZXNzYWdlc1xuICAgIGRpc3BsYXlNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gNCAqIDEwMDApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXNCYXIuZGlzcGxheU1lc3NhZ2UobWVzc2FnZS50b0xvd2VyQ2FzZSgpLCB0aW1lb3V0KTtcblxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZGlzYWJsZVBvcHVwcykge1xuICAgICAgICAgICAgbmV3IE5vdGljZShtZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBnaXQgb2JzaWRpYW46ICR7bWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICBkaXNwbGF5RXJyb3IobWVzc2FnZTogc3RyaW5nLCB0aW1lb3V0OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgICAgIG5ldyBOb3RpY2UobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuc3RhdHVzQmFyLmRpc3BsYXlNZXNzYWdlKG1lc3NhZ2UudG9Mb3dlckNhc2UoKSwgdGltZW91dCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZm9ybWF0Q29tbWl0TWVzc2FnZSh0ZW1wbGF0ZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKHRlbXBsYXRlLmluY2x1ZGVzKFwie3tudW1GaWxlc319XCIpKSB7XG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gYXdhaXQgdGhpcy5naXQuc3RhdHVzKCk7XG4gICAgICAgICAgICBsZXQgbnVtRmlsZXMgPSBzdGF0dXMuZmlsZXMubGVuZ3RoO1xuICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKFwie3tudW1GaWxlc319XCIsIFN0cmluZyhudW1GaWxlcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRlbXBsYXRlLmluY2x1ZGVzKFwie3tmaWxlc319XCIpKSB7XG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gYXdhaXQgdGhpcy5naXQuc3RhdHVzKCk7XG5cbiAgICAgICAgICAgIGxldCBjaGFuZ2VzZXQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgICAgICAgICAgc3RhdHVzLmZpbGVzLmZvckVhY2goKHZhbHVlOiBGaWxlU3RhdHVzUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4IGluIGNoYW5nZXNldCkge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzZXRbdmFsdWUuaW5kZXhdLnB1c2godmFsdWUucGF0aCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlc2V0W3ZhbHVlLmluZGV4XSA9IFt2YWx1ZS5wYXRoXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGV0IGNodW5rcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgW2FjdGlvbiwgZmlsZXNdIG9mIE9iamVjdC5lbnRyaWVzKGNoYW5nZXNldCkpIHtcbiAgICAgICAgICAgICAgICBjaHVua3MucHVzaChhY3Rpb24gKyBcIiBcIiArIGZpbGVzLmpvaW4oXCIgXCIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGZpbGVzID0gY2h1bmtzLmpvaW4oXCIsIFwiKTtcblxuICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKFwie3tmaWxlc319XCIsIGZpbGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtb21lbnQgPSAod2luZG93IGFzIGFueSkubW9tZW50O1xuICAgICAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZShcbiAgICAgICAgICAgIFwie3tkYXRlfX1cIixcbiAgICAgICAgICAgIG1vbWVudCgpLmZvcm1hdCh0aGlzLnNldHRpbmdzLmNvbW1pdERhdGVGb3JtYXQpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZW5kcmVnaW9uOiBkaXNwbGF5aW5nIC8gZm9ybWF0dGluZyBzdHVmZlxufVxuXG5jbGFzcyBPYnNpZGlhbkdpdFNldHRpbmdzIHtcbiAgICBjb21taXRNZXNzYWdlOiBzdHJpbmcgPSBcInZhdWx0IGJhY2t1cDoge3tkYXRlfX1cIjtcbiAgICBjb21taXREYXRlRm9ybWF0OiBzdHJpbmcgPSBcIllZWVktTU0tREQgSEg6bW06c3NcIjtcbiAgICBhdXRvU2F2ZUludGVydmFsOiBudW1iZXIgPSAwO1xuICAgIGF1dG9QdWxsT25Cb290OiBib29sZWFuID0gZmFsc2U7XG4gICAgZGlzYWJsZVB1c2g6IGJvb2xlYW4gPSB0cnVlO1xuICAgIGRpc2FibGVQb3B1cHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBjdXJyZW50QnJhbmNoOiBzdHJpbmc7XG4gICAgcmVtb3RlOiBzdHJpbmc7XG59XG5cbmNsYXNzIE9ic2lkaWFuR2l0U2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgICBkaXNwbGF5KCk6IHZvaWQge1xuICAgICAgICBsZXQgeyBjb250YWluZXJFbCB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgcGx1Z2luOiBPYnNpZGlhbkdpdCA9ICh0aGlzIGFzIGFueSkucGx1Z2luO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDJcIiwgeyB0ZXh0OiBcIkdpdCBCYWNrdXAgc2V0dGluZ3NcIiB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiVmF1bHQgYmFja3VwIGludGVydmFsIChtaW51dGVzKVwiKVxuICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgXCJDb21taXQgYW5kIHB1c2ggY2hhbmdlcyBldmVyeSBYIG1pbnV0ZXMuIFRvIGRpc2FibGUgYXV0b21hdGljIGJhY2t1cCwgc3BlY2lmeSBuZWdhdGl2ZSB2YWx1ZSBvciB6ZXJvIChkZWZhdWx0KVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShTdHJpbmcocGx1Z2luLnNldHRpbmdzLmF1dG9TYXZlSW50ZXJ2YWwpKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKE51bWJlcih2YWx1ZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmF1dG9TYXZlSW50ZXJ2YWwgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlRGF0YShwbHVnaW4uc2V0dGluZ3MpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5zZXR0aW5ncy5hdXRvU2F2ZUludGVydmFsID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uZGlzYWJsZUF1dG9CYWNrdXAoKTsgLy8gY2FsbCBjbGVhckludGVydmFsKCkgYmVmb3JlIHNldHRpbmcgdXAgYSBuZXcgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5lbmFibGVBdXRvQmFja3VwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQXV0b21hdGljIGJhY2t1cCBlbmFibGVkISBFdmVyeSAke3BsdWdpbi5zZXR0aW5ncy5hdXRvU2F2ZUludGVydmFsfSBtaW51dGVzLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCA8PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5pbnRlcnZhbElEXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5kaXNhYmxlQXV0b0JhY2t1cCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiQXV0b21hdGljIGJhY2t1cCBkaXNhYmxlZCFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBudW1iZXIuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiQ29tbWl0IG1lc3NhZ2VcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgIFwiU3BlY2lmeSBjdXN0b20gY29tbWl0IG1lc3NhZ2UuIEF2YWlsYWJsZSBwbGFjZWhvbGRlcnM6IHt7ZGF0ZX19XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiAoc2VlIGJlbG93KSBhbmQge3tudW1GaWxlc319IChudW1iZXIgb2YgY2hhbmdlZCBmaWxlcyBpbiB0aGUgY29tbWl0KVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcInZhdWx0IGJhY2t1cFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuY29tbWl0TWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcGx1Z2luLnNldHRpbmdzLmNvbW1pdE1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuY29tbWl0TWVzc2FnZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVEYXRhKHBsdWdpbi5zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJ7e2RhdGV9fSBwbGFjZWhvbGRlciBmb3JtYXRcIilcbiAgICAgICAgICAgIC5zZXREZXNjKCdTcGVjaWZ5IGN1c3RvbSBkYXRlIGZvcm1hdC4gRS5nLiBcIllZWVktTU0tREQgSEg6bW06c3NcIicpXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihwbHVnaW4uc2V0dGluZ3MuY29tbWl0RGF0ZUZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5jb21taXREYXRlRm9ybWF0KVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuY29tbWl0RGF0ZUZvcm1hdCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVEYXRhKHBsdWdpbi5zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJQcmV2aWV3IGNvbW1pdCBtZXNzYWdlXCIpXG4gICAgICAgICAgICAuYWRkQnV0dG9uKChidXR0b24pID0+XG4gICAgICAgICAgICAgICAgYnV0dG9uLnNldEJ1dHRvblRleHQoXCJQcmV2aWV3XCIpLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29tbWl0TWVzc2FnZVByZXZpZXcgPSBhd2FpdCBwbHVnaW4uZm9ybWF0Q29tbWl0TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5jb21taXRNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoYCR7Y29tbWl0TWVzc2FnZVByZXZpZXd9YCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkN1cnJlbnQgYnJhbmNoXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIlN3aXRjaCB0byBhIGRpZmZlcmVudCBicmFuY2hcIilcbiAgICAgICAgICAgIC5hZGREcm9wZG93bihhc3luYyAoZHJvcGRvd24pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgYnJhbmNoSW5mbyA9IGF3YWl0IHBsdWdpbi5naXQuYnJhbmNoTG9jYWwoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBicmFuY2hJbmZvLmFsbCkge1xuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5hZGRPcHRpb24oYnJhbmNoLCBicmFuY2gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZShicmFuY2hJbmZvLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGRyb3Bkb3duLm9uQ2hhbmdlKGFzeW5jIChvcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luLmdpdC5jaGVja291dChcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZShicmFuY2hJbmZvLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoYENoZWNrZWQgb3V0IHRvICR7b3B0aW9ufWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuY3VycmVudEJyYW5jaCA9IG9wdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVEYXRhKHBsdWdpbi5zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIlB1bGwgdXBkYXRlcyBvbiBzdGFydHVwXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIkF1dG9tYXRpY2FsbHkgcHVsbCB1cGRhdGVzIHdoZW4gT2JzaWRpYW4gc3RhcnRzXCIpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MuYXV0b1B1bGxPbkJvb3QpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5hdXRvUHVsbE9uQm9vdCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVEYXRhKHBsdWdpbi5zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJEaXNhYmxlIHB1c2hcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiRG8gbm90IHB1c2ggY2hhbmdlcyB0byB0aGUgcmVtb3RlIHJlcG9zaXRvcnlcIilcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5kaXNhYmxlUHVzaClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmRpc2FibGVQdXNoID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZURhdGEocGx1Z2luLnNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIkRpc2FibGUgbm90aWZpY2F0aW9uc1wiKVxuICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgXCJEaXNhYmxlIG5vdGlmaWNhdGlvbnMgZm9yIGdpdCBvcGVyYXRpb25zIHRvIG1pbmltaXplIGRpc3RyYWN0aW9uIChyZWZlciB0byBzdGF0dXMgYmFyIGZvciB1cGRhdGVzKVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MuZGlzYWJsZVBvcHVwcylcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmRpc2FibGVQb3B1cHMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zYXZlRGF0YShwbHVnaW4uc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBTdGF0dXNCYXJNZXNzYWdlIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgdGltZW91dDogbnVtYmVyO1xufVxuXG5jbGFzcyBTdGF0dXNCYXIge1xuICAgIHB1YmxpYyBtZXNzYWdlczogU3RhdHVzQmFyTWVzc2FnZVtdID0gW107XG4gICAgcHVibGljIGN1cnJlbnRNZXNzYWdlOiBTdGF0dXNCYXJNZXNzYWdlO1xuICAgIHB1YmxpYyBsYXN0TWVzc2FnZVRpbWVzdGFtcDogbnVtYmVyO1xuXG4gICAgcHJpdmF0ZSBzdGF0dXNCYXJFbDogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBwbHVnaW46IE9ic2lkaWFuR2l0O1xuXG4gICAgY29uc3RydWN0b3Ioc3RhdHVzQmFyRWw6IEhUTUxFbGVtZW50LCBwbHVnaW46IE9ic2lkaWFuR2l0KSB7XG4gICAgICAgIHRoaXMuc3RhdHVzQmFyRWwgPSBzdGF0dXNCYXJFbDtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3BsYXlNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgdGltZW91dDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICBtZXNzYWdlOiBgZ2l0OiAke21lc3NhZ2Uuc2xpY2UoMCwgMTAwKX1gLFxuICAgICAgICAgICAgdGltZW91dDogdGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwbGF5KCkge1xuICAgICAgICBpZiAodGhpcy5tZXNzYWdlcy5sZW5ndGggPiAwICYmICF0aGlzLmN1cnJlbnRNZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlID0gdGhpcy5tZXNzYWdlcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5zZXRUZXh0KHRoaXMuY3VycmVudE1lc3NhZ2UubWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLmxhc3RNZXNzYWdlVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRNZXNzYWdlKSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZUFnZSA9IERhdGUubm93KCkgLSB0aGlzLmxhc3RNZXNzYWdlVGltZXN0YW1wO1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2VBZ2UgPj0gdGhpcy5jdXJyZW50TWVzc2FnZS50aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TWVzc2FnZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0TWVzc2FnZVRpbWVzdGFtcCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNwbGF5U3RhdGUoKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMucGx1Z2luLmdldFN0YXRlKCk7XG5cbiAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSBQbHVnaW5TdGF0ZS5pZGxlOlxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZyb21Ob3codGhpcy5wbHVnaW4ubGFzdFVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsdWdpblN0YXRlLnN0YXR1czpcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLnNldFRleHQoXCJnaXQ6IGNoZWNraW5nIHJlcG8gc3RhdHVzLi5cIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsdWdpblN0YXRlLmFkZDpcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLnNldFRleHQoXCJnaXQ6IGFkZGluZyBmaWxlcyB0byByZXBvLi5cIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsdWdpblN0YXRlLmNvbW1pdDpcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLnNldFRleHQoXCJnaXQ6IGNvbW1pdHRpbmcgY2hhbmdlcy4uXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQbHVnaW5TdGF0ZS5wdXNoOlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0VGV4dChcImdpdDogcHVzaGluZyBjaGFuZ2VzLi5cIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsdWdpblN0YXRlLnB1bGw6XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5zZXRUZXh0KFwiZ2l0OiBwdWxsaW5nIGNoYW5nZXMuLlwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGlzcGxheUZyb21Ob3codGltZXN0YW1wOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRpbWVzdGFtcCkge1xuICAgICAgICAgICAgbGV0IG1vbWVudCA9ICh3aW5kb3cgYXMgYW55KS5tb21lbnQ7XG4gICAgICAgICAgICBsZXQgZnJvbU5vdyA9IG1vbWVudCh0aW1lc3RhbXApLmZyb21Ob3coKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0VGV4dChgZ2l0OiBsYXN0IHVwZGF0ZSAke2Zyb21Ob3d9Li5gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0VGV4dChgZ2l0OiByZWFkeWApO1xuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbImdpdF9lcnJvcl8xIiwicmVxdWlyZSQkMCIsIm9zIiwidHR5IiwidXRpbCIsInJlcXVpcmUkJDEiLCJ0aGlzIiwiZnNfMSIsImZpbGVfZXhpc3RzXzEiLCJ1dGlsXzEiLCJhcmd1bWVudF9maWx0ZXJzXzEiLCJyZXF1aXJlJCQyIiwicmVxdWlyZSQkMyIsInJlcXVpcmUkJDQiLCJyZXF1aXJlJCQ1IiwicmVxdWlyZSQkNiIsInJlcXVpcmUkJDciLCJ1dGlsc18xIiwidGFza19jb25maWd1cmF0aW9uX2Vycm9yXzEiLCJ0YXNrXzEiLCJDbGVhblN1bW1hcnlfMSIsImNsZWFuXzEiLCJjaGVja19pc19yZXBvXzEiLCJyZXNldF8xIiwiZ2l0X2NvbnN0cnVjdF9lcnJvcl8xIiwiZ2l0X3Jlc3BvbnNlX2Vycm9yXzEiLCJkZWJ1Z18xIiwiZ2l0X2xvZ2dlcl8xIiwiYXBpXzEiLCJ0YXNrc19wZW5kaW5nX3F1ZXVlXzEiLCJ0YXNrIiwiY2hpbGRfcHJvY2Vzc18xIiwiZ2l0X2V4ZWN1dG9yX2NoYWluXzEiLCJwcm9taXNlX2RlZmVycmVkXzEiLCJCcmFuY2hEZWxldGVTdW1tYXJ5XzEiLCJCcmFuY2hTdW1tYXJ5XzEiLCJwYXJzZV9icmFuY2hfZGVsZXRlXzEiLCJwYXJzZV9icmFuY2hfMSIsInBhcnNlX2NvbW1pdF8xIiwicGFyc2VfZGlmZl9zdW1tYXJ5XzEiLCJwYXJzZV9mZXRjaF8xIiwicGFyc2VfbGlzdF9sb2dfc3VtbWFyeV8xIiwicGFyc2VfcmVtb3RlX29iamVjdHNfMSIsInBhcnNlX3JlbW90ZV9tZXNzYWdlc18xIiwiTWVyZ2VTdW1tYXJ5XzEiLCJwYXJzZV9wdWxsXzEiLCJwYXJzZV9tZXJnZV8xIiwicGFyc2VfbW92ZV8xIiwicGFyc2VfcHVzaF8xIiwiR2V0UmVtb3RlU3VtbWFyeV8xIiwibG9nXzEiLCJyZXF1aXJlJCQ4IiwicmVxdWlyZSQkOSIsInJlcXVpcmUkJDEwIiwicmVxdWlyZSQkMTEiLCJyZXF1aXJlJCQxMiIsInJlcXVpcmUkJDEzIiwicmVxdWlyZSQkMTQiLCJyZXF1aXJlJCQxNSIsInJlcXVpcmUkJDE2IiwicmVxdWlyZSQkMTciLCJyZXF1aXJlJCQxOCIsInJlcXVpcmUkJDE5IiwicmVxdWlyZSQkMjAiLCJyZXF1aXJlJCQyMSIsInJlcXVpcmUkJDIyIiwicmVxdWlyZSQkMjMiLCJyZXF1aXJlJCQyNCIsInJlcXVpcmUkJDI1IiwicmVxdWlyZSQkMjYiLCJyZXF1aXJlJCQyNyIsImFwaSIsIkdpdCIsInNpbXBsZUdpdCIsIkNoZWNrUmVwb0FjdGlvbnMiLCJOb3RpY2UiLCJQbHVnaW4iLCJTZXR0aW5nIiwiUGx1Z2luU2V0dGluZ1RhYiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuQyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsY0FBYztBQUN6QyxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxZQUFZLEtBQUssSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDcEYsUUFBUSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDMUcsSUFBSSxPQUFPLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDO0FBQ0Y7QUFDTyxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLElBQUksYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QixJQUFJLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUMzQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDekYsQ0FBQztBQXVDRDtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDbkcsUUFBUSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDdEcsUUFBUSxTQUFTLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDdEgsUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUUsS0FBSyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBQ0Q7QUFDTyxTQUFTLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFO0FBQzNDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNySCxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLE1BQU0sS0FBSyxVQUFVLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdKLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxVQUFVLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdEUsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLEVBQUU7QUFDdEIsUUFBUSxJQUFJLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFDdEUsUUFBUSxPQUFPLENBQUMsRUFBRSxJQUFJO0FBQ3RCLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDekssWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BELFlBQVksUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNO0FBQzlDLGdCQUFnQixLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDeEUsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7QUFDakUsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFNBQVM7QUFDakUsZ0JBQWdCO0FBQ2hCLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFO0FBQ2hJLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO0FBQzFHLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDekYsb0JBQW9CLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUN2RixvQkFBb0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFNBQVM7QUFDM0MsYUFBYTtBQUNiLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUNsRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDekYsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEdBLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxRQUFRLFNBQVMsS0FBSyxDQUFDO0FBQzdCLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDL0IsUUFBUSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkIsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6QixRQUFRLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUQsS0FBSztBQUNMLENBQUM7QUFDRCxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7Ozs7O0FDbEM1QixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RCx3QkFBd0IsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUNTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGdCQUFnQixTQUFTQSxRQUFXLENBQUMsUUFBUSxDQUFDO0FBQ3BELElBQUksV0FBVztBQUNmO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxFQUFFLE9BQU8sRUFBRTtBQUNsQixRQUFRLEtBQUssQ0FBQyxTQUFTLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pELFFBQVEsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDdkIsS0FBSztBQUNMLENBQUM7QUFDRCx3QkFBd0IsR0FBRyxnQkFBZ0IsQ0FBQzs7OztBQ2xDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFjLEdBQUcsU0FBUyxHQUFHLEVBQUUsT0FBTyxFQUFFO0FBQ3hDLEVBQUUsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxPQUFPLEdBQUcsQ0FBQztBQUN4QixFQUFFLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUMzQyxJQUFJLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEdBQUcsTUFBTSxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ2pELElBQUksT0FBTyxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkQsR0FBRztBQUNILEVBQUUsTUFBTSxJQUFJLEtBQUs7QUFDakIsSUFBSSx1REFBdUQ7QUFDM0QsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztBQUN6QixHQUFHLENBQUM7QUFDSixDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUU7QUFDcEIsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtBQUN4QixJQUFJLE9BQU87QUFDWCxHQUFHO0FBQ0gsRUFBRSxJQUFJLEtBQUssR0FBRyxrSUFBa0ksQ0FBQyxJQUFJO0FBQ3JKLElBQUksR0FBRztBQUNQLEdBQUcsQ0FBQztBQUNKLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNkLElBQUksT0FBTztBQUNYLEdBQUc7QUFDSCxFQUFFLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUM5QyxFQUFFLFFBQVEsSUFBSTtBQUNkLElBQUksS0FBSyxPQUFPLENBQUM7QUFDakIsSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUNoQixJQUFJLEtBQUssS0FBSyxDQUFDO0FBQ2YsSUFBSSxLQUFLLElBQUksQ0FBQztBQUNkLElBQUksS0FBSyxHQUFHO0FBQ1osTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsSUFBSSxLQUFLLE9BQU8sQ0FBQztBQUNqQixJQUFJLEtBQUssTUFBTSxDQUFDO0FBQ2hCLElBQUksS0FBSyxHQUFHO0FBQ1osTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUNoQixJQUFJLEtBQUssS0FBSyxDQUFDO0FBQ2YsSUFBSSxLQUFLLEdBQUc7QUFDWixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQixJQUFJLEtBQUssT0FBTyxDQUFDO0FBQ2pCLElBQUksS0FBSyxNQUFNLENBQUM7QUFDaEIsSUFBSSxLQUFLLEtBQUssQ0FBQztBQUNmLElBQUksS0FBSyxJQUFJLENBQUM7QUFDZCxJQUFJLEtBQUssR0FBRztBQUNaLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLElBQUksS0FBSyxTQUFTLENBQUM7QUFDbkIsSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUNsQixJQUFJLEtBQUssTUFBTSxDQUFDO0FBQ2hCLElBQUksS0FBSyxLQUFLLENBQUM7QUFDZixJQUFJLEtBQUssR0FBRztBQUNaLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLElBQUksS0FBSyxTQUFTLENBQUM7QUFDbkIsSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUNsQixJQUFJLEtBQUssTUFBTSxDQUFDO0FBQ2hCLElBQUksS0FBSyxLQUFLLENBQUM7QUFDZixJQUFJLEtBQUssR0FBRztBQUNaLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLElBQUksS0FBSyxjQUFjLENBQUM7QUFDeEIsSUFBSSxLQUFLLGFBQWEsQ0FBQztBQUN2QixJQUFJLEtBQUssT0FBTyxDQUFDO0FBQ2pCLElBQUksS0FBSyxNQUFNLENBQUM7QUFDaEIsSUFBSSxLQUFLLElBQUk7QUFDYixNQUFNLE9BQU8sQ0FBQyxDQUFDO0FBQ2YsSUFBSTtBQUNKLE1BQU0sT0FBTyxTQUFTLENBQUM7QUFDdkIsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFFBQVEsQ0FBQyxFQUFFLEVBQUU7QUFDdEIsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQ2xCLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDcEMsR0FBRztBQUNILEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQ2xCLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDcEMsR0FBRztBQUNILEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQ2xCLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDcEMsR0FBRztBQUNILEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQ2xCLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDcEMsR0FBRztBQUNILEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ25CLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLE9BQU8sQ0FBQyxFQUFFLEVBQUU7QUFDckIsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQ2xCLElBQUksT0FBTyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkMsR0FBRztBQUNILEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQ2xCLElBQUksT0FBTyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDeEMsR0FBRztBQUNILEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQ2xCLElBQUksT0FBTyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDMUMsR0FBRztBQUNILEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQ2xCLElBQUksT0FBTyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDMUMsR0FBRztBQUNILEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBQ3BCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxRQUFRLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLElBQUksUUFBUSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNqRTs7QUNoS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRTtBQUNwQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxD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U0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsU0FBUztBQUNWLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxFQUFFO0FBQ0wsR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxHQUFHO0FBQ04sR0FBRyxH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 diff --git a/.obsidian/plugins/obsidian-git/manifest.json b/.obsidian/plugins/obsidian-git/manifest.json new file mode 100644 index 0000000..ff31faf --- /dev/null +++ b/.obsidian/plugins/obsidian-git/manifest.json @@ -0,0 +1,8 @@ +{ + "id": "obsidian-git", + "name": "Obsidian Git", + "description": "Backup your vault with git.", + "isDesktopOnly": false, + "js": "main.js", + "version": "1.5.0" +} diff --git a/.obsidian/plugins/obsidian-hider/data.json b/.obsidian/plugins/obsidian-hider/data.json new file mode 100644 index 0000000..a448f05 --- /dev/null +++ b/.obsidian/plugins/obsidian-hider/data.json @@ -0,0 +1 @@ +{"frameless":false,"hideRibbon":false,"hideStatus":true,"hideScroll":false,"hideTooltips":false,"hideInstructions":false,"hideMeta":false} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-hider/main.js b/.obsidian/plugins/obsidian-hider/main.js new file mode 100644 index 0000000..d6a1e6c --- /dev/null +++ b/.obsidian/plugins/obsidian-hider/main.js @@ -0,0 +1,228 @@ +'use strict'; + +var obsidian = require('obsidian'); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + 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; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +var Hider = /** @class */ (function (_super) { + __extends(Hider, _super); + function Hider() { + var _this = _super !== null && _super.apply(this, arguments) || this; + // refresh function for when we change settings + _this.refresh = function () { + // re-load the style + _this.updateStyle(); + }; + // update the styles (at the start, or as the result of a settings change) + _this.updateStyle = function () { + document.body.classList.toggle('hider-ribbon', _this.settings.hideRibbon); + document.body.classList.toggle('hider-status', _this.settings.hideStatus); + document.body.classList.toggle('hider-frameless', _this.settings.frameless); + document.body.classList.toggle('hider-scroll', _this.settings.hideScroll); + document.body.classList.toggle('hider-tooltips', _this.settings.hideTooltips); + document.body.classList.toggle('hider-instructions', _this.settings.hideInstructions); + document.body.classList.toggle('hider-meta', _this.settings.hideMeta); + }; + return _this; + } + Hider.prototype.onload = function () { + return __awaiter(this, void 0, void 0, function () { + var _a; + var _this = this; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + // load settings + _a = this; + return [4 /*yield*/, this.loadData()]; + case 1: + // load settings + _a.settings = (_b.sent()) || new HiderSettings(); + // add the settings tab + this.addSettingTab(new HiderSettingTab(this.app, this)); + // add the toggle on/off command + this.addCommand({ + id: 'toggle-app-ribbon', + name: 'Toggle App Ribbon', + callback: function () { + // switch the setting, save and refresh + _this.settings.hideRibbon = !_this.settings.hideRibbon; + _this.saveData(_this.settings); + _this.refresh(); + } + }); + this.addCommand({ + id: 'toggle-hider-status', + name: 'Toggle Status Bar', + callback: function () { + // switch the setting, save and refresh + _this.settings.hideStatus = !_this.settings.hideStatus; + _this.saveData(_this.settings); + _this.refresh(); + } + }); + this.refresh(); + return [2 /*return*/]; + } + }); + }); + }; + return Hider; +}(obsidian.Plugin)); +var HiderSettings = /** @class */ (function () { + function HiderSettings() { + this.frameless = false; + this.hideRibbon = false; + this.hideStatus = false; + this.hideScroll = false; + this.hideTooltips = false; + this.hideInstructions = false; + this.hideMeta = false; + } + return HiderSettings; +}()); +var HiderSettingTab = /** @class */ (function (_super) { + __extends(HiderSettingTab, _super); + function HiderSettingTab(app, plugin) { + var _this = _super.call(this, app, plugin) || this; + _this.plugin = plugin; + return _this; + } + HiderSettingTab.prototype.display = function () { + var _this = this; + var containerEl = this.containerEl; + containerEl.empty(); + new obsidian.Setting(containerEl) + .setName('Hide title bar (frameless mode)') + .setDesc('Hides the title bar (best on macOS)') + .addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.frameless) + .onChange(function (value) { + _this.plugin.settings.frameless = value; + _this.plugin.saveData(_this.plugin.settings); + _this.plugin.refresh(); + }); }); + new obsidian.Setting(containerEl) + .setName('Hide app ribbon') + .setDesc('Hides the Obsidian menu. Warning: to open Settings you will need use the hotkey (default is CMD + ,)') + .addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideRibbon) + .onChange(function (value) { + _this.plugin.settings.hideRibbon = value; + _this.plugin.saveData(_this.plugin.settings); + _this.plugin.refresh(); + }); }); + new obsidian.Setting(containerEl) + .setName('Hide status bar') + .setDesc('Hides word count, character count and backlink count') + .addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideStatus) + .onChange(function (value) { + _this.plugin.settings.hideStatus = value; + _this.plugin.saveData(_this.plugin.settings); + _this.plugin.refresh(); + }); }); + new obsidian.Setting(containerEl) + .setName('Hide scroll bars') + .setDesc('Hides all scroll bars') + .addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideScroll) + .onChange(function (value) { + _this.plugin.settings.hideScroll = value; + _this.plugin.saveData(_this.plugin.settings); + _this.plugin.refresh(); + }); }); + new obsidian.Setting(containerEl) + .setName('Hide tooltips') + .setDesc('Hides all tooltips') + .addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideTooltips) + .onChange(function (value) { + _this.plugin.settings.hideTooltips = value; + _this.plugin.saveData(_this.plugin.settings); + _this.plugin.refresh(); + }); }); + new obsidian.Setting(containerEl) + .setName('Hide instructions') + .setDesc('Hides instructional tips in modals') + .addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideInstructions) + .onChange(function (value) { + _this.plugin.settings.hideInstructions = value; + _this.plugin.saveData(_this.plugin.settings); + _this.plugin.refresh(); + }); }); + new obsidian.Setting(containerEl) + .setName('Hide metadata block in Preview mode') + .setDesc('When front matter is turned off in your Editor settings this hides the metadata block') + .addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideMeta) + .onChange(function (value) { + _this.plugin.settings.hideMeta = value; + _this.plugin.saveData(_this.plugin.settings); + _this.plugin.refresh(); + }); }); + }; + return HiderSettingTab; +}(obsidian.PluginSettingTab)); + +module.exports = Hider; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuIiwiaW1wb3J0IHsgQXBwLCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIaWRlciBleHRlbmRzIFBsdWdpbiB7XHJcbiAgc2V0dGluZ3M6IEhpZGVyU2V0dGluZ3M7XHJcblxyXG4gIGFzeW5jIG9ubG9hZCgpIHtcclxuICAgIC8vIGxvYWQgc2V0dGluZ3NcclxuICAgIHRoaXMuc2V0dGluZ3MgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCkgfHwgbmV3IEhpZGVyU2V0dGluZ3MoKTtcclxuXHJcbiAgICAvLyBhZGQgdGhlIHNldHRpbmdzIHRhYlxyXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBIaWRlclNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuICAgIC8vIGFkZCB0aGUgdG9nZ2xlIG9uL29mZiBjb21tYW5kXHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICd0b2dnbGUtYXBwLXJpYmJvbicsXHJcbiAgICAgIG5hbWU6ICdUb2dnbGUgQXBwIFJpYmJvbicsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgLy8gc3dpdGNoIHRoZSBzZXR0aW5nLCBzYXZlIGFuZCByZWZyZXNoXHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5oaWRlUmliYm9uID0gIXRoaXMuc2V0dGluZ3MuaGlkZVJpYmJvbjtcclxuICAgICAgICB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiAndG9nZ2xlLWhpZGVyLXN0YXR1cycsXHJcbiAgICAgIG5hbWU6ICdUb2dnbGUgU3RhdHVzIEJhcicsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgLy8gc3dpdGNoIHRoZSBzZXR0aW5nLCBzYXZlIGFuZCByZWZyZXNoXHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5oaWRlU3RhdHVzID0gIXRoaXMuc2V0dGluZ3MuaGlkZVN0YXR1cztcclxuICAgICAgICB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVmcmVzaCgpXHJcbiAgfVxyXG5cclxuICAvLyByZWZyZXNoIGZ1bmN0aW9uIGZvciB3aGVuIHdlIGNoYW5nZSBzZXR0aW5nc1xyXG4gIHJlZnJlc2ggPSAoKSA9PiB7XHJcbiAgICAvLyByZS1sb2FkIHRoZSBzdHlsZVxyXG4gICAgdGhpcy51cGRhdGVTdHlsZSgpXHJcbiAgfVxyXG5cclxuICAvLyB1cGRhdGUgdGhlIHN0eWxlcyAoYXQgdGhlIHN0YXJ0LCBvciBhcyB0aGUgcmVzdWx0IG9mIGEgc2V0dGluZ3MgY2hhbmdlKVxyXG4gIHVwZGF0ZVN0eWxlID0gKCkgPT4ge1xyXG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdoaWRlci1yaWJib24nLCB0aGlzLnNldHRpbmdzLmhpZGVSaWJib24pO1xyXG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdoaWRlci1zdGF0dXMnLCB0aGlzLnNldHRpbmdzLmhpZGVTdGF0dXMpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdoaWRlci1mcmFtZWxlc3MnLCB0aGlzLnNldHRpbmdzLmZyYW1lbGVzcyk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGVyLXNjcm9sbCcsIHRoaXMuc2V0dGluZ3MuaGlkZVNjcm9sbCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGVyLXRvb2x0aXBzJywgdGhpcy5zZXR0aW5ncy5oaWRlVG9vbHRpcHMpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdoaWRlci1pbnN0cnVjdGlvbnMnLCB0aGlzLnNldHRpbmdzLmhpZGVJbnN0cnVjdGlvbnMpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdoaWRlci1tZXRhJywgdGhpcy5zZXR0aW5ncy5oaWRlTWV0YSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG59XHJcblxyXG5jbGFzcyBIaWRlclNldHRpbmdzIHtcclxuICBmcmFtZWxlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBoaWRlUmliYm9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaGlkZVN0YXR1czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGhpZGVTY3JvbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBoaWRlVG9vbHRpcHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBoaWRlSW5zdHJ1Y3Rpb25zOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaGlkZU1ldGE6IGJvb2xlYW4gPSBmYWxzZTtcclxufVxyXG5cclxuY2xhc3MgSGlkZXJTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblxyXG5cclxuICBwbHVnaW46IEhpZGVyO1xyXG4gIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IEhpZGVyKSB7XHJcbiAgICBzdXBlcihhcHAsIHBsdWdpbik7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICB9XHJcblxyXG4gIGRpc3BsYXkoKTogdm9pZCB7XHJcbiAgICBsZXQge2NvbnRhaW5lckVsfSA9IHRoaXM7XHJcblxyXG4gICAgY29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUoJ0hpZGUgdGl0bGUgYmFyIChmcmFtZWxlc3MgbW9kZSknKVxyXG4gICAgICAuc2V0RGVzYygnSGlkZXMgdGhlIHRpdGxlIGJhciAoYmVzdCBvbiBtYWNPUyknKVxyXG4gICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZnJhbWVsZXNzKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5mcmFtZWxlc3MgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICBcclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSgnSGlkZSBhcHAgcmliYm9uJylcclxuICAgICAgLnNldERlc2MoJ0hpZGVzIHRoZSBPYnNpZGlhbiBtZW51LiBXYXJuaW5nOiB0byBvcGVuIFNldHRpbmdzIHlvdSB3aWxsIG5lZWQgdXNlIHRoZSBob3RrZXkgKGRlZmF1bHQgaXMgQ01EICsgLCknKVxyXG4gICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlkZVJpYmJvbilcclxuICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlkZVJpYmJvbiA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKCdIaWRlIHN0YXR1cyBiYXInKVxyXG4gICAgICAuc2V0RGVzYygnSGlkZXMgd29yZCBjb3VudCwgY2hhcmFjdGVyIGNvdW50IGFuZCBiYWNrbGluayBjb3VudCcpXHJcbiAgICAgIC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5oaWRlU3RhdHVzKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5oaWRlU3RhdHVzID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4ucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUoJ0hpZGUgc2Nyb2xsIGJhcnMnKVxyXG4gICAgICAuc2V0RGVzYygnSGlkZXMgYWxsIHNjcm9sbCBiYXJzJylcclxuICAgICAgLmFkZFRvZ2dsZSh0b2dnbGUgPT4gdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmhpZGVTY3JvbGwpXHJcbiAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmhpZGVTY3JvbGwgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSgnSGlkZSB0b29sdGlwcycpXHJcbiAgICAgIC5zZXREZXNjKCdIaWRlcyBhbGwgdG9vbHRpcHMnKVxyXG4gICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlkZVRvb2x0aXBzKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5oaWRlVG9vbHRpcHMgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSgnSGlkZSBpbnN0cnVjdGlvbnMnKVxyXG4gICAgICAuc2V0RGVzYygnSGlkZXMgaW5zdHJ1Y3Rpb25hbCB0aXBzIGluIG1vZGFscycpXHJcbiAgICAgIC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5oaWRlSW5zdHJ1Y3Rpb25zKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5oaWRlSW5zdHJ1Y3Rpb25zID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4ucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUoJ0hpZGUgbWV0YWRhdGEgYmxvY2sgaW4gUHJldmlldyBtb2RlJylcclxuICAgICAgLnNldERlc2MoJ1doZW4gZnJvbnQgbWF0dGVyIGlzIHR1cm5lZCBvZmYgaW4geW91ciBFZGl0b3Igc2V0dGluZ3MgdGhpcyBoaWRlcyB0aGUgbWV0YWRhdGEgYmxvY2snKVxyXG4gICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlkZU1ldGEpXHJcbiAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmhpZGVNZXRhID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4ucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKTtcclxuXHJcblxyXG5cclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbIlBsdWdpbiIsIlNldHRpbmciLCJQbHVnaW5TZXR0aW5nVGFiIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWM7QUFDekMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3BGLFFBQVEsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzFHLElBQUksT0FBTyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQUNGO0FBQ08sU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNoQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEIsSUFBSSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDM0MsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUF1Q0Q7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ3RHLFFBQVEsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3RILFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEO0FBQ08sU0FBUyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUMzQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckgsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxNQUFNLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3SixJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3RFLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ3RFLFFBQVEsT0FBTyxDQUFDLEVBQUUsSUFBSTtBQUN0QixZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pLLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwRCxZQUFZLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixnQkFBZ0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTTtBQUM5QyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3hFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0FBQ2pFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxTQUFTO0FBQ2pFLGdCQUFnQjtBQUNoQixvQkFBb0IsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTtBQUNoSSxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUMxRyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0FBQ3pGLG9CQUFvQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FB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 diff --git a/.obsidian/plugins/obsidian-hider/manifest.json b/.obsidian/plugins/obsidian-hider/manifest.json new file mode 100644 index 0000000..305ae3f --- /dev/null +++ b/.obsidian/plugins/obsidian-hider/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "obsidian-hider", + "name": "Hider", + "version": "1.0.5", + "minAppVersion": "0.9.12", + "description": "Hide UI elements such as tooltips, status, titlebar and more", + "author": "@kepano", + "authorUrl": "https://www.twitter.com/kepano", + "isDesktopOnly": false +} diff --git a/.obsidian/plugins/obsidian-hider/styles.css b/.obsidian/plugins/obsidian-hider/styles.css new file mode 100644 index 0000000..32a3bb4 --- /dev/null +++ b/.obsidian/plugins/obsidian-hider/styles.css @@ -0,0 +1,56 @@ +/* Hide ribbon */ +.hider-ribbon .workspace-ribbon.mod-left { + display:none; +} +.hider-ribbon .workspace-ribbon.mod-right { + visibility:hidden; +} +.hider-ribbon .workspace-split.mod-right-split { + margin-right:0; +} +.hider-ribbon .workspace-split.mod-left-split { + margin-left:0; +} + +/* Frameless */ +.hider-frameless .titlebar-button-container { + display:none; +} +.hider-frameless .titlebar, +.hider-frameless .titlebar-inner { + position:fixed; + top:0; + height:12px; + background:transparent; +} +.hider-frameless { + padding-top:0 !important; +} +.hider-frameless .workspace-split.mod-left-split > .workspace-tabs { + padding-top:18px; +} + +/* Hide meta */ +.hider-meta .frontmatter-container { + display:none; +} + +/* Hide scrollbars */ +.hider-scroll ::-webkit-scrollbar { + display:none; +} + +/* Hide status */ +.hider-status .status-bar { + display:none; +} + +/* Hide tooltips */ +.hider-tooltips .tooltip { + display:none; +} + +/* Hide instructions */ +.hider-instructions .prompt-instructions { + display:none; +} \ No newline at end of file diff --git a/.obsidian/plugins/wikilinks-to-mdlinks-obsidian/main.js b/.obsidian/plugins/wikilinks-to-mdlinks-obsidian/main.js new file mode 100644 index 0000000..17548c6 --- /dev/null +++ b/.obsidian/plugins/wikilinks-to-mdlinks-obsidian/main.js @@ -0,0 +1,154 @@ +'use strict'; + +var obsidian = require('obsidian'); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var WikilinksToMdlinks = /** @class */ (function (_super) { + __extends(WikilinksToMdlinks, _super); + function WikilinksToMdlinks() { + return _super !== null && _super.apply(this, arguments) || this; + } + WikilinksToMdlinks.prototype.onload = function () { + var _this = this; + console.log('loading wikilinks-to-mdlinks plugin...'); + this.addCommand({ + id: "toggle-wiki-md-links", + name: "Toggle selected wikilink to markdown link and vice versa", + checkCallback: function (checking) { + var currentView = _this.app.workspace.getActiveLeafOfViewType(obsidian.MarkdownView); + if ((currentView == null) || (currentView.getMode() !== 'source')) { + return false; + } + if (!checking) { + _this.toggleLink(); + } + return true; + }, + hotkeys: [{ + modifiers: ["Mod", "Shift"], + key: "L" + }] + }); + }; + WikilinksToMdlinks.prototype.onunload = function () { + console.log('unloading wikilinks-to-mdlinks plugin'); + }; + WikilinksToMdlinks.prototype.toggleLink = function () { + var currentView = this.app.workspace.getActiveLeafOfViewType(obsidian.MarkdownView); + var editor = currentView.sourceMode.cmEditor; + var cursor = editor.getCursor(); + var line = editor.getDoc().getLine(cursor.line); + var regexHasExtension = /^([^\\]*)\.(\w+)$/; + var regexWiki = /\[\[([^\]]+)\]\]/; + var regexParenthesis = /\((.*?)\)/; + var regexWikiGlobal = /\[\[([^\]]*)\]\]/g; + var regexMdGlobal = /\[([^\]]*)\]\(([^\(]*)\)/g; + var wikiMatches = line.match(regexWikiGlobal); + var mdMatches = line.match(regexMdGlobal); + var ifFoundMatch = false; + // If there are wikiMatches find if the cursor is inside the selected text + var i = 0; + if (wikiMatches) { + for (var _i = 0, wikiMatches_1 = wikiMatches; _i < wikiMatches_1.length; _i++) { + var item = wikiMatches_1[_i]; + var temp = line.slice(i, line.length); + var index = i + temp.indexOf(item); + var indexEnd = index + item.length; + i = indexEnd; + if ((cursor.ch >= index) && (cursor.ch <= indexEnd)) { + ifFoundMatch = true; + var text = item.match(regexWiki)[1]; + // Check if it is a markdown file + var matches = text.match(regexHasExtension); + var newText = text; + if (matches) { + var filename = matches[1]; + var extension = matches[2]; + } + else { + newText = newText + ".md"; + } + var encodedText = encodeURI(newText); + var newItem = "[" + text + "](" + encodedText + ")"; + var cursorStart = { + line: cursor.line, + ch: index + }; + var cursorEnd = { + line: cursor.line, + ch: indexEnd + }; + editor.replaceRange(newItem, cursorStart, cursorEnd); + } + } + } + i = 0; + if (ifFoundMatch == false) { + if (mdMatches) { + for (var _a = 0, mdMatches_1 = mdMatches; _a < mdMatches_1.length; _a++) { + var item = mdMatches_1[_a]; + var temp = line.slice(i, line.length); + var index = i + temp.indexOf(item); + var indexEnd = index + item.length; + i = indexEnd; + if ((cursor.ch >= index) && (cursor.ch <= indexEnd)) { + ifFoundMatch = true; + var text = item.match(regexParenthesis)[1]; + text = decodeURI(text); + // Check if it is a markdown file + var matches = text.match(regexHasExtension); + if (matches) { + var filename = matches[1]; + var extension = matches[2]; + if (extension == 'md') { + text = filename; + } + } + var newItem = "[[" + text + "]]"; + var cursorStart = { + line: cursor.line, + ch: index + }; + var cursorEnd = { + line: cursor.line, + ch: indexEnd + }; + editor.replaceRange(newItem, cursorStart, cursorEnd); + } + } + } + } + }; + return WikilinksToMdlinks; +}(obsidian.Plugin)); + +module.exports = WikilinksToMdlinks; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuIiwiaW1wb3J0IHsgc3RyaWN0IH0gZnJvbSAnYXNzZXJ0J1xyXG5pbXBvcnQgeyBBcHAsIE1vZGFsLCBOb3RpY2UsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJ1xyXG5pbXBvcnQgeyBNYXJrZG93blZpZXcsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXaWtpbGlua3NUb01kbGlua3MgZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdG9ubG9hZCgpIHtcclxuXHRcdGNvbnNvbGUubG9nKCdsb2FkaW5nIHdpa2lsaW5rcy10by1tZGxpbmtzIHBsdWdpbi4uLicpXHJcblxyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6IFwidG9nZ2xlLXdpa2ktbWQtbGlua3NcIixcclxuXHRcdFx0bmFtZTogXCJUb2dnbGUgc2VsZWN0ZWQgd2lraWxpbmsgdG8gbWFya2Rvd24gbGluayBhbmQgdmljZSB2ZXJzYVwiLFxyXG5cdFx0XHRjaGVja0NhbGxiYWNrOiAoY2hlY2tpbmc6IGJvb2xlYW4pID0+IHtcclxuXHRcdFx0XHRjb25zdCBjdXJyZW50VmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVMZWFmT2ZWaWV3VHlwZShNYXJrZG93blZpZXcpXHJcblxyXG5cdFx0XHRcdGlmICgoY3VycmVudFZpZXcgPT0gbnVsbCkgfHwgKGN1cnJlbnRWaWV3LmdldE1vZGUoKSAhPT0gJ3NvdXJjZScpKSAge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIWNoZWNraW5nKSB7XHJcblx0XHRcdFx0XHR0aGlzLnRvZ2dsZUxpbmsoKVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0fSxcclxuXHRcdFx0aG90a2V5czogW3tcclxuXHRcdFx0XHRtb2RpZmllcnM6IFtcIk1vZFwiLCBcIlNoaWZ0XCJdLFxyXG5cdFx0XHRcdGtleTogXCJMXCJcclxuXHRcdFx0fV1cclxuXHRcdH0pXHJcblxyXG5cdH1cclxuXHJcblx0b251bmxvYWQoKSB7XHJcblx0XHRjb25zb2xlLmxvZygndW5sb2FkaW5nIHdpa2lsaW5rcy10by1tZGxpbmtzIHBsdWdpbicpXHJcblx0fVxyXG5cclxuXHR0b2dnbGVMaW5rKCkge1xyXG5cdFx0Y29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlTGVhZk9mVmlld1R5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0Y29uc3QgZWRpdG9yID0gY3VycmVudFZpZXcuc291cmNlTW9kZS5jbUVkaXRvclxyXG5cclxuXHJcblx0XHRjb25zdCBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yKClcclxuXHRcdGNvbnN0IGxpbmUgPSBlZGl0b3IuZ2V0RG9jKCkuZ2V0TGluZShjdXJzb3IubGluZSk7XHJcblxyXG5cdFx0Y29uc3QgcmVnZXhIYXNFeHRlbnNpb24gPSAvXihbXlxcXFxdKilcXC4oXFx3KykkL1xyXG5cclxuXHRcdGNvbnN0IHJlZ2V4V2lraSA9IC9cXFtcXFsoW15cXF1dKylcXF1cXF0vXHJcblx0XHRjb25zdCByZWdleFBhcmVudGhlc2lzID0gL1xcKCguKj8pXFwpL1xyXG5cdFx0Y29uc3QgcmVnZXhXaWtpR2xvYmFsID0gL1xcW1xcWyhbXlxcXV0qKVxcXVxcXS9nXHJcblx0XHRjb25zdCByZWdleE1kR2xvYmFsID0gL1xcWyhbXlxcXV0qKVxcXVxcKChbXlxcKF0qKVxcKS9nXHJcblxyXG5cdFx0bGV0IHdpa2lNYXRjaGVzID0gbGluZS5tYXRjaChyZWdleFdpa2lHbG9iYWwpXHJcblx0XHRsZXQgbWRNYXRjaGVzID0gbGluZS5tYXRjaChyZWdleE1kR2xvYmFsKVxyXG5cclxuXHRcdGxldCBpZkZvdW5kTWF0Y2ggPSBmYWxzZVxyXG5cclxuXHRcdC8vIElmIHRoZXJlIGFyZSB3aWtpTWF0Y2hlcyBmaW5kIGlmIHRoZSBjdXJzb3IgaXMgaW5zaWRlIHRoZSBzZWxlY3RlZCB0ZXh0XHJcblx0XHRsZXQgaSA9IDBcclxuXHRcdGlmICh3aWtpTWF0Y2hlcykge1xyXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2Ygd2lraU1hdGNoZXMpIHtcclxuXHJcblx0XHRcdFx0bGV0IHRlbXAgPSBsaW5lLnNsaWNlKGksIGxpbmUubGVuZ3RoKVxyXG5cclxuXHRcdFx0XHRsZXQgaW5kZXggPSBpICsgdGVtcC5pbmRleE9mKGl0ZW0pXHJcblx0XHRcdFx0bGV0IGluZGV4RW5kID0gaW5kZXggKyBpdGVtLmxlbmd0aFxyXG5cclxuXHRcdFx0XHRpID0gaW5kZXhFbmRcclxuXHRcdFx0XHRpZiAoKGN1cnNvci5jaCA+PSBpbmRleCApICYmIChjdXJzb3IuY2ggPD0gaW5kZXhFbmQgKSkge1xyXG5cdFx0XHRcdFx0aWZGb3VuZE1hdGNoID0gdHJ1ZVxyXG5cdFx0XHRcdFx0bGV0IHRleHQgPSBpdGVtLm1hdGNoKHJlZ2V4V2lraSlbMV1cclxuXHRcdFx0XHRcdC8vIENoZWNrIGlmIGl0IGlzIGEgbWFya2Rvd24gZmlsZVxyXG5cdFx0XHRcdFx0Y29uc3QgbWF0Y2hlcyA9IHRleHQubWF0Y2gocmVnZXhIYXNFeHRlbnNpb24pO1xyXG5cdFx0XHRcdFx0bGV0IG5ld1RleHQgPSB0ZXh0XHJcblx0XHRcdFx0XHRpZiAobWF0Y2hlcykge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBmaWxlbmFtZSA9IG1hdGNoZXNbMV1cclxuXHRcdFx0XHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gbWF0Y2hlc1syXVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0bmV3VGV4dCA9IG5ld1RleHQgKyBcIi5tZFwiXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjb25zdCBlbmNvZGVkVGV4dCA9IGVuY29kZVVSSShuZXdUZXh0KVxyXG5cdFx0XHRcdFx0bGV0IG5ld0l0ZW0gPSBgWyR7dGV4dH1dKCR7ZW5jb2RlZFRleHR9KWBcclxuXHJcblx0XHRcdFx0XHRjb25zdCBjdXJzb3JTdGFydCA9IHtcclxuXHRcdFx0XHRcdFx0bGluZTogY3Vyc29yLmxpbmUsXHJcblx0XHRcdFx0XHRcdGNoOiBpbmRleFxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Y29uc3QgY3Vyc29yRW5kID0ge1xyXG5cdFx0XHRcdFx0XHRsaW5lOiBjdXJzb3IubGluZSxcclxuXHRcdFx0XHRcdFx0Y2g6IGluZGV4RW5kXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShuZXdJdGVtLCBjdXJzb3JTdGFydCwgY3Vyc29yRW5kKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpID0gMFxyXG5cdFx0aWYgKGlmRm91bmRNYXRjaCA9PSBmYWxzZSkge1xyXG5cdFx0XHRpZiAobWRNYXRjaGVzKSB7XHJcblx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIG9mIG1kTWF0Y2hlcykge1xyXG5cdFx0XHRcdFx0bGV0IHRlbXAgPSBsaW5lLnNsaWNlKGksIGxpbmUubGVuZ3RoKVxyXG5cdFx0XHRcdFx0bGV0IGluZGV4ID0gaSArIHRlbXAuaW5kZXhPZihpdGVtKVxyXG5cdFx0XHRcdFx0bGV0IGluZGV4RW5kID0gaW5kZXggKyBpdGVtLmxlbmd0aFxyXG5cdFx0XHRcdFx0aSA9IGluZGV4RW5kXHJcblxyXG5cdFx0XHRcdFx0aWYgKChjdXJzb3IuY2ggPj0gaW5kZXggKSAmJiAoY3Vyc29yLmNoIDw9IGluZGV4RW5kICkpIHtcclxuXHRcdFx0XHRcdFx0aWZGb3VuZE1hdGNoID0gdHJ1ZVxyXG5cdFx0XHRcdFx0XHRsZXQgdGV4dCA9IGl0ZW0ubWF0Y2gocmVnZXhQYXJlbnRoZXNpcylbMV1cclxuXHRcdFx0XHRcdFx0dGV4dCA9IGRlY29kZVVSSSh0ZXh0KVxyXG5cclxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgaXQgaXMgYSBtYXJrZG93biBmaWxlXHJcblx0XHRcdFx0XHRcdGNvbnN0IG1hdGNoZXMgPSB0ZXh0Lm1hdGNoKHJlZ2V4SGFzRXh0ZW5zaW9uKTtcclxuXHRcdFx0XHRcdFx0aWYgKG1hdGNoZXMpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBmaWxlbmFtZSA9IG1hdGNoZXNbMV1cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBleHRlbnNpb24gPSBtYXRjaGVzWzJdXHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChleHRlbnNpb24gPT0gJ21kJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGV4dCA9IGZpbGVuYW1lXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGxldCBuZXdJdGVtID0gYFtbJHt0ZXh0fV1dYFxyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgY3Vyc29yU3RhcnQgPSB7XHJcblx0XHRcdFx0XHRcdFx0bGluZTogY3Vyc29yLmxpbmUsXHJcblx0XHRcdFx0XHRcdFx0Y2g6IGluZGV4XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0Y29uc3QgY3Vyc29yRW5kID0ge1xyXG5cdFx0XHRcdFx0XHRcdGxpbmU6IGN1cnNvci5saW5lLFxyXG5cdFx0XHRcdFx0XHRcdGNoOiBpbmRleEVuZFxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UobmV3SXRlbSwgY3Vyc29yU3RhcnQsIGN1cnNvckVuZCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiJdLCJuYW1lcyI6WyJNYXJrZG93blZpZXciLCJQbHVnaW4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuQyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsY0FBYztBQUN6QyxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxZQUFZLEtBQUssSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDcEYsUUFBUSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDMUcsSUFBSSxPQUFPLGFBQWEs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 diff --git a/.obsidian/plugins/wikilinks-to-mdlinks-obsidian/manifest.json b/.obsidian/plugins/wikilinks-to-mdlinks-obsidian/manifest.json new file mode 100644 index 0000000..a5a1416 --- /dev/null +++ b/.obsidian/plugins/wikilinks-to-mdlinks-obsidian/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "wikilinks-to-mdlinks-obsidian", + "name": "Wikilinks to MDLinks", + "version": "0.0.12", + "minAppVersion": "0.9.12", + "description": "A plugin that converts wikilinks to markdown links and vice versa", + "author": "Agatha Uy", + "authorUrl": "https://github.com/agathauy", + "isDesktopOnly": false +} diff --git a/.obsidian/rtl.json b/.obsidian/rtl.json new file mode 100644 index 0000000..fe95a61 --- /dev/null +++ b/.obsidian/rtl.json @@ -0,0 +1 @@ +{"fileDirections":{"講道筆記.md":"ltr"},"defaultDirection":"ltr","rememberPerFile":true} \ No newline at end of file diff --git a/.obsidian/snippets/Ruby-Interlinear.css b/.obsidian/snippets/Ruby-Interlinear.css new file mode 100644 index 0000000..dc46fed --- /dev/null +++ b/.obsidian/snippets/Ruby-Interlinear.css @@ -0,0 +1,195 @@ +/* ============= 設定字型 ================== */ +@font-face { + font-family: AndleyFont; + unicode-range: U+0370-03FF, U+1F00-1FFF; /* Greek UNICODE */ + src: local("SBL BibLit"); +} +@font-face { + font-family: AndleyFont; + unicode-range: U+0590-05FF, U+FB10-FB4F; /* Hebrew UNICODE */ + src: local("SBL BibLit"); +} +@font-face { + font-family: AndleyFont; + unicode-range: U+00-024F; /* English UNICODE */ + src: local("Noto Sans"); +} +@font-face { + font-family: AndleyFont; + unicode-range: U+4E00-9FFF; /* 中文 UNICODE */ + src: local("Noto Sans CJK TC"); +} + +@font-face { + font-family: InterlinearFont; + unicode-range: U+0370-03FF, U+1F00-1FFF; /* Greek UNICODE */ + src: local("Arial Narrow"); +} +@font-face { + font-family: InterlinearFont; + unicode-range: U+00-024F; /* English UNICODE */ + src: local("Arial Narrow"); +} +@font-face { + font-family: InterlinearFont; + unicode-range: U+4E00-9FFF; /* 中文 UNICODE */ + src: local("Noto Sans CJK TC"); +} + + +/* ============= 列印 PDF 設定 ============= */ + @media print { + /* -------- 列印強調 ---------- */ + a, strong, em { + color: black !important; + } + + /* -------- 列印 Interlinear 經文段落---------- */ + ruby { + font-size: 19px !important; /* 14pt 字體大小*/ + line-height: 19px !important; + padding-bottom: 10px !important; + } + rt { + font-size: 16px !important; /* 12pt 字體大小*/ + line-height: 16px !important; + } + + /* -------- 列印 Interlinear 圖析 ---------- */ + ul ruby { + font-size: 16px !important; /* 12pt 字體大小*/ + line-height: 16px !important; + padding-bottom: 2px !important; + } + ul rt { + font-size: 13px !important; /* 10pt 字體大小*/ + line-height: 13px !important; + } + + /* -------- 列印其他文字 ---------- */ + html, body { + background-color: white !important; + color: black !important; + font-size: 16px !important; /* 12pt 字體大小*/ + } +} + +/* ============= Obsidian 介面設定 ============= */ +.theme-dark { + --text-tag: #778899; + --text-muted: #D3D3D3; + --text-faint: gold; + --text-normal: #f1f1f1; + --text-selection: #ffe23d48; + --text-accent: greenyellow; + --color1:#ea4335; + --color2:#4285f4; + --color3:#34a853; + --color4:#ff8a00; + --opacity-translucency: 0.8; +} +.theme-light { + --text-tag: rgb(128, 136, 240); + --text-normal:black; + --text-selection: #ffe23d48; + --background-primary: white; + --color1:darkred; + --color2:darkblue; + --color3:darkgreen; + --color4:darkmagenta; + --opacity-translucency: 0; +} + +/* 粗體、斜體 in preview and editor */ +.cm-strong, .markdown-preview-view strong { + font-weight:bolder; + color: var(--text-accent); +} +.cm-em, .markdown-preview-view em { + color: var(--text-accent); +} + +/* tags in preview and editor */ +.cm-s-obsidian span.cm-tag { + color: var(--text-tag); +} + +/* 標題 */ +.cm-header-1, .markdown-preview-view h1 { + color: var(--color1); + font-size:26px; /* 20pt 字體大小*/ + text-align: center; + border-bottom: 4px double ; + font-family: "Noto Sans Black", "Noto Sans CJK TC Black"; +} +.cm-header-2,.markdown-preview-view h2 { + color: var(--color2); + font-size:24px; /* 18pt 字體大小*/ + text-align: center; + font-family: "Noto Sans Black", "Noto Sans CJK TC Black"; +} +.cm-header-3,.markdown-preview-view h3 { + color: var(--color3); + font-size:22px; /* 16pt 字體大小*/ + text-indent: -30px; + font-family: "Noto Sans Black", "Noto Sans CJK TC Black"; +} +.cm-header-4,.markdown-preview-view h4 { + color: var(--color4); + font-size:19px; /* 14pt 字體大小*/ + text-indent: -20px; + font-family: "Noto Sans Black", "Noto Sans CJK TC Black"; +} +.cm-header-5,.markdown-preview-view h5 { + color: var(--color5); + font-size:16px; /* 12pt 字體大小*/ + text-indent: -10px; + font-family: "Noto Sans Black", "Noto Sans CJK TC Black"; +} +.cm-header-6,.markdown-preview-view h6 { + color: var(--color6); + font-size:16px; /* 12pt 字體大小*/ + font-family: "Noto Sans Black", "Noto Sans CJK TC Black"; +} + +/***************************************/ +/* Table */ +/***************************************/ +.markdown-preview-view th { + border: 1px solid; + border-bottom: 4px double; + font-weight: 800; + padding: 3px 5px; +} + +.markdown-preview-view td { + border: 1px solid; + padding: 3px 5px; +} + + +/***************************************/ +/* Ruby Interlinear */ +/***************************************/ +ruby { + display: inline-flex; + flex-direction: column-reverse ; + align-items: center; + font-size: 17px; /* 13pt 字體大小*/ + line-height: 17px; + padding-bottom: 7px; + font-family: AndleyFont; +} +ul ruby { + padding-bottom: 3px; +} +rt { + font-size: 13px; /* 10pt 字體大小*/ + line-height: 13px; + font-family: InterlinearFont; +} + +html, body { + font-family: AndleyFont; + font-size:16px; +} diff --git a/.obsidian/starred.json b/.obsidian/starred.json new file mode 100644 index 0000000..001bcf7 --- /dev/null +++ b/.obsidian/starred.json @@ -0,0 +1 @@ +{"items":[{"type":"file","title":"cheatsheet","path":"cheatsheet.md"},{"type":"file","title":"§0","path":"Syntax/IG4E.md"},{"type":"file","title":"GGBB","path":"GGBB.md"},{"type":"file","title":"IGNT","path":"Porter-IGNT/IGNT.md"}]} \ No newline at end of file diff --git a/.obsidian/workspace b/.obsidian/workspace new file mode 100644 index 0000000..fee1144 --- /dev/null +++ b/.obsidian/workspace @@ -0,0 +1,141 @@ +{ + "main": { + "id": "46860815f32cbf2a", + "type": "split", + "children": [ + { + "id": "0ed5ca1ae29d4f45", + "type": "leaf", + "active": true, + "state": { + "type": "markdown", + "state": { + "file": "Syntax/IG4E.md", + "mode": "source" + } + } + }, + { + "id": "6fb1be0223e7d086", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "GGBB.md", + "mode": "preview" + } + } + } + ], + "direction": "vertical" + }, + "left": { + "id": "1d89ef4303833cb8", + "type": "split", + "children": [ + { + "id": "8198aa995c74f604", + "type": "tabs", + "children": [ + { + "id": "73ac520a8ccc59a2", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": {} + } + }, + { + "id": "971c7a8a329ef702", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + }, + { + "id": "8253e41627d2fedb", + "type": "leaf", + "state": { + "type": "starred", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 192 + }, + "right": { + "id": "92fec9da4657ec59", + "type": "split", + "children": [ + { + "id": "6475f8733433b7d8", + "type": "tabs", + "children": [ + { + "id": "8d357a25b83637fc", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "Syntax/IG4E.md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "c8cb03e335959f3b", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": true + } + } + }, + { + "id": "775222d07aaa15a7", + "type": "leaf", + "state": { + "type": "outline", + "state": { + "file": "Syntax/IG4E.md" + } + } + } + ], + "currentTab": 2 + } + ], + "direction": "horizontal", + "width": 592, + "collapsed": true + }, + "lastOpenFiles": [ + "Syntax/IG4E.md", + "Syntax/$3b.md", + "Syntax/§3a.md", + "Syntax/Untitled.md", + "GGBB.md", + "Syntax/§311.md", + "Syntax/Syntax-00.md", + "Syntax/§610.md", + "Syntax/§400.md", + "Syntax/§310.md" + ] +} \ No newline at end of file diff --git a/ASBHR/06.md b/ASBHR/06.md new file mode 100644 index 0000000..7171327 --- /dev/null +++ b/ASBHR/06.md @@ -0,0 +1,52 @@ +# Chapter 6 Discourse Analysis + +## 6.1 Introduction + +- Discourse Analysis 又稱 Text Linguistics,把溝通從語意 (semantics) 的領域帶進了語用 (pragmatics) 的領域。 + - 例如:`Today is Monday.` 這句話的涵義,究竟是高興、失望,或是單純的陳述事實--就要看 context 和 co-text 而定。 +- 在希伯來文學界,Discourse Analysis 最早可追溯到 Zellig S. Harris (1952) 開始使用 Discourse Analysis 這個術語。 + +## 6.2 The Modern Linguistic Framework for Discourse Analysis + +- 現代語言學引入了 DA 的三大概念: + - coherence (語意連貫) and cohesion (字句銜接) + - discourse units (篇章單元) and relations + - information structure (資訊結構) + +### 6.2.1 Coherence (語意連貫) and Cohesion (字句銜接) + +#### 6.2.1.1 Coherence (語意連貫) + +- Coherence (語意連貫) = 文本中各個單元所要傳達的概念前後一致,並且用合乎邏輯的方式呈現,讓人容易理解。 + +#### 6.2.1.1 Cohesion (字句銜接) +- Cohesion (字句銜接) = 文本中各個單元所使用的字詞、句是否前後串聯,讓人容易閱讀。 +- cohesion 的概念可追溯至 M. A. K. Halliday & Ruqaiya Hasan。 +- Cohesive Ties = 用來表達 cohesion 的語言特徵。例如: + - discourse markers + - 敘事體常用「時間」,像是:meanwhile, then, afterward etc. + - 論說文體常用「邏輯」,像是:but, in order that, because, therefore etc. + - participant reference + - 用相同 or 不同的字詞提到同樣的人事物,像是:I gave the rose to `Zoe`, because `she` loves flower. + - lexical patterning + - 用類似的字詞來連結上下文,像是:I gave the `rose` to Zoe, because she loves `flower`. + - morphosyntactic patterning + - 用同樣的詞形 (morphological) 特徵來連結上下為,像是:I lik`ed` the girl, and kiss`ed` her. + +### 6.2.2 Discourse Units and Relations + +- 把文本切分成幾個段落 (chunks of thought) 的動作稱為 segmentation,切分出來的段落就是 discouse units。 + - 判斷是否歸屬於同一段落的基本原則就是 thematic grouping (主題相同的就歸在一段)。 + - 相同主題包括:相同的話題 (論說文),相同的人物、時間、場景 (敘事文)--因此,一旦發現話題切換,人事物場景切換的地方,通常就是要切分的地方。 + - 同樣主題下面可以有不同的 idea unit。 +- 段落與段落之間連結的方式,就是 discourse relations。 + +### 6.2.3 Information Structure + +- Information Structure 是由 M. A. K. Halliday 提出,接著由 Knud Lambrecht 以及 Simon C. Dik 發揚光大。 +- Information Strucutre = 子句呈現、安排資訊的方式。最重要的有兩個元素:Topic、Comment。 + - Topic = 子句談論的對象 + - Comment = 子句談論的內容 + - 例如:`Moses went up the mountain.` 中,Moses = Topic,went up the mountain = comment。 + +*接下來不知所云,遺憾! \ No newline at end of file diff --git a/GGBB.md b/GGBB.md new file mode 100644 index 0000000..679f659 --- /dev/null +++ b/GGBB.md @@ -0,0 +1,679 @@ +# Greek Grammar Beyond the Basics•中級希臘文文法
Syntax Summaries 中英頁碼對照 + +說明1:(英文版 page number)•(中文版頁碼)。 +說明2:‡ 表示重要、出現機率高的文法類別。 + +## Nouns and Nominals•名詞與主格實名詞 + +### The Cases•格 + +#### Nominative•主格 +- *Primary Uses (38-49)•主要功能 (37-48)* + - (1) ‡ Subject (38-40)•主詞 (37-39) + - (2) ‡ Predicate Nominative (40-48)•主格述詞 (39-47) + - (3) ‡ Nominative in Simple Apposition (48-49)•同等主格補語 (47-48) +- *Grammatically Independent Uses of the Nominative (49-60)•文法上是獨立使用的主格用法 (48-60)* + - (1) ‡ Nominative Absolute (49-51)•作標題、稱呼用的主格 (48-50) + - (2) ‡ *Nominativus Pendens* (Pendent Nominative) (51-53)•破格主詞補語 (50-51) + - (3) ‡ Parenthetic Nominative (53-54)•作為插語的主格 (52-53) + - (4) Nominative in Proverbial Expressions (54-55)•引入語語的主格用法 (53-54) + - (5) ‡ Nominative for Vocative (Nominative of Address) (56-59)•作呼格用的主格(作稱呼用) (55-58) + - (6) Nominative of Exclamation (59-60)•表驚噴的主格 (59-60) +- *Nominatives in Place of Oblique Cases (61-64)•主格取代斜格 (60-64)* + - (1) Nominative of Appellation (61)•作為稱謂的主格 (60) + - (2) Nominative in Apposition to Oblique Cases (62)•作為斜格同位詞的主格 (61) + - (3) Nominative After a Preposition (62-64)•作介系詞受詞的主格 (62-63) + - (4) Nominative for Time (64)•表時距的主格 (63-64) + +#### Vocative•呼格 +- *Direct Address (67-70)•直接的稱謂 (67-70)* + - (1) ‡ Simple Address (67-68)•簡單的稱謂 (67-68) + - (2) Emphatic (or, Emotional) Address (68-69)• 強調性(或情緒性)的稱謂 (68-69) +- *Exclamation (70)•表達驚嘆 (69)* +- *Apposition (70-71)•表達同位 (69-70)* + +#### Genitive•所有格 +- *Adjectival (78-107)•形容性用法 (77-109)* + - (1) ‡ Descriptive Genitive (79-81)•1用作一般性的描述與修飾功能 (78-80) + - (2) ‡ Possessive Genitive (81-83)•用作表達擁有 (80-82) + - (3) Genitive of Relationship (83-84)•用作呈現關係 (82-83) + - (4) ‡ Partitive Genitive ("Wholative") (84-86)•用作凸顯部屬關連 (83-85) + - (5) ‡ Attributive Genitive (86-88)•用作形容功能 (85-88) + - (6) ‡ Attributed Genitive (89-91)•用作被修飾功能 (88-91) + - (7) Genitive of Material (91-92)•指明材質 (91-92) + - (8) ‡ Genitive of Content (92-94)•指明內容物 (92-94) + - (9) ‡ Genitive in Simple Apposition (94)•指明簡單的同位語 (95) + - (10) ‡ Genitive of Apposition (Epexegetical) (95-100)•指明補述同位語 (95-101) + - (11) Genitive of Destination (a.k.a. Direction or Purpose) (100-101)•指明目的 (101-02) + - (12) Predicate Genitive (102)•作為述詞補語 (102-03) + - (13) Genitive of Subordination (103-104)•指明從屬 (103-05) + - (14) Genitive of Production/Producer (104-106)•指明施做者 (106-07) + - (15) Genitive of Product (106-107)•指明結果 (107-09) +- *Ablatival Genitive (107-12)•表達「離開」這個意涵的所有格用法 (109-14)* + - (1) Genitive of Separation (107-109)•1表達「分離」 (109-10) + - (2) Genitive of Source (or Origin) (109-10)•表達「根源」 (110-12) + - (3) ‡ Genitive of Comparison (110-12)•表達「比較」 (112-14) +- *Verbal Genitive (112-21)•動詞性用法 (114-33)* + - (1) ‡ Subjective Genitive (113-16)•指明動作的施做者 (118-21) + - (2) ‡ Objective Genitive (116-19)•指明動作的接受者 (118-21) + - (3) Plenary Genitive (119-21)•雙重角色的功能 (121-23) +- *Adverbial Genitive (121-30)•副詞性用法 (123-30)* + - (1) Genitive of Price or Value or Quantity (122)•指明「價錢、價值、或品質」 (124) + - (2) ‡ Genitive of Time (kind of time) (122-24)•指明「時間(的類別)」 (124-26) + - (3) Genitive of Place (where or within which) (124-25)•指明「地點」 (126-27) + - (4) Genitive of Means (125)•指明「方法」 (127-28) + - (5) Genitive of Agency (126-27)•指明「動作的施做人」 (128-30) + - (6) ‡ Genitive Absolute (127)•作獨立分詞片語的主詞 (130) + - (7) Genitive of Reference (127-28)•指明作為參考的對象 (130-31) + - (8) ‡ Genitive of Association (128-30)•指明關連的對象 (131-33) +- *After Certain Words (131-36)•跟在若干特定的字彙後面 (134-39)* + - (1) ‡ Genitive After Certain Verbs (as a Direct Object) (131-34)•跟在動詞後面(作直接受詞) (134-37) + - (2) Genitive After Certain Adjectives (and Adverbs) (134-35)•跟在形容詞後面(或副詞) (137-38) + - (3) Genitive After Certain Nouns (135)•跟在名詞後面 (138-39) + - (4) ‡ Genitive After Certain Prepositions (136)•跟在介系詞後面 (139) + +#### Dative•間接受格 +- *Pure Dative Uses (140-53)•單純的間接受格用法 (144-57)* + - (1) ‡ Dative Indirect Object (140-42)•用作間接受詞 (144-46) + - (2) ‡ Dative of Interest (142-44)•表達與利益有關的接受者 (146-48) + - (a) ‡ Advantage (142-44)•得利 (147-48) + - (b) ‡ Disadvantage (142-44)•受損 (147) + - (3) ‡ Dative of Reference/Respect (144-46)•作為觀點的參考點 (148-50) + - (4) Ethical Dative (146-47)•作為倫理的參考點 (150-51) + - (5) Dative of Destination (147-48)•指明目的 (151-52) + - (6) Dative of Recipient (148-49)•指明動作的接受者 (152-53) + - (7) Dative of Possession (149-51)•指明所有物的擁有者 (153-55) + - (8) Dative of Thing Possessed (disputed) (151)•指明所擁有的所有物 (155) + - (9) Predicate Dative (152)•作為述詞捕語 (156) + - (10) ‡ Dative in Simple Apposition (152-53)•作為同位語 (156-57) +- *Local Dative Uses (153-58)•作度量衡使用 (157-63)* + - (1) Dative of Place (153)•表達地點 (157) + - (2) ‡ Dative of Sphere (153-55)•表達動作的範疇 (158-59) + - (3) ‡ Dative of Time (when) (155-57)•表達時間 (159-61) + - (4) Dative of Rule (157-58)•表達行的規則 (161-63) +- *Instrumental Dative Uses (158-71)•指明工具 (163-76)* + - (1) ‡ Dative of Association/Accompaniment (159-61)•表達關連 (163-65) + - (2) Dative of Manner (or Adverbial Dative) (161-62)•表達態度 (165-66) + - (3) ‡ Dative of Means/Instrument (162-63)•表達方法 (167-68) + - (4) Dative of Agency (163-66)•指明動作的施做者 (168-71) + - (5) Dative of Measure/Degree of Difference (166-67)•指明程度的差異 (171-72) + - (6) ‡ Dative of Cause (167-68)•指明原因 (172司 73) + - (7) Cognate Dative (168-69)•表明強調 (173-74) + - (8) Dative of Material (169-70)•指明材質 (175) + - (9) Dative of Content (170-71)•指明內容物 (175-76) +- *Dative After Certain Words (171-75)•跟在若干特定的字彙後面 (176-81)* + - (1) ‡ Dative Direct Object (171-73)•跟在動詞後面作直接受詞 (176-79) + - (2) Dative After Certain Nouns (173-74)•跟在名詞後面 (179) + - (3) Dative After Certain Adjectives (174-75)•跟在形容詞後面 (180) + - (4) ‡ Dative After Certain Prepositions (175)•跟在介系詞後面 (180-81) + +#### Accusative•直接受格 +- *Substantival Uses of the Accusative (179-99)•作實名詞用 (185-206)* + - (1) ‡ Accusative Direct Object (179-81)•跟在動詞後面作直接受詞 (185-87) + - (2) ‡ Double Accusatives (181-89)•在有雙重受詞的情況 (187-95) + - (a) ‡ Person-Thing (181-82)•人與物 (187-88) + - (b) ‡ Object-Complement (182-89)•受詞與受詞補語 (189-95) + - (3) Cognate Accusative (Accusative of Inner Object) (189-90)•表明強調 (195-97) + - (4) Predicate Accusative (190-92)•作為述詞補語 (197-98) + - (5) ‡ Accusative Subject of Infinitive (192-97)•作不定詞語意上的主詞 (199-204) + - (6) Accusative of Retained Object (197)•作為殘留受詞的指標 (204) + - (7) Pendent Accusative (Accusativum Pendens) (198)•破格受詞補語 (205) + - (8) ‡ Accusative in Simple Apposition (198-99)•指明簡單的同位語 (205-06) +- *Adverbial Uses of the Accusative (199-205)•作副詞用 (206-13)* + - (1) Adverbial Accusative (Accusative of Manner) (200-201)•表達態度 (207-08) + - (2) ‡ Accusative of Measure (or Extent of Space or Time) (201-203)•指明程度的差異 (208-10) + - (3) Accusative of Respect or (General) Reference (203-204)•作為觀點、參考點 (211) + - (4) Accusative in Oaths (204-205)•作為起誓的基礎 (212-13) +- *Accusative After Certain Prepositions (205)•跟在若干特定的字彙後面 (213)* + + +## The Article•冠詞 + +### Regular Uses of the Article•規則用法 +- (1) *As a Pronoun (211-16)•作為代名詞 (219-24)* + - (a) ‡ Personal Pronoun (211-12)•人稱代名詞 (219-21) + - (b) Alternative Personal Pronoun (212-13)•一組代名詞 (221-22) + - (c) ‡ Relative Pronoun (213-15)•關係代名詞 (222-23) + - (d) Possessive Pronoun (215-16)•表達「擁有」 (223-24) +- (2) *With Substantives (216-31)•伴隨有實名詞 (224-41)* + - (a) ‡ Individualizing Article (216-27)•表達個別化的功能 (225-27) + - (1) ‡ Simple Identification (216-17)•單純的確認 (225-26) + - (2) ‡ Anaphoric (Previous Reference) (217-20)•回溯前述 (226-29) + - (3) Kataphoric (Following Reference) (220-21)•展望未來 (229) + - (4) ‡ Deictic ("Pointing" Article) (221)•現場指示 (233-34) + - (5) ‡ *Par Excellence* (222-23)•指明是最出眾的 (231-32) + - (6) ‡ Monadic ("One of a Kind" or "Unique" Article) (223-24)•指明是唯一的 (233-34) + - (7) ‡ Well-Known ("Celebrity" or "Familiar" Article) (225)•指明是眾所周知的 (234-35) + - (8) ‡ Abstract (i.e., the Article with Abstract Nouns) (226-27)•指明指涉對象的抽象性 (235-37) + - (b) Generic Article (227-31)•表達一般化 (237-41) +- (3) *As a Substantiver (231-38)•作實名詞用 (242-49)* + - (a) Adverbs (232-33)•副詞 (242-43) + - (b) Adjectives (233)•形容詞 (243-44) + - (c) Participles (233-34)•分詞 (244-45) + - (d) Infinitives (234-35)•不定詞 (245) + - (e) Genitive Word or Phrase (235-36)•所有格(實)名詞或片語 (246) + - (f) Prepositional Phrase (236)•介系片語 (246-47) + - (g) Particles (237)•分詞 (247-48) + - (h) Finite Verbs (237)•主要動詞 (248) + - (i) Clauses, Statements, and Quotations (237-38)•子句、陳述、引句 (248-49) +- (4) *As a Function Marker (238-43)•用來標示功能 (249-54)* + - (a) To Denote Adjectival Positions (239)•用來標示形容詞的位置 (249-50) + - (b) With Possessive Pronouns (239)•與所有代名詞連用 (250) + - (c) In Genitive Phrases (239-40)•用來指明所有格片語的確定性 (250-51) + - (d) With Indeclinable Nouns (240-41)•與沒有格變式的名詞連用 (251-52) + - (e) With Participles (241)•與分詞連用 (252) + - (f) With Demonstratives (241-42)•與指示代名詞連用 (252-53) + - (g) With Nominative Nouns (242)•與主格名詞連用 (253) + - (h) To Distinguish Subject from Predicate Nominative and Object from Complement (242-43)•用以區別主詞與主格補語、以及受詞與受詞補語 (253-54) + - (i) With the Infinitive to Denote Various Functions (243)•與不定詞連用 (254) + +### Absence of the Article•不帶冠詞的情況 +- (1) *Indefinite (244)•不確定性的 (255)* +- (2) *Qualitative (244-45)•定性的 (255-56)* +- (3) *Definite (245-54)•確定性的 (256-67)* + - (a) ‡ Proper Names (245-47)•專有名詞 (257-58) + - (b) ‡ Object of a Preposition (247)•介系詞的受詞 (258-59) + - (c) ‡ With Ordinal Numbers (248)•帶有序數 (259) + - (d) ‡ Predicate Nominative (248)•主格補語 (259) + - (e) ‡ Complement in Object-Complement Construction (248)•受詞一一受詞補語結構中的補語 (260) + - (f) ‡ Monadic Nouns (248-49)•唯一的名詞 (260-61) + - (g) ‡ Abstract Nouns (249-50)•抽象名詞 (261-62) + - (h) ‡ A Genitive Construction (Apollonius' Corollary) (250-52)•(262-64) + - (i) ‡ With a Pronominal Adjective (253)•有代名形容詞的情況 (264-65) + - (j) ‡ Generic Nouns (253-54)•一般性名詞 (253-54) + +### Special Uses and Non-Uses of the Article•冠詞的特殊用法或不帶冠詞的用法 +- (A) *Anarthrous Pre-Verbal Predicate Nominatives (Involving Colwell's Rule) (256-70)•在動詞前、不帶冠詞的主格述詞補語 (268-83)* + - (1) ‡ Statement of the Rule (257)•這個規則的陳述 (268) + - (2) ‡ Clarification of the Rule (259-62)•這個規則的解說 (268-83) +- (B) *The Article with Multiple Substantives Connected by Καί (Granville Sharp Rule and Related Constructions) (270-90)•冠詞與許多實名詞透過 Καί 連接的用法 (TSKS) (283-304)* + - (1) ‡ Statement of the Granville Sharp Rule (271-72)•Granvi11e Sharp Rule 的陳述 (283-85) + - (2) ‡ Validity of the Rule Within the New Testament (273-77)•這個規則在新約中的真確性 (285-90) + - (3) ‡ TSKS Constructions Involving Impersonal, Plural, and Proper Nouns (277-90)•TSKS 結構帶有非人格化名詞、或複數名詞、或專有名詞 (291) + - (a) Proper Names (277-78)•專有名詞 (291) + - (b) ‡ Plural Personal Constructions (1) distinct, (2) identical, (3) overlap (278-86)•複數名詞 (1)不同; (2)相同; (3)有語意重疊 (291-300) + - (c) ‡ Impersonal Constructions (1) distinct, (2) identical, (3) overlap (286-90)•非人格化名詞 (1)不同; (2)相同; (3)有語意重疊 (300-04) + + +## Adjectives•形容詞 + +### "Non-Adjectival" Uses of the Adjective•形容詞的非形容性用法 +- *The Adverbial Use of the Adjective (293)•具副詞功能的形容詞 (307)* +- ‡ *The Independent or Substantival Use of the Adjective (294-95)•形容詞的獨立用法、作實名詞用 (308-09)* + +### The Use of the Positive, Comparative, and Superlative Forms of the Adjective•形容詞的原級、比較級、最高級用法 +- (A) *The Use of the Positive Adjective (297-98)•A形容詞的原級用法 (310-12)* + - (1) ‡ Normal Usage (297)•一般用法 (311) + - (2) Positive for Comparative (297)•原級形容詞作比較級用 (311-12) + - (3) Positive for Superlative (298)•原級形容詞作最高級用 (312) +- (B) *The Use of the Comparative Adjective (298-301)•B形容詞的比較級用法 (312-16)* + - (1) ‡ Normal Usage (299)•1一般用法 (313) + - (2) Comparative for Superlative (299-300)•比較級的形式作最高級用 (313-14) + - (3) Comparative for Elative (300-301)•比較級的形式作強調用 (314-16) +- (C) *The Use of the Superlative Adjective (301-305)•形容詞的最高級用法 (316-20)* + - (1) ‡ "Normal" Usage (301-302)•1一般用法 (316-17) + - (2) ‡ Superlative for Elative (303)•最高級的形式作強調用 (317) + - (3) ‡ Superlative for Comparative (303-305)•最高級的形式作比較級用 (317-20) + +### The Relation of Adjective to Noun•形容詞跟名詞的關係 +- (A) *When the Article Is Present (306-309)•A當冠詞存在時 (320-23)* + - (1) ‡ The Attributive Positions (306-307)•l當形容詞作修飾用時 (320-22) + - (a) ‡ First Attributive (306)•站在第一修飾位置 (320-21) + - (b) ‡ Second Attributive (306-307)•站在第二修飾位置 (321) + - (c) Third Attributive (307)•站在第三修飾位置 (321-22) + - (2) ‡ The Predicate Positions (307-309)•當形容詞作補述用時 (322-23) + - (a) ‡ First Predicate (307-308)•站在第一補述位置 (322) + - (b) ‡ Second Predicate (308)•b 站在第二補述位置 (323) +- (B) *When the Article Is Absent (309-14)•B當沒有冠詞存在時 (324-26)* + - (1) ‡ The Anarthrous Adjective-Noun Construction (309-10)•不帶冠詞的「形容詞一一名詞」結構 (324-25) + - (2) ‡ The Anarthrous Noun-Adjective Construction (310-11)•不帶冠詞的「名詞一形容詞」結構 (325-26) + +## Pronouns•代名詞 + +### Semantic Categories: Major Classes•語意類別:主要分類 + +#### A Personal Pronouns (320-25)•人稱代名詞 (335-40) +- (1) ‡ Nominative Uses (321-23)•主格用法 (335-38) + - (a) ‡ Emphasis (321-23)•用來強調 (335 回 36) + - (1) Contrast (321-22)•用以對此 (336-37) + - (2) Subject Focus (322-23)•強調主詞 (337-38) + - (b) Redundancy (323)•贅詞 (338) +- (2) ‡ Oblique Cases (324-25)•斜格 (338-40) + - (a) ‡ Normal Use (324)•一般用法 (338-39) + - (b) ‡ Possessive (324)•表達擁有 (339) + - (c) Reflexive (324-25)•表達反身的動作 (339-40) + +#### B Demonstrative Pronouns (325-35)•指示代名詞 (340-50) +- (1) ‡ Regular Uses (as Demonstratives) (325-28)•一般用法(作為指稱的功能) (340-45) + - (a) ‡ οὗτος (Proximity) (326-27)•οὗτος (指在近處的人/事/物) (341-42) + - (b) ‡ ἐκεῖνος (Remoteness) (327-28)•ἐκεῖνος (指在遠處的人/事/物) (342-43) + - (c) ὅδε (anticipatory/proleptic) (328)•ὅδε (經常用為後述用法) (343) +- (2) For Personal Pronouns (328-29)•作為人稱代名詞 (344-45) +- (3) Unusual Uses (from an English perspective) (329-35)•不尋常的用法(從英文的觀點) (345-50) + - (a) Pleonastic (Redundant, Resumptive) (329-30)•冗筆用法 (345-46) + - (b) Constructio ad Sensum (construction according to sense) (330-35)•基於概念相同、而違反文法規則的結構 (346-50) + - (1) Gender (331-32)•性 (346-47) + - (2) Number (332-33)•數 (348) + - (c) ‡ Conceptual Antecedent or Postcedent (333-35)•追溯前(後)述的概念 (348-50) + + +#### C Relative Pronouns (335-45)•關係代名詞 (351-60) +- (1) ‡ ὅς (336-43)•ὅς (351) + - (a) ‡ Regular Use (336-37)•一般用法 (351-52) + - (b) ‡ "Unusual" Uses (337-43)•不尋常的用法 (352-60) + - (1) ‡ Natural Gender vs Grammatical Gender (constructio ad sensum) (337-38)•概念上的性與文法規則的性 (352-53) + - (2) ‡ Case (338-39)•格 (354) + - a) ‡ Attraction (a.k.a. Direct Attraction) (338-39)•正向影響 (354) + - b) ‡ Inverse Attraction (a.k.a. Indirect Attraction) (339)•反向影響 (354) + - (3) ‡ Antecedent Complexities (339-43)•有關前述詞較複雜情況 (355-59) + - a) Omission of Antecedent (339-42)•前述詞被省略 (355-57) + - b) ‡ Adverbial/Conjunctive Uses (342-43)•作副詞或連接詞用 (357-59) +- (2) ‡ ὅστις (343-45)•ὅστις (359-60) + - (a) ‡ Generic (343-44)•一般性含意 (359-60) + - (b) ‡ Qualitative (344)•定位的含意 (360) + - (c) Confusion with ὅς (344-45)•與 ὅς 混用 (360) + +#### D Interrogative Pronouns ask a question (345-46)•疑問代名詞 (360-62) +- (1) ‡ τίς & τί (345-46)•(361) +- (2) ποῖος & πόσος (346)•(362) + +#### E Indefinite Pronouns (347)•不定代名詞 (362-63) +- (1) ‡ Substantival (347)•作實名詞用 (363) +- (2) ‡ Adjectival (347)•作形容詞用 (363) + +#### F Possessive Pronouns (Adjectives) (348):•「擁有」代名詞 (363-64) (364) +- (1) ‡ Possessive Adjective (ἐμός, σός, ἡμέτερος, ὑμέτερος) lexicalizes possession (348)•藉著表達「擁有」的形容詞 (ἐμός, σός, ἡμέτερος, ὑμέτερος) 來表達 (364) +- (2) ‡ Personal Pronoun in Genitive (αὐτοῦ) grammaticalizes possession (348)•藉著人稱代名詞的有格 (αὐτοῦ) 用文法規則來表達 (364) + +#### G Intensive Pronoun (348-50)•用為強調的代名詞 (364-65) +- (1) ‡ As an Intensive Pronoun (349)•作強調功能的代名詞 (364-65) +- (2) ‡ As an Identifying Adjective (349-50)•作強調功能的形容詞 (365) +- (3) ‡ As a Third Person Personal Pronoun (348)•作第三人稱的代名詞 (365) + +#### H Reflexive Pronouns (350-51)•反身代名詞 (366-67) + +#### I Reciprocal Pronouns (351)•相互代名詞 (367) + +### Lexico-Syntactic Categories: Major Terms•按照字彙一一句法分類:主要詞彙 (368) +- (A) ‡ ἀλλήλων (352)•(368) +- (B) ‡ αὐτός (352)•(368) +- (C) ‡ ἑαυτοῦ (352)•(368) +- (D) ‡ ἐγώ (352)•(368) +- (E) ‡ ἐκεῖνος (352)•(368-69) +- (F) ἐμαυτοῦ (352)•(369) +- (G) ‡ ἡμεῖς (353)•(369) +- (H) ὅδε (353)•(369) +- (I) ‡ ὅς (353)•(369) +- (J) ‡ ὅστις (353)•(369) +- (K) ‡ οὗτος (353)•(369) +- (L) ποῖος (353)•(370) +- (M) πόσος (353)•(370) +- (N) σεαυτοῦ (353)•(370) +- (O) ‡ σύ (353)•(370) +- (P) ‡ τίς (353)•(370) +- (Q) ‡ τις (354)•(370) +- (R) ‡ ὑμεῖς (354)•(370) + + +## Prepositions•介系詞 +- (A) ᾽Ανά (Accusative) (364)•(帶直接受格) (381) +- (B) ᾽Αντί (Genitive) (364-68)•(帶所有格) (381-85) +- (C) ‡ ᾽Από (Genitive) (368)•(帶所有格) (385) +- (D) ‡ Διά (Genitive, Accusative) (368-69)•(帶所有格,帶直接受格) (386) +- (E) ‡ Εἰς (Accusative) (369-71)•(帶直接受格) (386-88) +- (F) ‡ ᾽Εκ (Genitive) (371-72)•(帶所有格) (388-89) +- (G) ‡ ᾽Εν (Dative) (372-75)•(帶間接受格) (389-92) +- (H) ‡ ᾽Επί (Genitive, Dative, Accusative) (376) ‖ +- Ι. ‡ Κατά (Genitive, Accusative) (376-77)•(帶所有格,帶直接受格) (394) +- (J) ‡ Μετά (Genitive, Accusative) (377-78)•(帶所有格,帶直接受格) (395) +- (K) ‡ Παρά (Genitive, Dative, Accusative) (378)•(帶所有格,帶間接受格,帶直接受格) (396) +- (L) ‡ Περί (Genitive, Accusative) (379)•(帶所有格,帶直接受格) (397) +- (M) ‡ Πρό (Genitive) (379)•(帶所有格) (397) +- (N) ‡ Πρός (Accusative almost exclusively) (380-82)•(多半帶直接受格) (398-400) +- (O) ‡ Σύν (Dative) (382)•(帶間接受格) (400) +- (P) ‡ Ὑπέρ (Genitive, Accusative) (383-89)•(帶所有格,帶直接受格) (401-08) +- (Q) ‡ Ὑπό (Genitive, Accusative) (389)•(帶所有格,帶直接受格) (408-09) + + + +## Verbs and Verbals•動詞與表達動作的用詞 + +### Person and Number•人稱與數 + +#### Person (391-99)•人稱 (411-19) +- (A) First Person for Third Person ("I" = "Someone") (391-92)•以第一人稱代替第三人稱 (411-12) +- (B) Second Person for Third Person ("You" = "Someone")? (392-93)•以第二人稱代替第三人稱 (412-13) +- (C) ‡ First Person Plural Constructions (393-99)•第一人稱複數的用法 (413-19) + - (1) Editorial "We" (Epistolary Plural) (394-96)•編輯性的「我們」 (414-17) + - (2) ‡ Inclusive "We" (Literary Plural) (397-99)•包容性的「我們」 (418) + - (3) ‡ Exclusive "We" (397-99)•排他性的「我們」 (418-19) + +#### Number (399-406)•數 (420-26) +- (A) ‡ Neuter Plural Subject with Singular Verb (399-400)•中性複數主詞使用單數動詞 (420-21) +- (B) Collective Singular Subject with Plural Verb (400-401)•集合(單數)名詞的主詞使用複數動詞 (421) +- (C) ‡ Compound Subject with Singular Verb (401-402)•裡合主詞使用單數動詞 (421-22) +- (D) The Indefinite Plural (402-403)•不定複數主詞 (423-24) +- (E) The Categorical Plural (a.k.a. Generalizing Plural) (403-406)•概括性稱呼的主詞 (424-26) + +### Voice•語態 + +#### Active (410-14)•主動 (431-35) +- (A) ‡ Simple Active (411)•簡單的主動 (431) +- (B) ‡ Causative Active (a.k.a. Ergative) (411-12)•驅使性主動 (432-33) +- (C) ‡ Stative Active (412-13)•靜態描述性主動 (433-34) +- (D) ‡ Reflexive Active (413-14)•有反身動作含意的主動 (434-35) + +#### Middle (414-30)•關身 (435-52) +- (A) Direct Middle (a.k.a. Reflexive or Direct Reflexive) (416-18)•直接關身 (437-39) +- (B) Redundant Middle (418-19)•累贅的關身用法 (439-40) +- (C) ‡ Indirect Middle (a.k.a. Indirect Reflexive, Benefactive, Intensive, Dynamic) (419-23)•間接關身 (440-44) +- (D) Causative Middle (423-25)•驅使性關身 (444-46) +- (E) Permissive Middle (425-27)•允准性關身 (446-48) +- (F) Reciprocal Middle (427)•相互性關身 (449) +- (G) ‡ Deponent Middle (428-30)•作為異態動詞的關身 (449-52) + +#### Passive (431-41)•被動 (452-61) +- (A) ‡ Passive Constructions (431-39)•被動的結構 (453) + - (1) ‡ The Passive With and Without Expressed Agency (431-38)•被動動詞帶有或沒有帶動作的施做者 (453-60) + - (a) ‡ With Agency Expressed (431-35)•帶有動作的施做者 (453) + - (1) ‡ Ultimate Agent (433)•最終的動作施做者 (453-54) + - (2) ‡ Intermediate Agent (433-34)•中介的動作施做者 (455-56) + - (3) ‡ Impersonal Means (434-35)•非人格化的方法 (456-57) + - (b) ‡ With No Agency Expressed (435-38)•沒有帶動作的施做者 (457-60) + - (2) Passive With an Accusative Object (438-39)•被動動詞跟著它直接受格的受詞 (460-61) +- (B) Passive Uses (439-41)•被動的用法 (461-63) + - (1) ‡ Simple Passive (439-40)•簡單的被動 (461-62) + - (2) Causative/Permissive Passive (440-41)•驅使性/允准性被動 (462-63) + - (3) ‡ Deponent Passive (441)•作為異態動詞的被動 (463) + + + +### Moods•語氣 + +#### Indicative (448-61)•直說語氣 (471-84) +- (1) ‡ Declarative Indicative (449)•宣告性的直說語氣 (471-72) +- (2) ‡ Interrogative Indicative (449-50)•詢問性的直說語氣 (472-73) +- (3) ‡ Conditional Indicative (450-51)•條件性的直說語氣 (473-74) +- (4) ‡ Potential Indicative (451-52)•意願性的直說語氣 (474-75) +- (5) Cohortative (Command, Volitive) Indicative (452-53)•勸服性的直說語氣 (475) +- (6) ‡ The Indicative with ῾Οτι (453-61)•帶有 ῾Οτι 這字的直說語氣 (475-84) + - (a) ‡ Substantival ῾Οτι Clauses (453-59)•作實名詞用的 ῾Οτι 子句 (476-82) + - (1) Subject Clause (453-54)•子句作主詞 (476) + - (2) ‡ Direct Object Clause (454-58)•子句作受詞 (476-81) + - a) Direct Object Proper (454)•作直接受詞 (477) + - b) ‡ Direct Discourse (a.k.a. Recitative ῾Οτι Clause, ῾Οτι Recitativum) (454-55)•作直述句 (477-78) + - c) ‡ Indirect Discourse (a.k.a. Declarative ῾Οτι Clause) (456-58)•作間述句 (478-81) + - (3) ‡ Apposition (to noun, pronoun, or other substantive) (458-59)•作同位語 (481-82) + - (b) Epexegetical (459-60)•作補述語 (482) + - (c) ‡ Causal (Adverbial) (460-61)•表達原因 (483-84) + +#### Subjunctive (461-80)•假設語氣 (484-504) +- (1) ‡ In Independent Clauses (463-69)•在獨立子句中 (486-93) + - (a) ‡ Hortatory Subjunctive (464-65)•勸服性的假設語氣 (487-88) + - (b) ‡ Deliberative Subjunctive (a.k.a. Dubitative) (465-68)•刻意提間的假設語氣 (488-91)。 + - (c) ‡ Emphatic Negation Subjunctive (468-69)•清楚否決的假設語氣用法 (491-92) + - (d) ‡ Prohibitive Subjunctive (469)•表達「禁止」的假設語氣用法 (492-93) +- (2) ‡ In Dependent (Subordinate) Clauses (469-80)•在附屬(從屬)子句中 (493-504) + - (a) ‡ Subjunctive in Conditional Sentences (469-71)•在假定子句中的假設語氣用法 (493-94) + - (b) ‡ ῾Ινα + the Subjunctive (471-77)•在 ῾Ινα 子句中的假設語氣動詞 (494-501) + - (1) ‡ Purpose ῾Ινα Clause (a.k.a. Final or Telic ῾Ινα) (472)•表達目的 (495-96) + - (2) Result ῾Ινα Clause (a.k.a. Consecutive or Ecbatic ῾Ινα) (473)•展示結果 (496~97) + - (3) ‡ Purpose-Result ῾Ινα Clause (473-74)•同時有目的與結果 (497-98) + - (4) ‡ Substantival ῾Ινα Clause (a.k.a. Sub-Final Clause) (474-76)•作實名詞用 (498-99) + - a) Subject Clause (475)•作主詞 (498-99) + - b) Predicate Nominative Clause (475)•作主格述詞 (499) + - c) Direct Object Clause (a.k.a. Content ῾Ινα Clause) (475)•作直接受詞 (499) + - d) Apposition Clause (475-76)•作同位語 (499) + - (5) Epexegetical ῾Ινα Clause (476)•作補述語 (499-500) + - (6) Complementary ῾Ινα (476)•作補助語 (500) + - (7) Imperatival ῾Ινα (476-77)•作命令語 (500-01) + - (c) Subjunctive with Verbs of Fearing (477)•表達「害怕」的動詞的假設語氣用法 (501) + - (d) Subjunctive in Indirect Questions (478)•在間述句中的假設語氣用法 (502) + - (e) ‡ Subjunctive in Indefinite Relative Clause (478-79)•在不定關係子句中的假設語氣用法 (502-03) + - (f) ‡ Subjunctive in Indefinite Temporal Clause (479-80)•在不定時間副詞子句中的假設語氣用法 (503-04) + +#### Optative (480-84)•祈願語氣 (504-09) +- (1) ‡ Voluntative Optative (a.k.a. Optative of Obtainable Wish, Volitive Optative) (481-83)•表達意願的祈願語氣 (505-07) +- (2) ‡ Oblique Optative (483)•帶出間述句的祈願語氣 (507-08) +- (3) Potential Optative (483-84)•表達出可能性的祈願語氣 (508) +- (4) Conditional Optative (484)•表達出條件性的祈願語氣 (508-09) + +#### Imperative (485-93)•命令語氣 (509-20) +- (1) ‡ Command (485-86)•命令 (510-11) +- (2) ‡ Prohibition (487)•禁止 (511-12) +- (3) ‡ Request (a.k.a. Entreaty, Polite Command) (487-88)•請求 (512-13) +- (4) Permissive Imperative (Imperative of Toleration) (488-89)•允准 (513-14) +- (5) Conditional Imperative (489-92)•表達有條件的咐盼 (514-17) +- (6) Potential Imperative (debatable category) (492)•表達有可能性 (518) +- (7) Pronouncement Imperative (492-93)•宣告內容 (519) +- (8) As a Stereotyped Greeting (493)•作為習慣性的問候 (519-20) + +### Tense•時態 + +#### Present (513-39)•現在時態 (542-67) +- (I) ‡ Narrow-Band Presents (516-19)•狹義的現在時態用法 (542-45) + - (A) ‡ Instantaneous Present (a.k.a. Aoristic or Punctiliar Present) (517-18)•表達在說話的當下已經完成的動作 (543-44) + - (B) ‡ Progressive Present (a.k.a. Descriptive Present) (518-19)•表達一個已經開始了的動作 (544-45) +- (II) ‡ Broad-Band Presents (519-25)•廣義的現在時態用法 (545-53) + - (A) Extending-From-Past Present (519-20)•表達過去已經開始、如今仍舊繼續進行中的行動 (545-46) + - (B) ‡ Iterative Present (520-21)•表達一個頻繁或重覆的動作 (547-48) + - (C) ‡ Customary (Habitual or General) Present (521-22)•表達一個習慣性動作;習慣性或持續性 (548-49) + - (D) ‡ Gnomic Present (523-25)•表達一個格言的內容 (549-53) +- (III) ‡ Special Uses of the Present (526-39)•現在時態的特別用法 (553-67) + - (A) ‡ Historical Present (Dramatic Present) (526-32)•描述一個過去(已經發生〕的事件 (553-59) + - (B) Perfective Present (532-33)•描述一個持續有影響力的事件 (559-61) + - (C) Conative (Tendential, Voluntative) Present (534-35)•表達講者的意願;宣傳性的、意願性的 (551-63) + - (1) In Progress, but Not Complete (True Conative) (534-35)•在進行、卻還沒有結束的動作 (561-62) + - (2) Not Begun, but About/Desired to be Attempted (Voluntative/Tendential) (535)•還沒有開始、卻即將開始的動作 (562-63) + - (D) ‡ Futuristic Present (535-37)•用以表達未來 (563-65) + - (1) ‡ Completely Futuristic (536)•單純的未來 (563-64) + - (2) ‡ Mostly Futuristic (Ingressive-Futuristic?) (537)•大致的將來(從此開始的一一未來的?) (564-65) + - (E) ‡ Present Retained in Indirect Discourse (537-39)•現在時態保留在間接引述句裡 (565-67) + +#### Imperfect (540-53)•不完成時態 (556-82) +- (I) ‡ Narrow-Band Imperfects (541-45)•狹義的不完成時態用法 (569-74) + - (A) Instantaneous Imperfect (a.k.a. Aoristic or Punctiliar Imperfect) (542-43)•用來生動描繪一個過去的事件/狀態 (570-71) + - (B) ‡ Progressive (Descriptive) Imperfect (543-44)•表達一個在過去已經進行了一段時間的動作 (571-72) + - (C) ‡ Ingressive (Inchoative, Inceptive) Imperfect (544-45)•表達一個在過去已經開始了一段時間的動作 (572-74) +- (II) ‡ Broad-Band Imperfects (546-48)•廣義的不完成時態用法 (574-77) + - (A) ‡ Iterative Imperfect (546-47)•表達一個頻繁或重複的動作 (574-76) + - (B) ‡ Customary (Habitual or General) Imperfect (548)•表達一個有規則性的習慣性動作 (576-77) +- (III) ‡ Special Uses of the Imperfect (549-53)•不完成時態的特別用法 (577-82) + - (A) "Pluperfective" Imperfect (549)•往往指著一個比主要動詞更早的持續動作 (578) + - (B) Conative (Voluntative, Tendential) Imperfect (550-52)•指著過去某時、封團成嚴案事的努力或意圖 (579-81) + - (1) In Progress, but Not Complete (True Conative) (550-51)•在進行、卻還沒有結束的動作 (579-80) + - (2) Not Begun, but About/Desired to be Attempted (Voluntative/Tendential) (551-52)•還沒有開始、卻打算即將開始的動作 (580-81) + - (C) ‡ Imperfect Retained in Indirect Discourse (552-53)•不完成時態保留在間接引述句裡 (581-82) + +#### Aorist (554-65)•簡單過去時態 (583-95) +- (A) ‡ Constative (Complexive, Punctiliar, Comprehensive, Global) Aorist (557-58)•單純的過去 (586-87) +- (B) ‡ Ingressive (Inceptive, Inchoative) Aorist (558-59)•表達在過去某時刻才開始的動作 (587-89) +- (C) ‡ Consummative (Culminative, Ecbatic, Effective) Aorist (559-61)•簡述、綜論一個已經結束的動作 (589-92) +- (D) Gnomic Aorist (562)•用以表達一個格言的內容 (592) +- (E) Epistolary Aorist (562-63)•用以表達一封書信的內容 (593-94) +- (F) Proleptic (Futuristic) Aorist (563-64)•用以表達一個使預言/預期成就的行動〔用以表達未來事件) (594-95) +- (G) Immediate Past Aorist/Dramatic Aorist (564-65)•用以表達剛才發生的/戲劇性的事 (595) + +#### Future (566-71)•未來時態 (596-602) +- (A) ‡ Predictive Future (568)•表達單純的未來 (597-98) +- (B) Imperatival Future (569-70)•傳遞命令語氣的內容 (599-600) +- (C) Deliberative Future (570)•審議性提問 (600-01) +- (D) Gnomic Future (571)•表達一個格言的內容 (601) +- (E) Miscellaneous Subjunctive Equivalents (571)•與設假設法動詞連用的諸多雜例 (602) + +#### Perfect (572-82)•完成時態 (603-04) +- (A) ‡ Intensive Perfect (a.k.a. Resultative Perfect) (574-76)•用以強調一個先前行動所產生、直到如今仍然持續的結果/效果 (606-08) +- (B) ‡ Extensive Perfect (a.k.a. Consummative Perfect) (577)•用以強調一個先前運作、導致現今結果/效果的行動 (608-09) +- (C) Aoristic Perfect (a.k.a. Dramatic or Historical Perfect) (578-79)•用以生動表達一個過去的行動 (609-10) +- (D) ‡ Perfect with a Present Force (579-80)•單純表達現在的含意 (610-12) +- (E) Gnomic Perfect (580-81)•表達一個便格言內容得滿足的行動 (612) +- (F) Proleptic (Futuristic) Perfect (581)•用以表達一個使預言/預期成就的行動 (613) +- (G) Perfect of Allegory (581-82)•用以凸顯舊約引文的預表特徵 (613-14) + +#### Pluperfect (583-86)•過去完成時態 (614-19) +- (A) ‡ Intensive Pluperfect (Resultative Pluperfect) (584-85)•用以強調在過去某個時段裡、持續存在的結果/狀態 (615-17) +- (B) ‡ Extensive Pluperfect (Consummative Pluperfect) (585-86)•用以強調在過去某個時段裡、已經完成的行動 (617-18) +- (C) ‡ Pluperfect with a Simple Past Force (586)•表達單純的過去 (618-19) + + + +## Infinitive•不定詞 + +### Semantic Categories•語意的類別 + +#### Adverbial (590-99)•引進副詞子句的用法 (623-34) +- (A) ‡ Purpose (590-92)•表達目的 (623-25) +- (B) ‡ Result (592-94)•表達結果 (625-27) +- (C) ‡ Time (594-96)•表達時間 (627-30) + - (1) Antecedent (594-95)•在主動詞動作之前 (628-29) + - (2) Contemporaneous (595)•與主動詞動作同時 (629) + - (3) Subsequent (596)•在主動詞動作之後 (629-30) +- (D) ‡ Cause (596-97)•表達原因 (630-31) +- (E) Means (597-98)•表達方法 (631-32) +- (F) ‡ Complementary (Supplementary) (598-99)•作為輔助動詞 (632-34) + +#### Substantival (600-609)•作實名詞用 (634-42) +- (A) ‡ Subject (600-601)•作主詞 (634-36) +- (B) Direct Object (601-603)•作直接受詞 (636-37) +- (C) ‡ Indirect Discourse (603-605)•引進間接引述句 (638-40) +- (D) ‡ Appositional (606-607)•作同位詞 (640-42) +- (E) ‡ Epexegetical (607)•作補述語 (642) +- +#### Independent (608-609)•獨立的用法 (642-44) +- (A) Imperatival (608)•傳遞命令 (643) +- (B) Absolute (608-609)•作簡短問候語 (643-44) + +### Structural Categories•按照結構的分類 + +#### I Anarthrous Infinitives (609-10)•不帶冠詞的不定詞 (644-45) +- (A) ‡ Simple Infinitive (609)•單純的不定詞 (644) +- (B) Πρίν (ἤ) + Infinitive (609)•Πρίν (ἤ) + 不定詞 (644) +- (C) Ὡς + Infinitive (609)•`Ως + 不定詞 (644) +- (D) ‡ ῞Ωστε + Infinitive (610)•"QoτE+ 不定詞 (644-45) + +#### II Articular Infinitives (610-11)•帶冠詞的不定詞 (645-46) +- ‡ A Without Governing Preposition (610)•前面不帶介系詞的不定詞 (645) + - (1) ‡ Nominative Articular Infinitive (610)•帶有主格冠詞的不定詞 (645) + - (2) ‡ Accusative Articular Infinitive (610)•帶有直接受格冠詞的不定詞 (645) + - (3) ‡ Genitive Articular Infinitive (610)•帶有所有格冠詞的不定詞 (645) + - (4) Dative Articular Infinitive (610)•帶有間接受格冠詞的不定詞 (645) +- (B) With Governing Preposition (610-11)•前面帶有介系詞的不定詞 (645-46) + - (1) ‡ Διὰ τό + Infinitive (610)•Διὰ τό + 不定詞 (645-46) + - (2) ‡ Εἰς τό + Infinitive (611)•Εἰς τό + 不定詞 (646) + - (3) ‡ ᾽Εν τῷ + Infinitive (611)•᾽Εν τῷ + 不定詞 (646) + - (4) ‡ Μετὰ τό + Infinitive (611)•Μετὰ τό + 不定詞 (646) + - (5) ‡ Πρὸς τό + Infinitive (611)•Πρὸς τό + 不定詞 (646) + - (6) ‡ Miscellaneous Prepositional Uses (611)•雜項用法 (646) + + +## Participle•分詞 + +### I Adjectival Participles (617-21)•具形容詞功能的分詞 (652-57) +- (A) ‡ Adjectival Proper (Dependent) (617-19)•作形容詞用(附屬的) (653-55) + - (1) ‡ Attributive Participles (618)•具形容、修飾功能 (653-54) + - (2) Predicate Participles (618-19)•具敘述功能、作述詞用 (654-55) +- (B) ‡ Substantival (Independent) (619-21)•作實名詞用(獨立的) (655-57) + +### II Verbal Participles (621-53)•具動詞性功能的分詞 (657-89) +- (A) ‡ Dependent Verbal Participles (622-50)•引進附屬動詞性子句的用法 (658-86) + - (1) ‡ Adverbial (or Circumstantial) (622-40)•具副詞功能的分詞 (658-75) + - (a) ‡ Temporal (623-27)•表達時間 (659-62) + - (b) Manner (627-28)•表達態度 (662-63) + - (c) ‡ Means (628-30)•表達方法 (663-66) + - (d) ‡ Cause (631-32)•表達原因 (666-67) + - (e) ‡ Condition (632-33)•引進條件子句 (667-69) + - (f) ‡ Concession (634-35)•表達退讓 (669-70) + - (g) ‡ Purpose (Telic) (635-37)•表達目的 (670-72) + - (h) ‡ Result (637-39)•表達結果 (672-74) + - (2) ‡ Attendant Circumstance (640-45)•伴隨主要動詞、說明附屬的動作 (675-81) + - (3) Indirect Discourse (645)•引進間述句 (681) + - (4) Complementary (646)•作為動詞的補語 (681-82) + - (5) ‡ Periphrastic (647-49):•合併主要動詞、作助動詞用 (682-85) + - (6) Redundant (Pleonastic) (649-50)•冗筆用法 (685-86) +- (B) Independent Verbal Participles (650-53)•引進獨立于旬的動詞性分詞 (686-89) + - (1) As an Imperative (Imperatival) (650-52)•傳遞命令內容 (686-88) + - (2) As an Indicative (Independent Proper or Absolute) (653)•表達單純的直說語氣 (688-89) + +### III The Participle Absolute (653-55)•引進分詞片語 (689-92) +- (A) Nominative Absolute (654)•以實名詞呈現、作破格的主格補語 (691-92) +- (B) ‡ Genitive Absolute (654-55)•引進獨立分詞片語 (691-92) + + + +## Clauses•子句 + +### I Independent Clauses (657-58)•獨立子句 (694-96) + +### II Dependent Clauses (659-65)•附屬子句 (696-702) +- (A) ‡ Structure (659-60):•按照基本結構可以有四種歸類方式 (659-60) : + - (1) Infinitival clauses•不定詞子句 + - (2) Participial clauses•分詞子句 + - (3) Conjunctive clauses•連結訝子句 + - (4) Relative clauses (both definite and indefinite)•關係子句(包括限定關係子句與不限定關係子句) +- (B) ‡ Syntactical Function (660-65)•句法功能 (697-702) + - (1) ‡ Substantival Clause•實名詞子句 + - (2) ‡ Adjectival Clause•形容詞子句 + - (3) ‡ Adverbial Clause•副詞子句 + + +## Conjunctions•連接詞 + +### I Logical Functions (670-74)•具邏輯功能 (707-12) +- (A) ‡ Ascensive — καί, δέ, and μηδέ (670-71)•強化語氣 (707) +- (B) ‡ Connective (continuative, coordinate) — καί and δέ (671)•連結(表達延續性,對等性) (708) +- (C) ‡ Contrastive (adversative) — ἀλλά, πλήν, καί, δέ (671-72)•表達對比 (708-09) +- (D) ‡ Correlative — μέν…δέ (on the one hand…on the other hand); καί…καί (both…and); μήτε…μήτε (neither…nor); οὔτε…οὔτε (neither . . . nor); οὐκ…ἀλλά or δέ (not…but); οὐ…ποτέ (not…ever); ποτέ . . . νῦν (once . . . now); τε…τε (as…so) or (not only…but also);…. ἤ (either . . . or) (672)•取得關連 (709) +- (E) ‡ Disjunctive (Alternative) — ἤ (672)•連結對比或相反 (709-10) +- (F) ‡ Emphatic — γε, δή, μενοῦνγε, μέντοι, ναί, and νή (673)•作強調用 (710) +- (G) ‡ Explanatory — γάρ, δέ, εἰ (after verbs of emotion), and καί (673)•作解釋用 (710) +- (H) ‡ Inferential — ἄρα, γάρ, διό, διότι, οὖν, πλήν, τοιγαροῦν, τοινῦν, and ὥστε (673)•作推論用 (711) +- (I) ‡ Transitional — οὖν and δέ. δέ (674)•作轉接用 (712) + +### II Adverbial Functions (674-77)•引進副詞子句的用法 (712-15) +- (A) ‡ Causal — γάρ, διότι, ἐπεί, ἐπειδή, ἐπειδήπερ, καθώς, ὅτι, and ὡς (674)•表達原因 (712) +- (B) ‡ Comparative (manner) — καθάπερ, καθώς, οὕτως, ὡς, ὡσαύτως, ὡσεί, and ὥσπερ (675)•比較(方法) (712) +- (C) ‡ Conditional — εἰ and ἐάν (675)•引進條件子句 (713) +- (D) ‡ Local (sphere) — ὅθεν, ὅπου, and οὗ (676)•表達空間、位置 (713) +- (E) ‡ Purpose — ἵνα, ὅπως, μήπως (the negative purpose), μήπου (negative purpose), and μήποτε (negative purpose) (676)•表達目的 (714) +- (F) ‡ Result — ὥστε, ὡς, ὅτι, and less frequently, ἵνα (677)•表達結果 (714) +- (G) ‡ Temporal— ἄχρι, ἕως, ὅταν, ὅτε, οὐδέποτε (negative temporal), οὐκέτι (negative temporal), οὔπω (negative temporal), ποτέ, and ὡς (677)•表達時間 (715) + +### III Substantival Functions (677-78)•引進子句作實名詞用 (715-16) +- (A) ‡ Content (678)•具名詞功能 (715-16) +- (B) ‡ Epexegetical (678)•具補述功能 (716) + +## Conditional Sentences•條件句 + +### I Conditional Sentences in General (682-84):•條件句的語意 (720-22) +- (A) ‡ Cause-Effect (682-83)•表達因表達證攝一一推論果 (720-21) +- (B) ‡ Evidence-Inference (683)•表達證據一一推論 (721) +- (C) ‡ Equivalence (683-84)•等同 (721-22) + +### II Conditional Sentences in Greek (especially the NT) (687-701)•(新約)希臘文中的條件句 (725-39) +- (A) ‡ First Class Condition (689, 690-94)•第一額條件句 (727; 728-32) +- (B) ‡ Second Class Condition (689, 694-96)•第二類條件句 (727; 732-34) +- (C) ‡ Third Class Condition (689, 696-99)•第三類條件句 (727; 734-37) +- (D) Fourth Class Condition (Less Probable Future) (689, 699-701)•第四類條件句(較不可能在未來發生) (727; 737-39) + +## Volitional Clauses•表達意志的子句 + +### I Commands (718-22)•命令 (754-60) +- (A) Future Indicative (a.k.a. Cohortative Indicative, Imperatival Future) (718-19)•以直說語氣、未來時態表達 (755-56) +- (B) ‡ Aorist Imperative (719-21)•以命令語氣、簡單過去時態表達 (756-58) + - (1) ‡ Ingressive (719-20)•開始一個〔新〕動作 (756-57) + - (a) ‡ Momentary or Single Act (719-20)•要求一個具體的動作 (756-57) + - (b) ‡ Pure Ingressive (720)•單純開始一個〔新的〕動作 (757) + - (2) ‡ Constative (720-21)•探取一個法則性的行動 (757-58) +- (C) ‡ Present Imperative (721-22)•以命令語氣、現在時態表達 (721-60) + - (1) ‡ Ingressive-Progressive (721-22)•開始探取一個持續性的動作 (758-59) + - (2) ‡ Customary (722)•要求探取一個〔新的〕習慣 (759) + - (3) ‡ Iterative (722)•要求探取一個重複性的動作 (759-60) + +### II Prohibitions (723-25)•禁制 (760-62) +- (A) Future Indicative (+ οὐ or sometimes μή) (723)•以直說語氣、未來時態表達 (+ οὐ 有時則是 μή) (760) +- (B) ‡ Aorist Subjunctive (+ μή) (723-24)•以命令語氣、簡單過去時態表達(+ μή) (760-61) + - (1) ‡ Ingressive (723-24)•要求停止一個動作 (760-61) + - (2) ‡ Constative (723-24)•將動作視為一個整體來禁制 (760-61) +- (C) ‡ Present Imperative (+ μή) (724-25)•以命令語氣、現在時態表達(+ μή) (761-62) + - (1) ‡ Cessation of Activity in Progress (Progressive) (724)•要求停止一個在行進中的動作 (761-62) + - (2) ‡ General Precept (Customary) (724-25)•禁止一個動作(要求停止一個習價) (762) \ No newline at end of file diff --git a/HW/HW1-解經大綱.md b/HW/HW1-解經大綱.md new file mode 100644 index 0000000..4cdd461 --- /dev/null +++ b/HW/HW1-解經大綱.md @@ -0,0 +1,64 @@ +# 作業 #1 解經大綱 — 1Jo 2:28–3:3 (5 節) + + +## 圖析 (Syntax Diagram) + +- 2:28a ΚαὶAndκαίCONJ (νῦν‚now‚νῦνADV)A1 τεκνία‚little children‚τεκνίονN-VPN (μένετεabideμένωV-PAM-2P)P (ἐνinἐνPREP αὐτῷ‚Him‚αὐτόςP-DSM)A2 + - 2:28b ἵναso thatἵναCONJ + - 第三類條件句 + - 2:28c ἐὰνwhenἐάνCONJ (φανερωθῇ‚He appearsφανερόωV-APS-3S)P + - 2:28d (σχῶμενwe might haveἔχωV-2AAS-1P)P (παρρησίανboldnessπαρρησίαN-ASF)C + - 2:28e καὶandκαίCONJ (μὴnotμήPRT-N)A1 (αἰσχυνθῶμενbe ashamedαἰσχύνωV-APS-1P)P (ἀπ᾽beforeἀπόPREP αὐτοῦHimαὐτόςP-GSM)A2 (ἐνatἐνPREP τῇtheT-DSF παρουσίᾳcomingπαρουσίαN-DSF αὐτοῦ.of Him.αὐτόςP-GSM)A3 +- 第三類條件句 + - 2:29a ἘὰνIfἐάνCONJ (εἰδῆτεyou knowεἴδωV-RAS-2P)P + - 2:29b ὅτιthatὅτιCONJ (δίκαιόςrighteousδίκαιοςA-NSM)C (ἐστιν‚He is‚εἰμίV-PAI-3S)P +- 2:29c (γινώσκετεyou knowγινώσκωV-PAI-2P)P + - 2:29d ὅτιthatὅτιCONJ + - 2:29e (καὶalsoκαίCONJ)A1 (πᾶςeveryoneπᾶςA-NSM T-NSM ποιῶνpracticingποιέωV-PAP-NSM τὴνT-ASF δικαιοσύνηνrighteousness‚δικαιοσύνηN-ASF)S (ἐξofἐκPREP αὐτοῦHimαὐτόςP-GSM)A2 (γεγέννηται.¶has been begotten.γεννάωV-RPI-3S)P +- 3:1a ἼδετεBeholdεἴδωV-2AAM-2P +- 3:1b (ποταπὴνwhatποταπόςI-ASF ἀγάπηνloveἀγάπηN-ASF)C1 (δέδωκενhas givenδίδωμιV-RAI-3S)P (ἡμῖνto usἐγώP-1DP)C2 (theT-NSM Πατὴρ‚Father‚πατήρN-NSM)S + - 3:1c ἵναthatἵναCONJ + - 3:1d (τέκναchildrenτέκνονN-NPN Θεοῦof GodθεόςN-GSM)C (κληθῶμεν‚we should be called -καλέωV-APS-1P)P +- 3:1e καὶandκαίCONJ (ἐσμέν.we are!εἰμίV-PAI-1P)P +- 3:1f (διὰBecause ofδιάPREP τοῦτοthis‚οὗτοςD-ASN)A (theT-NSM κόσμοςworldκόσμοςN-NSM)S (οὐnotοὐPRT-N)A1 (γινώσκειknowsγινώσκωV-PAI-3S)P (ἡμᾶς‚us‚ἐγώP-1AP)C + - 3:1g ὅτιbecauseὅτιCONJ + - 3:1h (οὐκnotοὐPRT-N)A (ἔγνωit knewγινώσκωV-2AAI-3S)P (αὐτόν.Him.αὐτόςP-ASM)C +- 3:2a ἈγαπητοίBeloved‚ἀγαπητόςA-VPM +- 3:2b (νῦνnowνῦνADV)A (τέκναchildrenτέκνονN-NPN Θεοῦof GodθεόςN-GSM)C (ἐσμεν‚are we‚εἰμίV-PAI-1P)P +- 3:2c καὶandκαίCONJ (οὔπωnot yetοὔπωADV)A (ἐφανερώθηhas been revealedφανερόωV-API-3S)P { (τίwhatτίςI-NSN)c (ἐσόμεθα.we will be.εἰμίV-FDI-1P)p }S +- 3:2d (οἴδαμενWe knowεἴδωV-RAI-1P)P + - 3:2e ὅτιthatὅτιCONJ + - 第三類條件句 + - 3:2f ἐὰνwhenἐάνCONJ φανερωθῇ‚He appears‚φανερόωV-APS-3S + - 3:2g (ὅμοιοιlikeὅμοιοςA-NPM αὐτῷHimαὐτόςP-DSM)C (ἐσόμεθα‚we will be‚εἰμίV-FDI-1P)P + - 3:2h ὅτιforὅτιCONJ + - 3:2i (ὀψόμεθαwe will seeὁράωV-FDI-1P)P (αὐτὸν‚HimαὐτόςP-ASM)C + - 2j καθώςasκαθώςCONJ (ἐστιν.He is.εἰμίV-PAI-3S)P +- 3:3a καὶAndκαίCONJ (πᾶςeveryoneπᾶςA-NSM T-NSM ἔχωνhavingἔχωV-PAP-NSM τὴνtheT-ASF ἐλπίδαhopeἐλπίςN-ASF ταύτηνthisοὗτοςD-ASF)S (ἐπ᾽inἐπίPREP αὐτῷHim‚αὐτόςP-DSM)A (ἁγνίζειpurifiesἁγνίζωV-PAI-3S)P (ἑαυτὸν‚himself‚ἑαυτοῦF-3ASM)C + - 3:3b καθὼςjust asκαθώςCONJ (ἐκεῖνοςHeἐκεῖνοςD-NSM)S (ἁγνόςpureἁγνόςA-NSM)C (ἐστιν.¶is.εἰμίV-PAI-3S)P + + +## 解經 (Exegesis) +- 2:28a νῦν‚τεκνία‚μένετε ἐν αὐτῷ‚ + - μένετε + - 可以是 PAI-2P or PAM-2P。但因為前面的呼格 τεκνία 有呼籲、勸勉的含意,因此在這裡當作 PAM-2P 比較恰當。 + - 現在式時態形式、命令語氣,表達意願和企圖,傳達持續動作的命令 (GGBB 485–6 = 中希 509–10;IGNT = 慣用語 )。 + - 至於動作發生的時間,因為不是直說語氣,所以不能從時態來判斷——要從時間副詞 νῦν 來決定。 + - ἐν αὐτῷ + - 表達空間 (GGBB 372 = 中希 389–90;IGNT = 慣用語 )。 + - αὐτῷ 可能是 DSM 或 DSN。如果是 DSN,可能指 2:27 的恩膏 (τὸ χρῖσμα);如果是 DSM,則是指 2:24 的聖子 or聖父。從上下文看,聖子 or聖父比較可能。對照 2:28e 「在他顯現的時候 ἐν τῇ παρουσίᾳ αὐτοῦ」以及約翰福音 15:4–7,這裡應該是指:住在聖子裡面。 +- 2:28bcde 用 ἵνα 帶出的從屬子句,表示 μένετε 的結果 (GGBB 676 = 中希;IGNT = 慣用語 )。 + - 2:28cde 是第三類條件句 (GGBB 676 = 中希;IGNT = 慣用語 ), + - 這裡 ἐὰν 的意思接近 ὅταν「無論何時」([BAGD 甲.一.D.](https://bible.fhl.net/new/s.php?N=0&k=01437&m=)) + +## 重述 (Paraphrase) + +## 大綱 (Outline) + +## 小抄 (memo) + +## 手稿 (Manuscript) + + + + diff --git a/HW/HW1.md b/HW/HW1.md new file mode 100644 index 0000000..a3bf844 --- /dev/null +++ b/HW/HW1.md @@ -0,0 +1,5 @@ +# 作業 #1 — 1Jo 2:28–3:3 (5 節) + + + 約壹2:28 ΚαὶAndκαίCONJ νῦν‚now‚νῦνADV τεκνία‚little children‚τεκνίονN-VPN μένετεabideμένωV-PAM-2P ἐνinἐνPREP αὐτῷ‚Him‚αὐτόςP-DSM ἵναso thatἵναCONJ ἐὰνwhenἐάνCONJ φανερωθῇ‚He appearsφανερόωV-APS-3S σχῶμενwe might haveἔχωV-2AAS-1P παρρησίανboldnessπαρρησίαN-ASF καὶandκαίCONJ μὴnotμήPRT-N αἰσχυνθῶμενbe ashamedαἰσχύνωV-APS-1P ἀπ᾽beforeἀπόPREP αὐτοῦHimαὐτόςP-GSM ἐνatἐνPREP τῇtheT-DSF παρουσίᾳcomingπαρουσίαN-DSF αὐτοῦ.of Him.αὐτόςP-GSM 約壹2:29 ἘὰνIfἐάνCONJ εἰδῆτεyou knowεἴδωV-RAS-2P ὅτιthatὅτιCONJ δίκαιόςrighteousδίκαιοςA-NSM ἐστιν‚He is‚εἰμίV-PAI-3S γινώσκετεyou knowγινώσκωV-PAI-2P ὅτιthatὅτιCONJ καὶalsoκαίCONJ πᾶςeveryoneπᾶςA-NSM T-NSM ποιῶνpracticingποιέωV-PAP-NSM τὴνT-ASF δικαιοσύνηνrighteousness‚δικαιοσύνηN-ASF ἐξofἐκPREP αὐτοῦHimαὐτόςP-GSM γεγέννηται.¶has been begotten.γεννάωV-RPI-3S 約壹3:1 ἼδετεBeholdεἴδωV-2AAM-2P ποταπὴνwhatποταπόςI-ASF ἀγάπηνloveἀγάπηN-ASF δέδωκενhas givenδίδωμιV-RAI-3S ἡμῖνto usἐγώP-1DP theT-NSM Πατὴρ‚Father‚πατήρN-NSM ἵναthatἵναCONJ τέκναchildrenτέκνονN-NPN Θεοῦof GodθεόςN-GSM κληθῶμεν‚we should be called -καλέωV-APS-1P καὶandκαίCONJ ἐσμέν.we are!εἰμίV-PAI-1P διὰBecause ofδιάPREP τοῦτοthis‚οὗτοςD-ASN theT-NSM κόσμοςworldκόσμοςN-NSM οὐnotοὐPRT-N γινώσκειknowsγινώσκωV-PAI-3S ἡμᾶς‚us‚ἐγώP-1AP ὅτιbecauseὅτιCONJ οὐκnotοὐPRT-N ἔγνωit knewγινώσκωV-2AAI-3S αὐτόν.Him.αὐτόςP-ASM 約壹3:2 ἈγαπητοίBeloved‚ἀγαπητόςA-VPM νῦνnowνῦνADV τέκναchildrenτέκνονN-NPN Θεοῦof GodθεόςN-GSM ἐσμεν‚are we‚εἰμίV-PAI-1P καὶandκαίCONJ οὔπωnot yetοὔπωADV ἐφανερώθηhas been revealedφανερόωV-API-3S τίwhatτίςI-NSN ἐσόμεθα.we will be.εἰμίV-FDI-1P οἴδαμενWe knowεἴδωV-RAI-1P ὅτιthatὅτιCONJ ἐὰνwhenἐάνCONJ φανερωθῇ‚He appears‚φανερόωV-APS-3S ὅμοιοιlikeὅμοιοςA-NPM αὐτῷHimαὐτόςP-DSM ἐσόμεθα‚we will be‚εἰμίV-FDI-1P ὅτιforὅτιCONJ ὀψόμεθαwe will seeὁράωV-FDI-1P αὐτὸν‚HimαὐτόςP-ASM καθώςasκαθώςCONJ ἐστιν.He is.εἰμίV-PAI-3S 約壹3:3 καὶAndκαίCONJ πᾶςeveryoneπᾶςA-NSM T-NSM ἔχωνhavingἔχωV-PAP-NSM τὴνtheT-ASF ἐλπίδαhopeἐλπίςN-ASF ταύτηνthisοὗτοςD-ASF ἐπ᾽inἐπίPREP αὐτῷHim‚αὐτόςP-DSM ἁγνίζειpurifiesἁγνίζωV-PAI-3S ἑαυτὸν‚himself‚ἑαυτοῦF-3ASM καθὼςjust asκαθώςCONJ ἐκεῖνοςHeἐκεῖνοςD-NSM ἁγνόςpureἁγνόςA-NSM ἐστιν.¶is.εἰμίV-PAI-3S + \ No newline at end of file diff --git a/HW/HW2.md b/HW/HW2.md new file mode 100644 index 0000000..ac763a9 --- /dev/null +++ b/HW/HW2.md @@ -0,0 +1,10 @@ +# 作業 #2 — 1Jo 3:4–10 (7 節) + + + 約壹3:4 ΠᾶςEveryoneπᾶςA-NSM T-NSM ποιῶνcommittingποιέωV-PAP-NSM τὴνT-ASF ἁμαρτίανsin‚ἁμαρτίαN-ASF καὶalsoκαίCONJ τὴνT-ASF ἀνομίανlawlessnessἀνομίαN-ASF ποιεῖ‚commits;ποιέωV-PAI-3S καὶandκαίCONJ T-NSF ἁμαρτίαsinἁμαρτίαN-NSF ἐστὶνisεἰμίV-PAI-3S T-NSF ἀνομία.lawlessness.ἀνομίαN-NSF 約壹3:5 καὶAndκαίCONJ οἴδατεyou knowεἴδωV-RAI-2P ὅτιthatὅτιCONJ ἐκεῖνοςHeἐκεῖνοςD-NSM ἐφανερώθη‚appearedφανερόωV-API-3S ἵναso thatἵναCONJ τὰςT-APF ἁμαρτίαςsinsἁμαρτίαN-APF ἄρῃ‚He might take away;αἴρωV-AAS-3S καὶandκαίCONJ ἁμαρτίαsinἁμαρτίαN-NSF ἐνinἐνPREP αὐτῷHimαὐτόςP-DSM οὐκnotοὐPRT-N ἔστιν.there is.εἰμίV-PAI-3S 約壹3:6 πᾶςAnyoneπᾶςA-NSM T-NSM ἐνinἐνPREP αὐτῷHimαὐτόςP-DSM μένωνabiding‚μένωV-PAP-NSM οὐχnotοὐPRT-N ἁμαρτάνει·sins;ἁμαρτάνωV-PAI-3S πᾶςanyoneπᾶςA-NSM T-NSM ἁμαρτάνωνsinning‚ἁμαρτάνωV-PAP-NSM οὐχnotοὐPRT-N ἑώρακενhas seenὁράωV-RAI-3S αὐτὸνHim‚αὐτόςP-ASM οὐδὲnorοὐδέCONJ-N ἔγνωκενhas he knownγινώσκωV-RAI-3S αὐτόν.¶Him.αὐτόςP-ASM 約壹3:7 Τεκνία‚Little children‚τεκνίονN-VPN μηδεὶςno oneμηδείςA-NSM πλανάτωlet lead astrayπλανάωV-PAM-3S ὑμᾶς·you;σύP-2AP the [one]T-NSM ποιῶνpracticingποιέωV-PAP-NSM τὴνT-ASF δικαιοσύνηνrighteousness‚δικαιοσύνηN-ASF δίκαιόςrighteousδίκαιοςA-NSM ἐστιν‚is‚εἰμίV-PAI-3S καθὼςjust asκαθώςCONJ ἐκεῖνοςHeἐκεῖνοςD-NSM δίκαιόςrighteousδίκαιοςA-NSM ἐστιν·is.εἰμίV-PAI-3S 約壹3:8 The [one]T-NSM ποιῶνpracticingποιέωV-PAP-NSM τὴνT-ASF ἁμαρτίανsin‚ἁμαρτίαN-ASF ἐκofἐκPREP τοῦtheT-GSM διαβόλουdevilδιάβολοςA-GSM ἐστίν‚is‚εἰμίV-PAI-3S ὅτιbecauseὅτιCONJ ἀπ᾽fromἀπόPREP ἀρχῆς[the] beginningἀρχήN-GSF theT-NSM διάβολοςdevilδιάβολοςA-NSM ἁμαρτάνει.has been sinning.ἁμαρτάνωV-PAI-3S εἰςForεἰςPREP τοῦτοthis [reason]οὗτοςD-ASN ἐφανερώθηwas revealedφανερόωV-API-3S theT-NSM ΥἱὸςSonυἱόςN-NSM τοῦT-GSM Θεοῦ‚of God‚θεόςN-GSM ἵναso thatἵναCONJ λύσῃHe might destroyλύωV-AAS-3S τὰtheT-APN ἔργαworksἔργονN-APN τοῦof theT-GSM διαβόλου.devil.διάβολοςA-GSM 約壹3:9 ΠᾶςAnyoneπᾶςA-NSM T-NSM γεγεννημένοςhaving been bornγεννάωV-RPP-NSM ἐκofἐκPREP τοῦT-GSM ΘεοῦGod‚θεόςN-GSM ἁμαρτίανsinἁμαρτίαN-ASF οὐnotοὐPRT-N ποιεῖ‚practices‚ποιέωV-PAI-3S ὅτιbecauseὅτιCONJ σπέρμαseedσπέρμαN-NSN αὐτοῦof HimαὐτόςP-GSM ἐνinἐνPREP αὐτῷhimαὐτόςP-DSM μένει‚abides‚μένωV-PAI-3S καὶandκαίCONJ οὐnotοὐPRT-N δύναταιhe is ableδύναμαιV-PNI-3S ἁμαρτάνειν‚to continue sinning‚ἁμαρτάνωV-PAN ὅτιbecauseὅτιCONJ ἐκofἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM γεγέννηται.he has been born.γεννάωV-RPI-3S 約壹3:10 ἐνThroughἐνPREP τούτῳthisοὗτοςD-DSN φανεράmanifestφανερόςA-NPN ἐστινareεἰμίV-PAI-3S τὰtheT-NPN τέκναchildrenτέκνονN-NPN τοῦT-GSM Θεοῦof GodθεόςN-GSM καὶandκαίCONJ τὰtheT-NPN τέκναchildrenτέκνονN-NPN τοῦof theT-GSM διαβόλου·devil:διάβολοςA-GSM πᾶςAnyoneπᾶςA-NSM T-NSM μὴnotμήPRT-N ποιῶνpracticingποιέωV-PAP-NSM δικαιοσύνηνrighteousnessδικαιοσύνηN-ASF οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐκofἐκPREP τοῦT-GSM ΘεοῦGod‚θεόςN-GSM καὶand alsoκαίCONJ the [one]T-NSM μὴnotμήPRT-N ἀγαπῶνlovingἀγαπάωV-PAP-NSM τὸνtheT-ASM ἀδελφὸνbrotherἀδελφόςN-ASM αὐτοῦ.¶of him.αὐτόςP-GSM + + + --- + +[Home Work ↵](HW/Home%20Work.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/HW/HW3.md b/HW/HW3.md new file mode 100644 index 0000000..47bafa2 --- /dev/null +++ b/HW/HW3.md @@ -0,0 +1,10 @@ +# 作業 #3 — Joh 15:1–8 (8 節) + + + 約15:1 ἘγώIἐγώP-1NS εἰμιamεἰμίV-PAI-1S theT-NSF ἄμπελοςvineἄμπελοςN-NSF T-NSF ἀληθινήtrue‚ἀληθινόςA-NSF καὶandκαίCONJ theT-NSM ΠατήρFatherπατήρN-NSM μουof Me‚ἐγώP-1GS theT-NSM γεωργόςvinedresserγεωργόςN-NSM ἐστιν.is.εἰμίV-PAI-3S 約15:2 πᾶνEveryπᾶςA-ASN κλῆμαbranchκλῆμαN-ASN ἐνinἐνPREP ἐμοὶMeἐγώP-1DS μὴnotμήPRT-N φέρονbearingφέρωV-PAP-ASN καρπὸνfruit‚καρπόςN-ASM αἴρειHe takes awayαἴρωV-PAI-3S αὐτό‚it;αὐτόςP-ASN καὶandκαίCONJ πᾶνevery oneπᾶςA-ASN τὸT-ASN καρπὸνfruitκαρπόςN-ASM φέρονbearing‚φέρωV-PAP-ASN καθαίρειHe prunesκαθαίρωV-PAI-3S αὐτὸit‚αὐτόςP-ASN ἵναthatἵναCONJ καρπὸνfruitκαρπόςN-ASM πλείοναmoreπλείων, πλεῖονA-ASM-C φέρῃ.it may bear.φέρωV-PAS-3S 約15:3 ἤδηAlreadyἤδηADV ὑμεῖςyouσύP-2NP καθαροίcleanκαθαρόςA-NPM ἐστεareεἰμίV-PAI-2P διὰby reason ofδιάPREP τὸνtheT-ASM λόγονwordλόγοςN-ASM ὃνthatὅς, ἥR-ASM λελάληκαI have spokenλαλέωV-RAI-1S ὑμῖν·to you.σύP-2DP 約15:4 μείνατεAbideμένωV-AAM-2P ἐνinἐνPREP ἐμοί‚Me‚ἐγώP-1DS κἀγὼand IκἀγώP-1NS-K ἐνinἐνPREP ὑμῖν.you.σύP-2DP καθὼςAsκαθώςCONJ τὸtheT-NSN κλῆμαbranchκλῆμαN-NSN οὐnotοὐPRT-N δύναταιis ableδύναμαιV-PNI-3S καρπὸνfruitκαρπόςN-ASM φέρεινto bearφέρωV-PAN ἀφ᾽ofἀπόPREP ἑαυτοῦitself‚ἑαυτοῦF-3GSN ἐὰνifἐάνCONJ μὴnotμήPRT-N μένῃit abideμένωV-PAS-3S ἐνinἐνPREP τῇtheT-DSF ἀμπέλῳ‚vine‚ἄμπελοςN-DSF οὕτωςsoοὕτω, οὕτωςADV οὐδὲneither [can]οὐδέCONJ-N ὑμεῖςyou‚σύP-2NP ἐὰνifἐάνCONJ μὴnotμήPRT-N ἐνinἐνPREP ἐμοὶMeἐγώP-1DS μένητε.you abide.μένωV-PAS-2P 約15:5 ἘγώIἐγώP-1NS εἰμιamεἰμίV-PAI-1S theT-NSF ἄμπελος‚vine;ἄμπελοςN-NSF ὑμεῖςyou [are]σύP-2NP τὰtheT-NPN κλήματα.branches.κλῆμαN-NPN The [one]T-NSM μένωνabidingμένωV-PAP-NSM ἐνinἐνPREP ἐμοὶMe‚ἐγώP-1DS κἀγὼand IκἀγώP-1NS-K ἐνinἐνPREP αὐτῷhim‚αὐτόςP-DSM οὗτοςheοὗτοςD-NSM φέρειbearsφέρωV-PAI-3S καρπὸνfruitκαρπόςN-ASM πολύν‚much.πολύςA-ASM ὅτιForὅτιCONJ χωρὶςapart fromχωρίςPREP ἐμοῦMeἐγώP-1GS οὐnotοὐPRT-N δύνασθεyou are ableδύναμαιV-PNI-2P ποιεῖνto doποιέωV-PAN οὐδέν.nothing.οὐδείςA-ASN 約15:6 ἐὰνIfἐάνCONJ μήnotμήPRT-N τιςanyoneτιςX-NSM μένῃabideμένωV-PAS-3S ἐνinἐνPREP ἐμοί‚Me‚ἐγώP-1DS ἐβλήθηhe is thrownβάλλωV-API-3S ἔξωoutἔξωADV ὡςlikeὡςCONJ τὸtheT-NSN κλῆμαbranchκλῆμαN-NSN καὶandκαίCONJ ἐξηράνθηis dried up‚ξηραίνωV-API-3S καὶandκαίCONJ συνάγουσινthey gatherσυνάγωV-PAI-3P αὐτὰthemαὐτόςP-APN καὶandκαίCONJ εἰςintoεἰςPREP τὸtheT-ASN πῦρfireπῦρN-ASN βάλλουσινcast‚βάλλωV-PAI-3P καὶandκαίCONJ καίεται.it is burned.καίωV-PPI-3S 約15:7 ἐὰνIfἐάνCONJ μείνητεyou abideμένωV-AAS-2P ἐνinἐνPREP ἐμοὶMeἐγώP-1DS καὶandκαίCONJ τὰtheT-NPN ῥήματάwordsῥῆμαN-NPN μουof MeἐγώP-1GS ἐνinἐνPREP ὑμῖνyouσύP-2DP μείνῃ‚abide‚μένωV-AAS-3S whateverὅς, ἥR-ASN ἐὰνifἐάνPRT θέλητεyou wish‚θέλωV-PAS-2P αἰτήσασθε‚you shall ask‚αἰτέωV-AMM-2P καὶandκαίCONJ γενήσεταιit will come to passγίνομαιV-FDI-3S ὑμῖν.to you.σύP-2DP 約15:8 ἐνInἐνPREP τούτῳthisοὗτοςD-DSN ἐδοξάσθηis glorifiedδοξάζωV-API-3S theT-NSM ΠατήρFatherπατήρN-NSM μου‚of Me‚ἐγώP-1GS ἵναthatἵναADV καρπὸνfruitκαρπόςN-ASM πολὺνmuchπολύςA-ASM φέρητεyou should bear‚φέρωV-PAS-2P καὶandκαίCONJ γένησθεyou shall beγίνομαιV-2ADS-2P ἐμοὶto MeἐμόςS-1SNPM μαθηταί.¶disciples.μαθητήςN-NPM + + + --- + +[Home Work ↵](HW/Home%20Work.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/HW/HW4.md b/HW/HW4.md new file mode 100644 index 0000000..9381e7a --- /dev/null +++ b/HW/HW4.md @@ -0,0 +1,10 @@ +# 作業 #4 — Joh 15:9–17 (9 節) + + + 約15:9 ΚαθὼςAsκαθώςCONJ ἠγάπησένhas lovedἀγαπάωV-AAI-3S μεMeἐγώP-1AS theT-NSM Πατήρ‚Father‚πατήρN-NSM κἀγὼI alsoκἀγώP-1NS-K ὑμᾶςyouσύP-2AP ἠγάπησα·have loved.ἀγαπάωV-AAI-1S μείνατεAbideμένωV-AAM-2P ἐνinἐνPREP τῇtheT-DSF ἀγάπῃloveἀγάπηN-DSF τῇT-DSF ἐμῇ.of Me.ἐμόςS-1SDSF 約15:10 ἐὰνIfἐάνCONJ τὰςtheT-APF ἐντολάςcommandmentsἐντολήN-APF μουof MeἐγώP-1GS τηρήσητε‚you keep‚τηρέωV-AAS-2P μενεῖτεyou will abideμένωV-FAI-2P ἐνinἐνPREP τῇtheT-DSF ἀγάπῃloveἀγάπηN-DSF μου‚of Me‚ἐγώP-1GS καθὼςasκαθώςCONJ ἐγὼI‚ἐγώP-1NS τὰςtheT-APF ἐντολὰςcommandmentsἐντολήN-APF τοῦtheT-GSM ΠατρόςFatherπατήρN-GSM μουof MeἐγώP-1GS τετήρηκαhave kept‚τηρέωV-RAI-1S καὶandκαίCONJ μένωI abideμένωV-PAI-1S αὐτοῦof HimαὐτόςP-GSM ἐνinἐνPREP τῇtheT-DSF ἀγάπῃ.love.ἀγάπηN-DSF 約15:11 ΤαῦταThese thingsοὗτοςD-APN λελάληκαI have spokenλαλέωV-RAI-1S ὑμῖνto you‚σύP-2DP ἵναthatἵναCONJ T-NSF χαρὰjoyχαράN-NSF T-NSF ἐμὴMyἐμόςS-1SNSF ἐνinἐνPREP ὑμῖνyouσύP-2DP may be‚εἰμίV-PAS-3S καὶandκαίCONJ theT-NSF χαρὰjoyχαράN-NSF ὑμῶνof youσύP-2GP πληρωθῇ.may be full.πληρόωV-APS-3S 約15:12 ΑὕτηThisοὗτοςD-NSF ἐστὶνisεἰμίV-PAI-3S T-NSF ἐντολὴcommandmentἐντολήN-NSF T-NSF ἐμὴ‚My‚ἐμόςS-1SNSF ἵναthatἵναADV ἀγαπᾶτεyou loveἀγαπάωV-PAS-2P ἀλλήλουςone anotherἀλλήλωνC-APM καθὼςasκαθώςCONJ ἠγάπησαI lovedἀγαπάωV-AAI-1S ὑμᾶς.you.σύP-2AP 約15:13 μείζοναGreaterμέγαςA-ASF-C ταύτηςthan thisοὗτοςD-GSF ἀγάπηνloveἀγάπηN-ASF οὐδεὶςno oneοὐδείςA-NSM ἔχει‚has‚ἔχωV-PAI-3S ἵναthatἵναCONJ τιςoneτιςX-NSM τὴνtheT-ASF ψυχὴνlifeψυχήN-ASF αὐτοῦof himαὐτόςP-GSM θῇshould lay downτίθημιV-2AAS-3S ὑπὲρforὑπέρPREP τῶνtheT-GPM φίλωνfriendsφίλοςA-GPM αὐτοῦ.of him.αὐτόςP-GSM 約15:14 ὙμεῖςYouσύP-2NP φίλοιfriendsφίλοςA-NPM μούof MeἐγώP-1GS ἐστεareεἰμίV-PAI-2P ἐὰνifἐάνCONJ ποιῆτεyou doποιέωV-PAS-2P whatὅς, ἥR-APN ἐγὼIἐγώP-1NS ἐντέλλομαιcommandἐντέλλωV-PNI-1S ὑμῖν.you.σύP-2DP 約15:15 οὐκέτιNo longerοὐκέτιADV λέγωI callλέγωV-PAI-1S ὑμᾶςyouσύP-2AP δούλους‚servants‚δοῦλοςN-APM ὅτιforὅτιCONJ theT-NSM δοῦλοςservantδοῦλοςN-NSM οὐκnotοὐPRT-N οἶδενknowsεἴδωV-RAI-3S τίwhatτίςI-ASN ποιεῖis doingποιέωV-PAI-3S αὐτοῦhisαὐτόςP-GSM T-NSM κύριος·master.κύριοςN-NSM ὑμᾶςYouσύP-2AP δὲhoweverδέCONJ εἴρηκαI have calledἔπω, ἐρῶ, εἶπονV-RAI-1S φίλους‚friends‚φίλοςA-APM ὅτιbecauseὅτιCONJ πάνταall thingsπᾶςA-APN thatὅς, ἥR-APN ἤκουσαI heardἀκούωV-AAI-1S παρὰfromπαράPREP τοῦtheT-GSM ΠατρόςFatherπατήρN-GSM μουof Me‚ἐγώP-1GS ἐγνώρισαI have made knownγνωρίζωV-AAI-1S ὑμῖν.to you.σύP-2DP 約15:16 οὐχNotοὐPRT-N ὑμεῖςyouσύP-2NP μεMeἐγώP-1AS ἐξελέξασθε‚chose‚ἐκλέγωV-AMI-2P ἀλλ᾽butἀλλάCONJ ἐγὼIἐγώP-1NS ἐξελεξάμηνchoseἐκλέγωV-AMI-1S ὑμᾶςyou‚σύP-2AP καὶandκαίCONJ ἔθηκαappointedτίθημιV-AAI-1S ὑμᾶςyouσύP-2AP ἵναthatἵναCONJ ὑμεῖςyouσύP-2NP ὑπάγητεshould goὑπάγωV-PAS-2P καὶandκαίCONJ καρπὸνfruitκαρπόςN-ASM φέρητεyou should bear‚φέρωV-PAS-2P καὶandκαίCONJ theT-NSM καρπὸςfruitκαρπόςN-NSM ὑμῶνof youσύP-2GP μένῃ‚should remain;μένωV-PAS-3S ἵναso thatἵναCONJ ὅς, ἥR-ASN τιwhateverτιςX-ASN ἂνἄνPRT αἰτήσητεyou might askαἰτέωV-AAS-2P τὸνtheT-ASM ΠατέραFatherπατήρN-ASM ἐνinἐνPREP τῷtheT-DSN ὀνόματίnameὄνομαN-DSN μουof Me‚ἐγώP-1GS δῷHe may giveδίδωμιV-2AAS-3S ὑμῖν.you.σύP-2DP 約15:17 ταῦταThese thingsοὗτοςD-APN ἐντέλλομαιI commandἐντέλλωV-PNI-1S ὑμῖν‚you‚σύP-2DP ἵναthatἵναADV ἀγαπᾶτεyou loveἀγαπάωV-PAS-2P ἀλλήλους.¶one another.ἀλλήλωνC-APM + + + --- + +[Home Work ↵](HW/Home%20Work.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/HW/HW5.md b/HW/HW5.md new file mode 100644 index 0000000..6c4205a --- /dev/null +++ b/HW/HW5.md @@ -0,0 +1,10 @@ +# 作業 #5 — Joh 15:18–25 (8 節) + + + 約15:18 ΕἰIfεἰCONJ theT-NSM κόσμοςworldκόσμοςN-NSM ὑμᾶςyouσύP-2AP μισεῖ‚hates‚μισέωV-PAI-3S γινώσκετεyou knowγινώσκωV-PAI-2P ὅτιthatὅτιCONJ ἐμὲMeἐγώP-1AS πρῶτονbeforeπρῶτοςA-ASN ὑμῶνyouσύP-2GP μεμίσηκεν.it has hated.μισέωV-RAI-3S 約15:19 εἰIfεἰCONJ ἐκofἐκPREP τοῦtheT-GSM κόσμουworldκόσμοςN-GSM ἦτε‚you were‚εἰμίV-IAI-2P theT-NSM κόσμοςworldκόσμοςN-NSM ἂνἄνPRT τὸ[as] itsT-ASN ἴδιονownἴδιοςA-ASN ἐφίλει·would love [you];φιλέωV-IAI-3S ὅτιbecauseὅτιCONJ δὲhoweverδέCONJ ἐκofἐκPREP τοῦtheT-GSM κόσμουworldκόσμοςN-GSM οὐκnotοὐPRT-N ἐστέ‚you are‚εἰμίV-PAI-2P ἀλλ᾽butἀλλάCONJ ἐγὼIἐγώP-1NS ἐξελεξάμηνchoseἐκλέγωV-AMI-1S ὑμᾶςyouσύP-2AP ἐκout ofἐκPREP τοῦtheT-GSM κόσμου‚world‚κόσμοςN-GSM διὰon account ofδιάPREP τοῦτοthisοὗτοςD-ASN μισεῖhatesμισέωV-PAI-3S ὑμᾶςyouσύP-2AP theT-NSM κόσμος.world.κόσμοςN-NSM 約15:20 ΜνημονεύετεRememberμνημονεύωV-PAM-2P τοῦtheT-GSM λόγουwordλόγοςN-GSM οὗthatὅς, ἥR-GSM ἐγὼIἐγώP-1NS εἶπονsaidἔπω, ἐρῶ, εἶπονV-2AAI-1S ὑμῖν·to you:σύP-2DP ΟὐκNotοὐPRT-N ἔστινisεἰμίV-PAI-3S δοῦλοςa servantδοῦλοςN-NSM μείζωνgreater thanμέγαςA-NSM-C τοῦtheT-GSM κυρίουmasterκύριοςN-GSM αὐτοῦ.of him.αὐτόςP-GSM εἰIfεἰCONJ ἐμὲMeἐγώP-1AS ἐδίωξαν‚they persecuted‚διώκωV-AAI-3P καὶalsoκαίCONJ ὑμᾶςyouσύP-2AP διώξουσιν·they will persecute;διώκωV-FAI-3P εἰifεἰCONJ τὸνtheT-ASM λόγονwordλόγοςN-ASM μουof MeἐγώP-1GS ἐτήρησαν‚they kept‚τηρέωV-AAI-3P καὶalsoκαίCONJ τὸνT-ASM ὑμέτερονyoursὑμέτεροςA-ASM τηρήσουσιν.they will keep.τηρέωV-FAI-3P 約15:21 ἀλλὰButἀλλάCONJ ταῦταthese thingsοὗτοςD-APN πάνταallπᾶςA-APN ποιήσουσινthey will doποιέωV-FAI-3P εἰςagainstεἰςPREP ὑμᾶςyouσύP-2AP διὰon account ofδιάPREP τὸtheT-ASN ὄνομάnameὄνομαN-ASN μου‚of Me‚ἐγώP-1GS ὅτιbecauseὅτιCONJ οὐκnotοὐPRT-N οἴδασινthey have knownεἴδωV-RAI-3P τὸνthe [One]T-ASM πέμψαντάhaving sentπέμπωV-AAP-ASM με.Me.ἐγώP-1AS 約15:22 εἰIfεἰCONJ μὴnotμήPRT-N ἦλθονI had comeἔρχομαιV-2AAI-1S καὶandκαίCONJ ἐλάλησαspokenλαλέωV-AAI-1S αὐτοῖς‚to them‚αὐτόςP-DPM ἁμαρτίανsinἁμαρτίαN-ASF οὐκnotοὐPRT-N εἴχοσαν·they would have had;ἔχωV-IAI-3P νῦνnowνῦνADV δὲhoweverδέCONJ πρόφασινexcuseπρόφασιςN-ASF οὐκnotοὐPRT-N ἔχουσινthey haveἔχωV-PAI-3P περὶforπερίPREP τῆςtheT-GSF ἁμαρτίαςsinἁμαρτίαN-GSF αὐτῶν.of them.αὐτόςP-GPM 約15:23 The [one]T-NSM ἐμὲMeἐγώP-1AS μισῶνhating‚μισέωV-PAP-NSM καὶalsoκαίCONJ τὸνtheT-ASM ΠατέραFatherπατήρN-ASM μουof MeἐγώP-1GS μισεῖ.hates.μισέωV-PAI-3S 約15:24 εἰIfεἰCONJ τὰtheT-APN ἔργαworksἔργονN-APN μὴnotμήPRT-N ἐποίησαI had doneποιέωV-AAI-1S ἐνamongἐνPREP αὐτοῖςthemαὐτόςP-DPM thatὅς, ἥR-APN οὐδεὶςnoοὐδείςA-NSM ἄλλοςotherἄλλοςA-NSM ἐποίησεν‚has done‚ποιέωV-AAI-3S ἁμαρτίανsinἁμαρτίαN-ASF οὐκnotοὐPRT-N εἴχοσαν·they would have had;ἔχωV-IAI-3P νῦνnowνῦνADV δὲhoweverδέCONJ καὶbothκαίCONJ ἑωράκασινthey have seenὁράωV-RAI-3P καὶandκαίCONJ μεμισήκασινhave hatedμισέωV-RAI-3P καὶbothκαίCONJ ἐμὲMeἐγώP-1AS καὶandκαίCONJ τὸνtheT-ASM ΠατέραFatherπατήρN-ASM μου.of Me.ἐγώP-1GS 約15:25 ἀλλ᾽But [this is]ἀλλάCONJ ἵναthatἵναCONJ πληρωθῇmay be fulfilledπληρόωV-APS-3S theT-NSM λόγοςwordλόγοςN-NSM T-NSM ἐνinἐνPREP τῷtheT-DSM νόμῳlawνόμοςN-DSM αὐτῶνof themαὐτόςP-GPM γεγραμμένοςhaving been writtenγράφωV-RPP-NSM ὅτι‑:ὅτιADV ἘμίσησάνThey hatedμισέωV-AAI-3P μεMeἐγώP-1AS δωρεάν.¶without cause.’δωρεάνADV + + + --- + +[Home Work ↵](HW/Home%20Work.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/HW/HW6.md b/HW/HW6.md new file mode 100644 index 0000000..2f11b4a --- /dev/null +++ b/HW/HW6.md @@ -0,0 +1,10 @@ +# 作業 #6 — Mar 8:27–33 (7 節) + + + 可8:27 ΚαὶAndκαίCONJ ἐξῆλθενwent forthἐξέρχομαιV-2AAI-3S T-NSM ἸησοῦςJesusἸησοῦςN-NSM-P καὶandκαίCONJ οἱtheT-NPM μαθηταὶdisciplesμαθητήςN-NPM αὐτοῦof HimαὐτόςP-GSM εἰςintoεἰςPREP τὰςtheT-APF κώμαςvillagesκώμηN-APF Καισαρείαςof CaesareaΚαισάρειαN-GSF-L τῆςT-GSF Φιλίππου·Philippi.ΦίλιπποςN-GSM-P καὶAndκαίCONJ ἐνonἐνPREP τῇtheT-DSF ὁδῷway‚ὁδόςN-DSF ἐπηρώταHe was questioningἐπερωτάωV-IAI-3S τοὺςtheT-APM μαθητὰςdisciplesμαθητήςN-APM αὐτοῦof Him‚αὐτόςP-GSM λέγωνsayingλέγωV-PAP-NSM αὐτοῖς·to them‚αὐτόςP-DPM ΤίναWhomτίςI-ASM μεMeἐγώP-1AS λέγουσινdo pronounceλέγωV-PAI-3P οἱT-NPM ἄνθρωποιmenἄνθρωποςN-NPM εἶναι;to be?εἰμίV-PAN 可8:28 ΟἱT-NPM δὲAndδέCONJ εἶπανthey answeredἔπω, ἐρῶ, εἶπονV-2AAI-3P αὐτῷHim‚αὐτόςP-DSM λέγοντεςsayingλέγωV-PAP-NPM ὅτι‑‚ὅτιCONJ ἸωάννηνJohnἸωάννηςN-ASM-P τὸνtheT-ASM Βαπτιστήν‚Baptist;ΒαπτιστήςN-ASM καὶandκαίCONJ ἄλλοιothers‚ἄλλοςA-NPM Ἠλίαν‚Elijah;ἩλίαςN-ASM-P ἄλλοιothersἄλλοςA-NPM δὲnowδέCONJ ὅτι‑‚ὅτιCONJ εἷςoneεἷςA-NSM τῶνof theT-GPM προφητῶν.prophets.προφήτηςN-GPM 可8:29 ΚαὶAndκαίCONJ αὐτὸςHeαὐτόςP-NSM ἐπηρώταwas questioningἐπερωτάωV-IAI-3S αὐτούς·them‚αὐτόςP-APM ὙμεῖςYouσύP-2NP δὲhowever‚δέCONJ τίναwhomτίςI-ASM μεMeἐγώP-1AS λέγετεdo pronounceλέγωV-PAI-2P εἶναι;to be?εἰμίV-PAN ἈποκριθεὶςAnswering‚ἀποκρίνωV-AOP-NSM T-NSM ΠέτροςPeterΠέτροςN-NSM-P λέγειsaysλέγωV-PAI-3S αὐτῷ·to Him‚αὐτόςP-DSM ΣὺYouσύP-2NS εἶareεἰμίV-PAI-2S theT-NSM Χριστός.Christ.ΧριστόςN-NSM-T 可8:30 ΚαὶAndκαίCONJ ἐπετίμησενHe warnedἐπιτιμάωV-AAI-3S αὐτοῖςthemαὐτόςP-DPM ἵναthatἵναCONJ μηδενὶno oneμηδείςA-DSM λέγωσινthey should tellλέγωV-PAS-3P περὶconcerningπερίPREP αὐτοῦ.¶Him.αὐτόςP-GSM 可8:31 ΚαὶAndκαίCONJ ἤρξατοHe beganἄρχωV-ADI-3S διδάσκεινto teachδιδάσκωV-PAN αὐτοὺςthemαὐτόςP-APM ὅτιthatὅτιCONJ δεῖit is necessary forδέωV-PAI-3S τὸνtheT-ASM ΥἱὸνSonυἱόςN-ASM τοῦT-GSM ἀνθρώπουof ManἄνθρωποςN-GSM πολλὰmany thingsπολύςA-APN παθεῖνto suffer‚πάσχωV-2AAN καὶandκαίCONJ ἀποδοκιμασθῆναιto be rejectedἀποδοκιμάζωV-APN ὑπὸbyὑπόPREP τῶνtheT-GPM πρεσβυτέρωνeldersπρεσβύτεροςA-GPM καὶandκαίCONJ τῶνtheT-GPM ἀρχιερέωνchief priestsἀρχιερεύςN-GPM καὶandκαίCONJ τῶνtheT-GPM γραμματέωνscribes‚γραμματεύςN-GPM καὶandκαίCONJ ἀποκτανθῆναιto be killed‚ἀποκτείνωV-APN καὶandκαίCONJ μετὰafterμετάPREP τρεῖςthreeτρεῖς, τρίαA-APF ἡμέραςdaysἡμέραN-APF ἀναστῆναι·to rise [again].ἀνίστημιV-2AAN 可8:32 καὶAndκαίCONJ παρρησίᾳopenlyπαρρησίαN-DSF τὸνtheT-ASM λόγονwordλόγοςN-ASM ἐλάλει.He was speaking.λαλέωV-IAI-3S καὶAndκαίCONJ προσλαβόμενοςhaving taken HimπροσλαμβάνωV-2AMP-NSM T-NSM ΠέτροςPeterΠέτροςN-NSM-P αὐτὸνto him‚αὐτόςP-ASM ἤρξατοhe beganἄρχωV-ADI-3S ἐπιτιμᾶνto rebukeἐπιτιμάωV-PAN αὐτῷ.Him.αὐτόςP-DSM 可8:33 T-NSM δὲAndδέCONJ ἐπιστραφεὶςhaving turnedἐπιστρέφωV-2APP-NSM καὶandκαίCONJ ἰδὼνhaving looked uponεἴδωV-2AAP-NSM τοὺςtheT-APM μαθητὰςdisciplesμαθητήςN-APM αὐτοῦof Him‚αὐτόςP-GSM ἐπετίμησενHe rebukedἐπιτιμάωV-AAI-3S ΠέτρῳPeterΠέτροςN-DSM-P καὶandκαίCONJ λέγει·said‚λέγωV-PAI-3S ὝπαγεGetὑπάγωV-PAM-2S ὀπίσωbehindὀπίσωPREP μου‚Me‚ἐγώP-1GS Σατανᾶ‚Satan‚ΣατανᾶςN-VSM-T ὅτιforὅτιCONJ οὐnotοὐPRT-N φρονεῖςyou have in mindφρονέωV-PAI-2S τὰtheT-APN τοῦthingsT-GSM Θεοῦof God‚θεόςN-GSM ἀλλὰbutἀλλάCONJ τὰtheT-APN τῶνthingsT-GPM ἀνθρώπων.¶of men.ἄνθρωποςN-GPM + + + --- + +[Home Work ↵](HW/Home%20Work.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/HW/HW7.md b/HW/HW7.md new file mode 100644 index 0000000..60d18e9 --- /dev/null +++ b/HW/HW7.md @@ -0,0 +1,10 @@ +# 作業 #7 — Col 1:9–14 (6 節) + + + 西1:9 ΔιὰBecause ofδιάPREP τοῦτοthisοὗτοςD-ASN καὶalsoκαίCONJ ἡμεῖς‚weἐγώP-1NP ἀφ᾽fromἀπόPREP ἧςtheὅς, ἥR-GSF ἡμέραςdayἡμέραN-GSF ἠκούσαμεν‚we heard‚ἀκούωV-AAI-1P οὐnotοὐPRT-N παυόμεθαceaseπαύωV-PMI-1P ὑπὲρforὑπέρPREP ὑμῶνyouσύP-2GP προσευχόμενοιprayingπροσεύχομαιV-PNP-NPM καὶandκαίCONJ αἰτούμενοι‚askingαἰτέωV-PMP-NPM ἵναthatἵναCONJ πληρωθῆτεyou may be filled withπληρόωV-APS-2P τὴνtheT-ASF ἐπίγνωσινknowledgeἐπίγνωσιςN-ASF τοῦof theT-GSN θελήματοςwillθέλημαN-GSN αὐτοῦof HimαὐτόςP-GSM ἐνinἐνPREP πάσῃallπᾶςA-DSF σοφίᾳwisdomσοφίαN-DSF καὶandκαίCONJ συνέσειunderstandingσύνεσιςN-DSF πνευματικῇ‚spiritual‚πνευματικόςA-DSF 西1:10 περιπατῆσαιto walkπεριπατέωV-AAN ἀξίωςworthilyἀξίωςADV τοῦof theT-GSM ΚυρίουLord:κύριοςN-GSM εἰςinεἰςPREP πᾶσανallπᾶςA-ASF ἀρεσκείαν‚pleasing‚ἀρεσκείαN-ASF ἐνinἐνPREP παντὶeveryπᾶςA-DSN ἔργῳworkἔργονN-DSN ἀγαθῷgood‚ἀγαθόςA-DSN καρποφοροῦντεςbringing forth fruitκαρποφορέωV-PAP-NPM καὶandκαίCONJ αὐξανόμενοιgrowingαὐξάνωV-PPP-NPM τῇin theT-DSF ἐπιγνώσειknowledgeἐπίγνωσιςN-DSF τοῦT-GSM Θεοῦ‚of God‚θεόςN-GSM 西1:11 ἐνwithἐνPREP πάσῃallπᾶςA-DSF δυνάμειpowerδύναμιςN-DSF δυναμούμενοιbeing strengthenedδυναμόωV-PPP-NPM κατὰaccording toκατάPREP τὸtheT-ASN κράτοςmightκράτοςN-ASN τῆςT-GSF δόξηςgloriousδόξαN-GSF αὐτοῦof HimαὐτόςP-GSM εἰςuntoεἰςPREP πᾶσανallπᾶςA-ASF ὑπομονὴνenduranceὑπομονήN-ASF καὶandκαίCONJ μακροθυμίαν.¶patienceμακροθυμίαN-ASF μετὰwithμετάPREP χαρᾶςjoy‚χαράN-GSF 西1:12 εὐχαριστοῦντεςgiving thanksεὐχαριστέωV-PAP-NPM τῷto theT-DSM ΠατρὶFather‚πατήρN-DSM τῷthe [One]T-DSM ἱκανώσαντιhaving qualifiedἱκανόωV-AAP-DSM ὑμᾶςyouσύP-2AP εἰςforεἰςPREP τὴνtheT-ASF μερίδαshareμερίςN-ASF τοῦof theT-GSM κλήρουinheritanceκλῆροςN-GSM τῶνof theT-GPM ἁγίωνsaintsἅγιοςA-GPM ἐνinἐνPREP τῷtheT-DSN φωτί·light‚φῶςN-DSN 西1:13 ὃςwhoὅς, ἥR-NSM ἐρρύσατοhas deliveredῥύομαιV-ANI-3S ἡμᾶςusἐγώP-1AP ἐκfromἐκPREP τῆςtheT-GSF ἐξουσίαςdominionἐξουσίαN-GSF τοῦT-GSN σκότουςof darknessσκότοςN-GSN καὶandκαίCONJ μετέστησενtransferred [us]μεθίστημιV-AAI-3S εἰςintoεἰςPREP τὴνtheT-ASF βασιλείανkingdomβασιλείαN-ASF τοῦof theT-GSM ΥἱοῦSonυἱόςN-GSM τῆςT-GSF ἀγάπηςbelovedἀγάπηN-GSF αὐτοῦ‚of Him‚αὐτόςP-GSM 西1:14 ἐνinἐνPREP whomὅς, ἥR-DSM ἔχομενwe haveἔχωV-PAI-1P τὴνT-ASF ἀπολύτρωσιν‚redemption‚ἀπολύτρωσιςN-ASF τὴνtheT-ASF ἄφεσινforgivenessἄφεσιςN-ASF τῶνT-GPF ἁμαρτιῶν·of sins.ἁμαρτίαN-GPF + + + --- + +[Home Work ↵](HW/Home%20Work.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/HW/HW8.md b/HW/HW8.md new file mode 100644 index 0000000..0417d48 --- /dev/null +++ b/HW/HW8.md @@ -0,0 +1,10 @@ +# 作業 #8 — Mat 6:9–15 (7 節) + + + 太6:9 ΟὕτωςThusοὕτω, οὕτωςADV οὖνthereforeοὖνCONJ προσεύχεσθεprayπροσεύχομαιV-PNM-2P ὑμεῖς·you:σύP-2NP ΠάτερFatherπατήρN-VSM ἡμῶνof us‚ἐγώP-1GP who [is]T-VSM ἐνinἐνPREP τοῖςtheT-DPM οὐρανοῖς·heavens‚οὐρανόςN-DPM Ἁγιασθήτωhallowed beἁγιάζωV-APM-3S τὸtheT-NSN ὄνομάnameὄνομαN-NSN σου·of You.σύP-2GS 太6:10 ἘλθέτωComeἔρχομαιV-2AAM-3S theT-NSF βασιλείαkingdomβασιλείαN-NSF σου·of You;σύP-2GS Γενηθήτωbe doneγίνομαιV-AOM-3S τὸtheT-NSN θέλημάwillθέλημαN-NSN σου‚of You‚σύP-2GS ὩςasὡςCONJ ἐνinἐνPREP οὐρανῷheaven‚οὐρανόςN-DSM καὶ[so] alsoκαίCONJ ἐπὶuponἐπίPREP γῆς·earth.γῆN-GSF 太6:11 ΤὸνTheT-ASM ἄρτονbreadἄρτοςN-ASM ἡμῶνof usἐγώP-1GP τὸνT-ASM ἐπιούσιονdailyἐπιούσιοςA-ASM δὸςgrantδίδωμιV-2AAM-2S ἡμῖνusἐγώP-1DP σήμερον·today.σήμερονADV 太6:12 ΚαὶAndκαίCONJ ἄφεςforgiveἀφίημιV-2AAM-2S ἡμῖνusἐγώP-1DP τὰtheT-APN ὀφειλήματαdebtsὀφείλημαN-APN ἡμῶν‚of us‚ἐγώP-1GP ὩςasὡςCONJ καὶalsoκαίCONJ ἡμεῖςweἐγώP-1NP ἀφήκαμενforgiveἀφίημιV-AAI-1P τοῖςtheT-DPM ὀφειλέταιςdebtorsὀφειλέτηςN-DPM ἡμῶν·of us;ἐγώP-1GP 太6:13 ΚαὶAndκαίCONJ μὴnotμήPRT-N εἰσενέγκῃςleadεἰσφέρωV-2AAS-2S ἡμᾶςusἐγώP-1AP εἰςintoεἰςPREP πειρασμόν‚temptation‚πειρασμόςN-ASM ἈλλὰbutἀλλάCONJ ῥῦσαιdeliverῥύομαιV-ADM-2S ἡμᾶςusἐγώP-1AP ἀπὸfromἀπόPREP τοῦT-GSN πονηροῦ.¶evil.’πονηρόςA-GSN 太6:14 ἘὰνIfἐάνCONJ γὰρforγάρCONJ ἀφῆτεyou forgiveἀφίημιV-2AAS-2P τοῖςT-DPM ἀνθρώποιςmenἄνθρωποςN-DPM τὰtheT-APN παραπτώματαtrespassesπαράπτωμαN-APN αὐτῶν‚of them‚αὐτόςP-GPM ἀφήσειwill forgiveἀφίημιV-FAI-3S καὶalsoκαίCONJ ὑμῖνyouσύP-2DP theT-NSM ΠατὴρFatherπατήρN-NSM ὑμῶνof youσύP-2GP T-NSM οὐράνιος·Heavenly.οὐράνιοςA-NSM 太6:15 ἐὰνIfἐάνCONJ δὲhoweverδέCONJ μὴnotμήPRT-N ἀφῆτεyou forgiveἀφίημιV-2AAS-2P τοῖςT-DPM ἀνθρώποις‚men‚ἄνθρωποςN-DPM οὐδὲneitherοὐδέCONJ-N theT-NSM ΠατὴρFatherπατήρN-NSM ὑμῶνof youσύP-2GP ἀφήσειwill forgiveἀφίημιV-FAI-3S τὰtheT-APN παραπτώματαtrespassesπαράπτωμαN-APN ὑμῶν.¶of you.σύP-2GP + + + --- + +[Home Work ↵](HW/Home%20Work.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/HW/HW9.md b/HW/HW9.md new file mode 100644 index 0000000..24b79b2 --- /dev/null +++ b/HW/HW9.md @@ -0,0 +1,10 @@ +# 作業 #9 — Rom 3:21–26 (6 節) + + + 羅3:21 ΝυνὶNowνυνίADV δὲhowever‚δέCONJ χωρὶςapart fromχωρίςPREP νόμουlaw‚νόμοςN-GSM δικαιοσύνη[the] righteousnessδικαιοσύνηN-NSF Θεοῦof GodθεόςN-GSM πεφανέρωταιhas been revealed‚φανερόωV-RPI-3S μαρτυρουμένηbeing borne witness toμαρτυρέωV-PPP-NSF ὑπὸbyὑπόPREP τοῦtheT-GSM νόμουLawνόμοςN-GSM καὶandκαίCONJ τῶνtheT-GPM προφητῶν‚Prophets‚προφήτηςN-GPM 羅3:22 δικαιοσύνη[the] righteousnessδικαιοσύνηN-NSF δὲnowδέCONJ Θεοῦof GodθεόςN-GSM διὰthroughδιάPREP πίστεωςfaithπίστιςN-GSF Ἰησοῦfrom JesusἸησοῦςN-GSM-P ΧριστοῦChristΧριστόςN-GSM-T εἰςtowardεἰςPREP πάνταςallπᾶςA-APM τοὺςthoseT-APM πιστεύοντας.believing.πιστεύωV-PAP-APM οὐNotοὐPRT-N γάρforγάρCONJ ἐστινthere isεἰμίV-PAI-3S διαστολή‚distinction.διαστολήN-NSF 羅3:23 πάντεςAllπᾶςA-NPM γὰρforγάρCONJ ἥμαρτονhave sinnedἁμαρτάνωV-2AAI-3P καὶandκαίCONJ ὑστεροῦνταιfall shortὑστερέωV-PPI-3P τῆςof theT-GSF δόξηςgloryδόξαN-GSF τοῦT-GSM Θεοῦof God‚θεόςN-GSM 羅3:24 δικαιούμενοιbeing justifiedδικαιόωV-PPP-NPM δωρεὰνfreelyδωρεάνADV τῇby theT-DSF αὐτοῦof HimαὐτόςP-GSM χάριτιgraceχάριςN-DSF διὰthroughδιάPREP τῆςtheT-GSF ἀπολυτρώσεωςredemptionἀπολύτρωσιςN-GSF τῆςthatT-GSF ἐν[is] inἐνPREP ΧριστῷChristΧριστόςN-DSM-T Ἰησοῦ·Jesus‚ἸησοῦςN-DSM-P 羅3:25 ὃνwhomὅς, ἥR-ASM προέθετοset forth asπροτίθημιV-2AMI-3S T-NSM ΘεὸςGodθεόςN-NSM ἱλαστήριονa propitiation‚ἱλαστήριοςA-ASN διὰthroughδιάPREP τῆςT-GSF πίστεωςfaithπίστιςN-GSF ἐνinἐνPREP τῷT-DSN αὐτοῦHisαὐτόςP-GSM αἵματιblood‚αἷμαN-DSN εἰςforεἰςPREP ἔνδειξινa showing forthἔνδειξιςN-ASF τῆςof theT-GSF δικαιοσύνηςrighteousnessδικαιοσύνηN-GSF αὐτοῦof Him‚αὐτόςP-GSM διὰbecause ofδιάPREP τὴνtheT-ASF πάρεσινforbearanceπάρεσιςN-ASF τῶνof theT-GPN προγεγονότωνhaving taken place beforehandπρογίνομαιV-2RAP-GPN ἁμαρτημάτωνsins -ἁμάρτημαN-GPN 羅3:26 ἐνinἐνPREP τῇtheT-DSF ἀνοχῇforbearanceἀνοχήN-DSF τοῦT-GSM Θεοῦ‚of God;θεόςN-GSM πρὸςforπρόςPREP τὴνofT-ASF ἔνδειξιν[the] showing forthἔνδειξιςN-ASF τῆςtheT-GSF δικαιοσύνηςrighteousnessδικαιοσύνηN-GSF αὐτοῦof HimαὐτόςP-GSM ἐνinἐνPREP τῷtheT-DSM νῦνpresentνῦνADV καιρῷ‚time‚καιρόςN-DSM εἰςforεἰςPREP τὸT-ASN εἶναιto beεἰμίV-PAN αὐτὸνHimαὐτόςP-ASM δίκαιονjustδίκαιοςA-ASM καὶandκαίCONJ δικαιοῦνταjustifyingδικαιόωV-PAP-ASM τὸνthe [one]T-ASM ἐκofἐκPREP πίστεωςfaithπίστιςN-GSF Ἰησοῦ.¶of Jesus.ἸησοῦςN-GSM-P + + + --- + +[Home Work ↵](HW/Home%20Work.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/HW/Home Work.md b/HW/Home Work.md new file mode 100644 index 0000000..8b5d69e --- /dev/null +++ b/HW/Home Work.md @@ -0,0 +1,19 @@ +# 全民希臘文進階作業 (Home Work) + + +### 2021 中台 Greek III 規劃 +段落 | 經文 | 作業 |解答 +------|--------|------|------ +#1 | 1Jo 2:28–3:3 (5 節) | [HW1](HW1.md) | [HW1-解經大綱](HW1-%E8%A7%A3%E7%B6%93%E5%A4%A7%E7%B6%B1.md) +#2 | 1Jo 3:4–10 (7 節) |[HW2](HW2.md) | +#3 | Joh 15:1–8 (8 節) | [HW3](HW3.md) | +#4 | Joh 15:9–17 (9 節) | [HW4](HW4.md) | +#5 | Joh 15:18–25 (8 節) | [HW5](HW5.md) | +#6 | Mar 8:27–33 (7 節) | [HW6](HW6.md) | +#7 | Col 1:9–14 (6 節) | [HW7](HW7.md) | +#8 | Mat 6:9–15 (7 節) | [HW8](HW8.md) | +#9 | Rom 3:21–26 (6 節) | [HW9](HW9.md) | + + +--- +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/HW/Untitled.md b/HW/Untitled.md new file mode 100644 index 0000000..2ce6f99 --- /dev/null +++ b/HW/Untitled.md @@ -0,0 +1,49 @@ +- 2:28a ΚαὶAndCONJ (νῦν‚now‚ADV)A τεκνία‚little children‚N-VPN (μένετεabideV-PAM-2P[^1])P (ἐνinPREP αὐτῷ‚Him‚P-DSM)A + - 2:28b ἵναso thatCONJ + - 第三類條件句 + - 2:28c ἐὰνwhenCONJ (φανερωθῇ‚He appearsV-APS-3S)P + - 2:28d (σχῶμενwe might haveV-2AAS-1P)P (παρρησίανboldnessN-ASF)C + - 2:28e καὶandCONJ (μὴnotPRT-N)A1 (αἰσχυνθῶμενbe ashamedV-APS-1P)P (ἀπ᾽beforePREP αὐτοῦHimP-GSM)A2 (ἐνatPREP τῇtheT-DSF παρουσίᾳcomingN-DSF αὐτοῦ.of Him.P-GSM)A3 +- 第三類條件句 + - 2:29a ἘὰνIfCONJ (εἰδῆτεyou knowV-RAS-2P)P + - 2:29b ὅτιthatCONJ (δίκαιόςrighteousA-NSM)C (ἐστιν‚He is‚V-PAI-3S)P +- 2:29c (γινώσκετεyou knowV-PAI-2P)P + - 2:29d ὅτιthatCONJ + - 2:29e (καὶalsoCONJ)A1 (πᾶςeveryoneA-NSM T-NSM ποιῶνpracticingV-PAP-NSM τὴνT-ASF δικαιοσύνηνrighteousness‚N-ASF)S (ἐξofPREP αὐτοῦHimP-GSM)A2 (γεγέννηται.¶has been begotten.V-RPI-3S)P +- 3:1a ἼδετεBeholdV-2AAM-2P +- 3:1b (ποταπὴνwhatI-ASF ἀγάπηνloveN-ASF)C1 (δέδωκενhas givenV-RAI-3S)P (ἡμῖνto usP-1DP)C2 (theT-NSM Πατὴρ‚Father‚N-NSM)S + - 3:1c ἵναthatCONJ + - 3:1d (τέκναchildrenN-NPN Θεοῦof GodN-GSM)C (κληθῶμεν‚we should be called -V-APS-1P)P +- 3:1e καὶandCONJ (ἐσμέν.we are!V-PAI-1P)P +- 3:1f (διὰBecause ofPREP τοῦτοthis‚D-ASN)A (theT-NSM κόσμοςworldN-NSM)S (οὐnotPRT-N)A1 (γινώσκειknowsV-PAI-3S)P (ἡμᾶς‚us‚P-1AP)C + - 3:1g ὅτιbecauseCONJ + - 3:1h (οὐκnotPRT-N)A (ἔγνωit knewV-2AAI-3S)P (αὐτόν.Him.P-ASM)C +- 3:2a ἈγαπητοίBeloved‚A-VPM +- 3:2b (νῦνnowADV)A (τέκναchildrenN-NPN Θεοῦof GodN-GSM)C (ἐσμεν‚are we‚V-PAI-1P)P +- 3:2c καὶandCONJ (οὔπωnot yetADV)A (ἐφανερώθηhas been revealedV-API-3S)P { (τίwhatI-NSN)c (ἐσόμεθα.we will be.V-FDI-1P)p }S +- 3:2d (οἴδαμενWe knowV-RAI-1P)P + - 3:2e ὅτιthatCONJ + - 第三類條件句 + - 3:2f ἐὰνwhenCONJ φανερωθῇ‚He appears‚V-APS-3S + - 3:2g (ὅμοιοιlikeA-NPM αὐτῷHimP-DSM)C (ἐσόμεθα‚we will be‚V-FDI-1P)P + - 3:2h ὅτιforCONJ + - 3:2i (ὀψόμεθαwe will seeV-FDI-1P)P (αὐτὸν‚HimP-ASM)C + - 3:2j καθώςasCONJ (ἐστιν.He is.V-PAI-3S)P +- 3:3a καὶAndCONJ (πᾶςeveryoneA-NSM T-NSM ἔχωνhavingV-PAP-NSM τὴνtheT-ASF ἐλπίδαhopeN-ASF ταύτηνthisD-ASF)S (ἐπ᾽inPREP αὐτῷHim‚P-DSM)A (ἁγνίζειpurifiesV-PAI-3S)P (ἑαυτὸν‚himself‚F-3ASM)C + - 3:3b καθὼςjust asCONJ (ἐκεῖνοςHeD-NSM)S (ἁγνόςpureA-NSM)C (ἐστιν.¶is.V-PAI-3S)P + +[^1]: 現在式時態形式=非整體 (imperfective)、內部 (internal)、進展 ( + +## 解經 (Exegesis) + +## 重述 (Paraphrase) + +## 大綱 (Outline) + +## 小抄 (memo) + +## 手稿 (Manuscript) + + + + diff --git a/Mounce-BBG/Aspect and Prominence.md b/Mounce-BBG/Aspect and Prominence.md new file mode 100644 index 0000000..ce216bc --- /dev/null +++ b/Mounce-BBG/Aspect and Prominence.md @@ -0,0 +1,23 @@ + + +## Bibliography + + +Merkle, Benjamin L. "Response to Porter." _Bulletin for Biblical Research_ 26.1 (2016): 83–83. + +Porter, Stanley E. "What More Shall I Say?: A Response to Steve Runge and Benjamin Merkle." _Bulletin for Biblical Research_ 26.1 (2016): 75–79. + +Runge, Steven E. "Markedness: Contrasting Porter's Model with the Linguists Cited as Support." _Bulletin for Biblical Research_ 26.1 (2016): 43–56. + +———. "Response to Porter." _Bulletin for Biblical Research_ 26.1 (2016): 81–82. + +--- + +Porter, Stanley E. "A Multidisciplinary Approach to Exegesis." Pages 93–112 in _Linguistic Analysis of the Greek New Testament: Studies in Tools, Methods, and Practice_. Grand Rapids, MI: Baker Academic, 2015. + + +Barnard, Jody A. "Is Verbal Aspect a Prominence Indicator?: An Evaluation of Stanley Porter's Proposal with Special Reference to the Gospel of Luke." _Filología Neotestamentaria_ 19.37 (2006): 3–29. + +Naizer, Eric R. "Discourse Prominence in Matthew 20,1-16: Stanley Porter's Verbal Aspect Theory Applied." _Filología Neotestamentaria_ 22 (2009): 41–54. + +Porter, Stanley E. "Verbal Aspect and Discourse Function in Mark 16:1–8: Three Significant Instances." Pages 123–37 in _Studies in the Greek Bible: Essays in Honor of Francis T. Gignac, S.J._ Catholic Biblical Association of America, 2008. \ No newline at end of file diff --git a/Mounce-BBG/BBG.md b/Mounce-BBG/BBG.md new file mode 100644 index 0000000..e212a4d --- /dev/null +++ b/Mounce-BBG/BBG.md @@ -0,0 +1,13 @@ + +# 聖經希臘文基礎:作業 — 複習經文段落 + + + +複習 (經文範圍) | 節數 | 解答 +---|:---:|--- +[複習 2 (1Jo4.1–6)](%E8%A4%87%E7%BF%92%202%20(1Jo4.1%E2%80%936).md) | 6 |[複習 2 (1Jo4.1–6) 解答](%E8%A4%87%E7%BF%92%202%20(1Jo4.1%E2%80%936)%20%E8%A7%A3%E7%AD%94.md) +[複習 3 (1Jo 1.5–2.5)](%E8%A4%87%E7%BF%92%203%20(1Jo%201.5%E2%80%932.5).md) | 10 | [複習 3 (1Jo 1.5–2.5) 解答](%E8%A4%87%E7%BF%92%203%20(1Jo%201.5%E2%80%932.5)%20%E8%A7%A3%E7%AD%94.md) +[複習 4 (Joh 12.27–36)](%E8%A4%87%E7%BF%92%204%20(Joh%2012.27%E2%80%9336).md) | 10 |[複習 4 (Joh 12.27–36) 解答](%E8%A4%87%E7%BF%92%204%20(Joh%2012.27%E2%80%9336)%20%E8%A7%A3%E7%AD%94.md) +[複習 5 (Joh 9.18–34)](%E8%A4%87%E7%BF%92%205%20(Joh%209.18%E2%80%9334).md) | 17 | [複習 5 (Joh 9.18–34) 解答](%E8%A4%87%E7%BF%92%205%20(Joh%209.18%E2%80%9334)%20%E8%A7%A3%E7%AD%94.md) +[複習 6 (Mar 1.1–22)](%E8%A4%87%E7%BF%92%206%20(Mar%201.1%E2%80%9322).md) | 22 | [複習 6 (Mar 1.1–22) 解答](%E8%A4%87%E7%BF%92%206%20(Mar%201.1%E2%80%9322)%20%E8%A7%A3%E7%AD%94.md) +[複習 7 (Mat 13.1–23)](%E8%A4%87%E7%BF%92%207%20(Mat%2013.1%E2%80%9323).md) | 23 | [複習 7 (Mat 13.1–23) 解答](%E8%A4%87%E7%BF%92%207%20(Mat%2013.1%E2%80%9323)%20%E8%A7%A3%E7%AD%94.md) \ No newline at end of file diff --git a/Mounce-BBG/複習 2 (1Jo4.1–6) 解答.md b/Mounce-BBG/複習 2 (1Jo4.1–6) 解答.md new file mode 100644 index 0000000..60dec68 --- /dev/null +++ b/Mounce-BBG/複習 2 (1Jo4.1–6) 解答.md @@ -0,0 +1,68 @@ +# 複習 #2 — 約壹 4:1–6 (6節) + +## 圖析 + +- 1a Ἀγαπητοί‚Beloved‚ἀγαπητόςA-VPM (μὴnotμήPRT-N)A (παντὶeveryπᾶςA-DSN πνεύματιspiritπνεῦμαN-DSN)C (πιστεύετεbelieve‚πιστεύωV-PAM-2P)P +- 1b ἀλλὰbutἀλλάCONJ (δοκιμάζετεtestδοκιμάζωV-PAM-2P)P (τὰtheT-APN πνεύματαspirits‚πνεῦμαN-APN)C + - 1c εἰwhetherεἰPRT (ἐκofἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM)A (ἐστιν‚they are‚εἰμίV-PAI-3S)P + - 1d ὅτιbecauseὅτιCONJ (πολλοὶmanyπολύςA-NPM ψευδοπροφῆταιfalse prophetsψευδοπροφήτηςN-NPM)S (ἐξεληλύθασινhave gone outἐξέρχομαιV-2RAI-3P)P (εἰςintoεἰςPREP τὸνtheT-ASM κόσμον.world.κόσμοςN-ASM)A +- 2a (ἘνByἐνPREP τούτῳthisοὗτοςD-DSN)A (γινώσκετεyou knowγινώσκωV-PAI-2P)P (τὸtheT-ASN ΠνεῦμαSpiritπνεῦμαN-ASN τοῦT-GSM Θεοῦ·of God:θεόςN-GSM)C + - 2b (πᾶνEveryπᾶςA-NSN πνεῦμαspiritπνεῦμαN-NSN <¹...¹> )S (ἐκofἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM)A (ἐστιν‚is;εἰμίV-PAI-3S)P + - <¹ (thatὅς, ἥR-NSN)s (ὁμολογεῖconfessesὁμολογέωV-PAI-3S)p (ἸησοῦνJesusἸησοῦςN-ASM-P ΧριστὸνChristΧριστόςN-ASM-T)c1 (ἐνinἐνPREP σαρκὶ[the] fleshσάρξN-DSF ἐληλυθόταhaving come‚ἔρχομαιV-2RAP-ASM)c2 ¹> + - 3a καὶandκαίCONJ (πᾶνanyπᾶςA-NSN πνεῦμαspiritπνεῦμαN-NSN <²...²> )S (ἐκfromἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM)A1 (οὐκnotοὐPRT-N)A2 (ἔστιν·is.εἰμίV-PAI-3S)P + - <² (thatὅς, ἥR-NSN)s (μὴnotμήPRT-N)a (ὁμολογεῖconfessesὁμολογέωV-PAI-3S)p (τὸνT-ASM ἸησοῦνJesus‚ἸησοῦςN-ASM-P)c ²> + - 3b καὶAndκαίCONJ (τοῦτόthisοὗτοςD-NSN)S (ἐστινisεἰμίV-PAI-3S)P (τὸthatT-NSN τοῦof theT-GSM ἀντιχρίστουantichrist‚ἀντίχριστοςN-GSM)C + - 3c (whichὅς, ἥR-ASN)C (ἀκηκόατεyou heardἀκούωV-2RAI-2P)P + - 3d ὅτιthatὅτιCONJ (ἔρχεται‚is coming‚ἔρχομαιV-PNI-3S)P + - 3e καὶandκαίCONJ (νῦνnowνῦνADV)A1 (ἐνinἐνPREP τῷtheT-DSM κόσμῳworldκόσμοςN-DSM)A2 (ἐστὶνisεἰμίV-PAI-3S)P (ἤδη.¶already.ἤδηADV)A3 + - 4a (ὙμεῖςYouσύP-2NP)S (ἐκfromἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM)A (ἐστε‚are‚εἰμίV-PAI-2P)P τεκνία‚little children‚τεκνίονN-VPN + - 4b καὶandκαίCONJ (νενικήκατεhave overcomeνικάωV-RAI-2P)P (αὐτούς‚them‚αὐτόςP-APM)C + - 4c ὅτιbecauseὅτιCONJ (μείζωνgreaterμέγαςA-NSM-C)C (ἐστὶνisεἰμίV-PAI-3S)P (the [One]T-NSM ἐνinἐνPREP ὑμῖνyouσύP-2DP)S + - 4d thanCONJ (the [one]T-NSM ἐνinἐνPREP τῷtheT-DSM κόσμῳ.world.κόσμοςN-DSM +- 5a (αὐτοὶTheyαὐτόςP-NPM)S (ἐκofἐκPREP τοῦtheT-GSM κόσμουworldκόσμοςN-GSM)A (εἰσίν‚are;εἰμίV-PAI-3P)P + - 5b (διὰbecause ofδιάPREP τοῦτοthisοὗτοςD-ASN)A1 (ἐκfrom outἐκPREP τοῦof theT-GSM κόσμουworldκόσμοςN-GSM)A2 (λαλοῦσινthey speak‚λαλέωV-PAI-3P)P + - 5c καὶandκαίCONJ (theT-NSM κόσμοςworldκόσμοςN-NSM)S (αὐτῶνthemαὐτόςP-GPM)C (ἀκούει.listens to.ἀκούωV-PAI-3S)P + - 6a (ἡμεῖςWeἐγώP-1NP)S (ἐκofἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM)A (ἐσμεν·are.εἰμίV-PAI-1P)P + - 6b (The [one]T-NSM γινώσκωνknowingγινώσκωV-PAP-NSM τὸνT-ASM ΘεὸνGodθεόςN-ASM)S (ἀκούειlistens toἀκούωV-PAI-3S)P (ἡμῶν·us.ἐγώP-1GP)C + - 6c (ὃςHe whoὅς, ἥR-NSM οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐκfromἐκPREP τοῦT-GSM ΘεοῦGod‚θεόςN-GSM)S (οὐκnotοὐPRT-N)A (ἀκούειlistens toἀκούωV-PAI-3S)P (ἡμῶν.us.ἐγώP-1GP)C + - 6d (ἐκByἐκPREP τούτουthisοὗτοςD-GSN)A (γινώσκομενwe knowγινώσκωV-PAI-1P)P (τὸtheT-ASN πνεῦμαSpiritπνεῦμαN-ASN τῆςT-GSF ἀληθείαςof truthἀλήθειαN-GSF)C1 καὶandκαίCONJ (τὸtheT-ASN πνεῦμαspiritπνεῦμαN-ASN τῆςT-GSF πλάνης.¶of falsehood.πλάνηN-GSF)C2 + +
+ + ## 大綱 + + ### 大綱 #1 + - **題目:小心,不怕!** + - 只要小心 (1Jo 4:1-3) + - 消極面:不可都信 (1Jo 4:1a) + - 積極面:要凡是查驗 (1Jo 4:1b-d) + - 查驗的標準:耶穌基督的道成肉身 (1Jo 4:2-3) +- 就不害怕 (1Jo 4:4-6) + - 不要害怕敵基督,因為你們必然得勝 (1Jo 4:4) + - 不要害怕世人,因為我們不必討好所有人 (1Jo 4:5-6) + +### 大綱 #2 : +- 【說明】4:2a、4:6d 的兩個動詞 γινώσκω 首尾呼應,進而形成下面的交叉平行結構。 +- **題目:分辨諸靈** +- 分辨是每個信徒的責任 (1Jo 4:1) +- 分辨的依據 (1Jo 4:2-6) + - 你們知道如何分辨 (1Jo 4:2a) + - 出於神的靈 vs. 敵基督的靈 (1Jo 4:2b-3) + - ==出於神的必定得勝 (1Jo 4:4)== + - 出於神的人 vs. 出於世界的人(1Jo 4:5-6c) + - 我們知道如何分辨 (1Jo 4:6d) + +### 大綱 #3 : +- 【說明】用動詞的人稱當作分段標記。 +- **題目:你們、他們、我們** +- 你們 (1Jo 4:1-4) +- 他們 (1Jo 4:5) +- 我們 (1Jo 4:6) + +### 大綱 #4 +- 【出處】Herbert W Bateman, *John's Letters: An Exegetical Guide for Preaching and Teaching* (Grand Rapids, MI.: Kregel Academic, 2018), 228. +- Discernment Is Expected of Followers of Jesus (vv. 1-3) + - Complacency is not an option (v. 1) + - Teachings are to be compared (vv. 2-3) +- Affirmation Exists for Followers of Jesus (vv. 4-6) + diff --git a/Mounce-BBG/複習 2 (1Jo4.1–6).md b/Mounce-BBG/複習 2 (1Jo4.1–6).md new file mode 100644 index 0000000..6330d44 --- /dev/null +++ b/Mounce-BBG/複習 2 (1Jo4.1–6).md @@ -0,0 +1,4 @@ +# 複習 #2 — 約一 4:1–6 (6節) + + 約壹4:1 Ἀγαπητοί‚Beloved‚ἀγαπητόςA-VPM μὴnotμήPRT-N παντὶeveryπᾶςA-DSN πνεύματιspiritπνεῦμαN-DSN πιστεύετεbelieve‚πιστεύωV-PAM-2P ἀλλὰbutἀλλάCONJ δοκιμάζετεtestδοκιμάζωV-PAM-2P τὰtheT-APN πνεύματαspirits‚πνεῦμαN-APN εἰwhetherεἰPRT ἐκofἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM ἐστιν‚they are‚εἰμίV-PAI-3S ὅτιbecauseὅτιCONJ πολλοὶmanyπολύςA-NPM ψευδοπροφῆταιfalse prophetsψευδοπροφήτηςN-NPM ἐξεληλύθασινhave gone outἐξέρχομαιV-2RAI-3P εἰςintoεἰςPREP τὸνtheT-ASM κόσμον.world.κόσμοςN-ASM 約壹4:2 ἘνByἐνPREP τούτῳthisοὗτοςD-DSN γινώσκετεyou knowγινώσκωV-PAI-2P τὸtheT-ASN ΠνεῦμαSpiritπνεῦμαN-ASN τοῦT-GSM Θεοῦ·of God:θεόςN-GSM πᾶνEveryπᾶςA-NSN πνεῦμαspiritπνεῦμαN-NSN thatὅς, ἥR-NSN ὁμολογεῖconfessesὁμολογέωV-PAI-3S ἸησοῦνJesusἸησοῦςN-ASM-P ΧριστὸνChristΧριστόςN-ASM-T ἐνinἐνPREP σαρκὶ[the] fleshσάρξN-DSF ἐληλυθόταhaving come‚ἔρχομαιV-2RAP-ASM ἐκofἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM ἐστιν‚is;εἰμίV-PAI-3S 約壹4:3 καὶandκαίCONJ πᾶνanyπᾶςA-NSN πνεῦμαspiritπνεῦμαN-NSN thatὅς, ἥR-NSN μὴnotμήPRT-N ὁμολογεῖconfessesὁμολογέωV-PAI-3S τὸνT-ASM ἸησοῦνJesus‚ἸησοῦςN-ASM-P ἐκfromἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM οὐκnotοὐPRT-N ἔστιν·is.εἰμίV-PAI-3S καὶAndκαίCONJ τοῦτόthisοὗτοςD-NSN ἐστινisεἰμίV-PAI-3S τὸthatT-NSN τοῦof theT-GSM ἀντιχρίστουantichrist‚ἀντίχριστοςN-GSM whichὅς, ἥR-ASN ἀκηκόατεyou heardἀκούωV-2RAI-2P ὅτιthatὅτιCONJ ἔρχεται‚is coming‚ἔρχομαιV-PNI-3S καὶandκαίCONJ νῦνnowνῦνADV ἐνinἐνPREP τῷtheT-DSM κόσμῳworldκόσμοςN-DSM ἐστὶνisεἰμίV-PAI-3S ἤδη.¶already.ἤδηADV 約壹4:4 ὙμεῖςYouσύP-2NP ἐκfromἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM ἐστε‚are‚εἰμίV-PAI-2P τεκνία‚little children‚τεκνίονN-VPN καὶandκαίCONJ νενικήκατεhave overcomeνικάωV-RAI-2P αὐτούς‚them‚αὐτόςP-APM ὅτιbecauseὅτιCONJ μείζωνgreaterμέγαςA-NSM-C ἐστὶνisεἰμίV-PAI-3S the [One]T-NSM ἐνinἐνPREP ὑμῖνyouσύP-2DP thanCONJ the [one]T-NSM ἐνinἐνPREP τῷtheT-DSM κόσμῳ.world.κόσμοςN-DSM 約壹4:5 αὐτοὶTheyαὐτόςP-NPM ἐκofἐκPREP τοῦtheT-GSM κόσμουworldκόσμοςN-GSM εἰσίν‚are;εἰμίV-PAI-3P διὰbecause ofδιάPREP τοῦτοthisοὗτοςD-ASN ἐκfrom outἐκPREP τοῦof theT-GSM κόσμουworldκόσμοςN-GSM λαλοῦσινthey speak‚λαλέωV-PAI-3P καὶandκαίCONJ theT-NSM κόσμοςworldκόσμοςN-NSM αὐτῶνthemαὐτόςP-GPM ἀκούει.listens to.ἀκούωV-PAI-3S + 約壹4:6 ἡμεῖςWeἐγώP-1NP ἐκofἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM ἐσμεν·are.εἰμίV-PAI-1P The [one]T-NSM γινώσκωνknowingγινώσκωV-PAP-NSM τὸνT-ASM ΘεὸνGodθεόςN-ASM ἀκούειlistens toἀκούωV-PAI-3S ἡμῶν·us.ἐγώP-1GP ὃςHe whoὅς, ἥR-NSM οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐκfromἐκPREP τοῦT-GSM ΘεοῦGod‚θεόςN-GSM οὐκnotοὐPRT-N ἀκούειlistens toἀκούωV-PAI-3S ἡμῶν.us.ἐγώP-1GP ἐκByἐκPREP τούτουthisοὗτοςD-GSN γινώσκομενwe knowγινώσκωV-PAI-1P τὸtheT-ASN πνεῦμαSpiritπνεῦμαN-ASN τῆςT-GSF ἀληθείαςof truthἀλήθειαN-GSF καὶandκαίCONJ τὸtheT-ASN πνεῦμαspiritπνεῦμαN-ASN τῆςT-GSF πλάνης.¶of falsehood.πλάνηN-GSF \ No newline at end of file diff --git a/Mounce-BBG/複習 3 (1Jo 1.5–2.5) 解答.md b/Mounce-BBG/複習 3 (1Jo 1.5–2.5) 解答.md new file mode 100644 index 0000000..e7ed874 --- /dev/null +++ b/Mounce-BBG/複習 3 (1Jo 1.5–2.5) 解答.md @@ -0,0 +1,34 @@ +# 複習 #3 — 約一 1:5–2:5 (10 節) + +## 圖析 + +### 約壹 1:5–10 +- 約壹1:5 ΚαὶAndκαίCONJ ἔστινisεἰμίV-PAI-3S αὕτηthisοὗτοςD-NSF theT-NSF ἀγγελίαmessageἀγγελίαN-NSF ἣνthatὅς, ἥR-ASF ἀκηκόαμενwe have heardἀκούωV-2RAI-1P ἀπ᾽fromἀπόPREP αὐτοῦHim‚αὐτόςP-GSM καὶandκαίCONJ ἀναγγέλλομενwe preachἀναγγέλλωV-PAI-1P ὑμῖν‚to you‚σύP-2DP ὅτιthatὅτιADV T-NSM ΘεὸςGodθεόςN-NSM φῶςlightφῶςN-NSN ἐστινis‚εἰμίV-PAI-3S καὶandκαίCONJ σκοτίαdarknessσκοτίαN-NSF ἐνinἐνPREP αὐτῷHim‚αὐτόςP-DSM οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S οὐδεμία.none.οὐδείςA-NSF +- 約壹1:6 ἘὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ κοινωνίανfellowshipκοινωνίαN-ASF ἔχομενwe haveἔχωV-PAI-1P μετ᾽withμετάPREP αὐτοῦHim‚αὐτόςP-GSM καὶand yetκαίCONJ ἐνinἐνPREP τῷtheT-DSN σκότειdarknessσκότοςN-DSN περιπατῶμεν‚should walk‚περιπατέωV-PAS-1P ψευδόμεθαwe lieψεύδομαιV-PNI-1P καὶandκαίCONJ οὐnotοὐPRT-N ποιοῦμενdo practiceποιέωV-PAI-1P τὴνtheT-ASF ἀλήθειαν·truth.ἀλήθειαN-ASF +- 約壹1:7 ἐὰνIfἐάνCONJ ἐνinἐνPREP τῷtheT-DSN φωτὶlightφῶςN-DSN περιπατῶμεν‚we should walkπεριπατέωV-PAS-1P ὡςasὡςCONJ αὐτόςHeαὐτόςP-NSM ἐστινisεἰμίV-PAI-3S ἐνinἐνPREP τῷtheT-DSN φωτί‚light‚φῶςN-DSN κοινωνίανfellowshipκοινωνίαN-ASF ἔχομενwe haveἔχωV-PAI-1P μετ᾽withμετάPREP ἀλλήλων‚one another‚ἀλλήλωνC-GPM καὶandκαίCONJ τὸtheT-NSN αἷμαbloodαἷμαN-NSN Ἰησοῦof Jesus‚ἸησοῦςN-GSM-P τοῦtheT-GSM ΥἱοῦSonυἱόςN-GSM αὐτοῦof Him‚αὐτόςP-GSM καθαρίζειcleansesκαθαρίζωV-PAI-3S ἡμᾶςusἐγώP-1AP ἀπὸfromἀπόPREP πάσηςallπᾶςA-GSF ἁμαρτίας.sin.ἁμαρτίαN-GSF +- 約壹1:8 ἘὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ ἁμαρτίανsinἁμαρτίαN-ASF οὐκnotοὐPRT-N ἔχομεν‚we have‚ἔχωV-PAI-1P ἑαυτοὺςourselvesἑαυτοῦF-1APM πλανῶμενwe deceive‚πλανάωV-PAI-1P καὶandκαίCONJ theT-NSF ἀλήθειαtruthἀλήθειαN-NSF οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐνinἐνPREP ἡμῖν.us.ἐγώP-1DP +- 約壹1:9 ἐὰνIfἐάνCONJ ὁμολογῶμενwe should confessὁμολογέωV-PAS-1P τὰςtheT-APF ἁμαρτίαςsinsἁμαρτίαN-APF ἡμῶν‚of us‚ἐγώP-1GP πιστόςfaithfulπιστόςA-NSM ἐστινHe isεἰμίV-PAI-3S καὶandκαίCONJ δίκαιος‚just‚δίκαιοςA-NSM ἵναthatἵναCONJ ἀφῇHe may forgiveἀφίημιV-2AAS-3S ἡμῖνusἐγώP-1DP τὰς[our]T-APF ἁμαρτίαςsins‚ἁμαρτίαN-APF καὶandκαίCONJ καθαρίσῃmight cleanseκαθαρίζωV-AAS-3S ἡμᾶςusἐγώP-1AP ἀπὸfromἀπόPREP πάσηςallπᾶςA-GSF ἀδικίας.unrighteousness.ἀδικίαN-GSF +- 約壹1:10 ἐὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ οὐχnotοὐPRT-N ἡμαρτήκαμεν‚we have sinned‚ἁμαρτάνωV-RAI-1P ψεύστηνa liarψεύστηςN-ASM ποιοῦμενwe makeποιέωV-PAI-1P αὐτὸν‚Him‚αὐτόςP-ASM καὶandκαίCONJ theT-NSM λόγοςwordλόγοςN-NSM αὐτοῦof HimαὐτόςP-GSM οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐνinἐνPREP ἡμῖν.¶us.ἐγώP-1DP + + +### 約壹 2:1–5 + + - 約壹2:1 ΤεκνίαLittle childrenτεκνίονN-VPN μου‚of me‚ἐγώP-1GS ταῦταthese thingsοὗτοςD-APN γράφωI am writingγράφωV-PAI-1S ὑμῖνto youσύP-2DP ἵναso thatἵναCONJ μὴnotμήPRT-N ἁμάρτητε.you might sin.ἁμαρτάνωV-2AAS-2P καὶAndκαίCONJ ἐάνifἐάνCONJ τιςanyoneτιςX-NSM ἁμάρτῃ‚should sin‚ἁμαρτάνωV-2AAS-3S Παράκλητονan advocateπαράκλητοςN-ASM ἔχομενwe haveἔχωV-PAI-1P πρὸςwithπρόςPREP τὸνtheT-ASM ΠατέραFather‚πατήρN-ASM ἸησοῦνJesusἸησοῦςN-ASM-P ΧριστὸνChristΧριστόςN-ASM-T δίκαιον·[the] Righteous [One].δίκαιοςA-ASM + - 約壹2:2 καὶAndκαίCONJ αὐτὸςHeαὐτόςP-NSM ἱλασμός[the] propitiationἱλασμόςN-NSM ἐστινisεἰμίV-PAI-3S περὶforπερίPREP τῶνtheT-GPF ἁμαρτιῶνsinsἁμαρτίαN-GPF ἡμῶν‚of us;ἐγώP-1GP οὐnotοὐPRT-N περὶforπερίPREP τῶνtheT-GPF ἡμετέρωνof oursἡμέτεροςS-1PGPF δὲandδέCONJ μόνονonly‚μόνοςA-ASN ἀλλὰbutἀλλάCONJ καὶalsoκαίCONJ περὶforπερίPREP ὅλουallὅλοςA-GSM τοῦtheT-GSM κόσμου.¶world.κόσμοςN-GSM + - 約壹2:3 ΚαὶAndκαίCONJ ἐνbyἐνPREP τούτῳthisοὗτοςD-DSN γινώσκομενwe knowγινώσκωV-PAI-1P ὅτιthatὅτιCONJ ἐγνώκαμενwe have come to knowγινώσκωV-RAI-1P αὐτόν‚Him‚αὐτόςP-ASM ἐὰνifἐάνCONJ τὰςtheT-APF ἐντολὰςcommandmentsἐντολήN-APF αὐτοῦof HimαὐτόςP-GSM τηρῶμεν.we should keep.τηρέωV-PAS-1P + - 約壹2:4 The [one]T-NSM λέγωνsayingλέγωV-PAP-NSM ὅτι‑‚ὅτιCONJ ἜγνωκαI have knownγινώσκωV-RAI-1S αὐτόνHim‚αὐτόςP-ASM καὶandκαίCONJ τὰςtheT-APF ἐντολὰςcommandmentsἐντολήN-APF αὐτοῦof HimαὐτόςP-GSM μὴnotμήPRT-N τηρῶνkeeping‚τηρέωV-PAP-NSM ψεύστηςa liarψεύστηςN-NSM ἐστίν‚he is‚εἰμίV-PAI-3S καὶandκαίCONJ ἐνinἐνPREP τούτῳhimοὗτοςD-DSM theT-NSF ἀλήθειαtruthἀλήθειαN-NSF οὐκnotοὐPRT-N ἔστιν·is.εἰμίV-PAI-3S + - 約壹2:5 ὃςWhoeverὅς, ἥR-NSM δ᾽howeverδέCONJ ἂνἄνPRT τηρῇmay keepτηρέωV-PAS-3S αὐτοῦHisαὐτόςP-GSM τὸνT-ASM λόγον‚word‚λόγοςN-ASM ἀληθῶςtrulyἀληθῶςADV ἐνinἐνPREP τούτῳhimοὗτοςD-DSM theT-NSF ἀγάπηloveἀγάπηN-NSF τοῦT-GSM Θεοῦof GodθεόςN-GSM τετελείωται·has been perfected.τελειόωV-RPI-3S ἘνByἐνPREP τούτῳthisοὗτοςD-DSN γινώσκομενwe knowγινώσκωV-PAI-1P ὅτιthatὅτιCONJ ἐνinἐνPREP αὐτῷHimαὐτόςP-DSM ἐσμεν.we are:εἰμίV-PAI-1P + +
+ + ## 解經講道大綱 + + ### 大綱 #1 + + + + + --- + +[BBG ↵ ](BBG.md) +[全民希臘文進階筆記 ↵ ](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/Mounce-BBG/複習 3 (1Jo 1.5–2.5).md b/Mounce-BBG/複習 3 (1Jo 1.5–2.5).md new file mode 100644 index 0000000..0455ea4 --- /dev/null +++ b/Mounce-BBG/複習 3 (1Jo 1.5–2.5).md @@ -0,0 +1,4 @@ +# 複習 #3 — 約一 1:5–2:5 (10 節) + + 約壹1:5 ΚαὶAndκαίCONJ ἔστινisεἰμίV-PAI-3S αὕτηthisοὗτοςD-NSF theT-NSF ἀγγελίαmessageἀγγελίαN-NSF ἣνthatὅς, ἥR-ASF ἀκηκόαμενwe have heardἀκούωV-2RAI-1P ἀπ᾽fromἀπόPREP αὐτοῦHim‚αὐτόςP-GSM καὶandκαίCONJ ἀναγγέλλομενwe preachἀναγγέλλωV-PAI-1P ὑμῖν‚to you‚σύP-2DP ὅτιthatὅτιADV T-NSM ΘεὸςGodθεόςN-NSM φῶςlightφῶςN-NSN ἐστινis‚εἰμίV-PAI-3S καὶandκαίCONJ σκοτίαdarknessσκοτίαN-NSF ἐνinἐνPREP αὐτῷHim‚αὐτόςP-DSM οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S οὐδεμία.none.οὐδείςA-NSF 約壹1:6 ἘὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ κοινωνίανfellowshipκοινωνίαN-ASF ἔχομενwe haveἔχωV-PAI-1P μετ᾽withμετάPREP αὐτοῦHim‚αὐτόςP-GSM καὶand yetκαίCONJ ἐνinἐνPREP τῷtheT-DSN σκότειdarknessσκότοςN-DSN περιπατῶμεν‚should walk‚περιπατέωV-PAS-1P ψευδόμεθαwe lieψεύδομαιV-PNI-1P καὶandκαίCONJ οὐnotοὐPRT-N ποιοῦμενdo practiceποιέωV-PAI-1P τὴνtheT-ASF ἀλήθειαν·truth.ἀλήθειαN-ASF 約壹1:7 ἐὰνIfἐάνCONJ ἐνinἐνPREP τῷtheT-DSN φωτὶlightφῶςN-DSN περιπατῶμεν‚we should walkπεριπατέωV-PAS-1P ὡςasὡςCONJ αὐτόςHeαὐτόςP-NSM ἐστινisεἰμίV-PAI-3S ἐνinἐνPREP τῷtheT-DSN φωτί‚light‚φῶςN-DSN κοινωνίανfellowshipκοινωνίαN-ASF ἔχομενwe haveἔχωV-PAI-1P μετ᾽withμετάPREP ἀλλήλων‚one another‚ἀλλήλωνC-GPM καὶandκαίCONJ τὸtheT-NSN αἷμαbloodαἷμαN-NSN Ἰησοῦof Jesus‚ἸησοῦςN-GSM-P τοῦtheT-GSM ΥἱοῦSonυἱόςN-GSM αὐτοῦof Him‚αὐτόςP-GSM καθαρίζειcleansesκαθαρίζωV-PAI-3S ἡμᾶςusἐγώP-1AP ἀπὸfromἀπόPREP πάσηςallπᾶςA-GSF ἁμαρτίας.sin.ἁμαρτίαN-GSF 約壹1:8 ἘὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ ἁμαρτίανsinἁμαρτίαN-ASF οὐκnotοὐPRT-N ἔχομεν‚we have‚ἔχωV-PAI-1P ἑαυτοὺςourselvesἑαυτοῦF-1APM πλανῶμενwe deceive‚πλανάωV-PAI-1P καὶandκαίCONJ theT-NSF ἀλήθειαtruthἀλήθειαN-NSF οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐνinἐνPREP ἡμῖν.us.ἐγώP-1DP 約壹1:9 ἐὰνIfἐάνCONJ ὁμολογῶμενwe should confessὁμολογέωV-PAS-1P τὰςtheT-APF ἁμαρτίαςsinsἁμαρτίαN-APF ἡμῶν‚of us‚ἐγώP-1GP πιστόςfaithfulπιστόςA-NSM ἐστινHe isεἰμίV-PAI-3S καὶandκαίCONJ δίκαιος‚just‚δίκαιοςA-NSM ἵναthatἵναCONJ ἀφῇHe may forgiveἀφίημιV-2AAS-3S ἡμῖνusἐγώP-1DP τὰς[our]T-APF ἁμαρτίαςsins‚ἁμαρτίαN-APF καὶandκαίCONJ καθαρίσῃmight cleanseκαθαρίζωV-AAS-3S ἡμᾶςusἐγώP-1AP ἀπὸfromἀπόPREP πάσηςallπᾶςA-GSF ἀδικίας.unrighteousness.ἀδικίαN-GSF + 約壹1:10 ἐὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ οὐχnotοὐPRT-N ἡμαρτήκαμεν‚we have sinned‚ἁμαρτάνωV-RAI-1P ψεύστηνa liarψεύστηςN-ASM ποιοῦμενwe makeποιέωV-PAI-1P αὐτὸν‚Him‚αὐτόςP-ASM καὶandκαίCONJ theT-NSM λόγοςwordλόγοςN-NSM αὐτοῦof HimαὐτόςP-GSM οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐνinἐνPREP ἡμῖν.¶us.ἐγώP-1DP 約壹2:1 ΤεκνίαLittle childrenτεκνίονN-VPN μου‚of me‚ἐγώP-1GS ταῦταthese thingsοὗτοςD-APN γράφωI am writingγράφωV-PAI-1S ὑμῖνto youσύP-2DP ἵναso thatἵναCONJ μὴnotμήPRT-N ἁμάρτητε.you might sin.ἁμαρτάνωV-2AAS-2P καὶAndκαίCONJ ἐάνifἐάνCONJ τιςanyoneτιςX-NSM ἁμάρτῃ‚should sin‚ἁμαρτάνωV-2AAS-3S Παράκλητονan advocateπαράκλητοςN-ASM ἔχομενwe haveἔχωV-PAI-1P πρὸςwithπρόςPREP τὸνtheT-ASM ΠατέραFather‚πατήρN-ASM ἸησοῦνJesusἸησοῦςN-ASM-P ΧριστὸνChristΧριστόςN-ASM-T δίκαιον·[the] Righteous [One].δίκαιοςA-ASM 約壹2:2 καὶAndκαίCONJ αὐτὸςHeαὐτόςP-NSM ἱλασμός[the] propitiationἱλασμόςN-NSM ἐστινisεἰμίV-PAI-3S περὶforπερίPREP τῶνtheT-GPF ἁμαρτιῶνsinsἁμαρτίαN-GPF ἡμῶν‚of us;ἐγώP-1GP οὐnotοὐPRT-N περὶforπερίPREP τῶνtheT-GPF ἡμετέρωνof oursἡμέτεροςS-1PGPF δὲandδέCONJ μόνονonly‚μόνοςA-ASN ἀλλὰbutἀλλάCONJ καὶalsoκαίCONJ περὶforπερίPREP ὅλουallὅλοςA-GSM τοῦtheT-GSM κόσμου.¶world.κόσμοςN-GSM 約壹2:3 ΚαὶAndκαίCONJ ἐνbyἐνPREP τούτῳthisοὗτοςD-DSN γινώσκομενwe knowγινώσκωV-PAI-1P ὅτιthatὅτιCONJ ἐγνώκαμενwe have come to knowγινώσκωV-RAI-1P αὐτόν‚Him‚αὐτόςP-ASM ἐὰνifἐάνCONJ τὰςtheT-APF ἐντολὰςcommandmentsἐντολήN-APF αὐτοῦof HimαὐτόςP-GSM τηρῶμεν.we should keep.τηρέωV-PAS-1P 約壹2:4 The [one]T-NSM λέγωνsayingλέγωV-PAP-NSM ὅτι‑‚ὅτιCONJ ἜγνωκαI have knownγινώσκωV-RAI-1S αὐτόνHim‚αὐτόςP-ASM καὶandκαίCONJ τὰςtheT-APF ἐντολὰςcommandmentsἐντολήN-APF αὐτοῦof HimαὐτόςP-GSM μὴnotμήPRT-N τηρῶνkeeping‚τηρέωV-PAP-NSM ψεύστηςa liarψεύστηςN-NSM ἐστίν‚he is‚εἰμίV-PAI-3S καὶandκαίCONJ ἐνinἐνPREP τούτῳhimοὗτοςD-DSM theT-NSF ἀλήθειαtruthἀλήθειαN-NSF οὐκnotοὐPRT-N ἔστιν·is.εἰμίV-PAI-3S 約壹2:5 ὃςWhoeverὅς, ἥR-NSM δ᾽howeverδέCONJ ἂνἄνPRT τηρῇmay keepτηρέωV-PAS-3S αὐτοῦHisαὐτόςP-GSM τὸνT-ASM λόγον‚word‚λόγοςN-ASM ἀληθῶςtrulyἀληθῶςADV ἐνinἐνPREP τούτῳhimοὗτοςD-DSM theT-NSF ἀγάπηloveἀγάπηN-NSF τοῦT-GSM Θεοῦof GodθεόςN-GSM τετελείωται·has been perfected.τελειόωV-RPI-3S ἘνByἐνPREP τούτῳthisοὗτοςD-DSN γινώσκομενwe knowγινώσκωV-PAI-1P ὅτιthatὅτιCONJ ἐνinἐνPREP αὐτῷHimαὐτόςP-DSM ἐσμεν.we are:εἰμίV-PAI-1P \ No newline at end of file diff --git a/Mounce-BBG/複習 4 (Joh 12.27–36) 解答.md b/Mounce-BBG/複習 4 (Joh 12.27–36) 解答.md new file mode 100644 index 0000000..f7ab1a7 --- /dev/null +++ b/Mounce-BBG/複習 4 (Joh 12.27–36) 解答.md @@ -0,0 +1,6 @@ +# 複習 #4 — 約 12:27–36 (10 節) + +## 圖析 + + 約12:27 ΝῦνNowνῦνADV theT-NSF ψυχήsoulψυχήN-NSF μουof MeἐγώP-1GS τετάρακται‚has been troubled‚ταράσσωV-RPI-3S καὶandκαίCONJ τίwhatτίςI-ASN εἴπω;shall I say?ἔπω, ἐρῶ, εἶπονV-2AAS-1S Πάτερ‚Father‚πατήρN-VSM σῶσόνsaveσῴζωV-AAM-2S μεMeἐγώP-1AS ἐκfromἐκPREP τῆςtheT-GSF ὥραςhourὥραN-GSF ταύτης;this.’οὗτοςD-GSF ἀλλὰButἀλλάCONJ διὰon account ofδιάPREP τοῦτοthisοὗτοςD-ASN ἦλθονI cameἔρχομαιV-2AAI-1S εἰςtoεἰςPREP τὴνtheT-ASF ὥρανhourὥραN-ASF ταύτην.this.οὗτοςD-ASF 約12:28 Πάτερ‚Father‚πατήρN-VSM δόξασόνglorifyδοξάζωV-AAM-2S σουof YouσύP-2GS τὸtheT-ASN ὄνομα.name.ὄνομαN-ASN ἮλθενCameἔρχομαιV-2AAI-3S οὖνthereforeοὖνCONJ φωνὴa voiceφωνήN-NSF ἐκfromἐκPREP τοῦT-GSM οὐρανοῦ·heaven:οὐρανόςN-GSM ΚαὶBothκαίCONJ ἐδόξασαI have glorified [it]‚δοξάζωV-AAI-1S καὶandκαίCONJ πάλινagainπάλινADV δοξάσω.I will glorify [it].δοξάζωV-FAI-1S 約12:29 T-NSM οὖνThereforeοὖνCONJ ὄχλοςthe crowdὄχλοςN-NSM T-NSM ἑστὼςhaving stoodἵστημιV-RAP-NSM καὶandκαίCONJ ἀκούσαςhaving heardἀκούωV-AAP-NSM ἔλεγενwas saying‚λέγωV-IAI-3S ΒροντὴνThunderβροντήN-ASF γεγονέναι‚there has been.γίνομαιV-2RAN ἄλλοιOthersἄλλοςA-NPM ἔλεγον·were saying‚λέγωV-IAI-3P ἌγγελοςAn angelἄγγελοςN-NSM αὐτῷto HimαὐτόςP-DSM λελάληκεν.has spoken.λαλέωV-RAI-3S 約12:30 ἈπεκρίθηAnsweredἀποκρίνωV-ADI-3S ἸησοῦςJesusἸησοῦςN-NSM-P καὶandκαίCONJ εἶπεν·saidἔπω, ἐρῶ, εἶπονV-2AAI-3S ΟὐNotοὐPRT-N δι᾽because ofδιάPREP ἐμὲMeἐγώP-1AS theT-NSF φωνὴvoiceφωνήN-NSF αὕτηthisοὗτοςD-NSF γέγονενhas come‚γίνομαιV-2RAI-3S ἀλλὰbutἀλλάCONJ δι᾽because ofδιάPREP ὑμᾶς.you.σύP-2AP 約12:31 νῦνNowνῦνADV κρίσις[the] judgmentκρίσιςN-NSF ἐστὶνisεἰμίV-PAI-3S τοῦtheT-GSM κόσμουworldκόσμοςN-GSM τούτου‚of this;οὗτοςD-GSM νῦνnowνῦνADV theT-NSM ἄρχωνprinceἄρχωνN-NSM τοῦof theT-GSM κόσμουworldκόσμοςN-GSM τούτουthisοὗτοςD-GSM ἐκβληθήσεταιwill be castἐκβάλλωV-FPI-3S ἔξω·out.ἔξωADV 約12:32 κἀγὼAnd I‚κἀγώP-1NS-K ἐὰνifἐάνCONJ ὑψωθῶI am lifted upὑψόωV-APS-1S ἐκfromἐκPREP τῆςtheT-GSF γῆς‚earth‚γῆN-GSF πάνταςallπᾶςA-APM ἑλκύσωwill drawἑλκύω, ἕλκωV-FAI-1S πρὸςtoπρόςPREP ἐμαυτόν.Myself.ἐμαυτοῦF-1ASM 約12:33 τοῦτοThisοὗτοςD-ASN δὲnowδέCONJ ἔλεγενHe was saying‚λέγωV-IAI-3S σημαίνωνsignifyingσημαίνωV-PAP-NSM ποίῳby whatποῖοςI-DSM θανάτῳdeathθάνατοςN-DSM ἤμελλενHe was aboutμέλλωV-IAI-3S ἀποθνήσκειν.¶to die.ἀποθνήσκωV-PAN + 約12:34 ἈπεκρίθηAnsweredἀποκρίνωV-ADI-3S οὖνthenοὖνCONJ αὐτῷHimαὐτόςP-DSM theT-NSM ὄχλος·crowd‚ὄχλοςN-NSM ἩμεῖςWeἐγώP-1NP ἠκούσαμενhave heardἀκούωV-AAI-1P ἐκfromἐκPREP τοῦtheT-GSM νόμουlawνόμοςN-GSM ὅτιthatὅτιCONJ theT-NSM ΧριστὸςChristΧριστόςN-NSM-T μένειabidesμένωV-PAI-3S εἰςtoεἰςPREP τὸνtheT-ASM αἰῶνα‚age‚αἰώνN-ASM καὶandκαίCONJ πῶςhowπωςADV λέγειςsayλέγωV-PAI-2S σὺyouσύP-2NS ὅτιthatὅτιCONJ δεῖit behoovesδέωV-PAI-3S ὑψωθῆναιto be lifted upὑψόωV-APN τὸνtheT-ASM ΥἱὸνSonυἱόςN-ASM τοῦT-GSM ἀνθρώπου;of Man?ἄνθρωποςN-GSM τίςWhoτίςI-NSM ἐστινisεἰμίV-PAI-3S οὗτοςthisοὗτοςD-NSM T-NSM ΥἱὸςSonυἱόςN-NSM τοῦT-GSM ἀνθρώπου;of Man?ἄνθρωποςN-GSM 約12:35 ΕἶπενSaidἔπω, ἐρῶ, εἶπονV-2AAI-3S οὖνthereforeοὖνCONJ αὐτοῖςto themαὐτόςP-DPM T-NSM Ἰησοῦς·Jesus‚ἸησοῦςN-NSM-P ἜτιYetἔτιADV μικρὸνa littleμικρόςA-ASM χρόνονwhileχρόνοςN-ASM τὸtheT-NSN φῶςlightφῶςN-NSN ἐνwithἐνPREP ὑμῖνyouσύP-2DP ἐστιν.is.εἰμίV-PAI-3S περιπατεῖτεWalkπεριπατέωV-PAM-2P ὡςwhileὡςCONJ τὸtheT-ASN φῶςlightφῶςN-ASN ἔχετε‚you have‚ἔχωV-PAI-2P ἵναso thatἵναCONJ μὴnotμήPRT-N σκοτίαdarknessσκοτίαN-NSF ὑμᾶςyouσύP-2AP καταλάβῃ·might overtake.καταλαμβάνωV-2AAS-3S καὶAndκαίCONJ the [one]T-NSM περιπατῶνwalkingπεριπατέωV-PAP-NSM ἐνinἐνPREP τῇtheT-DSF σκοτίᾳdarknessσκοτίαN-DSF οὐκnotοὐPRT-N οἶδενknowsεἴδωV-RAI-3S ποῦwhereποῦADV-I ὑπάγει.he is going.ὑπάγωV-PAI-3S 約12:36 ὡςWhileὡςCONJ τὸtheT-ASN φῶςlightφῶςN-ASN ἔχετε‚you have‚ἔχωV-PAI-2P πιστεύετεbelieveπιστεύωV-PAM-2P εἰςinεἰςPREP τὸtheT-ASN φῶς‚light‚φῶςN-ASN ἵναso thatἵναCONJ υἱοὶsonsυἱόςN-NPM φωτὸςof lightφῶςN-GSN γένησθε.you may become.γίνομαιV-2ADS-2P ΤαῦταThese thingsοὗτοςD-APN ἐλάλησενspokeλαλέωV-AAI-3S Ἰησοῦς‚Jesus‚ἸησοῦςN-NSM-P καὶandκαίCONJ ἀπελθὼνhaving gone away‚ἀπέρχομαιV-2AAP-NSM ἐκρύβηHe was hiddenκρύπτωV-2API-3S ἀπ᾽fromἀπόPREP αὐτῶν.¶them.αὐτόςP-GPM \ No newline at end of file diff --git a/Mounce-BBG/複習 4 (Joh 12.27–36).md b/Mounce-BBG/複習 4 (Joh 12.27–36).md new file mode 100644 index 0000000..e8c505c --- /dev/null +++ b/Mounce-BBG/複習 4 (Joh 12.27–36).md @@ -0,0 +1,4 @@ +# 複習 #4 — 約 12:27–36 (10 節) + + 約12:27 ΝῦνNowνῦνADV theT-NSF ψυχήsoulψυχήN-NSF μουof MeἐγώP-1GS τετάρακται‚has been troubled‚ταράσσωV-RPI-3S καὶandκαίCONJ τίwhatτίςI-ASN εἴπω;shall I say?ἔπω, ἐρῶ, εἶπονV-2AAS-1S Πάτερ‚Father‚πατήρN-VSM σῶσόνsaveσῴζωV-AAM-2S μεMeἐγώP-1AS ἐκfromἐκPREP τῆςtheT-GSF ὥραςhourὥραN-GSF ταύτης;this.’οὗτοςD-GSF ἀλλὰButἀλλάCONJ διὰon account ofδιάPREP τοῦτοthisοὗτοςD-ASN ἦλθονI cameἔρχομαιV-2AAI-1S εἰςtoεἰςPREP τὴνtheT-ASF ὥρανhourὥραN-ASF ταύτην.this.οὗτοςD-ASF 約12:28 Πάτερ‚Father‚πατήρN-VSM δόξασόνglorifyδοξάζωV-AAM-2S σουof YouσύP-2GS τὸtheT-ASN ὄνομα.name.ὄνομαN-ASN ἮλθενCameἔρχομαιV-2AAI-3S οὖνthereforeοὖνCONJ φωνὴa voiceφωνήN-NSF ἐκfromἐκPREP τοῦT-GSM οὐρανοῦ·heaven:οὐρανόςN-GSM ΚαὶBothκαίCONJ ἐδόξασαI have glorified [it]‚δοξάζωV-AAI-1S καὶandκαίCONJ πάλινagainπάλινADV δοξάσω.I will glorify [it].δοξάζωV-FAI-1S 約12:29 T-NSM οὖνThereforeοὖνCONJ ὄχλοςthe crowdὄχλοςN-NSM T-NSM ἑστὼςhaving stoodἵστημιV-RAP-NSM καὶandκαίCONJ ἀκούσαςhaving heardἀκούωV-AAP-NSM ἔλεγενwas saying‚λέγωV-IAI-3S ΒροντὴνThunderβροντήN-ASF γεγονέναι‚there has been.γίνομαιV-2RAN ἄλλοιOthersἄλλοςA-NPM ἔλεγον·were saying‚λέγωV-IAI-3P ἌγγελοςAn angelἄγγελοςN-NSM αὐτῷto HimαὐτόςP-DSM λελάληκεν.has spoken.λαλέωV-RAI-3S 約12:30 ἈπεκρίθηAnsweredἀποκρίνωV-ADI-3S ἸησοῦςJesusἸησοῦςN-NSM-P καὶandκαίCONJ εἶπεν·saidἔπω, ἐρῶ, εἶπονV-2AAI-3S ΟὐNotοὐPRT-N δι᾽because ofδιάPREP ἐμὲMeἐγώP-1AS theT-NSF φωνὴvoiceφωνήN-NSF αὕτηthisοὗτοςD-NSF γέγονενhas come‚γίνομαιV-2RAI-3S ἀλλὰbutἀλλάCONJ δι᾽because ofδιάPREP ὑμᾶς.you.σύP-2AP 約12:31 νῦνNowνῦνADV κρίσις[the] judgmentκρίσιςN-NSF ἐστὶνisεἰμίV-PAI-3S τοῦtheT-GSM κόσμουworldκόσμοςN-GSM τούτου‚of this;οὗτοςD-GSM νῦνnowνῦνADV theT-NSM ἄρχωνprinceἄρχωνN-NSM τοῦof theT-GSM κόσμουworldκόσμοςN-GSM τούτουthisοὗτοςD-GSM ἐκβληθήσεταιwill be castἐκβάλλωV-FPI-3S ἔξω·out.ἔξωADV 約12:32 κἀγὼAnd I‚κἀγώP-1NS-K ἐὰνifἐάνCONJ ὑψωθῶI am lifted upὑψόωV-APS-1S ἐκfromἐκPREP τῆςtheT-GSF γῆς‚earth‚γῆN-GSF πάνταςallπᾶςA-APM ἑλκύσωwill drawἑλκύω, ἕλκωV-FAI-1S πρὸςtoπρόςPREP ἐμαυτόν.Myself.ἐμαυτοῦF-1ASM 約12:33 τοῦτοThisοὗτοςD-ASN δὲnowδέCONJ ἔλεγενHe was saying‚λέγωV-IAI-3S σημαίνωνsignifyingσημαίνωV-PAP-NSM ποίῳby whatποῖοςI-DSM θανάτῳdeathθάνατοςN-DSM ἤμελλενHe was aboutμέλλωV-IAI-3S ἀποθνήσκειν.¶to die.ἀποθνήσκωV-PAN + 約12:34 ἈπεκρίθηAnsweredἀποκρίνωV-ADI-3S οὖνthenοὖνCONJ αὐτῷHimαὐτόςP-DSM theT-NSM ὄχλος·crowd‚ὄχλοςN-NSM ἩμεῖςWeἐγώP-1NP ἠκούσαμενhave heardἀκούωV-AAI-1P ἐκfromἐκPREP τοῦtheT-GSM νόμουlawνόμοςN-GSM ὅτιthatὅτιCONJ theT-NSM ΧριστὸςChristΧριστόςN-NSM-T μένειabidesμένωV-PAI-3S εἰςtoεἰςPREP τὸνtheT-ASM αἰῶνα‚age‚αἰώνN-ASM καὶandκαίCONJ πῶςhowπωςADV λέγειςsayλέγωV-PAI-2S σὺyouσύP-2NS ὅτιthatὅτιCONJ δεῖit behoovesδέωV-PAI-3S ὑψωθῆναιto be lifted upὑψόωV-APN τὸνtheT-ASM ΥἱὸνSonυἱόςN-ASM τοῦT-GSM ἀνθρώπου;of Man?ἄνθρωποςN-GSM τίςWhoτίςI-NSM ἐστινisεἰμίV-PAI-3S οὗτοςthisοὗτοςD-NSM T-NSM ΥἱὸςSonυἱόςN-NSM τοῦT-GSM ἀνθρώπου;of Man?ἄνθρωποςN-GSM 約12:35 ΕἶπενSaidἔπω, ἐρῶ, εἶπονV-2AAI-3S οὖνthereforeοὖνCONJ αὐτοῖςto themαὐτόςP-DPM T-NSM Ἰησοῦς·Jesus‚ἸησοῦςN-NSM-P ἜτιYetἔτιADV μικρὸνa littleμικρόςA-ASM χρόνονwhileχρόνοςN-ASM τὸtheT-NSN φῶςlightφῶςN-NSN ἐνwithἐνPREP ὑμῖνyouσύP-2DP ἐστιν.is.εἰμίV-PAI-3S περιπατεῖτεWalkπεριπατέωV-PAM-2P ὡςwhileὡςCONJ τὸtheT-ASN φῶςlightφῶςN-ASN ἔχετε‚you have‚ἔχωV-PAI-2P ἵναso thatἵναCONJ μὴnotμήPRT-N σκοτίαdarknessσκοτίαN-NSF ὑμᾶςyouσύP-2AP καταλάβῃ·might overtake.καταλαμβάνωV-2AAS-3S καὶAndκαίCONJ the [one]T-NSM περιπατῶνwalkingπεριπατέωV-PAP-NSM ἐνinἐνPREP τῇtheT-DSF σκοτίᾳdarknessσκοτίαN-DSF οὐκnotοὐPRT-N οἶδενknowsεἴδωV-RAI-3S ποῦwhereποῦADV-I ὑπάγει.he is going.ὑπάγωV-PAI-3S 約12:36 ὡςWhileὡςCONJ τὸtheT-ASN φῶςlightφῶςN-ASN ἔχετε‚you have‚ἔχωV-PAI-2P πιστεύετεbelieveπιστεύωV-PAM-2P εἰςinεἰςPREP τὸtheT-ASN φῶς‚light‚φῶςN-ASN ἵναso thatἵναCONJ υἱοὶsonsυἱόςN-NPM φωτὸςof lightφῶςN-GSN γένησθε.you may become.γίνομαιV-2ADS-2P ΤαῦταThese thingsοὗτοςD-APN ἐλάλησενspokeλαλέωV-AAI-3S Ἰησοῦς‚Jesus‚ἸησοῦςN-NSM-P καὶandκαίCONJ ἀπελθὼνhaving gone away‚ἀπέρχομαιV-2AAP-NSM ἐκρύβηHe was hiddenκρύπτωV-2API-3S ἀπ᾽fromἀπόPREP αὐτῶν.¶them.αὐτόςP-GPM \ No newline at end of file diff --git a/Mounce-BBG/複習 5 (Joh 9.18–34) 解答.md b/Mounce-BBG/複習 5 (Joh 9.18–34) 解答.md new file mode 100644 index 0000000..214894f --- /dev/null +++ b/Mounce-BBG/複習 5 (Joh 9.18–34) 解答.md @@ -0,0 +1,7 @@ +# 複習 #5 — 約 9:18–34 (17 節) + +## 圖析 + + 約9:18 ΟὐκNotοὐPRT-N ἐπίστευσανdid believeπιστεύωV-AAI-3P οὖνthenοὖνCONJ οἱtheT-NPM ἸουδαῖοιJewsἸουδαῖοςA-NPM-PG περὶconcerningπερίPREP αὐτοῦhimαὐτόςP-GSM ὅτιthatὅτιCONJ ἦνhe had beenεἰμίV-IAI-3S τυφλὸςblindτυφλόςA-NSM καὶandκαίCONJ ἀνέβλεψενhad received sight‚ἀναβλέπωV-AAI-3S ἕωςuntilἕωςPREP ὅτουwhenὅστις, ἥτιςR-GSN ἐφώνησανthey calledφωνέωV-AAI-3P τοὺςtheT-APM γονεῖςparentsγονεύςN-APM αὐτοῦof himαὐτόςP-GSM τοῦT-GSM ἀναβλέψαντοςhaving received sight.ἀναβλέπωV-AAP-GSM 約9:19 καὶAndκαίCONJ ἠρώτησανthey askedἐρωτάωV-AAI-3P αὐτοὺςthemαὐτόςP-APM λέγοντες·saying‚λέγωV-PAP-NPM ΟὗτόςThisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S theT-NSM υἱὸςsonυἱόςN-NSM ὑμῶν‚of you‚σύP-2GP ὃνof whomὅς, ἥR-ASM ὑμεῖςyouσύP-2NP λέγετεsayλέγωV-PAI-2P ὅτιthatὅτιCONJ τυφλὸςblindτυφλόςA-NSM ἐγεννήθη;he was born?γεννάωV-API-3S πῶςHowπωςADV οὖνthenοὖνCONJ βλέπειdoes he seeβλέπωV-PAI-3S ἄρτι;presently?ἄρτιADV 約9:20 ἈπεκρίθησανAnsweredἀποκρίνωV-ADI-3P οὖνthereforeοὖνCONJ οἱtheT-NPM γονεῖςparentsγονεύςN-NPM αὐτοῦof himαὐτόςP-GSM καὶandκαίCONJ εἶπαν·said‚ἔπω, ἐρῶ, εἶπονV-2AAI-3P ΟἴδαμενWe knowεἴδωV-RAI-1P ὅτιthatὅτιCONJ οὗτόςthisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S theT-NSM υἱὸςsonυἱόςN-NSM ἡμῶνof us‚ἐγώP-1GP καὶandκαίCONJ ὅτιthatὅτιCONJ τυφλὸςblindτυφλόςA-NSM ἐγεννήθη·he was born.γεννάωV-API-3S 約9:21 πῶςHowπωςADV δὲhoweverδέCONJ νῦνpresentlyνῦνADV βλέπειhe sees‚βλέπωV-PAI-3S οὐκnotοὐPRT-N οἴδαμεν‚we know‚εἴδωV-RAI-1P orCONJ τίςwhoτίςI-NSM ἤνοιξενopenedἀνοίγωV-2AAI-3S αὐτοῦof himαὐτόςP-GSM τοὺςtheT-APM ὀφθαλμοὺςeyes‚ὀφθαλμόςN-APM ἡμεῖςweἐγώP-1NP οὐκnotοὐPRT-N οἴδαμεν·know;εἴδωV-RAI-1P αὐτὸνhimαὐτόςP-ASM ἐρωτήσατε‚ask;ἐρωτάωV-AAM-2P ἡλικίανageἡλικίαN-ASF ἔχει‚hasἔχωV-PAI-3S αὐτὸςHe.αὐτόςP-NSM περὶConcerningπερίPREP ἑαυτοῦhimself‚ἑαυτοῦF-3GSM λαλήσει.he will speak.λαλέωV-FAI-3S + 約9:22 ΤαῦταThese thingsοὗτοςD-APN εἶπανsaidἔπω, ἐρῶ, εἶπονV-2AAI-3P οἱtheT-NPM γονεῖςparentsγονεύςN-NPM αὐτοῦof HimαὐτόςP-GSM ὅτιbecauseὅτιCONJ ἐφοβοῦντοthey were afraidφοβέωV-INI-3P τοὺςof theT-APM Ἰουδαίους·Jews;ἸουδαῖοςA-APM-PG ἤδηalreadyἤδηADV γὰρforγάρCONJ συνετέθειντοhad agreed togetherσυντίθημιV-LMI-3P οἱtheT-NPM ἸουδαῖοιJewsἸουδαῖοςA-NPM-PG ἵναthatἵναCONJ ἐάνifἐάνCONJ τιςanyoneτιςX-NSM αὐτὸνHimαὐτόςP-ASM ὁμολογήσῃshould confessὁμολογέωV-AAS-3S Χριστόν‚Christ‚ΧριστόςN-ASM-T ἀποσυνάγωγοςexpelled from the synagogueἀποσυνάγωγοςA-NSM γένηται.he would be.γίνομαιV-2ADS-3S 約9:23 διὰBecause ofδιάPREP τοῦτοthis‚οὗτοςD-ASN οἱtheT-NPM γονεῖςparentsγονεύςN-NPM αὐτοῦof himαὐτόςP-GSM εἶπανsaidἔπω, ἐρῶ, εἶπονV-2AAI-3P ὅτι‑‚ὅτιCONJ ἩλικίανAgeἡλικίαN-ASF ἔχει‚he has;ἔχωV-PAI-3S αὐτὸνhimαὐτόςP-ASM ἐπερωτήσατε.¶ask.ἐπερωτάωV-AAM-2P 約9:24 ἘφώνησανThey calledφωνέωV-AAI-3P οὖνthereforeοὖνCONJ τὸνtheT-ASM ἄνθρωπονmanἄνθρωποςN-ASM ἐκoutἐκPREP δευτέρουa second timeδεύτεροςA-GSN ὃςwhoὅς, ἥR-NSM ἦνhad beenεἰμίV-IAI-3S τυφλὸςblind‚τυφλόςA-NSM καὶandκαίCONJ εἶπανsaidἔπω, ἐρῶ, εἶπονV-2AAI-3P αὐτῷ·to him‚αὐτόςP-DSM ΔὸςGiveδίδωμιV-2AAM-2S δόξανgloryδόξαN-ASF τῷT-DSM Θεῷ·to God!θεόςN-DSM ἡμεῖςWeἐγώP-1NP οἴδαμενknowεἴδωV-RAI-1P ὅτιthatὅτιCONJ οὗτοςthisοὗτοςD-NSM T-NSM ἄνθρωποςmanἄνθρωποςN-NSM ἁμαρτωλόςa sinnerἁμαρτωλόςA-NSM ἐστιν.is.εἰμίV-PAI-3S 約9:25 ἈπεκρίθηAnsweredἀποκρίνωV-ADI-3S οὖνthenοὖνCONJ ἐκεῖνος·he‚ἐκεῖνοςD-NSM ΕἰWhetherεἰPRT ἁμαρτωλόςa sinnerἁμαρτωλόςA-NSM ἐστινHe is‚εἰμίV-PAI-3S οὐκnotοὐPRT-N οἶδα·I know.εἴδωV-RAI-1S ἓνOne [thing]εἷςA-ASN οἶδαI do know‚εἴδωV-RAI-1S ὅτιthatὅτιADV τυφλὸςblindτυφλόςA-NSM ὢνbeing‚εἰμίV-PAP-NSM ἄρτιnowἄρτιADV βλέπω.I see.βλέπωV-PAI-1S 約9:26 ΕἶπονThey saidἔπω, ἐρῶ, εἶπονV-2AAI-3P οὖνthereforeοὖνCONJ αὐτῷ·to him‚αὐτόςP-DSM ΤίWhatτίςI-ASN ἐποίησένdid HeποιέωV-AAI-3S σοι;to you?σύP-2DS πῶςHowπωςADV ἤνοιξένopened HeἀνοίγωV-2AAI-3S σουof youσύP-2GS τοὺςtheT-APM ὀφθαλμούς;eyes?ὀφθαλμόςN-APM 約9:27 ἈπεκρίθηHe answeredἀποκρίνωV-ADI-3S αὐτοῖς·them‚αὐτόςP-DPM ΕἶπονI toldἔπω, ἐρῶ, εἶπονV-2AAI-1S ὑμῖνyouσύP-2DP ἤδηalready‚ἤδηADV καὶandκαίCONJ οὐκnotοὐPRT-N ἠκούσατε·you did listen.ἀκούωV-AAI-2P τίWhyτίςI-ASN πάλινagainπάλινADV θέλετεdo you wishθέλωV-PAI-2P ἀκούειν;to hear?ἀκούωV-PAN μὴNotμήPRT καὶalsoκαίCONJ ὑμεῖςyouσύP-2NP θέλετεdo wishθέλωV-PAI-2P αὐτοῦHisαὐτόςP-GSM μαθηταὶdisciplesμαθητήςN-NPM γενέσθαι;to become?γίνομαιV-2ADN + 約9:28 ΚαὶAndκαίCONJ ἐλοιδόρησανthey railed atλοιδορέωV-AAI-3P αὐτὸνhimαὐτόςP-ASM καὶandκαίCONJ εἶπον·said‚ἔπω, ἐρῶ, εἶπονV-2AAI-3P ΣὺYouσύP-2NS μαθητὴςa discipleμαθητήςN-NSM εἶareεἰμίV-PAI-2S ἐκείνου‚of that One;ἐκεῖνοςD-GSM ἡμεῖςweἐγώP-1NP δὲhoweverδέCONJ τοῦT-GSM Μωϋσέωςof MosesΜωϋσῆς, ΜωσῆςN-GSM-P ἐσμὲνareεἰμίV-PAI-1P μαθηταί·disciples.μαθητήςN-NPM 約9:29 ἡμεῖςWeἐγώP-1NP οἴδαμενknowεἴδωV-RAI-1P ὅτιthatὅτιCONJ Μωϋσεῖto MosesΜωϋσῆς, ΜωσῆςN-DSM-P λελάληκενhas spokenλαλέωV-RAI-3S T-NSM Θεός‚God;θεόςN-NSM τοῦτονthis [man]οὗτοςD-ASM δὲhoweverδέCONJ οὐκnotοὐPRT-N οἴδαμενwe knowεἴδωV-RAI-1P πόθενfrom whereπόθενADV ἐστίν.is.εἰμίV-PAI-3S 約9:30 ἈπεκρίθηAnsweredἀποκρίνωV-ADI-3S theT-NSM ἄνθρωποςmanἄνθρωποςN-NSM καὶandκαίCONJ εἶπενsaidἔπω, ἐρῶ, εἶπονV-2AAI-3S αὐτοῖς·to them‚αὐτόςP-DPM ἘνInἐνPREP τούτῳthisοὗτοςD-DSN γὰρforγάρCONJ τὸT-NSN θαυμαστόνan amazing thingθαυμαστόςA-NSN ἐστιν‚is‚εἰμίV-PAI-3S ὅτιthatὅτιADV ὑμεῖςyouσύP-2NP οὐκnotοὐPRT-N οἴδατεknowεἴδωV-RAI-2P πόθενfrom whereπόθενADV ἐστίν‚He is‚εἰμίV-PAI-3S καὶand yetκαίCONJ ἤνοιξένHe openedἀνοίγωV-2AAI-3S μουmyἐγώP-1GS τοὺςT-APM ὀφθαλμούς.eyes.ὀφθαλμόςN-APM 約9:31 οἴδαμενWe knowεἴδωV-RAI-1P ὅτιthatὅτιCONJ ἁμαρτωλῶνsinnersἁμαρτωλόςA-GPM T-NSM ΘεὸςGodθεόςN-NSM οὐκnotοὐPRT-N ἀκούει‚does hear;ἀκούωV-PAI-3S ἀλλ᾽butἀλλάCONJ ἐάνifἐάνCONJ τιςanyoneτιςX-NSM θεοσεβὴςGod‑fearingθεοσεβήςA-NSM is‚εἰμίV-PAS-3S καὶandκαίCONJ τὸtheT-ASN θέλημαwillθέλημαN-ASN αὐτοῦof HimαὐτόςP-GSM ποιῇdoes‚ποιέωV-PAS-3S τούτουhimοὗτοςD-GSM ἀκούει.He hears.ἀκούωV-PAI-3S 約9:32 ἐκOut ofἐκPREP τοῦtheT-GSM αἰῶνοςageαἰώνN-GSM οὐκneverοὐPRT-N ἠκούσθηit has been heard‚ἀκούωV-API-3S ὅτιthatὅτιCONJ ἠνέῳξένopenedἀνοίγωV-AAI-3S τιςanyoneτιςX-NSM ὀφθαλμοὺς[the] eyesὀφθαλμόςN-APM τυφλοῦof [one] blindτυφλόςA-GSM γεγεννημένου·having been born.γεννάωV-RPP-GSM 約9:33 εἰIfεἰCONJ μὴnotμήPRT-N ἦνwereεἰμίV-IAI-3S οὗτοςthis [man]οὗτοςD-NSM παρὰfromπαράPREP Θεοῦ‚God‚θεόςN-GSM οὐκnotοὐPRT-N ἠδύνατοHe couldδύναμαιV-INI-3S ποιεῖνdoποιέωV-PAN οὐδέν.nothing.οὐδείςA-ASN 約9:34 ἈπεκρίθησανThey answeredἀποκρίνωV-ADI-3P καὶandκαίCONJ εἶπανsaidἔπω, ἐρῶ, εἶπονV-2AAI-3P αὐτῷ·to him‚αὐτόςP-DSM ἘνInἐνPREP ἁμαρτίαιςsinsἁμαρτίαN-DPF σὺyouσύP-2NS ἐγεννήθηςwere bornγεννάωV-API-2S ὅλοςentirely‚ὅλοςA-NSM καὶandκαίCONJ σὺyouσύP-2NS διδάσκειςteachδιδάσκωV-PAI-2S ἡμᾶς;us?ἐγώP-1AP καὶAndκαίCONJ ἐξέβαλονthey castἐκβάλλωV-2AAI-3P αὐτὸνhimαὐτόςP-ASM ἔξω.¶out.ἔξωADV \ No newline at end of file diff --git a/Mounce-BBG/複習 5 (Joh 9.18–34).md b/Mounce-BBG/複習 5 (Joh 9.18–34).md new file mode 100644 index 0000000..a04c8e1 --- /dev/null +++ b/Mounce-BBG/複習 5 (Joh 9.18–34).md @@ -0,0 +1,6 @@ +# 複習 #5 — 約 9:18–34 (17 節) + + + 約9:18 ΟὐκNotοὐPRT-N ἐπίστευσανdid believeπιστεύωV-AAI-3P οὖνthenοὖνCONJ οἱtheT-NPM ἸουδαῖοιJewsἸουδαῖοςA-NPM-PG περὶconcerningπερίPREP αὐτοῦhimαὐτόςP-GSM ὅτιthatὅτιCONJ ἦνhe had beenεἰμίV-IAI-3S τυφλὸςblindτυφλόςA-NSM καὶandκαίCONJ ἀνέβλεψενhad received sight‚ἀναβλέπωV-AAI-3S ἕωςuntilἕωςPREP ὅτουwhenὅστις, ἥτιςR-GSN ἐφώνησανthey calledφωνέωV-AAI-3P τοὺςtheT-APM γονεῖςparentsγονεύςN-APM αὐτοῦof himαὐτόςP-GSM τοῦT-GSM ἀναβλέψαντοςhaving received sight.ἀναβλέπωV-AAP-GSM 約9:19 καὶAndκαίCONJ ἠρώτησανthey askedἐρωτάωV-AAI-3P αὐτοὺςthemαὐτόςP-APM λέγοντες·saying‚λέγωV-PAP-NPM ΟὗτόςThisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S theT-NSM υἱὸςsonυἱόςN-NSM ὑμῶν‚of you‚σύP-2GP ὃνof whomὅς, ἥR-ASM ὑμεῖςyouσύP-2NP λέγετεsayλέγωV-PAI-2P ὅτιthatὅτιCONJ τυφλὸςblindτυφλόςA-NSM ἐγεννήθη;he was born?γεννάωV-API-3S πῶςHowπωςADV οὖνthenοὖνCONJ βλέπειdoes he seeβλέπωV-PAI-3S ἄρτι;presently?ἄρτιADV 約9:20 ἈπεκρίθησανAnsweredἀποκρίνωV-ADI-3P οὖνthereforeοὖνCONJ οἱtheT-NPM γονεῖςparentsγονεύςN-NPM αὐτοῦof himαὐτόςP-GSM καὶandκαίCONJ εἶπαν·said‚ἔπω, ἐρῶ, εἶπονV-2AAI-3P ΟἴδαμενWe knowεἴδωV-RAI-1P ὅτιthatὅτιCONJ οὗτόςthisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S theT-NSM υἱὸςsonυἱόςN-NSM ἡμῶνof us‚ἐγώP-1GP καὶandκαίCONJ ὅτιthatὅτιCONJ τυφλὸςblindτυφλόςA-NSM ἐγεννήθη·he was born.γεννάωV-API-3S 約9:21 πῶςHowπωςADV δὲhoweverδέCONJ νῦνpresentlyνῦνADV βλέπειhe sees‚βλέπωV-PAI-3S οὐκnotοὐPRT-N οἴδαμεν‚we know‚εἴδωV-RAI-1P orCONJ τίςwhoτίςI-NSM ἤνοιξενopenedἀνοίγωV-2AAI-3S αὐτοῦof himαὐτόςP-GSM τοὺςtheT-APM ὀφθαλμοὺςeyes‚ὀφθαλμόςN-APM ἡμεῖςweἐγώP-1NP οὐκnotοὐPRT-N οἴδαμεν·know;εἴδωV-RAI-1P αὐτὸνhimαὐτόςP-ASM ἐρωτήσατε‚ask;ἐρωτάωV-AAM-2P ἡλικίανageἡλικίαN-ASF ἔχει‚hasἔχωV-PAI-3S αὐτὸςHe.αὐτόςP-NSM περὶConcerningπερίPREP ἑαυτοῦhimself‚ἑαυτοῦF-3GSM λαλήσει.he will speak.λαλέωV-FAI-3S + 約9:22 ΤαῦταThese thingsοὗτοςD-APN εἶπανsaidἔπω, ἐρῶ, εἶπονV-2AAI-3P οἱtheT-NPM γονεῖςparentsγονεύςN-NPM αὐτοῦof HimαὐτόςP-GSM ὅτιbecauseὅτιCONJ ἐφοβοῦντοthey were afraidφοβέωV-INI-3P τοὺςof theT-APM Ἰουδαίους·Jews;ἸουδαῖοςA-APM-PG ἤδηalreadyἤδηADV γὰρforγάρCONJ συνετέθειντοhad agreed togetherσυντίθημιV-LMI-3P οἱtheT-NPM ἸουδαῖοιJewsἸουδαῖοςA-NPM-PG ἵναthatἵναCONJ ἐάνifἐάνCONJ τιςanyoneτιςX-NSM αὐτὸνHimαὐτόςP-ASM ὁμολογήσῃshould confessὁμολογέωV-AAS-3S Χριστόν‚Christ‚ΧριστόςN-ASM-T ἀποσυνάγωγοςexpelled from the synagogueἀποσυνάγωγοςA-NSM γένηται.he would be.γίνομαιV-2ADS-3S 約9:23 διὰBecause ofδιάPREP τοῦτοthis‚οὗτοςD-ASN οἱtheT-NPM γονεῖςparentsγονεύςN-NPM αὐτοῦof himαὐτόςP-GSM εἶπανsaidἔπω, ἐρῶ, εἶπονV-2AAI-3P ὅτι‑‚ὅτιCONJ ἩλικίανAgeἡλικίαN-ASF ἔχει‚he has;ἔχωV-PAI-3S αὐτὸνhimαὐτόςP-ASM ἐπερωτήσατε.¶ask.ἐπερωτάωV-AAM-2P 約9:24 ἘφώνησανThey calledφωνέωV-AAI-3P οὖνthereforeοὖνCONJ τὸνtheT-ASM ἄνθρωπονmanἄνθρωποςN-ASM ἐκoutἐκPREP δευτέρουa second timeδεύτεροςA-GSN ὃςwhoὅς, ἥR-NSM ἦνhad beenεἰμίV-IAI-3S τυφλὸςblind‚τυφλόςA-NSM καὶandκαίCONJ εἶπανsaidἔπω, ἐρῶ, εἶπονV-2AAI-3P αὐτῷ·to him‚αὐτόςP-DSM ΔὸςGiveδίδωμιV-2AAM-2S δόξανgloryδόξαN-ASF τῷT-DSM Θεῷ·to God!θεόςN-DSM ἡμεῖςWeἐγώP-1NP οἴδαμενknowεἴδωV-RAI-1P ὅτιthatὅτιCONJ οὗτοςthisοὗτοςD-NSM T-NSM ἄνθρωποςmanἄνθρωποςN-NSM ἁμαρτωλόςa sinnerἁμαρτωλόςA-NSM ἐστιν.is.εἰμίV-PAI-3S 約9:25 ἈπεκρίθηAnsweredἀποκρίνωV-ADI-3S οὖνthenοὖνCONJ ἐκεῖνος·he‚ἐκεῖνοςD-NSM ΕἰWhetherεἰPRT ἁμαρτωλόςa sinnerἁμαρτωλόςA-NSM ἐστινHe is‚εἰμίV-PAI-3S οὐκnotοὐPRT-N οἶδα·I know.εἴδωV-RAI-1S ἓνOne [thing]εἷςA-ASN οἶδαI do know‚εἴδωV-RAI-1S ὅτιthatὅτιADV τυφλὸςblindτυφλόςA-NSM ὢνbeing‚εἰμίV-PAP-NSM ἄρτιnowἄρτιADV βλέπω.I see.βλέπωV-PAI-1S 約9:26 ΕἶπονThey saidἔπω, ἐρῶ, εἶπονV-2AAI-3P οὖνthereforeοὖνCONJ αὐτῷ·to him‚αὐτόςP-DSM ΤίWhatτίςI-ASN ἐποίησένdid HeποιέωV-AAI-3S σοι;to you?σύP-2DS πῶςHowπωςADV ἤνοιξένopened HeἀνοίγωV-2AAI-3S σουof youσύP-2GS τοὺςtheT-APM ὀφθαλμούς;eyes?ὀφθαλμόςN-APM 約9:27 ἈπεκρίθηHe answeredἀποκρίνωV-ADI-3S αὐτοῖς·them‚αὐτόςP-DPM ΕἶπονI toldἔπω, ἐρῶ, εἶπονV-2AAI-1S ὑμῖνyouσύP-2DP ἤδηalready‚ἤδηADV καὶandκαίCONJ οὐκnotοὐPRT-N ἠκούσατε·you did listen.ἀκούωV-AAI-2P τίWhyτίςI-ASN πάλινagainπάλινADV θέλετεdo you wishθέλωV-PAI-2P ἀκούειν;to hear?ἀκούωV-PAN μὴNotμήPRT καὶalsoκαίCONJ ὑμεῖςyouσύP-2NP θέλετεdo wishθέλωV-PAI-2P αὐτοῦHisαὐτόςP-GSM μαθηταὶdisciplesμαθητήςN-NPM γενέσθαι;to become?γίνομαιV-2ADN + 約9:28 ΚαὶAndκαίCONJ ἐλοιδόρησανthey railed atλοιδορέωV-AAI-3P αὐτὸνhimαὐτόςP-ASM καὶandκαίCONJ εἶπον·said‚ἔπω, ἐρῶ, εἶπονV-2AAI-3P ΣὺYouσύP-2NS μαθητὴςa discipleμαθητήςN-NSM εἶareεἰμίV-PAI-2S ἐκείνου‚of that One;ἐκεῖνοςD-GSM ἡμεῖςweἐγώP-1NP δὲhoweverδέCONJ τοῦT-GSM Μωϋσέωςof MosesΜωϋσῆς, ΜωσῆςN-GSM-P ἐσμὲνareεἰμίV-PAI-1P μαθηταί·disciples.μαθητήςN-NPM 約9:29 ἡμεῖςWeἐγώP-1NP οἴδαμενknowεἴδωV-RAI-1P ὅτιthatὅτιCONJ Μωϋσεῖto MosesΜωϋσῆς, ΜωσῆςN-DSM-P λελάληκενhas spokenλαλέωV-RAI-3S T-NSM Θεός‚God;θεόςN-NSM τοῦτονthis [man]οὗτοςD-ASM δὲhoweverδέCONJ οὐκnotοὐPRT-N οἴδαμενwe knowεἴδωV-RAI-1P πόθενfrom whereπόθενADV ἐστίν.is.εἰμίV-PAI-3S 約9:30 ἈπεκρίθηAnsweredἀποκρίνωV-ADI-3S theT-NSM ἄνθρωποςmanἄνθρωποςN-NSM καὶandκαίCONJ εἶπενsaidἔπω, ἐρῶ, εἶπονV-2AAI-3S αὐτοῖς·to them‚αὐτόςP-DPM ἘνInἐνPREP τούτῳthisοὗτοςD-DSN γὰρforγάρCONJ τὸT-NSN θαυμαστόνan amazing thingθαυμαστόςA-NSN ἐστιν‚is‚εἰμίV-PAI-3S ὅτιthatὅτιADV ὑμεῖςyouσύP-2NP οὐκnotοὐPRT-N οἴδατεknowεἴδωV-RAI-2P πόθενfrom whereπόθενADV ἐστίν‚He is‚εἰμίV-PAI-3S καὶand yetκαίCONJ ἤνοιξένHe openedἀνοίγωV-2AAI-3S μουmyἐγώP-1GS τοὺςT-APM ὀφθαλμούς.eyes.ὀφθαλμόςN-APM 約9:31 οἴδαμενWe knowεἴδωV-RAI-1P ὅτιthatὅτιCONJ ἁμαρτωλῶνsinnersἁμαρτωλόςA-GPM T-NSM ΘεὸςGodθεόςN-NSM οὐκnotοὐPRT-N ἀκούει‚does hear;ἀκούωV-PAI-3S ἀλλ᾽butἀλλάCONJ ἐάνifἐάνCONJ τιςanyoneτιςX-NSM θεοσεβὴςGod‑fearingθεοσεβήςA-NSM is‚εἰμίV-PAS-3S καὶandκαίCONJ τὸtheT-ASN θέλημαwillθέλημαN-ASN αὐτοῦof HimαὐτόςP-GSM ποιῇdoes‚ποιέωV-PAS-3S τούτουhimοὗτοςD-GSM ἀκούει.He hears.ἀκούωV-PAI-3S 約9:32 ἐκOut ofἐκPREP τοῦtheT-GSM αἰῶνοςageαἰώνN-GSM οὐκneverοὐPRT-N ἠκούσθηit has been heard‚ἀκούωV-API-3S ὅτιthatὅτιCONJ ἠνέῳξένopenedἀνοίγωV-AAI-3S τιςanyoneτιςX-NSM ὀφθαλμοὺς[the] eyesὀφθαλμόςN-APM τυφλοῦof [one] blindτυφλόςA-GSM γεγεννημένου·having been born.γεννάωV-RPP-GSM 約9:33 εἰIfεἰCONJ μὴnotμήPRT-N ἦνwereεἰμίV-IAI-3S οὗτοςthis [man]οὗτοςD-NSM παρὰfromπαράPREP Θεοῦ‚God‚θεόςN-GSM οὐκnotοὐPRT-N ἠδύνατοHe couldδύναμαιV-INI-3S ποιεῖνdoποιέωV-PAN οὐδέν.nothing.οὐδείςA-ASN 約9:34 ἈπεκρίθησανThey answeredἀποκρίνωV-ADI-3P καὶandκαίCONJ εἶπανsaidἔπω, ἐρῶ, εἶπονV-2AAI-3P αὐτῷ·to him‚αὐτόςP-DSM ἘνInἐνPREP ἁμαρτίαιςsinsἁμαρτίαN-DPF σὺyouσύP-2NS ἐγεννήθηςwere bornγεννάωV-API-2S ὅλοςentirely‚ὅλοςA-NSM καὶandκαίCONJ σὺyouσύP-2NS διδάσκειςteachδιδάσκωV-PAI-2S ἡμᾶς;us?ἐγώP-1AP καὶAndκαίCONJ ἐξέβαλονthey castἐκβάλλωV-2AAI-3P αὐτὸνhimαὐτόςP-ASM ἔξω.¶out.ἔξωADV \ No newline at end of file diff --git a/Mounce-BBG/複習 6 (Mar 1.1–22) 解答.md b/Mounce-BBG/複習 6 (Mar 1.1–22) 解答.md new file mode 100644 index 0000000..ecc7a77 --- /dev/null +++ b/Mounce-BBG/複習 6 (Mar 1.1–22) 解答.md @@ -0,0 +1,8 @@ +# 複習 #6 — 可 1:1–22 (22 節) + +## 圖析 + + 可1:1 Ἀρχὴ[The] beginningἀρχήN-NSF τοῦof theT-GSN εὐαγγελίουgospelεὐαγγέλιονN-GSN Ἰησοῦof JesusἸησοῦςN-GSM-P ΧριστοῦChrist‚ΧριστόςN-GSM-T ΥἱοῦSonυἱόςN-GSM Θεοῦ.of God.θεόςN-GSM 可1:2 ΚαθὼςAsκαθώςCONJ γέγραπταιit has been writtenγράφωV-RPI-3S ἐνinἐνPREP τῷT-DSM ἨσαΐᾳIsaiahἩσαΐαςN-DSM-P τῷtheT-DSM προφήτῃ·prophet:προφήτηςN-DSM ἸδοὺBehold‚ἰδούINJ ἀποστέλλωI sendἀποστέλλωV-PAI-1S τὸνtheT-ASM ἄγγελόνmessengerἄγγελοςN-ASM μουof MeἐγώP-1GS πρὸbeforeπρόPREP προσώπουfaceπρόσωπονN-GSN σου‚of You‚σύP-2GS ὃςwhoὅς, ἥR-NSM κατασκευάσειwill prepareκατασκευάζωV-FAI-3S τὴνtheT-ASF ὁδόνwayὁδόςN-ASF σου·of You.”σύP-2GS 可1:3 Φωνὴ[The] voiceφωνήN-NSF βοῶντοςof one cryingβοάωV-PAP-GSM ἐνinἐνPREP τῇtheT-DSF ἐρήμῳ·wilderness‚ἔρημοςA-DSF ἙτοιμάσατεPrepareἑτοιμάζωV-AAM-2P τὴνtheT-ASF ὁδὸνwayὁδόςN-ASF Κυρίου‚of [the] Lord‚κύριοςN-GSM εὐθείαςstraightεὐθύςA-APF ποιεῖτεmakeποιέωV-PAM-2P τὰςtheT-APF τρίβουςpathsτρίβοςN-APF αὐτοῦ‚¶of Him.’”αὐτόςP-GSM 可1:4 ἘγένετοCameγίνομαιV-2ADI-3S ἸωάννηςJohn‚ἸωάννηςN-NSM-P T-NSM βαπτίζωνbaptizingβαπτίζωV-PAP-NSM ἐνinἐνPREP τῇtheT-DSF ἐρήμῳwildernessἔρημοςA-DSF καὶandκαίCONJ κηρύσσωνproclaimingκηρύσσωV-PAP-NSM βάπτισμα[a] baptismβάπτισμαN-ASN μετανοίαςof repentanceμετάνοιαN-GSF εἰςforεἰςPREP ἄφεσινforgivenessἄφεσιςN-ASF ἁμαρτιῶν.of sins.ἁμαρτίαN-GPF 可1:5 καὶAndκαίCONJ ἐξεπορεύετοwere going outἐκπορεύωV-INI-3S πρὸςtoπρόςPREP αὐτὸνhimαὐτόςP-ASM πᾶσαallπᾶςA-NSF theT-NSF Ἰουδαίαof JudeaἸουδαίαA-NSF-L χώραregion‚χώραN-NSF καὶandκαίCONJ οἱT-NPM Ἱεροσολυμῖταιof Jerusalem‚ἹεροσολυμίτηςN-NPM-L πάντες‚allπᾶςA-NPM καὶandκαίCONJ ἐβαπτίζοντοwere being baptizedβαπτίζωV-IPI-3P ὑπ᾽byὑπόPREP αὐτοῦhimαὐτόςP-GSM ἐνinἐνPREP τῷtheT-DSM ἸορδάνῃJordanἸορδάνηςN-DSM-L ποταμῷriver‚ποταμόςN-DSM ἐξομολογούμενοιconfessingἐξομολογέομαιV-PMP-NPM τὰςtheT-APF ἁμαρτίαςsinsἁμαρτίαN-APF αὐτῶν.of them.αὐτόςP-GPM 可1:6 ΚαὶAndκαίCONJ ἦνwasεἰμίV-IAI-3S T-NSM ἸωάννηςJohnἸωάννηςN-NSM-P ἐνδεδυμένοςclothed inἐνδύωV-RMP-NSM τρίχαςhairθρίξN-APF καμήλουof a camel‚κάμηλοςN-GSF καὶandκαίCONJ ζώνηνa beltζώνηN-ASF δερματίνηνof leatherδερμάτινοςA-ASF περὶaroundπερίPREP τὴνtheT-ASF ὀσφὺνwaistὀσφῦςN-ASF αὐτοῦof him;αὐτόςP-GSM καὶandκαίCONJ ἔσθωνhe is eatingἐσθίωV-PAP-NSM ἀκρίδαςlocustsἀκρίςN-APF καὶandκαίCONJ μέλιhoneyμέλιN-ASN ἄγριον.¶wild.ἄγριοςA-ASN + 可1:7 καὶAndκαίCONJ ἐκήρυσσενhe was preaching‚κηρύσσωV-IAI-3S λέγων·saying‚λέγωV-PAP-NSM ἜρχεταιHe comesἔρχομαιV-PNI-3S whoT-NSM ἰσχυρότερός[is] mightierἰσχυρόςA-NSM-C μουthan IἐγώP-1GS ὀπίσωafterὀπίσωPREP μου‚me‚ἐγώP-1GS οὗof whomὅς, ἥR-GSM οὐκnotοὐPRT-N εἰμὶI amεἰμίV-PAI-1S ἱκανὸςsufficient‚ἱκανόςA-NSM κύψαςhaving stooped down‚κύπτωV-AAP-NSM λῦσαιto untieλύωV-AAN τὸνtheT-ASM ἱμάνταstrapἱμάςN-ASM τῶνof theT-GPN ὑποδημάτωνsandalsὑπόδημαN-GPN αὐτοῦ.of Him.αὐτόςP-GSM 可1:8 ἐγὼIἐγώP-1NS ἐβάπτισαbaptizedβαπτίζωV-AAI-1S ὑμᾶςyouσύP-2AP ὕδατι‚with water;ὕδωρ, ὕδατοςN-DSN αὐτὸςHeαὐτόςP-NSM δὲhoweverδέCONJ βαπτίσειwill baptizeβαπτίζωV-FAI-3S ὑμᾶςyouσύP-2AP ἐνwithἐνPREP Πνεύματι[the] SpiritπνεῦμαN-DSN Ἁγίῳ.¶Holy.ἅγιοςA-DSN 可1:9 ΚαὶAndκαίCONJ ἐγένετοit came to passγίνομαιV-2ADI-3S ἐνinἐνPREP ἐκείναιςthoseἐκεῖνοςD-DPF ταῖςT-DPF ἡμέραιςdays‚ἡμέραN-DPF ἦλθεν[that] cameἔρχομαιV-2AAI-3S ἸησοῦςJesusἸησοῦςN-NSM-P ἀπὸfromἀπόPREP ΝαζαρὲτNazarethΝαζαρέθ, ΝαζαράN-GSF-L τῆςT-GSF Γαλιλαίαςof Galilee‚ΓαλιλαίαN-GSF-L καὶandκαίCONJ ἐβαπτίσθηwas baptizedβαπτίζωV-API-3S εἰςinεἰςPREP τὸνtheT-ASM ἸορδάνηνJordanἸορδάνηςN-ASM-L ὑπὸbyὑπόPREP Ἰωάννου.John.ἸωάννηςN-GSM-P 可1:10 καὶAndκαίCONJ εὐθὺςimmediatelyεὐθέωςADV ἀναβαίνωνgoing upἀναβαίνωV-PAP-NSM ἐκfromἐκPREP τοῦtheT-GSN ὕδατοςwater‚ὕδωρ, ὕδατοςN-GSN εἶδενhe sawεἴδωV-2AAI-3S σχιζομένουςtearing openσχίζωV-PPP-APM τοὺςtheT-APM οὐρανοὺςheavens‚οὐρανόςN-APM καὶandκαίCONJ τὸtheT-ASN ΠνεῦμαSpiritπνεῦμαN-ASN ὡςasὡςCONJ περιστερὰνa doveπεριστεράN-ASF καταβαῖνονdescendingκαταβαίνωV-PAP-ASN εἰςuponεἰςPREP αὐτόν·Him.αὐτόςP-ASM 可1:11 καὶAndκαίCONJ φωνὴa voiceφωνήN-NSF ἐγένετοcameγίνομαιV-2ADI-3S ἐκout ofἐκPREP τῶνtheT-GPM οὐρανῶν·heavens:οὐρανόςN-GPM ΣὺYouσύP-2NS εἶareεἰμίV-PAI-2S theT-NSM ΥἱόςSonυἱόςN-NSM μουof Me‚ἐγώP-1GS theT-NSM ἀγαπητός‚beloved‚ἀγαπητόςA-NSM ἐνinἐνPREP σοὶYouσύP-2DS εὐδόκησα.¶I am well pleased.εὐδοκέωV-AAI-1S 可1:12 ΚαὶAndκαίCONJ εὐθὺςimmediatelyεὐθέωςADV τὸtheT-NSN ΠνεῦμαSpiritπνεῦμαN-NSN αὐτὸνHimαὐτόςP-ASM ἐκβάλλειdrives outἐκβάλλωV-PAI-3S εἰςintoεἰςPREP τὴνtheT-ASF ἔρημον.wilderness.ἔρημοςA-ASF + 可1:13 καὶAndκαίCONJ ἦνHe wasεἰμίV-IAI-3S ἐνinἐνPREP τῇtheT-DSF ἐρήμῳwildernessἔρημοςA-DSF τεσσεράκονταfortyτεσσαράκονταA-APF-NUI ἡμέραςdays‚ἡμέραN-APF πειραζόμενοςbeing temptedπειράζωV-PPP-NSM ὑπὸbyὑπόPREP τοῦT-GSM Σατανᾶ‚Satan.ΣατανᾶςN-GSM-T καὶAndκαίCONJ ἦνHe wasεἰμίV-IAI-3S μετὰwithμετάPREP τῶνtheT-GPN θηρίων‚wild animals;θηρίονN-GPN καὶandκαίCONJ οἱtheT-NPM ἄγγελοιangelsἄγγελοςN-NPM διηκόνουνwere ministeringδιακονέωV-IAI-3P αὐτῷ.¶to Him.αὐτόςP-DSM 可1:14 ΜετὰafterμετάPREP δὲAndδέCONJ τὸtheT-ASN παραδοθῆναιdelivering upπαραδίδωμιV-APN τὸνT-ASM Ἰωάννηνof John‚ἸωάννηςN-ASM-P ἦλθενcameἔρχομαιV-2AAI-3S T-NSM ἸησοῦςJesusἸησοῦςN-NSM-P εἰςintoεἰςPREP τὴνT-ASF ΓαλιλαίανGalilee‚ΓαλιλαίαN-ASF-L κηρύσσωνproclaimingκηρύσσωV-PAP-NSM τὸtheT-ASN εὐαγγέλιονgospelεὐαγγέλιονN-ASN τοῦT-GSM Θεοῦof GodθεόςN-GSM 可1:15 καὶandκαίCONJ λέγωνsayingλέγωV-PAP-NSM ὅτι‑‚ὅτιCONJ ΠεπλήρωταιHas been fulfilledπληρόωV-RPI-3S theT-NSM καιρὸςtime‚καιρόςN-NSM καὶandκαίCONJ ἤγγικενhas drawn nearἐγγίζωV-RAI-3S theT-NSF βασιλείαkingdomβασιλείαN-NSF τοῦT-GSM Θεοῦ·of God;θεόςN-GSM μετανοεῖτεrepentμετανοέωV-PAM-2P καὶandκαίCONJ πιστεύετεbelieveπιστεύωV-PAM-2P ἐνinἐνPREP τῷtheT-DSN εὐαγγελίῳ.¶gospel.εὐαγγέλιονN-DSN 可1:16 ΚαὶAndκαίCONJ παράγωνpassingπαράγωV-PAP-NSM παρὰbyπαράPREP τὴνtheT-ASF θάλασσανSeaθάλασσαN-ASF τῆςT-GSF Γαλιλαίαςof Galilee‚ΓαλιλαίαN-GSF-L εἶδενHe sawεἴδωV-2AAI-3S ΣίμωναSimonΣίμωνN-ASM-P καὶandκαίCONJ ἈνδρέανAndrew‚ἈνδρέαςN-ASM-P τὸνtheT-ASM ἀδελφὸνbrotherἀδελφόςN-ASM Σίμωνοςof Simon‚ΣίμωνN-GSM-P ἀμφιβάλλονταςcasting a netἀμφιβάλλωV-PAP-APM ἐνintoἐνPREP τῇtheT-DSF θαλάσσῃ·sea;θάλασσαN-DSF ἦσανthey wereεἰμίV-IAI-3P γὰρforγάρCONJ ἁλιεῖς.fishermen.ἁλιεύςN-NPM 可1:17 καὶAndκαίCONJ εἶπενsaidἔπω, ἐρῶ, εἶπονV-2AAI-3S αὐτοῖςto themαὐτόςP-DPM T-NSM Ἰησοῦς·Jesus‚ἸησοῦςN-NSM-P ΔεῦτεComeδεῦτεADV ὀπίσωafterὀπίσωPREP μου‚Me‚ἐγώP-1GS καὶandκαίCONJ ποιήσωI will makeποιέωV-FAI-1S ὑμᾶςyouσύP-2AP γενέσθαιto becomeγίνομαιV-2ADN ἁλιεῖςfishersἁλιεύςN-APM ἀνθρώπων.of men.ἄνθρωποςN-GPM 可1:18 καὶAndκαίCONJ εὐθὺςimmediately‚εὐθέωςADV ἀφέντεςhaving leftἀφίημιV-2AAP-NPM τὰtheT-APN δίκτυαnets‚δίκτυονN-APN ἠκολούθησανthey followedἀκολουθέωV-AAI-3P αὐτῷ.Him.αὐτόςP-DSM + 可1:19 ΚαὶAndκαίCONJ προβὰςhaving gone onπροβαίνωV-2AAP-NSM ὀλίγονa little‚ὀλίγοςA-ASN εἶδενHe sawεἴδωV-2AAI-3S ἸάκωβονJamesἸάκωβοςN-ASM-P τὸνthe [son]T-ASM τοῦT-GSM Ζεβεδαίουof Zebedee‚ΖεβεδαῖοςN-GSM-P καὶandκαίCONJ ἸωάννηνJohnἸωάννηςN-ASM-P τὸνtheT-ASM ἀδελφὸνbrotherἀδελφόςN-ASM αὐτοῦof him‚αὐτόςP-GSM καὶandκαίCONJ αὐτοὺςtheyαὐτόςP-APM ἐν[were] inἐνPREP τῷtheT-DSN πλοίῳboatπλοῖονN-DSN καταρτίζονταςadjustingκαταρτίζωV-PAP-APM τὰtheT-APN δίκτυα‚nets.δίκτυονN-APN 可1:20 καὶAndκαίCONJ εὐθὺςimmediatelyεὐθέωςADV ἐκάλεσενHe calledκαλέωV-AAI-3S αὐτούς.them;αὐτόςP-APM καὶandκαίCONJ ἀφέντεςhaving leftἀφίημιV-2AAP-NPM τὸνtheT-ASM πατέραfatherπατήρN-ASM αὐτῶνof themαὐτόςP-GPM ΖεβεδαῖονZebedeeΖεβεδαῖοςN-ASM-P ἐνinἐνPREP τῷtheT-DSN πλοίῳboatπλοῖονN-DSN μετὰwithμετάPREP τῶνtheT-GPM μισθωτῶνhired servants‚μισθωτόςN-GPM ἀπῆλθονthey went awayἀπέρχομαιV-2AAI-3P ὀπίσωafterὀπίσωPREP αὐτοῦ.¶Him.αὐτόςP-GSM 可1:21 ΚαὶAndκαίCONJ εἰσπορεύονταιthey goεἰσπορεύωV-PNI-3P εἰςintoεἰςPREP Καφαρναούμ·Capernaum;ΚαπερναούμN-ASF-L καὶandκαίCONJ εὐθὺςimmediatelyεὐθέωςADV τοῖςon theT-DPN σάββασινSabbaths‚σάββατονN-DPN εἰσελθὼνhaving enteredεἰσέρχομαιV-2AAP-NSM εἰςintoεἰςPREP τὴνtheT-ASF συναγωγὴνsynagogue‚συναγωγήN-ASF ἐδίδασκεν.He was teaching.διδάσκωV-IAI-3S 可1:22 καὶAndκαίCONJ ἐξεπλήσσοντοthey were astonishedἐκπλήσσωV-IPI-3P ἐπὶatἐπίPREP τῇtheT-DSF διδαχῇteachingδιδαχήN-DSF αὐτοῦ·of Him;αὐτόςP-GSM ἦνHe wasεἰμίV-IAI-3S γὰρforγάρCONJ διδάσκωνteachingδιδάσκωV-PAP-NSM αὐτοὺςthemαὐτόςP-APM ὡςasὡςCONJ ἐξουσίανauthorityἐξουσίαN-ASF ἔχωνhaving‚ἔχωV-PAP-NSM καὶandκαίCONJ οὐχnotοὐPRT-N ὡςasὡςCONJ οἱtheT-NPM γραμματεῖς.¶scribes.γραμματεύςN-NPM \ No newline at end of file diff --git a/Mounce-BBG/複習 6 (Mar 1.1–22).md b/Mounce-BBG/複習 6 (Mar 1.1–22).md new file mode 100644 index 0000000..418d304 --- /dev/null +++ b/Mounce-BBG/複習 6 (Mar 1.1–22).md @@ -0,0 +1,7 @@ +# 複習 #6 — 可 1:1–22 (22 節) + + + 可1:1 Ἀρχὴ[The] beginningἀρχήN-NSF τοῦof theT-GSN εὐαγγελίουgospelεὐαγγέλιονN-GSN Ἰησοῦof JesusἸησοῦςN-GSM-P ΧριστοῦChrist‚ΧριστόςN-GSM-T ΥἱοῦSonυἱόςN-GSM Θεοῦ.of God.θεόςN-GSM 可1:2 ΚαθὼςAsκαθώςCONJ γέγραπταιit has been writtenγράφωV-RPI-3S ἐνinἐνPREP τῷT-DSM ἨσαΐᾳIsaiahἩσαΐαςN-DSM-P τῷtheT-DSM προφήτῃ·prophet:προφήτηςN-DSM ἸδοὺBehold‚ἰδούINJ ἀποστέλλωI sendἀποστέλλωV-PAI-1S τὸνtheT-ASM ἄγγελόνmessengerἄγγελοςN-ASM μουof MeἐγώP-1GS πρὸbeforeπρόPREP προσώπουfaceπρόσωπονN-GSN σου‚of You‚σύP-2GS ὃςwhoὅς, ἥR-NSM κατασκευάσειwill prepareκατασκευάζωV-FAI-3S τὴνtheT-ASF ὁδόνwayὁδόςN-ASF σου·of You.”σύP-2GS 可1:3 Φωνὴ[The] voiceφωνήN-NSF βοῶντοςof one cryingβοάωV-PAP-GSM ἐνinἐνPREP τῇtheT-DSF ἐρήμῳ·wilderness‚ἔρημοςA-DSF ἙτοιμάσατεPrepareἑτοιμάζωV-AAM-2P τὴνtheT-ASF ὁδὸνwayὁδόςN-ASF Κυρίου‚of [the] Lord‚κύριοςN-GSM εὐθείαςstraightεὐθύςA-APF ποιεῖτεmakeποιέωV-PAM-2P τὰςtheT-APF τρίβουςpathsτρίβοςN-APF αὐτοῦ‚¶of Him.’”αὐτόςP-GSM 可1:4 ἘγένετοCameγίνομαιV-2ADI-3S ἸωάννηςJohn‚ἸωάννηςN-NSM-P T-NSM βαπτίζωνbaptizingβαπτίζωV-PAP-NSM ἐνinἐνPREP τῇtheT-DSF ἐρήμῳwildernessἔρημοςA-DSF καὶandκαίCONJ κηρύσσωνproclaimingκηρύσσωV-PAP-NSM βάπτισμα[a] baptismβάπτισμαN-ASN μετανοίαςof repentanceμετάνοιαN-GSF εἰςforεἰςPREP ἄφεσινforgivenessἄφεσιςN-ASF ἁμαρτιῶν.of sins.ἁμαρτίαN-GPF 可1:5 καὶAndκαίCONJ ἐξεπορεύετοwere going outἐκπορεύωV-INI-3S πρὸςtoπρόςPREP αὐτὸνhimαὐτόςP-ASM πᾶσαallπᾶςA-NSF theT-NSF Ἰουδαίαof JudeaἸουδαίαA-NSF-L χώραregion‚χώραN-NSF καὶandκαίCONJ οἱT-NPM Ἱεροσολυμῖταιof Jerusalem‚ἹεροσολυμίτηςN-NPM-L πάντες‚allπᾶςA-NPM καὶandκαίCONJ ἐβαπτίζοντοwere being baptizedβαπτίζωV-IPI-3P ὑπ᾽byὑπόPREP αὐτοῦhimαὐτόςP-GSM ἐνinἐνPREP τῷtheT-DSM ἸορδάνῃJordanἸορδάνηςN-DSM-L ποταμῷriver‚ποταμόςN-DSM ἐξομολογούμενοιconfessingἐξομολογέομαιV-PMP-NPM τὰςtheT-APF ἁμαρτίαςsinsἁμαρτίαN-APF αὐτῶν.of them.αὐτόςP-GPM 可1:6 ΚαὶAndκαίCONJ ἦνwasεἰμίV-IAI-3S T-NSM ἸωάννηςJohnἸωάννηςN-NSM-P ἐνδεδυμένοςclothed inἐνδύωV-RMP-NSM τρίχαςhairθρίξN-APF καμήλουof a camel‚κάμηλοςN-GSF καὶandκαίCONJ ζώνηνa beltζώνηN-ASF δερματίνηνof leatherδερμάτινοςA-ASF περὶaroundπερίPREP τὴνtheT-ASF ὀσφὺνwaistὀσφῦςN-ASF αὐτοῦof him;αὐτόςP-GSM καὶandκαίCONJ ἔσθωνhe is eatingἐσθίωV-PAP-NSM ἀκρίδαςlocustsἀκρίςN-APF καὶandκαίCONJ μέλιhoneyμέλιN-ASN ἄγριον.¶wild.ἄγριοςA-ASN + 可1:7 καὶAndκαίCONJ ἐκήρυσσενhe was preaching‚κηρύσσωV-IAI-3S λέγων·saying‚λέγωV-PAP-NSM ἜρχεταιHe comesἔρχομαιV-PNI-3S whoT-NSM ἰσχυρότερός[is] mightierἰσχυρόςA-NSM-C μουthan IἐγώP-1GS ὀπίσωafterὀπίσωPREP μου‚me‚ἐγώP-1GS οὗof whomὅς, ἥR-GSM οὐκnotοὐPRT-N εἰμὶI amεἰμίV-PAI-1S ἱκανὸςsufficient‚ἱκανόςA-NSM κύψαςhaving stooped down‚κύπτωV-AAP-NSM λῦσαιto untieλύωV-AAN τὸνtheT-ASM ἱμάνταstrapἱμάςN-ASM τῶνof theT-GPN ὑποδημάτωνsandalsὑπόδημαN-GPN αὐτοῦ.of Him.αὐτόςP-GSM 可1:8 ἐγὼIἐγώP-1NS ἐβάπτισαbaptizedβαπτίζωV-AAI-1S ὑμᾶςyouσύP-2AP ὕδατι‚with water;ὕδωρ, ὕδατοςN-DSN αὐτὸςHeαὐτόςP-NSM δὲhoweverδέCONJ βαπτίσειwill baptizeβαπτίζωV-FAI-3S ὑμᾶςyouσύP-2AP ἐνwithἐνPREP Πνεύματι[the] SpiritπνεῦμαN-DSN Ἁγίῳ.¶Holy.ἅγιοςA-DSN 可1:9 ΚαὶAndκαίCONJ ἐγένετοit came to passγίνομαιV-2ADI-3S ἐνinἐνPREP ἐκείναιςthoseἐκεῖνοςD-DPF ταῖςT-DPF ἡμέραιςdays‚ἡμέραN-DPF ἦλθεν[that] cameἔρχομαιV-2AAI-3S ἸησοῦςJesusἸησοῦςN-NSM-P ἀπὸfromἀπόPREP ΝαζαρὲτNazarethΝαζαρέθ, ΝαζαράN-GSF-L τῆςT-GSF Γαλιλαίαςof Galilee‚ΓαλιλαίαN-GSF-L καὶandκαίCONJ ἐβαπτίσθηwas baptizedβαπτίζωV-API-3S εἰςinεἰςPREP τὸνtheT-ASM ἸορδάνηνJordanἸορδάνηςN-ASM-L ὑπὸbyὑπόPREP Ἰωάννου.John.ἸωάννηςN-GSM-P 可1:10 καὶAndκαίCONJ εὐθὺςimmediatelyεὐθέωςADV ἀναβαίνωνgoing upἀναβαίνωV-PAP-NSM ἐκfromἐκPREP τοῦtheT-GSN ὕδατοςwater‚ὕδωρ, ὕδατοςN-GSN εἶδενhe sawεἴδωV-2AAI-3S σχιζομένουςtearing openσχίζωV-PPP-APM τοὺςtheT-APM οὐρανοὺςheavens‚οὐρανόςN-APM καὶandκαίCONJ τὸtheT-ASN ΠνεῦμαSpiritπνεῦμαN-ASN ὡςasὡςCONJ περιστερὰνa doveπεριστεράN-ASF καταβαῖνονdescendingκαταβαίνωV-PAP-ASN εἰςuponεἰςPREP αὐτόν·Him.αὐτόςP-ASM 可1:11 καὶAndκαίCONJ φωνὴa voiceφωνήN-NSF ἐγένετοcameγίνομαιV-2ADI-3S ἐκout ofἐκPREP τῶνtheT-GPM οὐρανῶν·heavens:οὐρανόςN-GPM ΣὺYouσύP-2NS εἶareεἰμίV-PAI-2S theT-NSM ΥἱόςSonυἱόςN-NSM μουof Me‚ἐγώP-1GS theT-NSM ἀγαπητός‚beloved‚ἀγαπητόςA-NSM ἐνinἐνPREP σοὶYouσύP-2DS εὐδόκησα.¶I am well pleased.εὐδοκέωV-AAI-1S 可1:12 ΚαὶAndκαίCONJ εὐθὺςimmediatelyεὐθέωςADV τὸtheT-NSN ΠνεῦμαSpiritπνεῦμαN-NSN αὐτὸνHimαὐτόςP-ASM ἐκβάλλειdrives outἐκβάλλωV-PAI-3S εἰςintoεἰςPREP τὴνtheT-ASF ἔρημον.wilderness.ἔρημοςA-ASF + 可1:13 καὶAndκαίCONJ ἦνHe wasεἰμίV-IAI-3S ἐνinἐνPREP τῇtheT-DSF ἐρήμῳwildernessἔρημοςA-DSF τεσσεράκονταfortyτεσσαράκονταA-APF-NUI ἡμέραςdays‚ἡμέραN-APF πειραζόμενοςbeing temptedπειράζωV-PPP-NSM ὑπὸbyὑπόPREP τοῦT-GSM Σατανᾶ‚Satan.ΣατανᾶςN-GSM-T καὶAndκαίCONJ ἦνHe wasεἰμίV-IAI-3S μετὰwithμετάPREP τῶνtheT-GPN θηρίων‚wild animals;θηρίονN-GPN καὶandκαίCONJ οἱtheT-NPM ἄγγελοιangelsἄγγελοςN-NPM διηκόνουνwere ministeringδιακονέωV-IAI-3P αὐτῷ.¶to Him.αὐτόςP-DSM 可1:14 ΜετὰafterμετάPREP δὲAndδέCONJ τὸtheT-ASN παραδοθῆναιdelivering upπαραδίδωμιV-APN τὸνT-ASM Ἰωάννηνof John‚ἸωάννηςN-ASM-P ἦλθενcameἔρχομαιV-2AAI-3S T-NSM ἸησοῦςJesusἸησοῦςN-NSM-P εἰςintoεἰςPREP τὴνT-ASF ΓαλιλαίανGalilee‚ΓαλιλαίαN-ASF-L κηρύσσωνproclaimingκηρύσσωV-PAP-NSM τὸtheT-ASN εὐαγγέλιονgospelεὐαγγέλιονN-ASN τοῦT-GSM Θεοῦof GodθεόςN-GSM 可1:15 καὶandκαίCONJ λέγωνsayingλέγωV-PAP-NSM ὅτι‑‚ὅτιCONJ ΠεπλήρωταιHas been fulfilledπληρόωV-RPI-3S theT-NSM καιρὸςtime‚καιρόςN-NSM καὶandκαίCONJ ἤγγικενhas drawn nearἐγγίζωV-RAI-3S theT-NSF βασιλείαkingdomβασιλείαN-NSF τοῦT-GSM Θεοῦ·of God;θεόςN-GSM μετανοεῖτεrepentμετανοέωV-PAM-2P καὶandκαίCONJ πιστεύετεbelieveπιστεύωV-PAM-2P ἐνinἐνPREP τῷtheT-DSN εὐαγγελίῳ.¶gospel.εὐαγγέλιονN-DSN 可1:16 ΚαὶAndκαίCONJ παράγωνpassingπαράγωV-PAP-NSM παρὰbyπαράPREP τὴνtheT-ASF θάλασσανSeaθάλασσαN-ASF τῆςT-GSF Γαλιλαίαςof Galilee‚ΓαλιλαίαN-GSF-L εἶδενHe sawεἴδωV-2AAI-3S ΣίμωναSimonΣίμωνN-ASM-P καὶandκαίCONJ ἈνδρέανAndrew‚ἈνδρέαςN-ASM-P τὸνtheT-ASM ἀδελφὸνbrotherἀδελφόςN-ASM Σίμωνοςof Simon‚ΣίμωνN-GSM-P ἀμφιβάλλονταςcasting a netἀμφιβάλλωV-PAP-APM ἐνintoἐνPREP τῇtheT-DSF θαλάσσῃ·sea;θάλασσαN-DSF ἦσανthey wereεἰμίV-IAI-3P γὰρforγάρCONJ ἁλιεῖς.fishermen.ἁλιεύςN-NPM 可1:17 καὶAndκαίCONJ εἶπενsaidἔπω, ἐρῶ, εἶπονV-2AAI-3S αὐτοῖςto themαὐτόςP-DPM T-NSM Ἰησοῦς·Jesus‚ἸησοῦςN-NSM-P ΔεῦτεComeδεῦτεADV ὀπίσωafterὀπίσωPREP μου‚Me‚ἐγώP-1GS καὶandκαίCONJ ποιήσωI will makeποιέωV-FAI-1S ὑμᾶςyouσύP-2AP γενέσθαιto becomeγίνομαιV-2ADN ἁλιεῖςfishersἁλιεύςN-APM ἀνθρώπων.of men.ἄνθρωποςN-GPM 可1:18 καὶAndκαίCONJ εὐθὺςimmediately‚εὐθέωςADV ἀφέντεςhaving leftἀφίημιV-2AAP-NPM τὰtheT-APN δίκτυαnets‚δίκτυονN-APN ἠκολούθησανthey followedἀκολουθέωV-AAI-3P αὐτῷ.Him.αὐτόςP-DSM + 可1:19 ΚαὶAndκαίCONJ προβὰςhaving gone onπροβαίνωV-2AAP-NSM ὀλίγονa little‚ὀλίγοςA-ASN εἶδενHe sawεἴδωV-2AAI-3S ἸάκωβονJamesἸάκωβοςN-ASM-P τὸνthe [son]T-ASM τοῦT-GSM Ζεβεδαίουof Zebedee‚ΖεβεδαῖοςN-GSM-P καὶandκαίCONJ ἸωάννηνJohnἸωάννηςN-ASM-P τὸνtheT-ASM ἀδελφὸνbrotherἀδελφόςN-ASM αὐτοῦof him‚αὐτόςP-GSM καὶandκαίCONJ αὐτοὺςtheyαὐτόςP-APM ἐν[were] inἐνPREP τῷtheT-DSN πλοίῳboatπλοῖονN-DSN καταρτίζονταςadjustingκαταρτίζωV-PAP-APM τὰtheT-APN δίκτυα‚nets.δίκτυονN-APN 可1:20 καὶAndκαίCONJ εὐθὺςimmediatelyεὐθέωςADV ἐκάλεσενHe calledκαλέωV-AAI-3S αὐτούς.them;αὐτόςP-APM καὶandκαίCONJ ἀφέντεςhaving leftἀφίημιV-2AAP-NPM τὸνtheT-ASM πατέραfatherπατήρN-ASM αὐτῶνof themαὐτόςP-GPM ΖεβεδαῖονZebedeeΖεβεδαῖοςN-ASM-P ἐνinἐνPREP τῷtheT-DSN πλοίῳboatπλοῖονN-DSN μετὰwithμετάPREP τῶνtheT-GPM μισθωτῶνhired servants‚μισθωτόςN-GPM ἀπῆλθονthey went awayἀπέρχομαιV-2AAI-3P ὀπίσωafterὀπίσωPREP αὐτοῦ.¶Him.αὐτόςP-GSM 可1:21 ΚαὶAndκαίCONJ εἰσπορεύονταιthey goεἰσπορεύωV-PNI-3P εἰςintoεἰςPREP Καφαρναούμ·Capernaum;ΚαπερναούμN-ASF-L καὶandκαίCONJ εὐθὺςimmediatelyεὐθέωςADV τοῖςon theT-DPN σάββασινSabbaths‚σάββατονN-DPN εἰσελθὼνhaving enteredεἰσέρχομαιV-2AAP-NSM εἰςintoεἰςPREP τὴνtheT-ASF συναγωγὴνsynagogue‚συναγωγήN-ASF ἐδίδασκεν.He was teaching.διδάσκωV-IAI-3S 可1:22 καὶAndκαίCONJ ἐξεπλήσσοντοthey were astonishedἐκπλήσσωV-IPI-3P ἐπὶatἐπίPREP τῇtheT-DSF διδαχῇteachingδιδαχήN-DSF αὐτοῦ·of Him;αὐτόςP-GSM ἦνHe wasεἰμίV-IAI-3S γὰρforγάρCONJ διδάσκωνteachingδιδάσκωV-PAP-NSM αὐτοὺςthemαὐτόςP-APM ὡςasὡςCONJ ἐξουσίανauthorityἐξουσίαN-ASF ἔχωνhaving‚ἔχωV-PAP-NSM καὶandκαίCONJ οὐχnotοὐPRT-N ὡςasὡςCONJ οἱtheT-NPM γραμματεῖς.¶scribes.γραμματεύςN-NPM \ No newline at end of file diff --git a/Mounce-BBG/複習 7 (Mat 13.1–23) 解答.md b/Mounce-BBG/複習 7 (Mat 13.1–23) 解答.md new file mode 100644 index 0000000..9b4c660 --- /dev/null +++ b/Mounce-BBG/複習 7 (Mat 13.1–23) 解答.md @@ -0,0 +1,9 @@ +# 複習 #7 — 太 13:1–23 (23 節) + +## 圖析 + + 太13:1 ἘνInἐνPREP τῇtheT-DSF ἡμέρᾳdayἡμέραN-DSF ἐκείνῃthat‚ἐκεῖνοςD-DSF ἐξελθὼνhaving gone forthἐξέρχομαιV-2AAP-NSM T-NSM ἸησοῦςJesusἸησοῦςN-NSM-P τῆς[from] theT-GSF οἰκίαςhouse‚οἰκίαN-GSF ἐκάθητοwas sittingκάθημαιV-INI-3S παρὰbyπαράPREP τὴνtheT-ASF θάλασσαν·sea.θάλασσαN-ASF 太13:2 καὶAndκαίCONJ συνήχθησανwere gathered togetherσυνάγωV-API-3P πρὸςtoπρόςPREP αὐτὸνHimαὐτόςP-ASM ὄχλοιcrowdsὄχλοςN-NPM πολλοί‚great‚πολύςA-NPM ὥστεso thatὥστεCONJ αὐτὸνHeαὐτόςP-ASM εἰςintoεἰςPREP πλοῖονa boatπλοῖονN-ASN ἐμβάνταhaving enteredἐμβαίνωV-2AAP-ASM καθῆσθαι‚sat down‚κάθημαιV-PNN καὶandκαίCONJ πᾶςallπᾶςA-NSM theT-NSM ὄχλοςcrowdὄχλοςN-NSM ἐπὶonἐπίPREP τὸνtheT-ASM αἰγιαλὸνshoreαἰγιαλόςN-ASM εἱστήκει.¶stood.ἵστημιV-LAI-3S 太13:3 ΚαὶAndκαίCONJ ἐλάλησενHe spokeλαλέωV-AAI-3S αὐτοῖςto themαὐτόςP-DPM πολλὰmany thingsπολύςA-APN ἐνinἐνPREP παραβολαῖςparables‚παραβολήN-DPF λέγων·saying‚λέγωV-PAP-NSM ἸδοὺBehold‚ἰδούINJ ἐξῆλθενwent outἐξέρχομαιV-2AAI-3S the [one]T-NSM σπείρωνsowingσπείρωV-PAP-NSM τοῦT-GSN σπείρειν.to sow.σπείρωV-PAN 太13:4 καὶAndκαίCONJ ἐνinἐνPREP τῷT-DSN σπείρεινsowingσπείρωV-PAN αὐτὸνof him‚αὐτόςP-ASM someὅς, ἥR-NPN μὲνindeedμένPRT ἔπεσενfellπίπτωV-2AAI-3S παρὰalongπαράPREP τὴνtheT-ASF ὁδόν‚road‚ὁδόςN-ASF καὶandκαίCONJ ἐλθόνταhaving come‚ἔρχομαιV-2AAP-NPN τὰtheT-NPN πετεινὰbirdsπετεινόςA-NPN κατέφαγενdevouredκατεσθίωV-2AAI-3S αὐτά.them.αὐτόςP-APN 太13:5 ἌλλαOtherἄλλοςA-NPN δὲnowδέCONJ ἔπεσενfellπίπτωV-2AAI-3S ἐπὶuponἐπίPREP τὰtheT-APN πετρώδηrocky places‚πετρώδηςA-APN ὅπουwhereὅπουADV οὐκnotοὐPRT-N εἶχενit hadἔχωV-IAI-3S γῆνsoilγῆN-ASF πολλήν‚much‚πολύςA-ASF καὶandκαίCONJ εὐθέωςimmediatelyεὐθέωςADV ἐξανέτειλενit sprang up‚ἐξανατέλλωV-AAI-3S διὰthroughδιάPREP τὸT-ASN μὴnotμήPRT-N ἔχεινhavingἔχωV-PAN βάθοςdepthβάθοςN-ASN γῆς·of soil;γῆN-GSF 太13:6 ἡλίου[the] sunἥλιοςN-GSM δὲnowδέCONJ ἀνατείλαντοςhaving risen‚ἀνατέλλωV-AAP-GSM ἐκαυματίσθηthey were scorched‚καυματίζωV-API-3S καὶandκαίCONJ διὰthroughδιάPREP τὸtheT-ASN μὴnotμήPRT-N ἔχεινhavingἔχωV-PAN ῥίζανroot‚ῥίζαN-ASF ἐξηράνθη.were dried up.ξηραίνωV-API-3S + 太13:7 ἌλλαOtherἄλλοςA-NPN δὲnowδέCONJ ἔπεσενfellπίπτωV-2AAI-3S ἐπὶuponἐπίPREP τὰςtheT-APF ἀκάνθας‚thorns‚ἄκανθαN-APF καὶandκαίCONJ ἀνέβησανgrew upἀναβαίνωV-2AAI-3P αἱtheT-NPF ἄκανθαιthorns‚ἄκανθαN-NPF καὶandκαίCONJ ἔπνιξανchokedπνίγωV-AAI-3P αὐτά.them.αὐτόςP-APN 太13:8 ἌλλαOtherἄλλοςA-NPN δὲnowδέCONJ ἔπεσενfellπίπτωV-2AAI-3S ἐπὶuponἐπίPREP τὴνtheT-ASF γῆνsoilγῆN-ASF τὴνT-ASF καλὴνgood‚καλόςA-ASF καὶandκαίCONJ ἐδίδουwere yieldingδίδωμιV-IAI-3S καρπόν‚fruit‚καρπόςN-ASM someὅς, ἥR-NSN μὲνindeedμένPRT ἑκατὸν‚a hundredfold‚ἑκατόνA-APN-NUI someὅς, ἥR-NSN δὲnowδέCONJ ἑξήκοντα‚sixty‚ἑξήκονταA-APN-NUI someὅς, ἥR-NSN δὲnowδέCONJ τριάκοντα.thirty.τριάκονταA-APN-NUI 太13:9 The [one]T-NSM ἔχωνhavingἔχωV-PAP-NSM ὦταears‚οὖςN-APN ἀκουέτω.¶let him hear!ἀκούωV-PAM-3S 太13:10 ΚαὶAndκαίCONJ προσελθόντεςhaving come to [Him]‚προσέρχομαιV-2AAP-NPM οἱtheT-NPM μαθηταὶdisciplesμαθητήςN-NPM εἶπανsaidἔπω, ἐρῶ, εἶπονV-2AAI-3P αὐτῷ·to Him‚αὐτόςP-DSM ΔιὰBecause ofδιάPREP τίwhyτίςI-ASN ἐνinἐνPREP παραβολαῖςparablesπαραβολήN-DPF λαλεῖςspeak YouλαλέωV-PAI-2S αὐτοῖς;to them?αὐτόςP-DPM 太13:11 T-NSM δὲAndδέCONJ ἀποκριθεὶςanswering‚ἀποκρίνωV-AOP-NSM εἶπενHe saidἔπω, ἐρῶ, εἶπονV-2AAI-3S αὐτοῖς·to them‚αὐτόςP-DPM ὍτιBecauseὅτιCONJ Ὑμῖνto youσύP-2DP δέδοταιit has been grantedδίδωμιV-RPI-3S γνῶναιto knowγινώσκωV-2AAN τὰtheT-APN μυστήριαmysteriesμυστήριονN-APN τῆςof theT-GSF βασιλείαςkingdomβασιλείαN-GSF τῶνof theT-GPM οὐρανῶν‚heavens;οὐρανόςN-GPM ἐκείνοιςto themἐκεῖνοςD-DPM δὲhoweverδέCONJ οὐnotοὐPRT-N δέδοται.it has been granted.δίδωμιV-RPI-3S 太13:12 ὅστιςWhoeverὅστις, ἥτιςR-NSM γὰρforγάρCONJ ἔχει‚has‚ἔχωV-PAI-3S δοθήσεταιwill be givenδίδωμιV-FPI-3S αὐτῷto him‚αὐτόςP-DSM καὶandκαίCONJ περισσευθήσεται·he will be in abundance;περισσεύωV-FPI-3S ὅστιςwhoeverὅστις, ἥτιςR-NSM δὲnowδέCONJ οὐκnotοὐPRT-N ἔχει‚has‚ἔχωV-PAI-3S καὶevenκαίCONJ whatὅς, ἥR-ASN ἔχειhe hasἔχωV-PAI-3S ἀρθήσεταιwill be taken awayαἴρωV-FPI-3S ἀπ᾽fromἀπόPREP αὐτοῦ.him.αὐτόςP-GSM 太13:13 διὰBecause ofδιάPREP τοῦτοthis‚οὗτοςD-ASN ἐνinἐνPREP παραβολαῖςparablesπαραβολήN-DPF αὐτοῖςto themαὐτόςP-DPM λαλῶ‚I speak:λαλέωV-PAI-1S ὍτιBecauseὅτιCONJ βλέποντεςseeing‚βλέπωV-PAP-NPM οὐnotοὐPRT-N βλέπουσινdo they see;βλέπωV-PAI-3P ΚαὶandκαίCONJ ἀκούοντεςhearing‚ἀκούωV-PAP-NPM οὐκnotοὐPRT-N ἀκούουσινdo they hear‚ἀκούωV-PAI-3P οὐδὲnorοὐδέCONJ-N συνίουσιν‚do they understand.συνίημιV-PAI-3P + 太13:14 ΚαὶAndκαίCONJ ἀναπληροῦταιis fulfilledἀναπληρόωV-PPI-3S αὐτοῖςin themαὐτόςP-DPM theT-NSF προφητείαprophecyπροφητείαN-NSF Ἠσαΐουof Isaiah‚ἩσαΐαςN-GSM-P T-NSF λέγουσα·saying:λέγωV-PAP-NSF ἈκοῇIn hearingἀκοήN-DSF ἀκούσετεyou will hear‚ἀκούωV-FAI-2P καὶandκαίCONJ οὐnoοὐPRT-N μὴnotμήPRT-N συνῆτε‚understand;συνίημιV-2AAS-2P ΚαὶandκαίCONJ βλέποντεςseeingβλέπωV-PAP-NPM βλέψετεyou will seeβλέπωV-FAI-2P καὶandκαίCONJ οὐnoοὐPRT-N μὴnotμήPRT-N ἴδητε.perceive.εἴδωV-2AAS-2P 太13:15 ἘπαχύνθηHas grown dullπαχύνωV-API-3S γὰρforγάρCONJ theT-NSF καρδίαheartκαρδίαN-NSF τοῦof theT-GSM λαοῦpeopleλαόςN-GSM τούτου‚this‚οὗτοςD-GSM ΚαὶandκαίCONJ τοῖςwith theT-DPN ὠσὶνearsοὖςN-DPN βαρέωςbarelyβαρέωςADV ἤκουσανthey have heard‚ἀκούωV-AAI-3P ΚαὶandκαίCONJ τοὺςtheT-APM ὀφθαλμοὺςeyesὀφθαλμόςN-APM αὐτῶνof themαὐτόςP-GPM ἐκάμμυσαν‚they have closed;καμμύωV-AAI-3P Μήποτεnot lestμήποτεCONJ ἴδωσινthey should seeεἴδωV-2AAS-3P τοῖςwith theT-DPM ὀφθαλμοῖςeyes‚ὀφθαλμόςN-DPM ΚαὶandκαίCONJ τοῖςwith theT-DPN ὠσὶνearsοὖςN-DPN ἀκούσωσινthey should hear‚ἀκούωV-AAS-3P ΚαὶandκαίCONJ τῇwith theT-DSF καρδίᾳheartκαρδίαN-DSF συνῶσινthey should understand‚συνίημιV-2AAS-3P ΚαὶandκαίCONJ ἐπιστρέψωσινshould return‚ἐπιστρέφωV-AAS-3P ΚαὶandκαίCONJ ἰάσομαιI will healἰάομαιV-FDI-1S αὐτούς.¶them.’αὐτόςP-APM 太13:16 ὙμῶνOf youσύP-2GP δὲhoweverδέCONJ μακάριοιblessedμακάριοςA-NPM οἱ[are] theT-NPM ὀφθαλμοὶeyes‚ὀφθαλμόςN-NPM ὅτιbecauseὅτιCONJ βλέπουσινthey see;βλέπωV-PAI-3P καὶandκαίCONJ τὰtheT-NPN ὦταearsοὖςN-NPN ὑμῶνof you‚σύP-2GP ὅτιbecauseὅτιCONJ ἀκούουσιν.they hear.ἀκούωV-PAI-3P 太13:17 ἀμὴνTrulyἀμήνHEB γὰρforγάρCONJ λέγωI sayλέγωV-PAI-1S ὑμῖνto you‚σύP-2DP ὅτιthatὅτιCONJ πολλοὶmanyπολύςA-NPM προφῆταιprophetsπροφήτηςN-NPM καὶandκαίCONJ δίκαιοιrighteous [men]δίκαιοςA-NPM ἐπεθύμησανlongedἐπιθυμέωV-AAI-3P ἰδεῖνto seeεἴδωV-2AAN whatὅς, ἥR-APN βλέπετεyou see‚βλέπωV-PAI-2P καὶandκαίCONJ οὐκnotοὐPRT-N εἶδαν‚saw;εἴδωV-2AAI-3P καὶandκαίCONJ ἀκοῦσαιto hearἀκούωV-AAN whatὅς, ἥR-APN ἀκούετεyou hear‚ἀκούωV-PAI-2P καὶandκαίCONJ οὐκnotοὐPRT-N ἤκουσαν.¶heard.ἀκούωV-AAI-3P 太13:18 ὙμεῖςYouσύP-2NP οὖνthereforeοὖνCONJ ἀκούσατεhearἀκούωV-AAM-2P τὴνtheT-ASF παραβολὴνparableπαραβολήN-ASF τοῦof the [one]T-GSM σπείραντος.having sown:σπείρωV-AAP-GSM + 太13:19 ΠαντὸςEveryoneπᾶςA-GSM ἀκούοντοςhearingἀκούωV-PAP-GSM τὸνtheT-ASM λόγονwordλόγοςN-ASM τῆςof theT-GSF βασιλείαςkingdomβασιλείαN-GSF καὶandκαίCONJ μὴnotμήPRT-N συνιέντοςunderstanding‚συνίημιV-PAP-GSM ἔρχεταιcomesἔρχομαιV-PNI-3S theT-NSM πονηρὸςevil oneπονηρόςA-NSM καὶandκαίCONJ ἁρπάζειsnatches awayἁρπάζωV-PAI-3S τὸthatT-ASN ἐσπαρμένονhaving been sownσπείρωV-2RPP-ASN ἐνinἐνPREP τῇtheT-DSF καρδίᾳheartκαρδίαN-DSF αὐτοῦ‚of him.αὐτόςP-GSM οὗτόςThisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S the [one]T-NSM παρὰonπαράPREP τὴνtheT-ASF ὁδὸνpathὁδόςN-ASF σπαρείς.having been sown.σπείρωV-2APP-NSM 太13:20 That whichT-NSM δὲnowδέCONJ ἐπὶuponἐπίPREP τὰtheT-APN πετρώδηrocky placesπετρώδηςA-APN σπαρείς‚having been sown‚σπείρωV-2APP-NSM οὗτόςthisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S the [one]T-NSM τὸνtheT-ASM λόγονwordλόγοςN-ASM ἀκούωνhearing‚ἀκούωV-PAP-NSM καὶandκαίCONJ εὐθὺςimmediatelyεὐθέωςADV μετὰwithμετάPREP χαρᾶςjoyχαράN-GSF λαμβάνωνreceivingλαμβάνωV-PAP-NSM αὐτόν‚it;αὐτόςP-ASM 太13:21 οὐκnoοὐPRT-N ἔχειhe hasἔχωV-PAI-3S δὲnowδέCONJ ῥίζανrootῥίζαN-ASF ἐνinἐνPREP ἑαυτῷhimself‚ἑαυτοῦF-3DSM ἀλλὰbutἀλλάCONJ πρόσκαιρόςtemporaryπρόσκαιροςA-NSM ἐστιν‚is;εἰμίV-PAI-3S γενομένηςhaving comeγίνομαιV-2ADP-GSF δὲhoweverδέCONJ θλίψεωςtribulationθλῖψιςN-GSF orCONJ διωγμοῦpersecutionδιωγμόςN-GSM διὰon account ofδιάPREP τὸνtheT-ASM λόγονword‚λόγοςN-ASM εὐθὺςimmediatelyεὐθέωςADV σκανδαλίζεται.he falls away.σκανδαλίζωV-PPI-3S 太13:22 That whichT-NSM δὲnowδέCONJ εἰςamongεἰςPREP τὰςtheT-APF ἀκάνθαςthornsἄκανθαN-APF σπαρείς‚having been sown‚σπείρωV-2APP-NSM οὗτόςthisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S the [one]T-NSM τὸνtheT-ASM λόγονwordλόγοςN-ASM ἀκούων‚hearing‚ἀκούωV-PAP-NSM καὶandκαίCONJ theT-NSF μέριμναcareμέριμναN-NSF τοῦT-GSM αἰῶνος[the] present ageαἰώνN-GSM καὶandκαίCONJ theT-NSF ἀπάτηdeceitἀπάτηN-NSF τοῦT-GSM πλούτουof richesπλοῦτοςN-GSM συμπνίγειchokeσυμπνίγωV-PAI-3S τὸνtheT-ASM λόγονword‚λόγοςN-ASM καὶandκαίCONJ ἄκαρποςunfruitfulἄκαρποςA-NSM γίνεται.it becomes.γίνομαιV-PNI-3S + 太13:23 ThatT-NSM δὲhoweverδέCONJ ἐπὶonἐπίPREP τὴνtheT-ASF καλὴνgoodκαλόςA-ASF γῆνsoilγῆN-ASF σπαρείς‚having been sown‚σπείρωV-2APP-NSM οὗτόςthisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S the [one]T-NSM τὸνtheT-ASM λόγονwordλόγοςN-ASM ἀκούωνhearingἀκούωV-PAP-NSM καὶandκαίCONJ συνιείς‚understanding‚συνίημιV-PAP-NSM ὃςwhoὅς, ἥR-NSM δὴindeedδήPRT καρποφορεῖbrings forth fruitκαρποφορέωV-PAI-3S καὶandκαίCONJ ποιεῖproduces -ποιέωV-PAI-3S someὅς, ἥR-ASN μὲνindeedμένPRT ἑκατὸν‚a hundredfold‚ἑκατόνA-APN-NUI someὅς, ἥR-ASN δὲnowδέCONJ ἑξήκοντα‚sixty‚ἑξήκονταA-APN-NUI someὅς, ἥR-ASN δὲnowδέCONJ τριάκοντα.¶thirty.τριάκονταA-APN-NUI \ No newline at end of file diff --git a/Mounce-BBG/複習 7 (Mat 13.1–23).md b/Mounce-BBG/複習 7 (Mat 13.1–23).md new file mode 100644 index 0000000..8bbf430 --- /dev/null +++ b/Mounce-BBG/複習 7 (Mat 13.1–23).md @@ -0,0 +1,8 @@ +# 複習 #7 — 太 13:1–23 (23 節) + + + 太13:1 ἘνInἐνPREP τῇtheT-DSF ἡμέρᾳdayἡμέραN-DSF ἐκείνῃthat‚ἐκεῖνοςD-DSF ἐξελθὼνhaving gone forthἐξέρχομαιV-2AAP-NSM T-NSM ἸησοῦςJesusἸησοῦςN-NSM-P τῆς[from] theT-GSF οἰκίαςhouse‚οἰκίαN-GSF ἐκάθητοwas sittingκάθημαιV-INI-3S παρὰbyπαράPREP τὴνtheT-ASF θάλασσαν·sea.θάλασσαN-ASF 太13:2 καὶAndκαίCONJ συνήχθησανwere gathered togetherσυνάγωV-API-3P πρὸςtoπρόςPREP αὐτὸνHimαὐτόςP-ASM ὄχλοιcrowdsὄχλοςN-NPM πολλοί‚great‚πολύςA-NPM ὥστεso thatὥστεCONJ αὐτὸνHeαὐτόςP-ASM εἰςintoεἰςPREP πλοῖονa boatπλοῖονN-ASN ἐμβάνταhaving enteredἐμβαίνωV-2AAP-ASM καθῆσθαι‚sat down‚κάθημαιV-PNN καὶandκαίCONJ πᾶςallπᾶςA-NSM theT-NSM ὄχλοςcrowdὄχλοςN-NSM ἐπὶonἐπίPREP τὸνtheT-ASM αἰγιαλὸνshoreαἰγιαλόςN-ASM εἱστήκει.¶stood.ἵστημιV-LAI-3S 太13:3 ΚαὶAndκαίCONJ ἐλάλησενHe spokeλαλέωV-AAI-3S αὐτοῖςto themαὐτόςP-DPM πολλὰmany thingsπολύςA-APN ἐνinἐνPREP παραβολαῖςparables‚παραβολήN-DPF λέγων·saying‚λέγωV-PAP-NSM ἸδοὺBehold‚ἰδούINJ ἐξῆλθενwent outἐξέρχομαιV-2AAI-3S the [one]T-NSM σπείρωνsowingσπείρωV-PAP-NSM τοῦT-GSN σπείρειν.to sow.σπείρωV-PAN 太13:4 καὶAndκαίCONJ ἐνinἐνPREP τῷT-DSN σπείρεινsowingσπείρωV-PAN αὐτὸνof him‚αὐτόςP-ASM someὅς, ἥR-NPN μὲνindeedμένPRT ἔπεσενfellπίπτωV-2AAI-3S παρὰalongπαράPREP τὴνtheT-ASF ὁδόν‚road‚ὁδόςN-ASF καὶandκαίCONJ ἐλθόνταhaving come‚ἔρχομαιV-2AAP-NPN τὰtheT-NPN πετεινὰbirdsπετεινόςA-NPN κατέφαγενdevouredκατεσθίωV-2AAI-3S αὐτά.them.αὐτόςP-APN 太13:5 ἌλλαOtherἄλλοςA-NPN δὲnowδέCONJ ἔπεσενfellπίπτωV-2AAI-3S ἐπὶuponἐπίPREP τὰtheT-APN πετρώδηrocky places‚πετρώδηςA-APN ὅπουwhereὅπουADV οὐκnotοὐPRT-N εἶχενit hadἔχωV-IAI-3S γῆνsoilγῆN-ASF πολλήν‚much‚πολύςA-ASF καὶandκαίCONJ εὐθέωςimmediatelyεὐθέωςADV ἐξανέτειλενit sprang up‚ἐξανατέλλωV-AAI-3S διὰthroughδιάPREP τὸT-ASN μὴnotμήPRT-N ἔχεινhavingἔχωV-PAN βάθοςdepthβάθοςN-ASN γῆς·of soil;γῆN-GSF 太13:6 ἡλίου[the] sunἥλιοςN-GSM δὲnowδέCONJ ἀνατείλαντοςhaving risen‚ἀνατέλλωV-AAP-GSM ἐκαυματίσθηthey were scorched‚καυματίζωV-API-3S καὶandκαίCONJ διὰthroughδιάPREP τὸtheT-ASN μὴnotμήPRT-N ἔχεινhavingἔχωV-PAN ῥίζανroot‚ῥίζαN-ASF ἐξηράνθη.were dried up.ξηραίνωV-API-3S + 太13:7 ἌλλαOtherἄλλοςA-NPN δὲnowδέCONJ ἔπεσενfellπίπτωV-2AAI-3S ἐπὶuponἐπίPREP τὰςtheT-APF ἀκάνθας‚thorns‚ἄκανθαN-APF καὶandκαίCONJ ἀνέβησανgrew upἀναβαίνωV-2AAI-3P αἱtheT-NPF ἄκανθαιthorns‚ἄκανθαN-NPF καὶandκαίCONJ ἔπνιξανchokedπνίγωV-AAI-3P αὐτά.them.αὐτόςP-APN 太13:8 ἌλλαOtherἄλλοςA-NPN δὲnowδέCONJ ἔπεσενfellπίπτωV-2AAI-3S ἐπὶuponἐπίPREP τὴνtheT-ASF γῆνsoilγῆN-ASF τὴνT-ASF καλὴνgood‚καλόςA-ASF καὶandκαίCONJ ἐδίδουwere yieldingδίδωμιV-IAI-3S καρπόν‚fruit‚καρπόςN-ASM someὅς, ἥR-NSN μὲνindeedμένPRT ἑκατὸν‚a hundredfold‚ἑκατόνA-APN-NUI someὅς, ἥR-NSN δὲnowδέCONJ ἑξήκοντα‚sixty‚ἑξήκονταA-APN-NUI someὅς, ἥR-NSN δὲnowδέCONJ τριάκοντα.thirty.τριάκονταA-APN-NUI 太13:9 The [one]T-NSM ἔχωνhavingἔχωV-PAP-NSM ὦταears‚οὖςN-APN ἀκουέτω.¶let him hear!ἀκούωV-PAM-3S 太13:10 ΚαὶAndκαίCONJ προσελθόντεςhaving come to [Him]‚προσέρχομαιV-2AAP-NPM οἱtheT-NPM μαθηταὶdisciplesμαθητήςN-NPM εἶπανsaidἔπω, ἐρῶ, εἶπονV-2AAI-3P αὐτῷ·to Him‚αὐτόςP-DSM ΔιὰBecause ofδιάPREP τίwhyτίςI-ASN ἐνinἐνPREP παραβολαῖςparablesπαραβολήN-DPF λαλεῖςspeak YouλαλέωV-PAI-2S αὐτοῖς;to them?αὐτόςP-DPM 太13:11 T-NSM δὲAndδέCONJ ἀποκριθεὶςanswering‚ἀποκρίνωV-AOP-NSM εἶπενHe saidἔπω, ἐρῶ, εἶπονV-2AAI-3S αὐτοῖς·to them‚αὐτόςP-DPM ὍτιBecauseὅτιCONJ Ὑμῖνto youσύP-2DP δέδοταιit has been grantedδίδωμιV-RPI-3S γνῶναιto knowγινώσκωV-2AAN τὰtheT-APN μυστήριαmysteriesμυστήριονN-APN τῆςof theT-GSF βασιλείαςkingdomβασιλείαN-GSF τῶνof theT-GPM οὐρανῶν‚heavens;οὐρανόςN-GPM ἐκείνοιςto themἐκεῖνοςD-DPM δὲhoweverδέCONJ οὐnotοὐPRT-N δέδοται.it has been granted.δίδωμιV-RPI-3S 太13:12 ὅστιςWhoeverὅστις, ἥτιςR-NSM γὰρforγάρCONJ ἔχει‚has‚ἔχωV-PAI-3S δοθήσεταιwill be givenδίδωμιV-FPI-3S αὐτῷto him‚αὐτόςP-DSM καὶandκαίCONJ περισσευθήσεται·he will be in abundance;περισσεύωV-FPI-3S ὅστιςwhoeverὅστις, ἥτιςR-NSM δὲnowδέCONJ οὐκnotοὐPRT-N ἔχει‚has‚ἔχωV-PAI-3S καὶevenκαίCONJ whatὅς, ἥR-ASN ἔχειhe hasἔχωV-PAI-3S ἀρθήσεταιwill be taken awayαἴρωV-FPI-3S ἀπ᾽fromἀπόPREP αὐτοῦ.him.αὐτόςP-GSM 太13:13 διὰBecause ofδιάPREP τοῦτοthis‚οὗτοςD-ASN ἐνinἐνPREP παραβολαῖςparablesπαραβολήN-DPF αὐτοῖςto themαὐτόςP-DPM λαλῶ‚I speak:λαλέωV-PAI-1S ὍτιBecauseὅτιCONJ βλέποντεςseeing‚βλέπωV-PAP-NPM οὐnotοὐPRT-N βλέπουσινdo they see;βλέπωV-PAI-3P ΚαὶandκαίCONJ ἀκούοντεςhearing‚ἀκούωV-PAP-NPM οὐκnotοὐPRT-N ἀκούουσινdo they hear‚ἀκούωV-PAI-3P οὐδὲnorοὐδέCONJ-N συνίουσιν‚do they understand.συνίημιV-PAI-3P + 太13:14 ΚαὶAndκαίCONJ ἀναπληροῦταιis fulfilledἀναπληρόωV-PPI-3S αὐτοῖςin themαὐτόςP-DPM theT-NSF προφητείαprophecyπροφητείαN-NSF Ἠσαΐουof Isaiah‚ἩσαΐαςN-GSM-P T-NSF λέγουσα·saying:λέγωV-PAP-NSF ἈκοῇIn hearingἀκοήN-DSF ἀκούσετεyou will hear‚ἀκούωV-FAI-2P καὶandκαίCONJ οὐnoοὐPRT-N μὴnotμήPRT-N συνῆτε‚understand;συνίημιV-2AAS-2P ΚαὶandκαίCONJ βλέποντεςseeingβλέπωV-PAP-NPM βλέψετεyou will seeβλέπωV-FAI-2P καὶandκαίCONJ οὐnoοὐPRT-N μὴnotμήPRT-N ἴδητε.perceive.εἴδωV-2AAS-2P 太13:15 ἘπαχύνθηHas grown dullπαχύνωV-API-3S γὰρforγάρCONJ theT-NSF καρδίαheartκαρδίαN-NSF τοῦof theT-GSM λαοῦpeopleλαόςN-GSM τούτου‚this‚οὗτοςD-GSM ΚαὶandκαίCONJ τοῖςwith theT-DPN ὠσὶνearsοὖςN-DPN βαρέωςbarelyβαρέωςADV ἤκουσανthey have heard‚ἀκούωV-AAI-3P ΚαὶandκαίCONJ τοὺςtheT-APM ὀφθαλμοὺςeyesὀφθαλμόςN-APM αὐτῶνof themαὐτόςP-GPM ἐκάμμυσαν‚they have closed;καμμύωV-AAI-3P Μήποτεnot lestμήποτεCONJ ἴδωσινthey should seeεἴδωV-2AAS-3P τοῖςwith theT-DPM ὀφθαλμοῖςeyes‚ὀφθαλμόςN-DPM ΚαὶandκαίCONJ τοῖςwith theT-DPN ὠσὶνearsοὖςN-DPN ἀκούσωσινthey should hear‚ἀκούωV-AAS-3P ΚαὶandκαίCONJ τῇwith theT-DSF καρδίᾳheartκαρδίαN-DSF συνῶσινthey should understand‚συνίημιV-2AAS-3P ΚαὶandκαίCONJ ἐπιστρέψωσινshould return‚ἐπιστρέφωV-AAS-3P ΚαὶandκαίCONJ ἰάσομαιI will healἰάομαιV-FDI-1S αὐτούς.¶them.’αὐτόςP-APM 太13:16 ὙμῶνOf youσύP-2GP δὲhoweverδέCONJ μακάριοιblessedμακάριοςA-NPM οἱ[are] theT-NPM ὀφθαλμοὶeyes‚ὀφθαλμόςN-NPM ὅτιbecauseὅτιCONJ βλέπουσινthey see;βλέπωV-PAI-3P καὶandκαίCONJ τὰtheT-NPN ὦταearsοὖςN-NPN ὑμῶνof you‚σύP-2GP ὅτιbecauseὅτιCONJ ἀκούουσιν.they hear.ἀκούωV-PAI-3P 太13:17 ἀμὴνTrulyἀμήνHEB γὰρforγάρCONJ λέγωI sayλέγωV-PAI-1S ὑμῖνto you‚σύP-2DP ὅτιthatὅτιCONJ πολλοὶmanyπολύςA-NPM προφῆταιprophetsπροφήτηςN-NPM καὶandκαίCONJ δίκαιοιrighteous [men]δίκαιοςA-NPM ἐπεθύμησανlongedἐπιθυμέωV-AAI-3P ἰδεῖνto seeεἴδωV-2AAN whatὅς, ἥR-APN βλέπετεyou see‚βλέπωV-PAI-2P καὶandκαίCONJ οὐκnotοὐPRT-N εἶδαν‚saw;εἴδωV-2AAI-3P καὶandκαίCONJ ἀκοῦσαιto hearἀκούωV-AAN whatὅς, ἥR-APN ἀκούετεyou hear‚ἀκούωV-PAI-2P καὶandκαίCONJ οὐκnotοὐPRT-N ἤκουσαν.¶heard.ἀκούωV-AAI-3P 太13:18 ὙμεῖςYouσύP-2NP οὖνthereforeοὖνCONJ ἀκούσατεhearἀκούωV-AAM-2P τὴνtheT-ASF παραβολὴνparableπαραβολήN-ASF τοῦof the [one]T-GSM σπείραντος.having sown:σπείρωV-AAP-GSM + 太13:19 ΠαντὸςEveryoneπᾶςA-GSM ἀκούοντοςhearingἀκούωV-PAP-GSM τὸνtheT-ASM λόγονwordλόγοςN-ASM τῆςof theT-GSF βασιλείαςkingdomβασιλείαN-GSF καὶandκαίCONJ μὴnotμήPRT-N συνιέντοςunderstanding‚συνίημιV-PAP-GSM ἔρχεταιcomesἔρχομαιV-PNI-3S theT-NSM πονηρὸςevil oneπονηρόςA-NSM καὶandκαίCONJ ἁρπάζειsnatches awayἁρπάζωV-PAI-3S τὸthatT-ASN ἐσπαρμένονhaving been sownσπείρωV-2RPP-ASN ἐνinἐνPREP τῇtheT-DSF καρδίᾳheartκαρδίαN-DSF αὐτοῦ‚of him.αὐτόςP-GSM οὗτόςThisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S the [one]T-NSM παρὰonπαράPREP τὴνtheT-ASF ὁδὸνpathὁδόςN-ASF σπαρείς.having been sown.σπείρωV-2APP-NSM 太13:20 That whichT-NSM δὲnowδέCONJ ἐπὶuponἐπίPREP τὰtheT-APN πετρώδηrocky placesπετρώδηςA-APN σπαρείς‚having been sown‚σπείρωV-2APP-NSM οὗτόςthisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S the [one]T-NSM τὸνtheT-ASM λόγονwordλόγοςN-ASM ἀκούωνhearing‚ἀκούωV-PAP-NSM καὶandκαίCONJ εὐθὺςimmediatelyεὐθέωςADV μετὰwithμετάPREP χαρᾶςjoyχαράN-GSF λαμβάνωνreceivingλαμβάνωV-PAP-NSM αὐτόν‚it;αὐτόςP-ASM 太13:21 οὐκnoοὐPRT-N ἔχειhe hasἔχωV-PAI-3S δὲnowδέCONJ ῥίζανrootῥίζαN-ASF ἐνinἐνPREP ἑαυτῷhimself‚ἑαυτοῦF-3DSM ἀλλὰbutἀλλάCONJ πρόσκαιρόςtemporaryπρόσκαιροςA-NSM ἐστιν‚is;εἰμίV-PAI-3S γενομένηςhaving comeγίνομαιV-2ADP-GSF δὲhoweverδέCONJ θλίψεωςtribulationθλῖψιςN-GSF orCONJ διωγμοῦpersecutionδιωγμόςN-GSM διὰon account ofδιάPREP τὸνtheT-ASM λόγονword‚λόγοςN-ASM εὐθὺςimmediatelyεὐθέωςADV σκανδαλίζεται.he falls away.σκανδαλίζωV-PPI-3S 太13:22 That whichT-NSM δὲnowδέCONJ εἰςamongεἰςPREP τὰςtheT-APF ἀκάνθαςthornsἄκανθαN-APF σπαρείς‚having been sown‚σπείρωV-2APP-NSM οὗτόςthisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S the [one]T-NSM τὸνtheT-ASM λόγονwordλόγοςN-ASM ἀκούων‚hearing‚ἀκούωV-PAP-NSM καὶandκαίCONJ theT-NSF μέριμναcareμέριμναN-NSF τοῦT-GSM αἰῶνος[the] present ageαἰώνN-GSM καὶandκαίCONJ theT-NSF ἀπάτηdeceitἀπάτηN-NSF τοῦT-GSM πλούτουof richesπλοῦτοςN-GSM συμπνίγειchokeσυμπνίγωV-PAI-3S τὸνtheT-ASM λόγονword‚λόγοςN-ASM καὶandκαίCONJ ἄκαρποςunfruitfulἄκαρποςA-NSM γίνεται.it becomes.γίνομαιV-PNI-3S + 太13:23 ThatT-NSM δὲhoweverδέCONJ ἐπὶonἐπίPREP τὴνtheT-ASF καλὴνgoodκαλόςA-ASF γῆνsoilγῆN-ASF σπαρείς‚having been sown‚σπείρωV-2APP-NSM οὗτόςthisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S the [one]T-NSM τὸνtheT-ASM λόγονwordλόγοςN-ASM ἀκούωνhearingἀκούωV-PAP-NSM καὶandκαίCONJ συνιείς‚understanding‚συνίημιV-PAP-NSM ὃςwhoὅς, ἥR-NSM δὴindeedδήPRT καρποφορεῖbrings forth fruitκαρποφορέωV-PAI-3S καὶandκαίCONJ ποιεῖproduces -ποιέωV-PAI-3S someὅς, ἥR-ASN μὲνindeedμένPRT ἑκατὸν‚a hundredfold‚ἑκατόνA-APN-NUI someὅς, ἥR-ASN δὲnowδέCONJ ἑξήκοντα‚sixty‚ἑξήκονταA-APN-NUI someὅς, ἥR-ASN δὲnowδέCONJ τριάκοντα.¶thirty.τριάκονταA-APN-NUI \ No newline at end of file diff --git a/Mounce-Reader/GRBG-01a.md b/Mounce-Reader/GRBG-01a.md new file mode 100644 index 0000000..7480c5e --- /dev/null +++ b/Mounce-Reader/GRBG-01a.md @@ -0,0 +1,30 @@ +# Chapter 1 經文 + +## 約翰一書 1:1–4 + +約壹1:1 That whichὅς, ἥR-NSN ἦνwasεἰμίV-IAI-3S ἀπ᾽fromἀπόPREP ἀρχῆς‚[the] beginning‚ἀρχήN-GSF that whichὅς, ἥR-ASN ἀκηκόαμεν‚we have heard‚ἀκούωV-2RAI-1P that whichὅς, ἥR-ASN ἑωράκαμενwe have seenὁράωV-RAI-1P τοῖςwith theT-DPM ὀφθαλμοῖςeyesὀφθαλμόςN-DPM ἡμῶν‚of us‚ἐγώP-1GP that whichὅς, ἥR-ASN ἐθεασάμεθαwe have gazed uponθεάομαιV-ADI-1P καὶandκαίCONJ αἱtheT-NPF χεῖρεςhandsχείρN-NPF ἡμῶνof usἐγώP-1GP ἐψηλάφησανhave handled‚ψηλαφάωV-AAI-3P περὶconcerningπερίPREP τοῦtheT-GSM ΛόγουWordλόγοςN-GSM τῆςT-GSF ζωῆς-of life -ζωήN-GSF 約壹1:2 καὶandκαίCONJ theT-NSF ζωὴlifeζωήN-NSF ἐφανερώθη‚was made manifest‚φανερόωV-API-3S καὶandκαίCONJ ἑωράκαμενwe have seenὁράωV-RAI-1P καὶandκαίCONJ μαρτυροῦμενbear witness‚μαρτυρέωV-PAI-1P καὶandκαίCONJ ἀπαγγέλλομενwe proclaimἀπαγγέλλωV-PAI-1P ὑμῖνto youσύP-2DP τὴνtheT-ASF ζωὴνlifeζωήN-ASF τὴνT-ASF αἰώνιονeternalαἰώνιοςA-ASF ἥτιςwhichὅστις, ἥτιςR-NSF ἦνwasεἰμίV-IAI-3S πρὸςwithπρόςPREP τὸνtheT-ASM ΠατέραFatherπατήρN-ASM καὶandκαίCONJ ἐφανερώθηwas revealedφανερόωV-API-3S ἡμῖν-to us -ἐγώP-1DP 約壹1:3 that whichὅς, ἥR-ASN ἑωράκαμενwe have seenὁράωV-RAI-1P καὶandκαίCONJ ἀκηκόαμεν‚have heard‚ἀκούωV-2RAI-1P ἀπαγγέλλομενwe proclaimἀπαγγέλλωV-PAI-1P καὶalsoκαίCONJ ὑμῖν‚to you‚σύP-2DP ἵναso thatἵναCONJ καὶalsoκαίCONJ ὑμεῖςyouσύP-2NP κοινωνίανfellowshipκοινωνίαN-ASF ἔχητεmay haveἔχωV-PAS-2P μεθ᾽withμετάPREP ἡμῶν.us.ἐγώP-1GP καὶIndeedκαίCONJ theT-NSF κοινωνίαfellowshipκοινωνίαN-NSF δὲnowδέCONJ T-NSF ἡμετέραof usἡμέτεροςS-1PNSF μετὰ[is] withμετάPREP τοῦtheT-GSM ΠατρὸςFather‚πατήρN-GSM καὶandκαίCONJ μετὰwithμετάPREP τοῦtheT-GSM ΥἱοῦSonυἱόςN-GSM αὐτοῦof Him‚αὐτόςP-GSM ἸησοῦJesusἸησοῦςN-GSM-P Χριστοῦ.Christ.ΧριστόςN-GSM-T 約壹1:4 καὶAndκαίCONJ ταῦταthese thingsοὗτοςD-APN γράφομενwriteγράφωV-PAI-1P ἡμεῖς‚weἐγώP-1NP ἵναso thatἵναCONJ theT-NSF χαρὰjoyχαράN-NSF ἡμῶνof usἐγώP-1GP might beεἰμίV-PAS-3S πεπληρωμένη.¶complete.πληρόωV-RPP-NSF + +
+ +## 約翰一書 1:5-10 + +約壹1:5 ΚαὶAndκαίCONJ ἔστινisεἰμίV-PAI-3S αὕτηthisοὗτοςD-NSF theT-NSF ἀγγελίαmessageἀγγελίαN-NSF ἣνthatὅς, ἥR-ASF ἀκηκόαμενwe have heardἀκούωV-2RAI-1P ἀπ᾽fromἀπόPREP αὐτοῦHim‚αὐτόςP-GSM καὶandκαίCONJ ἀναγγέλλομενwe preachἀναγγέλλωV-PAI-1P ὑμῖν‚to you‚σύP-2DP ὅτιthatὅτιADV T-NSM ΘεὸςGodθεόςN-NSM φῶςlightφῶςN-NSN ἐστινis‚εἰμίV-PAI-3S καὶandκαίCONJ σκοτίαdarknessσκοτίαN-NSF ἐνinἐνPREP αὐτῷHim‚αὐτόςP-DSM οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S οὐδεμία.none.οὐδείςA-NSF 約壹1:6 ἘὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ κοινωνίανfellowshipκοινωνίαN-ASF ἔχομενwe haveἔχωV-PAI-1P μετ᾽withμετάPREP αὐτοῦHim‚αὐτόςP-GSM καὶand yetκαίCONJ ἐνinἐνPREP τῷtheT-DSN σκότειdarknessσκότοςN-DSN περιπατῶμεν‚should walk‚περιπατέωV-PAS-1P ψευδόμεθαwe lieψεύδομαιV-PNI-1P καὶandκαίCONJ οὐnotοὐPRT-N ποιοῦμενdo practiceποιέωV-PAI-1P τὴνtheT-ASF ἀλήθειαν·truth.ἀλήθειαN-ASF 約壹1:7 ἐὰνIfἐάνCONJ ἐνinἐνPREP τῷtheT-DSN φωτὶlightφῶςN-DSN περιπατῶμεν‚we should walkπεριπατέωV-PAS-1P ὡςasὡςCONJ αὐτόςHeαὐτόςP-NSM ἐστινisεἰμίV-PAI-3S ἐνinἐνPREP τῷtheT-DSN φωτί‚light‚φῶςN-DSN κοινωνίανfellowshipκοινωνίαN-ASF ἔχομενwe haveἔχωV-PAI-1P μετ᾽withμετάPREP ἀλλήλων‚one another‚ἀλλήλωνC-GPM καὶandκαίCONJ τὸtheT-NSN αἷμαbloodαἷμαN-NSN Ἰησοῦof Jesus‚ἸησοῦςN-GSM-P τοῦtheT-GSM ΥἱοῦSonυἱόςN-GSM αὐτοῦof Him‚αὐτόςP-GSM καθαρίζειcleansesκαθαρίζωV-PAI-3S ἡμᾶςusἐγώP-1AP ἀπὸfromἀπόPREP πάσηςallπᾶςA-GSF ἁμαρτίας.sin.ἁμαρτίαN-GSF 約壹1:8 ἘὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ ἁμαρτίανsinἁμαρτίαN-ASF οὐκnotοὐPRT-N ἔχομεν‚we have‚ἔχωV-PAI-1P ἑαυτοὺςourselvesἑαυτοῦF-1APM πλανῶμενwe deceive‚πλανάωV-PAI-1P καὶandκαίCONJ theT-NSF ἀλήθειαtruthἀλήθειαN-NSF οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐνinἐνPREP ἡμῖν.us.ἐγώP-1DP 約壹1:9 ἐὰνIfἐάνCONJ ὁμολογῶμενwe should confessὁμολογέωV-PAS-1P τὰςtheT-APF ἁμαρτίαςsinsἁμαρτίαN-APF ἡμῶν‚of us‚ἐγώP-1GP πιστόςfaithfulπιστόςA-NSM ἐστινHe isεἰμίV-PAI-3S καὶandκαίCONJ δίκαιος‚just‚δίκαιοςA-NSM ἵναthatἵναCONJ ἀφῇHe may forgiveἀφίημιV-2AAS-3S ἡμῖνusἐγώP-1DP τὰς[our]T-APF ἁμαρτίαςsins‚ἁμαρτίαN-APF καὶandκαίCONJ καθαρίσῃmight cleanseκαθαρίζωV-AAS-3S ἡμᾶςusἐγώP-1AP ἀπὸfromἀπόPREP πάσηςallπᾶςA-GSF ἀδικίας.unrighteousness.ἀδικίαN-GSF 約壹1:10 ἐὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ οὐχnotοὐPRT-N ἡμαρτήκαμεν‚we have sinned‚ἁμαρτάνωV-RAI-1P ψεύστηνa liarψεύστηςN-ASM ποιοῦμενwe makeποιέωV-PAI-1P αὐτὸν‚Him‚αὐτόςP-ASM καὶandκαίCONJ theT-NSM λόγοςwordλόγοςN-NSM αὐτοῦof HimαὐτόςP-GSM οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐνinἐνPREP ἡμῖν.¶us.ἐγώP-1DP + +
+ +## 約翰一書 2:28–3:3 + +約壹2:28 ΚαὶAndκαίCONJ νῦν‚now‚νῦνADV τεκνία‚little children‚τεκνίονN-VPN μένετεabideμένωV-PAM-2P ἐνinἐνPREP αὐτῷ‚Him‚αὐτόςP-DSM ἵναso thatἵναCONJ ἐὰνwhenἐάνCONJ φανερωθῇ‚He appearsφανερόωV-APS-3S σχῶμενwe might haveἔχωV-2AAS-1P παρρησίανboldnessπαρρησίαN-ASF καὶandκαίCONJ μὴnotμήPRT-N αἰσχυνθῶμενbe ashamedαἰσχύνωV-APS-1P ἀπ᾽beforeἀπόPREP αὐτοῦHimαὐτόςP-GSM ἐνatἐνPREP τῇtheT-DSF παρουσίᾳcomingπαρουσίαN-DSF αὐτοῦ.of Him.αὐτόςP-GSM 約壹2:29 ἘὰνIfἐάνCONJ εἰδῆτεyou knowεἴδωV-RAS-2P ὅτιthatὅτιCONJ δίκαιόςrighteousδίκαιοςA-NSM ἐστιν‚He is‚εἰμίV-PAI-3S γινώσκετεyou knowγινώσκωV-PAI-2P ὅτιthatὅτιCONJ καὶalsoκαίCONJ πᾶςeveryoneπᾶςA-NSM T-NSM ποιῶνpracticingποιέωV-PAP-NSM τὴνT-ASF δικαιοσύνηνrighteousness‚δικαιοσύνηN-ASF ἐξofἐκPREP αὐτοῦHimαὐτόςP-GSM γεγέννηται.¶has been begotten.γεννάωV-RPI-3S 約壹3:1 ἼδετεBeholdεἴδωV-2AAM-2P ποταπὴνwhatποταπόςI-ASF ἀγάπηνloveἀγάπηN-ASF δέδωκενhas givenδίδωμιV-RAI-3S ἡμῖνto usἐγώP-1DP theT-NSM Πατὴρ‚Father‚πατήρN-NSM ἵναthatἵναCONJ τέκναchildrenτέκνονN-NPN Θεοῦof GodθεόςN-GSM κληθῶμεν‚we should be called -καλέωV-APS-1P καὶandκαίCONJ ἐσμέν.we are!εἰμίV-PAI-1P διὰBecause ofδιάPREP τοῦτοthis‚οὗτοςD-ASN theT-NSM κόσμοςworldκόσμοςN-NSM οὐnotοὐPRT-N γινώσκειknowsγινώσκωV-PAI-3S ἡμᾶς‚us‚ἐγώP-1AP ὅτιbecauseὅτιCONJ οὐκnotοὐPRT-N ἔγνωit knewγινώσκωV-2AAI-3S αὐτόν.Him.αὐτόςP-ASM 約壹3:2 ἈγαπητοίBeloved‚ἀγαπητόςA-VPM νῦνnowνῦνADV τέκναchildrenτέκνονN-NPN Θεοῦof GodθεόςN-GSM ἐσμεν‚are we‚εἰμίV-PAI-1P καὶandκαίCONJ οὔπωnot yetοὔπωADV ἐφανερώθηhas been revealedφανερόωV-API-3S τίwhatτίςI-NSN ἐσόμεθα.we will be.εἰμίV-FDI-1P οἴδαμενWe knowεἴδωV-RAI-1P ὅτιthatὅτιCONJ ἐὰνwhenἐάνCONJ φανερωθῇ‚He appears‚φανερόωV-APS-3S ὅμοιοιlikeὅμοιοςA-NPM αὐτῷHimαὐτόςP-DSM ἐσόμεθα‚we will be‚εἰμίV-FDI-1P ὅτιforὅτιCONJ ὀψόμεθαwe will seeὁράωV-FDI-1P αὐτὸν‚HimαὐτόςP-ASM καθώςasκαθώςCONJ ἐστιν.He is.εἰμίV-PAI-3S 約壹3:3 καὶAndκαίCONJ πᾶςeveryoneπᾶςA-NSM T-NSM ἔχωνhavingἔχωV-PAP-NSM τὴνtheT-ASF ἐλπίδαhopeἐλπίςN-ASF ταύτηνthisοὗτοςD-ASF ἐπ᾽inἐπίPREP αὐτῷHim‚αὐτόςP-DSM ἁγνίζειpurifiesἁγνίζωV-PAI-3S ἑαυτὸν‚himself‚ἑαυτοῦF-3ASM καθὼςjust asκαθώςCONJ ἐκεῖνοςHeἐκεῖνοςD-NSM ἁγνόςpureἁγνόςA-NSM ἐστιν.¶is.εἰμίV-PAI-3S + +
+ +## 約翰一書 3:4–10 + +約壹3:4 ΠᾶςEveryoneπᾶςA-NSM T-NSM ποιῶνcommittingποιέωV-PAP-NSM τὴνT-ASF ἁμαρτίανsin‚ἁμαρτίαN-ASF καὶalsoκαίCONJ τὴνT-ASF ἀνομίανlawlessnessἀνομίαN-ASF ποιεῖ‚commits;ποιέωV-PAI-3S καὶandκαίCONJ T-NSF ἁμαρτίαsinἁμαρτίαN-NSF ἐστὶνisεἰμίV-PAI-3S T-NSF ἀνομία.lawlessness.ἀνομίαN-NSF 約壹3:5 καὶAndκαίCONJ οἴδατεyou knowεἴδωV-RAI-2P ὅτιthatὅτιCONJ ἐκεῖνοςHeἐκεῖνοςD-NSM ἐφανερώθη‚appearedφανερόωV-API-3S ἵναso thatἵναCONJ τὰςT-APF ἁμαρτίαςsinsἁμαρτίαN-APF ἄρῃ‚He might take away;αἴρωV-AAS-3S καὶandκαίCONJ ἁμαρτίαsinἁμαρτίαN-NSF ἐνinἐνPREP αὐτῷHimαὐτόςP-DSM οὐκnotοὐPRT-N ἔστιν.there is.εἰμίV-PAI-3S 約壹3:6 πᾶςAnyoneπᾶςA-NSM T-NSM ἐνinἐνPREP αὐτῷHimαὐτόςP-DSM μένωνabiding‚μένωV-PAP-NSM οὐχnotοὐPRT-N ἁμαρτάνει·sins;ἁμαρτάνωV-PAI-3S πᾶςanyoneπᾶςA-NSM T-NSM ἁμαρτάνωνsinning‚ἁμαρτάνωV-PAP-NSM οὐχnotοὐPRT-N ἑώρακενhas seenὁράωV-RAI-3S αὐτὸνHim‚αὐτόςP-ASM οὐδὲnorοὐδέCONJ-N ἔγνωκενhas he knownγινώσκωV-RAI-3S αὐτόν.¶Him.αὐτόςP-ASM 約壹3:7 Τεκνία‚Little children‚τεκνίονN-VPN μηδεὶςno oneμηδείςA-NSM πλανάτωlet lead astrayπλανάωV-PAM-3S ὑμᾶς·you;σύP-2AP the [one]T-NSM ποιῶνpracticingποιέωV-PAP-NSM τὴνT-ASF δικαιοσύνηνrighteousness‚δικαιοσύνηN-ASF δίκαιόςrighteousδίκαιοςA-NSM ἐστιν‚is‚εἰμίV-PAI-3S καθὼςjust asκαθώςCONJ ἐκεῖνοςHeἐκεῖνοςD-NSM δίκαιόςrighteousδίκαιοςA-NSM ἐστιν·is.εἰμίV-PAI-3S 約壹3:8 The [one]T-NSM ποιῶνpracticingποιέωV-PAP-NSM τὴνT-ASF ἁμαρτίανsin‚ἁμαρτίαN-ASF ἐκofἐκPREP τοῦtheT-GSM διαβόλουdevilδιάβολοςA-GSM ἐστίν‚is‚εἰμίV-PAI-3S ὅτιbecauseὅτιCONJ ἀπ᾽fromἀπόPREP ἀρχῆς[the] beginningἀρχήN-GSF theT-NSM διάβολοςdevilδιάβολοςA-NSM ἁμαρτάνει.has been sinning.ἁμαρτάνωV-PAI-3S εἰςForεἰςPREP τοῦτοthis [reason]οὗτοςD-ASN ἐφανερώθηwas revealedφανερόωV-API-3S theT-NSM ΥἱὸςSonυἱόςN-NSM τοῦT-GSM Θεοῦ‚of God‚θεόςN-GSM ἵναso thatἵναCONJ λύσῃHe might destroyλύωV-AAS-3S τὰtheT-APN ἔργαworksἔργονN-APN τοῦof theT-GSM διαβόλου.devil.διάβολοςA-GSM 約壹3:9 ΠᾶςAnyoneπᾶςA-NSM T-NSM γεγεννημένοςhaving been bornγεννάωV-RPP-NSM ἐκofἐκPREP τοῦT-GSM ΘεοῦGod‚θεόςN-GSM ἁμαρτίανsinἁμαρτίαN-ASF οὐnotοὐPRT-N ποιεῖ‚practices‚ποιέωV-PAI-3S ὅτιbecauseὅτιCONJ σπέρμαseedσπέρμαN-NSN αὐτοῦof HimαὐτόςP-GSM ἐνinἐνPREP αὐτῷhimαὐτόςP-DSM μένει‚abides‚μένωV-PAI-3S καὶandκαίCONJ οὐnotοὐPRT-N δύναταιhe is ableδύναμαιV-PNI-3S ἁμαρτάνειν‚to continue sinning‚ἁμαρτάνωV-PAN ὅτιbecauseὅτιCONJ ἐκofἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM γεγέννηται.he has been born.γεννάωV-RPI-3S 約壹3:10 ἐνThroughἐνPREP τούτῳthisοὗτοςD-DSN φανεράmanifestφανερόςA-NPN ἐστινareεἰμίV-PAI-3S τὰtheT-NPN τέκναchildrenτέκνονN-NPN τοῦT-GSM Θεοῦof GodθεόςN-GSM καὶandκαίCONJ τὰtheT-NPN τέκναchildrenτέκνονN-NPN τοῦof theT-GSM διαβόλου·devil:διάβολοςA-GSM πᾶςAnyoneπᾶςA-NSM T-NSM μὴnotμήPRT-N ποιῶνpracticingποιέωV-PAP-NSM δικαιοσύνηνrighteousnessδικαιοσύνηN-ASF οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐκofἐκPREP τοῦT-GSM ΘεοῦGod‚θεόςN-GSM καὶand alsoκαίCONJ the [one]T-NSM μὴnotμήPRT-N ἀγαπῶνlovingἀγαπάωV-PAP-NSM τὸνtheT-ASM ἀδελφὸνbrotherἀδελφόςN-ASM αὐτοῦ.¶of him.αὐτόςP-GSM + + + + +--- +[Mounce Reader ↵](GRBG.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/Mounce-Reader/GRBG-01b.md b/Mounce-Reader/GRBG-01b.md new file mode 100644 index 0000000..fdfc849 --- /dev/null +++ b/Mounce-Reader/GRBG-01b.md @@ -0,0 +1,59 @@ +# Chapter 1 圖析 + +## 約翰一書 1:1–4 + +- 1a 約壹1:1 (That whichὅς, ἥR-NSN)S (ἦνwasεἰμίV-IAI-3S)P (ἀπ᾽fromἀπόPREP ἀρχῆς‚[the] beginning‚ἀρχήN-GSF)A +--- +- 1b (that whichὅς, ἥR-ASN)C (ἀκηκόαμεν‚we have heard‚ἀκούωV-2RAI-1P)P +- 1c (that whichὅς, ἥR-ASN)C (ἑωράκαμενwe have seenὁράωV-RAI-1P)P (τοῖςwith theT-DPM ὀφθαλμοῖςeyesὀφθαλμόςN-DPM ἡμῶν‚of us‚ἐγώP-1GP)A +- 1d (that whichὅς, ἥR-ASN)C (ἐθεασάμεθαwe have gazed uponθεάομαιV-ADI-1P)P +- 1e καὶandκαίCONJ (αἱtheT-NPF χεῖρεςhandsχείρN-NPF ἡμῶνof usἐγώP-1GP)S (ἐψηλάφησανhave handled‚ψηλαφάωV-AAI-3P)P +--- +- 1f 省略 (That whichὅς, ἥR-NSN)S (ἦνwasεἰμίV-IAI-3S)P +- (或者說接續 1a) + - (περὶconcerningπερίPREP τοῦtheT-GSM ΛόγουWordλόγοςN-GSM τῆςT-GSF ζωῆς-of life -ζωήN-GSF)A +- 2a 約壹1:2 καὶandκαίCONJ theT-NSF ζωὴlifeζωήN-NSF ἐφανερώθη‚was made manifest‚φανερόωV-API-3S +- 2b καὶandκαίCONJ ἑωράκαμενwe have seenὁράωV-RAI-1P +- 2c καὶandκαίCONJ μαρτυροῦμενbear witness‚μαρτυρέωV-PAI-1P +- 2d καὶandκαίCONJ (ἀπαγγέλλομενwe proclaimἀπαγγέλλωV-PAI-1P)P (ὑμῖνto youσύP-2DP)C2 (τὴνtheT-ASF ζωὴνlifeζωήN-ASF τὴνT-ASF αἰώνιονeternalαἰώνιοςA-ASF)C1 + - 2e (ἥτιςwhichὅστις, ἥτιςR-NSF)S (ἦνwasεἰμίV-IAI-3S)P (πρὸςwithπρόςPREP τὸνtheT-ASM ΠατέραFatherπατήρN-ASM)A + - 2f καὶandκαίCONJ ἐφανερώθηwas revealedφανερόωV-API-3S ἡμῖν-to us -ἐγώP-1DP +--- +- 3a 約壹1:3 that whichὅς, ἥR-ASN ἑωράκαμενwe have seenὁράωV-RAI-1P +- 3b καὶandκαίCONJ ἀκηκόαμεν‚have heard‚ἀκούωV-2RAI-1P +- 3c (ἀπαγγέλλομενwe proclaimἀπαγγέλλωV-PAI-1P)P (καὶalsoκαίCONJ)A (ὑμῖν‚to you‚σύP-2DP)C + - 3d ἵναso thatἵναCONJ (καὶalsoκαίCONJ)A1 (ὑμεῖςyouσύP-2NP)S (κοινωνίανfellowshipκοινωνίαN-ASF)C (ἔχητεmay haveἔχωV-PAS-2P)P (μεθ᾽withμετάPREP ἡμῶν.us.ἐγώP-1GP)A2 + - καὶIndeedκαίCONJ (theT-NSF κοινωνίαfellowshipκοινωνίαN-NSF)S δὲnowδέCONJ T-NSF ἡμετέραof usἡμέτεροςS-1PNSF μετὰ[is] withμετάPREP τοῦtheT-GSM ΠατρὸςFather‚πατήρN-GSM καὶandκαίCONJ μετὰwithμετάPREP τοῦtheT-GSM ΥἱοῦSonυἱόςN-GSM αὐτοῦof Him‚αὐτόςP-GSM ἸησοῦJesusἸησοῦςN-GSM-P Χριστοῦ.Christ.ΧριστόςN-GSM-T +- 約壹1:4 καὶAndκαίCONJ ταῦταthese thingsοὗτοςD-APN γράφομενwriteγράφωV-PAI-1P ἡμεῖς‚weἐγώP-1NP + - ἵναso thatἵναCONJ theT-NSF χαρὰjoyχαράN-NSF ἡμῶνof usἐγώP-1GP might beεἰμίV-PAS-3S πεπληρωμένη.¶complete.πληρόωV-RPP-NSF + + + + + + +
+ +## 約翰一書 1:5-10 + +約壹1:5 ΚαὶAndκαίCONJ ἔστινisεἰμίV-PAI-3S αὕτηthisοὗτοςD-NSF theT-NSF ἀγγελίαmessageἀγγελίαN-NSF ἣνthatὅς, ἥR-ASF ἀκηκόαμενwe have heardἀκούωV-2RAI-1P ἀπ᾽fromἀπόPREP αὐτοῦHim‚αὐτόςP-GSM καὶandκαίCONJ ἀναγγέλλομενwe preachἀναγγέλλωV-PAI-1P ὑμῖν‚to you‚σύP-2DP ὅτιthatὅτιADV T-NSM ΘεὸςGodθεόςN-NSM φῶςlightφῶςN-NSN ἐστινis‚εἰμίV-PAI-3S καὶandκαίCONJ σκοτίαdarknessσκοτίαN-NSF ἐνinἐνPREP αὐτῷHim‚αὐτόςP-DSM οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S οὐδεμία.none.οὐδείςA-NSF 約壹1:6 ἘὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ κοινωνίανfellowshipκοινωνίαN-ASF ἔχομενwe haveἔχωV-PAI-1P μετ᾽withμετάPREP αὐτοῦHim‚αὐτόςP-GSM καὶand yetκαίCONJ ἐνinἐνPREP τῷtheT-DSN σκότειdarknessσκότοςN-DSN περιπατῶμεν‚should walk‚περιπατέωV-PAS-1P ψευδόμεθαwe lieψεύδομαιV-PNI-1P καὶandκαίCONJ οὐnotοὐPRT-N ποιοῦμενdo practiceποιέωV-PAI-1P τὴνtheT-ASF ἀλήθειαν·truth.ἀλήθειαN-ASF 約壹1:7 ἐὰνIfἐάνCONJ ἐνinἐνPREP τῷtheT-DSN φωτὶlightφῶςN-DSN περιπατῶμεν‚we should walkπεριπατέωV-PAS-1P ὡςasὡςCONJ αὐτόςHeαὐτόςP-NSM ἐστινisεἰμίV-PAI-3S ἐνinἐνPREP τῷtheT-DSN φωτί‚light‚φῶςN-DSN κοινωνίανfellowshipκοινωνίαN-ASF ἔχομενwe haveἔχωV-PAI-1P μετ᾽withμετάPREP ἀλλήλων‚one another‚ἀλλήλωνC-GPM καὶandκαίCONJ τὸtheT-NSN αἷμαbloodαἷμαN-NSN Ἰησοῦof Jesus‚ἸησοῦςN-GSM-P τοῦtheT-GSM ΥἱοῦSonυἱόςN-GSM αὐτοῦof Him‚αὐτόςP-GSM καθαρίζειcleansesκαθαρίζωV-PAI-3S ἡμᾶςusἐγώP-1AP ἀπὸfromἀπόPREP πάσηςallπᾶςA-GSF ἁμαρτίας.sin.ἁμαρτίαN-GSF 約壹1:8 ἘὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ ἁμαρτίανsinἁμαρτίαN-ASF οὐκnotοὐPRT-N ἔχομεν‚we have‚ἔχωV-PAI-1P ἑαυτοὺςourselvesἑαυτοῦF-1APM πλανῶμενwe deceive‚πλανάωV-PAI-1P καὶandκαίCONJ theT-NSF ἀλήθειαtruthἀλήθειαN-NSF οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐνinἐνPREP ἡμῖν.us.ἐγώP-1DP 約壹1:9 ἐὰνIfἐάνCONJ ὁμολογῶμενwe should confessὁμολογέωV-PAS-1P τὰςtheT-APF ἁμαρτίαςsinsἁμαρτίαN-APF ἡμῶν‚of us‚ἐγώP-1GP πιστόςfaithfulπιστόςA-NSM ἐστινHe isεἰμίV-PAI-3S καὶandκαίCONJ δίκαιος‚just‚δίκαιοςA-NSM ἵναthatἵναCONJ ἀφῇHe may forgiveἀφίημιV-2AAS-3S ἡμῖνusἐγώP-1DP τὰς[our]T-APF ἁμαρτίαςsins‚ἁμαρτίαN-APF καὶandκαίCONJ καθαρίσῃmight cleanseκαθαρίζωV-AAS-3S ἡμᾶςusἐγώP-1AP ἀπὸfromἀπόPREP πάσηςallπᾶςA-GSF ἀδικίας.unrighteousness.ἀδικίαN-GSF 約壹1:10 ἐὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ οὐχnotοὐPRT-N ἡμαρτήκαμεν‚we have sinned‚ἁμαρτάνωV-RAI-1P ψεύστηνa liarψεύστηςN-ASM ποιοῦμενwe makeποιέωV-PAI-1P αὐτὸν‚Him‚αὐτόςP-ASM καὶandκαίCONJ theT-NSM λόγοςwordλόγοςN-NSM αὐτοῦof HimαὐτόςP-GSM οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐνinἐνPREP ἡμῖν.¶us.ἐγώP-1DP + +
+ +## 約翰一書 2:28–3:3 + +約壹2:28 ΚαὶAndκαίCONJ νῦν‚now‚νῦνADV τεκνία‚little children‚τεκνίονN-VPN μένετεabideμένωV-PAM-2P ἐνinἐνPREP αὐτῷ‚Him‚αὐτόςP-DSM ἵναso thatἵναCONJ ἐὰνwhenἐάνCONJ φανερωθῇ‚He appearsφανερόωV-APS-3S σχῶμενwe might haveἔχωV-2AAS-1P παρρησίανboldnessπαρρησίαN-ASF καὶandκαίCONJ μὴnotμήPRT-N αἰσχυνθῶμενbe ashamedαἰσχύνωV-APS-1P ἀπ᾽beforeἀπόPREP αὐτοῦHimαὐτόςP-GSM ἐνatἐνPREP τῇtheT-DSF παρουσίᾳcomingπαρουσίαN-DSF αὐτοῦ.of Him.αὐτόςP-GSM 約壹2:29 ἘὰνIfἐάνCONJ εἰδῆτεyou knowεἴδωV-RAS-2P ὅτιthatὅτιCONJ δίκαιόςrighteousδίκαιοςA-NSM ἐστιν‚He is‚εἰμίV-PAI-3S γινώσκετεyou knowγινώσκωV-PAI-2P ὅτιthatὅτιCONJ καὶalsoκαίCONJ πᾶςeveryoneπᾶςA-NSM T-NSM ποιῶνpracticingποιέωV-PAP-NSM τὴνT-ASF δικαιοσύνηνrighteousness‚δικαιοσύνηN-ASF ἐξofἐκPREP αὐτοῦHimαὐτόςP-GSM γεγέννηται.¶has been begotten.γεννάωV-RPI-3S 約壹3:1 ἼδετεBeholdεἴδωV-2AAM-2P ποταπὴνwhatποταπόςI-ASF ἀγάπηνloveἀγάπηN-ASF δέδωκενhas givenδίδωμιV-RAI-3S ἡμῖνto usἐγώP-1DP theT-NSM Πατὴρ‚Father‚πατήρN-NSM ἵναthatἵναCONJ τέκναchildrenτέκνονN-NPN Θεοῦof GodθεόςN-GSM κληθῶμεν‚we should be called -καλέωV-APS-1P καὶandκαίCONJ ἐσμέν.we are!εἰμίV-PAI-1P διὰBecause ofδιάPREP τοῦτοthis‚οὗτοςD-ASN theT-NSM κόσμοςworldκόσμοςN-NSM οὐnotοὐPRT-N γινώσκειknowsγινώσκωV-PAI-3S ἡμᾶς‚us‚ἐγώP-1AP ὅτιbecauseὅτιCONJ οὐκnotοὐPRT-N ἔγνωit knewγινώσκωV-2AAI-3S αὐτόν.Him.αὐτόςP-ASM 約壹3:2 ἈγαπητοίBeloved‚ἀγαπητόςA-VPM νῦνnowνῦνADV τέκναchildrenτέκνονN-NPN Θεοῦof GodθεόςN-GSM ἐσμεν‚are we‚εἰμίV-PAI-1P καὶandκαίCONJ οὔπωnot yetοὔπωADV ἐφανερώθηhas been revealedφανερόωV-API-3S τίwhatτίςI-NSN ἐσόμεθα.we will be.εἰμίV-FDI-1P οἴδαμενWe knowεἴδωV-RAI-1P ὅτιthatὅτιCONJ ἐὰνwhenἐάνCONJ φανερωθῇ‚He appears‚φανερόωV-APS-3S ὅμοιοιlikeὅμοιοςA-NPM αὐτῷHimαὐτόςP-DSM ἐσόμεθα‚we will be‚εἰμίV-FDI-1P ὅτιforὅτιCONJ ὀψόμεθαwe will seeὁράωV-FDI-1P αὐτὸν‚HimαὐτόςP-ASM καθώςasκαθώςCONJ ἐστιν.He is.εἰμίV-PAI-3S 約壹3:3 καὶAndκαίCONJ πᾶςeveryoneπᾶςA-NSM T-NSM ἔχωνhavingἔχωV-PAP-NSM τὴνtheT-ASF ἐλπίδαhopeἐλπίςN-ASF ταύτηνthisοὗτοςD-ASF ἐπ᾽inἐπίPREP αὐτῷHim‚αὐτόςP-DSM ἁγνίζειpurifiesἁγνίζωV-PAI-3S ἑαυτὸν‚himself‚ἑαυτοῦF-3ASM καθὼςjust asκαθώςCONJ ἐκεῖνοςHeἐκεῖνοςD-NSM ἁγνόςpureἁγνόςA-NSM ἐστιν.¶is.εἰμίV-PAI-3S + +
+ +## 約翰一書 3:4–10 + +約壹3:4 ΠᾶςEveryoneπᾶςA-NSM T-NSM ποιῶνcommittingποιέωV-PAP-NSM τὴνT-ASF ἁμαρτίανsin‚ἁμαρτίαN-ASF καὶalsoκαίCONJ τὴνT-ASF ἀνομίανlawlessnessἀνομίαN-ASF ποιεῖ‚commits;ποιέωV-PAI-3S καὶandκαίCONJ T-NSF ἁμαρτίαsinἁμαρτίαN-NSF ἐστὶνisεἰμίV-PAI-3S T-NSF ἀνομία.lawlessness.ἀνομίαN-NSF 約壹3:5 καὶAndκαίCONJ οἴδατεyou knowεἴδωV-RAI-2P ὅτιthatὅτιCONJ ἐκεῖνοςHeἐκεῖνοςD-NSM ἐφανερώθη‚appearedφανερόωV-API-3S ἵναso thatἵναCONJ τὰςT-APF ἁμαρτίαςsinsἁμαρτίαN-APF ἄρῃ‚He might take away;αἴρωV-AAS-3S καὶandκαίCONJ ἁμαρτίαsinἁμαρτίαN-NSF ἐνinἐνPREP αὐτῷHimαὐτόςP-DSM οὐκnotοὐPRT-N ἔστιν.there is.εἰμίV-PAI-3S 約壹3:6 πᾶςAnyoneπᾶςA-NSM T-NSM ἐνinἐνPREP αὐτῷHimαὐτόςP-DSM μένωνabiding‚μένωV-PAP-NSM οὐχnotοὐPRT-N ἁμαρτάνει·sins;ἁμαρτάνωV-PAI-3S πᾶςanyoneπᾶςA-NSM T-NSM ἁμαρτάνωνsinning‚ἁμαρτάνωV-PAP-NSM οὐχnotοὐPRT-N ἑώρακενhas seenὁράωV-RAI-3S αὐτὸνHim‚αὐτόςP-ASM οὐδὲnorοὐδέCONJ-N ἔγνωκενhas he knownγινώσκωV-RAI-3S αὐτόν.¶Him.αὐτόςP-ASM 約壹3:7 Τεκνία‚Little children‚τεκνίονN-VPN μηδεὶςno oneμηδείςA-NSM πλανάτωlet lead astrayπλανάωV-PAM-3S ὑμᾶς·you;σύP-2AP the [one]T-NSM ποιῶνpracticingποιέωV-PAP-NSM τὴνT-ASF δικαιοσύνηνrighteousness‚δικαιοσύνηN-ASF δίκαιόςrighteousδίκαιοςA-NSM ἐστιν‚is‚εἰμίV-PAI-3S καθὼςjust asκαθώςCONJ ἐκεῖνοςHeἐκεῖνοςD-NSM δίκαιόςrighteousδίκαιοςA-NSM ἐστιν·is.εἰμίV-PAI-3S 約壹3:8 The [one]T-NSM ποιῶνpracticingποιέωV-PAP-NSM τὴνT-ASF ἁμαρτίανsin‚ἁμαρτίαN-ASF ἐκofἐκPREP τοῦtheT-GSM διαβόλουdevilδιάβολοςA-GSM ἐστίν‚is‚εἰμίV-PAI-3S ὅτιbecauseὅτιCONJ ἀπ᾽fromἀπόPREP ἀρχῆς[the] beginningἀρχήN-GSF theT-NSM διάβολοςdevilδιάβολοςA-NSM ἁμαρτάνει.has been sinning.ἁμαρτάνωV-PAI-3S εἰςForεἰςPREP τοῦτοthis [reason]οὗτοςD-ASN ἐφανερώθηwas revealedφανερόωV-API-3S theT-NSM ΥἱὸςSonυἱόςN-NSM τοῦT-GSM Θεοῦ‚of God‚θεόςN-GSM ἵναso thatἵναCONJ λύσῃHe might destroyλύωV-AAS-3S τὰtheT-APN ἔργαworksἔργονN-APN τοῦof theT-GSM διαβόλου.devil.διάβολοςA-GSM 約壹3:9 ΠᾶςAnyoneπᾶςA-NSM T-NSM γεγεννημένοςhaving been bornγεννάωV-RPP-NSM ἐκofἐκPREP τοῦT-GSM ΘεοῦGod‚θεόςN-GSM ἁμαρτίανsinἁμαρτίαN-ASF οὐnotοὐPRT-N ποιεῖ‚practices‚ποιέωV-PAI-3S ὅτιbecauseὅτιCONJ σπέρμαseedσπέρμαN-NSN αὐτοῦof HimαὐτόςP-GSM ἐνinἐνPREP αὐτῷhimαὐτόςP-DSM μένει‚abides‚μένωV-PAI-3S καὶandκαίCONJ οὐnotοὐPRT-N δύναταιhe is ableδύναμαιV-PNI-3S ἁμαρτάνειν‚to continue sinning‚ἁμαρτάνωV-PAN ὅτιbecauseὅτιCONJ ἐκofἐκPREP τοῦT-GSM ΘεοῦGodθεόςN-GSM γεγέννηται.he has been born.γεννάωV-RPI-3S 約壹3:10 ἐνThroughἐνPREP τούτῳthisοὗτοςD-DSN φανεράmanifestφανερόςA-NPN ἐστινareεἰμίV-PAI-3S τὰtheT-NPN τέκναchildrenτέκνονN-NPN τοῦT-GSM Θεοῦof GodθεόςN-GSM καὶandκαίCONJ τὰtheT-NPN τέκναchildrenτέκνονN-NPN τοῦof theT-GSM διαβόλου·devil:διάβολοςA-GSM πᾶςAnyoneπᾶςA-NSM T-NSM μὴnotμήPRT-N ποιῶνpracticingποιέωV-PAP-NSM δικαιοσύνηνrighteousnessδικαιοσύνηN-ASF οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐκofἐκPREP τοῦT-GSM ΘεοῦGod‚θεόςN-GSM καὶand alsoκαίCONJ the [one]T-NSM μὴnotμήPRT-N ἀγαπῶνlovingἀγαπάωV-PAP-NSM τὸνtheT-ASM ἀδελφὸνbrotherἀδελφόςN-ASM αὐτοῦ.¶of him.αὐτόςP-GSM + + + + + +--- +[Mounce Reader ↵](GRBG.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/Mounce-Reader/GRBG-01c.md b/Mounce-Reader/GRBG-01c.md new file mode 100644 index 0000000..ef69eb0 --- /dev/null +++ b/Mounce-Reader/GRBG-01c.md @@ -0,0 +1,31 @@ +# Chapter 1 大綱 + +## 約翰一書 1:1–4 + +### 大綱 + +--- + +## 約翰一書 1:5-10 + +### 大綱 + +--- + +## 約翰一書 2:28–3:3 + +### 大綱 + +--- + +## 約翰一書 3:4–10 + +### 大綱 + + + + + +--- +[Mounce Reader ↵](GRBG.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/Mounce-Reader/GRBG-02a.md b/Mounce-Reader/GRBG-02a.md new file mode 100644 index 0000000..dae9741 --- /dev/null +++ b/Mounce-Reader/GRBG-02a.md @@ -0,0 +1,24 @@ +# 約翰福音 15:1-27 + +## 經文 + +### John 15:1-8 + + + 約15:1 ἘγώIἐγώP-1NS εἰμιamεἰμίV-PAI-1S theT-NSF ἄμπελοςvineἄμπελοςN-NSF T-NSF ἀληθινήtrue‚ἀληθινόςA-NSF καὶandκαίCONJ theT-NSM ΠατήρFatherπατήρN-NSM μουof Me‚ἐγώP-1GS theT-NSM γεωργόςvinedresserγεωργόςN-NSM ἐστιν.is.εἰμίV-PAI-3S 約15:2 πᾶνEveryπᾶςA-ASN κλῆμαbranchκλῆμαN-ASN ἐνinἐνPREP ἐμοὶMeἐγώP-1DS μὴnotμήPRT-N φέρονbearingφέρωV-PAP-ASN καρπὸνfruit‚καρπόςN-ASM αἴρειHe takes awayαἴρωV-PAI-3S αὐτό‚it;αὐτόςP-ASN καὶandκαίCONJ πᾶνevery oneπᾶςA-ASN τὸT-ASN καρπὸνfruitκαρπόςN-ASM φέρονbearing‚φέρωV-PAP-ASN καθαίρειHe prunesκαθαίρωV-PAI-3S αὐτὸit‚αὐτόςP-ASN ἵναthatἵναCONJ καρπὸνfruitκαρπόςN-ASM πλείοναmoreπλείων, πλεῖονA-ASM-C φέρῃ.it may bear.φέρωV-PAS-3S 約15:3 ἤδηAlreadyἤδηADV ὑμεῖςyouσύP-2NP καθαροίcleanκαθαρόςA-NPM ἐστεareεἰμίV-PAI-2P διὰby reason ofδιάPREP τὸνtheT-ASM λόγονwordλόγοςN-ASM ὃνthatὅς, ἥR-ASM λελάληκαI have spokenλαλέωV-RAI-1S ὑμῖν·to you.σύP-2DP 約15:4 μείνατεAbideμένωV-AAM-2P ἐνinἐνPREP ἐμοί‚Me‚ἐγώP-1DS κἀγὼand IκἀγώP-1NS-K ἐνinἐνPREP ὑμῖν.you.σύP-2DP καθὼςAsκαθώςCONJ τὸtheT-NSN κλῆμαbranchκλῆμαN-NSN οὐnotοὐPRT-N δύναταιis ableδύναμαιV-PNI-3S καρπὸνfruitκαρπόςN-ASM φέρεινto bearφέρωV-PAN ἀφ᾽ofἀπόPREP ἑαυτοῦitself‚ἑαυτοῦF-3GSN ἐὰνifἐάνCONJ μὴnotμήPRT-N μένῃit abideμένωV-PAS-3S ἐνinἐνPREP τῇtheT-DSF ἀμπέλῳ‚vine‚ἄμπελοςN-DSF οὕτωςsoοὕτω, οὕτωςADV οὐδὲneither [can]οὐδέCONJ-N ὑμεῖςyou‚σύP-2NP ἐὰνifἐάνCONJ μὴnotμήPRT-N ἐνinἐνPREP ἐμοὶMeἐγώP-1DS μένητε.you abide.μένωV-PAS-2P 約15:5 ἘγώIἐγώP-1NS εἰμιamεἰμίV-PAI-1S theT-NSF ἄμπελος‚vine;ἄμπελοςN-NSF ὑμεῖςyou [are]σύP-2NP τὰtheT-NPN κλήματα.branches.κλῆμαN-NPN The [one]T-NSM μένωνabidingμένωV-PAP-NSM ἐνinἐνPREP ἐμοὶMe‚ἐγώP-1DS κἀγὼand IκἀγώP-1NS-K ἐνinἐνPREP αὐτῷhim‚αὐτόςP-DSM οὗτοςheοὗτοςD-NSM φέρειbearsφέρωV-PAI-3S καρπὸνfruitκαρπόςN-ASM πολύν‚much.πολύςA-ASM ὅτιForὅτιCONJ χωρὶςapart fromχωρίςPREP ἐμοῦMeἐγώP-1GS οὐnotοὐPRT-N δύνασθεyou are ableδύναμαιV-PNI-2P ποιεῖνto doποιέωV-PAN οὐδέν.nothing.οὐδείςA-ASN 約15:6 ἐὰνIfἐάνCONJ μήnotμήPRT-N τιςanyoneτιςX-NSM μένῃabideμένωV-PAS-3S ἐνinἐνPREP ἐμοί‚Me‚ἐγώP-1DS ἐβλήθηhe is thrownβάλλωV-API-3S ἔξωoutἔξωADV ὡςlikeὡςCONJ τὸtheT-NSN κλῆμαbranchκλῆμαN-NSN καὶandκαίCONJ ἐξηράνθηis dried up‚ξηραίνωV-API-3S καὶandκαίCONJ συνάγουσινthey gatherσυνάγωV-PAI-3P αὐτὰthemαὐτόςP-APN καὶandκαίCONJ εἰςintoεἰςPREP τὸtheT-ASN πῦρfireπῦρN-ASN βάλλουσινcast‚βάλλωV-PAI-3P καὶandκαίCONJ καίεται.it is burned.καίωV-PPI-3S 約15:7 ἐὰνIfἐάνCONJ μείνητεyou abideμένωV-AAS-2P ἐνinἐνPREP ἐμοὶMeἐγώP-1DS καὶandκαίCONJ τὰtheT-NPN ῥήματάwordsῥῆμαN-NPN μουof MeἐγώP-1GS ἐνinἐνPREP ὑμῖνyouσύP-2DP μείνῃ‚abide‚μένωV-AAS-3S whateverὅς, ἥR-ASN ἐὰνifἐάνPRT θέλητεyou wish‚θέλωV-PAS-2P αἰτήσασθε‚you shall ask‚αἰτέωV-AMM-2P καὶandκαίCONJ γενήσεταιit will come to passγίνομαιV-FDI-3S ὑμῖν.to you.σύP-2DP 約15:8 ἐνInἐνPREP τούτῳthisοὗτοςD-DSN ἐδοξάσθηis glorifiedδοξάζωV-API-3S theT-NSM ΠατήρFatherπατήρN-NSM μου‚of Me‚ἐγώP-1GS ἵναthatἵναADV καρπὸνfruitκαρπόςN-ASM πολὺνmuchπολύςA-ASM φέρητεyou should bear‚φέρωV-PAS-2P καὶandκαίCONJ γένησθεyou shall beγίνομαιV-2ADS-2P ἐμοὶto MeἐμόςS-1SNPM μαθηταί.¶disciples.μαθητήςN-NPM + + + ### John 15:9-17 + + 約15:9 ΚαθὼςAsκαθώςCONJ ἠγάπησένhas lovedἀγαπάωV-AAI-3S μεMeἐγώP-1AS theT-NSM Πατήρ‚Father‚πατήρN-NSM κἀγὼI alsoκἀγώP-1NS-K ὑμᾶςyouσύP-2AP ἠγάπησα·have loved.ἀγαπάωV-AAI-1S μείνατεAbideμένωV-AAM-2P ἐνinἐνPREP τῇtheT-DSF ἀγάπῃloveἀγάπηN-DSF τῇT-DSF ἐμῇ.of Me.ἐμόςS-1SDSF 約15:10 ἐὰνIfἐάνCONJ τὰςtheT-APF ἐντολάςcommandmentsἐντολήN-APF μουof MeἐγώP-1GS τηρήσητε‚you keep‚τηρέωV-AAS-2P μενεῖτεyou will abideμένωV-FAI-2P ἐνinἐνPREP τῇtheT-DSF ἀγάπῃloveἀγάπηN-DSF μου‚of Me‚ἐγώP-1GS καθὼςasκαθώςCONJ ἐγὼI‚ἐγώP-1NS τὰςtheT-APF ἐντολὰςcommandmentsἐντολήN-APF τοῦtheT-GSM ΠατρόςFatherπατήρN-GSM μουof MeἐγώP-1GS τετήρηκαhave kept‚τηρέωV-RAI-1S καὶandκαίCONJ μένωI abideμένωV-PAI-1S αὐτοῦof HimαὐτόςP-GSM ἐνinἐνPREP τῇtheT-DSF ἀγάπῃ.love.ἀγάπηN-DSF 約15:11 ΤαῦταThese thingsοὗτοςD-APN λελάληκαI have spokenλαλέωV-RAI-1S ὑμῖνto you‚σύP-2DP ἵναthatἵναCONJ T-NSF χαρὰjoyχαράN-NSF T-NSF ἐμὴMyἐμόςS-1SNSF ἐνinἐνPREP ὑμῖνyouσύP-2DP may be‚εἰμίV-PAS-3S καὶandκαίCONJ theT-NSF χαρὰjoyχαράN-NSF ὑμῶνof youσύP-2GP πληρωθῇ.may be full.πληρόωV-APS-3S 約15:12 ΑὕτηThisοὗτοςD-NSF ἐστὶνisεἰμίV-PAI-3S T-NSF ἐντολὴcommandmentἐντολήN-NSF T-NSF ἐμὴ‚My‚ἐμόςS-1SNSF ἵναthatἵναADV ἀγαπᾶτεyou loveἀγαπάωV-PAS-2P ἀλλήλουςone anotherἀλλήλωνC-APM καθὼςasκαθώςCONJ ἠγάπησαI lovedἀγαπάωV-AAI-1S ὑμᾶς.you.σύP-2AP 約15:13 μείζοναGreaterμέγαςA-ASF-C ταύτηςthan thisοὗτοςD-GSF ἀγάπηνloveἀγάπηN-ASF οὐδεὶςno oneοὐδείςA-NSM ἔχει‚has‚ἔχωV-PAI-3S ἵναthatἵναCONJ τιςoneτιςX-NSM τὴνtheT-ASF ψυχὴνlifeψυχήN-ASF αὐτοῦof himαὐτόςP-GSM θῇshould lay downτίθημιV-2AAS-3S ὑπὲρforὑπέρPREP τῶνtheT-GPM φίλωνfriendsφίλοςA-GPM αὐτοῦ.of him.αὐτόςP-GSM 約15:14 ὙμεῖςYouσύP-2NP φίλοιfriendsφίλοςA-NPM μούof MeἐγώP-1GS ἐστεareεἰμίV-PAI-2P ἐὰνifἐάνCONJ ποιῆτεyou doποιέωV-PAS-2P whatὅς, ἥR-APN ἐγὼIἐγώP-1NS ἐντέλλομαιcommandἐντέλλωV-PNI-1S ὑμῖν.you.σύP-2DP 約15:15 οὐκέτιNo longerοὐκέτιADV λέγωI callλέγωV-PAI-1S ὑμᾶςyouσύP-2AP δούλους‚servants‚δοῦλοςN-APM ὅτιforὅτιCONJ theT-NSM δοῦλοςservantδοῦλοςN-NSM οὐκnotοὐPRT-N οἶδενknowsεἴδωV-RAI-3S τίwhatτίςI-ASN ποιεῖis doingποιέωV-PAI-3S αὐτοῦhisαὐτόςP-GSM T-NSM κύριος·master.κύριοςN-NSM ὑμᾶςYouσύP-2AP δὲhoweverδέCONJ εἴρηκαI have calledἔπω, ἐρῶ, εἶπονV-RAI-1S φίλους‚friends‚φίλοςA-APM ὅτιbecauseὅτιCONJ πάνταall thingsπᾶςA-APN thatὅς, ἥR-APN ἤκουσαI heardἀκούωV-AAI-1S παρὰfromπαράPREP τοῦtheT-GSM ΠατρόςFatherπατήρN-GSM μουof Me‚ἐγώP-1GS ἐγνώρισαI have made knownγνωρίζωV-AAI-1S ὑμῖν.to you.σύP-2DP 約15:16 οὐχNotοὐPRT-N ὑμεῖςyouσύP-2NP μεMeἐγώP-1AS ἐξελέξασθε‚chose‚ἐκλέγωV-AMI-2P ἀλλ᾽butἀλλάCONJ ἐγὼIἐγώP-1NS ἐξελεξάμηνchoseἐκλέγωV-AMI-1S ὑμᾶςyou‚σύP-2AP καὶandκαίCONJ ἔθηκαappointedτίθημιV-AAI-1S ὑμᾶςyouσύP-2AP ἵναthatἵναCONJ ὑμεῖςyouσύP-2NP ὑπάγητεshould goὑπάγωV-PAS-2P καὶandκαίCONJ καρπὸνfruitκαρπόςN-ASM φέρητεyou should bear‚φέρωV-PAS-2P καὶandκαίCONJ theT-NSM καρπὸςfruitκαρπόςN-NSM ὑμῶνof youσύP-2GP μένῃ‚should remain;μένωV-PAS-3S ἵναso thatἵναCONJ ὅς, ἥR-ASN τιwhateverτιςX-ASN ἂνἄνPRT αἰτήσητεyou might askαἰτέωV-AAS-2P τὸνtheT-ASM ΠατέραFatherπατήρN-ASM ἐνinἐνPREP τῷtheT-DSN ὀνόματίnameὄνομαN-DSN μουof Me‚ἐγώP-1GS δῷHe may giveδίδωμιV-2AAS-3S ὑμῖν.you.σύP-2DP 約15:17 ταῦταThese thingsοὗτοςD-APN ἐντέλλομαιI commandἐντέλλωV-PNI-1S ὑμῖν‚you‚σύP-2DP ἵναthatἵναADV ἀγαπᾶτεyou loveἀγαπάωV-PAS-2P ἀλλήλους.¶one another.ἀλλήλωνC-APM + +### John 15:18-26 + 約15:18 ΕἰIfεἰCONJ theT-NSM κόσμοςworldκόσμοςN-NSM ὑμᾶςyouσύP-2AP μισεῖ‚hates‚μισέωV-PAI-3S γινώσκετεyou knowγινώσκωV-PAI-2P ὅτιthatὅτιCONJ ἐμὲMeἐγώP-1AS πρῶτονbeforeπρῶτοςA-ASN ὑμῶνyouσύP-2GP μεμίσηκεν.it has hated.μισέωV-RAI-3S 約15:19 εἰIfεἰCONJ ἐκofἐκPREP τοῦtheT-GSM κόσμουworldκόσμοςN-GSM ἦτε‚you were‚εἰμίV-IAI-2P theT-NSM κόσμοςworldκόσμοςN-NSM ἂνἄνPRT τὸ[as] itsT-ASN ἴδιονownἴδιοςA-ASN ἐφίλει·would love [you];φιλέωV-IAI-3S ὅτιbecauseὅτιCONJ δὲhoweverδέCONJ ἐκofἐκPREP τοῦtheT-GSM κόσμουworldκόσμοςN-GSM οὐκnotοὐPRT-N ἐστέ‚you are‚εἰμίV-PAI-2P ἀλλ᾽butἀλλάCONJ ἐγὼIἐγώP-1NS ἐξελεξάμηνchoseἐκλέγωV-AMI-1S ὑμᾶςyouσύP-2AP ἐκout ofἐκPREP τοῦtheT-GSM κόσμου‚world‚κόσμοςN-GSM διὰon account ofδιάPREP τοῦτοthisοὗτοςD-ASN μισεῖhatesμισέωV-PAI-3S ὑμᾶςyouσύP-2AP theT-NSM κόσμος.world.κόσμοςN-NSM 約15:20 ΜνημονεύετεRememberμνημονεύωV-PAM-2P τοῦtheT-GSM λόγουwordλόγοςN-GSM οὗthatὅς, ἥR-GSM ἐγὼIἐγώP-1NS εἶπονsaidἔπω, ἐρῶ, εἶπονV-2AAI-1S ὑμῖν·to you:σύP-2DP ΟὐκNotοὐPRT-N ἔστινisεἰμίV-PAI-3S δοῦλοςa servantδοῦλοςN-NSM μείζωνgreater thanμέγαςA-NSM-C τοῦtheT-GSM κυρίουmasterκύριοςN-GSM αὐτοῦ.of him.αὐτόςP-GSM εἰIfεἰCONJ ἐμὲMeἐγώP-1AS ἐδίωξαν‚they persecuted‚διώκωV-AAI-3P καὶalsoκαίCONJ ὑμᾶςyouσύP-2AP διώξουσιν·they will persecute;διώκωV-FAI-3P εἰifεἰCONJ τὸνtheT-ASM λόγονwordλόγοςN-ASM μουof MeἐγώP-1GS ἐτήρησαν‚they kept‚τηρέωV-AAI-3P καὶalsoκαίCONJ τὸνT-ASM ὑμέτερονyoursὑμέτεροςA-ASM τηρήσουσιν.they will keep.τηρέωV-FAI-3P 約15:21 ἀλλὰButἀλλάCONJ ταῦταthese thingsοὗτοςD-APN πάνταallπᾶςA-APN ποιήσουσινthey will doποιέωV-FAI-3P εἰςagainstεἰςPREP ὑμᾶςyouσύP-2AP διὰon account ofδιάPREP τὸtheT-ASN ὄνομάnameὄνομαN-ASN μου‚of Me‚ἐγώP-1GS ὅτιbecauseὅτιCONJ οὐκnotοὐPRT-N οἴδασινthey have knownεἴδωV-RAI-3P τὸνthe [One]T-ASM πέμψαντάhaving sentπέμπωV-AAP-ASM με.Me.ἐγώP-1AS 約15:22 εἰIfεἰCONJ μὴnotμήPRT-N ἦλθονI had comeἔρχομαιV-2AAI-1S καὶandκαίCONJ ἐλάλησαspokenλαλέωV-AAI-1S αὐτοῖς‚to them‚αὐτόςP-DPM ἁμαρτίανsinἁμαρτίαN-ASF οὐκnotοὐPRT-N εἴχοσαν·they would have had;ἔχωV-IAI-3P νῦνnowνῦνADV δὲhoweverδέCONJ πρόφασινexcuseπρόφασιςN-ASF οὐκnotοὐPRT-N ἔχουσινthey haveἔχωV-PAI-3P περὶforπερίPREP τῆςtheT-GSF ἁμαρτίαςsinἁμαρτίαN-GSF αὐτῶν.of them.αὐτόςP-GPM 約15:23 The [one]T-NSM ἐμὲMeἐγώP-1AS μισῶνhating‚μισέωV-PAP-NSM καὶalsoκαίCONJ τὸνtheT-ASM ΠατέραFatherπατήρN-ASM μουof MeἐγώP-1GS μισεῖ.hates.μισέωV-PAI-3S 約15:24 εἰIfεἰCONJ τὰtheT-APN ἔργαworksἔργονN-APN μὴnotμήPRT-N ἐποίησαI had doneποιέωV-AAI-1S ἐνamongἐνPREP αὐτοῖςthemαὐτόςP-DPM thatὅς, ἥR-APN οὐδεὶςnoοὐδείςA-NSM ἄλλοςotherἄλλοςA-NSM ἐποίησεν‚has done‚ποιέωV-AAI-3S ἁμαρτίανsinἁμαρτίαN-ASF οὐκnotοὐPRT-N εἴχοσαν·they would have had;ἔχωV-IAI-3P νῦνnowνῦνADV δὲhoweverδέCONJ καὶbothκαίCONJ ἑωράκασινthey have seenὁράωV-RAI-3P καὶandκαίCONJ μεμισήκασινhave hatedμισέωV-RAI-3P καὶbothκαίCONJ ἐμὲMeἐγώP-1AS καὶandκαίCONJ τὸνtheT-ASM ΠατέραFatherπατήρN-ASM μου.of Me.ἐγώP-1GS 約15:25 ἀλλ᾽But [this is]ἀλλάCONJ ἵναthatἵναCONJ πληρωθῇmay be fulfilledπληρόωV-APS-3S theT-NSM λόγοςwordλόγοςN-NSM T-NSM ἐνinἐνPREP τῷtheT-DSM νόμῳlawνόμοςN-DSM αὐτῶνof themαὐτόςP-GPM γεγραμμένοςhaving been writtenγράφωV-RPP-NSM ὅτι‑:ὅτιADV ἘμίσησάνThey hatedμισέωV-AAI-3P μεMeἐγώP-1AS δωρεάν.¶without cause.’δωρεάνADV 約15:26 ὍτανWhenὅτανCONJ ἔλθῃcomesἔρχομαιV-2AAS-3S theT-NSM ΠαράκλητοςHelper‚παράκλητοςN-NSM ὃνwhomὅς, ἥR-ASM ἐγὼIἐγώP-1NS πέμψωwill sendπέμπωV-FAI-1S ὑμῖνto youσύP-2DP παρὰfromπαράPREP τοῦtheT-GSM Πατρός‚Father‚πατήρN-GSM τὸtheT-NSN ΠνεῦμαSpiritπνεῦμαN-NSN τῆςT-GSF ἀληθείαςof truth‚ἀλήθειαN-GSF whoὅς, ἥR-NSN παρὰfromπαράPREP τοῦtheT-GSM ΠατρὸςFatherπατήρN-GSM ἐκπορεύεται‚goes forth‚ἐκπορεύωV-PNI-3S ἐκεῖνοςHeἐκεῖνοςD-NSM μαρτυρήσειwill bear witnessμαρτυρέωV-FAI-3S περὶconcerningπερίPREP ἐμοῦ·Me.ἐγώP-1GS + + + + + +--- +[Mounce Reader ↵](GRBG.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/Mounce-Reader/GRBG.md b/Mounce-Reader/GRBG.md new file mode 100644 index 0000000..75bd753 --- /dev/null +++ b/Mounce-Reader/GRBG.md @@ -0,0 +1,108 @@ +# Mounce 進階讀本 (Graded Reader) + +## 書目 + +Mounce, William D. _A Graded Reader of Biblical Greek_. Grand Rapids, MI.: Zondervan, 1996. + +威廉‧孟恩思(William D. Mounce)。《聖經希臘文進階:讀本》。沈其光、潘秋松譯。美國:麥種傳道會,2015。 + + +## 目錄 + +章節 | 經文 | 圖析 | 大綱 +--- | --- | --- | --- +Chapter 01 | [經文](GRBG-01a.md) | [圖析](GRBG-01b.md) | [大綱](GRBG-01c.md) +Chapter 02 | [經文](GRBG-02a.md) | [圖析](GRBG-02b.md) | [大綱](GRBG-02c.md) +Appendix A | [句法摘要](Syntax-Summary.md) | | + + +## 章節進度 +- Chapter 1:約翰一書 1:1–2:2; 2:28–3:10 (23 節) + - 約一 1:1–4 (4 節) + - 約一 1:5–2: (7 節) + - 約一 2:28–3:3 (5 節) + - 約一 3:4–10 (7 節) +- Chapter 2:約翰福音 15:1–27 (27 節) + - 約 15:1–4 (4 節) + - 約 15:5–11 (7 節) + - 約 15:12–17 (6 節) + - 約 15:18–21 (4 節) + - 約 15:22–27 (6 節) +- Chapter 3:馬可福音 1:1–28 (28 節) + - 可 1:1–4 (4 節) + - 可 1:5–8 (4 節) + - 可 1:9–13 (5 節) + - 可 1:14–20 (7 節) + - 可 1:21–24 (4 節) + - 可 1:25–28 (4 節) +- Chapter 4:馬可福音 8:27–9:8 (20 節) + - 可 8:27–32 (6 節) + - 可 8:33–9:1 (7 節) + - 可 9:2–8 (7 節) +- Chapter 5:歌羅西書 1:1–23 (23 節) + - 西 1:1–8 (8 節) + - 西 1:9–14 (6 節) + - 西 1:15–20 (6 節) + - 西 1:21–23 (3 節) +- Chapter 6:馬太福音 6:5–34 (30 節) + - 太 6:5–8 (3 節) + - 太 6:9–15 (7 節) + - 太 6:16–21 (6 節) + - 太 6:22–26 (5 節) + - 太 6:27–34 (8 節) +- Chapter 7:羅馬書 3: 21–26; 5:1–11; 8:1–17 (34 節) + - 羅 3:21–26 (6 節) + - 羅 5:1–5 (5 節) + - 羅 5:6–11 (6 節) + - 羅 8:1–6 (6 節) + - 羅 8:7–11 (5 節) + - 羅 8:12–17 (6 節) +- Chapter 8:雅各書 1:1–21 (21 節) + - 雅 1:1–4 (4 節) + - 雅 1:5–8 (4 節) + - 雅 1:9-12 (4 節) + - 雅 1:13–21 (9 節) +- Chapter 9:腓立比書 1:27–2:13 (17 節) + - 腓 1:27-30 (4 節) + - 腓 2:1–4 (4 節) + - 腓 2:5–8 (4 節) + - 腓 2:9-13 (5 節) +- Chapter 10:馬太福音 13:1–23 (23 節) + - 太 13:1-9 (9 節) + - 太 13:10-17 (8 節) + - 太 13:18-23 (6 節) +- Chapter 11: 彼得前書 1:1-21 (21 節) + - 彼前 1:1-2 (2 節) + - 彼前 1:3-5 (3 節) + - 彼前 1:6-9 (4 節) + - 彼前 1:10-12 (3 節) + - 彼前 1:13-21 (9 節) +- Chapter 12:提摩太前書 4:6-16 (11 節) + - 提前 4:6-10 (5 節) + - 提前 4:11-16 (6 節) +- Chapter 13:路e 23:26-49; 24:1-8 (32 節) + - 路 23:26-49 (24 節) + - 路 24:1-8 (8 節) +- Chapter 14:以弗所書 1:1-14 (14 節) + - 弗 1:1-2 (2 節) + - 弗 1:3-14 (12 節) +- Chapter 15:使徒行傳 2:22-42 (21 節) + - 徒 2:22-36 (15 節) + - 徒 2:37-42 (6 節) +- Chapter 16:帖撒羅尼迦後書 2:1-12 (12 節) + - 帖後 2:1-12 (12 節) +- Chapter 17:希伯來書 5:11-6:12 (16 節) + - 來 5:11-6:12 (16 節) +- Chapter 18:啟示錄 5:1-14 (14 節) + - 啟 5:1-14 (14 節) +- Chapter 19:LXX 詩篇 41 (12 節) + - Ps 41:1-12 (12 節) +- Chapter 20:Didache 1:1-6; 7:1-4; 11:1-6 (16 節) + - Did 1:1-6 (6 節) + - Did 7:1-4 (4 節) + - Did 11:1-6 (6 節) + + +--- +[Mounce Reader ↵](GRBG.md) +[全民希臘文進階筆記 ↵](../%E5%85%A8%E6%B0%91%E5%B8%8C%E8%87%98%E6%96%87%E9%80%B2%E9%9A%8E.md) \ No newline at end of file diff --git a/Mounce-Reader/Syntax-Summary.md b/Mounce-Reader/Syntax-Summary.md new file mode 100644 index 0000000..63b5bd6 --- /dev/null +++ b/Mounce-Reader/Syntax-Summary.md @@ -0,0 +1,1332 @@ +# Mounce 進階讀本
句法摘要 (Syntax Summary) + +- [格 (Case)](#格-case) + - [主格 (Nominative)](#主格-nominative) + - [A. 主要用法 (Primary Uses of the Nominative)](#a-主要用法-primary-uses-of-the-nominative) + - [1. 主詞 (Subject)](#1-主詞-subject) + - [2. 述詞主格 (Predicate Nominative)](#2-述詞主格-predicate-nominative) + - [3. 單純同位句型的主格 (Nominative in Simple Apposition)](#3-單純同位句型的主格-nominative-in-simple-apposition) + - [B. 獨立用法 (Grammatically Independent Uses of the Nominative)](#b-獨立用法-grammatically-independent-uses-of-the-nominative) + - [4. 獨立主格 (Nominative Absolute)](#4-獨立主格-nominative-absolute) + - [5. 懸置主格 (Pendent Nominative)](#5-懸置主格-pendent-nominative) + - [6. 插句主格 (Parenthetic Nominative)](#6-插句主格-parenthetic-nominative) + - [7. 稱謂主格 (Nominative for Vocative/Nominative of Address)](#7-稱謂主格-nominative-for-vocativenominative-of-address) + - [8. 驚嘆主格 (Nominative of Exclamation)](#8-驚嘆主格-nominative-of-exclamation) + - [C. 取代斜格 (Nominatives in Place of Oblique Cases)](#c-取代斜格-nominatives-in-place-of-oblique-cases) + - [9. 稱號主格 (Nominative of Appellation)](#9-稱號主格-nominative-of-appellation) + - [呼格 (Vocative)](#呼格-vocative) + - [1. 單純的稱呼 (Simple Address)](#1-單純的稱呼-simple-address) + - [2. 強調的、帶感情的稱呼 (Emphatic/Emotional Address)](#2-強調的帶感情的稱呼-emphaticemotional-address) + - [所有格 (Genitive)](#所有格-genitive) + - [A. 形容用法 (Adjectival Genitive)](#a-形容用法-adjectival-genitive) + - [1. 描述的所有格 (descriptive Genitive)](#1-描述的所有格-descriptive-genitive) + - [2. 擁有的所有格 (Possessive Genitive)](#2-擁有的所有格-possessive-genitive) + - [3. 親屬關係的所有格 (Genitive of Relationship)](#3-親屬關係的所有格-genitive-of-relationship) + - [4. 部分的、整體的所有格 (Partitive/Wholative Genitive)](#4-部分的整體的所有格-partitivewholative-genitive) + - [5. 表達屬性的、希伯來式的、性質的所有格 (Attributive/Hebrew Genitive, Genitive of Quality)](#5-表達屬性的希伯來式的性質的所有格-attributivehebrew-genitive-genitive-of-quality) + - [6. 被賦予屬性的所有格 (Attributed Genitive)](#6-被賦予屬性的所有格-attributed-genitive) + - [7. 材料的所有格 (Genitive of Material)](#7-材料的所有格-genitive-of-material) + - [8. 內容的所有格 (Genitive of Content)](#8-內容的所有格-genitive-of-content) + - [9. 單純同位的所有格 (Genitive in Simple Apposition)](#9-單純同位的所有格-genitive-in-simple-apposition) + - [10. 附加說明的、同位句型的、定義的所有格 (Epexegetical Genitive, Genitive of Apposition/Definition)](#10-附加說明的同位句型的定義的所有格-epexegetical-genitive-genitive-of-appositiondefinition) + - [11. 隸屬的所有格 (Genitive of Subordination)](#11-隸屬的所有格-genitive-of-subordination) + - [B. 分離用法 (Ablative Genitive)](#b-分離用法-ablative-genitive) + - [12. 隔開的所有格 (Genitive of Separation)](#12-隔開的所有格-genitive-of-separation) + - [12a. 來源的所有格 (Genitive of Source)](#12a-來源的所有格-genitive-of-source) + - [13. 比較的所有格 (Genitive of Comparison)](#13-比較的所有格-genitive-of-comparison) + - [C. 動詞用法 (Verbal Genitive [Genitive Related to a Verbal Noun])](#c-動詞用法-verbal-genitive-genitive-related-to-a-verbal-noun) + - [14. 主詞所有格 (Subjective Genitive)](#14-主詞所有格-subjective-genitive) + - [15. 受詞所有格 (Objective Genitive)](#15-受詞所有格-objective-genitive) + - [16. 整全所有格 (Plenary Genitive)](#16-整全所有格-plenary-genitive) + - [D. 副詞用法 (Adverbial Genitive)](#d-副詞用法-adverbial-genitive) + - [17. 時間 (Genitive of Time)](#17-時間-genitive-of-time) + - [18. 關聯 (Genitive of Association)](#18-關聯-genitive-of-association) + - [E. 在某些字之後 (After Certain Words)](#e-在某些字之後-after-certain-words) + - [19. 在某些動詞之後,作為直接受詞 (as a Direct Object)](#19-在某些動詞之後作為直接受詞-as-a-direct-object) + - [20. 在某些形容詞、副詞之後 (After Certain Adjectives/Adverbs)](#20-在某些形容詞副詞之後-after-certain-adjectivesadverbs) + - [間接受格 (Dative)](#間接受格-dative) + - [A. 單純用法 (Pure Dative Uses)](#a-單純用法-pure-dative-uses) + - [1. 間接受詞的間接受格 (Dative of Indirect Object)](#1-間接受詞的間接受格-dative-of-indirect-object) + - [2. 利益的間接受格 (Dative of Interest)](#2-利益的間接受格-dative-of-interest) + - [3. 指涉的、關注的間接受格 (Dative of Reference/Respect)](#3-指涉的關注的間接受格-dative-of-referencerespect) + - [4. 單純同位的間接受格 (Dative of Simple Apposition)](#4-單純同位的間接受格-dative-of-simple-apposition) + - [B. 位置用法 (Local Dative Uses)](#b-位置用法-local-dative-uses) + - [5. 表示範圍的間接受格 (Dative of Sphere)](#5-表示範圍的間接受格-dative-of-sphere) + - [6. 表示時間的間接受格 (Dative of Time)](#6-表示時間的間接受格-dative-of-time) + - [C. 憑藉用法 (Instrumental Dative Uses)](#c-憑藉用法-instrumental-dative-uses) + - [7. 關聯的、陪伴的、隨伴的間接受格 (Dative of Association/Accompaniment)](#7-關聯的陪伴的隨伴的間接受格-dative-of-associationaccompaniment) + - [8. 方式的、副詞的間接受格 (Dative of Manner, Adverbial Dative)](#8-方式的副詞的間接受格-dative-of-manner-adverbial-dative) + - [9. 途徑的、憑藉的間接受格 (Dative of Means/Instrument)](#9-途徑的憑藉的間接受格-dative-of-meansinstrument) + - [10. 量度的、程度的間接受格 (Dative of Measure/Degree of Difference)](#10-量度的程度的間接受格-dative-of-measuredegree-of-difference) + - [11. 原因的間接受格 (Dative of Cause)](#11-原因的間接受格-dative-of-cause) + - [D. 在某些字之後 (The Uses of the Dative After Certain Words)](#d-在某些字之後-the-uses-of-the-dative-after-certain-words) + - [12. 直接受詞的間接受格 (Dative of Interest)](#12-直接受詞的間接受格-dative-of-interest) + - [13. 在某些名詞之後 (After Certain Nouns)](#13-在某些名詞之後-after-certain-nouns) + - [14. 在某些形容詞之後 (After Certain Adjectives)](#14-在某些形容詞之後-after-certain-adjectives) + - [直接受格 (Accusative)](#直接受格-accusative) + - [A. 名詞用法 (Substantival Uses of the Accusative)](#a-名詞用法-substantival-uses-of-the-accusative) + - [1. 直接受詞的直接受格 (Accusative of Direct Object)](#1-直接受詞的直接受格-accusative-of-direct-object) + - [2. 雙重直接受格 (Double Accusative)](#2-雙重直接受格-double-accusative) + - [3. 述詞的的直接受格 (Predicate Accusative)](#3-述詞的的直接受格-predicate-accusative) + - [4. 不定詞主詞的的直接受格 (Accusative Subject of the Infinitive)](#4-不定詞主詞的的直接受格-accusative-subject-of-the-infinitive) + - [5. 單純同位的直接受格 (Accusative in Simple Apposition)](#5-單純同位的直接受格-accusative-in-simple-apposition) + - [B. 副詞用法 (Adverbial Uses of the Accusative)](#b-副詞用法-adverbial-uses-of-the-accusative) + - [6. 副詞的、方式的直接受格 (Adverbial Accusative, Accusative of Manner)](#6-副詞的方式的直接受格-adverbial-accusative-accusative-of-manner) + - [7. 度量的、時空的直接受格 (Accusative of Measure, Extent of Time or Space)](#7-度量的時空的直接受格-accusative-of-measure-extent-of-time-or-space) + - [8. 關注的、一般指涉的直接受格 (Accusative of Respect, General Reference)](#8-關注的一般指涉的直接受格-accusative-of-respect-general-reference) +- [冠詞 (The Article)](#冠詞-the-article) + - [A. 作為代名詞 (As a Pronoun)⸺部分獨立用法 (Partially Independent Use)](#a-作為代名詞-as-a-pronoun部分獨立用法-partially-independent-use) + - [1. 人稱代名詞 (Personal Pronoun)](#1-人稱代名詞-personal-pronoun) + - [2. 關係代名詞 (Relative Pronoun)](#2-關係代名詞-relative-pronoun) + - [3. 所有代名詞 (Possessive Pronoun)](#3-所有代名詞-possessive-pronoun) + - [B. 帶出名詞 (with Substantive)⸺修飾用法 (Modifying Use)](#b-帶出名詞-with-substantive修飾用法-modifying-use) + - [4. 單純指認 (Simple Identification)](#4-單純指認-simple-identification) + - [5. 回指前面提過的東西 (Anaphoric, Previous Reference)](#5-回指前面提過的東西-anaphoric-previous-reference) + - [6. 直指就在眼前的東西 (Deictic/Pointing Article)](#6-直指就在眼前的東西-deicticpointing-article) + - [7. 出類拔萃 (Par Excellence)](#7-出類拔萃-par-excellence) + - [8. 獨一、絕無僅有、唯一 (Monadic/One of a Kind/Unique Article)](#8-獨一絕無僅有唯一-monadicone-of-a-kindunique-article) + - [9. 熟知、高知名度 (Well-Known/Celebrity Article)](#9-熟知高知名度-well-knowncelebrity-article) + - [10. 抽象 (Abstract)](#10-抽象-abstract) + - [11. 通性化、表示類別的 (Genetic/Categorical Article)](#11-通性化表示類別的-geneticcategorical-article) + - [C. 使某字成為名詞 (As a Substantiver)](#c-使某字成為名詞-as-a-substantiver) + - [D. 標示某種功能 (As a Function Marker)](#d-標示某種功能-as-a-function-marker) + - [12. 標示形容詞的位置 (to Denote Adjectival Positions)](#12-標示形容詞的位置-to-denote-adjectival-positions) + - [13. 與所有代名詞連用 (with Possessive Pronouns)](#13-與所有代名詞連用-with-possessive-pronouns) + - [14. 用於所有格片語 (in Genitive Phrases)](#14-用於所有格片語-in-genitive-phrases) + - [15. 與無格變式的名詞連用 (with Indeclinable Nouns)](#15-與無格變式的名詞連用-with-indeclinable-nouns) + - [16. 與分詞連用 (with Participles)](#16-與分詞連用-with-participles) + - [17. 與指示詞連用 (with Demonstratives)](#17-與指示詞連用-with-demonstratives) + - [18. 與主格名詞連用 (with Nominative Nouns)](#18-與主格名詞連用-with-nominative-nouns) + - [19. 區別主詞 vs. 述詞主格 (Subject vs. Predicate Nominative),區別受詞 vs. 補語 (Object vs. Complement)](#19-區別主詞-vs-述詞主格-subject-vs-predicate-nominative區別受詞-vs-補語-object-vs-complement) + - [E. 無冠詞 (Absence of the Article)](#e-無冠詞-absence-of-the-article) + - [20. 非特定 (Indefinite)](#20-非特定-indefinite) + - [21. 定性 (Qualitative)](#21-定性-qualitative) + - [22. 特定 (Definite)](#22-特定-definite) +- [語態 (Voice)](#語態-voice) + - [A. 主動語態 (Active Voice)](#a-主動語態-active-voice) + - [1. 簡單主動 (Simple Active)](#1-簡單主動-simple-active) + - [2. 使役主動 (Causative/Ergative Active)](#2-使役主動-causativeergative-active) + - [3. 狀態主動 (Stative Active)](#3-狀態主動-stative-active) + - [4. 反身主動 (Reflexive Active)](#4-反身主動-reflexive-active) + - [B. 關身語態 (Middle Voice)](#b-關身語態-middle-voice) + - [1. 直接的、反身的、直接反身的關身 (Direct/Reflexive/Direct Reflexive Middle)](#1-直接的反身的直接反身的關身-directreflexivedirect-reflexive-middle) + - [2. 間接的、間接反身的、受惠的、加強的、動態的關身 (Indirect/Indirect Reflexive/Benefactive/Intensive/Dynamic Middle)](#2-間接的間接反身的受惠的加強的動態的關身-indirectindirect-reflexivebenefactiveintensivedynamic-middle) + - [3. 使役的關身 (Causative Middle)](#3-使役的關身-causative-middle) + - [4. 允許的關身 (Permissive Middle)](#4-允許的關身-permissive-middle) + - [5. 關身形主動意 (Deponent Middle)](#5-關身形主動意-deponent-middle) + - [C. 被動語態 (Passive Voice)](#c-被動語態-passive-voice) + - [1. 簡單被動 (Simple Passive)](#1-簡單被動-simple-passive) + - [2. 被動形主動意 (Deponent Passive)](#2-被動形主動意-deponent-passive) +- [語氣 (Mood)](#語氣-mood) + - [A. 直說語氣 (Indicative Mood)](#a-直說語氣-indicative-mood) + - [1. 宣告 (Declarative Indicative)](#1-宣告-declarative-indicative) + - [2. 疑問 (Interrogative Indicative)](#2-疑問-interrogative-indicative) + - [3. 條件 (Conditional Indicative)](#3-條件-conditional-indicative) + - [4. 潛在 (Potential Indicative)](#4-潛在-potential-indicative) + - [5. 勸慰、命令、意願 (Cohortative/Command/Volitive Indicative)](#5-勸慰命令意願-cohortativecommandvolitive-indicative) + - [B. 假設語氣 (Subjunctive Mood)](#b-假設語氣-subjunctive-mood) + - [1. 勸告、意願 (Hortatory/Volitive Subjunctive)](#1-勸告意願-hortatoryvolitive-subjunctive) + - [2. 考慮、懷疑 (Deliberative/Dubitative Subjunctive)](#2-考慮懷疑-deliberativedubitative-subjunctive) + - [3. 強烈否定 (Emphatic Negation Subjunctive)](#3-強烈否定-emphatic-negation-subjunctive) + - [4. 禁止 (Prohibitive Subjunctive)](#4-禁止-prohibitive-subjunctive) + - [5. 條件句裡的假設語氣 (Subjunctive in Conditional Sentences)](#5-條件句裡的假設語氣-subjunctive-in-conditional-sentences) + - [6. ἵνα+假設語氣](#6-ἵνα假設語氣) + - [7. 與表示害怕 ... 等的動詞連用 (Subjunctive with Verbs of Fearing etc.)](#7-與表示害怕--等的動詞連用-subjunctive-with-verbs-of-fearing-etc) + - [8. 間接問句裡的假設語氣 (Subjunctive in Indirect Questions)](#8-間接問句裡的假設語氣-subjunctive-in-indirect-questions) + - [8. 不定關係子句裡的假設語氣 (Subjunctive in Indefinite Relative Clause)](#8-不定關係子句裡的假設語氣-subjunctive-in-indefinite-relative-clause) + - [8. 不定時間子句裡的假設語氣 (Subjunctive in Indefinite Temporal Clause)](#8-不定時間子句裡的假設語氣-subjunctive-in-indefinite-temporal-clause) + - [C. 期望語氣 (Optative Mood)](#c-期望語氣-optative-mood) + - [1. 意願的、意欲的、可達到之願望的期望語氣 (Voluntative/Volitative Optative, Optative of Obtainable Wish)](#1-意願的意欲的可達到之願望的期望語氣-voluntativevolitative-optative-optative-of-obtainable-wish) + - [2. 潛在的期望語氣 (Potential Optative)](#2-潛在的期望語氣-potential-optative) + - [D. 命令語氣 (Imperative Mood)](#d-命令語氣-imperative-mood) + - [1. 命令 (Command)](#1-命令-command) + - [2. 禁止 (Prohibition)](#2-禁止-prohibition) + - [3. 請求、請願、客氣的命令 (Request, Entreaty, Polite Command)](#3-請求請願客氣的命令-request-entreaty-polite-command) + - [4. 允許、容忍 (Permissive Imperative, Imperative of Toleration)](#4-允許容忍-permissive-imperative-imperative-of-toleration) + - [5. 問候 (As a Stereotyped Greeting)](#5-問候-as-a-stereotyped-greeting) +- [時態 (Tense)](#時態-tense) + - [現在式時態形式 (Present Tense-Form)](#現在式時態形式-present-tense-form) + - [A. 短期的現在式 (Narrow-Band Presents)](#a-短期的現在式-narrow-band-presents) + - [1. 即時的、不定過去的、點狀的現在式 (Instantaneous/Aoristic/Punctiliar Present)](#1-即時的不定過去的點狀的現在式-instantaneousaoristicpunctiliar-present) + - [2. 進行的、描述的現在式 (Progressive/Descriptive Present)](#2-進行的描述的現在式-progressivedescriptive-present) + - [B. 長期 (Broad-Band Presents)](#b-長期-broad-band-presents) + - [3. 從過去延伸至今的、仍在進行的現在式 (Extending-from-Past Present, Present of Past Action Still in Progress)](#3-從過去延伸至今的仍在進行的現在式-extending-from-past-present-present-of-past-action-still-in-progress) + - [4. 重複的現在式 (Iterative Present)](#4-重複的現在式-iterative-present) + - [5. 習慣的、慣常的、一般的現在式 (Customary/Habitual/General Present)](#5-習慣的慣常的一般的現在式-customaryhabitualgeneral-present) + - [6. 格言的現在式 (Gnomic Present)](#6-格言的現在式-gnomic-present) + - [C. 特殊用法的現在式 (Special Uses of the Presents)](#c-特殊用法的現在式-special-uses-of-the-presents) + - [7. 歷史的、生動的現在式 (Historical/Dramatic Present)](#7-歷史的生動的現在式-historicaldramatic-present) + - [8. 未來的現在式 (Futuristic Present)](#8-未來的現在式-futuristic-present) + - [9. 在間述句裡 (Present Retained in Indirect Discourse)](#9-在間述句裡-present-retained-in-indirect-discourse) + - [不完成式時態形式 (Imperfect Tense-Form)](#不完成式時態形式-imperfect-tense-form) + - [A. 短期的不完成式 (Narrow-Band Imperfects)](#a-短期的不完成式-narrow-band-imperfects) + - [1. 進行的、描述的不完成式 (Progressive/Descriptive Imperfect)](#1-進行的描述的不完成式-progressivedescriptive-imperfect) + - [2. 起始的、表始的、發端的不完成式 (Ingressive/Inchoative/Inceptive Present)](#2-起始的表始的發端的不完成式-ingressiveinchoativeinceptive-present) + - [B. 長期的不完成式 (Broad-Band Imperfects)](#b-長期的不完成式-broad-band-imperfects) + - [3. 重複的不完成式 (Iterative Imperfect)](#3-重複的不完成式-iterative-imperfect) + - [4. 習慣的、慣常的、一般的不完成式 (Customary/Habitual/General Imperfect)](#4-習慣的慣常的一般的不完成式-customaryhabitualgeneral-imperfect) + - [C. 特殊用法的不完成式 (Special Uses of the Imperfects)](#c-特殊用法的不完成式-special-uses-of-the-imperfects) + - [5. 嘗試的、意願的、瀕臨的不完成式 (Conative/Voluntative/Tendential Imperfect)](#5-嘗試的意願的瀕臨的不完成式-conativevoluntativetendential-imperfect) + - [6. 在間述句裡面 (Imperfect Retained in Indirect Discourse)](#6-在間述句裡面-imperfect-retained-in-indirect-discourse) + - [未來式時態形式 (Future Tesne-Form)](#未來式時態形式-future-tesne-form) + - [1. 預測的未來式 (Predictive Future)](#1-預測的未來式-predictive-future) + - [2. 命令的未來式 (Imperatival Future)](#2-命令的未來式-imperatival-future) + - [3. 考慮的未來式 (Deliberative Future)](#3-考慮的未來式-deliberative-future) + - [4. 格言的未來式 (Gnomic Future)](#4-格言的未來式-gnomic-future) + - [不定過去式時態形式 (Aorist Tense-Form)](#不定過去式時態形式-aorist-tense-form) + - [1. 敘事的、涵蓋的、點狀的、全面的、全地的不定過去式 (Constative/Complexive/Punctiliar/Comprehensive/Global Aorist)](#1-敘事的涵蓋的點狀的全面的全地的不定過去式-constativecomplexivepunctiliarcomprehensiveglobal-aorist) + - [2. 起始的、表始得、發端的不定過去式 (Ingressive/Inceptive/Inchoative Aorist)](#2-起始的表始得發端的不定過去式-ingressiveinceptiveinchoative-aorist) + - [3. 完成的、累積的、結果的、效果的不定過去式 (Consummative/Culminative/Ecbatic/Effective Aorist)](#3-完成的累積的結果的效果的不定過去式-consummativeculminativeecbaticeffective-aorist) + - [4. 格言的不定過去式 (Gnomic Aorist)](#4-格言的不定過去式-gnomic-aorist) + - [5. 書信的不定過去式 (Epistolary Aorist)](#5-書信的不定過去式-epistolary-aorist) + - [6. 預期的、未來的不定過去式 (Proleptic/Futuristic Aorist)](#6-預期的未來的不定過去式-prolepticfuturistic-aorist) + - [7. 剛過的、生動的不定過去式 (Immediate Past/Dramatic Aorist)](#7-剛過的生動的不定過去式-immediate-pastdramatic-aorist) + - [現在完成式、過去完成式時態形式 (Perfect and Plluperfect Tense-Form)](#現在完成式過去完成式時態形式-perfect-and-plluperfect-tense-form) + - [A. 現在完成式時態形式 (Perfect Tense-Form)](#a-現在完成式時態形式-perfect-tense-form) + - [1. 加強的、結果的現在完成式 (Intensive/Resultative Perfect)](#1-加強的結果的現在完成式-intensiveresultative-perfect) + - [2. 廣泛的、完成的現在完成式 (Extensive/Consummative Perfect)](#2-廣泛的完成的現在完成式-extensiveconsummative-perfect) + - [3. 具有現在涵義的現在完成式 (Perfect with a Present Force)](#3-具有現在涵義的現在完成式-perfect-with-a-present-force) + - [B. 過去完成式時態形式 (Pluperfect Tense-Form)](#b-過去完成式時態形式-pluperfect-tense-form) + - [1. 加強的、結果的過去完成式 (Intensive/Resultative Pluperfect)](#1-加強的結果的過去完成式-intensiveresultative-pluperfect) + - [2. 廣泛的、完成的過去完成式 (Extensive/Consummative Pluperfect)](#2-廣泛的完成的過去完成式-extensiveconsummative-pluperfect) +- [不定詞 (Infinitive)](#不定詞-infinitive) + - [A. 副詞用法 (Adverbial Uses)](#a-副詞用法-adverbial-uses) + - [1. 目的 (Purpose)](#1-目的-purpose) + - [2. 結果 (Result)](#2-結果-result) + - [3. 時間 (Time)](#3-時間-time) + - [4. 原因 (Cause)](#4-原因-cause) + - [5. 途徑 (Means)](#5-途徑-means) + - [6. 補語的 (Complementary)](#6-補語的-complementary) + - [B. 名詞用法 (Substantival Uses)](#b-名詞用法-substantival-uses) + - [7. 主詞 (Subject)](#7-主詞-subject) + - [8. 直接受詞 (Direct Object)](#8-直接受詞-direct-object) + - [9. 間述句 (Indirect Discourse)](#9-間述句-indirect-discourse) + - [8. 同位句型 (Appositional)](#8-同位句型-appositional) + - [8. 附加說明 (Epexgetical)](#8-附加說明-epexgetical) +- [分詞 (Participle)](#分詞-participle) + - [A. 形容用法 (Adjectival Participles)](#a-形容用法-adjectival-participles) + - [1. 正式的形容用法 (Adjectival Proper)、附屬用法 (Dependent)](#1-正式的形容用法-adjectival-proper附屬用法-dependent) + - [2. 名詞、獨立用法 (Substantival/Independent)](#2-名詞獨立用法-substantivalindependent) + - [B. 與動詞有關的用法 (Verbal Participles)](#b-與動詞有關的用法-verbal-participles) + - [3. 表示情境的副詞用法 (Adverbial/Circumstantial)](#3-表示情境的副詞用法-adverbialcircumstantial) + - [4. 附帶狀況 (Attendant Circumstance)](#4-附帶狀況-attendant-circumstance) + - [5. 迂說 (Periphrastic)](#5-迂說-periphrastic) + - [6. 冗贅、贅語 (Redundant/Pleonastic)](#6-冗贅贅語-redundantpleonastic) + - [7. 獨立的動詞用法,用作命令語氣 (Independent Verbal Participle as an Imperative)](#7-獨立的動詞用法用作命令語氣-independent-verbal-participle-as-an-imperative) + - [8. 獨立所有格 (Genitive Absolute)](#8-獨立所有格-genitive-absolute) + +
+ +## 格 (Case) + +### 主格 (Nominative) + +#### A. 主要用法 (Primary Uses of the Nominative) + +##### 1. 主詞 (Subject) + +- 約3:16 ΟὕτωςThusοὕτω, οὕτωςADV γὰρforγάρCONJ ἠγάπησενlovedἀγαπάωV-AAI-3S T-NSM ΘεὸςGodθεόςN-NSM τὸνtheT-ASM κόσμον‚world‚κόσμοςN-ASM 愛世人 + +##### 2. 述詞主格 (Predicate Nominative) + +- 太3:17 ΟὗτόςThisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S theT-NSM ΥἱόςSonυἱόςN-NSM μουof me‚ἐγώP-1GS theT-NSM ἀγαπητός‚beloved‚ἀγαπητόςA-NSM 這是我的愛子 + + + + - 約4:24 ΠνεῦμαSpiritπνεῦμαN-NSN T-NSM Θεός‚God [is]‚θεόςN-NSM 神是個 + +##### 3. 單純同位句型的主格 (Nominative in Simple Apposition) + +- 太3:1 παραγίνεταιcomesπαραγίνομαιV-PNI-3S ἸωάννηςJohnἸωάννηςN-NSM-P theT-NSM βαπτιστὴςBaptist‚ΒαπτιστήςN-NSM 施洗的約翰出來 + +#### B. 獨立用法 (Grammatically Independent Uses of the Nominative) + +##### 4. 獨立主格 (Nominative Absolute) + +- 太1:1 Βίβλος[The] bookβίβλοςN-NSF γενέσεωςof [the] genealogyγένεσιςN-GSF Ἰησοῦof JesusἸησοῦςN-GSM-P ΧριστοῦChrist‚ΧριστόςN-GSM-T 耶穌基督的家 + +- 羅1:7 ΧάριςGraceχάριςN-NSF ὑμῖνto youσύP-2DP καὶandκαίCONJ εἰρήνηpeaceεἰρήνηN-NSF ἀπὸfromἀπόPREP ΘεοῦGodθεόςN-GSM Πατρὸς[the] FatherπατήρN-GSM ἡμῶνof usἐγώP-1GP καὶandκαίCONJ Κυρίου[the] LordκύριοςN-GSM ἸησοῦJesusἸησοῦςN-GSM-P Χριστοῦ.¶Christ.ΧριστόςN-GSM-T 恩惠、平安從我們的父神並主耶穌基督歸與你們! + +##### 5. 懸置主格 (Pendent Nominative) + +- 啟3:12 The [one]T-NSM νικῶνovercoming‚νικάωV-PAP-NSM ποιήσωI will makeποιέωV-FAI-1S αὐτὸνhimαὐτόςP-ASM στῦλονa pillarστῦλοςN-ASM ἐνinἐνPREP τῷtheT-DSM ναῷtempleναόςN-DSM τοῦof theT-GSM ΘεοῦGodθεόςN-GSM μουof Me‚ἐγώP-1GS 得勝的,我要叫他在我神殿中作柱子 + +##### 6. 插句主格 (Parenthetic Nominative) + +- 約1:6 ἘγένετοThere cameγίνομαιV-2ADI-3S ἄνθρωπος‚a manἄνθρωποςN-NSM ἀπεσταλμένοςhaving been sentἀποστέλλωV-RPP-NSM παρὰfromπαράPREP Θεοῦ‚God;θεόςN-GSM ὄνομα[the] nameὄνομαN-NSN αὐτῷto HimαὐτόςP-DSM Ἰωάννης·[was] John.ἸωάννηςN-NSM-P 有一個人,是從神那裡差來的,叫約翰。 + +##### 7. 稱謂主格 (Nominative for Vocative/Nominative of Address) + +- 約17:25 ΠάτερFatherπατήρN-VSM δίκαιε‚righteous‚δίκαιοςA-VSM καὶalthoughκαίCONJ theT-NSM κόσμοςworldκόσμοςN-NSM σεYouσύP-2AS οὐκnotοὐPRT-N ἔγνω‚has known‚γινώσκωV-2AAI-3S 公義的父阿,世人未曾認識你 + + +- 可9:19 OINJ γενεὰgenerationγενεάN-VSF ἄπιστος‚unbelieving!ἄπιστοςA-VSF ἕωςUntilἕωςPREP πότεwhenπότεPRT-I πρὸςwithπρόςPREP ὑμᾶςyouσύP-2AP ἔσομαι;will I be?εἰμίV-FDI-1S 噯!不信的世代阿,我在你們這裡要到幾時呢? + +##### 8. 驚嘆主格 (Nominative of Exclamation) + +- 羅7:24 ΤαλαίπωροςO wretchedταλαίπωροςA-NSM ἐγὼI amἐγώP-1NS ἄνθρωπος·man!ἄνθρωποςN-NSM 我真是苦阿! + +#### C. 取代斜格 (Nominatives in Place of Oblique Cases) + +##### 9. 稱號主格 (Nominative of Appellation) + +- 約13:13 ὑμεῖςYouσύP-2NP φωνεῖτέcallφωνέωV-PAI-2P με·MeἐγώP-1AS T-NSM Διδάσκαλος‚TeacherδιδάσκαλοςN-NSM καὶ·andκαίCONJ T-NSM Κύριος‚Lord‚κύριοςN-NSM 你們稱呼我夫子,稱呼我 + +### 呼格 (Vocative) + +##### 1. 單純的稱呼 (Simple Address) +- 太9:22 T-NSM ἸησοῦςJesus‚ἸησοῦςN-NSM-P ... εἶπεν·said‚ἔπω, ἐρῶ, εἶπονV-2AAI-3S Θάρσει‚Take courage‚θαρσέωV-PAM-2S θύγατερ·daughter;θυγάτηρN-VSF theT-NSF πίστιςfaithπίστιςN-NSF σουof youσύP-2GS σέσωκένhas curedσῴζωV-RAI-3S σε.you.σύP-2AS 耶穌…說:女兒,放心!你的信救了你。 + +- 路4:23 ΠάντωςSurelyπάντωςADV ἐρεῖτέyou will sayἔπω, ἐρῶ, εἶπονV-FAI-2P μοιto MeἐγώP-1DS τὴνtheT-ASF παραβολὴνproverbπαραβολήN-ASF ταύτην·this‚οὗτοςD-ASF Ἰατρέ‚PhysicianἰατρόςN-VSM θεράπευσονhealθεραπεύωV-AAM-2S σεαυτόν·yourself!σεαυτοῦF-2ASM 你們必引這俗語向我說:醫生,你醫治自己罷! + +##### 2. 強調的、帶感情的稱呼 (Emphatic/Emotional Address) + +- 太15:28 T-NSM ἸησοῦςJesusἸησοῦςN-NSM-P εἶπενsaidἔπω, ἐρῶ, εἶπονV-2AAI-3S αὐτῇ·to her‚αὐτόςP-DSF OINJ γύναι‚woman‚γυνήN-VSF μεγάληgreat [is]μέγαςA-NSF σουof youσύP-2GS theT-NSF πίστις·faith!πίστιςN-NSF 耶穌說:婦人,你的信心是大的! + +- 雅2:20 ΘέλειςDo you wantθέλωV-PAI-2S δὲhoweverδέCONJ γνῶναι‚to come to know‚γινώσκωV-2AAN OINJ ἄνθρωπεmanἄνθρωποςN-VSM κενέ‚foolish‚κενόςA-VSM ὅτιthatὅτιCONJ T-NSF πίστιςfaithπίστιςN-NSF χωρὶςapart fromχωρίςPREP τῶνT-GPN ἔργωνworksἔργονN-GPN ἀργήworthlessἀργόςA-NSF ἐστιν;is?εἰμίV-PAI-3S 虛浮的人哪,你願意知道沒有行為的信心是死的麼? + +### 所有格 (Genitive) + +#### A. 形容用法 (Adjectival Genitive) + +##### 1. 描述的所有格 (descriptive Genitive) + +- 羅13:12 ἐνδυσώμεθαwe should put onἐνδύωV-AMS-1P δὲnowδέCONJ τὰtheT-APN ὅπλαarmorὅπλονN-APN τοῦT-GSN φωτός.of light.φῶςN-GSN 我們就當...帶上光明的兵器 + +##### 2. 擁有的所有格 (Possessive Genitive) + +- 太26:51 τὸνtheT-ASM δοῦλονservantδοῦλοςN-ASM τοῦof theT-GSM ἀρχιερέωςhigh priest‚ἀρχιερεύςN-GSM 大祭司的僕人 + +- 約20:28 ἈπεκρίθηAnsweredἀποκρίνωV-ADI-3S ΘωμᾶςThomasΘωμᾶςN-NSM-P καὶandκαίCONJ εἶπενsaidἔπω, ἐρῶ, εἶπονV-2AAI-3S αὐτῷ·to Him‚αὐτόςP-DSM TheT-VSM ΚύριόςLordκύριοςN-VSM μουof MeἐγώP-1GS καὶandκαίCONJ theT-VSM ΘεόςGodθεόςN-VSM μου.of me!ἐγώP-1GS 多馬說:我的主!我的神! + +##### 3. 親屬關係的所有格 (Genitive of Relationship) + +- 太20:20 μήτηρmotherμήτηρN-NSF τῶνof theT-GPM υἱῶνsonsυἱόςN-GPM Ζεβεδαίουof ZebedeeΖεβεδαῖοςN-GSM-P 西庇太兒子的母親 + + +- 約21:15 ΣίμωνSimonΣίμωνN-VSM-P Ἰωάννου‚[son] of John‚ἸωάννηςN-GSM-P 約翰的兒子西門 + +##### 4. 部分的、整體的所有格 (Partitive/Wholative Genitive) + +- 路19:8 τὰtheT-APN ἡμίσιάhalfἥμισυςA-APN μουof meἐγώP-1GS τῶνof theT-GPN ὑπαρχόντων‚possessions‚ὑπάρχωV-PAP-GPN 所有的一半 + + +- 羅11:17 τινεςsomeτιςX-NPM τῶνof theT-GPM κλάδωνbranchesκλάδοςN-GPM 眾枝子中的某些 + +##### 5. 表達屬性的、希伯來式的、性質的所有格 (Attributive/Hebrew Genitive, Genitive of Quality) + +- 路18:6 theT-NSM κριτὴςjudgeκριτήςN-NSM τῆςT-GSF ἀδικίαςunrighteousἀδικίαN-GSF 不義的 + + +- 羅6:6 τὸtheT-NSN σῶμαbodyσῶμαN-NSN τῆςT-GSF ἁμαρτίας‚of sin‚ἁμαρτίαN-GSF 有罪的身體 + +##### 6. 被賦予屬性的所有格 (Attributed Genitive) + +- 羅6:4 ἵναso thatἵναCONJ ... οὕτωςsoοὕτω, οὕτωςADV καὶalsoκαίCONJ ἡμεῖςweἐγώP-1NP ἐνinἐνPREP καινότητιnewnessκαινότηςN-DSF ζωῆςof lifeζωήN-GSF περιπατήσωμεν.should walk.περιπατέωV-AAS-1P 叫我們一舉一動有新生命的樣式 + + +- 弗1:19 καὶandκαίCONJ τίwhatτίςI-NSN τὸ[is] theT-NSN ὑπερβάλλονsurpassingὑπερβάλλωV-PAP-NSN μέγεθοςgreatnessμέγεθοςN-NSN τῆςof theT-GSF δυνάμεωςpowerδύναμιςN-GSF αὐτοῦof HimαὐτόςP-GSM 他無與倫比的大能力 + +##### 7. 材料的所有格 (Genitive of Material) + +- 可2:21 ἐπίβλημαa patchἐπίβλημαN-ASN ῥάκουςof clothῥάκοςN-GSN ἀγνάφουunshrunkἄγναφοςA-GSN 沒有縮過水之布料的一塊 + + +- 啟18:12 γόμονcargoγόμοςN-ASM χρυσοῦof gold‚χρυσόςN-GSM καὶandκαίCONJ ἀργύρουof silver‚ἄργυροςN-GSM καὶandκαίCONJ λίθουof stoneλίθοςN-GSM τιμίουprecious‚τίμιοςA-GSM 這貨物就是寶石 + +##### 8. 內容的所有格 (Genitive of Content) + +- 約21:8 τὸtheT-ASN δίκτυονnetδίκτυονN-ASN τῶνwith theT-GPM ἰχθύων.fish.ἰχθύςN-GPM 充滿魚的 + + +- 路2:40 ΤὸT-NSN δὲAndδέCONJ παιδίονthe ChildπαιδίονN-NSN ηὔξανενcontinued to growαὐξάνωV-IAI-3S καὶandκαίCONJ ἐκραταιοῦτοbecome strong‚κραταιόωV-IPI-3S πληρούμενονbeing filledπληρόωV-PPP-NSN σοφίας‚of wisdom‚σοφίαN-GSF 孩子漸漸長大,強健起來,充滿智慧 + +##### 9. 單純同位的所有格 (Genitive in Simple Apposition) + +- 太2:11 εἶδονthey foundεἴδωV-2AAI-3P τὸtheT-ASN παιδίονChildπαιδίονN-ASN μετὰwithμετάPREP ΜαρίαςMaryΜαρίαN-GSF-P τῆςtheT-GSF μητρὸςmotherμήτηρN-GSF αὐτοῦ‚of Him‚αὐτόςP-GSM 看見小孩子和馬利亞,他母親 + + +- 弗1:2 ΧάριςGraceχάριςN-NSF ὑμῖνto youσύP-2DP καὶandκαίCONJ εἰρήνηpeaceεἰρήνηN-NSF ἀπὸfromἀπόPREP ΘεοῦGodθεόςN-GSM Πατρὸς[the] FatherπατήρN-GSM ἡμῶνof usἐγώP-1GP 願恩惠、平安從神,我們的歸與你們! + +##### 10. 附加說明的、同位句型的、定義的所有格 (Epexegetical Genitive, Genitive of Apposition/Definition) + +- 路22:1 theT-NSF ἑορτὴFeastἑορτήN-NSF τῶνofT-GPN ἀζύμωνUnleavened [Bread]‚ἄζυμοςA-GPN 無酵餅的 + + +- 約2:21 ἔλεγενwas speakingλέγωV-IAI-3S περὶconcerningπερίPREP τοῦtheT-GSM ναοῦtempleναόςN-GSM τοῦof theT-GSN σώματοςbodyσῶμαN-GSN αὐτοῦ.of Him.αὐτόςP-GSM 耶穌論到聖殿,他的身體 + +##### 11. 隸屬的所有格 (Genitive of Subordination) + +- 太9:34 τῷtheT-DSM ἄρχοντιprinceἄρχωνN-DSM τῶνof theT-GPN δαιμονίωνdemonsδαιμόνιονN-GPN 鬼的 + +#### B. 分離用法 (Ablative Genitive) + +##### 12. 隔開的所有格 (Genitive of Separation) + +- 太10:14 ἐκτινάξατεshake offἐκτινάσσωV-AAM-2P τὸνtheT-ASM κονιορτὸνdustκονιορτόςN-ASM τῶνof theT-GPM ποδῶνfeetπούςN-GPM ὑμῶν.of you!σύP-2GP 就把腳上的塵土跺下去。 + + +- 弗2:12 ἀπηλλοτριωμένοιalienated fromἀπαλλοτριόωV-RPP-NPM τῆςtheT-GSF πολιτείαςcommonwealthπολιτείαN-GSF τοῦT-GSM Ἰσραὴλof Israel‚ἸσραήλN-GSM-L 在以色列國民以外 + +##### 12a. 來源的所有格 (Genitive of Source) + +- 林後3:3 ἐστὲyou areεἰμίV-PAI-2P ἐπιστολὴa letterἐπιστολήN-NSF Χριστοῦof Christ‚ΧριστόςN-GSM-T 你們是基督的 + + +- 啟9:11 ἔχουσινThey haveἔχωV-PAI-3P ἐπ᾽overἐπίPREP αὐτῶνthemαὐτόςP-GPF βασιλέαa king‚βασιλεύςN-ASM τὸνtheT-ASM ἄγγελονangelἄγγελοςN-ASM τῆςof theT-GSF ἀβύσσου‚abyss.ἄβυσσοςN-GSF 無底坑的使者作他們的王 + +##### 13. 比較的所有格 (Genitive of Comparison) + +- 太6:25 οὐχὶNotοὐχίPRT-N theT-NSF ψυχὴlifeψυχήN-NSF πλεῖόνmoreπλείων, πλεῖονA-NSN-C ἐστινisεἰμίV-PAI-3S τῆςthan theT-GSF τροφῆςfood‚τροφήN-GSF 生命不勝於飲食麼? + + +- 約14:28 theT-NSM ΠατὴρFatherπατήρN-NSM μείζωνgreater thanμέγαςA-NSM-C μούIἐγώP-1GS ἐστιν.is.εἰμίV-PAI-3S 父是比大的 + +#### C. 動詞用法 (Verbal Genitive [Genitive Related to a Verbal Noun]) + +##### 14. 主詞所有格 (Subjective Genitive) + +- 太24:27 οὕτωςsoοὕτω, οὕτωςADV ἔσταιwill beεἰμίV-FDI-3S theT-NSF παρουσίαcomingπαρουσίαN-NSF τοῦof theT-GSM ΥἱοῦSonυἱόςN-GSM τοῦT-GSM ἀνθρώπου·of Man.ἄνθρωποςN-GSM 人子的降臨,也要這樣 + + +- 羅8:35 ΤίςWhoτίςI-NSM ἡμᾶςusἐγώP-1AP χωρίσειwill separateχωρίζωV-FAI-3S ἀπὸfromἀπόPREP τῆςtheT-GSF ἀγάπηςloveἀγάπηN-GSF τοῦT-GSM Χριστοῦ;of Christ?ΧριστόςN-GSM-T 誰能使我們與基督的愛隔絕呢? + +##### 15. 受詞所有格 (Objective Genitive) + +- 太12:31 T-NSF δὲhoweverδέCONJ τοῦagainstT-GSN Πνεύματος[the] SpiritπνεῦμαN-GSN βλασφημίαblasphemyβλασφημίαN-NSF οὐκnotοὐPRT-N ἀφεθήσεται.will be forgiven.ἀφίημιV-FPI-3S 惟獨褻瀆聖靈,總不得赦免。 + + +- 路11:42 οὐαὶwoeοὐαίINJ ὑμῖνto youσύP-2DP τοῖςT-DPM Φαρισαίοις‚Pharisees‚ΦαρισαῖοςN-DPM-T ὅτιforὅτιCONJ ... παρέρχεσθεyou pass byπαρέρχομαιV-PNI-2P τὴνtheT-ASF κρίσινjusticeκρίσιςN-ASF καὶandκαίCONJ τὴνtheT-ASF ἀγάπηνloveἀγάπηN-ASF τοῦT-GSM Θεοῦ·of God.θεόςN-GSM 你們法利賽人有禍了!因為你們忽略了公義和愛 + +##### 16. 整全所有格 (Plenary Genitive) + +- 林後5:14 TheT-NSF γὰρforγάρCONJ ἀγάπηloveἀγάπηN-NSF τοῦT-GSM Χριστοῦof ChristΧριστόςN-GSM-T συνέχειcompelsσυνέχωV-PAI-3S ἡμᾶς‚us‚ἐγώP-1AP 原來基督的愛激勵我們 + + +- 羅5:5 theT-NSF ἀγάπηloveἀγάπηN-NSF τοῦT-GSM Θεοῦof GodθεόςN-GSM ἐκκέχυταιhas been poured outἐκχέωV-RPI-3S ἐνintoἐνPREP ταῖςtheT-DPF καρδίαιςheartsκαρδίαN-DPF ἡμῶνof usἐγώP-1GP διὰthroughδιάPREP Πνεύματος[the] SpiritπνεῦμαN-GSN ἉγίουHoly‚ἅγιοςA-GSN τοῦthe [One]T-GSN δοθέντοςhaving been givenδίδωμιV-APP-GSN ἡμῖν.to us.ἐγώP-1DP 所賜給我們的聖靈將神的愛澆灌在我們心裡 + +#### D. 副詞用法 (Adverbial Genitive) + +##### 17. 時間 (Genitive of Time) + +- 約3:2 ἦλθενcameἔρχομαιV-2AAI-3S πρὸςtoπρόςPREP αὐτὸνHimαὐτόςP-ASM νυκτὸςby nightνύξN-GSF 這人夜裡來見耶穌 + + +- 帖前2:9 νυκτὸςNightνύξN-GSF καὶandκαίCONJ ἡμέραςdayἡμέραN-GSF ἐργαζόμενοιworking‚ἐργάζομαιV-PNP-NPM 晝夜做工 + +##### 18. 關聯 (Genitive of Association) + +- 太23:30 οὐκnotοὐPRT-N ἂνἄνPRT ἤμεθαwe would have beenεἰμίV-IMI-1P αὐτῶνwith themαὐτόςP-GPM κοινωνοὶpartakersκοινωνόςN-NPM ἐνinἐνPREP τῷtheT-DSN αἵματιbloodαἷμαN-DSN τῶνof theT-GPM προφητῶν.prophets.προφήτηςN-GPM 我們必不和他們同流先知的血 + + +- 羅8:17 εἰIfεἰCONJ δὲnowδέCONJ τέκνα‚children‚τέκνονN-NPN καὶalsoκαίCONJ κληρονόμοι·heirs‚κληρονόμοςN-NPM κληρονόμοιheirsκληρονόμοςN-NPM μὲνindeedμένPRT Θεοῦ‚of God‚θεόςN-GSM συνκληρονόμοιjoint‑heirsσυγκληρονόμοςA-NPM δὲnowδέCONJ Χριστοῦ‚of Christ‚ΧριστόςN-GSM-T 既是兒女,便是後嗣,就是神的後嗣,和基督同作後嗣 + +#### E. 在某些字之後 (After Certain Words) + +##### 19. 在某些動詞之後,作為直接受詞 (as a Direct Object) + +- 可5:41 κρατήσαςhaving takenκρατέωV-AAP-NSM τῆςtheT-GSF χειρὸςhandχείρN-GSF τοῦof theT-GSN παιδίουchild‚παιδίονN-GSN λέγειHe saysλέγωV-PAI-3S αὐτῇ·to her‚αὐτόςP-DSF ΤαλιθὰTalitha‚ταλιθάN-VSF κούμ‚koum!κοῦμιARAM 拉著孩子的,對她說:大利大,古米! + +##### 20. 在某些形容詞、副詞之後 (After Certain Adjectives/Adverbs) + +- 太26:66 ἜνοχοςDeservingἔνοχοςA-NSM θανάτουof deathθάνατοςN-GSM ἐστίν.¶He is.εἰμίV-PAI-3S 他是該 + + +### 間接受格 (Dative) + +#### A. 單純用法 (Pure Dative Uses) + +##### 1. 間接受詞的間接受格 (Dative of Indirect Object) + +- 約4:10 καὶandκαίCONJ ἔδωκενHe would have givenδίδωμιV-AAI-3S ἄνἄνPRT σοιto youσύP-2DS ὕδωρwaterὕδωρ, ὕδατοςN-ASN ζῶν.living.ζάωV-PAP-ASN 他也必早給了活水 + +- 路1:13 theT-NSF γυνήwifeγυνήN-NSF σουof YouσύP-2GS ἘλισάβετElizabethἘλισάβετN-NSF-P γεννήσειwill bearγεννάωV-FAI-3S υἱόνa sonυἱόςN-ASM σοιto you‚σύP-2DS 你的妻子以利沙伯要給你生一個兒子 + +##### 2. 利益的間接受格 (Dative of Interest) + +- 太23:31 μαρτυρεῖτεyou bear witnessμαρτυρέωV-PAI-2P ἑαυτοῖςto yourselvesἑαυτοῦF-2DPM 你們對自己證明 + + +- 林前6:13 ΤὰTheT-NPN βρώματαfoodsβρῶμαN-NPN τῇfor theT-DSF κοιλίᾳbellyκοιλίαN-DSF 食物是為肚腹 + +##### 3. 指涉的、關注的間接受格 (Dative of Reference/Respect) + +- 羅6:2 οἵτινεςWhoὅστις, ἥτιςR-NPM ἀπεθάνομενwe diedἀποθνήσκωV-2AAI-1P τῇT-DSF ἁμαρτίᾳ‚to sin‚ἁμαρτίαN-DSF πῶςhowπωςADV ἔτιstillἔτιADV ζήσομενshall we liveζάωV-FAI-1P ἐνinἐνPREP αὐτῇ;it?αὐτόςP-DSF 我們在罪上死了的人豈可仍在罪中活著呢? + + +- 羅6:11 λογίζεσθεconsiderλογίζομαιV-PNM-2P ἑαυτοὺςyourselvesἑαυτοῦF-2APM εἶναιto beεἰμίV-PAN νεκροὺςdeadνεκρόςA-APM μὲνindeedμένPRT τῇT-DSF ἁμαρτίᾳto sin‚ἁμαρτίαN-DSF ζῶνταςlivingζάωV-PAP-APM δὲhoweverδέCONJ τῷT-DSM Θεῷto GodθεόςN-DSM 你們向罪也當看自己是死的;向神卻當看自己是活的 + +##### 4. 單純同位的間接受格 (Dative of Simple Apposition) + +- 太27:2 παρέδωκανdelivered Him toπαραδίδωμιV-AAI-3P ΠιλάτῳPilate‚ΠιλᾶτοςN-DSM-P τῷtheT-DSM ἡγεμόνι.governor.ἡγεμώνN-DSM 把他交給巡撫彼拉多 + + +- 路1:47 ἠγαλλίασενrejoicesἀγαλλιάωV-AAI-3S τὸtheT-NSN πνεῦμάspiritπνεῦμαN-NSN μουof meἐγώP-1GS ἐπὶinἐπίPREP τῷT-DSM ΘεῷGod‚θεόςN-DSM τῷtheT-DSM ΣωτῆρίSaviorσωτήρN-DSM μου‚of me.ἐγώP-1GS 我靈以神我的救主為樂 + +#### B. 位置用法 (Local Dative Uses) + +##### 5. 表示範圍的間接受格 (Dative of Sphere) + +- 徒16:5 ΑἱTheT-NPF μὲνindeedμένPRT οὖνthereforeοὖνCONJ ἐκκλησίαιchurchesἐκκλησίαN-NPF ἐστερεοῦντοwere strengthenedστερεόωV-IPI-3P τῇin theT-DSF πίστειfaith‚πίστιςN-DSF 於是眾教會信心越發堅固 + + +- 太5:8 ΜακάριοιBlessedμακάριοςA-NPM οἱtheT-NPM καθαροὶpureκαθαρόςA-NPM τῇT-DSF καρδίᾳ‚in heart‚καρδίαN-DSF 的人有福了! + +##### 6. 表示時間的間接受格 (Dative of Time) + +- 太17:23 τῇon theT-DSF τρίτῃthirdτρίτοςA-DSF ἡμέρᾳdayἡμέραN-DSF ἐγερθήσεται.He will be raised up.ἐγείρωV-FPI-3S 第三日他要復活 + + +- 太24:20 προσεύχεσθεPrayπροσεύχομαιV-PNM-2P δὲhoweverδέCONJ ἵναthatἵναCONJ μὴnotμήPRT-N γένηταιmight beγίνομαιV-2ADS-3S theT-NSF φυγὴflightφυγήN-NSF ὑμῶνof youσύP-2GP χειμῶνοςin winter‚χειμώνN-GSM μηδὲnorμηδέCONJ σαββάτῳ.on a Sabbath.σάββατονN-DSN 你們應當祈求,叫你們逃走的時候,不遇見冬天或是安息日 + +#### C. 憑藉用法 (Instrumental Dative Uses) + +##### 7. 關聯的、陪伴的、隨伴的間接受格 (Dative of Association/Accompaniment) + +- 徒9:7 ΟἱT-NPM δὲAndδέCONJ ἄνδρεςthe menἀνήρN-NPM οἱT-NPM συνοδεύοντεςtraveling withσυνοδεύωV-PAP-NPM αὐτῷhimαὐτόςP-DSM 與他同行的人 + + +- 林後6:14 ΜὴNotμήPRT-N γίνεσθεbecomeγίνομαιV-PNM-2P ἑτεροζυγοῦντεςunequally yoked togetherἑτεροζυγέωV-PAP-NPM ἀπίστοις·with unbelievers;ἄπιστοςA-DPM 你們和不信的原不相配,不要同負一軛 + +##### 8. 方式的、副詞的間接受格 (Dative of Manner, Adverbial Dative) + +- 約7:26 παρρησίᾳpubliclyπαρρησίαN-DSF λαλεῖHe speaks‚λαλέωV-PAI-3S 他還明明的講道 + + +- 林前10:30 εἰIfεἰCONJ ἐγὼIἐγώP-1NS χάριτιwith thankfulnessχάριςN-DSF μετέχω‚partake‚μετέχωV-PAI-1S 我若謝恩而吃 + +##### 9. 途徑的、憑藉的間接受格 (Dative of Means/Instrument) + +- 太8:16 ἐξέβαλενHe cast outἐκβάλλωV-2AAI-3S τὰtheT-APN πνεύματαspiritsπνεῦμαN-APN λόγῳby a word‚λόγοςN-DSM 他只用一句話就把鬼都趕出去 + + +- 約11:2 ἐκμάξασαhaving wipedἐκμάσσωV-AAP-NSF τοὺςtheT-APM πόδαςfeetπούςN-APM αὐτοῦof HimαὐτόςP-GSM ταῖςwith theT-DPF θριξὶνhairθρίξN-DPF αὐτῆς‚of her‚αὐτόςP-GSF 用頭髮擦他腳 + +##### 10. 量度的、程度的間接受格 (Dative of Measure/Degree of Difference) + +- 羅5:9 ἔτιstillἔτιADV ἁμαρτωλῶνsinnersἁμαρτωλόςA-GPM ὄντωνbeingεἰμίV-PAP-GPM ἡμῶνof us‚ἐγώP-1GP ΧριστὸςChristΧριστόςN-NSM-T ὑπὲρforὑπέρPREP ἡμῶνusἐγώP-1GP ἀπέθανεν.died.ἀποθνήσκωV-2AAI-3S ΠολλῷMuchπολύςA-DSN οὖνthereforeοὖνCONJ μᾶλλονmore‚μᾶλλονADV δικαιωθέντεςhaving been justifiedδικαιόωV-APP-NPM νῦνnowνῦνADV ἐνbyἐνPREP τῷtheT-DSN αἵματιbloodαἷμαN-DSN αὐτοῦof Him‚αὐτόςP-GSM σωθησόμεθαwe will be savedσῴζωV-FPI-1P δι᾽byδιάPREP αὐτοῦHimαὐτόςP-GSM ἀπὸfromἀπόPREP τῆςtheT-GSF ὀργῆς.wrath!ὀργή N-GSF 基督在我們還作罪人的時候為我們死,現在我們既靠著他的血稱義,就更要藉著他免去神的忿怒。 + + +- 腓2:12 ὑπηκούσατε‚you have obeyed‚ὑπακούωV-AAI-2P ... πολλῷmuchπολύςA-DSN μᾶλλονmoreμᾶλλονADV ἐνinἐνPREP τῇtheT-DSF ἀπουσίᾳabsenceἀπουσίαN-DSF μου‚of me‚ἐγώP-1GS 我不在的時候 ... 你們更是順服 + + +##### 11. 原因的間接受格 (Dative of Cause) + +- 路15:17 ΠόσοιHow manyπόσοςQ-NPM μίσθιοιhired servantsμίσθιοςA-NPM τοῦof theT-GSM πατρόςfatherπατήρN-GSM μουof meἐγώP-1GS περισσεύονταιhave abundanceπερισσεύωV-PMI-3P ἄρτων‚of bread‚ἄρτοςN-GPM ἐγὼIἐγώP-1NS δὲhoweverδέCONJ λιμῷwith hungerλιμόςN-DSF ὧδεhereὧδεADV ἀπόλλυμαι.am perishing?ἀπολλύωV-PMI-1S 我父親有多少的雇工,口糧有餘,我倒在這裡死麼? + + +- 羅4:20 οὐnotοὐPRT-N διεκρίθηhe did waverδιακρίνωV-API-3S τῇT-DSF ἀπιστίᾳthrough unbelief‚ἀπιστίαN-DSF 沒有因不信心裡起疑惑 + +#### D. 在某些字之後 (The Uses of the Dative After Certain Words) + +##### 12. 直接受詞的間接受格 (Dative of Interest) + +- 來1:6 ΚαὶAndκαίCONJ προσκυνησάτωσανlet worshipπροσκυνέωV-AAM-3P αὐτῷHimαὐτόςP-DSM πάντεςallπᾶςA-NPM ἄγγελοι[the] angelsἄγγελοςN-NPM Θεοῦ.¶of God.”θεόςN-GSM 神的使者都要拜 + +##### 13. 在某些名詞之後 (After Certain Nouns) + +- πᾶσαallπᾶςA-NSF theT-NSF πόλιςcityπόλιςN-NSF ἐξῆλθενwent outἐξέρχομαιV-2AAI-3S εἰςtoεἰςPREP ὑπάντησινmeetὑπάντησιςN-ASF τῷT-DSM ἸησοῦJesus.ἸησοῦςN-DSM-P 合城的人都出來迎見耶穌 + +- 林前16:15 διακονίανserviceδιακονίαN-ASF τοῖςto theT-DPM ἁγίοιςsaints‚ἅγιοςA-DPM 服事聖徒 + +##### 14. 在某些形容詞之後 (After Certain Adjectives) + +- 太13:31 ὉμοίαLikeὅμοιοςA-NSF ἐστὶνisεἰμίV-PAI-3S theT-NSF βασιλείαkingdomβασιλείαN-NSF τῶνof theT-GPM οὐρανῶνheavensοὐρανόςN-GPM κόκκῳto a grainκόκκοςN-DSM σινάπεως‚of mustard‚σίναπιN-GSN 天國好像一粒芥菜 + +- 羅1:30 γονεῦσινto parentsγονεύςN-DPM ἀπειθεῖς‚disobedient;ἀπειθήςA-APM 違背父母 + + +### 直接受格 (Accusative) + +#### A. 名詞用法 (Substantival Uses of the Accusative) + +##### 1. 直接受詞的直接受格 (Accusative of Direct Object) + +- 太5:46 ἐὰνIfἐάνCONJ γὰρforγάρCONJ ἀγαπήσητεyou loveἀγαπάωV-AAS-2P τοὺςthoseT-APM ἀγαπῶνταςlovingἀγαπάωV-PAP-APM ὑμᾶς‚you‚σύP-2AP 你們若單愛那愛你們的人 + +- 可2:17 ἦλθονI cameἔρχομαιV-2AAI-1S καλέσαιto callκαλέωV-AAN δικαίους[the] righteous ‚δίκαιοςA-APM ἀλλὰbutἀλλάCONJ ἁμαρτωλούς.¶sinners.ἁμαρτωλόςA-APM 我來本不是召義人,乃是召罪人 + + +##### 2. 雙重直接受格 (Double Accusative) + +###### 2a. 人事物的雙重直接受格 (Double Accusative of the Person and Thing) + +- 約14:26 ἐκεῖνοςHeἐκεῖνοςD-NSM ὑμᾶςyouσύP-2AP διδάξειwill teachδιδάσκωV-FAI-3S πάνταall thingsπᾶςA-APN 他要將一切的事指教你們 + +- 太27:31 ἐξέδυσανthey took offἐκδύωV-AAI-3P αὐτὸνHimαὐτόςP-ASM τὴνtheT-ASF χλαμύδαrobe‚χλαμύςN-ASF καὶandκαίCONJ ἐνέδυσανthey put onἐνδύωV-AAI-3P αὐτὸνHimαὐτόςP-ASM τὰtheT-APN ἱμάτιαgarmentsἱμάτιονN-APN αὐτοῦof HimαὐτόςP-GSM 他們就給脫了袍子,仍給穿上他的衣服 + + +###### 2b. 受詞補語的雙重直接受格 (Double Accusative of the Object-Complement) + +- 太22:43 ΔαυὶδDavidΔαυείδ, Δαυίδ, ΔαβίδN-NSM-P ἐνinἐνPREP ΠνεύματιspiritπνεῦμαN-DSN καλεῖdoes callκαλέωV-PAI-3S αὐτὸνHimαὐτόςP-ASM ΚύριονLord‚κύριοςN-ASM 大衛被聖靈感動,稱 + +- 太4:19 ποιήσωI will makeποιέωV-FAI-1S ὑμᾶςyouσύP-2AP ἁλιεῖςfishersἁλιεύςN-APM ἀνθρώπων.of men.ἄνθρωποςN-GPM 耶穌對他們說:來跟從我,我要叫你們成為得人的漁夫 + + +##### 3. 述詞的的直接受格 (Predicate Accusative) + +- 路4:41 ᾔδεισανthey knewεἴδωV-2LAI-3P τὸνtheT-ASM ΧριστὸνChristΧριστόςN-ASM-T αὐτὸνHimαὐτόςP-ASM εἶναι.¶to be.εἰμίV-PAN 他們知道他是基督 + +- 弗2:1 ὑμᾶςyou‚σύP-2AP ὄνταςbeingεἰμίV-PAP-APM νεκροὺςdeadνεκρόςA-APM τοῖςin theT-DPN παραπτώμασινtrespassesπαράπτωμαN-DPN 你們在過犯之中 + +##### 4. 不定詞主詞的的直接受格 (Accusative Subject of the Infinitive) + +- 太22:3 καὶAndκαίCONJ ἀπέστειλενhe sentἀποστέλλωV-AAI-3S τοὺςtheT-APM δούλουςservantsδοῦλοςN-APM αὐτοῦof himαὐτόςP-GSM καλέσαιto callκαλέωV-AAN τοὺςthoseT-APM κεκλημένουςhaving been invitedκαλέωV-RPP-APM 他打發僕人去,請那些被召的人 + +- 來5:12 χρείανneed ofχρείαN-ASF ἔχετεyou haveἔχωV-PAI-2P τοῦ[one]T-GSN διδάσκεινto teachδιδάσκωV-PAN ὑμᾶςyouσύP-2AP τινὰsomeoneτιςX-ASM 你們還需要有人教導你們 + + +##### 5. 單純同位的直接受格 (Accusative in Simple Apposition) + +- 可1:16 ἈνδρέανAndrew‚ἈνδρέαςN-ASM-P τὸνtheT-ASM ἀδελφὸνbrotherἀδελφόςN-ASM Σίμωνοςof Simon‚ΣίμωνN-GSM-P 西門的兄弟安得烈 + +- 徒16:31 ΠίστευσονBelieveπιστεύωV-AAM-2S ἐπὶonἐπίPREP τὸνtheT-ASM ΚύριονLordκύριοςN-ASM ἸησοῦνJesus‚ἸησοῦςN-ASM-P καὶandκαίCONJ σωθήσῃyou will be saved‚σῴζωV-FPI-2S σὺyouσύP-2NS καὶandκαίCONJ theT-NSM οἶκόςhouseholdοἶκοςN-NSM σου.of you.σύP-2GS 當信主耶穌,你和你一家都必得救 + + +#### B. 副詞用法 (Adverbial Uses of the Accusative) + +##### 6. 副詞的、方式的直接受格 (Adverbial Accusative, Accusative of Manner) + +- 太10:8 δωρεὰνfreelyδωρεάνADV ἐλάβετε‚you received‚λαμβάνωV-2AAI-2P δωρεὰνfreelyδωρεάνADV δότε.give.δίδωμιV-2AAM-2P 你們白白的得來,也要白白的捨去 + +- 太6:33 ζητεῖτεSeekζητέωV-PAM-2P δὲhoweverδέCONJ πρῶτονfirstπρῶτοςA-ASN τὴνtheT-ASF βασιλείανkingdomβασιλείαN-ASF τοῦofT-GSM θεοῦGodθεόςN-GSM 你們要求他的國 + + +##### 7. 度量的、時空的直接受格 (Accusative of Measure, Extent of Time or Space) + +- 路2:44 νομίσαντεςHaving supposedνομίζωV-AAP-NPM δὲnowδέCONJ αὐτὸνHimαὐτόςP-ASM εἶναιto beεἰμίV-PAN ἐνinἐνPREP τῇtheirT-DSF συνοδίᾳcompany‚συνοδίαN-DSF ἦλθονthey wentἔρχομαιV-2AAI-3P ἡμέραςa day’sἡμέραN-GSF ὁδὸνjourney‚ὁδόςN-ASF 以為他在同行的人中間,走了一天的路程 + +- 太20:6 ΤίWhyτίςI-ASN ὧδεhereὧδεADV ἑστήκατεstand youἵστημιV-RAI-2P ὅληνallὅλοςA-ASF τὴνtheT-ASF ἡμέρανdayἡμέραN-ASF ἀργοί;idle?ἀργόςA-NPM 你們為甚麼整天在這裡閒站呢? + + +##### 8. 關注的、一般指涉的直接受格 (Accusative of Respect, General Reference) + +- 太27:57 ἄνθρωποςa manἄνθρωποςN-NSM πλούσιοςrichπλούσιοςA-NSM ἀπὸfromἀπόPREP Ἁριμαθαίας‚Arimathea‚ἈριμαθαίαN-GSF-L τοὔνομαnamedτοὔνομαN-ASN Ἰωσήφ‚Joseph‚ἸωσήφN-NSM-P 有一個財主,名叫約瑟,是亞利馬太來的 + +- 約6:10 ἀνέπεσανReclinedἀναπίπτωV-2AAI-3P οὖνthereforeοὖνCONJ οἱtheT-NPM ἄνδρεςmen‚ἀνήρN-NPM τὸνtheT-ASM ἀριθμὸνnumberἀριθμόςN-ASM ὡςaboutὡςADV πεντακισχίλιοι.five thousand.πεντακισχίλιοιA-NPM 眾人就坐下,數目約有五千 + +
+ +## 冠詞 (The Article) + +#### A. 作為代名詞 (As a Pronoun)⸺部分獨立用法 (Partially Independent Use) + +##### 1. 人稱代名詞 (Personal Pronoun) + +- 約4:32 T-NSM δὲButδέCONJ εἶπενHe saidἔπω, ἐρῶ, εἶπονV-2AAI-3S αὐτοῖς·to them‚αὐτόςP-DPM 耶穌對他們說 + +##### 2. 關係代名詞 (Relative Pronoun) +- 林前1:18 TheT-NSM λόγοςmessageλόγοςN-NSM γὰρforγάρCONJ T-NSM τοῦof theT-GSM σταυροῦcross‚σταυρόςN-GSM 因為十字架的道理 + +- 路7:32 ὅμοιοίLikeὅμοιοςA-NPM εἰσινare theyεἰμίV-PAI-3P παιδίοιςto little childrenπαιδίονN-DPN τοῖςT-DPN ἐνinἐνPREP ἀγορᾷthe marketplaceἀγοράN-DSF καθημένοιςsitting‚κάθημαιV-PNP-DPN 好像孩童坐在街市上 + + +##### 3. 所有代名詞 (Possessive Pronoun) + +- 弗5:25 ΟἱT-VPM ἄνδρες‚Husbands‚ἀνήρN-VPM ἀγαπᾶτεloveἀγαπάωV-PAM-2P τὰςtheT-APF γυναῖκας‚wives‚γυνήN-APF 你們作丈夫的,要愛你們的妻子 + + +#### B. 帶出名詞 (with Substantive)⸺修飾用法 (Modifying Use) + +##### 4. 單純指認 (Simple Identification) + +- 路4:20 ΚαὶAndκαίCONJ πτύξαςhaving rolled upπτύσσωV-AAP-NSM τὸtheT-ASN βιβλίονscroll‚βιβλίονN-ASN ἀποδοὺςhaving delivered [it]ἀποδίδωμιV-2AAP-NSM τῷto theT-DSM ὑπηρέτῃattendant‚ὑπηρέτηςN-DSM ἐκάθισεν·He sat down‚καθίζωV-AAI-3S 於是把捲起來,交還執事,就坐下 + + +##### 5. 回指前面提過的東西 (Anaphoric, Previous Reference) + +- 約4:40-43 ἔμεινενHe stayedμένωV-AAI-3S ἐκεῖthereἐκεῖADV δύοtwoδύοA-APF-NUI ἡμέρας.days.ἡμέραN-APF ... ΜετὰAfterμετάPREP δὲthenδέCONJ τὰςtheT-APF δύοtwoδύοA-APF-NUI ἡμέραςdays‚ἡμέραN-APF 他便在那裡住了兩天 ... 過了兩天 + +- 提後4:2 κήρυξονPreachκηρύσσωV-AAM-2S τὸνtheT-ASM λόγον‚word;λόγοςN-ASM 務要傳道 + + +##### 6. 直指就在眼前的東西 (Deictic/Pointing Article) + +- 太14:15 προσῆλθονcameπροσέρχομαιV-2AAI-3P αὐτῷto HimαὐτόςP-DSM οἱtheT-NPM μαθηταὶdisciples‚μαθητήςN-NPM λέγοντες·saying‚λέγωV-PAP-NPM ἜρημόςDesolateἔρημοςA-NSM ἐστινisεἰμίV-PAI-3S thisT-NSM τόποςplace‚τόποςN-NSM 門徒進前來,說:是野地 + + +##### 7. 出類拔萃 (Par Excellence) + +- 約1:21 TheT-NSM προφήτηςprophetπροφήτηςN-NSM εἶareεἰμίV-PAI-2S σύ;you?σύP-2NS 你是先知嗎? + +##### 8. 獨一、絕無僅有、唯一 (Monadic/One of a Kind/Unique Article) + +- 約1:29 ἼδεBeholdἴδεINJ theT-NSM ἈμνὸςLambἀμνόςN-NSM τοῦT-GSM Θεοῦof God‚θεόςN-GSM T-NSM αἴρωνtaking awayαἴρωV-PAP-NSM τὴνtheT-ASF ἁμαρτίανsinἁμαρτίαN-ASF τοῦof theT-GSM κόσμου.world.κόσμοςN-GSM 看哪,神的羔羊,除去世人罪孽的! + + +##### 9. 熟知、高知名度 (Well-Known/Celebrity Article) + +- 雅1:1 ΤαῖςTo theT-DPF δώδεκαtwelveδώδεκαA-DPF-NUI φυλαῖςtribesφυλήN-DPF ταῖςT-DPF ἐνinἐνPREP τῇtheT-DSF ΔιασπορᾷDispersion:διασποράN-DSF Χαίρειν.¶Greetings.χαίρωV-PAN 請散住十二個支派之人的安 + +##### 10. 抽象 (Abstract) + +- 太7:23 οἱthoseT-VPM ἐργαζόμενοιworkingἐργάζομαιV-PNP-VPM τὴνT-ASF ἀνομίαν.¶lawlessness.ἀνομίαN-ASF 這些作惡的人 + +- 約4:22 T-NSF σωτηρίαsalvationσωτηρίαN-NSF ἐκofἐκPREP τῶνtheT-GPM ἸουδαίωνJewsἸουδαῖοςA-GPM-PG ἐστίν.is.εἰμίV-PAI-3S 救恩是從猶太人出來的 + +##### 11. 通性化、表示類別的 (Genetic/Categorical Article) + +- 太18:17 ἔστωlet him beεἰμίV-PAM-3S σοιto youσύP-2DS ὥσπερasὥσπερCONJ theT-NSM ἐθνικὸςpaganἐθνικόςA-NSM καὶandκαίCONJ theT-NSM τελώνης.tax collector.τελώνηςN-NSM 就看他像外邦人和稅吏一樣 + +#### C. 使某字成為名詞 (As a Substantiver) + +- 太8:28 ΚαὶAndκαίCONJ ἐλθόντοςhaving comeἔρχομαιV-2AAP-GSM αὐτοῦHeαὐτόςP-GSM εἰςtoεἰςPREP τὸtheT-ASN πέρανother side‚πέρανADV 耶穌既渡到邊去 + +- 太5:5 ΜακάριοιBlessedμακάριοςA-NPM οἱtheT-NPM πραεῖς‚meek‚πραΰςA-NPM ὍτιforὅτιCONJ αὐτοὶtheyαὐτόςP-NPM κληρονομήσουσινwill inheritκληρονομέωV-FAI-3P τὴνtheT-ASF γῆν.earth.γῆN-ASF 溫柔的有福了!因為他們必承受地土。 + +- 路7:19 ΣὺYouσύP-2NS εἶareεἰμίV-PAI-2S theT-NSM ἐρχόμενοςcoming [One]‚ἔρχομαιV-PNP-NSM 將要來的是你麼? + +- 可10:40 τὸT-ASN δὲbutδέCONJ καθίσαιto sitκαθίζωV-AAN ἐκatἐκPREP δεξιῶν[the] right handδεξιόςA-GPN μουof MeἐγώP-1GS orCONJ ἐξatἐκPREP εὐωνύμων[the] left hand‚εὐώνυμοςA-GPN οὐκnotοὐPRT-N ἔστινisεἰμίV-PAI-3S ἐμὸνMineἐμόςS-1SNSN δοῦναι‚to give‚δίδωμιV-2AAN 只是坐在我的左右,不是我可以賜的 + +- 太10:3 ἸάκωβοςJamesἸάκωβοςN-NSM-P the [son]T-NSM τοῦT-GSM Ἁλφαίουof Alphaeus‚ἈλφαῖοςN-GSM-P 亞勒腓的兒子雅各 + +- 徒11:2 οἱthoseT-NPM ἐκofἐκPREP περιτομῆς[the] circumcision‚περιτομήN-GSF 那些奉割禮的 + +- 林前14:16 πῶςhowπωςADV ἐρεῖwill he sayἔπω, ἐρῶ, εἶπονV-FAI-3S τὸtheT-ASN ἈμήνAmenἀμήνHEB 怎能說阿們呢? + +#### D. 標示某種功能 (As a Function Marker) + +##### 12. 標示形容詞的位置 (to Denote Adjectival Positions) + +- 可8:38 ὅτανwhenὅτανCONJ ἔλθῃHe shall comeἔρχομαιV-2AAS-3S ἐνinἐνPREP τῇtheT-DSF δόξῃgloryδόξαN-DSF τοῦof theT-GSM ΠατρὸςFatherπατήρN-GSM αὐτοῦof Him‚αὐτόςP-GSM μετὰwithμετάPREP τῶνtheT-GPM ἀγγέλωνangelsἄγγελοςN-GPM τῶνT-GPM ἁγίων.¶holy.ἅγιοςA-GPM 人子在他父的榮耀裡,同聖天使降臨的時候 + +##### 13. 與所有代名詞連用 (with Possessive Pronouns) + +- 可1:41 ἐκτείναςhaving stretched outἐκτείνωV-AAP-NSM τὴνtheT-ASF χεῖραhandχείρN-ASF αὐτοῦof Him‚αὐτόςP-GSM 耶穌就伸手 + +##### 14. 用於所有格片語 (in Genitive Phrases) + +- 可1:15 ἤγγικενhas drawn nearἐγγίζωV-RAI-3S theT-NSF βασιλείαkingdomβασιλείαN-NSF τοῦT-GSM Θεοῦ·of God;θεόςN-GSM 神的國近了 + +##### 15. 與無格變式的名詞連用 (with Indeclinable Nouns) + +- 路1:68 ΕὐλογητὸςBlessed beεὐλογητόςA-NSM Κύριος[the] LordκύριοςN-NSM theT-NSM ΘεὸςGodθεόςN-NSM τοῦT-GSM Ἰσραήλ‚of Israel‚ἸσραήλN-GSM-L 主─以色列的神是應當稱頌的! + +##### 16. 與分詞連用 (with Participles) + +- 路6:21 ΜακάριοιBlessed [are]μακάριοςA-NPM οἱthoseT-NPM κλαίοντεςweepingκλαίωV-PAP-NPM νῦν‚now‚νῦνADV 你們哀哭的人有福了! + +##### 17. 與指示詞連用 (with Demonstratives) + +- 太16:18 ἐπὶonἐπίPREP ταύτῃthisοὗτοςD-DSF τῇtheT-DSF πέτρᾳrockπέτραN-DSF οἰκοδομήσωI will buildοἰκοδομέωV-FAI-1S μουMyἐγώP-1GS τὴνT-ASF ἐκκλησίανchurch‚ἐκκλησίαN-ASF 我要把我的教會建造在這磐石上 + +##### 18. 與主格名詞連用 (with Nominative Nouns) + +- 路11:7 theT-NSF θύραdoorθύραN-NSF κέκλεισταιhas been shut‚κλείωV-RPI-3S 門已經關閉 + +##### 19. 區別主詞 vs. 述詞主格 (Subject vs. Predicate Nominative),區別受詞 vs. 補語 (Object vs. Complement) + +- 太12:8 κύριοςLordκύριοςN-NSM γάρforγάρCONJ ἐστινisεἰμίV-PAI-3S τοῦof theT-GSN σαββάτουSabbathσάββατονN-GSN theT-NSM ΥἱὸςSonυἱόςN-NSM τοῦofT-GSM ἀνθρώπου.¶Man.ἄνθρωποςN-GSM 因為人子是安息日的主。 + +#### E. 無冠詞 (Absence of the Article) + +##### 20. 非特定 (Indefinite) + +- 約4:7 ἜρχεταιComesἔρχομαιV-PNI-3S γυνὴa womanγυνήN-NSF ἐκout ofἐκPREP τῆςT-GSF ΣαμαρείαςSamariaΣαμάρειαN-GSF-L 有一個撒瑪利亞的婦人來 + +##### 21. 定性 (Qualitative) + +- 約壹4:8 T-NSM ΘεὸςGodθεόςN-NSM ἀγάπηloveἀγάπηN-NSF ἐστίν.is.εἰμίV-PAI-3S 神就是 + + +##### 22. 特定 (Definite) + +- 路5:8 ΣίμωνSimonΣίμωνN-NSM-P ΠέτροςPeterΠέτροςN-NSM-P προσέπεσενfell atπροσπίπτωV-2AAI-3S τοῖςtheT-DPN γόνασινkneesγόνυN-DPN Ἰησοῦof Jesus‚ἸησοῦςN-GSM-P 西門彼得就俯伏在耶穌膝前 + + +
+ +## 語態 (Voice) + +#### A. 主動語態 (Active Voice) + +##### 1. 簡單主動 (Simple Active) + +- 可4:2 ἐδίδασκενHe began teachingδιδάσκωV-IAI-3S αὐτοὺςthemαὐτόςP-APM ἐνinἐνPREP παραβολαῖςparablesπαραβολήN-DPF πολλάmany things‚πολύςA-APN 耶穌就用比喻教訓他們 + +##### 2. 使役主動 (Causative/Ergative Active) + +- 太5:45 τὸνtheT-ASM ἥλιονsunἥλιοςN-ASM αὐτοῦof HimαὐτόςP-GSM ἀνατέλλειHe makes riseἀνατέλλωV-PAI-3S ἐπὶonἐπίPREP πονηροὺςevilπονηρόςA-APM καὶandκαίCONJ ἀγαθοὺςgood‚ἀγαθόςA-APM καὶandκαίCONJ βρέχειHe sends rainβρέχωV-PAI-3S ἐπὶonἐπίPREP δικαίουςrighteousδίκαιοςA-APM καὶandκαίCONJ ἀδίκους.unrighteous.ἄδικοςA-APM 日頭好人,也照歹人;降雨給義人,也給不義的人 + +##### 3. 狀態主動 (Stative Active) + +- 路16:23 ὑπάρχωνbeingὑπάρχωV-PAP-NSM ἐνinἐνPREP βασάνοις‚torment‚βάσανοςN-DPF 痛苦 + +- 約1:1 ἘνIn [the]ἐνPREP ἀρχῇbeginningἀρχήN-DSF ἦνwasεἰμίV-IAI-3S theT-NSM Λόγος‚Word‚λόγοςN-NSM 太初 + +##### 4. 反身主動 (Reflexive Active) + +- 可15:30 σῶσονsaveσῴζωV-AAM-2S σεαυτὸνYourself‚σεαυτοῦF-2ASM 可以自己 + +- 提前4:7 γύμναζεTrainγυμνάζωV-PAM-2S δὲratherδέCONJ σεαυτὸνyourselfσεαυτοῦF-2ASM πρὸςtoπρόςPREP εὐσέβειαν·godliness.εὐσέβειαN-ASF 在敬虔上操練自己 + + +#### B. 關身語態 (Middle Voice) + +##### 1. 直接的、反身的、直接反身的關身 (Direct/Reflexive/Direct Reflexive Middle) + +- 太27:5 ἀπήγξατο.hanged himself.ἀπάγχωV-AMI-3S 猶大吊死 + + +##### 2. 間接的、間接反身的、受惠的、加強的、動態的關身 (Indirect/Indirect Reflexive/Benefactive/Intensive/Dynamic Middle) + +- 徒5:2 καὶandκαίCONJ ἐνοσφίσατοhe kept backνοσφίζωV-AMI-3S ἀπὸfromἀπόPREP τῆςtheT-GSF τιμῆς‚proceeds‚τιμήN-GSF 把價銀私自留下幾分 + +- 太27:24 T-NSM ΠιλᾶτοςPilateΠιλᾶτοςN-NSM-P ... ἀπενίψατοhe washedἀπονίπτωV-AMI-3S τὰςtheT-APF χεῖραςhandsχείρN-APF ... λέγων·saying‚λέγωV-PAP-NSM ἈθῷόςGuiltlessἀθῷοςA-NSM εἰμιI amεἰμίV-PAI-1S ἀπὸofἀπόPREP τοῦtheT-GSN αἵματοςbloodαἷμαN-GSN τούτου·of this.οὗτοςD-GSM 彼拉多手,說:罪不在我 + +##### 3. 使役的關身 (Causative Middle) + +- 路11:38 T-NSM δὲAndδέCONJ Φαρισαῖοςthe Pharisee‚ΦαρισαῖοςN-NSM-T ἰδὼνhaving seen [it]‚εἴδωV-2AAP-NSM ἐθαύμασενmarveledθαυμάζωV-AAI-3S ὅτιthatὅτιCONJ οὐnotοὐPRT-N πρῶτονfirstπρῶτοςA-ASN ἐβαπτίσθηHe washedβαπτίζωV-API-3S πρὸbeforeπρόPREP τοῦtheT-GSN ἀρίστου.dinner.ἄριστονN-GSN 這法利賽人看見耶穌飯前不手便詫異。 + +##### 4. 允許的關身 (Permissive Middle) + +- 路2:4 ἈνέβηWent upἀναβαίνωV-2AAI-3S δὲthenδέCONJ καὶalsoκαίCONJ ἸωσὴφJoseph‚ἸωσήφN-NSM-P ἀπὸfromἀπόPREP τῆςT-GSF ΓαλιλαίαςGalileeΓαλιλαίαN-GSF-L ... 路2:5 ἀπογράψασθαιto registerἀπογράφωV-AMN σὺνwithσύνPREP ΜαριὰμMary‚ΜαρίαN-DSF-P 約瑟也從加利利上去 ... 要和他所聘之妻馬利亞一同報名上冊 + +- 徒22:16 ἀναστὰςHaving arisen‚ἀνίστημιV-2AAP-NSM βάπτισαιbe baptizedβαπτίζωV-AMM-2S καὶandκαίCONJ ἀπόλουσαιwash awayἀπολούωV-AMM-2S τὰςtheT-APF ἁμαρτίαςsinsἁμαρτίαN-APF σουof you‚σύP-2GS 起來,受洗洗去你的罪。 + +##### 5. 關身形主動意 (Deponent Middle) + +#### C. 被動語態 (Passive Voice) + +##### 1. 簡單被動 (Simple Passive) + +- 可4:6 ὅτεafterὅτεCONJ ἀνέτειλενroseἀνατέλλωV-AAI-3S theT-NSM ἥλιοςsun‚ἥλιοςN-NSM ἐκαυματίσθηit was scorched‚καυματίζωV-API-3S 日頭出來一曬就枯乾了 + +- 徒1:5 ὑμεῖςyouσύP-2NP δὲhoweverδέCONJ ἐνwithἐνPREP Πνεύματι[the] SpiritπνεῦμαN-DSN βαπτισθήσεσθεwill be baptizedβαπτίζωV-FPI-2P ἉγίῳHoly‚ἅγιοςA-DSN 你們要聖靈的 + + +##### 2. 被動形主動意 (Deponent Passive) + + +
+ +## 語氣 (Mood) + +#### A. 直說語氣 (Indicative Mood) + + +##### 1. 宣告 (Declarative Indicative) + +- 可4:3 ἐξῆλθενwent outἐξέρχομαιV-2AAI-3S the [one]T-NSM σπείρωνsowingσπείρωV-PAP-NSM σπεῖραι.to sow.σπείρωV-AAN 有一個撒種的出去撒種。 + + +- 約1:1 ἘνIn [the]ἐνPREP ἀρχῇbeginningἀρχήN-DSF ἦνwasεἰμίV-IAI-3S theT-NSM Λόγος‚Word‚λόγοςN-NSM 太初 + + +##### 2. 疑問 (Interrogative Indicative) + +- 太27:11 ΣὺYouσύP-2NS εἶareεἰμίV-PAI-2S theT-NSM ΒασιλεὺςKingβασιλεύςN-NSM τῶνof theT-GPM Ἰουδαίων;Jews?ἸουδαῖοςA-GPM-PG 猶太人的王麼? + +- 約1:38 λέγειHe saysλέγωV-PAI-3S αὐτοῖς·to them‚αὐτόςP-DPM ΤίWhatτίςI-ASN ζητεῖτε;seek you?ζητέωV-PAI-2P ΟἱT-NPM δὲAndδέCONJ εἶπανthey saidἔπω, ἐρῶ, εἶπονV-2AAI-3P αὐτῷ·to Him‚αὐτόςP-DSM Ῥαββί‚RabbiῥαββίHEB-T ... ΠοῦwhereποῦADV-I μένεις;are You staying?μένωV-PAI-2S 耶穌問他們說:「你們要甚麼?」他們說:「拉比,在那裡?」 + +##### 3. 條件 (Conditional Indicative) + +- 太12:27 εἰifεἰCONJ ἐγὼIἐγώP-1NS ἐνbyἐνPREP ΒεελζεβοὺλBeelzebulΒεελζεβούλN-DSM-T ἐκβάλλωcast outἐκβάλλωV-PAI-1S τὰT-APN δαιμόνια‚demons‚δαιμόνιονN-APN οἱtheT-NPM υἱοὶsonsυἱόςN-NPM ὑμῶνof youσύP-2GP ἐνbyἐνPREP τίνιwhomτίςI-DSM ἐκβάλλουσιν;do they cast out?ἐκβάλλωV-PAI-3P 我若靠著別西卜鬼,你們的子弟趕鬼又靠著誰呢? + +- 約5:46 εἰIfεἰCONJ γὰρforγάρCONJ ἐπιστεύετεyou were believingπιστεύωV-IAI-2P Μωϋσεῖ‚Moses‚Μωϋσῆς, ΜωσῆςN-DSM-P ἐπιστεύετεyou would have believedπιστεύωV-IAI-2P ἂνἄνPRT ἐμοί·Me;ἐγώP-1DS 你們如果摩西,也必信我 + + +##### 4. 潛在 (Potential Indicative) + +- 路11:42 ταῦταThese thingsοὗτοςD-APN δὲalsoδέCONJ ἔδειit behooved [you]δεῖV-IAI-3S ποιῆσαιto do‚ποιέωV-AAN 這原是你們當行的 + +- 林前11:7 ἈνὴρA manἀνήρN-NSM μὲνtrulyμένPRT γὰρforγάρCONJ οὐκnotοὐPRT-N ὀφείλειoughtὀφείλωV-PAI-3S κατακαλύπτεσθαιto coverκατακαλύπτωV-PMN τὴνtheT-ASF κεφαλήνhead‚κεφαλήN-ASF 男人本不蒙著頭 + +##### 5. 勸慰、命令、意願 (Cohortative/Command/Volitive Indicative) + +- 太19:18 ΟὐNotοὐPRT-N φονεύσεις‚shall you murder‚φονεύωV-FAI-2S ΟὐnotοὐPRT-N μοιχεύσεις‚shall you commit adultery‚μοιχεύωV-FAI-2S ΟὐnotοὐPRT-N κλέψεις‚shall you steal‚κλέπτωV-FAI-2S ΟὐnotοὐPRT-N ψευδομαρτυρήσεις‚shall you bear false witness‚ψευδομαρτυρέωV-FAI-2S 不可殺人;不可姦淫;不可偷盜;不可作假見證 + + +#### B. 假設語氣 (Subjunctive Mood) + + +##### 1. 勸告、意願 (Hortatory/Volitive Subjunctive) + +- 可4:35 ΚαὶAndκαίCONJ λέγειHe saysλέγωV-PAI-3S αὐτοῖςto themαὐτόςP-DPM ... ΔιέλθωμενLet us pass overδιέρχομαιV-2AAS-1P εἰςtoεἰςPREP τὸtheT-ASN πέραν.other side.πέρανADV 耶穌對門徒說:我們渡到那邊去罷 + + +##### 2. 考慮、懷疑 (Deliberative/Dubitative Subjunctive) + +- 太6:31 ΜὴNotμήPRT-N οὖνthereforeοὖνCONJ μεριμνήσητεbe anxious‚μεριμνάωV-AAS-2P λέγοντες·saying‚λέγωV-PAP-NPM ΤίWhatτίςI-ASN φάγωμεν;shall we eat?φαγεῖνV-AAS-1P ἤ·OrCONJ ΤίwhatτίςI-ASN πίωμεν;shall we drink?πίνωV-2AAS-1P ἤ·OrCONJ ΤίwhatτίςI-ASN περιβαλώμεθα;shall we wear?περιβάλλωV-2AMS-1P 不要憂慮說:甚麼?甚麼?穿甚麼? + + +- 可8:37 τίWhatτίςI-ASN γὰρforγάρCONJ δοῖshall giveδίδωμιV-2AAS-3S ἄνθρωποςa manἄνθρωποςN-NSM ἀντάλλαγμα[as] an exchangeἀντάλλαγμαN-ASN τῆςfor theT-GSF ψυχῆςsoulψυχήN-GSF αὐτοῦ;of him?αὐτόςP-GSM 人還能甚麼換生命呢? + + +##### 3. 強烈否定 (Emphatic Negation Subjunctive) + +- 太24:35 οἱT-NPM δὲbutδέCONJ λόγοιthe wordsλόγοςN-NPM μουof MeἐγώP-1GS οὐnoοὐPRT-N μὴnotμήPRT-N παρέλθωσιν.¶shall pass away.παρέρχομαιV-2AAS-3P 我的話卻不能廢去 + +- 約10:28 δίδωμιgiveδίδωμιV-PAI-1S αὐτοῖςthemαὐτόςP-DPN ζωὴνlifeζωήN-ASF αἰώνιονeternal;αἰώνιοςA-ASF καὶandκαίCONJ οὐneverοὐPRT-N μὴnotμήPRT-N ἀπόλωνταιshall they perish‚ἀπολλύωV-2AMS-3P εἰςtoεἰςPREP τὸνtheT-ASM αἰῶναage‚αἰώνN-ASM 我又賜給他們永生;他們永不滅亡 + + +##### 4. 禁止 (Prohibitive Subjunctive) + +- 太1:20 μὴnotμήPRT-N φοβηθῇςyou should fearφοβέωV-AOS-2S παραλαβεῖνto receiveπαραλαμβάνωV-2AAN ΜαρίανMaryΜαρίαN-ASF-P τὴν[as] theT-ASF γυναῖκάwifeγυνήN-ASF σου·of you;σύP-2GS 不要怕!只管娶過你的妻子馬利亞來 + + +##### 5. 條件句裡的假設語氣 (Subjunctive in Conditional Sentences) + +- 太4:9 ΤαῦτάThese thingsοὗτοςD-APN σοιto YouσύP-2DS πάνταallπᾶςA-APN δώσω‚will I give‚δίδωμιV-FAI-1S ἐὰνifἐάνCONJ πεσὼνfalling down‚πίπτωV-2AAP-NSM προσκυνήσῃςYou will worshipπροσκυνέωV-AAS-2S μοι.me.ἐγώP-1DS 你若俯伏我,我就把這一切都賜給你。 + +- 可5:28 ἔλεγενShe was sayingλέγωV-IAI-3S γὰρforγάρCONJ ὅτι‑‚ὅτιCONJ ἘὰνIfἐάνCONJ ἅψωμαιI shall touchἅπτωV-AMS-1S κἂνevenκἄνADV τῶνtheT-GPN ἱματίωνgarmentsἱμάτιονN-GPN αὐτοῦof Him‚αὐτόςP-GSM σωθήσομαι.I will be healed.σῴζωV-FPI-1S 意思說:我只他的衣裳,就必痊癒 + + +##### 6. ἵνα+假設語氣 + +###### 6a. 目的 (Purpose) + +- 太12:10 ἐπηρώτησανthey askedἐπερωτάωV-AAI-3P αὐτὸνHim‚αὐτόςP-ASM λέγοντες·saying‚λέγωV-PAP-NPM ΕἰIsεἰPRT ἔξεστινit lawfulἔξεστι, ἐξόνV-PAI-3S τοῖςon theT-DPN σάββασινSabbathsσάββατονN-DPN θεραπεῦσαι;to heal?θεραπεύωV-AAN ἵναso thatἵναCONJ κατηγορήσωσινthey might accuseκατηγορέωV-AAS-3P αὐτοῦ.Him.αὐτόςP-GSM 那裡有一個人枯乾了一隻手。有人問耶穌說:安息日治病可以不可以?意思是要控告他。 + + +###### 6b. 結果 (Result) + +- 約9:2 Ῥαββί‚Rabbi‚ῥαββίHEB-T τίςwhoτίςI-NSM ἥμαρτεν‚sinned‚ἁμαρτάνωV-2AAI-3S οὗτοςthis [man]οὗτοςD-NSM orCONJ οἱtheT-NPM γονεῖςparentsγονεύςN-NPM αὐτοῦ‚of him‚αὐτόςP-GSM ἵναthatἵναCONJ τυφλὸςblindτυφλόςA-NSM γεννηθῇ;he should be born?γεννάωV-APS-3S 拉比,這人生來是瞎眼的,是誰犯了罪? + + +###### 6c. 當作實名詞 (Substantival) + +- 太18:6 συμφέρειit is betterσυμφέρωV-PAI-3S αὐτῷfor himαὐτόςP-DSM ἵναthatἵναCONJ κρεμασθῇshould be hungκρεμάωV-APS-3S μύλοςa millstoneμύλοςN-NSM ὀνικὸςheavyὀνικόςA-NSM περὶaroundπερίPREP τὸνtheT-ASM τράχηλονneckτράχηλοςN-ASM αὐτοῦof him‚αὐτόςP-GSM 倒不如把大磨石拴在這人的頸項上 + + +###### 6d. 附加說明 (Epexegetical) + +- 路7:6 οὐnotοὐPRT-N γὰρforγάρCONJ ἱκανόςworthyἱκανόςA-NSM εἰμιI amεἰμίV-PAI-1S ἵναthatἵναCONJ ὑπὸunderὑπόPREP τὴνtheT-ASF στέγηνroofστέγηN-ASF μουof meἐγώP-1GS εἰσέλθῃς·You should come;εἰσέρχομαιV-2AAS-2S 因你我舍下,我不敢當 + + +###### 63. 補語 (Complementary) + +- 太26:4 συνεβουλεύσαντοthey plotted together‚συμβουλεύωV-AMI-3P ἵναin order thatἵναCONJ τὸνT-ASM ἸησοῦνJesusἸησοῦςN-ASM-P δόλῳby guileδόλοςN-DSM κρατήσωσινthey might seizeκρατέωV-AAS-3P καὶandκαίCONJ ἀποκτείνωσιν·kill.ἀποκτείνωV-AAS-3P 大家商議要用詭計拿住耶穌, + + +##### 7. 與表示害怕 ... 等的動詞連用 (Subjunctive with Verbs of Fearing etc.) + +- 路21:8 ΒλέπετεTake heed‚βλέπωV-PAM-2P μὴlestμήPRT-N πλανηθῆτε·you be led astray;πλανάωV-APS-2P 你們要謹慎,不要受迷惑 + +- 林前8:9 ΒλέπετεBe carefulβλέπωV-PAM-2P δὲhowever‚δέCONJ μήlestμήPRT-N πωςsomehowπωςADV theT-NSF ἐξουσίαrightἐξουσίαN-NSF ὑμῶνof youσύP-2GP αὕτηthisοὗτοςD-NSF πρόσκομμαan occasion of stumblingπρόσκομμαN-NSN γένηταιbecomesγίνομαιV-2ADS-3S τοῖςto thoseT-DPM ἀσθενέσιν.being weak.ἀσθενήςA-DPM 只是你們要謹慎,恐怕你們這自由竟成了那軟弱人的絆腳石。 + + +##### 8. 間接問句裡的假設語氣 (Subjunctive in Indirect Questions) + +- 太15:32 ἤδηalreadyἤδηADV ἡμέραιdaysἡμέραN-NPF τρεῖςthreeτρεῖς, τρίαA-NPF προσμένουσίνthey continueπροσμένωV-PAI-3P μοιwith Me‚ἐγώP-1DS καὶandκαίCONJ οὐκnothingοὐPRT-N ἔχουσινhaveἔχωV-PAI-3P τίthatτίςI-ASN φάγωσιν·they might eat;φαγεῖνV-AAS-3P 他們同我在這裡已經三天,也沒有吃的 + +- 路9:58 T-NSM δὲbutδέCONJ Υἱὸςthe SonυἱόςN-NSM τοῦT-GSM ἀνθρώπουof ManἄνθρωποςN-GSM οὐκnotοὐPRT-N ἔχειhasἔχωV-PAI-3S ποῦwhereποῦADV-I τὴνtheT-ASF κεφαλὴνheadκεφαλήN-ASF κλίνῃ.He might lay.κλίνωV-PAS-3S 只是人子沒有頭的地方 + + +##### 8. 不定關係子句裡的假設語氣 (Subjunctive in Indefinite Relative Clause) + +- 可3:29 ὃςWhoeverὅς, ἥR-NSM δ᾽howeverδέCONJ ἂνἄνPRT βλασφημήσῃshall blasphemeβλασφημέωV-AAS-3S εἰςagainstεἰςPREP τὸtheT-ASN ΠνεῦμαSpiritπνεῦμαN-ASN τὸT-ASN Ἅγιον‚HolyἅγιοςA-ASN οὐκnotοὐPRT-N ἔχειhasἔχωV-PAI-3S ἄφεσινforgivenessἄφεσιςN-ASF εἰςtoεἰςPREP τὸνtheT-ASM αἰῶνα‚age‚αἰώνN-ASM 褻瀆聖靈的,卻永不得赦免 + +- 約4:14 ὃςwhoeverὅς, ἥR-NSM δ᾽howeverδέCONJ ἂνἄνPRT πίῃmay drinkπίνωV-2AAS-3S ἐκofἐκPREP τοῦtheT-GSN ὕδατοςwaterὕδωρ, ὕδατοςN-GSN οὗthatὅς, ἥR-GSN ἐγὼIἐγώP-1NS δώσωwill giveδίδωμιV-FAI-1S αὐτῷ‚him‚αὐτόςP-DSM οὐneverοὐPRT-N μὴnotμήPRT-N διψήσειwill thirst‚διψάωV-FAI-3S εἰςtoεἰςPREP τὸνtheT-ASM αἰῶνα‚age.αἰώνN-ASM 人若我所賜的水就永遠不渴 + + +##### 8. 不定時間子句裡的假設語氣 (Subjunctive in Indefinite Temporal Clause) + +- 太5:26 οὐnoοὐPRT-N μὴnotμήPRT-N ἐξέλθῃςshall you come outἐξέρχομαιV-2AAS-2S ἐκεῖθεν‚from there‚ἐκεῖθενADV ἕωςuntilἕωςCONJ ἂνἄνPRT ἀποδῷςyou should payἀποδίδωμιV-2AAS-2S τὸνtheT-ASM ἔσχατονlastἔσχατοςA-ASM κοδράντην.¶kodranten!κοδράντηςN-ASM 若有一文錢沒有還清,你斷不能從那裡出來 + +- 約13:38 οὐnoοὐPRT-N μὴnotμήPRT-N ἀλέκτωρ[the] roosterἀλέκτωρN-NSM φωνήσῃwill crow‚φωνέωV-AAS-3S ἕωςuntilἕωςPREP οὗthatὅς, ἥR-GSM ἀρνήσῃyou will denyἀρνέομαιV-FDI-2S μεMeἐγώP-1AS τρίς.¶three times.τρίςADV 雞叫以先,你要三次不我。 + + +#### C. 期望語氣 (Optative Mood) + +##### 1. 意願的、意欲的、可達到之願望的期望語氣 (Voluntative/Volitative Optative, Optative of Obtainable Wish) + +- 羅3:3 εἰifεἰCONJ ἠπίστησάνdisbelievedἀπιστέωV-AAI-3P τινες‚some?τιςX-NPM μὴNotμήPRT theT-NSF ἀπιστίαunbeliefἀπιστίαN-NSF αὐτῶνof them‚αὐτόςP-GPM τὴνtheT-ASF πίστινfaithfulnessπίστιςN-ASF τοῦT-GSM Θεοῦof GodθεόςN-GSM καταργήσει;will nullify?καταργέωV-FAI-3S 羅3:4 μὴNeverμήPRT-N γένοιτο·may it be!γίνομαιV-2ADO-3S γινέσθωLet beγίνομαιV-PNM-3S δὲhoweverδέCONJ T-NSM ΘεὸςGodθεόςN-NSM ἀληθής‚true‚ἀληθήςA-NSM πᾶςeveryπᾶςA-NSM δὲnowδέCONJ ἄνθρωποςmanἄνθρωποςN-NSM ψεύστης‚a liar‚ψεύστηςN-NSM 即便有不信的,這有何妨呢?難道他們的不信就廢掉神的信麼?斷乎不能!不如說,神是真實的,人都是虛謊的。 + +##### 2. 潛在的期望語氣 (Potential Optative) + +- 路1:62 ἐνένευονThey were making signsἐννεύωV-IAI-3P δὲthenδέCONJ τῷto theT-DSM πατρὶfatherπατήρN-DSM αὐτοῦof him‚αὐτόςP-GSM τὸtheT-ASN τίwhatτίςI-ASN ἂνἄνPRT θέλοιhe might wishθέλωV-PAO-3S καλεῖσθαιto be calledκαλέωV-PPN αὐτό.him.αὐτόςP-ASN 他們就向他父親打手式,問他叫這孩子甚麼名字。 + +- 徒17:18 τινεςsomeτιςX-NPM ἔλεγον·were saying‚λέγωV-IAI-3P ΤίWhatτίςI-ASN ἂνἄνPRT θέλοιmay desireθέλωV-PAO-3S of theT-NSM σπερμολόγοςbabblerσπερμολόγοςA-NSM οὗτοςthisοὗτοςD-NSM λέγειν;to say?λέγωV-PAN 有的說:這胡言亂語的說甚麼? + + +#### D. 命令語氣 (Imperative Mood) + +##### 1. 命令 (Command) + +- 可2:14 ἈκολούθειFollowἀκολουθέωV-PAM-2S μοι.Me.ἐγώP-1DS 跟從我來。 + +- 可6:37 ΔότεGiveδίδωμιV-2AAM-2P αὐτοῖςto themαὐτόςP-DPM ὑμεῖςyouσύP-2NP φαγεῖν.[something] to eat.φαγεῖνV-AAN 你們他們吃罷。 + + +##### 2. 禁止 (Prohibition) + +- 太6:3 μὴnotμήPRT-N γνώτωlet knowγινώσκωV-2AAM-3S theT-NSF ἀριστεράleft [hand]ἀριστερόςA-NSF σουof youσύP-2GS τίwhatτίςI-ASN ποιεῖis doingποιέωV-PAI-3S theT-NSF δεξιάright handδεξιόςA-NSF σου‚of you‚σύP-2GS 不要叫左手知道右手所做的 + + +##### 3. 請求、請願、客氣的命令 (Request, Entreaty, Polite Command) + +- 太6:10 ἘλθέτωComeἔρχομαιV-2AAM-3S theT-NSF βασιλείαkingdomβασιλείαN-NSF σου·of You;σύP-2GS Γενηθήτωbe doneγίνομαιV-AOM-3S τὸtheT-NSN θέλημάwillθέλημαN-NSN σου‚of You‚σύP-2GS ...太6:11 ΤὸνTheT-ASM ἄρτονbreadἄρτοςN-ASM ἡμῶνof usἐγώP-1GP τὸνT-ASM ἐπιούσιονdailyἐπιούσιοςA-ASM δὸςgrantδίδωμιV-2AAM-2S ἡμῖνusἐγώP-1DP σήμερον·today.σήμερονADV 願你的國降臨;願你的旨意在地上...我們日用的飲食,今日賜給我們。 + +- 路11:1 Κύριε‚Lord‚κύριοςN-VSM δίδαξονteachδιδάσκωV-AAM-2S ἡμᾶςusἐγώP-1AP προσεύχεσθαι‚to pray‚προσεύχομαιV-PNN 求主教導我們禱告 + + +##### 4. 允許、容忍 (Permissive Imperative, Imperative of Toleration) + +- 太8:31 ΕἰIfεἰCONJ ἐκβάλλειςYou cast outἐκβάλλωV-PAI-2S ἡμᾶς‚us‚ἐγώP-1AP ἀπόστειλονsend awayἀποστέλλωV-AAM-2S ἡμᾶςusἐγώP-1AP εἰςintoεἰςPREP τὴνtheT-ASF ἀγέληνherdἀγέληN-ASF τῶνT-GPM χοίρων.of pigs.χοῖροςN-GPM 太8:32 ΚαὶAndκαίCONJ εἶπενHe saidἔπω, ἐρῶ, εἶπονV-2AAI-3S αὐτοῖς·to them‚αὐτόςP-DPM Ὑπάγετε.Go.ὑπάγωV-PAM-2P 若把我們趕出去,就打發我們進入豬群罷! 耶穌說:去罷! + +- 林前7:15 ΕἰIfεἰCONJ δὲhoweverδέCONJ theT-NSM ἄπιστοςunbelieverἄπιστοςA-NSM χωρίζεται‚separates himself‚χωρίζωV-PPI-3S χωριζέσθω·let him separate himself;χωρίζωV-PPM-3S 倘若那不信的人要離去,就由他離去罷! + +##### 5. 問候 (As a Stereotyped Greeting) + +- 路1:28 Χαῖρε‚Greetings‚χαίρωV-PAM-2S κεχαριτωμένη‚[you] favored with grace!χαριτόωV-RPP-VSF TheT-NSM ΚύριοςLord [is]κύριοςN-NSM μετὰwithμετάPREP σοῦ.you.”σύP-2GS 我問你安,主和你同在了! + +- 約19:3 ΧαῖρεHail‚χαίρωV-PAM-2S T-VSM ΒασιλεὺςKingβασιλεύςN-VSM τῶνof theT-GPM Ἰουδαίων·Jews!ἸουδαῖοςA-GPM-PG 恭喜,猶太人的王阿! + + +
+ +## 時態 (Tense) + +### 現在式時態形式 (Present Tense-Form) + +#### A. 短期的現在式 (Narrow-Band Presents) + +##### 1. 即時的、不定過去的、點狀的現在式 (Instantaneous/Aoristic/Punctiliar Present) + +- 可2:5
T-NSM ἸησοῦςJesusἸησοῦςN-NSM-P ...λέγειHe saysλέγωV-PAI-3S τῷto theT-DSM παραλυτικῷ·paralytic‚παραλυτικόςA-DSM Τέκνον‚Son‚τέκνονN-VSN ἀφίενταίare forgivenἀφίημιV-PPI-3P σουof youσύP-2GS αἱtheT-NPF ἁμαρτίαι.sins.ἁμαρτίαN-NPF 耶穌...說:小子,你的罪赦了 + +##### 2. 進行的、描述的現在式 (Progressive/Descriptive Present) + +- 太25:8 αἱtheT-NPF λαμπάδεςlampsλαμπάςN-NPF ἡμῶνof usἐγώP-1GP σβέννυνται.are going out.σβέννυμιV-PPI-3P 我們的燈要滅了 + + +#### B. 長期 (Broad-Band Presents) + +##### 3. 從過去延伸至今的、仍在進行的現在式 (Extending-from-Past Present, Present of Past Action Still in Progress) + +- 路15:29 τοσαῦταso manyτοσοῦτοςD-APN ἔτηyearsἔτοςN-APN δουλεύωI serveδουλεύωV-PAI-1S σοιyou‚σύP-2DS 他對父親說:我服事你這多年 + + +##### 4. 重複的現在式 (Iterative Present) + +- 太7:7 ΑἰτεῖτεAskαἰτέωV-PAM-2P... ζητεῖτεseekζητέωV-PAM-2P ... κρούετεknockκρούωV-PAM-2P 你們祈求...尋找...叩門 + + +##### 5. 習慣的、慣常的、一般的現在式 (Customary/Habitual/General Present) + +- 路18:12 νηστεύωI fastνηστεύωV-PAI-1S δὶςtwiceδίςADV τοῦin theT-GSN σαββάτου‚week;σάββατονN-GSN 我一個禮拜禁食兩次 + + +##### 6. 格言的現在式 (Gnomic Present) + +- 林後9:7 ἱλαρὸνa cheerfulἱλαρόςA-ASM γὰρforγάρCONJ δότηνgiverδότηςN-ASM ἀγαπᾷlovesἀγαπάωV-PAI-3S T-NSM Θεός.God.θεόςN-NSM 因為捐得樂意的人是神所喜愛的 + + +#### C. 特殊用法的現在式 (Special Uses of the Presents) + +##### 7. 歷史的、生動的現在式 (Historical/Dramatic Present) + +- 太26:40 ΚαὶAndκαίCONJ ἔρχεταιHe comesἔρχομαιV-PNI-3S πρὸςtoπρόςPREP τοὺςtheT-APM μαθητὰςdisciplesμαθητήςN-APM καὶandκαίCONJ εὑρίσκειfindsεὑρίσκωV-PAI-3S αὐτοὺςthemαὐτόςP-APM καθεύδοντας‚sleeping.καθεύδωV-PAP-APM καὶAndκαίCONJ λέγειHe saysλέγωV-PAI-3S 來到門徒那裡,他們睡著了,就... + + +##### 8. 未來的現在式 (Futuristic Present) + +###### 8a. 完全的未來 (Completely Future) + +- 約4:25 ΜεσσίαςMessiahΜεσσίαςN-NSM-T ἔρχεταιis coming‚ἔρχομαιV-PNI-3S 彌賽亞要來 + + +###### 8b. 大部分的未來 (Mostly Future) + +- 可10:33 ἀναβαίνομενwe go upἀναβαίνωV-PAI-1P εἰςtoεἰςPREP Ἱεροσόλυμα‚Jerusalem‚ἹεροσόλυμαN-APN-L 我們上耶路撒冷去 + + +##### 9. 在間述句裡 (Present Retained in Indirect Discourse) + +- 約5:13 The [one]T-NSM δὲnowδέCONJ ἰαθεὶςhaving been healedἰάομαιV-APP-NSM οὐκnotοὐPRT-N ᾔδειknewεἴδωV-2LAI-3S τίςwhoτίςI-NSM ἐστιν‚it is‚εἰμίV-PAI-3S 那醫好的人不知道 + +### 不完成式時態形式 (Imperfect Tense-Form) + +#### A. 短期的不完成式 (Narrow-Band Imperfects) + +##### 1. 進行的、描述的不完成式 (Progressive/Descriptive Imperfect) + +- 可9:31 ἐδίδασκενHe was teachingδιδάσκωV-IAI-3S γὰρforγάρCONJ τοὺςtheT-APM μαθητὰςdisciplesμαθητήςN-APM αὐτοῦof Him‚αὐτόςP-GSM καὶandκαίCONJ ἔλεγενHe was sayingλέγωV-IAI-3S αὐτοῖςto themαὐτόςP-DPM 於是教訓門徒, + + +##### 2. 起始的、表始的、發端的不完成式 (Ingressive/Inchoative/Inceptive Present) + +- 太5:2 καὶAndκαίCONJ ἀνοίξαςopeningἀνοίγωV-AAP-NSM τὸtheT-ASN στόμαmouthστόμαN-ASN αὐτοῦof Him‚αὐτόςP-GSM ἐδίδασκενHe was teachingδιδάσκωV-IAI-3S αὐτοὺςthem‚αὐτόςP-APM 他就開口教訓他們 + + +#### B. 長期的不完成式 (Broad-Band Imperfects) + +##### 3. 重複的不完成式 (Iterative Imperfect) + +- 約19:3 ἔλεγον·saying‚λέγωV-IAI-3P ΧαῖρεHail‚χαίρωV-PAM-2S :恭喜 + +##### 4. 習慣的、慣常的、一般的不完成式 (Customary/Habitual/General Imperfect) + +- 路2:41 ΚαὶAndκαίCONJ ἐπορεύοντοwere goingπορεύωV-INI-3P οἱtheT-NPM γονεῖςparentsγονεύςN-NPM αὐτοῦof HimαὐτόςP-GSM κατ᾽everyκατάPREP ἔτοςyearἔτοςN-ASN εἰςtoεἰςPREP ἸερουσαλὴμJerusalemἹερουσαλήμN-ASF-L 每年他父母都上耶路撒冷去 + +#### C. 特殊用法的不完成式 (Special Uses of the Imperfects) + +##### 5. 嘗試的、意願的、瀕臨的不完成式 (Conative/Voluntative/Tendential Imperfect) + +- 太3:14 T-NSM δὲButδέCONJ ἸωάννηςJohnἸωάννηςN-NSM-P διεκώλυενwas hinderingδιακωλύωV-IAI-3S αὐτὸνHim‚αὐτόςP-ASM 約翰想要攔住 + + +##### 6. 在間述句裡面 (Imperfect Retained in Indirect Discourse) + +- 約2:22 ἐμνήσθησανrememberedμιμνήσκωV-API-3P οἱtheT-NPM μαθηταὶdisciplesμαθητήςN-NPM αὐτοῦof HimαὐτόςP-GSM ὅτιthatὅτιCONJ τοῦτοthisοὗτοςD-ASN ἔλεγεν‚He had said‚λέγωV-IAI-3S 門徒就想起他說過這話 + + +### 未來式時態形式 (Future Tesne-Form) + +##### 1. 預測的未來式 (Predictive Future) + +- 徒1:11 T-NSM ἸησοῦςJesus‚ἸησοῦςN-NSM-P T-NSM ... ἐλεύσεταιwill comeἔρχομαιV-FDI-3S 這...耶穌要來 + +##### 2. 命令的未來式 (Imperatival Future) + +- 太22:37 ἈγαπήσειςYou shall loveἀγαπάωV-FAI-2S κύριον[the] LordκύριοςN-ASM τὸνtheT-ASM ΘεόνGodθεόςN-ASM σουof youσύP-2GS 你要愛主─你的神 + + +##### 3. 考慮的未來式 (Deliberative Future) + +- 羅6:2 πῶςhowπωςADV ἔτιstillἔτιADV ζήσομενshall we liveζάωV-FAI-1P ἐνinἐνPREP αὐτῇ;it?αὐτόςP-DSF 我們...豈可仍在罪中活著呢? + +##### 4. 格言的未來式 (Gnomic Future) + +- 羅5:7 μόλιςRarelyμόλιςADV γὰρindeedγάρCONJ ὑπὲρforὑπέρPREP δικαίουa righteous [man]δίκαιοςA-GSM τιςanyoneτιςX-NSM ἀποθανεῖται·will die;ἀποθνήσκωV-FDI-3S 為義人,是少有的 + + +### 不定過去式時態形式 (Aorist Tense-Form) + +##### 1. 敘事的、涵蓋的、點狀的、全面的、全地的不定過去式 (Constative/Complexive/Punctiliar/Comprehensive/Global Aorist) + +- 啟20:4 ἐβασίλευσανreignedβασιλεύωV-AAI-3P μετὰwithμετάPREP τοῦT-GSM χριστοῦChristΧριστόςN-GSM-T χίλιαa thousandχίλιοιA-APN ἔτη.years.ἔτοςN-APN 他們與基督一同作王一千年 + + +##### 2. 起始的、表始得、發端的不定過去式 (Ingressive/Inceptive/Inchoative Aorist) + +- 太22:7 T-NSM δὲAndδέCONJ βασιλεὺςthe kingβασιλεύςN-NSM ὠργίσθηwas angry‚ὀργίζωV-API-3S 王就大怒 + + +##### 3. 完成的、累積的、結果的、效果的不定過去式 (Consummative/Culminative/Ecbatic/Effective Aorist) + +- 約1:42 ἤγαγενHe ledἄγωV-2AAI-3S αὐτὸνhimαὐτόςP-ASM πρὸςtoπρόςPREP τὸνT-ASM Ἰησοῦν.Jesus.ἸησοῦςN-ASM-P 於是他去見耶穌 + + +##### 4. 格言的不定過去式 (Gnomic Aorist) + +- 彼前1:24 ἐξηράνθηWithersξηραίνωV-API-3S theT-NSM χόρτοςgrass‚χόρτοςN-NSM καὶandκαίCONJ τὸtheT-NSN ἄνθοςflowerἄνθοςN-NSN ἐξέπεσεν·falls away‚ἐκπίπτωV-2AAI-3S 草必枯乾,花必凋謝 + + +##### 5. 書信的不定過去式 (Epistolary Aorist) + +- 腓2:28 ἔπεμψαI have sentπέμπωV-AAI-1S αὐτὸν‚him‚αὐτόςP-ASM 打發他去 + + +##### 6. 預期的、未來的不定過去式 (Proleptic/Futuristic Aorist) + +- 羅8:30 οὓςwhomὅς, ἥR-APM δὲthenδέCONJ ἐδικαίωσεν‚He justified‚δικαιόωV-AAI-3S τούτουςtheseοὗτοςD-APM καὶalsoκαίCONJ ἐδόξασεν.¶He glorified.δοξάζωV-AAI-3S 所稱為義的人又叫他們得榮耀 + + +##### 7. 剛過的、生動的不定過去式 (Immediate Past/Dramatic Aorist) + +- 太26:65 ἴδεBeholdἴδεINJ νῦνnow‚νῦνADV ἠκούσατεyou have heardἀκούωV-AAI-2P τὴνtheT-ASF βλασφημίαν·blasphemy.βλασφημίαN-ASF 看哪!這僭妄的話,現在你們都聽見了 + + +### 現在完成式、過去完成式時態形式 (Perfect and Plluperfect Tense-Form) + +#### A. 現在完成式時態形式 (Perfect Tense-Form) + +##### 1. 加強的、結果的現在完成式 (Intensive/Resultative Perfect) + +- 可6:14 ἸωάννηςJohn‚ἸωάννηςN-NSM-P the [one]T-NSM Βαπτίζωνbaptizing‚βαπτίζωV-PAP-NSM ἐγήγερταιis risenἐγείρωV-RPI-3S ἐκout fromἐκPREP νεκρῶν[the] dead‚νεκρόςA-GPM 施洗的約翰從死裡復活了 + + +##### 2. 廣泛的、完成的現在完成式 (Extensive/Consummative Perfect) + +- 約1:34 ἑώρακαhave seenὁράωV-RAI-1S καὶandκαίCONJ μεμαρτύρηκαhave borne witnessμαρτυρέωV-RAI-1S ὅτιthatὅτιCONJ οὗτόςthisοὗτοςD-NSM ἐστινisεἰμίV-PAI-3S theT-NSM ΥἱὸςSonυἱόςN-NSM τοῦT-GSM Θεοῦ.¶of God.θεόςN-GSM 看見了,就證明這是神的兒子 + + +##### 3. 具有現在涵義的現在完成式 (Perfect with a Present Force) + +- 約1:26 μέσοςbut in [the] midstμέσοςA-NSM ὑμῶνof youσύP-2GP ἕστηκενstands [One]ἵστημιV-RAI-3S ὃνwhomὅς, ἥR-ASM ὑμεῖςyouσύP-2NP οὐκnotοὐPRT-N οἴδατε‚know‚εἴδωV-RAI-2P 有一位是你們不認識在你們中間 + + +#### B. 過去完成式時態形式 (Pluperfect Tense-Form) + +##### 1. 加強的、結果的過去完成式 (Intensive/Resultative Pluperfect) + +- 路4:29 ἤγαγονledἄγωV-2AAI-3P αὐτὸνHimαὐτόςP-ASM ἕωςuntoἕωςPREP ὀφρύοςbrowὀφρῦςN-GSF τοῦof theT-GSN ὄρουςhillὄροςN-GSN ἐφ᾽uponἐπίPREP οὗwhichὅς, ἥR-GSN theT-NSF πόλιςtownπόλιςN-NSF ᾠκοδόμητοhad been builtοἰκοδομέωV-LPI-3S αὐτῶνof them‚αὐτόςP-GPM 他們帶他到山崖,他們的城造在山上 + + +##### 2. 廣泛的、完成的過去完成式 (Extensive/Consummative Pluperfect) + +- 約4:8 οἱT-NPM γὰρForγάρCONJ μαθηταὶthe disciplesμαθητήςN-NPM αὐτοῦof HimαὐτόςP-GSM ἀπεληλύθεισανhad gone awayἀπέρχομαιV-2LAI-3P εἰςintoεἰςPREP τὴνtheT-ASF πόλινcity‚πόλιςN-ASF 那時門徒進城去了 + + +
+ +## 不定詞 (Infinitive) + +#### A. 副詞用法 (Adverbial Uses) + +##### 1. 目的 (Purpose) + +- 太5:17 ΜὴNotμήPRT-N νομίσητεthinkνομίζωV-AAS-2P ὅτιthatὅτιCONJ ἦλθονI have comeἔρχομαιV-2AAI-1S καταλῦσαιto abolishκαταλύωV-AAN τὸνtheT-ASM νόμονlawνόμοςN-ASM 莫想我來要廢掉律法 + + +##### 2. 結果 (Result) + +- 路5:7 ἔπλησανfilledπλήθωV-AAI-3P ἀμφότεραbothἀμφότεροςA-APN τὰtheT-APN πλοῖαboatsπλοῖονN-APN ὥστεso thatὥστεCONJ βυθίζεσθαιwere sinkingβυθίζωV-PPN αὐτά.they.αὐτόςP-APN 他們裝滿了兩隻船,以致船要沉下去 + + +##### 3. 時間 (Time) + +###### 3a. 先發生的 (Antecedent time) + +- 太26:32 ΜετὰAfterμετάPREP δὲhoweverδέCONJ τὸT-ASN ἐγερθῆναίbeing raised‚ἐγείρωV-APN μεIἐγώP-1AS προάξωwill go beforeπροάγωV-FAI-1S ὑμᾶςyouσύP-2AP εἰςintoεἰςPREP τὴνT-ASF Γαλιλαίαν.Galilee.ΓαλιλαίαN-ASF-L 但我復活以後,要在你們以先往加利利去。 + + +###### 3b. 同時發生的 (Contemporaneous time) + +- 太13:4 καὶAndκαίCONJ ἐνinἐνPREP τῷT-DSN σπείρεινsowingσπείρωV-PAN αὐτὸνof him‚αὐτόςP-ASM someὅς, ἥR-NPN μὲνindeedμένPRT ἔπεσενfellπίπτωV-2AAI-3S παρὰalongπαράPREP τὴνtheT-ASF ὁδόν‚road‚ὁδόςN-ASF 撒的時候,有落在路旁的 + + +###### 3a. 後發生的 (Subsequent time) + +- 約1:48 ΠρὸBeforeπρόPREP τοῦT-GSN σεyouσύP-2AS ΦίλιππονPhilipΦίλιπποςN-ASM-P φωνῆσαιcalling‚φωνέωV-AAN ὄνταbeingεἰμίV-PAP-ASM ὑπὸunderὑπόPREP τὴνtheT-ASF συκῆνfig tree‚συκῆN-ASF εἶδόνI sawεἴδωV-2AAI-1S σε.you.σύP-2AS 腓力還沒有招呼你,你在無花果樹底下,我就看見你了 + +##### 4. 原因 (Cause) + +- 約2:24 ἸησοῦςJesusἸησοῦςN-NSM-P οὐκnotοὐPRT-N ἐπίστευενdid entrustπιστεύωV-IAI-3S αὑτὸνHimselfαὐτόςP-ASM αὐτοῖςto them‚αὐτόςP-DPM διὰbecause ofδιάPREP τὸT-ASN αὐτὸνHisαὐτόςP-ASM γινώσκεινknowingγινώσκωV-PAN πάνταςall [men]‚πᾶςA-APM 耶穌卻不將自己交託他們;因為他知道萬人, + +##### 5. 途徑 (Means) + +- 徒3:26 T-NSM ΘεὸςGodθεόςN-NSM ... αὐτὸνHim‚αὐτόςP-ASM εὐλογοῦνταblessingεὐλογέωV-PAP-ASM ὑμᾶςyouσύP-2AP ἐνinἐνPREP τῷT-DSN ἀποστρέφεινturning awayἀποστρέφωV-PAN ἕκαστονeachἕκαστοςA-ASM ἀπὸfromἀπόPREP τῶνtheT-GPF πονηριῶνwickednessesπονηρίαN-GPF ὑμῶν.¶of you.σύP-2GP 神差他到你們這裡來,藉著你們各人回轉,離開罪惡,賜福給你們 + + +##### 6. 補語的 (Complementary) + +- 腓1:12 ΓινώσκεινTo knowγινώσκωV-PAN δὲnowδέCONJ ὑμᾶςyou‚σύP-2AP βούλομαι‚I want‚βούλομαιV-PNI-1S ἀδελφοί‚brothers‚ἀδελφόςN-VPM ὅτιthatὅτιCONJ τὰthe thingsT-NPN κατ᾽concerningκατάPREP ἐμὲme‚ἐγώP-1AS ...弟兄們,我願意你們知道,我所遭遇的事... + +- 可2:19 ὅσονAs long asὅσοςK-ASM χρόνονtimeχρόνοςN-ASM ἔχουσινthey haveἔχωV-PAI-3P τὸνtheT-ASM νυμφίονbridegroomνυμφίοςN-ASM μετ᾽withμετάPREP αὐτῶνthem‚αὐτόςP-GPM οὐnotοὐPRT-N δύνανταιthey are ableδύναμαιV-PNI-3P νηστεύειν.to fast.νηστεύωV-PAN 新郎還同在,他們不能禁食 + +#### B. 名詞用法 (Substantival Uses) + +##### 7. 主詞 (Subject) + +- 腓1:21 ἘμοὶTo meἐγώP-1DS γὰρforγάρCONJ τὸT-NSN ζῆνto liveζάωV-PAN Χριστὸς[is] Christ‚ΧριστόςN-NSM-T καὶandκαίCONJ τὸT-NSN ἀποθανεῖνto dieἀποθνήσκωV-2AAN κέρδος.[is] gain.κέρδοςN-NSN 因我活著就是基督,我死了就有益處。 + + +##### 8. 直接受詞 (Direct Object) + +- 林後8:11 νυνὶNowνυνίADV δὲthenδέCONJ καὶalsoκαίCONJ τὸtheT-ASN ποιῆσαιdoingποιέωV-AAN ἐπιτελέσατε‚complete;ἐπιτελέωV-AAM-2P 如今就當辦成這事 + + +##### 9. 間述句 (Indirect Discourse) + +- 可12:18 ΣαδδουκαῖοιSadduceesΣαδδουκαῖοςN-NPM-T ...οἵτινεςwhoὅστις, ἥτιςR-NPM λέγουσινsayλέγωV-PAI-3P ἀνάστασινa resurrectionἀνάστασιςN-ASF μὴnotμήPRT-N εἶναι‚there is‚εἰμίV-PAN 撒都該人常說沒復活的事 + +- 弗4:21 ἐνinἐνPREP αὐτῷHimαὐτόςP-DSM ἐδιδάχθητε‚have been taught‚διδάσκωV-API-2P ... 弗4:22 ἀποθέσθαιAre to have put offἀποτίθημιV-2AMN ὑμᾶςyou‚σύP-2AP ...τὸνtheT-ASM παλαιὸνoldπαλαιόςA-ASM ἄνθρωπονman‚ἄνθρωποςN-ASM 你們領了他的教...就要脫去...舊人 + +##### 8. 同位句型 (Appositional) + +- 雅1:27 θρησκείαReligionθρησκείαN-NSF καθαρὰpureκαθαρόςA-NSF ...αὕτηthisοὗτοςD-NSF ἐστίν‚is‚εἰμίV-PAI-3S ἐπισκέπτεσθαιto visitἐπισκέπτομαιV-PNN ὀρφανοὺςorphansὀρφανόςA-APM καὶandκαίCONJ χήραςwidowsχήραA-APF 這是...清潔沒有玷污的虔誠,就是看顧孤兒寡婦 + +##### 8. 附加說明 (Epexgetical) + +- 約4:32 T-NSM δὲButδέCONJ εἶπενHe saidἔπω, ἐρῶ, εἶπονV-2AAI-3S αὐτοῖς·to them‚αὐτόςP-DPM ἘγὼIἐγώP-1NS βρῶσινfoodβρῶσιςN-ASF ἔχωhaveἔχωV-PAI-1S φαγεῖνto eatφαγεῖνV-AAN ἣνthatὅς, ἥR-ASF ὑμεῖςyouσύP-2NP οὐκnotοὐPRT-N οἴδατε.know.εἴδωV-RAI-2P 我有食物,是你們不知道的 + + + +
+ +## 分詞 (Participle) + +#### A. 形容用法 (Adjectival Participles) + +##### 1. 正式的形容用法 (Adjectival Proper)、附屬用法 (Dependent) + +- 約4:11 τὸtheT-ASN ὕδωρwaterὕδωρ, ὕδατοςN-ASN τὸT-ASN ζῶν;living?ζάωV-PAP-ASN + +- 來4:12 ΖῶνLiving [is]ζάωV-PAP-NSM γὰρforγάρCONJ theT-NSM λόγοςwordλόγοςN-NSM τοῦT-GSM Θεοῦof God‚θεόςN-GSM 神的道是活潑的 + + +##### 2. 名詞、獨立用法 (Substantival/Independent) + +- 提前6:15 theT-NSM ΒασιλεὺςKingβασιλεύςN-NSM τῶνof thoseT-GPM βασιλευόντωνbeing kings‚βασιλεύωV-PAP-GPM καὶandκαίCONJ Κύριος[the] LordκύριοςN-NSM τῶνof thoseT-GPM κυριευόντων‚being lords‚κυριεύωV-PAP-GPM 萬王之王、萬主之主 + + +#### B. 與動詞有關的用法 (Verbal Participles) + +##### 3. 表示情境的副詞用法 (Adverbial/Circumstantial) + +###### 3a. 時間 (Temporal) + +- 太4:2 νηστεύσαςhaving fastedνηστεύωV-AAP-NSM ἡμέραςdaysἡμέραN-APF τεσσεράκονταfortyτεσσαράκονταA-APF-NUI καὶandκαίCONJ νύκταςnights‚νύξN-APF τεσσεράκοντα‚fortyτεσσαράκονταA-APF-NUI ὕστερονafterwardὕστεροςA-ASN-C ἐπείνασεν.He was hungry.πεινάωV-AAI-3S 禁食四十晝夜,後來就餓了。 + +- 腓1:3 ΕὐχαριστῶI thankεὐχαριστέωV-PAI-1S ...腓1:4 ... τὴνtheT-ASF δέησινsupplicationδέησιςN-ASF ποιούμενος‚makingποιέωV-PMP-NSM 我感謝...當我祈求的時候 + +###### 3b. 方式 (Manner) + +- 太19:22 ἀπῆλθενhe went awayἀπέρχομαιV-2AAI-3S λυπούμενος·grieving;λυπέωV-PPP-NSM 憂憂愁愁的走了 + +###### 3c. 途徑 (Means) + +- 太27:4 ἭμαρτονI sinned‚ἁμαρτάνωV-2AAI-1S παραδοὺςhaving betrayedπαραδίδωμιV-2AAP-NSM αἷμαbloodαἷμαN-ASN ἀθῷον.innocent.ἀθῷοςA-ASN 賣了無辜之人的血是有罪了 + +###### 3d. 原因 (Cause) + +- 太1:19 ἸωσὴφJosephἸωσήφN-NSM-P ... δίκαιοςrighteousδίκαιοςA-NSM ὢνbeing‚εἰμίV-PAP-NSM 約瑟因為是個義人 + + +###### 3e. 條件 (Condition) + +- 加6:9 θερίσομενwe will reap a harvestθερίζωV-FAI-1P μὴnotμήPRT-N ἐκλυόμενοι.giving up.ἐκλύωV-PPP-NPM 若不灰心就要收成。 + +###### 3f. 讓步 (Concession) + +- 弗2:1 ΚαὶAndκαίCONJ ὑμᾶςyou‚σύP-2AP ὄνταςbeingεἰμίV-PAP-APM νεκροὺςdeadνεκρόςA-APM 你們雖然是死的 + + +###### 3g. 目的 (Purpose) + +- 太27:49 εἰwhetherεἰPRT ἔρχεταιcomesἔρχομαιV-PNI-3S ἨλίαςElijahἩλίαςN-NSM-P σώσωνto saveσῴζωV-FAP-NSM αὐτόν.Him.αὐτόςP-ASM 看以利亞來他不來 + + +###### 3h. 結果 (Result) + +- 弗2:15 ἵναso thatἵναCONJ τοὺςtheT-APM δύοtwoδύοA-APM-NUI κτίσῃHe might createκτίζωV-AAS-3S ἐνinἐνPREP αὑτῷHimselfἑαυτοῦF-3DSM εἰςintoεἰςPREP ἕναoneεἷςA-ASM καινὸνnewκαινόςA-ASM ἄνθρωπονman‚ἄνθρωποςN-ASM ποιῶνmakingποιέωV-PAP-NSM εἰρήνηνpeace;εἰρήνηN-ASF 而為要將兩下藉著自己造成一個新人,如此便成就了和睦 + + +##### 4. 附帶狀況 (Attendant Circumstance) + +- 太9:13 πορευθέντεςHaving goneπορεύωV-AOP-NPM δὲhowever‚δέCONJ μάθετεlearnμανθάνωV-2AAM-2P τίwhatτίςI-NSN ἐστιν·is‚εἰμίV-PAI-3S 你們且揣摩這是什麼意思 + + +##### 5. 迂說 (Periphrastic) + +- 西1:6 καθὼςjust asκαθώςCONJ καὶalsoκαίCONJ ἐνinἐνPREP παντὶallπᾶςA-DSM τῷtheT-DSM κόσμῳworldκόσμοςN-DSM ἐστὶνit isεἰμίV-PAI-3S καρποφορούμενονbearing fruitκαρποφορέωV-PMP-NSN 正如在普天之下,它是結果子 + +- 可10:32 ἮσανThey wereεἰμίV-IAI-3P...ἀναβαίνοντεςgoing upἀναβαίνωV-PAP-NPM ... καὶandκαίCONJ ἦνwasεἰμίV-IAI-3S προάγωνgoing on beforeπροάγωV-PAP-NSM αὐτοὺςthemαὐτόςP-APM T-NSM Ἰησοῦς‚Jesus‚ἸησοῦςN-NSM-P 他們行路...耶穌在前頭走 + +- 可13:25 ΚαὶandκαίCONJ οἱtheT-NPM ἀστέρεςstarsἀστήρN-NPM ἔσονταιwill beεἰμίV-FDI-3P ... πίπτοντες‚falling‚πίπτωV-PAP-NPM 眾星要從天上墜落 + +- 林後4:3 ΕἰIfεἰCONJ δὲhoweverδέCONJ καὶindeedκαίCONJ ἔστινisεἰμίV-PAI-3S κεκαλυμμένονconcealedκαλύπτωV-RPP-NSN τὸtheT-NSN εὐαγγέλιονgospelεὐαγγέλιονN-NSN ἡμῶν‚of us‚ἐγώP-1GP 如果我們的福音是被蒙蔽 + +- 徒21:29 ἦσανIt was theyεἰμίV-IAI-3P γὰρforγάρCONJ προεωρακότεςhaving previously seenπροοράωV-RAP-NPM ΤρόφιμονTrophimusΤρόφιμοςN-ASM-P 因他們曾看見特羅非摩 + + +##### 6. 冗贅、贅語 (Redundant/Pleonastic) + +- 路12:17 καὶAndκαίCONJ διελογίζετοhe was reasoningδιαλογίζομαιV-INI-3S ἐνwithinἐνPREP ἑαυτῷhimself‚ἑαυτοῦF-3DSM λέγων·saying‚λέγωV-PAP-NSM 自己心裡思想 + + +##### 7. 獨立的動詞用法,用作命令語氣 (Independent Verbal Participle as an Imperative) + +- 羅12:9 ἀποστυγοῦντεςabhorringἀποστυγέωV-PAP-NPM τὸT-ASN πονηρόν‚evil‚πονηρόςA-ASN κολλώμενοιcleaving toκολλάωV-PPP-NPM τῷT-DSN ἀγαθῷ‚good‚ἀγαθόςA-DSN 要厭惡,善要親近 + + +##### 8. 獨立所有格 (Genitive Absolute) + +- 太9:18 ΤαῦταThese thingsοὗτοςD-APN αὐτοῦof HimαὐτόςP-GSM λαλοῦντοςspeakingλαλέωV-PAP-GSM ...ἄρχωνa rulerἄρχωνN-NSM εἷςcertainεἷςA-NSM ἐλθὼνhaving come‚ἔρχομαιV-2AAP-NSM προσεκύνειwas kneeling downπροσκυνέωV-IAI-3S αὐτῷto Him‚αὐτόςP-DSM 耶穌說這話的時候,有一個管會堂的來拜他 + +- 羅7:3 ζῶντοςbeing aliveζάωV-PAP-GSM τοῦtheT-GSM ἀνδρὸςhusband‚ἀνήρN-GSM ... γένηταιshe isγίνομαιV-2ADS-3S ἀνδρὶto manἀνήρN-DSM ἑτέρῳ·another;ἕτεροςA-DSM 當丈夫活著...她若歸於別人 + +- 約5:13 ἸησοῦςJesusἸησοῦςN-NSM-P ἐξένευσενhad moved away‚ἐκνεύωV-AAI-3S ὄχλουa crowdὄχλοςN-GSM ὄντοςbeingεἰμίV-PAP-GSM ἐνinἐνPREP τῷtheT-DSM τόπῳ.place.τόποςN-DSM 那裡有群眾的時候,耶穌已經躲開了 \ No newline at end of file diff --git a/Porter-IGNT/IGNT-00.md b/Porter-IGNT/IGNT-00.md new file mode 100644 index 0000000..1236b11 --- /dev/null +++ b/Porter-IGNT/IGNT-00.md @@ -0,0 +1,32 @@ +# 前言 (Introduction) +- 書名 Idioms of the Greek New Testament 中的 idiom 取自 C. F. D. Moule 的書 An Idiom Book fot NT Greek,意思不是「成語」或「慣用語」,而是指新約希臘文的各種用法。 + +## 本書範疇 +- 新約希臘文本身就足以構成可供分析的 corpus (語料庫),因此本書不談其他時期的希臘文 (例如:古典希臘文)。 +- 雖然會提到閃語對新約希臘文的影響,但本書只是偶一為之,因為: + - a) Porter 對閃語影響程度存疑; + - b) 即便有影響,但本書是針對語料庫作 synchronic (共時性) 研究,不管新約希臘文過去受到過哪些影響。 + +## 本書目標 +- 本書目標:上接第一年希臘文,下接高級希臘文 (如:BDF, Robertson, Moulton & Turner)。 + +## 本書特色有三: + +### 1) 根據現代語言學的原則。 +- synchronic (共時性) 研究。 +- 把希臘文當作是一個 self-referring (自我參照) 的系統,不用其他語言的概念 (例如:拉丁文) 來理解希臘文。 +- 本書分兩大段,前半段講 word & phrase (字詞 & 片語),後半段講 clause & larger units (子句 & 更大單元)。 +- 區別 form (形式) 和 function (功能)。每章內容先用 form (形式) 分大段,再按照 semantic, syntactical, functional 區別分成小段。 +- 使用 slot & filler 的概念來解釋句法。 + - 例如:子句可以有 subject (主語)、predicate (述語)、complement (補語) 三個元素,好像有三個 slots,每個 slot 裡面可以放進去不同的 filler。因此,你可以把 nominal phrase (詞片語) 當作 filler 放進subject (主語) 這個 slot 裡面。 + - 更進一步說,nominal phrase (詞片語) 裡面也有 head-term、modifier 等好幾個元素 (slot),每個 slot 裡面又可以放進去不同的 filler。 + - 就像希臘文分詞的 form (形式) 不變,但在不同的上下文裡,其功能 (function) 卻千變萬化,可以當作 subject (主語)、predicate (述語)、complement (補語),塞進不同的 slot 裡面。 + +### 2) Porter 自認有獨特貢獻之處。 +- tense and aspect (Chapter 1), mood and attitude (Chapter 2), cases and gender (Chapter 4), prepositions (Chapter 9), participles (Chapter 10), conditional clauses (Chapter 16), word order and clause structure (Chapter 20), and discourse analysis (Chapter 21)。 + +### 3) 舉例多。 +- 每個文法結構起碼舉出兩節經文當例子。 + +## 建議 +- 再多文法都不能取代讀經! diff --git a/Porter-IGNT/IGNT-01.md b/Porter-IGNT/IGNT-01.md new file mode 100644 index 0000000..4ead7bd --- /dev/null +++ b/Porter-IGNT/IGNT-01.md @@ -0,0 +1,411 @@ +# 第一章 時態和觀點,以及迂迴結構 Tenseand Aspct, and Periphrastic Construcions + +## 前言 (Introduction) + +## 1. 動詞觀點:定義 (Verbal Aspect: Definition) + +- 印歐語系動詞 (希臘文在內) 的「時態字幹」(tense stem)不代表時間,而是表達說話者 (speaker)、作者 (writer) 對動作的「觀點」(aspect);至於動作的時間,則要由上下文來決定。 + +### 1.1 三個動詞觀點 (The Three Verbal Aspects) + +- 希臘文動詞有三種觀點,對應三種時態形式: + - a) 不定過去式 (aorist) 時態形式 ⇒ 完整 (Perfective) 觀點,表達完整 (complete)、沒有要刻意區別出來的 (undifferentiated) 的動作。 + +(1) Rom 5:14 +ἐβασίλευσενreignedβασιλεύωV‑AIA‑3S -Art‑NMS θάνατοςdeathθάνατοςN‑NMS ἀπὸfromἀπόPrep ἈδὰμAdamἈδάμN‑GMS μέχριuntilμέχριPrep ΜωϋσέωςMosesΜωσῆςN‑GMS 死就作了王 + +- b) 現在式 (present) 時態形式、不完成式 (imperfect) 時態形式 ⇒ 不完整 (Imperfective) 觀點,表達進展中 (in progress) 的動作。 +- c) 現在完成式 (perfect) 時態形式、過去完成式 (pluperfect) 時態形式 ⇒ 狀態觀點,表達反映現狀 (a given state of affairs) 的動作。 + +#### 1.1.1 動詞的對立 (Verbal opposition) + +- 語言學研究發現,有選擇才有意義 (choice implies meaning)。選擇完整 (Perfective) 觀點,就代表當事人有意識 (或在潛意識層面) 不使用其他觀點。 +- 從語意權重 (semantic weight) 的角度來看: + - 不定過去式時態形式 (完整觀點)──最輕 + - 現在式、不完成式時態形式 (不完整觀點)──較重 + - 現在完成式、過去完成式時態形式 (狀態觀點)──最重 + +(2) Rom 6:7–10 The [one]Art‑NMS γὰρforγάρConj ἀποθανὼνhaving diedἀποθνήσκωV‑APA‑NMS δεδικαίωταιhas been freedδικαιόωV‑RIM⁞P‑3S ἀπὸfromἀπόPrep τῆς-Art‑GFS ἁμαρτίας.sin.ἀμαρτίαN‑GFS ΕἰIfεἰConj δὲnowδέConj ἀπεθάνομενwe diedἀποθνήσκωV‑AIA‑1P σὺνwithσύνPrep ΧριστῷChristΧριστόςN‑DMS πιστεύομενwe believeπιστεύωV‑PIA‑1P ὅτιthatὅτιConj καὶalsoκαίConj συζήσομεν*we will live withσυζάωV‑FIA‑1P αὐτῷHimαὐτόςPPro‑DM3S εἰδότεςknowingεἴδωV‑RPA‑NMP ὅτιthatὅτιConj ΧριστὸςChristΧριστόςN‑NMS ἐγερθεὶςhaving been raised upἐγείρωV‑APP‑NMS ἐκout fromἐκPrep νεκρῶν[the] deadνεκρόςAdj‑GMP οὐκέτιno moreοὐκέτιAdv ἀποθνῄσκειdies.ἀποθνήσκωV‑PIA‑3S θάνατοςDeathθάνατοςN‑NMS αὐτοῦHimαὐτόςPPro‑GM3S οὐκέτιno longerοὐκέτιAdv κυριεύει.rules over.κυριεύωV‑PIA‑3S That whichὅςRelPro‑ANS γὰρforγάρConj ἀπέθανενHe diedἀποθνήσκωV‑AIA‑3S τῇ-Art‑DFS ἁμαρτίᾳto sinἀμαρτίαN‑DFS ἀπέθανενHe diedἀποθνήσκωV‑AIA‑3S ἐφάπαξ·once for all;ἐφάπαξAdv that whichὅςRelPro‑ANS δὲhoweverδέConj ζῇHe livesζάωV‑PIA‑3S ζῇHe livesζάωV‑PIA‑3S τῷ-Art‑DMS Θεῷ.to God.θεόςN‑DMS 因為已死的人是脫離了罪…我們若是與基督同死,就信必與他同活。因為知道基督既從死裡復活,就不再死,死也不再作他的主了。他死是向罪死了,只有一次;他活是向神活著 + +#### 1.1.2 論述的層級 (Planes of discourse) + +- 從論述分析 (discourse analysis) 的角度來看,語言學家把論述分成三個層級:背景 (background)、前景 (foreground)、近景 (frontground)。 + +(3) Rom 5:1–2 +ΔικαιωθέντεςHaving been justifiedδικαιόωV‑APP‑NMP οὖνthereforeοὖνConj ἐκbyἐκPrep πίστεωςfaithπίστιςN‑GFS εἰρήνηνpeaceεἰρήνηN‑AFS ἔχομεν*we haveἔχωV‑PIA‑1P πρὸςwithπρόςPrep τὸν-Art‑AMS ΘεὸνGodθεόςN‑AMS διὰthroughδιάPrep τοῦtheArt‑GMS ΚυρίουLordκύριοςN‑GMS ἡμῶνof usἐγώPPro‑G1P ἸησοῦJesusἸησοῦςN‑GMS ΧριστοῦChristΧριστόςN‑GMS δι’throughδιάPrep οὗwhomὅςRelPro‑GMS καὶalsoκαίConj τὴν-Art‑AFS προσαγωγὴνaccessπροσαγωγήN‑AFS ἐσχήκαμενwe haveἔχωV‑RIA‑1P τῇby theArt‑DFS πίστειfaithπίστιςN‑DFS εἰςintoεἰςPrep τὴνtheArt‑AFS χάρινgraceχάριςN‑AFS ταύτηνthisοὗτοςDPro‑AFS ἐνinἐνPrep whichὅςRelPro‑DFS ἑστήκαμενwe stand;ἵστημιV‑RIA‑1P καὶandκαίConj καυχώμεθαwe boastκαυχάομαιV‑PIM⁞P‑1P ἐπ’inἐπίPrep ἐλπίδιhopeἐλπίςN‑DFS τῆςof theArt‑GFS δόξηςgloryδόξαN‑GFS τοῦ-Art‑GMS Θεοῦ.of God.θεόςN‑GMS 我們既因信稱義,就藉著我們的主耶穌基督得與神相和。我們又藉著他,因信得進入現在所站的這恩典中,並且歡歡喜喜盼望神的榮耀。 + +#### 1.1.3 視覺化 (Visualization) + +- 用花車遊行來想像: + - a) 在直升機上,置身遊行隊伍之外,看見了遊行的整體 ⇒ 完整觀點; + - b) 在路邊看著遊行隊伍經過,置身遊行其中 ⇒ 不完整觀點; + - c) 在中控室監看,結合各種因素而成的遊行之現況 ⇒ 狀態觀點 +- 以下三節經文用三種觀點來呈現相同的動作 (耶穌復活): + +(4) 羅8:11 +εἰIfεἰConj δὲnowδέConj τὸtheArt‑NNS ΠνεῦμαSpiritπνεῦμαN‑NNS τοῦof the [One]Art‑GMS ἐγείραντοςhaving raised upἐγείρωV‑APA‑GMS τὸν-Art‑AMS ἸησοῦνJesusἸησοῦςN‑AMS ἐκout fromἐκPrep νεκρῶν[the] deadνεκρόςAdj‑GMP οἰκεῖdwellsοἰκέωV‑PIA‑3S ἐνinἐνPrep ὑμῖν‚you‚σύPPro‑D2P 然而,叫耶穌從死裡復活者的靈若住在你們心裡 + +(5) 林後1:9 +ἀλλ’butἀλλάConj ἐπὶinἐπίPrep τῷ-Art‑DMS ΘεῷGod‚θεόςN‑DMS τῷthe [One]Art‑DMS ἐγείροντιraisingἐγείρωV‑PPA‑DMS τοὺςtheArt‑AMP νεκρούς·dead‚νεκρόςAdj‑AMP 只靠叫死人復活的神。 + +(6) 提後2:8 +ΜνημόνευεRememberμνημονεύωV‑PMA‑2S ἸησοῦνJesusἸησοῦςN‑AMS ΧριστὸνChrist‚ΧριστόςN‑AMS ἐγηγερμένονhaving been raisedἐγείρωV‑RPM⁞P‑AMS ἐκout fromἐκPrep νεκρῶν‚[the] dead‚νεκρόςAdj‑GMP ἐκof [the]ἐκPrep σπέρματοςseedσπέρμαN‑GNS Δαυίδ‚of David‚ΔαβίδN‑GMS 你要紀念耶穌基督乃是大衛的後裔,他從死裡復活 + +#### 1.1.4 附帶說明 + +- 未來式 (future) 時態形式:既無時間、又無觀點,可能跟假設語氣有關。 +- 複合動詞 (動詞字首加上介系詞) 對觀點沒有影響。 +- εἰμί (以及某些 μι 動詞) 的觀點模稜兩可 (aspectually vague)。 + +### 1.2 時間和時態形式 (Time and Tense-Form) +- 希臘文動詞沒有絕對時間 (absolute time),只有相對時間 (relative time),要從上下文以及像是 νῦν, τότε之類時間副詞的「指標」(deictic indicator) 來判斷。 + +### 1.3 希臘文動詞研究歷史 (History of Discussion of Verbs in Greek) + +#### 1.3.1 理性主義時期 (Rationalist period) + +#### 1.3.2 Aktionsart + +#### 1.3.3 動詞觀點 (Verbal Aspect) + +## 2. 動詞觀點與功能 (Verbal Aspect and its Range of Functions) + +- 希臘文用上下文以及像是 νῦν, τότε之類時間副詞的「指標」(deictic indicator) 來表達某個動作的客觀時間。因此,動詞的時態形式 (tense-form) 只能表達作者對於該動作的主觀描述。 +- McKay, Fanning, Wallace, Mounce 等學者認為動詞在直說語氣表達絕對時間──以下就列舉發生在過去 (past)、現在 (present)、未來 (future)、任何時間 (omnitemporal)、與時間無關 (timeless) 這五類時間點的例子,證明直說語氣動詞的時態形式與絕對時間無關。 + +### 2.1. 現在式和不完成式時態形式 (Present/Imperfect tense-forms) + +- 現在式、不完成式時態形式表達的是不完整觀點,可用於各種絕對時間。 + +#### 2.1.1 現在式時態形式→現在動作 (Present for present action) + +- 有些文法書會細分成:敘述的現在式 (descriptive present)、進行中的現在式 (progressive present)、意圖的現在式(conative present)、反覆的現在式(iterative present)。 + +(7) 徒17:22–23 +“ἌνδρεςMenἀνήρN‑VMP ἈθηναῖοιAtheniansἈθηναῖοςAdj‑VMP κατὰinκατάPrep πάνταall thingsπᾶςAdj‑ANP ὡςasὡςAdv δεισιδαιμονεστέρουςvery religiousδεισιδαιμονέστεροςAdj‑AMP‑C ὑμᾶςyouσύPPro‑A2P θεωρῶ.I behold.θεωρέωV‑PIA‑1S διερχόμενοςPassing throughδιέρχομαιV‑PPM⁞P‑NMS γὰρforγάρConj καὶandκαίConj ἀναθεωρῶνbeholdingἀναθεωρέωV‑PPA‑NMS τὰtheArt‑ANP σεβάσματαobjects of worshipσέβασμαN‑ANP ὑμῶνof youσύPPro‑G2P εὗρονI foundεὑρίσκωV‑AIA‑1S καὶevenκαίConj βωμὸνan altarβῶμοςN‑AMS ἐνonἐνPrep whichὅςRelPro‑DMS ἐπεγέγραπτοhad been inscribed:ἐπιγράφωV‑LIM⁞P‑3S ΑΓΝΩΣΤΩTo an unknownἄγνωστοςAdj‑DMS ΘΕΩ.God.θεόςN‑DMS WhomὅςRelPro‑ANS οὖνthereforeοὖνConj ἀγνοοῦντεςnot knowingἀγνοέωV‑PPA‑NMP εὐσεβεῖτεyou worshipεὐσεβέωV‑PIA‑2P τοῦτοHimοὗτοςDPro‑ANS ἐγὼIἐγώPPro‑N1S καταγγέλλωproclaimκαταγγέλλωV‑PIA‑1S ὑμῖν.to you.σύPPro‑D2P 眾位雅典人哪,我看你們凡事很敬畏鬼神。我遊行的時候,觀看你們所敬拜的,遇見一座壇,上面寫著未識之神。你們所不認識而敬拜的,我現在告訴你們。 + +#### 2.1.2 現在式時態形式→過去動作 (Present for past action) + +- 有些文法書稱之為:歷史性的現在式 (historic present)。 +- 過去為了解釋這個怪現象 (現在式時態形式動詞,卻用來表達過去的動作),發展出許多理論──戲劇用法 (dramatic use)、時態縮減 (tense reduction)、場景人物改變 (change of setting or character)──但都不可取。從動詞觀點來看,使用不完整觀點是為了要吸引讀者更多的注意力。 + +(8) Mark1:21, 30 +ΚαὶAndκαίConj εἰσπορεύονταιthey goεἰσπορεύομαιV‑PIM⁞P‑3P εἰςintoεἰςPrep Καφαρναούμ·Capernaum;ΚαπερναούμN‑AFSκαὶAndκαίConj εὐθὺςimmediatelyεὐθέωςAdv λέγουσινthey speakλέγωV‑PIA‑3P αὐτῷto HimαὐτόςPPro‑DM3S περὶaboutπερίPrep αὐτῆς.her.αὐτόςPPro‑GF3S 到了迦百農…就有人告訴耶穌。 + +(9) 徒10:11 +καὶandκαίConj θεωρεῖhe beholdsθεωρέωV‑PIA‑3S τὸν-Art‑AMS οὐρανὸνheavenοὐρανόςN‑AMS [彼得]看見天開了 + +#### 2.1.3 現在式時態形式→未來動作 (Present for future action) + +- 有些文法書稱之為:未來性的現在式 (futuristic present)。 + +(10) 太17:11 +“ἨλίαςElijahἩλίαςN‑NMS μὲνindeedμένConj ἔρχεταιcomesἔρχομαιV‑PIM⁞P‑3S καὶandκαίConj ἀποκαταστήσειwill restoreἀποκαθίστημιV‑FIA‑3S πάντα·all things.πᾶςAdj‑ANP 以利亞固然先來,並要復興萬事; + +(11) 太26:2 “ΟἴδατεYou knowεἴδωV‑RIA‑2P ὅτιthatὅτιConj μετὰafterμετάPrep δύοtwoδύοAdj‑AFP ἡμέραςdaysἡμέραN‑AFP τὸtheArt‑NNS πάσχαPassoverπάσχαN‑NNS γίνεταιtakes placeγίνομαιV‑PIM⁞P‑3S 你們知道,過兩天是逾越節 + +(12) Mat26:45 ἤγγικενhas drawn nearἐγγίζωV‑RIA‑3S theArt‑NFS ὥραhour‚ὥραN‑NFS καὶandκαίConj theArt‑NMS ΥἱὸςSonυἱόςN‑NMS τοῦ-Art‑GMS ἀνθρώπουof ManἄνθρωποςN‑GMS παραδίδοταιis betrayedπαραδίδωμιV‑PIM⁞P‑3S εἰςintoεἰςPrep χεῖρας[the] handsχείρN‑AFP ἁμαρτωλῶν.of sinners.ἀμαρτωλόςAdj‑GMP 時候到了,人子被賣在罪人手裡 + +(13) 可10:33 “ἸδοὺBeholdἰδούV‑AMA‑2S ἀναβαίνομενwe go upἀναβαίνωV‑PIA‑1P εἰςtoεἰςPrep ἹεροσόλυμαJerusalemἹεροσόλυμαN‑ANP καὶandκαίConj theArt‑NMS ΥἱὸςSonυἱόςN‑NMS τοῦ-Art‑GMS ἀνθρώπουof ManἄνθρωποςN‑GMS παραδοθήσεταιwill be betrayedπαραδίδωμιV‑FIP‑3S 看哪,我們上耶路撒冷去,人子將要被交… + +#### 2.1.4 現在式時態形式→任何時間的動作 (Present for omnitemporal action) + +- 有些文法書稱之為:格言性的現在式 (gnomic present)。 +- 在希臘文中現在式時態形式能用來論及規律反覆的動作,尤其是那些在自然界重複的動作。 + +(14) 太6:26 ἐμβλέψατεLookἐμβλέπωV‑AMA‑2P εἰςatεἰςPrep τὰtheArt‑ANP πετεινὰbirdsπετεινόνN‑ANP τοῦof theArt‑GMS οὐρανοῦairοὐρανόςN‑GMS ὅτιthatὅτιConj οὐnotοὐAdv σπείρουσινthey sowσπείρωV‑PIA‑3P οὐδὲnorοὐδέConj θερίζουσινdo they reapθερίζωV‑PIA‑3P οὐδὲnorοὐδέConj συνάγουσινdo they gatherσυνάγωV‑PIA‑3P εἰςintoεἰςPrep ἀποθήκαςbarns —ἀποθήκηN‑AFP 你們看那天上的飛鳥,也不種,也不收,也不積蓄在倉裡 + +(15) 太7:17 οὕτωςSoοὕτωAdv πᾶνeveryπᾶςAdj‑NNS δένδρονtreeδένδρονN‑NNS ἀγαθὸνgoodἀγαθόςAdj‑NNS καρποὺςfruitsκαρπόςN‑AMP καλοὺςgoodκαλόςAdj‑AMP ποιεῖproduces;ποιέωV‑PIA‑3S τὸ-Art‑NNS δὲbutδέConj σαπρὸνthe badσαπρόςAdj‑NNS δένδρονtreeδένδρονN‑NNS καρποὺςfruitsκαρπόςN‑AMP πονηροὺςbadπονηρόςAdj‑AMP ποιεῖ·produces.ποιέωV‑PIA‑3S 這樣,凡好樹都結好果子,惟獨壞樹結壞果子。 + +(16) 可2:22 ΚαὶAndκαίConj οὐδεὶςno oneοὐδείςAdj‑NMS βάλλειputsβάλλωV‑PIA‑3S οἶνονwineοἶνοςN‑AMS νέονnewνέοςAdj‑AMS εἰςintoεἰςPrep ἀσκοὺςwineskinsἀσκόςN‑AMP παλαιούς·old;παλαιόςAdj‑AMP 也沒有人把新酒裝在舊皮袋裡 + +(17) 約3:8 τὸTheArt‑NNS πνεῦμαwindπνεῦμαN‑NNS ὅπουwhereὅπουAdv θέλειit wishesθέλωV‑PIA‑3S πνεῖblowsπνέωV‑PIA‑3S 風隨著意思吹 + +#### 2.1.5 現在式時態形式→無時間性的動作 (Present for timeless action) + +- 無時間=動作的發生與時間無關,常用來陳述神學或數學。 + +(18) 太5:14–15 οὐNotοὐAdv δύναταιis ableδύναμαιV‑PIM⁞P‑3S πόλιςa cityπόλιςN‑NFS κρυβῆναιto be hiddenκρύπτωV‑ANP ἐπάνωonἐπάνωPrep ὄρουςa hillὄροςN‑GNS κειμένη·lying.κεῖμαιV‑PPM⁞P‑NFS οὐδὲNorοὐδέConj καίουσινdo they lightκαίωV‑PIA‑3P λύχνονa lampλύχνοςN‑AMS καὶandκαίConj τιθέασινputτίθημιV‑PIA‑3P αὐτὸνitαὐτόςPPro‑AM3S ὑπὸunderὑπόPrep τὸν-Art‑AMS μόδιονa basketμόδιοςN‑AMS ἀλλ’butἀλλάConj ἐπὶuponἐπίPrep τὴνtheArt‑AFS λυχνίανlampstandλυχνίαN‑AFS καὶandκαίConj λάμπειit shinesλάμπωV‑PIA‑3S πᾶσινfor allπᾶςAdj‑DMP τοῖςthoseArt‑DMP ἐνinἐνPrep τῇtheArt‑DFS οἰκίᾳ.house.οἰκίαN‑DFS 城造在山上是不能隱藏的。人點燈,不放在斗底下,是放在燈臺上,就照亮一家的人。 + +(19) 林後9:7 ἱλαρὸνa cheerfulἱλαρόςAdj‑AMS γὰρforγάρConj δότηνgiverδότηςN‑AMS ἀγαπᾷlovesἀγαπάωV‑PIA‑3S -Art‑NMS Θεός.God.θεόςN‑NMS 因為捐得樂意的人是神所喜愛的。 + +(20) Joh 11:36 ἜλεγονWere sayingἔπωV‑IIA‑3P οὖνthereforeοὖνConj οἱtheArt‑NMP ἸουδαῖοιJewsἸουδαῖοςAdj‑NMP “ἼδεBeholdἰδούV‑AMA‑2S πῶςhowπῶςAdv ἐφίλειHe lovedφιλέωV‑IIA‑3S αὐτόν.him!αὐτόςPPro‑AM3S + +#### 2.1.6 不完成式時態形式→過去動作 (Imperfect for past action) + +- 與不定過去式時態形式都常見於敘事文體,差別在於不完成式時態形式吸引讀者進一步深思細想。 + +(21) Mar 1:31 καὶAndκαίConj προσελθὼνhaving come to [her]‚προσέρχομαιV‑APA‑NMS ἤγειρενHe raised upἐγείρωV‑AIA‑3S αὐτὴνher‚αὐτόςPPro‑AF3S κρατήσαςhaving taken holdκρατέωV‑APA‑NMS τῆςof theArt‑GFS χειρός·hand.χείρN‑GFS καὶAndκαίConj ἀφῆκενleftἀφίημιV‑AIA‑3S αὐτὴνherαὐτόςPPro‑AF3S theArt‑NMS πυρετός‚fever‚πυρετόςN‑NMS καὶandκαίConj διηκόνειshe began to ministerδιακονέωV‑IIA‑3S αὐτοῖς.to them.αὐτόςPPro‑DM3P 耶穌進前拉著她的手,扶她起來,熱就退了,她就服事他們。 + +- 言說動詞 (verbs of saying) 常常交替使用不完成式時態形式、不定過去式時態形式。 + +(22) John 11:36–37 ἜλεγονWere sayingἔπωV‑IIA‑3P οὖνthereforeοὖνConj οἱtheArt‑NMP ἸουδαῖοιJews‚ἸουδαῖοςAdj‑NMPΤινὲςSomeτὶςIPro‑NMP δὲhoweverδέConj ἐξofἐκPrep αὐτῶνthemαὐτόςPPro‑GM3P εἶπανsaid‚ἔπωV‑AIA‑3P 猶太人就說…其中有人說… + +(23) 徒2:13–14 ἝτεροιOthersἕτεροςAdj‑NMP δὲhoweverδέConj διαχλευάζοντεςmockingχλευάζωV‑PPA‑NMP ἔλεγονwere sayingἔπωV‑IIA‑3PδὲhoweverδέConj -Art‑NMS ΠέτροςPeterΠέτροςN‑NMSκαὶandκαίConj ἀπεφθέγξατοspoke forthἀποφθέγγομαιV‑AIM‑3S αὐτοῖςto them:αὐτόςPPro‑DM3P 有人譏誚說…彼得…說… + +- 吸引注意力的程度:現在式時態形式 > 不完成式時態形式 + +(24) 可3:20–21 ΚαὶAndκαίConj ἔρχεταιHe comesἔρχομαιV‑PIM⁞P‑3S εἰςtoεἰςPrep οἶκον·a houseοἶκοςN‑AMS καὶandκαίConj συνέρχεταιcomes togetherσυνέρχομαιV‑PIM⁞P‑3S πάλινagainπάλινAdv aArt‑NMS ὄχλοςcrowdὄχλοςN‑NMSκαὶAndκαίConj ἀκούσαντεςhaving heard [of it]ἀκούωV‑APA‑NMP οἱthoseArt‑NMP παρ’belonging toπαράPrep αὐτοῦHimαὐτόςPPro‑GM3S ἐξῆλθονwent outἐξέρχομαιV‑AIA‑3P κρατῆσαιto seizeκρατέωV‑ANA αὐτόν·Him;αὐτόςPPro‑AM3S ἔλεγονthey were sayingἔπωV‑IIA‑3P γὰρforγάρConj ὅτι-ὅτιConj “Ἐξέστη.He is out of His mind.ἐξίστημιV‑AIA‑3S 耶穌進了一個屋子,眾人又聚集…耶穌的親屬聽見,就出來要拉住他,因為他們說他癲狂了。 + +#### 2.1.7 不完成式時態形式→非過去動作 (Imperfect for non-past action) + +- 不完成式時態形式常用於三種情況: + - a) 第二類條件句的條件子句 (εἰ+imperfect/aorist)──從中最能看出觀點的特色,因為第二類條件句與事實相反,動作根本沒發生,何來時間可言。 + - b) 有些文法書稱之為:意圖的不完成式 (conative imperfect),表達正在考慮但尚未開始、完成的動作。 + +(25) 路23:54 καὶandκαίConj σάββατονSabbathσάββατονN‑NNS ἐπέφωσκεν.was just beginning.ἐπιφώσκωV‑IIA‑3S 安息日也快到了。 + +(26) 約11:8 “ῬαββίRabbiῥαββίN‑VMS νῦνjust nowνῦνAdv ἐζήτουνwere seekingζητέωV‑IIA‑3P σεYouσύPPro‑A2S λιθάσαιto stoneλιθάζωV‑ANA οἱtheArt‑NMP ἸουδαῖοιJewsἸουδαῖοςAdj‑NMP 拉比,猶太人近來要拿石頭打你 + + - c) 鏈接 (catanative) 結構:兩個動詞緊密相關,各自表達觀點。 + +(27) 太23:23 ταῦταTheseοὗτοςDPro‑ANP δὲnowδέConj ἔδειit behooved youδεῖV‑IIA‑3S ποιῆσαιto doποιέωV‑ANA 這更重的是你們當行的 + +### 2.2 不定過去式時態形式 (Aorist tense-form) + +- 不定過去式時態形式≠過去發生的動作,而是用來表達完整 (complete)、沒有要刻意區別出來的 (differentiated) 的動作。 + +#### 2.2.1 不定過去式時態形式→過去動作 (Aorist for past action) + +- 有些文法書會細分成:敘事的不定過去式 (narrative aorist)、表述的不定過去式 (constative aorist)、起始的不定過去式 (ingressive aorist)、果效的不定過去式 (effective aorist)、點狀的不定過去式 (punctiliar aorist)。 + +(28) 徒28:11-15 ...ἀνήχθημενwe sailedἀνάγωV‑AIP‑1P ἐνinἐνPrep πλοίῳa shipπλοῖονN‑DNSἈλεξανδρινῷ‚Alexandrian‚ἈλεξανδρίνοςAdj‑DNSἐπεμείναμενwe stayedἐπιμένωV‑AIA‑1P ἡμέραςdaysἡμέραN‑AFP τρεῖς‚three‚τρεῖςAdj‑AFPκατηντήσαμενwe arrivedκαταντάωV‑AIA‑1P εἰςatεἰςPrep Ῥήγιον.Rhegium.ῬήγιονN‑ANSἤλθομενwe cameἔρχομαιV‑AIA‑1P εἰςtoεἰςPrep Ποτιόλους‚Puteoli‚ΠοτίολοιN‑AMPπαρεκλήθημενwe were entreatedπαρακαλέωV‑AIP‑1PεἰςtoεἰςPrep τὴν-Art‑AFS ῬώμηνRomeῬώμηN‑AFS ἤλθαμεν.we came.ἔρχομαιV‑AIA‑1Pἦλθανcame outἔρχομαιV‑AIA‑3P εἰςtoεἰςPrep ἀπάντησινmeetἀπάντησιςN‑AFS ἡμῖνusἐγώPPro‑D1PἔλαβεtookλαμβάνωV‑AIA‑3S θάρσος.courage.θάρσοςN‑ANS …我們上了亞力山太的船…停泊三日…來到利基翁…來到部丟利…請我們…我們來到羅馬…[他們]迎接我們…[保羅]放心壯膽。 + +(29) 徒28:30 ἘνέμεινενHe stayedἐμμένωV‑AIA‑3S δὲthenδέConj διετίανtwo yearsδιετίαN‑AFS ὅληνwholeὅλοςAdj‑AFS ἐνinἐνPrep ἰδίῳhis ownἴδιοςAdj‑DNS μισθώματιrented houseμίσθωμαN‑DNS 保羅在自己所租的房子裡住了足足兩年。 + +(30) 林後11:24–25 ὙπὸFromὑπόPrep Ἰουδαίων[the] JewsἸουδαῖοςAdj‑GMP πεντάκιςfive timesπεντάκιςAdv τεσσεράκονταforty [lashes]τεσσαράκονταAdj‑AFP παρὰminusπαράPrep μίανoneεἷςAdj‑AFS ἔλαβονI received.λαμβάνωV‑AIA‑1S τρὶςThree timesτρίςAdv ἐραβδίσθηνI was beaten with rodsῥαβδίζωV‑AIP‑1Sτρὶςthree timesτρίςAdv ἐναυάγησαI was shipwreckedναυαγέωV‑AIA‑1S 被猶太人鞭打五次,每次四十減去一下,被棍打了三次…遇著船壞三次… + +#### 2.2.2 不定過去式時態形式→現在動作 (Aorist for present action) + +(31) 太23:23 ὅτιForὅτιConj ἀποδεκατοῦτεyou pay tithes ofἀποδεκατόωV‑PIA‑2P τὸ-Art‑ANS ἡδύοσμονmintἡδύοσμονN‑ANSἀφήκατεyou have neglectedἀφίημιV‑AIA‑2P τὰtheArt‑ANP βαρύτεραweightier [matters]βαρύςAdj‑ANP‑C τοῦof theArt‑GMS νόμουlaw:νόμοςN‑GMS 因為你們將薄荷…獻上十分之一,那律法上更重的事…反倒不行了。 + +(32) 路16:4 ἔγνωνI knowγινώσκωV‑AIA‑1S τίwhatτίςIPro‑ANS ποιήσωI will doποιέωV‑ASA‑1S ἵναso thatἵναConjδέξωνταίthey might receiveδέχομαιV‑ASM‑3P μεmeἐγώPPro‑A1S εἰςintoεἰςPrep τοὺςtheArt‑AMP οἴκουςhomesοἶκοςN‑AMP ἑαυτῶν.of them.ἑαυτούRefPro‑GM3P 我知道怎麼行,好叫人…接我到他們家裡去 + +(33) 約13:31 “ΝῦνNowνῦνAdv ἐδοξάσθηhas been glorifiedδοξάζωV‑AIP‑3S theArt‑NMS ΥἱὸςSonυἱόςN‑NMS τοῦ-Art‑GMS ἀνθρώπουof ManἄνθρωποςN‑GMS καὶandκαίConj -Art‑NMS ΘεὸςGodθεόςN‑NMS ἐδοξάσθηhas been glorifiedδοξάζωV‑AIP‑3S ἐνinἐνPrep αὐτῷ·Him.αὐτόςPPro‑DM3S 如今人子得了榮耀,神在人子身上也得了榮耀。 + +(34) 羅5:11 νῦνnowνῦνAdv τὴνtheArt‑AFS καταλλαγὴνreconciliationκαταλλαγήN‑AFS ἐλάβομεν.we have received.λαμβάνωV‑AIA‑1P 我們…得與神和好 + +- 有些文法書用「書信的不定過去式」(epistolary aorist) 來解釋,認為作者站在讀者的角度,所以用不定過去式時態形式來描寫當下「寫信」的動作。但從觀點角度來看,作者是從自己的時間點來寫信,用不同觀點來呈現「寫信」的動作。 +- 約壹2:12–14 用了三個現在式、三個不定過去式來描寫「寫信」的動作,從觀點角度解釋,六個動作都指寫這封信的動作,三個現在式=強調;三個不定過去式=重述要點 (recapitulation)。 + +(35) 約壹2:12-14 ΓράφωI am writingγράφωV‑PIA‑1S ὑμῖν‚to you‚σύPPro‑D2P τεκνία‚little children‚τεκνίονN‑VNP ...ΓράφωI am writingγράφωV‑PIA‑1S ὑμῖν‚to you‚σύPPro‑D2P πατέρες‚fathers‚πατήρN‑VMPΓράφωI am writingγράφωV‑PIA‑1S ὑμῖν‚to you‚σύPPro‑D2P νεανίσκοι‚young men‚νεανίσκοςN‑VMPἜγραψαI have writtenγράφωV‑AIA‑1S ὑμῖν‚to you‚σύPPro‑D2P παιδία‚little children‚παιδίονN‑VNPἜγραψαI have writtenγράφωV‑AIA‑1S ὑμῖν‚to you‚σύPPro‑D2P πατέρες‚fathers‚πατήρN‑VMPἜγραψαI have writtenγράφωV‑AIA‑1S ὑμῖν‚to you‚σύPPro‑D2P νεανίσκοι‚young men‚νεανίσκοςN‑VMP 小子們哪,我寫信給你們…父老阿,我寫信給你們…少年人哪,我寫信給你們…小子們哪,我曾寫信給你們…父老阿,我曾寫信給你們…少年人哪,我曾寫信給你們… + +#### 2.2.3 不定過去式時態形式→未來動作 (Aorist for future action) + +- 很少出現。英文翻譯 “will …” 有些過度,希臘文語氣沒那麼強烈。 + +(36) 約17:18 καθὼςAsκαθώςAdv ἐμὲMeἐγώPPro‑A1S ἀπέστειλαςYou sentἀποστέλλωV‑AIA‑2S εἰςintoεἰςPrep τὸνtheArt‑AMS κόσμονworldκόσμοςN‑AMS κἀγὼI alsoκαγώPPro‑N1S ἀπέστειλαsentἀποστέλλωV‑AIA‑1S αὐτοὺςthemαὐτόςPPro‑AM3P εἰςintoεἰςPrep τὸνtheArt‑AMS κόσμον·world;κόσμοςN‑AMS 你怎樣差我到世上,我也照樣差他們到世上。 + +(37) 羅8:30 οὓςThose whomὅςRelPro‑AMP δὲthenδέConj προώρισενHe predestinedπροορίζωV‑AIA‑3S τούτουςtheseοὗτοςDPro‑AMP καὶalsoκαίConj ἐκάλεσεν·He called;καλέωV‑AIA‑3S καὶandκαίConj οὓςwhomὅςRelPro‑AMP ἐκάλεσενHe calledκαλέωV‑AIA‑3S τούτουςtheseοὗτοςDPro‑AMP καὶalsoκαίConj ἐδικαίωσεν·He justified;δικαιόωV‑AIA‑3S οὓςwhomὅςRelPro‑AMP δὲthenδέConj ἐδικαίωσενHe justifiedδικαιόωV‑AIA‑3S τούτουςtheseοὗτοςDPro‑AMP καὶalsoκαίConj ἐδόξασεν.He glorified.δοξάζωV‑AIA‑3S 預先所定下的人又召他們來;所召來的人又稱他們為義;所稱為義的人又叫他們得榮耀。 + +(38) 猶1:14 “ἸδοὺBeholdἰδούV‑AMA‑2S ἦλθενhas comeἔρχομαιV‑AIA‑3S Κύριος[the] LordκύριοςN‑NMS ἐνamidstἐνPrep ἁγίαιςholy [ones]ἅγιοςAdj‑DFP μυριάσινmyriadsμυρίαςN‑DFP αὐτοῦof HisαὐτόςPPro‑GM3S + +(39) 啟14:8 “ἜπεσενFallenπίπτωV‑AIA‑3S ἔπεσενFallen isπίπτωV‑AIA‑3S ΒαβυλὼνBabylonΒαβυλώνN‑NFS theArt‑NFS μεγάληgreatμέγαςAdj‑NFS 看哪,主帶著他的千萬聖者降臨 + +#### 2.2.4 不定過去式時態形式→任何時間的動作 (Aorist for omnitemporal action) + +- 有些文法書稱之為:格言性的不定過去式 (gnomic aorist)。 +- 傳統文法很難解釋,但從觀點來看就很簡單,因為時態形式跟時間脫鉤。 + +(40) 羅3:23 πάντεςAllπᾶςAdj‑NMP γὰρforγάρConj ἥμαρτονhave sinnedἀμαρτάνωV‑AIA‑3P καὶandκαίConj ὑστεροῦνταιfall shortὑστερέωV‑PIM⁞P‑3P τῆςof theArt‑GFS δόξηςgloryδόξαN‑GFS τοῦ-Art‑GMS Θεοῦof GodθεόςN‑GMS 因為世人都犯了罪,虧缺了神的榮耀; + +(41) 弗5:29 οὐδεὶςNo oneοὐδείςAdj‑NMS γάρforγάρConj ποτεat any timeποτέPrtcl τὴνtheArt‑AFS ἑαυτοῦof himselfἑαυτούRefPro‑GM3S σάρκαfleshσάρξN‑AFS ἐμίσησενhatedμισέωV‑AIA‑3S 從來沒有人恨惡自己的身子 + +(42) 雅1:11 ἀνέτειλενHas risenἀνατέλλωV‑AIA‑3S γὰρforγάρConj theArt‑NMS ἥλιοςsunἥλιοςN‑NMS σὺνwithσύνPrep τῷ[its]Art‑DMS καύσωνιburning heatκαύσωνN‑DMS καὶandκαίConj ἐξήρανενwitheredξηραίνωV‑AIA‑3S τὸνtheArt‑AMS χόρτονgrassχόρτοςN‑AMS καὶandκαίConj τὸtheArt‑NNS ἄνθοςflowerἄνθοςN‑NNS αὐτοῦof itαὐτόςPPro‑GM3S ἐξέπεσενhas fallenἐκπίπτωV‑AIA‑3S καὶandκαίConj theArt‑NFS εὐπρέπειαbeautyεὐπρέπειαN‑NFS τοῦof theArt‑GNS προσώπουappearanceπρόσωπονN‑GNS αὐτοῦof itαὐτόςPPro‑GN3S ἀπώλετο·has perished.ἀπόλλυμιV‑AIM‑3S 太陽出來,熱風颳起,草就枯乾,花也凋謝,美容就消沒了; + +(43) 彼前1:24 ἐξηράνθηWithersξηραίνωV‑AIP‑3S theArt‑NMS χόρτοςgrassχόρτοςN‑NMS καὶandκαίConj τὸtheArt‑NNS ἄνθοςflowerἄνθοςN‑NNS ἐξέπεσεν·falls awayἐκπίπτωV‑AIA‑3S 草必枯乾,花必凋謝; + +#### 2.2.5 不定過去式時態形式→無時間性的動作 (Aorist for timeless action) + +- 無時間性的過去式通常出現在比喻、神學論述當中。 + +(44) 可1:11 “ΣὺYouσύPPro‑N2S εἶareεἰμίV‑PIA‑2S theArt‑NMS ΥἱόςSonυἱόςN‑NMS μουof MeἐγώPPro‑G1S theArt‑NMS ἀγαπητόςbelovedἀγαπητόςAdj‑NMS ἐνinἐνPrep σοὶYouσύPPro‑D2S εὐδόκησα.I am well pleased.εὐδοκέωV‑AIA‑1S 你是我的愛子,我喜悅你。 + +(45) 路7:35 καὶAndκαίConj ἐδικαιώθηwas justifiedδικαιόωV‑AIP‑3S -Art‑NFS σοφίαwisdomσοφίαN‑NFS ἀπὸbyἀπόPrep πάντωνallπᾶςAdj‑GNP τῶνtheArt‑GNP τέκνωνchildrenτέκνονN‑GNP αὐτῆς.of her.αὐτόςPPro‑GF3S 但智慧之子都以智慧為是。 + +### 2.3 現在完成式、過去完成式時態形式 (Perfect/Pluperfect tense-forms) + +- 現在完成式、過去完成式時態形式 ⇒ 用來表達反映現狀 (a given state of affairs) 的動作。單就時態形式來看 (不考慮上下文),語意分量最重。 +- 傳統文法認為「現在完成式時態形式=已經完成的動作,所產生的結果持續到現在」,這個說法有很多例外,被迫增加許多文法類別:強調的現在完成式 (intensive perfect)、廣泛的現在完成式 (extensive perfect)、完畢的現在完成式 (completed perfect)。 +- 從觀點角度來看,狀態觀點=現狀的焦點是主詞,所以 οἶδα 的意思是「我知道」(I know)、「我在知道的狀態裏」(I am in a knowledgeable state),不是「我知道,而且那件事還處在被我知道的狀態」(I know and the fact remains known)。 + + +#### 2.3.1 現在完成式時態形式→過去的動作 (Perfect for past action) + +(46) 約1:15 ἸωάννηςJohnἸωάννηςN‑NMS μαρτυρεῖwitnessesμαρτυρέωV‑PIA‑3S περὶconcerningπερίPrep αὐτοῦHimαὐτόςPPro‑GM3S καὶandκαίConj κέκραγενhe cried outκράζωV‑RIA‑3S 約翰為他作見證,喊著 + +(47) 約12:40 “ΤετύφλωκενHe has blindedτυφλόωV‑RIA‑3S αὐτῶνof themαὐτόςPPro‑GM3P τοὺςtheArt‑AMP ὀφθαλμοὺςeyesὀφθαλμόςN‑AMP καὶandκαίConj ἐπώρωσενhas hardenedπωρόωV‑AIA‑3S αὐτῶνof themαὐτόςPPro‑GM3P τὴνtheArt‑AFS καρδίανheartκαρδίαN‑AFS 主叫他們瞎了眼,硬了心 + +(48) 林後2:13 οὐκnotοὐAdv ἔσχηκαI hadἔχωV‑RIA‑1S ἄνεσινrestἄνεσιςN‑AFS τῷin theArt‑DNS πνεύματίspiritπνεῦμαN‑DNS μουof meἐγώPPro‑G1S 我心裡不安 + +(49) 林後12:17 μήNotμήAdv τιναanyτὶςIPro‑AMS ὧνof whomὅςRelPro‑GMP ἀπέσταλκαI have sentἀποστέλλωV‑RIA‑1S πρὸςtoπρόςPrep ὑμᾶςyouσύPPro‑A2P δι’byδιάPrep αὐτοῦhimαὐτόςPPro‑GM3S ἐπλεονέκτησαdid I exploitπλεονεκτέωV‑AIA‑1S ὑμᾶς;you?σύPPro‑A2P 我所差到你們那裡去的人,我藉著他們一個人佔過你們的便宜麼? + +(50) 啟5:7 καὶAndκαίConj ἦλθενHe cameἔρχομαιV‑AIA‑3S καὶandκαίConj εἴληφενtook [it]λαμβάνωV‑RIA‑3S ἐκout ofἐκPrep τῆςtheArt‑GFS δεξιᾶςright handδεξιόςAdj‑GFS τοῦof the [One]Art‑GMS καθημένουsittingκάθημαιV‑PPM⁞P‑GMS ἐπὶonἐπίPrep τοῦtheArt‑GMS θρόνου.throne.θρόνοςN‑GMS 這羔羊前來,從坐寶座的右手裡拿了書卷。 + +#### 2.3.2 現在完成式時態形式→現在的動作 (Perfect for present action) + +(51) 約1:26 “ἘγὼIἐγώPPro‑N1S βαπτίζωbaptizeβαπτίζωV‑PIA‑1S ἐνwithἐνPrep ὕδατι·water;ὕδωρN‑DNS μέσοςbut in [the] midstμέσοςAdj‑NMS ὑμῶνof youσύPPro‑G2P ἕστηκεν*stands [One]ἵστημιV‑RIA‑3S ὃνwhomὅςRelPro‑AMS ὑμεῖςyouσύPPro‑N2P οὐκnotοὐAdv οἴδατεknowεἴδωV‑RIA‑2P 我是用水施洗,但有一位站在你們中間,是你們不認識的, + +(52) 約5:45 ἔστινThere isεἰμίV‑PIA‑3S [one]Art‑NMS κατηγορῶνaccusingκατηγορέωV‑PPA‑NMS ὑμῶνyouσύPPro‑G2P ΜωϋσῆςMosesΜωσῆςN‑NMS εἰςinεἰςPrep ὃνwhomὅςRelPro‑AMS ὑμεῖςyouσύPPro‑N2P ἠλπίκατε.have hoped.ἐλπίζωV‑RIA‑2P 有一位告你們的,就是你們所仰賴的摩西。 + +(53) 約12:23 “ἘλήλυθενHas comeἔρχομαιV‑RIA‑3S theArt‑NFS ὥραhourὥραN‑NFS ἵναthatἵναConj δοξασθῇshould be glorifiedδοξάζωV‑ASP‑3S theArt‑NMS ΥἱὸςSonυἱόςN‑NMS τοῦ-Art‑GMS ἀνθρώπου.of Man.ἄνθρωποςN‑GMS 人子得榮耀的時候到了。 + +(54) 徒4:10 οὗτοςthis [man]οὗτοςDPro‑NMS παρέστηκενstandsπαρίστημιV‑RIA‑3S ἐνώπιονbeforeἐνώπιονPrep ὑμῶνyouσύPPro‑G2P ὑγιής.sound.ὑγιήςAdj‑NMS 站在你們面前的這人得痊癒 + +#### 2.3.3 現在完成式時態形式→未來的動作 (Perfect for future action) + +(55) 雅5:2–3 TheArt‑NMS πλοῦτοςrichesπλοῦτοςN‑NMS ὑμῶνof YouσύPPro‑G2P σέσηπενhave rottedσήπωV‑RIA‑3S καὶandκαίConj τὰtheArt‑NNP ἱμάτιαgarmentsἱμάτιονN‑NNP ὑμῶνof youσύPPro‑G2P σητόβρωταmoth-eatenσητόβρωτοςAdj‑NNP γέγονενhave become.γίνομαιV‑RIA‑3S TheArt‑NMS χρυσὸςgoldχρυσόςN‑NMS ὑμῶνof youσύPPro‑G2P καὶandκαίConj theArt‑NMS ἄργυροςsilverἄργυροςN‑NMS κατίωταιhave corrodedκατιόωV‑RIM⁞P‑3S καὶandκαίConj theArt‑NMS ἰὸςrustἰόςN‑NMS αὐτῶνof themαὐτόςPPro‑GM3P εἰςforεἰςPrep μαρτύριονa testimonyμαρτύριονN‑ANS ὑμῖνagainst youσύPPro‑D2P ἔσταιwill beεἰμίV‑FIM‑3S καὶandκαίConj φάγεταιwill eatφάγωV‑FIM‑3S τὰςtheArt‑AFP σάρκαςfleshσάρξN‑AFP ὑμῶνof youσύPPro‑G2P ὡςlikeὡςAdv πῦρ.fire.πῦρN‑NNS 你們的財物壞了,衣服也被蟲子咬了。你們的金銀都長了鏽;那鏽要證明你們的不是,又要吃你們的肉,如同火燒。 + +(56) 約一2:5 ὃςWhoeverὅςRelPro‑NMS δ’howeverδέConj ἂν-ἄνPrtcl τηρῇmay keepτηρέωV‑PSA‑3S αὐτοῦHisαὐτόςPPro‑GM3S τὸν-Art‑AMS λόγονwordλόγοςN‑AMS ἀληθῶςtrulyἀληθῶςAdv ἐνinἐνPrep τούτῳhimοὗτοςDPro‑DMS theArt‑NFS ἀγάπηloveἀγάπηN‑NFS τοῦ-Art‑GMS Θεοῦof GodθεόςN‑GMS τετελείωται.has been perfected.τελειόωV‑RIM⁞P‑3S 凡遵守主道的,愛神的心在他裡面實在是完全的。 + +#### 2.3.4 現在完成式時態形式→任何時間的動作 (Perfect for omnitemporal action) + +(57) 路12:7 ἀλλὰButἀλλάConj καὶevenκαίConj αἱtheArt‑NFP τρίχεςhairsθρίξN‑NFP τῆςof theArt‑GFS κεφαλῆςheadκεφαλήN‑GFS ὑμῶνof youσύPPro‑G2P πᾶσαιallπᾶςAdj‑NFP ἠρίθμηνται.have been numbered.ἀριθμέωV‑RIM⁞P‑3P 就是你們的頭髮,也都被數過了。 + +(58) 羅7:2 TheArt‑NFS γὰρforγάρConj ὕπανδροςmarriedὕπανδροςAdj‑NFS γυνὴwomanγυνήN‑NFS τῷto theArt‑DMS ζῶντιlivingζάωV‑PPA‑DMS ἀνδρὶhusbandἀνήρN‑DMS δέδεταιis boundδέωV‑RIM⁞P‑3S νόμῳ·by law;νόμοςN‑DMS 就如女人有了丈夫,丈夫還活著,就被律法約束; + +(59) 林前7:39 ΓυνὴA wifeγυνήN‑NFS δέδεταιis boundδέωV‑RIM⁞P‑3S ἐφ’forἐπίPrep ὅσονas long asὅσοςRelPro‑AMS χρόνονtimeχρόνοςN‑AMS ζῇmay liveζάωV‑PIA‑3S 丈夫活著的時候,妻子是被約束的; + +#### 2.3.5 現在完成式時態形式→無時間性的動作 (Perfect for timeless action) + +(60) 羅4:14 εἰIfεἰConj γὰρforγάρConj οἱthoseArt‑NMP ἐκofἐκPrep νόμου[the] Law [are]νόμοςN‑GMS κληρονόμοιheirsκληρονόμοςN‑NMP κεκένωταιhas been made voidκενόωV‑RIM⁞P‑3S -Art‑NFS πίστιςfaithπίστιςN‑NFS καὶandκαίConj κατήργηταιmade of no effectκαταργέωV‑RIM⁞P‑3S theArt‑NFS ἐπαγγελία·promise.ἐπαγγελίαN‑NFS 若是屬乎律法的人纔得為後嗣,信就歸於虛空,應許也就廢棄了。 + +(61) 羅13:8 the [one]Art‑NMS γὰρforγάρConj ἀγαπῶνlovingἀγαπάωV‑PPA‑NMS τὸνtheArt‑AMS ἕτερονotherἕτεροςAdj‑AMS νόμον[the] LawνόμοςN‑AMS πεπλήρωκεν.has fulfilled.πληρόωV‑RIA‑3S 因為愛人的就完全了律法。 + +雅2:10–11 ὍστιςWhoeverὅστιςRelPro‑NMS γὰρforγάρConj ὅλονallὅλοςAdj‑AMS τὸνtheArt‑AMS νόμονlawνόμοςN‑AMS τηρήσῃshall keepτηρέωV‑ASA‑3S πταίσῃshall stumbleπταίωV‑ASA‑3S δὲbutδέConj ἐνinἐνPrep ἑνίone [point]εἷςAdj‑DNS γέγονενhe has becomeγίνομαιV‑RIA‑3S πάντωνof allπᾶςAdj‑GNP ἔνοχος.guilty.ἔνοχοςAdj‑NMSεἰIfεἰConj δὲhoweverδέConj οὐnotοὐAdv μοιχεύειςyou do commit adulteryμοιχεύωV‑PIA‑2S φονεύειςdo commit murderφονεύωV‑PIA‑2S δέhoweverδέConj γέγοναςyou have becomeγίνομαιV‑RIA‑2S παραβάτηςa transgressorπαραβάτηςN‑NMS νόμου.of [the] law.νόμοςN‑GMS 因為凡遵守全律法的,只在一條上跌倒,他就是犯了眾條…你就是不姦淫,卻殺人,仍是成了犯律法的。 + +(62) 約一4:12 ΘεὸνGodθεόςN‑AMS οὐδεὶςno oneοὐδείςAdj‑NMS πώποτεat any timeπώποτεAdv τεθέαται·has seen;θεάομαιV‑RIM⁞P‑3S 從來沒有人見過神, + +#### 2.3.6 過去完成式時態形式 (Pluperfect tense-form) + +- 相較於現在式,不完成式傾向用來指過去發生的動作; +- 相較於現在完成式,過去完成式傾向用來指過去發生的動作。 + +(63) 可1:34 καὶAndκαίConj οὐκnotοὐAdv ἤφιενHe would allowἀφίημιV‑IIA‑3S λαλεῖνto speakλαλέωV‑PNA τὰtheArt‑ANP δαιμόνιαdemonsδαιμόνιονN‑ANP ὅτιbecauseὅτιConj ᾔδεισανthey knewεἴδωV‑LIA‑3P αὐτόν.Him.αὐτόςPPro‑AM3S 不許鬼說話,因為鬼認識他 + +(64) 路16:20 ΛάζαροςLazarusΛάζαροςN‑NMS ἐβέβλητοwas laidβάλλωV‑LIM⁞P‑3S πρὸςatπρόςPrep τὸνtheArt‑AMS πυλῶναgateπυλώνN‑AMS αὐτοῦof himαὐτόςPPro‑GM3S εἱλκωμένοςbeing full of soresἑλκόωV‑RPM⁞P‑NMS 拉撒路,渾身生瘡,被人放在財主門口 + +- 但在條件子句當中卻不是用來指過去發生的動作。 + +(65) 太12:7 ΕἰIfεἰConj δὲhoweverδέConj ἐγνώκειτεyou had knownγινώσκωV‑LIA‑2P τίwhatτίςIPro‑NNS ἐστινisεἰμίV‑PIA‑3S ‘ἜλεοςMercyἔλεοςN‑ANS θέλωI desireθέλωV‑PIA‑1S καὶandκαίConj οὐnotοὐAdv θυσίαν‚’sacrifice‚’θυσίαN‑AFS οὐκnotοὐAdv ἂν-ἄνPrtcl κατεδικάσατεyou would have condemnedκαταδικάζωV‑AIA‑2P τοὺςtheArt‑AMP ἀναιτίους.guiltless.ἀναίτιοςAdj‑AMP 我喜愛憐恤,不喜愛祭祀。你們若明白這話的意思,就不將無罪的當作有罪的了。 + +(66) 約8:19 εἰIfεἰConj ἐμὲMeἐγώPPro‑A1S ᾔδειτεyou had knownεἴδωV‑LIA‑2P καὶalsoκαίConj τὸνtheArt‑AMS ΠατέραFatherπατήρN‑AMS μουof MeἐγώPPro‑G1S ἂν-ἄνPrtcl ᾔδειτε.you would have known.εἴδωV‑LIA‑2P 若是認識我,也就認識我的父 + +### 2.4 未來式時態形式 (Future tense-forms) + +#### 2.4.1 引言 (Introduction) + +- 未來式時態形式的觀點與=表達對於動作的期待 (expectatoin),字形變化跟假設語氣很像,但比假設語氣多了點篤定。就觀點而論,未來式時態形式的觀點發育不全,無法跟其他三種觀點 (完整、不完整、狀態) 並論。 + +#### 2.4.2 未來式時態形式→前瞻性的動作 (Future for prospective action) + +(67) 太7:22 πολλοὶManyπολύςAdj‑NMP ἐροῦσίνwill sayἔρωV‑FIA‑3P μοιto MeἐγώPPro‑D1S ἐνinἐνPrep ἐκείνῃthatἐκεῖνοςDPro‑DFS τῇtheArt‑DFS ἡμέρᾳdayἡμέραN‑DFS 當那日必有許多人對我說 + +#### 2.4.3 未來式時態形式→指令性的動作 (Future for commanding action) + +(68) 太21:3 καὶAndκαίConj ἐάνifἐάνConj τιςanyoneτὶςIPro‑NMS ὑμῖνto youσύPPro‑D2P εἴπῃsaysἔπωV‑ASA‑3S τιanythingτὶςIPro‑ANS ἐρεῖτεyou will sayἔρωV‑FIA‑2P ὅτιthatὅτιConj theArt‑NMS ΚύριοςLordκύριοςN‑NMS αὐτῶνof themαὐτόςPPro‑GM3P χρείανneedχρείαN‑AFS ἔχει·has.ἔχωV‑PIA‑3S 若有人對你們說甚麼,你們就說:主要用牠 + +(69) 太27:4 λέγωνsayingλέγωV‑PPA‑NMS “ἭμαρτονI sinnedἀμαρτάνωV‑AIA‑1S παραδοὺςhaving betrayedπαραδίδωμιV‑APA‑NMS αἷμαbloodαἷμαN‑ANS ἀθῷον.innocent.ἄθωοςAdj‑ANS Οἱ-Art‑NMP δὲThenδέConj εἶπανthey saidἔπωV‑AIA‑3P “ΤίWhat [is that]τίςIPro‑NNS πρὸςtoπρόςPrep ἡμᾶς;us?ἐγώPPro‑A1P σὺYouσύPPro‑N2S ὄψῃ.will see.ὁράωV‑FIM‑2S 我賣了無辜之人的血是有罪了。他們說:那與我們有甚麼相干?你自己承當罷! + +#### 2.4.4 未來式時態形式→無時間性的動作 (Future for timeless action) + +(70) 太6:33 καὶandκαίConj τὴνtheArt‑AFS δικαιοσύνηνrighteousnessδικαιοσύνηN‑AFS αὐτοῦof HimαὐτόςPPro‑GM3S καὶandκαίConj ταῦταthese thingsοὗτοςDPro‑NNP πάνταallπᾶςAdj‑NNP προστεθήσεταιwill be addedπροστίθημιV‑FIP‑3S ὑμῖν.to you.σύPPro‑D2P 這些東西都要加給你們了 + +(71) 羅5:7 μόλιςRarelyμόλιςAdv γὰρindeedγάρConj ὑπὲρforὑπέρPrep δικαίουa righteous [man]δίκαιοςAdj‑GMS τιςanyoneτὶςIPro‑NMS ἀποθανεῖται·will die;ἀποθνήσκωV‑FIM‑3S 為義人死,是少有的; + +#### 2.4.5 未來式時態形式→任何時間的動作 (Future for omnitemporal action) + +(72) 可2:22 εἰifεἰConj δὲnowδέConj μήnotμήAdv ῥήξειwill burstῥήγνυμιV‑FIA‑3S theArt‑NMS οἶνοςwineοἶνοςN‑NMS τοὺςtheArt‑AMP ἀσκούςwineskinsἀσκόςN‑AMP 恐怕酒把皮袋裂開 + +(73) 羅7:3 ἄραThenἄραConj οὖνthereforeοὖνConj ζῶντοςbeing aliveζάωV‑PPA‑GMS τοῦtheArt‑GMS ἀνδρὸςhusbandἀνήρN‑GMS μοιχαλὶςan adulteressμοιχαλίςN‑NFS χρηματίσειshe will be calledχρηματίζωV‑FIA‑3S ἐὰνifἐάνConj γένηταιshe isγίνομαιV‑ASM‑3S ἀνδρὶto manἀνήρN‑DMS ἑτέρῳ·another;ἕτεροςAdj‑DMS 所以丈夫活著她若歸於別人,便叫淫婦 + +#### 2.4.6 未來式時態形式→評議性的動作 (Future for omnitemporal action) + +(74) 太21:37 ὝστερονAfterwardὕστερονAdv δὲthenδέConj ἀπέστειλενhe sentἀποστέλλωV‑AIA‑3S πρὸςtoπρόςPrep αὐτοὺςthemαὐτόςPPro‑AM3P τὸνtheArt‑AMS υἱὸνsonυἱόςN‑AMS αὐτοῦof himαὐτόςPPro‑GM3S λέγωνsayingλέγωV‑PPA‑NMS ‘ἘντραπήσονταιThey will respectἐντρέπωV‑FIP‑3P τὸνtheArt‑AMS υἱόνsonυἱόςN‑AMS μου.of me.ἐγώPPro‑G1S 後來打發他的兒子到他們那裡去,意思說:他們必尊敬我的兒子。 + +(75) 路9:57 εἶπένsaidἔπωV‑AIA‑3S τιςsomeoneτὶςIPro‑NMS πρὸςtoπρόςPrep αὐτόνHimαὐτόςPPro‑AM3S “ἈκολουθήσωI will followἀκολουθέωV‑FIA‑1S σοιYouσύPPro‑D2S ὅπουwhereverὅπουAdv ἐὰνifἐάνConj ἀπέρχῃ.You may go.ἀπέρχομαιV‑PSM⁞P‑2S 有一人對耶穌說:你無論往那裡去,我要跟從你。 + +- 未來式時態形式比假設語氣多了點篤定,對動作成就的期待更高。 + +(76) 太5:25 μή‿lestμήAdv ποτέeverπότεConj σεyouσύPPro‑A2S παραδῷdeliverπαραδίδωμιV‑ASA‑3S theArt‑NMS ἀντίδικοςaccuserἀντίδικοςN‑NMS τῷto theArt‑DMS κριτῇjudgeκριτήςN‑DMS καὶandκαίConj theArt‑NMS κριτὴςjudgeκριτήςN‑NMS τῷto theArt‑DMS ὑπηρέτῃofficerὑπηρέτηςN‑DMS καὶandκαίConj εἰςintoεἰςPrep φυλακὴνprisonφυλακήN‑AFS βληθήσῃ·you will be cast.βάλλωV‑FIP‑2S 恐怕他把你送給審判官,審判官交付衙役,你就下在監裡了。 + +(77) 路8:17 οὐNothingοὐAdv γάρforγάρConj ἐστινisεἰμίV‑PIA‑3S κρυπτὸνhiddenκρυπτόςAdj‑NNS whichὅςRelPro‑NNS οὐnotοὐAdv φανερὸνmanifestφανερόςAdj‑NNS γενήσεταιwill becomeγίνομαιV‑FIM‑3S οὐδὲnorοὐδέConj ἀπόκρυφονsecretἀπόκρυφοςAdj‑NNS whichὅςRelPro‑NNS οὐnothingοὐAdv μὴnotμήAdv γνωσθῇshall be knownγινώσκωV‑ASP‑3S 因為掩藏的事沒有不顯出來的;隱瞞的事沒有不…被人知道的。 + +## 3. 迂迴動詞的結構 (Periphrastic Verbal Constructions) + +### 3.1 迂迴動詞結構的組成元素 + +- 迂迴動詞=助動詞 εἰμί+分詞──兩者各有貢獻: + - a) 分詞的貢獻 ⇒ 語意 (semantics)、觀點 (aspect)、語態 (voice) + - b) εἰμί 的貢獻 ⇒ 語氣 (mood) +- 迂迴動詞與去掉助動詞 εἰμί 後的單純動詞意義相同,只是更加凸顯分詞。 +- 判斷迂迴動詞的關鍵:εἰμί 與分詞之間,除了分詞的補語、修飾詞之外,不能有別的字詞。 + +(78) 林後2:17 ΟὐNotοὐAdv γάρforγάρConj ἐσμενwe are‚εἰμίV‑PIA‑1P ὡςlikeὡςAdv οἱtheArt‑NMP πολλοὶmany‚πολύςAdj‑NMP καπηλεύοντεςpeddlingκαπηλεύωV‑PPA‑NMP τὸνtheArt‑AMS λόγονwordλόγοςN‑AMS τοῦ-Art‑GMS Θεοῦ‚of God;θεόςN‑GMS 我們不像那許多人,為利混亂神的道; 【Porter 認為不是迂迴動詞,不能翻譯成 “we are not peddling the word of God, as do many”,必須翻譯成 “we are not like many, pedding the word of God”;但 Wallace (GGBB, p. 648)、Robertson (GGNT, p. 881)、Long (BHGNT, p. 58) 卻認為是迂迴動詞 +迂迴結構=εἰμί +分詞 (前面不能有冠詞),焦點在分詞 (動作),εἰμί 只是進一步表達動作的觀點。 +但述語結構=εἰμί +冠詞+分詞 or εἰμί +分詞,焦點在 εἰμί ,是要對主語作進一步的說明、陳述。 +因此單看一個子句會覺得兩者很像,有些經文也很難分辨--但就 2Cor 2:17 來說,因為有 οὐ ἐσμεν ὡς ... ἀλλ᾿ ὡς .... (不是像...,而是像...) 的對比,所以 ὡς οἱ πολλοὶ 應該是修飾 εἰμί 才對。Porter 的理解可能比較好。。。 +補充:Opentext 的圖析,跟 Porter 書上相同; +Bibleworks 的圖析,就理解成是迂迴結構。】 + +(79) 路1:21 ΚαὶAndκαίConj ἦνwereεἰμίV‑IIA‑3S theArt‑NMS λαὸςpeopleλαόςN‑NMS προσδοκῶνexpectingπροσδοκάωV‑PPA‑NMS τὸν-Art‑AMS Ζαχαρίαν‚Zechariah‚ΖαχαρίαςN‑AMS καὶandκαίConj ἐθαύμαζονthey were wonderingθαυμάζωV‑IIA‑3P ἐνatἐνPrep τῷtheArt‑DNS χρονίζεινdelayingχρονίζωV‑PNA ἐνinἐνPrep τῷtheArt‑DMS ναῷtempleναόςN‑DMS αὐτόν.of him.αὐτόςPPro‑AM3S 百姓等候撒迦利亞,詫異他許久在殿裡。【Porter 認為不是迂迴動詞,不能翻譯成 “the people were expecting Zacharias”,必須翻譯成 “the people were there, expecing Zacharias”;但 Culy (BHGNT, p. 22) 卻認為是迂迴動詞】 + +(80) 西3:1 ΕἰIfεἰConj οὖνthenοὖνConj συνηγέρθητεyou have been raised withσυνεγείρωV‑AIP‑2P τῷ-Art‑DMS Χριστῷ‚Christ‚ΧριστόςN‑DMS τὰthe thingsArt‑ANP ἄνωaboveἄνωAdv ζητεῖτε‚seek‚ζητέωV‑PMA‑2P οὗwhereοὗAdv -Art‑NMS ΧριστόςChristΧριστόςN‑NMS ἐστινisεἰμίV‑PIA‑3S ἐνat [the]ἐνPrep δεξιᾷright handδεξιόςAdj‑DFS τοῦ-Art‑GMS Θεοῦof GodθεόςN‑GMS καθήμενος·sitting.κάθημαιV‑PPM⁞P‑NMS 所以,你們若真與基督一同復活,就當求在上面的事;那裡有基督坐在神的右邊。【如果「在神右邊」修飾助動詞 εἰμί,那就要翻譯成 “where Christ is at the right hand of God, seated”,強調基督或活之後回到之前的位置;如果「在神右邊」修飾助分詞 καθήμενος,那就變成迂迴結構,要翻譯成 “where Christ is, seated at the right hand of God”,強調基督坐著,暗指詩篇110:1。】 + +(81) 可1:13 καὶAndκαίConj ἦνHe wasεἰμίV‑IIA‑3S ἐνinἐνPrep τῇtheArt‑DFS ἐρήμῳwildernessἔρημοςAdj‑DFS τεσσεράκονταfortyτεσσαράκονταAdj‑AFP ἡμέραςdays‚ἡμέραN‑AFP πειραζόμενοςbeing temptedπειράζωV‑PPM⁞P‑NMS ὑπὸbyὑπόPrep τοῦ-Art‑GMS Σατανᾶ‚Satan.ΣατανᾶςN‑GMS 他在曠野四十天,受撒但的試探,並與野獸同在一處,且有天使來伺候他。【如果「在曠野四十天」修飾分詞 πειραζόμενος,那就變成迂迴結構,翻譯成 “he was being tempted in the desert for forty days”,代表耶穌整整被試探了四十天;如果「在曠野四十天」修飾助動詞 εἰμί,那就要翻譯成 “he was in the desert forty days, being tempted”,沒有明說耶穌被試探了多久。】 + +### 3.2 迂迴動詞的例子 + +#### 3.2.1 助動詞 εἰμί+現在式分詞 + +(82) 太1:23 καὶandκαίConj καλέσουσινthey will callκαλέωV‑FIA‑3P τὸtheArt‑ANS ὄνομαnameὄνομαN‑ANS αὐτοῦof HimαὐτόςPPro‑GM3S Ἐμμανουήλ‚”Immanuel‚”ἘμμανουήλN‑AMS whichὅςRelPro‑NNS ἐστινisεἰμίV‑PIA‑3S μεθερμηνευόμενονbeing translatedμεθερμηνεύωV‑PPM⁞P‑NNS “Μεθ’WithμετάPrep ἡμῶνusἐγώPPro‑G1P -Art‑NMS Θεός.God.θεόςN‑NMS 人要稱他的名為以馬內利。(以馬內利翻出來就是神與我們同在。) + +(83) 西2:5 ἀλλὰyetἀλλάConj τῷ-Art‑DNS πνεύματιin spiritπνεῦμαN‑DNS σὺνwithσύνPrep ὑμῖνyouσύPPro‑D2P εἰμιI amεἰμίV‑PIA‑1S χαίρωνrejoicingχαίρωV‑PPA‑NMS καὶandκαίConj βλέπωνseeingβλέπωV‑PPA‑NMS ὑμῶνyourσύPPro‑G2P τὴν-Art‑AFS τάξινgood orderτάξιςN‑AFS καὶandκαίConj τὸtheArt‑ANS στερέωμαfirmnessστερέωμαN‑ANS τῆςof theArt‑GFS εἰςinεἰςPrep ΧριστὸνChristΧριστόςN‑AMS πίστεωςfaithπίστιςN‑GFS ὑμῶν.of you.σύPPro‑G2P 心卻與你們同在,見你們循規蹈矩,信基督的心也堅固,我就歡喜了。 + +(84) 太7:29 ἦνHe wasεἰμίV‑IIA‑3S γὰρforγάρConj διδάσκωνteachingδιδάσκωV‑PPA‑NMS αὐτοὺςthemαὐτόςPPro‑AM3P ὡςasὡςAdv ἐξουσίανauthorityἐξουσίαN‑AFS ἔχωνhavingἔχωV‑PPA‑NMS 因為他教訓他們,正像有權柄的人 + +(85) 可9:4 καὶAndκαίConj ὤφθηappearedὁράωV‑AIP‑3S αὐτοῖςto themαὐτόςPPro‑DM3P ἨλίαςElijahἩλίαςN‑NMS σὺνwithσύνPrep ΜωϋσεῖMosesΜωσῆςN‑DMS καὶandκαίConj ἦσανthey wereεἰμίV‑IIA‑3P συλλαλοῦντες*talking withσυλλαλέωV‑PPA‑NMP τῷ-Art‑DMS Ἰησοῦ.Jesus.ἸησοῦςN‑DMS 忽然,有以利亞同摩西向他們顯現,並且和耶穌說話。 + +(86) 加1:22 ἤμηνI wasεἰμίV‑IIM‑1S δὲthenδέConj ἀγνοούμενοςunknownἀγνοέωV‑PPM⁞P‑NMS τῷ-Art‑DNS προσώπῳby faceπρόσωπονN‑DNS ταῖςto theArt‑DFP ἐκκλησίαιςchurchesἐκκλησίαN‑DFP τῆς-Art‑GFS Ἰουδαίαςof JudeaἸουδαίαN‑GFS ταῖςthat [are]Art‑DFP ἐνinἐνPrep Χριστῷ.Christ.ΧριστόςN‑DMS 那時,猶太信基督的各教會都沒有見過我的面。 + +(87) 林後5:19 ὡςhowὡςAdv ὅτιthatὅτιConj ΘεὸςGodθεόςN‑NMS ἦνwasεἰμίV‑IIA‑3S ἐνinἐνPrep ΧριστῷChristΧριστόςN‑DMS κόσμον[the] worldκόσμοςN‑AMS καταλλάσσωνreconcilingκαταλλάσσωV‑PPA‑NMS ἑαυτῷto HimselfἑαυτούRefPro‑DM3S 這就是神在基督裡,叫世人與自己和好【「在基督裡」也可修飾 εἰμί。】 + +(88) 太10:22 καὶAndκαίConj ἔσεσθεyou will beεἰμίV‑FIM‑2P μισούμενοιhatedμισέωV‑PPM⁞P‑NMP ὑπὸbyὑπόPrep πάντωνallπᾶςAdj‑GMP διὰon account ofδιάPrep τὸtheArt‑ANS ὄνομάnameὄνομαN‑ANS μου·of Me;ἐγώPPro‑G1S 並且你們要為我的名被眾人恨惡 + +(89) 路5:10 “ΜὴNotμήAdv φοβοῦ·fear;φοβέωV‑PMM⁞P‑2S ἀπὸfromἀπόPrep τοῦ-Art‑GMS νῦνnow onνῦνAdv ἀνθρώπουςmenἄνθρωποςN‑AMP ἔσῃyou will beεἰμίV‑FIM‑2S ζωγρῶν.catching.ζωγρέωV‑PPA‑NMS 不要怕!從今以後,你要得人了。 + +(90) 雅1:4 ἵναso thatἵναConj ἦτεyou may beεἰμίV‑PSA‑2P τέλειοιperfectτέλειοςAdj‑NMP καὶandκαίConj ὁλόκληροι‚complete‚ὁλόκληροςAdj‑NMP ἐνinἐνPrep μηδενὶnothingμηδείςAdj‑DNS λειπόμενοι.lacking.λείπωV‑PPM⁞P‑NMP 使你們成全、完備,毫無缺欠。【助動詞與分詞距離太遠,應該不是迂迴結構】 + +(91) 路19:17 ἴσθιto beεἰμίV‑PMA‑2S ἐξουσίανhaving authorityἐξουσίαN‑AFS ἔχωνyou areἔχωV‑PPA‑NMS ἐπάνωoverἐπάνωPrep δέκαtenδέκαAdj‑GFP πόλεων.cities.πόλιςN‑GFP 可以有權柄管十座城。 + +#### 3.2.2 助動詞 εἰμί+現在完成式分詞 + +(92) 太10:30 ὑμῶνOf youσύPPro‑G2P δὲnowδέConj καὶevenκαίConj αἱtheArt‑NFP τρίχεςhairsθρίξN‑NFP τῆςof theArt‑GFS κεφαλῆςheadκεφαλήN‑GFS πᾶσαιallπᾶςAdj‑NFP ἠριθμημέναιnumberedἀριθμέωV‑RPM⁞P‑NFP εἰσίν.are.εἰμίV‑PIA‑3P 就是你們的頭髮也都被數過了。 + +(93) 約2:17 ὅτιthatὅτιConj γεγραμμένονwrittenγράφωV‑RPM⁞P‑NNS ἐστίνit is:εἰμίV‑PIA‑3S 經上記著說 + +(94) 路4:16–17 ΚαὶAndκαίConj ἦλθενHe cameἔρχομαιV‑AIA‑3S εἰςtoεἰςPrep Ναζαρά‚Nazareth‚ΝαζαρέτN‑AFS οὗwhereοὗAdv ἦνHe had beenεἰμίV‑IIA‑3S τεθραμμένος‚brought up;τρέφωV‑RPM⁞P‑NMSεὗρενHe foundεὑρίσκωV‑AIA‑3S τὸνtheArt‑AMS τόπονplaceτόποςN‑AMS οὗwhereὅςAdv ἦνit wasεἰμίV‑IIA‑3S γεγραμμένονwritten:γράφωV‑RPM⁞P‑NNS 耶穌來到拿撒勒…找到一處寫著說: + +(95) 約19:11 “ΟὐκNotοὐAdv εἶχεςyou would haveἔχωV‑IIA‑2S ἐξουσίανauthorityἐξουσίαN‑AFS κατ’alsoκατάPrep ἐμοῦMeἐγώPPro‑G1S οὐδεμίανagainst‚οὐδείςAdj‑AFS εἰifεἰConj μὴnotμήAdv ἦνit wereεἰμίV‑IIA‑3S δεδομένονgivenδίδωμιV‑RPM⁞P‑NNS σοιto youσύPPro‑D2S ἄνωθεν·from above.ἄνωθενAdv 若不是從上頭賜給你的,你就毫無權柄辦我。 + +(96) 加2:11 κατὰtoκατάPrep πρόσωπονfaceπρόσωπονN‑ANS αὐτῷhisαὐτόςPPro‑DM3S ἀντέστην‚I opposed [him]‚ἀνθίστημιV‑AIA‑1S ὅτιbecauseὅτιConj κατεγνωσμένοςcondemnedκαταγινώσκωV‑RPM⁞P‑NMS ἦν.he stood.εἰμίV‑IIA‑3S 因他有可責之處,我就當面抵擋他。 + +(97) 太16:19 καὶandκαίConj whateverὅςRelPro‑ANS ἐὰνifἐάνConj δήσῃςyou might bindδέωV‑ASA‑2S ἐπὶonἐπίPrep τῆςtheArt‑GFS γῆςearth‚γῆN‑GFS ἔσταιwill beεἰμίV‑FIM‑3S δεδεμένονboundδέωV‑RPM⁞P‑NNS ἐνinἐνPrep τοῖςtheArt‑DMP οὐρανοῖς‚heavens;οὐρανόςN‑DMP καὶandκαίConj whateverὅςRelPro‑ANS ἐὰνifἐάνConj λύσῃςyou might looseλύωV‑ASA‑2S ἐπὶonἐπίPrep τῆςtheArt‑GFS γῆςearth‚γῆN‑GFS ἔσταιwill beεἰμίV‑FIM‑3S λελυμένονloosedλύωV‑RPM⁞P‑NNS ἐνinἐνPrep τοῖςtheArt‑DMP οὐρανοῖς.heavens.οὐρανόςN‑DMP 凡你在地上所捆綁的,在天上也要捆綁;凡你在地上所釋放的,在天上也要釋放。【神學爭議很大】 + +(98) 來2:13 “ἘγὼIἐγώPPro‑N1S ἔσομαιwill beεἰμίV‑FIM‑1S πεποιθὼςtrustingπείθωV‑RPA‑NMS ἐπ’inἐπίPrep αὐτῷ·”Him.”αὐτόςPPro‑DM3S 我要倚賴他; + +(99) 約3:27 “ΟὐNothingοὐAdv δύναταιis ableδύναμαιV‑PIM⁞P‑3S ἄνθρωποςa manἄνθρωποςN‑NMS λαμβάνεινto receive‚λαμβάνωV‑PNA ‹οὐδὲnothingοὐδέAdv ἓν›oneεἷςAdj‑ANS ἐὰνifἐάνConj μὴnotμήAdv it isεἰμίV‑PSA‑3S δεδομένονgivenδίδωμιV‑RPM⁞P‑NNS αὐτῷto himαὐτόςPPro‑DM3S ἐκfromἐκPrep τοῦ-Art‑GMS οὐρανοῦ.heaven.οὐρανόςN‑GMS 若不是從天上賜的,人就不能得甚麼 + +(100) 林後1:9 ἵναin order thatἵναConj μὴnotμήAdv πεποιθότεςtrustingπείθωV‑RPA‑NMP ὦμενwe should beεἰμίV‑PSA‑1P ἐφ’inἐπίPrep ἑαυτοῖςourselves‚ἑαυτούRefPro‑DM3P ἀλλ’butἀλλάConj ἐπὶinἐπίPrep τῷ-Art‑DMS ΘεῷGod‚θεόςN‑DMS τῷthe [One]Art‑DMS ἐγείροντιraisingἐγείρωV‑PPA‑DMS τοὺςtheArt‑AMP νεκρούς·dead‚νεκρόςAdj‑AMP 叫我們不靠自己,只靠叫死人復活的神。 + +(101) 弗4:18 ὄντες‚beingεἰμίV‑PPA‑NMP ἀπηλλοτριωμένοιalienated fromἀπαλλοτριόωV‑RPM⁞P‑NMP τῆςtheArt‑GFS ζωῆςlifeζωήN‑GFS τοῦ-Art‑GMS Θεοῦ‚of God‚θεόςN‑GMS 與神所賜的生命隔絕了 + +#### 3.2.3 助動詞 εἰμί+不定過去式分詞 + +- 新約希臘文極少出現,只有三處: + +(102) 路23:19 ὅστιςwhoὅστιςRelPro‑NMS ἦνwasεἰμίV‑IIA‑3S διὰon account ofδιάPrep στάσινinsurrectionστάσιςN‑AFS τινὰa certainτὶςIPro‑AFS γενομένηνhaving been madeγίνομαιV‑APM‑AFS ἐνinἐνPrep τῇtheArt‑DFS πόλειcity‚πόλιςN‑DFS καὶandκαίConj φόνονmurder‚φόνοςN‑AMS βληθεὶςhaving been castβάλλωV‑APP‑NMS ἐνintoἐνPrep τῇtheArt‑DFS φυλακῇ.prison.φυλακήN‑DFS 這巴拉巴是因在城裡作亂殺人,下在監裡的。 + +(103) Act8:13 -Art‑NMS δὲAndδέConj ΣίμωνSimonΣίμωνN‑NMS καὶalsoκαίConj αὐτὸςhimselfαὐτόςPPro‑NM3S ἐπίστευσεν‚believed‚πιστεύωV‑AIA‑3S καὶandκαίConj βαπτισθεὶςhaving been baptized‚βαπτίζωV‑APP‑NMS ἦνwasεἰμίV‑IIA‑3S προσκαρτερῶνsteadfastly continuingπροσκαρτερέωV‑PPA‑NMS τῷ-Art‑DMS Φιλίππῳ‚with Philip.ΦίλιπποςN‑DMS 西門自己也信了;既受了洗,就常與腓利在一處 + +(104) 林後5:19 ὡςhowὡςAdv ὅτιthatὅτιConj ΘεὸςGodθεόςN‑NMS ἦνwasεἰμίV‑IIA‑3S ἐνinἐνPrep ΧριστῷChristΧριστόςN‑DMS κόσμον[the] worldκόσμοςN‑AMS καταλλάσσωνreconcilingκαταλλάσσωV‑PPA‑NMS ἑαυτῷ‚to Himself‚ἑαυτούRefPro‑DM3S μὴnotμήAdv λογιζόμενοςreckoningλογίζομαιV‑PPM⁞P‑NMS αὐτοῖςto themαὐτόςPPro‑DM3P τὰtheArt‑ANP παραπτώματαtrespassesπαράπτωμαN‑ANP αὐτῶν‚of them‚αὐτόςPPro‑GM3P καὶandκαίConj θέμενοςhaving putτίθημιV‑APM‑NMS ἐνintoἐνPrep ἡμῖνusἐγώPPro‑D1P τὸνtheArt‑AMS λόγονwordλόγοςN‑AMS τῆς-Art‑GFS καταλλαγῆς.of reconciliation.καταλλαγήN‑GFS 這就是神在基督裡,叫世人與自己和好,不將他們的過犯歸到他們身上,並且將這和好的道理託付了我們 diff --git a/Porter-IGNT/IGNT-02.md b/Porter-IGNT/IGNT-02.md new file mode 100644 index 0000000..da619bd --- /dev/null +++ b/Porter-IGNT/IGNT-02.md @@ -0,0 +1,182 @@ +# 第二章 語氣和心態 (Mood and Attitude) + +## 前言 (Introduction) + +- 語氣 (mood):作者、說話者眼中動作與reality (現實、真實、實際情況) 之間的關係。換言之,語氣表達作者、說話者看待動作的心態 (attitude)。 +- 就動詞而言,語氣的重要性僅次於觀點。 +- 語氣分成兩大類:直說語氣 (indicative)、非直說語氣 (non-indicative)。 + +## 1. 直說語氣形式 (Indicative Mood Form) + +- 直說語氣≠客觀的事實。要說謊,通常會用直說語氣。 +- 直說語氣=沒有特別理由要用另外方式時所使用的正常語氣,既可用於陳述句,也能用於疑問句;既可用來表達事實,也能用來說謊。 +- 直說語氣:表達作者、說話者對於動作現況的陳述 (assertion)。 + +(1) 約13:21 ΤαῦταThese thingsοὗτοςDPro‑ANP εἰπὼνhaving saidἔπωV‑APA‑NMS ‹ὁ›-Art‑NMS ἸησοῦςJesusἸησοῦςN‑NMS ἐταράχθηwas troubledταράσσωV‑AIP‑3S τῷ-Art‑DNS πνεύματιin spiritπνεῦμαN‑DNS καὶandκαίConj ἐμαρτύρησενHe testifiedμαρτυρέωV‑AIA‑3S καὶandκαίConj εἶπενsaidἔπωV‑AIA‑3S 耶穌說了這話,心裡憂愁,就明說: + +(2) 可1:21 καὶandκαίConj εὐθὺςimmediatelyεὐθέωςAdv τοῖςon theArt‑DNP σάββασινSabbathsσάββατονN‑DNP εἰσελθὼνhaving enteredεἰσέρχομαιV‑APA‑NMS εἰςintoεἰςPrep τὴνtheArt‑AFS συναγωγὴνsynagogueσυναγωγήN‑AFS ἐδίδασκεν.He was teaching.διδάσκωV‑IIA‑3S 耶穌就在安息日進了會堂教訓人 + +(3) 羅1:8 ΠρῶτονFirstπρῶτονAdv‑S μὲνindeedμένConj εὐχαριστῶI thankεὐχαριστέωV‑PIA‑1S τῷtheArt‑DMS ΘεῷGodθεόςN‑DMS μουof meἐγώPPro‑G1S διὰthroughδιάPrep ἸησοῦJesusἸησοῦςN‑GMS ΧριστοῦChristΧριστόςN‑GMS περὶforπερίPrep πάντωνallπᾶςAdj‑GMP ὑμῶνof youσύPPro‑G2P 第一,我靠著耶穌基督,為你們眾人感謝我的神 + +(4) 約13:8 “ἘὰνIfἐάνConj μὴnotμήAdv νίψωI washνίπτωV‑ASA‑1S σεyouσύPPro‑A2S οὐκnotοὐAdv ἔχειςyou haveἔχωV‑PIA‑2S μέροςpartμέροςN‑ANS μετ’withμετάPrep ἐμοῦ.Me.ἐγώPPro‑G1S 我若不洗你,你就與我無分了。 + +(5) 可1:24 “ΤίWhatτίςIPro‑NNS ἡμῖνto usἐγώPPro‑D1P καὶandκαίConj σοίto YouσύPPro‑D2S ἸησοῦJesusἸησοῦςN‑VMS Ναζαρηνέ;of Nazareth?ΝαζαρηνόςN‑VMS ἦλθεςDid You comeἔρχομαιV‑AIA‑2S ἀπολέσαιto destroyἀπόλλυμιV‑ANA ἡμᾶς.us?ἐγώPPro‑A1P 拿撒勒人耶穌,我們與你有甚麼相干?你來滅我們麼? + +(6) 可5:35,39 “ἩTheArt‑NFS θυγάτηρdaughterθυγάτηρN‑NFS σουof YouσύPPro‑G2S ἀπέθανεν·is dead;ἀποθνήσκωV‑AIA‑3SτὸTheArt‑NNS παιδίονchildπαιδίονN‑NNS οὐκnotοὐAdv ἀπέθανενis dead‚ἀποθνήσκωV‑AIA‑3S 你的女兒死了…孩子不是死了…【各自主觀的陳述,與客觀事實無關】 + +## 2. 非直說語氣形式 (Non-Indicative Mood Form) + +- 非直說語氣包括:命令語氣 (Imperative)、假設語氣 (Subjunctive)、祈願語氣 (Optative)、未來式 (Future)。 +- 非直說語氣:表達作者、說話者對於動作的預期 (projection)。 + +### 2.1 命令語氣 (Imperative) + +- 命令語氣通常用來引導別人的行動。 + +#### 2.1.1 動作與觀點 (Action and Aspect) + +- 傳統文法認為:不定過去式命令語氣 (aorist imperative) 代表瞬間的 (instantaneous)、只此一次的 (once for all)、不是現在發生的動作;現在式命令語氣 (present imperative) 代表持續的 (continual)、習慣的 (habitual)、重複的 (repeated)、或正在進行的 (ongoing) 動作──這樣的說法不正確。 + +(7) 路19:13 ‘ΠραγματεύσασθεDo businessπραγματεύομαιV‑AMM‑2P ἐνuntilἐνPrep thatὅςRelPro‑DMS ἔρχομαι.I come back.ἔρχομαιV‑PIM⁞P‑1S 你們去作生意,直等我回來。【aorist 表達持續的動作】 + +(8) 林後13:11-12 χαίρετεrejoice!χαίρωV‑PMA‑2P καταρτίζεσθεBe perfectedκαταρτίζωV‑PMM⁞P‑2P παρακαλεῖσθεbe exhortedπαρακαλέωV‑PMM⁞P‑2P τὸ[be of] theArt‑ANS αὐτὸsameαὐτόςPPro‑AN3S φρονεῖτεmindφρονέωV‑PMA‑2P εἰρηνεύετεbe at peace.εἰρηνεύωV‑PMA‑2PἈσπάσασθεGreetἀσπάζομαιV‑AMM‑2P ἀλλήλουςone anotherἀλλήλωνRecPro‑AMP ἐνwithἐνPrep ἁγίῳa holyἅγιοςAdj‑DNS φιλήματι.kiss.φίλημαN‑DNS 願弟兄們都喜樂。要作完全人;要受安慰;要同心合意;要彼此和睦…你們親嘴問安,彼此務要聖潔。【就時間來看,present、aorist imperative沒有區別】 + +(9) 弗5:18 καὶAndκαίConj μὴnotμήAdv μεθύσκεσθεto be drunkμεθύσκωV‑PMM⁞P‑2P οἴνῳwith wineοἶνοςN‑DMS ἐνinἐνPrep whichὅςRelPro‑DMS ἐστινisεἰμίV‑PIA‑3S ἀσωτίαdebauchery.ἀσωτίαN‑NFS ἀλλὰInsteadἀλλάConj πληροῦσθεbe filledπληρόωV‑PMM⁞P‑2P ἐνwithἐνPrep Πνεύματι[the] SpiritπνεῦμαN‑DNS 不要醉酒,酒能使人放蕩;乃要被聖靈充滿。【照傳統文法,就要誤會以弗所教會習慣醉酒 ☹】 + +- 反之,改採觀點模式就能克服以上難題。 + +(10) 彼前2:17 ΠάνταςEveryoneπᾶςAdj‑AMP τιμήσατεhonor:τιμάωV‑AMA‑2P τὴνTheArt‑AFS ἀδελφότηταbrotherhoodἀδελφότηςN‑AFS ἀγαπᾶτεloveἀγαπάωV‑PMA‑2P τὸν-Art‑AMS ΘεὸνGodθεόςN‑AMS φοβεῖσθεfearφοβέωV‑PMM⁞P‑2P τὸνtheArt‑AMS βασιλέαkingβασιλεύςN‑AMS τιμᾶτε.honor.τιμάωV‑PMA‑2P 務要尊敬眾人,親愛教中的弟兄,敬畏神,尊敬君王。【aorist=整體、總結;三個 present=提點、聚焦】 + +(11) 太5:44 ἐγὼIἐγώPPro‑N1S δὲhoweverδέConj λέγωsayλέγωV‑PIA‑1S ὑμῖνto youσύPPro‑D2P ἀγαπᾶτεloveἀγαπάωV‑PMA‑2P τοὺςtheArt‑AMP ἐχθροὺςenemiesἐχθρόςAdj‑AMP ὑμῶνof youσύPPro‑G2P καὶandκαίConj προσεύχεσθεprayπροσεύχομαιV‑PMM⁞P‑2P ὑπὲρforὑπέρPrep τῶνthoseArt‑GMP διωκόντωνpersecutingδιώκωV‑PPA‑GMP ὑμᾶς·youσύPPro‑A2P 只是我告訴你們,要愛你們的仇敵,為那逼迫你們的禱告。【用 present 引導門徒開始行動】 + +(12) 雅1:21 ἐνinἐνPrep πραΰτητιhumilityπραΰτηςN‑DFS δέξασθεreceiveδέχομαιV‑AMM‑2P τὸνtheArt‑AMS ἔμφυτονimplantedἔμφυτοςAdj‑AMS λόγονwordλόγοςN‑AMS 存溫柔的心領受那所栽種的道 【動作已經展開】 + +(13) 可4:39 “ΣιώπαSilenceσιωπάωV‑PMA‑2S πεφίμωσο.be still.φιμόωV‑RMM⁞P‑2S καὶAndκαίConj ἐκόπασενabatedκοπάζωV‑AIA‑3S theArt‑NMS ἄνεμοςwindἄνεμοςN‑NMS καὶandκαίConj ἐγένετοthere wasγίνομαιV‑AIM‑3S γαλήνηa calmγαλήνηN‑NFS μεγάλη.great.μέγαςAdj‑NFS 住了罷!靜了罷!風就止住,大大的平靜了。 + +(14) 徒15:29 ἐξFromἐκPrep ὧνtheseὅςRelPro‑GNP διατηροῦντεςkeepingδιατηρέωV‑PPA‑NMP ἑαυτοὺςyourselvesἑαυτούRefPro‑AM3P εὖwellεὖAdv πράξετε.you will do.πράσσωV‑FIA‑2P Ἔρρωσθε.Farewell.ῥώννυμιV‑RMM⁞P‑2P 這幾件你們若能自己禁戒不犯就好了。願你們平安!【標準希臘書信結尾】 + +#### 2.1.2 第二、三人稱命令語氣 (Second and third person Imperative) + +- 第二人稱的翻譯跟英文類似,但第三人稱卻需要加上表達許可含意的「讓…」(let ... )。但這是為了翻譯成英文才有的,不是希臘文本身就有的。第三人稱命令語氣指揮別人的口氣,跟第二人稱同樣強烈。 + +- Wallace 建議把第三人稱命令語氣翻譯成:he must …、I command him to … (GGBB, 486)。 + +(15) 太6:6 εἴσελθεenterεἰσέρχομαιV‑AMA‑2S εἰςintoεἰςPrep τὸtheArt‑ANS ταμεῖόνroomταμεῖονN‑ANS σουof youσύPPro‑G2S καὶandκαίConjπρόσευξαιprayπροσεύχομαιV‑AMM‑2S τῷtoArt‑DMS ΠατρίFatherπατήρN‑DMS σουof youσύPPro‑G2S τῷthe [One]Art‑DMS ἐνinἐνPrep τῷ-Art‑DNS κρυπτῷ·secret.κρυπτόςAdj‑DNS 要進你的內屋…禱告你在暗中的父; + +(16) 雅1:2 ΠᾶσανAllπᾶςAdj‑AFS χαρὰνjoyχαράN‑AFS ἡγήσασθεesteem [it]ἡγέομαιV‑AMM‑2P ἀδελφοίbrothersἀδελφόςN‑VMP μουof meἐγώPPro‑G1S ὅτανwhenὅτανConj πειρασμοῖςtrialsπειρασμόςN‑DMP περιπέσητεyou might fall intoπεριπίπτωV‑ASA‑2P ποικίλοιςvariousποικίλοςAdj‑DMP 我的弟兄們,你們落在百般試煉中,都要以為大喜樂; + +(17) 羅6:12 ΜὴNotμήAdv οὖνthereforeοὖνConj βασιλευέτωlet reignβασιλεύωV‑PMA‑3S -Art‑NFS ἁμαρτίαsinἀμαρτίαN‑NFS ἐνinἐνPrep τῷtheArt‑DNS θνητῷmortalθνητόςAdj‑DNS ὑμῶνof youσύPPro‑G2P σώματιbodyσῶμαN‑DNS 所以,不要容罪在你們必死的身上作王 + +(18) 路16:29 ΛέγειSaysλέγωV‑PIA‑3S δὲhoweverδέConj ἈβραάμAbrahamἈβραάμN‑NMS ‘ἜχουσιThey haveἔχωV‑PIA‑3P ΜωϋσέαMosesΜωσῆςN‑AMS καὶandκαίConj τοὺςtheArt‑AMP προφήτας·prophets;προφήτηςN‑AMP ἀκουσάτωσανlet them hearἀκούωV‑AMA‑3P αὐτῶν.them.αὐτόςPPro‑GM3P 亞伯拉罕說:他們有摩西和先知的話可以聽從。 + +- 現在式的 [PMA-2P] 和 [PIA-2P] 字形相同,要靠上下文來判定──除非遇到否定 (命令語氣用 µή;直說語氣用 οὐ)。 + +(19) 羅6:22 νυνὶNowνυνίAdv δέhoweverδέConj ἐλευθερωθέντεςhaving been set freeἐλευθερόωV‑APP‑NMP ἀπὸfromἀπόPrep τῆς-Art‑GFS ἁμαρτίαςsinἀμαρτίαN‑GFS δουλωθέντεςhaving become slavesδουλόωV‑APP‑NMP δὲnowδέConj τῷ-Art‑DMS Θεῷto GodθεόςN‑DMS ἔχετεyou haveἔχωV‑PIA‑2P τὸνtheArt‑AMS καρπὸνfruitκαρπόςN‑AMS ὑμῶνof youσύPPro‑G2P εἰςuntoεἰςPrep ἁγιασμόνsanctification;ἁγιασμόςN‑AMS τὸ-Art‑ANS δὲnowδέConj τέλοςthe endτέλοςN‑ANS ζωὴν[is] lifeζωήN‑AFS αἰώνιον.eternal.αἰώνιοςAdj‑AFS 但現今,你們既從罪裡得了釋放,作了神的奴僕,就有成聖的果子,那結局就是永生。【有──直說?命令?】 + +- ἴδε [AMA-2S]、ἰδού[AMM-2S] 其實是 ὁράω [PIA-1S] 的命令語氣,但在新約已經是固定的用法,當作感歎詞 (interjection) 用。 + +#### 2.1.3 命令與禁令 (Commands and prohibitions) + +- 現在式命令語氣:用於命令 (command),加上μή變成禁令 (prohibition)。 +- 不定過去式命令語氣:用於命令 (command),加上 μή 變成禁令的僅限於第三人稱 (只有八處:太6:3; 24:17, 8; 可13:15[2x], 16; 路17:31[2x])。【p.59 「但簡單過去式命令語氣卻僅限於禁令。」──翻譯錯誤】 +- 要表達第二人稱禁令則用:μή+不定過去式假設語氣。 + +(20) 可9:25 “Τὸ-Art‑VNS ἄλαλονMuteἄλαλοςAdj‑VNS καὶandκαίConj κωφὸνdeafκωφόςAdj‑VNS πνεῦμαspiritπνεῦμαN‑VNS ἐγὼIἐγώPPro‑N1S ἐπιτάσσωcommandἐπιτάσσωV‑PIA‑1S σοιyouσύPPro‑D2S ἔξελθεcomeἐξέρχομαιV‑AMA‑2S ἐξout ofἐκPrep αὐτοῦhimαὐτόςPPro‑GM3S καὶandκαίConj μηκέτιno moreμηκέτιAdv εἰσέλθῃςmay you enterεἰσέρχομαιV‑ASA‑2S εἰςintoεἰςPrep αὐτόν.him.αὐτόςPPro‑AM3S 你這聾啞的鬼,我吩咐你從他裡頭出來,再不要進去!【命令語氣:來;假設語氣:進入 (禁令)】 + +(21) 太6:19 ΜὴNotμήAdv θησαυρίζετεstore upθησαυρίζωV‑PMA‑2P ὑμῖνfor yourselvesσύPPro‑D2P θησαυροὺςtreasuresθησαυρόςN‑AMP 不要為自己積攢財寶 + +(22) 西2:21 “ΜὴNotμήAdv ἅψῃyou should handle!ἅπτομαιV‑ASM‑2S μηδὲNotμηδέConj γεύσῃyou should taste!γεύομαιV‑ASM‑2S μηδὲNotμηδέConj θίγῃςyou should touch!θιγγάνωV‑ASA‑2S 不可拿、不可嘗、不可摸 + +(23) 太24:17-18 the [one]Art‑NMS ἐπὶonἐπίPrep τοῦtheArt‑GNS δώματοςhousetopδῶμαN‑GNS μὴnotμήAdv καταβάτωlet him come downκαταβαίνωV‑AMA‑3S ἆραιto takeαἴρωV‑ANA τὰanythingArt‑ANP ἐκout ofἐκPrep τῆςtheArt‑GFS οἰκίαςhouseοἰκίαN‑GFS αὐτοῦof him;αὐτόςPPro‑GM3S καὶandκαίConj the [one]Art‑NMS ἐνinἐνPrep τῷtheArt‑DMS ἀγρῷfieldἀγρόςN‑DMS μὴneitherμήAdv ἐπιστρεψάτωlet him returnἐπιστρέφωV‑AMA‑3S ὀπίσωbackὀπίσωAdv ἆραιto takeαἴρωV‑ANA τὸtheArt‑ANS ἱμάτιονcloakἱμάτιονN‑ANS αὐτοῦ.of him.αὐτόςPPro‑GM3S 在房上的,不要下來拿家裡的東西;在田裡的,也不要回去取衣裳。 + +### 2.2 假設語氣 (Subjunctive) + +- 假設語氣用來表達「預期」(projection),可用於:獨立子句、從屬子句 (表達:目的、結果、條件)。 + +#### 2.2.1 動詞觀點 (Verbal Aspect) + +(24) 可9:37 “ὋςWhoeverὅςRelPro‑NMS ἂν-ἄνPrtcl ἓνoneεἷςAdj‑ANS τῶν-Art‑GNP τοιούτωνof suchτοιοῦτοςDPro‑GNP παιδίωνlittle childrenπαιδίονN‑GNP δέξηταιshall receiveδέχομαιV‑ASM‑3S ἐπὶinἐπίPrep τῷtheArt‑DNS ὀνόματίnameὄνομαN‑DNS μουof MeἐγώPPro‑G1S ἐμὲMeἐγώPPro‑A1S δέχεται·receives;δέχομαιV‑PIM⁞P‑3S καὶandκαίConj ὃςwhoeverὅςRelPro‑NMS ἂν-ἄνPrtcl ἐμὲMeἐγώPPro‑A1S δέχηταιshall receiveδέχομαιV‑PSM⁞P‑3S οὐκnotοὐAdv ἐμὲMeἐγώPPro‑A1S δέχεταιreceivesδέχομαιV‑PIM⁞P‑3S ἀλλὰbutἀλλάConj τὸνthe [One]Art‑AMS ἀποστείλαντάhaving sentἀποστέλλωV‑APA‑AMS με.Me.ἐγώPPro‑A1S 凡為我名接待一個像這小孩子的,就是接待我;凡接待我的,不是接待我,乃是接待那差我來的。【兩個條件子句的 δέχομαι 從 aorist 換成 present,差別在於觀點】 + +#### 2.2.2 否定的簡單過去式假設語氣(Negated aorist subjunctive) + +- 第二人稱禁令:要用「否定的簡單過去式假設語氣」,來代替「否定的簡單過去式命令語氣」。 + +(25) 太5:36μήτεNeitherμήτεConj ἐνbyἐνPrep τῇtheArt‑DFS κεφαλῇheadκεφαλήN‑DFS σουof youσύPPro‑G2S ὀμόσῃςshall you swearὀμνύωV‑ASA‑2S 又不可指著你的頭起誓 + +(26) 提前5:1 ΠρεσβυτέρῳAn elderπρεσβύτεροςAdj‑DMS‑C μὴnotμήAdv ἐπιπλήξῃςdo rebukeἐπιπλήσσωV‑ASA‑2S ἀλλὰbutἀλλάConj παρακάλειexhort [him]παρακαλέωV‑PMA‑2S ὡςasὡςAdv πατέραa father;πατήρN‑AMS 不可嚴責老年人,只要勸他如同父親【禁令:用否定的簡單過去式假設語氣;命令:用命令語氣】 + +(27) 太5:17 ΜὴNotμήAdv νομίσητεthinkνομίζωV‑ASA‑2P ὅτιthatὅτιConj ἦλθονI have comeἔρχομαιV‑AIA‑1S καταλῦσαιto abolishκαταλύωV‑ANA τὸνtheArt‑AMS νόμονlawνόμοςN‑AMS orConj τοὺςtheArt‑AMP προφήτας·Prophets;προφήτηςN‑AMP οὐκnotοὐAdv ἦλθονI have comeἔρχομαιV‑AIA‑1S καταλῦσαιto abolishκαταλύωV‑ANA ἀλλὰbutἀλλάConj πληρῶσαι·to fulfill.πληρόωV‑ANA 莫想我來要廢掉律法和先知。我來不是要廢掉,乃是要成全。 + +(28) 太10:9 ΜὴNeitherμήAdv κτήσησθεtake alongκτάομαιV‑ASM‑2P χρυσὸνgoldχρυσόςN‑AMS μηδὲnorμηδέConj ἄργυρονsilverἄργυροςN‑AMS μηδὲnorμηδέConj χαλκὸνcopperχαλκόςN‑AMS εἰςinεἰςPrep τὰςtheArt‑AFP ζώναςbeltsζώνηN‑AFP ὑμῶνof youσύPPro‑G2P 腰袋裡不要帶金銀銅錢。 + +#### 2.2.3 命令和禁令 (Commands and prohibitions) + +- 第一人稱假設語氣又稱為「勸勉的假設語氣」(horatory subjunctive)。用於肯定句時表達「讓我這麼作吧」,用於疑問句時則是「我該這麼作嗎?」。 +- 單數「勸勉的假設語氣」比較少見。 + +(29) 路6:42 ‘ἈδελφέBrotherἀδελφόςN‑VMS ἄφεςlet [that]ἀφίημιV‑AMA‑2S ἐκβάλωI might cast outἐκβάλλωV‑ASA‑1S τὸtheArt‑ANS κάρφοςsplinterκάρφοςN‑ANS τὸthat [is]Art‑ANS ἐνinἐνPrep τῷtheArt‑DMS ὀφθαλμῷeyeὀφθαλμόςN‑DMS σουof youσύPPro‑G2S 容我去掉你眼中的刺 + +(30) 約19:15 “ΤὸνTheArt‑AMS ΒασιλέαKingβασιλεύςN‑AMS ὑμῶνof youσύPPro‑G2P σταυρώσω;shall I crucify?σταυρόωV‑ASA‑1S 我可以把你們的王釘十字架麼? + +(31) 徒7:34καὶandκαίConj νῦνnowνῦνAdv δεῦροcomeδεῦροAdv ἀποστείλωI will sendἀποστέλλωV‑ASA‑1S σεyouσύPPro‑A2S εἰςtoεἰςPrep Αἴγυπτον.’Egypt.’ΑἴγυπτοςN‑AFS 來!我要差你往埃及去 + +- 複數「勸勉的假設語氣」比較常見,為了激勵聽眾思考、參與。 + +(32) 路2:15 “ΔιέλθωμενLet us go throughδιέρχομαιV‑ASA‑1P δὴindeedδήPrtcl ἕωςas far asἕωςPrep ΒηθλεὲμBethlehemΒηθλεέμN‑GFS καὶandκαίConj ἴδωμενlet us seeὁράωV‑ASA‑1P τὸtheArt‑ANS ῥῆμαwordῥήμαN‑ANS τοῦτοthisοὗτοςDPro‑ANS τὸthatArt‑ANS γεγονὸςhas come to passγίνομαιV‑RPA‑ANS 我們往伯利恆去,看看所成的事 + +(33) 路15:23 καὶandκαίConj φέρετεhaving broughtφέρωV‑PMA‑2P τὸνtheArt‑AMS μόσχονcalfμόσχοςN‑AMS τὸν-Art‑AMS σιτευτόνfattenedσιτευτόςAdj‑AMS θύσατεkill [it]θύωV‑AMA‑2P καὶandκαίConj φαγόντεςhaving eatenφάγωV‑APA‑NMP εὐφρανθῶμενlet us be merry.εὐφραίνωV‑ASP‑1P 把那肥牛犢牽來宰了,我們可以吃喝快樂; + +(34) 羅5:1 ΔικαιωθέντεςHaving been justifiedδικαιόωV‑APP‑NMP οὖνthereforeοὖνConj ἐκbyἐκPrep πίστεωςfaithπίστιςN‑GFS εἰρήνηνpeaceεἰρήνηN‑AFS ἔχωμενwe haveἔχωV‑PSA‑1P πρὸςwithπρόςPrep τὸν-Art‑AMS ΘεὸνGodθεόςN‑AMS διὰthroughδιάPrep τοῦtheArt‑GMS ΚυρίουLordκύριοςN‑GMS ἡμῶνof usἐγώPPro‑G1P ἸησοῦJesusἸησοῦςN‑GMS ΧριστοῦChristΧριστόςN‑GMS 我們既因信稱義,就藉著我們的主耶穌基督得與神相和。 + +(35) 羅6:1ΤίWhatτίςIPro‑ANS οὖνthenοὖνConj ἐροῦμεν;will we say?ἔρωV‑FIA‑1P ἐπιμένωμενShall we continueἐπιμένωV‑PSA‑1P τῇ-Art‑DFS ἁμαρτίᾳin sinἀμαρτίαN‑DFS ἵναthatἵναConj -Art‑NFS χάριςgraceχάριςN‑NFS πλεονάσῃ;may abound?πλεονάζωV‑ASA‑3S 這樣怎麼說呢?我們可以仍在罪中、叫恩典顯多麼?【保羅說反話】 + +(36) 來4:1 ΦοβηθῶμενWe should fearφοβέωV‑ASP‑1P οὖνthereforeοὖνConj μήlestμήAdv ποτεeverπότεConjδοκῇshould seemδοκέωV‑PSA‑3S τιςanyτὶςIPro‑NMS ἐξofἐκPrep ὑμῶνyouσύPPro‑G2P ὑστερηκέναι.to have fallen short.ὑστερέωV‑RNA 就當畏懼,免得你們中間或有人似乎是趕不上了 + +(37) 來6:1 ΔιὸThereforeδιόConjἐπὶtoἐπίPrep τὴν-Art‑AFS τελειότηταmaturityτελειότηςN‑AFS φερώμεθαwe should go onφέρωV‑PSM⁞P‑1P 所以,我們應當…竭力進到完全的地步 + +(38) 太6:31 ΜὴNotμήAdv οὖνthereforeοὖνConj μεριμνήσητεbe anxiousμεριμνάωV‑ASA‑2P λέγοντες·sayingλέγωV‑PPA‑NMP ‘ΤίWhatτίςIPro‑ANS φάγωμεν;shall we eat?φάγωV‑ASA‑1P ἤ·OrConj ‘ΤίwhatτίςIPro‑ANS πίωμεν;shall we drink?πίνωV‑ASA‑1P ἤ·OrConj ‘ΤίwhatτίςIPro‑ANS περιβαλώμεθα;shall we wear?περιβάλλωV‑ASM‑1P 所以,不要憂慮說:吃甚麼?喝甚麼?穿甚麼? + +(39) 可12:14 ἔξεστινIs it lawfulἔξεστιV‑PIA‑3S δοῦναιto giveδίδωμιV‑ANA κῆνσονtributeκῆνσοςN‑AMS Καίσαριto CaesarΚαίσαρN‑DMS orConj οὔ;not?οὐAdv δῶμενShould we payδίδωμιV‑ASA‑1P orConj μὴnotμήAdv δῶμεν;pay?δίδωμιV‑ASA‑1P 納稅給該撒可以不可以? + +(40) 林前16:11 μήNotμήAdv τιςanyoneτὶςIPro‑NMS οὖνthereforeοὖνConj αὐτὸνhimαὐτόςPPro‑AM3S ἐξουθενήσῃ.should despise.ἐξουθενέωV‑ASA‑3S 所以,無論誰都不可藐視他 + +#### 2.2.4 假設語氣的強烈否定 (Emphatic negation of the subjunctive) + +- 通常用 οὐ μή 表示強烈否定。 + +(41) Mat5:20 λέγωI sayλέγωV‑PIA‑1S γὰρforγάρConj ὑμῖνto you‚σύPPro‑D2P ὅτιthatὅτιConj ἐὰνifἐάνConj μὴnotμήAdv περισσεύσῃshall aboundπερισσεύωV‑ASA‑3S ὑμῶνyourσύPPro‑G2P -Art‑NFS δικαιοσύνηrighteousnessδικαιοσύνηN‑NFS πλεῖονabove [that]πλείωνAdj‑ANS‑C τῶνof theArt‑GMP γραμματέωνscribesγραμματεύςN‑GMP καὶandκαίConj Φαρισαίων‚Pharisees‚ΦαρισαῖοςN‑GMP οὐnoοὐAdv μὴnotμήAdv εἰσέλθητεshall you enterεἰσέρχομαιV‑ASA‑2P εἰςintoεἰςPrep τὴνtheArt‑AFS βασιλείανkingdomβασιλείαN‑AFS τῶνof theArt‑GMP οὐρανῶν.heavens.οὐρανόςN‑GMP 我告訴你們,你們的義若不勝於文士和法利賽人的義,斷不能進天國。 + +(42) Mat5:26 ἀμὴνTrulyἀμήνHeb λέγωI sayλέγωV‑PIA‑1S σοι‚to you‚σύPPro‑D2S οὐnoοὐAdv μὴnotμήAdv ἐξέλθῃςshall you come outἐξέρχομαιV‑ASA‑2S ἐκεῖθενfrom there‚ἐκεῖθενAdv ἕωςuntilἕωςConj ἂν-ἄνPrtcl ἀποδῷςyou should payἀποδίδωμιV‑ASA‑2S τὸνtheArt‑AMS ἔσχατονlastἔσχατοςAdj‑AMS κοδράντην.kodranten!κοδράντηςN‑AMS 我實在告訴你,若有一文錢沒有還清,你斷不能從那裡出來。 + +(43) 來13:5 αὐτὸςHe HimselfαὐτόςPPro‑NM3S γὰρforγάρConj εἴρηκενhas said:ἔρωV‑RIA‑3S “ΟὐNeverοὐAdv μήnotμήAdv σεyouσύPPro‑A2S ἀνῶwill I leaveἀνίημιV‑ASA‑1S οὐδ’norοὐδέConj οὐneverοὐAdv μήnotμήAdv σεyouσύPPro‑A2S ἐγκαταλίπω·”will I forsake.”ἐγκαταλείπωV‑ASA‑1S 因為主曾說:我總不撇下你,也不丟棄你。 + +### 2.3 祈願語氣 (Optative) + +- 祈願語氣跟假設語氣非常相似,只不過多了一點距離 (remote)、模糊 (vague)、不確定 (less assured)、看情況而定 (contigent) 的感覺。 + +#### 2.3.1 意志的用法 (Volitive usage) + +(44) 可11:14 “ΜηκέτιNo moreμηκέτιAdv εἰςtoεἰςPrep τὸνtheArt‑AMS αἰῶναageαἰώνN‑AMS ἐκofἐκPrep σοῦyouσύPPro‑G2S μηδεὶςno oneμηδείςAdj‑NMS καρπὸνfruitκαρπόςN‑AMS φάγοι.may eat.φάγωV‑AOA‑3S 從今以後,永沒有人吃你的果子。 + +(45) Phm1:20 Ναί‚Yes‚ναίPrtcl ἀδελφέ‚brother‚ἀδελφόςN‑VMS ἐγώIἐγώPPro‑N1S σουfrom youσύPPro‑G2S ὀναίμηνmay have profitὀνίνημιV‑AOM‑1S ἐνinἐνPrep Κυρίῳ·[the] Lord.κύριοςN‑DMS ἀνάπαυσόνRefreshἀναπαύωV‑AMA‑2S μουmyἐγώPPro‑G1S τὰ-Art‑ANP σπλάγχναheartσπλάγχνονN‑ANP ἐνinἐνPrep Χριστῷ.Christ.ΧριστόςN‑DMS 兄弟阿,望你使我在主裡因你得快樂(或作:益處)並望你使我的心在基督裡得暢快。 + +(46) 彼前1:2ΧάριςGraceχάριςN‑NFS ὑμῖνto youσύPPro‑D2P καὶandκαίConj εἰρήνηpeaceεἰρήνηN‑NFS πληθυνθείη.may be multiplied.πληθύνωV‑AOP‑3S 願恩惠、平安多多的加給你們 + +#### 2.3.2 評議的用法 (Deliberative usage) + +(47) 徒8:31 “ΠῶςHowπῶςAdv γὰρforγάρConj ἂν-ἄνPrtcl δυναίμηνcould I be ableδύναμαιV‑POM⁞P‑1S ἐὰνifἐάνConj μήnotμήAdv τιςsomeoneτὶςIPro‑NMS ὁδηγήσειwill guideὁδηγέωV‑FIA‑3S με;me?ἐγώPPro‑A1S 沒有人指教我,怎能明白呢? + +(48) 徒26:29 -Art‑NMS δὲAndδέConj ΠαῦλοςPaul [said]ΠαῦλοςN‑NMS “ΕὐξαίμηνI would wishεὔχομαιV‑AOM‑1S ἂν-ἄνPrtcl τῷ-Art‑DMS Θεῷto GodθεόςN‑DMSοὐnotοὐAdv μόνονonlyμόνονAdv σὲyouσύPPro‑A2S ἀλλὰbutἀλλάConj καὶalsoκαίConj πάνταςallπᾶςAdj‑AMP τοὺςthoseArt‑AMP ἀκούοντάςhearingἀκούωV‑PPA‑AMP μουmeἐγώPPro‑G1S σήμερονthis dayσήμερονAdv γενέσθαιto becomeγίνομαιV‑ANM τοιούτουςsuchτοιοῦτοςDPro‑AMP ὁποῖοςasὁποῖοςRelPro‑NMS καὶalsoκαίConj ἐγώIἐγώPPro‑N1S εἰμιamεἰμίV‑PIA‑1S παρεκτὸςexceptπαρεκτόςPrep τῶνtheArt‑GMP δεσμῶνchainsδεσμόνN‑GMP τούτων.these.οὗτοςDPro‑GMP 保羅說:…我向神所求的,不但你一個人,就是今天一切聽我的,都要像我一樣,只是不要像我有這些鎖鍊。 + +#### 2.3.3 πρὶν ἤ (在…以前) + +- 祈願語氣跟在 πρὶν ἤ 後面──古典希臘文的用法,新約只有兩處。 + +(49) 徒7:2 TheArt‑NMS ΘεὸςGodθεόςN‑NMS τῆς-Art‑GFS δόξηςof gloryδόξαN‑GFS ὤφθηappearedὁράωV‑AIP‑3S τῷto theArt‑DMS πατρὶfatherπατήρN‑DMS ἡμῶνof usἐγώPPro‑G1P ἈβραὰμAbrahamἈβραάμN‑DMS ὄντιbeingεἰμίV‑PPA‑DMS ἐνinἐνPrep τῇ-Art‑DFS ΜεσοποταμίᾳMesopotamiaΜεσοποταμίαN‑DFS πρὶνbeforeπρίνAdv ratherConj κατοικῆσαιdwellingκατοικέωV‑ANA αὐτὸνhisαὐτόςPPro‑AM3S ἐνinἐνPrep ΧαρράνHaranΧαρῥάνN‑DFS 當日我們的祖宗亞伯拉罕在米所波大米還未住哈蘭的時候,榮耀的神向他顯現【Porter 認為 κατοικῆσαι 也可當作祈願語氣】 + +(50) 徒25:16 πρὸςtoπρόςPrep οὓςwhomὅςRelPro‑AMP ἀπεκρίθηνI answeredἀποκρίνομαιV‑AIP‑1S ὅτιthatὅτιConj οὐκnotοὐAdv ἔστινit isεἰμίV‑PIA‑3S ἔθος[the] customἔθοςN‑NNS Ῥωμαίοιςwith RomansῬωμαῖοςAdj‑DMP χαρίζεσθαίto give upχαρίζομαιV‑PNM⁞P τιναanyτὶςIPro‑AMS ἄνθρωπονmanἄνθρωποςN‑AMS πρὶνbeforeπρίνAdv thatConj the [one]Art‑NMS κατηγορούμενοςbeing accusedκατηγορέωV‑PPM⁞P‑NMS κατὰtoκατάPrep πρόσωπονfaceπρόσωπονN‑ANS ἔχοιmay have [it]ἔχωV‑POA‑3S τοὺςtheArt‑AMP κατηγόρουςaccusersκατήγοροςN‑AMP τόπον[the] opportunityτόποςN‑AMS τεandτέConj ἀπολογίαςof defenseἀπολογίαN‑GFS λάβοιhe may haveλαμβάνωV‑AOA‑3S περὶconcerningπερίPrep τοῦtheArt‑GNS ἐγκλήματος.accusation.ἔγκλημαN‑GNS 我對他們說,無論甚麼人,被告還沒有和原告對質,未得機會分訴所告他的事,就先定他的罪,這不是羅馬人的條例。 + +### 2.4 未來式 (Future) + + + diff --git a/Porter-IGNT/IGNT-03.md b/Porter-IGNT/IGNT-03.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-04.md b/Porter-IGNT/IGNT-04.md new file mode 100644 index 0000000..d4d5c03 --- /dev/null +++ b/Porter-IGNT/IGNT-04.md @@ -0,0 +1,40 @@ +### 2.1.2 + 約5:1 ΜετὰAfterμετάPREP ταῦταthese thingsοὗτοςD-APN ἦνthere wasεἰμίV-IAI-3S ἑορτὴa feastἑορτήN-NSF τῶνof theT-GPM ἸουδαίωνJews‚ἸουδαῖοςA-GPM-PG καὶandκαίCONJ ἀνέβηwent upἀναβαίνωV-2AAI-3S ἸησοῦςJesusἸησοῦςN-NSM-P εἰςtoεἰςPREP Ἱεροσόλυμα.¶Jerusalem.ἹεροσόλυμαN-APN-L 這事以後,到了猶太人的一個節期,耶穌就上耶路撒冷去。 約5:2 ἜστινThere isεἰμίV-PAI-3S δὲnowδέCONJ ἐνinἐνPREP τοῖςT-DPN ἹεροσολύμοιςJerusalemἹεροσόλυμαN-DPN-L ἐπὶbyἐπίPREP τῇtheT-DSF προβατικῇSheep GateπροβατικόςA-DSF κολυμβήθραa pool‚κολυμβήθραN-NSF T-NSF ἐπιλεγομένηcalledἐπιλέγωV-PPP-NSF Ἑβραϊστὶin HebrewἙβραϊστίADV ΒηθζαθάBethesda‚ΒηθεσδάN-NSF-L πέντεfiveπέντεA-APF-NUI στοὰςporchesστοάN-APF ἔχουσα.having.ἔχωV-PAP-NSF 在耶路撒冷,靠近羊門有一個池子,希伯來話叫作畢士大,旁邊有五個廊子; 約5:3 ἐνInἐνPREP ταύταιςtheseοὗτοςD-DPF κατέκειτοwere lyingκατάκειμαιV-INI-3S πλῆθοςa multitudeπλῆθοςN-NSN τῶνof thoseT-GPM ἀσθενούντων‚ailing‚ἀσθενέωV-PAP-GPM τυφλῶν‚blind‚τυφλόςA-GPM χωλῶν‚lame‚χωλόςA-GPM ξηρῶν.paralyzed.ξηρόςA-GPM 裡面躺著瞎眼的、瘸腿的、血氣枯乾的許多病人。(有古卷在此有:等候水動; + + 約5:1 ΜετὰAfterμετάPREP ταῦταthese thingsοὗτοςD-APN ἦνthere wasεἰμίV-IAI-3S ἑορτὴa feastἑορτήN-NSF τῶνof theT-GPM ἸουδαίωνJews‚ἸουδαῖοςA-GPM-PG καὶandκαίCONJ ἀνέβηwent upἀναβαίνωV-2AAI-3S ἸησοῦςJesusἸησοῦςN-NSM-P εἰςtoεἰςPREP Ἱεροσόλυμα.¶Jerusalem.ἹεροσόλυμαN-APN-L 這事以後,到了猶太人的一個節期,耶穌就上耶路撒冷去。 約5:2 ἜστινThere isεἰμίV-PAI-3S δὲnowδέCONJ ἐνinἐνPREP τοῖςT-DPN ἹεροσολύμοιςJerusalemἹεροσόλυμαN-DPN-L ἐπὶbyἐπίPREP τῇtheT-DSF προβατικῇSheep GateπροβατικόςA-DSF κολυμβήθραa pool‚κολυμβήθραN-NSF T-NSF ἐπιλεγομένηcalledἐπιλέγωV-PPP-NSF Ἑβραϊστὶin HebrewἙβραϊστίADV ΒηθζαθάBethesda‚ΒηθεσδάN-NSF-L πέντεfiveπέντεA-APF-NUI στοὰςporchesστοάN-APF ἔχουσα.having.ἔχωV-PAP-NSF 在耶路撒冷,靠近羊門有一個池子,希伯來話叫作畢士大,旁邊有五個廊子; 約5:3 ἐνInἐνPREP ταύταιςtheseοὗτοςD-DPF κατέκειτοwere lyingκατάκειμαιV-INI-3S πλῆθοςa multitudeπλῆθοςN-NSN τῶνof thoseT-GPM ἀσθενούντων‚ailing‚ἀσθενέωV-PAP-GPM τυφλῶν‚blind‚τυφλόςA-GPM χωλῶν‚lame‚χωλόςA-GPM ξηρῶν.paralyzed.ξηρόςA-GPM 裡面躺著瞎眼的、瘸腿的、血氣枯乾的許多病人。(有古卷在此有:等候水動; + + + + 約5:1 ΜετὰAfterμετάPREP ταῦταthese thingsοὗτοςD-APN ἦνthere wasεἰμίV-IAI-3S ἑορτὴa feastἑορτήN-NSF τῶνof theT-GPM ἸουδαίωνJews‚ἸουδαῖοςA-GPM-PG καὶandκαίCONJ ἀνέβηwent upἀναβαίνωV-2AAI-3S ἸησοῦςJesusἸησοῦςN-NSM-P εἰςtoεἰςPREP Ἱεροσόλυμα.¶Jerusalem.ἹεροσόλυμαN-APN-L 這事以後,到了猶太人的一個節期,耶穌就上耶路撒冷去。 約5:2 ἜστινThere isεἰμίV-PAI-3S δὲnowδέCONJ ἐνinἐνPREP τοῖςT-DPN ἹεροσολύμοιςJerusalemἹεροσόλυμαN-DPN-L ἐπὶbyἐπίPREP τῇtheT-DSF προβατικῇSheep GateπροβατικόςA-DSF κολυμβήθραa pool‚κολυμβήθραN-NSF T-NSF ἐπιλεγομένηcalledἐπιλέγωV-PPP-NSF Ἑβραϊστὶin HebrewἙβραϊστίADV ΒηθζαθάBethesda‚ΒηθεσδάN-NSF-L πέντεfiveπέντεA-APF-NUI στοὰςporchesστοάN-APF ἔχουσα.having.ἔχωV-PAP-NSF 在耶路撒冷,靠近羊門有一個池子,希伯來話叫作畢士大,旁邊有五個廊子; 約5:3 ἐνInἐνPREP ταύταιςtheseοὗτοςD-DPF κατέκειτοwere lyingκατάκειμαιV-INI-3S πλῆθοςa multitudeπλῆθοςN-NSN τῶνof thoseT-GPM ἀσθενούντων‚ailing‚ἀσθενέωV-PAP-GPM τυφλῶν‚blind‚τυφλόςA-GPM χωλῶν‚lame‚χωλόςA-GPM ξηρῶν.paralyzed.ξηρόςA-GPM 裡面躺著瞎眼的、瘸腿的、血氣枯乾的許多病人。(有古卷在此有:等候水動; + + + + 約5:1 ΜετὰAfterμετάPREP ταῦταthese thingsοὗτοςD-APN ἦνthere wasεἰμίV-IAI-3S ἑορτὴa feastἑορτήN-NSF τῶνof theT-GPM ἸουδαίωνJews‚ἸουδαῖοςA-GPM-PG καὶandκαίCONJ ἀνέβηwent upἀναβαίνωV-2AAI-3S ἸησοῦςJesusἸησοῦςN-NSM-P εἰςtoεἰςPREP Ἱεροσόλυμα.¶Jerusalem.ἹεροσόλυμαN-APN-L 這事以後,到了猶太人的一個節期,耶穌就上耶路撒冷去。 約5:2 ἜστινThere isεἰμίV-PAI-3S δὲnowδέCONJ ἐνinἐνPREP τοῖςT-DPN ἹεροσολύμοιςJerusalemἹεροσόλυμαN-DPN-L ἐπὶbyἐπίPREP τῇtheT-DSF προβατικῇSheep GateπροβατικόςA-DSF κολυμβήθραa pool‚κολυμβήθραN-NSF T-NSF ἐπιλεγομένηcalledἐπιλέγωV-PPP-NSF Ἑβραϊστὶin HebrewἙβραϊστίADV ΒηθζαθάBethesda‚ΒηθεσδάN-NSF-L πέντεfiveπέντεA-APF-NUI στοὰςporchesστοάN-APF ἔχουσα.having.ἔχωV-PAP-NSF 在耶路撒冷,靠近羊門有一個池子,希伯來話叫作畢士大,旁邊有五個廊子; 約5:3 ἐνInἐνPREP ταύταιςtheseοὗτοςD-DPF κατέκειτοwere lyingκατάκειμαιV-INI-3S πλῆθοςa multitudeπλῆθοςN-NSN τῶνof thoseT-GPM ἀσθενούντων‚ailing‚ἀσθενέωV-PAP-GPM τυφλῶν‚blind‚τυφλόςA-GPM χωλῶν‚lame‚χωλόςA-GPM ξηρῶν.paralyzed.ξηρόςA-GPM 裡面躺著瞎眼的、瘸腿的、血氣枯乾的許多病人。(有古卷在此有:等候水動; + + + + 約5:1 ΜετὰAfterμετάPREP ταῦταthese thingsοὗτοςD-APN ἦνthere wasεἰμίV-IAI-3S ἑορτὴa feastἑορτήN-NSF τῶνof theT-GPM ἸουδαίωνJews‚ἸουδαῖοςA-GPM-PG καὶandκαίCONJ ἀνέβηwent upἀναβαίνωV-2AAI-3S ἸησοῦςJesusἸησοῦςN-NSM-P εἰςtoεἰςPREP Ἱεροσόλυμα.¶Jerusalem.ἹεροσόλυμαN-APN-L 這事以後,到了猶太人的一個節期,耶穌就上耶路撒冷去。 約5:2 ἜστινThere isεἰμίV-PAI-3S δὲnowδέCONJ ἐνinἐνPREP τοῖςT-DPN ἹεροσολύμοιςJerusalemἹεροσόλυμαN-DPN-L ἐπὶbyἐπίPREP τῇtheT-DSF προβατικῇSheep GateπροβατικόςA-DSF κολυμβήθραa pool‚κολυμβήθραN-NSF T-NSF ἐπιλεγομένηcalledἐπιλέγωV-PPP-NSF Ἑβραϊστὶin HebrewἙβραϊστίADV ΒηθζαθάBethesda‚ΒηθεσδάN-NSF-L πέντεfiveπέντεA-APF-NUI στοὰςporchesστοάN-APF ἔχουσα.having.ἔχωV-PAP-NSF 在耶路撒冷,靠近羊門有一個池子,希伯來話叫作畢士大,旁邊有五個廊子; 約5:3 ἐνInἐνPREP ταύταιςtheseοὗτοςD-DPF κατέκειτοwere lyingκατάκειμαιV-INI-3S πλῆθοςa multitudeπλῆθοςN-NSN τῶνof thoseT-GPM ἀσθενούντων‚ailing‚ἀσθενέωV-PAP-GPM τυφλῶν‚blind‚τυφλόςA-GPM χωλῶν‚lame‚χωλόςA-GPM ξηρῶν.paralyzed.ξηρόςA-GPM 裡面躺著瞎眼的、瘸腿的、血氣枯乾的許多病人。(有古卷在此有:等候水動; + + +### 2.1.3 + 約5:1 ΜετὰAfterμετάPREP ταῦταthese thingsοὗτοςD-APN ἦνthere wasεἰμίV-IAI-3S ἑορτὴa feastἑορτήN-NSF τῶνof theT-GPM ἸουδαίωνJews‚ἸουδαῖοςA-GPM-PG καὶandκαίCONJ ἀνέβηwent upἀναβαίνωV-2AAI-3S ἸησοῦςJesusἸησοῦςN-NSM-P εἰςtoεἰςPREP Ἱεροσόλυμα.¶Jerusalem.ἹεροσόλυμαN-APN-L 這事以後,到了猶太人的一個節期,耶穌就上耶路撒冷去。 約5:2 ἜστινThere isεἰμίV-PAI-3S δὲnowδέCONJ ἐνinἐνPREP τοῖςT-DPN ἹεροσολύμοιςJerusalemἹεροσόλυμαN-DPN-L ἐπὶbyἐπίPREP τῇtheT-DSF προβατικῇSheep GateπροβατικόςA-DSF κολυμβήθραa pool‚κολυμβήθραN-NSF T-NSF ἐπιλεγομένηcalledἐπιλέγωV-PPP-NSF Ἑβραϊστὶin HebrewἙβραϊστίADV ΒηθζαθάBethesda‚ΒηθεσδάN-NSF-L πέντεfiveπέντεA-APF-NUI στοὰςporchesστοάN-APF ἔχουσα.having.ἔχωV-PAP-NSF 在耶路撒冷,靠近羊門有一個池子,希伯來話叫作畢士大,旁邊有五個廊子; 約5:3 ἐνInἐνPREP ταύταιςtheseοὗτοςD-DPF κατέκειτοwere lyingκατάκειμαιV-INI-3S πλῆθοςa multitudeπλῆθοςN-NSN τῶνof thoseT-GPM ἀσθενούντων‚ailing‚ἀσθενέωV-PAP-GPM τυφλῶν‚blind‚τυφλόςA-GPM χωλῶν‚lame‚χωλόςA-GPM ξηρῶν.paralyzed.ξηρόςA-GPM 裡面躺著瞎眼的、瘸腿的、血氣枯乾的許多病人。(有古卷在此有:等候水動; + + 約5:1 ΜετὰAfterμετάPREP ταῦταthese thingsοὗτοςD-APN ἦνthere wasεἰμίV-IAI-3S ἑορτὴa feastἑορτήN-NSF τῶνof theT-GPM ἸουδαίωνJews‚ἸουδαῖοςA-GPM-PG καὶandκαίCONJ ἀνέβηwent upἀναβαίνωV-2AAI-3S ἸησοῦςJesusἸησοῦςN-NSM-P εἰςtoεἰςPREP Ἱεροσόλυμα.¶Jerusalem.ἹεροσόλυμαN-APN-L 這事以後,到了猶太人的一個節期,耶穌就上耶路撒冷去。 約5:2 ἜστινThere isεἰμίV-PAI-3S δὲnowδέCONJ ἐνinἐνPREP τοῖςT-DPN ἹεροσολύμοιςJerusalemἹεροσόλυμαN-DPN-L ἐπὶbyἐπίPREP τῇtheT-DSF προβατικῇSheep GateπροβατικόςA-DSF κολυμβήθραa pool‚κολυμβήθραN-NSF T-NSF ἐπιλεγομένηcalledἐπιλέγωV-PPP-NSF Ἑβραϊστὶin HebrewἙβραϊστίADV ΒηθζαθάBethesda‚ΒηθεσδάN-NSF-L πέντεfiveπέντεA-APF-NUI στοὰςporchesστοάN-APF ἔχουσα.having.ἔχωV-PAP-NSF 在耶路撒冷,靠近羊門有一個池子,希伯來話叫作畢士大,旁邊有五個廊子; 約5:3 ἐνInἐνPREP ταύταιςtheseοὗτοςD-DPF κατέκειτοwere lyingκατάκειμαιV-INI-3S πλῆθοςa multitudeπλῆθοςN-NSN τῶνof thoseT-GPM ἀσθενούντων‚ailing‚ἀσθενέωV-PAP-GPM τυφλῶν‚blind‚τυφλόςA-GPM χωλῶν‚lame‚χωλόςA-GPM ξηρῶν.paralyzed.ξηρόςA-GPM 裡面躺著瞎眼的、瘸腿的、血氣枯乾的許多病人。(有古卷在此有:等候水動; + + + + 約5:1 ΜετὰAfterμετάPREP ταῦταthese thingsοὗτοςD-APN ἦνthere wasεἰμίV-IAI-3S ἑορτὴa feastἑορτήN-NSF τῶνof theT-GPM ἸουδαίωνJews‚ἸουδαῖοςA-GPM-PG καὶandκαίCONJ ἀνέβηwent upἀναβαίνωV-2AAI-3S ἸησοῦςJesusἸησοῦςN-NSM-P εἰςtoεἰςPREP Ἱεροσόλυμα.¶Jerusalem.ἹεροσόλυμαN-APN-L 這事以後,到了猶太人的一個節期,耶穌就上耶路撒冷去。 約5:2 ἜστινThere isεἰμίV-PAI-3S δὲnowδέCONJ ἐνinἐνPREP τοῖςT-DPN ἹεροσολύμοιςJerusalemἹεροσόλυμαN-DPN-L ἐπὶbyἐπίPREP τῇtheT-DSF προβατικῇSheep GateπροβατικόςA-DSF κολυμβήθραa pool‚κολυμβήθραN-NSF T-NSF ἐπιλεγομένηcalledἐπιλέγωV-PPP-NSF Ἑβραϊστὶin HebrewἙβραϊστίADV ΒηθζαθάBethesda‚ΒηθεσδάN-NSF-L πέντεfiveπέντεA-APF-NUI στοὰςporchesστοάN-APF ἔχουσα.having.ἔχωV-PAP-NSF 在耶路撒冷,靠近羊門有一個池子,希伯來話叫作畢士大,旁邊有五個廊子; 約5:3 ἐνInἐνPREP ταύταιςtheseοὗτοςD-DPF κατέκειτοwere lyingκατάκειμαιV-INI-3S πλῆθοςa multitudeπλῆθοςN-NSN τῶνof thoseT-GPM ἀσθενούντων‚ailing‚ἀσθενέωV-PAP-GPM τυφλῶν‚blind‚τυφλόςA-GPM χωλῶν‚lame‚χωλόςA-GPM ξηρῶν.paralyzed.ξηρόςA-GPM 裡面躺著瞎眼的、瘸腿的、血氣枯乾的許多病人。(有古卷在此有:等候水動; + + + + + 約5:1 ΜετὰAfterμετάPREP ταῦταthese thingsοὗτοςD-APN ἦνthere wasεἰμίV-IAI-3S ἑορτὴa feastἑορτήN-NSF τῶνof theT-GPM ἸουδαίωνJews‚ἸουδαῖοςA-GPM-PG καὶandκαίCONJ ἀνέβηwent upἀναβαίνωV-2AAI-3S ἸησοῦςJesusἸησοῦςN-NSM-P εἰςtoεἰςPREP Ἱεροσόλυμα.¶Jerusalem.ἹεροσόλυμαN-APN-L 這事以後,到了猶太人的一個節期,耶穌就上耶路撒冷去。 約5:2 ἜστινThere isεἰμίV-PAI-3S δὲnowδέCONJ ἐνinἐνPREP τοῖςT-DPN ἹεροσολύμοιςJerusalemἹεροσόλυμαN-DPN-L ἐπὶbyἐπίPREP τῇtheT-DSF προβατικῇSheep GateπροβατικόςA-DSF κολυμβήθραa pool‚κολυμβήθραN-NSF T-NSF ἐπιλεγομένηcalledἐπιλέγωV-PPP-NSF Ἑβραϊστὶin HebrewἙβραϊστίADV ΒηθζαθάBethesda‚ΒηθεσδάN-NSF-L πέντεfiveπέντεA-APF-NUI στοὰςporchesστοάN-APF ἔχουσα.having.ἔχωV-PAP-NSF 在耶路撒冷,靠近羊門有一個池子,希伯來話叫作畢士大,旁邊有五個廊子; 約5:3 ἐνInἐνPREP ταύταιςtheseοὗτοςD-DPF κατέκειτοwere lyingκατάκειμαιV-INI-3S πλῆθοςa multitudeπλῆθοςN-NSN τῶνof thoseT-GPM ἀσθενούντων‚ailing‚ἀσθενέωV-PAP-GPM τυφλῶν‚blind‚τυφλόςA-GPM χωλῶν‚lame‚χωλόςA-GPM ξηρῶν.paralyzed.ξηρόςA-GPM 裡面躺著瞎眼的、瘸腿的、血氣枯乾的許多病人。(有古卷在此有:等候水動; + + + + + 約5:1 ΜετὰAfterμετάPREP ταῦταthese thingsοὗτοςD-APN ἦνthere wasεἰμίV-IAI-3S ἑορτὴa feastἑορτήN-NSF τῶνof theT-GPM ἸουδαίωνJews‚ἸουδαῖοςA-GPM-PG καὶandκαίCONJ ἀνέβηwent upἀναβαίνωV-2AAI-3S ἸησοῦςJesusἸησοῦςN-NSM-P εἰςtoεἰςPREP Ἱεροσόλυμα.¶Jerusalem.ἹεροσόλυμαN-APN-L 這事以後,到了猶太人的一個節期,耶穌就上耶路撒冷去。 約5:2 ἜστινThere isεἰμίV-PAI-3S δὲnowδέCONJ ἐνinἐνPREP τοῖςT-DPN ἹεροσολύμοιςJerusalemἹεροσόλυμαN-DPN-L ἐπὶbyἐπίPREP τῇtheT-DSF προβατικῇSheep GateπροβατικόςA-DSF κολυμβήθραa pool‚κολυμβήθραN-NSF T-NSF ἐπιλεγομένηcalledἐπιλέγωV-PPP-NSF Ἑβραϊστὶin HebrewἙβραϊστίADV ΒηθζαθάBethesda‚ΒηθεσδάN-NSF-L πέντεfiveπέντεA-APF-NUI στοὰςporchesστοάN-APF ἔχουσα.having.ἔχωV-PAP-NSF 在耶路撒冷,靠近羊門有一個池子,希伯來話叫作畢士大,旁邊有五個廊子; 約5:3 ἐνInἐνPREP ταύταιςtheseοὗτοςD-DPF κατέκειτοwere lyingκατάκειμαιV-INI-3S πλῆθοςa multitudeπλῆθοςN-NSN τῶνof thoseT-GPM ἀσθενούντων‚ailing‚ἀσθενέωV-PAP-GPM τυφλῶν‚blind‚τυφλόςA-GPM χωλῶν‚lame‚χωλόςA-GPM ξηρῶν.paralyzed.ξηρόςA-GPM 裡面躺著瞎眼的、瘸腿的、血氣枯乾的許多病人。(有古卷在此有:等候水動; + + + +### 2.1.4 \ No newline at end of file diff --git a/Porter-IGNT/IGNT-05.md b/Porter-IGNT/IGNT-05.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-06.md b/Porter-IGNT/IGNT-06.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-07.md b/Porter-IGNT/IGNT-07.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-08.md b/Porter-IGNT/IGNT-08.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-09.md b/Porter-IGNT/IGNT-09.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-10.md b/Porter-IGNT/IGNT-10.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-11.md b/Porter-IGNT/IGNT-11.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-12.md b/Porter-IGNT/IGNT-12.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-13.md b/Porter-IGNT/IGNT-13.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-14.md b/Porter-IGNT/IGNT-14.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-15.md b/Porter-IGNT/IGNT-15.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-16.md b/Porter-IGNT/IGNT-16.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-17.md b/Porter-IGNT/IGNT-17.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-18.md b/Porter-IGNT/IGNT-18.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-19.md b/Porter-IGNT/IGNT-19.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-20.md b/Porter-IGNT/IGNT-20.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT-21.md b/Porter-IGNT/IGNT-21.md new file mode 100644 index 0000000..e69de29 diff --git a/Porter-IGNT/IGNT.md b/Porter-IGNT/IGNT.md new file mode 100644 index 0000000..98b273b --- /dev/null +++ b/Porter-IGNT/IGNT.md @@ -0,0 +1,30 @@ +# Idioms of the Greek New Testament (IGNT)
‖ 新約希臘文的慣用語 (慣用語) + 封面 | 書目 + --------- | ---------- +![](images/IGNT-cover.png) |Porter, Stanley E. *Idioms of the Greek New Testament*. Second edition with corrections. Sheffield, U.K.: Sheffield Academic, 1994. +![](images/IGNT-封面.png)| 斯丹利‧波特(Stanley E. Porter)。《新約希臘文的慣用語》。葉雅蓮譯。台北市:中華福音神學院,2013。| + +- [前言 (Introduction)](IGNT-00.md) +- [第一章 時態和觀點,以及迂迴結構 (Tenseand Aspct, and Periphrastic Construcions)](IGNT-01.md) +- [第二章 語氣和心態 (Mood and Attitude)](IGNT-02.md) +- [第三章 語態、數和人稱 (Voice, Number and Person)](IGNT-03.md) +- [第四章 格與性 (Cases and Gender)](IGNT-04.md) +- [第五章 冠詞 (the Article)](IGNT-05.md) +- [第六章 形容詞 (Adjectives)](IGNT-06.md) +- [第七章 副詞 (Adverbs)](IGNT-07.md) +- [第八章 代名詞 (Pronouns)](IGNT-08.md) +- [第九章 介系詞 (Prepositions)](IGNT-09.md) +- [第十章 分詞 (Participles)](IGNT-10.md) +- [第十一章 不定詞 (Infinitives)](IGNT-11.md) +- [第十二章 語助詞 (Particles) & 連接詞 (Conjunctions)](IGNT-12.md) +- [第十三章 命令和禁止](IGNT-13.md) +- [第十四章 從屬子句 (Depent Clauses)](IGNT-14.md) +- [第十五章 關係子句 (Relative Clauses)](IGNT-15.md) +- [第十六章 ῷᾗᾗᾧῷ條件句 (Conditional Sentences)](IGNT-16.md) +- [第十七章 間接引述 (Indirect Discourse)](IGNT-17.md) +- [第十八章 疑問句 (Questions)](IGNT-18.md) +- [第十九章 否定 (Negation)](IGNT-19.md) +- [第二十章 字序與子句結構 (Word Order and Clause Structure)](IGNT-20.md) +- [第二十一章 篇章、論述分析 (Discourse Analysis)](IGNT-21.md) + +## 簡介 \ No newline at end of file diff --git a/Syntax/$3b.md b/Syntax/$3b.md new file mode 100644 index 0000000..e69de29 diff --git a/Syntax/IG4E.md b/Syntax/IG4E.md new file mode 100644 index 0000000..e7bb33f --- /dev/null +++ b/Syntax/IG4E.md @@ -0,0 +1,602 @@ +# 全民希臘文進階句法 (IG4E–Syntax)
Intermediate Greek for Everyone — Syntax + + +- Part I—希臘文基礎 + - Chapter 1: 希臘文源流 §1 + - 希臘文歷史 §1a + - 閃語對聖經希臘文的影響 §1b + - 耶穌也說希臘文 §1c + - 聖經希臘文與古典希臘文之異同 §1d + - 聖經希臘文與現代希臘文之異同 §1e + - Chapter 2: 語言學基礎 §2 + - 語言金字塔 §2a + - 形式與功能 §2b + - Choice implies Meaning §2c + - 希臘文詞類 (Parts of Speech) §2d +- Part II—字詞與片語 (Word and Phrase) + - 名詞類 + - Chapter 3: 名詞 (Noun) §3 + - 簡介 [[§3a]] + - 主格 [[$3b]] + - 主語 (Subject) §3b1 + - 述語主格 (Predicate Nominative) §3b2 + - + - 直接受格 $3c + - 所有格 $3d + - 間接受格 $3e + - 數、性 $3f + - 冠詞 + - 形容詞 + - 代名詞 + - Part IIb—功能詞類 + - 介系詞 + - 質詞 + - 連接詞 + - Part IIc—動詞類 + - 動詞: +- Part III—子句與句子 (Clause and Sentence) +- Part IV—段落與篇章 (Paragraph and Discourse) + + + +### 名詞類 +#### 格 (Cases) §100 + +##### §311 主格 (Nominative) +- Subject +- Predicate Nominative +- Nominative in Simple Apposition +- Nominative Absolute +- *Nominativus Pendens* (Pendent Nominative) +- Parenthetic Nominative +- Nominative in Proverbial Expressions +- Nominative for Vocative +- Nominative of Exclamation +- Nominative of Appellation +- Nominative in Apposition to Oblique Cases +- Nominative After Preposition +- Nominative for Time +##### §312 呼格 (Vocative) +- Simple Address +- Emphatic (or Emotional) Address +- Exclamation +- Apposition +##### §313 所有格 (Genitive) +###### Adjectival Genitive +- Descriptive Genitive +- Possessive Genitive +- Genitive of Relationship +- Partitive Genitive ("Wholative") +- Attributive Genitive +- Attributed Genitive +- Genitive of Material +- Genitive of Content +- Genitive in Simple Apposition +- Genitive of Apposition (Epexegetical) +- Genitive of Destination +- Predicate Genitive +- Genitive of Subordination +- Genitive of Production/Producer +- Genitive of Product +###### Ablative Genitive +- Genitive of Separation +- Genitive of Source (or Origin) +- Genitive of Comparison +###### Verbal Genitive +- Subjective Genitive +- Objective Genitive +- Plenary Genitive +###### Adverbial Genitive +- Genitive of Price or Value or Quantity +- Genitive of Time +- Genitive of Place +- Genitive of Means +- Genitive of Agency +- Genitive Absolute +- Genitive of Reference +- Genitive of Association +- Genitive After Certain Verbs (as Direct Object) +- Genitive After Certain Adjectives +- Genitive After Certain Nouns +- Genitive After Certain Prepositions +##### §314 間接受格 (Dative) +- Dative Indirect Object +- Dative of Interest + - Advantage (*commodi*) + - Disadvantage (*incommodi*) +- Dative of Reference/Respect +- Ethical Dative +- Dative of Destination +- Dative of Recipient +- Dative of Possession +- Dative of Thing Possessed +- Predicate Dative +- Dative in Simple Apposition +- Dative of Place: see sphere +- Dative of Sphere +- Dative of Time +- Dative of Rule +- Dative of Association/Accompaniment +- Dative of Manner +- Dative of Means/Instrument +- Dative of Agency +- Dative of Measure/Degree of Difference +- Dative of Cause +- Cognate Dative +- Dative of Material +- Dative of Content +- Dative Direct Object +- Dative After Certain Nouns +- Dative After Certain Adjectives +- Dative After Certain Prepositions +##### §315 直接受格 (Accusative) +- Accusative Direct Object +- Double Accusative +- Person-Thing +- Object-Complement +- Cognate Accusative +- Predicate Accusative +- Accusative Subject of Infinitive +- Accusative of Retained Object +- Pendent Accusative (*Accusativum Pendens*) +- Accusative in Simple Apposition +- Adverbial Accusative (Manner) +- Accusative of Measure (Space, Time) +- Accusative of Respect or (General) Reference +- Accusative in Oaths +- Accusative After Certain Prepositions + + +#### §200 Article +- **Regular Uses** + - *As a Pronoun (4)* + - Personal Pronoun + - Alternative Pronoun + - Relative Pronoun + - Possessive Pronoun + - *With Substantives (10)* + - Individualizing Article + - Simple Idenitification + - Anaphoric (Previous Reference) + - Kataphoric (Following Reference) + - Deictic ("Pointing") + - Par Excellence + - Monadic ("One of a Kind") + - Well-Known ("Familiar") + - Abstract + - Generic (Categorical) + - *As a Substantiver of: (9)* + - Adverbs + - Adjectives + - Participles + - Infinitives + - Genitive Word or Phrase + - Prepositional Phrase + - Particles + - Finite Verbs + - Clauses, Statements, & Quotations + - *As a Function Marker (9)* + - Denote Adjectival Positions + - With Possessive Pronouns + - In Genitive Phrases + - With Indeclinable Nouns + - With Participles + - With Demonstratives + - With Nominative Nouns + - To Distinguish S from PN & Object from Complement + - With Infinitive (various functions) +- **Absence of the Article (12)** + - *Indefinite (1)* + - *Qualitative (1)* + - *Definite (10)* + - Proper Names + - Object of Preposition + - With Ordinal Numbers + - Predicate Nominative + - Complement in Object-Complement Construction + - Monadic Nouns + - Abstract Nouns + - Genitive Construction (Apollonius' Corollary) + - With Pronominal Adjective + - Generic Nouns +- **Special Uses/Non-Uses of the Article (2)** + - Anarthrous Pre-Verbal PNs (involving Colwell's Rule) + - Article with Multiple Substantives Connected by καί (Sharp's Rule & related constructions) + + +#### §300 Adjectives +- **"Non-Adjectival" Uses of Adjective** + - Adverbial + - Substantival +- **Positive, Comparative, Superlative** + - *Positive* + - Normal Use + - Positive for Comparative + - Positive for Superlative + - *Comparative* + - Normal Use + - Comparative for Superlative + - Comparative for Elative + - *Superlative* + - "Normal" Use + - Superlative for Elative + - Superlative for Comparative +- **Relation of Adjective to Noun** + - *When Article is Present* + - Attributive Positions + - First Attributive + - Second Attributive + - Third Attributive + - Predicate Positions + - First Predicate + - Second Predicate + - *When Article is Absent* + - Anarthrous Adjective-Noun Construction + - Anarthrous Noun-Adjective Construction + + +#### §400 Adverbs +#### §500 Pronouns +- **Personal Pronouns** + - *Nominative Uses* + - Emphasis: contrast, subject focus + - Redundancy + - *Oblique Cases* + - Normal Use: Anaphoric + - Possessive + - Reflexive +- **Demonstrative Pronouns** +- *Regular Uses (as Demonstratives):* + - οὗτος, ἐκεῖνος, ὅδε +- *For Personal Pronouns* +- *Unusual Uses* + - Pleonastic (Redundant, Resumptive) + - Constructio ad Sensum: Gender, Number + - Conceptual Antecedent/Postcedent +- **Relative Pronouns** + - ὅς + - *Regular Uses (as RP)* + - *"Unusual" Uses* + - Natural vs. Grammatical Gender + - Case + - Attraction + - Inverse Attraction + - Antecedent Complexities + - Omission of Antecedent + - Adverbial/Conjunctive + - ὅστις + - Generic + - Qualitative + - Confusion with ὅς +- **Interrogative Pronouns** + - τίς / τί: identifying + - ποῖος, πόσος: qualitative, quantative (respectively) +- **Indefinite Pronoun** + - Substantival + - Adjectival +- **Possessive "Pronoun"** + - Possessive Adjective + - Personal Pronoun in Genitive +- **Intensive Pronoun:** αὐτός + - Intensive Pronoun + - As Identifying Adjective + - As Third Person Personal Pronoun +- **Reflexive Pronoun** +- **Reciprocal Pronoun** + + + + + +### §400 動詞類 +#### §600 Tense and Aspect +- **Present** + - Instantaneous Present + - Progressive Present + - Extending-From-Past Present + - Iterative Present + - Customary Present + - Gnomic Present + - Historical Present + - Perfective Present + - Conative Present + - In Progress, but not Complete + - Not Begun, but About/Desired to be Attempted + - Futuristic Present + - Completely Futuristic + - Mostly Futuristic + - Present Retained in Indirect Discourse +- **Imperfect** + - Instantaneous Imperfect + - Progressive (Descriptive) Imperfect + - Ingressive Imperfect + - Iterative Imperfect + - Customary Imperfect + - "Pluperfective" Imperfect + - Conative Imperfect + - In Progress, but not Complete + - Not Begun, but About/Desired to be Attempted + - Imperfect Retained in Indirect Discourse +- **Aorist** + - Constative Aorist + - Ingressive Aorist + - Consummative Aorist + - Gnomic Aorist + - Epistolary Aorist + - Proleptic Aorist + - Immediate Past/Dramatic Aorist +- **Future** + - Predictive Future + - Imperatival Future + - Deliberative Future + - Gnomic Future + - Miscellaneous Subjunctive Equivalents +- **Perfect** + - Intensive Perfect (Resultative) + - Extensive Perfect (Consummative) + - Aoristic (Dramatic, Historical) Perfect + - Perfect with Present Force + - Gnomic Perfect + - Proleptic Perfect + - Perfect of Allegory +- **Pluperfect** + - Intensive Pluperfect (Resultative) + - Extensive Pluperfect (Consummative) + - Simple Past Pluperfect + + +#### §700 Voice +- **Active** + - Simple Active + - Causative Active (Ergative) + - Stative Active + - Reflexive Active +- **Middle** + - Direct Middle + - Redundant Middle + - Indirect Middle + - Causative Middle + - Permissive Middle + - Reciprocal Middle + - Deponent Middle +- **Passive** + - *Passive Constructions* + - With & Without Agency Expressed: + - Ultimate Agent + - Intermediate Agent + - Impersonal Means + - No Expressed Agency + - With Accusative Object + - *Passive Uses* + - Simple Passive + - Causative/Permissive Passive + - Deponent Passive + + +#### §800 Moods +- **Indicative** + - Declarative Indicative + - Interrogative Indicative + - Conditional Indicative + - Potential Indicative + - Cohortative (Command,Volitive) Indicative + - Indicative with ῾Οτι + - Subject + - Direct Object + - Direct Object Proper + - Direct Discourse + - Indirect Discourse + - Apposition + - Epexegetical + - Causal +- **Subjunctive** + - *Independent Clauses* + - Hortatory Subjunctive + - Deliberative Subjunctive + - Emphatic Negation Subjunctive + - Prohibitive Subjunctive + - *Dependent Clauses* + - Subjunctive in Conditional Sentences + - ῾Ινα + Subjunctive + - Purpose + - Result + - Purpose-Result + - Subject + - Predicate Nominative + - Direct Object + - Apposition + - Epexegetical + - Complementary + - Imperatival + - Subjunctive with Verbs of Fearing + - Subjunctive in Indirect Questions + - Subjunctive in Indefinite Relative Clause + - Subjunctive in Indefinite Temporal Clause +- **Optative** + - Voluntative Optative (Obtainable Wish) + - Oblique Optative + - Potential Optative + - Conditional Optative +- **Imperative** + - Command + - Prohibition + - Request (Entreaty) + - Permissive Imperative (Toleration) + - Conditional Imperative + - Potential Imperative + - Pronouncement Imperative + - Stereotyped Greeting + + +#### §440 Person & Number +- **Person** + - First for Third Person + - Second for Third Person + - First Plural Constructions + - Editorial "We" (Epistolary Plural) + - Inclusive "We" + - Exclusive "We" +- **Number** + - Neuter Plural Subject, Singular Verb + - Collective Singular Subject, Plural Verb + - Compound Subject, Singular Verb + - Indefinite Plural + - Categorical Plural + + +#### §450 Infinitive +- **Adverbial Uses** + - Purpose + - Result + - Time + - Antecedent + - Contemporaneous + - Subsequent + - Cause + - Means + - Complementary (Supplementary) +- **Substantival** + - Subject + - Direct Object + - Indirect Discourse + - Appositional + - Epexegetical +- **Independent** + - Imperatival + - Absolute + + +#### §460 Participle +- **Adjectival Participles** + - *Adjectival Proper* + - Attributive + - Predicate + - *Substantival* +- **Verbal Participles** + - *Dependent Verbal* + - Temporal + - Manner + - Means + - Cause + - Condition + - Concession + - Purpose + - Result + - Attendant Circumstance + - Indirect Discourse + - Complementary + - Periphrastic + - Redundant (Pleonastic) + - *Independent Verbal* + - Imperatival + - Indicative + - **Participle Absolute** + - Nominative Absolute + - Genitive Absolute + + + +### §500 功能詞類 +#### §510 介系詞 (Prepositions) +- (see main section of Syntax Summaries) + +#### §520 連接詞 (Conjunctions +- **Logical Functions** + - Ascensive + - Connective + - Contrastive (Adversative) + - Correlative + - Disjunctive (Alternative) + - Emphatic + - Explanatory + - Inferential + - Transitional +- **Adverbial Functions** + - Causal + - Comparative (Manner) + - Conditional + - Local (Sphere) + - Purpose + - Result + - Temporal +- **Substantival Functions** + - Content + - Epexegetical + +) + +#### §530 質詞 (Particles) +- 功能詞類 + - 介系詞 (Preposition) + - 連接詞 (Conjunctive) + - 質詞 (Particle) + + +## Part III — 子句與句子 (Clause and Sentence) +### 600 Clauses +#### [[§610]] 子句結構 (Clause Structure) +#### §620 句子類型 (Sentence Classification) +- **Clauses (in General)** + - *Independent Clauses* + - *Dependent Clauses* + - Substantival + - Adjectival + - Adverbial + +#### §630 Conditional Sentences +- **In General** + - Cause-Effect + - Evidence-Inference + - Equivalence +- **In Greek** + - First Class + - Second Class + - Third Class + - Fourth Class + + +#### §640 Volitional Clauses +- **Commands** + - *Future Indicative* + - *Aorist Imperative* + - Ingressive + - Momentary or Single Act + - Pure Ingressive + - Constative + - *Present Imperative* + - Ingressive-Progressive + - Customary + - Iterative +- **Prohibitions** + - *Future Indicative* + - *Aorist Subjunctive* + - Ingressive + - Constative + - *Present Imperative* + - Cessation of Activity in Progress + - General Precept + + + + +## 附錄 + + +- 附錄 I:希臘文學習策略與方法 + - 課程設計進路:文法導向、經文導向、任務導向 + - 學習方法:翻譯、朗讀、聆聽、手抄、解經、背誦、默想 + + + +### 參考書目 +縮寫 | 書目 +--- | ---------- +GGBB| Wallace, Daniel B. *Greek Grammar Beyond the Basics*. Grand Rapids: Zondervan, 1996. +中希 | 華勒斯(Daniel B. Wallace)。《中級希臘文文法》。吳存仁譯。台北市:中華福音神學院,2011。 +IGNT |Porter, Stanley E. *Idioms of the Greek New Testament*. Second edition with corrections. Sheffield, U.K.: Sheffield Academic, 1994. +慣用 | 斯丹利‧波特(Stanley E. Porter)。《新約希臘文的慣用語》。葉雅蓮譯。台北市:中華福音神學院,2013。| +DEEP |Köstenberger, Andreas J., Benjamin L. Merkle, and Robert L. Plummer. *Going Deeper with New Testament Greek: An Intermediate Study of the Grammar and Syntax of the New Testament*. Nashville, TN.: B&H Academic, 2016. +IGG |Mathewson, David L., and Elodie Ballantine Emig. *Intermediate Greek Grammar: Syntax for Students of the New Testament*. Grand Rapids, MI: Baker Academic, 2016. +Funk |Funk, Robert W. *A Beginning-Intermediate Grammar of Hellenistic Greek*. 3rd ed. Polebridge Press, 2013. +Runge |Runge, Steven E. *Discourse Grammar of the Greek New Testament: A Practical Introduction for Teaching and Exegesis*. Peabody, MA.: Hendrickson, 2010. +Levinsohn |Levinsohn, Stephen H. *Discourse Features of New Testament Greek: A Coursebook on the Information Structure of New Testament Greek*. 2nd ed. Dallas, Tex.: SIL International, 2000. diff --git a/Syntax/Syntax-00.md b/Syntax/Syntax-00.md new file mode 100644 index 0000000..51254df --- /dev/null +++ b/Syntax/Syntax-00.md @@ -0,0 +1,2 @@ + +![|500x500](../images/%E8%AA%9E%E8%A8%80%E9%87%91%E5%AD%97%E5%A1%94.png) \ No newline at end of file diff --git a/Syntax/§3.md b/Syntax/§3.md new file mode 100644 index 0000000..e69de29 diff --git a/Syntax/§311.md b/Syntax/§311.md new file mode 100644 index 0000000..ec1db9a --- /dev/null +++ b/Syntax/§311.md @@ -0,0 +1,70 @@ +### §311 主格 (Nominative) + + +#### A. 主要用法 (Primary Uses) + +##### 1. 主詞 (Subject) + +主格通常用來當作子句的主詞,在圖析時要當作 S (主語)。例如: + +- 約3:16 (ΟὕτωςThusοὕτω, οὕτωςADV)A γὰρforγάρCONJ (ἠγάπησενlovedἀγαπάωV-AAI-3S)P ==(T-NSM ΘεὸςGodθεόςN-NSM)S== (τὸνtheT-ASM κόσμον‚world‚κόσμοςN-ASM)C ==神==愛世人 + +如果一個子句沒有主詞,那麼就是內嵌在動詞裡面。例如: +- 可10:13 ΚαὶAndκαίCONJ (προσέφερονthey were bringingπροσφέρωV-IAI-==3P==)P (αὐτῷto HimαὐτόςP-DSM)C1 (παιδίαlittle children‚παιδίονN-APN)C2 ==有人==帶著小孩子來見耶穌 + +##### 2. 述詞主格 (Predicate Nominative) + +如果遇到聯繫動詞 (copular verb,又稱:等同動詞 equative verb),像是 εἰμί (am/is)、γίνομαι (become)、ὑπάρχω(am/exist)、μένω(remain) 的時候,動詞的 S (主語) 和 C (補語) 都會是主格。這樣的 C (補語),在文法上稱之為: 述詞主格 (Predicate Nominative)。例如: + +- 太3:17 (ΟὗτόςThisοὗτοςD-NSM)S (ἐστινisεἰμίV-PAI-3S)P ==(theT-NSM ΥἱόςSonυἱόςN-NSM μουof me‚ἐγώP-1GS theT-NSM ἀγαπητός‚beloved‚ἀγαπητόςA-NSM)C== 這是==我的愛子== + +其中 ὁ υἱός μου ὁ ἀγαπητός 是一組名詞片語, μου 修飾前面的名詞 υἱός,其他四個字形成 T—N—T—A (冠詞—名詞—冠詞—形容詞) 的結構,合起來當作是述詞主格,在圖析時要標示成 C (補語)。 + +- 約4:24 ==(ΠνεῦμαSpiritπνεῦμαN-NSN)C== (T-NSM Θεός‚God [is]‚θεόςN-NSM)S 神是個==靈== + +##### 3. 單純同位的主格 (Nominative in Simple Apposition) + +構成同位 (apposition) 的要素有: +1. 前後緊鄰的實名詞 +2. 相同的格 +3. 指向相同的人事物 + +- 太3:1 (παραγίνεταιcomesπαραγίνομαιV-PNI-3S)P (ἸωάννηςJohnἸωάννηςN-NSM-P)S1 ==(theT-NSM βαπτιστὴςBaptist‚ΒαπτιστήςN-NSM)S2== 有==施洗的==約翰出來 + +#### B. 獨立用法 (Independent Uses) + +主格這個字單獨存在,跟子句其他元素沒有句法上的關聯。 + +##### 4. 獨立主格 (Nominative Absolute) + +獨立主格 (Nominative Absolute) 不足以構成完整的子句,常用來當作標題、問安,或是帶出其他子句的用語。 + +- 太1:1 ==(Βίβλος[The] bookβίβλοςN-NSF)S== γενέσεωςof [the] genealogyγένεσιςN-GSF Ἰησοῦof JesusἸησοῦςN-GSM-P ΧριστοῦChrist‚ΧριστόςN-GSM-T 耶穌基督的家==譜== +- 羅1:7 ==(ΧάριςGraceχάριςN-NSF)S1== (ὑμῖνto youσύP-2DP)C ==(καὶandκαίCONJ εἰρήνηpeaceεἰρήνηN-NSF)S2== + - (ἀπὸfromἀπόPREP ΘεοῦGodθεόςN-GSM Πατρὸς[the] FatherπατήρN-GSM ἡμῶνof usἐγώP-1GP καὶandκαίCONJ Κυρίου[the] LordκύριοςN-GSM ἸησοῦJesusἸησοῦςN-GSM-P Χριστοῦ.¶Christ.ΧριστόςN-GSM-T)A + - 願==恩惠、平安==從我們的父神並主耶穌基督歸與你們! + +##### 5. 懸置主格 (Pendent Nominative) + +懸置主格 (Nominative Pendens) 往往出現在子句的開頭。從句法上來看,不是子句的主語 (S);但從語意、邏輯來看,卻是子句的主語 (S)。之後的子句,往往會用代名詞來取代懸置主格——但是代名詞的格,卻要由子句中所扮演的角色而定。 + +- 啟3:12 ==(The [one]T-NSM νικῶνovercoming‚νικάωV-PAP-NSM)== +- (ποιήσωI will makeποιέωV-FAI-1S)P ==(αὐτὸνhimαὐτόςP-ASM)C1== (στῦλονa pillarστῦλοςN-ASM)C2 + - (ἐνinἐνPREP τῷtheT-DSM ναῷtempleναόςN-DSM τοῦof theT-GSM ΘεοῦGodθεόςN-GSM μουof Me‚ἐγώP-1GS)A +- ==得勝的==,我要叫==他==在我神殿中作柱子 + +##### 6. 插句主格 (Parenthetic Nominative) + +- 約壹1:6 ἘὰνIfἐάνCONJ εἴπωμενwe should sayἔπω, ἐρῶ, εἶπονV-2AAS-1P ὅτιthatὅτιCONJ κοινωνίανfellowshipκοινωνίαN-ASF ἔχομενwe haveἔχωV-PAI-1P μετ᾽withμετάPREP αὐτοῦHim‚αὐτόςP-GSM καὶand yetκαίCONJ ἐνinἐνPREP τῷtheT-DSN σκότειdarknessσκότοςN-DSN περιπατῶμεν‚should walk‚περιπατέωV-PAS-1P ψευδόμεθαwe lieψεύδομαιV-PNI-1P καὶandκαίCONJ οὐnotοὐPRT-N ποιοῦμενdo practiceποιέωV-PAI-1P τὴνtheT-ASF ἀλήθειαν·truth.ἀλήθειαN-ASF 我們若說是與神相交,卻仍在黑暗裡行,就是說謊話,不行真理了。 + +##### 7. 稱謂主格 (Nominative of Address) + +- 約17:25 ==ΠάτερFatherπατήρN-VSM== δίκαιε‚righteous‚δίκαιοςA-VSM καὶalthoughκαίCONJ theT-NSM κόσμοςworldκόσμοςN-NSM σεYouσύP-2AS οὐκnotοὐPRT-N ἔγνω‚has known‚γινώσκωV-2AAI-3S 公義的==父阿==,世人未曾認識你 +- 可9:19 OINJ ==γενεὰgenerationγενεάN-VSF== ἄπιστος‚unbelieving!ἄπιστοςA-VSF ἕωςUntilἕωςPREP πότεwhenπότεPRT-I πρὸςwithπρόςPREP ὑμᾶςyouσύP-2AP ἔσομαι;will I be?εἰμίV-FDI-1S 噯!不信的==世代阿==,我在你們這裡要到幾時呢? + +##### 8. 驚嘆主格 (Nominative of Exclamation) + +- 羅7:24 ΤαλαίπωροςO wretchedταλαίπωροςA-NSM ἐγὼI amἐγώP-1NS ἄνθρωπος·man!ἄνθρωποςN-NSM 我真是苦阿! + +#### C. 取代斜格 (in place of Oblique Cases) 的用法 + diff --git a/Syntax/§3a.md b/Syntax/§3a.md new file mode 100644 index 0000000..e69de29 diff --git a/Syntax/§3b.md b/Syntax/§3b.md new file mode 100644 index 0000000..e69de29 diff --git a/Syntax/§3b1.md b/Syntax/§3b1.md new file mode 100644 index 0000000..e69de29 diff --git a/Untitled.md b/Untitled.md new file mode 100644 index 0000000..d47cbfc --- /dev/null +++ b/Untitled.md @@ -0,0 +1 @@ +‖ \ No newline at end of file diff --git a/cheatsheet.md b/cheatsheet.md new file mode 100644 index 0000000..95456ef --- /dev/null +++ b/cheatsheet.md @@ -0,0 +1,248 @@ +--- +puppeteer: + displayHeaderFooter: true + printBackground: true + margin: { + top: "2cm", + right: "2cm", + bottom: "2cm", + left: "2cm" + } +--- + + +# 標題 1 +## level 2 +### level 3 +#### 4 +##### 5 +###### 6 + +[TOC] + + +--- + +**粗體** +*斜體* +__*斜粗體*__ +==hight light== +hight light + +--- +`code` + +強迫分頁碼 +
+ +### HTML 特殊 +
+ +
靠左對齊
+
+- 靠右對齊 +- dscdscdsc +
+ +

靠左對齊靠右對齊

+ +--- + +### Ruby +ἀλλὰNeverthelessἀλλάCONJ ἐβασίλευσενreignedβασιλεύωV-AAI-3S T-NSM θάνατοςdeathθάνατοςN-NSM ἀλλὰNeverthelessἀλλάCONJ ἐβασίλευσενreignedβασιλεύωV-AAI-3S T-NSM θάνατοςdeathθάνατοςN-NSM ἀλλὰNeverthelessἀλλάCONJ ἐβασίλευσενreignedβασιλεύωV-AAI-3S T-NSM θάνατοςdeathθάνατοςN-NSM ἀλλὰNeverthelessἀλλάCONJ ἐβασίλευσενreignedβασιλεύωV-AAI-3S T-NSM θάνατοςdeathθάνατοςN-NSM + +--- +### px ⇔ pt (Windows) +windows default = 96 DPI +72 pt = 1 inch = 96 px + +Points|Pixels +---|--- +9pt|12px +10pt|13px +10.5pt|14px +11pt|15px +12pt|16px +13pt|17px +14pt|19px +16pt|22px +18pt|24px +20pt|26px +22pt|29px +24pt|32px +26pt|35px +28pt|37px +30pt|40px +### 特殊符號 +用 Windows 鍵 + . + +| Unicode | result | UniCode | result | +| ------- | ------ | ------- | ------ | +| U00AB | « | U00BB | » | +| U25C2 | ◂ | U25B8 | ▸ | +| U2190 | ← | U2192 | → | +| U21D2 | ⇒ | U21D0 | ⇐ | +| U2235 | ∵ | U2234 | ∴ | +| U00A7 | § | U2015 | ― | +| U21B5 | ↵ | + +### 引用 + +> 文字下標a +>> 雙重引用上標b + +--- +## 註腳 + +本文帶註腳[1](#%5Ea344fd) + + +註腳[^1] + + + +The PDF link should work[^3] + +## References +[^1]: But right now I think they are just colored pieces of text +[^2]: I've only seen this kind of feature work in PDFs created via Acrobat Reader. +[^3]: Should it work? I think yes[^1], unless it needs something proprietary to work[^2] + +## 連結 +[[ +[其他文章連結](IGNT-01):IGNT/01.md + +[其他文章內的段落](IGNT-01#11-%E4%B8%89%E5%80%8B%E5%8B%95%E8%A9%9E%E8%A7%80%E9%BB%9E-The-Three-Verbal-Aspects):1.1 三個動詞觀點 (The Three Verbal Aspects) + +[本文內的段落](#bottom):bottom +[qq](#%5E88f4c1) + + + +## 表格 +| Markdown Engine | Align Center | Align right | +| :--------------------------- | :----------: | ----------: | +| *Still* | `renders` | **nicely** | +| 1 | 2 | 3 | +|
  • item1
  • item2
  • | 5 | 6 | + + + +## 清單 +1. 大點自動編號 (同一段落內) + 1. 小點 + 1. 小小點 + 1. ssd + 1. sddd + 1. 小小點 + 2. sdscsd + 2. 小點 + 3. sdcsdcsd +1. 大點自動編號 (同一段落內) + +- 大點 + - 小點 + - 小小點 + - sss + - 小小點 + - 小點 +- 大點 + +---- + +## 可折疊區塊 +
    + + 進階資訊 + + ### Heading + + 1. A numbered + 2. list + * With some + * Sub bullets + +
    + +------ +## 註腳 + +1 註腳內容 [↵](#a1) 05793f ^a344fd + + +- [HOME](README.md) +- [回目錄](README.md) + + +## vscode markdown-to-pdf +``` +--- +puppeteer: + landscape: false + format: "A4" + displayHeaderFooter: true + margin: { + top: "1.5cm", bottom: "1.5cm", left: "1.5cm", right: "1.5cm"} + headerTemplate: "中台神學院
        " + footerTemplate: "  / " + printBackground: true +--- +``` + + + +# GitLab Extension + + +A footnote reference tag looks like this: [^1] + +This reference tag is a mix of letters and numbers. [^footnote-42] + +## mermaid diagrams + +```mermaid +graph TB + + SubGraph1 --> SubGraph1Flow + subgraph "SubGraph 1 Flow" + SubGraph1Flow(SubNode 1) + SubGraph1Flow -- Choice1 --> DoChoice1 + SubGraph1Flow -- Choice2 --> DoChoice2 + end + + subgraph "Main Graph" + Node1[Node 1] --> Node2[Node 2] + Node2 --> SubGraph1[Jump to SubGraph1] + SubGraph1 --> FinalThing[Final Thing] +end +``` + +```mermaid +gantt +title Adding GANTT diagram to mermaid + +section 掃羅 +膏抹 (1Sa 9): des1, 2014-01-06,2034-01-08 +Active task:des2, 2024-01-09, 2034-01-08 +Future task:des3, after des2, 100w +Future task2:des4, after des3, 50w + +section 大衛 +膏抹 (1Sa 9): des1, 2014-01-06,2034-01-08 +Active task:des2, 2024-01-09, 2034-01-08 +Future task:des3, after des2, 100w +Future task2:des4, after des3, 50w +``` + + + + + +[^1]: This is the text inside a footnote. + +[^footnote-42]: This is another footnote. + + +## bottom + +^88f4c1 diff --git a/images/BIGHG-cover.png b/images/BIGHG-cover.png new file mode 100644 index 0000000..ec5e3d7 Binary files /dev/null and b/images/BIGHG-cover.png differ diff --git a/images/DFNTG-cover.png b/images/DFNTG-cover.png new file mode 100644 index 0000000..9e8296b Binary files /dev/null and b/images/DFNTG-cover.png differ diff --git a/images/DGGNT-cover.png b/images/DGGNT-cover.png new file mode 100644 index 0000000..ea71f6d Binary files /dev/null and b/images/DGGNT-cover.png differ diff --git a/images/GDNTG-cover.png b/images/GDNTG-cover.png new file mode 100644 index 0000000..50661ad Binary files /dev/null and b/images/GDNTG-cover.png differ diff --git a/images/GGBB-cover.png b/images/GGBB-cover.png new file mode 100644 index 0000000..44220b0 Binary files /dev/null and b/images/GGBB-cover.png differ diff --git a/images/GGBB-封面.png b/images/GGBB-封面.png new file mode 100644 index 0000000..1fbbd45 Binary files /dev/null and b/images/GGBB-封面.png differ diff --git a/images/Guthrie-Reader.jpg b/images/Guthrie-Reader.jpg new file mode 100644 index 0000000..f2356ae Binary files /dev/null and b/images/Guthrie-Reader.jpg differ diff --git a/images/IGG-cover.png b/images/IGG-cover.png new file mode 100644 index 0000000..092fea8 Binary files /dev/null and b/images/IGG-cover.png differ diff --git a/images/IGNT-cover.png b/images/IGNT-cover.png new file mode 100644 index 0000000..64d12da Binary files /dev/null and b/images/IGNT-cover.png differ diff --git a/images/IGNT-封面.png b/images/IGNT-封面.png new file mode 100644 index 0000000..a418585 Binary files /dev/null and b/images/IGNT-封面.png differ diff --git a/images/Mounce-Reader.png b/images/Mounce-Reader.png new file mode 100644 index 0000000..780aca1 Binary files /dev/null and b/images/Mounce-Reader.png differ diff --git a/images/Mounce-Reader2.png b/images/Mounce-Reader2.png new file mode 100644 index 0000000..2b20f8f Binary files /dev/null and b/images/Mounce-Reader2.png differ diff --git a/images/語言金字塔.png b/images/語言金字塔.png new file mode 100644 index 0000000..a576c30 Binary files /dev/null and b/images/語言金字塔.png differ diff --git a/style/Andley-Interlinear.css b/style/Andley-Interlinear.css new file mode 100644 index 0000000..fa97087 --- /dev/null +++ b/style/Andley-Interlinear.css @@ -0,0 +1,105 @@ +/* ============= 列印 PDF 設定 ============= */ + @media print { + /* -------- 列印強調 ---------- */ + a, strong, em { + color: black !important; + } + + /* -------- 列印 Interlinear 經文段落---------- */ + ruby { + font-size: 19px !important; /* 14pt 字體大小*/ + line-height: 19px !important; + padding-bottom: 10px !important; + } + rt { + font-size: 16px !important; /* 12pt 字體大小*/ + line-height: 16px !important; + } + + /* -------- 列印 Interlinear 圖析 ---------- */ + ul ruby { + font-size: 16px !important; /* 12pt 字體大小*/ + line-height: 16px !important; + padding-bottom: 2px !important; + } + ul rt { + font-size: 13px !important; /* 10pt 字體大小*/ + line-height: 13px !important; + } + + /* -------- 列印其他文字 ---------- */ + html, body { + background-color: white !important; + color: black !important; + font-size: 16px !important; /* 12pt 字體大小*/ + } + + } + + + /* ============= 銀幕顯示 & 列印設定 ============= */ + /* -------- 銀幕標題 ---------- */ + h1, h2, h3, h4, h5, h6 { + font-family: "Noto Sans Black", "Noto Sans CJK TC Black"; + } + h1 { + color: darkred; + font-size:26px; /* 20pt 字體大小*/ + text-align: center; + border-bottom: 3px double darkred !important; + } + h2 { + color: darkblue; + font-size:24px; /* 18pt 字體大小*/ + text-align: center; + } + h3 { + color: darkgreen; + font-size:22px; /* 16pt 字體大小*/ + text-indent: -21px; + } + h4 { + color: darkmagenta; + font-size:19px; /* 14pt 字體大小*/ + text-indent: -14px; + } + h5 { + font-size:16px; /* 12pt 字體大小*/ + text-indent: -7px; + } + h6 { + font-size:16px; /* 12pt 字體大小*/ + font-style: italic; + } + + /* -------- 銀幕 Interlinear ---------- */ + ruby { + display: inline-flex; + flex-direction: column-reverse ; + align-items: center; + font-size: 22px; /* 16pt 字體大小*/ + line-height: 23px; + padding-bottom: 10px; + font-family: "SBL BibLit"; + } + ul ruby { + padding-bottom: 5px; + } + rt { + font-size: 17px; /* 13pt 字體大小*/ + line-height: 18px; + font-family: "Arial Narrow", "Noto Sans CJK TC"; + } + + /* -------- 其他文字 ---------- */ + html, body { + background-color: white; + color: black; + font-size:16px; /* 12pt 字體大小*/ + font-family: "Noto Sans", "Noto Sans CJK TC", "Ezra SIL"; + } + + th { + border-bottom: 3px double black !important; + } + diff --git a/全民希臘文進階.md b/全民希臘文進階.md new file mode 100644 index 0000000..2a4bd29 --- /dev/null +++ b/全民希臘文進階.md @@ -0,0 +1,11 @@ +# 全民希臘文進階
    IG4E (Intermediate Greek for Everyone) + + +- [Syntax/IG4E](Syntax/IG4E.md) +- [HW/Home Work](HW/Home%20Work.md) +- 單卷解經 +- 聖經希臘文資源工具 + - [參考書目](%E5%8F%83%E8%80%83%E6%9B%B8%E7%9B%AE.md) + - [數位工具](%E6%95%B8%E4%BD%8D%E5%B7%A5%E5%85%B7.md) + + diff --git a/參考書目.md b/參考書目.md new file mode 100644 index 0000000..8488e29 --- /dev/null +++ b/參考書目.md @@ -0,0 +1,172 @@ +# 聖經希臘文資源工具 + +## 參考書目 + +### 希臘文聖經 + +### 輔讀本 (Reader's Edition) +- Dodson, John Jeffrey, ed. *The Greek New Testament for Beginning Readers: Byzantine Textform*. Nürnberg: VTR, 2010. +- Goodrich, Richard J., and Albert L. Lukaszewski, eds. *A Reader's Greek New Testament: Third Edition*. Third edition. Grand Rapids, MI.: Zondervan Academic, 2015. +- Newman, Barclay M., and Florian Voss, eds. *UBS5 Greek New Testament, Reader's Edition*. Fifth revised. German Bible Society, 2015. +- Williams, Peter J, Peter M Head, Patrick James, James R Covington, and Andrew Zulker, eds. *The Greek New Testament: Reader's Edition*. Edited by Dirk Jongkind and Drayton C Benner. Wheaton, Ill.: Crossway, 2018. +- 傅約翰 (Johan Ferreira)。《新约希腊文读本》。South Pasadena, CA:美国麦种传道会,2014。 + +### 辭典 (Lexion) + +- Bauer, W., F. W. Danker, W. F. Arndt, and F. W. Gingrich. *A Greek-English Lexicon of the New Testament and Other Early Christian Literature*. 3rd ed. Chicago, Ill.: University of Chicago Press, 2000. = W. Bauer、F. W. Danker、W. F. Arndt、F. W. Gingrich。《新約及早期基督敎文獻希臘文大詞典(中文版)》。麥啟新編。麥陳惠惠、麥啟新譯。香港:漢語聖經協會,2009。 +- Danker, Frederick William. *The Concise Greek-English Lexicon of the New Testament*. Chicago, Ill.: University Of Chicago Press, 2009. +- Louw, Johannes P., and Eugene A. Nida. _Greek-English Lexicon of the New Testament: Based on Semantic Domains_. Edited by Rondal B. Smith and Karen A. Munson. 2nd ed. Vol. 2. New York: United Bible Societies, 1989. +- 包爾(Walter Bauer)。《新約希臘文中文辭典》。王正中編。戴德理 (Wright Doyle)譯。更新版。台中市:浸宣,2014。 +- 黃根春。《新約希臘文詞典》。香港:香港聖經公會,2015。 + +### 神學辭典 (Dictionary) + +- Silva, Moisés. _New International Dictionary of New Testament Theology and Exegesis_. Second edition. 5 vols. Grand Rapids, MI.: Zondervan, 2014. + +### 進階讀本 (Graded Reader) + +- Guthrie, George H, and George H. Guthrie & J. Scott Duvall. _Biblical Greek Exegesis: A Graded Approach to Learning Intermediate and Advanced Greek_. Grand Rapids, Mich.: Zondervan, 1998. +- Mounce, William D. _A Graded Reader of Biblical Greek_. Grand Rapids, MI.: Zondervan, 1996. = 威廉‧孟恩思(William D. Mounce)。《聖經希臘文進階:讀本》。沈其光、潘秋松譯。美國:麥種傳道會,2015。 + +--- + +### 初階語法 (Basic Grammar) +- Harris, Dana M. _Introduction to Biblical Greek Grammar: Elementary Syntax and Linguistics._ Grand Rapids, MI.: Zondervan, 2020. +- Harris, Dana M, and Chi-ying Wang. _An Introduction to Biblical Greek Workbook: Elementary Syntax and Linguistics_. Grand Rapids, MI.: Zondervan Academic, 2020. +- Gibson, Richard J., and Constantine R. Campbell. _Reading Biblical Greek: A Grammar for Students_. Grand Rapids, Michigan: Zondervan, 2017. +- ———. _Reading Biblical Greek Workbook: A Translation Guide to Mark 1-4_. Workbook edition. Zondervan, 2017. +- Thornhill, A. Chadwick. _Greek for Everyone: Introductory Greek for Bible Study and Application_. Grand Rapids, Michigan: Baker Books, 2016. +- 楊金蘭。《新約希臘文初階》。第二版。新加坡:新加坡神學院,2014。 +- ———。《新約希臘文初階練習本》。第二版。新加坡:新加坡神學院,2014。 +- Decker, Rodney J. _Reading Koine Greek: An Introduction and Integrated Workbook_. Grand Rapids, MI: Baker Academic, 2014 +- Mounce, William D. _Basics of Biblical Greek Grammar_. 4th ed. Grand Rapids, Mich.: Zondervan, 2019. +- ———. _Basics of Biblical Greek Workbook_. 4th ed. Grand Rapids, Mich.: Zondervan, 2019. +- ———. _Basics of Biblical Greek Grammar_. 3 edition. Grand Rapids: Zondervan, 2009. = 威廉‧孟恩思(William D. Mounce)。《聖經希臘文基礎:作業》。潘秋松譯。修訂版。美國:麥種傳道會,2012。 +- ———. _Basics of Biblical Greek Workbook_. 3 edition. Grand Rapids, Mich.: Zondervan, 2009. = 威廉‧孟恩思(William D. Mounce)。《聖經希臘文基礎:課本》。潘秋松譯。修訂版。美國:麥種傳道會,2012。 +- McLean, B. H. _New Testament Greek: An Introduction_. New York: Cambridge University Press, 2011. +- Porter, Stanley E., and Jeffrey T. Reed. _Fundamentals of New Testament Greek: Workbook_. Grand Rapids, Mich.: Eerdmans, 2010. +- Porter, Stanley E., Jeffrey T. Reed, and Matthew Brook O'Donnell. _Fundamentals of New Testament Greek_. Grand Rapids, Mich: Eerdmans, 2010. + +### 進階語法 (Intermediate Grammar) +- Köstenberger, Andreas J., Benjamin L. Merkle, and Robert L. Plummer. *Going Deeper with New Testament Greek: An Intermediate Study of the Grammar and Syntax of the New Testament*. Nashville, TN.: B&H Academic, 2016. +- Levinsohn, Stephen H. *Discourse Features of New Testament Greek: A Coursebook on the Information Structure of New Testament Greek*. 2nd ed. Dallas, Tex.: SIL International, 2000. +- Mathewson, David L., and Elodie Ballantine Emig. *Intermediate Greek Grammar: Syntax for Students of the New Testament*. Grand Rapids, MI: Baker Academic, 2016. +- Porter, Stanley E. *Idioms of the Greek New Testament*. Second edition with corrections. Sheffield, U.K.: Sheffield Academic, 1994. = 斯丹利‧波特(Stanley E. Porter)。《新約希臘文的慣用語》。葉雅蓮譯。台北市:中華福音神學院,2013。 +- Runge, Steven E. *Discourse Grammar of the Greek New Testament: A Practical Introduction for Teaching and Exegesis*. Peabody, MA.: Hendrickson, 2010. +- Wallace, Daniel B. *Greek Grammar Beyond the Basics*. Grand Rapids: Zondervan, 1996. = 華勒斯(Daniel B. Wallace)。《中級希臘文文法》。吳存仁譯。台北市:中華福音神學院,2011。 +- Wallace, Daniel B. _The Basics of New Testament Syntax: An Intermediate Greek Grammar_. Grand Rapids, Mich.: Zondervan, 2000. +- 張證豪、郭承天、周復初、劉偉倫。《新約聖經希臘文輕鬆速成》。新北市:聖經資源中心,2020。 + +### 高階語法 (Reference Grammar) +- Siebenthal, Heinrich von. *Ancient Greek Grammar for the Study of the New Testament*. Oxford New York: Peter Lang, 2020. +- Robertson, A. T. _A Grammar of Greek New Testament in the Light of Historical Research_. 3rd ed. Nashville, Tenn.: Broadman Press, 1919. +- Blass, F., and A. DeBrunner. _A Greek Grammar of the New Testament and Other Early Christian Literature_. Translated by Robert W. Funk. Chicago, Ill.: University of Chicago Press, 1961. +- Emde Boas, Evert van, Albert Rijksbaron, Luuk Huitink, and Mathieu de Bakker. _Cambridge Grammar of Classical Greek_, 2019. + +--- + +### 原文與事奉 +- Campbell, Constantine R. *Keep Your Greek: Strategies for Busy People*. Grand Rapids, MI.: Zondervan, 2010. +- Merkle, Benjamin L, and Robert L Plummer. *Greek for Life: Strategies for Learning, Retaining, and Reviving New Testament Greek*. Grand Rapids, MI.: Baker Academic, 2017. +- Whitacre, Rodney A. *Using and Enjoying Biblical Greek: Reading the New Testament with Fluency and Devotion*. Grand Rapids, Mich.: Baker Academic, 2015. +- Merkle, Benjamin L. _Exegetical Gems from Biblical Greek: A Refreshing Guide to Grammar and Interpretation_. Grand Rapids, Michigan: Baker Academic, 2019. +- Webb, Joseph M, and Kysar, Robert. _Greek for Preachers_. St. Louis, Mo.: Chalice Press, 2002. +- Easley, Kendell H. _User-Friendly Greek: A Common Sense Approach to the Greek New Testament_. Nashville, Tenn.: Broadman & Holman, 1994. +- 李廣。《查考聖經得生命:如何使用原文編號新約、字典、彙編》。兩冊。永望文化,2003。 +- 羅羚、羅達理。《原文讀經好處多——五十個釋經範例,讓你愛上原文讀經》。香港:天道書樓,2017。 +- 張證豪、郭承天、周復初、劉偉倫。《新約聖經希臘文輕鬆速成》。新北市:聖經資源中心,2020。 + + + + +### 解經方法 +- Ramsay, Richard B. *Basic Greek and Exegesis: A Practical Manual That Teaches the Fundamentals of Greek and Exegesis, Including the Use of Linguistic Software.* Phillipsburg, NJ: P&R Publishing, 2007. +- Silva, Moisés. _Biblical Words and Their Meaning: An Introduction to Lexical Semantics_. Rev. and Expanded. Grand Rapids: Zondervan, 2010. +- 黃朱倫。《語言學與釋經:聖經詞彙的研究》。台北市:校園書房,1999。 +- Carson, D. A. _Exegetical Fallacies_. 2nd ed. Baker Academic, 1996. = 卡森(D.A. Carson)。《再思解經錯謬》。余德林、郭秀娟譯。台北市:校園書房,1998。 + +### Verbal Aspects +- Campbell, Constantine R. _Basics Of Verbal Aspect In Biblical Greek_. Zondervan, 2008. = 君士坦丁‧坎柏(Constantine R. Campbell)。《聖經希臘文基礎:動詞觀點》。汪仁潔譯。加州:麥種,2020。 +- Runge, Steven E, and Christopher J Fresch, eds. _The Greek Verb Revisited: A Fresh Approach for Biblical Exegesis_. Bellingham, WA.: Lexham Press, 2016. + + +### 單卷希臘文解經 + +#### BHGNT Series + +- Adam, A. K. M. *James: A Handbook on the Greek Text*. BHGNT. Waco, Tex: Baylor University Press, 2013. +- Brookins, Timothy A., and Bruce W. Longenecker. *1 Corinthians 1-9: A Handbook on the Greek Text*. BHGNT. Waco: Baylor University Press, 2016. +- ———. *1 Corinthians 10-16: A Handbook on the Greek Text*. BHGNT. Waco: Baylor University Press, 2016. +- Campbell, Constantine R. *Colossians and Philemon: A Handbook on the Greek Text*. BHGNT. Waco, Texas: Baylor University Press, 2013. +- Culy, Martin M. *I, II, III John: A Handbook on the Greek Text*. BHGNT. Baylor University Press, 2004. +- Culy, Martin M., Mikeal C. Parsons, and Joshua J. Stigall. *Luke: A Handbook on the Greek Text*. BHGNT. Baylor University Press, 2010. +- Davids, Peter H. *2 Peter and Jude: A Handbook on the Greek Text*. BHGNT. Waco, Tex: Baylor University Press, 2011. +- Decker, Rodney J. *Mark 1–8: A Handbook on the Greek Text*. BHGNT. Waco: Baylor University Press, 2014. +- ———. *Mark 9–16: A Handbook on the Greek Text*. BHGNT. Waco: Baylor University Press, 2014. +- DeSilva, David Arthur. *Galatians: A Handbook on the Greek Text*. BHGNT. Waco, Texas: Baylor University Press, 2014. +- Dubis, Mark. *1 Peter: A Handbook on the Greek Text*. BHGNT. Baylor University Press, 2010. +- Larkin, William J. *Ephesians: A Handbook on the Greek Text*. BHGNT. Baylor University Press, 2009. +- Long, Fredrick J. *2 Corinthians: A Handbook on the Greek Text*. BHGNT. Waco, Texas: Baylor University Press, 2014. +- Mathewson, David. *Revelation: A Handbook on the Greek Text*. BHGNT. Waco: Baylor University Press, 2016. +- Parsons, Mikeal C., and Martin M. Culy. *Acts: A Handbook on the Greek Text*. BHGNT. Baylor University Press, 2003. +- Perkins, Larry J. *The Pastoral Letters: A Handbook on the Greek Text*. BHGNT. Waco, Texas: Baylor University Press, 2017. +- Varner, William C. *Philippians: A Handbook on the Greek Text*. BHGNT. Waco: Baylor University Press, 2016. + +#### EGGNT Series + +- Forbes, Greg W. *1 Peter*. EGGNT. Nashville, TN.: B & H Academic, 2014. +- Harris, Dana M. *Hebrews*. EGGNT. Nashville, TN.: B & H Academic, 2019. +- Harris, Murray J. *Colossians and Philemon*. EGGNT. Nashville, TN.: B & H Academic, 2010. +- ———. *John*. EGGNT. Nashville, TN.: B & H Academic, 2015. +- Harvey, John D. *Romans*. EGGNT. Nashville, TN.: B & H Academic, 2017. +- Hellerman, Joseph H. *Philippians*. EGGNT. Nashville, TN.: B & H Academic, 2016. +- Kellum, L. Scott.** Acts*. EGGNT. Nashville, TN.: B & H Academic, 2020. +- Kruse, Colin G. *2 Corinthians*. EGGNT. Nashville, TN.: B & H Academic, 2020. +- Merkle, Benjamin L. *Ephesians*. EGGNT. Nashville, TN.: B & H Academic, 2016. +- Quarles, Charles L. *Matthew*. EGGNT. Nashville, TN.: B & H Academic, 2017. +- Thompson, Alan J. *Luke*. EGGNT. Nashville, TN.: B & H Academic, 2017. +- Vlachos, Chris A. *James*. EGGNT. Nashville, TN.: B & H Academic, 2013. +- Williams, Joel F. *Mark*. EGGNT. Nashville, TN.: B & H Academic, 2020. + +#### Big Greek Idea Series + +- Bateman IV, Herbert W. *John's Letters: An Exegetical Guide for Preaching and Teaching*. BGI. Grand Rapids, MI.: Kregel Academic, 2018. +- Moore, Thomas. *Philippians: An Exegetical Guide for Preaching and Teaching*. BGI. Grand Rapids, MI.: Kregel Academic, 2019. +- Simpson, Benjamin I. *Ephesians: An Exegetical Guide for Preaching and Teaching*. BGI. Grand Rapids, MI.: Kregel Academic, 2020. + + +#### Exegetical Summary Series + +- Abernathy, C. David. *An Exegetical Summary of 2 Corinthians*. ESS. Dallas, TX.: SIL International, 2008. +- ———. *An Exegetical Summary of I Peter*. ESS. Dallas, TX.: SIL International, 2008. +- ———. *An Exegetical Summary of Matthew 1-16*. ESS. Dallas, TX.: SIL International, 2013. +- ———. *An Exegetical Summary of Matthew 17-28*. ESS. Dallas, TX.: SIL International, 2015. +- ———. *An Exegetical Summary of Romans 1-8*. ESS. Dallas, TX.: SIL International, 2008. +- ———. *An Exegetical Summary of Romans 9-16*. ESS. Dallas, TX.: SIL International, 2009. +- Abernathy, David, and Robert Stutzman. *An Exegetical Summary of Acts 15-28*. ESS. Dallas, TX.: SIL International, 2018. +- Anderson, John L. *An Exegetical Summary of 1, 2, and 3 John*. ESS. Dallas, TX.: SIL International, 2008. +- Blight, Richard C. *An Exegetical Summary of 1 & 2 Thessalonians*. ESS. Dallas, TX.: SIL International, 2008. +- Blight, Richard C. *An Exegetical Summary of 1 Timothy*. ESS. Dallas, TX.: SIL International, 2009. +- ———. *An Exegetical Summary of Luke 1-11*. ESS. Dallas, TX.: SIL International, 2008. +- ———. *An Exegetical Summary of Luke 12-24*. ESS. Dallas, TX.: SIL International, 2008. +- ———. *An Exegetical Summary of Mark 1-8*. ESS. Dallas, TX.: SIL International, 2012. +- ———. *An Exegetical Summary of Mark 9-16*. ESS. Dallas, TX.: SIL International, 2014. +- Cheng, Belinda, and Robert Stutzman. *An Exegetical Summary of Acts 1-14*. ESS. Dallas, TX.: SIL International, 2017. +- Graham, Glenn H. *An Exegetical Summary of Ephesians*. ESS. Dallas, TX.: SIL International, 2008. +- Greenlee, J. Harold. *An Exegetical Summary of Hebrews*. ESS. Dallas, TX.: SIL International, 2008. +- ———. *An Exegetical Summary of James*. ESS. Dallas, TX.: SIL International, 2008. +- ———. *An Exegetical Summary of Jude*. ESS. Dallas, TX.: SIL International, 2008. +- ———. *An Exegetical Summary of Philippians*. ESS. Dallas, TX.: SIL International, 2008. +- ———. *An Exegetical Summary of Titus and Philemon*. ESS. Dallas, TX.: SIL International, 2008. +- King, Martha. *An Exegetical Summary of Colossians*. ESS. Dallas, TX.: SIL International, 2008. +- Minor, Eugene E. *An Exegetical Summary of 2 Timothy*. ESS. Dallas, TX.: SIL International, 2008. +- Strange, David. *An Exegetical Summary of 2 Peter*. ESS. Dallas, TX.: SIL International, 2008. +- Stutzman, Robert. *An Exegetical Summary of Galatians*. ESS. Dallas, TX.: SIL International, 2008. +- Tehan, Thomas M, and C. David Abernathy. *An Exegetical Summary of the Sermon on the Mount*. ESS. Dallas, TX.: SIL International, 2008. +- Trail, Ronald L. *An Exegetical Summary of 1 Corinthians 1-9*. ESS. Dallas, TX.: SIL International, 2008. +- ———. *An Exegetical Summary of 1 Corinthians 10-16*. ESS. Dallas, TX.: SIL International, 2008. +- ———. *An Exegetical Summary of John 1-9*. ESS. Dallas, TX.: SIL International, 2013. +- ———. *An Exegetical Summary of John 10-21*. ESS. Dallas, TX.: SIL International, 2018. +- ———. *An Exegetical Summary of Revelation 1-11*. ESS. Dallas, TX.: SIL International, 2008. +- ———. *An Exegetical Summary of Revelation 12-22*. ESS. Dallas, TX.: SIL International, 2008. + diff --git a/數位工具.md b/數位工具.md new file mode 100644 index 0000000..2070116 --- /dev/null +++ b/數位工具.md @@ -0,0 +1,113 @@ +# 聖經希臘文資源工具 + + +## 數位工具 +希臘文相關的數位工具不勝枚舉,以下僅列出幾個比較有特色的工具。 + +### 希臘文聖經閱讀 + +#### 網站 +- [信望愛](https://bible.fhl.net/) + - 有[希臘文、中文 interlinear (逐字對照)](https://bible.fhl.net/new/read.php?VERSION16=interubs4&strongflag=0&TABFLAG=1&chineses=%E5%A4%AA&chap=1&submit1=%E9%96%B1%E8%AE%80) + - 有 [Westcott-Hort 版本聖經+NA27 Variants (異文)](https://bible.fhl.net/new/fhlwhparsing.php?engs=Matt&chap=1&sec=1) 加上簡單的斷句 (phrasing) + - 還有浸宣出版、戴德理翻譯的《新約希臘文中文辭典》:[中文 BAGD](http://bible.fhl.net/new/s.php?N=0&k=2316&m=) + - 還有 2020 年黃錫木主編、修訂 Louw–Nida 1998 出版 *Greek-English Lexicon of the New Testament: Based on Semantic Domains* 之辭典的[《希英新約大詞典──以語義域為基礎》](https://bkbible.fhl.net/SDBG_zh.html) + - 不能下載。 +- [BibleArc](https://www.biblearc.com/) + - 有 SBL、NA28、LXX 經文版本 + - 可以畫圖析 (word-level、phrase-level、proposition-level diagram)。圖析功能勝過付費軟體,而且可以把圖析和解經心得發佈到網路上 + - 能夠作 word-level、phrase-level 的詞形搜尋 (morphological search),以及簡單的句法搜尋 (syntax search) + - 需要申請帳號 (台灣 2020 年還是免費) +- [OpenGNT](https://opengnt.com/)、[Marvel Bible](https://marvel.bible/)、[Bible Bento](https://BibleBento.com)、[Unique Bible](https://www.uniquebible.app/home) + - 都出自同一位軟體作者 [Eliran wong](https://github.com/eliranwong),嘗試整合網路上所有公開分享的資源,打造一個跨平台 (Windows, Android, macOS, Linux, Chrome OS) 的軟體,壯志雄心,令人欽佩! + - [OpenHebrewBible](https://github.com/eliranwong/OpenHebrewBible) + - [ETCBC] (Hebrew text BHSA, linguitic annotations, morphology, etc.) + - OpenScriptures (Hebrew text WLC, Strong's numbers, morphology, etc.) + - Berean.bible (interlinear translation, Berean Study Bible, etc.) + - [OpenGNT](https://github.com/eliranwong/OpenGNT) — + - + - [OpenText](http://opentext.org/) — +- [Academic Bible](https://www.academic-bible.com/en/home/) + - 德國聖經公會網站,有學術界標準的 NA28、UBS5、LXX (Ralphs-Hanhart 2006),但是沒有紙本聖經上其他的相關資料 (如:文本校勘欄、分段校勘欄、經文互參欄、舊約引據)。 + - 沒有辭典;不能下載。 +- [Louw-Nida Lexicon](https://www.laparola.net/greco/louwnida.php) + - 義大利文 [La Parola (The Word) 網站](https://www.laparola.net/) 下面附屬的網頁,可以搜尋 Louw–Nida 辭典。 +- [Robinson-Pierpont 2005](https://byzantinetext.com) + - Byzantine Text (Robinson-Pierpont 2005 版)。除了聖經文本電子檔之外,還有 John Jeffrey Dodson 所編 Reader's Edition (輔讀本) [電子檔](https://byzantinetext.com/wp-content/uploads/2017/08/RP2016-Readers-Edition.pdf)。 + - 沒有辭典;但可以下載。 +- [eRhema Bible App](https://bible.tjc.org) + - 真耶穌教會 + +#### Android +- [微讀聖經](https://app.wedevote.com/) + - 中文譯本多 (和合、和修、當代、新譯、呂振中、現代中文、標準),排版美觀,還有信望愛原文資料庫 (連同中文 BAGD)。 + - 大力推荐。 +- [Greek New Testament Reader](https://play.google.com/store/apps/details?id=com.mattrobertson.greek.reader) + - 介面清爽,適合純讀經。 + + +#### iOS +- [微讀聖經](https://app.wedevote.com/) + - 中文譯本多 (和合、和修、當代、新譯、呂振中、現代中文、標準),排版美觀,還有信望愛原文資料庫 (連同中文 BAGD)。 + - 大力推荐。 + +### 希臘文語音聖經 +- [Robinson-Pierpont 2005](https://byzantinetext.com/listen/) + - 版本:Byzantine Text (Robinson-Pierpont 2005 版) + - 發音:Erasmian + - 朗讀:Maurice Robinson + - 可以免費下載 +- Koine Greek - New Testament:[Dropbox](https://www.dropbox.com/sh/beoqrdw8zkq1ahr/AABPJTJa5J9RU1y2wyChvPIxa)、[Youtube](https://www.youtube.com/playlist?list=PL40D66708671D260F) + - 經文版本:Textus Receptus + - 發音:Modern Greek + - 朗讀:Theo Karvounakis + - 可以免費下載 + + +--- + + +--- 中文聖經彙編 +https://biblesearch.com.tw/compile/ + +--- 中文主題聖經 +https://biblesearch.com.tw/topic/ + +--- 中文智慧型聖經搜尋引擎 +https://biblesearch.com.tw/search/index2.html + +2) 手機平板工具 + + +--- BibleBento (iOS)【功能強大,只是我沒用過】 +https://apps.apple.com/us/app/biblebento/id1324080012 +https://apps.apple.com/us/app/biblebento-plus/id1439743446 + +3) 希臘文字典網站 +https://greeklexicon.org +有 Dodson(2010)、Strong(1890)、Abbott-Smith(1922) 三種辭典。 + +https://www.laparola.net/greco/louwnida.php +有 Louw & Nida 字典 + +4) 音速調整播放 App +---Music Speed Changer +https://play.google.com/store/apps/details?id=com.smp.musicspeedclassic + +---音乐速度调节器 +https://play.google.com/store/apps/details?id=com.smp.musicspeed + +) 希臘文輸入法 +---Tyndale 的鍵盤輸入程式https://academic.tyndalehouse.com/unicode-font-kit + +5) 希臘文比較美觀的字型 +--- SBL +https://www.sbl-site.org/educational/biblicalfonts.aspx + + +3) 馬可福音影音 +--- Daily Dose of Greek【Erasmian發音+文法解釋,大力推荐,反覆聆聽,先從馬可福音第一章開始】 +https://dailydoseofgreek.com/read-greek/mark/mark-1/ + +---KoineGreek.com 【reconstructed發音,活潑生動】 +https://www.koinegreek.com/ntaudio