From e7b0b487311b57c452b6a392388f1fe3bd3ed9ae Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Sun, 30 Oct 2022 22:08:56 +0200 Subject: [PATCH 01/29] Refactoring: initial extraction of the rendering logic out of Task, and better task component representation --- src/IQuery.ts | 2 +- src/InlineRenderer.ts | 4 + src/LayoutOptions.ts | 13 - src/Query/Query.ts | 2 +- src/Task.ts | 275 +- src/TaskLayout.ts | 61 + src/TaskLineRenderer.ts | 169 + yarn.lock | 7241 +++++++++++++++++++-------------------- 8 files changed, 3738 insertions(+), 4029 deletions(-) delete mode 100644 src/LayoutOptions.ts create mode 100644 src/TaskLayout.ts create mode 100644 src/TaskLineRenderer.ts diff --git a/src/IQuery.ts b/src/IQuery.ts index 24dc134a1e..56e1110cf8 100644 --- a/src/IQuery.ts +++ b/src/IQuery.ts @@ -1,4 +1,4 @@ -import type { LayoutOptions } from './LayoutOptions'; +import type { LayoutOptions } from './TaskLayout'; import type { Task } from './Task'; import type { TaskGroups } from './Query/TaskGroups'; import type { Grouping } from './Query/Query'; diff --git a/src/InlineRenderer.ts b/src/InlineRenderer.ts index 5cbe76e05f..83d1522612 100644 --- a/src/InlineRenderer.ts +++ b/src/InlineRenderer.ts @@ -10,6 +10,10 @@ export class InlineRenderer { public markdownPostProcessor = this._markdownPostProcessor.bind(this); + /** + * This renders a file's task list when rendered in Reading View, using roughly the same pipeline + * of QueryRenderer (e.g. it removes the global filter and handles other formatting). + */ private async _markdownPostProcessor(element: HTMLElement, context: MarkdownPostProcessorContext): Promise { const { globalFilter } = getSettings(); const renderedElements = element.findAll('.task-list-item').filter((taskItem) => { diff --git a/src/LayoutOptions.ts b/src/LayoutOptions.ts deleted file mode 100644 index cf0660e5d8..0000000000 --- a/src/LayoutOptions.ts +++ /dev/null @@ -1,13 +0,0 @@ -export class LayoutOptions { - hideTaskCount: boolean = false; - hideBacklinks: boolean = false; - hidePriority: boolean = false; - hideStartDate: boolean = false; - hideScheduledDate: boolean = false; - hideDoneDate: boolean = false; - hideDueDate: boolean = false; - hideRecurrenceRule: boolean = false; - hideEditButton: boolean = false; - hideUrgency: boolean = true; - shortMode: boolean = false; -} diff --git a/src/Query/Query.ts b/src/Query/Query.ts index f1ab1a43ab..7239924c5e 100644 --- a/src/Query/Query.ts +++ b/src/Query/Query.ts @@ -1,4 +1,4 @@ -import { LayoutOptions } from '../LayoutOptions'; +import { LayoutOptions } from '../TaskLayout'; import type { Task } from '../Task'; import type { IQuery } from '../IQuery'; import { Sort } from './Sort'; diff --git a/src/Task.ts b/src/Task.ts index effd4b2beb..c449ac03de 100644 --- a/src/Task.ts +++ b/src/Task.ts @@ -1,11 +1,12 @@ import type { Moment } from 'moment'; -import { Component, MarkdownRenderer } from 'obsidian'; -import { replaceTaskWithTasks } from './File'; -import { LayoutOptions } from './LayoutOptions'; +import { LayoutOptions, TaskLayout } from './TaskLayout'; +import type { LayoutComponent } from './TaskLayout'; import { Recurrence } from './Recurrence'; import { getSettings } from './Config/Settings'; import { Urgency } from './Urgency'; import { Sort } from './Query/Sort'; +import { renderTaskLine } from './TaskLineRenderer'; +import type { TaskLineRenderDetails } from './TaskLineRenderer'; /** * Collection of status types supported by the plugin. @@ -420,93 +421,9 @@ export class Task { }); } - public async toLi({ - parentUlElement, - listIndex, - layoutOptions, - isFilenameUnique, - }: { - parentUlElement: HTMLElement; - /** The nth item in this list (including non-tasks). */ - listIndex: number; - layoutOptions?: LayoutOptions; - isFilenameUnique?: boolean; - }): Promise { - const li: HTMLLIElement = parentUlElement.createEl('li'); - li.addClasses(['task-list-item', 'plugin-tasks-list-item']); - - let taskAsString = this.toString(layoutOptions); - const { globalFilter, removeGlobalFilter } = getSettings(); - if (removeGlobalFilter) { - taskAsString = taskAsString.replace(globalFilter, '').trim(); - } - - const textSpan = li.createSpan(); - textSpan.addClass('tasks-list-text'); - - await MarkdownRenderer.renderMarkdown(taskAsString, textSpan, this.path, null as unknown as Component); - - // If the task is a block quote, the block quote wraps the p-tag that contains the content. - // In that case, we need to unwrap the p-tag *inside* the surrounding block quote. - // Otherwise, we unwrap the p-tag as a direct descendant of the textSpan. - const blockQuote = textSpan.querySelector('blockquote'); - const directParentOfPTag = blockQuote ?? textSpan; - - // Unwrap the p-tag that was created by the MarkdownRenderer: - const pElement = directParentOfPTag.querySelector('p'); - if (pElement !== null) { - while (pElement.firstChild) { - directParentOfPTag.insertBefore(pElement.firstChild, pElement); - } - pElement.remove(); - } - - // Remove an empty trailing p-tag that the MarkdownRenderer appends when there is a block link: - textSpan.findAll('p').forEach((pElement) => { - if (!pElement.hasChildNodes()) { - pElement.remove(); - } - }); - - // Remove the footnote that the MarkdownRenderer appends when there is a footnote in the task: - textSpan.findAll('.footnotes').forEach((footnoteElement) => { - footnoteElement.remove(); - }); - - const checkbox = li.createEl('input'); - checkbox.addClass('task-list-item-checkbox'); - checkbox.type = 'checkbox'; - if (this.status !== Status.TODO) { - checkbox.checked = true; - li.addClass('is-checked'); - } - checkbox.onClickEvent((event: MouseEvent) => { - event.preventDefault(); - // It is required to stop propagation so that obsidian won't write the file with the - // checkbox (un)checked. Obsidian would write after us and overwrite our change. - event.stopPropagation(); - - // Should be re-rendered as enabled after update in file. - checkbox.disabled = true; - const toggledTasks = this.toggle(); - replaceTaskWithTasks({ - originalTask: this, - newTasks: toggledTasks, - }); - }); - - li.prepend(checkbox); - - // Set these to be compatible with stock obsidian lists: - li.setAttr('data-task', this.originalStatusCharacter.trim()); // Trim to ensure empty attribute for space. Same way as obsidian. - li.setAttr('data-line', listIndex); - checkbox.setAttr('data-line', listIndex); - - if (layoutOptions?.shortMode) { - this.addTooltip({ element: textSpan, isFilenameUnique }); - } - - return li; + // TODO: Possibly remove this and call TaskLineRenderer directly + public async toLi(renderDetails: TaskLineRenderDetails): Promise { + return renderTaskLine(this, renderDetails); } /** @@ -517,62 +434,60 @@ export class Task { * @memberof Task */ public toString(layoutOptions?: LayoutOptions): string { - layoutOptions = layoutOptions ?? new LayoutOptions(); - let taskString = this.description; - - if (!layoutOptions.hidePriority) { - let priority: string = ''; - - if (this.priority === Priority.High) { - priority = ' ' + prioritySymbols.High; - } else if (this.priority === Priority.Medium) { - priority = ' ' + prioritySymbols.Medium; - } else if (this.priority === Priority.Low) { - priority = ' ' + prioritySymbols.Low; - } - - taskString += priority; - } - - if (!layoutOptions.hideRecurrenceRule && this.recurrence) { - const recurrenceRule: string = layoutOptions.shortMode - ? ' ' + recurrenceSymbol - : ` ${recurrenceSymbol} ${this.recurrence.toText()}`; - taskString += recurrenceRule; - } - - if (!layoutOptions.hideStartDate && this.startDate) { - const startDate: string = layoutOptions.shortMode - ? ' ' + startDateSymbol - : ` ${startDateSymbol} ${this.startDate.format(TaskRegularExpressions.dateFormat)}`; - taskString += startDate; - } - - if (!layoutOptions.hideScheduledDate && this.scheduledDate) { - const scheduledDate: string = layoutOptions.shortMode - ? ' ' + scheduledDateSymbol - : ` ${scheduledDateSymbol} ${this.scheduledDate.format(TaskRegularExpressions.dateFormat)}`; - taskString += scheduledDate; - } - - if (!layoutOptions.hideDueDate && this.dueDate) { - const dueDate: string = layoutOptions.shortMode - ? ' ' + dueDateSymbol - : ` ${dueDateSymbol} ${this.dueDate.format(TaskRegularExpressions.dateFormat)}`; - taskString += dueDate; + const taskLayout = new TaskLayout(layoutOptions); + let taskString = ''; + for (const component of taskLayout.layoutComponents) { + taskString += this.componentToString(taskLayout, component); } + return taskString; + } - if (!layoutOptions.hideDoneDate && this.doneDate) { - const doneDate: string = layoutOptions.shortMode - ? ' ' + doneDateSymbol - : ` ${doneDateSymbol} ${this.doneDate.format(TaskRegularExpressions.dateFormat)}`; - taskString += doneDate; + componentToString(layout: TaskLayout, component: LayoutComponent) { + switch (component) { + case 'description': + return this.description; + case 'priority': { + let priority: string = ''; + + if (this.priority === Priority.High) { + priority = ' ' + prioritySymbols.High; + } else if (this.priority === Priority.Medium) { + priority = ' ' + prioritySymbols.Medium; + } else if (this.priority === Priority.Low) { + priority = ' ' + prioritySymbols.Low; + } + return priority; + } + case 'startDate': + if (!this.startDate) return ''; + return layout.options.shortMode + ? ' ' + startDateSymbol + : ` ${startDateSymbol} ${this.startDate.format(TaskRegularExpressions.dateFormat)}`; + case 'scheduledDate': + if (!this.scheduledDate) return ''; + return layout.options.shortMode + ? ' ' + scheduledDateSymbol + : ` ${scheduledDateSymbol} ${this.scheduledDate.format(TaskRegularExpressions.dateFormat)}`; + case 'doneDate': + if (!this.doneDate) return ''; + return layout.options.shortMode + ? ' ' + doneDateSymbol + : ` ${doneDateSymbol} ${this.doneDate.format(TaskRegularExpressions.dateFormat)}`; + case 'dueDate': + if (!this.dueDate) return ''; + return layout.options.shortMode + ? ' ' + dueDateSymbol + : ` ${dueDateSymbol} ${this.dueDate.format(TaskRegularExpressions.dateFormat)}`; + case 'recurrenceRule': + if (!this.recurrence) return ''; + return layout.options.shortMode + ? ' ' + recurrenceSymbol + : ` ${recurrenceSymbol} ${this.recurrence.toText()}`; + case 'blockLink': + return this.blockLink ?? ''; + default: + throw new Error(`Don't know how to render task component of type '${component}'`); } - - const blockLink: string = this.blockLink ?? ''; - taskString += blockLink; - - return taskString; } /** @@ -782,80 +697,6 @@ export class Task { return true; } - private addTooltip({ - element, - isFilenameUnique, - }: { - element: HTMLElement; - isFilenameUnique: boolean | undefined; - }): void { - element.addEventListener('mouseenter', () => { - const tooltip = element.createDiv(); - tooltip.addClasses(['tooltip', 'mod-right']); - - if (this.recurrence) { - const recurrenceDiv = tooltip.createDiv(); - recurrenceDiv.setText(`${recurrenceSymbol} ${this.recurrence.toText()}`); - } - - if (this.startDate) { - const startDateDiv = tooltip.createDiv(); - startDateDiv.setText( - Task.toTooltipDate({ - signifier: startDateSymbol, - date: this.startDate, - }), - ); - } - - if (this.scheduledDate) { - const scheduledDateDiv = tooltip.createDiv(); - scheduledDateDiv.setText( - Task.toTooltipDate({ - signifier: scheduledDateSymbol, - date: this.scheduledDate, - }), - ); - } - - if (this.dueDate) { - const dueDateDiv = tooltip.createDiv(); - dueDateDiv.setText( - Task.toTooltipDate({ - signifier: dueDateSymbol, - date: this.dueDate, - }), - ); - } - - if (this.doneDate) { - const doneDateDiv = tooltip.createDiv(); - doneDateDiv.setText( - Task.toTooltipDate({ - signifier: doneDateSymbol, - date: this.doneDate, - }), - ); - } - - const linkText = this.getLinkText({ isFilenameUnique }); - if (linkText) { - const backlinkDiv = tooltip.createDiv(); - backlinkDiv.setText(`🔗 ${linkText}`); - } - - element.addEventListener('mouseleave', () => { - tooltip.remove(); - }); - }); - } - - private static toTooltipDate({ signifier, date }: { signifier: string; date: Moment }): string { - return `${signifier} ${date.format(TaskRegularExpressions.dateFormat)} (${date.from( - window.moment().startOf('day'), - )})`; - } - /** * Escape a string so it can be used as part of a RegExp literally. * Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping diff --git a/src/TaskLayout.ts b/src/TaskLayout.ts new file mode 100644 index 0000000000..f250466cc8 --- /dev/null +++ b/src/TaskLayout.ts @@ -0,0 +1,61 @@ +export class LayoutOptions { + hideTaskCount: boolean = false; + hideBacklinks: boolean = false; + hidePriority: boolean = false; + hideStartDate: boolean = false; + hideScheduledDate: boolean = false; + hideDoneDate: boolean = false; + hideDueDate: boolean = false; + hideRecurrenceRule: boolean = false; + hideEditButton: boolean = false; + hideUrgency: boolean = true; + shortMode: boolean = false; +} + +export type LayoutComponent = + | 'description' + | 'priority' + | 'recurrenceRule' + | 'startDate' + | 'scheduledDate' + | 'dueDate' + | 'doneDate' + | 'blockLink'; + +export class TaskLayout { + public defaultLayout: LayoutComponent[] = [ + 'description', + 'priority', + 'recurrenceRule', + 'startDate', + 'scheduledDate', + 'dueDate', + 'doneDate', + 'blockLink', + ]; + public layoutComponents: LayoutComponent[]; + public options: LayoutOptions; + + constructor(options?: LayoutOptions, components?: LayoutComponent[]) { + if (options) this.options = options; + else this.options = new LayoutOptions(); + if (components) this.layoutComponents = components; + else this.layoutComponents = this.defaultLayout; + + this.layoutComponents = this.applyOptions(this.options); + } + + /** + * Return a new list of components with the given options applied. + */ + applyOptions(layoutOptions: LayoutOptions): LayoutComponent[] { + const newComponents = this.layoutComponents; + if (layoutOptions.hidePriority) newComponents.remove('priority'); + if (layoutOptions.hideRecurrenceRule) newComponents.remove('recurrenceRule'); + if (layoutOptions.hideStartDate) newComponents.remove('startDate'); + if (layoutOptions.hideScheduledDate) newComponents.remove('scheduledDate'); + if (layoutOptions.hideDueDate) newComponents.remove('dueDate'); + if (layoutOptions.hideDoneDate) newComponents.remove('doneDate'); + return newComponents; + } +} diff --git a/src/TaskLineRenderer.ts b/src/TaskLineRenderer.ts new file mode 100644 index 0000000000..206d64c2d6 --- /dev/null +++ b/src/TaskLineRenderer.ts @@ -0,0 +1,169 @@ +import { Component, MarkdownRenderer } from 'obsidian'; +import type { Moment } from 'moment'; +import type { Task } from './Task'; +import * as taskModule from './Task'; +import type { LayoutOptions } from './TaskLayout'; +import { getSettings } from './Config/Settings'; +import { replaceTaskWithTasks } from './File'; + +export type TaskLineRenderDetails = { + parentUlElement: HTMLElement; + /** The nth item in this list (including non-tasks). */ + listIndex: number; + layoutOptions?: LayoutOptions; + isFilenameUnique?: boolean; +}; + +export async function renderTaskLine(task: Task, renderDetails: TaskLineRenderDetails): Promise { + const li: HTMLLIElement = renderDetails.parentUlElement.createEl('li'); + li.addClasses(['task-list-item', 'plugin-tasks-list-item']); + + let taskAsString = task.toString(renderDetails.layoutOptions); + const { globalFilter, removeGlobalFilter } = getSettings(); + if (removeGlobalFilter) { + taskAsString = taskAsString.replace(globalFilter, '').trim(); + } + + const textSpan = li.createSpan(); + textSpan.addClass('tasks-list-text'); + + await MarkdownRenderer.renderMarkdown(taskAsString, textSpan, task.path, null as unknown as Component); + + // If the task is a block quote, the block quote wraps the p-tag that contains the content. + // In that case, we need to unwrap the p-tag *inside* the surrounding block quote. + // Otherwise, we unwrap the p-tag as a direct descendant of the textSpan. + const blockQuote = textSpan.querySelector('blockquote'); + const directParentOfPTag = blockQuote ?? textSpan; + + // Unwrap the p-tag that was created by the MarkdownRenderer: + const pElement = directParentOfPTag.querySelector('p'); + if (pElement !== null) { + while (pElement.firstChild) { + directParentOfPTag.insertBefore(pElement.firstChild, pElement); + } + pElement.remove(); + } + + // Remove an empty trailing p-tag that the MarkdownRenderer appends when there is a block link: + textSpan.findAll('p').forEach((pElement) => { + if (!pElement.hasChildNodes()) { + pElement.remove(); + } + }); + + // Remove the footnote that the MarkdownRenderer appends when there is a footnote in the task: + textSpan.findAll('.footnotes').forEach((footnoteElement) => { + footnoteElement.remove(); + }); + + const checkbox = li.createEl('input'); + checkbox.addClass('task-list-item-checkbox'); + checkbox.type = 'checkbox'; + if (task.status !== taskModule.Status.TODO) { + checkbox.checked = true; + li.addClass('is-checked'); + } + checkbox.onClickEvent((event: MouseEvent) => { + event.preventDefault(); + // It is required to stop propagation so that obsidian won't write the file with the + // checkbox (un)checked. Obsidian would write after us and overwrite our change. + event.stopPropagation(); + + // Should be re-rendered as enabled after update in file. + checkbox.disabled = true; + const toggledTasks = task.toggle(); + replaceTaskWithTasks({ + originalTask: task, + newTasks: toggledTasks, + }); + }); + + li.prepend(checkbox); + + // Set these to be compatible with stock obsidian lists: + li.setAttr('data-task', task.originalStatusCharacter.trim()); // Trim to ensure empty attribute for space. Same way as obsidian. + li.setAttr('data-line', renderDetails.listIndex); + checkbox.setAttr('data-line', renderDetails.listIndex); + + if (renderDetails.layoutOptions?.shortMode) { + addTooltip({ task, element: textSpan, isFilenameUnique: renderDetails.isFilenameUnique }); + } + + return li; +} + +function addTooltip({ + task, + element, + isFilenameUnique, +}: { + task: Task; + element: HTMLElement; + isFilenameUnique: boolean | undefined; +}): void { + element.addEventListener('mouseenter', () => { + const tooltip = element.createDiv(); + tooltip.addClasses(['tooltip', 'mod-right']); + + if (task.recurrence) { + const recurrenceDiv = tooltip.createDiv(); + recurrenceDiv.setText(`${taskModule.recurrenceSymbol} ${task.recurrence.toText()}`); + } + + if (task.startDate) { + const startDateDiv = tooltip.createDiv(); + startDateDiv.setText( + toTooltipDate({ + signifier: taskModule.startDateSymbol, + date: task.startDate, + }), + ); + } + + if (task.scheduledDate) { + const scheduledDateDiv = tooltip.createDiv(); + scheduledDateDiv.setText( + toTooltipDate({ + signifier: taskModule.scheduledDateSymbol, + date: task.scheduledDate, + }), + ); + } + + if (task.dueDate) { + const dueDateDiv = tooltip.createDiv(); + dueDateDiv.setText( + toTooltipDate({ + signifier: taskModule.dueDateSymbol, + date: task.dueDate, + }), + ); + } + + if (task.doneDate) { + const doneDateDiv = tooltip.createDiv(); + doneDateDiv.setText( + toTooltipDate({ + signifier: taskModule.doneDateSymbol, + date: task.doneDate, + }), + ); + } + + const linkText = task.getLinkText({ isFilenameUnique }); + if (linkText) { + const backlinkDiv = tooltip.createDiv(); + backlinkDiv.setText(`🔗 ${linkText}`); + } + + element.addEventListener('mouseleave', () => { + tooltip.remove(); + }); + }); +} + +function toTooltipDate({ signifier, date }: { signifier: string; date: Moment }): string { + return `${signifier} ${date.format(taskModule.TaskRegularExpressions.dateFormat)} (${date.from( + window.moment().startOf('day'), + )})`; +} diff --git a/yarn.lock b/yarn.lock index 41d185bbe9..7a22cab95a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,63 +2,22 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" - integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8": + "integrity" "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==" + "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz" + "version" "7.15.8" dependencies: "@babel/highlight" "^7.14.5" "@babel/compat-data@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" - integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== - -"@babel/compat-data@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.6.tgz#8b37d24e88e8e21c499d4328db80577d8882fa53" - integrity sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ== - -"@babel/core@^7.11.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.6.tgz#54a107a3c298aee3fe5e1947a6464b9b6faca03d" - integrity sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.6" - "@babel/helper-compilation-targets" "^7.18.6" - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helpers" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.6" - "@babel/types" "^7.18.6" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/core@^7.12.3": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" - integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== + "integrity" "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz" + "version" "7.15.0" + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.10.2", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": + "integrity" "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==" + "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz" + "version" "7.15.8" dependencies: "@babel/code-frame" "^7.15.8" "@babel/generator" "^7.15.8" @@ -69,119 +28,73 @@ "@babel/template" "^7.15.4" "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.6" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" + "convert-source-map" "^1.7.0" + "debug" "^4.1.0" + "gensync" "^1.0.0-beta.2" + "json5" "^2.1.2" + "semver" "^6.3.0" + "source-map" "^0.5.0" "@babel/generator@^7.15.4", "@babel/generator@^7.15.8", "@babel/generator@^7.7.2": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" - integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== + "integrity" "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==" + "resolved" "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz" + "version" "7.15.8" dependencies: "@babel/types" "^7.15.6" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.18.6": - version "7.18.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.7.tgz#2aa78da3c05aadfc82dbac16c99552fc802284bd" - integrity sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A== - dependencies: - "@babel/types" "^7.18.7" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" + "jsesc" "^2.5.1" + "source-map" "^0.5.0" "@babel/helper-compilation-targets@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" - integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== + "integrity" "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==" + "resolved" "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/compat-data" "^7.15.0" "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz#18d35bfb9f83b1293c22c55b3d576c1315b6ed96" - integrity sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg== - dependencies: - "@babel/compat-data" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz#b7eee2b5b9d70602e59d1a6cad7dd24de7ca6cd7" - integrity sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q== + "browserslist" "^4.16.6" + "semver" "^6.3.0" "@babel/helper-function-name@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" - integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== + "integrity" "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==" + "resolved" "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/helper-get-function-arity" "^7.15.4" "@babel/template" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helper-function-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz#8334fecb0afba66e6d87a7e8c6bb7fed79926b83" - integrity sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw== - dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.6" - "@babel/helper-get-function-arity@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" - integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== + "integrity" "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==" + "resolved" "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/types" "^7.15.4" "@babel/helper-hoist-variables@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" - integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== + "integrity" "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==" + "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/types" "^7.15.4" -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - "@babel/helper-member-expression-to-functions@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" - integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== + "integrity" "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==" + "resolved" "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/types" "^7.15.4" "@babel/helper-module-imports@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" - integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== + "integrity" "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==" + "resolved" "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/types" "^7.15.4" -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - "@babel/helper-module-transforms@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" - integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== + "integrity" "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==" + "resolved" "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz" + "version" "7.15.8" dependencies: "@babel/helper-module-imports" "^7.15.4" "@babel/helper-replace-supers" "^7.15.4" @@ -192,36 +105,22 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.6" -"@babel/helper-module-transforms@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz#57e3ca669e273d55c3cda55e6ebf552f37f483c8" - integrity sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw== - dependencies: - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.6" - "@babel/types" "^7.18.6" - "@babel/helper-optimise-call-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" - integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== + "integrity" "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==" + "resolved" "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/types" "^7.15.4" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": + "integrity" "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==" + "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz" + "version" "7.19.0" "@babel/helper-replace-supers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" - integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== + "integrity" "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==" + "resolved" "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/helper-member-expression-to-functions" "^7.15.4" "@babel/helper-optimise-call-expression" "^7.15.4" @@ -229,212 +128,156 @@ "@babel/types" "^7.15.4" "@babel/helper-simple-access@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" - integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== + "integrity" "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==" + "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/types" "^7.15.4" -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - "@babel/helper-split-export-declaration@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" - integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== + "integrity" "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==" + "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/types" "^7.15.4" -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": + "integrity" "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz" + "version" "7.15.7" "@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + "integrity" "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + "resolved" "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz" + "version" "7.14.5" "@babel/helpers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" - integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== + "integrity" "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==" + "resolved" "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/template" "^7.15.4" "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helpers@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.6.tgz#4c966140eaa1fcaa3d5a8c09d7db61077d4debfd" - integrity sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ== - dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.6" - "@babel/types" "^7.18.6" - "@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + "integrity" "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==" + "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz" + "version" "7.14.5" dependencies: "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" + "chalk" "^2.0.0" + "js-tokens" "^4.0.0" "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" - integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== - -"@babel/parser@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.6.tgz#845338edecad65ebffef058d3be851f1d28a63bc" - integrity sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw== + "integrity" "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==" + "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz" + "version" "7.15.8" "@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + "version" "7.8.4" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + "integrity" "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + "integrity" "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + "version" "7.12.13" dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + "integrity" "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + "version" "7.10.4" dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + "integrity" "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + "integrity" "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + "version" "7.10.4" dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + "integrity" "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + "integrity" "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + "version" "7.10.4" dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + "integrity" "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + "integrity" "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + "integrity" "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + "integrity" "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + "version" "7.14.5" dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== + "integrity" "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz" + "version" "7.20.0" dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/template@^7.15.4", "@babel/template@^7.3.3": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" - integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== + "integrity" "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==" + "resolved" "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/code-frame" "^7.14.5" "@babel/parser" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/template@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" - integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" - "@babel/traverse@^7.15.4", "@babel/traverse@^7.7.2": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" - integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + "integrity" "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==" + "resolved" "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz" + "version" "7.15.4" dependencies: "@babel/code-frame" "^7.14.5" "@babel/generator" "^7.15.4" @@ -443,171 +286,137 @@ "@babel/helper-split-export-declaration" "^7.15.4" "@babel/parser" "^7.15.4" "@babel/types" "^7.15.4" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.6.tgz#a228562d2f46e89258efa4ddd0416942e2fd671d" - integrity sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-function-name" "^7.18.6" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" - debug "^4.1.0" - globals "^11.1.0" + "debug" "^4.1.0" + "globals" "^11.1.0" "@babel/types@^7.0.0", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" - integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== + "integrity" "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==" + "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz" + "version" "7.15.6" dependencies: "@babel/helper-validator-identifier" "^7.14.9" - to-fast-properties "^2.0.0" - -"@babel/types@^7.18.6", "@babel/types@^7.18.7": - version "7.18.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.7.tgz#a4a2c910c15040ea52cdd1ddb1614a65c8041726" - integrity sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" + "to-fast-properties" "^2.0.0" "@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + "integrity" "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + "resolved" "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + "version" "0.2.3" "@codemirror/rangeset@^0.19.5": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@codemirror/rangeset/-/rangeset-0.19.9.tgz#e80895de93c39dc7899f5be31d368c9d88aa4efc" - integrity sha512-V8YUuOvK+ew87Xem+71nKcqu1SXd5QROMRLMS/ljT5/3MCxtgrRie1Cvild0G/Z2f1fpWxzX78V0U4jjXBorBQ== + "integrity" "sha512-V8YUuOvK+ew87Xem+71nKcqu1SXd5QROMRLMS/ljT5/3MCxtgrRie1Cvild0G/Z2f1fpWxzX78V0U4jjXBorBQ==" + "resolved" "https://registry.npmjs.org/@codemirror/rangeset/-/rangeset-0.19.9.tgz" + "version" "0.19.9" dependencies: "@codemirror/state" "^0.19.0" "@codemirror/state@^0.19.0", "@codemirror/state@^0.19.3", "@codemirror/state@^0.19.6": - version "0.19.6" - resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-0.19.6.tgz#d631f041d39ce41b7891b099fca26cb1fdb9763e" - integrity sha512-sqIQZE9VqwQj7D4c2oz9mfLhlT1ElAzGB5lO1lE33BPyrdNy1cJyCIOecT4cn4VeJOFrnjOeu+IftZ3zqdFETw== + "integrity" "sha512-sqIQZE9VqwQj7D4c2oz9mfLhlT1ElAzGB5lO1lE33BPyrdNy1cJyCIOecT4cn4VeJOFrnjOeu+IftZ3zqdFETw==" + "resolved" "https://registry.npmjs.org/@codemirror/state/-/state-0.19.6.tgz" + "version" "0.19.6" dependencies: "@codemirror/text" "^0.19.0" "@codemirror/state@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.1.0.tgz#c0f1d80f61908c9dcf5e2a3fe931e9dd78f3df8a" - integrity sha512-qbUr94DZTe6/V1VS7LDLz11rM/1t/nJxR1El4I6UaxDEdc0aZZvq6JCLJWiRmUf95NRAnDH6fhXn+PWp9wGCIg== + "integrity" "sha512-Mxff85Hp5va+zuj+H748KbubXjrinX/k28lj43H14T2D0+4kuvEFIEIO7hCEcvBT8ubZyIelt9yGOjj2MWOEQA==" + "resolved" "https://registry.npmjs.org/@codemirror/state/-/state-6.1.2.tgz" + "version" "6.1.2" "@codemirror/text@^0.19.0": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@codemirror/text/-/text-0.19.5.tgz#75033af2476214e79eae22b81ada618815441c18" - integrity sha512-Syu5Xc7tZzeUAM/y4fETkT0zgGr48rDG+w4U38bPwSIUr+L9S/7w2wDE1WGNzjaZPz12F6gb1gxWiSTg9ocLow== + "integrity" "sha512-Syu5Xc7tZzeUAM/y4fETkT0zgGr48rDG+w4U38bPwSIUr+L9S/7w2wDE1WGNzjaZPz12F6gb1gxWiSTg9ocLow==" + "resolved" "https://registry.npmjs.org/@codemirror/text/-/text-0.19.5.tgz" + "version" "0.19.5" "@codemirror/view@^0.19.31": - version "0.19.48" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-0.19.48.tgz#1c657e2b0f8ed896ac6448d6e2215ab115e2a0fc" - integrity sha512-0eg7D2Nz4S8/caetCTz61rK0tkHI17V/d15Jy0kLOT8dTLGGNJUponDnW28h2B6bERmPlVHKh8MJIr5OCp1nGw== + "integrity" "sha512-0eg7D2Nz4S8/caetCTz61rK0tkHI17V/d15Jy0kLOT8dTLGGNJUponDnW28h2B6bERmPlVHKh8MJIr5OCp1nGw==" + "resolved" "https://registry.npmjs.org/@codemirror/view/-/view-0.19.48.tgz" + "version" "0.19.48" dependencies: "@codemirror/rangeset" "^0.19.5" "@codemirror/state" "^0.19.3" "@codemirror/text" "^0.19.0" - style-mod "^4.0.0" - w3c-keyname "^2.2.4" + "style-mod" "^4.0.0" + "w3c-keyname" "^2.2.4" "@codemirror/view@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.2.0.tgz#bae4c486a84174bd9656af9c9d2bd709d5b26c9f" - integrity sha512-3emW1symh+GoteFMBPsltjmF790U/trouLILATh3JodbF/z98HvcQh2g3+H6dfNIHx16uNonsAF4mNzVr1TJNA== + "integrity" "sha512-Kv32b6Tn7QVwFbj/EDswTLSocjk5kgggF6zzBFAL4o4hZ/vmtFD155+EjH1pVlbfoDyVC2M6SedPsMrwYscgNg==" + "resolved" "https://registry.npmjs.org/@codemirror/view/-/view-6.4.0.tgz" + "version" "6.4.0" dependencies: "@codemirror/state" "^6.0.0" - style-mod "^4.0.0" - w3c-keyname "^2.2.4" - -"@esbuild/linux-loong64@0.15.6": - version "0.15.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.6.tgz#45be4184f00e505411bc265a05e709764114acd8" - integrity sha512-hqmVU2mUjH6J2ZivHphJ/Pdse2ZD+uGCHK0uvsiLDk/JnSedEVj77CiVUnbMKuU4tih1TZZL8tG9DExQg/GZsw== - -"@eslint/eslintrc@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.1.tgz#de0807bfeffc37b964a7d0400e0c348ce5a2543d" - integrity sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.4.0" - globals "^13.15.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" + "style-mod" "^4.0.0" + "w3c-keyname" "^2.2.4" + +"@eslint/eslintrc@^1.3.3": + "integrity" "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==" + "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz" + "version" "1.3.3" + dependencies: + "ajv" "^6.12.4" + "debug" "^4.3.2" + "espree" "^9.4.0" + "globals" "^13.15.0" + "ignore" "^5.2.0" + "import-fresh" "^3.2.1" + "js-yaml" "^4.1.0" + "minimatch" "^3.1.2" + "strip-json-comments" "^3.1.1" "@evilmartians/lefthook@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@evilmartians/lefthook/-/lefthook-1.1.1.tgz#26e0de9ca3df1c8d2d97840f187a52cd95bb5f59" - integrity sha512-5C/AD937A6jz4mdBLAKXIeYVkxvLmPWxlv1YWfuHcIwZ2wp4W3z1Htjjtp+7gtO41CoCycIJcaxLfwaAsbS6qA== + "integrity" "sha512-4bdWcVw2ImjpBIB+/rKLX8nkrQSO8kV0z1KyhiojCm/EI6hbqWiIlO9beXiAPVQgByNhuS6ACznvyE9TCt/8hg==" + "resolved" "https://registry.npmjs.org/@evilmartians/lefthook/-/lefthook-1.1.3.tgz" + "version" "1.1.3" -"@humanwhocodes/config-array@^0.10.4": - version "0.10.4" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" - integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== +"@humanwhocodes/config-array@^0.11.6": + "integrity" "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==" + "resolved" "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz" + "version" "0.11.7" dependencies: "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/gitignore-to-minimatch@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" - integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + "debug" "^4.1.1" + "minimatch" "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + "integrity" "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" + "resolved" "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + "version" "1.0.1" "@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "integrity" "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + "resolved" "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + "version" "1.2.1" "@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + "integrity" "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==" + "resolved" "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + "version" "1.1.0" dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" + "camelcase" "^5.3.1" + "find-up" "^4.1.0" + "get-package-type" "^0.1.0" + "js-yaml" "^3.13.1" + "resolve-from" "^5.0.0" "@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + "integrity" "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + "resolved" "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + "version" "0.1.3" "@jest/console@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" - integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + "integrity" "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==" + "resolved" "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - slash "^3.0.0" + "chalk" "^4.0.0" + "jest-message-util" "^28.1.3" + "jest-util" "^28.1.3" + "slash" "^3.0.0" "@jest/core@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" - integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== + "integrity" "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==" + "resolved" "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/console" "^28.1.3" "@jest/reporters" "^28.1.3" @@ -615,80 +424,80 @@ "@jest/transform" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^28.1.3" - jest-config "^28.1.3" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-resolve-dependencies "^28.1.3" - jest-runner "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - jest-watcher "^28.1.3" - micromatch "^4.0.4" - pretty-format "^28.1.3" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" + "ansi-escapes" "^4.2.1" + "chalk" "^4.0.0" + "ci-info" "^3.2.0" + "exit" "^0.1.2" + "graceful-fs" "^4.2.9" + "jest-changed-files" "^28.1.3" + "jest-config" "^28.1.3" + "jest-haste-map" "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-regex-util" "^28.0.2" + "jest-resolve" "^28.1.3" + "jest-resolve-dependencies" "^28.1.3" + "jest-runner" "^28.1.3" + "jest-runtime" "^28.1.3" + "jest-snapshot" "^28.1.3" + "jest-util" "^28.1.3" + "jest-validate" "^28.1.3" + "jest-watcher" "^28.1.3" + "micromatch" "^4.0.4" + "pretty-format" "^28.1.3" + "rimraf" "^3.0.0" + "slash" "^3.0.0" + "strip-ansi" "^6.0.0" "@jest/environment@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" - integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== + "integrity" "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==" + "resolved" "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/fake-timers" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - jest-mock "^28.1.3" + "jest-mock" "^28.1.3" "@jest/expect-utils@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" - integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== + "integrity" "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==" + "resolved" "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz" + "version" "28.1.3" dependencies: - jest-get-type "^28.0.2" + "jest-get-type" "^28.0.2" "@jest/expect@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" - integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== + "integrity" "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==" + "resolved" "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz" + "version" "28.1.3" dependencies: - expect "^28.1.3" - jest-snapshot "^28.1.3" + "expect" "^28.1.3" + "jest-snapshot" "^28.1.3" "@jest/fake-timers@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" - integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== + "integrity" "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==" + "resolved" "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" "@sinonjs/fake-timers" "^9.1.2" "@types/node" "*" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-util "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-mock" "^28.1.3" + "jest-util" "^28.1.3" "@jest/globals@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" - integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== + "integrity" "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==" + "resolved" "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/environment" "^28.1.3" "@jest/expect" "^28.1.3" "@jest/types" "^28.1.3" "@jest/reporters@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" - integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== + "integrity" "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==" + "resolved" "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz" + "version" "28.1.3" dependencies: "@bcoe/v8-coverage" "^0.2.3" "@jest/console" "^28.1.3" @@ -697,188 +506,166 @@ "@jest/types" "^28.1.3" "@jridgewell/trace-mapping" "^0.3.13" "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - jest-worker "^28.1.3" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - terminal-link "^2.0.0" - v8-to-istanbul "^9.0.1" + "chalk" "^4.0.0" + "collect-v8-coverage" "^1.0.0" + "exit" "^0.1.2" + "glob" "^7.1.3" + "graceful-fs" "^4.2.9" + "istanbul-lib-coverage" "^3.0.0" + "istanbul-lib-instrument" "^5.1.0" + "istanbul-lib-report" "^3.0.0" + "istanbul-lib-source-maps" "^4.0.0" + "istanbul-reports" "^3.1.3" + "jest-message-util" "^28.1.3" + "jest-util" "^28.1.3" + "jest-worker" "^28.1.3" + "slash" "^3.0.0" + "string-length" "^4.0.1" + "strip-ansi" "^6.0.0" + "terminal-link" "^2.0.0" + "v8-to-istanbul" "^9.0.1" "@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + "integrity" "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==" + "resolved" "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" + "version" "28.1.3" dependencies: "@sinclair/typebox" "^0.24.1" "@jest/source-map@^28.1.2": - version "28.1.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" - integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== + "integrity" "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==" + "resolved" "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz" + "version" "28.1.2" dependencies: "@jridgewell/trace-mapping" "^0.3.13" - callsites "^3.0.0" - graceful-fs "^4.2.9" + "callsites" "^3.0.0" + "graceful-fs" "^4.2.9" "@jest/test-result@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" - integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + "integrity" "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==" + "resolved" "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/console" "^28.1.3" "@jest/types" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" + "collect-v8-coverage" "^1.0.0" "@jest/test-sequencer@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" - integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== + "integrity" "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==" + "resolved" "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/test-result" "^28.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - slash "^3.0.0" + "graceful-fs" "^4.2.9" + "jest-haste-map" "^28.1.3" + "slash" "^3.0.0" "@jest/transform@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" - integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== + "integrity" "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==" + "resolved" "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz" + "version" "28.1.3" dependencies: "@babel/core" "^7.11.6" "@jest/types" "^28.1.3" "@jridgewell/trace-mapping" "^0.3.13" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-regex-util "^28.0.2" - jest-util "^28.1.3" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.1" - -"@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + "babel-plugin-istanbul" "^6.1.1" + "chalk" "^4.0.0" + "convert-source-map" "^1.4.0" + "fast-json-stable-stringify" "^2.0.0" + "graceful-fs" "^4.2.9" + "jest-haste-map" "^28.1.3" + "jest-regex-util" "^28.0.2" + "jest-util" "^28.1.3" + "micromatch" "^4.0.4" + "pirates" "^4.0.4" + "slash" "^3.0.0" + "write-file-atomic" "^4.0.1" + +"@jest/types@^28.0.0", "@jest/types@^28.1.3": + "integrity" "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==" + "resolved" "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/schemas" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "chalk" "^4.0.0" "@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + "integrity" "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==" + "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz" + "version" "3.0.7" "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "integrity" "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" + "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz" + "version" "1.4.13" "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== + "integrity" "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==" + "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz" + "version" "0.3.13" dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" "@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + "version" "2.1.5" dependencies: "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" + "run-parallel" "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + "version" "2.0.5" -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + "version" "1.2.8" dependencies: "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" + "fastq" "^1.6.0" "@sinclair/typebox@^0.24.1": - version "0.24.20" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.20.tgz#11a657875de6008622d53f56e063a6347c51a6dd" - integrity sha512-kVaO5aEFZb33nPMTZBxiPEkY+slxiPtqC7QX8f9B3eGOMBvEfuMfxp9DSTTCsRJPumPKjrge4yagyssO4q6qzQ== + "integrity" "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + "resolved" "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz" + "version" "0.24.51" "@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + "integrity" "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==" + "resolved" "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" + "version" "1.8.3" dependencies: - type-detect "4.0.8" + "type-detect" "4.0.8" "@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + "integrity" "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==" + "resolved" "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" + "version" "9.1.2" dependencies: "@sinonjs/commons" "^1.7.0" "@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "integrity" "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + "resolved" "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" + "version" "2.0.0" "@tsconfig/svelte@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@tsconfig/svelte/-/svelte-3.0.0.tgz#b06e059209f04c414de0069f2f0e2796d979fc6f" - integrity sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg== + "integrity" "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==" + "resolved" "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz" + "version" "3.0.0" "@types/babel__core@^7.1.14": - version "7.1.16" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" - integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== + "integrity" "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==" + "resolved" "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" + "version" "7.1.19" dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -887,411 +674,411 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" - integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== + "integrity" "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==" + "resolved" "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + "version" "7.6.4" dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + "integrity" "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==" + "resolved" "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + "version" "7.4.1" dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== + "integrity" "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==" + "resolved" "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz" + "version" "7.18.2" dependencies: "@babel/types" "^7.3.0" "@types/codemirror@0.0.108": - version "0.0.108" - resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-0.0.108.tgz#e640422b666bf49251b384c390cdeb2362585bde" - integrity sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw== + "integrity" "sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==" + "resolved" "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz" + "version" "0.0.108" dependencies: "@types/tern" "*" "@types/estree@*": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + "integrity" "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" + "resolved" "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz" + "version" "0.0.50" "@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + "integrity" "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==" + "resolved" "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" + "version" "4.1.5" dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + "integrity" "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + "resolved" "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + "version" "2.0.4" "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + "integrity" "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==" + "resolved" "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + "version" "3.0.0" dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + "integrity" "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==" + "resolved" "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + "version" "3.0.1" dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^28.1.8": - version "28.1.8" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.8.tgz#6936409f3c9724ea431efd412ea0238a0f03b09b" - integrity sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw== + "integrity" "sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==" + "resolved" "https://registry.npmjs.org/@types/jest/-/jest-28.1.8.tgz" + "version" "28.1.8" dependencies: - expect "^28.0.0" - pretty-format "^28.0.0" + "expect" "^28.0.0" + "pretty-format" "^28.0.0" "@types/jsdom@^16.2.4": - version "16.2.14" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.14.tgz#26fe9da6a8870715b154bb84cd3b2e53433d8720" - integrity sha512-6BAy1xXEmMuHeAJ4Fv4yXKwBDTGTOseExKE3OaHiNycdHdZw59KfYzrt0DkDluvwmik1HRt6QS7bImxUmpSy+w== + "integrity" "sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==" + "resolved" "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.15.tgz" + "version" "16.2.15" dependencies: "@types/node" "*" - "@types/parse5" "*" + "@types/parse5" "^6.0.3" "@types/tough-cookie" "*" "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + "integrity" "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + "version" "7.0.11" "@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + "integrity" "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + "resolved" "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + "version" "0.0.29" "@types/node@*": - version "18.0.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.3.tgz#463fc47f13ec0688a33aec75d078a0541a447199" - integrity sha512-HzNRZtp4eepNitP+BD6k2L6DROIDG4Q0fm4x+dwfsr6LGmROENnok75VGw40628xf+iR24WeMFcHuuBDUAzzsQ== + "integrity" "sha512-mK6BKLpL0bG6v2CxHbm0ed6RcZrAtTHBTd/ZpnlVPVa3HkumsqLE4BC4u6TQ8D7pnrRbOU0am6epuALs+Ncnzw==" + "resolved" "https://registry.npmjs.org/@types/node/-/node-16.11.14.tgz" + "version" "16.11.14" -"@types/parse5@*": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" - integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== +"@types/parse5@^6.0.3": + "integrity" "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" + "resolved" "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz" + "version" "6.0.3" "@types/prettier@^2.1.5": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.1.tgz#e1303048d5389563e130f5bdd89d37a99acb75eb" - integrity sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw== + "integrity" "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==" + "resolved" "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz" + "version" "2.7.1" "@types/pug@^2.0.4": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.6.tgz#f830323c88172e66826d0bde413498b61054b5a6" - integrity sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg== + "integrity" "sha512-LOnASQoeNZMkzexRuyqcBBDZ6rS+rQxUMkmj5A0PkhhiSZivLIuz6Hxyr1mkGoEZEkk66faROmpMi4fFkrKsBA==" + "resolved" "https://registry.npmjs.org/@types/pug/-/pug-2.0.5.tgz" + "version" "2.0.5" "@types/sass@^1.16.0": - version "1.43.1" - resolved "https://registry.yarnpkg.com/@types/sass/-/sass-1.43.1.tgz#86bb0168e9e881d7dade6eba16c9ed6d25dc2f68" - integrity sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g== + "integrity" "sha512-iZUcRrGuz/Tbg3loODpW7vrQJkUtpY2fFSf4ELqqkApcS2TkZ1msk7ie8iZPB86lDOP8QOTTmuvWjc5S0R9OjQ==" + "resolved" "https://registry.npmjs.org/@types/sass/-/sass-1.16.1.tgz" + "version" "1.16.1" dependencies: "@types/node" "*" +"@types/semver@^7.3.12": + "integrity" "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==" + "resolved" "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" + "version" "7.3.13" + "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + "integrity" "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + "resolved" "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + "version" "2.0.1" "@types/tern@*": - version "0.23.4" - resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.4.tgz#03926eb13dbeaf3ae0d390caf706b2643a0127fb" - integrity sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg== + "integrity" "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==" + "resolved" "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz" + "version" "0.23.4" dependencies: "@types/estree" "*" "@types/tough-cookie@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + "integrity" "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" + "resolved" "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz" + "version" "4.0.2" "@types/yargs-parser@*": - version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" - integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + "integrity" "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + "resolved" "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + "version" "21.0.0" "@types/yargs@^17.0.8": - version "17.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" - integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== + "integrity" "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==" + "resolved" "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz" + "version" "17.0.13" dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.1.tgz#471f64dc53600025e470dad2ca4a9f2864139019" - integrity sha512-iC40UK8q1tMepSDwiLbTbMXKDxzNy+4TfPWgIL661Ym0sD42vRcQU93IsZIrmi+x292DBr60UI/gSwfdVYexCA== - dependencies: - "@typescript-eslint/scope-manager" "5.36.1" - "@typescript-eslint/type-utils" "5.36.1" - "@typescript-eslint/utils" "5.36.1" - debug "^4.3.4" - functional-red-black-tree "^1.0.1" - ignore "^5.2.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.36.1.tgz#931c22c7bacefd17e29734628cdec8b2acdcf1ce" - integrity sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A== - dependencies: - "@typescript-eslint/scope-manager" "5.36.1" - "@typescript-eslint/types" "5.36.1" - "@typescript-eslint/typescript-estree" "5.36.1" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz#23c49b7ddbcffbe09082e6694c2524950766513f" - integrity sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w== - dependencies: - "@typescript-eslint/types" "5.36.1" - "@typescript-eslint/visitor-keys" "5.36.1" - -"@typescript-eslint/type-utils@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz#016fc2bff6679f54c0b2df848a493f0ca3d4f625" - integrity sha512-xfZhfmoQT6m3lmlqDvDzv9TiCYdw22cdj06xY0obSznBsT///GK5IEZQdGliXpAOaRL34o8phEvXzEo/VJx13Q== - dependencies: - "@typescript-eslint/typescript-estree" "5.36.1" - "@typescript-eslint/utils" "5.36.1" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.36.1.tgz#1cf0e28aed1cb3ee676917966eb23c2f8334ce2c" - integrity sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg== - -"@typescript-eslint/typescript-estree@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz#b857f38d6200f7f3f4c65cd0a5afd5ae723f2adb" - integrity sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g== - dependencies: - "@typescript-eslint/types" "5.36.1" - "@typescript-eslint/visitor-keys" "5.36.1" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.36.1.tgz#136d5208cc7a3314b11c646957f8f0b5c01e07ad" - integrity sha512-lNj4FtTiXm5c+u0pUehozaUWhh7UYKnwryku0nxJlYUEWetyG92uw2pr+2Iy4M/u0ONMKzfrx7AsGBTCzORmIg== + "integrity" "sha512-DXUS22Y57/LAFSg3x7Vi6RNAuLpTXwxB9S2nIA7msBb/Zt8p7XqMwdpdc1IU7CkOQUPgAqR5fWvxuKCbneKGmA==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.41.0.tgz" + "version" "5.41.0" + dependencies: + "@typescript-eslint/scope-manager" "5.41.0" + "@typescript-eslint/type-utils" "5.41.0" + "@typescript-eslint/utils" "5.41.0" + "debug" "^4.3.4" + "ignore" "^5.2.0" + "regexpp" "^3.2.0" + "semver" "^7.3.7" + "tsutils" "^3.21.0" + +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.36.1": + "integrity" "sha512-HQVfix4+RL5YRWZboMD1pUfFN8MpRH4laziWkkAzyO1fvNOY/uinZcvo3QiFJVS/siNHupV8E5+xSwQZrl6PZA==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.41.0.tgz" + "version" "5.41.0" + dependencies: + "@typescript-eslint/scope-manager" "5.41.0" + "@typescript-eslint/types" "5.41.0" + "@typescript-eslint/typescript-estree" "5.41.0" + "debug" "^4.3.4" + +"@typescript-eslint/scope-manager@5.41.0": + "integrity" "sha512-xOxPJCnuktUkY2xoEZBKXO5DBCugFzjrVndKdUnyQr3+9aDWZReKq9MhaoVnbL+maVwWJu/N0SEtrtEUNb62QQ==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.41.0.tgz" + "version" "5.41.0" + dependencies: + "@typescript-eslint/types" "5.41.0" + "@typescript-eslint/visitor-keys" "5.41.0" + +"@typescript-eslint/type-utils@5.41.0": + "integrity" "sha512-L30HNvIG6A1Q0R58e4hu4h+fZqaO909UcnnPbwKiN6Rc3BUEx6ez2wgN7aC0cBfcAjZfwkzE+E2PQQ9nEuoqfA==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.41.0.tgz" + "version" "5.41.0" + dependencies: + "@typescript-eslint/typescript-estree" "5.41.0" + "@typescript-eslint/utils" "5.41.0" + "debug" "^4.3.4" + "tsutils" "^3.21.0" + +"@typescript-eslint/types@5.41.0": + "integrity" "sha512-5BejraMXMC+2UjefDvrH0Fo/eLwZRV6859SXRg+FgbhA0R0l6lDqDGAQYhKbXhPN2ofk2kY5sgGyLNL907UXpA==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.41.0.tgz" + "version" "5.41.0" + +"@typescript-eslint/typescript-estree@5.41.0": + "integrity" "sha512-SlzFYRwFSvswzDSQ/zPkIWcHv8O5y42YUskko9c4ki+fV6HATsTODUPbRbcGDFYP86gaJL5xohUEytvyNNcXWg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.41.0.tgz" + "version" "5.41.0" + dependencies: + "@typescript-eslint/types" "5.41.0" + "@typescript-eslint/visitor-keys" "5.41.0" + "debug" "^4.3.4" + "globby" "^11.1.0" + "is-glob" "^4.0.3" + "semver" "^7.3.7" + "tsutils" "^3.21.0" + +"@typescript-eslint/utils@5.41.0": + "integrity" "sha512-QlvfwaN9jaMga9EBazQ+5DDx/4sAdqDkcs05AsQHMaopluVCUyu1bTRUVKzXbgjDlrRAQrYVoi/sXJ9fmG+KLQ==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.41.0.tgz" + "version" "5.41.0" dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.36.1" - "@typescript-eslint/types" "5.36.1" - "@typescript-eslint/typescript-estree" "5.36.1" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/visitor-keys@5.36.1": - version "5.36.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz#7731175312d65738e501780f923896d200ad1615" - integrity sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ== - dependencies: - "@typescript-eslint/types" "5.36.1" - eslint-visitor-keys "^3.3.0" - -abab@^2.0.5, abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.5.0: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== - -acorn@^8.8.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-includes@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.flat@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-shim-unscopables "^1.0.0" - -async-mutex@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.3.2.tgz#1485eda5bda1b0ec7c8df1ac2e815757ad1831df" - integrity sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA== - dependencies: - tslib "^2.3.1" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -babel-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" - integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.41.0" + "@typescript-eslint/types" "5.41.0" + "@typescript-eslint/typescript-estree" "5.41.0" + "eslint-scope" "^5.1.1" + "eslint-utils" "^3.0.0" + "semver" "^7.3.7" + +"@typescript-eslint/visitor-keys@5.41.0": + "integrity" "sha512-vilqeHj267v8uzzakbm13HkPMl7cbYpKVjgFWZPIOHIJHZtinvypUhJ5xBXfWYg4eFKqztbMMpOgFpT9Gfx4fw==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.41.0.tgz" + "version" "5.41.0" + dependencies: + "@typescript-eslint/types" "5.41.0" + "eslint-visitor-keys" "^3.3.0" + +"abab@^2.0.5", "abab@^2.0.6": + "integrity" "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + "resolved" "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" + "version" "2.0.6" + +"acorn-globals@^6.0.0": + "integrity" "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==" + "resolved" "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "acorn" "^7.1.1" + "acorn-walk" "^7.1.1" + +"acorn-jsx@^5.3.2": + "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + "version" "5.3.2" + +"acorn-walk@^7.1.1": + "integrity" "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + "version" "7.2.0" + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.5.0", "acorn@^8.8.0": + "integrity" "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz" + "version" "8.8.1" + +"acorn@^7.1.1": + "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + "version" "7.4.1" + +"agent-base@6": + "integrity" "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==" + "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "debug" "4" + +"ajv@^6.10.0", "ajv@^6.12.4": + "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" + "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + "version" "6.12.6" + dependencies: + "fast-deep-equal" "^3.1.1" + "fast-json-stable-stringify" "^2.0.0" + "json-schema-traverse" "^0.4.1" + "uri-js" "^4.2.2" + +"ansi-escapes@^4.2.1": + "integrity" "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==" + "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + "version" "4.3.2" + dependencies: + "type-fest" "^0.21.3" + +"ansi-regex@^5.0.1": + "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + "version" "5.0.1" + +"ansi-styles@^3.2.1": + "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + "version" "3.2.1" + dependencies: + "color-convert" "^1.9.0" + +"ansi-styles@^4.0.0", "ansi-styles@^4.1.0": + "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "color-convert" "^2.0.1" + +"ansi-styles@^5.0.0": + "integrity" "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + "version" "5.2.0" + +"anymatch@^3.0.3", "anymatch@~3.1.2": + "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==" + "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "normalize-path" "^3.0.0" + "picomatch" "^2.0.4" + +"argparse@^1.0.7": + "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" + "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + "version" "1.0.10" + dependencies: + "sprintf-js" "~1.0.2" + +"argparse@^2.0.1": + "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + "version" "2.0.1" + +"array-includes@^3.1.4": + "integrity" "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==" + "resolved" "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz" + "version" "3.1.4" + dependencies: + "call-bind" "^1.0.2" + "define-properties" "^1.1.3" + "es-abstract" "^1.19.1" + "get-intrinsic" "^1.1.1" + "is-string" "^1.0.7" + +"array-union@^2.1.0": + "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + "version" "2.1.0" + +"array.prototype.flat@^1.2.5": + "integrity" "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==" + "resolved" "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz" + "version" "1.2.5" + dependencies: + "call-bind" "^1.0.2" + "define-properties" "^1.1.3" + "es-abstract" "^1.19.0" + +"async-mutex@^0.3.1": + "integrity" "sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==" + "resolved" "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.2.tgz" + "version" "0.3.2" + dependencies: + "tslib" "^2.3.1" + +"asynckit@^0.4.0": + "integrity" "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + "version" "0.4.0" + +"babel-jest@^28.0.0", "babel-jest@^28.1.3": + "integrity" "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==" + "resolved" "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/transform" "^28.1.3" "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^28.1.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" + "babel-plugin-istanbul" "^6.1.1" + "babel-preset-jest" "^28.1.3" + "chalk" "^4.0.0" + "graceful-fs" "^4.2.9" + "slash" "^3.0.0" -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== +"babel-plugin-istanbul@^6.1.1": + "integrity" "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==" + "resolved" "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + "version" "6.1.1" dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" + "istanbul-lib-instrument" "^5.0.4" + "test-exclude" "^6.0.0" -babel-plugin-jest-hoist@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" - integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== +"babel-plugin-jest-hoist@^28.1.3": + "integrity" "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==" + "resolved" "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz" + "version" "28.1.3" dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== +"babel-preset-current-node-syntax@^1.0.0": + "integrity" "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==" + "resolved" "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + "version" "1.0.1" dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" @@ -1306,1643 +1093,1479 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" - integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== - dependencies: - babel-plugin-jest-hoist "^28.1.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -boon-js@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/boon-js/-/boon-js-2.0.3.tgz#8ebfaf219908b9d9259d050ac9de079ebbd7d4b7" - integrity sha512-xcLS25RHhH/Bl+toajfOnTzynzWOJSRYG0m2W/8RePZ2xqPPblYmKgd/nZWbA4U7PQ2ohq49YxIWhsUJWvGwXQ== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.16.6: - version "4.17.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.5.tgz#c827bbe172a4c22b123f5e337533ceebadfdd559" - integrity sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA== - dependencies: - caniuse-lite "^1.0.30001271" - electron-to-chromium "^1.3.878" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" - -browserslist@^4.20.2: - version "4.21.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.1.tgz#c9b9b0a54c7607e8dc3e01a0d311727188011a00" - integrity sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ== - dependencies: - caniuse-lite "^1.0.30001359" - electron-to-chromium "^1.4.172" - node-releases "^2.0.5" - update-browserslist-db "^1.0.4" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-crc32@^0.2.5: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -builtin-modules@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -caniuse-lite@^1.0.30001271, caniuse-lite@^1.0.30001359: - version "1.0.30001363" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz" - integrity sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chokidar@^3.4.1: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" +"babel-preset-jest@^28.1.3": + "integrity" "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==" + "resolved" "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz" + "version" "28.1.3" + dependencies: + "babel-plugin-jest-hoist" "^28.1.3" + "babel-preset-current-node-syntax" "^1.0.0" + +"balanced-match@^1.0.0": + "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + "version" "1.0.2" + +"binary-extensions@^2.0.0": + "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + "version" "2.2.0" + +"boon-js@^2.0.3": + "integrity" "sha512-xcLS25RHhH/Bl+toajfOnTzynzWOJSRYG0m2W/8RePZ2xqPPblYmKgd/nZWbA4U7PQ2ohq49YxIWhsUJWvGwXQ==" + "resolved" "https://registry.npmjs.org/boon-js/-/boon-js-2.0.3.tgz" + "version" "2.0.3" + +"brace-expansion@^1.1.7": + "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" + "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + "version" "1.1.11" + dependencies: + "balanced-match" "^1.0.0" + "concat-map" "0.0.1" + +"braces@^3.0.2", "braces@~3.0.2": + "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" + "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "fill-range" "^7.0.1" + +"browser-process-hrtime@^1.0.0": + "integrity" "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + "resolved" "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" + "version" "1.0.0" + +"browserslist@^4.16.6": + "integrity" "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==" + "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz" + "version" "4.17.5" + dependencies: + "caniuse-lite" "^1.0.30001271" + "electron-to-chromium" "^1.3.878" + "escalade" "^3.1.1" + "node-releases" "^2.0.1" + "picocolors" "^1.0.0" + +"bs-logger@0.x": + "integrity" "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==" + "resolved" "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + "version" "0.2.6" + dependencies: + "fast-json-stable-stringify" "2.x" + +"bser@2.1.1": + "integrity" "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==" + "resolved" "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "node-int64" "^0.4.0" + +"buffer-crc32@^0.2.5": + "integrity" "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + "resolved" "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + "version" "0.2.13" + +"buffer-from@^1.0.0": + "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + "version" "1.1.2" + +"builtin-modules@^3.3.0": + "integrity" "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==" + "resolved" "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" + "version" "3.3.0" + +"call-bind@^1.0.0", "call-bind@^1.0.2": + "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==" + "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "function-bind" "^1.1.1" + "get-intrinsic" "^1.0.2" + +"callsites@^3.0.0": + "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + "version" "3.1.0" + +"camelcase@^5.3.1": + "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + "version" "5.3.1" + +"camelcase@^6.2.0": + "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + "version" "6.3.0" + +"caniuse-lite@^1.0.30001271": + "integrity" "sha512-BBruZFWmt3HFdVPS8kceTBIguKxu4f99n5JNp06OlPD/luoAMIaIK5ieV5YjnBLH3Nysai9sxj9rpJj4ZisXOA==" + "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001271.tgz" + "version" "1.0.30001271" + +"chalk@^2.0.0": + "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + "version" "2.4.2" + dependencies: + "ansi-styles" "^3.2.1" + "escape-string-regexp" "^1.0.5" + "supports-color" "^5.3.0" + +"chalk@^4.0.0": + "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "ansi-styles" "^4.1.0" + "supports-color" "^7.1.0" + +"char-regex@^1.0.2": + "integrity" "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + "resolved" "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + "version" "1.0.2" + +"chokidar@^3.4.1": + "integrity" "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==" + "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz" + "version" "3.5.2" + dependencies: + "anymatch" "~3.1.2" + "braces" "~3.0.2" + "glob-parent" "~5.1.2" + "is-binary-path" "~2.1.0" + "is-glob" "~4.0.1" + "normalize-path" "~3.0.0" + "readdirp" "~3.6.0" optionalDependencies: - fsevents "~2.3.2" - -chrono-node@2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-2.3.9.tgz#27f6174f796d094721566d7b00fd514501ad6ef5" - integrity sha512-Qg6zmsGwaWzWiMKapr060sL6zgfBIkTxnyCTd7KGQ0YDTYg0VvBfqRRBuaOkGjiVGdKPM/cp4QQTLcpUhZQxXg== + "fsevents" "~2.3.2" + +"chrono-node@2.3.9": + "integrity" "sha512-Qg6zmsGwaWzWiMKapr060sL6zgfBIkTxnyCTd7KGQ0YDTYg0VvBfqRRBuaOkGjiVGdKPM/cp4QQTLcpUhZQxXg==" + "resolved" "https://registry.npmjs.org/chrono-node/-/chrono-node-2.3.9.tgz" + "version" "2.3.9" dependencies: - dayjs "^1.10.0" - -ci-info@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + "dayjs" "^1.10.0" + +"ci-info@^3.2.0": + "integrity" "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==" + "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz" + "version" "3.5.0" + +"cjs-module-lexer@^1.0.0": + "integrity" "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" + "resolved" "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" + "version" "1.2.2" + +"cliui@^8.0.1": + "integrity" "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==" + "resolved" "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + "version" "8.0.1" + dependencies: + "string-width" "^4.2.0" + "strip-ansi" "^6.0.1" + "wrap-ansi" "^7.0.0" + +"co@^4.6.0": + "integrity" "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" + "resolved" "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + "version" "4.6.0" + +"collect-v8-coverage@^1.0.0": + "integrity" "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + "resolved" "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" + "version" "1.0.1" + +"color-convert@^1.9.0": + "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + "version" "1.9.3" dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssom@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -data-urls@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" - integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== - dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - -dayjs@^1.10.0: - version "1.10.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" - integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decimal.js@^10.3.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -detect-indent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== - dependencies: - webidl-conversions "^7.0.0" - -electron-to-chromium@^1.3.878: - version "1.3.879" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.879.tgz#4aba9700cfb241fb95c6ed69e31785e3d1605a43" - integrity sha512-zJo+D9GwbJvM31IdFmwcGvychhk4KKbKYo2GWlsn+C/dxz2NwmbhGJjWwTfFSF2+eFH7VvfA8MCZ8SOqTrlnpw== - -electron-to-chromium@^1.4.172: - version "1.4.184" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.184.tgz#381d4d111fc82d3376ed690dfb621e675f9078a9" - integrity sha512-IADi390FRdvxWfVX3hjzfTDNVHiTqVo9ar53/7em/SfhUG9YcjVhyQecY/XwmBHRKden/wFud7RWOUH7+7LFng== - -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -entities@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" - integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-promise@^3.1.2: - version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== - -esbuild-android-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.6.tgz#baaed943ca510c2ad546e116728132e76d1d2044" - integrity sha512-Z1CHSgB1crVQi2LKSBwSkpaGtaloVz0ZIYcRMsvHc3uSXcR/x5/bv9wcZspvH/25lIGTaViosciS/NS09ERmVA== - -esbuild-android-arm64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.6.tgz#1c33c73d4c074969e014e31958116460c8e75a7a" - integrity sha512-mvM+gqNxqKm2pCa3dnjdRzl7gIowuc4ga7P7c3yHzs58Im8v/Lfk1ixSgQ2USgIywT48QWaACRa3F4MG7djpSw== - -esbuild-darwin-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.6.tgz#388592ba61bf31993d79f6311f7452aa1ef255b9" - integrity sha512-BsfVt3usScAfGlXJiGtGamwVEOTM8AiYiw1zqDWhGv6BncLXCnTg1As+90mxWewdTZKq3iIy8s9g8CKkrrAXVw== - -esbuild-darwin-arm64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.6.tgz#194e987849dc4688654008a1792f26e948f52e74" - integrity sha512-CnrAeJaEpPakUobhqO4wVSA4Zm6TPaI5UY4EsI62j9mTrjIyQPXA1n4Ju6Iu5TVZRnEqV6q8blodgYJ6CJuwCA== - -esbuild-freebsd-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.6.tgz#daa72faee585ec2ec27cc65e86a6ce0786373e66" - integrity sha512-+qFdmqi+jkAsxsNJkaWVrnxEUUI50nu6c3MBVarv3RCDCbz7ZS1a4ZrdkwEYFnKcVWu6UUE0Kkb1SQ1yGEG6sg== - -esbuild-freebsd-arm64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.6.tgz#70c8a2a30bf6bb9d547a0d8dc93aa015ec4f77f9" - integrity sha512-KtQkQOhnNciXm2yrTYZMD3MOm2zBiiwFSU+dkwNbcfDumzzUprr1x70ClTdGuZwieBS1BM/k0KajRQX7r504Xw== - -esbuild-linux-32@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.6.tgz#d69ed2335b2d68c00b3248254b432172077b7ced" - integrity sha512-IAkDNz3TpxwISTGVdQijwyHBZrbFgLlRi5YXcvaEHtgbmayLSDcJmH5nV1MFgo/x2QdKcHBkOYHdjhKxUAcPwg== - -esbuild-linux-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.6.tgz#dca821e8f129cccde23ac947fd0d4bea3b333808" - integrity sha512-gQPksyrEYfA4LJwyfTQWAZaVZCx4wpaLrSzo2+Xc9QLC+i/sMWmX31jBjrn4nLJCd79KvwCinto36QC7BEIU/A== - -esbuild-linux-arm64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.6.tgz#c9e8bc86f3c58a7c8ff1ded5880c6a39ade7621b" - integrity sha512-aovDkclFa6C9EdZVBuOXxqZx83fuoq8097xZKhEPSygwuy4Lxs8J4anHG7kojAsR+31lfUuxzOo2tHxv7EiNHA== - -esbuild-linux-arm@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.6.tgz#354ecad0223f5b176995cf4462560eec2633de24" - integrity sha512-xZ0Bq2aivsthDjA/ytQZzxrxIZbG0ATJYMJxNeOIBc1zUjpbVpzBKgllOZMsTSXMHFHGrow6TnCcgwqY0+oEoQ== - -esbuild-linux-mips64le@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.6.tgz#f4fb941a4ff0af437deed69a2e0712983c8fff3e" - integrity sha512-wVpW8wkWOGizsCqCwOR/G3SHwhaecpGy3fic9BF1r7vq4djLjUcA8KunDaBCjJ6TgLQFhJ98RjDuyEf8AGjAvw== - -esbuild-linux-ppc64le@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.6.tgz#19774a8b52c77173f2d4f171b8a8cf839b12e686" - integrity sha512-z6w6gsPH/Y77uchocluDC8tkCg9rfkcPTePzZKNr879bF4tu7j9t255wuNOCE396IYEGxY7y8u2HJ9i7kjCLVw== - -esbuild-linux-riscv64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.6.tgz#66bd83b065c4a1e623df02c122bc7e4e15fd8486" - integrity sha512-pfK/3MJcmbfU399TnXW5RTPS1S+ID6ra+CVj9TFZ2s0q9Ja1F5A1VirUUvViPkjiw+Kq3zveyn6U09Wg1zJXrw== - -esbuild-linux-s390x@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.6.tgz#1e024bddc75afe8dc70ed48fc9627af770d7f34b" - integrity sha512-OZeeDu32liefcwAE63FhVqM4heWTC8E3MglOC7SK0KYocDdY/6jyApw0UDkDHlcEK9mW6alX/SH9r3PDjcCo/Q== - -esbuild-netbsd-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.6.tgz#c11477d197f059c8794ee1691e3399201f7c4b9a" - integrity sha512-kaxw61wcHMyiEsSsi5ut1YYs/hvTC2QkxJwyRvC2Cnsz3lfMLEu8zAjpBKWh9aU/N0O/gsRap4wTur5GRuSvBA== - -esbuild-openbsd-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.6.tgz#b29e7faed5b8d2aeaf3884c47c1a96b1cba8e263" - integrity sha512-CuoY60alzYfIZapUHqFXqXbj88bbRJu8Fp9okCSHRX2zWIcGz4BXAHXiG7dlCye5nFVrY72psesLuWdusyf2qw== - -esbuild-sunos-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.6.tgz#9668f39e47179f50c0435040904b9c6e10e84a70" - integrity sha512-1ceefLdPWcd1nW/ZLruPEYxeUEAVX0YHbG7w+BB4aYgfknaLGotI/ZvPWUZpzhC8l1EybrVlz++lm3E6ODIJOg== - -esbuild-svelte@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/esbuild-svelte/-/esbuild-svelte-0.7.1.tgz#5390e2c66937fed51dffa9d4d8ed0547a6628357" - integrity sha512-83vRAJ2OmoKxmK+rLFZVmyv5bJ8ahsYQwJ2RGmNAlHBIHq4ENUwA/hiwA2+AohrWD1BgZnGPMj8DL3l0I0xkug== - -esbuild-windows-32@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.6.tgz#9ddcd56e3c4fb9729a218c713c4e76bdbc1678b4" - integrity sha512-pBqdOsKqCD5LRYiwF29PJRDJZi7/Wgkz46u3d17MRFmrLFcAZDke3nbdDa1c8YgY78RiemudfCeAemN8EBlIpA== - -esbuild-windows-64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.6.tgz#1eaadeadfd995e9d065d35cb3e9f02607202f339" - integrity sha512-KpPOh4aTOo//g9Pk2oVAzXMpc9Sz9n5A9sZTmWqDSXCiiachfFhbuFlsKBGATYCVitXfmBIJ4nNYYWSOdz4hQg== - -esbuild-windows-arm64@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.6.tgz#e18a778d354fc2ca2306688f3fedad8a3e57819e" - integrity sha512-DB3G2x9OvFEa00jV+OkDBYpufq5x/K7a6VW6E2iM896DG4ZnAvJKQksOsCPiM1DUaa+DrijXAQ/ZOcKAqf/3Hg== - -esbuild@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.6.tgz#626e5941b98de506b862047be3c4b33f89278923" - integrity sha512-sgLOv3l4xklvXzzczhRwKRotyrfyZ2i1fCS6PTOLPd9wevDPArGU8HFtHrHCOcsMwTjLjzGm15gvC8uxVzQf+w== + "color-name" "1.1.3" + +"color-convert@^2.0.1": + "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "color-name" "~1.1.4" + +"color-name@~1.1.4": + "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + "version" "1.1.4" + +"color-name@1.1.3": + "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + "version" "1.1.3" + +"combined-stream@^1.0.8": + "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" + "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + "version" "1.0.8" + dependencies: + "delayed-stream" "~1.0.0" + +"concat-map@0.0.1": + "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "version" "0.0.1" + +"convert-source-map@^1.4.0", "convert-source-map@^1.6.0", "convert-source-map@^1.7.0": + "integrity" "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==" + "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" + "version" "1.8.0" + dependencies: + "safe-buffer" "~5.1.1" + +"cross-spawn@^7.0.2", "cross-spawn@^7.0.3": + "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + "version" "7.0.3" + dependencies: + "path-key" "^3.1.0" + "shebang-command" "^2.0.0" + "which" "^2.0.1" + +"cssom@^0.5.0": + "integrity" "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + "resolved" "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz" + "version" "0.5.0" + +"cssom@~0.3.6": + "integrity" "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "resolved" "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" + "version" "0.3.8" + +"cssstyle@^2.3.0": + "integrity" "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==" + "resolved" "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" + "version" "2.3.0" + dependencies: + "cssom" "~0.3.6" + +"data-urls@^3.0.1": + "integrity" "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==" + "resolved" "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "abab" "^2.0.6" + "whatwg-mimetype" "^3.0.0" + "whatwg-url" "^11.0.0" + +"dayjs@^1.10.0": + "integrity" "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" + "resolved" "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz" + "version" "1.10.7" + +"debug@^2.6.9": + "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" + "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + "version" "2.6.9" + dependencies: + "ms" "2.0.0" + +"debug@^3.2.7": + "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + "version" "3.2.7" + dependencies: + "ms" "^2.1.1" + +"debug@^4.1.0", "debug@^4.1.1", "debug@^4.3.2", "debug@^4.3.4", "debug@4": + "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + "version" "4.3.4" + dependencies: + "ms" "2.1.2" + +"decimal.js@^10.3.1": + "integrity" "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==" + "resolved" "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz" + "version" "10.4.2" + +"dedent@^0.7.0": + "integrity" "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + "resolved" "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + "version" "0.7.0" + +"deep-is@^0.1.3", "deep-is@~0.1.3": + "integrity" "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + "version" "0.1.4" + +"deepmerge@^4.2.2": + "integrity" "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + "resolved" "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" + "version" "4.2.2" + +"define-properties@^1.1.3": + "integrity" "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==" + "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "object-keys" "^1.0.12" + +"delayed-stream@~1.0.0": + "integrity" "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + "version" "1.0.0" + +"detect-indent@^6.0.0": + "integrity" "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" + "resolved" "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" + "version" "6.1.0" + +"detect-newline@^3.0.0": + "integrity" "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + "resolved" "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + "version" "3.1.0" + +"diff-sequences@^28.1.1": + "integrity" "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==" + "resolved" "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz" + "version" "28.1.1" + +"dir-glob@^3.0.1": + "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" + "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "path-type" "^4.0.0" + +"doctrine@^2.1.0": + "integrity" "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==" + "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "esutils" "^2.0.2" + +"doctrine@^3.0.0": + "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" + "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "esutils" "^2.0.2" + +"domexception@^4.0.0": + "integrity" "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==" + "resolved" "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "webidl-conversions" "^7.0.0" + +"electron-to-chromium@^1.3.878": + "integrity" "sha512-zJo+D9GwbJvM31IdFmwcGvychhk4KKbKYo2GWlsn+C/dxz2NwmbhGJjWwTfFSF2+eFH7VvfA8MCZ8SOqTrlnpw==" + "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.879.tgz" + "version" "1.3.879" + +"emittery@^0.10.2": + "integrity" "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==" + "resolved" "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" + "version" "0.10.2" + +"emoji-regex@^8.0.0": + "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + "version" "8.0.0" + +"entities@~3.0.1": + "integrity" "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" + "resolved" "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz" + "version" "3.0.1" + +"error-ex@^1.3.1": + "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" + "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + "version" "1.3.2" + dependencies: + "is-arrayish" "^0.2.1" + +"es-abstract@^1.19.0", "es-abstract@^1.19.1": + "integrity" "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==" + "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz" + "version" "1.19.1" + dependencies: + "call-bind" "^1.0.2" + "es-to-primitive" "^1.2.1" + "function-bind" "^1.1.1" + "get-intrinsic" "^1.1.1" + "get-symbol-description" "^1.0.0" + "has" "^1.0.3" + "has-symbols" "^1.0.2" + "internal-slot" "^1.0.3" + "is-callable" "^1.2.4" + "is-negative-zero" "^2.0.1" + "is-regex" "^1.1.4" + "is-shared-array-buffer" "^1.0.1" + "is-string" "^1.0.7" + "is-weakref" "^1.0.1" + "object-inspect" "^1.11.0" + "object-keys" "^1.1.1" + "object.assign" "^4.1.2" + "string.prototype.trimend" "^1.0.4" + "string.prototype.trimstart" "^1.0.4" + "unbox-primitive" "^1.0.1" + +"es-to-primitive@^1.2.1": + "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==" + "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + "version" "1.2.1" + dependencies: + "is-callable" "^1.1.4" + "is-date-object" "^1.0.1" + "is-symbol" "^1.0.2" + +"es6-promise@^3.1.2": + "integrity" "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" + "resolved" "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" + "version" "3.3.1" + +"esbuild-linux-64@0.15.6": + "integrity" "sha512-gQPksyrEYfA4LJwyfTQWAZaVZCx4wpaLrSzo2+Xc9QLC+i/sMWmX31jBjrn4nLJCd79KvwCinto36QC7BEIU/A==" + "resolved" "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.6.tgz" + "version" "0.15.6" + +"esbuild-svelte@^0.7.1": + "integrity" "sha512-83vRAJ2OmoKxmK+rLFZVmyv5bJ8ahsYQwJ2RGmNAlHBIHq4ENUwA/hiwA2+AohrWD1BgZnGPMj8DL3l0I0xkug==" + "resolved" "https://registry.npmjs.org/esbuild-svelte/-/esbuild-svelte-0.7.1.tgz" + "version" "0.7.1" + +"esbuild@>=0.9.6", "esbuild@0.15.6": + "integrity" "sha512-sgLOv3l4xklvXzzczhRwKRotyrfyZ2i1fCS6PTOLPd9wevDPArGU8HFtHrHCOcsMwTjLjzGm15gvC8uxVzQf+w==" + "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.15.6.tgz" + "version" "0.15.6" optionalDependencies: "@esbuild/linux-loong64" "0.15.6" - esbuild-android-64 "0.15.6" - esbuild-android-arm64 "0.15.6" - esbuild-darwin-64 "0.15.6" - esbuild-darwin-arm64 "0.15.6" - esbuild-freebsd-64 "0.15.6" - esbuild-freebsd-arm64 "0.15.6" - esbuild-linux-32 "0.15.6" - esbuild-linux-64 "0.15.6" - esbuild-linux-arm "0.15.6" - esbuild-linux-arm64 "0.15.6" - esbuild-linux-mips64le "0.15.6" - esbuild-linux-ppc64le "0.15.6" - esbuild-linux-riscv64 "0.15.6" - esbuild-linux-s390x "0.15.6" - esbuild-netbsd-64 "0.15.6" - esbuild-openbsd-64 "0.15.6" - esbuild-sunos-64 "0.15.6" - esbuild-windows-32 "0.15.6" - esbuild-windows-64 "0.15.6" - esbuild-windows-arm64 "0.15.6" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" + "esbuild-android-64" "0.15.6" + "esbuild-android-arm64" "0.15.6" + "esbuild-darwin-64" "0.15.6" + "esbuild-darwin-arm64" "0.15.6" + "esbuild-freebsd-64" "0.15.6" + "esbuild-freebsd-arm64" "0.15.6" + "esbuild-linux-32" "0.15.6" + "esbuild-linux-64" "0.15.6" + "esbuild-linux-arm" "0.15.6" + "esbuild-linux-arm64" "0.15.6" + "esbuild-linux-mips64le" "0.15.6" + "esbuild-linux-ppc64le" "0.15.6" + "esbuild-linux-riscv64" "0.15.6" + "esbuild-linux-s390x" "0.15.6" + "esbuild-netbsd-64" "0.15.6" + "esbuild-openbsd-64" "0.15.6" + "esbuild-sunos-64" "0.15.6" + "esbuild-windows-32" "0.15.6" + "esbuild-windows-64" "0.15.6" + "esbuild-windows-arm64" "0.15.6" + +"escalade@^3.1.1": + "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + "version" "3.1.1" + +"escape-string-regexp@^1.0.5": + "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" + +"escape-string-regexp@^2.0.0": + "integrity" "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + "version" "2.0.0" + +"escape-string-regexp@^4.0.0": + "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + "version" "4.0.0" + +"escodegen@^2.0.0": + "integrity" "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==" + "resolved" "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "esprima" "^4.0.1" + "estraverse" "^5.2.0" + "esutils" "^2.0.2" + "optionator" "^0.8.1" optionalDependencies: - source-map "~0.6.1" - -eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== - -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - -eslint-module-utils@^2.7.3: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== - dependencies: - debug "^3.2.7" - find-up "^2.1.0" - -eslint-plugin-import@^2.22.1: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== - dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" - has "^1.0.3" - is-core-module "^2.8.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^8.23.0: - version "8.23.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.0.tgz#a184918d288820179c6041bb3ddcc99ce6eea040" - integrity sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA== - dependencies: - "@eslint/eslintrc" "^1.3.1" - "@humanwhocodes/config-array" "^0.10.4" - "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" + "source-map" "~0.6.1" + +"eslint-config-prettier@^8.5.0": + "integrity" "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==" + "resolved" "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" + "version" "8.5.0" + +"eslint-import-resolver-node@^0.3.6": + "integrity" "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==" + "resolved" "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz" + "version" "0.3.6" + dependencies: + "debug" "^3.2.7" + "resolve" "^1.20.0" + +"eslint-module-utils@^2.7.0": + "integrity" "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==" + "resolved" "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz" + "version" "2.7.1" + dependencies: + "debug" "^3.2.7" + "find-up" "^2.1.0" + "pkg-dir" "^2.0.0" + +"eslint-plugin-import@^2.22.1": + "integrity" "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==" + "resolved" "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz" + "version" "2.25.2" + dependencies: + "array-includes" "^3.1.4" + "array.prototype.flat" "^1.2.5" + "debug" "^2.6.9" + "doctrine" "^2.1.0" + "eslint-import-resolver-node" "^0.3.6" + "eslint-module-utils" "^2.7.0" + "has" "^1.0.3" + "is-core-module" "^2.7.0" + "is-glob" "^4.0.3" + "minimatch" "^3.0.4" + "object.values" "^1.1.5" + "resolve" "^1.20.0" + "tsconfig-paths" "^3.11.0" + +"eslint-plugin-prettier@^4.2.1": + "integrity" "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==" + "resolved" "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" + "version" "4.2.1" + dependencies: + "prettier-linter-helpers" "^1.0.0" + +"eslint-scope@^5.1.1": + "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" + "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "esrecurse" "^4.3.0" + "estraverse" "^4.1.1" + +"eslint-scope@^7.1.1": + "integrity" "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==" + "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + "version" "7.1.1" + dependencies: + "esrecurse" "^4.3.0" + "estraverse" "^5.2.0" + +"eslint-utils@^3.0.0": + "integrity" "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==" + "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "eslint-visitor-keys" "^2.0.0" + +"eslint-visitor-keys@^2.0.0": + "integrity" "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + "version" "2.1.0" + +"eslint-visitor-keys@^3.3.0": + "integrity" "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" + "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + "version" "3.3.0" + +"eslint@*", "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^8.23.0", "eslint@>=5", "eslint@>=7.0.0", "eslint@>=7.28.0": + "integrity" "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==" + "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz" + "version" "8.26.0" + dependencies: + "@eslint/eslintrc" "^1.3.3" + "@humanwhocodes/config-array" "^0.11.6" "@humanwhocodes/module-importer" "^1.0.1" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - functional-red-black-tree "^1.0.1" - glob-parent "^6.0.1" - globals "^13.15.0" - globby "^11.1.0" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - -espree@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" - integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eventemitter2@^6.4.5: - version "6.4.7" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" - integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expect@^28.0.0, expect@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" - integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== + "@nodelib/fs.walk" "^1.2.8" + "ajv" "^6.10.0" + "chalk" "^4.0.0" + "cross-spawn" "^7.0.2" + "debug" "^4.3.2" + "doctrine" "^3.0.0" + "escape-string-regexp" "^4.0.0" + "eslint-scope" "^7.1.1" + "eslint-utils" "^3.0.0" + "eslint-visitor-keys" "^3.3.0" + "espree" "^9.4.0" + "esquery" "^1.4.0" + "esutils" "^2.0.2" + "fast-deep-equal" "^3.1.3" + "file-entry-cache" "^6.0.1" + "find-up" "^5.0.0" + "glob-parent" "^6.0.2" + "globals" "^13.15.0" + "grapheme-splitter" "^1.0.4" + "ignore" "^5.2.0" + "import-fresh" "^3.0.0" + "imurmurhash" "^0.1.4" + "is-glob" "^4.0.0" + "is-path-inside" "^3.0.3" + "js-sdsl" "^4.1.4" + "js-yaml" "^4.1.0" + "json-stable-stringify-without-jsonify" "^1.0.1" + "levn" "^0.4.1" + "lodash.merge" "^4.6.2" + "minimatch" "^3.1.2" + "natural-compare" "^1.4.0" + "optionator" "^0.9.1" + "regexpp" "^3.2.0" + "strip-ansi" "^6.0.1" + "strip-json-comments" "^3.1.0" + "text-table" "^0.2.0" + +"espree@^9.4.0": + "integrity" "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==" + "resolved" "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz" + "version" "9.4.0" + dependencies: + "acorn" "^8.8.0" + "acorn-jsx" "^5.3.2" + "eslint-visitor-keys" "^3.3.0" + +"esprima@^4.0.0", "esprima@^4.0.1": + "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + "version" "4.0.1" + +"esquery@^1.4.0": + "integrity" "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==" + "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "estraverse" "^5.1.0" + +"esrecurse@^4.3.0": + "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" + "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "estraverse" "^5.2.0" + +"estraverse@^4.1.1": + "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + "version" "4.3.0" + +"estraverse@^5.1.0", "estraverse@^5.2.0": + "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + "version" "5.3.0" + +"esutils@^2.0.2": + "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + "version" "2.0.3" + +"eventemitter2@^6.4.5": + "integrity" "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" + "resolved" "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz" + "version" "6.4.9" + +"execa@^5.0.0": + "integrity" "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==" + "resolved" "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "cross-spawn" "^7.0.3" + "get-stream" "^6.0.0" + "human-signals" "^2.1.0" + "is-stream" "^2.0.0" + "merge-stream" "^2.0.0" + "npm-run-path" "^4.0.1" + "onetime" "^5.1.2" + "signal-exit" "^3.0.3" + "strip-final-newline" "^2.0.0" + +"exit@^0.1.2": + "integrity" "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" + "resolved" "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + "version" "0.1.2" + +"expect@^28.0.0", "expect@^28.1.3": + "integrity" "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==" + "resolved" "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/expect-utils" "^28.1.3" - jest-get-type "^28.0.2" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + "jest-get-type" "^28.0.2" + "jest-matcher-utils" "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-util" "^28.1.3" + +"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3": + "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + "version" "3.1.3" + +"fast-diff@^1.1.2": + "integrity" "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + "resolved" "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" + "version" "1.2.0" + +"fast-glob@^3.2.11", "fast-glob@^3.2.7", "fast-glob@^3.2.9": + "integrity" "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==" + "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + "version" "3.2.11" dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.4: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.15.0: - version "13.16.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.16.0.tgz#9be4aca28f311aaeb974ea54978ebbb5e35ce46a" - integrity sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q== - dependencies: - type-fest "^0.20.2" - -globby@13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" - integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^4.0.0" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -graceful-fs@^4.1.3, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -html-encoding-sniffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== - dependencies: - whatwg-encoding "^2.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + "glob-parent" "^5.1.2" + "merge2" "^1.3.0" + "micromatch" "^4.0.4" + +"fast-json-stable-stringify@^2.0.0", "fast-json-stable-stringify@2.x": + "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + "version" "2.1.0" + +"fast-levenshtein@^2.0.6", "fast-levenshtein@~2.0.6": + "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + "version" "2.0.6" + +"fastq@^1.6.0": + "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" + "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + "version" "1.13.0" + dependencies: + "reusify" "^1.0.4" + +"fb-watchman@^2.0.0": + "integrity" "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==" + "resolved" "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "bser" "2.1.1" + +"file-entry-cache@^6.0.1": + "integrity" "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==" + "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "flat-cache" "^3.0.4" + +"fill-range@^7.0.1": + "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" + "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "to-regex-range" "^5.0.1" + +"find-up@^2.1.0": + "integrity" "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "locate-path" "^2.0.0" + +"find-up@^4.0.0": + "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "locate-path" "^5.0.0" + "path-exists" "^4.0.0" + +"find-up@^4.1.0": + "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "locate-path" "^5.0.0" + "path-exists" "^4.0.0" + +"find-up@^5.0.0": + "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "locate-path" "^6.0.0" + "path-exists" "^4.0.0" + +"flat-cache@^3.0.4": + "integrity" "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" + "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "flatted" "^3.1.0" + "rimraf" "^3.0.2" + +"flatted@^3.1.0": + "integrity" "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" + "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz" + "version" "3.2.2" + +"form-data@^4.0.0": + "integrity" "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==" + "resolved" "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "asynckit" "^0.4.0" + "combined-stream" "^1.0.8" + "mime-types" "^2.1.12" + +"fs.realpath@^1.0.0": + "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + "version" "1.0.0" + +"function-bind@^1.1.1": + "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + "version" "1.1.1" + +"gensync@^1.0.0-beta.2": + "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + "resolved" "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + "version" "1.0.0-beta.2" + +"get-caller-file@^2.0.5": + "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + "version" "2.0.5" + +"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.0", "get-intrinsic@^1.1.1": + "integrity" "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==" + "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "function-bind" "^1.1.1" + "has" "^1.0.3" + "has-symbols" "^1.0.1" + +"get-package-type@^0.1.0": + "integrity" "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + "resolved" "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + "version" "0.1.0" + +"get-stream@^6.0.0": + "integrity" "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + "version" "6.0.1" + +"get-symbol-description@^1.0.0": + "integrity" "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==" + "resolved" "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "call-bind" "^1.0.2" + "get-intrinsic" "^1.1.1" + +"glob-parent@^5.1.2", "glob-parent@~5.1.2": + "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "is-glob" "^4.0.1" + +"glob-parent@^6.0.2": + "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "is-glob" "^4.0.3" + +"glob@^7.1.3", "glob@^7.1.4": + "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + "version" "7.2.0" + dependencies: + "fs.realpath" "^1.0.0" + "inflight" "^1.0.4" + "inherits" "2" + "minimatch" "^3.0.4" + "once" "^1.3.0" + "path-is-absolute" "^1.0.0" + +"globals@^11.1.0": + "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + "version" "11.12.0" + +"globals@^13.15.0": + "integrity" "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==" + "resolved" "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz" + "version" "13.17.0" + dependencies: + "type-fest" "^0.20.2" + +"globby@^11.1.0": + "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" + "resolved" "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + "version" "11.1.0" + dependencies: + "array-union" "^2.1.0" + "dir-glob" "^3.0.1" + "fast-glob" "^3.2.9" + "ignore" "^5.2.0" + "merge2" "^1.4.1" + "slash" "^3.0.0" + +"globby@13.1.2": + "integrity" "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==" + "resolved" "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz" + "version" "13.1.2" + dependencies: + "dir-glob" "^3.0.1" + "fast-glob" "^3.2.11" + "ignore" "^5.2.0" + "merge2" "^1.4.1" + "slash" "^4.0.0" + +"graceful-fs@^4.1.3", "graceful-fs@^4.2.9": + "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + "version" "4.2.10" + +"grapheme-splitter@^1.0.4": + "integrity" "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + "resolved" "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + "version" "1.0.4" + +"has-bigints@^1.0.1": + "integrity" "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + "resolved" "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz" + "version" "1.0.1" + +"has-flag@^3.0.0": + "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + "version" "3.0.0" + +"has-flag@^4.0.0": + "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + "version" "4.0.0" + +"has-symbols@^1.0.1", "has-symbols@^1.0.2": + "integrity" "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" + "version" "1.0.2" + +"has-tostringtag@^1.0.0": + "integrity" "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==" + "resolved" "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "has-symbols" "^1.0.2" + +"has@^1.0.3": + "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" + "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "function-bind" "^1.1.1" + +"html-encoding-sniffer@^3.0.0": + "integrity" "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==" + "resolved" "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "whatwg-encoding" "^2.0.0" + +"html-escaper@^2.0.0": + "integrity" "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "resolved" "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + "version" "2.0.2" + +"http-proxy-agent@^5.0.0": + "integrity" "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==" + "resolved" "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" + "version" "5.0.0" dependencies: "@tootallnate/once" "2" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" - integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + "agent-base" "6" + "debug" "4" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" +"https-proxy-agent@^5.0.0": + "integrity" "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==" + "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "agent-base" "6" + "debug" "4" -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +"human-signals@^2.1.0": + "integrity" "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + "version" "2.1.0" + +"iconv-lite@0.6.3": + "integrity" "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==" + "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + "version" "0.6.3" + dependencies: + "safer-buffer" ">= 2.1.2 < 3.0.0" -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== +"ignore@^5.2.0": + "integrity" "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + "version" "5.2.0" + +"import-fresh@^3.0.0", "import-fresh@^3.2.1": + "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" + "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "parent-module" "^1.0.0" + "resolve-from" "^4.0.0" + +"import-local@^3.0.2": + "integrity" "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==" + "resolved" "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "pkg-dir" "^4.2.0" + "resolve-cwd" "^3.0.0" + +"imurmurhash@^0.1.4": + "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + "version" "0.1.4" + +"inflight@^1.0.4": + "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" + "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + "version" "1.0.6" + dependencies: + "once" "^1.3.0" + "wrappy" "1" + +"inherits@2": + "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + "version" "2.0.4" + +"internal-slot@^1.0.3": + "integrity" "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==" + "resolved" "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "get-intrinsic" "^1.1.0" + "has" "^1.0.3" + "side-channel" "^1.0.4" + +"is-arrayish@^0.2.1": + "integrity" "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + "version" "0.2.1" + +"is-bigint@^1.0.1": + "integrity" "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==" + "resolved" "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "has-bigints" "^1.0.1" + +"is-binary-path@~2.1.0": + "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" + "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "binary-extensions" "^2.0.0" + +"is-boolean-object@^1.1.0": + "integrity" "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==" + "resolved" "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + "version" "1.1.2" + dependencies: + "call-bind" "^1.0.2" + "has-tostringtag" "^1.0.0" + +"is-callable@^1.1.4", "is-callable@^1.2.4": + "integrity" "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" + "version" "1.2.4" + +"is-core-module@^2.2.0", "is-core-module@^2.7.0": + "integrity" "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==" + "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz" + "version" "2.8.0" + dependencies: + "has" "^1.0.3" + +"is-date-object@^1.0.1": + "integrity" "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==" + "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + "version" "1.0.5" + dependencies: + "has-tostringtag" "^1.0.0" + +"is-extglob@^2.1.1": + "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + "version" "2.1.1" + +"is-fullwidth-code-point@^3.0.0": + "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + "version" "3.0.0" + +"is-generator-fn@^2.0.0": + "integrity" "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + "resolved" "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + "version" "2.1.0" + +"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1": + "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" + "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "is-extglob" "^2.1.1" + +"is-negative-zero@^2.0.1": + "integrity" "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz" + "version" "2.0.1" + +"is-number-object@^1.0.4": + "integrity" "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==" + "resolved" "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz" + "version" "1.0.6" + dependencies: + "has-tostringtag" "^1.0.0" + +"is-number@^7.0.0": + "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + "version" "7.0.0" + +"is-path-inside@^3.0.3": + "integrity" "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + "version" "3.0.3" + +"is-potential-custom-element-name@^1.0.1": + "integrity" "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + "resolved" "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" + "version" "1.0.1" -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== +"is-regex@^1.1.4": + "integrity" "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==" + "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + "version" "1.1.4" dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + "call-bind" "^1.0.2" + "has-tostringtag" "^1.0.0" -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" +"is-shared-array-buffer@^1.0.1": + "integrity" "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + "resolved" "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz" + "version" "1.0.1" -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +"is-stream@^2.0.0": + "integrity" "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + "version" "2.0.1" + +"is-string@^1.0.5", "is-string@^1.0.7": + "integrity" "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==" + "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + "version" "1.0.7" + dependencies: + "has-tostringtag" "^1.0.0" + +"is-symbol@^1.0.2", "is-symbol@^1.0.3": + "integrity" "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==" + "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "has-symbols" "^1.0.2" -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +"is-weakref@^1.0.1": + "integrity" "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==" + "resolved" "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz" + "version" "1.0.1" dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + "call-bind" "^1.0.0" + +"isexe@^2.0.0": + "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "version" "2.0.0" -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== +"istanbul-lib-coverage@^3.0.0", "istanbul-lib-coverage@^3.2.0": + "integrity" "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" + "resolved" "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + "version" "3.2.0" -istanbul-lib-instrument@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.0.4.tgz#e976f2aa66ebc6737f236d3ab05b76e36f885c80" - integrity sha512-W6jJF9rLGEISGoCyXRqa/JCGQGmmxPO10TMu7izaUTynxvBvTjqzAIIGCK9USBmIbQAaSWD6XJPrM9Pv5INknw== +"istanbul-lib-instrument@^5.0.4", "istanbul-lib-instrument@^5.1.0": + "integrity" "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==" + "resolved" "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + "version" "5.2.1" dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" + "istanbul-lib-coverage" "^3.2.0" + "semver" "^6.3.0" -istanbul-lib-instrument@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== +"istanbul-lib-report@^3.0.0": + "integrity" "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==" + "resolved" "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + "version" "3.0.0" dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" + "istanbul-lib-coverage" "^3.0.0" + "make-dir" "^3.0.0" + "supports-color" "^7.1.0" -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== +"istanbul-lib-source-maps@^4.0.0": + "integrity" "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==" + "resolved" "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + "version" "4.0.1" dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" + "debug" "^4.1.1" + "istanbul-lib-coverage" "^3.0.0" + "source-map" "^0.6.1" -istanbul-reports@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== +"istanbul-reports@^3.1.3": + "integrity" "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==" + "resolved" "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" + "version" "3.1.5" dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" + "html-escaper" "^2.0.0" + "istanbul-lib-report" "^3.0.0" -jest-changed-files@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" - integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== +"jest-changed-files@^28.1.3": + "integrity" "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==" + "resolved" "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz" + "version" "28.1.3" dependencies: - execa "^5.0.0" - p-limit "^3.1.0" + "execa" "^5.0.0" + "p-limit" "^3.1.0" -jest-circus@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" - integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== +"jest-circus@^28.1.3": + "integrity" "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==" + "resolved" "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/environment" "^28.1.3" "@jest/expect" "^28.1.3" "@jest/test-result" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - p-limit "^3.1.0" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" - integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== + "chalk" "^4.0.0" + "co" "^4.6.0" + "dedent" "^0.7.0" + "is-generator-fn" "^2.0.0" + "jest-each" "^28.1.3" + "jest-matcher-utils" "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-runtime" "^28.1.3" + "jest-snapshot" "^28.1.3" + "jest-util" "^28.1.3" + "p-limit" "^3.1.0" + "pretty-format" "^28.1.3" + "slash" "^3.0.0" + "stack-utils" "^2.0.3" + +"jest-cli@^28.1.3": + "integrity" "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==" + "resolved" "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/core" "^28.1.3" "@jest/test-result" "^28.1.3" "@jest/types" "^28.1.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - prompts "^2.0.1" - yargs "^17.3.1" - -jest-config@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" - integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== + "chalk" "^4.0.0" + "exit" "^0.1.2" + "graceful-fs" "^4.2.9" + "import-local" "^3.0.2" + "jest-config" "^28.1.3" + "jest-util" "^28.1.3" + "jest-validate" "^28.1.3" + "prompts" "^2.0.1" + "yargs" "^17.3.1" + +"jest-config@^28.1.3": + "integrity" "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==" + "resolved" "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz" + "version" "28.1.3" dependencies: "@babel/core" "^7.11.6" "@jest/test-sequencer" "^28.1.3" "@jest/types" "^28.1.3" - babel-jest "^28.1.3" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^28.1.3" - jest-environment-node "^28.1.3" - jest-get-type "^28.0.2" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-runner "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^28.1.3" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" - integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== - dependencies: - chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" - -jest-docblock@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" - integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== - dependencies: - detect-newline "^3.0.0" - -jest-each@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" - integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== + "babel-jest" "^28.1.3" + "chalk" "^4.0.0" + "ci-info" "^3.2.0" + "deepmerge" "^4.2.2" + "glob" "^7.1.3" + "graceful-fs" "^4.2.9" + "jest-circus" "^28.1.3" + "jest-environment-node" "^28.1.3" + "jest-get-type" "^28.0.2" + "jest-regex-util" "^28.0.2" + "jest-resolve" "^28.1.3" + "jest-runner" "^28.1.3" + "jest-util" "^28.1.3" + "jest-validate" "^28.1.3" + "micromatch" "^4.0.4" + "parse-json" "^5.2.0" + "pretty-format" "^28.1.3" + "slash" "^3.0.0" + "strip-json-comments" "^3.1.1" + +"jest-diff@^28.1.3": + "integrity" "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==" + "resolved" "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz" + "version" "28.1.3" + dependencies: + "chalk" "^4.0.0" + "diff-sequences" "^28.1.1" + "jest-get-type" "^28.0.2" + "pretty-format" "^28.1.3" + +"jest-docblock@^28.1.1": + "integrity" "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==" + "resolved" "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz" + "version" "28.1.1" + dependencies: + "detect-newline" "^3.0.0" + +"jest-each@^28.1.3": + "integrity" "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==" + "resolved" "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" - chalk "^4.0.0" - jest-get-type "^28.0.2" - jest-util "^28.1.3" - pretty-format "^28.1.3" + "chalk" "^4.0.0" + "jest-get-type" "^28.0.2" + "jest-util" "^28.1.3" + "pretty-format" "^28.1.3" -jest-environment-jsdom@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz#2d4e5d61b7f1d94c3bddfbb21f0308ee506c09fb" - integrity sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg== +"jest-environment-jsdom@^28.1.3": + "integrity" "sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==" + "resolved" "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/environment" "^28.1.3" "@jest/fake-timers" "^28.1.3" "@jest/types" "^28.1.3" "@types/jsdom" "^16.2.4" "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" - jsdom "^19.0.0" + "jest-mock" "^28.1.3" + "jest-util" "^28.1.3" + "jsdom" "^19.0.0" -jest-environment-node@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" - integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== +"jest-environment-node@^28.1.3": + "integrity" "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==" + "resolved" "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/environment" "^28.1.3" "@jest/fake-timers" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" + "jest-mock" "^28.1.3" + "jest-util" "^28.1.3" -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== +"jest-get-type@^28.0.2": + "integrity" "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==" + "resolved" "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz" + "version" "28.0.2" -jest-haste-map@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" - integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== +"jest-haste-map@^28.1.3": + "integrity" "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==" + "resolved" "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" "@types/graceful-fs" "^4.1.3" "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^28.0.2" - jest-util "^28.1.3" - jest-worker "^28.1.3" - micromatch "^4.0.4" - walker "^1.0.8" + "anymatch" "^3.0.3" + "fb-watchman" "^2.0.0" + "graceful-fs" "^4.2.9" + "jest-regex-util" "^28.0.2" + "jest-util" "^28.1.3" + "jest-worker" "^28.1.3" + "micromatch" "^4.0.4" + "walker" "^1.0.8" optionalDependencies: - fsevents "^2.3.2" + "fsevents" "^2.3.2" -jest-leak-detector@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" - integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== +"jest-leak-detector@^28.1.3": + "integrity" "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==" + "resolved" "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz" + "version" "28.1.3" dependencies: - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + "jest-get-type" "^28.0.2" + "pretty-format" "^28.1.3" -jest-matcher-utils@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" - integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== +"jest-matcher-utils@^28.1.3": + "integrity" "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==" + "resolved" "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz" + "version" "28.1.3" dependencies: - chalk "^4.0.0" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + "chalk" "^4.0.0" + "jest-diff" "^28.1.3" + "jest-get-type" "^28.0.2" + "pretty-format" "^28.1.3" -jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== +"jest-message-util@^28.1.3": + "integrity" "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==" + "resolved" "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" + "version" "28.1.3" dependencies: "@babel/code-frame" "^7.12.13" "@jest/types" "^28.1.3" "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" - integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== + "chalk" "^4.0.0" + "graceful-fs" "^4.2.9" + "micromatch" "^4.0.4" + "pretty-format" "^28.1.3" + "slash" "^3.0.0" + "stack-utils" "^2.0.3" + +"jest-mock@^28.1.3": + "integrity" "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==" + "resolved" "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" "@types/node" "*" -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" - integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== - -jest-resolve-dependencies@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" - integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== - dependencies: - jest-regex-util "^28.0.2" - jest-snapshot "^28.1.3" - -jest-resolve@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" - integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-pnp-resolver "^1.2.2" - jest-util "^28.1.3" - jest-validate "^28.1.3" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-runner@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" - integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== +"jest-pnp-resolver@^1.2.2": + "integrity" "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + "resolved" "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" + "version" "1.2.2" + +"jest-regex-util@^28.0.2": + "integrity" "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==" + "resolved" "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" + "version" "28.0.2" + +"jest-resolve-dependencies@^28.1.3": + "integrity" "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==" + "resolved" "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz" + "version" "28.1.3" + dependencies: + "jest-regex-util" "^28.0.2" + "jest-snapshot" "^28.1.3" + +"jest-resolve@*", "jest-resolve@^28.1.3": + "integrity" "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==" + "resolved" "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz" + "version" "28.1.3" + dependencies: + "chalk" "^4.0.0" + "graceful-fs" "^4.2.9" + "jest-haste-map" "^28.1.3" + "jest-pnp-resolver" "^1.2.2" + "jest-util" "^28.1.3" + "jest-validate" "^28.1.3" + "resolve" "^1.20.0" + "resolve.exports" "^1.1.0" + "slash" "^3.0.0" + +"jest-runner@^28.1.3": + "integrity" "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==" + "resolved" "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/console" "^28.1.3" "@jest/environment" "^28.1.3" @@ -2950,26 +2573,26 @@ jest-runner@^28.1.3: "@jest/transform" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - chalk "^4.0.0" - emittery "^0.10.2" - graceful-fs "^4.2.9" - jest-docblock "^28.1.1" - jest-environment-node "^28.1.3" - jest-haste-map "^28.1.3" - jest-leak-detector "^28.1.3" - jest-message-util "^28.1.3" - jest-resolve "^28.1.3" - jest-runtime "^28.1.3" - jest-util "^28.1.3" - jest-watcher "^28.1.3" - jest-worker "^28.1.3" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" - integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== + "chalk" "^4.0.0" + "emittery" "^0.10.2" + "graceful-fs" "^4.2.9" + "jest-docblock" "^28.1.1" + "jest-environment-node" "^28.1.3" + "jest-haste-map" "^28.1.3" + "jest-leak-detector" "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-resolve" "^28.1.3" + "jest-runtime" "^28.1.3" + "jest-util" "^28.1.3" + "jest-watcher" "^28.1.3" + "jest-worker" "^28.1.3" + "p-limit" "^3.1.0" + "source-map-support" "0.5.13" + +"jest-runtime@^28.1.3": + "integrity" "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==" + "resolved" "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/environment" "^28.1.3" "@jest/fake-timers" "^28.1.3" @@ -2978,26 +2601,26 @@ jest-runtime@^28.1.3: "@jest/test-result" "^28.1.3" "@jest/transform" "^28.1.3" "@jest/types" "^28.1.3" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" - integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== + "chalk" "^4.0.0" + "cjs-module-lexer" "^1.0.0" + "collect-v8-coverage" "^1.0.0" + "execa" "^5.0.0" + "glob" "^7.1.3" + "graceful-fs" "^4.2.9" + "jest-haste-map" "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-mock" "^28.1.3" + "jest-regex-util" "^28.0.2" + "jest-resolve" "^28.1.3" + "jest-snapshot" "^28.1.3" + "jest-util" "^28.1.3" + "slash" "^3.0.0" + "strip-bom" "^4.0.0" + +"jest-snapshot@^28.1.3": + "integrity" "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==" + "resolved" "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz" + "version" "28.1.3" dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -3009,1402 +2632,1426 @@ jest-snapshot@^28.1.3: "@jest/types" "^28.1.3" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^28.1.3" - graceful-fs "^4.2.9" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - jest-haste-map "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - natural-compare "^1.4.0" - pretty-format "^28.1.3" - semver "^7.3.5" - -jest-util@^28.0.0, jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + "babel-preset-current-node-syntax" "^1.0.0" + "chalk" "^4.0.0" + "expect" "^28.1.3" + "graceful-fs" "^4.2.9" + "jest-diff" "^28.1.3" + "jest-get-type" "^28.0.2" + "jest-haste-map" "^28.1.3" + "jest-matcher-utils" "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-util" "^28.1.3" + "natural-compare" "^1.4.0" + "pretty-format" "^28.1.3" + "semver" "^7.3.5" + +"jest-util@^28.0.0", "jest-util@^28.1.3": + "integrity" "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==" + "resolved" "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" + "chalk" "^4.0.0" + "ci-info" "^3.2.0" + "graceful-fs" "^4.2.9" + "picomatch" "^2.2.3" -jest-validate@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" - integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== +"jest-validate@^28.1.3": + "integrity" "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==" + "resolved" "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^28.0.2" - leven "^3.1.0" - pretty-format "^28.1.3" + "camelcase" "^6.2.0" + "chalk" "^4.0.0" + "jest-get-type" "^28.0.2" + "leven" "^3.1.0" + "pretty-format" "^28.1.3" -jest-watcher@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" - integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== +"jest-watcher@^28.1.3": + "integrity" "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==" + "resolved" "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/test-result" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.3" - string-length "^4.0.1" + "ansi-escapes" "^4.2.1" + "chalk" "^4.0.0" + "emittery" "^0.10.2" + "jest-util" "^28.1.3" + "string-length" "^4.0.1" -jest-worker@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== +"jest-worker@^28.1.3": + "integrity" "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==" + "resolved" "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz" + "version" "28.1.3" dependencies: "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" + "merge-stream" "^2.0.0" + "supports-color" "^8.0.0" -jest@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b" - integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== +"jest@^28.0.0", "jest@^28.1.3": + "integrity" "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==" + "resolved" "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/core" "^28.1.3" "@jest/types" "^28.1.3" - import-local "^3.0.2" - jest-cli "^28.1.3" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsdom@^19.0.0: - version "19.0.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" - integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== - dependencies: - abab "^2.0.5" - acorn "^8.5.0" - acorn-globals "^6.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.1" - decimal.js "^10.3.1" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^3.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^10.0.0" - ws "^8.2.3" - xml-name-validator "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -linkify-it@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" - integrity sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw== - dependencies: - uc.micro "^1.0.1" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -magic-string@^0.25.7: - version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -markdown-it@13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" - integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== - dependencies: - argparse "^2.0.1" - entities "~3.0.1" - linkify-it "^4.0.1" - mdurl "^1.0.1" - uc.micro "^1.0.5" - -markdownlint-cli2-formatter-default@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.3.tgz#5aecd6e576ad18801b76e58bbbaf0e916c583ab8" - integrity sha512-QEAJitT5eqX1SNboOD+SO/LNBpu4P4je8JlR02ug2cLQAqmIhh8IJnSK7AcaHBHhNADqdGydnPpQOpsNcEEqCw== - -markdownlint-cli2@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/markdownlint-cli2/-/markdownlint-cli2-0.5.1.tgz#b55b89301f422231a0fc6265794b28cf4da95a82" - integrity sha512-f3Nb1GF/c8YSrV/FntsCWzpa5mLFJRlO+wzEgv+lkNQjU6MZflUwc2FbyEDPTo6oVhP2VyUOkK0GkFgfuktl1w== - dependencies: - globby "13.1.2" - markdownlint "0.26.2" - markdownlint-cli2-formatter-default "0.0.3" - micromatch "4.0.5" - strip-json-comments "5.0.0" - yaml "2.1.1" - -markdownlint@0.26.2: - version "0.26.2" - resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.26.2.tgz#11d3d03e7f0dd3c2e239753ee8fd064a861d9237" - integrity sha512-2Am42YX2Ex5SQhRq35HxYWDfz1NLEOZWWN25nqd2h3AHRKsGRE+Qg1gt1++exW792eXTrR4jCNHfShfWk9Nz8w== - dependencies: - markdown-it "13.0.1" - -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@4.0.5, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -moment@2.29.2: - version "2.29.2" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4" - integrity sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg== - -moment@^2.29.4: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== - -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== - -node-releases@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" - integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nwsapi@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" - integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== - -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -obsidian@0.14.6: - version "0.14.6" - resolved "https://registry.yarnpkg.com/obsidian/-/obsidian-0.14.6.tgz#010e16da3a1a7725f5e91beb9f14ec8abd00c15d" - integrity sha512-oXPJ8Zt10WhN19bk5l4mZuXRZbbdT1QoMgxGGJ0bB7UcJa0bozDzugS5L/QiV9gDoujpUPxDWNVahEel6r0Fpw== + "import-local" "^3.0.2" + "jest-cli" "^28.1.3" + +"js-sdsl@^4.1.4": + "integrity" "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==" + "resolved" "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz" + "version" "4.1.5" + +"js-tokens@^4.0.0": + "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + "version" "4.0.0" + +"js-yaml@^3.13.1": + "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" + "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + "version" "3.14.1" + dependencies: + "argparse" "^1.0.7" + "esprima" "^4.0.0" + +"js-yaml@^4.1.0": + "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==" + "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "argparse" "^2.0.1" + +"jsdom@^19.0.0": + "integrity" "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==" + "resolved" "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz" + "version" "19.0.0" + dependencies: + "abab" "^2.0.5" + "acorn" "^8.5.0" + "acorn-globals" "^6.0.0" + "cssom" "^0.5.0" + "cssstyle" "^2.3.0" + "data-urls" "^3.0.1" + "decimal.js" "^10.3.1" + "domexception" "^4.0.0" + "escodegen" "^2.0.0" + "form-data" "^4.0.0" + "html-encoding-sniffer" "^3.0.0" + "http-proxy-agent" "^5.0.0" + "https-proxy-agent" "^5.0.0" + "is-potential-custom-element-name" "^1.0.1" + "nwsapi" "^2.2.0" + "parse5" "6.0.1" + "saxes" "^5.0.1" + "symbol-tree" "^3.2.4" + "tough-cookie" "^4.0.0" + "w3c-hr-time" "^1.0.2" + "w3c-xmlserializer" "^3.0.0" + "webidl-conversions" "^7.0.0" + "whatwg-encoding" "^2.0.0" + "whatwg-mimetype" "^3.0.0" + "whatwg-url" "^10.0.0" + "ws" "^8.2.3" + "xml-name-validator" "^4.0.0" + +"jsesc@^2.5.1": + "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + "version" "2.5.2" + +"json-parse-even-better-errors@^2.3.0": + "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + "version" "2.3.1" + +"json-schema-traverse@^0.4.1": + "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + "version" "0.4.1" + +"json-stable-stringify-without-jsonify@^1.0.1": + "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + "version" "1.0.1" + +"json5@^1.0.1": + "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==" + "resolved" "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "minimist" "^1.2.0" + +"json5@^2.1.2", "json5@^2.2.1": + "integrity" "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "resolved" "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" + "version" "2.2.1" + +"kleur@^3.0.3": + "integrity" "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + "resolved" "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + "version" "3.0.3" + +"leven@^3.1.0": + "integrity" "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + "resolved" "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + "version" "3.1.0" + +"levn@^0.4.1": + "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" + "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + "version" "0.4.1" + dependencies: + "prelude-ls" "^1.2.1" + "type-check" "~0.4.0" + +"levn@~0.3.0": + "integrity" "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==" + "resolved" "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" + "version" "0.3.0" + dependencies: + "prelude-ls" "~1.1.2" + "type-check" "~0.3.2" + +"lines-and-columns@^1.1.6": + "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + "version" "1.2.4" + +"linkify-it@^4.0.1": + "integrity" "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==" + "resolved" "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "uc.micro" "^1.0.1" + +"locate-path@^2.0.0": + "integrity" "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=" + "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "p-locate" "^2.0.0" + "path-exists" "^3.0.0" + +"locate-path@^5.0.0": + "integrity" "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" + "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "p-locate" "^4.1.0" + +"locate-path@^6.0.0": + "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" + "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "p-locate" "^5.0.0" + +"lodash.memoize@4.x": + "integrity" "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + "resolved" "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + "version" "4.1.2" + +"lodash.merge@^4.6.2": + "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + "version" "4.6.2" + +"lru-cache@^6.0.0": + "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "yallist" "^4.0.0" + +"magic-string@^0.25.7": + "integrity" "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==" + "resolved" "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" + "version" "0.25.7" + dependencies: + "sourcemap-codec" "^1.4.4" + +"make-dir@^3.0.0": + "integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==" + "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "semver" "^6.0.0" + +"make-error@1.x": + "integrity" "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + "resolved" "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + "version" "1.3.6" + +"makeerror@1.0.12": + "integrity" "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==" + "resolved" "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + "version" "1.0.12" + dependencies: + "tmpl" "1.0.5" + +"markdown-it@13.0.1": + "integrity" "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==" + "resolved" "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz" + "version" "13.0.1" + dependencies: + "argparse" "^2.0.1" + "entities" "~3.0.1" + "linkify-it" "^4.0.1" + "mdurl" "^1.0.1" + "uc.micro" "^1.0.5" + +"markdownlint-cli2-formatter-default@0.0.3": + "integrity" "sha512-QEAJitT5eqX1SNboOD+SO/LNBpu4P4je8JlR02ug2cLQAqmIhh8IJnSK7AcaHBHhNADqdGydnPpQOpsNcEEqCw==" + "resolved" "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.3.tgz" + "version" "0.0.3" + +"markdownlint-cli2@^0.5.1", "markdownlint-cli2@>=0.0.4": + "integrity" "sha512-f3Nb1GF/c8YSrV/FntsCWzpa5mLFJRlO+wzEgv+lkNQjU6MZflUwc2FbyEDPTo6oVhP2VyUOkK0GkFgfuktl1w==" + "resolved" "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.5.1.tgz" + "version" "0.5.1" + dependencies: + "globby" "13.1.2" + "markdownlint" "0.26.2" + "markdownlint-cli2-formatter-default" "0.0.3" + "micromatch" "4.0.5" + "strip-json-comments" "5.0.0" + "yaml" "2.1.1" + +"markdownlint@0.26.2": + "integrity" "sha512-2Am42YX2Ex5SQhRq35HxYWDfz1NLEOZWWN25nqd2h3AHRKsGRE+Qg1gt1++exW792eXTrR4jCNHfShfWk9Nz8w==" + "resolved" "https://registry.npmjs.org/markdownlint/-/markdownlint-0.26.2.tgz" + "version" "0.26.2" + dependencies: + "markdown-it" "13.0.1" + +"mdurl@^1.0.1": + "integrity" "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + "resolved" "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" + "version" "1.0.1" + +"merge-stream@^2.0.0": + "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + "version" "2.0.0" + +"merge2@^1.3.0", "merge2@^1.4.1": + "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + "version" "1.4.1" + +"micromatch@^4.0.4", "micromatch@4.0.5": + "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" + "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + "version" "4.0.5" + dependencies: + "braces" "^3.0.2" + "picomatch" "^2.3.1" + +"mime-db@1.52.0": + "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + "version" "1.52.0" + +"mime-types@^2.1.12": + "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + "version" "2.1.35" + dependencies: + "mime-db" "1.52.0" + +"mimic-fn@^2.1.0": + "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + "version" "2.1.0" + +"min-indent@^1.0.0": + "integrity" "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + "resolved" "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + "version" "1.0.1" + +"minimatch@^3.0.4", "minimatch@^3.0.5", "minimatch@^3.1.2": + "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "brace-expansion" "^1.1.7" + +"minimist@^1.2.0", "minimist@^1.2.5": + "integrity" "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" + "version" "1.2.6" + +"mkdirp@^0.5.1": + "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + "version" "0.5.5" + dependencies: + "minimist" "^1.2.5" + +"moment@^2.29.4": + "integrity" "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + "resolved" "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" + "version" "2.29.4" + +"moment@2.29.2": + "integrity" "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==" + "resolved" "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz" + "version" "2.29.2" + +"mri@^1.1.0": + "integrity" "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" + "resolved" "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" + "version" "1.2.0" + +"ms@^2.1.1": + "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + "version" "2.1.3" + +"ms@2.0.0": + "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + "version" "2.0.0" + +"ms@2.1.2": + "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + "version" "2.1.2" + +"natural-compare@^1.4.0": + "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + "version" "1.4.0" + +"node-int64@^0.4.0": + "integrity" "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + "resolved" "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + "version" "0.4.0" + +"node-releases@^2.0.1": + "integrity" "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" + "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz" + "version" "2.0.1" + +"normalize-path@^3.0.0", "normalize-path@~3.0.0": + "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + "version" "3.0.0" + +"npm-run-path@^4.0.1": + "integrity" "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==" + "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "path-key" "^3.0.0" + +"nwsapi@^2.2.0": + "integrity" "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==" + "resolved" "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz" + "version" "2.2.2" + +"object-inspect@^1.11.0", "object-inspect@^1.9.0": + "integrity" "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz" + "version" "1.11.0" + +"object-keys@^1.0.12", "object-keys@^1.1.1": + "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + "version" "1.1.1" + +"object.assign@^4.1.2": + "integrity" "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==" + "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "call-bind" "^1.0.0" + "define-properties" "^1.1.3" + "has-symbols" "^1.0.1" + "object-keys" "^1.1.1" + +"object.values@^1.1.5": + "integrity" "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==" + "resolved" "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz" + "version" "1.1.5" + dependencies: + "call-bind" "^1.0.2" + "define-properties" "^1.1.3" + "es-abstract" "^1.19.1" + +"obsidian@0.14.6": + "integrity" "sha512-oXPJ8Zt10WhN19bk5l4mZuXRZbbdT1QoMgxGGJ0bB7UcJa0bozDzugS5L/QiV9gDoujpUPxDWNVahEel6r0Fpw==" + "resolved" "https://registry.npmjs.org/obsidian/-/obsidian-0.14.6.tgz" + "version" "0.14.6" dependencies: "@codemirror/state" "^0.19.6" "@codemirror/view" "^0.19.31" "@types/codemirror" "0.0.108" - moment "2.29.2" + "moment" "2.29.2" -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== +"once@^1.3.0": + "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" + "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "version" "1.4.0" dependencies: - wrappy "1" + "wrappy" "1" -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== +"onetime@^5.1.2": + "integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" + "resolved" "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + "version" "5.1.2" dependencies: - mimic-fn "^2.1.0" + "mimic-fn" "^2.1.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== +"optionator@^0.8.1": + "integrity" "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==" + "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" + "version" "0.8.3" dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" + "deep-is" "~0.1.3" + "fast-levenshtein" "~2.0.6" + "levn" "~0.3.0" + "prelude-ls" "~1.1.2" + "type-check" "~0.3.2" + "word-wrap" "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +"optionator@^0.9.1": + "integrity" "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==" + "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + "version" "0.9.1" dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" + "deep-is" "^0.1.3" + "fast-levenshtein" "^2.0.6" + "levn" "^0.4.1" + "prelude-ls" "^1.2.1" + "type-check" "^0.4.0" + "word-wrap" "^1.2.3" -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== +"p-limit@^1.1.0": + "integrity" "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==" + "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" + "version" "1.3.0" dependencies: - p-try "^1.0.0" + "p-try" "^1.0.0" -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== +"p-limit@^2.2.0": + "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" + "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + "version" "2.3.0" dependencies: - p-try "^2.0.0" + "p-try" "^2.0.0" -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== +"p-limit@^3.0.2": + "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" + "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + "version" "3.1.0" dependencies: - yocto-queue "^0.1.0" + "yocto-queue" "^0.1.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== +"p-limit@^3.1.0": + "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" + "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + "version" "3.1.0" dependencies: - p-limit "^1.1.0" + "yocto-queue" "^0.1.0" -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== +"p-locate@^2.0.0": + "integrity" "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=" + "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" + "version" "2.0.0" dependencies: - p-limit "^2.2.0" + "p-limit" "^1.1.0" -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== +"p-locate@^4.1.0": + "integrity" "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" + "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + "version" "4.1.0" dependencies: - p-limit "^3.0.2" + "p-limit" "^2.2.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== +"p-locate@^5.0.0": + "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" + "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "p-limit" "^3.0.2" + +"p-try@^1.0.0": + "integrity" "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "resolved" "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" + "version" "1.0.0" -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +"p-try@^2.0.0": + "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + "version" "2.2.0" -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== +"parent-module@^1.0.0": + "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" + "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + "version" "1.0.1" dependencies: - callsites "^3.0.0" + "callsites" "^3.0.0" -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== +"parse-json@^5.2.0": + "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==" + "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + "version" "5.2.0" dependencies: "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier-plugin-svelte@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/prettier-plugin-svelte/-/prettier-plugin-svelte-2.7.0.tgz#ecfa4fe824238a4466a3497df1a96d15cf43cabb" - integrity sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA== - -prettier@^2.2.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== - -pretty-format@^28.0.0, pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + "error-ex" "^1.3.1" + "json-parse-even-better-errors" "^2.3.0" + "lines-and-columns" "^1.1.6" + +"parse5@6.0.1": + "integrity" "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "resolved" "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + "version" "6.0.1" + +"path-exists@^3.0.0": + "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + "version" "3.0.0" + +"path-exists@^4.0.0": + "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + "version" "4.0.0" + +"path-is-absolute@^1.0.0": + "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "version" "1.0.1" + +"path-key@^3.0.0", "path-key@^3.1.0": + "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + "version" "3.1.1" + +"path-parse@^1.0.6": + "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + "version" "1.0.7" + +"path-type@^4.0.0": + "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + "version" "4.0.0" + +"picocolors@^1.0.0": + "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + "version" "1.0.0" + +"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.2.3", "picomatch@^2.3.1": + "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + "version" "2.3.1" + +"pirates@^4.0.4": + "integrity" "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" + "resolved" "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" + "version" "4.0.5" + +"pkg-dir@^2.0.0": + "integrity" "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=" + "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "find-up" "^2.1.0" + +"pkg-dir@^4.2.0": + "integrity" "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==" + "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + "version" "4.2.0" + dependencies: + "find-up" "^4.0.0" + +"prelude-ls@^1.2.1": + "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + "version" "1.2.1" + +"prelude-ls@~1.1.2": + "integrity" "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + "version" "1.1.2" + +"prettier-linter-helpers@^1.0.0": + "integrity" "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==" + "resolved" "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "fast-diff" "^1.1.2" + +"prettier-plugin-svelte@^2.7.0": + "integrity" "sha512-QlXv/U3bUszks3XYDPsk1fsaQC+fo2lshwKbcbO+lrSVdJ+40mB1BfL8OCAk1W9y4pJxpqO/4gqm6NtF3zNGCw==" + "resolved" "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.8.0.tgz" + "version" "2.8.0" + +"prettier@^1.16.4 || ^2.0.0", "prettier@^2.2.1", "prettier@>=2.0.0": + "integrity" "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==" + "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz" + "version" "2.4.1" + +"pretty-format@^28.0.0", "pretty-format@^28.1.3": + "integrity" "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==" + "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve@^1.20.0, resolve@^1.22.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^2.5.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" + "ansi-regex" "^5.0.1" + "ansi-styles" "^5.0.0" + "react-is" "^18.0.0" + +"prompts@^2.0.1": + "integrity" "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==" + "resolved" "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + "version" "2.4.2" + dependencies: + "kleur" "^3.0.3" + "sisteransi" "^1.0.5" + +"psl@^1.1.33": + "integrity" "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "resolved" "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + "version" "1.9.0" + +"punycode@^2.1.0", "punycode@^2.1.1": + "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + "version" "2.1.1" + +"querystringify@^2.1.1": + "integrity" "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + "resolved" "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + "version" "2.2.0" + +"queue-microtask@^1.2.2": + "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + "version" "1.2.3" + +"react-is@^18.0.0": + "integrity" "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "resolved" "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + "version" "18.2.0" + +"readdirp@~3.6.0": + "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" + "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + "version" "3.6.0" + dependencies: + "picomatch" "^2.2.1" + +"regexpp@^3.2.0": + "integrity" "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + "version" "3.2.0" + +"require-directory@^2.1.1": + "integrity" "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + "version" "2.1.1" + +"requires-port@^1.0.0": + "integrity" "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "resolved" "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + "version" "1.0.0" + +"resolve-cwd@^3.0.0": + "integrity" "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==" + "resolved" "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "resolve-from" "^5.0.0" + +"resolve-from@^4.0.0": + "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + "version" "4.0.0" + +"resolve-from@^5.0.0": + "integrity" "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + "version" "5.0.0" + +"resolve.exports@^1.1.0": + "integrity" "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==" + "resolved" "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" + "version" "1.1.0" + +"resolve@^1.20.0": + "integrity" "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==" + "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" + "version" "1.20.0" + dependencies: + "is-core-module" "^2.2.0" + "path-parse" "^1.0.6" + +"reusify@^1.0.4": + "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + "version" "1.0.4" + +"rimraf@^2.5.2": + "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + "version" "2.7.1" + dependencies: + "glob" "^7.1.3" + +"rimraf@^3.0.0", "rimraf@^3.0.2": + "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "glob" "^7.1.3" -rrule@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rrule/-/rrule-2.7.1.tgz#2511e1aed0e96fb5acf831304cde97d2cb65d99e" - integrity sha512-4p20u/1U7WqR3Nb1hOUrm0u1nSI7sO93ZUVZEZ5HeF6Gr5OlJuyhwEGRvUHq8ZfrPsq5gfa5b9dqnUs/kPqpIw== - dependencies: - tslib "^2.4.0" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== +"rrule@^2.7.1": + "integrity" "sha512-4p20u/1U7WqR3Nb1hOUrm0u1nSI7sO93ZUVZEZ5HeF6Gr5OlJuyhwEGRvUHq8ZfrPsq5gfa5b9dqnUs/kPqpIw==" + "resolved" "https://registry.npmjs.org/rrule/-/rrule-2.7.1.tgz" + "version" "2.7.1" + dependencies: + "tslib" "^2.4.0" + +"run-parallel@^1.1.9": + "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" + "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + "version" "1.2.0" dependencies: - queue-microtask "^1.2.2" + "queue-microtask" "^1.2.2" -sade@^1.7.4: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== +"sade@^1.7.4": + "integrity" "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==" + "resolved" "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz" + "version" "1.7.4" dependencies: - mri "^1.1.0" + "mri" "^1.1.0" -safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +"safe-buffer@~5.1.1": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sander@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" - integrity sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA== - dependencies: - es6-promise "^3.1.2" - graceful-fs "^4.1.3" - mkdirp "^0.5.1" - rimraf "^2.5.2" - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -semver@7.x, semver@^7.3.5, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.3: - version "3.0.5" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" - integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== - -signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -sorcery@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/sorcery/-/sorcery-0.10.0.tgz#8ae90ad7d7cb05fc59f1ab0c637845d5c15a52b7" - integrity sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g== - dependencies: - buffer-crc32 "^0.2.5" - minimist "^1.2.0" - sander "^0.5.0" - sourcemap-codec "^1.3.0" - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sourcemap-codec@^1.3.0, sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== - dependencies: - escape-string-regexp "^2.0.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.0.tgz#ec101b766476a703031bc607e3c712569de2aa06" - integrity sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -style-mod@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.0.tgz#97e7c2d68b592975f2ca7a63d0dd6fcacfe35a01" - integrity sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" + "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + "version" "2.1.2" + +"sander@^0.5.0": + "integrity" "sha1-dB4kXiMfB8r7b98PEzrfohalAq0=" + "resolved" "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz" + "version" "0.5.1" + dependencies: + "es6-promise" "^3.1.2" + "graceful-fs" "^4.1.3" + "mkdirp" "^0.5.1" + "rimraf" "^2.5.2" + +"saxes@^5.0.1": + "integrity" "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==" + "resolved" "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "xmlchars" "^2.2.0" + +"semver@^6.0.0", "semver@^6.3.0": + "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + "version" "6.3.0" + +"semver@^7.3.5": + "integrity" "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + "version" "7.3.8" + dependencies: + "lru-cache" "^6.0.0" + +"semver@^7.3.7": + "integrity" "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + "version" "7.3.8" + dependencies: + "lru-cache" "^6.0.0" + +"semver@7.x": + "integrity" "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" + "version" "7.3.5" + dependencies: + "lru-cache" "^6.0.0" + +"shebang-command@^2.0.0": + "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "shebang-regex" "^3.0.0" + +"shebang-regex@^3.0.0": + "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + "version" "3.0.0" + +"side-channel@^1.0.4": + "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==" + "resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "call-bind" "^1.0.0" + "get-intrinsic" "^1.0.2" + "object-inspect" "^1.9.0" + +"signal-exit@^3.0.3", "signal-exit@^3.0.7": + "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + "version" "3.0.7" + +"sisteransi@^1.0.5": + "integrity" "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "resolved" "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + "version" "1.0.5" + +"slash@^3.0.0": + "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + "version" "3.0.0" + +"slash@^4.0.0": + "integrity" "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" + "resolved" "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + "version" "4.0.0" + +"sorcery@^0.10.0": + "integrity" "sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=" + "resolved" "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz" + "version" "0.10.0" + dependencies: + "buffer-crc32" "^0.2.5" + "minimist" "^1.2.0" + "sander" "^0.5.0" + "sourcemap-codec" "^1.3.0" + +"source-map-support@0.5.13": + "integrity" "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==" + "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + "version" "0.5.13" + dependencies: + "buffer-from" "^1.0.0" + "source-map" "^0.6.0" + +"source-map@^0.5.0": + "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + "version" "0.5.7" + +"source-map@^0.6.0", "source-map@^0.6.1", "source-map@~0.6.1": + "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + "version" "0.6.1" + +"sourcemap-codec@^1.3.0", "sourcemap-codec@^1.4.4": + "integrity" "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "resolved" "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + "version" "1.4.8" + +"sprintf-js@~1.0.2": + "integrity" "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + "version" "1.0.3" + +"stack-utils@^2.0.3": + "integrity" "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==" + "resolved" "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" + "version" "2.0.5" + dependencies: + "escape-string-regexp" "^2.0.0" + +"string-length@^4.0.1": + "integrity" "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==" + "resolved" "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + "version" "4.0.2" + dependencies: + "char-regex" "^1.0.2" + "strip-ansi" "^6.0.0" + +"string-width@^4.1.0", "string-width@^4.2.0", "string-width@^4.2.3": + "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + "version" "4.2.3" + dependencies: + "emoji-regex" "^8.0.0" + "is-fullwidth-code-point" "^3.0.0" + "strip-ansi" "^6.0.1" + +"string.prototype.trimend@^1.0.4": + "integrity" "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==" + "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "call-bind" "^1.0.2" + "define-properties" "^1.1.3" + +"string.prototype.trimstart@^1.0.4": + "integrity" "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==" + "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "call-bind" "^1.0.2" + "define-properties" "^1.1.3" + +"strip-ansi@^6.0.0", "strip-ansi@^6.0.1": + "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "ansi-regex" "^5.0.1" + +"strip-bom@^3.0.0": + "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + "version" "3.0.0" + +"strip-bom@^4.0.0": + "integrity" "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + "version" "4.0.0" + +"strip-final-newline@^2.0.0": + "integrity" "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + "resolved" "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + "version" "2.0.0" + +"strip-indent@^3.0.0": + "integrity" "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==" + "resolved" "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "min-indent" "^1.0.0" + +"strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1": + "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + "version" "3.1.1" + +"strip-json-comments@5.0.0": + "integrity" "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==" + "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz" + "version" "5.0.0" + +"style-mod@^4.0.0": + "integrity" "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==" + "resolved" "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz" + "version" "4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== +"supports-color@^5.3.0": + "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + "version" "5.5.0" dependencies: - has-flag "^4.0.0" + "has-flag" "^3.0.0" + +"supports-color@^7.0.0", "supports-color@^7.1.0": + "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + "version" "7.2.0" + dependencies: + "has-flag" "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== +"supports-color@^8.0.0": + "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + "version" "8.1.1" dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" + "has-flag" "^4.0.0" -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +"supports-hyperlinks@^2.0.0": + "integrity" "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==" + "resolved" "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" + "version" "2.3.0" + dependencies: + "has-flag" "^4.0.0" + "supports-color" "^7.0.0" -svelte-check@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-2.9.0.tgz#94a4bbe5bccade5a9edae987f417040ab7af4a2a" - integrity sha512-9AVrtP7WbfDgCdqTZNPdj5CCCy1OrYMxFVWAWzNw7fl93c9klFJFtqzVXa6fovfQ050CcpUyJE2dPFL9TFAREw== +"svelte-check@^2.9.0": + "integrity" "sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==" + "resolved" "https://registry.npmjs.org/svelte-check/-/svelte-check-2.9.2.tgz" + "version" "2.9.2" dependencies: "@jridgewell/trace-mapping" "^0.3.9" - chokidar "^3.4.1" - fast-glob "^3.2.7" - import-fresh "^3.2.1" - picocolors "^1.0.0" - sade "^1.7.4" - svelte-preprocess "^4.0.0" - typescript "*" - -svelte-preprocess@^4.0.0, svelte-preprocess@^4.10.1: - version "4.10.7" - resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz#3626de472f51ffe20c9bc71eff5a3da66797c362" - integrity sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw== + "chokidar" "^3.4.1" + "fast-glob" "^3.2.7" + "import-fresh" "^3.2.1" + "picocolors" "^1.0.0" + "sade" "^1.7.4" + "svelte-preprocess" "^4.0.0" + "typescript" "*" + +"svelte-preprocess@^4.0.0", "svelte-preprocess@^4.10.1": + "integrity" "sha512-NSNloaylf+o9UeyUR2KvpdxrAyMdHl3U7rMnoP06/sG0iwJvlUM4TpMno13RaNqovh4AAoGsx1jeYcIyuGUXMw==" + "resolved" "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.1.tgz" + "version" "4.10.1" dependencies: "@types/pug" "^2.0.4" "@types/sass" "^1.16.0" - detect-indent "^6.0.0" - magic-string "^0.25.7" - sorcery "^0.10.0" - strip-indent "^3.0.0" - -svelte@^3.48.0: - version "3.49.0" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.49.0.tgz#5baee3c672306de1070c3b7888fc2204e36a4029" - integrity sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + "detect-indent" "^6.0.0" + "magic-string" "^0.25.7" + "sorcery" "^0.10.0" + "strip-indent" "^3.0.0" + +"svelte@^3.2.0", "svelte@^3.23.0", "svelte@^3.24.0", "svelte@^3.48.0", "svelte@>=3.43.0": + "integrity" "sha512-fN2YRm/bGumvjUpu6yI3BpvZnpIm9I6A7HR4oUNYd7ggYyIwSA/BX7DJ+UXXffLp6XNcUijyLvttbPVCYa/3xQ==" + "resolved" "https://registry.npmjs.org/svelte/-/svelte-3.48.0.tgz" + "version" "3.48.0" + +"symbol-tree@^3.2.4": + "integrity" "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + "resolved" "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + "version" "3.2.4" + +"terminal-link@^2.0.0": + "integrity" "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==" + "resolved" "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "ansi-escapes" "^4.2.1" + "supports-hyperlinks" "^2.0.0" + +"test-exclude@^6.0.0": + "integrity" "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==" + "resolved" "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + "version" "6.0.0" dependencies: "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" - integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== - dependencies: - punycode "^2.1.1" - -ts-jest@^28.0.8: - version "28.0.8" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.8.tgz#cd204b8e7a2f78da32cf6c95c9a6165c5b99cc73" - integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^28.0.0" - json5 "^2.2.1" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "^21.0.1" - -tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + "glob" "^7.1.4" + "minimatch" "^3.0.4" + +"text-table@^0.2.0": + "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + "version" "0.2.0" + +"tmpl@1.0.5": + "integrity" "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + "resolved" "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + "version" "1.0.5" + +"to-fast-properties@^2.0.0": + "integrity" "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + "version" "2.0.0" + +"to-regex-range@^5.0.1": + "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "is-number" "^7.0.0" + +"tough-cookie@^4.0.0": + "integrity" "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==" + "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "psl" "^1.1.33" + "punycode" "^2.1.1" + "universalify" "^0.2.0" + "url-parse" "^1.5.3" + +"tr46@^3.0.0": + "integrity" "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==" + "resolved" "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "punycode" "^2.1.1" + +"ts-jest@^28.0.8": + "integrity" "sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==" + "resolved" "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.8.tgz" + "version" "28.0.8" + dependencies: + "bs-logger" "0.x" + "fast-json-stable-stringify" "2.x" + "jest-util" "^28.0.0" + "json5" "^2.2.1" + "lodash.memoize" "4.x" + "make-error" "1.x" + "semver" "7.x" + "yargs-parser" "^21.0.1" + +"tsconfig-paths@^3.11.0": + "integrity" "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==" + "resolved" "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz" + "version" "3.11.0" dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.3.1, tslib@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -typescript@*, typescript@^4.4.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== - -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" - integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -update-browserslist-db@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" - integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -v8-to-istanbul@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + "json5" "^1.0.1" + "minimist" "^1.2.0" + "strip-bom" "^3.0.0" + +"tslib@^1.8.1": + "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + "version" "1.14.1" + +"tslib@^2.3.1", "tslib@^2.4.0": + "integrity" "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + "version" "2.4.0" + +"tsutils@^3.21.0": + "integrity" "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==" + "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + "version" "3.21.0" + dependencies: + "tslib" "^1.8.1" + +"type-check@^0.4.0": + "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" + "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + "version" "0.4.0" + dependencies: + "prelude-ls" "^1.2.1" + +"type-check@~0.3.2": + "integrity" "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==" + "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + "version" "0.3.2" + dependencies: + "prelude-ls" "~1.1.2" + +"type-check@~0.4.0": + "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" + "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + "version" "0.4.0" + dependencies: + "prelude-ls" "^1.2.1" + +"type-detect@4.0.8": + "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + "version" "4.0.8" + +"type-fest@^0.20.2": + "integrity" "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + "version" "0.20.2" + +"type-fest@^0.21.3": + "integrity" "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + "version" "0.21.3" + +"typescript@*", "typescript@^4.4.4", "typescript@^4.5.2", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=4.3": + "integrity" "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==" + "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz" + "version" "4.5.4" + +"uc.micro@^1.0.1", "uc.micro@^1.0.5": + "integrity" "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + "resolved" "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz" + "version" "1.0.6" + +"unbox-primitive@^1.0.1": + "integrity" "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==" + "resolved" "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "function-bind" "^1.1.1" + "has-bigints" "^1.0.1" + "has-symbols" "^1.0.2" + "which-boxed-primitive" "^1.0.2" + +"universalify@^0.2.0": + "integrity" "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + "resolved" "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + "version" "0.2.0" + +"uri-js@^4.2.2": + "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" + "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + "version" "4.4.1" + dependencies: + "punycode" "^2.1.0" + +"url-parse@^1.5.3": + "integrity" "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==" + "resolved" "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + "version" "1.5.10" + dependencies: + "querystringify" "^2.1.1" + "requires-port" "^1.0.0" + +"v8-to-istanbul@^9.0.1": + "integrity" "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==" + "resolved" "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz" + "version" "9.0.1" dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + "convert-source-map" "^1.6.0" + +"w3c-hr-time@^1.0.2": + "integrity" "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==" + "resolved" "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" + "version" "1.0.2" dependencies: - browser-process-hrtime "^1.0.0" - -w3c-keyname@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.4.tgz#4ade6916f6290224cdbd1db8ac49eab03d0eef6b" - integrity sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw== - -w3c-xmlserializer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" - integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== - dependencies: - xml-name-validator "^4.0.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -whatwg-encoding@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== - dependencies: - iconv-lite "0.6.3" - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" - integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - -whatwg-url@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" - integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" - integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^8.2.3: - version "8.8.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.0.tgz#8e71c75e2f6348dbf8d78005107297056cb77769" - integrity sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ== - -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.1.tgz#1e06fb4ca46e60d9da07e4f786ea370ed3c3cfec" - integrity sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw== - -yargs-parser@^21.0.0, yargs-parser@^21.0.1: - version "21.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" - integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== - -yargs@^17.3.1: - version "17.5.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + "browser-process-hrtime" "^1.0.0" + +"w3c-keyname@^2.2.4": + "integrity" "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==" + "resolved" "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz" + "version" "2.2.4" + +"w3c-xmlserializer@^3.0.0": + "integrity" "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==" + "resolved" "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "xml-name-validator" "^4.0.0" + +"walker@^1.0.8": + "integrity" "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==" + "resolved" "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + "version" "1.0.8" + dependencies: + "makeerror" "1.0.12" + +"webidl-conversions@^7.0.0": + "integrity" "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + "version" "7.0.0" + +"whatwg-encoding@^2.0.0": + "integrity" "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==" + "resolved" "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "iconv-lite" "0.6.3" + +"whatwg-mimetype@^3.0.0": + "integrity" "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + "resolved" "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" + "version" "3.0.0" + +"whatwg-url@^10.0.0": + "integrity" "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==" + "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz" + "version" "10.0.0" + dependencies: + "tr46" "^3.0.0" + "webidl-conversions" "^7.0.0" + +"whatwg-url@^11.0.0": + "integrity" "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==" + "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz" + "version" "11.0.0" + dependencies: + "tr46" "^3.0.0" + "webidl-conversions" "^7.0.0" + +"which-boxed-primitive@^1.0.2": + "integrity" "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==" + "resolved" "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "is-bigint" "^1.0.1" + "is-boolean-object" "^1.1.0" + "is-number-object" "^1.0.4" + "is-string" "^1.0.5" + "is-symbol" "^1.0.3" + +"which@^2.0.1": + "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "isexe" "^2.0.0" + +"word-wrap@^1.2.3", "word-wrap@~1.2.3": + "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + "version" "1.2.3" + +"wrap-ansi@^7.0.0": + "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" + "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + "version" "7.0.0" + dependencies: + "ansi-styles" "^4.0.0" + "string-width" "^4.1.0" + "strip-ansi" "^6.0.0" + +"wrappy@1": + "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "version" "1.0.2" + +"write-file-atomic@^4.0.1": + "integrity" "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==" + "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" + "version" "4.0.2" + dependencies: + "imurmurhash" "^0.1.4" + "signal-exit" "^3.0.7" + +"ws@^8.2.3": + "integrity" "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==" + "resolved" "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz" + "version" "8.10.0" + +"xml-name-validator@^4.0.0": + "integrity" "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==" + "resolved" "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" + "version" "4.0.0" + +"xmlchars@^2.2.0": + "integrity" "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + "resolved" "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + "version" "2.2.0" + +"y18n@^5.0.5": + "integrity" "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + "resolved" "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + "version" "5.0.8" + +"yallist@^4.0.0": + "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + "version" "4.0.0" + +"yaml@2.1.1": + "integrity" "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==" + "resolved" "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz" + "version" "2.1.1" + +"yargs-parser@^21.0.0", "yargs-parser@^21.0.1": + "integrity" "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + "version" "21.1.1" + +"yargs@^17.3.1": + "integrity" "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==" + "resolved" "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz" + "version" "17.6.0" + dependencies: + "cliui" "^8.0.1" + "escalade" "^3.1.1" + "get-caller-file" "^2.0.5" + "require-directory" "^2.1.1" + "string-width" "^4.2.3" + "y18n" "^5.0.5" + "yargs-parser" "^21.0.0" + +"yocto-queue@^0.1.0": + "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + "version" "0.1.0" From 133ee0cb29b7bf20ca7d4ca9bd24172ab35efd63 Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Wed, 2 Nov 2022 16:06:43 +0200 Subject: [PATCH 02/29] New renderer works --- src/QueryRenderer.ts | 19 +++-- src/Task.ts | 10 ++- src/TaskLineRenderer.ts | 154 +++++++++++++++++++++++++++++++++------- 3 files changed, 143 insertions(+), 40 deletions(-) diff --git a/src/QueryRenderer.ts b/src/QueryRenderer.ts index 67c4806536..163fb25c3e 100644 --- a/src/QueryRenderer.ts +++ b/src/QueryRenderer.ts @@ -188,16 +188,18 @@ class QueryRenderChild extends MarkdownRenderChild { const shortMode = this.query.layoutOptions.shortMode; + const extrasSpan = listItem.createSpan('task-extras'); + if (!this.query.layoutOptions.hideUrgency) { - this.addUrgency(listItem, task); + this.addUrgency(extrasSpan, task); } if (!this.query.layoutOptions.hideBacklinks) { - this.addBacklinks(listItem, task, shortMode, isFilenameUnique); + this.addBacklinks(extrasSpan, task, shortMode, isFilenameUnique); } if (!this.query.layoutOptions.hideEditButton) { - this.addEditButton(listItem, task); + this.addEditButton(extrasSpan, task); } taskList.appendChild(listItem); @@ -206,7 +208,7 @@ class QueryRenderChild extends MarkdownRenderChild { return { taskList, tasksCount }; } - private addEditButton(listItem: HTMLLIElement, task: Task) { + private addEditButton(listItem: HTMLElement, task: Task) { const editTaskPencil = listItem.createEl('a', { cls: 'tasks-edit', }); @@ -230,7 +232,7 @@ class QueryRenderChild extends MarkdownRenderChild { }); } - private addUrgency(listItem: HTMLLIElement, task: Task) { + private addUrgency(listItem: HTMLElement, task: Task) { const text = new Intl.NumberFormat().format(task.urgency); listItem.createSpan({ text, cls: 'tasks-urgency' }); } @@ -270,12 +272,7 @@ class QueryRenderChild extends MarkdownRenderChild { await MarkdownRenderer.renderMarkdown(group.name, header, this.filePath, this); } - private addBacklinks( - listItem: HTMLLIElement, - task: Task, - shortMode: boolean, - isFilenameUnique: boolean | undefined, - ) { + private addBacklinks(listItem: HTMLElement, task: Task, shortMode: boolean, isFilenameUnique: boolean | undefined) { const backLink = listItem.createSpan({ cls: 'tasks-backlink' }); if (!shortMode) { diff --git a/src/Task.ts b/src/Task.ts index c449ac03de..fa57e9db18 100644 --- a/src/Task.ts +++ b/src/Task.ts @@ -444,8 +444,14 @@ export class Task { componentToString(layout: TaskLayout, component: LayoutComponent) { switch (component) { - case 'description': - return this.description; + case 'description': { + const { globalFilter, removeGlobalFilter } = getSettings(); + let description = this.description; + if (removeGlobalFilter) { + description = description.replace(globalFilter, '').trim(); + } + return description; + } case 'priority': { let priority: string = ''; diff --git a/src/TaskLineRenderer.ts b/src/TaskLineRenderer.ts index 206d64c2d6..97cf8a36d3 100644 --- a/src/TaskLineRenderer.ts +++ b/src/TaskLineRenderer.ts @@ -2,8 +2,8 @@ import { Component, MarkdownRenderer } from 'obsidian'; import type { Moment } from 'moment'; import type { Task } from './Task'; import * as taskModule from './Task'; -import type { LayoutOptions } from './TaskLayout'; -import { getSettings } from './Config/Settings'; +import type { LayoutComponent, LayoutOptions } from './TaskLayout'; +import { TaskLayout } from './TaskLayout'; import { replaceTaskWithTasks } from './File'; export type TaskLineRenderDetails = { @@ -18,38 +18,24 @@ export async function renderTaskLine(task: Task, renderDetails: TaskLineRenderDe const li: HTMLLIElement = renderDetails.parentUlElement.createEl('li'); li.addClasses(['task-list-item', 'plugin-tasks-list-item']); - let taskAsString = task.toString(renderDetails.layoutOptions); - const { globalFilter, removeGlobalFilter } = getSettings(); - if (removeGlobalFilter) { - taskAsString = taskAsString.replace(globalFilter, '').trim(); - } - const textSpan = li.createSpan(); textSpan.addClass('tasks-list-text'); + const classes = await taskToHtml(task, renderDetails, textSpan); + li.addClasses(classes); - await MarkdownRenderer.renderMarkdown(taskAsString, textSpan, task.path, null as unknown as Component); - + // TODO understand and fix this // If the task is a block quote, the block quote wraps the p-tag that contains the content. // In that case, we need to unwrap the p-tag *inside* the surrounding block quote. // Otherwise, we unwrap the p-tag as a direct descendant of the textSpan. - const blockQuote = textSpan.querySelector('blockquote'); - const directParentOfPTag = blockQuote ?? textSpan; - - // Unwrap the p-tag that was created by the MarkdownRenderer: - const pElement = directParentOfPTag.querySelector('p'); - if (pElement !== null) { - while (pElement.firstChild) { - directParentOfPTag.insertBefore(pElement.firstChild, pElement); - } - pElement.remove(); - } + // const blockQuote = textSpan.querySelector('blockquote'); + // const directParentOfPTag = blockQuote ?? textSpan; - // Remove an empty trailing p-tag that the MarkdownRenderer appends when there is a block link: - textSpan.findAll('p').forEach((pElement) => { - if (!pElement.hasChildNodes()) { - pElement.remove(); - } - }); + // // Remove an empty trailing p-tag that the MarkdownRenderer appends when there is a block link: + // textSpan.findAll('p').forEach((pElement) => { + // if (!pElement.hasChildNodes()) { + // pElement.remove(); + // } + // }); // Remove the footnote that the MarkdownRenderer appends when there is a footnote in the task: textSpan.findAll('.footnotes').forEach((footnoteElement) => { @@ -92,6 +78,120 @@ export async function renderTaskLine(task: Task, renderDetails: TaskLineRenderDe return li; } +async function taskToHtml(task: Task, renderDetails: TaskLineRenderDetails, parentElement: HTMLElement) { + const allSpecificClasses: string[] = []; + const taskLayout = new TaskLayout(renderDetails.layoutOptions); + for (const component of taskLayout.layoutComponents) { + const componentString = task.componentToString(taskLayout, component); + if (componentString) { + const span = parentElement.createSpan(); + if (span) { + parentElement.appendChild(span); + // TODO explain the purpose of this (to enable different formatting to layout like table cells and the text itself) + const internalSpan = span.createSpan(); + await renderComponentText(internalSpan, componentString, component, task); + const [genericClasses, specificClasses] = getComponentClasses(component, task); + span.addClasses(genericClasses); + span.addClasses(specificClasses); + allSpecificClasses.push(...specificClasses); + } + } + } + return allSpecificClasses; +} + +async function renderComponentText( + span: HTMLSpanElement, + componentString: string, + component: LayoutComponent, + task: Task, +) { + if (component === 'description') { + await MarkdownRenderer.renderMarkdown(componentString, span, task.path, null as unknown as Component); + // Unwrap the p-tag that was created by the MarkdownRenderer: + // TODO understand the block quote thing + const pElement = span.querySelector('p'); + if (pElement !== null) { + while (pElement.firstChild) { + span.insertBefore(pElement.firstChild, pElement); + } + pElement.remove(); + } + } else { + span.innerHTML = componentString; + } +} + +function getComponentClasses(component: LayoutComponent, task: Task) { + // TODO explain the difference + const genericClasses: string[] = []; + const specificClasses: string[] = []; + switch (component) { + case 'description': + genericClasses.push('task-description'); + break; + case 'priority': { + let priorityClass = null; + if (task.priority === taskModule.Priority.High) priorityClass = 'task-priority-high'; + else if (task.priority === taskModule.Priority.Medium) priorityClass = 'task-priority-medium'; + else if (task.priority === taskModule.Priority.Low) priorityClass = 'task-priority-low'; + else priorityClass = 'task-priority-none'; + genericClasses.push('task-priority'); + specificClasses.push(priorityClass); + break; + } + case 'dueDate': { + const date = task.dueDate; + if (date) { + genericClasses.push('task-due'); + specificClasses.push('task-due-' + dateToClassName(date)); + } + break; + } + case 'startDate': { + const date = task.startDate; + if (date) { + genericClasses.push('task-start'); + specificClasses.push('task-start-' + dateToClassName(date)); + } + break; + } + case 'scheduledDate': { + const date = task.scheduledDate; + if (date) { + genericClasses.push('task-scheduled'); + specificClasses.push('task-scheduled-' + dateToClassName(date)); + } + break; + } + case 'doneDate': { + const date = task.doneDate; + if (date) { + genericClasses.push('task-done'); + specificClasses.push('task-done-' + dateToClassName(date)); + } + break; + } + case 'recurrenceRule': { + genericClasses.push('task-recurring'); + break; + } + } + return [genericClasses, specificClasses]; +} + +// TODO document +function dateToClassName(date: Moment) { + const today = window.moment().startOf('day'); + let result = ''; + const diffDays = today.diff(date, 'days'); + if (diffDays === 0) return 'today'; + else if (diffDays > 0) result += 'past-'; + else if (diffDays < 0) result += 'future-'; + result += diffDays.toString() + 'd'; + return result; +} + function addTooltip({ task, element, From 285664ba62dd8f359ebc25096cd3063dfbaab84a Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Sat, 12 Nov 2022 10:31:06 +0200 Subject: [PATCH 03/29] Functionality is finished and basic (backwards compatability) tests are running --- src/TaskLineRenderer.ts | 104 ++++++++++++++++++++------------- tests/Task.test.ts | 16 +++++ tests/TaskLineRenderer.test.ts | 96 ++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+), 42 deletions(-) create mode 100644 tests/TaskLineRenderer.test.ts diff --git a/src/TaskLineRenderer.ts b/src/TaskLineRenderer.ts index 3b9c11f331..bafe92a92b 100644 --- a/src/TaskLineRenderer.ts +++ b/src/TaskLineRenderer.ts @@ -15,42 +15,37 @@ export type TaskLineRenderDetails = { isFilenameUnique?: boolean; }; -export async function renderTaskLine(task: Task, renderDetails: TaskLineRenderDetails): Promise { - const li: HTMLLIElement = renderDetails.parentUlElement.createEl('li'); - li.addClasses(['task-list-item', 'plugin-tasks-list-item']); +export type TextRenderer = (text: string, element: HTMLSpanElement, path: string) => Promise; - const textSpan = li.createSpan(); - textSpan.addClass('tasks-list-text'); - const classes = await taskToHtml(task, renderDetails, textSpan); - li.addClasses(classes); - - // TODO understand and fix this - // If the task is a block quote, the block quote wraps the p-tag that contains the content. - // In that case, we need to unwrap the p-tag *inside* the surrounding block quote. - // Otherwise, we unwrap the p-tag as a direct descendant of the textSpan. - // const blockQuote = textSpan.querySelector('blockquote'); - // const directParentOfPTag = blockQuote ?? textSpan; +async function obsidianMarkdownRenderer(text: string, element: HTMLSpanElement, path: string) { + await MarkdownRenderer.renderMarkdown(text, element, path, null as unknown as Component); +} - // // Remove an empty trailing p-tag that the MarkdownRenderer appends when there is a block link: - // textSpan.findAll('p').forEach((pElement) => { - // if (!pElement.hasChildNodes()) { - // pElement.remove(); - // } - // }); +export async function renderTaskLine( + task: Task, + renderDetails: TaskLineRenderDetails, + textRenderer: TextRenderer | null = null, +): Promise { + if (!textRenderer) textRenderer = obsidianMarkdownRenderer; + const li: HTMLLIElement = document.createElement('li'); + renderDetails.parentUlElement.appendChild(li); + li.classList.add('task-list-item', 'plugin-tasks-list-item'); - // Remove the footnote that the MarkdownRenderer appends when there is a footnote in the task: - textSpan.findAll('.footnotes').forEach((footnoteElement) => { - footnoteElement.remove(); - }); + const textSpan = document.createElement('span'); + li.appendChild(textSpan); + textSpan.classList.add('tasks-list-text'); + const classes = await taskToHtml(task, renderDetails, textSpan, textRenderer); + li.classList.add(...classes); - const checkbox = li.createEl('input'); - checkbox.addClass('task-list-item-checkbox'); + const checkbox = document.createElement('input'); + li.appendChild(checkbox); + checkbox.classList.add('task-list-item-checkbox'); checkbox.type = 'checkbox'; if (task.status !== taskModule.Status.TODO) { checkbox.checked = true; - li.addClass('is-checked'); + li.classList.add('is-checked'); } - checkbox.onClickEvent((event: MouseEvent) => { + checkbox.addEventListener('click', (event: MouseEvent) => { event.preventDefault(); // It is required to stop propagation so that obsidian won't write the file with the // checkbox (un)checked. Obsidian would write after us and overwrite our change. @@ -68,9 +63,9 @@ export async function renderTaskLine(task: Task, renderDetails: TaskLineRenderDe li.prepend(checkbox); // Set these to be compatible with stock obsidian lists: - li.setAttr('data-task', task.originalStatusCharacter.trim()); // Trim to ensure empty attribute for space. Same way as obsidian. - li.setAttr('data-line', renderDetails.listIndex); - checkbox.setAttr('data-line', renderDetails.listIndex); + li.setAttribute('data-task', task.originalStatusCharacter.trim()); // Trim to ensure empty attribute for space. Same way as obsidian. + li.setAttribute('data-line', renderDetails.listIndex.toString()); + checkbox.setAttribute('data-line', renderDetails.listIndex.toString()); if (renderDetails.layoutOptions?.shortMode) { addTooltip({ task, element: textSpan, isFilenameUnique: renderDetails.isFilenameUnique }); @@ -79,22 +74,28 @@ export async function renderTaskLine(task: Task, renderDetails: TaskLineRenderDe return li; } -async function taskToHtml(task: Task, renderDetails: TaskLineRenderDetails, parentElement: HTMLElement) { +async function taskToHtml( + task: Task, + renderDetails: TaskLineRenderDetails, + parentElement: HTMLElement, + textRenderer: TextRenderer, +) { const allSpecificClasses: string[] = []; const taskLayout = new TaskLayout(renderDetails.layoutOptions); for (const component of taskLayout.layoutComponents) { let componentString = task.componentToString(taskLayout, component); if (componentString) { if (component === 'description') componentString = removeGlobalFilterIfNeeded(componentString); - const span = parentElement.createSpan(); + const span = document.createElement('span'); + parentElement.appendChild(span); if (span) { - parentElement.appendChild(span); // TODO explain the purpose of this (to enable different formatting to layout like table cells and the text itself) - const internalSpan = span.createSpan(); - await renderComponentText(internalSpan, componentString, component, task); + const internalSpan = document.createElement('span'); + span.appendChild(internalSpan); + await renderComponentText(internalSpan, componentString, component, task, textRenderer); const [genericClasses, specificClasses] = getComponentClasses(component, task); - span.addClasses(genericClasses); - span.addClasses(specificClasses); + span.classList.add(...genericClasses); + span.classList.add(...specificClasses); allSpecificClasses.push(...specificClasses); } } @@ -107,18 +108,37 @@ async function renderComponentText( componentString: string, component: LayoutComponent, task: Task, + textRenderer: TextRenderer, ) { if (component === 'description') { - await MarkdownRenderer.renderMarkdown(componentString, span, task.path, null as unknown as Component); + await textRenderer(componentString, span, task.path); + + // If the task is a block quote, the block quote wraps the p-tag that contains the content. + // In that case, we need to unwrap the p-tag *inside* the surrounding block quote. + // Otherwise, we unwrap the p-tag as a direct descendant of the span. + const blockQuote = span.querySelector('blockquote'); + const directParentOfPTag = blockQuote ?? span; + // Unwrap the p-tag that was created by the MarkdownRenderer: - // TODO understand the block quote thing - const pElement = span.querySelector('p'); + const pElement = directParentOfPTag.querySelector('p'); if (pElement !== null) { while (pElement.firstChild) { - span.insertBefore(pElement.firstChild, pElement); + directParentOfPTag.insertBefore(pElement.firstChild, pElement); } pElement.remove(); } + + // Remove an empty trailing p-tag that the MarkdownRenderer appends when there is a block link: + span.querySelectorAll('p').forEach((pElement) => { + if (!pElement.hasChildNodes()) { + pElement.remove(); + } + }); + + // Remove the footnote that the MarkdownRenderer appends when there is a footnote in the task: + span.querySelectorAll('.footnotes').forEach((footnoteElement) => { + footnoteElement.remove(); + }); } else { span.innerHTML = componentString; } diff --git a/tests/Task.test.ts b/tests/Task.test.ts index bccf6804d5..248c380904 100644 --- a/tests/Task.test.ts +++ b/tests/Task.test.ts @@ -399,6 +399,22 @@ describe('to string', () => { const expectedLine = '- [x] this is a done task #tagone #journal/daily 📅 2021-09-12 ✅ 2021-06-20'; expect(task.toFileLineString()).toStrictEqual(expectedLine); }); + + it('retains the global filter', () => { + // Arrange + const line = '- [ ] This is a task with #t as a global filter and also #t/some tags'; + + updateSettings({ globalFilter: '#t' }); + // Act + const task: Task = fromLine({ + line, + }) as Task; + + // Assert + const expectedLine = 'This is a task with #t as a global filter and also #t/some tags'; + expect(task.toString()).toStrictEqual(expectedLine); + resetSettings(); + }); }); describe('toggle done', () => { diff --git a/tests/TaskLineRenderer.test.ts b/tests/TaskLineRenderer.test.ts new file mode 100644 index 0000000000..fd0eb58fb9 --- /dev/null +++ b/tests/TaskLineRenderer.test.ts @@ -0,0 +1,96 @@ +/** + * @jest-environment jsdom + */ +import moment from 'moment'; +import { renderTaskLine } from '../src/TaskLineRenderer'; +import { resetSettings, updateSettings } from '../src/Config/Settings'; +import type { Task } from '../src/Task'; +import { fromLine } from './TestHelpers'; + +jest.mock('obsidian'); +window.moment = moment; + +/** + * Creates a dummy 'parent element' to host a task render, renders a task inside it, + * and returns it for inspection. + */ +async function createMockParentAndRender(task: Task) { + const parentElement = document.createElement('div'); + const mockTextRenderer = async (text: string, element: HTMLSpanElement, _path: string) => { + element.innerText = text; + }; + await renderTaskLine( + task, + { + parentUlElement: parentElement, + listIndex: 0, + }, + mockTextRenderer, + ); + return parentElement; +} + +function getTextSpan(parentElement: HTMLElement) { + const li = parentElement.children[0]; + const textSpan = li.children[1] as HTMLSpanElement; + return textSpan; +} + +function getDescriptionText(parentElement: HTMLElement) { + const textSpan = getTextSpan(parentElement); + return (textSpan.children[0].children[0] as HTMLElement).innerText; +} + +describe('task line rendering', () => { + it('creates the correct span structure for a basic task', async () => { + const taskLine = '- [ ] This is a simple task'; + const task = fromLine({ + line: taskLine, + }); + const parentRender = await createMockParentAndRender(task); + + // Check what we have one child, which is the rendered child + expect(parentRender.children.length).toEqual(1); + const li = parentRender.children[0]; + // Check that it's an element of type LI + expect(li.nodeName).toEqual('LI'); + // Check that it has two children: a checkbox and a text span + expect(li.children.length).toEqual(2); + const checkbox = li.children[0]; + expect(checkbox.nodeName).toEqual('INPUT'); + expect(checkbox.classList.contains('task-list-item-checkbox')).toBeTruthy(); + const textSpan = li.children[1]; + expect(textSpan.nodeName).toEqual('SPAN'); + expect(textSpan.classList.contains('tasks-list-text')).toBeTruthy(); + // Check that the text span contains a single description span + expect(textSpan.children.length).toEqual(1); + const descriptionSpan = textSpan.children[0]; + expect(descriptionSpan.nodeName).toEqual('SPAN'); + expect(descriptionSpan.className).toEqual('task-description'); + // Check that the description span contains an internal span (see taskToHtml for an explanation why it's there) + expect(descriptionSpan.children.length).toEqual(1); + const internalDescriptionSpan = descriptionSpan.children[0]; + expect(internalDescriptionSpan.nodeName).toEqual('SPAN'); + // Check that eventually the correct text was rendered + expect((internalDescriptionSpan as HTMLSpanElement).innerText).toEqual('This is a simple task'); + }); + + it('hides the global filter if and only if required', async () => { + const getDescriptionTest = async () => { + const taskLine = '- [ ] This is a simple task with a #global filter'; + const task = fromLine({ + line: taskLine, + }); + const parentRender = await createMockParentAndRender(task); + return getDescriptionText(parentRender); + }; + + const descriptionWithFilter = await getDescriptionTest(); + expect(descriptionWithFilter).toEqual('This is a simple task with a #global filter'); + + updateSettings({ globalFilter: '#global', removeGlobalFilter: true }); + const descriptionWithoutFilter = await getDescriptionTest(); + expect(descriptionWithoutFilter).toEqual('This is a simple task with a filter'); + resetSettings(); + }); +}); From db146cc79870f1de542e6a07d26d88749ec6dfeb Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Wed, 11 Jan 2023 19:48:34 +0200 Subject: [PATCH 04/29] Themeability and tests --- docs/how-to/show-tasks-in-calendar.md | 2 +- docs/how-to/style-backlinks.md | 2 +- docs/how-to/styling.md | 322 ++++++++++++++++++++++++++ src/TaskLineRenderer.ts | 42 +++- tests/TaskLineRenderer.test.ts | 131 +++++++++++ 5 files changed, 488 insertions(+), 11 deletions(-) create mode 100644 docs/how-to/styling.md diff --git a/docs/how-to/show-tasks-in-calendar.md b/docs/how-to/show-tasks-in-calendar.md index 4a8a306dbe..956772f2d8 100644 --- a/docs/how-to/show-tasks-in-calendar.md +++ b/docs/how-to/show-tasks-in-calendar.md @@ -1,7 +1,7 @@ --- layout: default title: Show tasks in a calendar -nav_order: 5 +nav_order: 6 parent: How Tos --- diff --git a/docs/how-to/style-backlinks.md b/docs/how-to/style-backlinks.md index 0f173172e7..89d68aa48f 100644 --- a/docs/how-to/style-backlinks.md +++ b/docs/how-to/style-backlinks.md @@ -1,7 +1,7 @@ --- layout: default title: How to style backlinks -nav_order: 4 +nav_order: 5 parent: How Tos --- diff --git a/docs/how-to/styling.md b/docs/how-to/styling.md new file mode 100644 index 0000000000..f387ed5d41 --- /dev/null +++ b/docs/how-to/styling.md @@ -0,0 +1,322 @@ +--- +layout: default +title: Styling with CSS +nav_order: 4 +parent: How Tos +--- + +# Styling with CSS + +{: .no_toc } + +
+ + Table of contents + + {: .text-delta } +1. TOC +{:toc} +
+ +--- + +In rendered queries and Reading View, the Tasks plugin adds detailed CSS classes that represent many of each task's content, to allow for very extensive styling options via CSS. +Not only each component in a rendered task line is tagged with classes to differentiate it, many components also add classes that represent the actual content of the task, so CSS rules can refer to data such as the relative due date of a task or its specific priority. + +## Basic Task Structure + +The Tasks plugin renders a task in the following structure (this refers to query results, but the Reading View is the same exact the top-most containers): + +```markdown +- Obsidian code block (div class="block-language-tasks") + - Results list (ul class="plugin-tasks-query-result") + - Task (li class="task-list-item" + specific classes like "tasks-priority-medium tasks-due-past-1d") + - Task checkbox (li class="task-list-item-checkbox") + - Task content (span class="tasks-list-text") + - Task description and tags (span class="task-description") + - Internal span + - Task priority (span class="task-priority" + priority specific classes) + - Internal span + - Task recurrence rule (span class="task-recurring") + - Internal span + - Task start date (span class="task-start" + date specific classes) + - Internal span + - ... scheduled date, due date and done date in this order + - Task extras (link, edit button) (span class="task-extras") + - Tasks count (div class="tasks-count") +``` + +As can be seen above, the basic task `li` contains a checkbox and a content span. +The content span contains a list of **component** spans: description, priority, recurrence, start date, scheduled date, due date and done date in this order. + +Each component span is marked with a **generic class**, which denotes the type of the component, and in some cases a **specific class** that represents the component's content itself. + +Within each component span there is an additional "internal" span, which is the one holding the actual component text. +The reason for this additional internal span is that it allows CSS styles that closely wrap the text itself, rather than its container box, e.g. for the purpose of drawing a highlight or a box that is exactly in the size of the text. + +## Generic and Specific Classes + +Each rendered task component (description, priority, recurrence rule etc) includes a **generic class** that denotes this type of component. +The generic classes are: + +- `task-description` +- `task-priority` +- `task-due` +- `task-start` +- `task-scheduled` +- `task-done` +- `task-recurring` + +In addition to the generic classes, there are **specific classes** that represent the content of the various task components. + +A **priority specific class** represents the specific priority of a class. It can be one of the following: + +- `task-priority-high` +- `task-priority-medium` +- `task-priority-low` +- `task-priority-none` + +A **date specific class** represents a due, start, scheduled or done date in a format relative to the current date. +It starts with `task-due-`, `task-start-`, `task-scheduled-` or `task-done-` followed by a relative expression that denotes the number of days this field represents compared to today: + +- `task-due-today` (or `task-start-today`, `task-done-today` etc) represents today. +- `task-due-future-1d` (or `task-start-future-1d`) represents 1 day in the future, i.e. tomorrow. +- `task-due-past-1d` (or `task-start-past-1d`) represents 1 day in the past, i.e. yesterday. +- Specific classes are added up to 7 days in the future or past, e.g. `task-scheduled-future-7d` or `task-due-past-7d`. + +Specific classes are added to both their corresponding components (e.g. to the due date component) and also to the complete task `li`, to make it easy for a CSS rule to style a complete task according to some property (e.g. color differently the complete task if it's due today) or just one relevant component. + +**Tip:** [CSS wildcard selectors](https://www.geeksforgeeks.org/wildcard-selectors-and-in-css-for-classes/) are a good way to select all past dates or future dates at once -- just use `[class*="past-"] .task-due ...` to address all overdue tasks, for example. + +## Examples + +The following examples can be used as [Obsidian CSS snippets](https://help.obsidian.md/How+to/Add+custom+styles#Use+Themes+and+or+CSS+snippets). + +### General Formatting + +Making tags, internal links and the recurrence rules of tasks to appear in gray: + +```css +.tasks-list-text a.tag { + color: gray; +} +.tasks-backlink a.internal-link { + color: gray; +} +.task-recurring { + color: gray; +} +``` + +### Priority as a Checkbox Color + +The following rules remove the Tasks priority emoticon and render the tasks' checkboxes in red, blue and orange according to the tasks' priority: + +```css +.task-priority-high input[type=checkbox] { + box-shadow: 0px 0px 2px 2px red; + border-color: red; +} +.task-priority-low input[type=checkbox] { + box-shadow: 0px 0px 2px 2px blue; + border-color: blue; +} +.task-priority-medium input[type=checkbox] { + box-shadow: 0px 0px 2px 2px orange; + border-color: orange; +} +/* This part removes the regular priority emoticon */ +span.task-priority { + display: none; +} +``` + +### Colors for Due Today and Overdue + +The following rules mark 'today' due dates as blue and past due dates as red: + +```css +/* A special color (bluish) for the 'due' component if it's for today */ +.task-due.task-due-today span { + background: #d2e8fa; + border-radius: 10px; + padding: 2px 8px; +} +/* A special color (reddish) for overdue due dates */ +[class*="past-"] .task-due span { + background: #ffbfcc; + border-radius: 10px; + padding: 2px 8px; +} +``` + +### Circle Checkboxes + +The following renders checkboxes as circles instead of squares: + +```css +ul > li.plugin-tasks-list-item .task-list-item-checkbox { + margin-inline-start: 0; + margin: 5px 2px; + border-radius: 50%; +} +``` + +### Grid Layout + +The following organizes the task structure into a 3-line grid, on which the description is in the first line and the various components are on the 2nd: + +```css +ul > li.plugin-tasks-list-item { + grid-template-columns: 25px auto; + display: grid; + align-items: top; +} +span.task-description { + grid-row: 1; + grid-column: 1/10; +} +span.tasks-backlink { + grid-row: 2; + grid-column: 2; + font-size: small; +} +span.task-recurring { + grid-row: 2; + font-size: small; + width: max-content; +} +span.task-due { + grid-row: 2; + font-size: small; + width: max-content; +} +span.task-done { + grid-row: 2; + font-size: small; + width: max-content; +} +.tasks-list-text { + position: relative; + display: inline-grid; + width: max-content; + grid-column-gap: 10px; +} +span.task-extras { + grid-row: 2; + grid-column: 2; + font-size: small; +} +``` + +### Complete Example + +The following can be used as a base for a full CSS snippet: + +```css +/* I like tags to appear in gray so they won't grab too much attention */ +.tasks-list-text a.tag { + color: gray; +} + +/* Set internal links to gray too instead of Obsidian's default */ +.tasks-backlink a.internal-link { + color: gray; +} + +/* Paint the recurrence rule in gray so it will be less distracting */ +.task-recurring { + color: gray; +} + +/* List indentation values that seem to work well for me */ +ul.contains-task-list.plugin-tasks-query-result { + padding: 0 10px; +} + +/* This seems to be needed for the task description to word-wrap correctly if they're too long */ +span.tasks-list-text { + width: auto; +} + +/* Represent tasks' priority with colorful round checkboxes instead of the priority emoticons */ +.task-priority-high input[type=checkbox] { + box-shadow: 0px 0px 2px 2px red; + border-color: red; +} +.task-priority-low input[type=checkbox] { + box-shadow: 0px 0px 2px 2px blue; + border-color: blue; +} +.task-priority-medium input[type=checkbox] { + box-shadow: 0px 0px 2px 2px orange; + border-color: orange; +} +/* This part removes the regular priority emoticon */ +span.task-priority { + display: none; +} + +/* A special color (bluish) for the 'due' component if it's for today */ +.task-due.task-due-today span { + background: #d2e8fa; + border-radius: 10px; + padding: 2px 8px; +} +/* A special color (reddish) for overdue due dates */ +[class*="past-"] .task-due span { + background: #ffbfcc; + border-radius: 10px; + padding: 2px 8px; +} + +/* Make checkboxes a circle instead of a square */ +ul > li.plugin-tasks-list-item .task-list-item-checkbox { + margin-inline-start: 0; + margin: 5px 2px; + border-radius: 50%; +} + +/* The following section organizes the task components in a grid, so the description will be on the first row + * of each item and most components will be in the 2nd row. */ +ul > li.plugin-tasks-list-item { + grid-template-columns: 25px auto; + display: grid; + align-items: top; +} +span.task-description { + grid-row: 1; + grid-column: 1/10; +} +span.tasks-backlink { + grid-row: 2; + grid-column: 2; + font-size: small; +} +span.task-recurring { + grid-row: 2; + font-size: small; + width: max-content; +} +span.task-due { + grid-row: 2; + font-size: small; + width: max-content; +} +span.task-done { + grid-row: 2; + font-size: small; + width: max-content; +} +.tasks-list-text { + position: relative; + display: inline-grid; + width: max-content; + grid-column-gap: 10px; +} +span.task-extras { + grid-row: 2; + grid-column: 2; + font-size: small; +} +``` diff --git a/src/TaskLineRenderer.ts b/src/TaskLineRenderer.ts index 7fb77d819d..e5aeb3e43d 100644 --- a/src/TaskLineRenderer.ts +++ b/src/TaskLineRenderer.ts @@ -27,6 +27,8 @@ export const LayoutClasses: { [c in TaskLayoutComponent]: string } = { blockLink: '', }; +const MAX_DAY_CLASS_RANGE = 7; + /** * The function used to render a Markdown task line into an existing HTML element. */ @@ -117,15 +119,22 @@ async function taskToHtml( let componentString = task.componentToString(taskLayout, component); if (componentString) { if (component === 'description') componentString = removeGlobalFilterIfNeeded(componentString); + // Create the text span that will hold the rendered component const span = document.createElement('span'); parentElement.appendChild(span); if (span) { - // TODO explain the purpose of this (to enable different formatting to layout like table cells and the text itself) + // Inside that text span, we are creating another internal span, that will hold the text itself. + // This may seem redundant, and by default it indeed does nothing, but we do it to allow the CSS + // to differentiate between the container of the text and the text itself, so it will be possible + // to do things like surrouding only the text (rather than its whole placeholder) with a highlight const internalSpan = document.createElement('span'); span.appendChild(internalSpan); await renderComponentText(internalSpan, componentString, component, task, textRenderer); const [genericClasses, specificClasses] = getComponentClasses(component, task); + // Add the generic classes that apply to what this component is (priority, due date etc) span.classList.add(...genericClasses); + // Add the specific classes that describe the content of the component + // (task-priority-medium, task-due-past-1d etc). span.classList.add(...specificClasses); allSpecificClasses.push(...specificClasses); } @@ -175,9 +184,15 @@ async function renderComponentText( } } +/** + * This function returns two lists of tags -- genericClasses and specificClasses -- that describe the + * given component. + * The genericClasses describe what the component is, e.g. a due date or a priority, and are one of the + * options in LayoutClasses. + * The specificClasses describe the content of the component translated to a CSS class, + * e.g. task-priority-medium, task-due-past-1d etc. + */ function getComponentClasses(component: TaskLayoutComponent, task: Task) { - // TODO explain the difference - // TODO maybe prevent the repetition and use the index of LayoutClasses here const genericClasses: string[] = []; const specificClasses: string[] = []; switch (component) { @@ -198,7 +213,8 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { const date = task.dueDate; if (date) { genericClasses.push(LayoutClasses.dueDate); - specificClasses.push('task-due-' + dateToClassName(date)); + const dateClass = dateToClassName(date); + if (dateClass) specificClasses.push('task-due-' + dateClass); } break; } @@ -206,7 +222,8 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { const date = task.startDate; if (date) { genericClasses.push(LayoutClasses.startDate); - specificClasses.push('task-start-' + dateToClassName(date)); + const dateClass = dateToClassName(date); + if (dateClass) specificClasses.push('task-start-' + dateClass); } break; } @@ -214,7 +231,8 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { const date = task.scheduledDate; if (date) { genericClasses.push(LayoutClasses.scheduledDate); - specificClasses.push('task-scheduled-' + dateToClassName(date)); + const dateClass = dateToClassName(date); + if (dateClass) specificClasses.push('task-scheduled-' + dateClass); } break; } @@ -222,7 +240,8 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { const date = task.doneDate; if (date) { genericClasses.push(LayoutClasses.doneDate); - specificClasses.push('task-done-' + dateToClassName(date)); + const dateClass = dateToClassName(date); + if (dateClass) specificClasses.push('task-done-' + dateClass); } break; } @@ -234,15 +253,20 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { return [genericClasses, specificClasses]; } -// TODO document +/** + * Translate a relative date to a CSS class: 'today', 'future-1d' (for tomorrow), 'past-1d' (for yesterday) + * etc. + * A cutoff (in days) is defined in MAX_DAY_CLASS_RANGE, from beyond that limit a class name is not output. + */ function dateToClassName(date: Moment) { const today = window.moment().startOf('day'); let result = ''; const diffDays = today.diff(date, 'days'); + if (Math.abs(diffDays) > MAX_DAY_CLASS_RANGE) return null; if (diffDays === 0) return 'today'; else if (diffDays > 0) result += 'past-'; else if (diffDays < 0) result += 'future-'; - result += diffDays.toString() + 'd'; + result += Math.abs(diffDays).toString() + 'd'; return result; } diff --git a/tests/TaskLineRenderer.test.ts b/tests/TaskLineRenderer.test.ts index 840181ca3a..6e855adb22 100644 --- a/tests/TaskLineRenderer.test.ts +++ b/tests/TaskLineRenderer.test.ts @@ -6,6 +6,8 @@ import { LayoutClasses, renderTaskLine } from '../src/TaskLineRenderer'; import { resetSettings, updateSettings } from '../src/Config/Settings'; import { LayoutOptions } from '../src/TaskLayout'; import type { Task } from '../src/Task'; +import { TaskRegularExpressions } from '../src/Task'; +import { DateParser } from '../src/Query/DateParser'; import { fromLine } from './TestHelpers'; jest.mock('obsidian'); @@ -212,4 +214,133 @@ describe('task line rendering', () => { [' 🔁 every month on the 32th'], ); }); + + const testComponentClasses = async ( + taskLine: string, + layoutOptions: Partial, + mainClass: string, + moreClasses: string[], + ) => { + const task = fromLine({ + line: taskLine, + }); + const fullLayoutOptions = { ...new LayoutOptions(), ...layoutOptions }; + const parentRender = await createMockParentAndRender(task, fullLayoutOptions); + + const textSpan = getTextSpan(parentRender); + let found = false; + for (const childSpan of Array.from(textSpan.children)) { + if (childSpan.classList.contains(mainClass)) { + found = true; + const spanClasses = Array.from(childSpan.classList).filter((c) => c != mainClass); + expect(spanClasses).toEqual(moreClasses); + } + } + expect(found).toBeTruthy(); + }; + + it('renders priority with its correct classes', async () => { + await testComponentClasses( + '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', + {}, + LayoutClasses.priority, + ['task-priority-high'], + ); + await testComponentClasses( + '- [ ] Full task 🔼 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', + {}, + LayoutClasses.priority, + ['task-priority-medium'], + ); + await testComponentClasses( + '- [ ] Full task 🔽 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', + {}, + LayoutClasses.priority, + ['task-priority-low'], + ); + }); + + it('renders recurrence with its correct classes', async () => { + await testComponentClasses( + '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', + {}, + LayoutClasses.recurrenceRule, + [], + ); + }); + + it('adds a correct "today" CSS class to dates', async () => { + const today = DateParser.parseDate('today').format(TaskRegularExpressions.dateFormat); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${today}`, {}, LayoutClasses.dueDate, ['task-due-today']); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${today}`, {}, LayoutClasses.scheduledDate, [ + 'task-scheduled-today', + ]); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${today}`, {}, LayoutClasses.startDate, ['task-start-today']); + await testComponentClasses(`- [x] Done task ✅ ${today}`, {}, LayoutClasses.doneDate, ['task-done-today']); + }); + + it('adds a correct "future-1d" CSS class to dates', async () => { + const future = DateParser.parseDate('tomorrow').format(TaskRegularExpressions.dateFormat); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${future}`, {}, LayoutClasses.dueDate, [ + 'task-due-future-1d', + ]); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${future}`, {}, LayoutClasses.scheduledDate, [ + 'task-scheduled-future-1d', + ]); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${future}`, {}, LayoutClasses.startDate, [ + 'task-start-future-1d', + ]); + await testComponentClasses(`- [x] Done task ✅ ${future}`, {}, LayoutClasses.doneDate, ['task-done-future-1d']); + }); + + it('adds a correct "future-7d" CSS class to dates', async () => { + const future = DateParser.parseDate('in 7 days').format(TaskRegularExpressions.dateFormat); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${future}`, {}, LayoutClasses.dueDate, [ + 'task-due-future-7d', + ]); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${future}`, {}, LayoutClasses.scheduledDate, [ + 'task-scheduled-future-7d', + ]); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${future}`, {}, LayoutClasses.startDate, [ + 'task-start-future-7d', + ]); + await testComponentClasses(`- [x] Done task ✅ ${future}`, {}, LayoutClasses.doneDate, ['task-done-future-7d']); + }); + + it('adds a correct "past-1d" CSS class to dates', async () => { + const past = DateParser.parseDate('yesterday').format(TaskRegularExpressions.dateFormat); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${past}`, {}, LayoutClasses.dueDate, ['task-due-past-1d']); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${past}`, {}, LayoutClasses.scheduledDate, [ + 'task-scheduled-past-1d', + ]); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${past}`, {}, LayoutClasses.startDate, [ + 'task-start-past-1d', + ]); + await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, ['task-done-past-1d']); + }); + + it('adds a correct "past-7d" CSS class to dates', async () => { + const past = DateParser.parseDate('7 days ago').format(TaskRegularExpressions.dateFormat); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${past}`, {}, LayoutClasses.dueDate, ['task-due-past-7d']); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${past}`, {}, LayoutClasses.scheduledDate, [ + 'task-scheduled-past-7d', + ]); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${past}`, {}, LayoutClasses.startDate, [ + 'task-start-past-7d', + ]); + await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, ['task-done-past-7d']); + }); + + it('does not add a specific class for dates further than 7 days', async () => { + const future = DateParser.parseDate('in 8 days').format(TaskRegularExpressions.dateFormat); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${future}`, {}, LayoutClasses.dueDate, []); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${future}`, {}, LayoutClasses.scheduledDate, []); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${future}`, {}, LayoutClasses.startDate, []); + await testComponentClasses(`- [x] Done task ✅ ${future}`, {}, LayoutClasses.doneDate, []); + const past = DateParser.parseDate('8 days ago').format(TaskRegularExpressions.dateFormat); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${past}`, {}, LayoutClasses.dueDate, []); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${past}`, {}, LayoutClasses.scheduledDate, []); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${past}`, {}, LayoutClasses.startDate, []); + await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, []); + }); }); From 362ec19939955f950e352af5b80f9de3be632a00 Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Thu, 12 Jan 2023 09:33:42 +0200 Subject: [PATCH 05/29] Merge of the styling.md document, conversion to CSS vars, and a 'far' postfix for far dates --- docs/advanced/styling.md | 312 ++++++++++++++++++++++++- docs/how-to/show-tasks-in-calendar.md | 2 +- docs/how-to/style-backlinks.md | 2 +- docs/how-to/styling.md | 322 -------------------------- src/TaskLineRenderer.ts | 11 +- tests/TaskLineRenderer.test.ts | 30 ++- 6 files changed, 338 insertions(+), 341 deletions(-) delete mode 100644 docs/how-to/styling.md diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index ebcf6af479..6200f64c48 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -8,19 +8,321 @@ has_toc: false # Styling Tasks -Each task entry has CSS styles that allow you to change the look and feel of how the tasks are displayed. The -following styles are available. +In rendered queries and Reading View, the Tasks plugin adds detailed CSS classes that represent many of each task's content, to allow for very extensive styling options via CSS. +Not only each component in a rendered task line is tagged with classes to differentiate it, many components also add classes that represent the actual content of the task, so CSS rules can refer to data such as the relative due date of a task or its specific priority. + +## Basic Task Structure + +The Tasks plugin renders a task in the following structure (this refers to query results, but the Reading View is the same exact the top-most containers): + +```markdown +- Obsidian code block (div class="block-language-tasks") + - Results list (ul class="plugin-tasks-query-result") + - Task (li class="task-list-item" + specific classes like "tasks-priority-medium tasks-due-past-1d") + - Task checkbox (li class="task-list-item-checkbox") + - Task content (span class="tasks-list-text") + - Task description and tags (span class="task-description") + - Internal span + - Task priority (span class="task-priority" + priority specific classes) + - Internal span + - Task recurrence rule (span class="task-recurring") + - Internal span + - Task start date (span class="task-start" + date specific classes) + - Internal span + - ... scheduled date, due date and done date in this order + - Task extras (link, edit button) (span class="task-extras") + - Tasks count (div class="tasks-count") +``` + +As can be seen above, the basic task `li` contains a checkbox and a content span. +The content span contains a list of **component** spans: description, priority, recurrence, start date, scheduled date, due date and done date in this order. + +Each component span is marked with a **generic class**, which denotes the type of the component, and in some cases a **specific class** that represents the component's content itself. + +Within each component span there is an additional "internal" span, which is the one holding the actual component text. +The reason for this additional internal span is that it allows CSS styles that closely wrap the text itself, rather than its container box, e.g. for the purpose of drawing a highlight or a box that is exactly in the size of the text. + +## Generic and Specific Classes + +Each rendered task component (description, priority, recurrence rule etc) includes a **generic class** that denotes this type of component. +The generic classes are: + +- `task-description` +- `task-priority` +- `task-due` +- `task-start` +- `task-scheduled` +- `task-done` +- `task-recurring` + +In addition to the generic classes, there are **specific classes** that represent the content of the various task components. + +A **priority specific class** represents the specific priority of a class. It can be one of the following: + +- `task-priority-high` +- `task-priority-medium` +- `task-priority-low` +- `task-priority-none` + +A **date specific class** represents a due, start, scheduled or done date in a format relative to the current date. +It starts with `task-due-`, `task-start-`, `task-scheduled-` or `task-done-` followed by a relative expression that denotes the number of days this field represents compared to today: + +- `task-due-today` (or `task-start-today`, `task-done-today` etc) represents today. +- `task-due-future-1d` (or `task-start-future-1d`) represents 1 day in the future, i.e. tomorrow. +- `task-due-past-1d` (or `task-start-past-1d`) represents 1 day in the past, i.e. yesterday. +- These specific classes are added up to 7 days in the future or past, e.g. `task-scheduled-future-7d` or `task-due-past-7d`. +- Dates that are further than 7 days in the future or past are given a `far` postfix, e.g. `task-scheduled-future-far` or `task-due-past-far`. + +Specific classes are added to both their corresponding components (e.g. to the due date component) and also to the complete task `li`, to make it easy for a CSS rule to style a complete task according to some property (e.g. color differently the complete task if it's due today) or just one relevant component. + +**Tip:** [CSS wildcard selectors](https://www.geeksforgeeks.org/wildcard-selectors-and-in-css-for-classes/) are a good way to select all past dates or future dates at once -- just use `[class*="past-"] .task-due ...` to address all overdue tasks, for example. + +## More Classes + +The following additional components have the following classes: | Class | Usage | | ------------------------------ | --------------------------------------------------------------------------------------------------------------- | -| plugin-tasks-query-result | This is applied to the UL used to hold all the tasks, each task is stored in a LI. | | plugin-tasks-query-explanation | This is applied to the PRE showing the query's explanation when the `explain` instruction is used. | -| plugin-tasks-list-item | This is applied to the LI that holds each task and the INPUT element for it. | | tasks-backlink | This is applied to the SPAN that wraps the backlink if displayed on the task. | | tasks-edit | This is applied to the SPAN that wraps the edit button/icon shown next to the task that opens the task edit UI. | | tasks-urgency | This is applied to the SPAN that wraps the urgency score if displayed on the task. | -| task-list-item-checkbox | This is applied to the INPUT element for the task. | | tasks-group-heading | This is applied to H4, H5 and H6 group headings | > `tasks-group-heading` was introduced in Tasks 1.6.0.
> `plugin-tasks-query-explanation` was introduced in Tasks 1.19.0. + +## Examples + +The following examples can be used as [Obsidian CSS snippets](https://help.obsidian.md/How+to/Add+custom+styles#Use+Themes+and+or+CSS+snippets). + +**Tip:** the following examples use CSS variables (`--var(...)`) provided by Obsidian instead of concrete color codes to maximize the chance that the result will be in-line with your chosen theme. You may of course use specific colors if so you choose. + +### General Formatting + +Making tags, internal links and the recurrence rules of tasks to appear in gray: + +```css +.tasks-list-text a.tag { + color: var(--list-marker-color); +} +.tasks-backlink a.internal-link { + color: var(--list-marker-color); +} +.task-recurring { + color: var(--list-marker-color); +} +``` + +### Priority as a Checkbox Color + +The following rules remove the Tasks priority emoticon and render the tasks' checkboxes in red, blue and orange according to the tasks' priority: + +```css +.task-priority-high input[type=checkbox] { + box-shadow: 0px 0px 2px 2px var(--color-red); + border-color: var(--color-red); +} +.task-priority-low input[type=checkbox] { + box-shadow: 0px 0px 2px 2px var(--color-blue); + border-color: var(--color-blue); +} +.task-priority-medium input[type=checkbox] { + box-shadow: 0px 0px 2px 2px var(--color-orange); + border-color: var(--color-orange); +} +/* This part removes the regular priority emoticon */ +span.task-priority { + display: none; +} +``` + +### Colors for Due Today and Overdue + +The following rules mark 'today' due dates as blue and past due dates as red: + +```css +/* A special color for the 'due' component if it's for today */ +.task-due.task-due-today span { + background: var(--code-property); + border-radius: 10px; + padding: 2px 8px; +} +/* A special color for overdue due dates */ +[class*="past-"] .task-due span { + background: var(--color-pink); + border-radius: 10px; + padding: 2px 8px; +} +``` + +### Circle Checkboxes + +The following renders checkboxes as circles instead of squares: + +```css +ul > li.plugin-tasks-list-item .task-list-item-checkbox { + margin-inline-start: 0; + margin: 5px 2px; + border-radius: 50%; +} +``` + +### Grid Layout + +The following organizes the task structure into a 3-line grid, on which the description is in the first line and the various components are on the 2nd: + +```css +ul > li.plugin-tasks-list-item { + grid-template-columns: 25px auto; + display: grid; + align-items: top; +} +span.task-description { + grid-row: 1; + grid-column: 1/10; +} +span.tasks-backlink { + grid-row: 2; + grid-column: 2; + font-size: small; +} +span.task-recurring { + grid-row: 2; + font-size: small; + width: max-content; +} +span.task-due { + grid-row: 2; + font-size: small; + width: max-content; +} +span.task-done { + grid-row: 2; + font-size: small; + width: max-content; +} +.tasks-list-text { + position: relative; + display: inline-grid; + width: max-content; + grid-column-gap: 10px; +} +span.task-extras { + grid-row: 2; + grid-column: 2; + font-size: small; +} +``` + +### Complete Example + +The following can be used as a base for a full CSS snippet: + +```css +/* I like tags to appear in gray so they won't grab too much attention */ +.tasks-list-text a.tag { + color: var(--list-marker-color); +} + +/* Set internal links to gray too instead of Obsidian's default */ +.tasks-backlink a.internal-link { + color: var(--list-marker-color); +} + +/* Paint the recurrence rule in gray so it will be less distracting */ +.task-recurring { + color: var(--list-marker-color); +} + +/* List indentation values that seem to work well for me */ +ul.contains-task-list.plugin-tasks-query-result { + padding: 0 10px; +} + +/* This seems to be needed for the task description to word-wrap correctly if they're too long */ +span.tasks-list-text { + width: auto; +} + +/* Represent tasks' priority with colorful round checkboxes instead of the priority emoticons */ +.task-priority-high input[type=checkbox] { + box-shadow: 0px 0px 2px 2px var(--color-red); + border-color: var(--color-red); +} +.task-priority-low input[type=checkbox] { + box-shadow: 0px 0px 2px 2px var(--color-blue); + border-color: var(--color-blue); +} +.task-priority-medium input[type=checkbox] { + box-shadow: 0px 0px 2px 2px var(--color-orange); + border-color: var(--color-orange); +} +/* This part removes the regular priority emoticon */ +span.task-priority { + display: none; +} + +/* A special color for the 'due' component if it's for today */ +.task-due.task-due-today span { + background: var(--code-property); + border-radius: 10px; + padding: 2px 8px; +} +/* A special color for overdue due dates */ +[class*="past-"] .task-due span { + background: var(--color-pink); + border-radius: 10px; + padding: 2px 8px; +} + +/* Make checkboxes a circle instead of a square */ +ul > li.plugin-tasks-list-item .task-list-item-checkbox { + margin-inline-start: 0; + margin: 5px 2px; + border-radius: 50%; +} + +/* The following section organizes the task components in a grid, so the description will be on the first row + * of each item and most components will be in the 2nd row. */ +ul > li.plugin-tasks-list-item { + grid-template-columns: 25px auto; + display: grid; + align-items: top; +} +span.task-description { + grid-row: 1; + grid-column: 1/10; +} +span.tasks-backlink { + grid-row: 2; + grid-column: 2; + font-size: small; +} +span.task-recurring { + grid-row: 2; + font-size: small; + width: max-content; +} +span.task-due { + grid-row: 2; + font-size: small; + width: max-content; +} +span.task-done { + grid-row: 2; + font-size: small; + width: max-content; +} +.tasks-list-text { + position: relative; + display: inline-grid; + width: max-content; + grid-column-gap: 10px; +} +span.task-extras { + grid-row: 2; + grid-column: 2; + font-size: small; +} +``` diff --git a/docs/how-to/show-tasks-in-calendar.md b/docs/how-to/show-tasks-in-calendar.md index 956772f2d8..4a8a306dbe 100644 --- a/docs/how-to/show-tasks-in-calendar.md +++ b/docs/how-to/show-tasks-in-calendar.md @@ -1,7 +1,7 @@ --- layout: default title: Show tasks in a calendar -nav_order: 6 +nav_order: 5 parent: How Tos --- diff --git a/docs/how-to/style-backlinks.md b/docs/how-to/style-backlinks.md index 89d68aa48f..0f173172e7 100644 --- a/docs/how-to/style-backlinks.md +++ b/docs/how-to/style-backlinks.md @@ -1,7 +1,7 @@ --- layout: default title: How to style backlinks -nav_order: 5 +nav_order: 4 parent: How Tos --- diff --git a/docs/how-to/styling.md b/docs/how-to/styling.md deleted file mode 100644 index f387ed5d41..0000000000 --- a/docs/how-to/styling.md +++ /dev/null @@ -1,322 +0,0 @@ ---- -layout: default -title: Styling with CSS -nav_order: 4 -parent: How Tos ---- - -# Styling with CSS - -{: .no_toc } - -
- - Table of contents - - {: .text-delta } -1. TOC -{:toc} -
- ---- - -In rendered queries and Reading View, the Tasks plugin adds detailed CSS classes that represent many of each task's content, to allow for very extensive styling options via CSS. -Not only each component in a rendered task line is tagged with classes to differentiate it, many components also add classes that represent the actual content of the task, so CSS rules can refer to data such as the relative due date of a task or its specific priority. - -## Basic Task Structure - -The Tasks plugin renders a task in the following structure (this refers to query results, but the Reading View is the same exact the top-most containers): - -```markdown -- Obsidian code block (div class="block-language-tasks") - - Results list (ul class="plugin-tasks-query-result") - - Task (li class="task-list-item" + specific classes like "tasks-priority-medium tasks-due-past-1d") - - Task checkbox (li class="task-list-item-checkbox") - - Task content (span class="tasks-list-text") - - Task description and tags (span class="task-description") - - Internal span - - Task priority (span class="task-priority" + priority specific classes) - - Internal span - - Task recurrence rule (span class="task-recurring") - - Internal span - - Task start date (span class="task-start" + date specific classes) - - Internal span - - ... scheduled date, due date and done date in this order - - Task extras (link, edit button) (span class="task-extras") - - Tasks count (div class="tasks-count") -``` - -As can be seen above, the basic task `li` contains a checkbox and a content span. -The content span contains a list of **component** spans: description, priority, recurrence, start date, scheduled date, due date and done date in this order. - -Each component span is marked with a **generic class**, which denotes the type of the component, and in some cases a **specific class** that represents the component's content itself. - -Within each component span there is an additional "internal" span, which is the one holding the actual component text. -The reason for this additional internal span is that it allows CSS styles that closely wrap the text itself, rather than its container box, e.g. for the purpose of drawing a highlight or a box that is exactly in the size of the text. - -## Generic and Specific Classes - -Each rendered task component (description, priority, recurrence rule etc) includes a **generic class** that denotes this type of component. -The generic classes are: - -- `task-description` -- `task-priority` -- `task-due` -- `task-start` -- `task-scheduled` -- `task-done` -- `task-recurring` - -In addition to the generic classes, there are **specific classes** that represent the content of the various task components. - -A **priority specific class** represents the specific priority of a class. It can be one of the following: - -- `task-priority-high` -- `task-priority-medium` -- `task-priority-low` -- `task-priority-none` - -A **date specific class** represents a due, start, scheduled or done date in a format relative to the current date. -It starts with `task-due-`, `task-start-`, `task-scheduled-` or `task-done-` followed by a relative expression that denotes the number of days this field represents compared to today: - -- `task-due-today` (or `task-start-today`, `task-done-today` etc) represents today. -- `task-due-future-1d` (or `task-start-future-1d`) represents 1 day in the future, i.e. tomorrow. -- `task-due-past-1d` (or `task-start-past-1d`) represents 1 day in the past, i.e. yesterday. -- Specific classes are added up to 7 days in the future or past, e.g. `task-scheduled-future-7d` or `task-due-past-7d`. - -Specific classes are added to both their corresponding components (e.g. to the due date component) and also to the complete task `li`, to make it easy for a CSS rule to style a complete task according to some property (e.g. color differently the complete task if it's due today) or just one relevant component. - -**Tip:** [CSS wildcard selectors](https://www.geeksforgeeks.org/wildcard-selectors-and-in-css-for-classes/) are a good way to select all past dates or future dates at once -- just use `[class*="past-"] .task-due ...` to address all overdue tasks, for example. - -## Examples - -The following examples can be used as [Obsidian CSS snippets](https://help.obsidian.md/How+to/Add+custom+styles#Use+Themes+and+or+CSS+snippets). - -### General Formatting - -Making tags, internal links and the recurrence rules of tasks to appear in gray: - -```css -.tasks-list-text a.tag { - color: gray; -} -.tasks-backlink a.internal-link { - color: gray; -} -.task-recurring { - color: gray; -} -``` - -### Priority as a Checkbox Color - -The following rules remove the Tasks priority emoticon and render the tasks' checkboxes in red, blue and orange according to the tasks' priority: - -```css -.task-priority-high input[type=checkbox] { - box-shadow: 0px 0px 2px 2px red; - border-color: red; -} -.task-priority-low input[type=checkbox] { - box-shadow: 0px 0px 2px 2px blue; - border-color: blue; -} -.task-priority-medium input[type=checkbox] { - box-shadow: 0px 0px 2px 2px orange; - border-color: orange; -} -/* This part removes the regular priority emoticon */ -span.task-priority { - display: none; -} -``` - -### Colors for Due Today and Overdue - -The following rules mark 'today' due dates as blue and past due dates as red: - -```css -/* A special color (bluish) for the 'due' component if it's for today */ -.task-due.task-due-today span { - background: #d2e8fa; - border-radius: 10px; - padding: 2px 8px; -} -/* A special color (reddish) for overdue due dates */ -[class*="past-"] .task-due span { - background: #ffbfcc; - border-radius: 10px; - padding: 2px 8px; -} -``` - -### Circle Checkboxes - -The following renders checkboxes as circles instead of squares: - -```css -ul > li.plugin-tasks-list-item .task-list-item-checkbox { - margin-inline-start: 0; - margin: 5px 2px; - border-radius: 50%; -} -``` - -### Grid Layout - -The following organizes the task structure into a 3-line grid, on which the description is in the first line and the various components are on the 2nd: - -```css -ul > li.plugin-tasks-list-item { - grid-template-columns: 25px auto; - display: grid; - align-items: top; -} -span.task-description { - grid-row: 1; - grid-column: 1/10; -} -span.tasks-backlink { - grid-row: 2; - grid-column: 2; - font-size: small; -} -span.task-recurring { - grid-row: 2; - font-size: small; - width: max-content; -} -span.task-due { - grid-row: 2; - font-size: small; - width: max-content; -} -span.task-done { - grid-row: 2; - font-size: small; - width: max-content; -} -.tasks-list-text { - position: relative; - display: inline-grid; - width: max-content; - grid-column-gap: 10px; -} -span.task-extras { - grid-row: 2; - grid-column: 2; - font-size: small; -} -``` - -### Complete Example - -The following can be used as a base for a full CSS snippet: - -```css -/* I like tags to appear in gray so they won't grab too much attention */ -.tasks-list-text a.tag { - color: gray; -} - -/* Set internal links to gray too instead of Obsidian's default */ -.tasks-backlink a.internal-link { - color: gray; -} - -/* Paint the recurrence rule in gray so it will be less distracting */ -.task-recurring { - color: gray; -} - -/* List indentation values that seem to work well for me */ -ul.contains-task-list.plugin-tasks-query-result { - padding: 0 10px; -} - -/* This seems to be needed for the task description to word-wrap correctly if they're too long */ -span.tasks-list-text { - width: auto; -} - -/* Represent tasks' priority with colorful round checkboxes instead of the priority emoticons */ -.task-priority-high input[type=checkbox] { - box-shadow: 0px 0px 2px 2px red; - border-color: red; -} -.task-priority-low input[type=checkbox] { - box-shadow: 0px 0px 2px 2px blue; - border-color: blue; -} -.task-priority-medium input[type=checkbox] { - box-shadow: 0px 0px 2px 2px orange; - border-color: orange; -} -/* This part removes the regular priority emoticon */ -span.task-priority { - display: none; -} - -/* A special color (bluish) for the 'due' component if it's for today */ -.task-due.task-due-today span { - background: #d2e8fa; - border-radius: 10px; - padding: 2px 8px; -} -/* A special color (reddish) for overdue due dates */ -[class*="past-"] .task-due span { - background: #ffbfcc; - border-radius: 10px; - padding: 2px 8px; -} - -/* Make checkboxes a circle instead of a square */ -ul > li.plugin-tasks-list-item .task-list-item-checkbox { - margin-inline-start: 0; - margin: 5px 2px; - border-radius: 50%; -} - -/* The following section organizes the task components in a grid, so the description will be on the first row - * of each item and most components will be in the 2nd row. */ -ul > li.plugin-tasks-list-item { - grid-template-columns: 25px auto; - display: grid; - align-items: top; -} -span.task-description { - grid-row: 1; - grid-column: 1/10; -} -span.tasks-backlink { - grid-row: 2; - grid-column: 2; - font-size: small; -} -span.task-recurring { - grid-row: 2; - font-size: small; - width: max-content; -} -span.task-due { - grid-row: 2; - font-size: small; - width: max-content; -} -span.task-done { - grid-row: 2; - font-size: small; - width: max-content; -} -.tasks-list-text { - position: relative; - display: inline-grid; - width: max-content; - grid-column-gap: 10px; -} -span.task-extras { - grid-row: 2; - grid-column: 2; - font-size: small; -} -``` diff --git a/src/TaskLineRenderer.ts b/src/TaskLineRenderer.ts index e5aeb3e43d..9876eae789 100644 --- a/src/TaskLineRenderer.ts +++ b/src/TaskLineRenderer.ts @@ -28,6 +28,7 @@ export const LayoutClasses: { [c in TaskLayoutComponent]: string } = { }; const MAX_DAY_CLASS_RANGE = 7; +const DAY_CLASS_OVER_RANGE_POSTFIX = 'far'; /** * The function used to render a Markdown task line into an existing HTML element. @@ -256,17 +257,21 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { /** * Translate a relative date to a CSS class: 'today', 'future-1d' (for tomorrow), 'past-1d' (for yesterday) * etc. - * A cutoff (in days) is defined in MAX_DAY_CLASS_RANGE, from beyond that limit a class name is not output. + * A cutoff (in days) is defined in MAX_DAY_CLASS_RANGE, from beyond that a generic 'far' postfix will be added. + * (the cutoff exists because we don't want to flood the DOM with potentially hundreds of unique classes.) */ function dateToClassName(date: Moment) { const today = window.moment().startOf('day'); let result = ''; const diffDays = today.diff(date, 'days'); - if (Math.abs(diffDays) > MAX_DAY_CLASS_RANGE) return null; if (diffDays === 0) return 'today'; else if (diffDays > 0) result += 'past-'; else if (diffDays < 0) result += 'future-'; - result += Math.abs(diffDays).toString() + 'd'; + if (Math.abs(diffDays) <= MAX_DAY_CLASS_RANGE) { + result += Math.abs(diffDays).toString() + 'd'; + } else { + result += DAY_CLASS_OVER_RANGE_POSTFIX; + } return result; } diff --git a/tests/TaskLineRenderer.test.ts b/tests/TaskLineRenderer.test.ts index 6e855adb22..fa75e6afd2 100644 --- a/tests/TaskLineRenderer.test.ts +++ b/tests/TaskLineRenderer.test.ts @@ -331,16 +331,28 @@ describe('task line rendering', () => { await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, ['task-done-past-7d']); }); - it('does not add a specific class for dates further than 7 days', async () => { + it('adds the classes "...future-far" and "...past-far" to dates that are further than 7 days', async () => { const future = DateParser.parseDate('in 8 days').format(TaskRegularExpressions.dateFormat); - await testComponentClasses(`- [ ] Full task ⏫ 📅 ${future}`, {}, LayoutClasses.dueDate, []); - await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${future}`, {}, LayoutClasses.scheduledDate, []); - await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${future}`, {}, LayoutClasses.startDate, []); - await testComponentClasses(`- [x] Done task ✅ ${future}`, {}, LayoutClasses.doneDate, []); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${future}`, {}, LayoutClasses.dueDate, [ + 'task-due-future-far', + ]); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${future}`, {}, LayoutClasses.scheduledDate, [ + 'task-scheduled-future-far', + ]); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${future}`, {}, LayoutClasses.startDate, [ + 'task-start-future-far', + ]); + await testComponentClasses(`- [x] Done task ✅ ${future}`, {}, LayoutClasses.doneDate, [ + 'task-done-future-far', + ]); const past = DateParser.parseDate('8 days ago').format(TaskRegularExpressions.dateFormat); - await testComponentClasses(`- [ ] Full task ⏫ 📅 ${past}`, {}, LayoutClasses.dueDate, []); - await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${past}`, {}, LayoutClasses.scheduledDate, []); - await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${past}`, {}, LayoutClasses.startDate, []); - await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, []); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${past}`, {}, LayoutClasses.dueDate, ['task-due-past-far']); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${past}`, {}, LayoutClasses.scheduledDate, [ + 'task-scheduled-past-far', + ]); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${past}`, {}, LayoutClasses.startDate, [ + 'task-start-past-far', + ]); + await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, ['task-done-past-far']); }); }); From 3dcb5877293d0842b0451c4c7a643fcb9300c2f0 Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Sun, 15 Jan 2023 10:38:35 +0200 Subject: [PATCH 06/29] Callout fix --- docs/advanced/styling.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index 6200f64c48..14aafed662 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -89,8 +89,9 @@ The following additional components have the following classes: | tasks-urgency | This is applied to the SPAN that wraps the urgency score if displayed on the task. | | tasks-group-heading | This is applied to H4, H5 and H6 group headings | -> `tasks-group-heading` was introduced in Tasks 1.6.0.
-> `plugin-tasks-query-explanation` was introduced in Tasks 1.19.0. +{: .released } +`tasks-group-heading` was introduced in Tasks 1.6.0.
+`plugin-tasks-query-explanation` was introduced in Tasks 1.19.0. ## Examples From 1c6bbe8c211a4fcf43d1d6b9826048fddbda4d9d Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Sun, 15 Jan 2023 10:47:44 +0200 Subject: [PATCH 07/29] More version markers in the documentation --- docs/advanced/styling.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index 14aafed662..d6f4c64937 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -13,6 +13,9 @@ Not only each component in a rendered task line is tagged with classes to differ ## Basic Task Structure +{: .released } +The following description relates to a restructuring of the rendered tasks that was introduced in Tasks X.Y.Z. + The Tasks plugin renders a task in the following structure (this refers to query results, but the Reading View is the same exact the top-most containers): ```markdown @@ -44,6 +47,9 @@ The reason for this additional internal span is that it allows CSS styles that c ## Generic and Specific Classes +{: .released } +Specific classes were introduced in Tasks X.Y.Z. + Each rendered task component (description, priority, recurrence rule etc) includes a **generic class** that denotes this type of component. The generic classes are: From f5d8595d3940906036eea3a7b39649a9f50204cc Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Wed, 25 Jan 2023 14:28:02 +0200 Subject: [PATCH 08/29] Added specific classes for tags --- docs/advanced/styling.md | 15 ++++++++++++--- src/TaskLineRenderer.ts | 10 ++++++++++ tests/TaskLineRenderer.test.ts | 14 ++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index d6f4c64937..d81d1b59d2 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -21,10 +21,10 @@ The Tasks plugin renders a task in the following structure (this refers to query ```markdown - Obsidian code block (div class="block-language-tasks") - Results list (ul class="plugin-tasks-query-result") - - Task (li class="task-list-item" + specific classes like "tasks-priority-medium tasks-due-past-1d") + - Task (li class="task-list-item" + specific classes like "tasks-tag-atHome tasks-priority-medium tasks-due-past-1d") - Task checkbox (li class="task-list-item-checkbox") - Task content (span class="tasks-list-text") - - Task description and tags (span class="task-description") + - Task description and tags (span class="task-description" + tag specific classes) - Internal span - Task priority (span class="task-priority" + priority specific classes) - Internal span @@ -79,7 +79,16 @@ It starts with `task-due-`, `task-start-`, `task-scheduled-` or `task-done-` fol - These specific classes are added up to 7 days in the future or past, e.g. `task-scheduled-future-7d` or `task-due-past-7d`. - Dates that are further than 7 days in the future or past are given a `far` postfix, e.g. `task-scheduled-future-far` or `task-due-past-far`. -Specific classes are added to both their corresponding components (e.g. to the due date component) and also to the complete task `li`, to make it easy for a CSS rule to style a complete task according to some property (e.g. color differently the complete task if it's due today) or just one relevant component. +A **tag specific class** translates each task tag into a CSS class, for the purpose of applying formatting according to specific tags. +It starts with `task-tag-` followed by a *sanitized* version of the tag name, which basically means that characters that are illegal to use in CSS class names are replaced by dashes. +(CSS class names allow only alphanumeric characters, a dash and an underscore.) +Examples: + +- A task with the tag `#phone` will be added with the specific class `task-tag-phone`. +- A task with the tag `#t/easy` will be added with the specific class `task-tag-t-easy`. +- A task with the tag `#task/atHome` will be added the specific class `task-tag-task-atHome`. + +Specific classes are added to both their corresponding components (e.g. to the due date component) and also to the complete task `li`, to make it easy for a CSS rule to style a complete task according to some property (e.g. color differently the complete task if it's due today, color a task according to a tag) or just one relevant component. **Tip:** [CSS wildcard selectors](https://www.geeksforgeeks.org/wildcard-selectors-and-in-css-for-classes/) are a good way to select all past dates or future dates at once -- just use `[class*="past-"] .task-due ...` to address all overdue tasks, for example. diff --git a/src/TaskLineRenderer.ts b/src/TaskLineRenderer.ts index 9876eae789..c594a303df 100644 --- a/src/TaskLineRenderer.ts +++ b/src/TaskLineRenderer.ts @@ -199,6 +199,16 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { switch (component) { case 'description': genericClasses.push(LayoutClasses.description); + for (const tag of task.tags) { + // Add task tags as specific classes, but sanitize them first to contain only characters that are legal + // for CSS classes. + // Taken from here: https://stackoverflow.com/questions/448981/which-characters-are-valid-in-css-class-names-selectors + const illegalCssClassChars = /[^_a-zA-Z0-9-]/g; + let sanitizedTag = tag.replace(illegalCssClassChars, '-'); + // And if after sanitazation the name starts with dashes or underscores, remove them. + sanitizedTag = sanitizedTag.replace(/^[-_]+/, ''); + if (sanitizedTag.length > 0) specificClasses.push(`task-tag-${sanitizedTag}`); + } break; case 'priority': { let priorityClass = null; diff --git a/tests/TaskLineRenderer.test.ts b/tests/TaskLineRenderer.test.ts index fa75e6afd2..fcb2656a5d 100644 --- a/tests/TaskLineRenderer.test.ts +++ b/tests/TaskLineRenderer.test.ts @@ -355,4 +355,18 @@ describe('task line rendering', () => { ]); await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, ['task-done-past-far']); }); + + it('adds classes for task tags', async () => { + await testComponentClasses('- [ ] Task with #tag1 #tag2/subtag', {}, LayoutClasses.description, [ + 'task-tag-tag1', + 'task-tag-tag2-subtag', + ]); + }); + + it('correctly sanitizes tag names to be legal CSS classes', async () => { + await testComponentClasses('- [ ] Task with #$ #_tag/אבג/x #__other/tag', {}, LayoutClasses.description, [ + 'task-tag-tag-----x', + 'task-tag-other-tag', + ]); + }); }); From 627501b5cc71df1683bec21492da728c445ca56b Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Sun, 5 Feb 2023 20:50:07 +0200 Subject: [PATCH 09/29] Classes to denote hidden layout elements (no tests yet) --- docs/advanced/styling.md | 2 +- src/QueryRenderer.ts | 4 ++++ src/TaskLayout.ts | 7 ++++++- src/TaskLineRenderer.ts | 3 ++- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index d81d1b59d2..f974492c55 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -20,7 +20,7 @@ The Tasks plugin renders a task in the following structure (this refers to query ```markdown - Obsidian code block (div class="block-language-tasks") - - Results list (ul class="plugin-tasks-query-result") + - Results list (ul class="plugin-tasks-query-result") OR Reading View list (ul class="contains-task-list") - Task (li class="task-list-item" + specific classes like "tasks-tag-atHome tasks-priority-medium tasks-due-past-1d") - Task checkbox (li class="task-list-item-checkbox") - Task content (span class="tasks-list-text") diff --git a/src/QueryRenderer.ts b/src/QueryRenderer.ts index 50b43a356d..078e0edda8 100644 --- a/src/QueryRenderer.ts +++ b/src/QueryRenderer.ts @@ -10,6 +10,7 @@ import { TaskModal } from './TaskModal'; import type { TasksEvents } from './TasksEvents'; import type { Task } from './Task'; import { DateFallback } from './DateFallback'; +import { TaskLayout } from './TaskLayout'; export class QueryRenderer { private readonly app: App; @@ -184,8 +185,10 @@ class QueryRenderChild extends MarkdownRenderChild { }): Promise<{ taskList: HTMLUListElement; tasksCount: number }> { const tasksCount = tasks.length; + const layout = new TaskLayout(this.query.layoutOptions); const taskList = content.createEl('ul'); taskList.addClasses(['contains-task-list', 'plugin-tasks-query-result']); + taskList.addClasses(layout.specificClasses); for (let i = 0; i < tasksCount; i++) { const task = tasks[i]; const isFilenameUnique = this.isFilenameUnique({ task }); @@ -195,6 +198,7 @@ class QueryRenderChild extends MarkdownRenderChild { listIndex: i, layoutOptions: this.query.layoutOptions, isFilenameUnique, + taskLayout: layout, }); // Remove all footnotes. They don't re-appear in another document. diff --git a/src/TaskLayout.ts b/src/TaskLayout.ts index 168210fc6f..1283f06175 100644 --- a/src/TaskLayout.ts +++ b/src/TaskLayout.ts @@ -44,6 +44,7 @@ export class TaskLayout { ]; public layoutComponents: TaskLayoutComponent[]; public options: LayoutOptions; + public specificClasses: string[] = []; constructor(options?: LayoutOptions, components?: TaskLayoutComponent[]) { if (options) { @@ -63,13 +64,16 @@ export class TaskLayout { * Return a new list of components with the given options applied. */ applyOptions(layoutOptions: LayoutOptions): TaskLayoutComponent[] { - // Remove a component from the taskComponents array if the given layoutOption criteria is met + // Remove a component from the taskComponents array if the given layoutOption criteria is met, + // and add to the layout's specific classes list the class that denotes that this component + // isn't in the layout const removeIf = ( taskComponents: TaskLayoutComponent[], shouldRemove: boolean, componentToRemove: TaskLayoutComponent, ) => { if (shouldRemove) { + this.specificClasses.push(`tasks-layout-hide-${componentToRemove}`); return taskComponents.filter((element) => element != componentToRemove); } else { return taskComponents; @@ -84,6 +88,7 @@ export class TaskLayout { newComponents = removeIf(newComponents, layoutOptions.hideScheduledDate, 'scheduledDate'); newComponents = removeIf(newComponents, layoutOptions.hideDueDate, 'dueDate'); newComponents = removeIf(newComponents, layoutOptions.hideDoneDate, 'doneDate'); + if (layoutOptions.shortMode) this.specificClasses.push('tasks-layout-short-mode'); return newComponents; } } diff --git a/src/TaskLineRenderer.ts b/src/TaskLineRenderer.ts index c594a303df..990292287c 100644 --- a/src/TaskLineRenderer.ts +++ b/src/TaskLineRenderer.ts @@ -14,6 +14,7 @@ export type TaskLineRenderDetails = { listIndex: number; layoutOptions?: LayoutOptions; isFilenameUnique?: boolean; + taskLayout?: TaskLayout; }; export const LayoutClasses: { [c in TaskLayoutComponent]: string } = { @@ -115,7 +116,7 @@ async function taskToHtml( textRenderer: TextRenderer, ) { const allSpecificClasses: string[] = []; - const taskLayout = new TaskLayout(renderDetails.layoutOptions); + const taskLayout = renderDetails.taskLayout ?? new TaskLayout(renderDetails.layoutOptions); for (const component of taskLayout.layoutComponents) { let componentString = task.componentToString(taskLayout, component); if (componentString) { From 1d4fde96dddee6e0dcf4b24c6b46c984d75e8324 Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Tue, 7 Feb 2023 20:19:51 +0200 Subject: [PATCH 10/29] More layout stuff, see here: https://github.com/obsidian-tasks-group/obsidian-tasks/pull/1519#issuecomment-1421247210 --- src/QueryRenderer.ts | 11 +++++ src/TaskLayout.ts | 2 + src/TaskLineRenderer.ts | 57 +++++++++++++++++++--- tests/TaskLineRenderer.test.ts | 89 ++++++++++++++++++++++++++++++++-- 4 files changed, 147 insertions(+), 12 deletions(-) diff --git a/src/QueryRenderer.ts b/src/QueryRenderer.ts index 078e0edda8..707819c042 100644 --- a/src/QueryRenderer.ts +++ b/src/QueryRenderer.ts @@ -189,6 +189,8 @@ class QueryRenderChild extends MarkdownRenderChild { const taskList = content.createEl('ul'); taskList.addClasses(['contains-task-list', 'plugin-tasks-query-result']); taskList.addClasses(layout.specificClasses); + // TODO TEMP add tests + taskList.addClasses(this.getGroupingClasses()); for (let i = 0; i < tasksCount; i++) { const task = tasks[i]; const isFilenameUnique = this.isFilenameUnique({ task }); @@ -355,4 +357,13 @@ class QueryRenderChild extends MarkdownRenderChild { return allFilesWithSameName.length < 2; } + + private getGroupingClasses() { + const classes: string[] = []; + for (const group of this.query.grouping) { + const className = `tasks-group-by-${group.property}`; + classes.push(className); + } + return classes; + } } diff --git a/src/TaskLayout.ts b/src/TaskLayout.ts index 1283f06175..beb5614ae5 100644 --- a/src/TaskLayout.ts +++ b/src/TaskLayout.ts @@ -43,6 +43,7 @@ export class TaskLayout { 'blockLink', ]; public layoutComponents: TaskLayoutComponent[]; + public hiddenComponents: TaskLayoutComponent[] = []; public options: LayoutOptions; public specificClasses: string[] = []; @@ -74,6 +75,7 @@ export class TaskLayout { ) => { if (shouldRemove) { this.specificClasses.push(`tasks-layout-hide-${componentToRemove}`); + this.hiddenComponents.push(componentToRemove); return taskComponents.filter((element) => element != componentToRemove); } else { return taskComponents; diff --git a/src/TaskLineRenderer.ts b/src/TaskLineRenderer.ts index 990292287c..d00b2c2cb8 100644 --- a/src/TaskLineRenderer.ts +++ b/src/TaskLineRenderer.ts @@ -117,6 +117,7 @@ async function taskToHtml( ) { const allSpecificClasses: string[] = []; const taskLayout = renderDetails.taskLayout ?? new TaskLayout(renderDetails.layoutOptions); + // Render and build classes for all the task's visible components for (const component of taskLayout.layoutComponents) { let componentString = task.componentToString(taskLayout, component); if (componentString) { @@ -133,6 +134,7 @@ async function taskToHtml( span.appendChild(internalSpan); await renderComponentText(internalSpan, componentString, component, task, textRenderer); const [genericClasses, specificClasses] = getComponentClasses(component, task); + addInternalClasses(component, internalSpan); // Add the generic classes that apply to what this component is (priority, due date etc) span.classList.add(...genericClasses); // Add the specific classes that describe the content of the component @@ -142,9 +144,20 @@ async function taskToHtml( } } } + + // Now build classes for the hidden task components without rendering them + // TODO TEMP add tests and document + for (const component of taskLayout.hiddenComponents) { + const [_, specificClasses] = getComponentClasses(component, task); + allSpecificClasses.push(...specificClasses); + } + return allSpecificClasses; } +/* + * Renders the given component into the given HTML span element. + */ async function renderComponentText( span: HTMLSpanElement, componentString: string, @@ -201,14 +214,8 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { case 'description': genericClasses.push(LayoutClasses.description); for (const tag of task.tags) { - // Add task tags as specific classes, but sanitize them first to contain only characters that are legal - // for CSS classes. - // Taken from here: https://stackoverflow.com/questions/448981/which-characters-are-valid-in-css-class-names-selectors - const illegalCssClassChars = /[^_a-zA-Z0-9-]/g; - let sanitizedTag = tag.replace(illegalCssClassChars, '-'); - // And if after sanitazation the name starts with dashes or underscores, remove them. - sanitizedTag = sanitizedTag.replace(/^[-_]+/, ''); - if (sanitizedTag.length > 0) specificClasses.push(`task-tag-${sanitizedTag}`); + const className = tagToClassName(tag); + if (className) specificClasses.push(className); } break; case 'priority': { @@ -265,6 +272,26 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { return [genericClasses, specificClasses]; } +/* + * Adds internal classes for various components (right now just tags actually), meaning that we modify the existing + * rendered element to add classes inside it. + * In the case of tags, Obsidian renders a Markdown description with elements for tags. We want to + * enable users to style these, so we modify the rendered Markdown by adding the specific tag classes for these + * elements. + */ +function addInternalClasses(component: TaskLayoutComponent, renderedComponent: HTMLSpanElement) { + if (component === 'description') { + const tags = renderedComponent.getElementsByClassName('tag'); + for (let i = 0; i < tags.length; i++) { + const tagName = tags[i].textContent; + if (tagName) { + const className = tagToClassName(tagName); + if (className) tags[i].classList.add(className); + } + } + } +} + /** * Translate a relative date to a CSS class: 'today', 'future-1d' (for tomorrow), 'past-1d' (for yesterday) * etc. @@ -286,6 +313,20 @@ function dateToClassName(date: Moment) { return result; } +/* + * Convert a tag name to a name that can be used as a CSS class, sanitizing them according to CSS class + * name rules. + * Taken from here: https://stackoverflow.com/questions/448981/which-characters-are-valid-in-css-class-names-selectors + */ +function tagToClassName(tag: string) { + const illegalCssClassChars = /[^_a-zA-Z0-9-]/g; + let sanitizedTag = tag.replace(illegalCssClassChars, '-'); + // And if after sanitazation the name starts with dashes or underscores, remove them. + sanitizedTag = sanitizedTag.replace(/^[-_]+/, ''); + if (sanitizedTag.length > 0) return `task-tag-${sanitizedTag}`; + else return null; +} + function addTooltip({ task, element, diff --git a/tests/TaskLineRenderer.test.ts b/tests/TaskLineRenderer.test.ts index fcb2656a5d..4107708adb 100644 --- a/tests/TaskLineRenderer.test.ts +++ b/tests/TaskLineRenderer.test.ts @@ -3,6 +3,7 @@ */ import moment from 'moment'; import { LayoutClasses, renderTaskLine } from '../src/TaskLineRenderer'; +import type { TextRenderer } from '../src/TaskLineRenderer'; import { resetSettings, updateSettings } from '../src/Config/Settings'; import { LayoutOptions } from '../src/TaskLayout'; import type { Task } from '../src/Task'; @@ -17,11 +18,13 @@ window.moment = moment; * Creates a dummy 'parent element' to host a task render, renders a task inside it, * and returns it for inspection. */ -async function createMockParentAndRender(task: Task, layoutOptions?: LayoutOptions) { +async function createMockParentAndRender(task: Task, layoutOptions?: LayoutOptions, mockTextRenderer?: TextRenderer) { const parentElement = document.createElement('div'); - const mockTextRenderer = async (text: string, element: HTMLSpanElement, _path: string) => { - element.innerText = text; - }; + // Our default text renderer for this method is a simplistic flat text + if (!mockTextRenderer) + mockTextRenderer = async (text: string, element: HTMLSpanElement, _path: string) => { + element.innerText = text; + }; await renderTaskLine( task, { @@ -239,6 +242,26 @@ describe('task line rendering', () => { expect(found).toBeTruthy(); }; + const testHiddenComponentClasses = async ( + taskLine: string, + layoutOptions: Partial, + hiddenGenericClass: string, + expectedSpecificClass: string, + ) => { + const task = fromLine({ + line: taskLine, + }); + const fullLayoutOptions = { ...new LayoutOptions(), ...layoutOptions }; + const parentRender = await createMockParentAndRender(task, fullLayoutOptions); + + const textSpan = getTextSpan(parentRender); + for (const childSpan of Array.from(textSpan.children)) { + expect(childSpan.classList.contains(hiddenGenericClass)).toBeFalsy(); + } + const li = parentRender.children[0]; + expect(li.classList.contains(expectedSpecificClass)).toBeTruthy(); + }; + it('renders priority with its correct classes', async () => { await testComponentClasses( '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', @@ -369,4 +392,62 @@ describe('task line rendering', () => { 'task-tag-other-tag', ]); }); + + // TODO TEMP add documentation + it('does not render hidden components but sets their specific classes to the upper li element', async () => { + await testHiddenComponentClasses( + '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', + { hidePriority: true }, + LayoutClasses.priority, + 'task-priority-high', + ); + await testHiddenComponentClasses( + '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', + { hideDueDate: true }, + LayoutClasses.dueDate, + 'task-due-past-far', + ); + await testHiddenComponentClasses( + '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', + { hideScheduledDate: true }, + LayoutClasses.scheduledDate, + 'task-scheduled-past-far', + ); + await testHiddenComponentClasses( + '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', + { hideStartDate: true }, + LayoutClasses.startDate, + 'task-start-past-far', + ); + }); + + // TODO TEMP add to documentation + /* + * In this test we try to imitate Obsidian's Markdown renderer more thoroughly than other tests, + * so we can verify that the rendering code adds the correct tag classes inside the rendered + * Markdown. + * Note that this test, just like the code that it tests, assumed a specific rendered structure + * by Obsidian, which is not guaranteed by the API. + */ + it('adds tag specific classes inside the description span', async () => { + const taskLine = '- [ ] Class with #someTag'; + const task = fromLine({ + line: taskLine, + }); + + // Unlike the default renderer in createMockParentAndRender, this one accepts a raw HTML rather + // than a text + const mockInnerHtmlRenderer = async (text: string, element: HTMLSpanElement, _path: string) => { + element.innerHTML = text; + }; + const parentRender = await createMockParentAndRender(task, new LayoutOptions(), mockInnerHtmlRenderer); + + const textSpan = getTextSpan(parentRender); + const descriptionSpan = textSpan.children[0].children[0] as HTMLElement; + expect(descriptionSpan.textContent).toEqual('Class with #someTag'); + const tagSpan = descriptionSpan.children[0]; + expect(tagSpan.textContent).toEqual('#someTag'); + expect(tagSpan.classList[0]).toEqual('tag'); + expect(tagSpan.classList[1]).toEqual('task-tag-someTag'); + }); }); From f1d44a46b15bebe5671de8bfca8d0e6341aa6d2f Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Wed, 8 Feb 2023 20:13:04 +0200 Subject: [PATCH 11/29] Documentation and sample vault manual tests --- docs/advanced/styling.md | 24 +++++++++++ .../snippets/tasks-plugin-query-styling.css | 11 +++++ .../Smoke Testing the Tasks Plugin.md | 1 + .../Tasks-Demo/Styling/Styling of Queries.md | 40 +++++++++++++++++++ src/TaskLineRenderer.ts | 1 - 5 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-query-styling.css create mode 100644 resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index f974492c55..b1619f6070 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -26,6 +26,7 @@ The Tasks plugin renders a task in the following structure (this refers to query - Task content (span class="tasks-list-text") - Task description and tags (span class="task-description" + tag specific classes) - Internal span + - Each tag in the description is wrapped in - Task priority (span class="task-priority" + priority specific classes) - Internal span - Task recurrence rule (span class="task-recurring") @@ -88,10 +89,23 @@ Examples: - A task with the tag `#t/easy` will be added with the specific class `task-tag-t-easy`. - A task with the tag `#task/atHome` will be added the specific class `task-tag-task-atHome`. +Note that tag specific classes are also added to the tag `` element within the rendered description. + Specific classes are added to both their corresponding components (e.g. to the due date component) and also to the complete task `li`, to make it easy for a CSS rule to style a complete task according to some property (e.g. color differently the complete task if it's due today, color a task according to a tag) or just one relevant component. **Tip:** [CSS wildcard selectors](https://www.geeksforgeeks.org/wildcard-selectors-and-in-css-for-classes/) are a good way to select all past dates or future dates at once -- just use `[class*="past-"] .task-due ...` to address all overdue tasks, for example. +## Hidden Components, Groups & Short Mode + +**Hidden components**, e.g. a `hide priority` line in a query, will generate the following: + +- The query container (`class="plugin-tasks-query-result"`) will include a `tasks-layout-hide...` class, e.g. `tasks-layout-hide-priority`. +- Although the priority will not be rendered in the query, the upper task element (`li class="task-list-item"`) will still be added the specific class of hidden components, e.g. `task-priority-high`. + +**Short mode** will add a `tasks-layout-short-mode` class to the query container. + +**Grouping rules** will add `tasks-group-by...` classes to the query container, e.g. `tasks-group-by-due`. + ## More Classes The following additional components have the following classes: @@ -172,6 +186,16 @@ The following rules mark 'today' due dates as blue and past due dates as red: } ``` +### Highlight for a Specific Tag + +The following rule adds a green glow around `#task/atHome` tags inside the description: + +```css +a.tag.task-tag-task-atHome { + box-shadow: 0 0 5px green; +} +``` + ### Circle Checkboxes The following renders checkboxes as circles instead of squares: diff --git a/resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-query-styling.css b/resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-query-styling.css new file mode 100644 index 0000000000..fdd89a294a --- /dev/null +++ b/resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-query-styling.css @@ -0,0 +1,11 @@ +.block-language-tasks:has(ul.plugin-tasks-query-result.tasks-group-by-priority) .tasks-group-heading { + color: red; +} + +.block-language-tasks .tasks-layout-short-mode { + background-color: aqua; +} + +ul.contains-task-list.tasks-layout-hide-priority { + color: red; +} diff --git a/resources/sample_vaults/Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md b/resources/sample_vaults/Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md index 232fd3c3df..1768a9592e 100644 --- a/resources/sample_vaults/Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md +++ b/resources/sample_vaults/Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md @@ -91,6 +91,7 @@ Steps to do: - [ ] #task View this file in **Reading view** and confirm that the tasks in this section are listed - [ ] #task View this file in **Live Preview** and confirm that the tasks in this section are listed - [ ] #task **check**: Checked all above steps for **viewing task blocks** worked +- [ ] #task **check**: Open the file "Styling of Queries" and follow the steps there --- diff --git a/resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md b/resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md new file mode 100644 index 0000000000..1fa651baaf --- /dev/null +++ b/resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md @@ -0,0 +1,40 @@ +# Styling of Queries + +To test styling of queries, follow this: + +- [ ] **1. Open the Obsidian settings of the Demo vault and under Appearance | CSS Snippets, turn on `tasks-plugin-query-styling`.** + +- [ ] **2.** **Test 'group by' classes** - the following query result should have **red headings** named 'Priority 1: High' and 'Priority 4: Low'. + +```tasks +path includes Styling of Queries +group by priority +``` + +- [ ] **3. Test 'group by' classes #2** - the following should have a **black** heading named 'No due date': + +```tasks +path includes Styling of Queries +group by due +``` + +- [ ] **4. Test short mode classes** - the following should have an aqua background: + +```tasks +path includes Styling of Queries +short mode +``` + +- [ ] **5. Test 'hidden' query classes** - the following lines (except the backlinks) should be colored **red**: + +```tasks +path includes Styling of Queries +hide priority +``` + +- [ ] 6. Open the Obsidian settings of the Demo vault and under Appearance | CSS Snippets, turn **off** `tasks-plugin-query-styling`. + +## Tasks for Reference + +- [ ] #task Task with high priority ⏫ +- [ ] #task Task with low priority 🔽 diff --git a/src/TaskLineRenderer.ts b/src/TaskLineRenderer.ts index d00b2c2cb8..4d19faf24f 100644 --- a/src/TaskLineRenderer.ts +++ b/src/TaskLineRenderer.ts @@ -146,7 +146,6 @@ async function taskToHtml( } // Now build classes for the hidden task components without rendering them - // TODO TEMP add tests and document for (const component of taskLayout.hiddenComponents) { const [_, specificClasses] = getComponentClasses(component, task); allSpecificClasses.push(...specificClasses); From 551bcc99257943042b0d201b3dc5e54d96efeb1a Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Wed, 8 Feb 2023 21:06:53 +0200 Subject: [PATCH 12/29] Documentation fixes and fix to a wrong class on invalid dates --- docs/advanced/styling.md | 6 +++--- src/TaskLineRenderer.ts | 1 + tests/TaskLineRenderer.test.ts | 4 ++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index b1619f6070..cf38eb52f0 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -21,7 +21,7 @@ The Tasks plugin renders a task in the following structure (this refers to query ```markdown - Obsidian code block (div class="block-language-tasks") - Results list (ul class="plugin-tasks-query-result") OR Reading View list (ul class="contains-task-list") - - Task (li class="task-list-item" + specific classes like "tasks-tag-atHome tasks-priority-medium tasks-due-past-1d") + - Task (li class="task-list-item" + specific classes like "tasks-tag-atHome tasks-priority-medium tasks-due-past-1d" + data-task="[custom_status]" + data+line="[line]") - Task checkbox (li class="task-list-item-checkbox") - Task content (span class="tasks-list-text") - Task description and tags (span class="task-description" + tag specific classes) @@ -179,7 +179,7 @@ The following rules mark 'today' due dates as blue and past due dates as red: padding: 2px 8px; } /* A special color for overdue due dates */ -[class*="past-"] .task-due span { +.task-due[class*="past-"] span { background: var(--color-pink); border-radius: 10px; padding: 2px 8px; @@ -310,7 +310,7 @@ span.task-priority { padding: 2px 8px; } /* A special color for overdue due dates */ -[class*="past-"] .task-due span { +.task-due[class*="past-"] span { background: var(--color-pink); border-radius: 10px; padding: 2px 8px; diff --git a/src/TaskLineRenderer.ts b/src/TaskLineRenderer.ts index 4aa8338d43..2ceab90b71 100644 --- a/src/TaskLineRenderer.ts +++ b/src/TaskLineRenderer.ts @@ -300,6 +300,7 @@ function dateToClassName(date: Moment) { const today = window.moment().startOf('day'); let result = ''; const diffDays = today.diff(date, 'days'); + if (isNaN(diffDays)) return null; if (diffDays === 0) return 'today'; else if (diffDays > 0) result += 'past-'; else if (diffDays < 0) result += 'future-'; diff --git a/tests/TaskLineRenderer.test.ts b/tests/TaskLineRenderer.test.ts index 4107708adb..dcd65cfd3b 100644 --- a/tests/TaskLineRenderer.test.ts +++ b/tests/TaskLineRenderer.test.ts @@ -379,6 +379,10 @@ describe('task line rendering', () => { await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, ['task-done-past-far']); }); + it('does not add specific classes to invalid dates', async () => { + await testComponentClasses('- [ ] Full task ⏫ 📅 2023-02-29', {}, LayoutClasses.dueDate, []); + }); + it('adds classes for task tags', async () => { await testComponentClasses('- [ ] Task with #tag1 #tag2/subtag', {}, LayoutClasses.description, [ 'task-tag-tag1', From c2efb51c7e4263e600ac3431e8ac7aec80e76e89 Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Sun, 19 Mar 2023 15:27:30 +0200 Subject: [PATCH 13/29] Converted some CSS classes to data attributes --- docs/advanced/styling.md | 95 +- .../plugins/obsidian-tasks-plugin/main.js | 19548 +++++++++++++++- .../snippets/tasks-plugin-query-styling.css | 2 +- src/Commands/CreateOrEdit.ts | 5 +- src/Commands/ToggleDone.ts | 5 +- src/Commands/index.ts | 4 +- src/QueryRenderer.ts | 13 +- src/TaskLineRenderer.ts | 99 +- tests/TaskLineRenderer.test.ts | 218 +- 9 files changed, 19725 insertions(+), 264 deletions(-) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index cf38eb52f0..d29f3658de 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -8,8 +8,8 @@ has_toc: false # Styling Tasks -In rendered queries and Reading View, the Tasks plugin adds detailed CSS classes that represent many of each task's content, to allow for very extensive styling options via CSS. -Not only each component in a rendered task line is tagged with classes to differentiate it, many components also add classes that represent the actual content of the task, so CSS rules can refer to data such as the relative due date of a task or its specific priority. +In rendered queries and Reading View, the Tasks plugin adds detailed CSS classes and data attributes that represent many of each task's content, to allow for very extensive styling options via CSS. +Not only each component in a rendered task line is tagged with classes to differentiate it, many components also add classes and data attributes that represent the actual content of the task, so CSS rules can refer to data such as the relative due date of a task or its specific priority. ## Basic Task Structure @@ -21,17 +21,17 @@ The Tasks plugin renders a task in the following structure (this refers to query ```markdown - Obsidian code block (div class="block-language-tasks") - Results list (ul class="plugin-tasks-query-result") OR Reading View list (ul class="contains-task-list") - - Task (li class="task-list-item" + specific classes like "tasks-tag-atHome tasks-priority-medium tasks-due-past-1d" + data-task="[custom_status]" + data+line="[line]") + - Task (li class="task-list-item" + attributes like data-task-priority="medium" data-task-due="past-1d" + data-task="[custom_status]" + data-line="[line]") - Task checkbox (li class="task-list-item-checkbox") - Task content (span class="tasks-list-text") - - Task description and tags (span class="task-description" + tag specific classes) + - Task description and tags (span class="task-description") - Internal span - - Each tag in the description is wrapped in - - Task priority (span class="task-priority" + priority specific classes) + - Each tag in the description is wrapped in + - Task priority (span class="task-priority" + data-task-priority attribute) - Internal span - Task recurrence rule (span class="task-recurring") - Internal span - - Task start date (span class="task-start" + date specific classes) + - Task start date (span class="task-start" + data-task-start attribute) - Internal span - ... scheduled date, due date and done date in this order - Task extras (link, edit button) (span class="task-extras") @@ -41,15 +41,15 @@ The Tasks plugin renders a task in the following structure (this refers to query As can be seen above, the basic task `li` contains a checkbox and a content span. The content span contains a list of **component** spans: description, priority, recurrence, start date, scheduled date, due date and done date in this order. -Each component span is marked with a **generic class**, which denotes the type of the component, and in some cases a **specific class** that represents the component's content itself. +Each component span is marked with a **generic class**, which denotes the type of the component, and in some cases a **data attributes** that represents the component's content itself. Within each component span there is an additional "internal" span, which is the one holding the actual component text. The reason for this additional internal span is that it allows CSS styles that closely wrap the text itself, rather than its container box, e.g. for the purpose of drawing a highlight or a box that is exactly in the size of the text. -## Generic and Specific Classes +## Generic Classes and Data Attributes {: .released } -Specific classes were introduced in Tasks X.Y.Z. +Data attributes were introduced in Tasks X.Y.Z. Each rendered task component (description, priority, recurrence rule etc) includes a **generic class** that denotes this type of component. The generic classes are: @@ -62,49 +62,38 @@ The generic classes are: - `task-done` - `task-recurring` -In addition to the generic classes, there are **specific classes** that represent the content of the various task components. +In addition to the generic classes, there are [**data attributes**](https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes) that represent the content of the various task components. -A **priority specific class** represents the specific priority of a class. It can be one of the following: +A **priority data attributes** named `data-task-priority` represents the specific priority of a class. It can be `high`, `medium`, `low` or `none`. -- `task-priority-high` -- `task-priority-medium` -- `task-priority-low` -- `task-priority-none` +A **date attribute** represents a due, start, scheduled or done date in a format relative to the current date. +The date attributes are `data-task-due`, `data-task-start`, `data-task-scheduled` and `data-task-done` and are populated with a relative expression that denotes the number of days this field represents compared to today: -A **date specific class** represents a due, start, scheduled or done date in a format relative to the current date. -It starts with `task-due-`, `task-start-`, `task-scheduled-` or `task-done-` followed by a relative expression that denotes the number of days this field represents compared to today: +- `data-task-due="today"` (or `data-task-start="today"`, `data-task-start="today"` etc) represents today. +- `data-task-due="future-1d"` (or `data-task-start="future-1d"`) represents 1 day in the future, i.e. tomorrow. +- `data-task-due="past-1d"` (or `data-task-start="past-1d"`) represents 1 day in the past, i.e. yesterday. +- These attributes are added up to 7 days in the future or past, e.g. `data-task-scheduled="future-7d"` or `data-task-due="past-7d"`. +- Dates that are further than 7 days in the future or past are given a `far` postfix, e.g. `data-task-scheduled="future-far"` or `data-task-due="past-far"`. -- `task-due-today` (or `task-start-today`, `task-done-today` etc) represents today. -- `task-due-future-1d` (or `task-start-future-1d`) represents 1 day in the future, i.e. tomorrow. -- `task-due-past-1d` (or `task-start-past-1d`) represents 1 day in the past, i.e. yesterday. -- These specific classes are added up to 7 days in the future or past, e.g. `task-scheduled-future-7d` or `task-due-past-7d`. -- Dates that are further than 7 days in the future or past are given a `far` postfix, e.g. `task-scheduled-future-far` or `task-due-past-far`. +A **tag data attribute** repeats each tag's content as a data attribute, for the purpose of applying formatting according to specific tags. +The tag `` elements are added a `data-tag-name` attribute with a *sanitized* version of the tag name, which basically means that characters that are illegal to use in HTML attributes (e.g. `&`, `"`) are replaced with dashes. -A **tag specific class** translates each task tag into a CSS class, for the purpose of applying formatting according to specific tags. -It starts with `task-tag-` followed by a *sanitized* version of the tag name, which basically means that characters that are illegal to use in CSS class names are replaced by dashes. -(CSS class names allow only alphanumeric characters, a dash and an underscore.) -Examples: +Data attributes are added to both their corresponding components (e.g. to the due date component) and also to the complete task `li`, to make it easy for a CSS rule to style a complete task according to some property (e.g. color differently the complete task if it's due today, color a task according to a tag) or just one relevant component. -- A task with the tag `#phone` will be added with the specific class `task-tag-phone`. -- A task with the tag `#t/easy` will be added with the specific class `task-tag-t-easy`. -- A task with the tag `#task/atHome` will be added the specific class `task-tag-task-atHome`. +An exception is the tag data attribute which is added only to the tag's `` element within the rendered description -- however you can still use a CSS `:has` selector to format an entire task's description according to a tag, as demonstrated in the examples below. -Note that tag specific classes are also added to the tag `` element within the rendered description. - -Specific classes are added to both their corresponding components (e.g. to the due date component) and also to the complete task `li`, to make it easy for a CSS rule to style a complete task according to some property (e.g. color differently the complete task if it's due today, color a task according to a tag) or just one relevant component. - -**Tip:** [CSS wildcard selectors](https://www.geeksforgeeks.org/wildcard-selectors-and-in-css-for-classes/) are a good way to select all past dates or future dates at once -- just use `[class*="past-"] .task-due ...` to address all overdue tasks, for example. +**Tip:** [CSS wildcard selectors](https://www.geeksforgeeks.org/wildcard-selectors-and-in-css-for-classes/) are a good way to select all past dates or future dates at once -- just use `.task-due[data-task-due^="past-"]` to address all overdue tasks, for example. Examples that utilize this can be found below. ## Hidden Components, Groups & Short Mode **Hidden components**, e.g. a `hide priority` line in a query, will generate the following: - The query container (`class="plugin-tasks-query-result"`) will include a `tasks-layout-hide...` class, e.g. `tasks-layout-hide-priority`. -- Although the priority will not be rendered in the query, the upper task element (`li class="task-list-item"`) will still be added the specific class of hidden components, e.g. `task-priority-high`. +- Although the priority will not be rendered in the query, the upper task element (`li class="task-list-item"`) will still be added the attribute of hidden components, e.g. `data-task-priority="high"`. **Short mode** will add a `tasks-layout-short-mode` class to the query container. -**Grouping rules** will add `tasks-group-by...` classes to the query container, e.g. `tasks-group-by-due`. +**Grouping rules** will add a `data-task-group-by` attribute to the query container, e.g. `data-task-group-by="due,scheduled"`. ## More Classes @@ -149,15 +138,15 @@ Making tags, internal links and the recurrence rules of tasks to appear in gray: The following rules remove the Tasks priority emoticon and render the tasks' checkboxes in red, blue and orange according to the tasks' priority: ```css -.task-priority-high input[type=checkbox] { +.task-list-item[data-task-priority="high"] input[type=checkbox] { box-shadow: 0px 0px 2px 2px var(--color-red); border-color: var(--color-red); } -.task-priority-low input[type=checkbox] { +.task-list-item[data-task-priority="low"] input[type=checkbox] { box-shadow: 0px 0px 2px 2px var(--color-blue); border-color: var(--color-blue); } -.task-priority-medium input[type=checkbox] { +.task-list-item[data-task-priority="medium"] input[type=checkbox] { box-shadow: 0px 0px 2px 2px var(--color-orange); border-color: var(--color-orange); } @@ -173,13 +162,13 @@ The following rules mark 'today' due dates as blue and past due dates as red: ```css /* A special color for the 'due' component if it's for today */ -.task-due.task-due-today span { +.task-due[data-task-due="today"] span { background: var(--code-property); border-radius: 10px; padding: 2px 8px; } /* A special color for overdue due dates */ -.task-due[class*="past-"] span { +.task-due[data-task-due^="past-"] span { background: var(--color-pink); border-radius: 10px; padding: 2px 8px; @@ -191,11 +180,21 @@ The following rules mark 'today' due dates as blue and past due dates as red: The following rule adds a green glow around `#task/atHome` tags inside the description: ```css -a.tag.task-tag-task-atHome { +a.tag[data-tag-name="#task/atHome"] { box-shadow: 0 0 5px green; } ``` +The following rule adds a rounded red background to the description of a task if it contains the tag `#task/strategic`: + +```css +.task-description span:has(.tag[data-tag-name="#task/strategic"]) { + background: #ffbfcc; + border-radius: 10px; + padding: 2px 8px; +} +``` + ### Circle Checkboxes The following renders checkboxes as circles instead of squares: @@ -286,15 +285,15 @@ span.tasks-list-text { } /* Represent tasks' priority with colorful round checkboxes instead of the priority emoticons */ -.task-priority-high input[type=checkbox] { +.task-list-item[data-task-priority="high"] input[type=checkbox] { box-shadow: 0px 0px 2px 2px var(--color-red); border-color: var(--color-red); } -.task-priority-low input[type=checkbox] { +.task-list-item[data-task-priority="low"] input[type=checkbox] { box-shadow: 0px 0px 2px 2px var(--color-blue); border-color: var(--color-blue); } -.task-priority-medium input[type=checkbox] { +.task-list-item[data-task-priority="medium"] input[type=checkbox] { box-shadow: 0px 0px 2px 2px var(--color-orange); border-color: var(--color-orange); } @@ -304,13 +303,13 @@ span.task-priority { } /* A special color for the 'due' component if it's for today */ -.task-due.task-due-today span { +.task-due[data-task-due="today"] span { background: var(--code-property); border-radius: 10px; padding: 2px 8px; } /* A special color for overdue due dates */ -.task-due[class*="past-"] span { +.task-due[data-task-due^="past-"] span { background: var(--color-pink); border-radius: 10px; padding: 2px 8px; diff --git a/resources/sample_vaults/Tasks-Demo/.obsidian/plugins/obsidian-tasks-plugin/main.js b/resources/sample_vaults/Tasks-Demo/.obsidian/plugins/obsidian-tasks-plugin/main.js index 60bb9351bd..e3f6edf627 100644 --- a/resources/sample_vaults/Tasks-Demo/.obsidian/plugins/obsidian-tasks-plugin/main.js +++ b/resources/sample_vaults/Tasks-Demo/.obsidian/plugins/obsidian-tasks-plugin/main.js @@ -122,25 +122,14563 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -"use strict";var fT=Object.create;var Ti=Object.defineProperty,pT=Object.defineProperties,hT=Object.getOwnPropertyDescriptor,mT=Object.getOwnPropertyDescriptors,yT=Object.getOwnPropertyNames,Sf=Object.getOwnPropertySymbols,gT=Object.getPrototypeOf,Pf=Object.prototype.hasOwnProperty,_T=Object.prototype.propertyIsEnumerable;var kf=(r,e,t)=>e in r?Ti(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,we=(r,e)=>{for(var t in e||(e={}))Pf.call(e,t)&&kf(r,t,e[t]);if(Sf)for(var t of Sf(e))_T.call(e,t)&&kf(r,t,e[t]);return r},vt=(r,e)=>pT(r,mT(e));var p=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),TT=(r,e)=>{for(var t in e)Ti(r,t,{get:e[t],enumerable:!0})},Af=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of yT(e))!Pf.call(r,i)&&i!==t&&Ti(r,i,{get:()=>e[i],enumerable:!(n=hT(e,i))||n.enumerable});return r};var Ks=(r,e,t)=>(t=r!=null?fT(gT(r)):{},Af(e||!r||!r.__esModule?Ti(t,"default",{value:r,enumerable:!0}):t,r)),bT=r=>Af(Ti({},"__esModule",{value:!0}),r);var x=(r,e,t)=>new Promise((n,i)=>{var s=u=>{try{o(t.next(u))}catch(l){i(l)}},a=u=>{try{o(t.throw(u))}catch(l){i(l)}},o=u=>u.done?n(u.value):Promise.resolve(u.value).then(s,a);o((t=t.apply(r,e)).next())});var rp=p((hP,ea)=>{var If,Ff,Uf,Lf,qf,Wf,Yf,$f,jf,Qs,Io,Bf,Gf,Hf,Dn,zf,Kf,Vf,Xf,Zf,Qf,Jf,ep,tp,Js;(function(r){var e=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(n){r(t(e,t(n)))}):typeof ea=="object"&&typeof ea.exports=="object"?r(t(e,t(ea.exports))):r(t(e));function t(n,i){return n!==e&&(typeof Object.create=="function"?Object.defineProperty(n,"__esModule",{value:!0}):n.__esModule=!0),function(s,a){return n[s]=i?i(s,a):a}}})(function(r){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var s in i)Object.prototype.hasOwnProperty.call(i,s)&&(n[s]=i[s])};If=function(n,i){if(typeof i!="function"&&i!==null)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");e(n,i);function s(){this.constructor=n}n.prototype=i===null?Object.create(i):(s.prototype=i.prototype,new s)},Ff=Object.assign||function(n){for(var i,s=1,a=arguments.length;s=0;c--)(l=n[c])&&(u=(o<3?l(u):o>3?l(i,s,u):l(i,s))||u);return o>3&&u&&Object.defineProperty(i,s,u),u},qf=function(n,i){return function(s,a){i(s,a,n)}},Wf=function(n,i){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,i)},Yf=function(n,i,s,a){function o(u){return u instanceof s?u:new s(function(l){l(u)})}return new(s||(s=Promise))(function(u,l){function c(h){try{f(a.next(h))}catch(y){l(y)}}function d(h){try{f(a.throw(h))}catch(y){l(y)}}function f(h){h.done?u(h.value):o(h.value).then(c,d)}f((a=a.apply(n,i||[])).next())})},$f=function(n,i){var s={label:0,sent:function(){if(u[0]&1)throw u[1];return u[1]},trys:[],ops:[]},a,o,u,l;return l={next:c(0),throw:c(1),return:c(2)},typeof Symbol=="function"&&(l[Symbol.iterator]=function(){return this}),l;function c(f){return function(h){return d([f,h])}}function d(f){if(a)throw new TypeError("Generator is already executing.");for(;s;)try{if(a=1,o&&(u=f[0]&2?o.return:f[0]?o.throw||((u=o.return)&&u.call(o),0):o.next)&&!(u=u.call(o,f[1])).done)return u;switch(o=0,u&&(f=[f[0]&2,u.value]),f[0]){case 0:case 1:u=f;break;case 4:return s.label++,{value:f[1],done:!1};case 5:s.label++,o=f[1],f=[0];continue;case 7:f=s.ops.pop(),s.trys.pop();continue;default:if(u=s.trys,!(u=u.length>0&&u[u.length-1])&&(f[0]===6||f[0]===2)){s=0;continue}if(f[0]===3&&(!u||f[1]>u[0]&&f[1]=n.length&&(n=void 0),{value:n&&n[a++],done:!n}}};throw new TypeError(i?"Object is not iterable.":"Symbol.iterator is not defined.")},Io=function(n,i){var s=typeof Symbol=="function"&&n[Symbol.iterator];if(!s)return n;var a=s.call(n),o,u=[],l;try{for(;(i===void 0||i-- >0)&&!(o=a.next()).done;)u.push(o.value)}catch(c){l={error:c}}finally{try{o&&!o.done&&(s=a.return)&&s.call(a)}finally{if(l)throw l.error}}return u},Bf=function(){for(var n=[],i=0;i1||c(m,g)})})}function c(m,g){try{d(a[m](g))}catch(R){y(u[0][3],R)}}function d(m){m.value instanceof Dn?Promise.resolve(m.value.v).then(f,h):y(u[0][2],m)}function f(m){c("next",m)}function h(m){c("throw",m)}function y(m,g){m(g),u.shift(),u.length&&c(u[0][0],u[0][1])}},Kf=function(n){var i,s;return i={},a("next"),a("throw",function(o){throw o}),a("return"),i[Symbol.iterator]=function(){return this},i;function a(o,u){i[o]=n[o]?function(l){return(s=!s)?{value:Dn(n[o](l)),done:o==="return"}:u?u(l):l}:u}},Vf=function(n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i=n[Symbol.asyncIterator],s;return i?i.call(n):(n=typeof Qs=="function"?Qs(n):n[Symbol.iterator](),s={},a("next"),a("throw"),a("return"),s[Symbol.asyncIterator]=function(){return this},s);function a(u){s[u]=n[u]&&function(l){return new Promise(function(c,d){l=n[u](l),o(c,d,l.done,l.value)})}}function o(u,l,c,d){Promise.resolve(d).then(function(f){u({value:f,done:c})},l)}},Xf=function(n,i){return Object.defineProperty?Object.defineProperty(n,"raw",{value:i}):n.raw=i,n};var t=Object.create?function(n,i){Object.defineProperty(n,"default",{enumerable:!0,value:i})}:function(n,i){n.default=i};Zf=function(n){if(n&&n.__esModule)return n;var i={};if(n!=null)for(var s in n)s!=="default"&&Object.prototype.hasOwnProperty.call(n,s)&&Js(i,n,s);return t(i,n),i},Qf=function(n){return n&&n.__esModule?n:{default:n}},Jf=function(n,i,s,a){if(s==="a"&&!a)throw new TypeError("Private accessor was defined without a getter");if(typeof i=="function"?n!==i||!a:!i.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return s==="m"?a:s==="a"?a.call(n):a?a.value:i.get(n)},ep=function(n,i,s,a,o){if(a==="m")throw new TypeError("Private method is not writable");if(a==="a"&&!o)throw new TypeError("Private accessor was defined without a setter");if(typeof i=="function"?n!==i||!o:!i.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return a==="a"?o.call(n,s):o?o.value=s:i.set(n,s),s},tp=function(n,i){if(i===null||typeof i!="object"&&typeof i!="function")throw new TypeError("Cannot use 'in' operator on non-object");return typeof n=="function"?i===n:n.has(i)},r("__extends",If),r("__assign",Ff),r("__rest",Uf),r("__decorate",Lf),r("__param",qf),r("__metadata",Wf),r("__awaiter",Yf),r("__generator",$f),r("__exportStar",jf),r("__createBinding",Js),r("__values",Qs),r("__read",Io),r("__spread",Bf),r("__spreadArrays",Gf),r("__spreadArray",Hf),r("__await",Dn),r("__asyncGenerator",zf),r("__asyncDelegator",Kf),r("__asyncValues",Vf),r("__makeTemplateObject",Xf),r("__importStar",Zf),r("__importDefault",Qf),r("__classPrivateFieldGet",Jf),r("__classPrivateFieldSet",ep),r("__classPrivateFieldIn",tp)})});var ie=p(Ar=>{"use strict";Object.defineProperty(Ar,"__esModule",{value:!0});Ar.matchAnyPattern=Ar.extractTerms=Ar.repeatedTimeunitPattern=void 0;function ZT(r,e){let t=e.replace(/\((?!\?)/g,"(?:");return`${r}${t}\\s{0,5}(?:,?\\s{0,5}${t}){0,10}`}Ar.repeatedTimeunitPattern=ZT;function Fp(r){let e;return r instanceof Array?e=[...r]:r instanceof Map?e=Array.from(r.keys()):e=Object.keys(r),e}Ar.extractTerms=Fp;function QT(r){return`(?:${Fp(r).sort((t,n)=>n.length-t.length).join("|").replace(/\./g,"\\.")})`}Ar.matchAnyPattern=QT});var ee=p((Yo,$o)=>{(function(r,e){typeof Yo=="object"&&typeof $o!="undefined"?$o.exports=e():typeof define=="function"&&define.amd?define(e):(r=typeof globalThis!="undefined"?globalThis:r||self).dayjs=e()})(Yo,function(){"use strict";var r=1e3,e=6e4,t=36e5,n="millisecond",i="second",s="minute",a="hour",o="day",u="week",l="month",c="quarter",d="year",f="date",h="Invalid Date",y=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,m=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,g={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},R=function(A,E,b){var C=String(A);return!C||C.length>=E?A:""+Array(E+1-C.length).join(b)+A},O={s:R,z:function(A){var E=-A.utcOffset(),b=Math.abs(E),C=Math.floor(b/60),v=b%60;return(E<=0?"+":"-")+R(C,2,"0")+":"+R(v,2,"0")},m:function A(E,b){if(E.date(){"use strict";var JT=xr&&xr.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(xr,"__esModule",{value:!0});xr.findYearClosestToRef=xr.findMostLikelyADYear=void 0;var eb=JT(ee());function tb(r){return r<100&&(r>50?r=r+1900:r=r+2e3),r}xr.findMostLikelyADYear=tb;function rb(r,e,t){let n=eb.default(r),i=n;i=i.month(t-1),i=i.date(e),i=i.year(n.year());let s=i.add(1,"y"),a=i.add(-1,"y");return Math.abs(s.diff(n)){"use strict";Object.defineProperty($,"__esModule",{value:!0});$.parseTimeUnits=$.TIME_UNITS_PATTERN=$.parseYear=$.YEAR_PATTERN=$.parseOrdinalNumberPattern=$.ORDINAL_NUMBER_PATTERN=$.parseNumberPattern=$.NUMBER_PATTERN=$.TIME_UNIT_DICTIONARY=$.ORDINAL_WORD_DICTIONARY=$.INTEGER_WORD_DICTIONARY=$.MONTH_DICTIONARY=$.FULL_MONTH_NAME_DICTIONARY=$.WEEKDAY_DICTIONARY=void 0;var na=ie(),nb=je();$.WEEKDAY_DICTIONARY={sunday:0,sun:0,"sun.":0,monday:1,mon:1,"mon.":1,tuesday:2,tue:2,"tue.":2,wednesday:3,wed:3,"wed.":3,thursday:4,thurs:4,"thurs.":4,thur:4,"thur.":4,thu:4,"thu.":4,friday:5,fri:5,"fri.":5,saturday:6,sat:6,"sat.":6};$.FULL_MONTH_NAME_DICTIONARY={january:1,february:2,march:3,april:4,may:5,june:6,july:7,august:8,september:9,october:10,november:11,december:12};$.MONTH_DICTIONARY=Object.assign(Object.assign({},$.FULL_MONTH_NAME_DICTIONARY),{jan:1,"jan.":1,feb:2,"feb.":2,mar:3,"mar.":3,apr:4,"apr.":4,jun:6,"jun.":6,jul:7,"jul.":7,aug:8,"aug.":8,sep:9,"sep.":9,sept:9,"sept.":9,oct:10,"oct.":10,nov:11,"nov.":11,dec:12,"dec.":12});$.INTEGER_WORD_DICTIONARY={one:1,two:2,three:3,four:4,five:5,six:6,seven:7,eight:8,nine:9,ten:10,eleven:11,twelve:12};$.ORDINAL_WORD_DICTIONARY={first:1,second:2,third:3,fourth:4,fifth:5,sixth:6,seventh:7,eighth:8,ninth:9,tenth:10,eleventh:11,twelfth:12,thirteenth:13,fourteenth:14,fifteenth:15,sixteenth:16,seventeenth:17,eighteenth:18,nineteenth:19,twentieth:20,"twenty first":21,"twenty-first":21,"twenty second":22,"twenty-second":22,"twenty third":23,"twenty-third":23,"twenty fourth":24,"twenty-fourth":24,"twenty fifth":25,"twenty-fifth":25,"twenty sixth":26,"twenty-sixth":26,"twenty seventh":27,"twenty-seventh":27,"twenty eighth":28,"twenty-eighth":28,"twenty ninth":29,"twenty-ninth":29,thirtieth:30,"thirty first":31,"thirty-first":31};$.TIME_UNIT_DICTIONARY={sec:"second",second:"second",seconds:"second",min:"minute",mins:"minute",minute:"minute",minutes:"minute",h:"hour",hr:"hour",hrs:"hour",hour:"hour",hours:"hour",day:"d",days:"d",week:"week",weeks:"week",month:"month",months:"month",qtr:"quarter",quarter:"quarter",quarters:"quarter",y:"year",yr:"year",year:"year",years:"year"};$.NUMBER_PATTERN=`(?:${na.matchAnyPattern($.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s{0,2}an?)?|an?\\b(?:\\s{0,2}few)?|few|several|a?\\s{0,2}couple\\s{0,2}(?:of)?)`;function Lp(r){let e=r.toLowerCase();return $.INTEGER_WORD_DICTIONARY[e]!==void 0?$.INTEGER_WORD_DICTIONARY[e]:e==="a"||e==="an"?1:e.match(/few/)?3:e.match(/half/)?.5:e.match(/couple/)?2:e.match(/several/)?7:parseFloat(e)}$.parseNumberPattern=Lp;$.ORDINAL_NUMBER_PATTERN=`(?:${na.matchAnyPattern($.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:st|nd|rd|th)?)`;function ib(r){let e=r.toLowerCase();return $.ORDINAL_WORD_DICTIONARY[e]!==void 0?$.ORDINAL_WORD_DICTIONARY[e]:(e=e.replace(/(?:st|nd|rd|th)$/i,""),parseInt(e))}$.parseOrdinalNumberPattern=ib;$.YEAR_PATTERN="(?:[1-9][0-9]{0,3}\\s{0,2}(?:BE|AD|BC|BCE|CE)|[1-2][0-9]{3}|[5-9][0-9])";function sb(r){if(/BE/i.test(r))return r=r.replace(/BE/i,""),parseInt(r)-543;if(/BCE?/i.test(r))return r=r.replace(/BCE?/i,""),-parseInt(r);if(/(AD|CE)/i.test(r))return r=r.replace(/(AD|CE)/i,""),parseInt(r);let e=parseInt(r);return nb.findMostLikelyADYear(e)}$.parseYear=sb;var qp=`(${$.NUMBER_PATTERN})\\s{0,3}(${na.matchAnyPattern($.TIME_UNIT_DICTIONARY)})`,Up=new RegExp(qp,"i");$.TIME_UNITS_PATTERN=na.repeatedTimeunitPattern("(?:(?:about|around)\\s{0,3})?",qp);function ab(r){let e={},t=r,n=Up.exec(t);for(;n;)ob(e,n),t=t.substring(n[0].length).trim(),n=Up.exec(t);return e}$.parseTimeUnits=ab;function ob(r,e){let t=Lp(e[1]),n=$.TIME_UNIT_DICTIONARY[e[2].toLowerCase()];r[n]=t}});var Wp=p((jo,Bo)=>{(function(r,e){typeof jo=="object"&&typeof Bo!="undefined"?Bo.exports=e():typeof define=="function"&&define.amd?define(e):(r=typeof globalThis!="undefined"?globalThis:r||self).dayjs_plugin_quarterOfYear=e()})(jo,function(){"use strict";var r="month",e="quarter";return function(t,n){var i=n.prototype;i.quarter=function(o){return this.$utils().u(o)?Math.ceil((this.month()+1)/3):this.month(this.month()%3+3*(o-1))};var s=i.add;i.add=function(o,u){return o=Number(o),this.$utils().p(u)===e?this.add(3*o,r):s.bind(this)(o,u)};var a=i.startOf;i.startOf=function(o,u){var l=this.$utils(),c=!!l.u(u)||u;if(l.p(o)===e){var d=this.quarter()-1;return c?this.month(3*d).startOf(r).startOf("day"):this.month(3*d+2).endOf(r).endOf("day")}return a.bind(this)(o,u)}}})});var Rt=p(Xt=>{"use strict";Object.defineProperty(Xt,"__esModule",{value:!0});Xt.implySimilarTime=Xt.assignSimilarTime=Xt.assignSimilarDate=Xt.assignTheNextDay=void 0;var Yp=ke();function ub(r,e){e=e.add(1,"day"),$p(r,e),jp(r,e)}Xt.assignTheNextDay=ub;function $p(r,e){r.assign("day",e.date()),r.assign("month",e.month()+1),r.assign("year",e.year())}Xt.assignSimilarDate=$p;function lb(r,e){r.assign("hour",e.hour()),r.assign("minute",e.minute()),r.assign("second",e.second()),r.assign("millisecond",e.millisecond()),r.get("hour")<12?r.assign("meridiem",Yp.Meridiem.AM):r.assign("meridiem",Yp.Meridiem.PM)}Xt.assignSimilarTime=lb;function jp(r,e){r.imply("hour",e.hour()),r.imply("minute",e.minute()),r.imply("second",e.second()),r.imply("millisecond",e.millisecond())}Xt.implySimilarTime=jp});var Bp=p(Hr=>{"use strict";Object.defineProperty(Hr,"__esModule",{value:!0});Hr.toTimezoneOffset=Hr.TIMEZONE_ABBR_MAP=void 0;Hr.TIMEZONE_ABBR_MAP={ACDT:630,ACST:570,ADT:-180,AEDT:660,AEST:600,AFT:270,AKDT:-480,AKST:-540,ALMT:360,AMST:-180,AMT:-240,ANAST:720,ANAT:720,AQTT:300,ART:-180,AST:-240,AWDT:540,AWST:480,AZOST:0,AZOT:-60,AZST:300,AZT:240,BNT:480,BOT:-240,BRST:-120,BRT:-180,BST:60,BTT:360,CAST:480,CAT:120,CCT:390,CDT:-300,CEST:120,CET:60,CHADT:825,CHAST:765,CKT:-600,CLST:-180,CLT:-240,COT:-300,CST:-360,CVT:-60,CXT:420,ChST:600,DAVT:420,EASST:-300,EAST:-360,EAT:180,ECT:-300,EDT:-240,EEST:180,EET:120,EGST:0,EGT:-60,EST:-300,ET:-300,FJST:780,FJT:720,FKST:-180,FKT:-240,FNT:-120,GALT:-360,GAMT:-540,GET:240,GFT:-180,GILT:720,GMT:0,GST:240,GYT:-240,HAA:-180,HAC:-300,HADT:-540,HAE:-240,HAP:-420,HAR:-360,HAST:-600,HAT:-90,HAY:-480,HKT:480,HLV:-210,HNA:-240,HNC:-360,HNE:-300,HNP:-480,HNR:-420,HNT:-150,HNY:-540,HOVT:420,ICT:420,IDT:180,IOT:360,IRDT:270,IRKST:540,IRKT:540,IRST:210,IST:330,JST:540,KGT:360,KRAST:480,KRAT:480,KST:540,KUYT:240,LHDT:660,LHST:630,LINT:840,MAGST:720,MAGT:720,MART:-510,MAWT:300,MDT:-360,MESZ:120,MEZ:60,MHT:720,MMT:390,MSD:240,MSK:180,MST:-420,MUT:240,MVT:300,MYT:480,NCT:660,NDT:-90,NFT:690,NOVST:420,NOVT:360,NPT:345,NST:-150,NUT:-660,NZDT:780,NZST:720,OMSST:420,OMST:420,PDT:-420,PET:-300,PETST:720,PETT:720,PGT:600,PHOT:780,PHT:480,PKT:300,PMDT:-120,PMST:-180,PONT:660,PST:-480,PT:-480,PWT:540,PYST:-180,PYT:-240,RET:240,SAMT:240,SAST:120,SBT:660,SCT:240,SGT:480,SRT:-180,SST:-660,TAHT:-600,TFT:300,TJT:300,TKT:780,TLT:540,TMT:300,TVT:720,ULAT:480,UTC:0,UYST:-120,UYT:-180,UZT:300,VET:-210,VLAST:660,VLAT:660,VUT:660,WAST:120,WAT:60,WEST:60,WESZ:60,WET:0,WEZ:0,WFT:720,WGST:-120,WGT:-180,WIB:420,WIT:540,WITA:480,WST:780,WT:0,YAKST:600,YAKT:600,YAPT:600,YEKST:360,YEKT:360};function cb(r){var e;return r==null?null:typeof r=="number"?r:(e=Hr.TIMEZONE_ABBR_MAP[r])!==null&&e!==void 0?e:null}Hr.toTimezoneOffset=cb});var be=p(Zt=>{"use strict";var Gp=Zt&&Zt.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Zt,"__esModule",{value:!0});Zt.ParsingResult=Zt.ParsingComponents=Zt.ReferenceWithTimezone=void 0;var db=Gp(Wp()),ia=Gp(ee()),Go=Rt(),fb=Bp();ia.default.extend(db.default);var Ho=class{constructor(e){var t;e=e!=null?e:new Date,e instanceof Date?this.instant=e:(this.instant=(t=e.instant)!==null&&t!==void 0?t:new Date,this.timezoneOffset=fb.toTimezoneOffset(e.timezone))}};Zt.ReferenceWithTimezone=Ho;var zr=class{constructor(e,t){if(this.reference=e,this.knownValues={},this.impliedValues={},t)for(let i in t)this.knownValues[i]=t[i];let n=ia.default(e.instant);this.imply("day",n.date()),this.imply("month",n.month()+1),this.imply("year",n.year()),this.imply("hour",12),this.imply("minute",0),this.imply("second",0),this.imply("millisecond",0)}get(e){return e in this.knownValues?this.knownValues[e]:e in this.impliedValues?this.impliedValues[e]:null}isCertain(e){return e in this.knownValues}getCertainComponents(){return Object.keys(this.knownValues)}imply(e,t){return e in this.knownValues?this:(this.impliedValues[e]=t,this)}assign(e,t){return this.knownValues[e]=t,delete this.impliedValues[e],this}delete(e){delete this.knownValues[e],delete this.impliedValues[e]}clone(){let e=new zr(this.reference);e.knownValues={},e.impliedValues={};for(let t in this.knownValues)e.knownValues[t]=this.knownValues[t];for(let t in this.impliedValues)e.impliedValues[t]=this.impliedValues[t];return e}isOnlyDate(){return!this.isCertain("hour")&&!this.isCertain("minute")&&!this.isCertain("second")}isOnlyTime(){return!this.isCertain("weekday")&&!this.isCertain("day")&&!this.isCertain("month")}isOnlyWeekdayComponent(){return this.isCertain("weekday")&&!this.isCertain("day")&&!this.isCertain("month")}isOnlyDayMonthComponent(){return this.isCertain("day")&&this.isCertain("month")&&!this.isCertain("year")}isValidDate(){let e=this.dateWithoutTimezoneAdjustment();return!(e.getFullYear()!==this.get("year")||e.getMonth()!==this.get("month")-1||e.getDate()!==this.get("day")||this.get("hour")!=null&&e.getHours()!=this.get("hour")||this.get("minute")!=null&&e.getMinutes()!=this.get("minute"))}toString(){return`[ParsingComponents {knownValues: ${JSON.stringify(this.knownValues)}, impliedValues: ${JSON.stringify(this.impliedValues)}}, reference: ${JSON.stringify(this.reference)}]`}dayjs(){return ia.default(this.date())}date(){let e=this.dateWithoutTimezoneAdjustment();return new Date(e.getTime()+this.getSystemTimezoneAdjustmentMinute(e)*6e4)}dateWithoutTimezoneAdjustment(){let e=new Date(this.get("year"),this.get("month")-1,this.get("day"),this.get("hour"),this.get("minute"),this.get("second"),this.get("millisecond"));return e.setFullYear(this.get("year")),e}getSystemTimezoneAdjustmentMinute(e){var t,n;(!e||e.getTime()<0)&&(e=new Date);let i=-e.getTimezoneOffset(),s=(n=(t=this.get("timezoneOffset"))!==null&&t!==void 0?t:this.reference.timezoneOffset)!==null&&n!==void 0?n:i;return i-s}static createRelativeFromReference(e,t){let n=ia.default(e.instant);for(let s in t)n=n.add(t[s],s);let i=new zr(e);return t.hour||t.minute||t.second?(Go.assignSimilarTime(i,n),Go.assignSimilarDate(i,n),e.timezoneOffset!==null&&i.assign("timezoneOffset",-e.instant.getTimezoneOffset())):(Go.implySimilarTime(i,n),e.timezoneOffset!==null&&i.imply("timezoneOffset",-e.instant.getTimezoneOffset()),t.d?(i.assign("day",n.date()),i.assign("month",n.month()+1),i.assign("year",n.year())):(t.week&&i.imply("weekday",n.day()),i.imply("day",n.date()),t.month?(i.assign("month",n.month()+1),i.assign("year",n.year())):(i.imply("month",n.month()+1),t.year?i.assign("year",n.year()):i.imply("year",n.year())))),i}};Zt.ParsingComponents=zr;var Mi=class{constructor(e,t,n,i,s){this.reference=e,this.refDate=e.instant,this.index=t,this.text=n,this.start=i||new zr(e),this.end=s}clone(){let e=new Mi(this.reference,this.index,this.text);return e.start=this.start?this.start.clone():null,e.end=this.end?this.end.clone():null,e}date(){return this.start.date()}toString(){return`[ParsingResult {index: ${this.index}, text: '${this.text}', ...}]`}};Zt.ParsingResult=Mi});var M=p(sa=>{"use strict";Object.defineProperty(sa,"__esModule",{value:!0});sa.AbstractParserWithWordBoundaryChecking=void 0;var zo=class{constructor(){this.cachedInnerPattern=null,this.cachedPattern=null}patternLeftBoundary(){return"(\\W|^)"}pattern(e){let t=this.innerPattern(e);return t==this.cachedInnerPattern?this.cachedPattern:(this.cachedPattern=new RegExp(`${this.patternLeftBoundary()}${t.source}`,t.flags),this.cachedInnerPattern=t,this.cachedPattern)}extract(e,t){var n;let i=(n=t[1])!==null&&n!==void 0?n:"";t.index=t.index+i.length,t[0]=t[0].substring(i.length);for(let s=2;s{"use strict";Object.defineProperty(Xo,"__esModule",{value:!0});var Vo=Be(),pb=be(),hb=M(),mb=new RegExp(`(?:within|in|for)\\s*(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${Vo.TIME_UNITS_PATTERN})(?=\\W|$)`,"i"),yb=new RegExp(`(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${Vo.TIME_UNITS_PATTERN})(?=\\W|$)`,"i"),Ko=class extends hb.AbstractParserWithWordBoundaryChecking{innerPattern(e){return e.option.forwardDate?yb:mb}innerExtract(e,t){let n=Vo.parseTimeUnits(t[1]);return pb.ParsingComponents.createRelativeFromReference(e.reference,n)}};Xo.default=Ko});var Qp=p(Qo=>{"use strict";Object.defineProperty(Qo,"__esModule",{value:!0});var gb=je(),Xp=Be(),Zp=Be(),aa=Be(),_b=ie(),Tb=M(),bb=new RegExp(`(?:on\\s{0,3})?(${aa.ORDINAL_NUMBER_PATTERN})(?:\\s{0,3}(?:to|\\-|\\\u2013|until|through|till)?\\s{0,3}(${aa.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s{0,3}(?:of)?\\s{0,3})(${_b.matchAnyPattern(Xp.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s{0,3})(${Zp.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`,"i"),zp=1,Kp=2,vb=3,Vp=4,Zo=class extends Tb.AbstractParserWithWordBoundaryChecking{innerPattern(){return bb}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=Xp.MONTH_DICTIONARY[t[vb].toLowerCase()],s=aa.parseOrdinalNumberPattern(t[zp]);if(s>31)return t.index=t.index+t[zp].length,null;if(n.start.assign("month",i),n.start.assign("day",s),t[Vp]){let a=Zp.parseYear(t[Vp]);n.start.assign("year",a)}else{let a=gb.findYearClosestToRef(e.refDate,s,i);n.start.imply("year",a)}if(t[Kp]){let a=aa.parseOrdinalNumberPattern(t[Kp]);n.end=n.start.clone(),n.end.assign("day",a)}return n}};Qo.default=Zo});var nh=p(eu=>{"use strict";Object.defineProperty(eu,"__esModule",{value:!0});var Eb=je(),th=Be(),oa=Be(),rh=Be(),wb=ie(),Rb=M(),Ob=new RegExp(`(${wb.matchAnyPattern(th.MONTH_DICTIONARY)})(?:-|/|\\s*,?\\s*)(${oa.ORDINAL_NUMBER_PATTERN})(?!\\s*(?:am|pm))\\s*(?:(?:to|\\-)\\s*(${oa.ORDINAL_NUMBER_PATTERN})\\s*)?(?:(?:-|/|\\s*,?\\s*)(${rh.YEAR_PATTERN}))?(?=\\W|$)(?!\\:\\d)`,"i"),Db=1,Mb=2,Jp=3,eh=4,Jo=class extends Rb.AbstractParserWithWordBoundaryChecking{innerPattern(){return Ob}innerExtract(e,t){let n=th.MONTH_DICTIONARY[t[Db].toLowerCase()],i=oa.parseOrdinalNumberPattern(t[Mb]);if(i>31)return null;let s=e.createParsingComponents({day:i,month:n});if(t[eh]){let u=rh.parseYear(t[eh]);s.assign("year",u)}else{let u=Eb.findYearClosestToRef(e.refDate,i,n);s.imply("year",u)}if(!t[Jp])return s;let a=oa.parseOrdinalNumberPattern(t[Jp]),o=e.createParsingResult(t.index,t[0]);return o.start=s,o.end=s.clone(),o.end.assign("day",a),o}};eu.default=Jo});var ah=p(nu=>{"use strict";Object.defineProperty(nu,"__esModule",{value:!0});var tu=Be(),Sb=je(),kb=ie(),sh=Be(),Pb=M(),Ab=new RegExp(`((?:in)\\s*)?(${kb.matchAnyPattern(tu.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${sh.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`,"i"),xb=1,Cb=2,ih=3,ru=class extends Pb.AbstractParserWithWordBoundaryChecking{innerPattern(){return Ab}innerExtract(e,t){let n=t[Cb].toLowerCase();if(t[0].length<=3&&!tu.FULL_MONTH_NAME_DICTIONARY[n])return null;let i=e.createParsingResult(t.index+(t[xb]||"").length,t.index+t[0].length);i.start.imply("day",1);let s=tu.MONTH_DICTIONARY[n];if(i.start.assign("month",s),t[ih]){let a=sh.parseYear(t[ih]);i.start.assign("year",a)}else{let a=Sb.findYearClosestToRef(e.refDate,1,s);i.start.imply("year",a)}return i}};nu.default=ru});var lh=p(su=>{"use strict";Object.defineProperty(su,"__esModule",{value:!0});var uh=Be(),Nb=ie(),Ib=M(),Fb=new RegExp(`([0-9]{4})[\\.\\/\\s](?:(${Nb.matchAnyPattern(uh.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]([0-9]{1,2})(?=\\W|$)`,"i"),Ub=1,Lb=2,oh=3,qb=4,iu=class extends Ib.AbstractParserWithWordBoundaryChecking{innerPattern(){return Fb}innerExtract(e,t){let n=t[oh]?parseInt(t[oh]):uh.MONTH_DICTIONARY[t[Lb].toLowerCase()];if(n<1||n>12)return null;let i=parseInt(t[Ub]);return{day:parseInt(t[qb]),month:n,year:i}}};su.default=iu});var ch=p(ou=>{"use strict";Object.defineProperty(ou,"__esModule",{value:!0});var Wb=M(),Yb=new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})","i"),$b=1,jb=2,au=class extends Wb.AbstractParserWithWordBoundaryChecking{innerPattern(){return Yb}innerExtract(e,t){let n=parseInt(t[jb]),i=parseInt(t[$b]);return e.createParsingComponents().imply("day",1).assign("month",i).assign("year",n)}};ou.default=au});var Kr=p(ca=>{"use strict";Object.defineProperty(ca,"__esModule",{value:!0});ca.AbstractTimeExpressionParser=void 0;var Je=ke();function Bb(r,e,t,n){return new RegExp(`${r}${e}(\\d{1,4})(?:(?:\\.|:|\uFF1A)(\\d{1,2})(?:(?::|\uFF1A)(\\d{2})(?:\\.(\\d{1,6}))?)?)?(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?${t}`,n)}function Gb(r,e){return new RegExp(`^(${r})(\\d{1,4})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:\\.(\\d{1,6}))?)?)?(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?${e}`,"i")}var dh=2,Pn=3,ua=4,la=5,Si=6,uu=class{constructor(e=!1){this.cachedPrimaryPrefix=null,this.cachedPrimarySuffix=null,this.cachedPrimaryTimePattern=null,this.cachedFollowingPhase=null,this.cachedFollowingSuffix=null,this.cachedFollowingTimePatten=null,this.strictMode=e}patternFlags(){return"i"}primaryPatternLeftBoundary(){return"(^|\\s|T|\\b)"}primarySuffix(){return"(?=\\W|$)"}followingSuffix(){return"(?=\\W|$)"}pattern(e){return this.getPrimaryTimePatternThroughCache()}extract(e,t){let n=this.extractPrimaryTimeComponents(e,t);if(!n)return t.index+=t[0].length,null;let i=t.index+t[1].length,s=t[0].substring(t[1].length),a=e.createParsingResult(i,s,n);t.index+=t[0].length;let o=e.text.substring(t.index),l=this.getFollowingTimePatternThroughCache().exec(o);return s.match(/^\d{3,4}/)&&l&&l[0].match(/^\s*([+-])\s*\d{2,4}$/)?null:!l||l[0].match(/^\s*([+-])\s*\d{3,4}$/)?this.checkAndReturnWithoutFollowingPattern(a):(a.end=this.extractFollowingTimeComponents(e,l,a),a.end&&(a.text+=l[0]),this.checkAndReturnWithFollowingPattern(a))}extractPrimaryTimeComponents(e,t,n=!1){let i=e.createParsingComponents(),s=0,a=null,o=parseInt(t[dh]);if(o>100){if(this.strictMode||t[Pn]!=null)return null;s=o%100,o=Math.floor(o/100)}if(o>24)return null;if(t[Pn]!=null){if(t[Pn].length==1&&!t[Si])return null;s=parseInt(t[Pn])}if(s>=60)return null;if(o>12&&(a=Je.Meridiem.PM),t[Si]!=null){if(o>12)return null;let u=t[Si][0].toLowerCase();u=="a"&&(a=Je.Meridiem.AM,o==12&&(o=0)),u=="p"&&(a=Je.Meridiem.PM,o!=12&&(o+=12))}if(i.assign("hour",o),i.assign("minute",s),a!==null?i.assign("meridiem",a):o<12?i.imply("meridiem",Je.Meridiem.AM):i.imply("meridiem",Je.Meridiem.PM),t[la]!=null){let u=parseInt(t[la].substring(0,3));if(u>=1e3)return null;i.assign("millisecond",u)}if(t[ua]!=null){let u=parseInt(t[ua]);if(u>=60)return null;i.assign("second",u)}return i}extractFollowingTimeComponents(e,t,n){let i=e.createParsingComponents();if(t[la]!=null){let u=parseInt(t[la].substring(0,3));if(u>=1e3)return null;i.assign("millisecond",u)}if(t[ua]!=null){let u=parseInt(t[ua]);if(u>=60)return null;i.assign("second",u)}let s=parseInt(t[dh]),a=0,o=-1;if(t[Pn]!=null?a=parseInt(t[Pn]):s>100&&(a=s%100,s=Math.floor(s/100)),a>=60||s>24)return null;if(s>=12&&(o=Je.Meridiem.PM),t[Si]!=null){if(s>12)return null;let u=t[Si][0].toLowerCase();u=="a"&&(o=Je.Meridiem.AM,s==12&&(s=0,i.isCertain("day")||i.imply("day",i.get("day")+1))),u=="p"&&(o=Je.Meridiem.PM,s!=12&&(s+=12)),n.start.isCertain("meridiem")||(o==Je.Meridiem.AM?(n.start.imply("meridiem",Je.Meridiem.AM),n.start.get("hour")==12&&n.start.assign("hour",0)):(n.start.imply("meridiem",Je.Meridiem.PM),n.start.get("hour")!=12&&n.start.assign("hour",n.start.get("hour")+12)))}return i.assign("hour",s),i.assign("minute",a),o>=0?i.assign("meridiem",o):n.start.isCertain("meridiem")&&n.start.get("hour")>12?n.start.get("hour")-12>s?i.imply("meridiem",Je.Meridiem.AM):s<=12&&(i.assign("hour",s+12),i.assign("meridiem",Je.Meridiem.PM)):s>12?i.imply("meridiem",Je.Meridiem.PM):s<=12&&i.imply("meridiem",Je.Meridiem.AM),i.date().getTime()24)return null}return e}checkAndReturnWithFollowingPattern(e){if(e.text.match(/^\d+-\d+$/))return null;let t=e.text.match(/[^\d:.](\d[\d.]+)\s*-\s*(\d[\d.]+)$/);if(t){if(this.strictMode)return null;let n=t[1],i=t[2];if(i.includes(".")&&!i.match(/\d(\.\d{2})+$/))return null;let s=parseInt(i),a=parseInt(n);if(s>24||a>24)return null}return e}getPrimaryTimePatternThroughCache(){let e=this.primaryPrefix(),t=this.primarySuffix();return this.cachedPrimaryPrefix===e&&this.cachedPrimarySuffix===t?this.cachedPrimaryTimePattern:(this.cachedPrimaryTimePattern=Bb(this.primaryPatternLeftBoundary(),e,t,this.patternFlags()),this.cachedPrimaryPrefix=e,this.cachedPrimarySuffix=t,this.cachedPrimaryTimePattern)}getFollowingTimePatternThroughCache(){let e=this.followingPhase(),t=this.followingSuffix();return this.cachedFollowingPhase===e&&this.cachedFollowingSuffix===t?this.cachedFollowingTimePatten:(this.cachedFollowingTimePatten=Gb(e,t),this.cachedFollowingPhase=e,this.cachedFollowingSuffix=t,this.cachedFollowingTimePatten)}};ca.AbstractTimeExpressionParser=uu});var fh=p(cu=>{"use strict";Object.defineProperty(cu,"__esModule",{value:!0});var da=ke(),Hb=Kr(),lu=class extends Hb.AbstractTimeExpressionParser{constructor(e){super(e)}followingPhase(){return"\\s*(?:\\-|\\\u2013|\\~|\\\u301C|to|\\?)\\s*"}primaryPrefix(){return"(?:(?:at|from)\\s*)??"}primarySuffix(){return"(?:\\s*(?:o\\W*clock|at\\s*night|in\\s*the\\s*(?:morning|afternoon)))?(?!/)(?=\\W|$)"}extractPrimaryTimeComponents(e,t){let n=super.extractPrimaryTimeComponents(e,t);if(n){if(t[0].endsWith("night")){let i=n.get("hour");i>=6&&i<12?(n.assign("hour",n.get("hour")+12),n.assign("meridiem",da.Meridiem.PM)):i<6&&n.assign("meridiem",da.Meridiem.AM)}if(t[0].endsWith("afternoon")){n.assign("meridiem",da.Meridiem.PM);let i=n.get("hour");i>=0&&i<=6&&n.assign("hour",n.get("hour")+12)}t[0].endsWith("morning")&&(n.assign("meridiem",da.Meridiem.AM),n.get("hour")<12&&n.assign("hour",n.get("hour")))}return n}};cu.default=lu});var Ot=p(An=>{"use strict";Object.defineProperty(An,"__esModule",{value:!0});An.addImpliedTimeUnits=An.reverseTimeUnits=void 0;function zb(r){let e={};for(let t in r)e[t]=-r[t];return e}An.reverseTimeUnits=zb;function Kb(r,e){let t=r.clone(),n=r.dayjs();for(let i in e)n=n.add(e[i],i);return("day"in e||"d"in e||"week"in e||"month"in e||"year"in e)&&(t.imply("day",n.date()),t.imply("month",n.month()+1),t.imply("year",n.year())),("second"in e||"minute"in e||"hour"in e)&&(t.imply("second",n.second()),t.imply("minute",n.minute()),t.imply("hour",n.hour())),t}An.addImpliedTimeUnits=Kb});var ph=p(pu=>{"use strict";Object.defineProperty(pu,"__esModule",{value:!0});var fu=Be(),Vb=be(),Xb=M(),Zb=Ot(),Qb=new RegExp(`(${fu.TIME_UNITS_PATTERN})\\s{0,5}(?:ago|before|earlier)(?=(?:\\W|$))`,"i"),Jb=new RegExp(`(${fu.TIME_UNITS_PATTERN})\\s{0,5}ago(?=(?:\\W|$))`,"i"),du=class extends Xb.AbstractParserWithWordBoundaryChecking{constructor(e){super(),this.strictMode=e}innerPattern(){return this.strictMode?Jb:Qb}innerExtract(e,t){let n=fu.parseTimeUnits(t[1]),i=Zb.reverseTimeUnits(n);return Vb.ParsingComponents.createRelativeFromReference(e.reference,i)}};pu.default=du});var hh=p(yu=>{"use strict";Object.defineProperty(yu,"__esModule",{value:!0});var mu=Be(),ev=be(),tv=M(),rv=new RegExp(`(${mu.TIME_UNITS_PATTERN})\\s{0,5}(?:later|after|from now|henceforth|forward|out)(?=(?:\\W|$))`,"i"),nv=new RegExp("("+mu.TIME_UNITS_PATTERN+")(later|from now)(?=(?:\\W|$))","i"),iv=1,hu=class extends tv.AbstractParserWithWordBoundaryChecking{constructor(e){super(),this.strictMode=e}innerPattern(){return this.strictMode?nv:rv}innerExtract(e,t){let n=mu.parseTimeUnits(t[iv]);return ev.ParsingComponents.createRelativeFromReference(e.reference,n)}};yu.default=hu});var Cn=p(xn=>{"use strict";Object.defineProperty(xn,"__esModule",{value:!0});xn.MergingRefiner=xn.Filter=void 0;var gu=class{refine(e,t){return t.filter(n=>this.isValid(e,n))}};xn.Filter=gu;var _u=class{refine(e,t){if(t.length<2)return t;let n=[],i=t[0],s=null;for(let a=1;a{console.log(`${this.constructor.name} merged ${u} and ${l} into ${c}`)}),i=c}}return i!=null&&n.push(i),n}};xn.MergingRefiner=_u});var Qt=p(bu=>{"use strict";Object.defineProperty(bu,"__esModule",{value:!0});var sv=Cn(),Tu=class extends sv.MergingRefiner{shouldMergeResults(e,t,n){return!t.end&&!n.end&&e.match(this.patternBetween())!=null}mergeResults(e,t,n){if(!t.start.isOnlyWeekdayComponent()&&!n.start.isOnlyWeekdayComponent()&&(n.start.getCertainComponents().forEach(s=>{t.start.isCertain(s)||t.start.assign(s,n.start.get(s))}),t.start.getCertainComponents().forEach(s=>{n.start.isCertain(s)||n.start.assign(s,t.start.get(s))})),t.start.date().getTime()>n.start.date().getTime()){let s=t.start.dayjs(),a=n.start.dayjs();t.start.isOnlyWeekdayComponent()&&s.add(-7,"days").isBefore(a)?(s=s.add(-7,"days"),t.start.imply("day",s.date()),t.start.imply("month",s.month()+1),t.start.imply("year",s.year())):n.start.isOnlyWeekdayComponent()&&a.add(7,"days").isAfter(s)?(a=a.add(7,"days"),n.start.imply("day",a.date()),n.start.imply("month",a.month()+1),n.start.imply("year",a.year())):[n,t]=[t,n]}let i=t.clone();return i.start=t.start,i.end=n.start,i.index=Math.min(t.index,n.index),t.index{"use strict";var av=ki&&ki.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ki,"__esModule",{value:!0});var ov=av(Qt()),vu=class extends ov.default{patternBetween(){return/^\s*(to|-)\s*$/i}};ki.default=vu});var yh=p(Nn=>{"use strict";Object.defineProperty(Nn,"__esModule",{value:!0});Nn.mergeDateTimeComponent=Nn.mergeDateTimeResult=void 0;var uv=ke();function lv(r,e){let t=r.clone(),n=r.start,i=e.start;if(t.start=Eu(n,i),r.end!=null||e.end!=null){let s=r.end==null?r.start:r.end,a=e.end==null?e.start:e.end,o=Eu(s,a);r.end==null&&o.date().getTime(){"use strict";Object.defineProperty(Ru,"__esModule",{value:!0});var cv=Cn(),gh=yh(),wu=class extends cv.MergingRefiner{shouldMergeResults(e,t,n){return(t.start.isOnlyDate()&&n.start.isOnlyTime()||n.start.isOnlyDate()&&t.start.isOnlyTime())&&e.match(this.patternBetween())!=null}mergeResults(e,t,n){let i=t.start.isOnlyDate()?gh.mergeDateTimeResult(t,n):gh.mergeDateTimeResult(n,t);return i.index=t.index,i.text=t.text+e+n.text,i}};Ru.default=wu});var _h=p(Pi=>{"use strict";var dv=Pi&&Pi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Pi,"__esModule",{value:!0});var fv=dv(or()),Ou=class extends fv.default{patternBetween(){return new RegExp("^\\s*(T|at|after|before|on|of|,|-)?\\s*$")}};Pi.default=Ou});var Th=p(Mu=>{"use strict";Object.defineProperty(Mu,"__esModule",{value:!0});var pv=new RegExp("^\\s*,?\\s*\\(?([A-Z]{2,4})\\)?(?=\\W|$)","i"),hv={ACDT:630,ACST:570,ADT:-180,AEDT:660,AEST:600,AFT:270,AKDT:-480,AKST:-540,ALMT:360,AMST:-180,AMT:-240,ANAST:720,ANAT:720,AQTT:300,ART:-180,AST:-240,AWDT:540,AWST:480,AZOST:0,AZOT:-60,AZST:300,AZT:240,BNT:480,BOT:-240,BRST:-120,BRT:-180,BST:60,BTT:360,CAST:480,CAT:120,CCT:390,CDT:-300,CEST:120,CET:60,CHADT:825,CHAST:765,CKT:-600,CLST:-180,CLT:-240,COT:-300,CST:-360,CVT:-60,CXT:420,ChST:600,DAVT:420,EASST:-300,EAST:-360,EAT:180,ECT:-300,EDT:-240,EEST:180,EET:120,EGST:0,EGT:-60,EST:-300,ET:-300,FJST:780,FJT:720,FKST:-180,FKT:-240,FNT:-120,GALT:-360,GAMT:-540,GET:240,GFT:-180,GILT:720,GMT:0,GST:240,GYT:-240,HAA:-180,HAC:-300,HADT:-540,HAE:-240,HAP:-420,HAR:-360,HAST:-600,HAT:-90,HAY:-480,HKT:480,HLV:-210,HNA:-240,HNC:-360,HNE:-300,HNP:-480,HNR:-420,HNT:-150,HNY:-540,HOVT:420,ICT:420,IDT:180,IOT:360,IRDT:270,IRKST:540,IRKT:540,IRST:210,IST:330,JST:540,KGT:360,KRAST:480,KRAT:480,KST:540,KUYT:240,LHDT:660,LHST:630,LINT:840,MAGST:720,MAGT:720,MART:-510,MAWT:300,MDT:-360,MESZ:120,MEZ:60,MHT:720,MMT:390,MSD:240,MSK:240,MST:-420,MUT:240,MVT:300,MYT:480,NCT:660,NDT:-90,NFT:690,NOVST:420,NOVT:360,NPT:345,NST:-150,NUT:-660,NZDT:780,NZST:720,OMSST:420,OMST:420,PDT:-420,PET:-300,PETST:720,PETT:720,PGT:600,PHOT:780,PHT:480,PKT:300,PMDT:-120,PMST:-180,PONT:660,PST:-480,PT:-480,PWT:540,PYST:-180,PYT:-240,RET:240,SAMT:240,SAST:120,SBT:660,SCT:240,SGT:480,SRT:-180,SST:-660,TAHT:-600,TFT:300,TJT:300,TKT:780,TLT:540,TMT:300,TVT:720,ULAT:480,UTC:0,UYST:-120,UYT:-180,UZT:300,VET:-210,VLAST:660,VLAT:660,VUT:660,WAST:120,WAT:60,WEST:60,WESZ:60,WET:0,WEZ:0,WFT:720,WGST:-120,WGT:-180,WIB:420,WIT:540,WITA:480,WST:780,WT:0,YAKST:600,YAKT:600,YAPT:600,YEKST:360,YEKT:360},Du=class{constructor(e){this.timezone=Object.assign(Object.assign({},hv),e)}refine(e,t){var n;let i=(n=e.option.timezones)!==null&&n!==void 0?n:{};return t.forEach(s=>{var a,o;let u=e.text.substring(s.index+s.text.length),l=pv.exec(u);if(!l)return;let c=l[1].toUpperCase(),d=(o=(a=i[c])!==null&&a!==void 0?a:this.timezone[c])!==null&&o!==void 0?o:null;if(d===null)return;e.debug(()=>{console.log(`Extracting timezone: '${c}' into: ${d} for: ${s.start}`)});let f=s.start.get("timezoneOffset");f!==null&&d!=f&&(s.start.isCertain("timezoneOffset")||c!=l[1])||s.start.isOnlyDate()&&c!=l[1]||(s.text+=l[0],s.start.isCertain("timezoneOffset")||s.start.assign("timezoneOffset",d),s.end!=null&&!s.end.isCertain("timezoneOffset")&&s.end.assign("timezoneOffset",d))}),t}};Mu.default=Du});var fa=p(ku=>{"use strict";Object.defineProperty(ku,"__esModule",{value:!0});var mv=new RegExp("^\\s*(?:\\(?(?:GMT|UTC)\\s?)?([+-])(\\d{1,2})(?::?(\\d{2}))?\\)?","i"),yv=1,gv=2,_v=3,Su=class{refine(e,t){return t.forEach(function(n){if(n.start.isCertain("timezoneOffset"))return;let i=e.text.substring(n.index+n.text.length),s=mv.exec(i);if(!s)return;e.debug(()=>{console.log(`Extracting timezone: '${s[0]}' into : ${n}`)});let a=parseInt(s[gv]),o=parseInt(s[_v]||"0"),u=a*60+o;u>14*60||(s[yv]==="-"&&(u=-u),n.end!=null&&n.end.assign("timezoneOffset",u),n.start.assign("timezoneOffset",u),n.text+=s[0])}),t}};ku.default=Su});var bh=p(Au=>{"use strict";Object.defineProperty(Au,"__esModule",{value:!0});var Pu=class{refine(e,t){if(t.length<2)return t;let n=[],i=t[0];for(let s=1;si.text.length&&(i=a):(n.push(i),i=a)}return i!=null&&n.push(i),n}};Au.default=Pu});var vh=p(Ai=>{"use strict";var Tv=Ai&&Ai.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ai,"__esModule",{value:!0});var bv=Tv(ee()),xu=class{refine(e,t){return e.option.forwardDate&&t.forEach(function(n){let i=bv.default(e.refDate);if(n.start.isOnlyDayMonthComponent()&&i.isAfter(n.start.dayjs()))for(let s=0;s<3&&i.isAfter(n.start.dayjs());s++)n.start.imply("year",n.start.get("year")+1),e.debug(()=>{console.log(`Forward yearly adjusted for ${n} (${n.start})`)}),n.end&&!n.end.isCertain("year")&&(n.end.imply("year",n.end.get("year")+1),e.debug(()=>{console.log(`Forward yearly adjusted for ${n} (${n.end})`)}));n.start.isOnlyWeekdayComponent()&&i.isAfter(n.start.dayjs())&&(i.day()>=n.start.get("weekday")?i=i.day(n.start.get("weekday")+7):i=i.day(n.start.get("weekday")),n.start.imply("day",i.date()),n.start.imply("month",i.month()+1),n.start.imply("year",i.year()),e.debug(()=>{console.log(`Forward weekly adjusted for ${n} (${n.start})`)}),n.end&&n.end.isOnlyWeekdayComponent()&&(i.day()>n.end.get("weekday")?i=i.day(n.end.get("weekday")+7):i=i.day(n.end.get("weekday")),n.end.imply("day",i.date()),n.end.imply("month",i.month()+1),n.end.imply("year",i.year()),e.debug(()=>{console.log(`Forward weekly adjusted for ${n} (${n.end})`)})))}),t}};Ai.default=xu});var Eh=p(Nu=>{"use strict";Object.defineProperty(Nu,"__esModule",{value:!0});var vv=Cn(),Cu=class extends vv.Filter{constructor(e){super(),this.strictMode=e}isValid(e,t){return t.text.replace(" ","").match(/^\d*(\.\d*)?$/)?(e.debug(()=>{console.log(`Removing unlikely result '${t.text}'`)}),!1):t.start.isValidDate()?t.end&&!t.end.isValidDate()?(e.debug(()=>{console.log(`Removing invalid result: ${t} (${t.end})`)}),!1):this.strictMode?this.isStrictModeValid(e,t):!0:(e.debug(()=>{console.log(`Removing invalid result: ${t} (${t.start})`)}),!1)}isStrictModeValid(e,t){return t.start.isOnlyWeekdayComponent()?(e.debug(()=>{console.log(`(Strict) Removing weekday only component: ${t} (${t.end})`)}),!1):t.start.isOnlyTime()&&(!t.start.isCertain("hour")||!t.start.isCertain("minute"))?(e.debug(()=>{console.log(`(Strict) Removing uncertain time component: ${t} (${t.end})`)}),!1):!0}};Nu.default=Cu});var Uu=p(Fu=>{"use strict";Object.defineProperty(Fu,"__esModule",{value:!0});var Ev=M(),wv=new RegExp("([0-9]{4})\\-([0-9]{1,2})\\-([0-9]{1,2})(?:T([0-9]{1,2}):([0-9]{1,2})(?::([0-9]{1,2})(?:\\.(\\d{1,4}))?)?(?:Z|([+-]\\d{2}):?(\\d{2})?)?)?(?=\\W|$)","i"),Rv=1,Ov=2,Dv=3,wh=4,Mv=5,Rh=6,Oh=7,Dh=8,Mh=9,Iu=class extends Ev.AbstractParserWithWordBoundaryChecking{innerPattern(){return wv}innerExtract(e,t){let n={};if(n.year=parseInt(t[Rv]),n.month=parseInt(t[Ov]),n.day=parseInt(t[Dv]),t[wh]!=null)if(n.hour=parseInt(t[wh]),n.minute=parseInt(t[Mv]),t[Rh]!=null&&(n.second=parseInt(t[Rh])),t[Oh]!=null&&(n.millisecond=parseInt(t[Oh])),t[Dh]==null)n.timezoneOffset=0;else{let i=parseInt(t[Dh]),s=0;t[Mh]!=null&&(s=parseInt(t[Mh]));let a=i*60;a<0?a-=s:a+=s,n.timezoneOffset=a}return n}};Fu.default=Iu});var Sh=p(qu=>{"use strict";Object.defineProperty(qu,"__esModule",{value:!0});var Sv=Cn(),Lu=class extends Sv.MergingRefiner{mergeResults(e,t,n){let i=n.clone();return i.index=t.index,i.text=t.text+e+i.text,i.start.assign("weekday",t.start.get("weekday")),i.end&&i.end.assign("weekday",t.start.get("weekday")),i}shouldMergeResults(e,t,n){return t.start.isOnlyWeekdayComponent()&&!t.start.isCertain("hour")&&n.start.isCertain("day")&&e.match(/^,?\s*$/)!=null}};qu.default=Lu});var ur=p(In=>{"use strict";var Vr=In&&In.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(In,"__esModule",{value:!0});In.includeCommonConfiguration=void 0;var kv=Vr(Th()),Pv=Vr(fa()),kh=Vr(bh()),Av=Vr(vh()),xv=Vr(Eh()),Cv=Vr(Uu()),Nv=Vr(Sh());function Iv(r,e=!1){return r.parsers.unshift(new Cv.default),r.refiners.unshift(new Nv.default),r.refiners.unshift(new kv.default),r.refiners.unshift(new Pv.default),r.refiners.unshift(new kh.default),r.refiners.push(new kh.default),r.refiners.push(new Av.default),r.refiners.push(new xv.default(e)),r}In.includeCommonConfiguration=Iv});var cr=p(ne=>{"use strict";var Fv=ne&&ne.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ne,"__esModule",{value:!0});ne.noon=ne.morning=ne.midnight=ne.yesterdayEvening=ne.evening=ne.lastNight=ne.tonight=ne.theDayAfter=ne.tomorrow=ne.theDayBefore=ne.yesterday=ne.today=ne.now=void 0;var Jt=be(),Fn=Fv(ee()),lr=Rt(),xi=ke();function Uv(r){let e=Fn.default(r.instant),t=new Jt.ParsingComponents(r,{});return lr.assignSimilarDate(t,e),lr.assignSimilarTime(t,e),r.timezoneOffset!==null&&t.assign("timezoneOffset",e.utcOffset()),t}ne.now=Uv;function Lv(r){let e=Fn.default(r.instant),t=new Jt.ParsingComponents(r,{});return lr.assignSimilarDate(t,e),lr.implySimilarTime(t,e),t}ne.today=Lv;function qv(r){return Ph(r,1)}ne.yesterday=qv;function Ph(r,e){return Wu(r,-e)}ne.theDayBefore=Ph;function Wv(r){return Wu(r,1)}ne.tomorrow=Wv;function Wu(r,e){let t=Fn.default(r.instant),n=new Jt.ParsingComponents(r,{});return t=t.add(e,"day"),lr.assignSimilarDate(n,t),lr.implySimilarTime(n,t),n}ne.theDayAfter=Wu;function Yv(r,e=22){let t=Fn.default(r.instant),n=new Jt.ParsingComponents(r,{});return n.imply("hour",e),n.imply("meridiem",xi.Meridiem.PM),lr.assignSimilarDate(n,t),n}ne.tonight=Yv;function $v(r,e=0){let t=Fn.default(r.instant),n=new Jt.ParsingComponents(r,{});return t.hour()<6&&(t=t.add(-1,"day")),lr.assignSimilarDate(n,t),n.imply("hour",e),n}ne.lastNight=$v;function jv(r,e=20){let t=new Jt.ParsingComponents(r,{});return t.imply("meridiem",xi.Meridiem.PM),t.imply("hour",e),t}ne.evening=jv;function Bv(r,e=20){let t=Fn.default(r.instant),n=new Jt.ParsingComponents(r,{});return t=t.add(-1,"day"),lr.assignSimilarDate(n,t),n.imply("hour",e),n.imply("meridiem",xi.Meridiem.PM),n}ne.yesterdayEvening=Bv;function Gv(r){let e=new Jt.ParsingComponents(r,{});return e.imply("hour",0),e.imply("minute",0),e.imply("second",0),e}ne.midnight=Gv;function Hv(r,e=6){let t=new Jt.ParsingComponents(r,{});return t.imply("meridiem",xi.Meridiem.AM),t.imply("hour",e),t}ne.morning=Hv;function zv(r){let e=new Jt.ParsingComponents(r,{});return e.imply("meridiem",xi.Meridiem.AM),e.imply("hour",12),e}ne.noon=zv});var Ah=p(Nt=>{"use strict";var Kv=Nt&&Nt.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),Vv=Nt&&Nt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),Xv=Nt&&Nt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&Kv(e,r,t);return Vv(e,r),e},Zv=Nt&&Nt.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Nt,"__esModule",{value:!0});var Qv=Zv(ee()),Jv=M(),eE=Rt(),Ci=Xv(cr()),tE=/(now|today|tonight|tomorrow|tmr|tmrw|yesterday|last\s*night)(?=\W|$)/i,Yu=class extends Jv.AbstractParserWithWordBoundaryChecking{innerPattern(e){return tE}innerExtract(e,t){let n=Qv.default(e.refDate),i=t[0].toLowerCase(),s=e.createParsingComponents();switch(i){case"now":return Ci.now(e.reference);case"today":return Ci.today(e.reference);case"yesterday":return Ci.yesterday(e.reference);case"tomorrow":case"tmr":case"tmrw":return Ci.tomorrow(e.reference);case"tonight":return Ci.tonight(e.reference);default:i.match(/last\s*night/)&&(n.hour()>6&&(n=n.add(-1,"day")),eE.assignSimilarDate(s,n),s.imply("hour",0));break}return s}};Nt.default=Yu});var xh=p(Ni=>{"use strict";var rE=Ni&&Ni.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ni,"__esModule",{value:!0});var pa=ke(),nE=M(),iE=rE(ee()),sE=Rt(),aE=/(?:this)?\s{0,3}(morning|afternoon|evening|night|midnight|noon)(?=\W|$)/i,$u=class extends nE.AbstractParserWithWordBoundaryChecking{innerPattern(){return aE}innerExtract(e,t){let n=iE.default(e.refDate),i=e.createParsingComponents();switch(t[1].toLowerCase()){case"afternoon":i.imply("meridiem",pa.Meridiem.PM),i.imply("hour",15);break;case"evening":case"night":i.imply("meridiem",pa.Meridiem.PM),i.imply("hour",20);break;case"midnight":sE.assignTheNextDay(i,n),i.imply("hour",0),i.imply("minute",0),i.imply("second",0);break;case"morning":i.imply("meridiem",pa.Meridiem.AM),i.imply("hour",6);break;case"noon":i.imply("meridiem",pa.Meridiem.AM),i.imply("hour",12);break}return i}};Ni.default=$u});var Xr=p(Cr=>{"use strict";var oE=Cr&&Cr.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Cr,"__esModule",{value:!0});Cr.toDayJSClosestWeekday=Cr.toDayJSWeekday=void 0;var Ch=oE(ee());function uE(r,e,t){if(!t)return Nh(r,e);let n=Ch.default(r);switch(t){case"this":n=n.day(e);break;case"next":n=n.day(e+7);break;case"last":n=n.day(e-7);break}return n}Cr.toDayJSWeekday=uE;function Nh(r,e){let t=Ch.default(r),n=t.day();return Math.abs(e-7-n){"use strict";Object.defineProperty(Bu,"__esModule",{value:!0});var Ih=Be(),lE=ie(),cE=M(),dE=Xr(),fE=new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:on\\s*?)?(?:(this|last|past|next)\\s*)?(${lE.matchAnyPattern(Ih.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(this|last|past|next)\\s*week)?(?=\\W|$)`,"i"),pE=1,hE=2,mE=3,ju=class extends cE.AbstractParserWithWordBoundaryChecking{innerPattern(){return fE}innerExtract(e,t){let n=t[hE].toLowerCase(),i=Ih.WEEKDAY_DICTIONARY[n],s=t[pE],a=t[mE],o=s||a;o=o||"",o=o.toLowerCase();let u=null;o=="last"||o=="past"?u="last":o=="next"?u="next":o=="this"&&(u="this");let l=dE.toDayJSWeekday(e.refDate,i,u);return e.createParsingComponents().assign("weekday",i).imply("day",l.date()).imply("month",l.month()+1).imply("year",l.year())}};Bu.default=ju});var qh=p(Ii=>{"use strict";var yE=Ii&&Ii.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ii,"__esModule",{value:!0});var Lh=Be(),Uh=be(),gE=yE(ee()),_E=M(),TE=ie(),bE=new RegExp(`(this|last|past|next|after\\s*this)\\s*(${TE.matchAnyPattern(Lh.TIME_UNIT_DICTIONARY)})(?=\\s*)(?=\\W|$)`,"i"),vE=1,EE=2,Gu=class extends _E.AbstractParserWithWordBoundaryChecking{innerPattern(){return bE}innerExtract(e,t){let n=t[vE].toLowerCase(),i=t[EE].toLowerCase(),s=Lh.TIME_UNIT_DICTIONARY[i];if(n=="next"||n.startsWith("after")){let u={};return u[s]=1,Uh.ParsingComponents.createRelativeFromReference(e.reference,u)}if(n=="last"||n=="past"){let u={};return u[s]=-1,Uh.ParsingComponents.createRelativeFromReference(e.reference,u)}let a=e.createParsingComponents(),o=gE.default(e.reference.instant);return i.match(/week/i)?(o=o.add(-o.get("d"),"d"),a.imply("day",o.date()),a.imply("month",o.month()+1),a.imply("year",o.year())):i.match(/month/i)?(o=o.add(-o.date()+1,"d"),a.imply("day",o.date()),a.assign("year",o.year()),a.assign("month",o.month()+1)):i.match(/year/i)&&(o=o.add(-o.date()+1,"d"),o=o.add(-o.month(),"month"),a.imply("day",o.date()),a.imply("month",o.month()+1),a.assign("year",o.year())),a}};Ii.default=Gu});var It=p(qn=>{"use strict";Object.defineProperty(qn,"__esModule",{value:!0});qn.ParsingContext=qn.Chrono=void 0;var Un=be(),wE=Hu(),Ln=class{constructor(e){e=e||wE.createCasualConfiguration(),this.parsers=[...e.parsers],this.refiners=[...e.refiners]}clone(){return new Ln({parsers:[...this.parsers],refiners:[...this.refiners]})}parseDate(e,t,n){let i=this.parse(e,t,n);return i.length>0?i[0].start.date():null}parse(e,t,n){let i=new ha(e,t,n),s=[];return this.parsers.forEach(a=>{let o=Ln.executeParser(i,a);s=s.concat(o)}),s.sort((a,o)=>a.index-o.index),this.refiners.forEach(function(a){s=a.refine(i,s)}),s}static executeParser(e,t){let n=[],i=t.pattern(e),s=e.text,a=e.text,o=i.exec(a);for(;o;){let u=o.index+s.length-a.length;o.index=u;let l=t.extract(e,o);if(!l){a=s.substring(o.index+1),o=i.exec(a);continue}let c=null;l instanceof Un.ParsingResult?c=l:l instanceof Un.ParsingComponents?(c=e.createParsingResult(o.index,o[0]),c.start=l):c=e.createParsingResult(o.index,o[0],l),e.debug(()=>console.log(`${t.constructor.name} extracted result ${c}`)),n.push(c),a=s.substring(u+c.text.length),o=i.exec(a)}return n}};qn.Chrono=Ln;var ha=class{constructor(e,t,n){this.text=e,this.reference=new Un.ReferenceWithTimezone(t),this.option=n!=null?n:{},this.refDate=this.reference.instant}createParsingComponents(e){return e instanceof Un.ParsingComponents?e:new Un.ParsingComponents(this.reference,e)}createParsingResult(e,t,n,i){let s=typeof t=="string"?t:this.text.substring(e,t),a=n?this.createParsingComponents(n):null,o=i?this.createParsingComponents(i):null;return new Un.ParsingResult(this.reference,e,s,a,o)}debug(e){this.option.debug&&(this.option.debug instanceof Function?this.option.debug(e):this.option.debug.debug(e))}};qn.ParsingContext=ha});var Zr=p(Vu=>{"use strict";Object.defineProperty(Vu,"__esModule",{value:!0});var Wh=je(),RE=new RegExp("([^\\d]|^)([0-3]{0,1}[0-9]{1})[\\/\\.\\-]([0-3]{0,1}[0-9]{1})(?:[\\/\\.\\-]([0-9]{4}|[0-9]{2}))?(\\W|$)","i"),ma=1,Yh=5,$h=2,jh=3,zu=4,Ku=class{constructor(e){this.groupNumberMonth=e?jh:$h,this.groupNumberDay=e?$h:jh}pattern(){return RE}extract(e,t){if(t[ma]=="/"||t[Yh]=="/"){t.index+=t[0].length;return}let n=t.index+t[ma].length,i=t[0].substr(t[ma].length,t[0].length-t[ma].length-t[Yh].length);if(i.match(/^\d\.\d$/)||i.match(/^\d\.\d{1,2}\.\d{1,2}\s*$/)||!t[zu]&&t[0].indexOf("/")<0)return;let s=e.createParsingResult(n,i),a=parseInt(t[this.groupNumberMonth]),o=parseInt(t[this.groupNumberDay]);if((a<1||a>12)&&a>12)if(o>=1&&o<=12&&a<=31)[o,a]=[a,o];else return null;if(o<1||o>31)return null;if(s.start.assign("day",o),s.start.assign("month",a),t[zu]){let u=parseInt(t[zu]),l=Wh.findMostLikelyADYear(u);s.start.assign("year",l)}else{let u=Wh.findYearClosestToRef(e.refDate,o,a);s.start.imply("year",u)}return s}};Vu.default=Ku});var Gh=p(Zu=>{"use strict";Object.defineProperty(Zu,"__esModule",{value:!0});var Bh=Be(),OE=be(),DE=M(),ME=Ot(),SE=new RegExp(`(this|last|past|next|after|\\+|-)\\s*(${Bh.TIME_UNITS_PATTERN})(?=\\W|$)`,"i"),Xu=class extends DE.AbstractParserWithWordBoundaryChecking{innerPattern(){return SE}innerExtract(e,t){let n=t[1].toLowerCase(),i=Bh.parseTimeUnits(t[2]);switch(n){case"last":case"past":case"-":i=ME.reverseTimeUnits(i);break}return OE.ParsingComponents.createRelativeFromReference(e.reference,i)}};Zu.default=Xu});var zh=p(el=>{"use strict";Object.defineProperty(el,"__esModule",{value:!0});var kE=Cn(),Qu=be(),PE=Be(),AE=Ot();function Hh(r){return r.text.match(/\s+(before|from)$/i)!=null}function xE(r){return r.text.match(/\s+(after|since)$/i)!=null}var Ju=class extends kE.MergingRefiner{patternBetween(){return/^\s*$/i}shouldMergeResults(e,t,n){return!e.match(this.patternBetween())||!Hh(t)&&!xE(t)?!1:!!n.start.get("day")&&!!n.start.get("month")&&!!n.start.get("year")}mergeResults(e,t,n){let i=PE.parseTimeUnits(t.text);Hh(t)&&(i=AE.reverseTimeUnits(i));let s=Qu.ParsingComponents.createRelativeFromReference(new Qu.ReferenceWithTimezone(n.start.date()),i);return new Qu.ParsingResult(n.reference,t.index,`${t.text}${e}${n.text}`,s)}};el.default=Ju});var Hu=p(Oe=>{"use strict";var Ce=Oe&&Oe.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Oe,"__esModule",{value:!0});Oe.createConfiguration=Oe.createCasualConfiguration=Oe.parseDate=Oe.parse=Oe.GB=Oe.strict=Oe.casual=void 0;var CE=Ce(Hp()),NE=Ce(Qp()),IE=Ce(nh()),FE=Ce(ah()),UE=Ce(lh()),LE=Ce(ch()),qE=Ce(fh()),WE=Ce(ph()),YE=Ce(hh()),$E=Ce(mh()),jE=Ce(_h()),BE=ur(),GE=Ce(Ah()),HE=Ce(xh()),zE=Ce(Fh()),KE=Ce(qh()),tl=It(),VE=Ce(Zr()),XE=Ce(Gh()),ZE=Ce(zh());Oe.casual=new tl.Chrono(Kh(!1));Oe.strict=new tl.Chrono(ya(!0,!1));Oe.GB=new tl.Chrono(ya(!1,!0));function QE(r,e,t){return Oe.casual.parse(r,e,t)}Oe.parse=QE;function JE(r,e,t){return Oe.casual.parseDate(r,e,t)}Oe.parseDate=JE;function Kh(r=!1){let e=ya(!1,r);return e.parsers.unshift(new GE.default),e.parsers.unshift(new HE.default),e.parsers.unshift(new FE.default),e.parsers.unshift(new KE.default),e.parsers.unshift(new XE.default),e}Oe.createCasualConfiguration=Kh;function ya(r=!0,e=!1){return BE.includeCommonConfiguration({parsers:[new VE.default(e),new CE.default,new NE.default,new IE.default,new zE.default,new UE.default,new LE.default,new qE.default(r),new WE.default(r),new YE.default(r)],refiners:[new ZE.default,new jE.default,new $E.default]},r)}Oe.createConfiguration=ya});var Vh=p(nl=>{"use strict";Object.defineProperty(nl,"__esModule",{value:!0});var e1=Kr(),rl=class extends e1.AbstractTimeExpressionParser{primaryPrefix(){return"(?:(?:um|von)\\s*)?"}followingPhase(){return"\\s*(?:\\-|\\\u2013|\\~|\\\u301C|bis)\\s*"}extractPrimaryTimeComponents(e,t){return t[0].match(/^\s*\d{4}\s*$/)?null:super.extractPrimaryTimeComponents(e,t)}};nl.default=rl});var Fi=p(ae=>{"use strict";Object.defineProperty(ae,"__esModule",{value:!0});ae.parseTimeUnits=ae.TIME_UNITS_PATTERN=ae.parseYear=ae.YEAR_PATTERN=ae.parseNumberPattern=ae.NUMBER_PATTERN=ae.TIME_UNIT_DICTIONARY=ae.INTEGER_WORD_DICTIONARY=ae.MONTH_DICTIONARY=ae.WEEKDAY_DICTIONARY=void 0;var il=ie(),t1=je();ae.WEEKDAY_DICTIONARY={sonntag:0,so:0,montag:1,mo:1,dienstag:2,di:2,mittwoch:3,mi:3,donnerstag:4,do:4,freitag:5,fr:5,samstag:6,sa:6};ae.MONTH_DICTIONARY={januar:1,j\u00E4nner:1,janner:1,jan:1,"jan.":1,februar:2,feber:2,feb:2,"feb.":2,m\u00E4rz:3,maerz:3,m\u00E4r:3,"m\xE4r.":3,mrz:3,"mrz.":3,april:4,apr:4,"apr.":4,mai:5,juni:6,jun:6,"jun.":6,juli:7,jul:7,"jul.":7,august:8,aug:8,"aug.":8,september:9,sep:9,"sep.":9,sept:9,"sept.":9,oktober:10,okt:10,"okt.":10,november:11,nov:11,"nov.":11,dezember:12,dez:12,"dez.":12};ae.INTEGER_WORD_DICTIONARY={eins:1,eine:1,einem:1,einen:1,einer:1,zwei:2,drei:3,vier:4,f\u00FCnf:5,fuenf:5,sechs:6,sieben:7,acht:8,neun:9,zehn:10,elf:11,zw\u00F6lf:12,zwoelf:12};ae.TIME_UNIT_DICTIONARY={sek:"second",sekunde:"second",sekunden:"second",min:"minute",minute:"minute",minuten:"minute",h:"hour",std:"hour",stunde:"hour",stunden:"hour",tag:"d",tage:"d",tagen:"d",woche:"week",wochen:"week",monat:"month",monate:"month",monaten:"month",monats:"month",quartal:"quarter",quartals:"quarter",quartale:"quarter",quartalen:"quarter",a:"year",j:"year",jr:"year",jahr:"year",jahre:"year",jahren:"year",jahres:"year"};ae.NUMBER_PATTERN=`(?:${il.matchAnyPattern(ae.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?\\b(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`;function Zh(r){let e=r.toLowerCase();return ae.INTEGER_WORD_DICTIONARY[e]!==void 0?ae.INTEGER_WORD_DICTIONARY[e]:e==="a"||e==="an"?1:e.match(/few/)?3:e.match(/half/)?.5:e.match(/couple/)?2:e.match(/several/)?7:parseFloat(e)}ae.parseNumberPattern=Zh;ae.YEAR_PATTERN="(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*(?:C(?:hr)?|(?:u\\.?|d\\.?(?:\\s*g\\.?)?)?\\s*Z)\\.?|\\s*(?:u\\.?|d\\.?(?:\\s*g\\.)?)\\s*Z\\.?)?)";function r1(r){if(/v/i.test(r))return-parseInt(r.replace(/[^0-9]+/gi,""));if(/n/i.test(r))return parseInt(r.replace(/[^0-9]+/gi,""));if(/z/i.test(r))return parseInt(r.replace(/[^0-9]+/gi,""));let e=parseInt(r);return t1.findMostLikelyADYear(e)}ae.parseYear=r1;var Qh=`(${ae.NUMBER_PATTERN})\\s{0,5}(${il.matchAnyPattern(ae.TIME_UNIT_DICTIONARY)})\\s{0,5}`,Xh=new RegExp(Qh,"i");ae.TIME_UNITS_PATTERN=il.repeatedTimeunitPattern("",Qh);function n1(r){let e={},t=r,n=Xh.exec(t);for(;n;)i1(e,n),t=t.substring(n[0].length),n=Xh.exec(t);return e}ae.parseTimeUnits=n1;function i1(r,e){let t=Zh(e[1]),n=ae.TIME_UNIT_DICTIONARY[e[2].toLowerCase()];r[n]=t}});var em=p(al=>{"use strict";Object.defineProperty(al,"__esModule",{value:!0});var Jh=Fi(),s1=ie(),a1=M(),o1=Xr(),u1=new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:a[mn]\\s*?)?(?:(diese[mn]|letzte[mn]|n(?:\xE4|ae)chste[mn])\\s*)?(${s1.matchAnyPattern(Jh.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(diese|letzte|n(?:\xE4|ae)chste)\\s*woche)?(?=\\W|$)`,"i"),l1=1,c1=3,d1=2,sl=class extends a1.AbstractParserWithWordBoundaryChecking{innerPattern(){return u1}innerExtract(e,t){let n=t[d1].toLowerCase(),i=Jh.WEEKDAY_DICTIONARY[n],s=t[l1],a=t[c1],o=s||a;o=o||"",o=o.toLowerCase();let u=null;o.match(/letzte/)?u="last":o.match(/chste/)?u="next":o.match(/diese/)&&(u="this");let l=o1.toDayJSWeekday(e.refDate,i,u);return e.createParsingComponents().assign("weekday",i).imply("day",l.date()).imply("month",l.month()+1).imply("year",l.year())}};al.default=sl});var im=p(ol=>{"use strict";Object.defineProperty(ol,"__esModule",{value:!0});var Nr=ke(),f1=new RegExp("(^|\\s|T)(?:(?:um|von)\\s*)?(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s)?)?(?:\\s*Uhr)?(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?(?=\\W|$)","i"),p1=new RegExp("^\\s*(\\-|\\\u2013|\\~|\\\u301C|bis(?:\\s+um)?|\\?)\\s*(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s)?)?(?:\\s*Uhr)?(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?(?=\\W|$)","i"),h1=2,tm=3,rm=4,nm=5,Wn=class{pattern(e){return f1}extract(e,t){let n=e.createParsingResult(t.index+t[1].length,t[0].substring(t[1].length));if(n.text.match(/^\d{4}$/)||(n.start=Wn.extractTimeComponent(n.start.clone(),t),!n.start))return t.index+=t[0].length,null;let i=e.text.substring(t.index+t[0].length),s=p1.exec(i);return s&&(n.end=Wn.extractTimeComponent(n.start.clone(),s),n.end&&(n.text+=s[0])),n}static extractTimeComponent(e,t){let n=0,i=0,s=null;if(n=parseInt(t[h1]),t[tm]!=null&&(i=parseInt(t[tm])),i>=60||n>24)return null;if(n>=12&&(s=Nr.Meridiem.PM),t[nm]!=null){if(n>12)return null;let a=t[nm].toLowerCase();a.match(/morgen|vormittag/)&&(s=Nr.Meridiem.AM,n==12&&(n=0)),a.match(/nachmittag|abend/)&&(s=Nr.Meridiem.PM,n!=12&&(n+=12)),a.match(/nacht/)&&(n==12?(s=Nr.Meridiem.AM,n=0):n<6?s=Nr.Meridiem.AM:(s=Nr.Meridiem.PM,n+=12))}if(e.assign("hour",n),e.assign("minute",i),s!==null?e.assign("meridiem",s):n<12?e.imply("meridiem",Nr.Meridiem.AM):e.imply("meridiem",Nr.Meridiem.PM),t[rm]!=null){let a=parseInt(t[rm]);if(a>=60)return null;e.assign("second",a)}return e}};ol.default=Wn});var sm=p(Ui=>{"use strict";var m1=Ui&&Ui.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ui,"__esModule",{value:!0});var y1=m1(Qt()),ul=class extends y1.default{patternBetween(){return/^\s*(bis(?:\s*(?:am|zum))?|-)\s*$/i}};Ui.default=ul});var am=p(Li=>{"use strict";var g1=Li&&Li.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Li,"__esModule",{value:!0});var _1=g1(or()),ll=class extends _1.default{patternBetween(){return new RegExp("^\\s*(T|um|am|,|-)?\\s*$")}};Li.default=ll});var cl=p(Wi=>{"use strict";var T1=Wi&&Wi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Wi,"__esModule",{value:!0});var b1=T1(ee()),Qr=ke(),v1=M(),E1=Rt(),w1=Ot(),qi=class extends v1.AbstractParserWithWordBoundaryChecking{innerPattern(e){return/(diesen)?\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht)(?=\W|$)/i}innerExtract(e,t){let n=b1.default(e.refDate),i=t[2].toLowerCase(),s=e.createParsingComponents();return E1.implySimilarTime(s,n),qi.extractTimeComponents(s,i)}static extractTimeComponents(e,t){switch(t){case"morgen":e.imply("hour",6),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.AM);break;case"vormittag":e.imply("hour",9),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.AM);break;case"mittag":case"mittags":e.imply("hour",12),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.AM);break;case"nachmittag":e.imply("hour",15),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.PM);break;case"abend":e.imply("hour",18),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.PM);break;case"nacht":e.imply("hour",22),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.PM);break;case"mitternacht":e.get("hour")>1&&(e=w1.addImpliedTimeUnits(e,{day:1})),e.imply("hour",0),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.AM);break}return e}};Wi.default=qi});var lm=p(Ft=>{"use strict";var R1=Ft&&Ft.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),O1=Ft&&Ft.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),D1=Ft&&Ft.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&R1(e,r,t);return O1(e,r),e},um=Ft&&Ft.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ft,"__esModule",{value:!0});var M1=um(ee()),S1=M(),Jr=Rt(),k1=um(cl()),om=D1(cr()),P1=new RegExp("(jetzt|heute|morgen|\xFCbermorgen|uebermorgen|gestern|vorgestern|letzte\\s*nacht)(?:\\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht))?(?=\\W|$)","i"),A1=1,x1=2,dl=class extends S1.AbstractParserWithWordBoundaryChecking{innerPattern(e){return P1}innerExtract(e,t){let n=M1.default(e.refDate),i=(t[A1]||"").toLowerCase(),s=(t[x1]||"").toLowerCase(),a=e.createParsingComponents();switch(i){case"jetzt":a=om.now(e.reference);break;case"heute":a=om.today(e.reference);break;case"morgen":Jr.assignTheNextDay(a,n);break;case"\xFCbermorgen":case"uebermorgen":n=n.add(1,"day"),Jr.assignTheNextDay(a,n);break;case"gestern":n=n.add(-1,"day"),Jr.assignSimilarDate(a,n),Jr.implySimilarTime(a,n);break;case"vorgestern":n=n.add(-2,"day"),Jr.assignSimilarDate(a,n),Jr.implySimilarTime(a,n);break;default:i.match(/letzte\s*nacht/)&&(n.hour()>6&&(n=n.add(-1,"day")),Jr.assignSimilarDate(a,n),a.imply("hour",0));break}return s&&(a=k1.default.extractTimeComponents(a,s)),a}};Ft.default=dl});var mm=p(pl=>{"use strict";Object.defineProperty(pl,"__esModule",{value:!0});var C1=je(),pm=Fi(),hm=Fi(),N1=ie(),I1=M(),F1=new RegExp(`(?:am\\s*?)?(?:den\\s*?)?([0-9]{1,2})\\.(?:\\s*(?:bis(?:\\s*(?:am|zum))?|\\-|\\\u2013|\\s)\\s*([0-9]{1,2})\\.?)?\\s*(${N1.matchAnyPattern(pm.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s*)(${hm.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`,"i"),cm=1,dm=2,U1=3,fm=4,fl=class extends I1.AbstractParserWithWordBoundaryChecking{innerPattern(){return F1}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=pm.MONTH_DICTIONARY[t[U1].toLowerCase()],s=parseInt(t[cm]);if(s>31)return t.index=t.index+t[cm].length,null;if(n.start.assign("month",i),n.start.assign("day",s),t[fm]){let a=hm.parseYear(t[fm]);n.start.assign("year",a)}else{let a=C1.findYearClosestToRef(e.refDate,s,i);n.start.imply("year",a)}if(t[dm]){let a=parseInt(t[dm]);n.end=n.start.clone(),n.end.assign("day",a)}return n}};pl.default=fl});var ym=p(ml=>{"use strict";Object.defineProperty(ml,"__esModule",{value:!0});var ga=Fi(),L1=be(),q1=M(),W1=Ot(),Y1=ie(),hl=class extends q1.AbstractParserWithWordBoundaryChecking{constructor(){super()}innerPattern(){return new RegExp(`(?:\\s*((?:n\xE4chste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?|vor|in)\\s*)?(${ga.NUMBER_PATTERN})?(?:\\s*(n\xE4chste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?)?\\s*(${Y1.matchAnyPattern(ga.TIME_UNIT_DICTIONARY)})`,"i")}innerExtract(e,t){let n=t[2]?ga.parseNumberPattern(t[2]):1,i=ga.TIME_UNIT_DICTIONARY[t[4].toLowerCase()],s={};s[i]=n;let a=t[1]||t[3]||"";if(a=a.toLowerCase(),!!a)return(/vor/.test(a)||/letzte/.test(a)||/vergangen/.test(a))&&(s=W1.reverseTimeUnits(s)),L1.ParsingComponents.createRelativeFromReference(e.reference,s)}};ml.default=hl});var Tm=p(Ne=>{"use strict";var Ut=Ne&&Ne.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ne,"__esModule",{value:!0});Ne.createConfiguration=Ne.createCasualConfiguration=Ne.parseDate=Ne.parse=Ne.strict=Ne.casual=void 0;var $1=ur(),gm=It(),j1=Ut(Zr()),B1=Ut(Uu()),G1=Ut(Vh()),H1=Ut(em()),z1=Ut(im()),K1=Ut(sm()),V1=Ut(am()),X1=Ut(lm()),Z1=Ut(cl()),Q1=Ut(mm()),J1=Ut(ym());Ne.casual=new gm.Chrono(_m());Ne.strict=new gm.Chrono(yl(!0));function ew(r,e,t){return Ne.casual.parse(r,e,t)}Ne.parse=ew;function tw(r,e,t){return Ne.casual.parseDate(r,e,t)}Ne.parseDate=tw;function _m(r=!0){let e=yl(!1,r);return e.parsers.unshift(new Z1.default),e.parsers.unshift(new X1.default),e.parsers.unshift(new J1.default),e}Ne.createCasualConfiguration=_m;function yl(r=!0,e=!0){return $1.includeCommonConfiguration({parsers:[new B1.default,new j1.default(e),new G1.default,new z1.default,new Q1.default,new H1.default],refiners:[new K1.default,new V1.default]},r)}Ne.createConfiguration=yl});var vm=p(Lt=>{"use strict";var rw=Lt&&Lt.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),nw=Lt&&Lt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),iw=Lt&&Lt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&rw(e,r,t);return nw(e,r),e},sw=Lt&&Lt.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Lt,"__esModule",{value:!0});var aw=sw(ee()),ow=ke(),uw=M(),bm=Rt(),_a=iw(cr()),gl=class extends uw.AbstractParserWithWordBoundaryChecking{innerPattern(e){return/(maintenant|aujourd'hui|demain|hier|cette\s*nuit|la\s*veille)(?=\W|$)/i}innerExtract(e,t){let n=aw.default(e.refDate),i=t[0].toLowerCase(),s=e.createParsingComponents();switch(i){case"maintenant":return _a.now(e.reference);case"aujourd'hui":return _a.today(e.reference);case"hier":return _a.yesterday(e.reference);case"demain":return _a.tomorrow(e.reference);default:i.match(/cette\s*nuit/)?(bm.assignSimilarDate(s,n),s.imply("hour",22),s.imply("meridiem",ow.Meridiem.PM)):i.match(/la\s*veille/)&&(n=n.add(-1,"day"),bm.assignSimilarDate(s,n),s.imply("hour",0))}return s}};Lt.default=gl});var Em=p(Tl=>{"use strict";Object.defineProperty(Tl,"__esModule",{value:!0});var Yi=ke(),lw=M(),_l=class extends lw.AbstractParserWithWordBoundaryChecking{innerPattern(e){return/(cet?)?\s*(matin|soir|après-midi|aprem|a midi|à minuit)(?=\W|$)/i}innerExtract(e,t){let n=t[2].toLowerCase(),i=e.createParsingComponents();switch(n){case"apr\xE8s-midi":case"aprem":i.imply("hour",14),i.imply("minute",0),i.imply("meridiem",Yi.Meridiem.PM);break;case"soir":i.imply("hour",18),i.imply("minute",0),i.imply("meridiem",Yi.Meridiem.PM);break;case"matin":i.imply("hour",8),i.imply("minute",0),i.imply("meridiem",Yi.Meridiem.AM);break;case"a midi":i.imply("hour",12),i.imply("minute",0),i.imply("meridiem",Yi.Meridiem.AM);break;case"\xE0 minuit":i.imply("hour",0),i.imply("meridiem",Yi.Meridiem.AM);break}return i}};Tl.default=_l});var wm=p(vl=>{"use strict";Object.defineProperty(vl,"__esModule",{value:!0});var cw=Kr(),bl=class extends cw.AbstractTimeExpressionParser{primaryPrefix(){return"(?:(?:[\xE0a])\\s*)?"}followingPhase(){return"\\s*(?:\\-|\\\u2013|\\~|\\\u301C|[\xE0a]|\\?)\\s*"}extractPrimaryTimeComponents(e,t){return t[0].match(/^\s*\d{4}\s*$/)?null:super.extractPrimaryTimeComponents(e,t)}};vl.default=bl});var Rm=p($i=>{"use strict";var dw=$i&&$i.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty($i,"__esModule",{value:!0});var fw=dw(or()),El=class extends fw.default{patternBetween(){return new RegExp("^\\s*(T|\xE0|a|vers|de|,|-)?\\s*$")}};$i.default=El});var Om=p(ji=>{"use strict";var pw=ji&&ji.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ji,"__esModule",{value:!0});var hw=pw(Qt()),wl=class extends hw.default{patternBetween(){return/^\s*(à|a|-)\s*$/i}};ji.default=wl});var Ir=p(te=>{"use strict";Object.defineProperty(te,"__esModule",{value:!0});te.parseTimeUnits=te.TIME_UNITS_PATTERN=te.parseYear=te.YEAR_PATTERN=te.parseOrdinalNumberPattern=te.ORDINAL_NUMBER_PATTERN=te.parseNumberPattern=te.NUMBER_PATTERN=te.TIME_UNIT_DICTIONARY=te.INTEGER_WORD_DICTIONARY=te.MONTH_DICTIONARY=te.WEEKDAY_DICTIONARY=void 0;var Rl=ie();te.WEEKDAY_DICTIONARY={dimanche:0,dim:0,lundi:1,lun:1,mardi:2,mar:2,mercredi:3,mer:3,jeudi:4,jeu:4,vendredi:5,ven:5,samedi:6,sam:6};te.MONTH_DICTIONARY={janvier:1,jan:1,"jan.":1,f\u00E9vrier:2,f\u00E9v:2,"f\xE9v.":2,fevrier:2,fev:2,"fev.":2,mars:3,mar:3,"mar.":3,avril:4,avr:4,"avr.":4,mai:5,juin:6,jun:6,juillet:7,juil:7,jul:7,"jul.":7,ao\u00FBt:8,aout:8,septembre:9,sep:9,"sep.":9,sept:9,"sept.":9,octobre:10,oct:10,"oct.":10,novembre:11,nov:11,"nov.":11,d\u00E9cembre:12,decembre:12,dec:12,"dec.":12};te.INTEGER_WORD_DICTIONARY={un:1,deux:2,trois:3,quatre:4,cinq:5,six:6,sept:7,huit:8,neuf:9,dix:10,onze:11,douze:12,treize:13};te.TIME_UNIT_DICTIONARY={sec:"second",seconde:"second",secondes:"second",min:"minute",mins:"minute",minute:"minute",minutes:"minute",h:"hour",hr:"hour",hrs:"hour",heure:"hour",heures:"hour",jour:"d",jours:"d",semaine:"week",semaines:"week",mois:"month",trimestre:"quarter",trimestres:"quarter",ans:"year",ann\u00E9e:"year",ann\u00E9es:"year"};te.NUMBER_PATTERN=`(?:${Rl.matchAnyPattern(te.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|une?\\b|quelques?|demi-?)`;function Mm(r){let e=r.toLowerCase();return te.INTEGER_WORD_DICTIONARY[e]!==void 0?te.INTEGER_WORD_DICTIONARY[e]:e==="une"||e==="un"?1:e.match(/quelques?/)?3:e.match(/demi-?/)?.5:parseFloat(e)}te.parseNumberPattern=Mm;te.ORDINAL_NUMBER_PATTERN="(?:[0-9]{1,2}(?:er)?)";function mw(r){let e=r.toLowerCase();return e=e.replace(/(?:er)$/i,""),parseInt(e)}te.parseOrdinalNumberPattern=mw;te.YEAR_PATTERN="(?:[1-9][0-9]{0,3}\\s*(?:AC|AD|p\\.\\s*C(?:hr?)?\\.\\s*n\\.)|[1-2][0-9]{3}|[5-9][0-9])";function yw(r){if(/AC/i.test(r))return r=r.replace(/BC/i,""),-parseInt(r);if(/AD/i.test(r)||/C/i.test(r))return r=r.replace(/[^\d]+/i,""),parseInt(r);let e=parseInt(r);return e<100&&(e>50?e=e+1900:e=e+2e3),e}te.parseYear=yw;var Sm=`(${te.NUMBER_PATTERN})\\s{0,5}(${Rl.matchAnyPattern(te.TIME_UNIT_DICTIONARY)})\\s{0,5}`,Dm=new RegExp(Sm,"i");te.TIME_UNITS_PATTERN=Rl.repeatedTimeunitPattern("",Sm);function gw(r){let e={},t=r,n=Dm.exec(t);for(;n;)_w(e,n),t=t.substring(n[0].length),n=Dm.exec(t);return e}te.parseTimeUnits=gw;function _w(r,e){let t=Mm(e[1]),n=te.TIME_UNIT_DICTIONARY[e[2].toLowerCase()];r[n]=t}});var Pm=p(Dl=>{"use strict";Object.defineProperty(Dl,"__esModule",{value:!0});var km=Ir(),Tw=ie(),bw=M(),vw=Xr(),Ew=new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:(?:ce)\\s*)?(${Tw.matchAnyPattern(km.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(dernier|prochain)\\s*)?(?=\\W|\\d|$)`,"i"),ww=1,Rw=2,Ol=class extends bw.AbstractParserWithWordBoundaryChecking{innerPattern(){return Ew}innerExtract(e,t){let n=t[ww].toLowerCase(),i=km.WEEKDAY_DICTIONARY[n];if(i===void 0)return null;let s=t[Rw];s=s||"",s=s.toLowerCase();let a=null;s=="dernier"?a="last":s=="prochain"&&(a="next");let o=vw.toDayJSWeekday(e.refDate,i,a);return e.createParsingComponents().assign("weekday",i).imply("day",o.date()).imply("month",o.month()+1).imply("year",o.year())}};Dl.default=Ol});var Nm=p(Ml=>{"use strict";Object.defineProperty(Ml,"__esModule",{value:!0});var Bi=ke(),Ow=new RegExp("(^|\\s|T)(?:(?:[\xE0a])\\s*)?(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s|:)?)?(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?(?=\\W|$)","i"),Dw=new RegExp("^\\s*(\\-|\\\u2013|\\~|\\\u301C|[\xE0a]|\\?)\\s*(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s|:)?)?(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?(?=\\W|$)","i"),Mw=2,Am=3,xm=4,Cm=5,Yn=class{pattern(e){return Ow}extract(e,t){let n=e.createParsingResult(t.index+t[1].length,t[0].substring(t[1].length));if(n.text.match(/^\d{4}$/)||(n.start=Yn.extractTimeComponent(n.start.clone(),t),!n.start))return t.index+=t[0].length,null;let i=e.text.substring(t.index+t[0].length),s=Dw.exec(i);return s&&(n.end=Yn.extractTimeComponent(n.start.clone(),s),n.end&&(n.text+=s[0])),n}static extractTimeComponent(e,t){let n=0,i=0,s=null;if(n=parseInt(t[Mw]),t[Am]!=null&&(i=parseInt(t[Am])),i>=60||n>24)return null;if(n>=12&&(s=Bi.Meridiem.PM),t[Cm]!=null){if(n>12)return null;let a=t[Cm][0].toLowerCase();a=="a"&&(s=Bi.Meridiem.AM,n==12&&(n=0)),a=="p"&&(s=Bi.Meridiem.PM,n!=12&&(n+=12))}if(e.assign("hour",n),e.assign("minute",i),s!==null?e.assign("meridiem",s):n<12?e.imply("meridiem",Bi.Meridiem.AM):e.imply("meridiem",Bi.Meridiem.PM),t[xm]!=null){let a=parseInt(t[xm]);if(a>=60)return null;e.assign("second",a)}return e}};Ml.default=Yn});var Wm=p(kl=>{"use strict";Object.defineProperty(kl,"__esModule",{value:!0});var Sw=je(),Lm=Ir(),qm=Ir(),Ta=Ir(),kw=ie(),Pw=M(),Aw=new RegExp(`(?:on\\s*?)?(${Ta.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:au|\\-|\\\u2013|jusqu'au?|\\s)\\s*(${Ta.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:de)?\\s*)(${kw.matchAnyPattern(Lm.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s*)(${qm.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`,"i"),Im=1,Fm=2,xw=3,Um=4,Sl=class extends Pw.AbstractParserWithWordBoundaryChecking{innerPattern(){return Aw}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=Lm.MONTH_DICTIONARY[t[xw].toLowerCase()],s=Ta.parseOrdinalNumberPattern(t[Im]);if(s>31)return t.index=t.index+t[Im].length,null;if(n.start.assign("month",i),n.start.assign("day",s),t[Um]){let a=qm.parseYear(t[Um]);n.start.assign("year",a)}else{let a=Sw.findYearClosestToRef(e.refDate,s,i);n.start.imply("year",a)}if(t[Fm]){let a=Ta.parseOrdinalNumberPattern(t[Fm]);n.end=n.start.clone(),n.end.assign("day",a)}return n}};kl.default=Sl});var $m=p(Al=>{"use strict";Object.defineProperty(Al,"__esModule",{value:!0});var Ym=Ir(),Cw=be(),Nw=M(),Iw=Ot(),Pl=class extends Nw.AbstractParserWithWordBoundaryChecking{constructor(){super()}innerPattern(){return new RegExp(`il y a\\s*(${Ym.TIME_UNITS_PATTERN})(?=(?:\\W|$))`,"i")}innerExtract(e,t){let n=Ym.parseTimeUnits(t[1]),i=Iw.reverseTimeUnits(n);return Cw.ParsingComponents.createRelativeFromReference(e.reference,i)}};Al.default=Pl});var Bm=p(Cl=>{"use strict";Object.defineProperty(Cl,"__esModule",{value:!0});var jm=Ir(),Fw=be(),Uw=M(),xl=class extends Uw.AbstractParserWithWordBoundaryChecking{innerPattern(){return new RegExp(`(?:dans|en|pour|pendant|de)\\s*(${jm.TIME_UNITS_PATTERN})(?=\\W|$)`,"i")}innerExtract(e,t){let n=jm.parseTimeUnits(t[1]);return Fw.ParsingComponents.createRelativeFromReference(e.reference,n)}};Cl.default=xl});var Gm=p(Il=>{"use strict";Object.defineProperty(Il,"__esModule",{value:!0});var ba=Ir(),Lw=be(),qw=M(),Ww=Ot(),Yw=ie(),Nl=class extends qw.AbstractParserWithWordBoundaryChecking{constructor(){super()}innerPattern(){return new RegExp(`(?:les?|la|l'|du|des?)\\s*(${ba.NUMBER_PATTERN})?(?:\\s*(prochaine?s?|derni[e\xE8]re?s?|pass[\xE9e]e?s?|pr[\xE9e]c[\xE9e]dents?|suivante?s?))?\\s*(${Yw.matchAnyPattern(ba.TIME_UNIT_DICTIONARY)})(?:\\s*(prochaine?s?|derni[e\xE8]re?s?|pass[\xE9e]e?s?|pr[\xE9e]c[\xE9e]dents?|suivante?s?))?`,"i")}innerExtract(e,t){let n=t[1]?ba.parseNumberPattern(t[1]):1,i=ba.TIME_UNIT_DICTIONARY[t[3].toLowerCase()],s={};s[i]=n;let a=t[2]||t[4]||"";if(a=a.toLowerCase(),!!a)return(/derni[eè]re?s?/.test(a)||/pass[ée]e?s?/.test(a)||/pr[ée]c[ée]dents?/.test(a))&&(s=Ww.reverseTimeUnits(s)),Lw.ParsingComponents.createRelativeFromReference(e.reference,s)}};Il.default=Nl});var Km=p(Ie=>{"use strict";var Dt=Ie&&Ie.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ie,"__esModule",{value:!0});Ie.createConfiguration=Ie.createCasualConfiguration=Ie.parseDate=Ie.parse=Ie.strict=Ie.casual=void 0;var $w=ur(),Hm=It(),jw=Dt(vm()),Bw=Dt(Em()),Gw=Dt(Zr()),Hw=Dt(wm()),zw=Dt(Rm()),Kw=Dt(Om()),Vw=Dt(Pm()),Xw=Dt(Nm()),Zw=Dt(Wm()),Qw=Dt($m()),Jw=Dt(Bm()),e0=Dt(Gm());Ie.casual=new Hm.Chrono(zm());Ie.strict=new Hm.Chrono(Fl(!0));function t0(r,e,t){return Ie.casual.parse(r,e,t)}Ie.parse=t0;function r0(r,e,t){return Ie.casual.parseDate(r,e,t)}Ie.parseDate=r0;function zm(r=!0){let e=Fl(!1,r);return e.parsers.unshift(new jw.default),e.parsers.unshift(new Bw.default),e.parsers.unshift(new e0.default),e}Ie.createCasualConfiguration=zm;function Fl(r=!0,e=!0){return $w.includeCommonConfiguration({parsers:[new Gw.default(e),new Zw.default,new Hw.default,new Xw.default,new Qw.default,new Jw.default,new Vw.default],refiners:[new zw.default,new Kw.default]},r)}Ie.createConfiguration=Fl});var Vm=p(va=>{"use strict";Object.defineProperty(va,"__esModule",{value:!0});va.toHankaku=void 0;function n0(r){return String(r).replace(/\u2019/g,"'").replace(/\u201D/g,'"').replace(/\u3000/g," ").replace(/\uFFE5/g,"\xA5").replace(/[\uFF01\uFF03-\uFF06\uFF08\uFF09\uFF0C-\uFF19\uFF1C-\uFF1F\uFF21-\uFF3B\uFF3D\uFF3F\uFF41-\uFF5B\uFF5D\uFF5E]/g,i0)}va.toHankaku=n0;function i0(r){return String.fromCharCode(r.charCodeAt(0)-65248)}});var Zm=p(Gi=>{"use strict";var s0=Gi&&Gi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Gi,"__esModule",{value:!0});var Ul=Vm(),a0=je(),o0=s0(ee()),u0=/(?:(?:([同今本])|((昭和|平成|令和)?([0-90-9]{1,4}|元)))年\s*)?([0-90-9]{1,2})月\s*([0-90-9]{1,2})日/i,Xm=1,l0=2,Ll=3,c0=4,d0=5,f0=6,ql=class{pattern(){return u0}extract(e,t){let n=parseInt(Ul.toHankaku(t[d0])),i=parseInt(Ul.toHankaku(t[f0])),s=e.createParsingComponents({day:i,month:n});if(t[Xm]&&t[Xm].match("\u540C|\u4ECA|\u672C")){let a=o0.default(e.refDate);s.assign("year",a.year())}if(t[l0]){let a=t[c0],o=a=="\u5143"?1:parseInt(Ul.toHankaku(a));t[Ll]=="\u4EE4\u548C"?o+=2018:t[Ll]=="\u5E73\u6210"?o+=1988:t[Ll]=="\u662D\u548C"&&(o+=1925),s.assign("year",o)}else{let a=a0.findYearClosestToRef(e.refDate,i,n);s.imply("year",a)}return s}};Gi.default=ql});var Qm=p(Hi=>{"use strict";var p0=Hi&&Hi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Hi,"__esModule",{value:!0});var h0=p0(Qt()),Wl=class extends h0.default{patternBetween(){return/^\s*(から|ー|-)\s*$/i}};Hi.default=Wl});var ey=p(qt=>{"use strict";var m0=qt&&qt.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),y0=qt&&qt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),g0=qt&&qt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&m0(e,r,t);return y0(e,r),e},_0=qt&&qt.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(qt,"__esModule",{value:!0});var T0=_0(ee()),Jm=ke(),Yl=g0(cr()),b0=/今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i,$l=class{pattern(){return b0}extract(e,t){let n=t[0],i=T0.default(e.refDate),s=e.createParsingComponents();switch(n){case"\u6628\u65E5":return Yl.yesterday(e.reference);case"\u660E\u65E5":return Yl.tomorrow(e.reference);case"\u4ECA\u65E5":case"\u5F53\u65E5":return Yl.today(e.reference)}return n=="\u4ECA\u591C"||n=="\u4ECA\u5915"||n=="\u4ECA\u6669"?(s.imply("hour",22),s.assign("meridiem",Jm.Meridiem.PM)):n.match("\u4ECA\u671D")&&(s.imply("hour",6),s.assign("meridiem",Jm.Meridiem.AM)),s.assign("day",i.date()),s.assign("month",i.month()+1),s.assign("year",i.year()),s}};qt.default=$l});var ny=p(Fe=>{"use strict";var jl=Fe&&Fe.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Fe,"__esModule",{value:!0});Fe.createConfiguration=Fe.createCasualConfiguration=Fe.parseDate=Fe.parse=Fe.strict=Fe.casual=void 0;var v0=jl(Zm()),E0=jl(Qm()),w0=jl(ey()),ty=It();Fe.casual=new ty.Chrono(ry());Fe.strict=new ty.Chrono(Bl());function R0(r,e,t){return Fe.casual.parse(r,e,t)}Fe.parse=R0;function O0(r,e,t){return Fe.casual.parseDate(r,e,t)}Fe.parseDate=O0;function ry(){let r=Bl();return r.parsers.unshift(new w0.default),r}Fe.createCasualConfiguration=ry;function Bl(){return{parsers:[new v0.default],refiners:[new E0.default]}}Fe.createConfiguration=Bl});var Ea=p(er=>{"use strict";Object.defineProperty(er,"__esModule",{value:!0});er.parseYear=er.YEAR_PATTERN=er.MONTH_DICTIONARY=er.WEEKDAY_DICTIONARY=void 0;er.WEEKDAY_DICTIONARY={domingo:0,dom:0,segunda:1,"segunda-feira":1,seg:1,ter\u00E7a:2,"ter\xE7a-feira":2,ter:2,quarta:3,"quarta-feira":3,qua:3,quinta:4,"quinta-feira":4,qui:4,sexta:5,"sexta-feira":5,sex:5,s\u00E1bado:6,sabado:6,sab:6};er.MONTH_DICTIONARY={janeiro:1,jan:1,"jan.":1,fevereiro:2,fev:2,"fev.":2,mar\u00E7o:3,mar:3,"mar.":3,abril:4,abr:4,"abr.":4,maio:5,mai:5,"mai.":5,junho:6,jun:6,"jun.":6,julho:7,jul:7,"jul.":7,agosto:8,ago:8,"ago.":8,setembro:9,set:9,"set.":9,outubro:10,out:10,"out.":10,novembro:11,nov:11,"nov.":11,dezembro:12,dez:12,"dez.":12};er.YEAR_PATTERN="[0-9]{1,4}(?![^\\s]\\d)(?:\\s*[a|d]\\.?\\s*c\\.?|\\s*a\\.?\\s*d\\.?)?";function D0(r){if(r.match(/^[0-9]{1,4}$/)){let e=parseInt(r);return e<100&&(e>50?e=e+1900:e=e+2e3),e}return r.match(/a\.?\s*c\.?/i)?(r=r.replace(/a\.?\s*c\.?/i,""),-parseInt(r)):parseInt(r)}er.parseYear=D0});var sy=p(Hl=>{"use strict";Object.defineProperty(Hl,"__esModule",{value:!0});var iy=Ea(),M0=ie(),S0=M(),k0=Xr(),P0=new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:(este|esta|passado|pr[o\xF3]ximo)\\s*)?(${M0.matchAnyPattern(iy.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(este|esta|passado|pr[\xF3o]ximo)\\s*semana)?(?=\\W|\\d|$)`,"i"),A0=1,x0=2,C0=3,Gl=class extends S0.AbstractParserWithWordBoundaryChecking{innerPattern(){return P0}innerExtract(e,t){let n=t[x0].toLowerCase(),i=iy.WEEKDAY_DICTIONARY[n];if(i===void 0)return null;let s=t[A0],a=t[C0],o=s||a||"";o=o.toLowerCase();let u=null;o=="passado"?u="this":o=="pr\xF3ximo"||o=="proximo"?u="next":o=="este"&&(u="this");let l=k0.toDayJSWeekday(e.refDate,i,u);return e.createParsingComponents().assign("weekday",i).imply("day",l.date()).imply("month",l.month()+1).imply("year",l.year())}};Hl.default=Gl});var ay=p(Kl=>{"use strict";Object.defineProperty(Kl,"__esModule",{value:!0});var N0=Kr(),zl=class extends N0.AbstractTimeExpressionParser{primaryPrefix(){return"(?:(?:ao?|\xE0s?|das|da|de|do)\\s*)?"}followingPhase(){return"\\s*(?:\\-|\\\u2013|\\~|\\\u301C|a(?:o)?|\\?)\\s*"}};Kl.default=zl});var oy=p(zi=>{"use strict";var I0=zi&&zi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(zi,"__esModule",{value:!0});var F0=I0(or()),Vl=class extends F0.default{patternBetween(){return new RegExp("^\\s*(?:,|\xE0)?\\s*$")}};zi.default=Vl});var uy=p(Ki=>{"use strict";var U0=Ki&&Ki.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ki,"__esModule",{value:!0});var L0=U0(Qt()),Xl=class extends L0.default{patternBetween(){return/^\s*(?:-)\s*$/i}};Ki.default=Xl});var hy=p(Ql=>{"use strict";Object.defineProperty(Ql,"__esModule",{value:!0});var q0=je(),fy=Ea(),py=Ea(),W0=ie(),Y0=M(),$0=new RegExp(`([0-9]{1,2})(?:\xBA|\xAA|\xB0)?(?:\\s*(?:desde|de|\\-|\\\u2013|ao?|\\s)\\s*([0-9]{1,2})(?:\xBA|\xAA|\xB0)?)?\\s*(?:de)?\\s*(?:-|/|\\s*(?:de|,)?\\s*)(${W0.matchAnyPattern(fy.MONTH_DICTIONARY)})(?:\\s*(?:de|,)?\\s*(${py.YEAR_PATTERN}))?(?=\\W|$)`,"i"),ly=1,cy=2,j0=3,dy=4,Zl=class extends Y0.AbstractParserWithWordBoundaryChecking{innerPattern(){return $0}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=fy.MONTH_DICTIONARY[t[j0].toLowerCase()],s=parseInt(t[ly]);if(s>31)return t.index=t.index+t[ly].length,null;if(n.start.assign("month",i),n.start.assign("day",s),t[dy]){let a=py.parseYear(t[dy]);n.start.assign("year",a)}else{let a=q0.findYearClosestToRef(e.refDate,s,i);n.start.imply("year",a)}if(t[cy]){let a=parseInt(t[cy]);n.end=n.start.clone(),n.end.assign("day",a)}return n}};Ql.default=Zl});var my=p(dr=>{"use strict";var B0=dr&&dr.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),G0=dr&&dr.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),H0=dr&&dr.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&B0(e,r,t);return G0(e,r),e};Object.defineProperty(dr,"__esModule",{value:!0});var z0=M(),wa=H0(cr()),Jl=class extends z0.AbstractParserWithWordBoundaryChecking{innerPattern(e){return/(agora|hoje|amanha|amanhã|ontem)(?=\W|$)/i}innerExtract(e,t){let n=t[0].toLowerCase(),i=e.createParsingComponents();switch(n){case"agora":return wa.now(e.reference);case"hoje":return wa.today(e.reference);case"amanha":case"amanh\xE3":return wa.tomorrow(e.reference);case"ontem":return wa.yesterday(e.reference)}return i}};dr.default=Jl});var yy=p(Vi=>{"use strict";var K0=Vi&&Vi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Vi,"__esModule",{value:!0});var Ra=ke(),V0=M(),X0=Rt(),Z0=K0(ee()),ec=class extends V0.AbstractParserWithWordBoundaryChecking{innerPattern(){return/(?:esta\s*)?(manha|manhã|tarde|meia-noite|meio-dia|noite)(?=\W|$)/i}innerExtract(e,t){let n=Z0.default(e.refDate),i=e.createParsingComponents();switch(t[1].toLowerCase()){case"tarde":i.imply("meridiem",Ra.Meridiem.PM),i.imply("hour",15);break;case"noite":i.imply("meridiem",Ra.Meridiem.PM),i.imply("hour",22);break;case"manha":case"manh\xE3":i.imply("meridiem",Ra.Meridiem.AM),i.imply("hour",6);break;case"meia-noite":X0.assignTheNextDay(i,n),i.imply("hour",0),i.imply("minute",0),i.imply("second",0);break;case"meio-dia":i.imply("meridiem",Ra.Meridiem.AM),i.imply("hour",12);break}return i}};Vi.default=ec});var Ty=p(Ue=>{"use strict";var Fr=Ue&&Ue.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ue,"__esModule",{value:!0});Ue.createConfiguration=Ue.createCasualConfiguration=Ue.parseDate=Ue.parse=Ue.strict=Ue.casual=void 0;var Q0=ur(),gy=It(),J0=Fr(Zr()),eR=Fr(sy()),tR=Fr(ay()),rR=Fr(oy()),nR=Fr(uy()),iR=Fr(hy()),sR=Fr(my()),aR=Fr(yy());Ue.casual=new gy.Chrono(_y());Ue.strict=new gy.Chrono(tc(!0));function oR(r,e,t){return Ue.casual.parse(r,e,t)}Ue.parse=oR;function uR(r,e,t){return Ue.casual.parseDate(r,e,t)}Ue.parseDate=uR;function _y(r=!0){let e=tc(!1,r);return e.parsers.push(new sR.default),e.parsers.push(new aR.default),e}Ue.createCasualConfiguration=_y;function tc(r=!0,e=!0){return Q0.includeCommonConfiguration({parsers:[new J0.default(e),new eR.default,new tR.default,new iR.default],refiners:[new rR.default,new nR.default]},r)}Ue.createConfiguration=tc});var by=p(Xi=>{"use strict";var lR=Xi&&Xi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Xi,"__esModule",{value:!0});var cR=lR(Qt()),rc=class extends cR.default{patternBetween(){return/^\s*(tot|-)\s*$/i}};Xi.default=rc});var vy=p(Zi=>{"use strict";var dR=Zi&&Zi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Zi,"__esModule",{value:!0});var fR=dR(or()),nc=class extends fR.default{patternBetween(){return new RegExp("^\\s*(om|na|voor|in de|,|-)?\\s*$")}};Zi.default=nc});var Ey=p(fr=>{"use strict";var pR=fr&&fr.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),hR=fr&&fr.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),mR=fr&&fr.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&pR(e,r,t);return hR(e,r),e};Object.defineProperty(fr,"__esModule",{value:!0});var yR=M(),Oa=mR(cr()),ic=class extends yR.AbstractParserWithWordBoundaryChecking{innerPattern(e){return/(nu|vandaag|morgen|morgend|gisteren)(?=\W|$)/i}innerExtract(e,t){let n=t[0].toLowerCase(),i=e.createParsingComponents();switch(n){case"nu":return Oa.now(e.reference);case"vandaag":return Oa.today(e.reference);case"morgen":case"morgend":return Oa.tomorrow(e.reference);case"gisteren":return Oa.yesterday(e.reference)}return i}};fr.default=ic});var wy=p(Qi=>{"use strict";var gR=Qi&&Qi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Qi,"__esModule",{value:!0});var Da=ke(),_R=M(),TR=gR(ee()),bR=Rt(),vR=1,ER=2,sc=class extends _R.AbstractParserWithWordBoundaryChecking{innerPattern(){return/(deze)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i}innerExtract(e,t){let n=TR.default(e.refDate),i=e.createParsingComponents();switch(t[vR]==="deze"&&(i.assign("day",e.refDate.getDate()),i.assign("month",e.refDate.getMonth()+1),i.assign("year",e.refDate.getFullYear())),t[ER].toLowerCase()){case"namiddag":case"'s namiddags":i.imply("meridiem",Da.Meridiem.PM),i.imply("hour",15);break;case"avond":case"'s avonds'":i.imply("meridiem",Da.Meridiem.PM),i.imply("hour",20);break;case"middernacht":bR.assignTheNextDay(i,n),i.imply("hour",0),i.imply("minute",0),i.imply("second",0);break;case"ochtend":case"'s ochtends":i.imply("meridiem",Da.Meridiem.AM),i.imply("hour",6);break;case"middag":case"'s middags":i.imply("meridiem",Da.Meridiem.AM),i.imply("hour",12);break}return i}};Qi.default=sc});var pt=p(K=>{"use strict";Object.defineProperty(K,"__esModule",{value:!0});K.parseTimeUnits=K.TIME_UNITS_PATTERN=K.parseYear=K.YEAR_PATTERN=K.parseOrdinalNumberPattern=K.ORDINAL_NUMBER_PATTERN=K.parseNumberPattern=K.NUMBER_PATTERN=K.TIME_UNIT_DICTIONARY=K.ORDINAL_WORD_DICTIONARY=K.INTEGER_WORD_DICTIONARY=K.MONTH_DICTIONARY=K.WEEKDAY_DICTIONARY=void 0;var Ma=ie(),wR=je();K.WEEKDAY_DICTIONARY={zondag:0,zon:0,"zon.":0,zo:0,"zo.":0,maandag:1,ma:1,"ma.":1,dinsdag:2,din:2,"din.":2,di:2,"di.":2,woensdag:3,woe:3,"woe.":3,wo:3,"wo.":3,donderdag:4,dond:4,"dond.":4,do:4,"do.":4,vrijdag:5,vrij:5,"vrij.":5,vr:5,"vr.":5,zaterdag:6,zat:6,"zat.":6,za:6,"za.":6};K.MONTH_DICTIONARY={januari:1,jan:1,"jan.":1,februari:2,feb:2,"feb.":2,maart:3,mar:3,"mar.":3,april:4,apr:4,"apr.":4,mei:5,juni:6,jun:6,"jun.":6,juli:7,jul:7,"jul.":7,augustus:8,aug:8,"aug.":8,september:9,sep:9,"sep.":9,sept:9,"sept.":9,oktober:10,okt:10,"okt.":10,november:11,nov:11,"nov.":11,december:12,dec:12,"dec.":12};K.INTEGER_WORD_DICTIONARY={een:1,twee:2,drie:3,vier:4,vijf:5,zes:6,zeven:7,acht:8,negen:9,tien:10,elf:11,twaalf:12};K.ORDINAL_WORD_DICTIONARY={eerste:1,tweede:2,derde:3,vierde:4,vijfde:5,zesde:6,zevende:7,achtste:8,negende:9,tiende:10,elfde:11,twaalfde:12,dertiende:13,veertiende:14,vijftiende:15,zestiende:16,zeventiende:17,achttiende:18,negentiende:19,twintigste:20,eenentwintigste:21,twee\u00EBntwintigste:22,drieentwintigste:23,vierentwintigste:24,vijfentwintigste:25,zesentwintigste:26,zevenentwintigste:27,achtentwintig:28,negenentwintig:29,dertigste:30,eenendertigste:31};K.TIME_UNIT_DICTIONARY={sec:"second",second:"second",seconden:"second",min:"minute",mins:"minute",minute:"minute",minuut:"minute",minuten:"minute",minuutje:"minute",h:"hour",hr:"hour",hrs:"hour",uur:"hour",u:"hour",uren:"hour",dag:"d",dagen:"d",week:"week",weken:"week",maand:"month",maanden:"month",jaar:"year",jr:"year",jaren:"year"};K.NUMBER_PATTERN=`(?:${Ma.matchAnyPattern(K.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+[\\.,][0-9]+|halve?|half|paar)`;function Oy(r){let e=r.toLowerCase();return K.INTEGER_WORD_DICTIONARY[e]!==void 0?K.INTEGER_WORD_DICTIONARY[e]:e==="paar"?2:e==="half"||e.match(/halve?/)?.5:parseFloat(e.replace(",","."))}K.parseNumberPattern=Oy;K.ORDINAL_NUMBER_PATTERN=`(?:${Ma.matchAnyPattern(K.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:ste|de)?)`;function RR(r){let e=r.toLowerCase();return K.ORDINAL_WORD_DICTIONARY[e]!==void 0?K.ORDINAL_WORD_DICTIONARY[e]:(e=e.replace(/(?:ste|de)$/i,""),parseInt(e))}K.parseOrdinalNumberPattern=RR;K.YEAR_PATTERN="(?:[1-9][0-9]{0,3}\\s*(?:voor Christus|na Christus)|[1-2][0-9]{3}|[5-9][0-9])";function OR(r){if(/voor Christus/i.test(r))return r=r.replace(/voor Christus/i,""),-parseInt(r);if(/na Christus/i.test(r))return r=r.replace(/na Christus/i,""),parseInt(r);let e=parseInt(r);return wR.findMostLikelyADYear(e)}K.parseYear=OR;var Dy=`(${K.NUMBER_PATTERN})\\s{0,5}(${Ma.matchAnyPattern(K.TIME_UNIT_DICTIONARY)})\\s{0,5}`,Ry=new RegExp(Dy,"i");K.TIME_UNITS_PATTERN=Ma.repeatedTimeunitPattern("(?:(?:binnen|in)\\s*)?",Dy);function DR(r){let e={},t=r,n=Ry.exec(t);for(;n;)MR(e,n),t=t.substring(n[0].length),n=Ry.exec(t);return e}K.parseTimeUnits=DR;function MR(r,e){let t=Oy(e[1]),n=K.TIME_UNIT_DICTIONARY[e[2].toLowerCase()];r[n]=t}});var Sy=p(oc=>{"use strict";Object.defineProperty(oc,"__esModule",{value:!0});var My=pt(),SR=be(),kR=M(),ac=class extends kR.AbstractParserWithWordBoundaryChecking{innerPattern(){return new RegExp("(?:binnen|in|binnen de|voor)\\s*("+My.TIME_UNITS_PATTERN+")(?=\\W|$)","i")}innerExtract(e,t){let n=My.parseTimeUnits(t[1]);return SR.ParsingComponents.createRelativeFromReference(e.reference,n)}};oc.default=ac});var Py=p(lc=>{"use strict";Object.defineProperty(lc,"__esModule",{value:!0});var ky=pt(),PR=ie(),AR=M(),xR=Xr(),CR=new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:op\\s*?)?(?:(deze|vorige|volgende)\\s*(?:week\\s*)?)?(${PR.matchAnyPattern(ky.WEEKDAY_DICTIONARY)})(?=\\W|$)`,"i"),NR=1,IR=2,FR=3,uc=class extends AR.AbstractParserWithWordBoundaryChecking{innerPattern(){return CR}innerExtract(e,t){let n=t[IR].toLowerCase(),i=ky.WEEKDAY_DICTIONARY[n],s=t[NR],a=t[FR],o=s||a;o=o||"",o=o.toLowerCase();let u=null;o=="vorige"?u="last":o=="volgende"?u="next":o=="deze"&&(u="this");let l=xR.toDayJSWeekday(e.refDate,i,u);return e.createParsingComponents().assign("weekday",i).imply("day",l.date()).imply("month",l.month()+1).imply("year",l.year())}};lc.default=uc});var Fy=p(dc=>{"use strict";Object.defineProperty(dc,"__esModule",{value:!0});var UR=je(),Ny=pt(),Sa=pt(),Iy=pt(),LR=ie(),qR=M(),WR=new RegExp(`(?:on\\s*?)?(${Sa.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:tot|\\-|\\\u2013|until|through|till|\\s)\\s*(${Sa.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:of)?\\s*)(`+LR.matchAnyPattern(Ny.MONTH_DICTIONARY)+`)(?:(?:-|/|,?\\s*)(${Iy.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`,"i"),YR=3,Ay=1,xy=2,Cy=4,cc=class extends qR.AbstractParserWithWordBoundaryChecking{innerPattern(){return WR}innerExtract(e,t){let n=Ny.MONTH_DICTIONARY[t[YR].toLowerCase()],i=Sa.parseOrdinalNumberPattern(t[Ay]);if(i>31)return t.index=t.index+t[Ay].length,null;let s=e.createParsingComponents({day:i,month:n});if(t[Cy]){let u=Iy.parseYear(t[Cy]);s.assign("year",u)}else{let u=UR.findYearClosestToRef(e.refDate,i,n);s.imply("year",u)}if(!t[xy])return s;let a=Sa.parseOrdinalNumberPattern(t[xy]),o=e.createParsingResult(t.index,t[0]);return o.start=s,o.end=s.clone(),o.end.assign("day",a),o}};dc.default=cc});var Wy=p(pc=>{"use strict";Object.defineProperty(pc,"__esModule",{value:!0});var Ly=pt(),$R=je(),jR=ie(),qy=pt(),BR=M(),GR=new RegExp(`(${jR.matchAnyPattern(Ly.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${qy.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`,"i"),HR=1,Uy=2,fc=class extends BR.AbstractParserWithWordBoundaryChecking{innerPattern(){return GR}innerExtract(e,t){let n=e.createParsingComponents();n.imply("day",1);let i=t[HR],s=Ly.MONTH_DICTIONARY[i.toLowerCase()];if(n.assign("month",s),t[Uy]){let a=qy.parseYear(t[Uy]);n.assign("year",a)}else{let a=$R.findYearClosestToRef(e.refDate,1,s);n.imply("year",a)}return n}};pc.default=fc});var Yy=p(mc=>{"use strict";Object.defineProperty(mc,"__esModule",{value:!0});var zR=M(),KR=new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})","i"),VR=1,XR=2,hc=class extends zR.AbstractParserWithWordBoundaryChecking{innerPattern(){return KR}innerExtract(e,t){let n=parseInt(t[XR]),i=parseInt(t[VR]);return e.createParsingComponents().imply("day",1).assign("month",i).assign("year",n)}};mc.default=hc});var $y=p(gc=>{"use strict";Object.defineProperty(gc,"__esModule",{value:!0});var ZR=Kr(),yc=class extends ZR.AbstractTimeExpressionParser{primaryPrefix(){return"(?:(?:om)\\s*)?"}followingPhase(){return"\\s*(?:\\-|\\\u2013|\\~|\\\u301C|om|\\?)\\s*"}primarySuffix(){return"(?:\\s*(?:uur))?(?!/)(?=\\W|$)"}extractPrimaryTimeComponents(e,t){return t[0].match(/^\s*\d{4}\s*$/)?null:super.extractPrimaryTimeComponents(e,t)}};gc.default=yc});var Gy=p(Tc=>{"use strict";Object.defineProperty(Tc,"__esModule",{value:!0});var By=pt(),QR=ie(),JR=M(),eO=new RegExp(`([0-9]{4})[\\.\\/\\s](?:(${QR.matchAnyPattern(By.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]([0-9]{1,2})(?=\\W|$)`,"i"),tO=1,rO=2,jy=3,nO=4,_c=class extends JR.AbstractParserWithWordBoundaryChecking{innerPattern(){return eO}innerExtract(e,t){let n=t[jy]?parseInt(t[jy]):By.MONTH_DICTIONARY[t[rO].toLowerCase()];if(n<1||n>12)return null;let i=parseInt(t[tO]);return{day:parseInt(t[nO]),month:n,year:i}}};Tc.default=_c});var Hy=p(Ji=>{"use strict";var iO=Ji&&Ji.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ji,"__esModule",{value:!0});var sO=M(),ka=ke(),bc=Rt(),aO=iO(ee()),oO=1,uO=2,vc=class extends sO.AbstractParserWithWordBoundaryChecking{innerPattern(e){return/(gisteren|morgen|van)(ochtend|middag|namiddag|avond|nacht)(?=\W|$)/i}innerExtract(e,t){let n=t[oO].toLowerCase(),i=t[uO].toLowerCase(),s=e.createParsingComponents(),a=aO.default(e.refDate);switch(n){case"gisteren":bc.assignSimilarDate(s,a.add(-1,"day"));break;case"van":bc.assignSimilarDate(s,a);break;case"morgen":bc.assignTheNextDay(s,a);break}switch(i){case"ochtend":s.imply("meridiem",ka.Meridiem.AM),s.imply("hour",6);break;case"middag":s.imply("meridiem",ka.Meridiem.AM),s.imply("hour",12);break;case"namiddag":s.imply("meridiem",ka.Meridiem.PM),s.imply("hour",15);break;case"avond":s.imply("meridiem",ka.Meridiem.PM),s.imply("hour",20);break}return s}};Ji.default=vc});var Ky=p(wc=>{"use strict";Object.defineProperty(wc,"__esModule",{value:!0});var zy=pt(),lO=be(),cO=M(),dO=Ot(),fO=new RegExp(`(deze|vorige|afgelopen|komende|over|\\+|-)\\s*(${zy.TIME_UNITS_PATTERN})(?=\\W|$)`,"i"),Ec=class extends cO.AbstractParserWithWordBoundaryChecking{innerPattern(){return fO}innerExtract(e,t){let n=t[1].toLowerCase(),i=zy.parseTimeUnits(t[2]);switch(n){case"vorige":case"afgelopen":case"-":i=dO.reverseTimeUnits(i);break}return lO.ParsingComponents.createRelativeFromReference(e.reference,i)}};wc.default=Ec});var Zy=p(es=>{"use strict";var pO=es&&es.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(es,"__esModule",{value:!0});var Xy=pt(),Vy=be(),hO=pO(ee()),mO=M(),yO=ie(),gO=new RegExp(`(dit|deze|komende|volgend|volgende|afgelopen|vorige)\\s*(${yO.matchAnyPattern(Xy.TIME_UNIT_DICTIONARY)})(?=\\s*)(?=\\W|$)`,"i"),_O=1,TO=2,Rc=class extends mO.AbstractParserWithWordBoundaryChecking{innerPattern(){return gO}innerExtract(e,t){let n=t[_O].toLowerCase(),i=t[TO].toLowerCase(),s=Xy.TIME_UNIT_DICTIONARY[i];if(n=="volgend"||n=="volgende"||n=="komende"){let u={};return u[s]=1,Vy.ParsingComponents.createRelativeFromReference(e.reference,u)}if(n=="afgelopen"||n=="vorige"){let u={};return u[s]=-1,Vy.ParsingComponents.createRelativeFromReference(e.reference,u)}let a=e.createParsingComponents(),o=hO.default(e.reference.instant);return i.match(/week/i)?(o=o.add(-o.get("d"),"d"),a.imply("day",o.date()),a.imply("month",o.month()+1),a.imply("year",o.year())):i.match(/maand/i)?(o=o.add(-o.date()+1,"d"),a.imply("day",o.date()),a.assign("year",o.year()),a.assign("month",o.month()+1)):i.match(/jaar/i)&&(o=o.add(-o.date()+1,"d"),o=o.add(-o.month(),"month"),a.imply("day",o.date()),a.imply("month",o.month()+1),a.assign("year",o.year())),a}};es.default=Rc});var Qy=p(Mc=>{"use strict";Object.defineProperty(Mc,"__esModule",{value:!0});var Dc=pt(),bO=be(),vO=M(),EO=Ot(),wO=new RegExp("("+Dc.TIME_UNITS_PATTERN+")(?:geleden|voor|eerder)(?=(?:\\W|$))","i"),RO=new RegExp("("+Dc.TIME_UNITS_PATTERN+")geleden(?=(?:\\W|$))","i"),Oc=class extends vO.AbstractParserWithWordBoundaryChecking{constructor(e){super(),this.strictMode=e}innerPattern(){return this.strictMode?RO:wO}innerExtract(e,t){let n=Dc.parseTimeUnits(t[1]),i=EO.reverseTimeUnits(n);return bO.ParsingComponents.createRelativeFromReference(e.reference,i)}};Mc.default=Oc});var Jy=p(Pc=>{"use strict";Object.defineProperty(Pc,"__esModule",{value:!0});var kc=pt(),OO=be(),DO=M(),MO=new RegExp("("+kc.TIME_UNITS_PATTERN+")(later|na|vanaf nu|voortaan|vooruit|uit)(?=(?:\\W|$))","i"),SO=new RegExp("("+kc.TIME_UNITS_PATTERN+")(later|vanaf nu)(?=(?:\\W|$))","i"),kO=1,Sc=class extends DO.AbstractParserWithWordBoundaryChecking{constructor(e){super(),this.strictMode=e}innerPattern(){return this.strictMode?SO:MO}innerExtract(e,t){let n=kc.parseTimeUnits(t[kO]);return OO.ParsingComponents.createRelativeFromReference(e.reference,n)}};Pc.default=Sc});var ng=p(Le=>{"use strict";var Ge=Le&&Le.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Le,"__esModule",{value:!0});Le.createConfiguration=Le.createCasualConfiguration=Le.parseDate=Le.parse=Le.strict=Le.casual=void 0;var PO=ur(),eg=It(),AO=Ge(by()),xO=Ge(vy()),CO=Ge(Ey()),NO=Ge(wy()),IO=Ge(Zr()),FO=Ge(Sy()),UO=Ge(Py()),LO=Ge(Fy()),tg=Ge(Wy()),qO=Ge(Yy()),WO=Ge($y()),YO=Ge(Gy()),$O=Ge(Hy()),jO=Ge(Ky()),BO=Ge(Zy()),GO=Ge(Qy()),HO=Ge(Jy());Le.casual=new eg.Chrono(rg());Le.strict=new eg.Chrono(Ac(!0));function zO(r,e,t){return Le.casual.parse(r,e,t)}Le.parse=zO;function KO(r,e,t){return Le.casual.parseDate(r,e,t)}Le.parseDate=KO;function rg(r=!0){let e=Ac(!1,r);return e.parsers.unshift(new CO.default),e.parsers.unshift(new NO.default),e.parsers.unshift(new $O.default),e.parsers.unshift(new tg.default),e.parsers.unshift(new BO.default),e.parsers.unshift(new jO.default),e}Le.createCasualConfiguration=rg;function Ac(r=!0,e=!0){return PO.includeCommonConfiguration({parsers:[new IO.default(e),new FO.default,new LO.default,new tg.default,new UO.default,new YO.default,new qO.default,new WO.default(r),new GO.default(r),new HO.default(r)],refiners:[new xO.default,new AO.default]},r)}Le.createConfiguration=Ac});var og=p(ts=>{"use strict";var VO=ts&&ts.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ts,"__esModule",{value:!0});var XO=VO(ee()),ZO=M(),QO=1,ig=2,JO=3,sg=4,ag=5,eD=6,xc=class extends ZO.AbstractParserWithWordBoundaryChecking{innerPattern(e){return new RegExp("(\u800C\u5BB6|\u7ACB(?:\u523B|\u5373)|\u5373\u523B)|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s|,|\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?","i")}innerExtract(e,t){let n=t.index,i=e.createParsingResult(n,t[0]),s=XO.default(e.refDate),a=s;if(t[QO])i.start.imply("hour",s.hour()),i.start.imply("minute",s.minute()),i.start.imply("second",s.second()),i.start.imply("millisecond",s.millisecond());else if(t[ig]){let o=t[ig],u=t[JO];o=="\u660E"||o=="\u807D"?s.hour()>1&&(a=a.add(1,"day")):o=="\u6628"||o=="\u5C0B"||o=="\u7434"?a=a.add(-1,"day"):o=="\u524D"?a=a.add(-2,"day"):o=="\u5927\u524D"?a=a.add(-3,"day"):o=="\u5F8C"?a=a.add(2,"day"):o=="\u5927\u5F8C"&&(a=a.add(3,"day")),u=="\u65E9"||u=="\u671D"?i.start.imply("hour",6):u=="\u665A"&&(i.start.imply("hour",22),i.start.imply("meridiem",1))}else if(t[sg]){let u=t[sg][0];u=="\u65E9"||u=="\u671D"||u=="\u4E0A"?i.start.imply("hour",6):u=="\u4E0B"||u=="\u664F"?(i.start.imply("hour",15),i.start.imply("meridiem",1)):u=="\u4E2D"?(i.start.imply("hour",12),i.start.imply("meridiem",1)):u=="\u591C"||u=="\u665A"?(i.start.imply("hour",22),i.start.imply("meridiem",1)):u=="\u51CC"&&i.start.imply("hour",0)}else if(t[ag]){let o=t[ag];o=="\u660E"||o=="\u807D"?s.hour()>1&&(a=a.add(1,"day")):o=="\u6628"||o=="\u5C0B"||o=="\u7434"?a=a.add(-1,"day"):o=="\u524D"?a=a.add(-2,"day"):o=="\u5927\u524D"?a=a.add(-3,"day"):o=="\u5F8C"?a=a.add(2,"day"):o=="\u5927\u5F8C"&&(a=a.add(3,"day"));let u=t[eD];if(u){let l=u[0];l=="\u65E9"||l=="\u671D"||l=="\u4E0A"?i.start.imply("hour",6):l=="\u4E0B"||l=="\u664F"?(i.start.imply("hour",15),i.start.imply("meridiem",1)):l=="\u4E2D"?(i.start.imply("hour",12),i.start.imply("meridiem",1)):l=="\u591C"||l=="\u665A"?(i.start.imply("hour",22),i.start.imply("meridiem",1)):l=="\u51CC"&&i.start.imply("hour",0)}}return i.start.assign("day",a.date()),i.start.assign("month",a.month()+1),i.start.assign("year",a.year()),i}};ts.default=xc});var $n=p(nt=>{"use strict";Object.defineProperty(nt,"__esModule",{value:!0});nt.zhStringToYear=nt.zhStringToNumber=nt.WEEKDAY_OFFSET=nt.NUMBER=void 0;nt.NUMBER={\u96F6:0,\u4E00:1,\u4E8C:2,\u5169:2,\u4E09:3,\u56DB:4,\u4E94:5,\u516D:6,\u4E03:7,\u516B:8,\u4E5D:9,\u5341:10,\u5EFF:20,\u5345:30};nt.WEEKDAY_OFFSET={\u5929:0,\u65E5:0,\u4E00:1,\u4E8C:2,\u4E09:3,\u56DB:4,\u4E94:5,\u516D:6};function tD(r){let e=0;for(let t=0;t{"use strict";var nD=rs&&rs.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(rs,"__esModule",{value:!0});var iD=nD(ee()),sD=M(),en=$n(),Cc=1,ug=2,Nc=3,Ic=class extends sD.AbstractParserWithWordBoundaryChecking{innerPattern(){return new RegExp("(\\d{2,4}|["+Object.keys(en.NUMBER).join("")+"]{4}|["+Object.keys(en.NUMBER).join("")+"]{2})?(?:\\s*)(?:\u5E74)?(?:[\\s|,|\uFF0C]*)(\\d{1,2}|["+Object.keys(en.NUMBER).join("")+"]{1,2})(?:\\s*)(?:\u6708)(?:\\s*)(\\d{1,2}|["+Object.keys(en.NUMBER).join("")+"]{1,2})?(?:\\s*)(?:\u65E5|\u865F)?")}innerExtract(e,t){let n=iD.default(e.refDate),i=e.createParsingResult(t.index,t[0]),s=parseInt(t[ug]);if(isNaN(s)&&(s=en.zhStringToNumber(t[ug])),i.start.assign("month",s),t[Nc]){let a=parseInt(t[Nc]);isNaN(a)&&(a=en.zhStringToNumber(t[Nc])),i.start.assign("day",a)}else i.start.imply("day",n.date());if(t[Cc]){let a=parseInt(t[Cc]);isNaN(a)&&(a=en.zhStringToYear(t[Cc])),i.start.assign("year",a)}else i.start.imply("year",n.year());return i}};rs.default=Ic});var dg=p(ns=>{"use strict";var aD=ns&&ns.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ns,"__esModule",{value:!0});var oD=aD(ee()),uD=M(),cg=$n(),lD=new RegExp("(\\d+|["+Object.keys(cg.NUMBER).join("")+"]+|\u534A|\u5E7E)(?:\\s*)(?:\u500B)?(\u79D2(?:\u9418)?|\u5206\u9418|\u5C0F\u6642|\u9418|\u65E5|\u5929|\u661F\u671F|\u79AE\u62DC|\u6708|\u5E74)(?:(?:\u4E4B|\u904E)?\u5F8C|(?:\u4E4B)?\u5167)","i"),Fc=1,cD=2,Uc=class extends uD.AbstractParserWithWordBoundaryChecking{innerPattern(){return lD}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=parseInt(t[Fc]);if(isNaN(i)&&(i=cg.zhStringToNumber(t[Fc])),isNaN(i)){let u=t[Fc];if(u==="\u5E7E")i=3;else if(u==="\u534A")i=.5;else return null}let s=oD.default(e.refDate),o=t[cD][0];return o.match(/[日天星禮月年]/)?(o=="\u65E5"||o=="\u5929"?s=s.add(i,"d"):o=="\u661F"||o=="\u79AE"?s=s.add(i*7,"d"):o=="\u6708"?s=s.add(i,"month"):o=="\u5E74"&&(s=s.add(i,"year")),n.start.assign("year",s.year()),n.start.assign("month",s.month()+1),n.start.assign("day",s.date()),n):(o=="\u79D2"?s=s.add(i,"second"):o=="\u5206"?s=s.add(i,"minute"):(o=="\u5C0F"||o=="\u9418")&&(s=s.add(i,"hour")),n.start.imply("year",s.year()),n.start.imply("month",s.month()+1),n.start.imply("day",s.date()),n.start.assign("hour",s.hour()),n.start.assign("minute",s.minute()),n.start.assign("second",s.second()),n)}};ns.default=Uc});var pg=p(is=>{"use strict";var dD=is&&is.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(is,"__esModule",{value:!0});var fD=dD(ee()),pD=M(),fg=$n(),hD=new RegExp("(?\u4E0A|\u4ECA|\u4E0B|\u9019|\u5462)(?:\u500B)?(?:\u661F\u671F|\u79AE\u62DC|\u9031)(?"+Object.keys(fg.WEEKDAY_OFFSET).join("|")+")"),Lc=class extends pD.AbstractParserWithWordBoundaryChecking{innerPattern(){return hD}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=t.groups.weekday,s=fg.WEEKDAY_OFFSET[i];if(s===void 0)return null;let a=null,o=t.groups.prefix;o=="\u4E0A"?a="last":o=="\u4E0B"?a="next":(o=="\u4ECA"||o=="\u9019"||o=="\u5462")&&(a="this");let u=fD.default(e.refDate),l=!1,c=u.day();return a=="last"||a=="past"?(u=u.day(s-7),l=!0):a=="next"?(u=u.day(s+7),l=!0):a=="this"?u=u.day(s):Math.abs(s-7-c){"use strict";var mD=ss&&ss.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ss,"__esModule",{value:!0});var yD=mD(ee()),gD=M(),St=$n(),_D=new RegExp("(?:\u7531|\u5F9E|\u81EA)?(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|["+Object.keys(St.NUMBER).join("")+"]+)(?:\\s*)(?:\u9EDE|\u6642|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|["+Object.keys(St.NUMBER).join("")+"]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|["+Object.keys(St.NUMBER).join("")+"]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?","i"),TD=new RegExp("(?:^\\s*(?:\u5230|\u81F3|\\-|\\\u2013|\\~|\\\u301C)\\s*)(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|["+Object.keys(St.NUMBER).join("")+"]+)(?:\\s*)(?:\u9EDE|\u6642|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|["+Object.keys(St.NUMBER).join("")+"]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|["+Object.keys(St.NUMBER).join("")+"]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?","i"),Pa=1,Aa=2,xa=3,Ca=4,Na=5,Ia=6,Mt=7,jn=8,Fa=9,qc=class extends gD.AbstractParserWithWordBoundaryChecking{innerPattern(){return _D}innerExtract(e,t){if(t.index>0&&e.text[t.index-1].match(/\w/))return null;let n=yD.default(e.refDate),i=e.createParsingResult(t.index,t[0]),s=n.clone();if(t[Pa]){var a=t[Pa];a=="\u660E"||a=="\u807D"?n.hour()>1&&s.add(1,"day"):a=="\u6628"||a=="\u5C0B"||a=="\u7434"?s.add(-1,"day"):a=="\u524D"?s.add(-2,"day"):a=="\u5927\u524D"?s.add(-3,"day"):a=="\u5F8C"?s.add(2,"day"):a=="\u5927\u5F8C"&&s.add(3,"day"),i.start.assign("day",s.date()),i.start.assign("month",s.month()+1),i.start.assign("year",s.year())}else if(t[Ca]){var o=t[Ca];o=="\u660E"||o=="\u807D"?s.add(1,"day"):o=="\u6628"||o=="\u5C0B"||o=="\u7434"?s.add(-1,"day"):o=="\u524D"?s.add(-2,"day"):o=="\u5927\u524D"?s.add(-3,"day"):o=="\u5F8C"?s.add(2,"day"):o=="\u5927\u5F8C"&&s.add(3,"day"),i.start.assign("day",s.date()),i.start.assign("month",s.month()+1),i.start.assign("year",s.year())}else i.start.imply("day",s.date()),i.start.imply("month",s.month()+1),i.start.imply("year",s.year());let u=0,l=0,c=-1;if(t[jn]){var d=parseInt(t[jn]);if(isNaN(d)&&(d=St.zhStringToNumber(t[jn])),d>=60)return null;i.start.assign("second",d)}if(u=parseInt(t[Ia]),isNaN(u)&&(u=St.zhStringToNumber(t[Ia])),t[Mt]?t[Mt]=="\u534A"?l=30:t[Mt]=="\u6B63"||t[Mt]=="\u6574"?l=0:(l=parseInt(t[Mt]),isNaN(l)&&(l=St.zhStringToNumber(t[Mt]))):u>100&&(l=u%100,u=Math.floor(u/100)),l>=60||u>24)return null;if(u>=12&&(c=1),t[Fa]){if(u>12)return null;var f=t[Fa][0].toLowerCase();f=="a"&&(c=0,u==12&&(u=0)),f=="p"&&(c=1,u!=12&&(u+=12))}else if(t[Aa]){var h=t[Aa],y=h[0];y=="\u671D"||y=="\u65E9"?(c=0,u==12&&(u=0)):y=="\u665A"&&(c=1,u!=12&&(u+=12))}else if(t[xa]){var m=t[xa],g=m[0];g=="\u4E0A"||g=="\u671D"||g=="\u65E9"||g=="\u51CC"?(c=0,u==12&&(u=0)):(g=="\u4E0B"||g=="\u664F"||g=="\u665A")&&(c=1,u!=12&&(u+=12))}else if(t[Na]){var R=t[Na],O=R[0];O=="\u4E0A"||O=="\u671D"||O=="\u65E9"||O=="\u51CC"?(c=0,u==12&&(u=0)):(O=="\u4E0B"||O=="\u664F"||O=="\u665A")&&(c=1,u!=12&&(u+=12))}if(i.start.assign("hour",u),i.start.assign("minute",l),c>=0?i.start.assign("meridiem",c):u<12?i.start.imply("meridiem",0):i.start.imply("meridiem",1),t=TD.exec(e.text.substring(i.index+i.text.length)),!t)return i.text.match(/^\d+$/)?null:i;let P=s.clone();if(i.end=e.createParsingComponents(),t[Pa]){var a=t[Pa];a=="\u660E"||a=="\u807D"?n.hour()>1&&P.add(1,"day"):a=="\u6628"||a=="\u5C0B"||a=="\u7434"?P.add(-1,"day"):a=="\u524D"?P.add(-2,"day"):a=="\u5927\u524D"?P.add(-3,"day"):a=="\u5F8C"?P.add(2,"day"):a=="\u5927\u5F8C"&&P.add(3,"day"),i.end.assign("day",P.date()),i.end.assign("month",P.month()+1),i.end.assign("year",P.year())}else if(t[Ca]){var o=t[Ca];o=="\u660E"||o=="\u807D"?P.add(1,"day"):o=="\u6628"||o=="\u5C0B"||o=="\u7434"?P.add(-1,"day"):o=="\u524D"?P.add(-2,"day"):o=="\u5927\u524D"?P.add(-3,"day"):o=="\u5F8C"?P.add(2,"day"):o=="\u5927\u5F8C"&&P.add(3,"day"),i.end.assign("day",P.date()),i.end.assign("month",P.month()+1),i.end.assign("year",P.year())}else i.end.imply("day",P.date()),i.end.imply("month",P.month()+1),i.end.imply("year",P.year());if(u=0,l=0,c=-1,t[jn]){var d=parseInt(t[jn]);if(isNaN(d)&&(d=St.zhStringToNumber(t[jn])),d>=60)return null;i.end.assign("second",d)}if(u=parseInt(t[Ia]),isNaN(u)&&(u=St.zhStringToNumber(t[Ia])),t[Mt]?t[Mt]=="\u534A"?l=30:t[Mt]=="\u6B63"||t[Mt]=="\u6574"?l=0:(l=parseInt(t[Mt]),isNaN(l)&&(l=St.zhStringToNumber(t[Mt]))):u>100&&(l=u%100,u=Math.floor(u/100)),l>=60||u>24)return null;if(u>=12&&(c=1),t[Fa]){if(u>12)return null;var f=t[Fa][0].toLowerCase();f=="a"&&(c=0,u==12&&(u=0)),f=="p"&&(c=1,u!=12&&(u+=12)),i.start.isCertain("meridiem")||(c==0?(i.start.imply("meridiem",0),i.start.get("hour")==12&&i.start.assign("hour",0)):(i.start.imply("meridiem",1),i.start.get("hour")!=12&&i.start.assign("hour",i.start.get("hour")+12)))}else if(t[Aa]){var h=t[Aa],y=h[0];y=="\u671D"||y=="\u65E9"?(c=0,u==12&&(u=0)):y=="\u665A"&&(c=1,u!=12&&(u+=12))}else if(t[xa]){var m=t[xa],g=m[0];g=="\u4E0A"||g=="\u671D"||g=="\u65E9"||g=="\u51CC"?(c=0,u==12&&(u=0)):(g=="\u4E0B"||g=="\u664F"||g=="\u665A")&&(c=1,u!=12&&(u+=12))}else if(t[Na]){var R=t[Na],O=R[0];O=="\u4E0A"||O=="\u671D"||O=="\u65E9"||O=="\u51CC"?(c=0,u==12&&(u=0)):(O=="\u4E0B"||O=="\u664F"||O=="\u665A")&&(c=1,u!=12&&(u+=12))}return i.text=i.text+t[0],i.end.assign("hour",u),i.end.assign("minute",l),c>=0?i.end.assign("meridiem",c):i.start.isCertain("meridiem")&&i.start.get("meridiem")==1&&i.start.get("hour")>u?i.end.imply("meridiem",0):u>12&&i.end.imply("meridiem",1),i.end.date().getTime(){"use strict";var bD=as&&as.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(as,"__esModule",{value:!0});var vD=bD(ee()),ED=M(),mg=$n(),wD=new RegExp("(?:\u661F\u671F|\u79AE\u62DC|\u9031)(?"+Object.keys(mg.WEEKDAY_OFFSET).join("|")+")"),Wc=class extends ED.AbstractParserWithWordBoundaryChecking{innerPattern(){return wD}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=t.groups.weekday,s=mg.WEEKDAY_OFFSET[i];if(s===void 0)return null;let a=vD.default(e.refDate),o=!1,u=a.day();return Math.abs(s-7-u){"use strict";var RD=os&&os.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(os,"__esModule",{value:!0});var OD=RD(Qt()),Yc=class extends OD.default{patternBetween(){return/^\s*(至|到|\-|\~|~|-|ー)\s*$/i}};os.default=Yc});var _g=p(us=>{"use strict";var DD=us&&us.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(us,"__esModule",{value:!0});var MD=DD(or()),$c=class extends MD.default{patternBetween(){return/^\s*$/i}};us.default=$c});var Tg=p(De=>{"use strict";var pr=De&&De.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(De,"__esModule",{value:!0});De.createConfiguration=De.createCasualConfiguration=De.parseDate=De.parse=De.strict=De.casual=De.hant=void 0;var jc=It(),SD=pr(fa()),kD=ur(),PD=pr(og()),AD=pr(lg()),xD=pr(dg()),CD=pr(pg()),ND=pr(hg()),ID=pr(yg()),FD=pr(gg()),UD=pr(_g());De.hant=new jc.Chrono(Bc());De.casual=new jc.Chrono(Bc());De.strict=new jc.Chrono(Gc());function LD(r,e,t){return De.casual.parse(r,e,t)}De.parse=LD;function qD(r,e,t){return De.casual.parseDate(r,e,t)}De.parseDate=qD;function Bc(){let r=Gc();return r.parsers.unshift(new PD.default),r}De.createCasualConfiguration=Bc;function Gc(){let r=kD.includeCommonConfiguration({parsers:[new AD.default,new CD.default,new ID.default,new ND.default,new xD.default],refiners:[new FD.default,new UD.default]});return r.refiners=r.refiners.filter(e=>!(e instanceof SD.default)),r}De.createConfiguration=Gc});var wg=p(ls=>{"use strict";var WD=ls&&ls.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ls,"__esModule",{value:!0});var YD=WD(ee()),$D=M(),jD=1,bg=2,BD=3,vg=4,Eg=5,GD=6,Hc=class extends $D.AbstractParserWithWordBoundaryChecking{innerPattern(e){return new RegExp("(\u73B0\u5728|\u7ACB(?:\u523B|\u5373)|\u5373\u523B)|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s|,|\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?","i")}innerExtract(e,t){let n=t.index,i=e.createParsingResult(n,t[0]),s=YD.default(e.refDate),a=s;if(t[jD])i.start.imply("hour",s.hour()),i.start.imply("minute",s.minute()),i.start.imply("second",s.second()),i.start.imply("millisecond",s.millisecond());else if(t[bg]){let o=t[bg],u=t[BD];o=="\u660E"?s.hour()>1&&(a=a.add(1,"day")):o=="\u6628"?a=a.add(-1,"day"):o=="\u524D"?a=a.add(-2,"day"):o=="\u5927\u524D"?a=a.add(-3,"day"):o=="\u540E"?a=a.add(2,"day"):o=="\u5927\u540E"&&(a=a.add(3,"day")),u=="\u65E9"?i.start.imply("hour",6):u=="\u665A"&&(i.start.imply("hour",22),i.start.imply("meridiem",1))}else if(t[vg]){let u=t[vg][0];u=="\u65E9"||u=="\u4E0A"?i.start.imply("hour",6):u=="\u4E0B"?(i.start.imply("hour",15),i.start.imply("meridiem",1)):u=="\u4E2D"?(i.start.imply("hour",12),i.start.imply("meridiem",1)):u=="\u591C"||u=="\u665A"?(i.start.imply("hour",22),i.start.imply("meridiem",1)):u=="\u51CC"&&i.start.imply("hour",0)}else if(t[Eg]){let o=t[Eg];o=="\u660E"?s.hour()>1&&(a=a.add(1,"day")):o=="\u6628"?a=a.add(-1,"day"):o=="\u524D"?a=a.add(-2,"day"):o=="\u5927\u524D"?a=a.add(-3,"day"):o=="\u540E"?a=a.add(2,"day"):o=="\u5927\u540E"&&(a=a.add(3,"day"));let u=t[GD];if(u){let l=u[0];l=="\u65E9"||l=="\u4E0A"?i.start.imply("hour",6):l=="\u4E0B"?(i.start.imply("hour",15),i.start.imply("meridiem",1)):l=="\u4E2D"?(i.start.imply("hour",12),i.start.imply("meridiem",1)):l=="\u591C"||l=="\u665A"?(i.start.imply("hour",22),i.start.imply("meridiem",1)):l=="\u51CC"&&i.start.imply("hour",0)}}return i.start.assign("day",a.date()),i.start.assign("month",a.month()+1),i.start.assign("year",a.year()),i}};ls.default=Hc});var Bn=p(it=>{"use strict";Object.defineProperty(it,"__esModule",{value:!0});it.zhStringToYear=it.zhStringToNumber=it.WEEKDAY_OFFSET=it.NUMBER=void 0;it.NUMBER={\u96F6:0,"\u3007":0,\u4E00:1,\u4E8C:2,\u4E24:2,\u4E09:3,\u56DB:4,\u4E94:5,\u516D:6,\u4E03:7,\u516B:8,\u4E5D:9,\u5341:10};it.WEEKDAY_OFFSET={\u5929:0,\u65E5:0,\u4E00:1,\u4E8C:2,\u4E09:3,\u56DB:4,\u4E94:5,\u516D:6};function HD(r){let e=0;for(let t=0;t{"use strict";var KD=cs&&cs.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(cs,"__esModule",{value:!0});var VD=KD(ee()),XD=M(),tn=Bn(),zc=1,Rg=2,Kc=3,Vc=class extends XD.AbstractParserWithWordBoundaryChecking{innerPattern(){return new RegExp("(\\d{2,4}|["+Object.keys(tn.NUMBER).join("")+"]{4}|["+Object.keys(tn.NUMBER).join("")+"]{2})?(?:\\s*)(?:\u5E74)?(?:[\\s|,|\uFF0C]*)(\\d{1,2}|["+Object.keys(tn.NUMBER).join("")+"]{1,3})(?:\\s*)(?:\u6708)(?:\\s*)(\\d{1,2}|["+Object.keys(tn.NUMBER).join("")+"]{1,3})?(?:\\s*)(?:\u65E5|\u53F7)?")}innerExtract(e,t){let n=VD.default(e.refDate),i=e.createParsingResult(t.index,t[0]),s=parseInt(t[Rg]);if(isNaN(s)&&(s=tn.zhStringToNumber(t[Rg])),i.start.assign("month",s),t[Kc]){let a=parseInt(t[Kc]);isNaN(a)&&(a=tn.zhStringToNumber(t[Kc])),i.start.assign("day",a)}else i.start.imply("day",n.date());if(t[zc]){let a=parseInt(t[zc]);isNaN(a)&&(a=tn.zhStringToYear(t[zc])),i.start.assign("year",a)}else i.start.imply("year",n.year());return i}};cs.default=Vc});var Mg=p(ds=>{"use strict";var ZD=ds&&ds.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ds,"__esModule",{value:!0});var QD=ZD(ee()),JD=M(),Dg=Bn(),eM=new RegExp("(\\d+|["+Object.keys(Dg.NUMBER).join("")+"]+|\u534A|\u51E0)(?:\\s*)(?:\u4E2A)?(\u79D2(?:\u949F)?|\u5206\u949F|\u5C0F\u65F6|\u949F|\u65E5|\u5929|\u661F\u671F|\u793C\u62DC|\u6708|\u5E74)(?:(?:\u4E4B|\u8FC7)?\u540E|(?:\u4E4B)?\u5185)","i"),Xc=1,tM=2,Zc=class extends JD.AbstractParserWithWordBoundaryChecking{innerPattern(){return eM}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=parseInt(t[Xc]);if(isNaN(i)&&(i=Dg.zhStringToNumber(t[Xc])),isNaN(i)){let u=t[Xc];if(u==="\u51E0")i=3;else if(u==="\u534A")i=.5;else return null}let s=QD.default(e.refDate),o=t[tM][0];return o.match(/[日天星礼月年]/)?(o=="\u65E5"||o=="\u5929"?s=s.add(i,"d"):o=="\u661F"||o=="\u793C"?s=s.add(i*7,"d"):o=="\u6708"?s=s.add(i,"month"):o=="\u5E74"&&(s=s.add(i,"year")),n.start.assign("year",s.year()),n.start.assign("month",s.month()+1),n.start.assign("day",s.date()),n):(o=="\u79D2"?s=s.add(i,"second"):o=="\u5206"?s=s.add(i,"minute"):(o=="\u5C0F"||o=="\u949F")&&(s=s.add(i,"hour")),n.start.imply("year",s.year()),n.start.imply("month",s.month()+1),n.start.imply("day",s.date()),n.start.assign("hour",s.hour()),n.start.assign("minute",s.minute()),n.start.assign("second",s.second()),n)}};ds.default=Zc});var kg=p(fs=>{"use strict";var rM=fs&&fs.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(fs,"__esModule",{value:!0});var nM=rM(ee()),iM=M(),Sg=Bn(),sM=new RegExp("(?\u4E0A|\u4E0B|\u8FD9)(?:\u4E2A)?(?:\u661F\u671F|\u793C\u62DC|\u5468)(?"+Object.keys(Sg.WEEKDAY_OFFSET).join("|")+")"),Qc=class extends iM.AbstractParserWithWordBoundaryChecking{innerPattern(){return sM}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=t.groups.weekday,s=Sg.WEEKDAY_OFFSET[i];if(s===void 0)return null;let a=null,o=t.groups.prefix;o=="\u4E0A"?a="last":o=="\u4E0B"?a="next":o=="\u8FD9"&&(a="this");let u=nM.default(e.refDate),l=!1,c=u.day();return a=="last"||a=="past"?(u=u.day(s-7),l=!0):a=="next"?(u=u.day(s+7),l=!0):a=="this"?u=u.day(s):Math.abs(s-7-c){"use strict";var aM=ps&&ps.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ps,"__esModule",{value:!0});var oM=aM(ee()),uM=M(),Pt=Bn(),lM=new RegExp("(?:\u4ECE|\u81EA)?(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|["+Object.keys(Pt.NUMBER).join("")+"]+)(?:\\s*)(?:\u70B9|\u65F6|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|["+Object.keys(Pt.NUMBER).join("")+"]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|["+Object.keys(Pt.NUMBER).join("")+"]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?","i"),cM=new RegExp("(?:^\\s*(?:\u5230|\u81F3|\\-|\\\u2013|\\~|\\\u301C)\\s*)(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|["+Object.keys(Pt.NUMBER).join("")+"]+)(?:\\s*)(?:\u70B9|\u65F6|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|["+Object.keys(Pt.NUMBER).join("")+"]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|["+Object.keys(Pt.NUMBER).join("")+"]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?","i"),Ua=1,La=2,qa=3,Wa=4,Ya=5,$a=6,kt=7,Gn=8,ja=9,Jc=class extends uM.AbstractParserWithWordBoundaryChecking{innerPattern(){return lM}innerExtract(e,t){if(t.index>0&&e.text[t.index-1].match(/\w/))return null;let n=oM.default(e.refDate),i=e.createParsingResult(t.index,t[0]),s=n.clone();if(t[Ua]){let c=t[Ua];c=="\u660E"?n.hour()>1&&s.add(1,"day"):c=="\u6628"?s.add(-1,"day"):c=="\u524D"?s.add(-2,"day"):c=="\u5927\u524D"?s.add(-3,"day"):c=="\u540E"?s.add(2,"day"):c=="\u5927\u540E"&&s.add(3,"day"),i.start.assign("day",s.date()),i.start.assign("month",s.month()+1),i.start.assign("year",s.year())}else if(t[Wa]){let c=t[Wa];c=="\u660E"?s.add(1,"day"):c=="\u6628"?s.add(-1,"day"):c=="\u524D"?s.add(-2,"day"):c=="\u5927\u524D"?s.add(-3,"day"):c=="\u540E"?s.add(2,"day"):c=="\u5927\u540E"&&s.add(3,"day"),i.start.assign("day",s.date()),i.start.assign("month",s.month()+1),i.start.assign("year",s.year())}else i.start.imply("day",s.date()),i.start.imply("month",s.month()+1),i.start.imply("year",s.year());let a=0,o=0,u=-1;if(t[Gn]){let c=parseInt(t[Gn]);if(isNaN(c)&&(c=Pt.zhStringToNumber(t[Gn])),c>=60)return null;i.start.assign("second",c)}if(a=parseInt(t[$a]),isNaN(a)&&(a=Pt.zhStringToNumber(t[$a])),t[kt]?t[kt]=="\u534A"?o=30:t[kt]=="\u6B63"||t[kt]=="\u6574"?o=0:(o=parseInt(t[kt]),isNaN(o)&&(o=Pt.zhStringToNumber(t[kt]))):a>100&&(o=a%100,a=Math.floor(a/100)),o>=60||a>24)return null;if(a>=12&&(u=1),t[ja]){if(a>12)return null;let c=t[ja][0].toLowerCase();c=="a"&&(u=0,a==12&&(a=0)),c=="p"&&(u=1,a!=12&&(a+=12))}else if(t[La]){let d=t[La][0];d=="\u65E9"?(u=0,a==12&&(a=0)):d=="\u665A"&&(u=1,a!=12&&(a+=12))}else if(t[qa]){let d=t[qa][0];d=="\u4E0A"||d=="\u65E9"||d=="\u51CC"?(u=0,a==12&&(a=0)):(d=="\u4E0B"||d=="\u665A")&&(u=1,a!=12&&(a+=12))}else if(t[Ya]){let d=t[Ya][0];d=="\u4E0A"||d=="\u65E9"||d=="\u51CC"?(u=0,a==12&&(a=0)):(d=="\u4E0B"||d=="\u665A")&&(u=1,a!=12&&(a+=12))}if(i.start.assign("hour",a),i.start.assign("minute",o),u>=0?i.start.assign("meridiem",u):a<12?i.start.imply("meridiem",0):i.start.imply("meridiem",1),t=cM.exec(e.text.substring(i.index+i.text.length)),!t)return i.text.match(/^\d+$/)?null:i;let l=s.clone();if(i.end=e.createParsingComponents(),t[Ua]){let c=t[Ua];c=="\u660E"?n.hour()>1&&l.add(1,"day"):c=="\u6628"?l.add(-1,"day"):c=="\u524D"?l.add(-2,"day"):c=="\u5927\u524D"?l.add(-3,"day"):c=="\u540E"?l.add(2,"day"):c=="\u5927\u540E"&&l.add(3,"day"),i.end.assign("day",l.date()),i.end.assign("month",l.month()+1),i.end.assign("year",l.year())}else if(t[Wa]){let c=t[Wa];c=="\u660E"?l.add(1,"day"):c=="\u6628"?l.add(-1,"day"):c=="\u524D"?l.add(-2,"day"):c=="\u5927\u524D"?l.add(-3,"day"):c=="\u540E"?l.add(2,"day"):c=="\u5927\u540E"&&l.add(3,"day"),i.end.assign("day",l.date()),i.end.assign("month",l.month()+1),i.end.assign("year",l.year())}else i.end.imply("day",l.date()),i.end.imply("month",l.month()+1),i.end.imply("year",l.year());if(a=0,o=0,u=-1,t[Gn]){let c=parseInt(t[Gn]);if(isNaN(c)&&(c=Pt.zhStringToNumber(t[Gn])),c>=60)return null;i.end.assign("second",c)}if(a=parseInt(t[$a]),isNaN(a)&&(a=Pt.zhStringToNumber(t[$a])),t[kt]?t[kt]=="\u534A"?o=30:t[kt]=="\u6B63"||t[kt]=="\u6574"?o=0:(o=parseInt(t[kt]),isNaN(o)&&(o=Pt.zhStringToNumber(t[kt]))):a>100&&(o=a%100,a=Math.floor(a/100)),o>=60||a>24)return null;if(a>=12&&(u=1),t[ja]){if(a>12)return null;let c=t[ja][0].toLowerCase();c=="a"&&(u=0,a==12&&(a=0)),c=="p"&&(u=1,a!=12&&(a+=12)),i.start.isCertain("meridiem")||(u==0?(i.start.imply("meridiem",0),i.start.get("hour")==12&&i.start.assign("hour",0)):(i.start.imply("meridiem",1),i.start.get("hour")!=12&&i.start.assign("hour",i.start.get("hour")+12)))}else if(t[La]){let d=t[La][0];d=="\u65E9"?(u=0,a==12&&(a=0)):d=="\u665A"&&(u=1,a!=12&&(a+=12))}else if(t[qa]){let d=t[qa][0];d=="\u4E0A"||d=="\u65E9"||d=="\u51CC"?(u=0,a==12&&(a=0)):(d=="\u4E0B"||d=="\u665A")&&(u=1,a!=12&&(a+=12))}else if(t[Ya]){let d=t[Ya][0];d=="\u4E0A"||d=="\u65E9"||d=="\u51CC"?(u=0,a==12&&(a=0)):(d=="\u4E0B"||d=="\u665A")&&(u=1,a!=12&&(a+=12))}return i.text=i.text+t[0],i.end.assign("hour",a),i.end.assign("minute",o),u>=0?i.end.assign("meridiem",u):i.start.isCertain("meridiem")&&i.start.get("meridiem")==1&&i.start.get("hour")>a?i.end.imply("meridiem",0):a>12&&i.end.imply("meridiem",1),i.end.date().getTime(){"use strict";var dM=hs&&hs.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(hs,"__esModule",{value:!0});var fM=dM(ee()),pM=M(),Ag=Bn(),hM=new RegExp("(?:\u661F\u671F|\u793C\u62DC|\u5468)(?"+Object.keys(Ag.WEEKDAY_OFFSET).join("|")+")"),ed=class extends pM.AbstractParserWithWordBoundaryChecking{innerPattern(){return hM}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=t.groups.weekday,s=Ag.WEEKDAY_OFFSET[i];if(s===void 0)return null;let a=fM.default(e.refDate),o=!1,u=a.day();return Math.abs(s-7-u){"use strict";var mM=ms&&ms.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ms,"__esModule",{value:!0});var yM=mM(Qt()),td=class extends yM.default{patternBetween(){return/^\s*(至|到|-|~|~|-|ー)\s*$/i}};ms.default=td});var Ng=p(ys=>{"use strict";var gM=ys&&ys.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ys,"__esModule",{value:!0});var _M=gM(or()),rd=class extends _M.default{patternBetween(){return/^\s*$/i}};ys.default=rd});var Ig=p(Me=>{"use strict";var hr=Me&&Me.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Me,"__esModule",{value:!0});Me.createConfiguration=Me.createCasualConfiguration=Me.parseDate=Me.parse=Me.strict=Me.casual=Me.hans=void 0;var nd=It(),TM=hr(fa()),bM=ur(),vM=hr(wg()),EM=hr(Og()),wM=hr(Mg()),RM=hr(kg()),OM=hr(Pg()),DM=hr(xg()),MM=hr(Cg()),SM=hr(Ng());Me.hans=new nd.Chrono(id());Me.casual=new nd.Chrono(id());Me.strict=new nd.Chrono(sd());function kM(r,e,t){return Me.casual.parse(r,e,t)}Me.parse=kM;function PM(r,e,t){return Me.casual.parseDate(r,e,t)}Me.parseDate=PM;function id(){let r=sd();return r.parsers.unshift(new vM.default),r}Me.createCasualConfiguration=id;function sd(){let r=bM.includeCommonConfiguration({parsers:[new EM.default,new RM.default,new DM.default,new OM.default,new wM.default],refiners:[new MM.default,new SM.default]});return r.refiners=r.refiners.filter(e=>!(e instanceof TM.default)),r}Me.createConfiguration=sd});var Ug=p(ht=>{"use strict";var Fg=ht&&ht.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),AM=ht&&ht.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),xM=ht&&ht.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Fg(e,r,t)},CM=ht&&ht.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&Fg(e,r,t);return AM(e,r),e};Object.defineProperty(ht,"__esModule",{value:!0});ht.hans=void 0;xM(Tg(),ht);ht.hans=CM(Ig())});var st=p(Y=>{"use strict";Object.defineProperty(Y,"__esModule",{value:!0});Y.parseTimeUnits=Y.TIME_UNITS_PATTERN=Y.parseYear=Y.YEAR_PATTERN=Y.parseOrdinalNumberPattern=Y.ORDINAL_NUMBER_PATTERN=Y.parseNumberPattern=Y.NUMBER_PATTERN=Y.TIME_UNIT_DICTIONARY=Y.ORDINAL_WORD_DICTIONARY=Y.INTEGER_WORD_DICTIONARY=Y.MONTH_DICTIONARY=Y.FULL_MONTH_NAME_DICTIONARY=Y.WEEKDAY_DICTIONARY=Y.REGEX_PARTS=void 0;var Ba=ie(),NM=je();Y.REGEX_PARTS={leftBoundary:"([^\\p{L}\\p{N}_]|^)",rightBoundary:"(?=[^\\p{L}\\p{N}_]|$)",flags:"iu"};Y.WEEKDAY_DICTIONARY={\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435:0,\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u044F:0,\u0432\u0441\u043A:0,"\u0432\u0441\u043A.":0,\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A:1,\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A\u0430:1,\u043F\u043D:1,"\u043F\u043D.":1,\u0432\u0442\u043E\u0440\u043D\u0438\u043A:2,\u0432\u0442\u043E\u0440\u043D\u0438\u043A\u0430:2,\u0432\u0442:2,"\u0432\u0442.":2,\u0441\u0440\u0435\u0434\u0430:3,\u0441\u0440\u0435\u0434\u044B:3,\u0441\u0440\u0435\u0434\u0443:3,\u0441\u0440:3,"\u0441\u0440.":3,\u0447\u0435\u0442\u0432\u0435\u0440\u0433:4,\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430:4,\u0447\u0442:4,"\u0447\u0442.":4,\u043F\u044F\u0442\u043D\u0438\u0446\u0430:5,\u043F\u044F\u0442\u043D\u0438\u0446\u0443:5,\u043F\u044F\u0442\u043D\u0438\u0446\u044B:5,\u043F\u0442:5,"\u043F\u0442.":5,\u0441\u0443\u0431\u0431\u043E\u0442\u0430:6,\u0441\u0443\u0431\u0431\u043E\u0442\u0443:6,\u0441\u0443\u0431\u0431\u043E\u0442\u044B:6,\u0441\u0431:6,"\u0441\u0431.":6};Y.FULL_MONTH_NAME_DICTIONARY={\u044F\u043D\u0432\u0430\u0440\u044C:1,\u044F\u043D\u0432\u0430\u0440\u044F:1,\u044F\u043D\u0432\u0430\u0440\u0435:1,\u0444\u0435\u0432\u0440\u044F\u043B\u044C:2,\u0444\u0435\u0432\u0440\u044F\u043B\u044F:2,\u0444\u0435\u0432\u0440\u044F\u043B\u0435:2,\u043C\u0430\u0440\u0442:3,\u043C\u0430\u0440\u0442\u0430:3,\u043C\u0430\u0440\u0442\u0435:3,\u0430\u043F\u0440\u0435\u043B\u044C:4,\u0430\u043F\u0440\u0435\u043B\u044F:4,\u0430\u043F\u0440\u0435\u043B\u0435:4,\u043C\u0430\u0439:5,\u043C\u0430\u044F:5,\u043C\u0430\u0435:5,\u0438\u044E\u043D\u044C:6,\u0438\u044E\u043D\u044F:6,\u0438\u044E\u043D\u0435:6,\u0438\u044E\u043B\u044C:7,\u0438\u044E\u043B\u044F:7,\u0438\u044E\u043B\u0435:7,\u0430\u0432\u0433\u0443\u0441\u0442:8,\u0430\u0432\u0433\u0443\u0441\u0442\u0430:8,\u0430\u0432\u0433\u0443\u0441\u0442\u0435:8,\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C:9,\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044F:9,\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u0435:9,\u043E\u043A\u0442\u044F\u0431\u0440\u044C:10,\u043E\u043A\u0442\u044F\u0431\u0440\u044F:10,\u043E\u043A\u0442\u044F\u0431\u0440\u0435:10,\u043D\u043E\u044F\u0431\u0440\u044C:11,\u043D\u043E\u044F\u0431\u0440\u044F:11,\u043D\u043E\u044F\u0431\u0440\u0435:11,\u0434\u0435\u043A\u0430\u0431\u0440\u044C:12,\u0434\u0435\u043A\u0430\u0431\u0440\u044F:12,\u0434\u0435\u043A\u0430\u0431\u0440\u0435:12};Y.MONTH_DICTIONARY=Object.assign(Object.assign({},Y.FULL_MONTH_NAME_DICTIONARY),{\u044F\u043D\u0432:1,"\u044F\u043D\u0432.":1,\u0444\u0435\u0432:2,"\u0444\u0435\u0432.":2,\u043C\u0430\u0440:3,"\u043C\u0430\u0440.":3,\u0430\u043F\u0440:4,"\u0430\u043F\u0440.":4,\u0430\u0432\u0433:8,"\u0430\u0432\u0433.":8,\u0441\u0435\u043D:9,"\u0441\u0435\u043D.":9,\u043E\u043A\u0442:10,"\u043E\u043A\u0442.":10,\u043D\u043E\u044F:11,"\u043D\u043E\u044F.":11,\u0434\u0435\u043A:12,"\u0434\u0435\u043A.":12});Y.INTEGER_WORD_DICTIONARY={\u043E\u0434\u0438\u043D:1,\u043E\u0434\u043D\u0430:1,\u043E\u0434\u043D\u043E\u0439:1,\u043E\u0434\u043D\u0443:1,\u0434\u0432\u0435:2,\u0434\u0432\u0430:2,\u0434\u0432\u0443\u0445:2,\u0442\u0440\u0438:3,\u0442\u0440\u0435\u0445:3,\u0442\u0440\u0451\u0445:3,\u0447\u0435\u0442\u044B\u0440\u0435:4,\u0447\u0435\u0442\u044B\u0440\u0435\u0445:4,\u0447\u0435\u0442\u044B\u0440\u0451\u0445:4,\u043F\u044F\u0442\u044C:5,\u043F\u044F\u0442\u0438:5,\u0448\u0435\u0441\u0442\u044C:6,\u0448\u0435\u0441\u0442\u0438:6,\u0441\u0435\u043C\u044C:7,\u0441\u0435\u043C\u0438:7,\u0432\u043E\u0441\u0435\u043C\u044C:8,\u0432\u043E\u0441\u0435\u043C\u044C\u043C\u0438:8,\u0434\u0435\u0432\u044F\u0442\u044C:9,\u0434\u0435\u0432\u044F\u0442\u0438:9,\u0434\u0435\u0441\u044F\u0442\u044C:10,\u0434\u0435\u0441\u044F\u0442\u0438:10,\u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u044C:11,\u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u0438:11,\u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u044C:12,\u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u0438:12};Y.ORDINAL_WORD_DICTIONARY={\u043F\u0435\u0440\u0432\u043E\u0435:1,\u043F\u0435\u0440\u0432\u043E\u0433\u043E:1,\u0432\u0442\u043E\u0440\u043E\u0435:2,\u0432\u0442\u043E\u0440\u043E\u0433\u043E:2,\u0442\u0440\u0435\u0442\u044C\u0435:3,\u0442\u0440\u0435\u0442\u044C\u0435\u0433\u043E:3,\u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0435:4,\u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0433\u043E:4,\u043F\u044F\u0442\u043E\u0435:5,\u043F\u044F\u0442\u043E\u0433\u043E:5,\u0448\u0435\u0441\u0442\u043E\u0435:6,\u0448\u0435\u0441\u0442\u043E\u0433\u043E:6,\u0441\u0435\u0434\u044C\u043C\u043E\u0435:7,\u0441\u0435\u0434\u044C\u043C\u043E\u0433\u043E:7,\u0432\u043E\u0441\u044C\u043C\u043E\u0435:8,\u0432\u043E\u0441\u044C\u043C\u043E\u0433\u043E:8,\u0434\u0435\u0432\u044F\u0442\u043E\u0435:9,\u0434\u0435\u0432\u044F\u0442\u043E\u0433\u043E:9,\u0434\u0435\u0441\u044F\u0442\u043E\u0435:10,\u0434\u0435\u0441\u044F\u0442\u043E\u0433\u043E:10,\u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:11,\u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:11,\u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:12,\u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:12,\u0442\u0440\u0438\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:13,\u0442\u0440\u0438\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:13,\u0447\u0435\u0442\u044B\u0440\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:14,\u0447\u0435\u0442\u044B\u0440\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:14,\u043F\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:15,\u043F\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:15,\u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:16,\u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:16,\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:17,\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:17,\u0432\u043E\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:18,\u0432\u043E\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:18,\u0434\u0435\u0432\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:19,\u0434\u0435\u0432\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:19,\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u043E\u0435:20,\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:20,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435":21,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0433\u043E":21,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u0442\u043E\u0440\u043E\u0435":22,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u0442\u043E\u0440\u043E\u0433\u043E":22,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0442\u0440\u0435\u0442\u044C\u0435":23,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0442\u0440\u0435\u0442\u044C\u0435\u0433\u043E":23,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0435":24,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0433\u043E":24,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u044F\u0442\u043E\u0435":25,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u044F\u0442\u043E\u0433\u043E":25,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0448\u0435\u0441\u0442\u043E\u0435":26,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0448\u0435\u0441\u0442\u043E\u0433\u043E":26,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0441\u0435\u0434\u044C\u043C\u043E\u0435":27,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0441\u0435\u0434\u044C\u043C\u043E\u0433\u043E":27,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u043E\u0441\u044C\u043C\u043E\u0435":28,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u043E\u0441\u044C\u043C\u043E\u0433\u043E":28,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0434\u0435\u0432\u044F\u0442\u043E\u0435":29,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0434\u0435\u0432\u044F\u0442\u043E\u0433\u043E":29,\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u043E\u0435:30,\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u043E\u0433\u043E:30,"\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435":31,"\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0433\u043E":31};Y.TIME_UNIT_DICTIONARY={\u0441\u0435\u043A:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u0430:"second",\u0441\u0435\u043A\u0443\u043D\u0434:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u044B:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u0443:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0430:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0438:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u0435\u043A:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0443:"second",\u043C\u0438\u043D:"minute",\u043C\u0438\u043D\u0443\u0442\u0430:"minute",\u043C\u0438\u043D\u0443\u0442:"minute",\u043C\u0438\u043D\u0443\u0442\u044B:"minute",\u043C\u0438\u043D\u0443\u0442\u0443:"minute",\u043C\u0438\u043D\u0443\u0442\u043E\u043A:"minute",\u043C\u0438\u043D\u0443\u0442\u043A\u0438:"minute",\u043C\u0438\u043D\u0443\u0442\u043A\u0443:"minute",\u0447\u0430\u0441:"hour",\u0447\u0430\u0441\u043E\u0432:"hour",\u0447\u0430\u0441\u0430:"hour",\u0447\u0430\u0441\u0443:"hour",\u0447\u0430\u0441\u0438\u043A\u043E\u0432:"hour",\u0447\u0430\u0441\u0438\u043A\u0430:"hour",\u0447\u0430\u0441\u0438\u043A\u0435:"hour",\u0447\u0430\u0441\u0438\u043A:"hour",\u0434\u0435\u043D\u044C:"d",\u0434\u043D\u044F:"d",\u0434\u043D\u0435\u0439:"d",\u0441\u0443\u0442\u043E\u043A:"d",\u0441\u0443\u0442\u043A\u0438:"d",\u043D\u0435\u0434\u0435\u043B\u044F:"week",\u043D\u0435\u0434\u0435\u043B\u0435:"week",\u043D\u0435\u0434\u0435\u043B\u0438:"week",\u043D\u0435\u0434\u0435\u043B\u044E:"week",\u043D\u0435\u0434\u0435\u043B\u044C:"week",\u043D\u0435\u0434\u0435\u043B\u044C\u043A\u0435:"week",\u043D\u0435\u0434\u0435\u043B\u044C\u043A\u0438:"week",\u043D\u0435\u0434\u0435\u043B\u0435\u043A:"week",\u043C\u0435\u0441\u044F\u0446:"month",\u043C\u0435\u0441\u044F\u0446\u0435:"month",\u043C\u0435\u0441\u044F\u0446\u0435\u0432:"month",\u043C\u0435\u0441\u044F\u0446\u0430:"month",\u043A\u0432\u0430\u0440\u0442\u0430\u043B:"quarter",\u043A\u0432\u0430\u0440\u0442\u0430\u043B\u0435:"quarter",\u043A\u0432\u0430\u0440\u0442\u0430\u043B\u043E\u0432:"quarter",\u0433\u043E\u0434:"year",\u0433\u043E\u0434\u0430:"year",\u0433\u043E\u0434\u0443:"year",\u0433\u043E\u0434\u043E\u0432:"year",\u043B\u0435\u0442:"year",\u0433\u043E\u0434\u0438\u043A:"year",\u0433\u043E\u0434\u0438\u043A\u0430:"year",\u0433\u043E\u0434\u0438\u043A\u043E\u0432:"year"};Y.NUMBER_PATTERN=`(?:${Ba.matchAnyPattern(Y.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|\u043F\u043E\u043B|\u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E|\u043F\u0430\u0440(?:\u044B|\u0443)|\\s{0,3})`;function qg(r){let e=r.toLowerCase();return Y.INTEGER_WORD_DICTIONARY[e]!==void 0?Y.INTEGER_WORD_DICTIONARY[e]:e.match(/несколько/)?3:e.match(/пол/)?.5:e.match(/пар/)?2:e===""?1:parseFloat(e)}Y.parseNumberPattern=qg;Y.ORDINAL_NUMBER_PATTERN=`(?:${Ba.matchAnyPattern(Y.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:\u0433\u043E|\u043E\u0433\u043E|\u0435|\u043E\u0435)?)`;function IM(r){let e=r.toLowerCase();return Y.ORDINAL_WORD_DICTIONARY[e]!==void 0?Y.ORDINAL_WORD_DICTIONARY[e]:(e=e.replace(/(?:st|nd|rd|th)$/i,""),parseInt(e))}Y.parseOrdinalNumberPattern=IM;var ad="(?:\\s+(?:\u0433\u043E\u0434\u0443|\u0433\u043E\u0434\u0430|\u0433\u043E\u0434|\u0433|\u0433.))?";Y.YEAR_PATTERN=`(?:[1-9][0-9]{0,3}${ad}\\s*(?:\u043D.\u044D.|\u0434\u043E \u043D.\u044D.|\u043D. \u044D.|\u0434\u043E \u043D. \u044D.)|[1-2][0-9]{3}${ad}|[5-9][0-9]${ad})`;function FM(r){if(/(год|года|г|г.)/i.test(r)&&(r=r.replace(/(год|года|г|г.)/i,"")),/(до н.э.|до н. э.)/i.test(r))return r=r.replace(/(до н.э.|до н. э.)/i,""),-parseInt(r);if(/(н. э.|н.э.)/i.test(r))return r=r.replace(/(н. э.|н.э.)/i,""),parseInt(r);let e=parseInt(r);return NM.findMostLikelyADYear(e)}Y.parseYear=FM;var Wg=`(${Y.NUMBER_PATTERN})\\s{0,3}(${Ba.matchAnyPattern(Y.TIME_UNIT_DICTIONARY)})`,Lg=new RegExp(Wg,"i");Y.TIME_UNITS_PATTERN=Ba.repeatedTimeunitPattern("(?:(?:\u043E\u043A\u043E\u043B\u043E|\u043F\u0440\u0438\u043C\u0435\u0440\u043D\u043E)\\s{0,3})?",Wg);function UM(r){let e={},t=r,n=Lg.exec(t);for(;n;)LM(e,n),t=t.substring(n[0].length).trim(),n=Lg.exec(t);return e}Y.parseTimeUnits=UM;function LM(r,e){let t=qg(e[1]),n=Y.TIME_UNIT_DICTIONARY[e[2].toLowerCase()];r[n]=t}});var $g=p(ud=>{"use strict";Object.defineProperty(ud,"__esModule",{value:!0});var gs=st(),qM=be(),WM=M(),Yg=`(?:(?:\u043E\u043A\u043E\u043B\u043E|\u043F\u0440\u0438\u043C\u0435\u0440\u043D\u043E)\\s*(?:~\\s*)?)?(${gs.TIME_UNITS_PATTERN})${gs.REGEX_PARTS.rightBoundary}`,YM=new RegExp(`(?:\u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0435|\u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0438)\\s*${Yg}`,gs.REGEX_PARTS.flags),$M=new RegExp(Yg,"i"),od=class extends WM.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return gs.REGEX_PARTS.leftBoundary}innerPattern(e){return e.option.forwardDate?$M:YM}innerExtract(e,t){let n=gs.parseTimeUnits(t[1]);return qM.ParsingComponents.createRelativeFromReference(e.reference,n)}};ud.default=od});var zg=p(cd=>{"use strict";Object.defineProperty(cd,"__esModule",{value:!0});var jM=je(),_s=st(),Hg=st(),Ga=st(),BM=ie(),GM=M(),HM=new RegExp(`(?:\u0441)?\\s*(${Ga.ORDINAL_NUMBER_PATTERN})(?:\\s{0,3}(?:\u043F\u043E|-|\u2013|\u0434\u043E)?\\s{0,3}(${Ga.ORDINAL_NUMBER_PATTERN}))?(?:-|\\/|\\s{0,3}(?:of)?\\s{0,3})(${BM.matchAnyPattern(_s.MONTH_DICTIONARY)})(?:(?:-|\\/|,?\\s{0,3})(${Hg.YEAR_PATTERN}(?![^\\s]\\d)))?${_s.REGEX_PARTS.rightBoundary}`,_s.REGEX_PARTS.flags),jg=1,Bg=2,zM=3,Gg=4,ld=class extends GM.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return _s.REGEX_PARTS.leftBoundary}innerPattern(){return HM}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=_s.MONTH_DICTIONARY[t[zM].toLowerCase()],s=Ga.parseOrdinalNumberPattern(t[jg]);if(s>31)return t.index=t.index+t[jg].length,null;if(n.start.assign("month",i),n.start.assign("day",s),t[Gg]){let a=Hg.parseYear(t[Gg]);n.start.assign("year",a)}else{let a=jM.findYearClosestToRef(e.refDate,s,i);n.start.imply("year",a)}if(t[Bg]){let a=Ga.parseOrdinalNumberPattern(t[Bg]);n.end=n.start.clone(),n.end.assign("day",a)}return n}};cd.default=ld});var Xg=p(fd=>{"use strict";Object.defineProperty(fd,"__esModule",{value:!0});var Ts=st(),KM=je(),VM=ie(),Vg=st(),XM=M(),ZM=new RegExp(`((?:\u0432)\\s*)?(${VM.matchAnyPattern(Ts.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${Vg.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`,Ts.REGEX_PARTS.flags),QM=2,Kg=3,dd=class extends XM.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return Ts.REGEX_PARTS.leftBoundary}innerPattern(){return ZM}innerExtract(e,t){let n=t[QM].toLowerCase();if(t[0].length<=3&&!Ts.FULL_MONTH_NAME_DICTIONARY[n])return null;let i=e.createParsingResult(t.index,t.index+t[0].length);i.start.imply("day",1);let s=Ts.MONTH_DICTIONARY[n];if(i.start.assign("month",s),t[Kg]){let a=Vg.parseYear(t[Kg]);i.start.assign("year",a)}else{let a=KM.findYearClosestToRef(e.refDate,1,s);i.start.imply("year",a)}return i}};fd.default=dd});var Qg=p(hd=>{"use strict";Object.defineProperty(hd,"__esModule",{value:!0});var Ha=ke(),JM=Kr(),Zg=st(),pd=class extends JM.AbstractTimeExpressionParser{constructor(e){super(e)}patternFlags(){return Zg.REGEX_PARTS.flags}primaryPatternLeftBoundary(){return"(^|\\s|T|(?:[^\\p{L}\\p{N}_]))"}followingPhase(){return"\\s*(?:\\-|\\\u2013|\\~|\\\u301C|\u0434\u043E|\u0438|\u043F\u043E|\\?)\\s*"}primaryPrefix(){return"(?:(?:\u0432|\u0441)\\s*)??"}primarySuffix(){return`(?:\\s*(?:\u0443\u0442\u0440\u0430|\u0432\u0435\u0447\u0435\u0440\u0430|\u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043B\u0443\u0434\u043D\u044F))?(?!\\/)${Zg.REGEX_PARTS.rightBoundary}`}extractPrimaryTimeComponents(e,t){let n=super.extractPrimaryTimeComponents(e,t);if(n){if(t[0].endsWith("\u0432\u0435\u0447\u0435\u0440\u0430")){let i=n.get("hour");i>=6&&i<12?(n.assign("hour",n.get("hour")+12),n.assign("meridiem",Ha.Meridiem.PM)):i<6&&n.assign("meridiem",Ha.Meridiem.AM)}if(t[0].endsWith("\u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043B\u0443\u0434\u043D\u044F")){n.assign("meridiem",Ha.Meridiem.PM);let i=n.get("hour");i>=0&&i<=6&&n.assign("hour",n.get("hour")+12)}t[0].endsWith("\u0443\u0442\u0440\u0430")&&(n.assign("meridiem",Ha.Meridiem.AM),n.get("hour")<12&&n.assign("hour",n.get("hour")))}return n}};hd.default=pd});var Jg=p(yd=>{"use strict";Object.defineProperty(yd,"__esModule",{value:!0});var za=st(),eS=be(),tS=M(),rS=Ot(),nS=new RegExp(`(${za.TIME_UNITS_PATTERN})\\s{0,5}\u043D\u0430\u0437\u0430\u0434(?=(?:\\W|$))`,za.REGEX_PARTS.flags),md=class extends tS.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return za.REGEX_PARTS.leftBoundary}innerPattern(){return nS}innerExtract(e,t){let n=za.parseTimeUnits(t[1]),i=rS.reverseTimeUnits(n);return eS.ParsingComponents.createRelativeFromReference(e.reference,i)}};yd.default=md});var e_=p(bs=>{"use strict";var iS=bs&&bs.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(bs,"__esModule",{value:!0});var sS=iS(Qt()),gd=class extends sS.default{patternBetween(){return/^\s*(и до|и по|до|по|-)\s*$/i}};bs.default=gd});var t_=p(vs=>{"use strict";var aS=vs&&vs.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(vs,"__esModule",{value:!0});var oS=aS(or()),_d=class extends oS.default{patternBetween(){return new RegExp("^\\s*(T|\u0432|,|-)?\\s*$")}};vs.default=_d});var r_=p(mr=>{"use strict";var uS=mr&&mr.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),lS=mr&&mr.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),cS=mr&&mr.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&uS(e,r,t);return lS(e,r),e};Object.defineProperty(mr,"__esModule",{value:!0});var dS=M(),Es=cS(cr()),Td=st(),fS=new RegExp(`(?:\u0441|\u0441\u043E)?\\s*(\u0441\u0435\u0433\u043E\u0434\u043D\u044F|\u0432\u0447\u0435\u0440\u0430|\u0437\u0430\u0432\u0442\u0440\u0430|\u043F\u043E\u0441\u043B\u0435\u0437\u0430\u0432\u0442\u0440\u0430|\u043F\u043E\u0437\u0430\u0432\u0447\u0435\u0440\u0430)${Td.REGEX_PARTS.rightBoundary}`,Td.REGEX_PARTS.flags),bd=class extends dS.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return Td.REGEX_PARTS.leftBoundary}innerPattern(e){return fS}innerExtract(e,t){let n=t[1].toLowerCase(),i=e.createParsingComponents();switch(n){case"\u0441\u0435\u0433\u043E\u0434\u043D\u044F":return Es.today(e.reference);case"\u0432\u0447\u0435\u0440\u0430":return Es.yesterday(e.reference);case"\u0437\u0430\u0432\u0442\u0440\u0430":return Es.tomorrow(e.reference);case"\u043F\u043E\u0441\u043B\u0435\u0437\u0430\u0432\u0442\u0440\u0430":return Es.theDayAfter(e.reference,2);case"\u043F\u043E\u0437\u0430\u0432\u0447\u0435\u0440\u0430":return Es.theDayBefore(e.reference,2)}return i}};mr.default=bd});var n_=p(Wt=>{"use strict";var pS=Wt&&Wt.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),hS=Wt&&Wt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),mS=Wt&&Wt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&pS(e,r,t);return hS(e,r),e},yS=Wt&&Wt.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Wt,"__esModule",{value:!0});var gS=M(),rn=mS(cr()),_S=Rt(),TS=yS(ee()),vd=st(),bS=new RegExp(`(\u0441\u0435\u0439\u0447\u0430\u0441|\u043F\u0440\u043E\u0448\u043B\u044B\u043C\\s*\u0432\u0435\u0447\u0435\u0440\u043E\u043C|\u043F\u0440\u043E\u0448\u043B\u043E\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u0441\u0435\u0433\u043E\u0434\u043D\u044F\\s*\u043D\u043E\u0447\u044C\u044E|\u044D\u0442\u043E\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u043D\u043E\u0447\u044C\u044E|\u044D\u0442\u0438\u043C \u0443\u0442\u0440\u043E\u043C|\u0443\u0442\u0440\u043E\u043C|\u0443\u0442\u0440\u0430|\u0432\\s*\u043F\u043E\u043B\u0434\u0435\u043D\u044C|\u0432\u0435\u0447\u0435\u0440\u043E\u043C|\u0432\u0435\u0447\u0435\u0440\u0430|\u0432\\s*\u043F\u043E\u043B\u043D\u043E\u0447\u044C)${vd.REGEX_PARTS.rightBoundary}`,vd.REGEX_PARTS.flags),Ed=class extends gS.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return vd.REGEX_PARTS.leftBoundary}innerPattern(){return bS}innerExtract(e,t){let n=TS.default(e.refDate),i=t[0].toLowerCase(),s=e.createParsingComponents();if(i==="\u0441\u0435\u0439\u0447\u0430\u0441")return rn.now(e.reference);if(i==="\u0432\u0435\u0447\u0435\u0440\u043E\u043C"||i==="\u0432\u0435\u0447\u0435\u0440\u0430")return rn.evening(e.reference);if(i.endsWith("\u0443\u0442\u0440\u043E\u043C")||i.endsWith("\u0443\u0442\u0440\u0430"))return rn.morning(e.reference);if(i.match(/в\s*полдень/))return rn.noon(e.reference);if(i.match(/прошлой\s*ночью/))return rn.lastNight(e.reference);if(i.match(/прошлым\s*вечером/))return rn.yesterdayEvening(e.reference);if(i.match(/следующей\s*ночью/)){let a=n.hour()<22?1:2;n=n.add(a,"day"),_S.assignSimilarDate(s,n),s.imply("hour",0)}return i.match(/в\s*полночь/)||i.endsWith("\u043D\u043E\u0447\u044C\u044E")?rn.midnight(e.reference):s}};Wt.default=Ed});var i_=p(Rd=>{"use strict";Object.defineProperty(Rd,"__esModule",{value:!0});var ws=st(),vS=ie(),ES=M(),wS=Xr(),RS=new RegExp(`(?:(?:,|\\(|\uFF08)\\s*)?(?:\u0432\\s*?)?(?:(\u044D\u0442\u0443|\u044D\u0442\u043E\u0442|\u043F\u0440\u043E\u0448\u043B\u044B\u0439|\u043F\u0440\u043E\u0448\u043B\u0443\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E)\\s*)?(${vS.matchAnyPattern(ws.WEEKDAY_DICTIONARY)})(?:\\s*(?:,|\\)|\uFF09))?(?:\\s*\u043D\u0430\\s*(\u044D\u0442\u043E\u0439|\u043F\u0440\u043E\u0448\u043B\u043E\u0439|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439)\\s*\u043D\u0435\u0434\u0435\u043B\u0435)?${ws.REGEX_PARTS.rightBoundary}`,ws.REGEX_PARTS.flags),OS=1,DS=2,MS=3,wd=class extends ES.AbstractParserWithWordBoundaryChecking{innerPattern(){return RS}patternLeftBoundary(){return ws.REGEX_PARTS.leftBoundary}innerExtract(e,t){let n=t[DS].toLowerCase(),i=ws.WEEKDAY_DICTIONARY[n],s=t[OS],a=t[MS],o=s||a;o=o||"",o=o.toLowerCase();let u=null;o=="\u043F\u0440\u043E\u0448\u043B\u044B\u0439"||o=="\u043F\u0440\u043E\u0448\u043B\u0443\u044E"||o=="\u043F\u0440\u043E\u0448\u043B\u043E\u0439"?u="last":o=="\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439"||o=="\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E"||o=="\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439"||o=="\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E"?u="next":(o=="\u044D\u0442\u043E\u0442"||o=="\u044D\u0442\u0443"||o=="\u044D\u0442\u043E\u0439")&&(u="this");let l=wS.toDayJSWeekday(e.refDate,i,u);return e.createParsingComponents().assign("weekday",i).imply("day",l.date()).imply("month",l.month()+1).imply("year",l.year())}};Rd.default=wd});var a_=p(Os=>{"use strict";var SS=Os&&Os.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Os,"__esModule",{value:!0});var Rs=st(),s_=be(),kS=SS(ee()),PS=M(),AS=ie(),xS=new RegExp(`(\u0432 \u043F\u0440\u043E\u0448\u043B\u043E\u043C|\u043D\u0430 \u043F\u0440\u043E\u0448\u043B\u043E\u0439|\u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439|\u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C|\u043D\u0430 \u044D\u0442\u043E\u0439|\u0432 \u044D\u0442\u043E\u043C)\\s*(${AS.matchAnyPattern(Rs.TIME_UNIT_DICTIONARY)})(?=\\s*)${Rs.REGEX_PARTS.rightBoundary}`,Rs.REGEX_PARTS.flags),CS=1,NS=2,Od=class extends PS.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return Rs.REGEX_PARTS.leftBoundary}innerPattern(){return xS}innerExtract(e,t){let n=t[CS].toLowerCase(),i=t[NS].toLowerCase(),s=Rs.TIME_UNIT_DICTIONARY[i];if(n=="\u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439"||n=="\u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C"){let u={};return u[s]=1,s_.ParsingComponents.createRelativeFromReference(e.reference,u)}if(n=="\u0432 \u043F\u0440\u043E\u0448\u043B\u043E\u043C"||n=="\u043D\u0430 \u043F\u0440\u043E\u0448\u043B\u043E\u0439"){let u={};return u[s]=-1,s_.ParsingComponents.createRelativeFromReference(e.reference,u)}let a=e.createParsingComponents(),o=kS.default(e.reference.instant);return s.match(/week/i)?(o=o.add(-o.get("d"),"d"),a.imply("day",o.date()),a.imply("month",o.month()+1),a.imply("year",o.year())):s.match(/month/i)?(o=o.add(-o.date()+1,"d"),a.imply("day",o.date()),a.assign("year",o.year()),a.assign("month",o.month()+1)):s.match(/year/i)&&(o=o.add(-o.date()+1,"d"),o=o.add(-o.month(),"month"),a.imply("day",o.date()),a.imply("month",o.month()+1),a.assign("year",o.year())),a}};Os.default=Od});var o_=p(Md=>{"use strict";Object.defineProperty(Md,"__esModule",{value:!0});var Ds=st(),IS=be(),FS=M(),US=Ot(),LS=new RegExp(`(\u044D\u0442\u0438|\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435|\u043F\u0440\u043E\u0448\u043B\u044B\u0435|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435|\u043F\u043E\u0441\u043B\u0435|\u0447\u0435\u0440\u0435\u0437|\\+|-)\\s*(${Ds.TIME_UNITS_PATTERN})${Ds.REGEX_PARTS.rightBoundary}`,Ds.REGEX_PARTS.flags),Dd=class extends FS.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return Ds.REGEX_PARTS.leftBoundary}innerPattern(){return LS}innerExtract(e,t){let n=t[1].toLowerCase(),i=Ds.parseTimeUnits(t[2]);switch(n){case"\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435":case"\u043F\u0440\u043E\u0448\u043B\u044B\u0435":case"-":i=US.reverseTimeUnits(i);break}return IS.ParsingComponents.createRelativeFromReference(e.reference,i)}};Md.default=Dd});var c_=p(qe=>{"use strict";var mt=qe&&qe.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(qe,"__esModule",{value:!0});qe.createConfiguration=qe.createCasualConfiguration=qe.parseDate=qe.parse=qe.strict=qe.casual=void 0;var qS=mt($g()),WS=mt(zg()),YS=mt(Xg()),$S=mt(Qg()),jS=mt(Jg()),BS=mt(e_()),GS=mt(t_()),HS=ur(),zS=mt(r_()),KS=mt(n_()),VS=mt(i_()),XS=mt(a_()),u_=It(),ZS=mt(Zr()),QS=mt(o_());qe.casual=new u_.Chrono(l_());qe.strict=new u_.Chrono(Sd(!0));function JS(r,e,t){return qe.casual.parse(r,e,t)}qe.parse=JS;function ek(r,e,t){return qe.casual.parseDate(r,e,t)}qe.parseDate=ek;function l_(){let r=Sd(!1);return r.parsers.unshift(new zS.default),r.parsers.unshift(new KS.default),r.parsers.unshift(new YS.default),r.parsers.unshift(new XS.default),r.parsers.unshift(new QS.default),r}qe.createCasualConfiguration=l_;function Sd(r=!0){return HS.includeCommonConfiguration({parsers:[new ZS.default(!0),new qS.default,new WS.default,new VS.default,new $S.default(r),new jS.default],refiners:[new GS.default,new BS.default]},r)}qe.createConfiguration=Sd});var ke=p(G=>{"use strict";var tk=G&&G.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),rk=G&&G.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),Ur=G&&G.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&tk(e,r,t);return rk(e,r),e};Object.defineProperty(G,"__esModule",{value:!0});G.parseDate=G.parse=G.casual=G.strict=G.ru=G.zh=G.nl=G.pt=G.ja=G.fr=G.de=G.Meridiem=G.Chrono=G.en=void 0;var kd=Ur(Hu());G.en=kd;var nk=It();Object.defineProperty(G,"Chrono",{enumerable:!0,get:function(){return nk.Chrono}});var ik;(function(r){r[r.AM=0]="AM",r[r.PM=1]="PM"})(ik=G.Meridiem||(G.Meridiem={}));var sk=Ur(Tm());G.de=sk;var ak=Ur(Km());G.fr=ak;var ok=Ur(ny());G.ja=ok;var uk=Ur(Ty());G.pt=uk;var lk=Ur(ng());G.nl=lk;var ck=Ur(Ug());G.zh=ck;var dk=Ur(c_());G.ru=dk;G.strict=kd.strict;G.casual=kd.casual;function fk(r,e,t){return G.casual.parse(r,e,t)}G.parse=fk;function pk(r,e,t){return G.casual.parseDate(r,e,t)}G.parseDate=pk});var nr=p(Yr=>{"use strict";Yr.__esModule=!0;var Yk;(function(r){r.AND="AND",r.OR="OR",r.XOR="XOR",r.NOT="NOT"})(Yk=Yr.Operators||(Yr.Operators={}));var $k;(function(r){r.OPEN_PARENTHESIS="(",r.CLOSE_PARENTHESIS=")"})($k=Yr.StructuralCharacters||(Yr.StructuralCharacters={}));var jk;(function(r){r.IDENTIFIER="IDENTIFIER",r.OPERATOR="OPERATOR",r.STRUCTURAL_CHARACTER="STRUCTURAL_CHARACTER",r.EOF="EOF",r.COMMENT="COMMENT"})(jk=Yr.Tokens||(Yr.Tokens={}))});var Qd=p(co=>{"use strict";co.__esModule=!0;var ve=nr();co.OPERATOR_PRECEDENCE={NOT:0,XOR:1,AND:2,OR:3};co.VALID_TOKENS={identifierOnly:[{name:ve.Tokens.IDENTIFIER},{name:ve.Tokens.STRUCTURAL_CHARACTER,value:ve.StructuralCharacters.OPEN_PARENTHESIS}],identifierOrNot:[{name:ve.Tokens.IDENTIFIER},{name:ve.Tokens.STRUCTURAL_CHARACTER,value:ve.StructuralCharacters.OPEN_PARENTHESIS},{name:ve.Tokens.OPERATOR,value:ve.Operators.NOT}],binaryOperator:[{name:ve.Tokens.OPERATOR,value:ve.Operators.AND},{name:ve.Tokens.OPERATOR,value:ve.Operators.OR},{name:ve.Tokens.OPERATOR,value:ve.Operators.XOR}],binaryOperatorOrClose:[{name:ve.Tokens.OPERATOR,value:ve.Operators.AND},{name:ve.Tokens.OPERATOR,value:ve.Operators.OR},{name:ve.Tokens.OPERATOR,value:ve.Operators.XOR},{name:ve.Tokens.STRUCTURAL_CHARACTER,value:ve.StructuralCharacters.CLOSE_PARENTHESIS}]}});var Jd=p(Er=>{"use strict";Er.__esModule=!0;var ii=nr();Er.STRUCTURAL_CHARACTERS={"(":ii.StructuralCharacters.OPEN_PARENTHESIS,")":ii.StructuralCharacters.CLOSE_PARENTHESIS};Er.OPERATORS={AND:ii.Operators.AND,OR:ii.Operators.OR,XOR:ii.Operators.XOR,NOT:ii.Operators.NOT};Er.SEPARATORS=new Set([32,9,10,13].map(function(r){return String.fromCodePoint(r)}));Er.QUOTED_IDENTIFIER_DELIMITER=String.fromCodePoint(34);Er.COMMENT_DELIMITER=String.fromCodePoint(35);Er.EOL=String.fromCodePoint(10);Er.ESCAPE_CHARACTER=String.fromCodePoint(92)});var B_=p(wr=>{"use strict";var ef=wr&&wr.__assign||function(){return ef=Object.assign||function(r){for(var e,t=1,n=arguments.length;t{"use strict";tf.__esModule=!0;var si=nr(),_t=Jd(),ai=B_();tf.lex=function(r){for(var e=null,t=null,n=null,i=0;i{"use strict";var Bk=Rr&&Rr.__spreadArrays||function(){for(var r=0,e=0,t=arguments.length;e{"use strict";var ui=Fs&&Fs.__spreadArrays||function(){for(var r=0,e=0,t=arguments.length;e{"use strict";Or.__esModule=!0;var V_=nr();Or.andUtil=function(r,e){return r&&e};Or.orUtil=function(r,e){return r||e};Or.xorUtil=function(r,e){return r!==e};Or.notUtil=function(r){return!r};Or.isIdentifier=function(r){var e=r.name,t=r.value;return e===V_.Tokens.IDENTIFIER&&typeof t=="string"};Or.isOperator=function(r){var e=r.name,t=r.value;return e===V_.Tokens.OPERATOR&&typeof t=="string"};Or.throwInvalidExpression=function(r){throw new TypeError("Invalid postfix expression: "+r)}});var X_=p(uf=>{"use strict";var Us;uf.__esModule=!0;var af=nr(),of=sf();uf.OPERATOR_MAP=(Us={},Us[af.Operators.AND]=of.andUtil,Us[af.Operators.OR]=of.orUtil,Us[af.Operators.XOR]=of.xorUtil,Us)});var Q_=p(yn=>{"use strict";var lf=yn&&yn.__spreadArrays||function(){for(var r=0,e=0,t=arguments.length;e{"use strict";Ls.__esModule=!0;var J_=Q_();Ls.getEvaluator=J_.getEvaluator;Ls.evaluate=J_.evaluate;var Kk=nf();Ls.parse=Kk.parse});var rP={};TT(rP,{default:()=>Po});module.exports=bT(rP);var dT=require("obsidian");var zn=require("obsidian");var iP=new Error("timeout while waiting for mutex to become available"),sP=new Error("mutex already locked"),vT=new Error("request for lock canceled"),xf=function(r,e,t,n){function i(s){return s instanceof t?s:new t(function(a){a(s)})}return new(t||(t=Promise))(function(s,a){function o(c){try{l(n.next(c))}catch(d){a(d)}}function u(c){try{l(n.throw(c))}catch(d){a(d)}}function l(c){c.done?s(c.value):i(c.value).then(o,u)}l((n=n.apply(r,e||[])).next())})},Co=class{constructor(e,t=vT){if(this._maxConcurrency=e,this._cancelError=t,this._queue=[],this._waiters=[],e<=0)throw new Error("semaphore must be initialized to a positive value");this._value=e}acquire(){let e=this.isLocked(),t=new Promise((n,i)=>this._queue.push({resolve:n,reject:i}));return e||this._dispatch(),t}runExclusive(e){return xf(this,void 0,void 0,function*(){let[t,n]=yield this.acquire();try{return yield e(t)}finally{n()}})}waitForUnlock(){return xf(this,void 0,void 0,function*(){return this.isLocked()?new Promise(t=>this._waiters.push({resolve:t})):Promise.resolve()})}isLocked(){return this._value<=0}release(){if(this._maxConcurrency>1)throw new Error("this method is unavailable on semaphores with concurrency > 1; use the scoped release returned by acquire instead");if(this._currentReleaser){let e=this._currentReleaser;this._currentReleaser=void 0,e()}}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatch(){let e=this._queue.shift();if(!e)return;let t=!1;this._currentReleaser=()=>{t||(t=!0,this._value++,this._resolveWaiters(),this._dispatch())},e.resolve([this._value--,this._currentReleaser])}_resolveWaiters(){this._waiters.forEach(e=>e.resolve()),this._waiters=[]}},ET=function(r,e,t,n){function i(s){return s instanceof t?s:new t(function(a){a(s)})}return new(t||(t=Promise))(function(s,a){function o(c){try{l(n.next(c))}catch(d){a(d)}}function u(c){try{l(n.throw(c))}catch(d){a(d)}}function l(c){c.done?s(c.value):i(c.value).then(o,u)}l((n=n.apply(r,e||[])).next())})},Vs=class{constructor(e){this._semaphore=new Co(1,e)}acquire(){return ET(this,void 0,void 0,function*(){let[,e]=yield this._semaphore.acquire();return e})}runExclusive(e){return this._semaphore.runExclusive(()=>e())}isLocked(){return this._semaphore.isLocked()}waitForUnlock(){return this._semaphore.waitForUnlock()}release(){this._semaphore.release()}cancel(){return this._semaphore.cancel()}};var bi=class{constructor(){this.hideTaskCount=!1;this.hideBacklinks=!1;this.hidePriority=!1;this.hideStartDate=!1;this.hideScheduledDate=!1;this.hideDoneDate=!1;this.hideDueDate=!1;this.hideRecurrenceRule=!1;this.hideEditButton=!1;this.hideUrgency=!0;this.shortMode=!1;this.explainQuery=!1}},On=class{constructor(e,t){this.defaultLayout=["description","priority","recurrenceRule","startDate","scheduledDate","dueDate","doneDate","blockLink"];e?this.options=e:this.options=new bi,t?this.layoutComponents=t:this.layoutComponents=this.defaultLayout,this.layoutComponents=this.applyOptions(this.options)}applyOptions(e){let t=(i,s,a)=>s?i.filter(o=>o!=a):i,n=this.layoutComponents;return n=t(n,e.hidePriority,"priority"),n=t(n,e.hideRecurrenceRule,"recurrenceRule"),n=t(n,e.hideStartDate,"startDate"),n=t(n,e.hideScheduledDate,"scheduledDate"),n=t(n,e.hideDueDate,"dueDate"),n=t(n,e.hideDoneDate,"doneDate"),n}};var Xs=["MO","TU","WE","TH","FR","SA","SU"],Re=function(){function r(e,t){if(t===0)throw new Error("Can't create weekday with n == 0");this.weekday=e,this.n=t}return r.fromStr=function(e){return new r(Xs.indexOf(e))},r.prototype.nth=function(e){return this.n===e?this:new r(this.weekday,e)},r.prototype.equals=function(e){return this.weekday===e.weekday&&this.n===e.n},r.prototype.toString=function(){var e=Xs[this.weekday];return this.n&&(e=(this.n>0?"+":"")+String(this.n)+e),e},r.prototype.getJsWeekday=function(){return this.weekday===6?0:this.weekday+1},r}();var pe=function(r){return r!=null},dt=function(r){return typeof r=="number"},No=function(r){return typeof r=="string"&&Xs.includes(r)},$e=Array.isArray,Et=function(r,e){e===void 0&&(e=r),arguments.length===1&&(e=r,r=0);for(var t=[],n=r;n>0,n.length>e?String(n):(e=e-n.length,e>t.length&&(t+=V(t,e/t.length)),t.slice(0,e)+String(n))}var Nf=function(r,e,t){var n=r.split(e);return t?n.slice(0,t).concat([n.slice(t).join(e)]):n},He=function(r,e){var t=r%e;return t*e<0?t+e:t},Zs=function(r,e){return{div:Math.floor(r/e),mod:He(r,e)}},ft=function(r){return!pe(r)||r.length===0},Ee=function(r){return!ft(r)},Z=function(r,e){return Ee(r)&&r.indexOf(e)!==-1};var Sr;(function(r){r.MONTH_DAYS=[31,28,31,30,31,30,31,31,30,31,30,31],r.ONE_DAY=1e3*60*60*24,r.MAXYEAR=9999,r.ORDINAL_BASE=new Date(Date.UTC(1970,0,1)),r.PY_WEEKDAYS=[6,0,1,2,3,4,5],r.getYearDay=function(e){var t=new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate());return Math.ceil((t.valueOf()-new Date(e.getUTCFullYear(),0,1).valueOf())/r.ONE_DAY)+1},r.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},r.isDate=function(e){return e instanceof Date},r.isValidDate=function(e){return r.isDate(e)&&!isNaN(e.getTime())},r.tzOffset=function(e){return e.getTimezoneOffset()*60*1e3},r.daysBetween=function(e,t){var n=e.getTime()-r.tzOffset(e),i=t.getTime()-r.tzOffset(t),s=n-i;return Math.round(s/r.ONE_DAY)},r.toOrdinal=function(e){return r.daysBetween(e,r.ORDINAL_BASE)},r.fromOrdinal=function(e){return new Date(r.ORDINAL_BASE.getTime()+e*r.ONE_DAY)},r.getMonthDays=function(e){var t=e.getUTCMonth();return t===1&&r.isLeapYear(e.getUTCFullYear())?29:r.MONTH_DAYS[t]},r.getWeekday=function(e){return r.PY_WEEKDAYS[e.getUTCDay()]},r.monthRange=function(e,t){var n=new Date(Date.UTC(e,t,1));return[r.getWeekday(n),r.getMonthDays(n)]},r.combine=function(e,t){return t=t||e,new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()))},r.clone=function(e){var t=new Date(e.getTime());return t},r.cloneDates=function(e){for(var t=[],n=0;nthis.maxDate;if(this.method==="between"){if(t)return!0;if(n)return!1}else if(this.method==="before"){if(n)return!1}else if(this.method==="after")return t?!0:(this.add(e),!1);return this.add(e)},r.prototype.add=function(e){return this._result.push(e),!0},r.prototype.getValue=function(){var e=this._result;switch(this.method){case"all":case"between":return e;case"before":case"after":default:return e.length?e[e.length-1]:null}},r.prototype.clone=function(){return new r(this.method,this.args)},r}(),sr=wT;var np=Ks(rp(),1),{__extends:Mn,__assign:Qe,__rest:mP,__decorate:yP,__param:gP,__metadata:_P,__awaiter:TP,__generator:bP,__exportStar:vP,__createBinding:EP,__values:wP,__read:RP,__spread:OP,__spreadArrays:DP,__spreadArray:T,__await:MP,__asyncGenerator:SP,__asyncDelegator:kP,__asyncValues:PP,__makeTemplateObject:AP,__importStar:xP,__importDefault:CP,__classPrivateFieldGet:NP,__classPrivateFieldSet:IP,__classPrivateFieldIn:FP}=np.default;var RT=function(r){Mn(e,r);function e(t,n,i){var s=r.call(this,t,n)||this;return s.iterator=i,s}return e.prototype.add=function(t){return this.iterator(t,this._result.length)?(this._result.push(t),!0):!1},e}(sr),Fo=RT;var OT={dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],tokens:{SKIP:/^[ \r\n\t]+|^\.$/,number:/^[1-9][0-9]*/,numberAsText:/^(one|two|three)/i,every:/^every/i,"day(s)":/^days?/i,"weekday(s)":/^weekdays?/i,"week(s)":/^weeks?/i,"hour(s)":/^hours?/i,"minute(s)":/^minutes?/i,"month(s)":/^months?/i,"year(s)":/^years?/i,on:/^(on|in)/i,at:/^(at)/i,the:/^the/i,first:/^first/i,second:/^second/i,third:/^third/i,nth:/^([1-9][0-9]*)(\.|th|nd|rd|st)/i,last:/^last/i,for:/^for/i,"time(s)":/^times?/i,until:/^(un)?til/i,monday:/^mo(n(day)?)?/i,tuesday:/^tu(e(s(day)?)?)?/i,wednesday:/^we(d(n(esday)?)?)?/i,thursday:/^th(u(r(sday)?)?)?/i,friday:/^fr(i(day)?)?/i,saturday:/^sa(t(urday)?)?/i,sunday:/^su(n(day)?)?/i,january:/^jan(uary)?/i,february:/^feb(ruary)?/i,march:/^mar(ch)?/i,april:/^apr(il)?/i,may:/^may/i,june:/^june?/i,july:/^july?/i,august:/^aug(ust)?/i,september:/^sep(t(ember)?)?/i,october:/^oct(ober)?/i,november:/^nov(ember)?/i,december:/^dec(ember)?/i,comma:/^(,\s*|(and|or)\s*)+/i}},Br=OT;var ip=function(r,e){return r.indexOf(e)!==-1},DT=function(r){return r.toString()},MT=function(r,e,t){return"".concat(e," ").concat(t,", ").concat(r)},ST=function(){function r(e,t,n,i){if(t===void 0&&(t=DT),n===void 0&&(n=Br),i===void 0&&(i=MT),this.text=[],this.language=n||Br,this.gettext=t,this.dateFormatter=i,this.rrule=e,this.options=e.options,this.origOptions=e.origOptions,this.origOptions.bymonthday){var s=[].concat(this.options.bymonthday),a=[].concat(this.options.bynmonthday);s.sort(function(c,d){return c-d}),a.sort(function(c,d){return d-c}),this.bymonthday=s.concat(a),this.bymonthday.length||(this.bymonthday=null)}if(pe(this.origOptions.byweekday)){var o=$e(this.origOptions.byweekday)?this.origOptions.byweekday:[this.origOptions.byweekday],u=String(o);this.byweekday={allWeeks:o.filter(function(c){return!c.n}),someWeeks:o.filter(function(c){return Boolean(c.n)}),isWeekdays:u.indexOf("MO")!==-1&&u.indexOf("TU")!==-1&&u.indexOf("WE")!==-1&&u.indexOf("TH")!==-1&&u.indexOf("FR")!==-1&&u.indexOf("SA")===-1&&u.indexOf("SU")===-1,isEveryDay:u.indexOf("MO")!==-1&&u.indexOf("TU")!==-1&&u.indexOf("WE")!==-1&&u.indexOf("TH")!==-1&&u.indexOf("FR")!==-1&&u.indexOf("SA")!==-1&&u.indexOf("SU")!==-1};var l=function(c,d){return c.weekday-d.weekday};this.byweekday.allWeeks.sort(l),this.byweekday.someWeeks.sort(l),this.byweekday.allWeeks.length||(this.byweekday.allWeeks=null),this.byweekday.someWeeks.length||(this.byweekday.someWeeks=null)}else this.byweekday=null}return r.isFullyConvertible=function(e){var t=!0;if(!(e.options.freq in r.IMPLEMENTED)||e.origOptions.until&&e.origOptions.count)return!1;for(var n in e.origOptions){if(ip(["dtstart","wkst","freq"],n))return!0;if(!ip(r.IMPLEMENTED[e.options.freq],n))return!1}return t},r.prototype.isFullyConvertible=function(){return r.isFullyConvertible(this.rrule)},r.prototype.toString=function(){var e=this.gettext;if(!(this.options.freq in r.IMPLEMENTED))return e("RRule error: Unable to fully convert this rrule to text");if(this.text=[e("every")],this[k.FREQUENCIES[this.options.freq]](),this.options.until){this.add(e("until"));var t=this.options.until;this.add(this.dateFormatter(t.getUTCFullYear(),this.language.monthNames[t.getUTCMonth()],t.getUTCDate()))}else this.options.count&&this.add(e("for")).add(this.options.count.toString()).add(this.plural(this.options.count)?e("times"):e("time"));return this.isFullyConvertible()||this.add(e("(~ approximate)")),this.text.join("")},r.prototype.HOURLY=function(){var e=this.gettext;this.options.interval!==1&&this.add(this.options.interval.toString()),this.add(this.plural(this.options.interval)?e("hours"):e("hour"))},r.prototype.MINUTELY=function(){var e=this.gettext;this.options.interval!==1&&this.add(this.options.interval.toString()),this.add(this.plural(this.options.interval)?e("minutes"):e("minute"))},r.prototype.DAILY=function(){var e=this.gettext;this.options.interval!==1&&this.add(this.options.interval.toString()),this.byweekday&&this.byweekday.isWeekdays?this.add(this.plural(this.options.interval)?e("weekdays"):e("weekday")):this.add(this.plural(this.options.interval)?e("days"):e("day")),this.origOptions.bymonth&&(this.add(e("in")),this._bymonth()),this.bymonthday?this._bymonthday():this.byweekday?this._byweekday():this.origOptions.byhour&&this._byhour()},r.prototype.WEEKLY=function(){var e=this.gettext;this.options.interval!==1&&this.add(this.options.interval.toString()).add(this.plural(this.options.interval)?e("weeks"):e("week")),this.byweekday&&this.byweekday.isWeekdays?this.options.interval===1?this.add(this.plural(this.options.interval)?e("weekdays"):e("weekday")):this.add(e("on")).add(e("weekdays")):this.byweekday&&this.byweekday.isEveryDay?this.add(this.plural(this.options.interval)?e("days"):e("day")):(this.options.interval===1&&this.add(e("week")),this.origOptions.bymonth&&(this.add(e("in")),this._bymonth()),this.bymonthday?this._bymonthday():this.byweekday&&this._byweekday())},r.prototype.MONTHLY=function(){var e=this.gettext;this.origOptions.bymonth?(this.options.interval!==1&&(this.add(this.options.interval.toString()).add(e("months")),this.plural(this.options.interval)&&this.add(e("in"))),this._bymonth()):(this.options.interval!==1&&this.add(this.options.interval.toString()),this.add(this.plural(this.options.interval)?e("months"):e("month"))),this.bymonthday?this._bymonthday():this.byweekday&&this.byweekday.isWeekdays?this.add(e("on")).add(e("weekdays")):this.byweekday&&this._byweekday()},r.prototype.YEARLY=function(){var e=this.gettext;this.origOptions.bymonth?(this.options.interval!==1&&(this.add(this.options.interval.toString()),this.add(e("years"))),this._bymonth()):(this.options.interval!==1&&this.add(this.options.interval.toString()),this.add(this.plural(this.options.interval)?e("years"):e("year"))),this.bymonthday?this._bymonthday():this.byweekday&&this._byweekday(),this.options.byyearday&&this.add(e("on the")).add(this.list(this.options.byyearday,this.nth,e("and"))).add(e("day")),this.options.byweekno&&this.add(e("in")).add(this.plural(this.options.byweekno.length)?e("weeks"):e("week")).add(this.list(this.options.byweekno,void 0,e("and")))},r.prototype._bymonthday=function(){var e=this.gettext;this.byweekday&&this.byweekday.allWeeks?this.add(e("on")).add(this.list(this.byweekday.allWeeks,this.weekdaytext,e("or"))).add(e("the")).add(this.list(this.bymonthday,this.nth,e("or"))):this.add(e("on the")).add(this.list(this.bymonthday,this.nth,e("and")))},r.prototype._byweekday=function(){var e=this.gettext;this.byweekday.allWeeks&&!this.byweekday.isWeekdays&&this.add(e("on")).add(this.list(this.byweekday.allWeeks,this.weekdaytext)),this.byweekday.someWeeks&&(this.byweekday.allWeeks&&this.add(e("and")),this.add(e("on the")).add(this.list(this.byweekday.someWeeks,this.weekdaytext,e("and"))))},r.prototype._byhour=function(){var e=this.gettext;this.add(e("at")).add(this.list(this.origOptions.byhour,void 0,e("and")))},r.prototype._bymonth=function(){this.add(this.list(this.options.bymonth,this.monthtext,this.gettext("and")))},r.prototype.nth=function(e){e=parseInt(e.toString(),10);var t,n=this.gettext;if(e===-1)return n("last");var i=Math.abs(e);switch(i){case 1:case 21:case 31:t=i+n("st");break;case 2:case 22:t=i+n("nd");break;case 3:case 23:t=i+n("rd");break;default:t=i+n("th")}return e<0?t+" "+n("last"):t},r.prototype.monthtext=function(e){return this.language.monthNames[e-1]},r.prototype.weekdaytext=function(e){var t=dt(e)?(e+1)%7:e.getJsWeekday();return(e.n?this.nth(e.n)+" ":"")+this.language.dayNames[t]},r.prototype.plural=function(e){return e%100!==1},r.prototype.add=function(e){return this.text.push(" "),this.text.push(e),this},r.prototype.list=function(e,t,n,i){var s=this;i===void 0&&(i=","),$e(e)||(e=[e]);var a=function(u,l,c){for(var d="",f=0;fe[0].length)&&(e=s,t=i)}if(e!=null&&(this.text=this.text.substr(e[0].length),this.text===""&&(this.done=!0)),e==null){this.done=!0,this.symbol=null,this.value=null;return}}while(t==="SKIP");return this.symbol=t,this.value=e,!0},r.prototype.accept=function(e){if(this.symbol===e){if(this.value){var t=this.value;return this.nextSymbol(),t}return this.nextSymbol(),!0}return!1},r.prototype.acceptNumber=function(){return this.accept("number")},r.prototype.expect=function(e){if(this.accept(e))return!0;throw new Error("expected "+e+" but found "+this.symbol)},r}();function vi(r,e){e===void 0&&(e=Br);var t={},n=new kT(e.tokens);if(!n.start(r))return null;return i(),t;function i(){n.expect("every");var f=n.acceptNumber();if(f&&(t.interval=parseInt(f[0],10)),n.isDone())throw new Error("Unexpected end");switch(n.symbol){case"day(s)":t.freq=k.DAILY,n.nextSymbol()&&(a(),d());break;case"weekday(s)":t.freq=k.WEEKLY,t.byweekday=[k.MO,k.TU,k.WE,k.TH,k.FR],n.nextSymbol(),d();break;case"week(s)":t.freq=k.WEEKLY,n.nextSymbol()&&(s(),d());break;case"hour(s)":t.freq=k.HOURLY,n.nextSymbol()&&(s(),d());break;case"minute(s)":t.freq=k.MINUTELY,n.nextSymbol()&&(s(),d());break;case"month(s)":t.freq=k.MONTHLY,n.nextSymbol()&&(s(),d());break;case"year(s)":t.freq=k.YEARLY,n.nextSymbol()&&(s(),d());break;case"monday":case"tuesday":case"wednesday":case"thursday":case"friday":case"saturday":case"sunday":t.freq=k.WEEKLY;var h=n.symbol.substr(0,2).toUpperCase();if(t.byweekday=[k[h]],!n.nextSymbol())return;for(;n.accept("comma");){if(n.isDone())throw new Error("Unexpected end");var y=u();if(!y)throw new Error("Unexpected symbol "+n.symbol+", expected weekday");t.byweekday.push(k[y]),n.nextSymbol()}c(),d();break;case"january":case"february":case"march":case"april":case"may":case"june":case"july":case"august":case"september":case"october":case"november":case"december":if(t.freq=k.YEARLY,t.bymonth=[o()],!n.nextSymbol())return;for(;n.accept("comma");){if(n.isDone())throw new Error("Unexpected end");var m=o();if(!m)throw new Error("Unexpected symbol "+n.symbol+", expected month");t.bymonth.push(m),n.nextSymbol()}s(),d();break;default:throw new Error("Unknown symbol")}}function s(){var f=n.accept("on"),h=n.accept("the");if(!!(f||h))do{var y=l(),m=u(),g=o();if(y)m?(n.nextSymbol(),t.byweekday||(t.byweekday=[]),t.byweekday.push(k[m].nth(y))):(t.bymonthday||(t.bymonthday=[]),t.bymonthday.push(y),n.accept("day(s)"));else if(m)n.nextSymbol(),t.byweekday||(t.byweekday=[]),t.byweekday.push(k[m]);else if(n.symbol==="weekday(s)")n.nextSymbol(),t.byweekday||(t.byweekday=[k.MO,k.TU,k.WE,k.TH,k.FR]);else if(n.symbol==="week(s)"){n.nextSymbol();var R=n.acceptNumber();if(!R)throw new Error("Unexpected symbol "+n.symbol+", expected week number");for(t.byweekno=[parseInt(R[0],10)];n.accept("comma");){if(R=n.acceptNumber(),!R)throw new Error("Unexpected symbol "+n.symbol+"; expected monthday");t.byweekno.push(parseInt(R[0],10))}}else if(g)n.nextSymbol(),t.bymonth||(t.bymonth=[]),t.bymonth.push(g);else return}while(n.accept("comma")||n.accept("the")||n.accept("on"))}function a(){var f=n.accept("at");if(!!f)do{var h=n.acceptNumber();if(!h)throw new Error("Unexpected symbol "+n.symbol+", expected hour");for(t.byhour=[parseInt(h[0],10)];n.accept("comma");){if(h=n.acceptNumber(),!h)throw new Error("Unexpected symbol "+n.symbol+"; expected hour");t.byhour.push(parseInt(h[0],10))}}while(n.accept("comma")||n.accept("at"))}function o(){switch(n.symbol){case"january":return 1;case"february":return 2;case"march":return 3;case"april":return 4;case"may":return 5;case"june":return 6;case"july":return 7;case"august":return 8;case"september":return 9;case"october":return 10;case"november":return 11;case"december":return 12;default:return!1}}function u(){switch(n.symbol){case"monday":case"tuesday":case"wednesday":case"thursday":case"friday":case"saturday":case"sunday":return n.symbol.substr(0,2).toUpperCase();default:return!1}}function l(){switch(n.symbol){case"last":return n.nextSymbol(),-1;case"first":return n.nextSymbol(),1;case"second":return n.nextSymbol(),n.accept("last")?-2:2;case"third":return n.nextSymbol(),n.accept("last")?-3:3;case"nth":var f=parseInt(n.value[1],10);if(f<-366||f>366)throw new Error("Nth out of range: "+f);return n.nextSymbol(),n.accept("last")?-f:f;default:return!1}}function c(){n.accept("on"),n.accept("the");var f=l();if(!!f)for(t.bymonthday=[f],n.nextSymbol();n.accept("comma");){if(f=l(),!f)throw new Error("Unexpected symbol "+n.symbol+"; expected monthday");t.bymonthday.push(f),n.nextSymbol()}}function d(){if(n.symbol==="until"){var f=Date.parse(n.text);if(!f)throw new Error("Cannot parse until date:"+n.text);t.until=new Date(f)}else n.accept("for")&&(t.count=parseInt(n.value[0],10),n.expect("number"))}}var z;(function(r){r[r.YEARLY=0]="YEARLY",r[r.MONTHLY=1]="MONTHLY",r[r.WEEKLY=2]="WEEKLY",r[r.DAILY=3]="DAILY",r[r.HOURLY=4]="HOURLY",r[r.MINUTELY=5]="MINUTELY",r[r.SECONDLY=6]="SECONDLY"})(z||(z={}));function Ei(r){return r12){var n=Math.floor(this.month/12),i=He(this.month,12);this.month=i,this.year+=n,this.month===0&&(this.month=12,--this.year)}},e.prototype.addWeekly=function(t,n){n>this.getWeekday()?this.day+=-(this.getWeekday()+1+(6-n))+t*7:this.day+=-(this.getWeekday()-n)+t*7,this.fixDay()},e.prototype.addDaily=function(t){this.day+=t,this.fixDay()},e.prototype.addHours=function(t,n,i){for(n&&(this.hour+=Math.floor((23-this.hour)/t)*t);;){this.hour+=t;var s=Zs(this.hour,24),a=s.div,o=s.mod;if(a&&(this.hour=o,this.addDaily(a)),ft(i)||Z(i,this.hour))break}},e.prototype.addMinutes=function(t,n,i,s){for(n&&(this.minute+=Math.floor((1439-(this.hour*60+this.minute))/t)*t);;){this.minute+=t;var a=Zs(this.minute,60),o=a.div,u=a.mod;if(o&&(this.minute=u,this.addHours(o,!1,i)),(ft(i)||Z(i,this.hour))&&(ft(s)||Z(s,this.minute)))break}},e.prototype.addSeconds=function(t,n,i,s,a){for(n&&(this.second+=Math.floor((86399-(this.hour*3600+this.minute*60+this.second))/t)*t);;){this.second+=t;var o=Zs(this.second,60),u=o.div,l=o.mod;if(u&&(this.second=l,this.addMinutes(u,!1,i,s)),(ft(i)||Z(i,this.hour))&&(ft(s)||Z(s,this.minute))&&(ft(a)||Z(a,this.second)))break}},e.prototype.fixDay=function(){if(!(this.day<=28)){var t=Sr.monthRange(this.year,this.month-1)[1];if(!(this.day<=t))for(;this.day>t;){if(this.day-=t,++this.month,this.month===13&&(this.month=1,++this.year,this.year>Sr.MAXYEAR))return;t=Sr.monthRange(this.year,this.month-1)[1]}}},e.prototype.add=function(t,n){var i=t.freq,s=t.interval,a=t.wkst,o=t.byhour,u=t.byminute,l=t.bysecond;switch(i){case z.YEARLY:return this.addYears(s);case z.MONTHLY:return this.addMonths(s);case z.WEEKLY:return this.addWeekly(s,a);case z.DAILY:return this.addDaily(s);case z.HOURLY:return this.addHours(s,n,o);case z.MINUTELY:return this.addMinutes(s,n,o,u);case z.SECONDLY:return this.addSeconds(s,n,o,u,l)}},e}(kn);function Uo(r){for(var e=[],t=Object.keys(r),n=0,i=t;n=-366&&n<=366))throw new Error("bysetpos must be between 1 and 366, or between -366 and -1")}}if(!(Boolean(e.byweekno)||Ee(e.byweekno)||Ee(e.byyearday)||Boolean(e.bymonthday)||Ee(e.bymonthday)||pe(e.byweekday)||pe(e.byeaster)))switch(e.freq){case k.YEARLY:e.bymonth||(e.bymonth=e.dtstart.getUTCMonth()+1),e.bymonthday=e.dtstart.getUTCDate();break;case k.MONTHLY:e.bymonthday=e.dtstart.getUTCDate();break;case k.WEEKLY:e.byweekday=[I.getWeekday(e.dtstart)];break}if(pe(e.bymonth)&&!$e(e.bymonth)&&(e.bymonth=[e.bymonth]),pe(e.byyearday)&&!$e(e.byyearday)&&dt(e.byyearday)&&(e.byyearday=[e.byyearday]),!pe(e.bymonthday))e.bymonthday=[],e.bynmonthday=[];else if($e(e.bymonthday)){for(var i=[],s=[],t=0;t0?i.push(n):n<0&&s.push(n)}e.bymonthday=i,e.bynmonthday=s}else e.bymonthday<0?(e.bynmonthday=[e.bymonthday],e.bymonthday=[]):(e.bynmonthday=[],e.bymonthday=[e.bymonthday]);if(pe(e.byweekno)&&!$e(e.byweekno)&&(e.byweekno=[e.byweekno]),!pe(e.byweekday))e.bynweekday=null;else if(dt(e.byweekday))e.byweekday=[e.byweekday],e.bynweekday=null;else if(No(e.byweekday))e.byweekday=[Re.fromStr(e.byweekday).weekday],e.bynweekday=null;else if(e.byweekday instanceof Re)!e.byweekday.n||e.freq>k.MONTHLY?(e.byweekday=[e.byweekday.weekday],e.bynweekday=null):(e.bynweekday=[[e.byweekday.weekday,e.byweekday.n]],e.byweekday=null);else{for(var a=[],o=[],t=0;tk.MONTHLY?a.push(u.weekday):o.push([u.weekday,u.n])}e.byweekday=Ee(a)?a:null,e.bynweekday=Ee(o)?o:null}return pe(e.byhour)?dt(e.byhour)&&(e.byhour=[e.byhour]):e.byhour=e.freq=4?(c=0,l=o.yearlen+He(a-e.wkst,7)):l=n-c;for(var d=Math.floor(l/7),f=He(l,7),h=Math.floor(d+f/4),y=0;y0&&m<=h){var g=void 0;m>1?(g=c+(m-1)*7,c!==u&&(g-=7-u)):g=c;for(var R=0;R<7&&(o.wnomask[g]=1,g++,o.wdaymask[g]!==e.wkst);R++);}}if(Z(e.byweekno,1)){var g=c+h*7;if(c!==u&&(g-=7-u),g=4?(X=0,Te=ye+He(P-e.wkst,7)):Te=n-c,O=Math.floor(52+He(Te,7)/4)}if(Z(e.byweekno,O))for(var g=0;gs)return ar(r);if(O>=t){var P=Sp(O,e);if(!r.accept(P)||o&&(--o,!o))return ar(r)}}else for(var R=h;Rs)return ar(r);if(O>=t){var P=Sp(O,e);if(!r.accept(P)||o&&(--o,!o))return ar(r)}}}if(e.interval===0||(u.add(e,m),u.year>I.MAXYEAR))return ar(r);Ei(n)||(c=l.gettimeset(n)(u.hour,u.minute,u.second,0)),l.rebuild(u.year,u.month)}}function YT(r,e,t){var n=t.bymonth,i=t.byweekno,s=t.byweekday,a=t.byeaster,o=t.bymonthday,u=t.bynmonthday,l=t.byyearday;return Ee(n)&&!Z(n,r.mmask[e])||Ee(i)&&!r.wnomask[e]||Ee(s)&&!Z(s,r.wdaymask[e])||Ee(r.nwdaymask)&&!r.nwdaymask[e]||a!==null&&!Z(r.eastermask,e)||(Ee(o)||Ee(u))&&!Z(o,r.mdaymask[e])&&!Z(u,r.nmdaymask[e])||Ee(l)&&(e=r.yearlen&&!Z(l,e+1-r.yearlen)&&!Z(l,-r.nextyearlen+e-r.yearlen))}function Sp(r,e){return new Gr(r,e.tzid).rezonedDate()}function ar(r){return r.getValue()}function $T(r,e,t,n,i){for(var s=!1,a=e;a=k.HOURLY&&Ee(i)&&!Z(i,e.hour)||n>=k.MINUTELY&&Ee(s)&&!Z(s,e.minute)||n>=k.SECONDLY&&Ee(a)&&!Z(a,e.second)?[]:r.gettimeset(n)(e.hour,e.minute,e.second,e.millisecond)}var wt={MO:new Re(0),TU:new Re(1),WE:new Re(2),TH:new Re(3),FR:new Re(4),SA:new Re(5),SU:new Re(6)},wi={freq:z.YEARLY,dtstart:null,interval:1,wkst:wt.MO,count:null,until:null,tzid:null,bysetpos:null,bymonth:null,bymonthday:null,bynmonthday:null,byyearday:null,byweekno:null,byweekday:null,bynweekday:null,byhour:null,byminute:null,bysecond:null,byeaster:null},dp=Object.keys(wi),k=function(){function r(e,t){e===void 0&&(e={}),t===void 0&&(t=!1),this._cache=t?null:new hp,this.origOptions=Uo(e);var n=lp(e).parsedOptions;this.options=n}return r.parseText=function(e,t){return vi(e,t)},r.fromText=function(e,t){return sp(e,t)},r.fromString=function(e){return new r(r.parseString(e)||void 0)},r.prototype._iter=function(e){return ta(e,this.options)},r.prototype._cacheGet=function(e,t){return this._cache?this._cache._cacheGet(e,t):!1},r.prototype._cacheAdd=function(e,t,n){if(!!this._cache)return this._cache._cacheAdd(e,t,n)},r.prototype.all=function(e){if(e)return this._iter(new Fo("all",{},e));var t=this._cacheGet("all");return t===!1&&(t=this._iter(new sr("all",{})),this._cacheAdd("all",t)),t},r.prototype.between=function(e,t,n,i){if(n===void 0&&(n=!1),!I.isValidDate(e)||!I.isValidDate(t))throw new Error("Invalid date passed in to RRule.between");var s={before:t,after:e,inc:n};if(i)return this._iter(new Fo("between",s,i));var a=this._cacheGet("between",s);return a===!1&&(a=this._iter(new sr("between",s)),this._cacheAdd("between",a,s)),a},r.prototype.before=function(e,t){if(t===void 0&&(t=!1),!I.isValidDate(e))throw new Error("Invalid date passed in to RRule.before");var n={dt:e,inc:t},i=this._cacheGet("before",n);return i===!1&&(i=this._iter(new sr("before",n)),this._cacheAdd("before",i,n)),i},r.prototype.after=function(e,t){if(t===void 0&&(t=!1),!I.isValidDate(e))throw new Error("Invalid date passed in to RRule.after");var n={dt:e,inc:t},i=this._cacheGet("after",n);return i===!1&&(i=this._iter(new sr("after",n)),this._cacheAdd("after",i,n)),i},r.prototype.count=function(){return this.all().length},r.prototype.toString=function(){return Di(this.origOptions)},r.prototype.toText=function(e,t,n){return ap(this,e,t,n)},r.prototype.isFullyConvertibleToText=function(){return op(this)},r.prototype.clone=function(){return new r(this.origOptions)},r.FREQUENCIES=["YEARLY","MONTHLY","WEEKLY","DAILY","HOURLY","MINUTELY","SECONDLY"],r.YEARLY=z.YEARLY,r.MONTHLY=z.MONTHLY,r.WEEKLY=z.WEEKLY,r.DAILY=z.DAILY,r.HOURLY=z.HOURLY,r.MINUTELY=z.MINUTELY,r.SECONDLY=z.SECONDLY,r.MO=wt.MO,r.TU=wt.TU,r.WE=wt.WE,r.TH=wt.TH,r.FR=wt.FR,r.SA=wt.SA,r.SU=wt.SU,r.parseString=Oi,r.optionsToString=Di,r}();function kp(r,e,t,n,i,s){var a={},o=r.accept;function u(f,h){t.forEach(function(y){y.between(f,h,!0).forEach(function(m){a[Number(m)]=!0})})}i.forEach(function(f){var h=new Gr(f,s).rezonedDate();a[Number(h)]=!0}),r.accept=function(f){var h=Number(f);return isNaN(h)?o.call(this,f):!a[h]&&(u(new Date(h-1),new Date(h+1)),!a[h])?(a[h]=!0,o.call(this,f)):!0},r.method==="between"&&(u(r.args.after,r.args.before),r.accept=function(f){var h=Number(f);return a[h]?!0:(a[h]=!0,o.call(this,f))});for(var l=0;l1||i.length||s.length||a.length){var c=new Wo(l);return c.dtstart(o),c.tzid(u||void 0),n.forEach(function(f){c.rrule(new k(qo(f,o,u),l))}),i.forEach(function(f){c.rdate(f)}),s.forEach(function(f){c.exrule(new k(qo(f,o,u),l))}),a.forEach(function(f){c.exdate(f)}),e.compatible&&e.dtstart&&c.rdate(o),c}var d=n[0]||{};return new k(qo(d,d.dtstart||e.dtstart||o,d.tzid||e.tzid||u),l)}function ra(r,e){return e===void 0&&(e={}),GT(r,HT(e))}function qo(r,e,t){return Qe(Qe({},r),{dtstart:e,tzid:t})}function HT(r){var e=[],t=Object.keys(r),n=Object.keys(Pp);if(t.forEach(function(i){Z(n,i)||e.push(i)}),e.length)throw new Error("Invalid options: "+e.join(", "));return Qe(Qe({},Pp),r)}function zT(r){if(r.indexOf(":")===-1)return{name:"RRULE",value:r};var e=Nf(r,":",1),t=e[0],n=e[1];return{name:t,value:n}}function KT(r){var e=zT(r),t=e.name,n=e.value,i=t.split(";");if(!i)throw new Error("empty property name");return{name:i[0].toUpperCase(),parms:i.slice(1),value:n}}function VT(r,e){if(e===void 0&&(e=!1),r=r&&r.trim(),!r)throw new Error("Invalid empty string");if(!e)return r.split(/\s/);for(var t=r.split(` -`),n=0;n0&&i[0]===" "?(t[n-1]+=i.slice(1),t.splice(n,1)):n+=1:t.splice(n,1)}return t}function XT(r){r.forEach(function(e){if(!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(e))throw new Error("unsupported RDATE/EXDATE parm: "+e)})}function Ap(r,e){return XT(e),r.split(",").map(function(t){return I.untilStringToDate(t)})}function xp(r){var e=this;return function(t){if(t!==void 0&&(e["_".concat(r)]=t),e["_".concat(r)]!==void 0)return e["_".concat(r)];for(var n=0;n1&&(t+=` (${this.description})`),t+=":";let n=e+" ";for(let i=0;ie(t,n)*-1}};function Ka(r){return r.replace(/([.*+?^${}()|[\]/\\])/g,"\\$1")}var Hn=class{constructor(e,t){this.property=e,this.grouper=t}};var oe=class{canCreateFilterForLine(e){return oe.lineMatchesFilter(this.filterRegExp(),e)}static lineMatchesFilter(e,t){return e?e.test(t):!1}static getMatch(e,t){return e?t.match(e):null}fieldNameSingular(){return this.fieldName()}fieldNameSingularEscaped(){return Ka(this.fieldNameSingular())}supportsSorting(){return!1}parseSortLine(e){return!this.supportsSorting()||!this.canCreateSorterForLine(e)?null:this.createSorterFromLine(e)}canCreateSorterForLine(e){return this.supportsSorting()?oe.lineMatchesFilter(this.sorterRegExp(),e):!1}createSorterFromLine(e){if(!this.supportsSorting())return null;let t=oe.getMatch(this.sorterRegExp(),e);if(t===null)return null;let n=!!t[1];return this.createSorter(n)}sorterRegExp(){if(!this.supportsSorting())throw Error(`sorterRegExp() unimplemented for ${this.fieldNameSingular()}`);return new RegExp(`^sort by ${this.fieldNameSingularEscaped()}( reverse)?`)}comparator(){throw Error(`comparator() unimplemented for ${this.fieldNameSingular()}`)}createSorter(e){return new gr(this.fieldNameSingular(),this.comparator(),e)}createNormalSorter(){return this.createSorter(!1)}createReverseSorter(){return this.createSorter(!0)}supportsGrouping(){return!1}grouper(){throw Error(`grouper() unimplemented for ${this.fieldNameSingular()}`)}createGrouper(){return new Hn(this.fieldNameSingular(),this.grouper())}};var Ve=class{constructor(e,t,n){this.instruction=e,this.explanation=n,this.filterFunction=t}explainFilterIndented(e){let t=this.explanation;return t.asString()===this.instruction?`${e}${this.instruction} -`:`${e}${this.instruction} => -${t.asString(" ")} -`}},le=class{constructor(e){this.instruction=e}get filter(){return this._filter}set filter(e){this._filter=e}get filterFunction(){if(this._filter)return this._filter.filterFunction}static fromFilter(e){let t=new le(e.instruction);return t.filter=e,t}static fromError(e,t){let n=new le(e);return n.error=t,n}};var Va=class{constructor(e,t){this._instruction=e,this._filter=t}canCreateFilterForLine(e){return e==this._instruction}createFilterOrErrorMessage(e){let t=new le(e);return e===this._instruction?(t.filter=new Ve(e,this._filter,new ge(e)),t):(t.error=`do not understand filter: ${e}`,t)}};var Lr=class{constructor(){this._filters=[]}add(e,t){this._filters.push(new Va(e,t))}canCreateFilterForLine(e){for(let t of this._filters)if(t.canCreateFilterForLine(e))return!0;return!1}createFilterOrErrorMessage(e){for(let n of this._filters){let i=n.createFilterOrErrorMessage(e);if(i.error===void 0)return i}let t=new le(e);return t.error=`do not understand filter: ${e}`,t}};var _e=class extends oe{constructor(){super();this.filterInstructions=new Lr,this.filterInstructions.add(`has ${this.fieldName()} date`,t=>this.date(t)!==null),this.filterInstructions.add(`no ${this.fieldName()} date`,t=>this.date(t)===null),this.filterInstructions.add(`${this.fieldName()} date is invalid`,t=>{let n=this.date(t);return n!==null&&!n.isValid()})}canCreateFilterForLine(t){return this.filterInstructions.canCreateFilterForLine(t)?!0:super.canCreateFilterForLine(t)}createFilterOrErrorMessage(t){let n=this.filterInstructions.createFilterOrErrorMessage(t);if(n.filter!==void 0)return n;let i=new le(t),s=oe.getMatch(this.filterRegExp(),t),a;if(s!==null){let o=yr.parseDate(s[2]);if(!o.isValid())i.error="do not understand "+this.fieldName()+" date";else{let u;s[1]==="before"?(a=c=>{let d=this.date(c);return d?d.isBefore(o):this.filterResultIfFieldMissing()},u=" "+s[1]):s[1]==="after"?(a=c=>{let d=this.date(c);return d?d.isAfter(o):this.filterResultIfFieldMissing()},u=" "+s[1]):(a=c=>{let d=this.date(c);return d?d.isSame(o):this.filterResultIfFieldMissing()},u=" on");let l=_e.getExplanationString(this.fieldName(),u,this.filterResultIfFieldMissing(),o);i.filter=new Ve(t,a,new ge(l))}}else i.error="do not understand query filter ("+this.fieldName()+" date)";return i}static getExplanationString(t,n,i,s){let a=s.format("YYYY-MM-DD (dddd Do MMMM YYYY)"),o=`${t} date is${n} ${a}`;return i&&(o+=` OR no ${t} date`),o}supportsSorting(){return!0}comparator(){return(t,n)=>_e.compareByDate(this.date(t),this.date(n))}static compareByDate(t,n){return t!==null&&n===null?-1:t===null&&n!==null?1:t!==null&&n!==null?t.isValid()&&!n.isValid()?-1:!t.isValid()&&n.isValid()||t.isAfter(n)?1:t.isBefore(n)?-1:0:0}};var We=class{constructor({rrule:e,baseOnToday:t,referenceDate:n,startDate:i,scheduledDate:s,dueDate:a}){this.rrule=e,this.baseOnToday=t,this.referenceDate=n,this.startDate=i,this.scheduledDate=s,this.dueDate=a}static fromText({recurrenceRuleText:e,startDate:t,scheduledDate:n,dueDate:i}){try{let s=e.match(/^([a-zA-Z0-9, !]+?)( when done)?$/i);if(s==null)return null;let a=s[1].trim(),o=s[2]!==void 0,u=k.parseText(a);if(u!==null){let l=null;i?l=window.moment(i):n?l=window.moment(n):t&&(l=window.moment(t)),!o&&l!==null?u.dtstart=window.moment(l).startOf("day").utc(!0).toDate():u.dtstart=window.moment().startOf("day").utc(!0).toDate();let c=new k(u);return new We({rrule:c,baseOnToday:o,referenceDate:l,startDate:t,scheduledDate:n,dueDate:i})}}catch(s){}return null}toText(){let e=this.rrule.toText();return this.baseOnToday&&(e+=" when done"),e}next(){var t;let e;if(this.baseOnToday){let n=window.moment(),i=new k(vt(we({},this.rrule.origOptions),{dtstart:n.startOf("day").utc(!0).toDate()}));e=this.nextAfter(n.endOf("day"),i)}else{let n=window.moment((t=this.referenceDate)!=null?t:void 0).endOf("day");e=this.nextAfter(n,this.rrule)}if(e!==null){let n=null,i=null,s=null;if(this.referenceDate){if(this.startDate){let a=window.moment.duration(this.startDate.diff(this.referenceDate));n=window.moment(e),n.add(Math.round(a.asDays()),"days")}if(this.scheduledDate){let a=window.moment.duration(this.scheduledDate.diff(this.referenceDate));i=window.moment(e),i.add(Math.round(a.asDays()),"days")}if(this.dueDate){let a=window.moment.duration(this.dueDate.diff(this.referenceDate));s=window.moment(e),s.add(Math.round(a.asDays()),"days")}}return{startDate:n,scheduledDate:i,dueDate:s}}return null}identicalTo(e){return this.baseOnToday!==e.baseOnToday||_e.compareByDate(this.startDate,e.startDate)!==0||_e.compareByDate(this.scheduledDate,e.scheduledDate)!==0||_e.compareByDate(this.dueDate,e.dueDate)!==0?!1:this.toText()===e.toText()}nextAfter(e,t){e.utc(!0);let n=window.moment(t.after(e.toDate())),i=this.toText(),s=i.match(/every( \d+)? month(s)?(.*)?/);s!==null&&(i.includes(" on ")||(n=We.nextAfterMonths(e,n,t,s[1])));let a=i.match(/every( \d+)? year(s)?(.*)?/);return a!==null&&(n=We.nextAfterYears(e,n,t,a[1])),We.addTimezone(n).toDate()}static nextAfterMonths(e,t,n,i){let s=1;for(i!==void 0&&(s=Number.parseInt(i.trim(),10));We.isSkippingTooManyMonths(e,t,s);)t=We.fromOneDayEarlier(e,n);return t}static isSkippingTooManyMonths(e,t,n){let i=t.month()-e.month();return i+=(t.year()-e.year())*12,i>n}static nextAfterYears(e,t,n,i){let s=1;for(i!==void 0&&(s=Number.parseInt(i.trim(),10));We.isSkippingTooManyYears(e,t,s);)t=We.fromOneDayEarlier(e,n);return t}static isSkippingTooManyYears(e,t,n){return t.year()-e.year()>n}static fromOneDayEarlier(e,t){e.subtract(1,"days").endOf("day");let n=t.origOptions;return n.dtstart=e.startOf("day").toDate(),t=new k(n),window.moment(t.after(e.toDate()))}static addTimezone(e){return window.moment.utc(e).local(!0).startOf("day")}};var tr=(a=>(a.TODO="TODO",a.DONE="DONE",a.IN_PROGRESS="IN_PROGRESS",a.CANCELLED="CANCELLED",a.NON_TASK="NON_TASK",a.EMPTY="EMPTY",a))(tr||{}),Ye=class{constructor(e,t,n,i,s="TODO"){this.symbol=e,this.name=t,this.nextStatusSymbol=n,this.availableAsCommand=i,this.type=s}};var at=class{get symbol(){return this.configuration.symbol}get name(){return this.configuration.name}get nextStatusSymbol(){return this.configuration.nextStatusSymbol}get availableAsCommand(){return this.configuration.availableAsCommand}get type(){return this.configuration.type}constructor(e){this.configuration=e}static makeDone(){return new at(new Ye("x","Done"," ",!0,"DONE"))}static makeEmpty(){return new at(new Ye("","EMPTY","",!0,"EMPTY"))}static makeTodo(){return new at(new Ye(" ","Todo","x",!0,"TODO"))}static makeCancelled(){return new at(new Ye("-","Cancelled"," ",!0,"CANCELLED"))}static makeInProgress(){return new at(new Ye("/","In Progress","x",!0,"IN_PROGRESS"))}static getTypeForUnknownSymbol(e){switch(e){case"x":case"X":return"DONE";case"/":return"IN_PROGRESS";case"-":return"CANCELLED";case"":return"EMPTY";case" ":default:return"TODO"}}static getTypeFromStatusTypeString(e){return tr[e]||"TODO"}static createUnknownStatus(e){return new at(new Ye(e,"Unknown","x",!1,"TODO"))}static createFromImportedValue(e){let t=e[0],n=at.getTypeFromStatusTypeString(e[3]);return new at(new Ye(t,e[1],e[2],!1,n))}isCompleted(){return this.type==="DONE"}previewText(){let e="";return at.tasksPluginCanCreateCommandsForStatuses()&&this.availableAsCommand&&(e=" Available as a command."),`- [${this.symbol}] => [${this.nextStatusSymbol}], name: '${this.name}', type: '${this.configuration.type}'.${e}`}static tasksPluginCanCreateCommandsForStatuses(){return!1}},j=at;j.DONE=at.makeDone(),j.EMPTY=at.makeEmpty(),j.TODO=at.makeTodo();var Pe=class{constructor(){this.coreStatuses=[j.makeTodo().configuration,j.makeDone().configuration],this.customStatuses=[j.makeInProgress().configuration,j.makeCancelled().configuration]}static addStatus(e,t){e.push(t)}static replaceStatus(e,t,n){let i=this.findStatusIndex(t,e);return i<=-1?!1:(e.splice(i,1,n),!0)}static findStatusIndex(e,t){let n=new j(e);return t.findIndex(i=>new j(i).previewText()==n.previewText())}static deleteStatus(e,t){let n=this.findStatusIndex(t,e);return n<=-1?!1:(e.splice(n,1),!0)}static deleteAllCustomStatuses(e){e.customStatuses.splice(0)}static resetAllCustomStatuses(e){Pe.deleteAllCustomStatuses(e),new Pe().customStatuses.forEach(n=>{Pe.addStatus(e.customStatuses,n)})}static bulkAddStatusCollection(e,t){let n=[];return t.forEach(i=>{e.customStatuses.find(a=>a.symbol==i[0]&&a.name==i[1]&&a.nextStatusSymbol==i[2])?n.push(`The status ${i[1]} (${i[0]}) is already added.`):Pe.addStatus(e.customStatuses,j.createFromImportedValue(i))}),n}static applyToStatusRegistry(e,t){t.clearStatuses(),e.coreStatuses.forEach(n=>{t.add(n)}),e.customStatuses.forEach(n=>{t.add(n)})}};var p_=[{index:9999,internalName:"INTERNAL_TESTING_ENABLED_BY_DEFAULT",displayName:"Test Item. Used to validate the Feature Framework.",description:"Description",enabledByDefault:!0,stable:!1}];var rr=class{constructor(e,t,n,i,s,a){this.internalName=e;this.index=t;this.description=n;this.displayName=i;this.enabledByDefault=s;this.stable=a}static get values(){let e=[];return p_.forEach(t=>{e=[...e,new rr(t.internalName,t.index,t.description,t.displayName,t.enabledByDefault,t.stable)]}),e}static get settingsFlags(){let e={};return rr.values.forEach(t=>{e[t.internalName]=t.enabledByDefault}),e}static fromString(e){for(let t of rr.values)if(e===t.internalName)return t;throw new RangeError(`Illegal argument passed to fromString(): ${e} does not correspond to any available Feature ${this.prototype.constructor.name}`)}};var mk={globalFilter:"",removeGlobalFilter:!1,setDoneDate:!0,autoSuggestInEditor:!0,autoSuggestMinMatch:0,autoSuggestMaxItems:6,provideAccessKeys:!0,useFilenameAsScheduledDate:!1,filenameAsDateFolders:[],statusSettings:new Pe,features:rr.settingsFlags,generalSettings:{},headingOpened:{}},qr=we({},mk),U=()=>{for(let r in rr.settingsFlags)qr.features[r]===void 0&&(qr.features[r]=rr.settingsFlags[r]);return qr.statusSettings.customStatuses.forEach((r,e,t)=>{var i,s;let n=j.getTypeFromStatusTypeString(r.type);t[e]=new Ye((i=r.symbol)!=null?i:" ",r.name,(s=r.nextStatusSymbol)!=null?s:"x",r.availableAsCommand,n)}),we({},qr)},ot=r=>(qr=we(we({},qr),r),U());var nn=(r,e)=>(qr.generalSettings[r]=e,U()),h_=r=>{var e;return(e=qr.features[r])!=null?e:!1};var he=class{constructor(){this._registeredStatuses=[];this.addDefaultStatusTypes()}get registeredStatuses(){return this._registeredStatuses.filter(({symbol:e})=>e!==j.EMPTY.symbol)}static getInstance(){return he.instance||(he.instance=new he),he.instance}add(e){this.hasSymbol(e.symbol)||(e instanceof j?this._registeredStatuses.push(e):this._registeredStatuses.push(new j(e)))}bySymbol(e){return this.hasSymbol(e)?this.getSymbol(e):j.EMPTY}bySymbolOrCreate(e){return this.hasSymbol(e)?this.getSymbol(e):j.createUnknownStatus(e)}byName(e){return this._registeredStatuses.filter(({name:t})=>t===e).length>0?this._registeredStatuses.filter(({name:t})=>t===e)[0]:j.EMPTY}resetToDefaultStatuses(){this.clearStatuses(),this.addDefaultStatusTypes()}clearStatuses(){this._registeredStatuses=[]}getNextStatus(e){if(e.nextStatusSymbol!==""){let t=this.bySymbol(e.nextStatusSymbol);if(t!==null)return t}return j.EMPTY}getNextStatusOrCreate(e){let t=this.getNextStatus(e);return t.type!=="EMPTY"?t:j.createUnknownStatus(e.nextStatusSymbol)}findUnknownStatuses(e){let n=e.map(a=>a.status).filter(a=>!this.hasSymbol(a.symbol)),i=new he,s=[];return n.forEach(a=>{if(i.hasSymbol(a.symbol))return;let o=he.copyStatusWithNewName(a,`Unknown (${a.symbol})`);s.push(o),i.add(o)}),s}static copyStatusWithNewName(e,t){let n=new Ye(e.symbol,t,e.nextStatusSymbol,e.availableAsCommand,e.type);return new j(n)}getSymbol(e){return this._registeredStatuses.filter(({symbol:t})=>t===e)[0]}hasSymbol(e){return this._registeredStatuses.find(t=>t.symbol===e)!==void 0}addDefaultStatusTypes(){[j.makeTodo(),j.makeInProgress(),j.makeDone(),j.makeCancelled()].forEach(t=>{this.add(t)})}};var Tr=class{static calculate(e){let t=0;if(e.dueDate!==null){let n=Math.round(window.moment().diff(e.dueDate)/Tr.milliSecondsPerDay),i;n>=7?i=1:n>=-14?i=(n+14)*.8/21+.2:i=.2,t+=i*Tr.dueCoefficient}switch(e.scheduledDate!==null&&window.moment().isSameOrAfter(e.scheduledDate)&&(t+=1*Tr.scheduledCoefficient),e.startDate!==null&&window.moment().isBefore(e.startDate)&&(t+=1*Tr.startedCoefficient),e.priority){case"1":t+=1*Tr.priorityCoefficient;break;case"2":t+=.65*Tr.priorityCoefficient;break;case"3":t+=.325*Tr.priorityCoefficient;break}return t}},_r=Tr;_r.dueCoefficient=12,_r.scheduledCoefficient=5,_r.startedCoefficient=-3,_r.priorityCoefficient=6,_r.milliSecondsPerDay=1e3*60*60*24;var __=require("obsidian");var m_=require("obsidian");var Pd,Ad,y_=({metadataCache:r,vault:e})=>{Pd=r,Ad=e},Xa=t=>x(void 0,[t],function*({originalTask:r,newTasks:e}){if(Ad===void 0||Pd===void 0){console.error("Tasks: cannot use File before initializing it.");return}Array.isArray(e)||(e=[e]),g_({originalTask:r,newTasks:e,vault:Ad,metadataCache:Pd,previousTries:0})}),g_=s=>x(void 0,[s],function*({originalTask:r,newTasks:e,vault:t,metadataCache:n,previousTries:i}){let a=()=>{if(i>10){console.error("Tasks: Too many retries. File update not possible ...");return}let g=Math.min(Math.pow(10,i),100);setTimeout(()=>{g_({originalTask:r,newTasks:e,vault:t,metadataCache:n,previousTries:i+1})},g)},o=t.getAbstractFileByPath(r.path);if(!(o instanceof m_.TFile))return console.warn(`Tasks: No file found for task ${r.description}. Retrying ...`),a();if(o.extension!=="md"){console.error("Tasks: Only supporting files with the .md file extension.");return}let u=n.getFileCache(o);if(u==null||u===null)return console.warn(`Tasks: No file cache found for file ${o.path}. Retrying ...`),a();let l=u.listItems;if(l===void 0||l.length===0)return console.warn(`Tasks: No list items found in file cache of ${o.path}. Retrying ...`),a();let d=(yield t.read(o)).split(` -`),{globalFilter:f}=U(),h,y=0;for(let g of l){if(g.position.start.lineg.toFileLineString()),...d.slice(h.position.start.line+1)];yield t.modify(o,m.join(` -`))});function yk(r,e,t){return x(this,null,function*(){yield __.MarkdownRenderer.renderMarkdown(r,e,t,null)})}function T_(r,e,t=null){return x(this,null,function*(){var a;t||(t=yk);let n=document.createElement("li");e.parentUlElement.appendChild(n),n.classList.add("task-list-item","plugin-tasks-list-item");let i=document.createElement("span");n.appendChild(i),i.classList.add("tasks-list-text"),yield gk(r,e,i,t);let s=document.createElement("input");return n.appendChild(s),s.classList.add("task-list-item-checkbox"),s.type="checkbox",r.status.symbol!==" "&&(s.checked=!0,n.classList.add("is-checked")),s.addEventListener("click",o=>{o.preventDefault(),o.stopPropagation(),s.disabled=!0;let u=r.toggle();Xa({originalTask:r,newTasks:u})}),n.prepend(s),n.setAttribute("data-task",r.status.symbol.trim()),n.setAttribute("data-line",e.listIndex.toString()),s.setAttribute("data-line",e.listIndex.toString()),(a=e.layoutOptions)!=null&&a.shortMode&&Tk({task:r,element:i,isFilenameUnique:e.isFilenameUnique}),n})}function gk(r,e,t,n){return x(this,null,function*(){let i="",s=new On(e.layoutOptions);for(let a of s.layoutComponents){let o=r.componentToString(s,a);o&&(a==="description"&&(o=bk(o)),i+=o)}yield _k(t,i,"description",r,n)})}function _k(r,e,t,n,i){return x(this,null,function*(){if(t==="description"){yield i(e,r,n.path);let s=r.querySelector("blockquote"),a=s!=null?s:r,o=a.querySelector("p");if(o!==null){for(;o.firstChild;)a.insertBefore(o.firstChild,o);o.remove()}r.querySelectorAll("p").forEach(u=>{u.hasChildNodes()||u.remove()}),r.querySelectorAll(".footnotes").forEach(u=>{u.remove()})}else r.innerHTML=e})}function Tk({task:r,element:e,isFilenameUnique:t}){e.addEventListener("mouseenter",()=>{let n=e.createDiv();n.addClasses(["tooltip","mod-right"]),r.recurrence&&n.createDiv().setText(`${Yt} ${r.recurrence.toText()}`),r.startDate&&n.createDiv().setText(Za({signifier:$t,date:r.startDate})),r.scheduledDate&&n.createDiv().setText(Za({signifier:jt,date:r.scheduledDate})),r.dueDate&&n.createDiv().setText(Za({signifier:Bt,date:r.dueDate})),r.doneDate&&n.createDiv().setText(Za({signifier:Qa,date:r.doneDate}));let i=r.getLinkText({isFilenameUnique:t});i&&n.createDiv().setText(`\u{1F517} ${i}`),e.addEventListener("mouseleave",()=>{n.remove()})})}function Za({signifier:r,date:e}){return`${r} ${e.format(S.dateFormat)} (${e.from(window.moment().startOf("day"))})`}function bk(r){let{globalFilter:e,removeGlobalFilter:t}=U();return t?r.replace(e,"").trim():r}var ut=class{static fromPath(e){let{useFilenameAsScheduledDate:t,filenameAsDateFolders:n}=U();return!t||!this.matchesAnyFolder(n,e)?null:this.extractDateFromPath(e)}static matchesAnyFolder(e,t){return e.length===0?!0:e.some(n=>t.startsWith(n+"/"))}static extractDateFromPath(e){let t=Math.max(0,e.lastIndexOf("/")+1),n=e.lastIndexOf("."),i=e.substring(t,n),s=/(\d{4})-(\d{2})-(\d{2})/.exec(i);if(s||(s=/(\d{4})(\d{2})(\d{2})/.exec(i)),s){let a=window.moment([parseInt(s[1]),parseInt(s[2])-1,parseInt(s[3])]);if(a.isValid())return a}return null}static canApplyFallback({startDate:e,scheduledDate:t,dueDate:n}){return e===null&&n===null&&t===null}static updateTaskPath(e,t,n){let i=e.scheduledDate,s=e.scheduledDateIsInferred;return n===null?s&&(s=!1,i=null):s?i=n:this.canApplyFallback(e)&&(i=n,s=!0),new me(vt(we({},e),{path:t,scheduledDate:i,scheduledDateIsInferred:s}))}static removeInferredStatusIfNeeded(e,t){let n=e.scheduledDateIsInferred?e.scheduledDate:null;return t.map(i=>(n!==null&&!n.isSame(i.scheduledDate,"day")&&(i=new me(vt(we({},i),{scheduledDateIsInferred:!1}))),i))}};var Ae={High:"\u23EB",Medium:"\u{1F53C}",Low:"\u{1F53D}",None:""},Yt="\u{1F501}",$t="\u{1F6EB}",jt="\u23F3",Bt="\u{1F4C5}",Qa="\u2705",yt=class{},S=yt;S.dateFormat="YYYY-MM-DD",S.indentationRegex=/^([\s\t>]*)/,S.listMarkerRegex=/([-*]|[0-9]+\.)/,S.checkboxRegex=/\[(.)\]/u,S.afterCheckboxRegex=/ *(.*)/u,S.taskRegex=new RegExp(yt.indentationRegex.source+yt.listMarkerRegex.source+" +"+yt.checkboxRegex.source+yt.afterCheckboxRegex.source,"u"),S.nonTaskRegex=new RegExp(yt.indentationRegex.source+yt.listMarkerRegex.source+"? *("+yt.checkboxRegex.source+")?"+yt.afterCheckboxRegex.source,"u"),S.listItemRegex=new RegExp(yt.indentationRegex.source+yt.listMarkerRegex.source),S.blockLinkRegex=/ \^[a-zA-Z0-9-]+$/u,S.priorityRegex=/([⏫🔼🔽])$/u,S.startDateRegex=/🛫 *(\d{4}-\d{2}-\d{2})$/u,S.scheduledDateRegex=/[⏳⌛] *(\d{4}-\d{2}-\d{2})$/u,S.dueDateRegex=/[📅📆🗓] *(\d{4}-\d{2}-\d{2})$/u,S.doneDateRegex=/✅ *(\d{4}-\d{2}-\d{2})$/u,S.recurrenceRegex=/🔁 ?([a-zA-Z0-9, !]+)$/iu,S.hashTags=/(^|\s)#[^ !@#$%^&*(),.?":{}|<>]*/g,S.hashTagsFromEnd=new RegExp(yt.hashTags.source+"$");var me=class{constructor({status:e,description:t,path:n,indentation:i,listMarker:s,sectionStart:a,sectionIndex:o,precedingHeader:u,priority:l,startDate:c,scheduledDate:d,dueDate:f,doneDate:h,recurrence:y,blockLink:m,tags:g,originalMarkdown:R,scheduledDateIsInferred:O}){this._urgency=null;this.status=e,this.description=t,this.path=n,this.indentation=i,this.listMarker=s,this.sectionStart=a,this.sectionIndex=o,this.precedingHeader=u,this.tags=g,this.priority=l,this.startDate=c,this.scheduledDate=d,this.dueDate=f,this.doneDate=h,this.recurrence=y,this.blockLink=m,this.originalMarkdown=R,this.scheduledDateIsInferred=O}static fromLine({line:e,path:t,sectionStart:n,sectionIndex:i,precedingHeader:s,fallbackDate:a}){let o=e.match(S.taskRegex);if(o===null)return null;let u=o[4].trim(),{globalFilter:l}=U();if(!u.includes(l))return null;let c=u,d=o[1],f=o[2],h=o[3],y=he.getInstance().bySymbolOrCreate(h),m=c.match(S.blockLinkRegex),g=m!==null?m[0]:"";g!==""&&(c=c.replace(S.blockLinkRegex,"").trim());let R,O="3",P=null,X=null,ye=!1,Te=null,se=null,H="",bt=null,lt=[],A="",E=20,b=0;do{R=!1;let v=c.match(S.priorityRegex);if(v!==null){switch(v[1]){case Ae.Low:O="4";break;case Ae.Medium:O="2";break;case Ae.High:O="1";break}c=c.replace(S.priorityRegex,"").trim(),R=!0}let q=c.match(S.doneDateRegex);q!==null&&(se=window.moment(q[1],S.dateFormat),c=c.replace(S.doneDateRegex,"").trim(),R=!0);let w=c.match(S.dueDateRegex);w!==null&&(Te=window.moment(w[1],S.dateFormat),c=c.replace(S.dueDateRegex,"").trim(),R=!0);let F=c.match(S.scheduledDateRegex);F!==null&&(X=window.moment(F[1],S.dateFormat),c=c.replace(S.scheduledDateRegex,"").trim(),R=!0);let B=c.match(S.startDateRegex);B!==null&&(P=window.moment(B[1],S.dateFormat),c=c.replace(S.startDateRegex,"").trim(),R=!0);let W=c.match(S.recurrenceRegex);W!==null&&(H=W[1].trim(),c=c.replace(S.recurrenceRegex,"").trim(),R=!0);let de=c.match(S.hashTagsFromEnd);if(de!=null){c=c.replace(S.hashTagsFromEnd,"").trim(),R=!0;let fe=de[0].trim();A=A.length>0?[fe,A].join(" "):fe}b++}while(R&&b<=E);H.length>0&&(bt=We.fromText({recurrenceRuleText:H,startDate:P,scheduledDate:X,dueDate:Te})),ut.canApplyFallback({startDate:P,scheduledDate:X,dueDate:Te})&&a!==null&&(X=a,ye=!0),A.length>0&&(c+=" "+A);let C=c.match(S.hashTags);return C!==null&&(lt=C.filter(v=>v!==l).map(v=>v.trim())),new me({status:y,description:c,path:t,indentation:d,listMarker:f,sectionStart:n,sectionIndex:i,precedingHeader:s,priority:O,startDate:P,scheduledDate:X,dueDate:Te,doneDate:se,recurrence:bt,blockLink:g,tags:lt,originalMarkdown:e,scheduledDateIsInferred:ye})}toLi(e){return x(this,null,function*(){return T_(this,e)})}toString(e){let t=new On(e),n="";for(let i of t.layoutComponents)n+=this.componentToString(t,i);return n}componentToString(e,t){var n;switch(t){case"description":return this.description;case"priority":{let i="";return this.priority==="1"?i=" "+Ae.High:this.priority==="2"?i=" "+Ae.Medium:this.priority==="4"&&(i=" "+Ae.Low),i}case"startDate":return this.startDate?e.options.shortMode?" "+$t:` ${$t} ${this.startDate.format(S.dateFormat)}`:"";case"scheduledDate":return!this.scheduledDate||this.scheduledDateIsInferred?"":e.options.shortMode?" "+jt:` ${jt} ${this.scheduledDate.format(S.dateFormat)}`;case"doneDate":return this.doneDate?e.options.shortMode?" "+Qa:` ${Qa} ${this.doneDate.format(S.dateFormat)}`:"";case"dueDate":return this.dueDate?e.options.shortMode?" "+Bt:` ${Bt} ${this.dueDate.format(S.dateFormat)}`:"";case"recurrenceRule":return this.recurrence?e.options.shortMode?" "+Yt:` ${Yt} ${this.recurrence.toText()}`:"";case"blockLink":return(n=this.blockLink)!=null?n:"";default:throw new Error(`Don't know how to render task component of type '${t}'`)}}toFileLineString(){return`${this.indentation}${this.listMarker} [${this.status.symbol}] ${this.toString()}`}toggle(){let e=he.getInstance().getNextStatusOrCreate(this.status),t=null,n=null;if(e.isCompleted()){let{setDoneDate:a}=U();a&&(t=window.moment()),this.recurrence!==null&&(n=this.recurrence.next())}let i=new me(vt(we({},this),{status:e,doneDate:t})),s=[];if(n!==null){let a=he.getInstance().getNextStatusOrCreate(e),o=new me(vt(we(we({},this),n),{status:a,blockLink:""}));s.push(o)}return s.push(i),s}get urgency(){return this._urgency===null&&(this._urgency=_r.calculate(this)),this._urgency}get filename(){let e=this.path.match(/([^/]+)\.md$/);return e!==null?e[1]:null}getLinkText({isFilenameUnique:e}){let t;return e?t=this.filename:t="/"+this.path,t===null?null:(this.precedingHeader!==null&&this.precedingHeader!==t&&(t=t+" > "+this.precedingHeader),t)}static tasksListsIdentical(e,t){return e.length!==t.length?!1:e.every((n,i)=>n.identicalTo(t[i]))}identicalTo(e){let t=["status","description","path","indentation","listMarker","sectionStart","sectionIndex","precedingHeader","priority","blockLink","scheduledDateIsInferred"];for(let s of t)if(this[s]!==e[s])return!1;if(this.tags.length!==e.tags.length||!this.tags.every(function(s,a){return s===e.tags[a]}))return!1;t=["startDate","scheduledDate","dueDate","doneDate"];for(let s of t){let a=this[s],o=e[s];if(_e.compareByDate(a,o)!==0)return!1}let n=this.recurrence,i=e.recurrence;return n===null&&i!==null||n!==null&&i===null?!1:!(n&&i&&!n.identicalTo(i))}getDescriptionWithoutGlobalFilter(){let{globalFilter:e}=U(),t=this.description;if(e.length===0)return t;let n=RegExp("(^|\\s)"+Ka(e)+"($|\\s)","ug");return this.description.search(n)>-1&&(t=t.replace(n,"$1$2").replace(" "," ").trim()),t}};var Ms=class{constructor(e){this.fetch=e;this._value=void 0}get value(){return this._value===void 0&&(this._value=this.fetch()),this._value}};var sn=class{constructor({metadataCache:e,vault:t,events:n}){this.metadataCache=e,this.metadataCacheEventReferences=[],this.vault=t,this.vaultEventReferences=[],this.events=n,this.eventsEventReferences=[],this.tasksMutex=new Vs,this.state="Cold",this.tasks=[],this.loadedAfterFirstResolve=!1,this.subscribeToCache(),this.subscribeToVault(),this.subscribeToEvents(),this.loadVault()}unload(){for(let e of this.metadataCacheEventReferences)this.metadataCache.offref(e);for(let e of this.vaultEventReferences)this.vault.offref(e);for(let e of this.eventsEventReferences)this.events.off(e)}getTasks(){return this.tasks}getState(){return this.state}notifySubscribers(){this.events.triggerCacheUpdate({tasks:this.tasks,state:this.state})}subscribeToCache(){let e=this.metadataCache.on("resolved",()=>x(this,null,function*(){this.loadedAfterFirstResolve||(this.loadedAfterFirstResolve=!0,this.loadVault())}));this.metadataCacheEventReferences.push(e);let t=this.metadataCache.on("changed",n=>{this.tasksMutex.runExclusive(()=>{this.indexFile(n)})});this.metadataCacheEventReferences.push(t)}subscribeToVault(){let{useFilenameAsScheduledDate:e}=U(),t=this.vault.on("create",s=>{s instanceof zn.TFile&&this.tasksMutex.runExclusive(()=>{this.indexFile(s)})});this.vaultEventReferences.push(t);let n=this.vault.on("delete",s=>{s instanceof zn.TFile&&this.tasksMutex.runExclusive(()=>{this.tasks=this.tasks.filter(a=>a.path!==s.path),this.notifySubscribers()})});this.vaultEventReferences.push(n);let i=this.vault.on("rename",(s,a)=>{s instanceof zn.TFile&&this.tasksMutex.runExclusive(()=>{let o=new Ms(()=>ut.fromPath(s.path));this.tasks=this.tasks.map(u=>u.path===a?e?ut.updateTaskPath(u,s.path,o.value):new me(vt(we({},u),{path:s.path})):u),this.notifySubscribers()})});this.vaultEventReferences.push(i)}subscribeToEvents(){let e=this.events.onRequestCacheUpdate(t=>{t({tasks:this.tasks,state:this.state})});this.eventsEventReferences.push(e)}loadVault(){return this.tasksMutex.runExclusive(()=>x(this,null,function*(){this.state="Initializing",yield Promise.all(this.vault.getMarkdownFiles().map(e=>this.indexFile(e))),this.state="Warm",this.notifySubscribers()}))}indexFile(e){return x(this,null,function*(){let t=this.metadataCache.getFileCache(e);if(t==null)return;let n=this.tasks.filter(a=>a.path===e.path),i=t.listItems,s=[];if(i!==void 0){let a=yield this.vault.cachedRead(e);s=this.getTasksFromFileContent(a,i,t,e)}me.tasksListsIdentical(n,s)||(this.getState()=="Warm"&&console.debug(`At least one task, its line number or its heading has changed in ${e.path}: triggering a refresh of all active Tasks blocks in Live Preview and Reading mode views.`),this.tasks=this.tasks.filter(a=>a.path!==e.path),this.tasks.push(...s),this.notifySubscribers())})}getTasksFromFileContent(e,t,n,i){let s=[],a=e.split(` -`),o=a.length,u=new Ms(()=>ut.fromPath(i.path)),l=null,c=0;for(let d of t)if(d.task!==void 0){let f=d.position.start.line;if(f>=o)return console.log(`${i.path} Obsidian gave us a line number ${f} past the end of the file. ${o}.`),s;if((l===null||l.position.end.line key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; +}; +var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __async = (__this, __arguments, generator) => { + return new Promise((resolve, reject) => { + var fulfilled = (value) => { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + }; + var rejected = (value) => { + try { + step(generator.throw(value)); + } catch (e) { + reject(e); + } + }; + var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); + step((generator = generator.apply(__this, __arguments)).next()); + }); +}; + +// node_modules/tslib/tslib.js +var require_tslib = __commonJS({ + "node_modules/tslib/tslib.js"(exports, module2) { + var __extends2; + var __assign2; + var __rest2; + var __decorate2; + var __param2; + var __metadata2; + var __awaiter2; + var __generator2; + var __exportStar2; + var __values2; + var __read2; + var __spread2; + var __spreadArrays2; + var __spreadArray2; + var __await2; + var __asyncGenerator2; + var __asyncDelegator2; + var __asyncValues2; + var __makeTemplateObject2; + var __importStar2; + var __importDefault2; + var __classPrivateFieldGet2; + var __classPrivateFieldSet2; + var __classPrivateFieldIn2; + var __createBinding2; + (function(factory) { + var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {}; + if (typeof define === "function" && define.amd) { + define("tslib", ["exports"], function(exports2) { + factory(createExporter(root, createExporter(exports2))); + }); + } else if (typeof module2 === "object" && typeof module2.exports === "object") { + factory(createExporter(root, createExporter(module2.exports))); + } else { + factory(createExporter(root)); + } + function createExporter(exports2, previous) { + if (exports2 !== root) { + if (typeof Object.create === "function") { + Object.defineProperty(exports2, "__esModule", { value: true }); + } else { + exports2.__esModule = true; + } + } + return function(id, v) { + return exports2[id] = previous ? previous(id, v) : v; + }; + } + })(function(exporter) { + var 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]; + }; + __extends2 = function(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { + this.constructor = d; + } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; + __assign2 = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + __rest2 = function(s, e) { + var t = {}; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + }; + __decorate2 = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") + r = Reflect.decorate(decorators, target, key, desc); + else + for (var i = decorators.length - 1; i >= 0; i--) + if (d = decorators[i]) + r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param2 = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + __metadata2 = function(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") + return Reflect.metadata(metadataKey, metadataValue); + }; + __awaiter2 = 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()); + }); + }; + __generator2 = function(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 }; + } + }; + __exportStar2 = function(m, o) { + for (var p in m) + if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) + __createBinding2(o, m, p); + }; + __createBinding2 = Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }; + __values2 = function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) + return m.call(o); + if (o && typeof o.length === "number") + return { + next: function() { + if (o && i >= o.length) + o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); + }; + __read2 = function(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) + return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) + ar.push(r.value); + } catch (error) { + e = { error }; + } finally { + try { + if (r && !r.done && (m = i["return"])) + m.call(i); + } finally { + if (e) + throw e.error; + } + } + return ar; + }; + __spread2 = function() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read2(arguments[i])); + return ar; + }; + __spreadArrays2 = function() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + }; + __spreadArray2 = function(to, from, pack) { + if (pack || arguments.length === 2) + for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) + ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); + }; + __await2 = function(v) { + return this instanceof __await2 ? (this.v = v, this) : new __await2(v); + }; + __asyncGenerator2 = function(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { + return this; + }, i; + function verb(n) { + if (g[n]) + i[n] = function(v) { + return new Promise(function(a, b) { + q.push([n, v, a, b]) > 1 || resume(n, v); + }); + }; + } + function resume(n, v) { + try { + step(g[n](v)); + } catch (e) { + settle(q[0][3], e); + } + } + function step(r) { + r.value instanceof __await2 ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); + } + function fulfill(value) { + resume("next", value); + } + function reject(value) { + resume("throw", value); + } + function settle(f, v) { + if (f(v), q.shift(), q.length) + resume(q[0][0], q[0][1]); + } + }; + __asyncDelegator2 = function(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function(e) { + throw e; + }), verb("return"), i[Symbol.iterator] = function() { + return this; + }, i; + function verb(n, f) { + i[n] = o[n] ? function(v) { + return (p = !p) ? { value: __await2(o[n](v)), done: n === "return" } : f ? f(v) : v; + } : f; + } + }; + __asyncValues2 = function(o) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values2 === "function" ? __values2(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { + return this; + }, i); + function verb(n) { + i[n] = o[n] && function(v) { + return new Promise(function(resolve, reject) { + v = o[n](v), settle(resolve, reject, v.done, v.value); + }); + }; + } + function settle(resolve, reject, d, v) { + Promise.resolve(v).then(function(v2) { + resolve({ value: v2, done: d }); + }, reject); + } + }; + __makeTemplateObject2 = function(cooked, raw) { + if (Object.defineProperty) { + Object.defineProperty(cooked, "raw", { value: raw }); + } else { + cooked.raw = raw; + } + return cooked; + }; + var __setModuleDefault = Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }; + __importStar2 = function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + __importDefault2 = function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + __classPrivateFieldGet2 = function(receiver, state, kind, f) { + if (kind === "a" && !f) + throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) + throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); + }; + __classPrivateFieldSet2 = function(receiver, state, value, kind, f) { + if (kind === "m") + throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) + throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) + throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; + }; + __classPrivateFieldIn2 = function(state, receiver) { + if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") + throw new TypeError("Cannot use 'in' operator on non-object"); + return typeof state === "function" ? receiver === state : state.has(receiver); + }; + exporter("__extends", __extends2); + exporter("__assign", __assign2); + exporter("__rest", __rest2); + exporter("__decorate", __decorate2); + exporter("__param", __param2); + exporter("__metadata", __metadata2); + exporter("__awaiter", __awaiter2); + exporter("__generator", __generator2); + exporter("__exportStar", __exportStar2); + exporter("__createBinding", __createBinding2); + exporter("__values", __values2); + exporter("__read", __read2); + exporter("__spread", __spread2); + exporter("__spreadArrays", __spreadArrays2); + exporter("__spreadArray", __spreadArray2); + exporter("__await", __await2); + exporter("__asyncGenerator", __asyncGenerator2); + exporter("__asyncDelegator", __asyncDelegator2); + exporter("__asyncValues", __asyncValues2); + exporter("__makeTemplateObject", __makeTemplateObject2); + exporter("__importStar", __importStar2); + exporter("__importDefault", __importDefault2); + exporter("__classPrivateFieldGet", __classPrivateFieldGet2); + exporter("__classPrivateFieldSet", __classPrivateFieldSet2); + exporter("__classPrivateFieldIn", __classPrivateFieldIn2); + }); + } +}); + +// node_modules/chrono-node/dist/utils/pattern.js +var require_pattern = __commonJS({ + "node_modules/chrono-node/dist/utils/pattern.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.matchAnyPattern = exports.extractTerms = exports.repeatedTimeunitPattern = void 0; + function repeatedTimeunitPattern(prefix, singleTimeunitPattern) { + const singleTimeunitPatternNoCapture = singleTimeunitPattern.replace(/\((?!\?)/g, "(?:"); + return `${prefix}${singleTimeunitPatternNoCapture}\\s{0,5}(?:,?\\s{0,5}${singleTimeunitPatternNoCapture}){0,10}`; + } + exports.repeatedTimeunitPattern = repeatedTimeunitPattern; + function extractTerms(dictionary) { + let keys; + if (dictionary instanceof Array) { + keys = [...dictionary]; + } else if (dictionary instanceof Map) { + keys = Array.from(dictionary.keys()); + } else { + keys = Object.keys(dictionary); + } + return keys; + } + exports.extractTerms = extractTerms; + function matchAnyPattern(dictionary) { + const joinedTerms = extractTerms(dictionary).sort((a, b) => b.length - a.length).join("|").replace(/\./g, "\\."); + return `(?:${joinedTerms})`; + } + exports.matchAnyPattern = matchAnyPattern; + } +}); + +// node_modules/dayjs/dayjs.min.js +var require_dayjs_min = __commonJS({ + "node_modules/dayjs/dayjs.min.js"(exports, module2) { + !function(t, e) { + "object" == typeof exports && "undefined" != typeof module2 ? module2.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).dayjs = e(); + }(exports, function() { + "use strict"; + var t = 1e3, e = 6e4, n = 36e5, r = "millisecond", i = "second", s = "minute", u = "hour", a = "day", o = "week", f = "month", h = "quarter", c = "year", d = "date", $ = "Invalid Date", l = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_") }, m = function(t2, e2, n2) { + var r2 = String(t2); + return !r2 || r2.length >= e2 ? t2 : "" + Array(e2 + 1 - r2.length).join(n2) + t2; + }, g = { s: m, z: function(t2) { + var e2 = -t2.utcOffset(), n2 = Math.abs(e2), r2 = Math.floor(n2 / 60), i2 = n2 % 60; + return (e2 <= 0 ? "+" : "-") + m(r2, 2, "0") + ":" + m(i2, 2, "0"); + }, m: function t2(e2, n2) { + if (e2.date() < n2.date()) + return -t2(n2, e2); + var r2 = 12 * (n2.year() - e2.year()) + (n2.month() - e2.month()), i2 = e2.clone().add(r2, f), s2 = n2 - i2 < 0, u2 = e2.clone().add(r2 + (s2 ? -1 : 1), f); + return +(-(r2 + (n2 - i2) / (s2 ? i2 - u2 : u2 - i2)) || 0); + }, a: function(t2) { + return t2 < 0 ? Math.ceil(t2) || 0 : Math.floor(t2); + }, p: function(t2) { + return { M: f, y: c, w: o, d: a, D: d, h: u, m: s, s: i, ms: r, Q: h }[t2] || String(t2 || "").toLowerCase().replace(/s$/, ""); + }, u: function(t2) { + return void 0 === t2; + } }, D = "en", v = {}; + v[D] = M; + var p = function(t2) { + return t2 instanceof _; + }, S = function(t2, e2, n2) { + var r2; + if (!t2) + return D; + if ("string" == typeof t2) + v[t2] && (r2 = t2), e2 && (v[t2] = e2, r2 = t2); + else { + var i2 = t2.name; + v[i2] = t2, r2 = i2; + } + return !n2 && r2 && (D = r2), r2 || !n2 && D; + }, w = function(t2, e2) { + if (p(t2)) + return t2.clone(); + var n2 = "object" == typeof e2 ? e2 : {}; + return n2.date = t2, n2.args = arguments, new _(n2); + }, O = g; + O.l = S, O.i = p, O.w = function(t2, e2) { + return w(t2, { locale: e2.$L, utc: e2.$u, x: e2.$x, $offset: e2.$offset }); + }; + var _ = function() { + function M2(t2) { + this.$L = S(t2.locale, null, true), this.parse(t2); + } + var m2 = M2.prototype; + return m2.parse = function(t2) { + this.$d = function(t3) { + var e2 = t3.date, n2 = t3.utc; + if (null === e2) + return new Date(NaN); + if (O.u(e2)) + return new Date(); + if (e2 instanceof Date) + return new Date(e2); + if ("string" == typeof e2 && !/Z$/i.test(e2)) { + var r2 = e2.match(l); + if (r2) { + var i2 = r2[2] - 1 || 0, s2 = (r2[7] || "0").substring(0, 3); + return n2 ? new Date(Date.UTC(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2)) : new Date(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2); + } + } + return new Date(e2); + }(t2), this.$x = t2.x || {}, this.init(); + }, m2.init = function() { + var t2 = this.$d; + this.$y = t2.getFullYear(), this.$M = t2.getMonth(), this.$D = t2.getDate(), this.$W = t2.getDay(), this.$H = t2.getHours(), this.$m = t2.getMinutes(), this.$s = t2.getSeconds(), this.$ms = t2.getMilliseconds(); + }, m2.$utils = function() { + return O; + }, m2.isValid = function() { + return !(this.$d.toString() === $); + }, m2.isSame = function(t2, e2) { + var n2 = w(t2); + return this.startOf(e2) <= n2 && n2 <= this.endOf(e2); + }, m2.isAfter = function(t2, e2) { + return w(t2) < this.startOf(e2); + }, m2.isBefore = function(t2, e2) { + return this.endOf(e2) < w(t2); + }, m2.$g = function(t2, e2, n2) { + return O.u(t2) ? this[e2] : this.set(n2, t2); + }, m2.unix = function() { + return Math.floor(this.valueOf() / 1e3); + }, m2.valueOf = function() { + return this.$d.getTime(); + }, m2.startOf = function(t2, e2) { + var n2 = this, r2 = !!O.u(e2) || e2, h2 = O.p(t2), $2 = function(t3, e3) { + var i2 = O.w(n2.$u ? Date.UTC(n2.$y, e3, t3) : new Date(n2.$y, e3, t3), n2); + return r2 ? i2 : i2.endOf(a); + }, l2 = function(t3, e3) { + return O.w(n2.toDate()[t3].apply(n2.toDate("s"), (r2 ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e3)), n2); + }, y2 = this.$W, M3 = this.$M, m3 = this.$D, g2 = "set" + (this.$u ? "UTC" : ""); + switch (h2) { + case c: + return r2 ? $2(1, 0) : $2(31, 11); + case f: + return r2 ? $2(1, M3) : $2(0, M3 + 1); + case o: + var D2 = this.$locale().weekStart || 0, v2 = (y2 < D2 ? y2 + 7 : y2) - D2; + return $2(r2 ? m3 - v2 : m3 + (6 - v2), M3); + case a: + case d: + return l2(g2 + "Hours", 0); + case u: + return l2(g2 + "Minutes", 1); + case s: + return l2(g2 + "Seconds", 2); + case i: + return l2(g2 + "Milliseconds", 3); + default: + return this.clone(); + } + }, m2.endOf = function(t2) { + return this.startOf(t2, false); + }, m2.$set = function(t2, e2) { + var n2, o2 = O.p(t2), h2 = "set" + (this.$u ? "UTC" : ""), $2 = (n2 = {}, n2[a] = h2 + "Date", n2[d] = h2 + "Date", n2[f] = h2 + "Month", n2[c] = h2 + "FullYear", n2[u] = h2 + "Hours", n2[s] = h2 + "Minutes", n2[i] = h2 + "Seconds", n2[r] = h2 + "Milliseconds", n2)[o2], l2 = o2 === a ? this.$D + (e2 - this.$W) : e2; + if (o2 === f || o2 === c) { + var y2 = this.clone().set(d, 1); + y2.$d[$2](l2), y2.init(), this.$d = y2.set(d, Math.min(this.$D, y2.daysInMonth())).$d; + } else + $2 && this.$d[$2](l2); + return this.init(), this; + }, m2.set = function(t2, e2) { + return this.clone().$set(t2, e2); + }, m2.get = function(t2) { + return this[O.p(t2)](); + }, m2.add = function(r2, h2) { + var d2, $2 = this; + r2 = Number(r2); + var l2 = O.p(h2), y2 = function(t2) { + var e2 = w($2); + return O.w(e2.date(e2.date() + Math.round(t2 * r2)), $2); + }; + if (l2 === f) + return this.set(f, this.$M + r2); + if (l2 === c) + return this.set(c, this.$y + r2); + if (l2 === a) + return y2(1); + if (l2 === o) + return y2(7); + var M3 = (d2 = {}, d2[s] = e, d2[u] = n, d2[i] = t, d2)[l2] || 1, m3 = this.$d.getTime() + r2 * M3; + return O.w(m3, this); + }, m2.subtract = function(t2, e2) { + return this.add(-1 * t2, e2); + }, m2.format = function(t2) { + var e2 = this, n2 = this.$locale(); + if (!this.isValid()) + return n2.invalidDate || $; + var r2 = t2 || "YYYY-MM-DDTHH:mm:ssZ", i2 = O.z(this), s2 = this.$H, u2 = this.$m, a2 = this.$M, o2 = n2.weekdays, f2 = n2.months, h2 = function(t3, n3, i3, s3) { + return t3 && (t3[n3] || t3(e2, r2)) || i3[n3].substr(0, s3); + }, c2 = function(t3) { + return O.s(s2 % 12 || 12, t3, "0"); + }, d2 = n2.meridiem || function(t3, e3, n3) { + var r3 = t3 < 12 ? "AM" : "PM"; + return n3 ? r3.toLowerCase() : r3; + }, l2 = { YY: String(this.$y).slice(-2), YYYY: this.$y, M: a2 + 1, MM: O.s(a2 + 1, 2, "0"), MMM: h2(n2.monthsShort, a2, f2, 3), MMMM: h2(f2, a2), D: this.$D, DD: O.s(this.$D, 2, "0"), d: String(this.$W), dd: h2(n2.weekdaysMin, this.$W, o2, 2), ddd: h2(n2.weekdaysShort, this.$W, o2, 3), dddd: o2[this.$W], H: String(s2), HH: O.s(s2, 2, "0"), h: c2(1), hh: c2(2), a: d2(s2, u2, true), A: d2(s2, u2, false), m: String(u2), mm: O.s(u2, 2, "0"), s: String(this.$s), ss: O.s(this.$s, 2, "0"), SSS: O.s(this.$ms, 3, "0"), Z: i2 }; + return r2.replace(y, function(t3, e3) { + return e3 || l2[t3] || i2.replace(":", ""); + }); + }, m2.utcOffset = function() { + return 15 * -Math.round(this.$d.getTimezoneOffset() / 15); + }, m2.diff = function(r2, d2, $2) { + var l2, y2 = O.p(d2), M3 = w(r2), m3 = (M3.utcOffset() - this.utcOffset()) * e, g2 = this - M3, D2 = O.m(this, M3); + return D2 = (l2 = {}, l2[c] = D2 / 12, l2[f] = D2, l2[h] = D2 / 3, l2[o] = (g2 - m3) / 6048e5, l2[a] = (g2 - m3) / 864e5, l2[u] = g2 / n, l2[s] = g2 / e, l2[i] = g2 / t, l2)[y2] || g2, $2 ? D2 : O.a(D2); + }, m2.daysInMonth = function() { + return this.endOf(f).$D; + }, m2.$locale = function() { + return v[this.$L]; + }, m2.locale = function(t2, e2) { + if (!t2) + return this.$L; + var n2 = this.clone(), r2 = S(t2, e2, true); + return r2 && (n2.$L = r2), n2; + }, m2.clone = function() { + return O.w(this.$d, this); + }, m2.toDate = function() { + return new Date(this.valueOf()); + }, m2.toJSON = function() { + return this.isValid() ? this.toISOString() : null; + }, m2.toISOString = function() { + return this.$d.toISOString(); + }, m2.toString = function() { + return this.$d.toUTCString(); + }, M2; + }(), b = _.prototype; + return w.prototype = b, [["$ms", r], ["$s", i], ["$m", s], ["$H", u], ["$W", a], ["$M", f], ["$y", c], ["$D", d]].forEach(function(t2) { + b[t2[1]] = function(e2) { + return this.$g(e2, t2[0], t2[1]); + }; + }), w.extend = function(t2, e2) { + return t2.$i || (t2(e2, _, w), t2.$i = true), w; + }, w.locale = S, w.isDayjs = p, w.unix = function(t2) { + return w(1e3 * t2); + }, w.en = v[D], w.Ls = v, w.p = {}, w; + }); + } +}); + +// node_modules/chrono-node/dist/calculation/years.js +var require_years = __commonJS({ + "node_modules/chrono-node/dist/calculation/years.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.findYearClosestToRef = exports.findMostLikelyADYear = void 0; + var dayjs_1 = __importDefault2(require_dayjs_min()); + function findMostLikelyADYear(yearNumber) { + if (yearNumber < 100) { + if (yearNumber > 50) { + yearNumber = yearNumber + 1900; + } else { + yearNumber = yearNumber + 2e3; + } + } + return yearNumber; + } + exports.findMostLikelyADYear = findMostLikelyADYear; + function findYearClosestToRef(refDate, day, month) { + const refMoment = dayjs_1.default(refDate); + let dateMoment = refMoment; + dateMoment = dateMoment.month(month - 1); + dateMoment = dateMoment.date(day); + dateMoment = dateMoment.year(refMoment.year()); + const nextYear = dateMoment.add(1, "y"); + const lastYear = dateMoment.add(-1, "y"); + if (Math.abs(nextYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) { + dateMoment = nextYear; + } else if (Math.abs(lastYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) { + dateMoment = lastYear; + } + return dateMoment.year(); + } + exports.findYearClosestToRef = findYearClosestToRef; + } +}); + +// node_modules/chrono-node/dist/locales/en/constants.js +var require_constants = __commonJS({ + "node_modules/chrono-node/dist/locales/en/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.FULL_MONTH_NAME_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + var pattern_1 = require_pattern(); + var years_1 = require_years(); + exports.WEEKDAY_DICTIONARY = { + sunday: 0, + sun: 0, + "sun.": 0, + monday: 1, + mon: 1, + "mon.": 1, + tuesday: 2, + tue: 2, + "tue.": 2, + wednesday: 3, + wed: 3, + "wed.": 3, + thursday: 4, + thurs: 4, + "thurs.": 4, + thur: 4, + "thur.": 4, + thu: 4, + "thu.": 4, + friday: 5, + fri: 5, + "fri.": 5, + saturday: 6, + sat: 6, + "sat.": 6 + }; + exports.FULL_MONTH_NAME_DICTIONARY = { + january: 1, + february: 2, + march: 3, + april: 4, + may: 5, + june: 6, + july: 7, + august: 8, + september: 9, + october: 10, + november: 11, + december: 12 + }; + exports.MONTH_DICTIONARY = Object.assign(Object.assign({}, exports.FULL_MONTH_NAME_DICTIONARY), { jan: 1, "jan.": 1, feb: 2, "feb.": 2, mar: 3, "mar.": 3, apr: 4, "apr.": 4, jun: 6, "jun.": 6, jul: 7, "jul.": 7, aug: 8, "aug.": 8, sep: 9, "sep.": 9, sept: 9, "sept.": 9, oct: 10, "oct.": 10, nov: 11, "nov.": 11, dec: 12, "dec.": 12 }); + exports.INTEGER_WORD_DICTIONARY = { + one: 1, + two: 2, + three: 3, + four: 4, + five: 5, + six: 6, + seven: 7, + eight: 8, + nine: 9, + ten: 10, + eleven: 11, + twelve: 12 + }; + exports.ORDINAL_WORD_DICTIONARY = { + first: 1, + second: 2, + third: 3, + fourth: 4, + fifth: 5, + sixth: 6, + seventh: 7, + eighth: 8, + ninth: 9, + tenth: 10, + eleventh: 11, + twelfth: 12, + thirteenth: 13, + fourteenth: 14, + fifteenth: 15, + sixteenth: 16, + seventeenth: 17, + eighteenth: 18, + nineteenth: 19, + twentieth: 20, + "twenty first": 21, + "twenty-first": 21, + "twenty second": 22, + "twenty-second": 22, + "twenty third": 23, + "twenty-third": 23, + "twenty fourth": 24, + "twenty-fourth": 24, + "twenty fifth": 25, + "twenty-fifth": 25, + "twenty sixth": 26, + "twenty-sixth": 26, + "twenty seventh": 27, + "twenty-seventh": 27, + "twenty eighth": 28, + "twenty-eighth": 28, + "twenty ninth": 29, + "twenty-ninth": 29, + "thirtieth": 30, + "thirty first": 31, + "thirty-first": 31 + }; + exports.TIME_UNIT_DICTIONARY = { + sec: "second", + second: "second", + seconds: "second", + min: "minute", + mins: "minute", + minute: "minute", + minutes: "minute", + h: "hour", + hr: "hour", + hrs: "hour", + hour: "hour", + hours: "hour", + day: "d", + days: "d", + week: "week", + weeks: "week", + month: "month", + months: "month", + qtr: "quarter", + quarter: "quarter", + quarters: "quarter", + y: "year", + yr: "year", + year: "year", + years: "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s{0,2}an?)?|an?\\b(?:\\s{0,2}few)?|few|several|a?\\s{0,2}couple\\s{0,2}(?:of)?)`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } else if (num === "a" || num === "an") { + return 1; + } else if (num.match(/few/)) { + return 3; + } else if (num.match(/half/)) { + return 0.5; + } else if (num.match(/couple/)) { + return 2; + } else if (num.match(/several/)) { + return 7; + } + return parseFloat(num); + } + exports.parseNumberPattern = parseNumberPattern; + exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:st|nd|rd|th)?)`; + function parseOrdinalNumberPattern(match) { + let num = match.toLowerCase(); + if (exports.ORDINAL_WORD_DICTIONARY[num] !== void 0) { + return exports.ORDINAL_WORD_DICTIONARY[num]; + } + num = num.replace(/(?:st|nd|rd|th)$/i, ""); + return parseInt(num); + } + exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; + exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s{0,2}(?:BE|AD|BC|BCE|CE)|[1-2][0-9]{3}|[5-9][0-9])`; + function parseYear(match) { + if (/BE/i.test(match)) { + match = match.replace(/BE/i, ""); + return parseInt(match) - 543; + } + if (/BCE?/i.test(match)) { + match = match.replace(/BCE?/i, ""); + return -parseInt(match); + } + if (/(AD|CE)/i.test(match)) { + match = match.replace(/(AD|CE)/i, ""); + return parseInt(match); + } + const rawYearNumber = parseInt(match); + return years_1.findMostLikelyADYear(rawYearNumber); + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,3}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:about|around)\\s{0,3})?`, SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length).trim(); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/dayjs/plugin/quarterOfYear.js +var require_quarterOfYear = __commonJS({ + "node_modules/dayjs/plugin/quarterOfYear.js"(exports, module2) { + !function(t, n) { + "object" == typeof exports && "undefined" != typeof module2 ? module2.exports = n() : "function" == typeof define && define.amd ? define(n) : (t = "undefined" != typeof globalThis ? globalThis : t || self).dayjs_plugin_quarterOfYear = n(); + }(exports, function() { + "use strict"; + var t = "month", n = "quarter"; + return function(e, i) { + var r = i.prototype; + r.quarter = function(t2) { + return this.$utils().u(t2) ? Math.ceil((this.month() + 1) / 3) : this.month(this.month() % 3 + 3 * (t2 - 1)); + }; + var s = r.add; + r.add = function(e2, i2) { + return e2 = Number(e2), this.$utils().p(i2) === n ? this.add(3 * e2, t) : s.bind(this)(e2, i2); + }; + var u = r.startOf; + r.startOf = function(e2, i2) { + var r2 = this.$utils(), s2 = !!r2.u(i2) || i2; + if (r2.p(e2) === n) { + var o = this.quarter() - 1; + return s2 ? this.month(3 * o).startOf(t).startOf("day") : this.month(3 * o + 2).endOf(t).endOf("day"); + } + return u.bind(this)(e2, i2); + }; + }; + }); + } +}); + +// node_modules/chrono-node/dist/utils/dayjs.js +var require_dayjs = __commonJS({ + "node_modules/chrono-node/dist/utils/dayjs.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.implySimilarTime = exports.assignSimilarTime = exports.assignSimilarDate = exports.assignTheNextDay = void 0; + var index_1 = require_dist(); + function assignTheNextDay(component, targetDayJs) { + targetDayJs = targetDayJs.add(1, "day"); + assignSimilarDate(component, targetDayJs); + implySimilarTime(component, targetDayJs); + } + exports.assignTheNextDay = assignTheNextDay; + function assignSimilarDate(component, targetDayJs) { + component.assign("day", targetDayJs.date()); + component.assign("month", targetDayJs.month() + 1); + component.assign("year", targetDayJs.year()); + } + exports.assignSimilarDate = assignSimilarDate; + function assignSimilarTime(component, targetDayJs) { + component.assign("hour", targetDayJs.hour()); + component.assign("minute", targetDayJs.minute()); + component.assign("second", targetDayJs.second()); + component.assign("millisecond", targetDayJs.millisecond()); + if (component.get("hour") < 12) { + component.assign("meridiem", index_1.Meridiem.AM); + } else { + component.assign("meridiem", index_1.Meridiem.PM); + } + } + exports.assignSimilarTime = assignSimilarTime; + function implySimilarTime(component, targetDayJs) { + component.imply("hour", targetDayJs.hour()); + component.imply("minute", targetDayJs.minute()); + component.imply("second", targetDayJs.second()); + component.imply("millisecond", targetDayJs.millisecond()); + } + exports.implySimilarTime = implySimilarTime; + } +}); + +// node_modules/chrono-node/dist/timezone.js +var require_timezone = __commonJS({ + "node_modules/chrono-node/dist/timezone.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.toTimezoneOffset = exports.TIMEZONE_ABBR_MAP = void 0; + exports.TIMEZONE_ABBR_MAP = { + ACDT: 630, + ACST: 570, + ADT: -180, + AEDT: 660, + AEST: 600, + AFT: 270, + AKDT: -480, + AKST: -540, + ALMT: 360, + AMST: -180, + AMT: -240, + ANAST: 720, + ANAT: 720, + AQTT: 300, + ART: -180, + AST: -240, + AWDT: 540, + AWST: 480, + AZOST: 0, + AZOT: -60, + AZST: 300, + AZT: 240, + BNT: 480, + BOT: -240, + BRST: -120, + BRT: -180, + BST: 60, + BTT: 360, + CAST: 480, + CAT: 120, + CCT: 390, + CDT: -300, + CEST: 120, + CET: 60, + CHADT: 825, + CHAST: 765, + CKT: -600, + CLST: -180, + CLT: -240, + COT: -300, + CST: -360, + CVT: -60, + CXT: 420, + ChST: 600, + DAVT: 420, + EASST: -300, + EAST: -360, + EAT: 180, + ECT: -300, + EDT: -240, + EEST: 180, + EET: 120, + EGST: 0, + EGT: -60, + EST: -300, + ET: -300, + FJST: 780, + FJT: 720, + FKST: -180, + FKT: -240, + FNT: -120, + GALT: -360, + GAMT: -540, + GET: 240, + GFT: -180, + GILT: 720, + GMT: 0, + GST: 240, + GYT: -240, + HAA: -180, + HAC: -300, + HADT: -540, + HAE: -240, + HAP: -420, + HAR: -360, + HAST: -600, + HAT: -90, + HAY: -480, + HKT: 480, + HLV: -210, + HNA: -240, + HNC: -360, + HNE: -300, + HNP: -480, + HNR: -420, + HNT: -150, + HNY: -540, + HOVT: 420, + ICT: 420, + IDT: 180, + IOT: 360, + IRDT: 270, + IRKST: 540, + IRKT: 540, + IRST: 210, + IST: 330, + JST: 540, + KGT: 360, + KRAST: 480, + KRAT: 480, + KST: 540, + KUYT: 240, + LHDT: 660, + LHST: 630, + LINT: 840, + MAGST: 720, + MAGT: 720, + MART: -510, + MAWT: 300, + MDT: -360, + MESZ: 120, + MEZ: 60, + MHT: 720, + MMT: 390, + MSD: 240, + MSK: 180, + MST: -420, + MUT: 240, + MVT: 300, + MYT: 480, + NCT: 660, + NDT: -90, + NFT: 690, + NOVST: 420, + NOVT: 360, + NPT: 345, + NST: -150, + NUT: -660, + NZDT: 780, + NZST: 720, + OMSST: 420, + OMST: 420, + PDT: -420, + PET: -300, + PETST: 720, + PETT: 720, + PGT: 600, + PHOT: 780, + PHT: 480, + PKT: 300, + PMDT: -120, + PMST: -180, + PONT: 660, + PST: -480, + PT: -480, + PWT: 540, + PYST: -180, + PYT: -240, + RET: 240, + SAMT: 240, + SAST: 120, + SBT: 660, + SCT: 240, + SGT: 480, + SRT: -180, + SST: -660, + TAHT: -600, + TFT: 300, + TJT: 300, + TKT: 780, + TLT: 540, + TMT: 300, + TVT: 720, + ULAT: 480, + UTC: 0, + UYST: -120, + UYT: -180, + UZT: 300, + VET: -210, + VLAST: 660, + VLAT: 660, + VUT: 660, + WAST: 120, + WAT: 60, + WEST: 60, + WESZ: 60, + WET: 0, + WEZ: 0, + WFT: 720, + WGST: -120, + WGT: -180, + WIB: 420, + WIT: 540, + WITA: 480, + WST: 780, + WT: 0, + YAKST: 600, + YAKT: 600, + YAPT: 600, + YEKST: 360, + YEKT: 360 + }; + function toTimezoneOffset(timezoneInput) { + var _a; + if (timezoneInput === null || timezoneInput === void 0) { + return null; + } + if (typeof timezoneInput === "number") { + return timezoneInput; + } + return (_a = exports.TIMEZONE_ABBR_MAP[timezoneInput]) !== null && _a !== void 0 ? _a : null; + } + exports.toTimezoneOffset = toTimezoneOffset; + } +}); + +// node_modules/chrono-node/dist/results.js +var require_results = __commonJS({ + "node_modules/chrono-node/dist/results.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ParsingResult = exports.ParsingComponents = exports.ReferenceWithTimezone = void 0; + var quarterOfYear_1 = __importDefault2(require_quarterOfYear()); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var dayjs_2 = require_dayjs(); + var timezone_1 = require_timezone(); + dayjs_1.default.extend(quarterOfYear_1.default); + var ReferenceWithTimezone = class { + constructor(input) { + var _a; + input = input !== null && input !== void 0 ? input : new Date(); + if (input instanceof Date) { + this.instant = input; + } else { + this.instant = (_a = input.instant) !== null && _a !== void 0 ? _a : new Date(); + this.timezoneOffset = timezone_1.toTimezoneOffset(input.timezone); + } + } + }; + exports.ReferenceWithTimezone = ReferenceWithTimezone; + var ParsingComponents = class { + constructor(reference, knownComponents) { + this.reference = reference; + this.knownValues = {}; + this.impliedValues = {}; + if (knownComponents) { + for (const key in knownComponents) { + this.knownValues[key] = knownComponents[key]; + } + } + const refDayJs = dayjs_1.default(reference.instant); + this.imply("day", refDayJs.date()); + this.imply("month", refDayJs.month() + 1); + this.imply("year", refDayJs.year()); + this.imply("hour", 12); + this.imply("minute", 0); + this.imply("second", 0); + this.imply("millisecond", 0); + } + get(component) { + if (component in this.knownValues) { + return this.knownValues[component]; + } + if (component in this.impliedValues) { + return this.impliedValues[component]; + } + return null; + } + isCertain(component) { + return component in this.knownValues; + } + getCertainComponents() { + return Object.keys(this.knownValues); + } + imply(component, value) { + if (component in this.knownValues) { + return this; + } + this.impliedValues[component] = value; + return this; + } + assign(component, value) { + this.knownValues[component] = value; + delete this.impliedValues[component]; + return this; + } + delete(component) { + delete this.knownValues[component]; + delete this.impliedValues[component]; + } + clone() { + const component = new ParsingComponents(this.reference); + component.knownValues = {}; + component.impliedValues = {}; + for (const key in this.knownValues) { + component.knownValues[key] = this.knownValues[key]; + } + for (const key in this.impliedValues) { + component.impliedValues[key] = this.impliedValues[key]; + } + return component; + } + isOnlyDate() { + return !this.isCertain("hour") && !this.isCertain("minute") && !this.isCertain("second"); + } + isOnlyTime() { + return !this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month"); + } + isOnlyWeekdayComponent() { + return this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month"); + } + isOnlyDayMonthComponent() { + return this.isCertain("day") && this.isCertain("month") && !this.isCertain("year"); + } + isValidDate() { + const date = this.dateWithoutTimezoneAdjustment(); + if (date.getFullYear() !== this.get("year")) + return false; + if (date.getMonth() !== this.get("month") - 1) + return false; + if (date.getDate() !== this.get("day")) + return false; + if (this.get("hour") != null && date.getHours() != this.get("hour")) + return false; + if (this.get("minute") != null && date.getMinutes() != this.get("minute")) + return false; + return true; + } + toString() { + return `[ParsingComponents {knownValues: ${JSON.stringify(this.knownValues)}, impliedValues: ${JSON.stringify(this.impliedValues)}}, reference: ${JSON.stringify(this.reference)}]`; + } + dayjs() { + return dayjs_1.default(this.date()); + } + date() { + const date = this.dateWithoutTimezoneAdjustment(); + return new Date(date.getTime() + this.getSystemTimezoneAdjustmentMinute(date) * 6e4); + } + dateWithoutTimezoneAdjustment() { + const date = new Date(this.get("year"), this.get("month") - 1, this.get("day"), this.get("hour"), this.get("minute"), this.get("second"), this.get("millisecond")); + date.setFullYear(this.get("year")); + return date; + } + getSystemTimezoneAdjustmentMinute(date) { + var _a, _b; + if (!date || date.getTime() < 0) { + date = new Date(); + } + const currentTimezoneOffset = -date.getTimezoneOffset(); + const targetTimezoneOffset = (_b = (_a = this.get("timezoneOffset")) !== null && _a !== void 0 ? _a : this.reference.timezoneOffset) !== null && _b !== void 0 ? _b : currentTimezoneOffset; + return currentTimezoneOffset - targetTimezoneOffset; + } + static createRelativeFromReference(reference, fragments) { + let date = dayjs_1.default(reference.instant); + for (const key in fragments) { + date = date.add(fragments[key], key); + } + const components = new ParsingComponents(reference); + if (fragments["hour"] || fragments["minute"] || fragments["second"]) { + dayjs_2.assignSimilarTime(components, date); + dayjs_2.assignSimilarDate(components, date); + if (reference.timezoneOffset !== null) { + components.assign("timezoneOffset", -reference.instant.getTimezoneOffset()); + } + } else { + dayjs_2.implySimilarTime(components, date); + if (reference.timezoneOffset !== null) { + components.imply("timezoneOffset", -reference.instant.getTimezoneOffset()); + } + if (fragments["d"]) { + components.assign("day", date.date()); + components.assign("month", date.month() + 1); + components.assign("year", date.year()); + } else { + if (fragments["week"]) { + components.imply("weekday", date.day()); + } + components.imply("day", date.date()); + if (fragments["month"]) { + components.assign("month", date.month() + 1); + components.assign("year", date.year()); + } else { + components.imply("month", date.month() + 1); + if (fragments["year"]) { + components.assign("year", date.year()); + } else { + components.imply("year", date.year()); + } + } + } + } + return components; + } + }; + exports.ParsingComponents = ParsingComponents; + var ParsingResult = class { + constructor(reference, index, text2, start, end) { + this.reference = reference; + this.refDate = reference.instant; + this.index = index; + this.text = text2; + this.start = start || new ParsingComponents(reference); + this.end = end; + } + clone() { + const result = new ParsingResult(this.reference, this.index, this.text); + result.start = this.start ? this.start.clone() : null; + result.end = this.end ? this.end.clone() : null; + return result; + } + date() { + return this.start.date(); + } + toString() { + return `[ParsingResult {index: ${this.index}, text: '${this.text}', ...}]`; + } + }; + exports.ParsingResult = ParsingResult; + } +}); + +// node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js +var require_AbstractParserWithWordBoundary = __commonJS({ + "node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.AbstractParserWithWordBoundaryChecking = void 0; + var AbstractParserWithWordBoundaryChecking = class { + constructor() { + this.cachedInnerPattern = null; + this.cachedPattern = null; + } + patternLeftBoundary() { + return `(\\W|^)`; + } + pattern(context) { + const innerPattern = this.innerPattern(context); + if (innerPattern == this.cachedInnerPattern) { + return this.cachedPattern; + } + this.cachedPattern = new RegExp(`${this.patternLeftBoundary()}${innerPattern.source}`, innerPattern.flags); + this.cachedInnerPattern = innerPattern; + return this.cachedPattern; + } + extract(context, match) { + var _a; + const header = (_a = match[1]) !== null && _a !== void 0 ? _a : ""; + match.index = match.index + header.length; + match[0] = match[0].substring(header.length); + for (let i = 2; i < match.length; i++) { + match[i - 1] = match[i]; + } + return this.innerExtract(context, match); + } + }; + exports.AbstractParserWithWordBoundaryChecking = AbstractParserWithWordBoundaryChecking; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js +var require_ENTimeUnitWithinFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN_WITH_PREFIX = new RegExp(`(?:within|in|for)\\s*(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + var PATTERN_WITHOUT_PREFIX = new RegExp(`(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + var ENTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return context.option.forwardDate ? PATTERN_WITHOUT_PREFIX : PATTERN_WITH_PREFIX; + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + }; + exports.default = ENTimeUnitWithinFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js +var require_ENMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants(); + var constants_2 = require_constants(); + var constants_3 = require_constants(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:on\\s{0,3})?(${constants_3.ORDINAL_NUMBER_PATTERN})(?:\\s{0,3}(?:to|\\-|\\\u2013|until|through|till)?\\s{0,3}(${constants_3.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s{0,3}(?:of)?\\s{0,3})(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s{0,3})(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var ENMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = ENMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js +var require_ENMonthNameMiddleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants(); + var constants_2 = require_constants(); + var constants_3 = require_constants(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:-|/|\\s*,?\\s*)(${constants_2.ORDINAL_NUMBER_PATTERN})(?!\\s*(?:am|pm))\\s*(?:(?:to|\\-)\\s*(${constants_2.ORDINAL_NUMBER_PATTERN})\\s*)?(?:(?:-|/|\\s*,?\\s*)(${constants_3.YEAR_PATTERN}))?(?=\\W|$)(?!\\:\\d)`, "i"); + var MONTH_NAME_GROUP = 1; + var DATE_GROUP = 2; + var DATE_TO_GROUP = 3; + var YEAR_GROUP = 4; + var ENMonthNameMiddleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + return null; + } + const components = context.createParsingComponents({ + day, + month + }); + if (match[YEAR_GROUP]) { + const year = constants_3.parseYear(match[YEAR_GROUP]); + components.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + components.imply("year", year); + } + if (!match[DATE_TO_GROUP]) { + return components; + } + const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + const result = context.createParsingResult(match.index, match[0]); + result.start = components; + result.end = components.clone(); + result.end.assign("day", endDate); + return result; + } + }; + exports.default = ENMonthNameMiddleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameParser.js +var require_ENMonthNameParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var years_1 = require_years(); + var pattern_1 = require_pattern(); + var constants_2 = require_constants(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`((?:in)\\s*)?(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${constants_2.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`, "i"); + var PREFIX_GROUP = 1; + var MONTH_NAME_GROUP = 2; + var YEAR_GROUP = 3; + var ENMonthNameParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const monthName = match[MONTH_NAME_GROUP].toLowerCase(); + if (match[0].length <= 3 && !constants_1.FULL_MONTH_NAME_DICTIONARY[monthName]) { + return null; + } + const result = context.createParsingResult(match.index + (match[PREFIX_GROUP] || "").length, match.index + match[0].length); + result.start.imply("day", 1); + const month = constants_1.MONTH_DICTIONARY[monthName]; + result.start.assign("month", month); + if (match[YEAR_GROUP]) { + const year = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, 1, month); + result.start.imply("year", year); + } + return result; + } + }; + exports.default = ENMonthNameParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENCasualYearMonthDayParser.js +var require_ENCasualYearMonthDayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENCasualYearMonthDayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s](?:(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]([0-9]{1,2})(?=\\W|$)`, "i"); + var YEAR_NUMBER_GROUP = 1; + var MONTH_NAME_GROUP = 2; + var MONTH_NUMBER_GROUP = 3; + var DATE_NUMBER_GROUP = 4; + var ENCasualYearMonthDayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const month = match[MONTH_NUMBER_GROUP] ? parseInt(match[MONTH_NUMBER_GROUP]) : constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + if (month < 1 || month > 12) { + return null; + } + const year = parseInt(match[YEAR_NUMBER_GROUP]); + const day = parseInt(match[DATE_NUMBER_GROUP]); + return { + day, + month, + year + }; + } + }; + exports.default = ENCasualYearMonthDayParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENSlashMonthFormatParser.js +var require_ENSlashMonthFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENSlashMonthFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})", "i"); + var MONTH_GROUP = 1; + var YEAR_GROUP = 2; + var ENSlashMonthFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const year = parseInt(match[YEAR_GROUP]); + const month = parseInt(match[MONTH_GROUP]); + return context.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year); + } + }; + exports.default = ENSlashMonthFormatParser; + } +}); + +// node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js +var require_AbstractTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.AbstractTimeExpressionParser = void 0; + var index_1 = require_dist(); + function primaryTimePattern(leftBoundary, primaryPrefix, primarySuffix, flags) { + return new RegExp(`${leftBoundary}${primaryPrefix}(\\d{1,4})(?:(?:\\.|:|\uFF1A)(\\d{1,2})(?:(?::|\uFF1A)(\\d{2})(?:\\.(\\d{1,6}))?)?)?(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?${primarySuffix}`, flags); + } + function followingTimePatten(followingPhase, followingSuffix) { + return new RegExp(`^(${followingPhase})(\\d{1,4})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:\\.(\\d{1,6}))?)?)?(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?${followingSuffix}`, "i"); + } + var HOUR_GROUP = 2; + var MINUTE_GROUP = 3; + var SECOND_GROUP = 4; + var MILLI_SECOND_GROUP = 5; + var AM_PM_HOUR_GROUP = 6; + var AbstractTimeExpressionParser = class { + constructor(strictMode = false) { + this.cachedPrimaryPrefix = null; + this.cachedPrimarySuffix = null; + this.cachedPrimaryTimePattern = null; + this.cachedFollowingPhase = null; + this.cachedFollowingSuffix = null; + this.cachedFollowingTimePatten = null; + this.strictMode = strictMode; + } + patternFlags() { + return "i"; + } + primaryPatternLeftBoundary() { + return `(^|\\s|T|\\b)`; + } + primarySuffix() { + return `(?=\\W|$)`; + } + followingSuffix() { + return `(?=\\W|$)`; + } + pattern(context) { + return this.getPrimaryTimePatternThroughCache(); + } + extract(context, match) { + const startComponents = this.extractPrimaryTimeComponents(context, match); + if (!startComponents) { + match.index += match[0].length; + return null; + } + const index = match.index + match[1].length; + const text2 = match[0].substring(match[1].length); + const result = context.createParsingResult(index, text2, startComponents); + match.index += match[0].length; + const remainingText = context.text.substring(match.index); + const followingPattern = this.getFollowingTimePatternThroughCache(); + const followingMatch = followingPattern.exec(remainingText); + if (text2.match(/^\d{3,4}/) && followingMatch && followingMatch[0].match(/^\s*([+-])\s*\d{2,4}$/)) { + return null; + } + if (!followingMatch || followingMatch[0].match(/^\s*([+-])\s*\d{3,4}$/)) { + return this.checkAndReturnWithoutFollowingPattern(result); + } + result.end = this.extractFollowingTimeComponents(context, followingMatch, result); + if (result.end) { + result.text += followingMatch[0]; + } + return this.checkAndReturnWithFollowingPattern(result); + } + extractPrimaryTimeComponents(context, match, strict = false) { + const components = context.createParsingComponents(); + let minute = 0; + let meridiem = null; + let hour = parseInt(match[HOUR_GROUP]); + if (hour > 100) { + if (this.strictMode || match[MINUTE_GROUP] != null) { + return null; + } + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (hour > 24) { + return null; + } + if (match[MINUTE_GROUP] != null) { + if (match[MINUTE_GROUP].length == 1 && !match[AM_PM_HOUR_GROUP]) { + return null; + } + minute = parseInt(match[MINUTE_GROUP]); + } + if (minute >= 60) { + return null; + } + if (hour > 12) { + meridiem = index_1.Meridiem.PM; + } + if (match[AM_PM_HOUR_GROUP] != null) { + if (hour > 12) + return null; + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = index_1.Meridiem.AM; + if (hour == 12) { + hour = 0; + } + } + if (ampm == "p") { + meridiem = index_1.Meridiem.PM; + if (hour != 12) { + hour += 12; + } + } + } + components.assign("hour", hour); + components.assign("minute", minute); + if (meridiem !== null) { + components.assign("meridiem", meridiem); + } else { + if (hour < 12) { + components.imply("meridiem", index_1.Meridiem.AM); + } else { + components.imply("meridiem", index_1.Meridiem.PM); + } + } + if (match[MILLI_SECOND_GROUP] != null) { + const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3)); + if (millisecond >= 1e3) + return null; + components.assign("millisecond", millisecond); + } + if (match[SECOND_GROUP] != null) { + const second = parseInt(match[SECOND_GROUP]); + if (second >= 60) + return null; + components.assign("second", second); + } + return components; + } + extractFollowingTimeComponents(context, match, result) { + const components = context.createParsingComponents(); + if (match[MILLI_SECOND_GROUP] != null) { + const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3)); + if (millisecond >= 1e3) + return null; + components.assign("millisecond", millisecond); + } + if (match[SECOND_GROUP] != null) { + const second = parseInt(match[SECOND_GROUP]); + if (second >= 60) + return null; + components.assign("second", second); + } + let hour = parseInt(match[HOUR_GROUP]); + let minute = 0; + let meridiem = -1; + if (match[MINUTE_GROUP] != null) { + minute = parseInt(match[MINUTE_GROUP]); + } else if (hour > 100) { + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (minute >= 60 || hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = index_1.Meridiem.PM; + } + if (match[AM_PM_HOUR_GROUP] != null) { + if (hour > 12) { + return null; + } + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = index_1.Meridiem.AM; + if (hour == 12) { + hour = 0; + if (!components.isCertain("day")) { + components.imply("day", components.get("day") + 1); + } + } + } + if (ampm == "p") { + meridiem = index_1.Meridiem.PM; + if (hour != 12) + hour += 12; + } + if (!result.start.isCertain("meridiem")) { + if (meridiem == index_1.Meridiem.AM) { + result.start.imply("meridiem", index_1.Meridiem.AM); + if (result.start.get("hour") == 12) { + result.start.assign("hour", 0); + } + } else { + result.start.imply("meridiem", index_1.Meridiem.PM); + if (result.start.get("hour") != 12) { + result.start.assign("hour", result.start.get("hour") + 12); + } + } + } + } + components.assign("hour", hour); + components.assign("minute", minute); + if (meridiem >= 0) { + components.assign("meridiem", meridiem); + } else { + const startAtPM = result.start.isCertain("meridiem") && result.start.get("hour") > 12; + if (startAtPM) { + if (result.start.get("hour") - 12 > hour) { + components.imply("meridiem", index_1.Meridiem.AM); + } else if (hour <= 12) { + components.assign("hour", hour + 12); + components.assign("meridiem", index_1.Meridiem.PM); + } + } else if (hour > 12) { + components.imply("meridiem", index_1.Meridiem.PM); + } else if (hour <= 12) { + components.imply("meridiem", index_1.Meridiem.AM); + } + } + if (components.date().getTime() < result.start.date().getTime()) { + components.imply("day", components.get("day") + 1); + } + return components; + } + checkAndReturnWithoutFollowingPattern(result) { + if (result.text.match(/^\d$/)) { + return null; + } + if (result.text.match(/^\d\d\d+$/)) { + return null; + } + if (result.text.match(/\d[apAP]$/)) { + return null; + } + const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)$/); + if (endingWithNumbers) { + const endingNumbers = endingWithNumbers[1]; + if (this.strictMode) { + return null; + } + if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) { + return null; + } + const endingNumberVal = parseInt(endingNumbers); + if (endingNumberVal > 24) { + return null; + } + } + return result; + } + checkAndReturnWithFollowingPattern(result) { + if (result.text.match(/^\d+-\d+$/)) { + return null; + } + const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)\s*-\s*(\d[\d.]+)$/); + if (endingWithNumbers) { + if (this.strictMode) { + return null; + } + const startingNumbers = endingWithNumbers[1]; + const endingNumbers = endingWithNumbers[2]; + if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) { + return null; + } + const endingNumberVal = parseInt(endingNumbers); + const startingNumberVal = parseInt(startingNumbers); + if (endingNumberVal > 24 || startingNumberVal > 24) { + return null; + } + } + return result; + } + getPrimaryTimePatternThroughCache() { + const primaryPrefix = this.primaryPrefix(); + const primarySuffix = this.primarySuffix(); + if (this.cachedPrimaryPrefix === primaryPrefix && this.cachedPrimarySuffix === primarySuffix) { + return this.cachedPrimaryTimePattern; + } + this.cachedPrimaryTimePattern = primaryTimePattern(this.primaryPatternLeftBoundary(), primaryPrefix, primarySuffix, this.patternFlags()); + this.cachedPrimaryPrefix = primaryPrefix; + this.cachedPrimarySuffix = primarySuffix; + return this.cachedPrimaryTimePattern; + } + getFollowingTimePatternThroughCache() { + const followingPhase = this.followingPhase(); + const followingSuffix = this.followingSuffix(); + if (this.cachedFollowingPhase === followingPhase && this.cachedFollowingSuffix === followingSuffix) { + return this.cachedFollowingTimePatten; + } + this.cachedFollowingTimePatten = followingTimePatten(followingPhase, followingSuffix); + this.cachedFollowingPhase = followingPhase; + this.cachedFollowingSuffix = followingSuffix; + return this.cachedFollowingTimePatten; + } + }; + exports.AbstractTimeExpressionParser = AbstractTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeExpressionParser.js +var require_ENTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var ENTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + constructor(strictMode) { + super(strictMode); + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|to|\\?)\\s*"; + } + primaryPrefix() { + return "(?:(?:at|from)\\s*)??"; + } + primarySuffix() { + return "(?:\\s*(?:o\\W*clock|at\\s*night|in\\s*the\\s*(?:morning|afternoon)))?(?!/)(?=\\W|$)"; + } + extractPrimaryTimeComponents(context, match) { + const components = super.extractPrimaryTimeComponents(context, match); + if (components) { + if (match[0].endsWith("night")) { + const hour = components.get("hour"); + if (hour >= 6 && hour < 12) { + components.assign("hour", components.get("hour") + 12); + components.assign("meridiem", index_1.Meridiem.PM); + } else if (hour < 6) { + components.assign("meridiem", index_1.Meridiem.AM); + } + } + if (match[0].endsWith("afternoon")) { + components.assign("meridiem", index_1.Meridiem.PM); + const hour = components.get("hour"); + if (hour >= 0 && hour <= 6) { + components.assign("hour", components.get("hour") + 12); + } + } + if (match[0].endsWith("morning")) { + components.assign("meridiem", index_1.Meridiem.AM); + const hour = components.get("hour"); + if (hour < 12) { + components.assign("hour", components.get("hour")); + } + } + } + return components; + } + }; + exports.default = ENTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/utils/timeunits.js +var require_timeunits = __commonJS({ + "node_modules/chrono-node/dist/utils/timeunits.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.addImpliedTimeUnits = exports.reverseTimeUnits = void 0; + function reverseTimeUnits(timeUnits) { + const reversed = {}; + for (const key in timeUnits) { + reversed[key] = -timeUnits[key]; + } + return reversed; + } + exports.reverseTimeUnits = reverseTimeUnits; + function addImpliedTimeUnits(components, timeUnits) { + const output = components.clone(); + let date = components.dayjs(); + for (const key in timeUnits) { + date = date.add(timeUnits[key], key); + } + if ("day" in timeUnits || "d" in timeUnits || "week" in timeUnits || "month" in timeUnits || "year" in timeUnits) { + output.imply("day", date.date()); + output.imply("month", date.month() + 1); + output.imply("year", date.year()); + } + if ("second" in timeUnits || "minute" in timeUnits || "hour" in timeUnits) { + output.imply("second", date.second()); + output.imply("minute", date.minute()); + output.imply("hour", date.hour()); + } + return output; + } + exports.addImpliedTimeUnits = addImpliedTimeUnits; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js +var require_ENTimeUnitAgoFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp(`(${constants_1.TIME_UNITS_PATTERN})\\s{0,5}(?:ago|before|earlier)(?=(?:\\W|$))`, "i"); + var STRICT_PATTERN = new RegExp(`(${constants_1.TIME_UNITS_PATTERN})\\s{0,5}ago(?=(?:\\W|$))`, "i"); + var ENTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + innerPattern() { + return this.strictMode ? STRICT_PATTERN : PATTERN; + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); + return results_1.ParsingComponents.createRelativeFromReference(context.reference, outputTimeUnits); + } + }; + exports.default = ENTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js +var require_ENTimeUnitLaterFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(${constants_1.TIME_UNITS_PATTERN})\\s{0,5}(?:later|after|from now|henceforth|forward|out)(?=(?:\\W|$))`, "i"); + var STRICT_PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(later|from now)(?=(?:\\W|$))", "i"); + var GROUP_NUM_TIMEUNITS = 1; + var ENTimeUnitLaterFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + innerPattern() { + return this.strictMode ? STRICT_PATTERN : PATTERN; + } + innerExtract(context, match) { + const fragments = constants_1.parseTimeUnits(match[GROUP_NUM_TIMEUNITS]); + return results_1.ParsingComponents.createRelativeFromReference(context.reference, fragments); + } + }; + exports.default = ENTimeUnitLaterFormatParser; + } +}); + +// node_modules/chrono-node/dist/common/abstractRefiners.js +var require_abstractRefiners = __commonJS({ + "node_modules/chrono-node/dist/common/abstractRefiners.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.MergingRefiner = exports.Filter = void 0; + var Filter2 = class { + refine(context, results) { + return results.filter((r) => this.isValid(context, r)); + } + }; + exports.Filter = Filter2; + var MergingRefiner = class { + refine(context, results) { + if (results.length < 2) { + return results; + } + const mergedResults = []; + let curResult = results[0]; + let nextResult = null; + for (let i = 1; i < results.length; i++) { + nextResult = results[i]; + const textBetween = context.text.substring(curResult.index + curResult.text.length, nextResult.index); + if (!this.shouldMergeResults(textBetween, curResult, nextResult, context)) { + mergedResults.push(curResult); + curResult = nextResult; + } else { + const left = curResult; + const right = nextResult; + const mergedResult = this.mergeResults(textBetween, left, right, context); + context.debug(() => { + console.log(`${this.constructor.name} merged ${left} and ${right} into ${mergedResult}`); + }); + curResult = mergedResult; + } + } + if (curResult != null) { + mergedResults.push(curResult); + } + return mergedResults; + } + }; + exports.MergingRefiner = MergingRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js +var require_AbstractMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var AbstractMergeDateRangeRefiner = class extends abstractRefiners_1.MergingRefiner { + shouldMergeResults(textBetween, currentResult, nextResult) { + return !currentResult.end && !nextResult.end && textBetween.match(this.patternBetween()) != null; + } + mergeResults(textBetween, fromResult, toResult) { + if (!fromResult.start.isOnlyWeekdayComponent() && !toResult.start.isOnlyWeekdayComponent()) { + toResult.start.getCertainComponents().forEach((key) => { + if (!fromResult.start.isCertain(key)) { + fromResult.start.assign(key, toResult.start.get(key)); + } + }); + fromResult.start.getCertainComponents().forEach((key) => { + if (!toResult.start.isCertain(key)) { + toResult.start.assign(key, fromResult.start.get(key)); + } + }); + } + if (fromResult.start.date().getTime() > toResult.start.date().getTime()) { + let fromMoment = fromResult.start.dayjs(); + let toMoment = toResult.start.dayjs(); + if (fromResult.start.isOnlyWeekdayComponent() && fromMoment.add(-7, "days").isBefore(toMoment)) { + fromMoment = fromMoment.add(-7, "days"); + fromResult.start.imply("day", fromMoment.date()); + fromResult.start.imply("month", fromMoment.month() + 1); + fromResult.start.imply("year", fromMoment.year()); + } else if (toResult.start.isOnlyWeekdayComponent() && toMoment.add(7, "days").isAfter(fromMoment)) { + toMoment = toMoment.add(7, "days"); + toResult.start.imply("day", toMoment.date()); + toResult.start.imply("month", toMoment.month() + 1); + toResult.start.imply("year", toMoment.year()); + } else { + [toResult, fromResult] = [fromResult, toResult]; + } + } + const result = fromResult.clone(); + result.start = fromResult.start; + result.end = toResult.start; + result.index = Math.min(fromResult.index, toResult.index); + if (fromResult.index < toResult.index) { + result.text = fromResult.text + textBetween + toResult.text; + } else { + result.text = toResult.text + textBetween + fromResult.text; + } + return result; + } + }; + exports.default = AbstractMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateRangeRefiner.js +var require_ENMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var ENMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(to|-)\s*$/i; + } + }; + exports.default = ENMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/calculation/mergingCalculation.js +var require_mergingCalculation = __commonJS({ + "node_modules/chrono-node/dist/calculation/mergingCalculation.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.mergeDateTimeComponent = exports.mergeDateTimeResult = void 0; + var index_1 = require_dist(); + function mergeDateTimeResult(dateResult, timeResult) { + const result = dateResult.clone(); + const beginDate = dateResult.start; + const beginTime = timeResult.start; + result.start = mergeDateTimeComponent(beginDate, beginTime); + if (dateResult.end != null || timeResult.end != null) { + const endDate = dateResult.end == null ? dateResult.start : dateResult.end; + const endTime = timeResult.end == null ? timeResult.start : timeResult.end; + const endDateTime = mergeDateTimeComponent(endDate, endTime); + if (dateResult.end == null && endDateTime.date().getTime() < result.start.date().getTime()) { + if (endDateTime.isCertain("day")) { + endDateTime.assign("day", endDateTime.get("day") + 1); + } else { + endDateTime.imply("day", endDateTime.get("day") + 1); + } + } + result.end = endDateTime; + } + return result; + } + exports.mergeDateTimeResult = mergeDateTimeResult; + function mergeDateTimeComponent(dateComponent, timeComponent) { + const dateTimeComponent = dateComponent.clone(); + if (timeComponent.isCertain("hour")) { + dateTimeComponent.assign("hour", timeComponent.get("hour")); + dateTimeComponent.assign("minute", timeComponent.get("minute")); + if (timeComponent.isCertain("second")) { + dateTimeComponent.assign("second", timeComponent.get("second")); + if (timeComponent.isCertain("millisecond")) { + dateTimeComponent.assign("millisecond", timeComponent.get("millisecond")); + } else { + dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); + } + } else { + dateTimeComponent.imply("second", timeComponent.get("second")); + dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); + } + } else { + dateTimeComponent.imply("hour", timeComponent.get("hour")); + dateTimeComponent.imply("minute", timeComponent.get("minute")); + dateTimeComponent.imply("second", timeComponent.get("second")); + dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); + } + if (timeComponent.isCertain("timezoneOffset")) { + dateTimeComponent.assign("timezoneOffset", timeComponent.get("timezoneOffset")); + } + if (timeComponent.isCertain("meridiem")) { + dateTimeComponent.assign("meridiem", timeComponent.get("meridiem")); + } else if (timeComponent.get("meridiem") != null && dateTimeComponent.get("meridiem") == null) { + dateTimeComponent.imply("meridiem", timeComponent.get("meridiem")); + } + if (dateTimeComponent.get("meridiem") == index_1.Meridiem.PM && dateTimeComponent.get("hour") < 12) { + if (timeComponent.isCertain("hour")) { + dateTimeComponent.assign("hour", dateTimeComponent.get("hour") + 12); + } else { + dateTimeComponent.imply("hour", dateTimeComponent.get("hour") + 12); + } + } + return dateTimeComponent; + } + exports.mergeDateTimeComponent = mergeDateTimeComponent; + } +}); + +// node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js +var require_AbstractMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var mergingCalculation_1 = require_mergingCalculation(); + var ENMergeDateTimeRefiner = class extends abstractRefiners_1.MergingRefiner { + shouldMergeResults(textBetween, currentResult, nextResult) { + return (currentResult.start.isOnlyDate() && nextResult.start.isOnlyTime() || nextResult.start.isOnlyDate() && currentResult.start.isOnlyTime()) && textBetween.match(this.patternBetween()) != null; + } + mergeResults(textBetween, currentResult, nextResult) { + const result = currentResult.start.isOnlyDate() ? mergingCalculation_1.mergeDateTimeResult(currentResult, nextResult) : mergingCalculation_1.mergeDateTimeResult(nextResult, currentResult); + result.index = currentResult.index; + result.text = currentResult.text + textBetween + nextResult.text; + return result; + } + }; + exports.default = ENMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateTimeRefiner.js +var require_ENMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var ENMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(T|at|after|before|on|of|,|-)?\\s*$"); + } + }; + exports.default = ENMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/ExtractTimezoneAbbrRefiner.js +var require_ExtractTimezoneAbbrRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/ExtractTimezoneAbbrRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var TIMEZONE_NAME_PATTERN = new RegExp("^\\s*,?\\s*\\(?([A-Z]{2,4})\\)?(?=\\W|$)", "i"); + var DEFAULT_TIMEZONE_ABBR_MAP = { + ACDT: 630, + ACST: 570, + ADT: -180, + AEDT: 660, + AEST: 600, + AFT: 270, + AKDT: -480, + AKST: -540, + ALMT: 360, + AMST: -180, + AMT: -240, + ANAST: 720, + ANAT: 720, + AQTT: 300, + ART: -180, + AST: -240, + AWDT: 540, + AWST: 480, + AZOST: 0, + AZOT: -60, + AZST: 300, + AZT: 240, + BNT: 480, + BOT: -240, + BRST: -120, + BRT: -180, + BST: 60, + BTT: 360, + CAST: 480, + CAT: 120, + CCT: 390, + CDT: -300, + CEST: 120, + CET: 60, + CHADT: 825, + CHAST: 765, + CKT: -600, + CLST: -180, + CLT: -240, + COT: -300, + CST: -360, + CVT: -60, + CXT: 420, + ChST: 600, + DAVT: 420, + EASST: -300, + EAST: -360, + EAT: 180, + ECT: -300, + EDT: -240, + EEST: 180, + EET: 120, + EGST: 0, + EGT: -60, + EST: -300, + ET: -300, + FJST: 780, + FJT: 720, + FKST: -180, + FKT: -240, + FNT: -120, + GALT: -360, + GAMT: -540, + GET: 240, + GFT: -180, + GILT: 720, + GMT: 0, + GST: 240, + GYT: -240, + HAA: -180, + HAC: -300, + HADT: -540, + HAE: -240, + HAP: -420, + HAR: -360, + HAST: -600, + HAT: -90, + HAY: -480, + HKT: 480, + HLV: -210, + HNA: -240, + HNC: -360, + HNE: -300, + HNP: -480, + HNR: -420, + HNT: -150, + HNY: -540, + HOVT: 420, + ICT: 420, + IDT: 180, + IOT: 360, + IRDT: 270, + IRKST: 540, + IRKT: 540, + IRST: 210, + IST: 330, + JST: 540, + KGT: 360, + KRAST: 480, + KRAT: 480, + KST: 540, + KUYT: 240, + LHDT: 660, + LHST: 630, + LINT: 840, + MAGST: 720, + MAGT: 720, + MART: -510, + MAWT: 300, + MDT: -360, + MESZ: 120, + MEZ: 60, + MHT: 720, + MMT: 390, + MSD: 240, + MSK: 240, + MST: -420, + MUT: 240, + MVT: 300, + MYT: 480, + NCT: 660, + NDT: -90, + NFT: 690, + NOVST: 420, + NOVT: 360, + NPT: 345, + NST: -150, + NUT: -660, + NZDT: 780, + NZST: 720, + OMSST: 420, + OMST: 420, + PDT: -420, + PET: -300, + PETST: 720, + PETT: 720, + PGT: 600, + PHOT: 780, + PHT: 480, + PKT: 300, + PMDT: -120, + PMST: -180, + PONT: 660, + PST: -480, + PT: -480, + PWT: 540, + PYST: -180, + PYT: -240, + RET: 240, + SAMT: 240, + SAST: 120, + SBT: 660, + SCT: 240, + SGT: 480, + SRT: -180, + SST: -660, + TAHT: -600, + TFT: 300, + TJT: 300, + TKT: 780, + TLT: 540, + TMT: 300, + TVT: 720, + ULAT: 480, + UTC: 0, + UYST: -120, + UYT: -180, + UZT: 300, + VET: -210, + VLAST: 660, + VLAT: 660, + VUT: 660, + WAST: 120, + WAT: 60, + WEST: 60, + WESZ: 60, + WET: 0, + WEZ: 0, + WFT: 720, + WGST: -120, + WGT: -180, + WIB: 420, + WIT: 540, + WITA: 480, + WST: 780, + WT: 0, + YAKST: 600, + YAKT: 600, + YAPT: 600, + YEKST: 360, + YEKT: 360 + }; + var ExtractTimezoneAbbrRefiner = class { + constructor(timezoneOverrides) { + this.timezone = Object.assign(Object.assign({}, DEFAULT_TIMEZONE_ABBR_MAP), timezoneOverrides); + } + refine(context, results) { + var _a; + const timezoneOverrides = (_a = context.option.timezones) !== null && _a !== void 0 ? _a : {}; + results.forEach((result) => { + var _a2, _b; + const suffix = context.text.substring(result.index + result.text.length); + const match = TIMEZONE_NAME_PATTERN.exec(suffix); + if (!match) { + return; + } + const timezoneAbbr = match[1].toUpperCase(); + const extractedTimezoneOffset = (_b = (_a2 = timezoneOverrides[timezoneAbbr]) !== null && _a2 !== void 0 ? _a2 : this.timezone[timezoneAbbr]) !== null && _b !== void 0 ? _b : null; + if (extractedTimezoneOffset === null) { + return; + } + context.debug(() => { + console.log(`Extracting timezone: '${timezoneAbbr}' into: ${extractedTimezoneOffset} for: ${result.start}`); + }); + const currentTimezoneOffset = result.start.get("timezoneOffset"); + if (currentTimezoneOffset !== null && extractedTimezoneOffset != currentTimezoneOffset) { + if (result.start.isCertain("timezoneOffset")) { + return; + } + if (timezoneAbbr != match[1]) { + return; + } + } + if (result.start.isOnlyDate()) { + if (timezoneAbbr != match[1]) { + return; + } + } + result.text += match[0]; + if (!result.start.isCertain("timezoneOffset")) { + result.start.assign("timezoneOffset", extractedTimezoneOffset); + } + if (result.end != null && !result.end.isCertain("timezoneOffset")) { + result.end.assign("timezoneOffset", extractedTimezoneOffset); + } + }); + return results; + } + }; + exports.default = ExtractTimezoneAbbrRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/ExtractTimezoneOffsetRefiner.js +var require_ExtractTimezoneOffsetRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/ExtractTimezoneOffsetRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var TIMEZONE_OFFSET_PATTERN = new RegExp("^\\s*(?:\\(?(?:GMT|UTC)\\s?)?([+-])(\\d{1,2})(?::?(\\d{2}))?\\)?", "i"); + var TIMEZONE_OFFSET_SIGN_GROUP = 1; + var TIMEZONE_OFFSET_HOUR_OFFSET_GROUP = 2; + var TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP = 3; + var ExtractTimezoneOffsetRefiner = class { + refine(context, results) { + results.forEach(function(result) { + if (result.start.isCertain("timezoneOffset")) { + return; + } + const suffix = context.text.substring(result.index + result.text.length); + const match = TIMEZONE_OFFSET_PATTERN.exec(suffix); + if (!match) { + return; + } + context.debug(() => { + console.log(`Extracting timezone: '${match[0]}' into : ${result}`); + }); + const hourOffset = parseInt(match[TIMEZONE_OFFSET_HOUR_OFFSET_GROUP]); + const minuteOffset = parseInt(match[TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP] || "0"); + let timezoneOffset = hourOffset * 60 + minuteOffset; + if (timezoneOffset > 14 * 60) { + return; + } + if (match[TIMEZONE_OFFSET_SIGN_GROUP] === "-") { + timezoneOffset = -timezoneOffset; + } + if (result.end != null) { + result.end.assign("timezoneOffset", timezoneOffset); + } + result.start.assign("timezoneOffset", timezoneOffset); + result.text += match[0]; + }); + return results; + } + }; + exports.default = ExtractTimezoneOffsetRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/OverlapRemovalRefiner.js +var require_OverlapRemovalRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/OverlapRemovalRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var OverlapRemovalRefiner = class { + refine(context, results) { + if (results.length < 2) { + return results; + } + const filteredResults = []; + let prevResult = results[0]; + for (let i = 1; i < results.length; i++) { + const result = results[i]; + if (result.index < prevResult.index + prevResult.text.length) { + if (result.text.length > prevResult.text.length) { + prevResult = result; + } + } else { + filteredResults.push(prevResult); + prevResult = result; + } + } + if (prevResult != null) { + filteredResults.push(prevResult); + } + return filteredResults; + } + }; + exports.default = OverlapRemovalRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/ForwardDateRefiner.js +var require_ForwardDateRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/ForwardDateRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var ForwardDateRefiner = class { + refine(context, results) { + if (!context.option.forwardDate) { + return results; + } + results.forEach(function(result) { + let refMoment = dayjs_1.default(context.refDate); + if (result.start.isOnlyDayMonthComponent() && refMoment.isAfter(result.start.dayjs())) { + for (let i = 0; i < 3 && refMoment.isAfter(result.start.dayjs()); i++) { + result.start.imply("year", result.start.get("year") + 1); + context.debug(() => { + console.log(`Forward yearly adjusted for ${result} (${result.start})`); + }); + if (result.end && !result.end.isCertain("year")) { + result.end.imply("year", result.end.get("year") + 1); + context.debug(() => { + console.log(`Forward yearly adjusted for ${result} (${result.end})`); + }); + } + } + } + if (result.start.isOnlyWeekdayComponent() && refMoment.isAfter(result.start.dayjs())) { + if (refMoment.day() >= result.start.get("weekday")) { + refMoment = refMoment.day(result.start.get("weekday") + 7); + } else { + refMoment = refMoment.day(result.start.get("weekday")); + } + result.start.imply("day", refMoment.date()); + result.start.imply("month", refMoment.month() + 1); + result.start.imply("year", refMoment.year()); + context.debug(() => { + console.log(`Forward weekly adjusted for ${result} (${result.start})`); + }); + if (result.end && result.end.isOnlyWeekdayComponent()) { + if (refMoment.day() > result.end.get("weekday")) { + refMoment = refMoment.day(result.end.get("weekday") + 7); + } else { + refMoment = refMoment.day(result.end.get("weekday")); + } + result.end.imply("day", refMoment.date()); + result.end.imply("month", refMoment.month() + 1); + result.end.imply("year", refMoment.year()); + context.debug(() => { + console.log(`Forward weekly adjusted for ${result} (${result.end})`); + }); + } + } + }); + return results; + } + }; + exports.default = ForwardDateRefiner; + } +}); + +// node_modules/chrono-node/dist/common/refiners/UnlikelyFormatFilter.js +var require_UnlikelyFormatFilter = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/UnlikelyFormatFilter.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var UnlikelyFormatFilter = class extends abstractRefiners_1.Filter { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + isValid(context, result) { + if (result.text.replace(" ", "").match(/^\d*(\.\d*)?$/)) { + context.debug(() => { + console.log(`Removing unlikely result '${result.text}'`); + }); + return false; + } + if (!result.start.isValidDate()) { + context.debug(() => { + console.log(`Removing invalid result: ${result} (${result.start})`); + }); + return false; + } + if (result.end && !result.end.isValidDate()) { + context.debug(() => { + console.log(`Removing invalid result: ${result} (${result.end})`); + }); + return false; + } + if (this.strictMode) { + return this.isStrictModeValid(context, result); + } + return true; + } + isStrictModeValid(context, result) { + if (result.start.isOnlyWeekdayComponent()) { + context.debug(() => { + console.log(`(Strict) Removing weekday only component: ${result} (${result.end})`); + }); + return false; + } + if (result.start.isOnlyTime() && (!result.start.isCertain("hour") || !result.start.isCertain("minute"))) { + context.debug(() => { + console.log(`(Strict) Removing uncertain time component: ${result} (${result.end})`); + }); + return false; + } + return true; + } + }; + exports.default = UnlikelyFormatFilter; + } +}); + +// node_modules/chrono-node/dist/common/parsers/ISOFormatParser.js +var require_ISOFormatParser = __commonJS({ + "node_modules/chrono-node/dist/common/parsers/ISOFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp("([0-9]{4})\\-([0-9]{1,2})\\-([0-9]{1,2})(?:T([0-9]{1,2}):([0-9]{1,2})(?::([0-9]{1,2})(?:\\.(\\d{1,4}))?)?(?:Z|([+-]\\d{2}):?(\\d{2})?)?)?(?=\\W|$)", "i"); + var YEAR_NUMBER_GROUP = 1; + var MONTH_NUMBER_GROUP = 2; + var DATE_NUMBER_GROUP = 3; + var HOUR_NUMBER_GROUP = 4; + var MINUTE_NUMBER_GROUP = 5; + var SECOND_NUMBER_GROUP = 6; + var MILLISECOND_NUMBER_GROUP = 7; + var TZD_HOUR_OFFSET_GROUP = 8; + var TZD_MINUTE_OFFSET_GROUP = 9; + var ISOFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const components = {}; + components["year"] = parseInt(match[YEAR_NUMBER_GROUP]); + components["month"] = parseInt(match[MONTH_NUMBER_GROUP]); + components["day"] = parseInt(match[DATE_NUMBER_GROUP]); + if (match[HOUR_NUMBER_GROUP] != null) { + components["hour"] = parseInt(match[HOUR_NUMBER_GROUP]); + components["minute"] = parseInt(match[MINUTE_NUMBER_GROUP]); + if (match[SECOND_NUMBER_GROUP] != null) { + components["second"] = parseInt(match[SECOND_NUMBER_GROUP]); + } + if (match[MILLISECOND_NUMBER_GROUP] != null) { + components["millisecond"] = parseInt(match[MILLISECOND_NUMBER_GROUP]); + } + if (match[TZD_HOUR_OFFSET_GROUP] == null) { + components["timezoneOffset"] = 0; + } else { + const hourOffset = parseInt(match[TZD_HOUR_OFFSET_GROUP]); + let minuteOffset = 0; + if (match[TZD_MINUTE_OFFSET_GROUP] != null) { + minuteOffset = parseInt(match[TZD_MINUTE_OFFSET_GROUP]); + } + let offset = hourOffset * 60; + if (offset < 0) { + offset -= minuteOffset; + } else { + offset += minuteOffset; + } + components["timezoneOffset"] = offset; + } + } + return components; + } + }; + exports.default = ISOFormatParser; + } +}); + +// node_modules/chrono-node/dist/common/refiners/MergeWeekdayComponentRefiner.js +var require_MergeWeekdayComponentRefiner = __commonJS({ + "node_modules/chrono-node/dist/common/refiners/MergeWeekdayComponentRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var MergeWeekdayComponentRefiner = class extends abstractRefiners_1.MergingRefiner { + mergeResults(textBetween, currentResult, nextResult) { + const newResult = nextResult.clone(); + newResult.index = currentResult.index; + newResult.text = currentResult.text + textBetween + newResult.text; + newResult.start.assign("weekday", currentResult.start.get("weekday")); + if (newResult.end) { + newResult.end.assign("weekday", currentResult.start.get("weekday")); + } + return newResult; + } + shouldMergeResults(textBetween, currentResult, nextResult) { + const weekdayThenNormalDate = currentResult.start.isOnlyWeekdayComponent() && !currentResult.start.isCertain("hour") && nextResult.start.isCertain("day"); + return weekdayThenNormalDate && textBetween.match(/^,?\s*$/) != null; + } + }; + exports.default = MergeWeekdayComponentRefiner; + } +}); + +// node_modules/chrono-node/dist/configurations.js +var require_configurations = __commonJS({ + "node_modules/chrono-node/dist/configurations.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.includeCommonConfiguration = void 0; + var ExtractTimezoneAbbrRefiner_1 = __importDefault2(require_ExtractTimezoneAbbrRefiner()); + var ExtractTimezoneOffsetRefiner_1 = __importDefault2(require_ExtractTimezoneOffsetRefiner()); + var OverlapRemovalRefiner_1 = __importDefault2(require_OverlapRemovalRefiner()); + var ForwardDateRefiner_1 = __importDefault2(require_ForwardDateRefiner()); + var UnlikelyFormatFilter_1 = __importDefault2(require_UnlikelyFormatFilter()); + var ISOFormatParser_1 = __importDefault2(require_ISOFormatParser()); + var MergeWeekdayComponentRefiner_1 = __importDefault2(require_MergeWeekdayComponentRefiner()); + function includeCommonConfiguration(configuration, strictMode = false) { + configuration.parsers.unshift(new ISOFormatParser_1.default()); + configuration.refiners.unshift(new MergeWeekdayComponentRefiner_1.default()); + configuration.refiners.unshift(new ExtractTimezoneAbbrRefiner_1.default()); + configuration.refiners.unshift(new ExtractTimezoneOffsetRefiner_1.default()); + configuration.refiners.unshift(new OverlapRemovalRefiner_1.default()); + configuration.refiners.push(new OverlapRemovalRefiner_1.default()); + configuration.refiners.push(new ForwardDateRefiner_1.default()); + configuration.refiners.push(new UnlikelyFormatFilter_1.default(strictMode)); + return configuration; + } + exports.includeCommonConfiguration = includeCommonConfiguration; + } +}); + +// node_modules/chrono-node/dist/common/casualReferences.js +var require_casualReferences = __commonJS({ + "node_modules/chrono-node/dist/common/casualReferences.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.noon = exports.morning = exports.midnight = exports.yesterdayEvening = exports.evening = exports.lastNight = exports.tonight = exports.theDayAfter = exports.tomorrow = exports.theDayBefore = exports.yesterday = exports.today = exports.now = void 0; + var results_1 = require_results(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var dayjs_2 = require_dayjs(); + var index_1 = require_dist(); + function now(reference) { + const targetDate = dayjs_1.default(reference.instant); + const component = new results_1.ParsingComponents(reference, {}); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.assignSimilarTime(component, targetDate); + if (reference.timezoneOffset !== null) { + component.assign("timezoneOffset", targetDate.utcOffset()); + } + return component; + } + exports.now = now; + function today(reference) { + const targetDate = dayjs_1.default(reference.instant); + const component = new results_1.ParsingComponents(reference, {}); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.implySimilarTime(component, targetDate); + return component; + } + exports.today = today; + function yesterday(reference) { + return theDayBefore(reference, 1); + } + exports.yesterday = yesterday; + function theDayBefore(reference, numDay) { + return theDayAfter(reference, -numDay); + } + exports.theDayBefore = theDayBefore; + function tomorrow(reference) { + return theDayAfter(reference, 1); + } + exports.tomorrow = tomorrow; + function theDayAfter(reference, nDays) { + let targetDate = dayjs_1.default(reference.instant); + const component = new results_1.ParsingComponents(reference, {}); + targetDate = targetDate.add(nDays, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.implySimilarTime(component, targetDate); + return component; + } + exports.theDayAfter = theDayAfter; + function tonight(reference, implyHour = 22) { + const targetDate = dayjs_1.default(reference.instant); + const component = new results_1.ParsingComponents(reference, {}); + component.imply("hour", implyHour); + component.imply("meridiem", index_1.Meridiem.PM); + dayjs_2.assignSimilarDate(component, targetDate); + return component; + } + exports.tonight = tonight; + function lastNight(reference, implyHour = 0) { + let targetDate = dayjs_1.default(reference.instant); + const component = new results_1.ParsingComponents(reference, {}); + if (targetDate.hour() < 6) { + targetDate = targetDate.add(-1, "day"); + } + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", implyHour); + return component; + } + exports.lastNight = lastNight; + function evening(reference, implyHour = 20) { + const component = new results_1.ParsingComponents(reference, {}); + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", implyHour); + return component; + } + exports.evening = evening; + function yesterdayEvening(reference, implyHour = 20) { + let targetDate = dayjs_1.default(reference.instant); + const component = new results_1.ParsingComponents(reference, {}); + targetDate = targetDate.add(-1, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", implyHour); + component.imply("meridiem", index_1.Meridiem.PM); + return component; + } + exports.yesterdayEvening = yesterdayEvening; + function midnight(reference) { + const component = new results_1.ParsingComponents(reference, {}); + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + return component; + } + exports.midnight = midnight; + function morning(reference, implyHour = 6) { + const component = new results_1.ParsingComponents(reference, {}); + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", implyHour); + return component; + } + exports.morning = morning; + function noon(reference) { + const component = new results_1.ParsingComponents(reference, {}); + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + return component; + } + exports.noon = noon; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENCasualDateParser.js +var require_ENCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_2 = require_dayjs(); + var references = __importStar2(require_casualReferences()); + var PATTERN = /(now|today|tonight|tomorrow|tmr|tmrw|yesterday|last\s*night)(?=\W|$)/i; + var ENCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return PATTERN; + } + innerExtract(context, match) { + let targetDate = dayjs_1.default(context.refDate); + const lowerText = match[0].toLowerCase(); + const component = context.createParsingComponents(); + switch (lowerText) { + case "now": + return references.now(context.reference); + case "today": + return references.today(context.reference); + case "yesterday": + return references.yesterday(context.reference); + case "tomorrow": + case "tmr": + case "tmrw": + return references.tomorrow(context.reference); + case "tonight": + return references.tonight(context.reference); + default: + if (lowerText.match(/last\s*night/)) { + if (targetDate.hour() > 6) { + targetDate = targetDate.add(-1, "day"); + } + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", 0); + } + break; + } + return component; + } + }; + exports.default = ENCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENCasualTimeParser.js +var require_ENCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENCasualTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var dayjs_2 = require_dayjs(); + var PATTERN = /(?:this)?\s{0,3}(morning|afternoon|evening|night|midnight|noon)(?=\W|$)/i; + var ENCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const targetDate = dayjs_1.default(context.refDate); + const component = context.createParsingComponents(); + switch (match[1].toLowerCase()) { + case "afternoon": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 15); + break; + case "evening": + case "night": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 20); + break; + case "midnight": + dayjs_2.assignTheNextDay(component, targetDate); + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + break; + case "morning": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 6); + break; + case "noon": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + break; + } + return component; + } + }; + exports.default = ENCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/calculation/weeks.js +var require_weeks = __commonJS({ + "node_modules/chrono-node/dist/calculation/weeks.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.toDayJSClosestWeekday = exports.toDayJSWeekday = void 0; + var dayjs_1 = __importDefault2(require_dayjs_min()); + function toDayJSWeekday(refDate, offset, modifier) { + if (!modifier) { + return toDayJSClosestWeekday(refDate, offset); + } + let date = dayjs_1.default(refDate); + switch (modifier) { + case "this": + date = date.day(offset); + break; + case "next": + date = date.day(offset + 7); + break; + case "last": + date = date.day(offset - 7); + break; + } + return date; + } + exports.toDayJSWeekday = toDayJSWeekday; + function toDayJSClosestWeekday(refDate, offset) { + let date = dayjs_1.default(refDate); + const refOffset = date.day(); + if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { + date = date.day(offset - 7); + } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { + date = date.day(offset + 7); + } else { + date = date.day(offset); + } + return date; + } + exports.toDayJSClosestWeekday = toDayJSClosestWeekday; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENWeekdayParser.js +var require_ENWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weeks_1 = require_weeks(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:on\\s*?)?(?:(this|last|past|next)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(this|last|past|next)\\s*week)?(?=\\W|$)`, "i"); + var PREFIX_GROUP = 1; + var WEEKDAY_GROUP = 2; + var POSTFIX_GROUP = 3; + var ENWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + const prefix = match[PREFIX_GROUP]; + const postfix = match[POSTFIX_GROUP]; + let modifierWord = prefix || postfix; + modifierWord = modifierWord || ""; + modifierWord = modifierWord.toLowerCase(); + let modifier = null; + if (modifierWord == "last" || modifierWord == "past") { + modifier = "last"; + } else if (modifierWord == "next") { + modifier = "next"; + } else if (modifierWord == "this") { + modifier = "this"; + } + const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); + return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); + } + }; + exports.default = ENWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENRelativeDateFormatParser.js +var require_ENRelativeDateFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENRelativeDateFormatParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var pattern_1 = require_pattern(); + var PATTERN = new RegExp(`(this|last|past|next|after\\s*this)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)(?=\\W|$)`, "i"); + var MODIFIER_WORD_GROUP = 1; + var RELATIVE_WORD_GROUP = 2; + var ENRelativeDateFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const modifier = match[MODIFIER_WORD_GROUP].toLowerCase(); + const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase(); + const timeunit = constants_1.TIME_UNIT_DICTIONARY[unitWord]; + if (modifier == "next" || modifier.startsWith("after")) { + const timeUnits = {}; + timeUnits[timeunit] = 1; + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + if (modifier == "last" || modifier == "past") { + const timeUnits = {}; + timeUnits[timeunit] = -1; + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + const components = context.createParsingComponents(); + let date = dayjs_1.default(context.reference.instant); + if (unitWord.match(/week/i)) { + date = date.add(-date.get("d"), "d"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.imply("year", date.year()); + } else if (unitWord.match(/month/i)) { + date = date.add(-date.date() + 1, "d"); + components.imply("day", date.date()); + components.assign("year", date.year()); + components.assign("month", date.month() + 1); + } else if (unitWord.match(/year/i)) { + date = date.add(-date.date() + 1, "d"); + date = date.add(-date.month(), "month"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.assign("year", date.year()); + } + return components; + } + }; + exports.default = ENRelativeDateFormatParser; + } +}); + +// node_modules/chrono-node/dist/chrono.js +var require_chrono = __commonJS({ + "node_modules/chrono-node/dist/chrono.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ParsingContext = exports.Chrono = void 0; + var results_1 = require_results(); + var en_1 = require_en(); + var Chrono = class { + constructor(configuration) { + configuration = configuration || en_1.createCasualConfiguration(); + this.parsers = [...configuration.parsers]; + this.refiners = [...configuration.refiners]; + } + clone() { + return new Chrono({ + parsers: [...this.parsers], + refiners: [...this.refiners] + }); + } + parseDate(text2, referenceDate, option) { + const results = this.parse(text2, referenceDate, option); + return results.length > 0 ? results[0].start.date() : null; + } + parse(text2, referenceDate, option) { + const context = new ParsingContext(text2, referenceDate, option); + let results = []; + this.parsers.forEach((parser) => { + const parsedResults = Chrono.executeParser(context, parser); + results = results.concat(parsedResults); + }); + results.sort((a, b) => { + return a.index - b.index; + }); + this.refiners.forEach(function(refiner) { + results = refiner.refine(context, results); + }); + return results; + } + static executeParser(context, parser) { + const results = []; + const pattern = parser.pattern(context); + const originalText = context.text; + let remainingText = context.text; + let match = pattern.exec(remainingText); + while (match) { + const index = match.index + originalText.length - remainingText.length; + match.index = index; + const result = parser.extract(context, match); + if (!result) { + remainingText = originalText.substring(match.index + 1); + match = pattern.exec(remainingText); + continue; + } + let parsedResult = null; + if (result instanceof results_1.ParsingResult) { + parsedResult = result; + } else if (result instanceof results_1.ParsingComponents) { + parsedResult = context.createParsingResult(match.index, match[0]); + parsedResult.start = result; + } else { + parsedResult = context.createParsingResult(match.index, match[0], result); + } + context.debug(() => console.log(`${parser.constructor.name} extracted result ${parsedResult}`)); + results.push(parsedResult); + remainingText = originalText.substring(index + parsedResult.text.length); + match = pattern.exec(remainingText); + } + return results; + } + }; + exports.Chrono = Chrono; + var ParsingContext = class { + constructor(text2, refDate, option) { + this.text = text2; + this.reference = new results_1.ReferenceWithTimezone(refDate); + this.option = option !== null && option !== void 0 ? option : {}; + this.refDate = this.reference.instant; + } + createParsingComponents(components) { + if (components instanceof results_1.ParsingComponents) { + return components; + } + return new results_1.ParsingComponents(this.reference, components); + } + createParsingResult(index, textOrEndIndex, startComponents, endComponents) { + const text2 = typeof textOrEndIndex === "string" ? textOrEndIndex : this.text.substring(index, textOrEndIndex); + const start = startComponents ? this.createParsingComponents(startComponents) : null; + const end = endComponents ? this.createParsingComponents(endComponents) : null; + return new results_1.ParsingResult(this.reference, index, text2, start, end); + } + debug(block) { + if (this.option.debug) { + if (this.option.debug instanceof Function) { + this.option.debug(block); + } else { + const handler = this.option.debug; + handler.debug(block); + } + } + } + }; + exports.ParsingContext = ParsingContext; + } +}); + +// node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js +var require_SlashDateFormatParser = __commonJS({ + "node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var PATTERN = new RegExp("([^\\d]|^)([0-3]{0,1}[0-9]{1})[\\/\\.\\-]([0-3]{0,1}[0-9]{1})(?:[\\/\\.\\-]([0-9]{4}|[0-9]{2}))?(\\W|$)", "i"); + var OPENING_GROUP = 1; + var ENDING_GROUP = 5; + var FIRST_NUMBERS_GROUP = 2; + var SECOND_NUMBERS_GROUP = 3; + var YEAR_GROUP = 4; + var SlashDateFormatParser = class { + constructor(littleEndian) { + this.groupNumberMonth = littleEndian ? SECOND_NUMBERS_GROUP : FIRST_NUMBERS_GROUP; + this.groupNumberDay = littleEndian ? FIRST_NUMBERS_GROUP : SECOND_NUMBERS_GROUP; + } + pattern() { + return PATTERN; + } + extract(context, match) { + if (match[OPENING_GROUP] == "/" || match[ENDING_GROUP] == "/") { + match.index += match[0].length; + return; + } + const index = match.index + match[OPENING_GROUP].length; + const text2 = match[0].substr(match[OPENING_GROUP].length, match[0].length - match[OPENING_GROUP].length - match[ENDING_GROUP].length); + if (text2.match(/^\d\.\d$/) || text2.match(/^\d\.\d{1,2}\.\d{1,2}\s*$/)) { + return; + } + if (!match[YEAR_GROUP] && match[0].indexOf("/") < 0) { + return; + } + const result = context.createParsingResult(index, text2); + let month = parseInt(match[this.groupNumberMonth]); + let day = parseInt(match[this.groupNumberDay]); + if (month < 1 || month > 12) { + if (month > 12) { + if (day >= 1 && day <= 12 && month <= 31) { + [day, month] = [month, day]; + } else { + return null; + } + } + } + if (day < 1 || day > 31) { + return null; + } + result.start.assign("day", day); + result.start.assign("month", month); + if (match[YEAR_GROUP]) { + const rawYearNumber = parseInt(match[YEAR_GROUP]); + const year = years_1.findMostLikelyADYear(rawYearNumber); + result.start.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + result.start.imply("year", year); + } + return result; + } + }; + exports.default = SlashDateFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js +var require_ENTimeUnitCasualRelativeFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp(`(this|last|past|next|after|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + var ENTimeUnitCasualRelativeFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const prefix = match[1].toLowerCase(); + let timeUnits = constants_1.parseTimeUnits(match[2]); + switch (prefix) { + case "last": + case "past": + case "-": + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + break; + } + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + }; + exports.default = ENTimeUnitCasualRelativeFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/en/refiners/ENMergeRelativeDateRefiner.js +var require_ENMergeRelativeDateRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/en/refiners/ENMergeRelativeDateRefiner.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var abstractRefiners_1 = require_abstractRefiners(); + var results_1 = require_results(); + var constants_1 = require_constants(); + var timeunits_1 = require_timeunits(); + function hasImpliedEarlierReferenceDate(result) { + return result.text.match(/\s+(before|from)$/i) != null; + } + function hasImpliedLaterReferenceDate(result) { + return result.text.match(/\s+(after|since)$/i) != null; + } + var ENMergeRelativeDateRefiner = class extends abstractRefiners_1.MergingRefiner { + patternBetween() { + return /^\s*$/i; + } + shouldMergeResults(textBetween, currentResult, nextResult) { + if (!textBetween.match(this.patternBetween())) { + return false; + } + if (!hasImpliedEarlierReferenceDate(currentResult) && !hasImpliedLaterReferenceDate(currentResult)) { + return false; + } + return !!nextResult.start.get("day") && !!nextResult.start.get("month") && !!nextResult.start.get("year"); + } + mergeResults(textBetween, currentResult, nextResult) { + let timeUnits = constants_1.parseTimeUnits(currentResult.text); + if (hasImpliedEarlierReferenceDate(currentResult)) { + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + } + const components = results_1.ParsingComponents.createRelativeFromReference(new results_1.ReferenceWithTimezone(nextResult.start.date()), timeUnits); + return new results_1.ParsingResult(nextResult.reference, currentResult.index, `${currentResult.text}${textBetween}${nextResult.text}`, components); + } + }; + exports.default = ENMergeRelativeDateRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/en/index.js +var require_en = __commonJS({ + "node_modules/chrono-node/dist/locales/en/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.GB = exports.strict = exports.casual = void 0; + var ENTimeUnitWithinFormatParser_1 = __importDefault2(require_ENTimeUnitWithinFormatParser()); + var ENMonthNameLittleEndianParser_1 = __importDefault2(require_ENMonthNameLittleEndianParser()); + var ENMonthNameMiddleEndianParser_1 = __importDefault2(require_ENMonthNameMiddleEndianParser()); + var ENMonthNameParser_1 = __importDefault2(require_ENMonthNameParser()); + var ENCasualYearMonthDayParser_1 = __importDefault2(require_ENCasualYearMonthDayParser()); + var ENSlashMonthFormatParser_1 = __importDefault2(require_ENSlashMonthFormatParser()); + var ENTimeExpressionParser_1 = __importDefault2(require_ENTimeExpressionParser()); + var ENTimeUnitAgoFormatParser_1 = __importDefault2(require_ENTimeUnitAgoFormatParser()); + var ENTimeUnitLaterFormatParser_1 = __importDefault2(require_ENTimeUnitLaterFormatParser()); + var ENMergeDateRangeRefiner_1 = __importDefault2(require_ENMergeDateRangeRefiner()); + var ENMergeDateTimeRefiner_1 = __importDefault2(require_ENMergeDateTimeRefiner()); + var configurations_1 = require_configurations(); + var ENCasualDateParser_1 = __importDefault2(require_ENCasualDateParser()); + var ENCasualTimeParser_1 = __importDefault2(require_ENCasualTimeParser()); + var ENWeekdayParser_1 = __importDefault2(require_ENWeekdayParser()); + var ENRelativeDateFormatParser_1 = __importDefault2(require_ENRelativeDateFormatParser()); + var chrono_1 = require_chrono(); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var ENTimeUnitCasualRelativeFormatParser_1 = __importDefault2(require_ENTimeUnitCasualRelativeFormatParser()); + var ENMergeRelativeDateRefiner_1 = __importDefault2(require_ENMergeRelativeDateRefiner()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration(false)); + exports.strict = new chrono_1.Chrono(createConfiguration(true, false)); + exports.GB = new chrono_1.Chrono(createConfiguration(false, true)); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate3(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate3; + function createCasualConfiguration(littleEndian = false) { + const option = createConfiguration(false, littleEndian); + option.parsers.unshift(new ENCasualDateParser_1.default()); + option.parsers.unshift(new ENCasualTimeParser_1.default()); + option.parsers.unshift(new ENMonthNameParser_1.default()); + option.parsers.unshift(new ENRelativeDateFormatParser_1.default()); + option.parsers.unshift(new ENTimeUnitCasualRelativeFormatParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = false) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(littleEndian), + new ENTimeUnitWithinFormatParser_1.default(), + new ENMonthNameLittleEndianParser_1.default(), + new ENMonthNameMiddleEndianParser_1.default(), + new ENWeekdayParser_1.default(), + new ENCasualYearMonthDayParser_1.default(), + new ENSlashMonthFormatParser_1.default(), + new ENTimeExpressionParser_1.default(strictMode), + new ENTimeUnitAgoFormatParser_1.default(strictMode), + new ENTimeUnitLaterFormatParser_1.default(strictMode) + ], + refiners: [new ENMergeRelativeDateRefiner_1.default(), new ENMergeDateTimeRefiner_1.default(), new ENMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DETimeExpressionParser.js +var require_DETimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DETimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var DETimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + primaryPrefix() { + return "(?:(?:um|von)\\s*)?"; + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|bis)\\s*"; + } + extractPrimaryTimeComponents(context, match) { + if (match[0].match(/^\s*\d{4}\s*$/)) { + return null; + } + return super.extractPrimaryTimeComponents(context, match); + } + }; + exports.default = DETimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/constants.js +var require_constants2 = __commonJS({ + "node_modules/chrono-node/dist/locales/de/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + var pattern_1 = require_pattern(); + var years_1 = require_years(); + exports.WEEKDAY_DICTIONARY = { + "sonntag": 0, + "so": 0, + "montag": 1, + "mo": 1, + "dienstag": 2, + "di": 2, + "mittwoch": 3, + "mi": 3, + "donnerstag": 4, + "do": 4, + "freitag": 5, + "fr": 5, + "samstag": 6, + "sa": 6 + }; + exports.MONTH_DICTIONARY = { + "januar": 1, + "j\xE4nner": 1, + "janner": 1, + "jan": 1, + "jan.": 1, + "februar": 2, + "feber": 2, + "feb": 2, + "feb.": 2, + "m\xE4rz": 3, + "maerz": 3, + "m\xE4r": 3, + "m\xE4r.": 3, + "mrz": 3, + "mrz.": 3, + "april": 4, + "apr": 4, + "apr.": 4, + "mai": 5, + "juni": 6, + "jun": 6, + "jun.": 6, + "juli": 7, + "jul": 7, + "jul.": 7, + "august": 8, + "aug": 8, + "aug.": 8, + "september": 9, + "sep": 9, + "sep.": 9, + "sept": 9, + "sept.": 9, + "oktober": 10, + "okt": 10, + "okt.": 10, + "november": 11, + "nov": 11, + "nov.": 11, + "dezember": 12, + "dez": 12, + "dez.": 12 + }; + exports.INTEGER_WORD_DICTIONARY = { + "eins": 1, + "eine": 1, + "einem": 1, + "einen": 1, + "einer": 1, + "zwei": 2, + "drei": 3, + "vier": 4, + "f\xFCnf": 5, + "fuenf": 5, + "sechs": 6, + "sieben": 7, + "acht": 8, + "neun": 9, + "zehn": 10, + "elf": 11, + "zw\xF6lf": 12, + "zwoelf": 12 + }; + exports.TIME_UNIT_DICTIONARY = { + sek: "second", + sekunde: "second", + sekunden: "second", + min: "minute", + minute: "minute", + minuten: "minute", + h: "hour", + std: "hour", + stunde: "hour", + stunden: "hour", + tag: "d", + tage: "d", + tagen: "d", + woche: "week", + wochen: "week", + monat: "month", + monate: "month", + monaten: "month", + monats: "month", + quartal: "quarter", + quartals: "quarter", + quartale: "quarter", + quartalen: "quarter", + a: "year", + j: "year", + jr: "year", + jahr: "year", + jahre: "year", + jahren: "year", + jahres: "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?\\b(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } else if (num === "a" || num === "an") { + return 1; + } else if (num.match(/few/)) { + return 3; + } else if (num.match(/half/)) { + return 0.5; + } else if (num.match(/couple/)) { + return 2; + } else if (num.match(/several/)) { + return 7; + } + return parseFloat(num); + } + exports.parseNumberPattern = parseNumberPattern; + exports.YEAR_PATTERN = `(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*(?:C(?:hr)?|(?:u\\.?|d\\.?(?:\\s*g\\.?)?)?\\s*Z)\\.?|\\s*(?:u\\.?|d\\.?(?:\\s*g\\.)?)\\s*Z\\.?)?)`; + function parseYear(match) { + if (/v/i.test(match)) { + return -parseInt(match.replace(/[^0-9]+/gi, "")); + } + if (/n/i.test(match)) { + return parseInt(match.replace(/[^0-9]+/gi, "")); + } + if (/z/i.test(match)) { + return parseInt(match.replace(/[^0-9]+/gi, "")); + } + const rawYearNumber = parseInt(match); + return years_1.findMostLikelyADYear(rawYearNumber); + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DEWeekdayParser.js +var require_DEWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DEWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants2(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weeks_1 = require_weeks(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:a[mn]\\s*?)?(?:(diese[mn]|letzte[mn]|n(?:\xE4|ae)chste[mn])\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(diese|letzte|n(?:\xE4|ae)chste)\\s*woche)?(?=\\W|$)`, "i"); + var PREFIX_GROUP = 1; + var SUFFIX_GROUP = 3; + var WEEKDAY_GROUP = 2; + var DEWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + const prefix = match[PREFIX_GROUP]; + const postfix = match[SUFFIX_GROUP]; + let modifierWord = prefix || postfix; + modifierWord = modifierWord || ""; + modifierWord = modifierWord.toLowerCase(); + let modifier = null; + if (modifierWord.match(/letzte/)) { + modifier = "last"; + } else if (modifierWord.match(/chste/)) { + modifier = "next"; + } else if (modifierWord.match(/diese/)) { + modifier = "this"; + } + const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); + return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); + } + }; + exports.default = DEWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DESpecificTimeExpressionParser.js +var require_DESpecificTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DESpecificTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var FIRST_REG_PATTERN = new RegExp("(^|\\s|T)(?:(?:um|von)\\s*)?(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s)?)?(?:\\s*Uhr)?(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?(?=\\W|$)", "i"); + var SECOND_REG_PATTERN = new RegExp("^\\s*(\\-|\\\u2013|\\~|\\\u301C|bis(?:\\s+um)?|\\?)\\s*(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s)?)?(?:\\s*Uhr)?(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?(?=\\W|$)", "i"); + var HOUR_GROUP = 2; + var MINUTE_GROUP = 3; + var SECOND_GROUP = 4; + var AM_PM_HOUR_GROUP = 5; + var DESpecificTimeExpressionParser = class { + pattern(context) { + return FIRST_REG_PATTERN; + } + extract(context, match) { + const result = context.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length)); + if (result.text.match(/^\d{4}$/)) { + match.index += match[0].length; + return null; + } + result.start = DESpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match); + if (!result.start) { + match.index += match[0].length; + return null; + } + const remainingText = context.text.substring(match.index + match[0].length); + const secondMatch = SECOND_REG_PATTERN.exec(remainingText); + if (secondMatch) { + result.end = DESpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch); + if (result.end) { + result.text += secondMatch[0]; + } + } + return result; + } + static extractTimeComponent(extractingComponents, match) { + let hour = 0; + let minute = 0; + let meridiem = null; + hour = parseInt(match[HOUR_GROUP]); + if (match[MINUTE_GROUP] != null) { + minute = parseInt(match[MINUTE_GROUP]); + } + if (minute >= 60 || hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = index_1.Meridiem.PM; + } + if (match[AM_PM_HOUR_GROUP] != null) { + if (hour > 12) + return null; + const ampm = match[AM_PM_HOUR_GROUP].toLowerCase(); + if (ampm.match(/morgen|vormittag/)) { + meridiem = index_1.Meridiem.AM; + if (hour == 12) { + hour = 0; + } + } + if (ampm.match(/nachmittag|abend/)) { + meridiem = index_1.Meridiem.PM; + if (hour != 12) { + hour += 12; + } + } + if (ampm.match(/nacht/)) { + if (hour == 12) { + meridiem = index_1.Meridiem.AM; + hour = 0; + } else if (hour < 6) { + meridiem = index_1.Meridiem.AM; + } else { + meridiem = index_1.Meridiem.PM; + hour += 12; + } + } + } + extractingComponents.assign("hour", hour); + extractingComponents.assign("minute", minute); + if (meridiem !== null) { + extractingComponents.assign("meridiem", meridiem); + } else { + if (hour < 12) { + extractingComponents.imply("meridiem", index_1.Meridiem.AM); + } else { + extractingComponents.imply("meridiem", index_1.Meridiem.PM); + } + } + if (match[SECOND_GROUP] != null) { + const second = parseInt(match[SECOND_GROUP]); + if (second >= 60) + return null; + extractingComponents.assign("second", second); + } + return extractingComponents; + } + }; + exports.default = DESpecificTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateRangeRefiner.js +var require_DEMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var DEMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(bis(?:\s*(?:am|zum))?|-)\s*$/i; + } + }; + exports.default = DEMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateTimeRefiner.js +var require_DEMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var DEMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(T|um|am|,|-)?\\s*$"); + } + }; + exports.default = DEMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DECasualTimeParser.js +var require_DECasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DECasualTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_2 = require_dayjs(); + var timeunits_1 = require_timeunits(); + var DECasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return /(diesen)?\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht)(?=\W|$)/i; + } + innerExtract(context, match) { + const targetDate = dayjs_1.default(context.refDate); + const timeKeywordPattern = match[2].toLowerCase(); + const component = context.createParsingComponents(); + dayjs_2.implySimilarTime(component, targetDate); + return DECasualTimeParser.extractTimeComponents(component, timeKeywordPattern); + } + static extractTimeComponents(component, timeKeywordPattern) { + switch (timeKeywordPattern) { + case "morgen": + component.imply("hour", 6); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "vormittag": + component.imply("hour", 9); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "mittag": + case "mittags": + component.imply("hour", 12); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "nachmittag": + component.imply("hour", 15); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "abend": + component.imply("hour", 18); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "nacht": + component.imply("hour", 22); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "mitternacht": + if (component.get("hour") > 1) { + component = timeunits_1.addImpliedTimeUnits(component, { "day": 1 }); + } + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + } + return component; + } + }; + exports.default = DECasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DECasualDateParser.js +var require_DECasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DECasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_2 = require_dayjs(); + var DECasualTimeParser_1 = __importDefault2(require_DECasualTimeParser()); + var references = __importStar2(require_casualReferences()); + var PATTERN = new RegExp(`(jetzt|heute|morgen|\xFCbermorgen|uebermorgen|gestern|vorgestern|letzte\\s*nacht)(?:\\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var TIME_GROUP = 2; + var DECasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return PATTERN; + } + innerExtract(context, match) { + let targetDate = dayjs_1.default(context.refDate); + const dateKeyword = (match[DATE_GROUP] || "").toLowerCase(); + const timeKeyword = (match[TIME_GROUP] || "").toLowerCase(); + let component = context.createParsingComponents(); + switch (dateKeyword) { + case "jetzt": + component = references.now(context.reference); + break; + case "heute": + component = references.today(context.reference); + break; + case "morgen": + dayjs_2.assignTheNextDay(component, targetDate); + break; + case "\xFCbermorgen": + case "uebermorgen": + targetDate = targetDate.add(1, "day"); + dayjs_2.assignTheNextDay(component, targetDate); + break; + case "gestern": + targetDate = targetDate.add(-1, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.implySimilarTime(component, targetDate); + break; + case "vorgestern": + targetDate = targetDate.add(-2, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + dayjs_2.implySimilarTime(component, targetDate); + break; + default: + if (dateKeyword.match(/letzte\s*nacht/)) { + if (targetDate.hour() > 6) { + targetDate = targetDate.add(-1, "day"); + } + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", 0); + } + break; + } + if (timeKeyword) { + component = DECasualTimeParser_1.default.extractTimeComponents(component, timeKeyword); + } + return component; + } + }; + exports.default = DECasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js +var require_DEMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants2(); + var constants_2 = require_constants2(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:am\\s*?)?(?:den\\s*?)?([0-9]{1,2})\\.(?:\\s*(?:bis(?:\\s*(?:am|zum))?|\\-|\\\u2013|\\s)\\s*([0-9]{1,2})\\.?)?\\s*(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var DEMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = parseInt(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = parseInt(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = DEMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.js +var require_DETimeUnitRelativeFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants2(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var pattern_1 = require_pattern(); + var DETimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor() { + super(); + } + innerPattern() { + return new RegExp(`(?:\\s*((?:n\xE4chste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?|vor|in)\\s*)?(${constants_1.NUMBER_PATTERN})?(?:\\s*(n\xE4chste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?)?\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})`, "i"); + } + innerExtract(context, match) { + const num = match[2] ? constants_1.parseNumberPattern(match[2]) : 1; + const unit = constants_1.TIME_UNIT_DICTIONARY[match[4].toLowerCase()]; + let timeUnits = {}; + timeUnits[unit] = num; + let modifier = match[1] || match[3] || ""; + modifier = modifier.toLowerCase(); + if (!modifier) { + return; + } + if (/vor/.test(modifier) || /letzte/.test(modifier) || /vergangen/.test(modifier)) { + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + } + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + }; + exports.default = DETimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/de/index.js +var require_de = __commonJS({ + "node_modules/chrono-node/dist/locales/de/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var configurations_1 = require_configurations(); + var chrono_1 = require_chrono(); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var ISOFormatParser_1 = __importDefault2(require_ISOFormatParser()); + var DETimeExpressionParser_1 = __importDefault2(require_DETimeExpressionParser()); + var DEWeekdayParser_1 = __importDefault2(require_DEWeekdayParser()); + var DESpecificTimeExpressionParser_1 = __importDefault2(require_DESpecificTimeExpressionParser()); + var DEMergeDateRangeRefiner_1 = __importDefault2(require_DEMergeDateRangeRefiner()); + var DEMergeDateTimeRefiner_1 = __importDefault2(require_DEMergeDateTimeRefiner()); + var DECasualDateParser_1 = __importDefault2(require_DECasualDateParser()); + var DECasualTimeParser_1 = __importDefault2(require_DECasualTimeParser()); + var DEMonthNameLittleEndianParser_1 = __importDefault2(require_DEMonthNameLittleEndianParser()); + var DETimeUnitRelativeFormatParser_1 = __importDefault2(require_DETimeUnitRelativeFormatParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate3(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate3; + function createCasualConfiguration(littleEndian = true) { + const option = createConfiguration(false, littleEndian); + option.parsers.unshift(new DECasualTimeParser_1.default()); + option.parsers.unshift(new DECasualDateParser_1.default()); + option.parsers.unshift(new DETimeUnitRelativeFormatParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new ISOFormatParser_1.default(), + new SlashDateFormatParser_1.default(littleEndian), + new DETimeExpressionParser_1.default(), + new DESpecificTimeExpressionParser_1.default(), + new DEMonthNameLittleEndianParser_1.default(), + new DEWeekdayParser_1.default() + ], + refiners: [new DEMergeDateRangeRefiner_1.default(), new DEMergeDateTimeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRCasualDateParser.js +var require_FRCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_2 = require_dayjs(); + var references = __importStar2(require_casualReferences()); + var FRCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return /(maintenant|aujourd'hui|demain|hier|cette\s*nuit|la\s*veille)(?=\W|$)/i; + } + innerExtract(context, match) { + let targetDate = dayjs_1.default(context.refDate); + const lowerText = match[0].toLowerCase(); + const component = context.createParsingComponents(); + switch (lowerText) { + case "maintenant": + return references.now(context.reference); + case "aujourd'hui": + return references.today(context.reference); + case "hier": + return references.yesterday(context.reference); + case "demain": + return references.tomorrow(context.reference); + default: + if (lowerText.match(/cette\s*nuit/)) { + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", 22); + component.imply("meridiem", index_1.Meridiem.PM); + } else if (lowerText.match(/la\s*veille/)) { + targetDate = targetDate.add(-1, "day"); + dayjs_2.assignSimilarDate(component, targetDate); + component.imply("hour", 0); + } + } + return component; + } + }; + exports.default = FRCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRCasualTimeParser.js +var require_FRCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRCasualTimeParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var FRCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return /(cet?)?\s*(matin|soir|après-midi|aprem|a midi|à minuit)(?=\W|$)/i; + } + innerExtract(context, match) { + const suffixLower = match[2].toLowerCase(); + const component = context.createParsingComponents(); + switch (suffixLower) { + case "apr\xE8s-midi": + case "aprem": + component.imply("hour", 14); + component.imply("minute", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "soir": + component.imply("hour", 18); + component.imply("minute", 0); + component.imply("meridiem", index_1.Meridiem.PM); + break; + case "matin": + component.imply("hour", 8); + component.imply("minute", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "a midi": + component.imply("hour", 12); + component.imply("minute", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + case "\xE0 minuit": + component.imply("hour", 0); + component.imply("meridiem", index_1.Meridiem.AM); + break; + } + return component; + } + }; + exports.default = FRCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeExpressionParser.js +var require_FRTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var FRTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + primaryPrefix() { + return "(?:(?:[\xE0a])\\s*)?"; + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|[\xE0a]|\\?)\\s*"; + } + extractPrimaryTimeComponents(context, match) { + if (match[0].match(/^\s*\d{4}\s*$/)) { + return null; + } + return super.extractPrimaryTimeComponents(context, match); + } + }; + exports.default = FRTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js +var require_FRMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var FRMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(T|\xE0|a|vers|de|,|-)?\\s*$"); + } + }; + exports.default = FRMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js +var require_FRMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var FRMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(à|a|-)\s*$/i; + } + }; + exports.default = FRMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/fr/constants.js +var require_constants3 = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + var pattern_1 = require_pattern(); + exports.WEEKDAY_DICTIONARY = { + "dimanche": 0, + "dim": 0, + "lundi": 1, + "lun": 1, + "mardi": 2, + "mar": 2, + "mercredi": 3, + "mer": 3, + "jeudi": 4, + "jeu": 4, + "vendredi": 5, + "ven": 5, + "samedi": 6, + "sam": 6 + }; + exports.MONTH_DICTIONARY = { + "janvier": 1, + "jan": 1, + "jan.": 1, + "f\xE9vrier": 2, + "f\xE9v": 2, + "f\xE9v.": 2, + "fevrier": 2, + "fev": 2, + "fev.": 2, + "mars": 3, + "mar": 3, + "mar.": 3, + "avril": 4, + "avr": 4, + "avr.": 4, + "mai": 5, + "juin": 6, + "jun": 6, + "juillet": 7, + "juil": 7, + "jul": 7, + "jul.": 7, + "ao\xFBt": 8, + "aout": 8, + "septembre": 9, + "sep": 9, + "sep.": 9, + "sept": 9, + "sept.": 9, + "octobre": 10, + "oct": 10, + "oct.": 10, + "novembre": 11, + "nov": 11, + "nov.": 11, + "d\xE9cembre": 12, + "decembre": 12, + "dec": 12, + "dec.": 12 + }; + exports.INTEGER_WORD_DICTIONARY = { + "un": 1, + "deux": 2, + "trois": 3, + "quatre": 4, + "cinq": 5, + "six": 6, + "sept": 7, + "huit": 8, + "neuf": 9, + "dix": 10, + "onze": 11, + "douze": 12, + "treize": 13 + }; + exports.TIME_UNIT_DICTIONARY = { + "sec": "second", + "seconde": "second", + "secondes": "second", + "min": "minute", + "mins": "minute", + "minute": "minute", + "minutes": "minute", + "h": "hour", + "hr": "hour", + "hrs": "hour", + "heure": "hour", + "heures": "hour", + "jour": "d", + "jours": "d", + "semaine": "week", + "semaines": "week", + "mois": "month", + "trimestre": "quarter", + "trimestres": "quarter", + "ans": "year", + "ann\xE9e": "year", + "ann\xE9es": "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|une?\\b|quelques?|demi-?)`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } else if (num === "une" || num === "un") { + return 1; + } else if (num.match(/quelques?/)) { + return 3; + } else if (num.match(/demi-?/)) { + return 0.5; + } + return parseFloat(num); + } + exports.parseNumberPattern = parseNumberPattern; + exports.ORDINAL_NUMBER_PATTERN = `(?:[0-9]{1,2}(?:er)?)`; + function parseOrdinalNumberPattern(match) { + let num = match.toLowerCase(); + num = num.replace(/(?:er)$/i, ""); + return parseInt(num); + } + exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; + exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:AC|AD|p\\.\\s*C(?:hr?)?\\.\\s*n\\.)|[1-2][0-9]{3}|[5-9][0-9])`; + function parseYear(match) { + if (/AC/i.test(match)) { + match = match.replace(/BC/i, ""); + return -parseInt(match); + } + if (/AD/i.test(match) || /C/i.test(match)) { + match = match.replace(/[^\d]+/i, ""); + return parseInt(match); + } + let yearNumber = parseInt(match); + if (yearNumber < 100) { + if (yearNumber > 50) { + yearNumber = yearNumber + 1900; + } else { + yearNumber = yearNumber + 2e3; + } + } + return yearNumber; + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRWeekdayParser.js +var require_FRWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants3(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weeks_1 = require_weeks(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:(?:ce)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(dernier|prochain)\\s*)?(?=\\W|\\d|$)`, "i"); + var WEEKDAY_GROUP = 1; + var POSTFIX_GROUP = 2; + var FRWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + if (offset === void 0) { + return null; + } + let suffix = match[POSTFIX_GROUP]; + suffix = suffix || ""; + suffix = suffix.toLowerCase(); + let modifier = null; + if (suffix == "dernier") { + modifier = "last"; + } else if (suffix == "prochain") { + modifier = "next"; + } + const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); + return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); + } + }; + exports.default = FRWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js +var require_FRSpecificTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var FIRST_REG_PATTERN = new RegExp("(^|\\s|T)(?:(?:[\xE0a])\\s*)?(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s|:)?)?(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?(?=\\W|$)", "i"); + var SECOND_REG_PATTERN = new RegExp("^\\s*(\\-|\\\u2013|\\~|\\\u301C|[\xE0a]|\\?)\\s*(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s|:)?)?(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?(?=\\W|$)", "i"); + var HOUR_GROUP = 2; + var MINUTE_GROUP = 3; + var SECOND_GROUP = 4; + var AM_PM_HOUR_GROUP = 5; + var FRSpecificTimeExpressionParser = class { + pattern(context) { + return FIRST_REG_PATTERN; + } + extract(context, match) { + const result = context.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length)); + if (result.text.match(/^\d{4}$/)) { + match.index += match[0].length; + return null; + } + result.start = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match); + if (!result.start) { + match.index += match[0].length; + return null; + } + const remainingText = context.text.substring(match.index + match[0].length); + const secondMatch = SECOND_REG_PATTERN.exec(remainingText); + if (secondMatch) { + result.end = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch); + if (result.end) { + result.text += secondMatch[0]; + } + } + return result; + } + static extractTimeComponent(extractingComponents, match) { + let hour = 0; + let minute = 0; + let meridiem = null; + hour = parseInt(match[HOUR_GROUP]); + if (match[MINUTE_GROUP] != null) { + minute = parseInt(match[MINUTE_GROUP]); + } + if (minute >= 60 || hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = index_1.Meridiem.PM; + } + if (match[AM_PM_HOUR_GROUP] != null) { + if (hour > 12) + return null; + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = index_1.Meridiem.AM; + if (hour == 12) { + hour = 0; + } + } + if (ampm == "p") { + meridiem = index_1.Meridiem.PM; + if (hour != 12) { + hour += 12; + } + } + } + extractingComponents.assign("hour", hour); + extractingComponents.assign("minute", minute); + if (meridiem !== null) { + extractingComponents.assign("meridiem", meridiem); + } else { + if (hour < 12) { + extractingComponents.imply("meridiem", index_1.Meridiem.AM); + } else { + extractingComponents.imply("meridiem", index_1.Meridiem.PM); + } + } + if (match[SECOND_GROUP] != null) { + const second = parseInt(match[SECOND_GROUP]); + if (second >= 60) + return null; + extractingComponents.assign("second", second); + } + return extractingComponents; + } + }; + exports.default = FRSpecificTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js +var require_FRMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants3(); + var constants_2 = require_constants3(); + var constants_3 = require_constants3(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:on\\s*?)?(${constants_3.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:au|\\-|\\\u2013|jusqu'au?|\\s)\\s*(${constants_3.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:de)?\\s*)(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var FRMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = FRMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js +var require_FRTimeUnitAgoFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants3(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var FRTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor() { + super(); + } + innerPattern() { + return new RegExp(`il y a\\s*(${constants_1.TIME_UNITS_PATTERN})(?=(?:\\W|$))`, "i"); + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); + return results_1.ParsingComponents.createRelativeFromReference(context.reference, outputTimeUnits); + } + }; + exports.default = FRTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js +var require_FRTimeUnitWithinFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants3(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var FRTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return new RegExp(`(?:dans|en|pour|pendant|de)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + }; + exports.default = FRTimeUnitWithinFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js +var require_FRTimeUnitRelativeFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants3(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var pattern_1 = require_pattern(); + var FRTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor() { + super(); + } + innerPattern() { + return new RegExp(`(?:les?|la|l'|du|des?)\\s*(${constants_1.NUMBER_PATTERN})?(?:\\s*(prochaine?s?|derni[e\xE8]re?s?|pass[\xE9e]e?s?|pr[\xE9e]c[\xE9e]dents?|suivante?s?))?\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?:\\s*(prochaine?s?|derni[e\xE8]re?s?|pass[\xE9e]e?s?|pr[\xE9e]c[\xE9e]dents?|suivante?s?))?`, "i"); + } + innerExtract(context, match) { + const num = match[1] ? constants_1.parseNumberPattern(match[1]) : 1; + const unit = constants_1.TIME_UNIT_DICTIONARY[match[3].toLowerCase()]; + let timeUnits = {}; + timeUnits[unit] = num; + let modifier = match[2] || match[4] || ""; + modifier = modifier.toLowerCase(); + if (!modifier) { + return; + } + if (/derni[eè]re?s?/.test(modifier) || /pass[ée]e?s?/.test(modifier) || /pr[ée]c[ée]dents?/.test(modifier)) { + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + } + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + }; + exports.default = FRTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/fr/index.js +var require_fr = __commonJS({ + "node_modules/chrono-node/dist/locales/fr/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var configurations_1 = require_configurations(); + var chrono_1 = require_chrono(); + var FRCasualDateParser_1 = __importDefault2(require_FRCasualDateParser()); + var FRCasualTimeParser_1 = __importDefault2(require_FRCasualTimeParser()); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var FRTimeExpressionParser_1 = __importDefault2(require_FRTimeExpressionParser()); + var FRMergeDateTimeRefiner_1 = __importDefault2(require_FRMergeDateTimeRefiner()); + var FRMergeDateRangeRefiner_1 = __importDefault2(require_FRMergeDateRangeRefiner()); + var FRWeekdayParser_1 = __importDefault2(require_FRWeekdayParser()); + var FRSpecificTimeExpressionParser_1 = __importDefault2(require_FRSpecificTimeExpressionParser()); + var FRMonthNameLittleEndianParser_1 = __importDefault2(require_FRMonthNameLittleEndianParser()); + var FRTimeUnitAgoFormatParser_1 = __importDefault2(require_FRTimeUnitAgoFormatParser()); + var FRTimeUnitWithinFormatParser_1 = __importDefault2(require_FRTimeUnitWithinFormatParser()); + var FRTimeUnitRelativeFormatParser_1 = __importDefault2(require_FRTimeUnitRelativeFormatParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate3(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate3; + function createCasualConfiguration(littleEndian = true) { + const option = createConfiguration(false, littleEndian); + option.parsers.unshift(new FRCasualDateParser_1.default()); + option.parsers.unshift(new FRCasualTimeParser_1.default()); + option.parsers.unshift(new FRTimeUnitRelativeFormatParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(littleEndian), + new FRMonthNameLittleEndianParser_1.default(), + new FRTimeExpressionParser_1.default(), + new FRSpecificTimeExpressionParser_1.default(), + new FRTimeUnitAgoFormatParser_1.default(), + new FRTimeUnitWithinFormatParser_1.default(), + new FRWeekdayParser_1.default() + ], + refiners: [new FRMergeDateTimeRefiner_1.default(), new FRMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/ja/constants.js +var require_constants4 = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.toHankaku = void 0; + function toHankaku(text2) { + return String(text2).replace(/\u2019/g, "'").replace(/\u201D/g, '"').replace(/\u3000/g, " ").replace(/\uFFE5/g, "\xA5").replace(/[\uFF01\uFF03-\uFF06\uFF08\uFF09\uFF0C-\uFF19\uFF1C-\uFF1F\uFF21-\uFF3B\uFF3D\uFF3F\uFF41-\uFF5B\uFF5D\uFF5E]/g, alphaNum); + } + exports.toHankaku = toHankaku; + function alphaNum(token) { + return String.fromCharCode(token.charCodeAt(0) - 65248); + } + } +}); + +// node_modules/chrono-node/dist/locales/ja/parsers/JPStandardParser.js +var require_JPStandardParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/parsers/JPStandardParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants4(); + var years_1 = require_years(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var PATTERN = /(?:(?:([同今本])|((昭和|平成|令和)?([0-90-9]{1,4}|元)))年\s*)?([0-90-9]{1,2})月\s*([0-90-9]{1,2})日/i; + var SPECIAL_YEAR_GROUP = 1; + var TYPICAL_YEAR_GROUP = 2; + var ERA_GROUP = 3; + var YEAR_NUMBER_GROUP = 4; + var MONTH_GROUP = 5; + var DAY_GROUP = 6; + var JPStandardParser = class { + pattern() { + return PATTERN; + } + extract(context, match) { + const month = parseInt(constants_1.toHankaku(match[MONTH_GROUP])); + const day = parseInt(constants_1.toHankaku(match[DAY_GROUP])); + const components = context.createParsingComponents({ + day, + month + }); + if (match[SPECIAL_YEAR_GROUP] && match[SPECIAL_YEAR_GROUP].match("\u540C|\u4ECA|\u672C")) { + const moment = dayjs_1.default(context.refDate); + components.assign("year", moment.year()); + } + if (match[TYPICAL_YEAR_GROUP]) { + const yearNumText = match[YEAR_NUMBER_GROUP]; + let year = yearNumText == "\u5143" ? 1 : parseInt(constants_1.toHankaku(yearNumText)); + if (match[ERA_GROUP] == "\u4EE4\u548C") { + year += 2018; + } else if (match[ERA_GROUP] == "\u5E73\u6210") { + year += 1988; + } else if (match[ERA_GROUP] == "\u662D\u548C") { + year += 1925; + } + components.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + components.imply("year", year); + } + return components; + } + }; + exports.default = JPStandardParser; + } +}); + +// node_modules/chrono-node/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js +var require_JPMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var JPMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(から|ー|-)\s*$/i; + } + }; + exports.default = JPMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/ja/parsers/JPCasualDateParser.js +var require_JPCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/parsers/JPCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var index_1 = require_dist(); + var references = __importStar2(require_casualReferences()); + var PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i; + var JPCasualDateParser = class { + pattern() { + return PATTERN; + } + extract(context, match) { + const text2 = match[0]; + const date = dayjs_1.default(context.refDate); + const components = context.createParsingComponents(); + switch (text2) { + case "\u6628\u65E5": + return references.yesterday(context.reference); + case "\u660E\u65E5": + return references.tomorrow(context.reference); + case "\u4ECA\u65E5": + case "\u5F53\u65E5": + return references.today(context.reference); + } + if (text2 == "\u4ECA\u591C" || text2 == "\u4ECA\u5915" || text2 == "\u4ECA\u6669") { + components.imply("hour", 22); + components.assign("meridiem", index_1.Meridiem.PM); + } else if (text2.match("\u4ECA\u671D")) { + components.imply("hour", 6); + components.assign("meridiem", index_1.Meridiem.AM); + } + components.assign("day", date.date()); + components.assign("month", date.month() + 1); + components.assign("year", date.year()); + return components; + } + }; + exports.default = JPCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/ja/index.js +var require_ja = __commonJS({ + "node_modules/chrono-node/dist/locales/ja/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var JPStandardParser_1 = __importDefault2(require_JPStandardParser()); + var JPMergeDateRangeRefiner_1 = __importDefault2(require_JPMergeDateRangeRefiner()); + var JPCasualDateParser_1 = __importDefault2(require_JPCasualDateParser()); + var chrono_1 = require_chrono(); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration()); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate3(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate3; + function createCasualConfiguration() { + const option = createConfiguration(); + option.parsers.unshift(new JPCasualDateParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration() { + return { + parsers: [new JPStandardParser_1.default()], + refiners: [new JPMergeDateRangeRefiner_1.default()] + }; + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/pt/constants.js +var require_constants5 = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseYear = exports.YEAR_PATTERN = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + exports.WEEKDAY_DICTIONARY = { + "domingo": 0, + "dom": 0, + "segunda": 1, + "segunda-feira": 1, + "seg": 1, + "ter\xE7a": 2, + "ter\xE7a-feira": 2, + "ter": 2, + "quarta": 3, + "quarta-feira": 3, + "qua": 3, + "quinta": 4, + "quinta-feira": 4, + "qui": 4, + "sexta": 5, + "sexta-feira": 5, + "sex": 5, + "s\xE1bado": 6, + "sabado": 6, + "sab": 6 + }; + exports.MONTH_DICTIONARY = { + "janeiro": 1, + "jan": 1, + "jan.": 1, + "fevereiro": 2, + "fev": 2, + "fev.": 2, + "mar\xE7o": 3, + "mar": 3, + "mar.": 3, + "abril": 4, + "abr": 4, + "abr.": 4, + "maio": 5, + "mai": 5, + "mai.": 5, + "junho": 6, + "jun": 6, + "jun.": 6, + "julho": 7, + "jul": 7, + "jul.": 7, + "agosto": 8, + "ago": 8, + "ago.": 8, + "setembro": 9, + "set": 9, + "set.": 9, + "outubro": 10, + "out": 10, + "out.": 10, + "novembro": 11, + "nov": 11, + "nov.": 11, + "dezembro": 12, + "dez": 12, + "dez.": 12 + }; + exports.YEAR_PATTERN = "[0-9]{1,4}(?![^\\s]\\d)(?:\\s*[a|d]\\.?\\s*c\\.?|\\s*a\\.?\\s*d\\.?)?"; + function parseYear(match) { + if (match.match(/^[0-9]{1,4}$/)) { + let yearNumber = parseInt(match); + if (yearNumber < 100) { + if (yearNumber > 50) { + yearNumber = yearNumber + 1900; + } else { + yearNumber = yearNumber + 2e3; + } + } + return yearNumber; + } + if (match.match(/a\.?\s*c\.?/i)) { + match = match.replace(/a\.?\s*c\.?/i, ""); + return -parseInt(match); + } + return parseInt(match); + } + exports.parseYear = parseYear; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTWeekdayParser.js +var require_PTWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants5(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weeks_1 = require_weeks(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:(este|esta|passado|pr[o\xF3]ximo)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(este|esta|passado|pr[\xF3o]ximo)\\s*semana)?(?=\\W|\\d|$)`, "i"); + var PREFIX_GROUP = 1; + var WEEKDAY_GROUP = 2; + var POSTFIX_GROUP = 3; + var PTWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + if (offset === void 0) { + return null; + } + const prefix = match[PREFIX_GROUP]; + const postfix = match[POSTFIX_GROUP]; + let norm = prefix || postfix || ""; + norm = norm.toLowerCase(); + let modifier = null; + if (norm == "passado") { + modifier = "this"; + } else if (norm == "pr\xF3ximo" || norm == "proximo") { + modifier = "next"; + } else if (norm == "este") { + modifier = "this"; + } + const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); + return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); + } + }; + exports.default = PTWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTTimeExpressionParser.js +var require_PTTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var PTTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + primaryPrefix() { + return "(?:(?:ao?|\xE0s?|das|da|de|do)\\s*)?"; + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|a(?:o)?|\\?)\\s*"; + } + }; + exports.default = PTTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js +var require_PTMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var PTMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(?:,|\xE0)?\\s*$"); + } + }; + exports.default = PTMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js +var require_PTMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var PTMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(?:-)\s*$/i; + } + }; + exports.default = PTMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js +var require_PTMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants5(); + var constants_2 = require_constants5(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`([0-9]{1,2})(?:\xBA|\xAA|\xB0)?(?:\\s*(?:desde|de|\\-|\\\u2013|ao?|\\s)\\s*([0-9]{1,2})(?:\xBA|\xAA|\xB0)?)?\\s*(?:de)?\\s*(?:-|/|\\s*(?:de|,)?\\s*)(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:\\s*(?:de|,)?\\s*(${constants_2.YEAR_PATTERN}))?(?=\\W|$)`, "i"); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var PTMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = parseInt(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = parseInt(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = PTMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTCasualDateParser.js +var require_PTCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var references = __importStar2(require_casualReferences()); + var PTCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return /(agora|hoje|amanha|amanhã|ontem)(?=\W|$)/i; + } + innerExtract(context, match) { + const lowerText = match[0].toLowerCase(); + const component = context.createParsingComponents(); + switch (lowerText) { + case "agora": + return references.now(context.reference); + case "hoje": + return references.today(context.reference); + case "amanha": + case "amanh\xE3": + return references.tomorrow(context.reference); + case "ontem": + return references.yesterday(context.reference); + } + return component; + } + }; + exports.default = PTCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/parsers/PTCasualTimeParser.js +var require_PTCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/parsers/PTCasualTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_1 = require_dayjs(); + var dayjs_2 = __importDefault2(require_dayjs_min()); + var PTCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return /(?:esta\s*)?(manha|manhã|tarde|meia-noite|meio-dia|noite)(?=\W|$)/i; + } + innerExtract(context, match) { + const targetDate = dayjs_2.default(context.refDate); + const component = context.createParsingComponents(); + switch (match[1].toLowerCase()) { + case "tarde": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 15); + break; + case "noite": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 22); + break; + case "manha": + case "manh\xE3": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 6); + break; + case "meia-noite": + dayjs_1.assignTheNextDay(component, targetDate); + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + break; + case "meio-dia": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + break; + } + return component; + } + }; + exports.default = PTCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/pt/index.js +var require_pt = __commonJS({ + "node_modules/chrono-node/dist/locales/pt/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var configurations_1 = require_configurations(); + var chrono_1 = require_chrono(); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var PTWeekdayParser_1 = __importDefault2(require_PTWeekdayParser()); + var PTTimeExpressionParser_1 = __importDefault2(require_PTTimeExpressionParser()); + var PTMergeDateTimeRefiner_1 = __importDefault2(require_PTMergeDateTimeRefiner()); + var PTMergeDateRangeRefiner_1 = __importDefault2(require_PTMergeDateRangeRefiner()); + var PTMonthNameLittleEndianParser_1 = __importDefault2(require_PTMonthNameLittleEndianParser()); + var PTCasualDateParser_1 = __importDefault2(require_PTCasualDateParser()); + var PTCasualTimeParser_1 = __importDefault2(require_PTCasualTimeParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate3(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate3; + function createCasualConfiguration(littleEndian = true) { + const option = createConfiguration(false, littleEndian); + option.parsers.push(new PTCasualDateParser_1.default()); + option.parsers.push(new PTCasualTimeParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(littleEndian), + new PTWeekdayParser_1.default(), + new PTTimeExpressionParser_1.default(), + new PTMonthNameLittleEndianParser_1.default() + ], + refiners: [new PTMergeDateTimeRefiner_1.default(), new PTMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js +var require_NLMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var NLMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(tot|-)\s*$/i; + } + }; + exports.default = NLMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js +var require_NLMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var NLMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp("^\\s*(om|na|voor|in de|,|-)?\\s*$"); + } + }; + exports.default = NLMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateParser.js +var require_NLCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var references = __importStar2(require_casualReferences()); + var NLCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return /(nu|vandaag|morgen|morgend|gisteren)(?=\W|$)/i; + } + innerExtract(context, match) { + const lowerText = match[0].toLowerCase(); + const component = context.createParsingComponents(); + switch (lowerText) { + case "nu": + return references.now(context.reference); + case "vandaag": + return references.today(context.reference); + case "morgen": + case "morgend": + return references.tomorrow(context.reference); + case "gisteren": + return references.yesterday(context.reference); + } + return component; + } + }; + exports.default = NLCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualTimeParser.js +var require_NLCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var dayjs_2 = require_dayjs(); + var DAY_GROUP = 1; + var MOMENT_GROUP = 2; + var NLCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return /(deze)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i; + } + innerExtract(context, match) { + const targetDate = dayjs_1.default(context.refDate); + const component = context.createParsingComponents(); + if (match[DAY_GROUP] === "deze") { + component.assign("day", context.refDate.getDate()); + component.assign("month", context.refDate.getMonth() + 1); + component.assign("year", context.refDate.getFullYear()); + } + switch (match[MOMENT_GROUP].toLowerCase()) { + case "namiddag": + case "'s namiddags": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 15); + break; + case "avond": + case "'s avonds'": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 20); + break; + case "middernacht": + dayjs_2.assignTheNextDay(component, targetDate); + component.imply("hour", 0); + component.imply("minute", 0); + component.imply("second", 0); + break; + case "ochtend": + case "'s ochtends": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 6); + break; + case "middag": + case "'s middags": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + break; + } + return component; + } + }; + exports.default = NLCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/constants.js +var require_constants6 = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; + var pattern_1 = require_pattern(); + var years_1 = require_years(); + exports.WEEKDAY_DICTIONARY = { + zondag: 0, + zon: 0, + "zon.": 0, + zo: 0, + "zo.": 0, + maandag: 1, + ma: 1, + "ma.": 1, + dinsdag: 2, + din: 2, + "din.": 2, + di: 2, + "di.": 2, + woensdag: 3, + woe: 3, + "woe.": 3, + wo: 3, + "wo.": 3, + donderdag: 4, + dond: 4, + "dond.": 4, + do: 4, + "do.": 4, + vrijdag: 5, + vrij: 5, + "vrij.": 5, + vr: 5, + "vr.": 5, + zaterdag: 6, + zat: 6, + "zat.": 6, + "za": 6, + "za.": 6 + }; + exports.MONTH_DICTIONARY = { + januari: 1, + jan: 1, + "jan.": 1, + februari: 2, + feb: 2, + "feb.": 2, + maart: 3, + mar: 3, + "mar.": 3, + april: 4, + apr: 4, + "apr.": 4, + mei: 5, + juni: 6, + jun: 6, + "jun.": 6, + juli: 7, + jul: 7, + "jul.": 7, + augustus: 8, + aug: 8, + "aug.": 8, + september: 9, + sep: 9, + "sep.": 9, + sept: 9, + "sept.": 9, + oktober: 10, + okt: 10, + "okt.": 10, + november: 11, + nov: 11, + "nov.": 11, + december: 12, + dec: 12, + "dec.": 12 + }; + exports.INTEGER_WORD_DICTIONARY = { + een: 1, + twee: 2, + drie: 3, + vier: 4, + vijf: 5, + zes: 6, + zeven: 7, + acht: 8, + negen: 9, + tien: 10, + elf: 11, + twaalf: 12 + }; + exports.ORDINAL_WORD_DICTIONARY = { + eerste: 1, + tweede: 2, + derde: 3, + vierde: 4, + vijfde: 5, + zesde: 6, + zevende: 7, + achtste: 8, + negende: 9, + tiende: 10, + elfde: 11, + twaalfde: 12, + dertiende: 13, + veertiende: 14, + vijftiende: 15, + zestiende: 16, + zeventiende: 17, + achttiende: 18, + negentiende: 19, + twintigste: 20, + "eenentwintigste": 21, + "twee\xEBntwintigste": 22, + "drieentwintigste": 23, + "vierentwintigste": 24, + "vijfentwintigste": 25, + "zesentwintigste": 26, + "zevenentwintigste": 27, + "achtentwintig": 28, + "negenentwintig": 29, + "dertigste": 30, + "eenendertigste": 31 + }; + exports.TIME_UNIT_DICTIONARY = { + sec: "second", + second: "second", + seconden: "second", + min: "minute", + mins: "minute", + minute: "minute", + minuut: "minute", + minuten: "minute", + minuutje: "minute", + h: "hour", + hr: "hour", + hrs: "hour", + uur: "hour", + u: "hour", + uren: "hour", + dag: "d", + dagen: "d", + week: "week", + weken: "week", + maand: "month", + maanden: "month", + jaar: "year", + jr: "year", + jaren: "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+[\\.,][0-9]+|halve?|half|paar)`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } else if (num === "paar") { + return 2; + } else if (num === "half" || num.match(/halve?/)) { + return 0.5; + } + return parseFloat(num.replace(",", ".")); + } + exports.parseNumberPattern = parseNumberPattern; + exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:ste|de)?)`; + function parseOrdinalNumberPattern(match) { + let num = match.toLowerCase(); + if (exports.ORDINAL_WORD_DICTIONARY[num] !== void 0) { + return exports.ORDINAL_WORD_DICTIONARY[num]; + } + num = num.replace(/(?:ste|de)$/i, ""); + return parseInt(num); + } + exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; + exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:voor Christus|na Christus)|[1-2][0-9]{3}|[5-9][0-9])`; + function parseYear(match) { + if (/voor Christus/i.test(match)) { + match = match.replace(/voor Christus/i, ""); + return -parseInt(match); + } + if (/na Christus/i.test(match)) { + match = match.replace(/na Christus/i, ""); + return parseInt(match); + } + const rawYearNumber = parseInt(match); + return years_1.findMostLikelyADYear(rawYearNumber); + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:binnen|in)\\s*)?`, SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js +var require_NLTimeUnitWithinFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var NLTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return new RegExp(`(?:binnen|in|binnen de|voor)\\s*(` + constants_1.TIME_UNITS_PATTERN + `)(?=\\W|$)`, "i"); + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + }; + exports.default = NLTimeUnitWithinFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLWeekdayParser.js +var require_NLWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weeks_1 = require_weeks(); + var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:op\\s*?)?(?:(deze|vorige|volgende)\\s*(?:week\\s*)?)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?=\\W|$)`, "i"); + var PREFIX_GROUP = 1; + var WEEKDAY_GROUP = 2; + var POSTFIX_GROUP = 3; + var NLWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + const prefix = match[PREFIX_GROUP]; + const postfix = match[POSTFIX_GROUP]; + let modifierWord = prefix || postfix; + modifierWord = modifierWord || ""; + modifierWord = modifierWord.toLowerCase(); + let modifier = null; + if (modifierWord == "vorige") { + modifier = "last"; + } else if (modifierWord == "volgende") { + modifier = "next"; + } else if (modifierWord == "deze") { + modifier = "this"; + } + const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); + return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); + } + }; + exports.default = NLWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js +var require_NLMonthNameMiddleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants6(); + var constants_2 = require_constants6(); + var constants_3 = require_constants6(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:on\\s*?)?(${constants_2.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:tot|\\-|\\\u2013|until|through|till|\\s)\\s*(${constants_2.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:of)?\\s*)(` + pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY) + `)(?:(?:-|/|,?\\s*)(${constants_3.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); + var MONTH_NAME_GROUP = 3; + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var YEAR_GROUP = 4; + var NLMonthNameMiddleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + const components = context.createParsingComponents({ + day, + month + }); + if (match[YEAR_GROUP]) { + const year = constants_3.parseYear(match[YEAR_GROUP]); + components.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + components.imply("year", year); + } + if (!match[DATE_TO_GROUP]) { + return components; + } + const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + const result = context.createParsingResult(match.index, match[0]); + result.start = components; + result.end = components.clone(); + result.end.assign("day", endDate); + return result; + } + }; + exports.default = NLMonthNameMiddleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameParser.js +var require_NLMonthNameParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var years_1 = require_years(); + var pattern_1 = require_pattern(); + var constants_2 = require_constants6(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${constants_2.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`, "i"); + var MONTH_NAME_GROUP = 1; + var YEAR_GROUP = 2; + var NLMonthNameParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const components = context.createParsingComponents(); + components.imply("day", 1); + const monthName = match[MONTH_NAME_GROUP]; + const month = constants_1.MONTH_DICTIONARY[monthName.toLowerCase()]; + components.assign("month", month); + if (match[YEAR_GROUP]) { + const year = constants_2.parseYear(match[YEAR_GROUP]); + components.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, 1, month); + components.imply("year", year); + } + return components; + } + }; + exports.default = NLMonthNameParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLSlashMonthFormatParser.js +var require_NLSlashMonthFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLSlashMonthFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})", "i"); + var MONTH_GROUP = 1; + var YEAR_GROUP = 2; + var NLSlashMonthFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const year = parseInt(match[YEAR_GROUP]); + const month = parseInt(match[MONTH_GROUP]); + return context.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year); + } + }; + exports.default = NLSlashMonthFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeExpressionParser.js +var require_NLTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var NLTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + primaryPrefix() { + return "(?:(?:om)\\s*)?"; + } + followingPhase() { + return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|om|\\?)\\s*"; + } + primarySuffix() { + return "(?:\\s*(?:uur))?(?!/)(?=\\W|$)"; + } + extractPrimaryTimeComponents(context, match) { + if (match[0].match(/^\s*\d{4}\s*$/)) { + return null; + } + return super.extractPrimaryTimeComponents(context, match); + } + }; + exports.default = NLTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js +var require_NLCasualYearMonthDayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s](?:(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]([0-9]{1,2})(?=\\W|$)`, "i"); + var YEAR_NUMBER_GROUP = 1; + var MONTH_NAME_GROUP = 2; + var MONTH_NUMBER_GROUP = 3; + var DATE_NUMBER_GROUP = 4; + var NLCasualYearMonthDayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const month = match[MONTH_NUMBER_GROUP] ? parseInt(match[MONTH_NUMBER_GROUP]) : constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + if (month < 1 || month > 12) { + return null; + } + const year = parseInt(match[YEAR_NUMBER_GROUP]); + const day = parseInt(match[DATE_NUMBER_GROUP]); + return { + day, + month, + year + }; + } + }; + exports.default = NLCasualYearMonthDayParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateTimeParser.js +var require_NLCasualDateTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateTimeParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var index_1 = require_dist(); + var dayjs_1 = require_dayjs(); + var dayjs_2 = __importDefault2(require_dayjs_min()); + var DATE_GROUP = 1; + var TIME_OF_DAY_GROUP = 2; + var NLCasualDateTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return /(gisteren|morgen|van)(ochtend|middag|namiddag|avond|nacht)(?=\W|$)/i; + } + innerExtract(context, match) { + const dateText = match[DATE_GROUP].toLowerCase(); + const timeText = match[TIME_OF_DAY_GROUP].toLowerCase(); + const component = context.createParsingComponents(); + const targetDate = dayjs_2.default(context.refDate); + switch (dateText) { + case "gisteren": + dayjs_1.assignSimilarDate(component, targetDate.add(-1, "day")); + break; + case "van": + dayjs_1.assignSimilarDate(component, targetDate); + break; + case "morgen": + dayjs_1.assignTheNextDay(component, targetDate); + break; + } + switch (timeText) { + case "ochtend": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 6); + break; + case "middag": + component.imply("meridiem", index_1.Meridiem.AM); + component.imply("hour", 12); + break; + case "namiddag": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 15); + break; + case "avond": + component.imply("meridiem", index_1.Meridiem.PM); + component.imply("hour", 20); + break; + } + return component; + } + }; + exports.default = NLCasualDateTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js +var require_NLTimeUnitCasualRelativeFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp(`(deze|vorige|afgelopen|komende|over|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); + var NLTimeUnitCasualRelativeFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const prefix = match[1].toLowerCase(); + let timeUnits = constants_1.parseTimeUnits(match[2]); + switch (prefix) { + case "vorige": + case "afgelopen": + case "-": + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + break; + } + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + }; + exports.default = NLTimeUnitCasualRelativeFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLRelativeDateFormatParser.js +var require_NLRelativeDateFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLRelativeDateFormatParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var results_1 = require_results(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var pattern_1 = require_pattern(); + var PATTERN = new RegExp(`(dit|deze|komende|volgend|volgende|afgelopen|vorige)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)(?=\\W|$)`, "i"); + var MODIFIER_WORD_GROUP = 1; + var RELATIVE_WORD_GROUP = 2; + var NLRelativeDateFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const modifier = match[MODIFIER_WORD_GROUP].toLowerCase(); + const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase(); + const timeunit = constants_1.TIME_UNIT_DICTIONARY[unitWord]; + if (modifier == "volgend" || modifier == "volgende" || modifier == "komende") { + const timeUnits = {}; + timeUnits[timeunit] = 1; + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + if (modifier == "afgelopen" || modifier == "vorige") { + const timeUnits = {}; + timeUnits[timeunit] = -1; + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + const components = context.createParsingComponents(); + let date = dayjs_1.default(context.reference.instant); + if (unitWord.match(/week/i)) { + date = date.add(-date.get("d"), "d"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.imply("year", date.year()); + } else if (unitWord.match(/maand/i)) { + date = date.add(-date.date() + 1, "d"); + components.imply("day", date.date()); + components.assign("year", date.year()); + components.assign("month", date.month() + 1); + } else if (unitWord.match(/jaar/i)) { + date = date.add(-date.date() + 1, "d"); + date = date.add(-date.month(), "month"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.assign("year", date.year()); + } + return components; + } + }; + exports.default = NLRelativeDateFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitAgoFormatParser.js +var require_NLTimeUnitAgoFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitAgoFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(?:geleden|voor|eerder)(?=(?:\\W|$))", "i"); + var STRICT_PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")geleden(?=(?:\\W|$))", "i"); + var NLTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + innerPattern() { + return this.strictMode ? STRICT_PATTERN : PATTERN; + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); + return results_1.ParsingComponents.createRelativeFromReference(context.reference, outputTimeUnits); + } + }; + exports.default = NLTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitLaterFormatParser.js +var require_NLTimeUnitLaterFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitLaterFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants6(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(later|na|vanaf nu|voortaan|vooruit|uit)(?=(?:\\W|$))", "i"); + var STRICT_PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(later|vanaf nu)(?=(?:\\W|$))", "i"); + var GROUP_NUM_TIMEUNITS = 1; + var NLTimeUnitLaterFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + constructor(strictMode) { + super(); + this.strictMode = strictMode; + } + innerPattern() { + return this.strictMode ? STRICT_PATTERN : PATTERN; + } + innerExtract(context, match) { + const fragments = constants_1.parseTimeUnits(match[GROUP_NUM_TIMEUNITS]); + return results_1.ParsingComponents.createRelativeFromReference(context.reference, fragments); + } + }; + exports.default = NLTimeUnitLaterFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/nl/index.js +var require_nl = __commonJS({ + "node_modules/chrono-node/dist/locales/nl/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var configurations_1 = require_configurations(); + var chrono_1 = require_chrono(); + var NLMergeDateRangeRefiner_1 = __importDefault2(require_NLMergeDateRangeRefiner()); + var NLMergeDateTimeRefiner_1 = __importDefault2(require_NLMergeDateTimeRefiner()); + var NLCasualDateParser_1 = __importDefault2(require_NLCasualDateParser()); + var NLCasualTimeParser_1 = __importDefault2(require_NLCasualTimeParser()); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var NLTimeUnitWithinFormatParser_1 = __importDefault2(require_NLTimeUnitWithinFormatParser()); + var NLWeekdayParser_1 = __importDefault2(require_NLWeekdayParser()); + var NLMonthNameMiddleEndianParser_1 = __importDefault2(require_NLMonthNameMiddleEndianParser()); + var NLMonthNameParser_1 = __importDefault2(require_NLMonthNameParser()); + var NLSlashMonthFormatParser_1 = __importDefault2(require_NLSlashMonthFormatParser()); + var NLTimeExpressionParser_1 = __importDefault2(require_NLTimeExpressionParser()); + var NLCasualYearMonthDayParser_1 = __importDefault2(require_NLCasualYearMonthDayParser()); + var NLCasualDateTimeParser_1 = __importDefault2(require_NLCasualDateTimeParser()); + var NLTimeUnitCasualRelativeFormatParser_1 = __importDefault2(require_NLTimeUnitCasualRelativeFormatParser()); + var NLRelativeDateFormatParser_1 = __importDefault2(require_NLRelativeDateFormatParser()); + var NLTimeUnitAgoFormatParser_1 = __importDefault2(require_NLTimeUnitAgoFormatParser()); + var NLTimeUnitLaterFormatParser_1 = __importDefault2(require_NLTimeUnitLaterFormatParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate3(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate3; + function createCasualConfiguration(littleEndian = true) { + const option = createConfiguration(false, littleEndian); + option.parsers.unshift(new NLCasualDateParser_1.default()); + option.parsers.unshift(new NLCasualTimeParser_1.default()); + option.parsers.unshift(new NLCasualDateTimeParser_1.default()); + option.parsers.unshift(new NLMonthNameParser_1.default()); + option.parsers.unshift(new NLRelativeDateFormatParser_1.default()); + option.parsers.unshift(new NLTimeUnitCasualRelativeFormatParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true, littleEndian = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(littleEndian), + new NLTimeUnitWithinFormatParser_1.default(), + new NLMonthNameMiddleEndianParser_1.default(), + new NLMonthNameParser_1.default(), + new NLWeekdayParser_1.default(), + new NLCasualYearMonthDayParser_1.default(), + new NLSlashMonthFormatParser_1.default(), + new NLTimeExpressionParser_1.default(strictMode), + new NLTimeUnitAgoFormatParser_1.default(strictMode), + new NLTimeUnitLaterFormatParser_1.default(strictMode) + ], + refiners: [new NLMergeDateTimeRefiner_1.default(), new NLMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantCasualDateParser.js +var require_ZHHantCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantCasualDateParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var NOW_GROUP = 1; + var DAY_GROUP_1 = 2; + var TIME_GROUP_1 = 3; + var TIME_GROUP_2 = 4; + var DAY_GROUP_3 = 5; + var TIME_GROUP_3 = 6; + var ZHHantCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return new RegExp("(\u800C\u5BB6|\u7ACB(?:\u523B|\u5373)|\u5373\u523B)|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s|,|\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?", "i"); + } + innerExtract(context, match) { + const index = match.index; + const result = context.createParsingResult(index, match[0]); + const refMoment = dayjs_1.default(context.refDate); + let startMoment = refMoment; + if (match[NOW_GROUP]) { + result.start.imply("hour", refMoment.hour()); + result.start.imply("minute", refMoment.minute()); + result.start.imply("second", refMoment.second()); + result.start.imply("millisecond", refMoment.millisecond()); + } else if (match[DAY_GROUP_1]) { + const day1 = match[DAY_GROUP_1]; + const time1 = match[TIME_GROUP_1]; + if (day1 == "\u660E" || day1 == "\u807D") { + if (refMoment.hour() > 1) { + startMoment = startMoment.add(1, "day"); + } + } else if (day1 == "\u6628" || day1 == "\u5C0B" || day1 == "\u7434") { + startMoment = startMoment.add(-1, "day"); + } else if (day1 == "\u524D") { + startMoment = startMoment.add(-2, "day"); + } else if (day1 == "\u5927\u524D") { + startMoment = startMoment.add(-3, "day"); + } else if (day1 == "\u5F8C") { + startMoment = startMoment.add(2, "day"); + } else if (day1 == "\u5927\u5F8C") { + startMoment = startMoment.add(3, "day"); + } + if (time1 == "\u65E9" || time1 == "\u671D") { + result.start.imply("hour", 6); + } else if (time1 == "\u665A") { + result.start.imply("hour", 22); + result.start.imply("meridiem", 1); + } + } else if (match[TIME_GROUP_2]) { + const timeString2 = match[TIME_GROUP_2]; + const time2 = timeString2[0]; + if (time2 == "\u65E9" || time2 == "\u671D" || time2 == "\u4E0A") { + result.start.imply("hour", 6); + } else if (time2 == "\u4E0B" || time2 == "\u664F") { + result.start.imply("hour", 15); + result.start.imply("meridiem", 1); + } else if (time2 == "\u4E2D") { + result.start.imply("hour", 12); + result.start.imply("meridiem", 1); + } else if (time2 == "\u591C" || time2 == "\u665A") { + result.start.imply("hour", 22); + result.start.imply("meridiem", 1); + } else if (time2 == "\u51CC") { + result.start.imply("hour", 0); + } + } else if (match[DAY_GROUP_3]) { + const day3 = match[DAY_GROUP_3]; + if (day3 == "\u660E" || day3 == "\u807D") { + if (refMoment.hour() > 1) { + startMoment = startMoment.add(1, "day"); + } + } else if (day3 == "\u6628" || day3 == "\u5C0B" || day3 == "\u7434") { + startMoment = startMoment.add(-1, "day"); + } else if (day3 == "\u524D") { + startMoment = startMoment.add(-2, "day"); + } else if (day3 == "\u5927\u524D") { + startMoment = startMoment.add(-3, "day"); + } else if (day3 == "\u5F8C") { + startMoment = startMoment.add(2, "day"); + } else if (day3 == "\u5927\u5F8C") { + startMoment = startMoment.add(3, "day"); + } + const timeString3 = match[TIME_GROUP_3]; + if (timeString3) { + const time3 = timeString3[0]; + if (time3 == "\u65E9" || time3 == "\u671D" || time3 == "\u4E0A") { + result.start.imply("hour", 6); + } else if (time3 == "\u4E0B" || time3 == "\u664F") { + result.start.imply("hour", 15); + result.start.imply("meridiem", 1); + } else if (time3 == "\u4E2D") { + result.start.imply("hour", 12); + result.start.imply("meridiem", 1); + } else if (time3 == "\u591C" || time3 == "\u665A") { + result.start.imply("hour", 22); + result.start.imply("meridiem", 1); + } else if (time3 == "\u51CC") { + result.start.imply("hour", 0); + } + } + } + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + return result; + } + }; + exports.default = ZHHantCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/constants.js +var require_constants7 = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.zhStringToYear = exports.zhStringToNumber = exports.WEEKDAY_OFFSET = exports.NUMBER = void 0; + exports.NUMBER = { + "\u96F6": 0, + "\u4E00": 1, + "\u4E8C": 2, + "\u5169": 2, + "\u4E09": 3, + "\u56DB": 4, + "\u4E94": 5, + "\u516D": 6, + "\u4E03": 7, + "\u516B": 8, + "\u4E5D": 9, + "\u5341": 10, + "\u5EFF": 20, + "\u5345": 30 + }; + exports.WEEKDAY_OFFSET = { + "\u5929": 0, + "\u65E5": 0, + "\u4E00": 1, + "\u4E8C": 2, + "\u4E09": 3, + "\u56DB": 4, + "\u4E94": 5, + "\u516D": 6 + }; + function zhStringToNumber(text2) { + let number = 0; + for (let i = 0; i < text2.length; i++) { + const char = text2[i]; + if (char === "\u5341") { + number = number === 0 ? exports.NUMBER[char] : number * exports.NUMBER[char]; + } else { + number += exports.NUMBER[char]; + } + } + return number; + } + exports.zhStringToNumber = zhStringToNumber; + function zhStringToYear(text2) { + let string = ""; + for (let i = 0; i < text2.length; i++) { + const char = text2[i]; + string = string + exports.NUMBER[char]; + } + return parseInt(string); + } + exports.zhStringToYear = zhStringToYear; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantDateParser.js +var require_ZHHantDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantDateParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants7(); + var YEAR_GROUP = 1; + var MONTH_GROUP = 2; + var DAY_GROUP = 3; + var ZHHantDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return new RegExp("(\\d{2,4}|[" + Object.keys(constants_1.NUMBER).join("") + "]{4}|[" + Object.keys(constants_1.NUMBER).join("") + "]{2})?(?:\\s*)(?:\u5E74)?(?:[\\s|,|\uFF0C]*)(\\d{1,2}|[" + Object.keys(constants_1.NUMBER).join("") + "]{1,2})(?:\\s*)(?:\u6708)(?:\\s*)(\\d{1,2}|[" + Object.keys(constants_1.NUMBER).join("") + "]{1,2})?(?:\\s*)(?:\u65E5|\u865F)?"); + } + innerExtract(context, match) { + const startMoment = dayjs_1.default(context.refDate); + const result = context.createParsingResult(match.index, match[0]); + let month = parseInt(match[MONTH_GROUP]); + if (isNaN(month)) + month = constants_1.zhStringToNumber(match[MONTH_GROUP]); + result.start.assign("month", month); + if (match[DAY_GROUP]) { + let day = parseInt(match[DAY_GROUP]); + if (isNaN(day)) + day = constants_1.zhStringToNumber(match[DAY_GROUP]); + result.start.assign("day", day); + } else { + result.start.imply("day", startMoment.date()); + } + if (match[YEAR_GROUP]) { + let year = parseInt(match[YEAR_GROUP]); + if (isNaN(year)) + year = constants_1.zhStringToYear(match[YEAR_GROUP]); + result.start.assign("year", year); + } else { + result.start.imply("year", startMoment.year()); + } + return result; + } + }; + exports.default = ZHHantDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantDeadlineFormatParser.js +var require_ZHHantDeadlineFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantDeadlineFormatParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants7(); + var PATTERN = new RegExp("(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+|\u534A|\u5E7E)(?:\\s*)(?:\u500B)?(\u79D2(?:\u9418)?|\u5206\u9418|\u5C0F\u6642|\u9418|\u65E5|\u5929|\u661F\u671F|\u79AE\u62DC|\u6708|\u5E74)(?:(?:\u4E4B|\u904E)?\u5F8C|(?:\u4E4B)?\u5167)", "i"); + var NUMBER_GROUP = 1; + var UNIT_GROUP = 2; + var ZHHantDeadlineFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + let number = parseInt(match[NUMBER_GROUP]); + if (isNaN(number)) { + number = constants_1.zhStringToNumber(match[NUMBER_GROUP]); + } + if (isNaN(number)) { + const string = match[NUMBER_GROUP]; + if (string === "\u5E7E") { + number = 3; + } else if (string === "\u534A") { + number = 0.5; + } else { + return null; + } + } + let date = dayjs_1.default(context.refDate); + const unit = match[UNIT_GROUP]; + const unitAbbr = unit[0]; + if (unitAbbr.match(/[日天星禮月年]/)) { + if (unitAbbr == "\u65E5" || unitAbbr == "\u5929") { + date = date.add(number, "d"); + } else if (unitAbbr == "\u661F" || unitAbbr == "\u79AE") { + date = date.add(number * 7, "d"); + } else if (unitAbbr == "\u6708") { + date = date.add(number, "month"); + } else if (unitAbbr == "\u5E74") { + date = date.add(number, "year"); + } + result.start.assign("year", date.year()); + result.start.assign("month", date.month() + 1); + result.start.assign("day", date.date()); + return result; + } + if (unitAbbr == "\u79D2") { + date = date.add(number, "second"); + } else if (unitAbbr == "\u5206") { + date = date.add(number, "minute"); + } else if (unitAbbr == "\u5C0F" || unitAbbr == "\u9418") { + date = date.add(number, "hour"); + } + result.start.imply("year", date.year()); + result.start.imply("month", date.month() + 1); + result.start.imply("day", date.date()); + result.start.assign("hour", date.hour()); + result.start.assign("minute", date.minute()); + result.start.assign("second", date.second()); + return result; + } + }; + exports.default = ZHHantDeadlineFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantRelationWeekdayParser.js +var require_ZHHantRelationWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantRelationWeekdayParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants7(); + var PATTERN = new RegExp("(?\u4E0A|\u4ECA|\u4E0B|\u9019|\u5462)(?:\u500B)?(?:\u661F\u671F|\u79AE\u62DC|\u9031)(?" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")"); + var ZHHantRelationWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const dayOfWeek = match.groups.weekday; + const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek]; + if (offset === void 0) + return null; + let modifier = null; + const prefix = match.groups.prefix; + if (prefix == "\u4E0A") { + modifier = "last"; + } else if (prefix == "\u4E0B") { + modifier = "next"; + } else if (prefix == "\u4ECA" || prefix == "\u9019" || prefix == "\u5462") { + modifier = "this"; + } + let startMoment = dayjs_1.default(context.refDate); + let startMomentFixed = false; + const refOffset = startMoment.day(); + if (modifier == "last" || modifier == "past") { + startMoment = startMoment.day(offset - 7); + startMomentFixed = true; + } else if (modifier == "next") { + startMoment = startMoment.day(offset + 7); + startMomentFixed = true; + } else if (modifier == "this") { + startMoment = startMoment.day(offset); + } else { + if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset - 7); + } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset + 7); + } else { + startMoment = startMoment.day(offset); + } + } + result.start.assign("weekday", offset); + if (startMomentFixed) { + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else { + result.start.imply("day", startMoment.date()); + result.start.imply("month", startMoment.month() + 1); + result.start.imply("year", startMoment.year()); + } + return result; + } + }; + exports.default = ZHHantRelationWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantTimeExpressionParser.js +var require_ZHHantTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantTimeExpressionParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants7(); + var FIRST_REG_PATTERN = new RegExp("(?:\u7531|\u5F9E|\u81EA)?(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)(?:\\s*)(?:\u9EDE|\u6642|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?", "i"); + var SECOND_REG_PATTERN = new RegExp("(?:^\\s*(?:\u5230|\u81F3|\\-|\\\u2013|\\~|\\\u301C)\\s*)(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)(?:\\s*)(?:\u9EDE|\u6642|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?", "i"); + var DAY_GROUP_1 = 1; + var ZH_AM_PM_HOUR_GROUP_1 = 2; + var ZH_AM_PM_HOUR_GROUP_2 = 3; + var DAY_GROUP_3 = 4; + var ZH_AM_PM_HOUR_GROUP_3 = 5; + var HOUR_GROUP = 6; + var MINUTE_GROUP = 7; + var SECOND_GROUP = 8; + var AM_PM_HOUR_GROUP = 9; + var ZHHantTimeExpressionParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return FIRST_REG_PATTERN; + } + innerExtract(context, match) { + if (match.index > 0 && context.text[match.index - 1].match(/\w/)) { + return null; + } + const refMoment = dayjs_1.default(context.refDate); + const result = context.createParsingResult(match.index, match[0]); + const startMoment = refMoment.clone(); + if (match[DAY_GROUP_1]) { + var day1 = match[DAY_GROUP_1]; + if (day1 == "\u660E" || day1 == "\u807D") { + if (refMoment.hour() > 1) { + startMoment.add(1, "day"); + } + } else if (day1 == "\u6628" || day1 == "\u5C0B" || day1 == "\u7434") { + startMoment.add(-1, "day"); + } else if (day1 == "\u524D") { + startMoment.add(-2, "day"); + } else if (day1 == "\u5927\u524D") { + startMoment.add(-3, "day"); + } else if (day1 == "\u5F8C") { + startMoment.add(2, "day"); + } else if (day1 == "\u5927\u5F8C") { + startMoment.add(3, "day"); + } + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else if (match[DAY_GROUP_3]) { + var day3 = match[DAY_GROUP_3]; + if (day3 == "\u660E" || day3 == "\u807D") { + startMoment.add(1, "day"); + } else if (day3 == "\u6628" || day3 == "\u5C0B" || day3 == "\u7434") { + startMoment.add(-1, "day"); + } else if (day3 == "\u524D") { + startMoment.add(-2, "day"); + } else if (day3 == "\u5927\u524D") { + startMoment.add(-3, "day"); + } else if (day3 == "\u5F8C") { + startMoment.add(2, "day"); + } else if (day3 == "\u5927\u5F8C") { + startMoment.add(3, "day"); + } + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else { + result.start.imply("day", startMoment.date()); + result.start.imply("month", startMoment.month() + 1); + result.start.imply("year", startMoment.year()); + } + let hour = 0; + let minute = 0; + let meridiem = -1; + if (match[SECOND_GROUP]) { + var second = parseInt(match[SECOND_GROUP]); + if (isNaN(second)) { + second = constants_1.zhStringToNumber(match[SECOND_GROUP]); + } + if (second >= 60) + return null; + result.start.assign("second", second); + } + hour = parseInt(match[HOUR_GROUP]); + if (isNaN(hour)) { + hour = constants_1.zhStringToNumber(match[HOUR_GROUP]); + } + if (match[MINUTE_GROUP]) { + if (match[MINUTE_GROUP] == "\u534A") { + minute = 30; + } else if (match[MINUTE_GROUP] == "\u6B63" || match[MINUTE_GROUP] == "\u6574") { + minute = 0; + } else { + minute = parseInt(match[MINUTE_GROUP]); + if (isNaN(minute)) { + minute = constants_1.zhStringToNumber(match[MINUTE_GROUP]); + } + } + } else if (hour > 100) { + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (minute >= 60) { + return null; + } + if (hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = 1; + } + if (match[AM_PM_HOUR_GROUP]) { + if (hour > 12) + return null; + var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = 0; + if (hour == 12) + hour = 0; + } + if (ampm == "p") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_1]) { + var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1]; + var zhAMPM1 = zhAMPMString1[0]; + if (zhAMPM1 == "\u671D" || zhAMPM1 == "\u65E9") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM1 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_2]) { + var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2]; + var zhAMPM2 = zhAMPMString2[0]; + if (zhAMPM2 == "\u4E0A" || zhAMPM2 == "\u671D" || zhAMPM2 == "\u65E9" || zhAMPM2 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM2 == "\u4E0B" || zhAMPM2 == "\u664F" || zhAMPM2 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_3]) { + var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3]; + var zhAMPM3 = zhAMPMString3[0]; + if (zhAMPM3 == "\u4E0A" || zhAMPM3 == "\u671D" || zhAMPM3 == "\u65E9" || zhAMPM3 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM3 == "\u4E0B" || zhAMPM3 == "\u664F" || zhAMPM3 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } + result.start.assign("hour", hour); + result.start.assign("minute", minute); + if (meridiem >= 0) { + result.start.assign("meridiem", meridiem); + } else { + if (hour < 12) { + result.start.imply("meridiem", 0); + } else { + result.start.imply("meridiem", 1); + } + } + match = SECOND_REG_PATTERN.exec(context.text.substring(result.index + result.text.length)); + if (!match) { + if (result.text.match(/^\d+$/)) { + return null; + } + return result; + } + const endMoment = startMoment.clone(); + result.end = context.createParsingComponents(); + if (match[DAY_GROUP_1]) { + var day1 = match[DAY_GROUP_1]; + if (day1 == "\u660E" || day1 == "\u807D") { + if (refMoment.hour() > 1) { + endMoment.add(1, "day"); + } + } else if (day1 == "\u6628" || day1 == "\u5C0B" || day1 == "\u7434") { + endMoment.add(-1, "day"); + } else if (day1 == "\u524D") { + endMoment.add(-2, "day"); + } else if (day1 == "\u5927\u524D") { + endMoment.add(-3, "day"); + } else if (day1 == "\u5F8C") { + endMoment.add(2, "day"); + } else if (day1 == "\u5927\u5F8C") { + endMoment.add(3, "day"); + } + result.end.assign("day", endMoment.date()); + result.end.assign("month", endMoment.month() + 1); + result.end.assign("year", endMoment.year()); + } else if (match[DAY_GROUP_3]) { + var day3 = match[DAY_GROUP_3]; + if (day3 == "\u660E" || day3 == "\u807D") { + endMoment.add(1, "day"); + } else if (day3 == "\u6628" || day3 == "\u5C0B" || day3 == "\u7434") { + endMoment.add(-1, "day"); + } else if (day3 == "\u524D") { + endMoment.add(-2, "day"); + } else if (day3 == "\u5927\u524D") { + endMoment.add(-3, "day"); + } else if (day3 == "\u5F8C") { + endMoment.add(2, "day"); + } else if (day3 == "\u5927\u5F8C") { + endMoment.add(3, "day"); + } + result.end.assign("day", endMoment.date()); + result.end.assign("month", endMoment.month() + 1); + result.end.assign("year", endMoment.year()); + } else { + result.end.imply("day", endMoment.date()); + result.end.imply("month", endMoment.month() + 1); + result.end.imply("year", endMoment.year()); + } + hour = 0; + minute = 0; + meridiem = -1; + if (match[SECOND_GROUP]) { + var second = parseInt(match[SECOND_GROUP]); + if (isNaN(second)) { + second = constants_1.zhStringToNumber(match[SECOND_GROUP]); + } + if (second >= 60) + return null; + result.end.assign("second", second); + } + hour = parseInt(match[HOUR_GROUP]); + if (isNaN(hour)) { + hour = constants_1.zhStringToNumber(match[HOUR_GROUP]); + } + if (match[MINUTE_GROUP]) { + if (match[MINUTE_GROUP] == "\u534A") { + minute = 30; + } else if (match[MINUTE_GROUP] == "\u6B63" || match[MINUTE_GROUP] == "\u6574") { + minute = 0; + } else { + minute = parseInt(match[MINUTE_GROUP]); + if (isNaN(minute)) { + minute = constants_1.zhStringToNumber(match[MINUTE_GROUP]); + } + } + } else if (hour > 100) { + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (minute >= 60) { + return null; + } + if (hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = 1; + } + if (match[AM_PM_HOUR_GROUP]) { + if (hour > 12) + return null; + var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = 0; + if (hour == 12) + hour = 0; + } + if (ampm == "p") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + if (!result.start.isCertain("meridiem")) { + if (meridiem == 0) { + result.start.imply("meridiem", 0); + if (result.start.get("hour") == 12) { + result.start.assign("hour", 0); + } + } else { + result.start.imply("meridiem", 1); + if (result.start.get("hour") != 12) { + result.start.assign("hour", result.start.get("hour") + 12); + } + } + } + } else if (match[ZH_AM_PM_HOUR_GROUP_1]) { + var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1]; + var zhAMPM1 = zhAMPMString1[0]; + if (zhAMPM1 == "\u671D" || zhAMPM1 == "\u65E9") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM1 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_2]) { + var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2]; + var zhAMPM2 = zhAMPMString2[0]; + if (zhAMPM2 == "\u4E0A" || zhAMPM2 == "\u671D" || zhAMPM2 == "\u65E9" || zhAMPM2 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM2 == "\u4E0B" || zhAMPM2 == "\u664F" || zhAMPM2 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_3]) { + var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3]; + var zhAMPM3 = zhAMPMString3[0]; + if (zhAMPM3 == "\u4E0A" || zhAMPM3 == "\u671D" || zhAMPM3 == "\u65E9" || zhAMPM3 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM3 == "\u4E0B" || zhAMPM3 == "\u664F" || zhAMPM3 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } + result.text = result.text + match[0]; + result.end.assign("hour", hour); + result.end.assign("minute", minute); + if (meridiem >= 0) { + result.end.assign("meridiem", meridiem); + } else { + const startAtPM = result.start.isCertain("meridiem") && result.start.get("meridiem") == 1; + if (startAtPM && result.start.get("hour") > hour) { + result.end.imply("meridiem", 0); + } else if (hour > 12) { + result.end.imply("meridiem", 1); + } + } + if (result.end.date().getTime() < result.start.date().getTime()) { + result.end.imply("day", result.end.get("day") + 1); + } + return result; + } + }; + exports.default = ZHHantTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantWeekdayParser.js +var require_ZHHantWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantWeekdayParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants7(); + var PATTERN = new RegExp("(?:\u661F\u671F|\u79AE\u62DC|\u9031)(?" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")"); + var ZHHantWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const dayOfWeek = match.groups.weekday; + const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek]; + if (offset === void 0) + return null; + let startMoment = dayjs_1.default(context.refDate); + const startMomentFixed = false; + const refOffset = startMoment.day(); + if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset - 7); + } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset + 7); + } else { + startMoment = startMoment.day(offset); + } + result.start.assign("weekday", offset); + if (startMomentFixed) { + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else { + result.start.imply("day", startMoment.date()); + result.start.imply("month", startMoment.month() + 1); + result.start.imply("year", startMoment.year()); + } + return result; + } + }; + exports.default = ZHHantWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/refiners/ZHHantMergeDateRangeRefiner.js +var require_ZHHantMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/refiners/ZHHantMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var ZHHantMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(至|到|\-|\~|~|-|ー)\s*$/i; + } + }; + exports.default = ZHHantMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/refiners/ZHHantMergeDateTimeRefiner.js +var require_ZHHantMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/refiners/ZHHantMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var ZHHantMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return /^\s*$/i; + } + }; + exports.default = ZHHantMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hant/index.js +var require_hant = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hant/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = exports.hant = void 0; + var chrono_1 = require_chrono(); + var ExtractTimezoneOffsetRefiner_1 = __importDefault2(require_ExtractTimezoneOffsetRefiner()); + var configurations_1 = require_configurations(); + var ZHHantCasualDateParser_1 = __importDefault2(require_ZHHantCasualDateParser()); + var ZHHantDateParser_1 = __importDefault2(require_ZHHantDateParser()); + var ZHHantDeadlineFormatParser_1 = __importDefault2(require_ZHHantDeadlineFormatParser()); + var ZHHantRelationWeekdayParser_1 = __importDefault2(require_ZHHantRelationWeekdayParser()); + var ZHHantTimeExpressionParser_1 = __importDefault2(require_ZHHantTimeExpressionParser()); + var ZHHantWeekdayParser_1 = __importDefault2(require_ZHHantWeekdayParser()); + var ZHHantMergeDateRangeRefiner_1 = __importDefault2(require_ZHHantMergeDateRangeRefiner()); + var ZHHantMergeDateTimeRefiner_1 = __importDefault2(require_ZHHantMergeDateTimeRefiner()); + exports.hant = new chrono_1.Chrono(createCasualConfiguration()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration()); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate3(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate3; + function createCasualConfiguration() { + const option = createConfiguration(); + option.parsers.unshift(new ZHHantCasualDateParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration() { + const configuration = configurations_1.includeCommonConfiguration({ + parsers: [ + new ZHHantDateParser_1.default(), + new ZHHantRelationWeekdayParser_1.default(), + new ZHHantWeekdayParser_1.default(), + new ZHHantTimeExpressionParser_1.default(), + new ZHHantDeadlineFormatParser_1.default() + ], + refiners: [new ZHHantMergeDateRangeRefiner_1.default(), new ZHHantMergeDateTimeRefiner_1.default()] + }); + configuration.refiners = configuration.refiners.filter((refiner) => !(refiner instanceof ExtractTimezoneOffsetRefiner_1.default)); + return configuration; + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansCasualDateParser.js +var require_ZHHansCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansCasualDateParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var NOW_GROUP = 1; + var DAY_GROUP_1 = 2; + var TIME_GROUP_1 = 3; + var TIME_GROUP_2 = 4; + var DAY_GROUP_3 = 5; + var TIME_GROUP_3 = 6; + var ZHHansCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern(context) { + return new RegExp("(\u73B0\u5728|\u7ACB(?:\u523B|\u5373)|\u5373\u523B)|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s|,|\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?", "i"); + } + innerExtract(context, match) { + const index = match.index; + const result = context.createParsingResult(index, match[0]); + const refMoment = dayjs_1.default(context.refDate); + let startMoment = refMoment; + if (match[NOW_GROUP]) { + result.start.imply("hour", refMoment.hour()); + result.start.imply("minute", refMoment.minute()); + result.start.imply("second", refMoment.second()); + result.start.imply("millisecond", refMoment.millisecond()); + } else if (match[DAY_GROUP_1]) { + const day1 = match[DAY_GROUP_1]; + const time1 = match[TIME_GROUP_1]; + if (day1 == "\u660E") { + if (refMoment.hour() > 1) { + startMoment = startMoment.add(1, "day"); + } + } else if (day1 == "\u6628") { + startMoment = startMoment.add(-1, "day"); + } else if (day1 == "\u524D") { + startMoment = startMoment.add(-2, "day"); + } else if (day1 == "\u5927\u524D") { + startMoment = startMoment.add(-3, "day"); + } else if (day1 == "\u540E") { + startMoment = startMoment.add(2, "day"); + } else if (day1 == "\u5927\u540E") { + startMoment = startMoment.add(3, "day"); + } + if (time1 == "\u65E9") { + result.start.imply("hour", 6); + } else if (time1 == "\u665A") { + result.start.imply("hour", 22); + result.start.imply("meridiem", 1); + } + } else if (match[TIME_GROUP_2]) { + const timeString2 = match[TIME_GROUP_2]; + const time2 = timeString2[0]; + if (time2 == "\u65E9" || time2 == "\u4E0A") { + result.start.imply("hour", 6); + } else if (time2 == "\u4E0B") { + result.start.imply("hour", 15); + result.start.imply("meridiem", 1); + } else if (time2 == "\u4E2D") { + result.start.imply("hour", 12); + result.start.imply("meridiem", 1); + } else if (time2 == "\u591C" || time2 == "\u665A") { + result.start.imply("hour", 22); + result.start.imply("meridiem", 1); + } else if (time2 == "\u51CC") { + result.start.imply("hour", 0); + } + } else if (match[DAY_GROUP_3]) { + const day3 = match[DAY_GROUP_3]; + if (day3 == "\u660E") { + if (refMoment.hour() > 1) { + startMoment = startMoment.add(1, "day"); + } + } else if (day3 == "\u6628") { + startMoment = startMoment.add(-1, "day"); + } else if (day3 == "\u524D") { + startMoment = startMoment.add(-2, "day"); + } else if (day3 == "\u5927\u524D") { + startMoment = startMoment.add(-3, "day"); + } else if (day3 == "\u540E") { + startMoment = startMoment.add(2, "day"); + } else if (day3 == "\u5927\u540E") { + startMoment = startMoment.add(3, "day"); + } + const timeString3 = match[TIME_GROUP_3]; + if (timeString3) { + const time3 = timeString3[0]; + if (time3 == "\u65E9" || time3 == "\u4E0A") { + result.start.imply("hour", 6); + } else if (time3 == "\u4E0B") { + result.start.imply("hour", 15); + result.start.imply("meridiem", 1); + } else if (time3 == "\u4E2D") { + result.start.imply("hour", 12); + result.start.imply("meridiem", 1); + } else if (time3 == "\u591C" || time3 == "\u665A") { + result.start.imply("hour", 22); + result.start.imply("meridiem", 1); + } else if (time3 == "\u51CC") { + result.start.imply("hour", 0); + } + } + } + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + return result; + } + }; + exports.default = ZHHansCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/constants.js +var require_constants8 = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.zhStringToYear = exports.zhStringToNumber = exports.WEEKDAY_OFFSET = exports.NUMBER = void 0; + exports.NUMBER = { + "\u96F6": 0, + "\u3007": 0, + "\u4E00": 1, + "\u4E8C": 2, + "\u4E24": 2, + "\u4E09": 3, + "\u56DB": 4, + "\u4E94": 5, + "\u516D": 6, + "\u4E03": 7, + "\u516B": 8, + "\u4E5D": 9, + "\u5341": 10 + }; + exports.WEEKDAY_OFFSET = { + "\u5929": 0, + "\u65E5": 0, + "\u4E00": 1, + "\u4E8C": 2, + "\u4E09": 3, + "\u56DB": 4, + "\u4E94": 5, + "\u516D": 6 + }; + function zhStringToNumber(text2) { + let number = 0; + for (let i = 0; i < text2.length; i++) { + const char = text2[i]; + if (char === "\u5341") { + number = number === 0 ? exports.NUMBER[char] : number * exports.NUMBER[char]; + } else { + number += exports.NUMBER[char]; + } + } + return number; + } + exports.zhStringToNumber = zhStringToNumber; + function zhStringToYear(text2) { + let string = ""; + for (let i = 0; i < text2.length; i++) { + const char = text2[i]; + string = string + exports.NUMBER[char]; + } + return parseInt(string); + } + exports.zhStringToYear = zhStringToYear; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansDateParser.js +var require_ZHHansDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansDateParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants8(); + var YEAR_GROUP = 1; + var MONTH_GROUP = 2; + var DAY_GROUP = 3; + var ZHHansDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return new RegExp("(\\d{2,4}|[" + Object.keys(constants_1.NUMBER).join("") + "]{4}|[" + Object.keys(constants_1.NUMBER).join("") + "]{2})?(?:\\s*)(?:\u5E74)?(?:[\\s|,|\uFF0C]*)(\\d{1,2}|[" + Object.keys(constants_1.NUMBER).join("") + "]{1,3})(?:\\s*)(?:\u6708)(?:\\s*)(\\d{1,2}|[" + Object.keys(constants_1.NUMBER).join("") + "]{1,3})?(?:\\s*)(?:\u65E5|\u53F7)?"); + } + innerExtract(context, match) { + const startMoment = dayjs_1.default(context.refDate); + const result = context.createParsingResult(match.index, match[0]); + let month = parseInt(match[MONTH_GROUP]); + if (isNaN(month)) + month = constants_1.zhStringToNumber(match[MONTH_GROUP]); + result.start.assign("month", month); + if (match[DAY_GROUP]) { + let day = parseInt(match[DAY_GROUP]); + if (isNaN(day)) + day = constants_1.zhStringToNumber(match[DAY_GROUP]); + result.start.assign("day", day); + } else { + result.start.imply("day", startMoment.date()); + } + if (match[YEAR_GROUP]) { + let year = parseInt(match[YEAR_GROUP]); + if (isNaN(year)) + year = constants_1.zhStringToYear(match[YEAR_GROUP]); + result.start.assign("year", year); + } else { + result.start.imply("year", startMoment.year()); + } + return result; + } + }; + exports.default = ZHHansDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.js +var require_ZHHansDeadlineFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants8(); + var PATTERN = new RegExp("(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+|\u534A|\u51E0)(?:\\s*)(?:\u4E2A)?(\u79D2(?:\u949F)?|\u5206\u949F|\u5C0F\u65F6|\u949F|\u65E5|\u5929|\u661F\u671F|\u793C\u62DC|\u6708|\u5E74)(?:(?:\u4E4B|\u8FC7)?\u540E|(?:\u4E4B)?\u5185)", "i"); + var NUMBER_GROUP = 1; + var UNIT_GROUP = 2; + var ZHHansDeadlineFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + let number = parseInt(match[NUMBER_GROUP]); + if (isNaN(number)) { + number = constants_1.zhStringToNumber(match[NUMBER_GROUP]); + } + if (isNaN(number)) { + const string = match[NUMBER_GROUP]; + if (string === "\u51E0") { + number = 3; + } else if (string === "\u534A") { + number = 0.5; + } else { + return null; + } + } + let date = dayjs_1.default(context.refDate); + const unit = match[UNIT_GROUP]; + const unitAbbr = unit[0]; + if (unitAbbr.match(/[日天星礼月年]/)) { + if (unitAbbr == "\u65E5" || unitAbbr == "\u5929") { + date = date.add(number, "d"); + } else if (unitAbbr == "\u661F" || unitAbbr == "\u793C") { + date = date.add(number * 7, "d"); + } else if (unitAbbr == "\u6708") { + date = date.add(number, "month"); + } else if (unitAbbr == "\u5E74") { + date = date.add(number, "year"); + } + result.start.assign("year", date.year()); + result.start.assign("month", date.month() + 1); + result.start.assign("day", date.date()); + return result; + } + if (unitAbbr == "\u79D2") { + date = date.add(number, "second"); + } else if (unitAbbr == "\u5206") { + date = date.add(number, "minute"); + } else if (unitAbbr == "\u5C0F" || unitAbbr == "\u949F") { + date = date.add(number, "hour"); + } + result.start.imply("year", date.year()); + result.start.imply("month", date.month() + 1); + result.start.imply("day", date.date()); + result.start.assign("hour", date.hour()); + result.start.assign("minute", date.minute()); + result.start.assign("second", date.second()); + return result; + } + }; + exports.default = ZHHansDeadlineFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansRelationWeekdayParser.js +var require_ZHHansRelationWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansRelationWeekdayParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants8(); + var PATTERN = new RegExp("(?\u4E0A|\u4E0B|\u8FD9)(?:\u4E2A)?(?:\u661F\u671F|\u793C\u62DC|\u5468)(?" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")"); + var ZHHansRelationWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const dayOfWeek = match.groups.weekday; + const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek]; + if (offset === void 0) + return null; + let modifier = null; + const prefix = match.groups.prefix; + if (prefix == "\u4E0A") { + modifier = "last"; + } else if (prefix == "\u4E0B") { + modifier = "next"; + } else if (prefix == "\u8FD9") { + modifier = "this"; + } + let startMoment = dayjs_1.default(context.refDate); + let startMomentFixed = false; + const refOffset = startMoment.day(); + if (modifier == "last" || modifier == "past") { + startMoment = startMoment.day(offset - 7); + startMomentFixed = true; + } else if (modifier == "next") { + startMoment = startMoment.day(offset + 7); + startMomentFixed = true; + } else if (modifier == "this") { + startMoment = startMoment.day(offset); + } else { + if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset - 7); + } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset + 7); + } else { + startMoment = startMoment.day(offset); + } + } + result.start.assign("weekday", offset); + if (startMomentFixed) { + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else { + result.start.imply("day", startMoment.date()); + result.start.imply("month", startMoment.month() + 1); + result.start.imply("year", startMoment.year()); + } + return result; + } + }; + exports.default = ZHHansRelationWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js +var require_ZHHansTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants8(); + var FIRST_REG_PATTERN = new RegExp("(?:\u4ECE|\u81EA)?(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)(?:\\s*)(?:\u70B9|\u65F6|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?", "i"); + var SECOND_REG_PATTERN = new RegExp("(?:^\\s*(?:\u5230|\u81F3|\\-|\\\u2013|\\~|\\\u301C)\\s*)(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)(?:\\s*)(?:\u70B9|\u65F6|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?", "i"); + var DAY_GROUP_1 = 1; + var ZH_AM_PM_HOUR_GROUP_1 = 2; + var ZH_AM_PM_HOUR_GROUP_2 = 3; + var DAY_GROUP_3 = 4; + var ZH_AM_PM_HOUR_GROUP_3 = 5; + var HOUR_GROUP = 6; + var MINUTE_GROUP = 7; + var SECOND_GROUP = 8; + var AM_PM_HOUR_GROUP = 9; + var ZHHansTimeExpressionParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return FIRST_REG_PATTERN; + } + innerExtract(context, match) { + if (match.index > 0 && context.text[match.index - 1].match(/\w/)) { + return null; + } + const refMoment = dayjs_1.default(context.refDate); + const result = context.createParsingResult(match.index, match[0]); + const startMoment = refMoment.clone(); + if (match[DAY_GROUP_1]) { + const day1 = match[DAY_GROUP_1]; + if (day1 == "\u660E") { + if (refMoment.hour() > 1) { + startMoment.add(1, "day"); + } + } else if (day1 == "\u6628") { + startMoment.add(-1, "day"); + } else if (day1 == "\u524D") { + startMoment.add(-2, "day"); + } else if (day1 == "\u5927\u524D") { + startMoment.add(-3, "day"); + } else if (day1 == "\u540E") { + startMoment.add(2, "day"); + } else if (day1 == "\u5927\u540E") { + startMoment.add(3, "day"); + } + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else if (match[DAY_GROUP_3]) { + const day3 = match[DAY_GROUP_3]; + if (day3 == "\u660E") { + startMoment.add(1, "day"); + } else if (day3 == "\u6628") { + startMoment.add(-1, "day"); + } else if (day3 == "\u524D") { + startMoment.add(-2, "day"); + } else if (day3 == "\u5927\u524D") { + startMoment.add(-3, "day"); + } else if (day3 == "\u540E") { + startMoment.add(2, "day"); + } else if (day3 == "\u5927\u540E") { + startMoment.add(3, "day"); + } + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else { + result.start.imply("day", startMoment.date()); + result.start.imply("month", startMoment.month() + 1); + result.start.imply("year", startMoment.year()); + } + let hour = 0; + let minute = 0; + let meridiem = -1; + if (match[SECOND_GROUP]) { + let second = parseInt(match[SECOND_GROUP]); + if (isNaN(second)) { + second = constants_1.zhStringToNumber(match[SECOND_GROUP]); + } + if (second >= 60) + return null; + result.start.assign("second", second); + } + hour = parseInt(match[HOUR_GROUP]); + if (isNaN(hour)) { + hour = constants_1.zhStringToNumber(match[HOUR_GROUP]); + } + if (match[MINUTE_GROUP]) { + if (match[MINUTE_GROUP] == "\u534A") { + minute = 30; + } else if (match[MINUTE_GROUP] == "\u6B63" || match[MINUTE_GROUP] == "\u6574") { + minute = 0; + } else { + minute = parseInt(match[MINUTE_GROUP]); + if (isNaN(minute)) { + minute = constants_1.zhStringToNumber(match[MINUTE_GROUP]); + } + } + } else if (hour > 100) { + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (minute >= 60) { + return null; + } + if (hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = 1; + } + if (match[AM_PM_HOUR_GROUP]) { + if (hour > 12) + return null; + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = 0; + if (hour == 12) + hour = 0; + } + if (ampm == "p") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_1]) { + const zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1]; + const zhAMPM1 = zhAMPMString1[0]; + if (zhAMPM1 == "\u65E9") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM1 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_2]) { + const zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2]; + const zhAMPM2 = zhAMPMString2[0]; + if (zhAMPM2 == "\u4E0A" || zhAMPM2 == "\u65E9" || zhAMPM2 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM2 == "\u4E0B" || zhAMPM2 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_3]) { + const zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3]; + const zhAMPM3 = zhAMPMString3[0]; + if (zhAMPM3 == "\u4E0A" || zhAMPM3 == "\u65E9" || zhAMPM3 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM3 == "\u4E0B" || zhAMPM3 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } + result.start.assign("hour", hour); + result.start.assign("minute", minute); + if (meridiem >= 0) { + result.start.assign("meridiem", meridiem); + } else { + if (hour < 12) { + result.start.imply("meridiem", 0); + } else { + result.start.imply("meridiem", 1); + } + } + match = SECOND_REG_PATTERN.exec(context.text.substring(result.index + result.text.length)); + if (!match) { + if (result.text.match(/^\d+$/)) { + return null; + } + return result; + } + const endMoment = startMoment.clone(); + result.end = context.createParsingComponents(); + if (match[DAY_GROUP_1]) { + const day1 = match[DAY_GROUP_1]; + if (day1 == "\u660E") { + if (refMoment.hour() > 1) { + endMoment.add(1, "day"); + } + } else if (day1 == "\u6628") { + endMoment.add(-1, "day"); + } else if (day1 == "\u524D") { + endMoment.add(-2, "day"); + } else if (day1 == "\u5927\u524D") { + endMoment.add(-3, "day"); + } else if (day1 == "\u540E") { + endMoment.add(2, "day"); + } else if (day1 == "\u5927\u540E") { + endMoment.add(3, "day"); + } + result.end.assign("day", endMoment.date()); + result.end.assign("month", endMoment.month() + 1); + result.end.assign("year", endMoment.year()); + } else if (match[DAY_GROUP_3]) { + const day3 = match[DAY_GROUP_3]; + if (day3 == "\u660E") { + endMoment.add(1, "day"); + } else if (day3 == "\u6628") { + endMoment.add(-1, "day"); + } else if (day3 == "\u524D") { + endMoment.add(-2, "day"); + } else if (day3 == "\u5927\u524D") { + endMoment.add(-3, "day"); + } else if (day3 == "\u540E") { + endMoment.add(2, "day"); + } else if (day3 == "\u5927\u540E") { + endMoment.add(3, "day"); + } + result.end.assign("day", endMoment.date()); + result.end.assign("month", endMoment.month() + 1); + result.end.assign("year", endMoment.year()); + } else { + result.end.imply("day", endMoment.date()); + result.end.imply("month", endMoment.month() + 1); + result.end.imply("year", endMoment.year()); + } + hour = 0; + minute = 0; + meridiem = -1; + if (match[SECOND_GROUP]) { + let second = parseInt(match[SECOND_GROUP]); + if (isNaN(second)) { + second = constants_1.zhStringToNumber(match[SECOND_GROUP]); + } + if (second >= 60) + return null; + result.end.assign("second", second); + } + hour = parseInt(match[HOUR_GROUP]); + if (isNaN(hour)) { + hour = constants_1.zhStringToNumber(match[HOUR_GROUP]); + } + if (match[MINUTE_GROUP]) { + if (match[MINUTE_GROUP] == "\u534A") { + minute = 30; + } else if (match[MINUTE_GROUP] == "\u6B63" || match[MINUTE_GROUP] == "\u6574") { + minute = 0; + } else { + minute = parseInt(match[MINUTE_GROUP]); + if (isNaN(minute)) { + minute = constants_1.zhStringToNumber(match[MINUTE_GROUP]); + } + } + } else if (hour > 100) { + minute = hour % 100; + hour = Math.floor(hour / 100); + } + if (minute >= 60) { + return null; + } + if (hour > 24) { + return null; + } + if (hour >= 12) { + meridiem = 1; + } + if (match[AM_PM_HOUR_GROUP]) { + if (hour > 12) + return null; + const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); + if (ampm == "a") { + meridiem = 0; + if (hour == 12) + hour = 0; + } + if (ampm == "p") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + if (!result.start.isCertain("meridiem")) { + if (meridiem == 0) { + result.start.imply("meridiem", 0); + if (result.start.get("hour") == 12) { + result.start.assign("hour", 0); + } + } else { + result.start.imply("meridiem", 1); + if (result.start.get("hour") != 12) { + result.start.assign("hour", result.start.get("hour") + 12); + } + } + } + } else if (match[ZH_AM_PM_HOUR_GROUP_1]) { + const zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1]; + const zhAMPM1 = zhAMPMString1[0]; + if (zhAMPM1 == "\u65E9") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM1 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_2]) { + const zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2]; + const zhAMPM2 = zhAMPMString2[0]; + if (zhAMPM2 == "\u4E0A" || zhAMPM2 == "\u65E9" || zhAMPM2 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM2 == "\u4E0B" || zhAMPM2 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } else if (match[ZH_AM_PM_HOUR_GROUP_3]) { + const zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3]; + const zhAMPM3 = zhAMPMString3[0]; + if (zhAMPM3 == "\u4E0A" || zhAMPM3 == "\u65E9" || zhAMPM3 == "\u51CC") { + meridiem = 0; + if (hour == 12) + hour = 0; + } else if (zhAMPM3 == "\u4E0B" || zhAMPM3 == "\u665A") { + meridiem = 1; + if (hour != 12) + hour += 12; + } + } + result.text = result.text + match[0]; + result.end.assign("hour", hour); + result.end.assign("minute", minute); + if (meridiem >= 0) { + result.end.assign("meridiem", meridiem); + } else { + const startAtPM = result.start.isCertain("meridiem") && result.start.get("meridiem") == 1; + if (startAtPM && result.start.get("hour") > hour) { + result.end.imply("meridiem", 0); + } else if (hour > 12) { + result.end.imply("meridiem", 1); + } + } + if (result.end.date().getTime() < result.start.date().getTime()) { + result.end.imply("day", result.end.get("day") + 1); + } + return result; + } + }; + exports.default = ZHHansTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansWeekdayParser.js +var require_ZHHansWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansWeekdayParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var constants_1 = require_constants8(); + var PATTERN = new RegExp("(?:\u661F\u671F|\u793C\u62DC|\u5468)(?" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")"); + var ZHHansWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const dayOfWeek = match.groups.weekday; + const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek]; + if (offset === void 0) + return null; + let startMoment = dayjs_1.default(context.refDate); + const startMomentFixed = false; + const refOffset = startMoment.day(); + if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset - 7); + } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { + startMoment = startMoment.day(offset + 7); + } else { + startMoment = startMoment.day(offset); + } + result.start.assign("weekday", offset); + if (startMomentFixed) { + result.start.assign("day", startMoment.date()); + result.start.assign("month", startMoment.month() + 1); + result.start.assign("year", startMoment.year()); + } else { + result.start.imply("day", startMoment.date()); + result.start.imply("month", startMoment.month() + 1); + result.start.imply("year", startMoment.year()); + } + return result; + } + }; + exports.default = ZHHansWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/refiners/ZHHansMergeDateRangeRefiner.js +var require_ZHHansMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/refiners/ZHHansMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var ZHHansMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(至|到|-|~|~|-|ー)\s*$/i; + } + }; + exports.default = ZHHansMergeDateRangeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/refiners/ZHHansMergeDateTimeRefiner.js +var require_ZHHansMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/refiners/ZHHansMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var ZHHansMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return /^\s*$/i; + } + }; + exports.default = ZHHansMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/zh/hans/index.js +var require_hans = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/hans/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = exports.hans = void 0; + var chrono_1 = require_chrono(); + var ExtractTimezoneOffsetRefiner_1 = __importDefault2(require_ExtractTimezoneOffsetRefiner()); + var configurations_1 = require_configurations(); + var ZHHansCasualDateParser_1 = __importDefault2(require_ZHHansCasualDateParser()); + var ZHHansDateParser_1 = __importDefault2(require_ZHHansDateParser()); + var ZHHansDeadlineFormatParser_1 = __importDefault2(require_ZHHansDeadlineFormatParser()); + var ZHHansRelationWeekdayParser_1 = __importDefault2(require_ZHHansRelationWeekdayParser()); + var ZHHansTimeExpressionParser_1 = __importDefault2(require_ZHHansTimeExpressionParser()); + var ZHHansWeekdayParser_1 = __importDefault2(require_ZHHansWeekdayParser()); + var ZHHansMergeDateRangeRefiner_1 = __importDefault2(require_ZHHansMergeDateRangeRefiner()); + var ZHHansMergeDateTimeRefiner_1 = __importDefault2(require_ZHHansMergeDateTimeRefiner()); + exports.hans = new chrono_1.Chrono(createCasualConfiguration()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration()); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate3(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate3; + function createCasualConfiguration() { + const option = createConfiguration(); + option.parsers.unshift(new ZHHansCasualDateParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration() { + const configuration = configurations_1.includeCommonConfiguration({ + parsers: [ + new ZHHansDateParser_1.default(), + new ZHHansRelationWeekdayParser_1.default(), + new ZHHansWeekdayParser_1.default(), + new ZHHansTimeExpressionParser_1.default(), + new ZHHansDeadlineFormatParser_1.default() + ], + refiners: [new ZHHansMergeDateRangeRefiner_1.default(), new ZHHansMergeDateTimeRefiner_1.default()] + }); + configuration.refiners = configuration.refiners.filter((refiner) => !(refiner instanceof ExtractTimezoneOffsetRefiner_1.default)); + return configuration; + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/locales/zh/index.js +var require_zh = __commonJS({ + "node_modules/chrono-node/dist/locales/zh/index.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __exportStar2 = exports && exports.__exportStar || function(m, exports2) { + for (var p in m) + if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p)) + __createBinding2(exports2, m, p); + }; + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.hans = void 0; + __exportStar2(require_hant(), exports); + exports.hans = __importStar2(require_hans()); + } +}); + +// node_modules/chrono-node/dist/locales/ru/constants.js +var require_constants9 = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/constants.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.FULL_MONTH_NAME_DICTIONARY = exports.WEEKDAY_DICTIONARY = exports.REGEX_PARTS = void 0; + var pattern_1 = require_pattern(); + var years_1 = require_years(); + exports.REGEX_PARTS = { + leftBoundary: "([^\\p{L}\\p{N}_]|^)", + rightBoundary: "(?=[^\\p{L}\\p{N}_]|$)", + flags: "iu" + }; + exports.WEEKDAY_DICTIONARY = { + \u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435: 0, + \u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u044F: 0, + \u0432\u0441\u043A: 0, + "\u0432\u0441\u043A.": 0, + \u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A: 1, + \u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A\u0430: 1, + \u043F\u043D: 1, + "\u043F\u043D.": 1, + \u0432\u0442\u043E\u0440\u043D\u0438\u043A: 2, + \u0432\u0442\u043E\u0440\u043D\u0438\u043A\u0430: 2, + \u0432\u0442: 2, + "\u0432\u0442.": 2, + \u0441\u0440\u0435\u0434\u0430: 3, + \u0441\u0440\u0435\u0434\u044B: 3, + \u0441\u0440\u0435\u0434\u0443: 3, + \u0441\u0440: 3, + "\u0441\u0440.": 3, + \u0447\u0435\u0442\u0432\u0435\u0440\u0433: 4, + \u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430: 4, + \u0447\u0442: 4, + "\u0447\u0442.": 4, + \u043F\u044F\u0442\u043D\u0438\u0446\u0430: 5, + \u043F\u044F\u0442\u043D\u0438\u0446\u0443: 5, + \u043F\u044F\u0442\u043D\u0438\u0446\u044B: 5, + \u043F\u0442: 5, + "\u043F\u0442.": 5, + \u0441\u0443\u0431\u0431\u043E\u0442\u0430: 6, + \u0441\u0443\u0431\u0431\u043E\u0442\u0443: 6, + \u0441\u0443\u0431\u0431\u043E\u0442\u044B: 6, + \u0441\u0431: 6, + "\u0441\u0431.": 6 + }; + exports.FULL_MONTH_NAME_DICTIONARY = { + \u044F\u043D\u0432\u0430\u0440\u044C: 1, + \u044F\u043D\u0432\u0430\u0440\u044F: 1, + \u044F\u043D\u0432\u0430\u0440\u0435: 1, + \u0444\u0435\u0432\u0440\u044F\u043B\u044C: 2, + \u0444\u0435\u0432\u0440\u044F\u043B\u044F: 2, + \u0444\u0435\u0432\u0440\u044F\u043B\u0435: 2, + \u043C\u0430\u0440\u0442: 3, + \u043C\u0430\u0440\u0442\u0430: 3, + \u043C\u0430\u0440\u0442\u0435: 3, + \u0430\u043F\u0440\u0435\u043B\u044C: 4, + \u0430\u043F\u0440\u0435\u043B\u044F: 4, + \u0430\u043F\u0440\u0435\u043B\u0435: 4, + \u043C\u0430\u0439: 5, + \u043C\u0430\u044F: 5, + \u043C\u0430\u0435: 5, + \u0438\u044E\u043D\u044C: 6, + \u0438\u044E\u043D\u044F: 6, + \u0438\u044E\u043D\u0435: 6, + \u0438\u044E\u043B\u044C: 7, + \u0438\u044E\u043B\u044F: 7, + \u0438\u044E\u043B\u0435: 7, + \u0430\u0432\u0433\u0443\u0441\u0442: 8, + \u0430\u0432\u0433\u0443\u0441\u0442\u0430: 8, + \u0430\u0432\u0433\u0443\u0441\u0442\u0435: 8, + \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C: 9, + \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044F: 9, + \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u0435: 9, + \u043E\u043A\u0442\u044F\u0431\u0440\u044C: 10, + \u043E\u043A\u0442\u044F\u0431\u0440\u044F: 10, + \u043E\u043A\u0442\u044F\u0431\u0440\u0435: 10, + \u043D\u043E\u044F\u0431\u0440\u044C: 11, + \u043D\u043E\u044F\u0431\u0440\u044F: 11, + \u043D\u043E\u044F\u0431\u0440\u0435: 11, + \u0434\u0435\u043A\u0430\u0431\u0440\u044C: 12, + \u0434\u0435\u043A\u0430\u0431\u0440\u044F: 12, + \u0434\u0435\u043A\u0430\u0431\u0440\u0435: 12 + }; + exports.MONTH_DICTIONARY = Object.assign(Object.assign({}, exports.FULL_MONTH_NAME_DICTIONARY), { \u044F\u043D\u0432: 1, "\u044F\u043D\u0432.": 1, \u0444\u0435\u0432: 2, "\u0444\u0435\u0432.": 2, \u043C\u0430\u0440: 3, "\u043C\u0430\u0440.": 3, \u0430\u043F\u0440: 4, "\u0430\u043F\u0440.": 4, \u0430\u0432\u0433: 8, "\u0430\u0432\u0433.": 8, \u0441\u0435\u043D: 9, "\u0441\u0435\u043D.": 9, \u043E\u043A\u0442: 10, "\u043E\u043A\u0442.": 10, \u043D\u043E\u044F: 11, "\u043D\u043E\u044F.": 11, \u0434\u0435\u043A: 12, "\u0434\u0435\u043A.": 12 }); + exports.INTEGER_WORD_DICTIONARY = { + \u043E\u0434\u0438\u043D: 1, + \u043E\u0434\u043D\u0430: 1, + \u043E\u0434\u043D\u043E\u0439: 1, + \u043E\u0434\u043D\u0443: 1, + \u0434\u0432\u0435: 2, + \u0434\u0432\u0430: 2, + \u0434\u0432\u0443\u0445: 2, + \u0442\u0440\u0438: 3, + \u0442\u0440\u0435\u0445: 3, + \u0442\u0440\u0451\u0445: 3, + \u0447\u0435\u0442\u044B\u0440\u0435: 4, + \u0447\u0435\u0442\u044B\u0440\u0435\u0445: 4, + \u0447\u0435\u0442\u044B\u0440\u0451\u0445: 4, + \u043F\u044F\u0442\u044C: 5, + \u043F\u044F\u0442\u0438: 5, + \u0448\u0435\u0441\u0442\u044C: 6, + \u0448\u0435\u0441\u0442\u0438: 6, + \u0441\u0435\u043C\u044C: 7, + \u0441\u0435\u043C\u0438: 7, + \u0432\u043E\u0441\u0435\u043C\u044C: 8, + \u0432\u043E\u0441\u0435\u043C\u044C\u043C\u0438: 8, + \u0434\u0435\u0432\u044F\u0442\u044C: 9, + \u0434\u0435\u0432\u044F\u0442\u0438: 9, + \u0434\u0435\u0441\u044F\u0442\u044C: 10, + \u0434\u0435\u0441\u044F\u0442\u0438: 10, + \u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u044C: 11, + \u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u0438: 11, + \u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u044C: 12, + \u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u0438: 12 + }; + exports.ORDINAL_WORD_DICTIONARY = { + \u043F\u0435\u0440\u0432\u043E\u0435: 1, + \u043F\u0435\u0440\u0432\u043E\u0433\u043E: 1, + \u0432\u0442\u043E\u0440\u043E\u0435: 2, + \u0432\u0442\u043E\u0440\u043E\u0433\u043E: 2, + \u0442\u0440\u0435\u0442\u044C\u0435: 3, + \u0442\u0440\u0435\u0442\u044C\u0435\u0433\u043E: 3, + \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0435: 4, + \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0433\u043E: 4, + \u043F\u044F\u0442\u043E\u0435: 5, + \u043F\u044F\u0442\u043E\u0433\u043E: 5, + \u0448\u0435\u0441\u0442\u043E\u0435: 6, + \u0448\u0435\u0441\u0442\u043E\u0433\u043E: 6, + \u0441\u0435\u0434\u044C\u043C\u043E\u0435: 7, + \u0441\u0435\u0434\u044C\u043C\u043E\u0433\u043E: 7, + \u0432\u043E\u0441\u044C\u043C\u043E\u0435: 8, + \u0432\u043E\u0441\u044C\u043C\u043E\u0433\u043E: 8, + \u0434\u0435\u0432\u044F\u0442\u043E\u0435: 9, + \u0434\u0435\u0432\u044F\u0442\u043E\u0433\u043E: 9, + \u0434\u0435\u0441\u044F\u0442\u043E\u0435: 10, + \u0434\u0435\u0441\u044F\u0442\u043E\u0433\u043E: 10, + \u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 11, + \u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 11, + \u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 12, + \u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 12, + \u0442\u0440\u0438\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 13, + \u0442\u0440\u0438\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 13, + \u0447\u0435\u0442\u044B\u0440\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 14, + \u0447\u0435\u0442\u044B\u0440\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 14, + \u043F\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 15, + \u043F\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 15, + \u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 16, + \u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 16, + \u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 17, + \u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 17, + \u0432\u043E\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 18, + \u0432\u043E\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 18, + \u0434\u0435\u0432\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 19, + \u0434\u0435\u0432\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 19, + \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 20, + \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 20, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435": 21, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0433\u043E": 21, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u0442\u043E\u0440\u043E\u0435": 22, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u0442\u043E\u0440\u043E\u0433\u043E": 22, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0442\u0440\u0435\u0442\u044C\u0435": 23, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0442\u0440\u0435\u0442\u044C\u0435\u0433\u043E": 23, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0435": 24, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0433\u043E": 24, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u044F\u0442\u043E\u0435": 25, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u044F\u0442\u043E\u0433\u043E": 25, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0448\u0435\u0441\u0442\u043E\u0435": 26, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0448\u0435\u0441\u0442\u043E\u0433\u043E": 26, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0441\u0435\u0434\u044C\u043C\u043E\u0435": 27, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0441\u0435\u0434\u044C\u043C\u043E\u0433\u043E": 27, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u043E\u0441\u044C\u043C\u043E\u0435": 28, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u043E\u0441\u044C\u043C\u043E\u0433\u043E": 28, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0434\u0435\u0432\u044F\u0442\u043E\u0435": 29, + "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0434\u0435\u0432\u044F\u0442\u043E\u0433\u043E": 29, + "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u043E\u0435": 30, + "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u043E\u0433\u043E": 30, + "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435": 31, + "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0433\u043E": 31 + }; + exports.TIME_UNIT_DICTIONARY = { + \u0441\u0435\u043A: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u0430: "second", + \u0441\u0435\u043A\u0443\u043D\u0434: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u044B: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u0443: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0430: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0438: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u0435\u043A: "second", + \u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0443: "second", + \u043C\u0438\u043D: "minute", + \u043C\u0438\u043D\u0443\u0442\u0430: "minute", + \u043C\u0438\u043D\u0443\u0442: "minute", + \u043C\u0438\u043D\u0443\u0442\u044B: "minute", + \u043C\u0438\u043D\u0443\u0442\u0443: "minute", + \u043C\u0438\u043D\u0443\u0442\u043E\u043A: "minute", + \u043C\u0438\u043D\u0443\u0442\u043A\u0438: "minute", + \u043C\u0438\u043D\u0443\u0442\u043A\u0443: "minute", + \u0447\u0430\u0441: "hour", + \u0447\u0430\u0441\u043E\u0432: "hour", + \u0447\u0430\u0441\u0430: "hour", + \u0447\u0430\u0441\u0443: "hour", + \u0447\u0430\u0441\u0438\u043A\u043E\u0432: "hour", + \u0447\u0430\u0441\u0438\u043A\u0430: "hour", + \u0447\u0430\u0441\u0438\u043A\u0435: "hour", + \u0447\u0430\u0441\u0438\u043A: "hour", + \u0434\u0435\u043D\u044C: "d", + \u0434\u043D\u044F: "d", + \u0434\u043D\u0435\u0439: "d", + \u0441\u0443\u0442\u043E\u043A: "d", + \u0441\u0443\u0442\u043A\u0438: "d", + \u043D\u0435\u0434\u0435\u043B\u044F: "week", + \u043D\u0435\u0434\u0435\u043B\u0435: "week", + \u043D\u0435\u0434\u0435\u043B\u0438: "week", + \u043D\u0435\u0434\u0435\u043B\u044E: "week", + \u043D\u0435\u0434\u0435\u043B\u044C: "week", + \u043D\u0435\u0434\u0435\u043B\u044C\u043A\u0435: "week", + \u043D\u0435\u0434\u0435\u043B\u044C\u043A\u0438: "week", + \u043D\u0435\u0434\u0435\u043B\u0435\u043A: "week", + \u043C\u0435\u0441\u044F\u0446: "month", + \u043C\u0435\u0441\u044F\u0446\u0435: "month", + \u043C\u0435\u0441\u044F\u0446\u0435\u0432: "month", + \u043C\u0435\u0441\u044F\u0446\u0430: "month", + \u043A\u0432\u0430\u0440\u0442\u0430\u043B: "quarter", + \u043A\u0432\u0430\u0440\u0442\u0430\u043B\u0435: "quarter", + \u043A\u0432\u0430\u0440\u0442\u0430\u043B\u043E\u0432: "quarter", + \u0433\u043E\u0434: "year", + \u0433\u043E\u0434\u0430: "year", + \u0433\u043E\u0434\u0443: "year", + \u0433\u043E\u0434\u043E\u0432: "year", + \u043B\u0435\u0442: "year", + \u0433\u043E\u0434\u0438\u043A: "year", + \u0433\u043E\u0434\u0438\u043A\u0430: "year", + \u0433\u043E\u0434\u0438\u043A\u043E\u0432: "year" + }; + exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|\u043F\u043E\u043B|\u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E|\u043F\u0430\u0440(?:\u044B|\u0443)|\\s{0,3})`; + function parseNumberPattern(match) { + const num = match.toLowerCase(); + if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { + return exports.INTEGER_WORD_DICTIONARY[num]; + } + if (num.match(/несколько/)) { + return 3; + } else if (num.match(/пол/)) { + return 0.5; + } else if (num.match(/пар/)) { + return 2; + } else if (num === "") { + return 1; + } + return parseFloat(num); + } + exports.parseNumberPattern = parseNumberPattern; + exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:\u0433\u043E|\u043E\u0433\u043E|\u0435|\u043E\u0435)?)`; + function parseOrdinalNumberPattern(match) { + let num = match.toLowerCase(); + if (exports.ORDINAL_WORD_DICTIONARY[num] !== void 0) { + return exports.ORDINAL_WORD_DICTIONARY[num]; + } + num = num.replace(/(?:st|nd|rd|th)$/i, ""); + return parseInt(num); + } + exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; + var year = "(?:\\s+(?:\u0433\u043E\u0434\u0443|\u0433\u043E\u0434\u0430|\u0433\u043E\u0434|\u0433|\u0433.))?"; + exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}${year}\\s*(?:\u043D.\u044D.|\u0434\u043E \u043D.\u044D.|\u043D. \u044D.|\u0434\u043E \u043D. \u044D.)|[1-2][0-9]{3}${year}|[5-9][0-9]${year})`; + function parseYear(match) { + if (/(год|года|г|г.)/i.test(match)) { + match = match.replace(/(год|года|г|г.)/i, ""); + } + if (/(до н.э.|до н. э.)/i.test(match)) { + match = match.replace(/(до н.э.|до н. э.)/i, ""); + return -parseInt(match); + } + if (/(н. э.|н.э.)/i.test(match)) { + match = match.replace(/(н. э.|н.э.)/i, ""); + return parseInt(match); + } + const rawYearNumber = parseInt(match); + return years_1.findMostLikelyADYear(rawYearNumber); + } + exports.parseYear = parseYear; + var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,3}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})`; + var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); + exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:\u043E\u043A\u043E\u043B\u043E|\u043F\u0440\u0438\u043C\u0435\u0440\u043D\u043E)\\s{0,3})?`, SINGLE_TIME_UNIT_PATTERN); + function parseTimeUnits(timeunitText) { + const fragments = {}; + let remainingText = timeunitText; + let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + while (match) { + collectDateTimeFragment(fragments, match); + remainingText = remainingText.substring(match[0].length).trim(); + match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); + } + return fragments; + } + exports.parseTimeUnits = parseTimeUnits; + function collectDateTimeFragment(fragments, match) { + const num = parseNumberPattern(match[1]); + const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; + fragments[unit] = num; + } + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitWithinFormatParser.js +var require_RUTimeUnitWithinFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitWithinFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants9(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = `(?:(?:\u043E\u043A\u043E\u043B\u043E|\u043F\u0440\u0438\u043C\u0435\u0440\u043D\u043E)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})${constants_1.REGEX_PARTS.rightBoundary}`; + var PATTERN_WITH_PREFIX = new RegExp(`(?:\u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0435|\u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0438)\\s*${PATTERN}`, constants_1.REGEX_PARTS.flags); + var PATTERN_WITHOUT_PREFIX = new RegExp(PATTERN, "i"); + var RUTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern(context) { + return context.option.forwardDate ? PATTERN_WITHOUT_PREFIX : PATTERN_WITH_PREFIX; + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + }; + exports.default = RUTimeUnitWithinFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUMonthNameLittleEndianParser.js +var require_RUMonthNameLittleEndianParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUMonthNameLittleEndianParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var years_1 = require_years(); + var constants_1 = require_constants9(); + var constants_2 = require_constants9(); + var constants_3 = require_constants9(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`(?:\u0441)?\\s*(${constants_3.ORDINAL_NUMBER_PATTERN})(?:\\s{0,3}(?:\u043F\u043E|-|\u2013|\u0434\u043E)?\\s{0,3}(${constants_3.ORDINAL_NUMBER_PATTERN}))?(?:-|\\/|\\s{0,3}(?:of)?\\s{0,3})(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|\\/|,?\\s{0,3})(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); + var DATE_GROUP = 1; + var DATE_TO_GROUP = 2; + var MONTH_NAME_GROUP = 3; + var YEAR_GROUP = 4; + var RUMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const result = context.createParsingResult(match.index, match[0]); + const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; + const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); + if (day > 31) { + match.index = match.index + match[DATE_GROUP].length; + return null; + } + result.start.assign("month", month); + result.start.assign("day", day); + if (match[YEAR_GROUP]) { + const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", yearNumber); + } else { + const year = years_1.findYearClosestToRef(context.refDate, day, month); + result.start.imply("year", year); + } + if (match[DATE_TO_GROUP]) { + const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); + result.end = result.start.clone(); + result.end.assign("day", endDate); + } + return result; + } + }; + exports.default = RUMonthNameLittleEndianParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUMonthNameParser.js +var require_RUMonthNameParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUMonthNameParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants9(); + var years_1 = require_years(); + var pattern_1 = require_pattern(); + var constants_2 = require_constants9(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var PATTERN = new RegExp(`((?:\u0432)\\s*)?(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${constants_2.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`, constants_1.REGEX_PARTS.flags); + var MONTH_NAME_GROUP = 2; + var YEAR_GROUP = 3; + var RUMonthNameParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const monthName = match[MONTH_NAME_GROUP].toLowerCase(); + if (match[0].length <= 3 && !constants_1.FULL_MONTH_NAME_DICTIONARY[monthName]) { + return null; + } + const result = context.createParsingResult(match.index, match.index + match[0].length); + result.start.imply("day", 1); + const month = constants_1.MONTH_DICTIONARY[monthName]; + result.start.assign("month", month); + if (match[YEAR_GROUP]) { + const year = constants_2.parseYear(match[YEAR_GROUP]); + result.start.assign("year", year); + } else { + const year = years_1.findYearClosestToRef(context.refDate, 1, month); + result.start.imply("year", year); + } + return result; + } + }; + exports.default = RUMonthNameParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUTimeExpressionParser.js +var require_RUTimeExpressionParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUTimeExpressionParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var index_1 = require_dist(); + var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); + var constants_1 = require_constants9(); + var RUTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { + constructor(strictMode) { + super(strictMode); + } + patternFlags() { + return constants_1.REGEX_PARTS.flags; + } + primaryPatternLeftBoundary() { + return `(^|\\s|T|(?:[^\\p{L}\\p{N}_]))`; + } + followingPhase() { + return `\\s*(?:\\-|\\\u2013|\\~|\\\u301C|\u0434\u043E|\u0438|\u043F\u043E|\\?)\\s*`; + } + primaryPrefix() { + return `(?:(?:\u0432|\u0441)\\s*)??`; + } + primarySuffix() { + return `(?:\\s*(?:\u0443\u0442\u0440\u0430|\u0432\u0435\u0447\u0435\u0440\u0430|\u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043B\u0443\u0434\u043D\u044F))?(?!\\/)${constants_1.REGEX_PARTS.rightBoundary}`; + } + extractPrimaryTimeComponents(context, match) { + const components = super.extractPrimaryTimeComponents(context, match); + if (components) { + if (match[0].endsWith("\u0432\u0435\u0447\u0435\u0440\u0430")) { + const hour = components.get("hour"); + if (hour >= 6 && hour < 12) { + components.assign("hour", components.get("hour") + 12); + components.assign("meridiem", index_1.Meridiem.PM); + } else if (hour < 6) { + components.assign("meridiem", index_1.Meridiem.AM); + } + } + if (match[0].endsWith("\u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043B\u0443\u0434\u043D\u044F")) { + components.assign("meridiem", index_1.Meridiem.PM); + const hour = components.get("hour"); + if (hour >= 0 && hour <= 6) { + components.assign("hour", components.get("hour") + 12); + } + } + if (match[0].endsWith("\u0443\u0442\u0440\u0430")) { + components.assign("meridiem", index_1.Meridiem.AM); + const hour = components.get("hour"); + if (hour < 12) { + components.assign("hour", components.get("hour")); + } + } + } + return components; + } + }; + exports.default = RUTimeExpressionParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitAgoFormatParser.js +var require_RUTimeUnitAgoFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitAgoFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants9(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp(`(${constants_1.TIME_UNITS_PATTERN})\\s{0,5}\u043D\u0430\u0437\u0430\u0434(?=(?:\\W|$))`, constants_1.REGEX_PARTS.flags); + var RUTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const timeUnits = constants_1.parseTimeUnits(match[1]); + const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); + return results_1.ParsingComponents.createRelativeFromReference(context.reference, outputTimeUnits); + } + }; + exports.default = RUTimeUnitAgoFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/refiners/RUMergeDateRangeRefiner.js +var require_RUMergeDateRangeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/refiners/RUMergeDateRangeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); + var xf = class extends AbstractMergeDateRangeRefiner_1.default { + patternBetween() { + return /^\s*(и до|и по|до|по|-)\s*$/i; + } + }; + exports.default = xf; + } +}); + +// node_modules/chrono-node/dist/locales/ru/refiners/RUMergeDateTimeRefiner.js +var require_RUMergeDateTimeRefiner = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/refiners/RUMergeDateTimeRefiner.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); + var RUMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { + patternBetween() { + return new RegExp(`^\\s*(T|\u0432|,|-)?\\s*$`); + } + }; + exports.default = RUMergeDateTimeRefiner; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUCasualDateParser.js +var require_RUCasualDateParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUCasualDateParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var references = __importStar2(require_casualReferences()); + var constants_1 = require_constants9(); + var PATTERN = new RegExp(`(?:\u0441|\u0441\u043E)?\\s*(\u0441\u0435\u0433\u043E\u0434\u043D\u044F|\u0432\u0447\u0435\u0440\u0430|\u0437\u0430\u0432\u0442\u0440\u0430|\u043F\u043E\u0441\u043B\u0435\u0437\u0430\u0432\u0442\u0440\u0430|\u043F\u043E\u0437\u0430\u0432\u0447\u0435\u0440\u0430)${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); + var RUCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern(context) { + return PATTERN; + } + innerExtract(context, match) { + const lowerText = match[1].toLowerCase(); + const component = context.createParsingComponents(); + switch (lowerText) { + case "\u0441\u0435\u0433\u043E\u0434\u043D\u044F": + return references.today(context.reference); + case "\u0432\u0447\u0435\u0440\u0430": + return references.yesterday(context.reference); + case "\u0437\u0430\u0432\u0442\u0440\u0430": + return references.tomorrow(context.reference); + case "\u043F\u043E\u0441\u043B\u0435\u0437\u0430\u0432\u0442\u0440\u0430": + return references.theDayAfter(context.reference, 2); + case "\u043F\u043E\u0437\u0430\u0432\u0447\u0435\u0440\u0430": + return references.theDayBefore(context.reference, 2); + } + return component; + } + }; + exports.default = RUCasualDateParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUCasualTimeParser.js +var require_RUCasualTimeParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUCasualTimeParser.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var references = __importStar2(require_casualReferences()); + var dayjs_1 = require_dayjs(); + var dayjs_2 = __importDefault2(require_dayjs_min()); + var constants_1 = require_constants9(); + var PATTERN = new RegExp(`(\u0441\u0435\u0439\u0447\u0430\u0441|\u043F\u0440\u043E\u0448\u043B\u044B\u043C\\s*\u0432\u0435\u0447\u0435\u0440\u043E\u043C|\u043F\u0440\u043E\u0448\u043B\u043E\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u0441\u0435\u0433\u043E\u0434\u043D\u044F\\s*\u043D\u043E\u0447\u044C\u044E|\u044D\u0442\u043E\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u043D\u043E\u0447\u044C\u044E|\u044D\u0442\u0438\u043C \u0443\u0442\u0440\u043E\u043C|\u0443\u0442\u0440\u043E\u043C|\u0443\u0442\u0440\u0430|\u0432\\s*\u043F\u043E\u043B\u0434\u0435\u043D\u044C|\u0432\u0435\u0447\u0435\u0440\u043E\u043C|\u0432\u0435\u0447\u0435\u0440\u0430|\u0432\\s*\u043F\u043E\u043B\u043D\u043E\u0447\u044C)${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); + var RUCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + let targetDate = dayjs_2.default(context.refDate); + const lowerText = match[0].toLowerCase(); + const component = context.createParsingComponents(); + if (lowerText === "\u0441\u0435\u0439\u0447\u0430\u0441") { + return references.now(context.reference); + } + if (lowerText === "\u0432\u0435\u0447\u0435\u0440\u043E\u043C" || lowerText === "\u0432\u0435\u0447\u0435\u0440\u0430") { + return references.evening(context.reference); + } + if (lowerText.endsWith("\u0443\u0442\u0440\u043E\u043C") || lowerText.endsWith("\u0443\u0442\u0440\u0430")) { + return references.morning(context.reference); + } + if (lowerText.match(/в\s*полдень/)) { + return references.noon(context.reference); + } + if (lowerText.match(/прошлой\s*ночью/)) { + return references.lastNight(context.reference); + } + if (lowerText.match(/прошлым\s*вечером/)) { + return references.yesterdayEvening(context.reference); + } + if (lowerText.match(/следующей\s*ночью/)) { + const daysToAdd = targetDate.hour() < 22 ? 1 : 2; + targetDate = targetDate.add(daysToAdd, "day"); + dayjs_1.assignSimilarDate(component, targetDate); + component.imply("hour", 0); + } + if (lowerText.match(/в\s*полночь/) || lowerText.endsWith("\u043D\u043E\u0447\u044C\u044E")) { + return references.midnight(context.reference); + } + return component; + } + }; + exports.default = RUCasualTimeParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUWeekdayParser.js +var require_RUWeekdayParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUWeekdayParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants9(); + var pattern_1 = require_pattern(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var weeks_1 = require_weeks(); + var PATTERN = new RegExp(`(?:(?:,|\\(|\uFF08)\\s*)?(?:\u0432\\s*?)?(?:(\u044D\u0442\u0443|\u044D\u0442\u043E\u0442|\u043F\u0440\u043E\u0448\u043B\u044B\u0439|\u043F\u0440\u043E\u0448\u043B\u0443\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:,|\\)|\uFF09))?(?:\\s*\u043D\u0430\\s*(\u044D\u0442\u043E\u0439|\u043F\u0440\u043E\u0448\u043B\u043E\u0439|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439)\\s*\u043D\u0435\u0434\u0435\u043B\u0435)?${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); + var PREFIX_GROUP = 1; + var WEEKDAY_GROUP = 2; + var POSTFIX_GROUP = 3; + var RUWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + innerPattern() { + return PATTERN; + } + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerExtract(context, match) { + const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); + const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; + const prefix = match[PREFIX_GROUP]; + const postfix = match[POSTFIX_GROUP]; + let modifierWord = prefix || postfix; + modifierWord = modifierWord || ""; + modifierWord = modifierWord.toLowerCase(); + let modifier = null; + if (modifierWord == "\u043F\u0440\u043E\u0448\u043B\u044B\u0439" || modifierWord == "\u043F\u0440\u043E\u0448\u043B\u0443\u044E" || modifierWord == "\u043F\u0440\u043E\u0448\u043B\u043E\u0439") { + modifier = "last"; + } else if (modifierWord == "\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439" || modifierWord == "\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E" || modifierWord == "\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439" || modifierWord == "\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E") { + modifier = "next"; + } else if (modifierWord == "\u044D\u0442\u043E\u0442" || modifierWord == "\u044D\u0442\u0443" || modifierWord == "\u044D\u0442\u043E\u0439") { + modifier = "this"; + } + const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); + return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); + } + }; + exports.default = RUWeekdayParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RURelativeDateFormatParser.js +var require_RURelativeDateFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RURelativeDateFormatParser.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants9(); + var results_1 = require_results(); + var dayjs_1 = __importDefault2(require_dayjs_min()); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var pattern_1 = require_pattern(); + var PATTERN = new RegExp(`(\u0432 \u043F\u0440\u043E\u0448\u043B\u043E\u043C|\u043D\u0430 \u043F\u0440\u043E\u0448\u043B\u043E\u0439|\u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439|\u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C|\u043D\u0430 \u044D\u0442\u043E\u0439|\u0432 \u044D\u0442\u043E\u043C)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); + var MODIFIER_WORD_GROUP = 1; + var RELATIVE_WORD_GROUP = 2; + var RURelativeDateFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const modifier = match[MODIFIER_WORD_GROUP].toLowerCase(); + const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase(); + const timeunit = constants_1.TIME_UNIT_DICTIONARY[unitWord]; + if (modifier == "\u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439" || modifier == "\u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C") { + const timeUnits = {}; + timeUnits[timeunit] = 1; + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + if (modifier == "\u0432 \u043F\u0440\u043E\u0448\u043B\u043E\u043C" || modifier == "\u043D\u0430 \u043F\u0440\u043E\u0448\u043B\u043E\u0439") { + const timeUnits = {}; + timeUnits[timeunit] = -1; + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + const components = context.createParsingComponents(); + let date = dayjs_1.default(context.reference.instant); + if (timeunit.match(/week/i)) { + date = date.add(-date.get("d"), "d"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.imply("year", date.year()); + } else if (timeunit.match(/month/i)) { + date = date.add(-date.date() + 1, "d"); + components.imply("day", date.date()); + components.assign("year", date.year()); + components.assign("month", date.month() + 1); + } else if (timeunit.match(/year/i)) { + date = date.add(-date.date() + 1, "d"); + date = date.add(-date.month(), "month"); + components.imply("day", date.date()); + components.imply("month", date.month() + 1); + components.assign("year", date.year()); + } + return components; + } + }; + exports.default = RURelativeDateFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.js +var require_RUTimeUnitCasualRelativeFormatParser = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var constants_1 = require_constants9(); + var results_1 = require_results(); + var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); + var timeunits_1 = require_timeunits(); + var PATTERN = new RegExp(`(\u044D\u0442\u0438|\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435|\u043F\u0440\u043E\u0448\u043B\u044B\u0435|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435|\u043F\u043E\u0441\u043B\u0435|\u0447\u0435\u0440\u0435\u0437|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); + var RUTimeUnitCasualRelativeFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { + patternLeftBoundary() { + return constants_1.REGEX_PARTS.leftBoundary; + } + innerPattern() { + return PATTERN; + } + innerExtract(context, match) { + const prefix = match[1].toLowerCase(); + let timeUnits = constants_1.parseTimeUnits(match[2]); + switch (prefix) { + case "\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435": + case "\u043F\u0440\u043E\u0448\u043B\u044B\u0435": + case "-": + timeUnits = timeunits_1.reverseTimeUnits(timeUnits); + break; + } + return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); + } + }; + exports.default = RUTimeUnitCasualRelativeFormatParser; + } +}); + +// node_modules/chrono-node/dist/locales/ru/index.js +var require_ru = __commonJS({ + "node_modules/chrono-node/dist/locales/ru/index.js"(exports) { + "use strict"; + var __importDefault2 = exports && exports.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; + var RUTimeUnitWithinFormatParser_1 = __importDefault2(require_RUTimeUnitWithinFormatParser()); + var RUMonthNameLittleEndianParser_1 = __importDefault2(require_RUMonthNameLittleEndianParser()); + var RUMonthNameParser_1 = __importDefault2(require_RUMonthNameParser()); + var RUTimeExpressionParser_1 = __importDefault2(require_RUTimeExpressionParser()); + var RUTimeUnitAgoFormatParser_1 = __importDefault2(require_RUTimeUnitAgoFormatParser()); + var RUMergeDateRangeRefiner_1 = __importDefault2(require_RUMergeDateRangeRefiner()); + var RUMergeDateTimeRefiner_1 = __importDefault2(require_RUMergeDateTimeRefiner()); + var configurations_1 = require_configurations(); + var RUCasualDateParser_1 = __importDefault2(require_RUCasualDateParser()); + var RUCasualTimeParser_1 = __importDefault2(require_RUCasualTimeParser()); + var RUWeekdayParser_1 = __importDefault2(require_RUWeekdayParser()); + var RURelativeDateFormatParser_1 = __importDefault2(require_RURelativeDateFormatParser()); + var chrono_1 = require_chrono(); + var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); + var RUTimeUnitCasualRelativeFormatParser_1 = __importDefault2(require_RUTimeUnitCasualRelativeFormatParser()); + exports.casual = new chrono_1.Chrono(createCasualConfiguration()); + exports.strict = new chrono_1.Chrono(createConfiguration(true)); + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate3(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate3; + function createCasualConfiguration() { + const option = createConfiguration(false); + option.parsers.unshift(new RUCasualDateParser_1.default()); + option.parsers.unshift(new RUCasualTimeParser_1.default()); + option.parsers.unshift(new RUMonthNameParser_1.default()); + option.parsers.unshift(new RURelativeDateFormatParser_1.default()); + option.parsers.unshift(new RUTimeUnitCasualRelativeFormatParser_1.default()); + return option; + } + exports.createCasualConfiguration = createCasualConfiguration; + function createConfiguration(strictMode = true) { + return configurations_1.includeCommonConfiguration({ + parsers: [ + new SlashDateFormatParser_1.default(true), + new RUTimeUnitWithinFormatParser_1.default(), + new RUMonthNameLittleEndianParser_1.default(), + new RUWeekdayParser_1.default(), + new RUTimeExpressionParser_1.default(strictMode), + new RUTimeUnitAgoFormatParser_1.default() + ], + refiners: [new RUMergeDateTimeRefiner_1.default(), new RUMergeDateRangeRefiner_1.default()] + }, strictMode); + } + exports.createConfiguration = createConfiguration; + } +}); + +// node_modules/chrono-node/dist/index.js +var require_dist = __commonJS({ + "node_modules/chrono-node/dist/index.js"(exports) { + "use strict"; + var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar2 = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding2(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parseDate = exports.parse = exports.casual = exports.strict = exports.ru = exports.zh = exports.nl = exports.pt = exports.ja = exports.fr = exports.de = exports.Meridiem = exports.Chrono = exports.en = void 0; + var en = __importStar2(require_en()); + exports.en = en; + var chrono_1 = require_chrono(); + Object.defineProperty(exports, "Chrono", { enumerable: true, get: function() { + return chrono_1.Chrono; + } }); + var Meridiem; + (function(Meridiem2) { + Meridiem2[Meridiem2["AM"] = 0] = "AM"; + Meridiem2[Meridiem2["PM"] = 1] = "PM"; + })(Meridiem = exports.Meridiem || (exports.Meridiem = {})); + var de = __importStar2(require_de()); + exports.de = de; + var fr = __importStar2(require_fr()); + exports.fr = fr; + var ja = __importStar2(require_ja()); + exports.ja = ja; + var pt = __importStar2(require_pt()); + exports.pt = pt; + var nl = __importStar2(require_nl()); + exports.nl = nl; + var zh = __importStar2(require_zh()); + exports.zh = zh; + var ru = __importStar2(require_ru()); + exports.ru = ru; + exports.strict = en.strict; + exports.casual = en.casual; + function parse(text2, ref, option) { + return exports.casual.parse(text2, ref, option); + } + exports.parse = parse; + function parseDate3(text2, ref, option) { + return exports.casual.parseDate(text2, ref, option); + } + exports.parseDate = parseDate3; + } +}); + +// node_modules/boon-js/lib/types.js +var require_types = __commonJS({ + "node_modules/boon-js/lib/types.js"(exports) { + "use strict"; + exports.__esModule = true; + var Operators; + (function(Operators2) { + Operators2["AND"] = "AND"; + Operators2["OR"] = "OR"; + Operators2["XOR"] = "XOR"; + Operators2["NOT"] = "NOT"; + })(Operators = exports.Operators || (exports.Operators = {})); + var StructuralCharacters; + (function(StructuralCharacters2) { + StructuralCharacters2["OPEN_PARENTHESIS"] = "("; + StructuralCharacters2["CLOSE_PARENTHESIS"] = ")"; + })(StructuralCharacters = exports.StructuralCharacters || (exports.StructuralCharacters = {})); + var Tokens; + (function(Tokens2) { + Tokens2["IDENTIFIER"] = "IDENTIFIER"; + Tokens2["OPERATOR"] = "OPERATOR"; + Tokens2["STRUCTURAL_CHARACTER"] = "STRUCTURAL_CHARACTER"; + Tokens2["EOF"] = "EOF"; + Tokens2["COMMENT"] = "COMMENT"; + })(Tokens = exports.Tokens || (exports.Tokens = {})); + } +}); + +// node_modules/boon-js/lib/parse/const.js +var require_const = __commonJS({ + "node_modules/boon-js/lib/parse/const.js"(exports) { + "use strict"; + exports.__esModule = true; + var types_1 = require_types(); + exports.OPERATOR_PRECEDENCE = { + NOT: 0, + XOR: 1, + AND: 2, + OR: 3 + }; + exports.VALID_TOKENS = { + identifierOnly: [ + { name: types_1.Tokens.IDENTIFIER }, + { + name: types_1.Tokens.STRUCTURAL_CHARACTER, + value: types_1.StructuralCharacters.OPEN_PARENTHESIS + } + ], + identifierOrNot: [ + { name: types_1.Tokens.IDENTIFIER }, + { + name: types_1.Tokens.STRUCTURAL_CHARACTER, + value: types_1.StructuralCharacters.OPEN_PARENTHESIS + }, + { name: types_1.Tokens.OPERATOR, value: types_1.Operators.NOT } + ], + binaryOperator: [ + { name: types_1.Tokens.OPERATOR, value: types_1.Operators.AND }, + { name: types_1.Tokens.OPERATOR, value: types_1.Operators.OR }, + { name: types_1.Tokens.OPERATOR, value: types_1.Operators.XOR } + ], + binaryOperatorOrClose: [ + { name: types_1.Tokens.OPERATOR, value: types_1.Operators.AND }, + { name: types_1.Tokens.OPERATOR, value: types_1.Operators.OR }, + { name: types_1.Tokens.OPERATOR, value: types_1.Operators.XOR }, + { + name: types_1.Tokens.STRUCTURAL_CHARACTER, + value: types_1.StructuralCharacters.CLOSE_PARENTHESIS + } + ] + }; + } +}); + +// node_modules/boon-js/lib/lex/const.js +var require_const2 = __commonJS({ + "node_modules/boon-js/lib/lex/const.js"(exports) { + "use strict"; + exports.__esModule = true; + var types_1 = require_types(); + exports.STRUCTURAL_CHARACTERS = { + "(": types_1.StructuralCharacters.OPEN_PARENTHESIS, + ")": types_1.StructuralCharacters.CLOSE_PARENTHESIS + }; + exports.OPERATORS = { + AND: types_1.Operators.AND, + OR: types_1.Operators.OR, + XOR: types_1.Operators.XOR, + NOT: types_1.Operators.NOT + }; + exports.SEPARATORS = new Set([ + 32, + 9, + 10, + 13 + ].map(function(separator) { + return String.fromCodePoint(separator); + })); + exports.QUOTED_IDENTIFIER_DELIMITER = String.fromCodePoint(34); + exports.COMMENT_DELIMITER = String.fromCodePoint(35); + exports.EOL = String.fromCodePoint(10); + exports.ESCAPE_CHARACTER = String.fromCodePoint(92); + } +}); + +// node_modules/boon-js/lib/lex/utils.js +var require_utils = __commonJS({ + "node_modules/boon-js/lib/lex/utils.js"(exports) { + "use strict"; + var __assign2 = exports && exports.__assign || function() { + __assign2 = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign2.apply(this, arguments); + }; + exports.__esModule = true; + var types_1 = require_types(); + var const_1 = require_const2(); + exports.createResult = function(name, value, remainingString) { + return { + token: __assign2({ name }, value !== null ? { value } : {}), + remainingString + }; + }; + exports.getComment = function(expression) { + var tokenEnd = expression.length; + for (var i = 0; i < expression.length; i += 1) { + var letter = expression[i]; + if (letter === const_1.EOL) { + tokenEnd = i; + break; + } + } + return exports.createResult(types_1.Tokens.COMMENT, expression.slice(0, tokenEnd), expression.slice(tokenEnd + 1)); + }; + exports.getQuotedIdentifier = function(expression) { + var escapeQuotation = false; + var value = ""; + var tokenEnd = null; + for (var i = 0; i < expression.length; i += 1) { + var char = expression[i]; + if (tokenEnd === null) { + if (char === const_1.QUOTED_IDENTIFIER_DELIMITER) { + if (escapeQuotation) { + value = value.slice(-1) + const_1.QUOTED_IDENTIFIER_DELIMITER; + } else { + tokenEnd = i; + } + } else { + if (char === const_1.ESCAPE_CHARACTER) { + escapeQuotation = true; + } else { + escapeQuotation = false; + } + value = value += char; + } + } else { + if (!const_1.SEPARATORS.has(char) && !const_1.STRUCTURAL_CHARACTERS[char]) { + throw new Error("Unexpected character: " + char + " Expected ) character or separator"); + } + break; + } + } + if (tokenEnd === null) { + throw new Error("Unexpected end of expression: expected " + const_1.QUOTED_IDENTIFIER_DELIMITER + " character"); + } + return exports.createResult(types_1.Tokens.IDENTIFIER, value, expression.slice(tokenEnd + 1)); + }; + } +}); + +// node_modules/boon-js/lib/lex/lex.js +var require_lex = __commonJS({ + "node_modules/boon-js/lib/lex/lex.js"(exports) { + "use strict"; + exports.__esModule = true; + var types_1 = require_types(); + var const_1 = require_const2(); + var utils_1 = require_utils(); + exports.lex = function(expression) { + var tokenStart = null; + var tokenEnd = null; + var delimitingCharacter = null; + for (var i = 0; i < expression.length; i += 1) { + var char = expression[i]; + if (tokenStart === null) { + if (!const_1.SEPARATORS.has(char)) { + var structuralChar = const_1.STRUCTURAL_CHARACTERS[char]; + if (structuralChar) { + var nextChar = expression[i + 1]; + if (structuralChar === types_1.StructuralCharacters.CLOSE_PARENTHESIS && nextChar && !const_1.SEPARATORS.has(nextChar) && nextChar !== types_1.StructuralCharacters.CLOSE_PARENTHESIS) { + throw new Error("Unexpected character: " + nextChar + ". A closing parenthesis should be followed by another closing parenthesis or whitespace"); + } + return utils_1.createResult(types_1.Tokens.STRUCTURAL_CHARACTER, const_1.STRUCTURAL_CHARACTERS[char], expression.slice(i + 1)); + } + if (char === const_1.QUOTED_IDENTIFIER_DELIMITER) { + return utils_1.getQuotedIdentifier(expression.slice(i + 1)); + } + if (char === const_1.COMMENT_DELIMITER) { + return utils_1.getComment(expression.slice(i + 1)); + } + tokenStart = i; + } + } else { + if (const_1.SEPARATORS.has(char) || const_1.STRUCTURAL_CHARACTERS[char]) { + tokenEnd = i; + delimitingCharacter = char; + break; + } else { + if (char === const_1.QUOTED_IDENTIFIER_DELIMITER || char === const_1.COMMENT_DELIMITER) { + throw new Error("Unexpected character: " + char); + } + } + } + } + if (tokenStart !== null) { + tokenEnd = tokenEnd !== null && tokenEnd !== void 0 ? tokenEnd : expression.length; + var value = expression.slice(tokenStart, tokenEnd); + var remainingString = expression.slice(tokenEnd); + if (const_1.OPERATORS[value]) { + if (delimitingCharacter && !const_1.SEPARATORS.has(delimitingCharacter)) { + throw new Error("Unexpected character: " + delimitingCharacter + ". Operators should be separated using whitespace"); + } + return utils_1.createResult(types_1.Tokens.OPERATOR, const_1.OPERATORS[value], remainingString); + } else { + return utils_1.createResult(types_1.Tokens.IDENTIFIER, value, remainingString); + } + } + return utils_1.createResult(types_1.Tokens.EOF, null, ""); + }; + } +}); + +// node_modules/boon-js/lib/parse/utils.js +var require_utils2 = __commonJS({ + "node_modules/boon-js/lib/parse/utils.js"(exports) { + "use strict"; + var __spreadArrays2 = exports && exports.__spreadArrays || function() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + }; + exports.__esModule = true; + var lex_1 = require_lex(); + var types_1 = require_types(); + var const_1 = require_const(); + exports.newTokenGenerator = function(expression) { + var remainingExpression = expression; + return function(validTokens, endIsValid) { + if (endIsValid === void 0) { + endIsValid = false; + } + while (true) { + var _a = lex_1.lex(remainingExpression), token = _a.token, remainingString = _a.remainingString; + remainingExpression = remainingString; + if (token.name !== types_1.Tokens.COMMENT) { + exports.validateToken(token, validTokens, endIsValid); + return token; + } + } + }; + }; + exports.getValue = function(getNextToken, parser) { + var nextToken = getNextToken(const_1.VALID_TOKENS.identifierOrNot); + var negatedValue = nextToken.value === types_1.Operators.NOT; + if (negatedValue) { + nextToken = getNextToken(const_1.VALID_TOKENS.identifierOnly); + } + var value = nextToken.name === types_1.Tokens.STRUCTURAL_CHARACTER ? parser(getNextToken, true) : [nextToken]; + return negatedValue ? __spreadArrays2(value, [{ name: types_1.Tokens.OPERATOR, value: types_1.Operators.NOT }]) : value; + }; + exports.previousOperatorTakesPrecedent = function(previousOperator, nextOperator) { + return const_1.OPERATOR_PRECEDENCE[previousOperator] <= const_1.OPERATOR_PRECEDENCE[nextOperator]; + }; + exports.validateToken = function(token, validTokens, endIsValid) { + if (endIsValid === void 0) { + endIsValid = false; + } + if (token.name === types_1.Tokens.EOF) { + if (endIsValid) { + return; + } + throw new Error("Unexpected end of expression"); + } + for (var _i = 0, validTokens_1 = validTokens; _i < validTokens_1.length; _i++) { + var validToken = validTokens_1[_i]; + if (validToken.name === token.name) { + if (!validToken.value || validToken.value === token.value) { + return; + } + } + } + throw new TypeError("Invalid token"); + }; + } +}); + +// node_modules/boon-js/lib/parse/parse.js +var require_parse = __commonJS({ + "node_modules/boon-js/lib/parse/parse.js"(exports) { + "use strict"; + var __spreadArrays2 = exports && exports.__spreadArrays || function() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + }; + exports.__esModule = true; + var types_1 = require_types(); + var const_1 = require_const(); + var utils_1 = require_utils2(); + exports.parse = function(expression) { + if (typeof expression !== "string") { + throw new Error("Expected string but received " + typeof expression); + } + var getNextToken = utils_1.newTokenGenerator(expression); + return parseInternal(getNextToken); + }; + var parseInternal = function(getNextToken, nested) { + if (nested === void 0) { + nested = false; + } + var output = __spreadArrays2(utils_1.getValue(getNextToken, parseInternal)); + var operators = []; + while (true) { + var validTokens = nested ? const_1.VALID_TOKENS.binaryOperatorOrClose : const_1.VALID_TOKENS.binaryOperator; + var nextToken = getNextToken(validTokens, !nested); + if (nextToken.name === types_1.Tokens.EOF || nextToken.name === types_1.Tokens.STRUCTURAL_CHARACTER) { + return __spreadArrays2(output, __spreadArrays2(operators).reverse()); + } + while (operators.length) { + var previousOperator = operators[operators.length - 1] || null; + if (previousOperator && utils_1.previousOperatorTakesPrecedent(previousOperator.value, nextToken.value)) { + output = __spreadArrays2(output, [previousOperator]); + operators = operators.slice(0, -1); + } else { + break; + } + } + operators = __spreadArrays2(operators, [nextToken]); + output = __spreadArrays2(output, utils_1.getValue(getNextToken, parseInternal)); + } + }; + } +}); + +// node_modules/boon-js/lib/evaluate/utils.js +var require_utils3 = __commonJS({ + "node_modules/boon-js/lib/evaluate/utils.js"(exports) { + "use strict"; + exports.__esModule = true; + var types_1 = require_types(); + exports.andUtil = function(left, right) { + return left && right; + }; + exports.orUtil = function(left, right) { + return left || right; + }; + exports.xorUtil = function(left, right) { + return !(left === right); + }; + exports.notUtil = function(identifier) { + return !identifier; + }; + exports.isIdentifier = function(_a) { + var name = _a.name, value = _a.value; + return name === types_1.Tokens.IDENTIFIER && typeof value === "string"; + }; + exports.isOperator = function(_a) { + var name = _a.name, value = _a.value; + return name === types_1.Tokens.OPERATOR && typeof value === "string"; + }; + exports.throwInvalidExpression = function(message) { + throw new TypeError("Invalid postfix expression: " + message); + }; + } +}); + +// node_modules/boon-js/lib/evaluate/const.js +var require_const3 = __commonJS({ + "node_modules/boon-js/lib/evaluate/const.js"(exports) { + "use strict"; + var _a; + exports.__esModule = true; + var types_1 = require_types(); + var utils_1 = require_utils3(); + exports.OPERATOR_MAP = (_a = {}, _a[types_1.Operators.AND] = utils_1.andUtil, _a[types_1.Operators.OR] = utils_1.orUtil, _a[types_1.Operators.XOR] = utils_1.xorUtil, _a); + } +}); + +// node_modules/boon-js/lib/evaluate/evaluate.js +var require_evaluate = __commonJS({ + "node_modules/boon-js/lib/evaluate/evaluate.js"(exports) { + "use strict"; + var __spreadArrays2 = exports && exports.__spreadArrays || function() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + }; + exports.__esModule = true; + var parse_1 = require_parse(); + var types_1 = require_types(); + var const_1 = require_const3(); + var utils_1 = require_utils3(); + exports.getEvaluator = function(expression) { + var parsedExpression = parse_1.parse(expression); + return function(booleanMap) { + return exports.evaluate(parsedExpression, booleanMap); + }; + }; + exports.evaluate = function(expression, booleanMap) { + if (!Array.isArray(expression)) { + throw new Error(expression + " should be an array. evaluate takes in a parsed expression. Use in combination with parse or use getEvaluator"); + } + var evaluatedExpression = expression.reduce(function(stack, token, i) { + if (!(token && (utils_1.isIdentifier(token) || utils_1.isOperator(token)))) { + throw new Error("Invalid token: " + token + ". Found in parsed expression at index " + i); + } + if (token.name === types_1.Tokens.IDENTIFIER) { + return __spreadArrays2(stack, [Boolean(booleanMap[token.value])]); + } + var secondLastItem = stack[stack.length - 2]; + var lastItem = stack[stack.length - 1]; + if (token.value === types_1.Operators.NOT) { + if (lastItem === void 0) { + utils_1.throwInvalidExpression("missing identifier"); + } + return __spreadArrays2(stack.slice(0, -1), [utils_1.notUtil(lastItem)]); + } + if (lastItem === void 0 || secondLastItem === void 0) { + utils_1.throwInvalidExpression("missing identifier"); + } + var operatorUtil = const_1.OPERATOR_MAP[token.value]; + if (!operatorUtil) { + utils_1.throwInvalidExpression("unknown operator"); + } + return __spreadArrays2(stack.slice(0, -2), [operatorUtil(secondLastItem, lastItem)]); + }, []); + if (evaluatedExpression.length !== 1) { + utils_1.throwInvalidExpression("too many identifiers after evaluation"); + } + return evaluatedExpression[0]; + }; + } +}); + +// node_modules/boon-js/lib/index.js +var require_lib = __commonJS({ + "node_modules/boon-js/lib/index.js"(exports) { + "use strict"; + exports.__esModule = true; + var evaluate_1 = require_evaluate(); + exports.getEvaluator = evaluate_1.getEvaluator; + exports.evaluate = evaluate_1.evaluate; + var parse_1 = require_parse(); + exports.parse = parse_1.parse; + } +}); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => TasksPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian12 = require("obsidian"); + +// src/Cache.ts +var import_obsidian3 = require("obsidian"); + +// node_modules/async-mutex/index.mjs +var E_TIMEOUT = new Error("timeout while waiting for mutex to become available"); +var E_ALREADY_LOCKED = new Error("mutex already locked"); +var E_CANCELED = new Error("request for lock canceled"); +var __awaiter$2 = 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()); + }); +}; +var Semaphore = class { + constructor(_maxConcurrency, _cancelError = E_CANCELED) { + this._maxConcurrency = _maxConcurrency; + this._cancelError = _cancelError; + this._queue = []; + this._waiters = []; + if (_maxConcurrency <= 0) { + throw new Error("semaphore must be initialized to a positive value"); + } + this._value = _maxConcurrency; + } + acquire() { + const locked = this.isLocked(); + const ticketPromise = new Promise((resolve, reject) => this._queue.push({ resolve, reject })); + if (!locked) + this._dispatch(); + return ticketPromise; + } + runExclusive(callback) { + return __awaiter$2(this, void 0, void 0, function* () { + const [value, release] = yield this.acquire(); + try { + return yield callback(value); + } finally { + release(); + } + }); + } + waitForUnlock() { + return __awaiter$2(this, void 0, void 0, function* () { + if (!this.isLocked()) { + return Promise.resolve(); + } + const waitPromise = new Promise((resolve) => this._waiters.push({ resolve })); + return waitPromise; + }); + } + isLocked() { + return this._value <= 0; + } + release() { + if (this._maxConcurrency > 1) { + throw new Error("this method is unavailable on semaphores with concurrency > 1; use the scoped release returned by acquire instead"); + } + if (this._currentReleaser) { + const releaser = this._currentReleaser; + this._currentReleaser = void 0; + releaser(); + } + } + cancel() { + this._queue.forEach((ticket) => ticket.reject(this._cancelError)); + this._queue = []; + } + _dispatch() { + const nextTicket = this._queue.shift(); + if (!nextTicket) + return; + let released = false; + this._currentReleaser = () => { + if (released) + return; + released = true; + this._value++; + this._resolveWaiters(); + this._dispatch(); + }; + nextTicket.resolve([this._value--, this._currentReleaser]); + } + _resolveWaiters() { + this._waiters.forEach((waiter) => waiter.resolve()); + this._waiters = []; + } +}; +var __awaiter$1 = 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()); + }); +}; +var Mutex = class { + constructor(cancelError) { + this._semaphore = new Semaphore(1, cancelError); + } + acquire() { + return __awaiter$1(this, void 0, void 0, function* () { + const [, releaser] = yield this._semaphore.acquire(); + return releaser; + }); + } + runExclusive(callback) { + return this._semaphore.runExclusive(() => callback()); + } + isLocked() { + return this._semaphore.isLocked(); + } + waitForUnlock() { + return this._semaphore.waitForUnlock(); + } + release() { + this._semaphore.release(); + } + cancel() { + return this._semaphore.cancel(); + } +}; + +// src/TaskLayout.ts +var LayoutOptions = class { + constructor() { + this.hideTaskCount = false; + this.hideBacklinks = false; + this.hidePriority = false; + this.hideStartDate = false; + this.hideScheduledDate = false; + this.hideDoneDate = false; + this.hideDueDate = false; + this.hideRecurrenceRule = false; + this.hideEditButton = false; + this.hideUrgency = true; + this.shortMode = false; + this.explainQuery = false; + } +}; +var TaskLayout = class { + constructor(options, components) { + this.defaultLayout = [ + "description", + "priority", + "recurrenceRule", + "startDate", + "scheduledDate", + "dueDate", + "doneDate", + "blockLink" + ]; + this.hiddenComponents = []; + this.specificClasses = []; + if (options) { + this.options = options; + } else { + this.options = new LayoutOptions(); + } + if (components) { + this.layoutComponents = components; + } else { + this.layoutComponents = this.defaultLayout; + } + this.layoutComponents = this.applyOptions(this.options); + } + applyOptions(layoutOptions) { + const removeIf = (taskComponents, shouldRemove, componentToRemove) => { + if (shouldRemove) { + this.specificClasses.push(`tasks-layout-hide-${componentToRemove}`); + this.hiddenComponents.push(componentToRemove); + return taskComponents.filter((element2) => element2 != componentToRemove); + } else { + return taskComponents; + } + }; + let newComponents = this.layoutComponents; + newComponents = removeIf(newComponents, layoutOptions.hidePriority, "priority"); + newComponents = removeIf(newComponents, layoutOptions.hideRecurrenceRule, "recurrenceRule"); + newComponents = removeIf(newComponents, layoutOptions.hideStartDate, "startDate"); + newComponents = removeIf(newComponents, layoutOptions.hideScheduledDate, "scheduledDate"); + newComponents = removeIf(newComponents, layoutOptions.hideDueDate, "dueDate"); + newComponents = removeIf(newComponents, layoutOptions.hideDoneDate, "doneDate"); + if (layoutOptions.shortMode) + this.specificClasses.push("tasks-layout-short-mode"); + return newComponents; + } +}; + +// node_modules/rrule/dist/esm/weekday.js +var ALL_WEEKDAYS = [ + "MO", + "TU", + "WE", + "TH", + "FR", + "SA", + "SU" +]; +var Weekday = function() { + function Weekday2(weekday, n) { + if (n === 0) + throw new Error("Can't create weekday with n == 0"); + this.weekday = weekday; + this.n = n; + } + Weekday2.fromStr = function(str) { + return new Weekday2(ALL_WEEKDAYS.indexOf(str)); + }; + Weekday2.prototype.nth = function(n) { + return this.n === n ? this : new Weekday2(this.weekday, n); + }; + Weekday2.prototype.equals = function(other) { + return this.weekday === other.weekday && this.n === other.n; + }; + Weekday2.prototype.toString = function() { + var s = ALL_WEEKDAYS[this.weekday]; + if (this.n) + s = (this.n > 0 ? "+" : "") + String(this.n) + s; + return s; + }; + Weekday2.prototype.getJsWeekday = function() { + return this.weekday === 6 ? 0 : this.weekday + 1; + }; + return Weekday2; +}(); + +// node_modules/rrule/dist/esm/helpers.js +var isPresent = function(value) { + return value !== null && value !== void 0; +}; +var isNumber = function(value) { + return typeof value === "number"; +}; +var isWeekdayStr = function(value) { + return typeof value === "string" && ALL_WEEKDAYS.includes(value); +}; +var isArray = Array.isArray; +var range = function(start, end) { + if (end === void 0) { + end = start; + } + if (arguments.length === 1) { + end = start; + start = 0; + } + var rang = []; + for (var i = start; i < end; i++) + rang.push(i); + return rang; +}; +var repeat = function(value, times) { + var i = 0; + var array = []; + if (isArray(value)) { + for (; i < times; i++) + array[i] = [].concat(value); + } else { + for (; i < times; i++) + array[i] = value; + } + return array; +}; +var toArray = function(item) { + if (isArray(item)) { + return item; + } + return [item]; +}; +function padStart(item, targetLength, padString) { + if (padString === void 0) { + padString = " "; + } + var str = String(item); + targetLength = targetLength >> 0; + if (str.length > targetLength) { + return String(str); + } + targetLength = targetLength - str.length; + if (targetLength > padString.length) { + padString += repeat(padString, targetLength / padString.length); + } + return padString.slice(0, targetLength) + String(str); +} +var split = function(str, sep, num) { + var splits = str.split(sep); + return num ? splits.slice(0, num).concat([splits.slice(num).join(sep)]) : splits; +}; +var pymod = function(a, b) { + var r = a % b; + return r * b < 0 ? r + b : r; +}; +var divmod = function(a, b) { + return { div: Math.floor(a / b), mod: pymod(a, b) }; +}; +var empty = function(obj) { + return !isPresent(obj) || obj.length === 0; +}; +var notEmpty = function(obj) { + return !empty(obj); +}; +var includes = function(arr, val) { + return notEmpty(arr) && arr.indexOf(val) !== -1; +}; + +// node_modules/rrule/dist/esm/dateutil.js +var dateutil; +(function(dateutil2) { + dateutil2.MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + dateutil2.ONE_DAY = 1e3 * 60 * 60 * 24; + dateutil2.MAXYEAR = 9999; + dateutil2.ORDINAL_BASE = new Date(Date.UTC(1970, 0, 1)); + dateutil2.PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5]; + dateutil2.getYearDay = function(date) { + var dateNoTime = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); + return Math.ceil((dateNoTime.valueOf() - new Date(date.getUTCFullYear(), 0, 1).valueOf()) / dateutil2.ONE_DAY) + 1; + }; + dateutil2.isLeapYear = function(year) { + return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0; + }; + dateutil2.isDate = function(value) { + return value instanceof Date; + }; + dateutil2.isValidDate = function(value) { + return dateutil2.isDate(value) && !isNaN(value.getTime()); + }; + dateutil2.tzOffset = function(date) { + return date.getTimezoneOffset() * 60 * 1e3; + }; + dateutil2.daysBetween = function(date1, date2) { + var date1ms = date1.getTime() - dateutil2.tzOffset(date1); + var date2ms = date2.getTime() - dateutil2.tzOffset(date2); + var differencems = date1ms - date2ms; + return Math.round(differencems / dateutil2.ONE_DAY); + }; + dateutil2.toOrdinal = function(date) { + return dateutil2.daysBetween(date, dateutil2.ORDINAL_BASE); + }; + dateutil2.fromOrdinal = function(ordinal) { + return new Date(dateutil2.ORDINAL_BASE.getTime() + ordinal * dateutil2.ONE_DAY); + }; + dateutil2.getMonthDays = function(date) { + var month = date.getUTCMonth(); + return month === 1 && dateutil2.isLeapYear(date.getUTCFullYear()) ? 29 : dateutil2.MONTH_DAYS[month]; + }; + dateutil2.getWeekday = function(date) { + return dateutil2.PY_WEEKDAYS[date.getUTCDay()]; + }; + dateutil2.monthRange = function(year, month) { + var date = new Date(Date.UTC(year, month, 1)); + return [dateutil2.getWeekday(date), dateutil2.getMonthDays(date)]; + }; + dateutil2.combine = function(date, time) { + time = time || date; + return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds())); + }; + dateutil2.clone = function(date) { + var dolly = new Date(date.getTime()); + return dolly; + }; + dateutil2.cloneDates = function(dates) { + var clones = []; + for (var i = 0; i < dates.length; i++) { + clones.push(dateutil2.clone(dates[i])); + } + return clones; + }; + dateutil2.sort = function(dates) { + dates.sort(function(a, b) { + return a.getTime() - b.getTime(); + }); + }; + dateutil2.timeToUntilString = function(time, utc) { + if (utc === void 0) { + utc = true; + } + var date = new Date(time); + return [ + padStart(date.getUTCFullYear().toString(), 4, "0"), + padStart(date.getUTCMonth() + 1, 2, "0"), + padStart(date.getUTCDate(), 2, "0"), + "T", + padStart(date.getUTCHours(), 2, "0"), + padStart(date.getUTCMinutes(), 2, "0"), + padStart(date.getUTCSeconds(), 2, "0"), + utc ? "Z" : "" + ].join(""); + }; + dateutil2.untilStringToDate = function(until) { + var re = /^(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2})Z?)?$/; + var bits = re.exec(until); + if (!bits) + throw new Error("Invalid UNTIL value: ".concat(until)); + return new Date(Date.UTC(parseInt(bits[1], 10), parseInt(bits[2], 10) - 1, parseInt(bits[3], 10), parseInt(bits[5], 10) || 0, parseInt(bits[6], 10) || 0, parseInt(bits[7], 10) || 0)); + }; +})(dateutil || (dateutil = {})); +var dateutil_default = dateutil; + +// node_modules/rrule/dist/esm/iterresult.js +var IterResult = function() { + function IterResult2(method, args) { + this.minDate = null; + this.maxDate = null; + this._result = []; + this.total = 0; + this.method = method; + this.args = args; + if (method === "between") { + this.maxDate = args.inc ? args.before : new Date(args.before.getTime() - 1); + this.minDate = args.inc ? args.after : new Date(args.after.getTime() + 1); + } else if (method === "before") { + this.maxDate = args.inc ? args.dt : new Date(args.dt.getTime() - 1); + } else if (method === "after") { + this.minDate = args.inc ? args.dt : new Date(args.dt.getTime() + 1); + } + } + IterResult2.prototype.accept = function(date) { + ++this.total; + var tooEarly = this.minDate && date < this.minDate; + var tooLate = this.maxDate && date > this.maxDate; + if (this.method === "between") { + if (tooEarly) + return true; + if (tooLate) + return false; + } else if (this.method === "before") { + if (tooLate) + return false; + } else if (this.method === "after") { + if (tooEarly) + return true; + this.add(date); + return false; + } + return this.add(date); + }; + IterResult2.prototype.add = function(date) { + this._result.push(date); + return true; + }; + IterResult2.prototype.getValue = function() { + var res = this._result; + switch (this.method) { + case "all": + case "between": + return res; + case "before": + case "after": + default: + return res.length ? res[res.length - 1] : null; + } + }; + IterResult2.prototype.clone = function() { + return new IterResult2(this.method, this.args); + }; + return IterResult2; +}(); +var iterresult_default = IterResult; + +// node_modules/tslib/modules/index.js +var import_tslib = __toESM(require_tslib(), 1); +var { + __extends, + __assign, + __rest, + __decorate, + __param, + __metadata, + __awaiter, + __generator, + __exportStar, + __createBinding, + __values, + __read, + __spread, + __spreadArrays, + __spreadArray, + __await, + __asyncGenerator, + __asyncDelegator, + __asyncValues, + __makeTemplateObject, + __importStar, + __importDefault, + __classPrivateFieldGet, + __classPrivateFieldSet, + __classPrivateFieldIn +} = import_tslib.default; + +// node_modules/rrule/dist/esm/callbackiterresult.js +var CallbackIterResult = function(_super) { + __extends(CallbackIterResult2, _super); + function CallbackIterResult2(method, args, iterator) { + var _this = _super.call(this, method, args) || this; + _this.iterator = iterator; + return _this; + } + CallbackIterResult2.prototype.add = function(date) { + if (this.iterator(date, this._result.length)) { + this._result.push(date); + return true; + } + return false; + }; + return CallbackIterResult2; +}(iterresult_default); +var callbackiterresult_default = CallbackIterResult; + +// node_modules/rrule/dist/esm/nlp/i18n.js +var ENGLISH = { + dayNames: [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" + ], + monthNames: [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" + ], + tokens: { + SKIP: /^[ \r\n\t]+|^\.$/, + number: /^[1-9][0-9]*/, + numberAsText: /^(one|two|three)/i, + every: /^every/i, + "day(s)": /^days?/i, + "weekday(s)": /^weekdays?/i, + "week(s)": /^weeks?/i, + "hour(s)": /^hours?/i, + "minute(s)": /^minutes?/i, + "month(s)": /^months?/i, + "year(s)": /^years?/i, + on: /^(on|in)/i, + at: /^(at)/i, + the: /^the/i, + first: /^first/i, + second: /^second/i, + third: /^third/i, + nth: /^([1-9][0-9]*)(\.|th|nd|rd|st)/i, + last: /^last/i, + for: /^for/i, + "time(s)": /^times?/i, + until: /^(un)?til/i, + monday: /^mo(n(day)?)?/i, + tuesday: /^tu(e(s(day)?)?)?/i, + wednesday: /^we(d(n(esday)?)?)?/i, + thursday: /^th(u(r(sday)?)?)?/i, + friday: /^fr(i(day)?)?/i, + saturday: /^sa(t(urday)?)?/i, + sunday: /^su(n(day)?)?/i, + january: /^jan(uary)?/i, + february: /^feb(ruary)?/i, + march: /^mar(ch)?/i, + april: /^apr(il)?/i, + may: /^may/i, + june: /^june?/i, + july: /^july?/i, + august: /^aug(ust)?/i, + september: /^sep(t(ember)?)?/i, + october: /^oct(ober)?/i, + november: /^nov(ember)?/i, + december: /^dec(ember)?/i, + comma: /^(,\s*|(and|or)\s*)+/i + } +}; +var i18n_default = ENGLISH; + +// node_modules/rrule/dist/esm/nlp/totext.js +var contains = function(arr, val) { + return arr.indexOf(val) !== -1; +}; +var defaultGetText = function(id) { + return id.toString(); +}; +var defaultDateFormatter = function(year, month, day) { + return "".concat(month, " ").concat(day, ", ").concat(year); +}; +var ToText = function() { + function ToText2(rrule, gettext, language, dateFormatter) { + if (gettext === void 0) { + gettext = defaultGetText; + } + if (language === void 0) { + language = i18n_default; + } + if (dateFormatter === void 0) { + dateFormatter = defaultDateFormatter; + } + this.text = []; + this.language = language || i18n_default; + this.gettext = gettext; + this.dateFormatter = dateFormatter; + this.rrule = rrule; + this.options = rrule.options; + this.origOptions = rrule.origOptions; + if (this.origOptions.bymonthday) { + var bymonthday = [].concat(this.options.bymonthday); + var bynmonthday = [].concat(this.options.bynmonthday); + bymonthday.sort(function(a, b) { + return a - b; + }); + bynmonthday.sort(function(a, b) { + return b - a; + }); + this.bymonthday = bymonthday.concat(bynmonthday); + if (!this.bymonthday.length) + this.bymonthday = null; + } + if (isPresent(this.origOptions.byweekday)) { + var byweekday = !isArray(this.origOptions.byweekday) ? [this.origOptions.byweekday] : this.origOptions.byweekday; + var days = String(byweekday); + this.byweekday = { + allWeeks: byweekday.filter(function(weekday) { + return !weekday.n; + }), + someWeeks: byweekday.filter(function(weekday) { + return Boolean(weekday.n); + }), + isWeekdays: days.indexOf("MO") !== -1 && days.indexOf("TU") !== -1 && days.indexOf("WE") !== -1 && days.indexOf("TH") !== -1 && days.indexOf("FR") !== -1 && days.indexOf("SA") === -1 && days.indexOf("SU") === -1, + isEveryDay: days.indexOf("MO") !== -1 && days.indexOf("TU") !== -1 && days.indexOf("WE") !== -1 && days.indexOf("TH") !== -1 && days.indexOf("FR") !== -1 && days.indexOf("SA") !== -1 && days.indexOf("SU") !== -1 + }; + var sortWeekDays = function(a, b) { + return a.weekday - b.weekday; + }; + this.byweekday.allWeeks.sort(sortWeekDays); + this.byweekday.someWeeks.sort(sortWeekDays); + if (!this.byweekday.allWeeks.length) + this.byweekday.allWeeks = null; + if (!this.byweekday.someWeeks.length) + this.byweekday.someWeeks = null; + } else { + this.byweekday = null; + } + } + ToText2.isFullyConvertible = function(rrule) { + var canConvert = true; + if (!(rrule.options.freq in ToText2.IMPLEMENTED)) + return false; + if (rrule.origOptions.until && rrule.origOptions.count) + return false; + for (var key in rrule.origOptions) { + if (contains(["dtstart", "wkst", "freq"], key)) + return true; + if (!contains(ToText2.IMPLEMENTED[rrule.options.freq], key)) + return false; + } + return canConvert; + }; + ToText2.prototype.isFullyConvertible = function() { + return ToText2.isFullyConvertible(this.rrule); + }; + ToText2.prototype.toString = function() { + var gettext = this.gettext; + if (!(this.options.freq in ToText2.IMPLEMENTED)) { + return gettext("RRule error: Unable to fully convert this rrule to text"); + } + this.text = [gettext("every")]; + this[RRule.FREQUENCIES[this.options.freq]](); + if (this.options.until) { + this.add(gettext("until")); + var until = this.options.until; + this.add(this.dateFormatter(until.getUTCFullYear(), this.language.monthNames[until.getUTCMonth()], until.getUTCDate())); + } else if (this.options.count) { + this.add(gettext("for")).add(this.options.count.toString()).add(this.plural(this.options.count) ? gettext("times") : gettext("time")); + } + if (!this.isFullyConvertible()) + this.add(gettext("(~ approximate)")); + return this.text.join(""); + }; + ToText2.prototype.HOURLY = function() { + var gettext = this.gettext; + if (this.options.interval !== 1) + this.add(this.options.interval.toString()); + this.add(this.plural(this.options.interval) ? gettext("hours") : gettext("hour")); + }; + ToText2.prototype.MINUTELY = function() { + var gettext = this.gettext; + if (this.options.interval !== 1) + this.add(this.options.interval.toString()); + this.add(this.plural(this.options.interval) ? gettext("minutes") : gettext("minute")); + }; + ToText2.prototype.DAILY = function() { + var gettext = this.gettext; + if (this.options.interval !== 1) + this.add(this.options.interval.toString()); + if (this.byweekday && this.byweekday.isWeekdays) { + this.add(this.plural(this.options.interval) ? gettext("weekdays") : gettext("weekday")); + } else { + this.add(this.plural(this.options.interval) ? gettext("days") : gettext("day")); + } + if (this.origOptions.bymonth) { + this.add(gettext("in")); + this._bymonth(); + } + if (this.bymonthday) { + this._bymonthday(); + } else if (this.byweekday) { + this._byweekday(); + } else if (this.origOptions.byhour) { + this._byhour(); + } + }; + ToText2.prototype.WEEKLY = function() { + var gettext = this.gettext; + if (this.options.interval !== 1) { + this.add(this.options.interval.toString()).add(this.plural(this.options.interval) ? gettext("weeks") : gettext("week")); + } + if (this.byweekday && this.byweekday.isWeekdays) { + if (this.options.interval === 1) { + this.add(this.plural(this.options.interval) ? gettext("weekdays") : gettext("weekday")); + } else { + this.add(gettext("on")).add(gettext("weekdays")); + } + } else if (this.byweekday && this.byweekday.isEveryDay) { + this.add(this.plural(this.options.interval) ? gettext("days") : gettext("day")); + } else { + if (this.options.interval === 1) + this.add(gettext("week")); + if (this.origOptions.bymonth) { + this.add(gettext("in")); + this._bymonth(); + } + if (this.bymonthday) { + this._bymonthday(); + } else if (this.byweekday) { + this._byweekday(); + } + } + }; + ToText2.prototype.MONTHLY = function() { + var gettext = this.gettext; + if (this.origOptions.bymonth) { + if (this.options.interval !== 1) { + this.add(this.options.interval.toString()).add(gettext("months")); + if (this.plural(this.options.interval)) + this.add(gettext("in")); + } else { + } + this._bymonth(); + } else { + if (this.options.interval !== 1) { + this.add(this.options.interval.toString()); + } + this.add(this.plural(this.options.interval) ? gettext("months") : gettext("month")); + } + if (this.bymonthday) { + this._bymonthday(); + } else if (this.byweekday && this.byweekday.isWeekdays) { + this.add(gettext("on")).add(gettext("weekdays")); + } else if (this.byweekday) { + this._byweekday(); + } + }; + ToText2.prototype.YEARLY = function() { + var gettext = this.gettext; + if (this.origOptions.bymonth) { + if (this.options.interval !== 1) { + this.add(this.options.interval.toString()); + this.add(gettext("years")); + } else { + } + this._bymonth(); + } else { + if (this.options.interval !== 1) { + this.add(this.options.interval.toString()); + } + this.add(this.plural(this.options.interval) ? gettext("years") : gettext("year")); + } + if (this.bymonthday) { + this._bymonthday(); + } else if (this.byweekday) { + this._byweekday(); + } + if (this.options.byyearday) { + this.add(gettext("on the")).add(this.list(this.options.byyearday, this.nth, gettext("and"))).add(gettext("day")); + } + if (this.options.byweekno) { + this.add(gettext("in")).add(this.plural(this.options.byweekno.length) ? gettext("weeks") : gettext("week")).add(this.list(this.options.byweekno, void 0, gettext("and"))); + } + }; + ToText2.prototype._bymonthday = function() { + var gettext = this.gettext; + if (this.byweekday && this.byweekday.allWeeks) { + this.add(gettext("on")).add(this.list(this.byweekday.allWeeks, this.weekdaytext, gettext("or"))).add(gettext("the")).add(this.list(this.bymonthday, this.nth, gettext("or"))); + } else { + this.add(gettext("on the")).add(this.list(this.bymonthday, this.nth, gettext("and"))); + } + }; + ToText2.prototype._byweekday = function() { + var gettext = this.gettext; + if (this.byweekday.allWeeks && !this.byweekday.isWeekdays) { + this.add(gettext("on")).add(this.list(this.byweekday.allWeeks, this.weekdaytext)); + } + if (this.byweekday.someWeeks) { + if (this.byweekday.allWeeks) + this.add(gettext("and")); + this.add(gettext("on the")).add(this.list(this.byweekday.someWeeks, this.weekdaytext, gettext("and"))); + } + }; + ToText2.prototype._byhour = function() { + var gettext = this.gettext; + this.add(gettext("at")).add(this.list(this.origOptions.byhour, void 0, gettext("and"))); + }; + ToText2.prototype._bymonth = function() { + this.add(this.list(this.options.bymonth, this.monthtext, this.gettext("and"))); + }; + ToText2.prototype.nth = function(n) { + n = parseInt(n.toString(), 10); + var nth; + var gettext = this.gettext; + if (n === -1) + return gettext("last"); + var npos = Math.abs(n); + switch (npos) { + case 1: + case 21: + case 31: + nth = npos + gettext("st"); + break; + case 2: + case 22: + nth = npos + gettext("nd"); + break; + case 3: + case 23: + nth = npos + gettext("rd"); + break; + default: + nth = npos + gettext("th"); + } + return n < 0 ? nth + " " + gettext("last") : nth; + }; + ToText2.prototype.monthtext = function(m) { + return this.language.monthNames[m - 1]; + }; + ToText2.prototype.weekdaytext = function(wday) { + var weekday = isNumber(wday) ? (wday + 1) % 7 : wday.getJsWeekday(); + return (wday.n ? this.nth(wday.n) + " " : "") + this.language.dayNames[weekday]; + }; + ToText2.prototype.plural = function(n) { + return n % 100 !== 1; + }; + ToText2.prototype.add = function(s) { + this.text.push(" "); + this.text.push(s); + return this; + }; + ToText2.prototype.list = function(arr, callback, finalDelim, delim) { + var _this = this; + if (delim === void 0) { + delim = ","; + } + if (!isArray(arr)) { + arr = [arr]; + } + var delimJoin = function(array, delimiter, finalDelimiter) { + var list = ""; + for (var i = 0; i < array.length; i++) { + if (i !== 0) { + if (i === array.length - 1) { + list += " " + finalDelimiter + " "; + } else { + list += delimiter + " "; + } + } + list += array[i]; + } + return list; + }; + callback = callback || function(o) { + return o.toString(); + }; + var realCallback = function(arg) { + return callback && callback.call(_this, arg); + }; + if (finalDelim) { + return delimJoin(arr.map(realCallback), delim, finalDelim); + } else { + return arr.map(realCallback).join(delim + " "); + } + }; + return ToText2; +}(); +var totext_default = ToText; + +// node_modules/rrule/dist/esm/nlp/parsetext.js +var Parser = function() { + function Parser2(rules) { + this.done = true; + this.rules = rules; + } + Parser2.prototype.start = function(text2) { + this.text = text2; + this.done = false; + return this.nextSymbol(); + }; + Parser2.prototype.isDone = function() { + return this.done && this.symbol === null; + }; + Parser2.prototype.nextSymbol = function() { + var best; + var bestSymbol; + this.symbol = null; + this.value = null; + do { + if (this.done) + return false; + var rule = void 0; + best = null; + for (var name_1 in this.rules) { + rule = this.rules[name_1]; + var match = rule.exec(this.text); + if (match) { + if (best === null || match[0].length > best[0].length) { + best = match; + bestSymbol = name_1; + } + } + } + if (best != null) { + this.text = this.text.substr(best[0].length); + if (this.text === "") + this.done = true; + } + if (best == null) { + this.done = true; + this.symbol = null; + this.value = null; + return; + } + } while (bestSymbol === "SKIP"); + this.symbol = bestSymbol; + this.value = best; + return true; + }; + Parser2.prototype.accept = function(name) { + if (this.symbol === name) { + if (this.value) { + var v = this.value; + this.nextSymbol(); + return v; + } + this.nextSymbol(); + return true; + } + return false; + }; + Parser2.prototype.acceptNumber = function() { + return this.accept("number"); + }; + Parser2.prototype.expect = function(name) { + if (this.accept(name)) + return true; + throw new Error("expected " + name + " but found " + this.symbol); + }; + return Parser2; +}(); +function parseText(text2, language) { + if (language === void 0) { + language = i18n_default; + } + var options = {}; + var ttr = new Parser(language.tokens); + if (!ttr.start(text2)) + return null; + S(); + return options; + function S() { + ttr.expect("every"); + var n = ttr.acceptNumber(); + if (n) + options.interval = parseInt(n[0], 10); + if (ttr.isDone()) + throw new Error("Unexpected end"); + switch (ttr.symbol) { + case "day(s)": + options.freq = RRule.DAILY; + if (ttr.nextSymbol()) { + AT(); + F(); + } + break; + case "weekday(s)": + options.freq = RRule.WEEKLY; + options.byweekday = [RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR]; + ttr.nextSymbol(); + F(); + break; + case "week(s)": + options.freq = RRule.WEEKLY; + if (ttr.nextSymbol()) { + ON(); + F(); + } + break; + case "hour(s)": + options.freq = RRule.HOURLY; + if (ttr.nextSymbol()) { + ON(); + F(); + } + break; + case "minute(s)": + options.freq = RRule.MINUTELY; + if (ttr.nextSymbol()) { + ON(); + F(); + } + break; + case "month(s)": + options.freq = RRule.MONTHLY; + if (ttr.nextSymbol()) { + ON(); + F(); + } + break; + case "year(s)": + options.freq = RRule.YEARLY; + if (ttr.nextSymbol()) { + ON(); + F(); + } + break; + case "monday": + case "tuesday": + case "wednesday": + case "thursday": + case "friday": + case "saturday": + case "sunday": + options.freq = RRule.WEEKLY; + var key = ttr.symbol.substr(0, 2).toUpperCase(); + options.byweekday = [RRule[key]]; + if (!ttr.nextSymbol()) + return; + while (ttr.accept("comma")) { + if (ttr.isDone()) + throw new Error("Unexpected end"); + var wkd = decodeWKD(); + if (!wkd) { + throw new Error("Unexpected symbol " + ttr.symbol + ", expected weekday"); + } + options.byweekday.push(RRule[wkd]); + ttr.nextSymbol(); + } + MDAYs(); + F(); + break; + case "january": + case "february": + case "march": + case "april": + case "may": + case "june": + case "july": + case "august": + case "september": + case "october": + case "november": + case "december": + options.freq = RRule.YEARLY; + options.bymonth = [decodeM()]; + if (!ttr.nextSymbol()) + return; + while (ttr.accept("comma")) { + if (ttr.isDone()) + throw new Error("Unexpected end"); + var m = decodeM(); + if (!m) { + throw new Error("Unexpected symbol " + ttr.symbol + ", expected month"); + } + options.bymonth.push(m); + ttr.nextSymbol(); + } + ON(); + F(); + break; + default: + throw new Error("Unknown symbol"); + } + } + function ON() { + var on = ttr.accept("on"); + var the = ttr.accept("the"); + if (!(on || the)) + return; + do { + var nth = decodeNTH(); + var wkd = decodeWKD(); + var m = decodeM(); + if (nth) { + if (wkd) { + ttr.nextSymbol(); + if (!options.byweekday) + options.byweekday = []; + options.byweekday.push(RRule[wkd].nth(nth)); + } else { + if (!options.bymonthday) + options.bymonthday = []; + options.bymonthday.push(nth); + ttr.accept("day(s)"); + } + } else if (wkd) { + ttr.nextSymbol(); + if (!options.byweekday) + options.byweekday = []; + options.byweekday.push(RRule[wkd]); + } else if (ttr.symbol === "weekday(s)") { + ttr.nextSymbol(); + if (!options.byweekday) { + options.byweekday = [RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR]; + } + } else if (ttr.symbol === "week(s)") { + ttr.nextSymbol(); + var n = ttr.acceptNumber(); + if (!n) { + throw new Error("Unexpected symbol " + ttr.symbol + ", expected week number"); + } + options.byweekno = [parseInt(n[0], 10)]; + while (ttr.accept("comma")) { + n = ttr.acceptNumber(); + if (!n) { + throw new Error("Unexpected symbol " + ttr.symbol + "; expected monthday"); + } + options.byweekno.push(parseInt(n[0], 10)); + } + } else if (m) { + ttr.nextSymbol(); + if (!options.bymonth) + options.bymonth = []; + options.bymonth.push(m); + } else { + return; + } + } while (ttr.accept("comma") || ttr.accept("the") || ttr.accept("on")); + } + function AT() { + var at = ttr.accept("at"); + if (!at) + return; + do { + var n = ttr.acceptNumber(); + if (!n) { + throw new Error("Unexpected symbol " + ttr.symbol + ", expected hour"); + } + options.byhour = [parseInt(n[0], 10)]; + while (ttr.accept("comma")) { + n = ttr.acceptNumber(); + if (!n) { + throw new Error("Unexpected symbol " + ttr.symbol + "; expected hour"); + } + options.byhour.push(parseInt(n[0], 10)); + } + } while (ttr.accept("comma") || ttr.accept("at")); + } + function decodeM() { + switch (ttr.symbol) { + case "january": + return 1; + case "february": + return 2; + case "march": + return 3; + case "april": + return 4; + case "may": + return 5; + case "june": + return 6; + case "july": + return 7; + case "august": + return 8; + case "september": + return 9; + case "october": + return 10; + case "november": + return 11; + case "december": + return 12; + default: + return false; + } + } + function decodeWKD() { + switch (ttr.symbol) { + case "monday": + case "tuesday": + case "wednesday": + case "thursday": + case "friday": + case "saturday": + case "sunday": + return ttr.symbol.substr(0, 2).toUpperCase(); + default: + return false; + } + } + function decodeNTH() { + switch (ttr.symbol) { + case "last": + ttr.nextSymbol(); + return -1; + case "first": + ttr.nextSymbol(); + return 1; + case "second": + ttr.nextSymbol(); + return ttr.accept("last") ? -2 : 2; + case "third": + ttr.nextSymbol(); + return ttr.accept("last") ? -3 : 3; + case "nth": + var v = parseInt(ttr.value[1], 10); + if (v < -366 || v > 366) + throw new Error("Nth out of range: " + v); + ttr.nextSymbol(); + return ttr.accept("last") ? -v : v; + default: + return false; + } + } + function MDAYs() { + ttr.accept("on"); + ttr.accept("the"); + var nth = decodeNTH(); + if (!nth) + return; + options.bymonthday = [nth]; + ttr.nextSymbol(); + while (ttr.accept("comma")) { + nth = decodeNTH(); + if (!nth) { + throw new Error("Unexpected symbol " + ttr.symbol + "; expected monthday"); + } + options.bymonthday.push(nth); + ttr.nextSymbol(); + } + } + function F() { + if (ttr.symbol === "until") { + var date = Date.parse(ttr.text); + if (!date) + throw new Error("Cannot parse until date:" + ttr.text); + options.until = new Date(date); + } else if (ttr.accept("for")) { + options.count = parseInt(ttr.value[0], 10); + ttr.expect("number"); + } + } +} + +// node_modules/rrule/dist/esm/types.js +var Frequency; +(function(Frequency2) { + Frequency2[Frequency2["YEARLY"] = 0] = "YEARLY"; + Frequency2[Frequency2["MONTHLY"] = 1] = "MONTHLY"; + Frequency2[Frequency2["WEEKLY"] = 2] = "WEEKLY"; + Frequency2[Frequency2["DAILY"] = 3] = "DAILY"; + Frequency2[Frequency2["HOURLY"] = 4] = "HOURLY"; + Frequency2[Frequency2["MINUTELY"] = 5] = "MINUTELY"; + Frequency2[Frequency2["SECONDLY"] = 6] = "SECONDLY"; +})(Frequency || (Frequency = {})); +function freqIsDailyOrGreater(freq) { + return freq < Frequency.HOURLY; +} + +// node_modules/rrule/dist/esm/nlp/index.js +var fromText = function(text2, language) { + if (language === void 0) { + language = i18n_default; + } + return new RRule(parseText(text2, language) || void 0); +}; +var common = [ + "count", + "until", + "interval", + "byweekday", + "bymonthday", + "bymonth" +]; +totext_default.IMPLEMENTED = []; +totext_default.IMPLEMENTED[Frequency.HOURLY] = common; +totext_default.IMPLEMENTED[Frequency.MINUTELY] = common; +totext_default.IMPLEMENTED[Frequency.DAILY] = ["byhour"].concat(common); +totext_default.IMPLEMENTED[Frequency.WEEKLY] = common; +totext_default.IMPLEMENTED[Frequency.MONTHLY] = common; +totext_default.IMPLEMENTED[Frequency.YEARLY] = ["byweekno", "byyearday"].concat(common); +var toText = function(rrule, gettext, language, dateFormatter) { + return new totext_default(rrule, gettext, language, dateFormatter).toString(); +}; +var isFullyConvertible = totext_default.isFullyConvertible; + +// node_modules/rrule/dist/esm/datetime.js +var Time = function() { + function Time2(hour, minute, second, millisecond) { + this.hour = hour; + this.minute = minute; + this.second = second; + this.millisecond = millisecond || 0; + } + Time2.prototype.getHours = function() { + return this.hour; + }; + Time2.prototype.getMinutes = function() { + return this.minute; + }; + Time2.prototype.getSeconds = function() { + return this.second; + }; + Time2.prototype.getMilliseconds = function() { + return this.millisecond; + }; + Time2.prototype.getTime = function() { + return (this.hour * 60 * 60 + this.minute * 60 + this.second) * 1e3 + this.millisecond; + }; + return Time2; +}(); +var DateTime = function(_super) { + __extends(DateTime2, _super); + function DateTime2(year, month, day, hour, minute, second, millisecond) { + var _this = _super.call(this, hour, minute, second, millisecond) || this; + _this.year = year; + _this.month = month; + _this.day = day; + return _this; + } + DateTime2.fromDate = function(date) { + return new this(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.valueOf() % 1e3); + }; + DateTime2.prototype.getWeekday = function() { + return dateutil.getWeekday(new Date(this.getTime())); + }; + DateTime2.prototype.getTime = function() { + return new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond)).getTime(); + }; + DateTime2.prototype.getDay = function() { + return this.day; + }; + DateTime2.prototype.getMonth = function() { + return this.month; + }; + DateTime2.prototype.getYear = function() { + return this.year; + }; + DateTime2.prototype.addYears = function(years) { + this.year += years; + }; + DateTime2.prototype.addMonths = function(months) { + this.month += months; + if (this.month > 12) { + var yearDiv = Math.floor(this.month / 12); + var monthMod = pymod(this.month, 12); + this.month = monthMod; + this.year += yearDiv; + if (this.month === 0) { + this.month = 12; + --this.year; + } + } + }; + DateTime2.prototype.addWeekly = function(days, wkst) { + if (wkst > this.getWeekday()) { + this.day += -(this.getWeekday() + 1 + (6 - wkst)) + days * 7; + } else { + this.day += -(this.getWeekday() - wkst) + days * 7; + } + this.fixDay(); + }; + DateTime2.prototype.addDaily = function(days) { + this.day += days; + this.fixDay(); + }; + DateTime2.prototype.addHours = function(hours, filtered, byhour) { + if (filtered) { + this.hour += Math.floor((23 - this.hour) / hours) * hours; + } + for (; ; ) { + this.hour += hours; + var _a = divmod(this.hour, 24), dayDiv = _a.div, hourMod = _a.mod; + if (dayDiv) { + this.hour = hourMod; + this.addDaily(dayDiv); + } + if (empty(byhour) || includes(byhour, this.hour)) + break; + } + }; + DateTime2.prototype.addMinutes = function(minutes, filtered, byhour, byminute) { + if (filtered) { + this.minute += Math.floor((1439 - (this.hour * 60 + this.minute)) / minutes) * minutes; + } + for (; ; ) { + this.minute += minutes; + var _a = divmod(this.minute, 60), hourDiv = _a.div, minuteMod = _a.mod; + if (hourDiv) { + this.minute = minuteMod; + this.addHours(hourDiv, false, byhour); + } + if ((empty(byhour) || includes(byhour, this.hour)) && (empty(byminute) || includes(byminute, this.minute))) { + break; + } + } + }; + DateTime2.prototype.addSeconds = function(seconds, filtered, byhour, byminute, bysecond) { + if (filtered) { + this.second += Math.floor((86399 - (this.hour * 3600 + this.minute * 60 + this.second)) / seconds) * seconds; + } + for (; ; ) { + this.second += seconds; + var _a = divmod(this.second, 60), minuteDiv = _a.div, secondMod = _a.mod; + if (minuteDiv) { + this.second = secondMod; + this.addMinutes(minuteDiv, false, byhour, byminute); + } + if ((empty(byhour) || includes(byhour, this.hour)) && (empty(byminute) || includes(byminute, this.minute)) && (empty(bysecond) || includes(bysecond, this.second))) { + break; + } + } + }; + DateTime2.prototype.fixDay = function() { + if (this.day <= 28) { + return; + } + var daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1]; + if (this.day <= daysinmonth) { + return; + } + while (this.day > daysinmonth) { + this.day -= daysinmonth; + ++this.month; + if (this.month === 13) { + this.month = 1; + ++this.year; + if (this.year > dateutil.MAXYEAR) { + return; + } + } + daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1]; + } + }; + DateTime2.prototype.add = function(options, filtered) { + var freq = options.freq, interval = options.interval, wkst = options.wkst, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; + switch (freq) { + case Frequency.YEARLY: + return this.addYears(interval); + case Frequency.MONTHLY: + return this.addMonths(interval); + case Frequency.WEEKLY: + return this.addWeekly(interval, wkst); + case Frequency.DAILY: + return this.addDaily(interval); + case Frequency.HOURLY: + return this.addHours(interval, filtered, byhour); + case Frequency.MINUTELY: + return this.addMinutes(interval, filtered, byhour, byminute); + case Frequency.SECONDLY: + return this.addSeconds(interval, filtered, byhour, byminute, bysecond); + } + }; + return DateTime2; +}(Time); + +// node_modules/rrule/dist/esm/parseoptions.js +function initializeOptions(options) { + var invalid = []; + var keys = Object.keys(options); + for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { + var key = keys_1[_i]; + if (!includes(defaultKeys, key)) + invalid.push(key); + if (dateutil_default.isDate(options[key]) && !dateutil_default.isValidDate(options[key])) { + invalid.push(key); + } + } + if (invalid.length) { + throw new Error("Invalid options: " + invalid.join(", ")); + } + return __assign({}, options); +} +function parseOptions(options) { + var opts = __assign(__assign({}, DEFAULT_OPTIONS), initializeOptions(options)); + if (isPresent(opts.byeaster)) + opts.freq = RRule.YEARLY; + if (!(isPresent(opts.freq) && RRule.FREQUENCIES[opts.freq])) { + throw new Error("Invalid frequency: ".concat(opts.freq, " ").concat(options.freq)); + } + if (!opts.dtstart) + opts.dtstart = new Date(new Date().setMilliseconds(0)); + if (!isPresent(opts.wkst)) { + opts.wkst = RRule.MO.weekday; + } else if (isNumber(opts.wkst)) { + } else { + opts.wkst = opts.wkst.weekday; + } + if (isPresent(opts.bysetpos)) { + if (isNumber(opts.bysetpos)) + opts.bysetpos = [opts.bysetpos]; + for (var i = 0; i < opts.bysetpos.length; i++) { + var v = opts.bysetpos[i]; + if (v === 0 || !(v >= -366 && v <= 366)) { + throw new Error("bysetpos must be between 1 and 366, or between -366 and -1"); + } + } + } + if (!(Boolean(opts.byweekno) || notEmpty(opts.byweekno) || notEmpty(opts.byyearday) || Boolean(opts.bymonthday) || notEmpty(opts.bymonthday) || isPresent(opts.byweekday) || isPresent(opts.byeaster))) { + switch (opts.freq) { + case RRule.YEARLY: + if (!opts.bymonth) + opts.bymonth = opts.dtstart.getUTCMonth() + 1; + opts.bymonthday = opts.dtstart.getUTCDate(); + break; + case RRule.MONTHLY: + opts.bymonthday = opts.dtstart.getUTCDate(); + break; + case RRule.WEEKLY: + opts.byweekday = [dateutil_default.getWeekday(opts.dtstart)]; + break; + } + } + if (isPresent(opts.bymonth) && !isArray(opts.bymonth)) { + opts.bymonth = [opts.bymonth]; + } + if (isPresent(opts.byyearday) && !isArray(opts.byyearday) && isNumber(opts.byyearday)) { + opts.byyearday = [opts.byyearday]; + } + if (!isPresent(opts.bymonthday)) { + opts.bymonthday = []; + opts.bynmonthday = []; + } else if (isArray(opts.bymonthday)) { + var bymonthday = []; + var bynmonthday = []; + for (var i = 0; i < opts.bymonthday.length; i++) { + var v = opts.bymonthday[i]; + if (v > 0) { + bymonthday.push(v); + } else if (v < 0) { + bynmonthday.push(v); + } + } + opts.bymonthday = bymonthday; + opts.bynmonthday = bynmonthday; + } else if (opts.bymonthday < 0) { + opts.bynmonthday = [opts.bymonthday]; + opts.bymonthday = []; + } else { + opts.bynmonthday = []; + opts.bymonthday = [opts.bymonthday]; + } + if (isPresent(opts.byweekno) && !isArray(opts.byweekno)) { + opts.byweekno = [opts.byweekno]; + } + if (!isPresent(opts.byweekday)) { + opts.bynweekday = null; + } else if (isNumber(opts.byweekday)) { + opts.byweekday = [opts.byweekday]; + opts.bynweekday = null; + } else if (isWeekdayStr(opts.byweekday)) { + opts.byweekday = [Weekday.fromStr(opts.byweekday).weekday]; + opts.bynweekday = null; + } else if (opts.byweekday instanceof Weekday) { + if (!opts.byweekday.n || opts.freq > RRule.MONTHLY) { + opts.byweekday = [opts.byweekday.weekday]; + opts.bynweekday = null; + } else { + opts.bynweekday = [[opts.byweekday.weekday, opts.byweekday.n]]; + opts.byweekday = null; + } + } else { + var byweekday = []; + var bynweekday = []; + for (var i = 0; i < opts.byweekday.length; i++) { + var wday = opts.byweekday[i]; + if (isNumber(wday)) { + byweekday.push(wday); + continue; + } else if (isWeekdayStr(wday)) { + byweekday.push(Weekday.fromStr(wday).weekday); + continue; + } + if (!wday.n || opts.freq > RRule.MONTHLY) { + byweekday.push(wday.weekday); + } else { + bynweekday.push([wday.weekday, wday.n]); + } + } + opts.byweekday = notEmpty(byweekday) ? byweekday : null; + opts.bynweekday = notEmpty(bynweekday) ? bynweekday : null; + } + if (!isPresent(opts.byhour)) { + opts.byhour = opts.freq < RRule.HOURLY ? [opts.dtstart.getUTCHours()] : null; + } else if (isNumber(opts.byhour)) { + opts.byhour = [opts.byhour]; + } + if (!isPresent(opts.byminute)) { + opts.byminute = opts.freq < RRule.MINUTELY ? [opts.dtstart.getUTCMinutes()] : null; + } else if (isNumber(opts.byminute)) { + opts.byminute = [opts.byminute]; + } + if (!isPresent(opts.bysecond)) { + opts.bysecond = opts.freq < RRule.SECONDLY ? [opts.dtstart.getUTCSeconds()] : null; + } else if (isNumber(opts.bysecond)) { + opts.bysecond = [opts.bysecond]; + } + return { parsedOptions: opts }; +} +function buildTimeset(opts) { + var millisecondModulo = opts.dtstart.getTime() % 1e3; + if (!freqIsDailyOrGreater(opts.freq)) { + return []; + } + var timeset = []; + opts.byhour.forEach(function(hour) { + opts.byminute.forEach(function(minute) { + opts.bysecond.forEach(function(second) { + timeset.push(new Time(hour, minute, second, millisecondModulo)); + }); + }); + }); + return timeset; +} + +// node_modules/rrule/dist/esm/parsestring.js +function parseString(rfcString) { + var options = rfcString.split("\n").map(parseLine).filter(function(x) { + return x !== null; + }); + return __assign(__assign({}, options[0]), options[1]); +} +function parseDtstart(line) { + var options = {}; + var dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\s]+)/i.exec(line); + if (!dtstartWithZone) { + return options; + } + var tzid = dtstartWithZone[1], dtstart = dtstartWithZone[2]; + if (tzid) { + options.tzid = tzid; + } + options.dtstart = dateutil_default.untilStringToDate(dtstart); + return options; +} +function parseLine(rfcString) { + rfcString = rfcString.replace(/^\s+|\s+$/, ""); + if (!rfcString.length) + return null; + var header = /^([A-Z]+?)[:;]/.exec(rfcString.toUpperCase()); + if (!header) { + return parseRrule(rfcString); + } + var key = header[1]; + switch (key.toUpperCase()) { + case "RRULE": + case "EXRULE": + return parseRrule(rfcString); + case "DTSTART": + return parseDtstart(rfcString); + default: + throw new Error("Unsupported RFC prop ".concat(key, " in ").concat(rfcString)); + } +} +function parseRrule(line) { + var strippedLine = line.replace(/^RRULE:/i, ""); + var options = parseDtstart(strippedLine); + var attrs = line.replace(/^(?:RRULE|EXRULE):/i, "").split(";"); + attrs.forEach(function(attr2) { + var _a = attr2.split("="), key = _a[0], value = _a[1]; + switch (key.toUpperCase()) { + case "FREQ": + options.freq = Frequency[value.toUpperCase()]; + break; + case "WKST": + options.wkst = Days[value.toUpperCase()]; + break; + case "COUNT": + case "INTERVAL": + case "BYSETPOS": + case "BYMONTH": + case "BYMONTHDAY": + case "BYYEARDAY": + case "BYWEEKNO": + case "BYHOUR": + case "BYMINUTE": + case "BYSECOND": + var num = parseNumber(value); + var optionKey = key.toLowerCase(); + options[optionKey] = num; + break; + case "BYWEEKDAY": + case "BYDAY": + options.byweekday = parseWeekday(value); + break; + case "DTSTART": + case "TZID": + var dtstart = parseDtstart(line); + options.tzid = dtstart.tzid; + options.dtstart = dtstart.dtstart; + break; + case "UNTIL": + options.until = dateutil_default.untilStringToDate(value); + break; + case "BYEASTER": + options.byeaster = Number(value); + break; + default: + throw new Error("Unknown RRULE property '" + key + "'"); + } + }); + return options; +} +function parseNumber(value) { + if (value.indexOf(",") !== -1) { + var values = value.split(","); + return values.map(parseIndividualNumber); + } + return parseIndividualNumber(value); +} +function parseIndividualNumber(value) { + if (/^[+-]?\d+$/.test(value)) { + return Number(value); + } + return value; +} +function parseWeekday(value) { + var days = value.split(","); + return days.map(function(day) { + if (day.length === 2) { + return Days[day]; + } + var parts = day.match(/^([+-]?\d{1,2})([A-Z]{2})$/); + if (!parts || parts.length < 3) { + throw new SyntaxError("Invalid weekday string: ".concat(day)); + } + var n = Number(parts[1]); + var wdaypart = parts[2]; + var wday = Days[wdaypart].weekday; + return new Weekday(wday, n); + }); +} + +// node_modules/rrule/dist/esm/datewithzone.js +var DateWithZone = function() { + function DateWithZone2(date, tzid) { + if (isNaN(date.getTime())) { + throw new RangeError("Invalid date passed to DateWithZone"); + } + this.date = date; + this.tzid = tzid; + } + Object.defineProperty(DateWithZone2.prototype, "isUTC", { + get: function() { + return !this.tzid || this.tzid.toUpperCase() === "UTC"; + }, + enumerable: false, + configurable: true + }); + DateWithZone2.prototype.toString = function() { + var datestr = dateutil_default.timeToUntilString(this.date.getTime(), this.isUTC); + if (!this.isUTC) { + return ";TZID=".concat(this.tzid, ":").concat(datestr); + } + return ":".concat(datestr); + }; + DateWithZone2.prototype.getTime = function() { + return this.date.getTime(); + }; + DateWithZone2.prototype.rezonedDate = function() { + var _a; + if (this.isUTC) { + return this.date; + } + var localTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; + var dateInLocalTZ = new Date(this.date.toLocaleString(void 0, { timeZone: localTimeZone })); + var dateInTargetTZ = new Date(this.date.toLocaleString(void 0, { timeZone: (_a = this.tzid) !== null && _a !== void 0 ? _a : "UTC" })); + var tzOffset = dateInTargetTZ.getTime() - dateInLocalTZ.getTime(); + return new Date(this.date.getTime() - tzOffset); + }; + return DateWithZone2; +}(); + +// node_modules/rrule/dist/esm/optionstostring.js +function optionsToString(options) { + var rrule = []; + var dtstart = ""; + var keys = Object.keys(options); + var defaultKeys2 = Object.keys(DEFAULT_OPTIONS); + for (var i = 0; i < keys.length; i++) { + if (keys[i] === "tzid") + continue; + if (!includes(defaultKeys2, keys[i])) + continue; + var key = keys[i].toUpperCase(); + var value = options[keys[i]]; + var outValue = ""; + if (!isPresent(value) || isArray(value) && !value.length) + continue; + switch (key) { + case "FREQ": + outValue = RRule.FREQUENCIES[options.freq]; + break; + case "WKST": + if (isNumber(value)) { + outValue = new Weekday(value).toString(); + } else { + outValue = value.toString(); + } + break; + case "BYWEEKDAY": + key = "BYDAY"; + outValue = toArray(value).map(function(wday) { + if (wday instanceof Weekday) { + return wday; + } + if (isArray(wday)) { + return new Weekday(wday[0], wday[1]); + } + return new Weekday(wday); + }).toString(); + break; + case "DTSTART": + dtstart = buildDtstart(value, options.tzid); + break; + case "UNTIL": + outValue = dateutil_default.timeToUntilString(value, !options.tzid); + break; + default: + if (isArray(value)) { + var strValues = []; + for (var j = 0; j < value.length; j++) { + strValues[j] = String(value[j]); + } + outValue = strValues.toString(); + } else { + outValue = String(value); + } + } + if (outValue) { + rrule.push([key, outValue]); + } + } + var rules = rrule.map(function(_a) { + var key2 = _a[0], value2 = _a[1]; + return "".concat(key2, "=").concat(value2.toString()); + }).join(";"); + var ruleString = ""; + if (rules !== "") { + ruleString = "RRULE:".concat(rules); + } + return [dtstart, ruleString].filter(function(x) { + return !!x; + }).join("\n"); +} +function buildDtstart(dtstart, tzid) { + if (!dtstart) { + return ""; + } + return "DTSTART" + new DateWithZone(new Date(dtstart), tzid).toString(); +} + +// node_modules/rrule/dist/esm/cache.js +function argsMatch(left, right) { + if (Array.isArray(left)) { + if (!Array.isArray(right)) + return false; + if (left.length !== right.length) + return false; + return left.every(function(date, i) { + return date.getTime() === right[i].getTime(); + }); + } + if (left instanceof Date) { + return right instanceof Date && left.getTime() === right.getTime(); + } + return left === right; +} +var Cache = function() { + function Cache3() { + this.all = false; + this.before = []; + this.after = []; + this.between = []; + } + Cache3.prototype._cacheAdd = function(what, value, args) { + if (value) { + value = value instanceof Date ? dateutil_default.clone(value) : dateutil_default.cloneDates(value); + } + if (what === "all") { + this.all = value; + } else { + args._value = value; + this[what].push(args); + } + }; + Cache3.prototype._cacheGet = function(what, args) { + var cached = false; + var argsKeys = args ? Object.keys(args) : []; + var findCacheDiff = function(item2) { + for (var i2 = 0; i2 < argsKeys.length; i2++) { + var key = argsKeys[i2]; + if (!argsMatch(args[key], item2[key])) { + return true; + } + } + return false; + }; + var cachedObject = this[what]; + if (what === "all") { + cached = this.all; + } else if (isArray(cachedObject)) { + for (var i = 0; i < cachedObject.length; i++) { + var item = cachedObject[i]; + if (argsKeys.length && findCacheDiff(item)) + continue; + cached = item._value; + break; + } + } + if (!cached && this.all) { + var iterResult = new iterresult_default(what, args); + for (var i = 0; i < this.all.length; i++) { + if (!iterResult.accept(this.all[i])) + break; + } + cached = iterResult.getValue(); + this._cacheAdd(what, cached, args); + } + return isArray(cached) ? dateutil_default.cloneDates(cached) : cached instanceof Date ? dateutil_default.clone(cached) : cached; + }; + return Cache3; +}(); + +// node_modules/rrule/dist/esm/masks.js +var M365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], repeat(1, 31), true), repeat(2, 28), true), repeat(3, 31), true), repeat(4, 30), true), repeat(5, 31), true), repeat(6, 30), true), repeat(7, 31), true), repeat(8, 31), true), repeat(9, 30), true), repeat(10, 31), true), repeat(11, 30), true), repeat(12, 31), true), repeat(1, 7), true); +var M366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], repeat(1, 31), true), repeat(2, 29), true), repeat(3, 31), true), repeat(4, 30), true), repeat(5, 31), true), repeat(6, 30), true), repeat(7, 31), true), repeat(8, 31), true), repeat(9, 30), true), repeat(10, 31), true), repeat(11, 30), true), repeat(12, 31), true), repeat(1, 7), true); +var M28 = range(1, 29); +var M29 = range(1, 30); +var M30 = range(1, 31); +var M31 = range(1, 32); +var MDAY366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], M31, true), M29, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31.slice(0, 7), true); +var MDAY365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], M31, true), M28, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31.slice(0, 7), true); +var NM28 = range(-28, 0); +var NM29 = range(-29, 0); +var NM30 = range(-30, 0); +var NM31 = range(-31, 0); +var NMDAY366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], NM31, true), NM29, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31.slice(0, 7), true); +var NMDAY365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], NM31, true), NM28, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31.slice(0, 7), true); +var M366RANGE = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]; +var M365RANGE = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; +var WDAYMASK = function() { + var wdaymask = []; + for (var i = 0; i < 55; i++) + wdaymask = wdaymask.concat(range(7)); + return wdaymask; +}(); + +// node_modules/rrule/dist/esm/iterinfo/yearinfo.js +function rebuildYear(year, options) { + var firstyday = new Date(Date.UTC(year, 0, 1)); + var yearlen = dateutil_default.isLeapYear(year) ? 366 : 365; + var nextyearlen = dateutil_default.isLeapYear(year + 1) ? 366 : 365; + var yearordinal = dateutil_default.toOrdinal(firstyday); + var yearweekday = dateutil_default.getWeekday(firstyday); + var result = __assign(__assign({ yearlen, nextyearlen, yearordinal, yearweekday }, baseYearMasks(year)), { wnomask: null }); + if (empty(options.byweekno)) { + return result; + } + result.wnomask = repeat(0, yearlen + 7); + var firstwkst; + var wyearlen; + var no1wkst = firstwkst = pymod(7 - yearweekday + options.wkst, 7); + if (no1wkst >= 4) { + no1wkst = 0; + wyearlen = result.yearlen + pymod(yearweekday - options.wkst, 7); + } else { + wyearlen = yearlen - no1wkst; + } + var div = Math.floor(wyearlen / 7); + var mod = pymod(wyearlen, 7); + var numweeks = Math.floor(div + mod / 4); + for (var j = 0; j < options.byweekno.length; j++) { + var n = options.byweekno[j]; + if (n < 0) { + n += numweeks + 1; + } + if (!(n > 0 && n <= numweeks)) { + continue; + } + var i = void 0; + if (n > 1) { + i = no1wkst + (n - 1) * 7; + if (no1wkst !== firstwkst) { + i -= 7 - firstwkst; + } + } else { + i = no1wkst; + } + for (var k = 0; k < 7; k++) { + result.wnomask[i] = 1; + i++; + if (result.wdaymask[i] === options.wkst) + break; + } + } + if (includes(options.byweekno, 1)) { + var i = no1wkst + numweeks * 7; + if (no1wkst !== firstwkst) + i -= 7 - firstwkst; + if (i < yearlen) { + for (var j = 0; j < 7; j++) { + result.wnomask[i] = 1; + i += 1; + if (result.wdaymask[i] === options.wkst) + break; + } + } + } + if (no1wkst) { + var lnumweeks = void 0; + if (!includes(options.byweekno, -1)) { + var lyearweekday = dateutil_default.getWeekday(new Date(Date.UTC(year - 1, 0, 1))); + var lno1wkst = pymod(7 - lyearweekday.valueOf() + options.wkst, 7); + var lyearlen = dateutil_default.isLeapYear(year - 1) ? 366 : 365; + var weekst = void 0; + if (lno1wkst >= 4) { + lno1wkst = 0; + weekst = lyearlen + pymod(lyearweekday - options.wkst, 7); + } else { + weekst = yearlen - no1wkst; + } + lnumweeks = Math.floor(52 + pymod(weekst, 7) / 4); + } else { + lnumweeks = -1; + } + if (includes(options.byweekno, lnumweeks)) { + for (var i = 0; i < no1wkst; i++) + result.wnomask[i] = 1; + } + } + return result; +} +function baseYearMasks(year) { + var yearlen = dateutil_default.isLeapYear(year) ? 366 : 365; + var firstyday = new Date(Date.UTC(year, 0, 1)); + var wday = dateutil_default.getWeekday(firstyday); + if (yearlen === 365) { + return { + mmask: M365MASK, + mdaymask: MDAY365MASK, + nmdaymask: NMDAY365MASK, + wdaymask: WDAYMASK.slice(wday), + mrange: M365RANGE + }; + } + return { + mmask: M366MASK, + mdaymask: MDAY366MASK, + nmdaymask: NMDAY366MASK, + wdaymask: WDAYMASK.slice(wday), + mrange: M366RANGE + }; +} + +// node_modules/rrule/dist/esm/iterinfo/monthinfo.js +function rebuildMonth(year, month, yearlen, mrange, wdaymask, options) { + var result = { + lastyear: year, + lastmonth: month, + nwdaymask: [] + }; + var ranges = []; + if (options.freq === RRule.YEARLY) { + if (empty(options.bymonth)) { + ranges = [[0, yearlen]]; + } else { + for (var j = 0; j < options.bymonth.length; j++) { + month = options.bymonth[j]; + ranges.push(mrange.slice(month - 1, month + 1)); + } + } + } else if (options.freq === RRule.MONTHLY) { + ranges = [mrange.slice(month - 1, month + 1)]; + } + if (empty(ranges)) { + return result; + } + result.nwdaymask = repeat(0, yearlen); + for (var j = 0; j < ranges.length; j++) { + var rang = ranges[j]; + var first = rang[0]; + var last = rang[1] - 1; + for (var k = 0; k < options.bynweekday.length; k++) { + var i = void 0; + var _a = options.bynweekday[k], wday = _a[0], n = _a[1]; + if (n < 0) { + i = last + (n + 1) * 7; + i -= pymod(wdaymask[i] - wday, 7); + } else { + i = first + (n - 1) * 7; + i += pymod(7 - wdaymask[i] + wday, 7); + } + if (first <= i && i <= last) + result.nwdaymask[i] = 1; + } + } + return result; +} + +// node_modules/rrule/dist/esm/iterinfo/easter.js +function easter(y, offset) { + if (offset === void 0) { + offset = 0; + } + var a = y % 19; + var b = Math.floor(y / 100); + var c = y % 100; + var d = Math.floor(b / 4); + var e = b % 4; + var f = Math.floor((b + 8) / 25); + var g = Math.floor((b - f + 1) / 3); + var h = Math.floor(19 * a + b - d - g + 15) % 30; + var i = Math.floor(c / 4); + var k = c % 4; + var l = Math.floor(32 + 2 * e + 2 * i - h - k) % 7; + var m = Math.floor((a + 11 * h + 22 * l) / 451); + var month = Math.floor((h + l - 7 * m + 114) / 31); + var day = (h + l - 7 * m + 114) % 31 + 1; + var date = Date.UTC(y, month - 1, day + offset); + var yearStart = Date.UTC(y, 0, 1); + return [Math.ceil((date - yearStart) / (1e3 * 60 * 60 * 24))]; +} + +// node_modules/rrule/dist/esm/iterinfo/index.js +var Iterinfo = function() { + function Iterinfo2(options) { + this.options = options; + } + Iterinfo2.prototype.rebuild = function(year, month) { + var options = this.options; + if (year !== this.lastyear) { + this.yearinfo = rebuildYear(year, options); + } + if (notEmpty(options.bynweekday) && (month !== this.lastmonth || year !== this.lastyear)) { + var _a = this.yearinfo, yearlen = _a.yearlen, mrange = _a.mrange, wdaymask = _a.wdaymask; + this.monthinfo = rebuildMonth(year, month, yearlen, mrange, wdaymask, options); + } + if (isPresent(options.byeaster)) { + this.eastermask = easter(year, options.byeaster); + } + }; + Object.defineProperty(Iterinfo2.prototype, "lastyear", { + get: function() { + return this.monthinfo ? this.monthinfo.lastyear : null; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "lastmonth", { + get: function() { + return this.monthinfo ? this.monthinfo.lastmonth : null; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "yearlen", { + get: function() { + return this.yearinfo.yearlen; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "yearordinal", { + get: function() { + return this.yearinfo.yearordinal; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "mrange", { + get: function() { + return this.yearinfo.mrange; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "wdaymask", { + get: function() { + return this.yearinfo.wdaymask; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "mmask", { + get: function() { + return this.yearinfo.mmask; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "wnomask", { + get: function() { + return this.yearinfo.wnomask; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "nwdaymask", { + get: function() { + return this.monthinfo ? this.monthinfo.nwdaymask : []; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "nextyearlen", { + get: function() { + return this.yearinfo.nextyearlen; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "mdaymask", { + get: function() { + return this.yearinfo.mdaymask; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo2.prototype, "nmdaymask", { + get: function() { + return this.yearinfo.nmdaymask; + }, + enumerable: false, + configurable: true + }); + Iterinfo2.prototype.ydayset = function() { + return [range(this.yearlen), 0, this.yearlen]; + }; + Iterinfo2.prototype.mdayset = function(_, month) { + var start = this.mrange[month - 1]; + var end = this.mrange[month]; + var set = repeat(null, this.yearlen); + for (var i = start; i < end; i++) + set[i] = i; + return [set, start, end]; + }; + Iterinfo2.prototype.wdayset = function(year, month, day) { + var set = repeat(null, this.yearlen + 7); + var i = dateutil_default.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - this.yearordinal; + var start = i; + for (var j = 0; j < 7; j++) { + set[i] = i; + ++i; + if (this.wdaymask[i] === this.options.wkst) + break; + } + return [set, start, i]; + }; + Iterinfo2.prototype.ddayset = function(year, month, day) { + var set = repeat(null, this.yearlen); + var i = dateutil_default.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - this.yearordinal; + set[i] = i; + return [set, i, i + 1]; + }; + Iterinfo2.prototype.htimeset = function(hour, _, second, millisecond) { + var _this = this; + var set = []; + this.options.byminute.forEach(function(minute) { + set = set.concat(_this.mtimeset(hour, minute, second, millisecond)); + }); + dateutil_default.sort(set); + return set; + }; + Iterinfo2.prototype.mtimeset = function(hour, minute, _, millisecond) { + var set = this.options.bysecond.map(function(second) { + return new Time(hour, minute, second, millisecond); + }); + dateutil_default.sort(set); + return set; + }; + Iterinfo2.prototype.stimeset = function(hour, minute, second, millisecond) { + return [new Time(hour, minute, second, millisecond)]; + }; + Iterinfo2.prototype.getdayset = function(freq) { + switch (freq) { + case Frequency.YEARLY: + return this.ydayset.bind(this); + case Frequency.MONTHLY: + return this.mdayset.bind(this); + case Frequency.WEEKLY: + return this.wdayset.bind(this); + case Frequency.DAILY: + return this.ddayset.bind(this); + default: + return this.ddayset.bind(this); + } + }; + Iterinfo2.prototype.gettimeset = function(freq) { + switch (freq) { + case Frequency.HOURLY: + return this.htimeset.bind(this); + case Frequency.MINUTELY: + return this.mtimeset.bind(this); + case Frequency.SECONDLY: + return this.stimeset.bind(this); + } + }; + return Iterinfo2; +}(); +var iterinfo_default = Iterinfo; + +// node_modules/rrule/dist/esm/iter/poslist.js +function buildPoslist(bysetpos, timeset, start, end, ii, dayset) { + var poslist = []; + for (var j = 0; j < bysetpos.length; j++) { + var daypos = void 0; + var timepos = void 0; + var pos = bysetpos[j]; + if (pos < 0) { + daypos = Math.floor(pos / timeset.length); + timepos = pymod(pos, timeset.length); + } else { + daypos = Math.floor((pos - 1) / timeset.length); + timepos = pymod(pos - 1, timeset.length); + } + var tmp = []; + for (var k = start; k < end; k++) { + var val = dayset[k]; + if (!isPresent(val)) + continue; + tmp.push(val); + } + var i = void 0; + if (daypos < 0) { + i = tmp.slice(daypos)[0]; + } else { + i = tmp[daypos]; + } + var time = timeset[timepos]; + var date = dateutil_default.fromOrdinal(ii.yearordinal + i); + var res = dateutil_default.combine(date, time); + if (!includes(poslist, res)) + poslist.push(res); + } + dateutil_default.sort(poslist); + return poslist; +} + +// node_modules/rrule/dist/esm/iter/index.js +function iter(iterResult, options) { + var dtstart = options.dtstart, freq = options.freq, interval = options.interval, until = options.until, bysetpos = options.bysetpos; + var count = options.count; + if (count === 0 || interval === 0) { + return emitResult(iterResult); + } + var counterDate = DateTime.fromDate(dtstart); + var ii = new iterinfo_default(options); + ii.rebuild(counterDate.year, counterDate.month); + var timeset = makeTimeset(ii, counterDate, options); + for (; ; ) { + var _a = ii.getdayset(freq)(counterDate.year, counterDate.month, counterDate.day), dayset = _a[0], start = _a[1], end = _a[2]; + var filtered = removeFilteredDays(dayset, start, end, ii, options); + if (notEmpty(bysetpos)) { + var poslist = buildPoslist(bysetpos, timeset, start, end, ii, dayset); + for (var j = 0; j < poslist.length; j++) { + var res = poslist[j]; + if (until && res > until) { + return emitResult(iterResult); + } + if (res >= dtstart) { + var rezonedDate = rezoneIfNeeded(res, options); + if (!iterResult.accept(rezonedDate)) { + return emitResult(iterResult); + } + if (count) { + --count; + if (!count) { + return emitResult(iterResult); + } + } + } + } + } else { + for (var j = start; j < end; j++) { + var currentDay = dayset[j]; + if (!isPresent(currentDay)) { + continue; + } + var date = dateutil_default.fromOrdinal(ii.yearordinal + currentDay); + for (var k = 0; k < timeset.length; k++) { + var time = timeset[k]; + var res = dateutil_default.combine(date, time); + if (until && res > until) { + return emitResult(iterResult); + } + if (res >= dtstart) { + var rezonedDate = rezoneIfNeeded(res, options); + if (!iterResult.accept(rezonedDate)) { + return emitResult(iterResult); + } + if (count) { + --count; + if (!count) { + return emitResult(iterResult); + } + } + } + } + } + } + if (options.interval === 0) { + return emitResult(iterResult); + } + counterDate.add(options, filtered); + if (counterDate.year > dateutil_default.MAXYEAR) { + return emitResult(iterResult); + } + if (!freqIsDailyOrGreater(freq)) { + timeset = ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, 0); + } + ii.rebuild(counterDate.year, counterDate.month); + } +} +function isFiltered(ii, currentDay, options) { + var bymonth = options.bymonth, byweekno = options.byweekno, byweekday = options.byweekday, byeaster = options.byeaster, bymonthday = options.bymonthday, bynmonthday = options.bynmonthday, byyearday = options.byyearday; + return notEmpty(bymonth) && !includes(bymonth, ii.mmask[currentDay]) || notEmpty(byweekno) && !ii.wnomask[currentDay] || notEmpty(byweekday) && !includes(byweekday, ii.wdaymask[currentDay]) || notEmpty(ii.nwdaymask) && !ii.nwdaymask[currentDay] || byeaster !== null && !includes(ii.eastermask, currentDay) || (notEmpty(bymonthday) || notEmpty(bynmonthday)) && !includes(bymonthday, ii.mdaymask[currentDay]) && !includes(bynmonthday, ii.nmdaymask[currentDay]) || notEmpty(byyearday) && (currentDay < ii.yearlen && !includes(byyearday, currentDay + 1) && !includes(byyearday, -ii.yearlen + currentDay) || currentDay >= ii.yearlen && !includes(byyearday, currentDay + 1 - ii.yearlen) && !includes(byyearday, -ii.nextyearlen + currentDay - ii.yearlen)); +} +function rezoneIfNeeded(date, options) { + return new DateWithZone(date, options.tzid).rezonedDate(); +} +function emitResult(iterResult) { + return iterResult.getValue(); +} +function removeFilteredDays(dayset, start, end, ii, options) { + var filtered = false; + for (var dayCounter = start; dayCounter < end; dayCounter++) { + var currentDay = dayset[dayCounter]; + filtered = isFiltered(ii, currentDay, options); + if (filtered) + dayset[currentDay] = null; + } + return filtered; +} +function makeTimeset(ii, counterDate, options) { + var freq = options.freq, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; + if (freqIsDailyOrGreater(freq)) { + return buildTimeset(options); + } + if (freq >= RRule.HOURLY && notEmpty(byhour) && !includes(byhour, counterDate.hour) || freq >= RRule.MINUTELY && notEmpty(byminute) && !includes(byminute, counterDate.minute) || freq >= RRule.SECONDLY && notEmpty(bysecond) && !includes(bysecond, counterDate.second)) { + return []; + } + return ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, counterDate.millisecond); +} + +// node_modules/rrule/dist/esm/rrule.js +var Days = { + MO: new Weekday(0), + TU: new Weekday(1), + WE: new Weekday(2), + TH: new Weekday(3), + FR: new Weekday(4), + SA: new Weekday(5), + SU: new Weekday(6) +}; +var DEFAULT_OPTIONS = { + freq: Frequency.YEARLY, + dtstart: null, + interval: 1, + wkst: Days.MO, + count: null, + until: null, + tzid: null, + bysetpos: null, + bymonth: null, + bymonthday: null, + bynmonthday: null, + byyearday: null, + byweekno: null, + byweekday: null, + bynweekday: null, + byhour: null, + byminute: null, + bysecond: null, + byeaster: null +}; +var defaultKeys = Object.keys(DEFAULT_OPTIONS); +var RRule = function() { + function RRule2(options, noCache) { + if (options === void 0) { + options = {}; + } + if (noCache === void 0) { + noCache = false; + } + this._cache = noCache ? null : new Cache(); + this.origOptions = initializeOptions(options); + var parsedOptions = parseOptions(options).parsedOptions; + this.options = parsedOptions; + } + RRule2.parseText = function(text2, language) { + return parseText(text2, language); + }; + RRule2.fromText = function(text2, language) { + return fromText(text2, language); + }; + RRule2.fromString = function(str) { + return new RRule2(RRule2.parseString(str) || void 0); + }; + RRule2.prototype._iter = function(iterResult) { + return iter(iterResult, this.options); + }; + RRule2.prototype._cacheGet = function(what, args) { + if (!this._cache) + return false; + return this._cache._cacheGet(what, args); + }; + RRule2.prototype._cacheAdd = function(what, value, args) { + if (!this._cache) + return; + return this._cache._cacheAdd(what, value, args); + }; + RRule2.prototype.all = function(iterator) { + if (iterator) { + return this._iter(new callbackiterresult_default("all", {}, iterator)); + } + var result = this._cacheGet("all"); + if (result === false) { + result = this._iter(new iterresult_default("all", {})); + this._cacheAdd("all", result); + } + return result; + }; + RRule2.prototype.between = function(after, before, inc, iterator) { + if (inc === void 0) { + inc = false; + } + if (!dateutil_default.isValidDate(after) || !dateutil_default.isValidDate(before)) { + throw new Error("Invalid date passed in to RRule.between"); + } + var args = { + before, + after, + inc + }; + if (iterator) { + return this._iter(new callbackiterresult_default("between", args, iterator)); + } + var result = this._cacheGet("between", args); + if (result === false) { + result = this._iter(new iterresult_default("between", args)); + this._cacheAdd("between", result, args); + } + return result; + }; + RRule2.prototype.before = function(dt, inc) { + if (inc === void 0) { + inc = false; + } + if (!dateutil_default.isValidDate(dt)) { + throw new Error("Invalid date passed in to RRule.before"); + } + var args = { dt, inc }; + var result = this._cacheGet("before", args); + if (result === false) { + result = this._iter(new iterresult_default("before", args)); + this._cacheAdd("before", result, args); + } + return result; + }; + RRule2.prototype.after = function(dt, inc) { + if (inc === void 0) { + inc = false; + } + if (!dateutil_default.isValidDate(dt)) { + throw new Error("Invalid date passed in to RRule.after"); + } + var args = { dt, inc }; + var result = this._cacheGet("after", args); + if (result === false) { + result = this._iter(new iterresult_default("after", args)); + this._cacheAdd("after", result, args); + } + return result; + }; + RRule2.prototype.count = function() { + return this.all().length; + }; + RRule2.prototype.toString = function() { + return optionsToString(this.origOptions); + }; + RRule2.prototype.toText = function(gettext, language, dateFormatter) { + return toText(this, gettext, language, dateFormatter); + }; + RRule2.prototype.isFullyConvertibleToText = function() { + return isFullyConvertible(this); + }; + RRule2.prototype.clone = function() { + return new RRule2(this.origOptions); + }; + RRule2.FREQUENCIES = [ + "YEARLY", + "MONTHLY", + "WEEKLY", + "DAILY", + "HOURLY", + "MINUTELY", + "SECONDLY" + ]; + RRule2.YEARLY = Frequency.YEARLY; + RRule2.MONTHLY = Frequency.MONTHLY; + RRule2.WEEKLY = Frequency.WEEKLY; + RRule2.DAILY = Frequency.DAILY; + RRule2.HOURLY = Frequency.HOURLY; + RRule2.MINUTELY = Frequency.MINUTELY; + RRule2.SECONDLY = Frequency.SECONDLY; + RRule2.MO = Days.MO; + RRule2.TU = Days.TU; + RRule2.WE = Days.WE; + RRule2.TH = Days.TH; + RRule2.FR = Days.FR; + RRule2.SA = Days.SA; + RRule2.SU = Days.SU; + RRule2.parseString = parseString; + RRule2.optionsToString = optionsToString; + return RRule2; +}(); + +// node_modules/rrule/dist/esm/iterset.js +function iterSet(iterResult, _rrule, _exrule, _rdate, _exdate, tzid) { + var _exdateHash = {}; + var _accept = iterResult.accept; + function evalExdate(after, before) { + _exrule.forEach(function(rrule) { + rrule.between(after, before, true).forEach(function(date) { + _exdateHash[Number(date)] = true; + }); + }); + } + _exdate.forEach(function(date) { + var zonedDate2 = new DateWithZone(date, tzid).rezonedDate(); + _exdateHash[Number(zonedDate2)] = true; + }); + iterResult.accept = function(date) { + var dt = Number(date); + if (isNaN(dt)) + return _accept.call(this, date); + if (!_exdateHash[dt]) { + evalExdate(new Date(dt - 1), new Date(dt + 1)); + if (!_exdateHash[dt]) { + _exdateHash[dt] = true; + return _accept.call(this, date); + } + } + return true; + }; + if (iterResult.method === "between") { + evalExdate(iterResult.args.after, iterResult.args.before); + iterResult.accept = function(date) { + var dt = Number(date); + if (!_exdateHash[dt]) { + _exdateHash[dt] = true; + return _accept.call(this, date); + } + return true; + }; + } + for (var i = 0; i < _rdate.length; i++) { + var zonedDate = new DateWithZone(_rdate[i], tzid).rezonedDate(); + if (!iterResult.accept(new Date(zonedDate.getTime()))) + break; + } + _rrule.forEach(function(rrule) { + iter(iterResult, rrule.options); + }); + var res = iterResult._result; + dateutil_default.sort(res); + switch (iterResult.method) { + case "all": + case "between": + return res; + case "before": + return res.length && res[res.length - 1] || null; + case "after": + default: + return res.length && res[0] || null; + } +} + +// node_modules/rrule/dist/esm/rrulestr.js +var DEFAULT_OPTIONS2 = { + dtstart: null, + cache: false, + unfold: false, + forceset: false, + compatible: false, + tzid: null +}; +function parseInput(s, options) { + var rrulevals = []; + var rdatevals = []; + var exrulevals = []; + var exdatevals = []; + var parsedDtstart = parseDtstart(s); + var dtstart = parsedDtstart.dtstart; + var tzid = parsedDtstart.tzid; + var lines = splitIntoLines(s, options.unfold); + lines.forEach(function(line) { + var _a; + if (!line) + return; + var _b = breakDownLine(line), name = _b.name, parms = _b.parms, value = _b.value; + switch (name.toUpperCase()) { + case "RRULE": + if (parms.length) { + throw new Error("unsupported RRULE parm: ".concat(parms.join(","))); + } + rrulevals.push(parseString(line)); + break; + case "RDATE": + var _c = (_a = /RDATE(?:;TZID=([^:=]+))?/i.exec(line)) !== null && _a !== void 0 ? _a : [], rdateTzid = _c[1]; + if (rdateTzid && !tzid) { + tzid = rdateTzid; + } + rdatevals = rdatevals.concat(parseRDate(value, parms)); + break; + case "EXRULE": + if (parms.length) { + throw new Error("unsupported EXRULE parm: ".concat(parms.join(","))); + } + exrulevals.push(parseString(value)); + break; + case "EXDATE": + exdatevals = exdatevals.concat(parseRDate(value, parms)); + break; + case "DTSTART": + break; + default: + throw new Error("unsupported property: " + name); + } + }); + return { + dtstart, + tzid, + rrulevals, + rdatevals, + exrulevals, + exdatevals + }; +} +function buildRule(s, options) { + var _a = parseInput(s, options), rrulevals = _a.rrulevals, rdatevals = _a.rdatevals, exrulevals = _a.exrulevals, exdatevals = _a.exdatevals, dtstart = _a.dtstart, tzid = _a.tzid; + var noCache = options.cache === false; + if (options.compatible) { + options.forceset = true; + options.unfold = true; + } + if (options.forceset || rrulevals.length > 1 || rdatevals.length || exrulevals.length || exdatevals.length) { + var rset_1 = new RRuleSet(noCache); + rset_1.dtstart(dtstart); + rset_1.tzid(tzid || void 0); + rrulevals.forEach(function(val2) { + rset_1.rrule(new RRule(groomRruleOptions(val2, dtstart, tzid), noCache)); + }); + rdatevals.forEach(function(date) { + rset_1.rdate(date); + }); + exrulevals.forEach(function(val2) { + rset_1.exrule(new RRule(groomRruleOptions(val2, dtstart, tzid), noCache)); + }); + exdatevals.forEach(function(date) { + rset_1.exdate(date); + }); + if (options.compatible && options.dtstart) + rset_1.rdate(dtstart); + return rset_1; + } + var val = rrulevals[0] || {}; + return new RRule(groomRruleOptions(val, val.dtstart || options.dtstart || dtstart, val.tzid || options.tzid || tzid), noCache); +} +function rrulestr(s, options) { + if (options === void 0) { + options = {}; + } + return buildRule(s, initializeOptions2(options)); +} +function groomRruleOptions(val, dtstart, tzid) { + return __assign(__assign({}, val), { dtstart, tzid }); +} +function initializeOptions2(options) { + var invalid = []; + var keys = Object.keys(options); + var defaultKeys2 = Object.keys(DEFAULT_OPTIONS2); + keys.forEach(function(key) { + if (!includes(defaultKeys2, key)) + invalid.push(key); + }); + if (invalid.length) { + throw new Error("Invalid options: " + invalid.join(", ")); + } + return __assign(__assign({}, DEFAULT_OPTIONS2), options); +} +function extractName(line) { + if (line.indexOf(":") === -1) { + return { + name: "RRULE", + value: line + }; + } + var _a = split(line, ":", 1), name = _a[0], value = _a[1]; + return { + name, + value + }; +} +function breakDownLine(line) { + var _a = extractName(line), name = _a.name, value = _a.value; + var parms = name.split(";"); + if (!parms) + throw new Error("empty property name"); + return { + name: parms[0].toUpperCase(), + parms: parms.slice(1), + value + }; +} +function splitIntoLines(s, unfold) { + if (unfold === void 0) { + unfold = false; + } + s = s && s.trim(); + if (!s) + throw new Error("Invalid empty string"); + if (!unfold) { + return s.split(/\s/); + } + var lines = s.split("\n"); + var i = 0; + while (i < lines.length) { + var line = lines[i] = lines[i].replace(/\s+$/g, ""); + if (!line) { + lines.splice(i, 1); + } else if (i > 0 && line[0] === " ") { + lines[i - 1] += line.slice(1); + lines.splice(i, 1); + } else { + i += 1; + } + } + return lines; +} +function validateDateParm(parms) { + parms.forEach(function(parm) { + if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) { + throw new Error("unsupported RDATE/EXDATE parm: " + parm); + } + }); +} +function parseRDate(rdateval, parms) { + validateDateParm(parms); + return rdateval.split(",").map(function(datestr) { + return dateutil_default.untilStringToDate(datestr); + }); +} + +// node_modules/rrule/dist/esm/rruleset.js +function createGetterSetter(fieldName) { + var _this = this; + return function(field) { + if (field !== void 0) { + _this["_".concat(fieldName)] = field; + } + if (_this["_".concat(fieldName)] !== void 0) { + return _this["_".concat(fieldName)]; + } + for (var i = 0; i < _this._rrule.length; i++) { + var field_1 = _this._rrule[i].origOptions[fieldName]; + if (field_1) { + return field_1; + } + } + }; +} +var RRuleSet = function(_super) { + __extends(RRuleSet2, _super); + function RRuleSet2(noCache) { + if (noCache === void 0) { + noCache = false; + } + var _this = _super.call(this, {}, noCache) || this; + _this.dtstart = createGetterSetter.apply(_this, ["dtstart"]); + _this.tzid = createGetterSetter.apply(_this, ["tzid"]); + _this._rrule = []; + _this._rdate = []; + _this._exrule = []; + _this._exdate = []; + return _this; + } + RRuleSet2.prototype._iter = function(iterResult) { + return iterSet(iterResult, this._rrule, this._exrule, this._rdate, this._exdate, this.tzid()); + }; + RRuleSet2.prototype.rrule = function(rrule) { + _addRule(rrule, this._rrule); + }; + RRuleSet2.prototype.exrule = function(rrule) { + _addRule(rrule, this._exrule); + }; + RRuleSet2.prototype.rdate = function(date) { + _addDate(date, this._rdate); + }; + RRuleSet2.prototype.exdate = function(date) { + _addDate(date, this._exdate); + }; + RRuleSet2.prototype.rrules = function() { + return this._rrule.map(function(e) { + return rrulestr(e.toString()); + }); + }; + RRuleSet2.prototype.exrules = function() { + return this._exrule.map(function(e) { + return rrulestr(e.toString()); + }); + }; + RRuleSet2.prototype.rdates = function() { + return this._rdate.map(function(e) { + return new Date(e.getTime()); + }); + }; + RRuleSet2.prototype.exdates = function() { + return this._exdate.map(function(e) { + return new Date(e.getTime()); + }); + }; + RRuleSet2.prototype.valueOf = function() { + var result = []; + if (!this._rrule.length && this._dtstart) { + result = result.concat(optionsToString({ dtstart: this._dtstart })); + } + this._rrule.forEach(function(rrule) { + result = result.concat(rrule.toString().split("\n")); + }); + this._exrule.forEach(function(exrule) { + result = result.concat(exrule.toString().split("\n").map(function(line) { + return line.replace(/^RRULE:/, "EXRULE:"); + }).filter(function(line) { + return !/^DTSTART/.test(line); + })); + }); + if (this._rdate.length) { + result.push(rdatesToString("RDATE", this._rdate, this.tzid())); + } + if (this._exdate.length) { + result.push(rdatesToString("EXDATE", this._exdate, this.tzid())); + } + return result; + }; + RRuleSet2.prototype.toString = function() { + return this.valueOf().join("\n"); + }; + RRuleSet2.prototype.clone = function() { + var rrs = new RRuleSet2(!!this._cache); + this._rrule.forEach(function(rule) { + return rrs.rrule(rule.clone()); + }); + this._exrule.forEach(function(rule) { + return rrs.exrule(rule.clone()); + }); + this._rdate.forEach(function(date) { + return rrs.rdate(new Date(date.getTime())); + }); + this._exdate.forEach(function(date) { + return rrs.exdate(new Date(date.getTime())); + }); + return rrs; + }; + return RRuleSet2; +}(RRule); +function _addRule(rrule, collection) { + if (!(rrule instanceof RRule)) { + throw new TypeError(String(rrule) + " is not RRule instance"); + } + if (!includes(collection.map(String), String(rrule))) { + collection.push(rrule); + } +} +function _addDate(date, collection) { + if (!(date instanceof Date)) { + throw new TypeError(String(date) + " is not Date instance"); + } + if (!includes(collection.map(Number), Number(date))) { + collection.push(date); + dateutil_default.sort(collection); + } +} +function rdatesToString(param, rdates, tzid) { + var isUTC = !tzid || tzid.toUpperCase() === "UTC"; + var header = isUTC ? "".concat(param, ":") : "".concat(param, ";TZID=").concat(tzid, ":"); + var dateString = rdates.map(function(rdate) { + return dateutil_default.timeToUntilString(rdate.valueOf(), isUTC); + }).join(","); + return "".concat(header).concat(dateString); +} + +// src/lib/DateTools.ts +function compareByDate(a, b) { + if (a !== null && b === null) { + return -1; + } else if (a === null && b !== null) { + return 1; + } else if (a !== null && b !== null) { + if (a.isValid() && !b.isValid()) { + return -1; + } else if (!a.isValid() && b.isValid()) { + return 1; + } + if (a.isAfter(b)) { + return 1; + } else if (a.isBefore(b)) { + return -1; + } else { + return 0; + } + } else { + return 0; + } +} + +// src/Recurrence.ts +var Recurrence = class { + constructor({ + rrule, + baseOnToday, + referenceDate, + startDate, + scheduledDate, + dueDate + }) { + this.rrule = rrule; + this.baseOnToday = baseOnToday; + this.referenceDate = referenceDate; + this.startDate = startDate; + this.scheduledDate = scheduledDate; + this.dueDate = dueDate; + } + static fromText({ + recurrenceRuleText, + startDate, + scheduledDate, + dueDate + }) { + try { + const match = recurrenceRuleText.match(/^([a-zA-Z0-9, !]+?)( when done)?$/i); + if (match == null) { + return null; + } + const isolatedRuleText = match[1].trim(); + const baseOnToday = match[2] !== void 0; + const options = RRule.parseText(isolatedRuleText); + if (options !== null) { + let referenceDate = null; + if (dueDate) { + referenceDate = window.moment(dueDate); + } else if (scheduledDate) { + referenceDate = window.moment(scheduledDate); + } else if (startDate) { + referenceDate = window.moment(startDate); + } + if (!baseOnToday && referenceDate !== null) { + options.dtstart = window.moment(referenceDate).startOf("day").utc(true).toDate(); + } else { + options.dtstart = window.moment().startOf("day").utc(true).toDate(); + } + const rrule = new RRule(options); + return new Recurrence({ + rrule, + baseOnToday, + referenceDate, + startDate, + scheduledDate, + dueDate + }); + } + } catch (error) { + } + return null; + } + toText() { + let text2 = this.rrule.toText(); + if (this.baseOnToday) { + text2 += " when done"; + } + return text2; + } + next() { + var _a; + let next; + if (this.baseOnToday) { + const today = window.moment(); + const ruleBasedOnToday = new RRule(__spreadProps(__spreadValues({}, this.rrule.origOptions), { + dtstart: today.startOf("day").utc(true).toDate() + })); + next = this.nextAfter(today.endOf("day"), ruleBasedOnToday); + } else { + const after = window.moment((_a = this.referenceDate) != null ? _a : void 0).endOf("day"); + next = this.nextAfter(after, this.rrule); + } + if (next !== null) { + let startDate = null; + let scheduledDate = null; + let dueDate = null; + if (this.referenceDate) { + if (this.startDate) { + const originalDifference = window.moment.duration(this.startDate.diff(this.referenceDate)); + startDate = window.moment(next); + startDate.add(Math.round(originalDifference.asDays()), "days"); + } + if (this.scheduledDate) { + const originalDifference = window.moment.duration(this.scheduledDate.diff(this.referenceDate)); + scheduledDate = window.moment(next); + scheduledDate.add(Math.round(originalDifference.asDays()), "days"); + } + if (this.dueDate) { + const originalDifference = window.moment.duration(this.dueDate.diff(this.referenceDate)); + dueDate = window.moment(next); + dueDate.add(Math.round(originalDifference.asDays()), "days"); + } + } + return { + startDate, + scheduledDate, + dueDate + }; + } + return null; + } + identicalTo(other) { + if (this.baseOnToday !== other.baseOnToday) { + return false; + } + if (compareByDate(this.startDate, other.startDate) !== 0) { + return false; + } + if (compareByDate(this.scheduledDate, other.scheduledDate) !== 0) { + return false; + } + if (compareByDate(this.dueDate, other.dueDate) !== 0) { + return false; + } + return this.toText() === other.toText(); + } + nextAfter(after, rrule) { + after.utc(true); + let next = window.moment(rrule.after(after.toDate())); + const asText = this.toText(); + const monthMatch = asText.match(/every( \d+)? month(s)?(.*)?/); + if (monthMatch !== null) { + if (!asText.includes(" on ")) { + next = Recurrence.nextAfterMonths(after, next, rrule, monthMatch[1]); + } + } + const yearMatch = asText.match(/every( \d+)? year(s)?(.*)?/); + if (yearMatch !== null) { + next = Recurrence.nextAfterYears(after, next, rrule, yearMatch[1]); + } + return Recurrence.addTimezone(next).toDate(); + } + static nextAfterMonths(after, next, rrule, skippingMonths) { + let parsedSkippingMonths = 1; + if (skippingMonths !== void 0) { + parsedSkippingMonths = Number.parseInt(skippingMonths.trim(), 10); + } + while (Recurrence.isSkippingTooManyMonths(after, next, parsedSkippingMonths)) { + next = Recurrence.fromOneDayEarlier(after, rrule); + } + return next; + } + static isSkippingTooManyMonths(after, next, skippingMonths) { + let diffMonths = next.month() - after.month(); + const diffYears = next.year() - after.year(); + diffMonths += diffYears * 12; + return diffMonths > skippingMonths; + } + static nextAfterYears(after, next, rrule, skippingYears) { + let parsedSkippingYears = 1; + if (skippingYears !== void 0) { + parsedSkippingYears = Number.parseInt(skippingYears.trim(), 10); + } + while (Recurrence.isSkippingTooManyYears(after, next, parsedSkippingYears)) { + next = Recurrence.fromOneDayEarlier(after, rrule); + } + return next; + } + static isSkippingTooManyYears(after, next, skippingYears) { + const diff = next.year() - after.year(); + return diff > skippingYears; + } + static fromOneDayEarlier(after, rrule) { + after.subtract(1, "days").endOf("day"); + const options = rrule.origOptions; + options.dtstart = after.startOf("day").toDate(); + rrule = new RRule(options); + return window.moment(rrule.after(after.toDate())); + } + static addTimezone(date) { + const localTimeZone = window.moment.utc(date).local(true); + return localTimeZone.startOf("day"); + } +}; + +// src/StatusConfiguration.ts +var StatusType = /* @__PURE__ */ ((StatusType2) => { + StatusType2["TODO"] = "TODO"; + StatusType2["DONE"] = "DONE"; + StatusType2["IN_PROGRESS"] = "IN_PROGRESS"; + StatusType2["CANCELLED"] = "CANCELLED"; + StatusType2["NON_TASK"] = "NON_TASK"; + StatusType2["EMPTY"] = "EMPTY"; + return StatusType2; +})(StatusType || {}); +var StatusConfiguration = class { + constructor(symbol, name, nextStatusSymbol, availableAsCommand, type = "TODO" /* TODO */) { + this.symbol = symbol; + this.name = name; + this.nextStatusSymbol = nextStatusSymbol; + this.availableAsCommand = availableAsCommand; + this.type = type; + } +}; + +// src/Status.ts +var _Status = class { + get symbol() { + return this.configuration.symbol; + } + get name() { + return this.configuration.name; + } + get nextStatusSymbol() { + return this.configuration.nextStatusSymbol; + } + get availableAsCommand() { + return this.configuration.availableAsCommand; + } + get type() { + return this.configuration.type; + } + constructor(configuration) { + this.configuration = configuration; + } + static makeDone() { + return new _Status(new StatusConfiguration("x", "Done", " ", true, "DONE" /* DONE */)); + } + static makeEmpty() { + return new _Status(new StatusConfiguration("", "EMPTY", "", true, "EMPTY" /* EMPTY */)); + } + static makeTodo() { + return new _Status(new StatusConfiguration(" ", "Todo", "x", true, "TODO" /* TODO */)); + } + static makeCancelled() { + return new _Status(new StatusConfiguration("-", "Cancelled", " ", true, "CANCELLED" /* CANCELLED */)); + } + static makeInProgress() { + return new _Status(new StatusConfiguration("/", "In Progress", "x", true, "IN_PROGRESS" /* IN_PROGRESS */)); + } + static getTypeForUnknownSymbol(symbol) { + switch (symbol) { + case "x": + case "X": + return "DONE" /* DONE */; + case "/": + return "IN_PROGRESS" /* IN_PROGRESS */; + case "-": + return "CANCELLED" /* CANCELLED */; + case "": + return "EMPTY" /* EMPTY */; + case " ": + default: + return "TODO" /* TODO */; + } + } + static getTypeFromStatusTypeString(statusTypeAsString) { + return StatusType[statusTypeAsString] || "TODO" /* TODO */; + } + static createUnknownStatus(unknownSymbol) { + return new _Status(new StatusConfiguration(unknownSymbol, "Unknown", "x", false, "TODO" /* TODO */)); + } + static createFromImportedValue(imported) { + const symbol = imported[0]; + const type = _Status.getTypeFromStatusTypeString(imported[3]); + return new _Status(new StatusConfiguration(symbol, imported[1], imported[2], false, type)); + } + isCompleted() { + return this.type === "DONE" /* DONE */; + } + previewText() { + let commandNotice = ""; + if (_Status.tasksPluginCanCreateCommandsForStatuses() && this.availableAsCommand) { + commandNotice = " Available as a command."; + } + return `- [${this.symbol}] => [${this.nextStatusSymbol}], name: '${this.name}', type: '${this.configuration.type}'.${commandNotice}`; + } + static tasksPluginCanCreateCommandsForStatuses() { + return false; + } +}; +var Status = _Status; +Status.DONE = _Status.makeDone(); +Status.EMPTY = _Status.makeEmpty(); +Status.TODO = _Status.makeTodo(); + +// src/Config/StatusSettings.ts +var StatusSettings = class { + constructor() { + this.coreStatuses = [ + Status.makeTodo().configuration, + Status.makeDone().configuration + ]; + this.customStatuses = [ + Status.makeInProgress().configuration, + Status.makeCancelled().configuration + ]; + } + static addStatus(statuses, newStatus) { + statuses.push(newStatus); + } + static replaceStatus(statuses, originalStatus, newStatus) { + const index = this.findStatusIndex(originalStatus, statuses); + if (index <= -1) { + return false; + } + statuses.splice(index, 1, newStatus); + return true; + } + static findStatusIndex(statusConfiguration, statuses) { + const originalStatusAsStatus = new Status(statusConfiguration); + return statuses.findIndex((s) => { + return new Status(s).previewText() == originalStatusAsStatus.previewText(); + }); + } + static deleteStatus(statuses, status) { + const index = this.findStatusIndex(status, statuses); + if (index <= -1) { + return false; + } + statuses.splice(index, 1); + return true; + } + static deleteAllCustomStatuses(statusSettings) { + statusSettings.customStatuses.splice(0); + } + static resetAllCustomStatuses(statusSettings) { + StatusSettings.deleteAllCustomStatuses(statusSettings); + const defaultSettings2 = new StatusSettings(); + defaultSettings2.customStatuses.forEach((s) => { + StatusSettings.addStatus(statusSettings.customStatuses, s); + }); + } + static bulkAddStatusCollection(statusSettings, supportedStatuses) { + const notices = []; + supportedStatuses.forEach((importedStatus) => { + const hasStatus = statusSettings.customStatuses.find((element2) => { + return element2.symbol == importedStatus[0] && element2.name == importedStatus[1] && element2.nextStatusSymbol == importedStatus[2]; + }); + if (!hasStatus) { + StatusSettings.addStatus(statusSettings.customStatuses, Status.createFromImportedValue(importedStatus)); + } else { + notices.push(`The status ${importedStatus[1]} (${importedStatus[0]}) is already added.`); + } + }); + return notices; + } + static applyToStatusRegistry(statusSettings, statusRegistry) { + statusRegistry.clearStatuses(); + statusSettings.coreStatuses.forEach((statusType) => { + statusRegistry.add(statusType); + }); + statusSettings.customStatuses.forEach((statusType) => { + statusRegistry.add(statusType); + }); + } +}; + +// src/Config/featureConfiguration.json +var featureConfiguration_default = [ + { + index: 9999, + internalName: "INTERNAL_TESTING_ENABLED_BY_DEFAULT", + displayName: "Test Item. Used to validate the Feature Framework.", + description: "Description", + enabledByDefault: true, + stable: false + } +]; + +// src/Config/Feature.ts +var Feature = class { + constructor(internalName, index, description, displayName, enabledByDefault, stable) { + this.internalName = internalName; + this.index = index; + this.description = description; + this.displayName = displayName; + this.enabledByDefault = enabledByDefault; + this.stable = stable; + } + static get values() { + let availableFeatures = []; + featureConfiguration_default.forEach((feature) => { + availableFeatures = [ + ...availableFeatures, + new Feature( + feature.internalName, + feature.index, + feature.description, + feature.displayName, + feature.enabledByDefault, + feature.stable + ) + ]; + }); + return availableFeatures; + } + static get settingsFlags() { + const featureFlags = {}; + Feature.values.forEach((feature) => { + featureFlags[feature.internalName] = feature.enabledByDefault; + }); + return featureFlags; + } + static fromString(name) { + for (const feature of Feature.values) { + if (name === feature.internalName) { + return feature; + } + } + throw new RangeError( + `Illegal argument passed to fromString(): ${name} does not correspond to any available Feature ${this.prototype.constructor.name}` + ); + } +}; + +// src/Config/Settings.ts +var defaultSettings = { + globalFilter: "", + removeGlobalFilter: false, + setDoneDate: true, + autoSuggestInEditor: true, + autoSuggestMinMatch: 0, + autoSuggestMaxItems: 6, + provideAccessKeys: true, + useFilenameAsScheduledDate: false, + filenameAsDateFolders: [], + statusSettings: new StatusSettings(), + features: Feature.settingsFlags, + generalSettings: {}, + headingOpened: {} +}; +var settings = __spreadValues({}, defaultSettings); +var getSettings = () => { + for (const flag in Feature.settingsFlags) { + if (settings.features[flag] === void 0) { + settings.features[flag] = Feature.settingsFlags[flag]; + } + } + settings.statusSettings.customStatuses.forEach((s, index, array) => { + var _a, _b; + const newType = Status.getTypeFromStatusTypeString(s.type); + array[index] = new StatusConfiguration( + (_a = s.symbol) != null ? _a : " ", + s.name, + (_b = s.nextStatusSymbol) != null ? _b : "x", + s.availableAsCommand, + newType + ); + }); + return __spreadValues({}, settings); +}; +var updateSettings = (newSettings) => { + settings = __spreadValues(__spreadValues({}, settings), newSettings); + return getSettings(); +}; +var updateGeneralSetting = (name, value) => { + settings.generalSettings[name] = value; + return getSettings(); +}; +var isFeatureEnabled = (internalName) => { + var _a; + return (_a = settings.features[internalName]) != null ? _a : false; +}; + +// src/StatusRegistry.ts +var StatusRegistry = class { + constructor() { + this._registeredStatuses = []; + this.addDefaultStatusTypes(); + } + get registeredStatuses() { + return this._registeredStatuses.filter(({ symbol }) => symbol !== Status.EMPTY.symbol); + } + static getInstance() { + if (!StatusRegistry.instance) { + StatusRegistry.instance = new StatusRegistry(); + } + return StatusRegistry.instance; + } + add(status) { + if (!this.hasSymbol(status.symbol)) { + if (status instanceof Status) { + this._registeredStatuses.push(status); + } else { + this._registeredStatuses.push(new Status(status)); + } + } + } + bySymbol(symbol) { + if (this.hasSymbol(symbol)) { + return this.getSymbol(symbol); + } + return Status.EMPTY; + } + bySymbolOrCreate(symbol) { + if (this.hasSymbol(symbol)) { + return this.getSymbol(symbol); + } + return Status.createUnknownStatus(symbol); + } + byName(nameToFind) { + if (this._registeredStatuses.filter(({ name }) => name === nameToFind).length > 0) { + return this._registeredStatuses.filter(({ name }) => name === nameToFind)[0]; + } + return Status.EMPTY; + } + resetToDefaultStatuses() { + this.clearStatuses(); + this.addDefaultStatusTypes(); + } + clearStatuses() { + this._registeredStatuses = []; + } + getNextStatus(status) { + if (status.nextStatusSymbol !== "") { + const nextStatus = this.bySymbol(status.nextStatusSymbol); + if (nextStatus !== null) { + return nextStatus; + } + } + return Status.EMPTY; + } + getNextStatusOrCreate(status) { + const nextStatus = this.getNextStatus(status); + if (nextStatus.type !== "EMPTY" /* EMPTY */) { + return nextStatus; + } + return Status.createUnknownStatus(status.nextStatusSymbol); + } + findUnknownStatuses(allStatuses) { + const unknownStatuses = allStatuses.filter((s) => { + return !this.hasSymbol(s.symbol); + }); + const newStatusRegistry = new StatusRegistry(); + const namedUniqueStatuses = []; + unknownStatuses.forEach((s) => { + if (newStatusRegistry.hasSymbol(s.symbol)) { + return; + } + const newStatus = StatusRegistry.copyStatusWithNewName(s, `Unknown (${s.symbol})`); + namedUniqueStatuses.push(newStatus); + newStatusRegistry.add(newStatus); + }); + return namedUniqueStatuses; + } + static copyStatusWithNewName(s, newName) { + const statusConfiguration = new StatusConfiguration( + s.symbol, + newName, + s.nextStatusSymbol, + s.availableAsCommand, + s.type + ); + return new Status(statusConfiguration); + } + getSymbol(symbolToFind) { + return this._registeredStatuses.filter(({ symbol }) => symbol === symbolToFind)[0]; + } + hasSymbol(symbolToFind) { + return this._registeredStatuses.find((element2) => { + return element2.symbol === symbolToFind; + }) !== void 0; + } + addDefaultStatusTypes() { + const defaultStatuses = [Status.makeTodo(), Status.makeInProgress(), Status.makeDone(), Status.makeCancelled()]; + defaultStatuses.forEach((status) => { + this.add(status); + }); + } +}; + +// src/Urgency.ts +var _Urgency = class { + static calculate(task) { + let urgency = 0; + if (task.dueDate !== null) { + const daysOverdue = Math.round(window.moment().diff(task.dueDate) / _Urgency.milliSecondsPerDay); + let dueMultiplier; + if (daysOverdue >= 7) { + dueMultiplier = 1; + } else if (daysOverdue >= -14) { + dueMultiplier = (daysOverdue + 14) * 0.8 / 21 + 0.2; + } else { + dueMultiplier = 0.2; + } + urgency += dueMultiplier * _Urgency.dueCoefficient; + } + if (task.scheduledDate !== null) { + if (window.moment().isSameOrAfter(task.scheduledDate)) { + urgency += 1 * _Urgency.scheduledCoefficient; + } + } + if (task.startDate !== null) { + if (window.moment().isBefore(task.startDate)) { + urgency += 1 * _Urgency.startedCoefficient; + } + } + switch (task.priority) { + case "1": + urgency += 1 * _Urgency.priorityCoefficient; + break; + case "2": + urgency += 0.65 * _Urgency.priorityCoefficient; + break; + case "3": + urgency += 0.325 * _Urgency.priorityCoefficient; + break; + } + return urgency; + } +}; +var Urgency = _Urgency; +Urgency.dueCoefficient = 12; +Urgency.scheduledCoefficient = 5; +Urgency.startedCoefficient = -3; +Urgency.priorityCoefficient = 6; +Urgency.milliSecondsPerDay = 1e3 * 60 * 60 * 24; + +// src/TaskLineRenderer.ts +var import_obsidian2 = require("obsidian"); + +// src/File.ts +var import_obsidian = require("obsidian"); +var metadataCache; +var vault; +var initializeFile = ({ + metadataCache: newMetadataCache, + vault: newVault +}) => { + metadataCache = newMetadataCache; + vault = newVault; +}; +var replaceTaskWithTasks = (_0) => __async(void 0, [_0], function* ({ + originalTask, + newTasks +}) { + if (vault === void 0 || metadataCache === void 0) { + console.error("Tasks: cannot use File before initializing it."); + return; + } + if (!Array.isArray(newTasks)) { + newTasks = [newTasks]; + } + tryRepetitive({ + originalTask, + newTasks, + vault, + metadataCache, + previousTries: 0 + }); +}); +var tryRepetitive = (_0) => __async(void 0, [_0], function* ({ + originalTask, + newTasks, + vault: vault2, + metadataCache: metadataCache2, + previousTries +}) { + const retry = () => { + if (previousTries > 10) { + console.error("Tasks: Too many retries. File update not possible ..."); + return; + } + const timeout = Math.min(Math.pow(10, previousTries), 100); + setTimeout(() => { + tryRepetitive({ + originalTask, + newTasks, + vault: vault2, + metadataCache: metadataCache2, + previousTries: previousTries + 1 + }); + }, timeout); + }; + const file = vault2.getAbstractFileByPath(originalTask.path); + if (!(file instanceof import_obsidian.TFile)) { + console.warn(`Tasks: No file found for task ${originalTask.description}. Retrying ...`); + return retry(); + } + if (file.extension !== "md") { + console.error("Tasks: Only supporting files with the .md file extension."); + return; + } + const fileCache = metadataCache2.getFileCache(file); + if (fileCache == void 0 || fileCache === null) { + console.warn(`Tasks: No file cache found for file ${file.path}. Retrying ...`); + return retry(); + } + const listItemsCache = fileCache.listItems; + if (listItemsCache === void 0 || listItemsCache.length === 0) { + console.warn(`Tasks: No list items found in file cache of ${file.path}. Retrying ...`); + return retry(); + } + const fileContent = yield vault2.read(file); + const fileLines = fileContent.split("\n"); + const { globalFilter } = getSettings(); + let listItem; + let sectionIndex = 0; + for (const listItemCache of listItemsCache) { + if (listItemCache.position.start.line < originalTask.sectionStart) { + continue; + } + if (listItemCache.task === void 0) { + continue; + } + const line = fileLines[listItemCache.position.start.line]; + if (line.includes(globalFilter)) { + if (sectionIndex === originalTask.sectionIndex) { + listItem = listItemCache; + break; + } + sectionIndex++; + } + } + if (listItem === void 0) { + console.error("Tasks: could not find task to toggle in the file."); + return; + } + const updatedFileLines = [ + ...fileLines.slice(0, listItem.position.start.line), + ...newTasks.map((task) => task.toFileLineString()), + ...fileLines.slice(listItem.position.start.line + 1) + ]; + yield vault2.modify(file, updatedFileLines.join("\n")); +}); + +// src/TaskLineRenderer.ts +var LayoutClasses = { + description: "task-description", + priority: "task-priority", + dueDate: "task-due", + startDate: "task-start", + scheduledDate: "task-scheduled", + doneDate: "task-done", + recurrenceRule: "task-recurring", + blockLink: "" +}; +var MAX_DAY_VALUE_RANGE = 7; +var DAY_VALUE_OVER_RANGE_POSTFIX = "far"; +function obsidianMarkdownRenderer(text2, element2, path) { + return __async(this, null, function* () { + yield import_obsidian2.MarkdownRenderer.renderMarkdown(text2, element2, path, null); + }); +} +function renderTaskLine(task, renderDetails, textRenderer = null) { + return __async(this, null, function* () { + var _a; + if (!textRenderer) + textRenderer = obsidianMarkdownRenderer; + const li = document.createElement("li"); + renderDetails.parentUlElement.appendChild(li); + li.classList.add("task-list-item", "plugin-tasks-list-item"); + const textSpan = document.createElement("span"); + li.appendChild(textSpan); + textSpan.classList.add("tasks-list-text"); + const attributes = yield taskToHtml(task, renderDetails, textSpan, textRenderer); + for (const key in attributes) + li.dataset[key] = attributes[key]; + const checkbox = document.createElement("input"); + li.appendChild(checkbox); + checkbox.classList.add("task-list-item-checkbox"); + checkbox.type = "checkbox"; + if (task.status.symbol !== " ") { + checkbox.checked = true; + li.classList.add("is-checked"); + } + checkbox.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + checkbox.disabled = true; + const toggledTasks = task.toggle(); + replaceTaskWithTasks({ + originalTask: task, + newTasks: toggledTasks + }); + }); + li.prepend(checkbox); + li.setAttribute("data-task", task.status.symbol.trim()); + li.setAttribute("data-line", renderDetails.listIndex.toString()); + checkbox.setAttribute("data-line", renderDetails.listIndex.toString()); + if ((_a = renderDetails.layoutOptions) == null ? void 0 : _a.shortMode) { + addTooltip({ task, element: textSpan, isFilenameUnique: renderDetails.isFilenameUnique }); + } + return li; + }); +} +function taskToHtml(task, renderDetails, parentElement, textRenderer) { + return __async(this, null, function* () { + var _a; + let allAttributes = {}; + const taskLayout = (_a = renderDetails.taskLayout) != null ? _a : new TaskLayout(renderDetails.layoutOptions); + for (const component of taskLayout.layoutComponents) { + let componentString = task.componentToString(taskLayout, component); + if (componentString) { + if (component === "description") + componentString = removeGlobalFilterIfNeeded(componentString); + const span = document.createElement("span"); + parentElement.appendChild(span); + if (span) { + const internalSpan = document.createElement("span"); + span.appendChild(internalSpan); + yield renderComponentText(internalSpan, componentString, component, task, textRenderer); + const [genericClasses, dataAttributes] = getComponentClassesAndData(component, task); + addInternalClasses(component, internalSpan); + span.classList.add(...genericClasses); + for (const key in dataAttributes) + span.dataset[key] = dataAttributes[key]; + allAttributes = __spreadValues(__spreadValues({}, allAttributes), dataAttributes); + } + } + } + for (const component of taskLayout.hiddenComponents) { + const [_, dataAttributes] = getComponentClassesAndData(component, task); + allAttributes = __spreadValues(__spreadValues({}, allAttributes), dataAttributes); + } + return allAttributes; + }); +} +function renderComponentText(span, componentString, component, task, textRenderer) { + return __async(this, null, function* () { + if (component === "description") { + yield textRenderer(componentString, span, task.path); + const blockQuote = span.querySelector("blockquote"); + const directParentOfPTag = blockQuote != null ? blockQuote : span; + const pElement = directParentOfPTag.querySelector("p"); + if (pElement !== null) { + while (pElement.firstChild) { + directParentOfPTag.insertBefore(pElement.firstChild, pElement); + } + pElement.remove(); + } + span.querySelectorAll("p").forEach((pElement2) => { + if (!pElement2.hasChildNodes()) { + pElement2.remove(); + } + }); + span.querySelectorAll(".footnotes").forEach((footnoteElement) => { + footnoteElement.remove(); + }); + } else { + span.innerHTML = componentString; + } + }); +} +function getComponentClassesAndData(component, task) { + const genericClasses = []; + const dataAttributes = {}; + const setDateAttribute = (date, attributeName) => { + const dateValue = dateToAttribute(date); + if (dateValue) + dataAttributes[attributeName] = dateValue; + }; + switch (component) { + case "description": + genericClasses.push(LayoutClasses.description); + break; + case "priority": { + let priorityValue = null; + if (task.priority === "1" /* High */) + priorityValue = "high"; + else if (task.priority === "2" /* Medium */) + priorityValue = "medium"; + else if (task.priority === "4" /* Low */) + priorityValue = "low"; + else + priorityValue = "none"; + dataAttributes["taskPriority"] = priorityValue; + genericClasses.push(LayoutClasses.priority); + break; + } + case "dueDate": { + const date = task.dueDate; + if (date) { + genericClasses.push(LayoutClasses.dueDate); + setDateAttribute(date, "taskDue"); + } + break; + } + case "startDate": { + const date = task.startDate; + if (date) { + genericClasses.push(LayoutClasses.startDate); + setDateAttribute(date, "taskStart"); + } + break; + } + case "scheduledDate": { + const date = task.scheduledDate; + if (date) { + genericClasses.push(LayoutClasses.scheduledDate); + setDateAttribute(date, "taskScheduled"); + } + break; + } + case "doneDate": { + const date = task.doneDate; + if (date) { + genericClasses.push(LayoutClasses.doneDate); + setDateAttribute(date, "taskDone"); + } + break; + } + case "recurrenceRule": { + genericClasses.push(LayoutClasses.recurrenceRule); + break; + } + } + return [genericClasses, dataAttributes]; +} +function addInternalClasses(component, renderedComponent) { + if (component === "description") { + const tags = renderedComponent.getElementsByClassName("tag"); + for (let i = 0; i < tags.length; i++) { + const tagName = tags[i].textContent; + if (tagName) { + const className = tagToAttributeValue(tagName); + const element2 = tags[i]; + if (className) + element2.dataset.tagName = className; + } + } + } +} +function dateToAttribute(date) { + const today = window.moment().startOf("day"); + let result = ""; + const diffDays = today.diff(date, "days"); + if (isNaN(diffDays)) + return null; + if (diffDays === 0) + return "today"; + else if (diffDays > 0) + result += "past-"; + else if (diffDays < 0) + result += "future-"; + if (Math.abs(diffDays) <= MAX_DAY_VALUE_RANGE) { + result += Math.abs(diffDays).toString() + "d"; + } else { + result += DAY_VALUE_OVER_RANGE_POSTFIX; + } + return result; +} +function tagToAttributeValue(tag) { + const illegalChars = /["&\x00\r\n]/g; + let sanitizedTag = tag.replace(illegalChars, "-"); + sanitizedTag = sanitizedTag.replace(/^[-_]+/, ""); + if (sanitizedTag.length > 0) + return sanitizedTag; + else + return null; +} +function addTooltip({ + task, + element: element2, + isFilenameUnique +}) { + element2.addEventListener("mouseenter", () => { + const tooltip = element2.createDiv(); + tooltip.addClasses(["tooltip", "mod-right"]); + if (task.recurrence) { + const recurrenceDiv = tooltip.createDiv(); + recurrenceDiv.setText(`${recurrenceSymbol} ${task.recurrence.toText()}`); + } + if (task.startDate) { + const startDateDiv = tooltip.createDiv(); + startDateDiv.setText( + toTooltipDate({ + signifier: startDateSymbol, + date: task.startDate + }) + ); + } + if (task.scheduledDate) { + const scheduledDateDiv = tooltip.createDiv(); + scheduledDateDiv.setText( + toTooltipDate({ + signifier: scheduledDateSymbol, + date: task.scheduledDate + }) + ); + } + if (task.dueDate) { + const dueDateDiv = tooltip.createDiv(); + dueDateDiv.setText( + toTooltipDate({ + signifier: dueDateSymbol, + date: task.dueDate + }) + ); + } + if (task.doneDate) { + const doneDateDiv = tooltip.createDiv(); + doneDateDiv.setText( + toTooltipDate({ + signifier: doneDateSymbol, + date: task.doneDate + }) + ); + } + const linkText = task.getLinkText({ isFilenameUnique }); + if (linkText) { + const backlinkDiv = tooltip.createDiv(); + backlinkDiv.setText(`\u{1F517} ${linkText}`); + } + element2.addEventListener("mouseleave", () => { + tooltip.remove(); + }); + }); +} +function toTooltipDate({ signifier, date }) { + return `${signifier} ${date.format(TaskRegularExpressions.dateFormat)} (${date.from( + window.moment().startOf("day") + )})`; +} +function removeGlobalFilterIfNeeded(description) { + const { globalFilter, removeGlobalFilter } = getSettings(); + if (removeGlobalFilter) { + return description.replace(globalFilter, "").trim(); + } + return description; +} + +// src/DateFallback.ts +var DateFallback = class { + static fromPath(path) { + const { useFilenameAsScheduledDate, filenameAsDateFolders } = getSettings(); + if (!useFilenameAsScheduledDate) { + return null; + } + if (!this.matchesAnyFolder(filenameAsDateFolders, path)) { + return null; + } + return this.extractDateFromPath(path); + } + static matchesAnyFolder(folders, path) { + if (folders.length === 0) { + return true; + } + return folders.some((folder) => path.startsWith(folder + "/")); + } + static extractDateFromPath(path) { + const firstPos = Math.max(0, path.lastIndexOf("/") + 1); + const lastPos = path.lastIndexOf("."); + const basename = path.substring(firstPos, lastPos); + let dateMatch = /(\d{4})-(\d{2})-(\d{2})/.exec(basename); + if (!dateMatch) + dateMatch = /(\d{4})(\d{2})(\d{2})/.exec(basename); + if (dateMatch) { + const date = window.moment([parseInt(dateMatch[1]), parseInt(dateMatch[2]) - 1, parseInt(dateMatch[3])]); + if (date.isValid()) { + return date; + } + } + return null; + } + static canApplyFallback({ + startDate, + scheduledDate, + dueDate + }) { + return startDate === null && dueDate === null && scheduledDate === null; + } + static updateTaskPath(task, newPath, fallbackDate) { + let scheduledDate = task.scheduledDate; + let scheduledDateIsInferred = task.scheduledDateIsInferred; + if (fallbackDate === null) { + if (scheduledDateIsInferred) { + scheduledDateIsInferred = false; + scheduledDate = null; + } else { + } + } else { + if (scheduledDateIsInferred) { + scheduledDate = fallbackDate; + } else if (this.canApplyFallback(task)) { + scheduledDate = fallbackDate; + scheduledDateIsInferred = true; + } else { + } + } + return new Task(__spreadProps(__spreadValues({}, task), { + path: newPath, + scheduledDate, + scheduledDateIsInferred + })); + } + static removeInferredStatusIfNeeded(originalTask, updatedTasks) { + const inferredScheduledDate = originalTask.scheduledDateIsInferred ? originalTask.scheduledDate : null; + return updatedTasks.map((task) => { + if (inferredScheduledDate !== null && !inferredScheduledDate.isSame(task.scheduledDate, "day")) { + task = new Task(__spreadProps(__spreadValues({}, task), { scheduledDateIsInferred: false })); + } + return task; + }); + } +}; + +// src/lib/RegExpTools.ts +function escapeRegExp(s) { + return s.replace(/([.*+?^${}()|[\]/\\])/g, "\\$1"); +} + +// src/Task.ts +var prioritySymbols = { + High: "\u23EB", + Medium: "\u{1F53C}", + Low: "\u{1F53D}", + None: "" +}; +var recurrenceSymbol = "\u{1F501}"; +var startDateSymbol = "\u{1F6EB}"; +var scheduledDateSymbol = "\u23F3"; +var dueDateSymbol = "\u{1F4C5}"; +var doneDateSymbol = "\u2705"; +var _TaskRegularExpressions = class { +}; +var TaskRegularExpressions = _TaskRegularExpressions; +TaskRegularExpressions.dateFormat = "YYYY-MM-DD"; +TaskRegularExpressions.indentationRegex = /^([\s\t>]*)/; +TaskRegularExpressions.listMarkerRegex = /([-*]|[0-9]+\.)/; +TaskRegularExpressions.checkboxRegex = /\[(.)\]/u; +TaskRegularExpressions.afterCheckboxRegex = / *(.*)/u; +TaskRegularExpressions.taskRegex = new RegExp( + _TaskRegularExpressions.indentationRegex.source + _TaskRegularExpressions.listMarkerRegex.source + " +" + _TaskRegularExpressions.checkboxRegex.source + _TaskRegularExpressions.afterCheckboxRegex.source, + "u" +); +TaskRegularExpressions.nonTaskRegex = new RegExp( + _TaskRegularExpressions.indentationRegex.source + _TaskRegularExpressions.listMarkerRegex.source + "? *(" + _TaskRegularExpressions.checkboxRegex.source + ")?" + _TaskRegularExpressions.afterCheckboxRegex.source, + "u" +); +TaskRegularExpressions.listItemRegex = new RegExp( + _TaskRegularExpressions.indentationRegex.source + _TaskRegularExpressions.listMarkerRegex.source +); +TaskRegularExpressions.blockLinkRegex = / \^[a-zA-Z0-9-]+$/u; +TaskRegularExpressions.priorityRegex = /([⏫🔼🔽])$/u; +TaskRegularExpressions.startDateRegex = /🛫 *(\d{4}-\d{2}-\d{2})$/u; +TaskRegularExpressions.scheduledDateRegex = /[⏳⌛] *(\d{4}-\d{2}-\d{2})$/u; +TaskRegularExpressions.dueDateRegex = /[📅📆🗓] *(\d{4}-\d{2}-\d{2})$/u; +TaskRegularExpressions.doneDateRegex = /✅ *(\d{4}-\d{2}-\d{2})$/u; +TaskRegularExpressions.recurrenceRegex = /🔁 ?([a-zA-Z0-9, !]+)$/iu; +TaskRegularExpressions.hashTags = /(^|\s)#[^ !@#$%^&*(),.?":{}|<>]*/g; +TaskRegularExpressions.hashTagsFromEnd = new RegExp(_TaskRegularExpressions.hashTags.source + "$"); +var Task = class { + constructor({ + status, + description, + path, + indentation, + listMarker, + sectionStart, + sectionIndex, + precedingHeader, + priority, + startDate, + scheduledDate, + dueDate, + doneDate, + recurrence, + blockLink, + tags, + originalMarkdown, + scheduledDateIsInferred + }) { + this._urgency = null; + this.status = status; + this.description = description; + this.path = path; + this.indentation = indentation; + this.listMarker = listMarker; + this.sectionStart = sectionStart; + this.sectionIndex = sectionIndex; + this.precedingHeader = precedingHeader; + this.tags = tags; + this.priority = priority; + this.startDate = startDate; + this.scheduledDate = scheduledDate; + this.dueDate = dueDate; + this.doneDate = doneDate; + this.recurrence = recurrence; + this.blockLink = blockLink; + this.originalMarkdown = originalMarkdown; + this.scheduledDateIsInferred = scheduledDateIsInferred; + } + static fromLine({ + line, + path, + sectionStart, + sectionIndex, + precedingHeader, + fallbackDate + }) { + const regexMatch = line.match(TaskRegularExpressions.taskRegex); + if (regexMatch === null) { + return null; + } + const body = regexMatch[4].trim(); + const { globalFilter } = getSettings(); + if (!body.includes(globalFilter)) { + return null; + } + let description = body; + const indentation = regexMatch[1]; + const listMarker = regexMatch[2]; + const statusString = regexMatch[3]; + const status = StatusRegistry.getInstance().bySymbolOrCreate(statusString); + const blockLinkMatch = description.match(TaskRegularExpressions.blockLinkRegex); + const blockLink = blockLinkMatch !== null ? blockLinkMatch[0] : ""; + if (blockLink !== "") { + description = description.replace(TaskRegularExpressions.blockLinkRegex, "").trim(); + } + let matched; + let priority = "3" /* None */; + let startDate = null; + let scheduledDate = null; + let scheduledDateIsInferred = false; + let dueDate = null; + let doneDate = null; + let recurrenceRule = ""; + let recurrence = null; + let tags = []; + let trailingTags = ""; + const maxRuns = 20; + let runs = 0; + do { + matched = false; + const priorityMatch = description.match(TaskRegularExpressions.priorityRegex); + if (priorityMatch !== null) { + switch (priorityMatch[1]) { + case prioritySymbols.Low: + priority = "4" /* Low */; + break; + case prioritySymbols.Medium: + priority = "2" /* Medium */; + break; + case prioritySymbols.High: + priority = "1" /* High */; + break; + } + description = description.replace(TaskRegularExpressions.priorityRegex, "").trim(); + matched = true; + } + const doneDateMatch = description.match(TaskRegularExpressions.doneDateRegex); + if (doneDateMatch !== null) { + doneDate = window.moment(doneDateMatch[1], TaskRegularExpressions.dateFormat); + description = description.replace(TaskRegularExpressions.doneDateRegex, "").trim(); + matched = true; + } + const dueDateMatch = description.match(TaskRegularExpressions.dueDateRegex); + if (dueDateMatch !== null) { + dueDate = window.moment(dueDateMatch[1], TaskRegularExpressions.dateFormat); + description = description.replace(TaskRegularExpressions.dueDateRegex, "").trim(); + matched = true; + } + const scheduledDateMatch = description.match(TaskRegularExpressions.scheduledDateRegex); + if (scheduledDateMatch !== null) { + scheduledDate = window.moment(scheduledDateMatch[1], TaskRegularExpressions.dateFormat); + description = description.replace(TaskRegularExpressions.scheduledDateRegex, "").trim(); + matched = true; + } + const startDateMatch = description.match(TaskRegularExpressions.startDateRegex); + if (startDateMatch !== null) { + startDate = window.moment(startDateMatch[1], TaskRegularExpressions.dateFormat); + description = description.replace(TaskRegularExpressions.startDateRegex, "").trim(); + matched = true; + } + const recurrenceMatch = description.match(TaskRegularExpressions.recurrenceRegex); + if (recurrenceMatch !== null) { + recurrenceRule = recurrenceMatch[1].trim(); + description = description.replace(TaskRegularExpressions.recurrenceRegex, "").trim(); + matched = true; + } + const tagsMatch = description.match(TaskRegularExpressions.hashTagsFromEnd); + if (tagsMatch != null) { + description = description.replace(TaskRegularExpressions.hashTagsFromEnd, "").trim(); + matched = true; + const tagName = tagsMatch[0].trim(); + trailingTags = trailingTags.length > 0 ? [tagName, trailingTags].join(" ") : tagName; + } + runs++; + } while (matched && runs <= maxRuns); + if (recurrenceRule.length > 0) { + recurrence = Recurrence.fromText({ + recurrenceRuleText: recurrenceRule, + startDate, + scheduledDate, + dueDate + }); + } + if (DateFallback.canApplyFallback({ startDate, scheduledDate, dueDate }) && fallbackDate !== null) { + scheduledDate = fallbackDate; + scheduledDateIsInferred = true; + } + if (trailingTags.length > 0) + description += " " + trailingTags; + const hashTagMatch = description.match(TaskRegularExpressions.hashTags); + if (hashTagMatch !== null) { + tags = hashTagMatch.filter((tag) => tag !== globalFilter).map((tag) => tag.trim()); + } + return new Task({ + status, + description, + path, + indentation, + listMarker, + sectionStart, + sectionIndex, + precedingHeader, + priority, + startDate, + scheduledDate, + dueDate, + doneDate, + recurrence, + blockLink, + tags, + originalMarkdown: line, + scheduledDateIsInferred + }); + } + toLi(renderDetails) { + return __async(this, null, function* () { + return renderTaskLine(this, renderDetails); + }); + } + toString(layoutOptions) { + const taskLayout = new TaskLayout(layoutOptions); + let taskString = ""; + for (const component of taskLayout.layoutComponents) { + taskString += this.componentToString(taskLayout, component); + } + return taskString; + } + componentToString(layout, component) { + var _a; + switch (component) { + case "description": + return this.description; + case "priority": { + let priority = ""; + if (this.priority === "1" /* High */) { + priority = " " + prioritySymbols.High; + } else if (this.priority === "2" /* Medium */) { + priority = " " + prioritySymbols.Medium; + } else if (this.priority === "4" /* Low */) { + priority = " " + prioritySymbols.Low; + } + return priority; + } + case "startDate": + if (!this.startDate) + return ""; + return layout.options.shortMode ? " " + startDateSymbol : ` ${startDateSymbol} ${this.startDate.format(TaskRegularExpressions.dateFormat)}`; + case "scheduledDate": + if (!this.scheduledDate || this.scheduledDateIsInferred) + return ""; + return layout.options.shortMode ? " " + scheduledDateSymbol : ` ${scheduledDateSymbol} ${this.scheduledDate.format(TaskRegularExpressions.dateFormat)}`; + case "doneDate": + if (!this.doneDate) + return ""; + return layout.options.shortMode ? " " + doneDateSymbol : ` ${doneDateSymbol} ${this.doneDate.format(TaskRegularExpressions.dateFormat)}`; + case "dueDate": + if (!this.dueDate) + return ""; + return layout.options.shortMode ? " " + dueDateSymbol : ` ${dueDateSymbol} ${this.dueDate.format(TaskRegularExpressions.dateFormat)}`; + case "recurrenceRule": + if (!this.recurrence) + return ""; + return layout.options.shortMode ? " " + recurrenceSymbol : ` ${recurrenceSymbol} ${this.recurrence.toText()}`; + case "blockLink": + return (_a = this.blockLink) != null ? _a : ""; + default: + throw new Error(`Don't know how to render task component of type '${component}'`); + } + } + toFileLineString() { + return `${this.indentation}${this.listMarker} [${this.status.symbol}] ${this.toString()}`; + } + toggle() { + const newStatus = StatusRegistry.getInstance().getNextStatusOrCreate(this.status); + let newDoneDate = null; + let nextOccurrence = null; + if (newStatus.isCompleted()) { + const { setDoneDate } = getSettings(); + if (setDoneDate) { + newDoneDate = window.moment(); + } + if (this.recurrence !== null) { + nextOccurrence = this.recurrence.next(); + } + } + const toggledTask = new Task(__spreadProps(__spreadValues({}, this), { + status: newStatus, + doneDate: newDoneDate + })); + const newTasks = []; + if (nextOccurrence !== null) { + const nextStatus = StatusRegistry.getInstance().getNextStatusOrCreate(newStatus); + const nextTask = new Task(__spreadProps(__spreadValues(__spreadValues({}, this), nextOccurrence), { + status: nextStatus, + blockLink: "" + })); + newTasks.push(nextTask); + } + newTasks.push(toggledTask); + return newTasks; + } + get urgency() { + if (this._urgency === null) { + this._urgency = Urgency.calculate(this); + } + return this._urgency; + } + get filename() { + const fileNameMatch = this.path.match(/([^/]+)\.md$/); + if (fileNameMatch !== null) { + return fileNameMatch[1]; + } else { + return null; + } + } + getLinkText({ isFilenameUnique }) { + let linkText; + if (isFilenameUnique) { + linkText = this.filename; + } else { + linkText = "/" + this.path; + } + if (linkText === null) { + return null; + } + if (this.precedingHeader !== null && this.precedingHeader !== linkText) { + linkText = linkText + " > " + this.precedingHeader; + } + return linkText; + } + static tasksListsIdentical(oldTasks, newTasks) { + if (oldTasks.length !== newTasks.length) { + return false; + } + return oldTasks.every((oldTask, index) => oldTask.identicalTo(newTasks[index])); + } + identicalTo(other) { + let args = [ + "status", + "description", + "path", + "indentation", + "listMarker", + "sectionStart", + "sectionIndex", + "precedingHeader", + "priority", + "blockLink", + "scheduledDateIsInferred" + ]; + for (const el of args) { + if (this[el] !== other[el]) + return false; + } + if (this.tags.length !== other.tags.length) { + return false; + } + if (!this.tags.every(function(element2, index) { + return element2 === other.tags[index]; + })) { + return false; + } + args = ["startDate", "scheduledDate", "dueDate", "doneDate"]; + for (const el of args) { + const date1 = this[el]; + const date2 = other[el]; + if (compareByDate(date1, date2) !== 0) { + return false; + } + } + const recurrence1 = this.recurrence; + const recurrence2 = other.recurrence; + if (recurrence1 === null && recurrence2 !== null) { + return false; + } else if (recurrence1 !== null && recurrence2 === null) { + return false; + } else if (recurrence1 && recurrence2 && !recurrence1.identicalTo(recurrence2)) { + return false; + } + return true; + } + getDescriptionWithoutGlobalFilter() { + const { globalFilter } = getSettings(); + let description = this.description; + if (globalFilter.length === 0) + return description; + const globalFilterRegex = RegExp("(^|\\s)" + escapeRegExp(globalFilter) + "($|\\s)", "ug"); + if (this.description.search(globalFilterRegex) > -1) { + description = description.replace(globalFilterRegex, "$1$2").replace(" ", " ").trim(); + } + return description; + } +}; + +// src/lib/Lazy.ts +var Lazy = class { + constructor(fetch) { + this.fetch = fetch; + this._value = void 0; + } + get value() { + if (this._value === void 0) { + this._value = this.fetch(); + } + return this._value; + } +}; + +// src/Cache.ts +var Cache2 = class { + constructor({ metadataCache: metadataCache2, vault: vault2, events }) { + this.metadataCache = metadataCache2; + this.metadataCacheEventReferences = []; + this.vault = vault2; + this.vaultEventReferences = []; + this.events = events; + this.eventsEventReferences = []; + this.tasksMutex = new Mutex(); + this.state = "Cold" /* Cold */; + this.tasks = []; + this.loadedAfterFirstResolve = false; + this.subscribeToCache(); + this.subscribeToVault(); + this.subscribeToEvents(); + this.loadVault(); + } + unload() { + for (const eventReference of this.metadataCacheEventReferences) { + this.metadataCache.offref(eventReference); + } + for (const eventReference of this.vaultEventReferences) { + this.vault.offref(eventReference); + } + for (const eventReference of this.eventsEventReferences) { + this.events.off(eventReference); + } + } + getTasks() { + return this.tasks; + } + getState() { + return this.state; + } + notifySubscribers() { + this.events.triggerCacheUpdate({ + tasks: this.tasks, + state: this.state + }); + } + subscribeToCache() { + const resolvedEventeReference = this.metadataCache.on("resolved", () => __async(this, null, function* () { + if (!this.loadedAfterFirstResolve) { + this.loadedAfterFirstResolve = true; + this.loadVault(); + } + })); + this.metadataCacheEventReferences.push(resolvedEventeReference); + const changedEventReference = this.metadataCache.on("changed", (file) => { + this.tasksMutex.runExclusive(() => { + this.indexFile(file); + }); + }); + this.metadataCacheEventReferences.push(changedEventReference); + } + subscribeToVault() { + const { useFilenameAsScheduledDate } = getSettings(); + const createdEventReference = this.vault.on("create", (file) => { + if (!(file instanceof import_obsidian3.TFile)) { + return; + } + this.tasksMutex.runExclusive(() => { + this.indexFile(file); + }); + }); + this.vaultEventReferences.push(createdEventReference); + const deletedEventReference = this.vault.on("delete", (file) => { + if (!(file instanceof import_obsidian3.TFile)) { + return; + } + this.tasksMutex.runExclusive(() => { + this.tasks = this.tasks.filter((task) => { + return task.path !== file.path; + }); + this.notifySubscribers(); + }); + }); + this.vaultEventReferences.push(deletedEventReference); + const renamedEventReference = this.vault.on("rename", (file, oldPath) => { + if (!(file instanceof import_obsidian3.TFile)) { + return; + } + this.tasksMutex.runExclusive(() => { + const fallbackDate = new Lazy(() => DateFallback.fromPath(file.path)); + this.tasks = this.tasks.map((task) => { + if (task.path === oldPath) { + if (!useFilenameAsScheduledDate) { + return new Task(__spreadProps(__spreadValues({}, task), { path: file.path })); + } else { + return DateFallback.updateTaskPath(task, file.path, fallbackDate.value); + } + } else { + return task; + } + }); + this.notifySubscribers(); + }); + }); + this.vaultEventReferences.push(renamedEventReference); + } + subscribeToEvents() { + const requestReference = this.events.onRequestCacheUpdate((handler) => { + handler({ tasks: this.tasks, state: this.state }); + }); + this.eventsEventReferences.push(requestReference); + } + loadVault() { + return this.tasksMutex.runExclusive(() => __async(this, null, function* () { + this.state = "Initializing" /* Initializing */; + yield Promise.all( + this.vault.getMarkdownFiles().map((file) => { + return this.indexFile(file); + }) + ); + this.state = "Warm" /* Warm */; + this.notifySubscribers(); + })); + } + indexFile(file) { + return __async(this, null, function* () { + const fileCache = this.metadataCache.getFileCache(file); + if (fileCache === null || fileCache === void 0) { + return; + } + const oldTasks = this.tasks.filter((task) => { + return task.path === file.path; + }); + const listItems = fileCache.listItems; + let newTasks = []; + if (listItems !== void 0) { + const fileContent = yield this.vault.cachedRead(file); + newTasks = this.getTasksFromFileContent(fileContent, listItems, fileCache, file); + } + if (Task.tasksListsIdentical(oldTasks, newTasks)) { + return; + } + if (this.getState() == "Warm" /* Warm */) { + console.debug( + `At least one task, its line number or its heading has changed in ${file.path}: triggering a refresh of all active Tasks blocks in Live Preview and Reading mode views.` + ); + } + this.tasks = this.tasks.filter((task) => { + return task.path !== file.path; + }); + this.tasks.push(...newTasks); + this.notifySubscribers(); + }); + } + getTasksFromFileContent(fileContent, listItems, fileCache, file) { + const tasks = []; + const fileLines = fileContent.split("\n"); + const linesInFile = fileLines.length; + const dateFromFileName = new Lazy(() => DateFallback.fromPath(file.path)); + let currentSection = null; + let sectionIndex = 0; + for (const listItem of listItems) { + if (listItem.task !== void 0) { + const lineNumber = listItem.position.start.line; + if (lineNumber >= linesInFile) { + console.log( + `${file.path} Obsidian gave us a line number ${lineNumber} past the end of the file. ${linesInFile}.` + ); + return tasks; + } + if (currentSection === null || currentSection.position.end.line < lineNumber) { + currentSection = Cache2.getSection(lineNumber, fileCache.sections); + sectionIndex = 0; + } + if (currentSection === null) { + continue; + } + const line = fileLines[lineNumber]; + if (line === void 0) { + console.log(`${file.path}: line ${lineNumber} - ignoring 'undefined' line.`); + continue; + } + let task; + try { + task = Task.fromLine({ + line, + path: file.path, + sectionStart: currentSection.position.start.line, + sectionIndex, + precedingHeader: Cache2.getPrecedingHeader(lineNumber, fileCache.headings), + fallbackDate: dateFromFileName.value + }); + } catch (e) { + this.reportTaskParsingErrorToUser(e, file, listItem, line); + continue; + } + if (task !== null) { + sectionIndex++; + tasks.push(task); + } + } + } + return tasks; + } + reportTaskParsingErrorToUser(e, file, listItem, line) { + const msg = `There was an error reading one of the tasks in this vault. The following task has been ignored, to prevent Tasks queries getting stuck with 'Loading Tasks ...' Error: ${e} -File: ${t.path} -Line number: ${n.position.start.line} -Task line: ${i} +File: ${file.path} +Line number: ${listItem.position.start.line} +Task line: ${line} Please create a bug report for this message at https://github.com/obsidian-tasks-group/obsidian-tasks/issues/new/choose @@ -153,37 +14691,4951 @@ Include: The error popup will only be shown when Tasks is starting up, but if the error persists, it will be shown in the console every time this file is edited during the Obsidian session. -`;console.error(s),e instanceof Error&&console.error(e.stack),this.state==="Initializing"&&new zn.Notice(s,1e4)}static getSection(e,t){if(t===void 0)return null;for(let n of t)if(n.position.start.line<=e&&n.position.end.line>=e)return n;return null}static getPrecedingHeader(e,t){if(t===void 0)return null;let n=null;for(let i of t){if(i.position.start.line>e)return n;n=i.heading}return n}};var Bd=require("obsidian");var F_=require("obsidian");function on(){}function Id(r){return r()}function b_(){return Object.create(null)}function un(r){r.forEach(Id)}function E_(r){return typeof r=="function"}function w_(r,e){return r!=r?e==e:r!==e||r&&typeof r=="object"||typeof r=="function"}function R_(r){return Object.keys(r).length===0}var O_=!1;function vk(){O_=!0}function Ek(){O_=!1}function _(r,e){r.appendChild(e)}function Kn(r,e,t){r.insertBefore(e,t||null)}function ln(r){r.parentNode.removeChild(r)}function Fd(r,e){for(let t=0;tr.removeEventListener(e,t,n)}function D_(r){return function(e){return e.preventDefault(),r.call(this,e)}}function D(r,e,t){t==null?r.removeAttribute(e):r.getAttribute(e)!==t&&r.setAttribute(e,t)}function Rk(r){return Array.from(r.childNodes)}function Ud(r,e){e=""+e,r.wholeText!==e&&(r.data=e)}function Gt(r,e){r.value=e==null?"":e}function Ld(r,e){for(let t=0;t{let u=s.map(Id).filter(E_);a?a.push(...u):un(u),r.$$.on_mount=[]}),o.forEach(As)}function k_(r,e){let t=r.$$;t.fragment!==null&&(un(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroy=t.fragment=null,t.ctx=[])}function xk(r,e){r.$$.dirty[0]===-1&&(Ss.push(r),Mk(),r.$$.dirty.fill(0)),r.$$.dirty[e/31|0]|=1<{let y=h.length?h[0]:f;return l.ctx&&i(l.ctx[d],l.ctx[d]=y)&&(!l.skip_bound&&l.bound[d]&&l.bound[d](y),c&&xk(r,d)),f}):[],l.update(),c=!0,un(l.before_update),l.fragment=n?n(l.ctx):!1,e.target){if(e.hydrate){vk();let d=Rk(e.target);l.fragment&&l.fragment.l(d),d.forEach(ln)}else l.fragment&&l.fragment.c();e.intro&&Pk(r.$$.fragment),Ak(r,e.target,e.anchor,e.customElement),Ek(),S_()}ks(u)}var Ck;typeof HTMLElement=="function"&&(Ck=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}connectedCallback(){let{on_mount:r}=this.$$;this.$$.on_disconnect=r.map(Id).filter(E_);for(let e in this.$$.slotted)this.appendChild(this.$$.slotted[e])}attributeChangedCallback(r,e,t){this[r]=t}disconnectedCallback(){un(this.$$.on_disconnect)}$destroy(){k_(this,1),this.$destroy=on}$on(r,e){let t=this.$$.callbacks[r]||(this.$$.callbacks[r]=[]);return t.push(e),()=>{let n=t.indexOf(e);n!==-1&&t.splice(n,1)}}$set(r){this.$$set&&!R_(r)&&(this.$$.skip_bound=!0,this.$$set(r),this.$$.skip_bound=!1)}});var ro=class{$destroy(){k_(this,1),this.$destroy=on}$on(e,t){let n=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return n.push(t),()=>{let i=n.indexOf(t);i!==-1&&n.splice(i,1)}}$set(e){this.$$set&&!R_(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}};var xs=Ks(ke());var Nk={td:"today",tm:"tomorrow",yd:"yesterday",tw:"this week",nw:"next week",weekend:"sat",we:"sat"};function Vn(r){for(let[e,t]of Object.entries(Nk))r=r.replace(RegExp(`\\b${e}\\s`,"i"),t);return r}function A_(r,e,t){let n=r.slice();return n[30]=e[t],n}function x_(r,e,t){let n=r.slice();return n[33]=e[t].value,n[34]=e[t].label,n[35]=e[t].symbol,n}function Ik(r){let e,t=r[35]+"",n;return{c(){e=L("span"),n=gt(t)},m(i,s){Kn(i,e,s),_(e,n)},p:on,d(i){i&&ln(e)}}}function C_(r){let e,t,n,i,s,a,o,u,l=r[34]+"",c,d,f=r[35]&&r[35].charCodeAt(0)>=256,h,y,m,g,R=f&&Ik(r);return{c(){e=L("span"),t=L("input"),a=J(),o=L("label"),u=L("span"),c=gt(l),d=J(),R&&R.c(),y=J(),D(t,"type","radio"),D(t,"id",n="priority-"+r[33]),t.__value=i=r[33],t.value=t.__value,D(t,"accesskey",s=r[9](r[34].charAt(0).toLowerCase())),r[21][0].push(t),D(u,"class","accesskey-first"),D(o,"for",h="priority-"+r[33])},m(O,P){Kn(O,e,P),_(e,t),t.checked=t.__value===r[1].priority,_(e,a),_(e,o),_(o,u),_(u,c),_(o,d),R&&R.m(o,null),_(e,y),m||(g=At(t,"change",r[20]),m=!0)},p(O,P){P[0]&512&&s!==(s=O[9](O[34].charAt(0).toLowerCase()))&&D(t,"accesskey",s),P[0]&3&&(t.checked=t.__value===O[1].priority),f&&R.p(O,P)},d(O){O&&ln(e),r[21][0].splice(r[21][0].indexOf(t),1),R&&R.d(),m=!1,g()}}}function N_(r){let e,t=r[30].name+"",n,i,s=r[30].symbol+"",a,o,u;return{c(){e=L("option"),n=gt(t),i=gt(" ["),a=gt(s),o=gt("]"),e.__value=u=r[30],e.value=e.__value},m(l,c){Kn(l,e,c),_(e,n),_(e,i),_(e,a),_(e,o)},p(l,c){c[0]&1&&t!==(t=l[30].name+"")&&Ud(n,t),c[0]&1&&s!==(s=l[30].symbol+"")&&Ud(a,s),c[0]&1&&u!==(u=l[30])&&(e.__value=u,e.value=e.__value)},d(l){l&&ln(e)}}}function Fk(r){let e,t,n,i,s,a,o,u,l,c,d,f,h,y,m,g,R,O,P,X,ye,Te,se,H,bt,lt,A,E,b,C,v,q,w,F,B,W,de,fe,xe,xt,et,Ze,Se,ct,Tn,ir,pf,Ct,Ws,hf,fi,mf,yf,Ys,gf,pi,$s,_f,zt,js,Tf,bn,Bs,bf,Kt,vf,vn,hi,Gs,Ef,Mr,Hs,wf,mi,Ao,Rf,zs,Of,En,yi,Df,gi,xo,Mf,wn=r[10],tt=[];for(let N=0;Ntion',s=J(),a=L("input"),u=J(),l=L("div"),c=L("label"),d=gt("Priority"),h=J();for(let N=0;Nart',pf=J(),Ct=L("input"),hf=J(),fi=L("code"),mf=gt($t),yf=J(),Ys=new an(!1),gf=J(),pi=L("div"),$s=L("label"),$s.innerHTML=`Only - future dates:`,_f=J(),zt=L("input"),Tf=J(),bn=L("div"),Bs=L("label"),Bs.textContent="Status",bf=J(),Kt=L("select");for(let N=0;Nr[27].call(Kt)),D(bn,"class","tasks-modal-section"),D(Gs,"for","status"),D(Mr,"id","status"),D(Mr,"type","checkbox"),D(Mr,"class","task-list-item-checkbox tasks-modal-checkbox"),Mr.checked=Hs=r[1].status.isCompleted(),Mr.disabled=!0,D(vn,"class","tasks-modal-section tasks-modal-status"),D(yi,"type","submit"),D(yi,"class","mod-cta"),D(gi,"type","button"),D(En,"class","tasks-modal-section tasks-modal-buttons"),qd(t,"with-accesskeys",r[2]),D(e,"class","tasks-modal")},m(N,ue){Kn(N,e,ue),_(e,t),_(t,n),_(n,i),_(n,s),_(n,a),Gt(a,r[1].description),r[19](a),_(t,u),_(t,l),_(l,c),_(c,d),_(l,h);for(let Q=0;Qno ${w} date`;let W=xs.parseDate(F,B,{forwardDate:B!=null});return W!==null?window.moment(W).format("YYYY-MM-DD"):`invalid ${w} date`}Wd(()=>{let{globalFilter:w,provideAccessKeys:F}=U();t(2,R=F);let B=a.getDescriptionWithoutGlobalFilter();(B!=a.description||B.indexOf(w)==-1)&&(g=!0);let W="none";a.priority==="4"?W="low":a.priority==="2"?W="medium":a.priority==="1"&&(W="high"),t(1,c={description:B,status:a.status,priority:W,recurrenceRule:a.recurrence?a.recurrence.toText():"",startDate:a.startDate?a.startDate.format("YYYY-MM-DD"):"",scheduledDate:a.scheduledDate?a.scheduledDate.format("YYYY-MM-DD"):"",dueDate:a.dueDate?a.dueDate.format("YYYY-MM-DD"):"",doneDate:a.doneDate?a.doneDate.format("YYYY-MM-DD"):"",forwardOnly:!0}),setTimeout(()=>{l.focus()},10)});let X=w=>{if(w.key&&!w.altKey&&!w.ctrlKey){let F=O.find(B=>B.label.charAt(0).toLowerCase()==w.key);F&&t(1,c.priority=F.value,c)}},ye=()=>{o([])},Te=()=>{let{globalFilter:w}=U(),F=c.description.trim();g&&(F=w+" "+F);let B=null,W=xs.parseDate(c.startDate,new Date,{forwardDate:c.forwardOnly});W!==null&&(B=window.moment(W));let de=null,fe=xs.parseDate(c.scheduledDate,new Date,{forwardDate:c.forwardOnly});fe!==null&&(de=window.moment(fe));let xe=null,xt=xs.parseDate(c.dueDate,new Date,{forwardDate:c.forwardOnly});xt!==null&&(xe=window.moment(xt));let et=null;c.recurrenceRule&&(et=We.fromText({recurrenceRuleText:c.recurrenceRule,startDate:B,scheduledDate:de,dueDate:xe}));let Ze;switch(c.priority){case"low":Ze="4";break;case"medium":Ze="2";break;case"high":Ze="1";break;default:Ze="3"}let Se=new me(Object.assign(Object.assign({},a),{description:F,status:c.status,priority:Ze,recurrence:et,startDate:B,scheduledDate:de,dueDate:xe,doneDate:window.moment(c.doneDate,"YYYY-MM-DD").isValid()?window.moment(c.doneDate,"YYYY-MM-DD"):null}));o([Se])},se=[[]];function H(){c.description=this.value,t(1,c),t(0,u)}function bt(w){to[w?"unshift":"push"](()=>{l=w,t(3,l)})}function lt(){c.priority=this.__value,t(1,c),t(0,u)}function A(){c.recurrenceRule=this.value,t(1,c),t(0,u)}function E(){c.dueDate=this.value,t(1,c),t(0,u)}function b(){c.scheduledDate=this.value,t(1,c),t(0,u)}function C(){c.startDate=this.value,t(1,c),t(0,u)}function v(){c.forwardOnly=this.checked,t(1,c),t(0,u)}function q(){c.status=M_(this),t(1,c),t(0,u)}return r.$$set=w=>{"task"in w&&t(14,a=w.task),"onSubmit"in w&&t(15,o=w.onSubmit),"statusOptions"in w&&t(0,u=w.statusOptions)},r.$$.update=()=>{if(r.$$.dirty[0]&4){e:t(9,n=w=>R?w:null)}if(r.$$.dirty[0]&2){e:t(1,c.startDate=Vn(c.startDate),c),t(4,d=P("start",c.startDate,c.forwardOnly?new Date:void 0))}if(r.$$.dirty[0]&2){e:t(1,c.scheduledDate=Vn(c.scheduledDate),c),t(5,f=P("scheduled",c.scheduledDate,c.forwardOnly?new Date:void 0))}if(r.$$.dirty[0]&2){e:t(1,c.dueDate=Vn(c.dueDate),c),t(6,h=P("due",c.dueDate,c.forwardOnly?new Date:void 0))}if(r.$$.dirty[0]&196610){e:c.recurrenceRule?t(7,y=t(17,s=t(16,i=We.fromText({recurrenceRuleText:c.recurrenceRule,startDate:null,scheduledDate:null,dueDate:null}))===null||i===void 0?void 0:i.toText())!==null&&s!==void 0?s:"invalid recurrence rule"):t(7,y="not recurring")}if(r.$$.dirty[0]&2){e:t(8,m=P("done",c.doneDate))}},[u,c,R,l,d,f,h,y,m,n,O,X,ye,Te,a,o,i,s,H,bt,lt,se,A,E,b,C,v,q]}var $d=class extends ro{constructor(e){super(),P_(this,e,Uk,Fk,w_,{task:14,onSubmit:15,statusOptions:0},null,[-1,-1])}},I_=$d;var Xn=class extends F_.Modal{constructor({app:t,task:n,onSubmit:i}){super(t);this.task=n,this.onSubmit=s=>{s.length&&i(s),this.close()}}onOpen(){this.titleEl.setText("Create or edit Task");let{contentEl:t}=this,n=this.getKnownStatusesAndCurrentTaskStatusIfNotKnown();new I_({target:t,props:{task:this.task,statusOptions:n,onSubmit:this.onSubmit}})}getKnownStatusesAndCurrentTaskStatusIfNotKnown(){let t=he.getInstance().registeredStatuses;return he.getInstance().bySymbol(this.task.status.symbol)===j.EMPTY&&t.push(this.task.status),t}onClose(){let{contentEl:t}=this;t.empty()}};var U_=({line:r,path:e})=>{var f,h;let t=ut.fromPath(e),n=me.fromLine({line:r,path:e,sectionStart:0,sectionIndex:0,precedingHeader:null,fallbackDate:t});if(n!==null)return n;let i=r.match(S.nonTaskRegex);if(i===null)return console.error("Tasks: Cannot create task on line:",r),new me({status:j.TODO,description:"",path:e,indentation:"",listMarker:"-",priority:"3",startDate:null,scheduledDate:null,dueDate:null,doneDate:null,recurrence:null,sectionStart:0,sectionIndex:0,precedingHeader:null,blockLink:"",tags:[],originalMarkdown:"",scheduledDateIsInferred:!1});let s=i[1],a=(f=i[2])!=null?f:"-",o=(h=i[4])!=null?h:" ",u=he.getInstance().bySymbolOrCreate(o),l=i[5],c=r.match(S.blockLinkRegex),d=c!==null?c[0]:"";return d!==""&&(l=l.replace(S.blockLinkRegex,"")),new me({status:u,description:l,path:e,indentation:s,listMarker:a,blockLink:d,priority:"3",startDate:null,scheduledDate:null,dueDate:null,doneDate:null,recurrence:null,sectionStart:0,sectionIndex:0,precedingHeader:null,tags:[],originalMarkdown:"",scheduledDateIsInferred:!1})};var L_=(r,e,t,n)=>{var d;if(r)return t instanceof Bd.MarkdownView;if(!(t instanceof Bd.MarkdownView))return;let i=(d=t.file)==null?void 0:d.path;if(i===void 0)return;let a=e.getCursor().line,o=e.getLine(a),u=U_({line:o,path:i}),l=f=>{let h=ut.removeInferredStatusIfNeeded(u,f).map(y=>y.toFileLineString()).join(` -`);e.setLine(a,h)};new Xn({app:n,task:u,onSubmit:l}).open()};var Gd=require("obsidian");var q_=(r,e,t)=>{var u;if(r)return t instanceof Gd.MarkdownView;if(!(t instanceof Gd.MarkdownView))return;let n=(u=t.file)==null?void 0:u.path;if(n===void 0)return;let i=e.getCursor(),s=i.line,a=e.getLine(s),o=Lk(a,n);e.setLine(s,o),e.setCursor({line:i.line,ch:Wk(i.ch,a,o)})},Lk=(r,e)=>{let t=r,n=me.fromLine({line:r,path:e,sectionStart:0,sectionIndex:0,precedingHeader:null,fallbackDate:null});if(n!==null)t=qk(n);else{let i=r.match(S.taskRegex);if(i!==null){let s=i[3],o=he.getInstance().bySymbol(s).nextStatusSymbol;t=r.replace(S.taskRegex,`$1- [${o}] $4`)}else S.listItemRegex.test(r)?t=r.replace(S.listItemRegex,"$1$2 [ ]"):t=r.replace(S.indentationRegex,"$1- ")}return t},qk=r=>r.toggle().map(t=>t.toFileLineString()).join(` -`),Wk=(r,e,t)=>{let n=t.length;if(n<=e.length)return r>=t.length?n:r;let i=13;if(t.match(S.doneDateRegex)&&n-e.length>=i&&(n-=i),n>=2*e.length&&t.search(`.+ -.+`)!==-1)return r+n-e.length;let s=t.search(/[-*]/);return rL_(t,n,i,this.app)}),e.addCommand({id:"toggle-done",name:"Toggle task done",icon:"check-in-circle",editorCheckCallback:q_})}};var io=class{constructor({obsidianEvents:e}){this.obsidianEvents=e}onCacheUpdate(e){return this.obsidianEvents.on("obsidian-tasks-plugin:cache-update",e)}triggerCacheUpdate(e){this.obsidianEvents.trigger("obsidian-tasks-plugin:cache-update",e)}onRequestCacheUpdate(e){return this.obsidianEvents.on("obsidian-tasks-plugin:request-cache-update",e)}triggerRequestCacheUpdate(e){this.obsidianEvents.trigger("obsidian-tasks-plugin:request-cache-update",e)}off(e){this.obsidianEvents.offref(e)}};var so=class{constructor({plugin:e}){this.markdownPostProcessor=this._markdownPostProcessor.bind(this);e.registerMarkdownPostProcessor(this._markdownPostProcessor.bind(this))}_markdownPostProcessor(e,t){return x(this,null,function*(){var c;let{globalFilter:n}=U(),i=e.findAll(".task-list-item").filter(d=>{var y;let f=(y=d.textContent)==null?void 0:y.split(` -`);if(f===void 0)return!1;let h=null;for(let m=0;mW_.ViewPlugin.fromClass(Hd),Hd=class{constructor(e){this.view=e,this.handleClickEvent=this.handleClickEvent.bind(this),this.view.dom.addEventListener("click",this.handleClickEvent)}destroy(){this.view.dom.removeEventListener("click",this.handleClickEvent)}handleClickEvent(e){let{target:t}=e;if(!t||!(t instanceof HTMLInputElement)||t.type!=="checkbox")return!1;let n=t.closest("ul.plugin-tasks-query-result, div.callout-content");if(n){if(n.matches("div.callout-content")){let f=`obsidian-tasks-plugin warning: Tasks cannot add or remove completion dates or make the next copy of a recurring task for tasks written inside a callout when you click their checkboxes in Live Preview. -If you wanted Tasks to do these things, please undo your change, then either click the line of the task and use the "Toggle Task Done" command, or switch to Reading View to click the checkbox.`;console.warn(f),new Y_.Notice(f,45e3)}return!1}let{state:i}=this.view,s=this.view.posAtDOM(t),a=i.doc.lineAt(s),o=me.fromLine({line:a.text,path:"",sectionStart:0,sectionIndex:0,precedingHeader:null,fallbackDate:null});if(console.debug(`Live Preview Extension: toggle called. Position: ${s} Line: ${a.text}`),o===null)return!1;e.preventDefault();let l=o.toggle().map(f=>f.toFileLineString()).join(i.lineBreak),c=i.update({changes:{from:a.from,to:a.to,insert:l}});this.view.dispatch(c);let d=t.checked;return setTimeout(()=>{t.checked=d},1),!0}};var So=require("obsidian");var Wr=class extends oe{constructor(){super(...arguments);this._filters=new Lr}canCreateFilterForLine(t){return this._filters.canCreateFilterForLine(t)}createFilterOrErrorMessage(t){return this._filters.createFilterOrErrorMessage(t)}filterRegExp(){return null}};var br=class extends Wr{constructor(){super(),this._filters.add("done",e=>e.status.type==="DONE"||e.status.type==="CANCELLED"||e.status.type==="NON_TASK"),this._filters.add("not done",e=>e.status.type==="TODO"||e.status.type==="IN_PROGRESS")}fieldName(){return"status"}supportsSorting(){return!0}comparator(){return(e,t)=>{let n=br.oldStatusName(e),i=br.oldStatusName(t);return ni?-1:0}}static oldStatusName(e){return e.status.symbol===" "?"Todo":"Done"}};var zd=class extends _e{filterRegExp(){return zd.dueRegexp}fieldName(){return"due"}date(e){return e.dueDate}filterResultIfFieldMissing(){return!1}},cn=zd;cn.dueRegexp=/^due (before|after|on)? ?(.*)/;var Kd=class extends oe{createFilterOrErrorMessage(e){let t=new le(e),n=oe.getMatch(this.filterRegExp(),e);if(n!==null){let i=n[5],s=null;switch(i){case"low":s="4";break;case"none":s="3";break;case"medium":s="2";break;case"high":s="1";break}if(s===null)return t.error="do not understand priority",t;let a=e,o;switch(n[3]){case"above":o=u=>u.priority.localeCompare(s)<0;break;case"below":o=u=>u.priority.localeCompare(s)>0;break;case"not":o=u=>u.priority!==s;break;default:o=u=>u.priority===s,a=`${this.fieldName()} is ${i}`}t.filter=new Ve(e,o,new ge(a))}else t.error="do not understand query filter (priority)";return t}fieldName(){return"priority"}filterRegExp(){return Kd.priorityRegexp}supportsSorting(){return!0}comparator(){return(e,t)=>e.priority.localeCompare(t.priority)}},dn=Kd;dn.priorityRegexp=/^priority(\s+is)?(\s+(above|below|not))?(\s+(low|none|medium|high))$/;var Zn=class{matchesAnyOf(e){return e.some(t=>this.matches(t))}};var Qn=class extends Zn{constructor(t){super();this.stringToFind=t}matches(t){return Qn.stringIncludesCaseInsensitive(t,this.stringToFind)}static stringIncludesCaseInsensitive(t,n){return t.toLocaleLowerCase().includes(n.toLocaleLowerCase())}};var Jn=class extends Zn{constructor(t){super();this.regex=t}static validateAndConstruct(t){let n=/\/((?![*+?])(?:[^\r\n[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*])+)\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/,i=t.match(n);if(i!==null){let s=new RegExp(i[1],i[2]);return new Jn(s)}else return null}matches(t){return t.match(this.regex)!==null}};var Xe=class extends oe{createFilterOrErrorMessage(e){let t=oe.getMatch(this.filterRegExp(),e);if(t===null)return le.fromError(e,`do not understand query filter (${this.fieldName()})`);let[n,i,s]=t,a=null;if(i.includes("include"))a=new Qn(s);else if(i.includes("regex")&&(a=Jn.validateAndConstruct(s),a===null))return le.fromError(e,`cannot parse regex (${this.fieldName()}); check your leading and trailing slashes for your query`);if(a===null)return le.fromError(e,`do not understand query filter (${this.fieldName()})`);let o=i.match(/not/)!==null,u=new Ve(e,this.getFilter(a,o),new ge(e));return le.fromFilter(u)}fieldPattern(){return this.fieldNameSingularEscaped()}filterOperatorPattern(){return"includes|does not include|regex matches|regex does not match"}filterRegExp(){return new RegExp(`^(?:${this.fieldPattern()}) (${this.filterOperatorPattern()}) (.*)`)}getFilter(e,t){return n=>{let i=e.matches(this.value(n));return t?!i:i}}comparator(){return(e,t)=>this.value(e).localeCompare(this.value(t),void 0,{numeric:!0})}grouper(){return e=>[this.value(e)]}};var ei=class extends Xe{fieldName(){return"path"}value(e){return e.path}supportsSorting(){return!0}};var ti=class extends oe{canCreateFilterForLine(e){return!1}createFilterOrErrorMessage(e){return le.fromError(e,"Filtering by urgency is not yet supported")}fieldName(){return"urgency"}filterRegExp(){throw Error(`filterRegExp() unimplemented for ${this.fieldName()}`)}supportsSorting(){return!0}comparator(){return(e,t)=>t.urgency-e.urgency}};var ri=class{static by(e,t){let n=[new ti().comparator(),new br().comparator(),new cn().comparator(),new dn().comparator(),new ei().comparator()],i=[];for(let s of e)i.push(s.comparator);return t.sort(ri.makeCompositeComparator([...i,...n]))}static makeCompositeComparator(e){return(t,n)=>{for(let i of e){let s=i(t,n);if(s!==0)return s}return 0}}};var fn=class extends Xe{fieldName(){return"description"}value(e){let t=U().globalFilter;return e.description.replace(t,"").trim()}supportsSorting(){return!0}comparator(){return(e,t)=>{let n=fn.cleanDescription(e.description),i=fn.cleanDescription(t.description);return n.localeCompare(i,void 0,{numeric:!0})}}static cleanDescription(e){let t=U().globalFilter;e=e.replace(t,"").trim();let n=/^\[\[?([^\]]*)]]?/,i=e.match(n);if(i!==null){let s=i[1];e=s.substring(s.indexOf("|")+1)+e.replace(n,"")}return e=this.replaceFormatting(e,/^\*\*([^*]+)\*\*/),e=this.replaceFormatting(e,/^\*([^*]+)\*/),e=this.replaceFormatting(e,/^==([^=]+)==/),e=this.replaceFormatting(e,/^__([^_]+)__/),e=this.replaceFormatting(e,/^_([^_]+)_/),e}static replaceFormatting(e,t){let n=e.match(t);return n!==null&&(e=n[1]+e.replace(t,"")),e}};var Vd=class extends _e{filterRegExp(){return Vd.doneRegexp}fieldName(){return"done"}date(e){return e.doneDate}filterResultIfFieldMissing(){return!1}},Cs=Vd;Cs.doneRegexp=/^done (before|after|on)? ?(.*)/;var ao=class extends Wr{constructor(){super(),this._filters.add("exclude sub-items",e=>{if(e.indentation==="")return!0;let t=e.indentation.lastIndexOf(">");return t===-1?!1:/^ ?$/.test(e.indentation.slice(t+1))})}fieldName(){return"exclude"}};var oo=class extends Xe{fieldName(){return"heading"}value(e){return e.precedingHeader?e.precedingHeader:""}supportsSorting(){return!0}};var Xd=class extends _e{filterRegExp(){return Xd.scheduledRegexp}fieldName(){return"scheduled"}date(e){return e.scheduledDate}filterResultIfFieldMissing(){return!1}},Ns=Xd;Ns.scheduledRegexp=/^scheduled (before|after|on)? ?(.*)/;var Zd=class extends _e{filterRegExp(){return Zd.startRegexp}fieldName(){return"start"}date(e){return e.startDate}filterResultIfFieldMissing(){return!0}},Is=Zd;Is.startRegexp=/^starts (before|after|on)? ?(.*)/;var ni=class extends oe{constructor(){super();this.filterInstructions=new Lr,this.filterInstructions.add(ni.instructionForFieldPresence,t=>this.dates(t).some(n=>n!==null)),this.filterInstructions.add(ni.instructionForFieldAbsence,t=>!this.dates(t).some(n=>n!==null))}canCreateFilterForLine(t){return this.filterInstructions.canCreateFilterForLine(t)?!0:super.canCreateFilterForLine(t)}createFilterOrErrorMessage(t){let n=this.filterInstructions.createFilterOrErrorMessage(t);if(n.filter!==void 0)return n;let i=new le(t),s=oe.getMatch(this.filterRegExp(),t);if(s!==null){let a=yr.parseDate(s[2]);if(!a.isValid())i.error="do not understand happens date";else{let o,u;s[1]==="before"?(o=c=>this.dates(c).some(d=>d&&d.isBefore(a)),u=" "+s[1]):s[1]==="after"?(o=c=>this.dates(c).some(d=>d&&d.isAfter(a)),u=" "+s[1]):(o=c=>this.dates(c).some(d=>d&&d.isSame(a)),u=" on");let l=_e.getExplanationString("due, start or scheduled",u,!1,a);i.filter=new Ve(t,o,new ge(l))}}else i.error="do not understand query filter (happens date)";return i}earliestDate(t){return new ni().dates(t).sort(_e.compareByDate)[0]}filterRegExp(){return ni.happensRegexp}dates(t){return Array.of(t.startDate,t.scheduledDate,t.dueDate)}fieldName(){return"happens"}supportsSorting(){return!0}comparator(){return(t,n)=>_e.compareByDate(this.earliestDate(t),this.earliestDate(n))}},vr=ni;vr.happensRegexp=/^happens (before|after|on)? ?(.*)/,vr.instructionForFieldPresence="has happens date",vr.instructionForFieldAbsence="no happens date";var uo=class extends Wr{constructor(){super(),this._filters.add("is recurring",e=>e.recurrence!==null),this._filters.add("is not recurring",e=>e.recurrence===null)}fieldName(){return"recurring"}};var lo=class extends Xe{fieldNamePlural(){return this.fieldNameSingular()+"s"}fieldName(){return`${this.fieldNameSingular()}/${this.fieldNamePlural()}`}fieldPattern(){return`${this.fieldNameSingular()}|${this.fieldNamePlural()}`}filterOperatorPattern(){return`${super.filterOperatorPattern()}|include|do not include`}value(e){return this.values(e).join(", ")}getFilter(e,t){return n=>{let i=e.matchesAnyOf(this.values(n));return t?!i:i}}};var pn=class extends lo{fieldNameSingular(){return"tag"}values(e){return e.tags}supportsSorting(){return!0}createSorterFromLine(e){let t=e.match(this.sorterRegExp());if(t===null)return null;let n=!!t[1],i=isNaN(+t[2])?1:+t[2],s=pn.makeCompareByTagComparator(i);return new gr(this.fieldNameSingular(),s,n)}sorterRegExp(){return/^sort by tag( reverse)?[\s]*(\d+)?/}comparator(){return pn.makeCompareByTagComparator(1)}static makeCompareByTagComparator(e){return(t,n)=>{if(t.tags.length===0&&n.tags.length===0)return 0;if(t.tags.length===0)return 1;if(n.tags.length===0)return-1;let i=e-1;if(t.tags.length=e)return 1;if(n.tags.length=e)return-1;if(t.tags.lengththis.filterTaskWithParsedQuery(u,s),o=this.constructExplanation(s);return n.filter=new Ve(t,a,o),n}catch(s){let a=s instanceof Error?s.message:"unknown error type";return n.error=`malformed boolean query -- ${a} (check the documentation for guidelines)`,n}return n}preprocessExpression(t){return t.replace(/\(([^()]+)\)/g,'("$1")')}filterTaskWithParsedQuery(t,n){let i=o=>o==="true",s=o=>o?"true":"false",a=[];for(let o of n)if(o.name==="IDENTIFIER"){if(o.value==null)throw Error("null token value");let l=this.subFields[o.value.trim()].filterFunction(t);a.push(s(l))}else if(o.name==="OPERATOR")if(o.value==="NOT"){let u=i(a.pop());a.push(s(!u))}else if(o.value==="OR"){let u=i(a.pop()),l=i(a.pop());a.push(s(u||l))}else if(o.value==="AND"){let u=i(a.pop()),l=i(a.pop());a.push(s(u&&l))}else if(o.value==="XOR"){let u=i(a.pop()),l=i(a.pop());a.push(s(u&&!l||!u&&l))}else throw Error("Unsupported operator: "+o.value);else throw Error("Unsupported token type: "+o);return i(a[0])}constructExplanation(t){let n=[];for(let i of t)if(i.name==="IDENTIFIER"){if(i.value==null)throw Error("null token value");let s=this.subFields[i.value.trim()];n.push(s.explanation)}else if(i.name==="OPERATOR")if(i.value==="NOT"){let s=n.pop();n.push(ge.booleanNot([s]))}else if(i.value==="OR"){let s=n.pop(),a=n.pop();n.push(ge.booleanOr([a,s]))}else if(i.value==="AND"){let s=n.pop(),a=n.pop();n.push(ge.booleanAnd([a,s]))}else if(i.value==="XOR"){let s=n.pop(),a=n.pop();n.push(ge.booleanXor([a,s]))}else throw Error("Unsupported operator: "+i.value);else throw Error("Unsupported token type: "+i);return n[0]}};var yo=class extends Xe{fieldName(){return"filename"}value(e){let t=e.filename;return t===null?"":t+".md"}supportsSorting(){return!0}};var go=class extends Xe{constructor(){super()}fieldName(){return"status.name"}value(e){return e.status.name}supportsSorting(){return!0}supportsGrouping(){return!0}};var $r=class extends oe{canCreateFilterForLine(e){let t=new RegExp(`^(?:${this.fieldNameSingularEscaped()})`);return oe.lineMatchesFilter(t,e)}createFilterOrErrorMessage(e){let t=oe.getMatch(this.filterRegExp(),e);if(t===null)return this.helpMessage(e);let[n,i,s]=t,a=tr[s.toUpperCase()];if(!a)return this.helpMessage(e);let o;switch(i){case"is":o=u=>u.status.type===a;break;case"is not":o=u=>u.status.type!==a;break;default:return this.helpMessage(e)}return le.fromFilter(new Ve(e,o,new ge(e)))}filterRegExp(){return new RegExp(`^(?:${this.fieldNameSingularEscaped()}) (is|is not) ([^ ]+)$`)}helpMessage(e){let t=Object.values(tr).filter(i=>i!=="EMPTY").join(" "),n=`Invalid ${this.fieldNameSingular()} instruction: '${e}'. +`; + console.error(msg); + if (e instanceof Error) { + console.error(e.stack); + } + if (this.state === "Initializing" /* Initializing */) { + new import_obsidian3.Notice(msg, 1e4); + } + } + static getSection(lineNumberTask, sections) { + if (sections === void 0) { + return null; + } + for (const section of sections) { + if (section.position.start.line <= lineNumberTask && section.position.end.line >= lineNumberTask) { + return section; + } + } + return null; + } + static getPrecedingHeader(lineNumberTask, headings) { + if (headings === void 0) { + return null; + } + let precedingHeader = null; + for (const heading of headings) { + if (heading.position.start.line > lineNumberTask) { + return precedingHeader; + } + precedingHeader = heading.heading; + } + return precedingHeader; + } +}; + +// src/Commands/CreateOrEdit.ts +var import_obsidian5 = require("obsidian"); + +// src/TaskModal.ts +var import_obsidian4 = require("obsidian"); + +// node_modules/svelte/internal/index.mjs +function noop() { +} +function run(fn) { + return fn(); +} +function blank_object() { + return /* @__PURE__ */ Object.create(null); +} +function run_all(fns) { + fns.forEach(run); +} +function is_function(thing) { + return typeof thing === "function"; +} +function safe_not_equal(a, b) { + return a != a ? b == b : a !== b || (a && typeof a === "object" || typeof a === "function"); +} +function is_empty(obj) { + return Object.keys(obj).length === 0; +} +var is_hydrating = false; +function start_hydrating() { + is_hydrating = true; +} +function end_hydrating() { + is_hydrating = false; +} +function append(target, node) { + target.appendChild(node); +} +function insert(target, node, anchor) { + target.insertBefore(node, anchor || null); +} +function detach(node) { + node.parentNode.removeChild(node); +} +function destroy_each(iterations, detaching) { + for (let i = 0; i < iterations.length; i += 1) { + if (iterations[i]) + iterations[i].d(detaching); + } +} +function element(name) { + return document.createElement(name); +} +function svg_element(name) { + return document.createElementNS("http://www.w3.org/2000/svg", name); +} +function text(data) { + return document.createTextNode(data); +} +function space() { + return text(" "); +} +function listen(node, event, handler, options) { + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); +} +function prevent_default(fn) { + return function(event) { + event.preventDefault(); + return fn.call(this, event); + }; +} +function attr(node, attribute, value) { + if (value == null) + node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); +} +function children(element2) { + return Array.from(element2.childNodes); +} +function set_data(text2, data) { + data = "" + data; + if (text2.wholeText !== data) + text2.data = data; +} +function set_input_value(input, value) { + input.value = value == null ? "" : value; +} +function select_option(select, value) { + for (let i = 0; i < select.options.length; i += 1) { + const option = select.options[i]; + if (option.__value === value) { + option.selected = true; + return; + } + } + select.selectedIndex = -1; +} +function select_value(select) { + const selected_option = select.querySelector(":checked") || select.options[0]; + return selected_option && selected_option.__value; +} +function toggle_class(element2, name, toggle) { + element2.classList[toggle ? "add" : "remove"](name); +} +var HtmlTag = class { + constructor(is_svg = false) { + this.is_svg = false; + this.is_svg = is_svg; + this.e = this.n = null; + } + c(html) { + this.h(html); + } + m(html, target, anchor = null) { + if (!this.e) { + if (this.is_svg) + this.e = svg_element(target.nodeName); + else + this.e = element(target.nodeName); + this.t = target; + this.c(html); + } + this.i(anchor); + } + h(html) { + this.e.innerHTML = html; + this.n = Array.from(this.e.childNodes); + } + i(anchor) { + for (let i = 0; i < this.n.length; i += 1) { + insert(this.t, this.n[i], anchor); + } + } + p(html) { + this.d(); + this.h(html); + this.i(this.a); + } + d() { + this.n.forEach(detach); + } +}; +var current_component; +function set_current_component(component) { + current_component = component; +} +function get_current_component() { + if (!current_component) + throw new Error("Function called outside component initialization"); + return current_component; +} +function onMount(fn) { + get_current_component().$$.on_mount.push(fn); +} +var dirty_components = []; +var binding_callbacks = []; +var render_callbacks = []; +var flush_callbacks = []; +var resolved_promise = Promise.resolve(); +var update_scheduled = false; +function schedule_update() { + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } +} +function add_render_callback(fn) { + render_callbacks.push(fn); +} +var seen_callbacks = /* @__PURE__ */ new Set(); +var flushidx = 0; +function flush() { + const saved_component = current_component; + do { + while (flushidx < dirty_components.length) { + const component = dirty_components[flushidx]; + flushidx++; + set_current_component(component); + update(component.$$); + } + set_current_component(null); + dirty_components.length = 0; + flushidx = 0; + while (binding_callbacks.length) + binding_callbacks.pop()(); + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + seen_callbacks.clear(); + set_current_component(saved_component); +} +function update($$) { + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } +} +var outroing = /* @__PURE__ */ new Set(); +function transition_in(block, local) { + if (block && block.i) { + outroing.delete(block); + block.i(local); + } +} +var globals = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : global; +function mount_component(component, target, anchor, customElement) { + const { fragment, on_mount, on_destroy, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + add_render_callback(() => { + const new_on_destroy = on_mount.map(run).filter(is_function); + if (on_destroy) { + on_destroy.push(...new_on_destroy); + } else { + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + } + after_update.forEach(add_render_callback); +} +function destroy_component(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } +} +function make_dirty(component, i) { + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[i / 31 | 0] |= 1 << i % 31; +} +function init(component, options, instance2, create_fragment2, not_equal, props, append_styles, dirty = [-1]) { + const parent_component = current_component; + set_current_component(component); + const $$ = component.$$ = { + fragment: null, + ctx: null, + props, + update: noop, + not_equal, + bound: blank_object(), + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), + callbacks: blank_object(), + dirty, + skip_bound: false, + root: options.target || parent_component.$$.root + }; + append_styles && append_styles($$.root); + let ready = false; + $$.ctx = instance2 ? instance2(component, options.props || {}, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { + if (!$$.skip_bound && $$.bound[i]) + $$.bound[i](value); + if (ready) + make_dirty(component, i); + } + return ret; + }) : []; + $$.update(); + ready = true; + run_all($$.before_update); + $$.fragment = create_fragment2 ? create_fragment2($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + start_hydrating(); + const nodes = children(options.target); + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } else { + $$.fragment && $$.fragment.c(); + } + if (options.intro) + transition_in(component.$$.fragment); + mount_component(component, options.target, options.anchor, options.customElement); + end_hydrating(); + flush(); + } + set_current_component(parent_component); +} +var SvelteElement; +if (typeof HTMLElement === "function") { + SvelteElement = class extends HTMLElement { + constructor() { + super(); + this.attachShadow({ mode: "open" }); + } + connectedCallback() { + const { on_mount } = this.$$; + this.$$.on_disconnect = on_mount.map(run).filter(is_function); + for (const key in this.$$.slotted) { + this.appendChild(this.$$.slotted[key]); + } + } + attributeChangedCallback(attr2, _oldValue, newValue) { + this[attr2] = newValue; + } + disconnectedCallback() { + run_all(this.$$.on_disconnect); + } + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } + }; +} +var SvelteComponent = class { + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } +}; + +// src/ui/EditTask.svelte +var chrono = __toESM(require_dist()); + +// src/DateAbbreviations.ts +var abbreviations = { + td: "today", + tm: "tomorrow", + yd: "yesterday", + tw: "this week", + nw: "next week", + weekend: "sat", + we: "sat" +}; +function doAutocomplete(date) { + for (const [key, val] of Object.entries(abbreviations)) { + date = date.replace(RegExp(`\\b${key}\\s`, "i"), val); + } + return date; +} + +// src/ui/EditTask.svelte +function get_each_context(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[32] = list[i]; + return child_ctx; +} +function get_each_context_1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[35] = list[i].value; + child_ctx[36] = list[i].label; + child_ctx[37] = list[i].symbol; + return child_ctx; +} +function create_if_block(ctx) { + let span; + let t_value = ctx[37] + ""; + let t; + return { + c() { + span = element("span"); + t = text(t_value); + }, + m(target, anchor) { + insert(target, span, anchor); + append(span, t); + }, + p: noop, + d(detaching) { + if (detaching) + detach(span); + } + }; +} +function create_each_block_1(ctx) { + let span1; + let input; + let input_id_value; + let input_value_value; + let input_accesskey_value; + let t0; + let label; + let span0; + let t1_value = ctx[36] + ""; + let t1; + let t2; + let show_if = ctx[37] && ctx[37].charCodeAt(0) >= 256; + let label_for_value; + let t3; + let mounted; + let dispose; + let if_block = show_if && create_if_block(ctx); + return { + c() { + span1 = element("span"); + input = element("input"); + t0 = space(); + label = element("label"); + span0 = element("span"); + t1 = text(t1_value); + t2 = space(); + if (if_block) + if_block.c(); + t3 = space(); + attr(input, "type", "radio"); + attr(input, "id", input_id_value = "priority-" + ctx[35]); + input.__value = input_value_value = ctx[35]; + input.value = input.__value; + attr(input, "accesskey", input_accesskey_value = ctx[9](ctx[36].charAt(0).toLowerCase())); + ctx[21][0].push(input); + attr(span0, "class", "accesskey-first"); + attr(label, "for", label_for_value = "priority-" + ctx[35]); + }, + m(target, anchor) { + insert(target, span1, anchor); + append(span1, input); + input.checked = input.__value === ctx[1].priority; + append(span1, t0); + append(span1, label); + append(label, span0); + append(span0, t1); + append(label, t2); + if (if_block) + if_block.m(label, null); + append(span1, t3); + if (!mounted) { + dispose = listen(input, "change", ctx[20]); + mounted = true; + } + }, + p(ctx2, dirty) { + if (dirty[0] & 512 && input_accesskey_value !== (input_accesskey_value = ctx2[9](ctx2[36].charAt(0).toLowerCase()))) { + attr(input, "accesskey", input_accesskey_value); + } + if (dirty[0] & 3) { + input.checked = input.__value === ctx2[1].priority; + } + if (show_if) + if_block.p(ctx2, dirty); + }, + d(detaching) { + if (detaching) + detach(span1); + ctx[21][0].splice(ctx[21][0].indexOf(input), 1); + if (if_block) + if_block.d(); + mounted = false; + dispose(); + } + }; +} +function create_each_block(ctx) { + let option; + let t0_value = ctx[32].name + ""; + let t0; + let t1; + let t2_value = ctx[32].symbol + ""; + let t2; + let t3; + let option_value_value; + return { + c() { + option = element("option"); + t0 = text(t0_value); + t1 = text(" ["); + t2 = text(t2_value); + t3 = text("]"); + option.__value = option_value_value = ctx[32]; + option.value = option.__value; + }, + m(target, anchor) { + insert(target, option, anchor); + append(option, t0); + append(option, t1); + append(option, t2); + append(option, t3); + }, + p(ctx2, dirty) { + if (dirty[0] & 1 && t0_value !== (t0_value = ctx2[32].name + "")) + set_data(t0, t0_value); + if (dirty[0] & 1 && t2_value !== (t2_value = ctx2[32].symbol + "")) + set_data(t2, t2_value); + if (dirty[0] & 1 && option_value_value !== (option_value_value = ctx2[32])) { + option.__value = option_value_value; + option.value = option.__value; + } + }, + d(detaching) { + if (detaching) + detach(option); + } + }; +} +function create_fragment(ctx) { + let div9; + let form; + let div0; + let label0; + let t3; + let input0; + let input0_accesskey_value; + let t4; + let div1; + let label1; + let t5; + let label1_for_value; + let t6; + let t7; + let div3; + let label2; + let t9; + let input1; + let input1_accesskey_value; + let t10; + let code0; + let t11; + let t12; + let html_tag; + let t13; + let label3; + let t15; + let input2; + let input2_accesskey_value; + let t16; + let code1; + let t17; + let t18; + let html_tag_1; + let t19; + let label4; + let t21; + let input3; + let input3_accesskey_value; + let t22; + let code2; + let t23; + let t24; + let html_tag_2; + let t25; + let label5; + let t29; + let input4; + let input4_accesskey_value; + let t30; + let code3; + let t31; + let t32; + let html_tag_3; + let t33; + let div2; + let label6; + let t37; + let input5; + let input5_accesskey_value; + let t38; + let div4; + let label7; + let t40; + let select; + let t41; + let div7; + let div5; + let label8; + let t43; + let input6; + let input6_checked_value; + let t44; + let div6; + let span3; + let t46; + let code4; + let t47; + let div8; + let button0; + let t49; + let button1; + let mounted; + let dispose; + let each_value_1 = ctx[10]; + let each_blocks_1 = []; + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks_1[i] = create_each_block_1(get_each_context_1(ctx, each_value_1, i)); + } + let each_value = ctx[0]; + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i)); + } + return { + c() { + div9 = element("div"); + form = element("form"); + div0 = element("div"); + label0 = element("label"); + label0.innerHTML = `Description`; + t3 = space(); + input0 = element("input"); + t4 = space(); + div1 = element("div"); + label1 = element("label"); + t5 = text("Priority"); + t6 = space(); + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].c(); + } + t7 = space(); + div3 = element("div"); + label2 = element("label"); + label2.textContent = "Recurs"; + t9 = space(); + input1 = element("input"); + t10 = space(); + code0 = element("code"); + t11 = text(recurrenceSymbol); + t12 = space(); + html_tag = new HtmlTag(false); + t13 = space(); + label3 = element("label"); + label3.textContent = "Due"; + t15 = space(); + input2 = element("input"); + t16 = space(); + code1 = element("code"); + t17 = text(dueDateSymbol); + t18 = space(); + html_tag_1 = new HtmlTag(false); + t19 = space(); + label4 = element("label"); + label4.textContent = "Scheduled"; + t21 = space(); + input3 = element("input"); + t22 = space(); + code2 = element("code"); + t23 = text(scheduledDateSymbol); + t24 = space(); + html_tag_2 = new HtmlTag(false); + t25 = space(); + label5 = element("label"); + label5.innerHTML = `Start`; + t29 = space(); + input4 = element("input"); + t30 = space(); + code3 = element("code"); + t31 = text(startDateSymbol); + t32 = space(); + html_tag_3 = new HtmlTag(false); + t33 = space(); + div2 = element("div"); + label6 = element("label"); + label6.innerHTML = `Only + future dates:`; + t37 = space(); + input5 = element("input"); + t38 = space(); + div4 = element("div"); + label7 = element("label"); + label7.textContent = "Status"; + t40 = space(); + select = element("select"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + t41 = space(); + div7 = element("div"); + div5 = element("div"); + label8 = element("label"); + label8.textContent = "Completed:"; + t43 = space(); + input6 = element("input"); + t44 = space(); + div6 = element("div"); + span3 = element("span"); + span3.textContent = "Done on:"; + t46 = space(); + code4 = element("code"); + t47 = space(); + div8 = element("div"); + button0 = element("button"); + button0.textContent = "Apply"; + t49 = space(); + button1 = element("button"); + button1.textContent = "Cancel"; + attr(label0, "for", "description"); + attr(input0, "id", "description"); + attr(input0, "type", "text"); + attr(input0, "class", "tasks-modal-description"); + attr(input0, "placeholder", "Take out the trash"); + attr(input0, "accesskey", input0_accesskey_value = ctx[9]("t")); + attr(div0, "class", "tasks-modal-section"); + attr(label1, "for", label1_for_value = "priority-" + ctx[1].priority); + attr(div1, "class", "tasks-modal-section tasks-modal-priorities"); + attr(label2, "for", "recurrence"); + attr(label2, "class", "accesskey-first"); + attr(input1, "id", "recurrence"); + attr(input1, "type", "text"); + attr(input1, "placeholder", "Try 'every 2 weeks on Thursday'."); + attr(input1, "accesskey", input1_accesskey_value = ctx[9]("r")); + html_tag.a = null; + attr(label3, "for", "due"); + attr(label3, "class", "accesskey-first"); + attr(input2, "id", "due"); + attr(input2, "type", "text"); + attr(input2, "placeholder", datePlaceholder); + attr(input2, "accesskey", input2_accesskey_value = ctx[9]("d")); + html_tag_1.a = null; + attr(label4, "for", "scheduled"); + attr(label4, "class", "accesskey-first"); + attr(input3, "id", "scheduled"); + attr(input3, "type", "text"); + attr(input3, "placeholder", datePlaceholder); + attr(input3, "accesskey", input3_accesskey_value = ctx[9]("s")); + html_tag_2.a = null; + attr(label5, "for", "start"); + attr(input4, "id", "start"); + attr(input4, "type", "text"); + attr(input4, "placeholder", datePlaceholder); + attr(input4, "accesskey", input4_accesskey_value = ctx[9]("a")); + html_tag_3.a = null; + attr(label6, "for", "forwardOnly"); + attr(input5, "id", "forwardOnly"); + attr(input5, "type", "checkbox"); + attr(input5, "class", "task-list-item-checkbox tasks-modal-checkbox"); + attr(input5, "accesskey", input5_accesskey_value = ctx[9]("f")); + attr(div3, "class", "tasks-modal-section tasks-modal-dates"); + attr(label7, "for", "status"); + attr(select, "id", "status-type"); + attr(select, "class", "dropdown"); + if (ctx[1].status === void 0) + add_render_callback(() => ctx[27].call(select)); + attr(div4, "class", "tasks-modal-section"); + attr(label8, "for", "status"); + attr(input6, "id", "status"); + attr(input6, "type", "checkbox"); + attr(input6, "class", "task-list-item-checkbox tasks-modal-checkbox"); + input6.checked = input6_checked_value = ctx[1].status.isCompleted(); + input6.disabled = true; + attr(div7, "class", "tasks-modal-section tasks-modal-status"); + attr(button0, "type", "submit"); + attr(button0, "class", "mod-cta"); + attr(button1, "type", "button"); + attr(div8, "class", "tasks-modal-section tasks-modal-buttons"); + toggle_class(form, "with-accesskeys", ctx[2]); + attr(div9, "class", "tasks-modal"); + }, + m(target, anchor) { + insert(target, div9, anchor); + append(div9, form); + append(form, div0); + append(div0, label0); + append(div0, t3); + append(div0, input0); + set_input_value(input0, ctx[1].description); + ctx[19](input0); + append(form, t4); + append(form, div1); + append(div1, label1); + append(label1, t5); + append(div1, t6); + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].m(div1, null); + } + append(form, t7); + append(form, div3); + append(div3, label2); + append(div3, t9); + append(div3, input1); + set_input_value(input1, ctx[1].recurrenceRule); + append(div3, t10); + append(div3, code0); + append(code0, t11); + append(code0, t12); + html_tag.m(ctx[7], code0); + append(div3, t13); + append(div3, label3); + append(div3, t15); + append(div3, input2); + set_input_value(input2, ctx[1].dueDate); + append(div3, t16); + append(div3, code1); + append(code1, t17); + append(code1, t18); + html_tag_1.m(ctx[6], code1); + append(div3, t19); + append(div3, label4); + append(div3, t21); + append(div3, input3); + set_input_value(input3, ctx[1].scheduledDate); + append(div3, t22); + append(div3, code2); + append(code2, t23); + append(code2, t24); + html_tag_2.m(ctx[5], code2); + append(div3, t25); + append(div3, label5); + append(div3, t29); + append(div3, input4); + set_input_value(input4, ctx[1].startDate); + append(div3, t30); + append(div3, code3); + append(code3, t31); + append(code3, t32); + html_tag_3.m(ctx[4], code3); + append(div3, t33); + append(div3, div2); + append(div2, label6); + append(div2, t37); + append(div2, input5); + input5.checked = ctx[1].forwardOnly; + append(form, t38); + append(form, div4); + append(div4, label7); + append(div4, t40); + append(div4, select); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(select, null); + } + select_option(select, ctx[1].status); + append(form, t41); + append(form, div7); + append(div7, div5); + append(div5, label8); + append(div5, t43); + append(div5, input6); + append(div7, t44); + append(div7, div6); + append(div6, span3); + append(div6, t46); + append(div6, code4); + code4.innerHTML = ctx[8]; + append(form, t47); + append(form, div8); + append(div8, button0); + append(div8, t49); + append(div8, button1); + if (!mounted) { + dispose = [ + listen(input0, "input", ctx[18]), + listen(div1, "keyup", ctx[11]), + listen(input1, "input", ctx[22]), + listen(input2, "input", ctx[23]), + listen(input3, "input", ctx[24]), + listen(input4, "input", ctx[25]), + listen(input5, "change", ctx[26]), + listen(select, "change", ctx[27]), + listen(button1, "click", ctx[12]), + listen(form, "submit", prevent_default(ctx[13])) + ]; + mounted = true; + } + }, + p(ctx2, dirty) { + if (dirty[0] & 512 && input0_accesskey_value !== (input0_accesskey_value = ctx2[9]("t"))) { + attr(input0, "accesskey", input0_accesskey_value); + } + if (dirty[0] & 3 && input0.value !== ctx2[1].description) { + set_input_value(input0, ctx2[1].description); + } + if (dirty[0] & 3 && label1_for_value !== (label1_for_value = "priority-" + ctx2[1].priority)) { + attr(label1, "for", label1_for_value); + } + if (dirty[0] & 1538) { + each_value_1 = ctx2[10]; + let i; + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_1(ctx2, each_value_1, i); + if (each_blocks_1[i]) { + each_blocks_1[i].p(child_ctx, dirty); + } else { + each_blocks_1[i] = create_each_block_1(child_ctx); + each_blocks_1[i].c(); + each_blocks_1[i].m(div1, null); + } + } + for (; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].d(1); + } + each_blocks_1.length = each_value_1.length; + } + if (dirty[0] & 512 && input1_accesskey_value !== (input1_accesskey_value = ctx2[9]("r"))) { + attr(input1, "accesskey", input1_accesskey_value); + } + if (dirty[0] & 3 && input1.value !== ctx2[1].recurrenceRule) { + set_input_value(input1, ctx2[1].recurrenceRule); + } + if (dirty[0] & 128) + html_tag.p(ctx2[7]); + if (dirty[0] & 512 && input2_accesskey_value !== (input2_accesskey_value = ctx2[9]("d"))) { + attr(input2, "accesskey", input2_accesskey_value); + } + if (dirty[0] & 3 && input2.value !== ctx2[1].dueDate) { + set_input_value(input2, ctx2[1].dueDate); + } + if (dirty[0] & 64) + html_tag_1.p(ctx2[6]); + if (dirty[0] & 512 && input3_accesskey_value !== (input3_accesskey_value = ctx2[9]("s"))) { + attr(input3, "accesskey", input3_accesskey_value); + } + if (dirty[0] & 3 && input3.value !== ctx2[1].scheduledDate) { + set_input_value(input3, ctx2[1].scheduledDate); + } + if (dirty[0] & 32) + html_tag_2.p(ctx2[5]); + if (dirty[0] & 512 && input4_accesskey_value !== (input4_accesskey_value = ctx2[9]("a"))) { + attr(input4, "accesskey", input4_accesskey_value); + } + if (dirty[0] & 3 && input4.value !== ctx2[1].startDate) { + set_input_value(input4, ctx2[1].startDate); + } + if (dirty[0] & 16) + html_tag_3.p(ctx2[4]); + if (dirty[0] & 512 && input5_accesskey_value !== (input5_accesskey_value = ctx2[9]("f"))) { + attr(input5, "accesskey", input5_accesskey_value); + } + if (dirty[0] & 3) { + input5.checked = ctx2[1].forwardOnly; + } + if (dirty[0] & 1) { + each_value = ctx2[0]; + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(select, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + if (dirty[0] & 3) { + select_option(select, ctx2[1].status); + } + if (dirty[0] & 3 && input6_checked_value !== (input6_checked_value = ctx2[1].status.isCompleted())) { + input6.checked = input6_checked_value; + } + if (dirty[0] & 256) + code4.innerHTML = ctx2[8]; + ; + if (dirty[0] & 4) { + toggle_class(form, "with-accesskeys", ctx2[2]); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(div9); + ctx[19](null); + destroy_each(each_blocks_1, detaching); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; +} +var datePlaceholder = "Try 'Monday' or 'tomorrow', or [td|tm|yd|tw|nw|we] then space."; +function instance($$self, $$props, $$invalidate) { + let accesskey; + var _a, _b; + let { task } = $$props; + let { onSubmit } = $$props; + let { statusOptions } = $$props; + let descriptionInput; + let editableTask = { + description: "", + status: Status.TODO, + priority: "none", + recurrenceRule: "", + startDate: "", + scheduledDate: "", + dueDate: "", + doneDate: "", + forwardOnly: true + }; + let parsedStartDate = ""; + let parsedScheduledDate = ""; + let parsedDueDate = ""; + let parsedRecurrence = ""; + let parsedDone = ""; + let addGlobalFilterOnSave = false; + let withAccessKeys = true; + const priorityOptions = [ + { + value: "low", + label: "Low", + symbol: prioritySymbols.Low + }, + { + value: "none", + label: "Normal", + symbol: prioritySymbols.None + }, + { + value: "medium", + label: "Medium", + symbol: prioritySymbols.Medium + }, + { + value: "high", + label: "High", + symbol: prioritySymbols.High + } + ]; + function parseTypedDateForDisplay(fieldName, typedDate, forwardDate = void 0) { + if (!typedDate) { + return `no ${fieldName} date`; + } + const parsed = chrono.parseDate(typedDate, forwardDate, { forwardDate: forwardDate != void 0 }); + if (parsed !== null) { + return window.moment(parsed).format("YYYY-MM-DD"); + } + return `invalid ${fieldName} date`; + } + function parseTypedDateForDisplayUsingFutureDate(fieldName, typedDate) { + return parseTypedDateForDisplay(fieldName, typedDate, editableTask.forwardOnly ? new Date() : void 0); + } + function parseTypedDateForSaving(typedDate) { + let date = null; + const parsedDate = chrono.parseDate(typedDate, new Date(), { forwardDate: editableTask.forwardOnly }); + if (parsedDate !== null) { + date = window.moment(parsedDate); + } + return date; + } + onMount(() => { + const { globalFilter, provideAccessKeys } = getSettings(); + $$invalidate(2, withAccessKeys = provideAccessKeys); + const description = task.getDescriptionWithoutGlobalFilter(); + if (description != task.description || description.indexOf(globalFilter) == -1) + addGlobalFilterOnSave = true; + let priority = "none"; + if (task.priority === "4" /* Low */) { + priority = "low"; + } else if (task.priority === "2" /* Medium */) { + priority = "medium"; + } else if (task.priority === "1" /* High */) { + priority = "high"; + } + $$invalidate(1, editableTask = { + description, + status: task.status, + priority, + recurrenceRule: task.recurrence ? task.recurrence.toText() : "", + startDate: task.startDate ? task.startDate.format("YYYY-MM-DD") : "", + scheduledDate: task.scheduledDate ? task.scheduledDate.format("YYYY-MM-DD") : "", + dueDate: task.dueDate ? task.dueDate.format("YYYY-MM-DD") : "", + doneDate: task.doneDate ? task.doneDate.format("YYYY-MM-DD") : "", + forwardOnly: true + }); + setTimeout( + () => { + descriptionInput.focus(); + }, + 10 + ); + }); + const _onPriorityKeyup = (event) => { + if (event.key && !event.altKey && !event.ctrlKey) { + const priorityOption = priorityOptions.find((option) => option.label.charAt(0).toLowerCase() == event.key); + if (priorityOption) { + $$invalidate(1, editableTask.priority = priorityOption.value, editableTask); + } + } + }; + const _onClose = () => { + onSubmit([]); + }; + const _onSubmit = () => { + const { globalFilter } = getSettings(); + let description = editableTask.description.trim(); + if (addGlobalFilterOnSave) { + description = globalFilter + " " + description; + } + const startDate = parseTypedDateForSaving(editableTask.startDate); + const scheduledDate = parseTypedDateForSaving(editableTask.scheduledDate); + const dueDate = parseTypedDateForSaving(editableTask.dueDate); + let recurrence = null; + if (editableTask.recurrenceRule) { + recurrence = Recurrence.fromText({ + recurrenceRuleText: editableTask.recurrenceRule, + startDate, + scheduledDate, + dueDate + }); + } + let parsedPriority; + switch (editableTask.priority) { + case "low": + parsedPriority = "4" /* Low */; + break; + case "medium": + parsedPriority = "2" /* Medium */; + break; + case "high": + parsedPriority = "1" /* High */; + break; + default: + parsedPriority = "3" /* None */; + } + const updatedTask = new Task(Object.assign(Object.assign({}, task), { + description, + status: editableTask.status, + priority: parsedPriority, + recurrence, + startDate, + scheduledDate, + dueDate, + doneDate: window.moment(editableTask.doneDate, "YYYY-MM-DD").isValid() ? window.moment(editableTask.doneDate, "YYYY-MM-DD") : null + })); + onSubmit([updatedTask]); + }; + const $$binding_groups = [[]]; + function input0_input_handler() { + editableTask.description = this.value; + $$invalidate(1, editableTask); + $$invalidate(0, statusOptions); + } + function input0_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + descriptionInput = $$value; + $$invalidate(3, descriptionInput); + }); + } + function input_change_handler() { + editableTask.priority = this.__value; + $$invalidate(1, editableTask); + $$invalidate(0, statusOptions); + } + function input1_input_handler() { + editableTask.recurrenceRule = this.value; + $$invalidate(1, editableTask); + $$invalidate(0, statusOptions); + } + function input2_input_handler() { + editableTask.dueDate = this.value; + $$invalidate(1, editableTask); + $$invalidate(0, statusOptions); + } + function input3_input_handler() { + editableTask.scheduledDate = this.value; + $$invalidate(1, editableTask); + $$invalidate(0, statusOptions); + } + function input4_input_handler() { + editableTask.startDate = this.value; + $$invalidate(1, editableTask); + $$invalidate(0, statusOptions); + } + function input5_change_handler() { + editableTask.forwardOnly = this.checked; + $$invalidate(1, editableTask); + $$invalidate(0, statusOptions); + } + function select_change_handler() { + editableTask.status = select_value(this); + $$invalidate(1, editableTask); + $$invalidate(0, statusOptions); + } + $$self.$$set = ($$props2) => { + if ("task" in $$props2) + $$invalidate(14, task = $$props2.task); + if ("onSubmit" in $$props2) + $$invalidate(15, onSubmit = $$props2.onSubmit); + if ("statusOptions" in $$props2) + $$invalidate(0, statusOptions = $$props2.statusOptions); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty[0] & 4) { + $: + $$invalidate(9, accesskey = (key) => withAccessKeys ? key : null); + } + if ($$self.$$.dirty[0] & 2) { + $: { + $$invalidate(1, editableTask.startDate = doAutocomplete(editableTask.startDate), editableTask); + $$invalidate(4, parsedStartDate = parseTypedDateForDisplayUsingFutureDate("start", editableTask.startDate)); + } + } + if ($$self.$$.dirty[0] & 2) { + $: { + $$invalidate(1, editableTask.scheduledDate = doAutocomplete(editableTask.scheduledDate), editableTask); + $$invalidate(5, parsedScheduledDate = parseTypedDateForDisplayUsingFutureDate("scheduled", editableTask.scheduledDate)); + } + } + if ($$self.$$.dirty[0] & 2) { + $: { + $$invalidate(1, editableTask.dueDate = doAutocomplete(editableTask.dueDate), editableTask); + $$invalidate(6, parsedDueDate = parseTypedDateForDisplayUsingFutureDate("due", editableTask.dueDate)); + } + } + if ($$self.$$.dirty[0] & 196610) { + $: { + if (!editableTask.recurrenceRule) { + $$invalidate(7, parsedRecurrence = "not recurring"); + } else { + $$invalidate(7, parsedRecurrence = $$invalidate(17, _b = $$invalidate(16, _a = Recurrence.fromText({ + recurrenceRuleText: editableTask.recurrenceRule, + startDate: null, + scheduledDate: null, + dueDate: null + })) === null || _a === void 0 ? void 0 : _a.toText()) !== null && _b !== void 0 ? _b : "invalid recurrence rule"); + } + } + } + if ($$self.$$.dirty[0] & 2) { + $: { + $$invalidate(8, parsedDone = parseTypedDateForDisplay("done", editableTask.doneDate)); + } + } + }; + return [ + statusOptions, + editableTask, + withAccessKeys, + descriptionInput, + parsedStartDate, + parsedScheduledDate, + parsedDueDate, + parsedRecurrence, + parsedDone, + accesskey, + priorityOptions, + _onPriorityKeyup, + _onClose, + _onSubmit, + task, + onSubmit, + _a, + _b, + input0_input_handler, + input0_binding, + input_change_handler, + $$binding_groups, + input1_input_handler, + input2_input_handler, + input3_input_handler, + input4_input_handler, + input5_change_handler, + select_change_handler + ]; +} +var EditTask = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, { task: 14, onSubmit: 15, statusOptions: 0 }, null, [-1, -1]); + } +}; +var EditTask_default = EditTask; + +// src/TaskModal.ts +var TaskModal = class extends import_obsidian4.Modal { + constructor({ app, task, onSubmit }) { + super(app); + this.task = task; + this.onSubmit = (updatedTasks) => { + updatedTasks.length && onSubmit(updatedTasks); + this.close(); + }; + } + onOpen() { + this.titleEl.setText("Create or edit Task"); + const { contentEl } = this; + const statusOptions = this.getKnownStatusesAndCurrentTaskStatusIfNotKnown(); + new EditTask_default({ + target: contentEl, + props: { task: this.task, statusOptions, onSubmit: this.onSubmit } + }); + } + getKnownStatusesAndCurrentTaskStatusIfNotKnown() { + const statusOptions = StatusRegistry.getInstance().registeredStatuses; + if (StatusRegistry.getInstance().bySymbol(this.task.status.symbol) === Status.EMPTY) { + statusOptions.push(this.task.status); + } + return statusOptions; + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/Commands/CreateOrEditTaskParser.ts +var taskFromLine = ({ line, path }) => { + var _a, _b; + const fallbackDate = DateFallback.fromPath(path); + const task = Task.fromLine({ + line, + path, + sectionStart: 0, + sectionIndex: 0, + precedingHeader: null, + fallbackDate + }); + if (task !== null) { + return task; + } + const nonTaskMatch = line.match(TaskRegularExpressions.nonTaskRegex); + if (nonTaskMatch === null) { + console.error("Tasks: Cannot create task on line:", line); + return new Task({ + status: Status.TODO, + description: "", + path, + indentation: "", + listMarker: "-", + priority: "3" /* None */, + startDate: null, + scheduledDate: null, + dueDate: null, + doneDate: null, + recurrence: null, + sectionStart: 0, + sectionIndex: 0, + precedingHeader: null, + blockLink: "", + tags: [], + originalMarkdown: "", + scheduledDateIsInferred: false + }); + } + const indentation = nonTaskMatch[1]; + const listMarker = (_a = nonTaskMatch[2]) != null ? _a : "-"; + const statusString = (_b = nonTaskMatch[4]) != null ? _b : " "; + const status = StatusRegistry.getInstance().bySymbolOrCreate(statusString); + let description = nonTaskMatch[5]; + const blockLinkMatch = line.match(TaskRegularExpressions.blockLinkRegex); + const blockLink = blockLinkMatch !== null ? blockLinkMatch[0] : ""; + if (blockLink !== "") { + description = description.replace(TaskRegularExpressions.blockLinkRegex, ""); + } + return new Task({ + status, + description, + path, + indentation, + listMarker, + blockLink, + priority: "3" /* None */, + startDate: null, + scheduledDate: null, + dueDate: null, + doneDate: null, + recurrence: null, + sectionStart: 0, + sectionIndex: 0, + precedingHeader: null, + tags: [], + originalMarkdown: "", + scheduledDateIsInferred: false + }); +}; + +// src/Commands/CreateOrEdit.ts +var createOrEdit = (checking, editor, view, app) => { + var _a; + if (checking) { + return view instanceof import_obsidian5.MarkdownView; + } + if (!(view instanceof import_obsidian5.MarkdownView)) { + return; + } + const path = (_a = view.file) == null ? void 0 : _a.path; + if (path === void 0) { + return; + } + const cursorPosition = editor.getCursor(); + const lineNumber = cursorPosition.line; + const line = editor.getLine(lineNumber); + const task = taskFromLine({ line, path }); + const onSubmit = (updatedTasks) => { + const serialized = DateFallback.removeInferredStatusIfNeeded(task, updatedTasks).map((task2) => task2.toFileLineString()).join("\n"); + editor.setLine(lineNumber, serialized); + }; + const taskModal = new TaskModal({ + app, + task, + onSubmit + }); + taskModal.open(); +}; + +// src/Commands/ToggleDone.ts +var import_obsidian6 = require("obsidian"); +var toggleDone = (checking, editor, view) => { + var _a; + if (checking) { + if (!(view instanceof import_obsidian6.MarkdownView)) { + return false; + } + return true; + } + if (!(view instanceof import_obsidian6.MarkdownView)) { + return; + } + const path = (_a = view.file) == null ? void 0 : _a.path; + if (path === void 0) { + return; + } + const origCursorPos = editor.getCursor(); + const lineNumber = origCursorPos.line; + const line = editor.getLine(lineNumber); + const toggledLine = toggleLine(line, path); + editor.setLine(lineNumber, toggledLine); + editor.setCursor({ + line: origCursorPos.line, + ch: calculateCursorOffset(origCursorPos.ch, line, toggledLine) + }); +}; +var toggleLine = (line, path) => { + let toggledLine = line; + const task = Task.fromLine({ + line, + path, + sectionStart: 0, + sectionIndex: 0, + precedingHeader: null, + fallbackDate: null + }); + if (task !== null) { + toggledLine = toggleTask(task); + } else { + const regexMatch = line.match(TaskRegularExpressions.taskRegex); + if (regexMatch !== null) { + const statusString = regexMatch[3]; + const status = StatusRegistry.getInstance().bySymbol(statusString); + const newStatusString = status.nextStatusSymbol; + toggledLine = line.replace(TaskRegularExpressions.taskRegex, `$1- [${newStatusString}] $4`); + } else if (TaskRegularExpressions.listItemRegex.test(line)) { + toggledLine = line.replace(TaskRegularExpressions.listItemRegex, "$1$2 [ ]"); + } else { + toggledLine = line.replace(TaskRegularExpressions.indentationRegex, "$1- "); + } + } + return toggledLine; +}; +var toggleTask = (task) => { + const toggledTasks = task.toggle(); + return toggledTasks.map((task2) => task2.toFileLineString()).join("\n"); +}; +var calculateCursorOffset = (origCursorCh, line, toggledLine) => { + let newLineLen = toggledLine.length; + if (newLineLen <= line.length) { + return origCursorCh >= toggledLine.length ? newLineLen : origCursorCh; + } + const doneDateLength = " \u2705 YYYY-MM-DD".length; + if (toggledLine.match(TaskRegularExpressions.doneDateRegex) && newLineLen - line.length >= doneDateLength) { + newLineLen -= doneDateLength; + } + if (newLineLen >= 2 * line.length && toggledLine.search(".+\n.+") !== -1) { + return origCursorCh + newLineLen - line.length; + } + const firstListItemChar = toggledLine.search(/[-*]/); + if (origCursorCh < firstListItemChar) { + return origCursorCh; + } + return origCursorCh + newLineLen - line.length; +}; + +// src/Commands/index.ts +var Commands = class { + get app() { + return this.plugin.app; + } + constructor({ plugin }) { + this.plugin = plugin; + plugin.addCommand({ + id: "edit-task", + name: "Create or edit task", + icon: "pencil", + editorCheckCallback: (checking, editor, view) => { + return createOrEdit(checking, editor, view, this.app); + } + }); + plugin.addCommand({ + id: "toggle-done", + name: "Toggle task done", + icon: "check-in-circle", + editorCheckCallback: toggleDone + }); + } +}; + +// src/TasksEvents.ts +var TasksEvents = class { + constructor({ obsidianEvents }) { + this.obsidianEvents = obsidianEvents; + } + onCacheUpdate(handler) { + return this.obsidianEvents.on("obsidian-tasks-plugin:cache-update" /* CacheUpdate */, handler); + } + triggerCacheUpdate(cacheData) { + this.obsidianEvents.trigger("obsidian-tasks-plugin:cache-update" /* CacheUpdate */, cacheData); + } + onRequestCacheUpdate(handler) { + return this.obsidianEvents.on("obsidian-tasks-plugin:request-cache-update" /* RequestCacheUpdate */, handler); + } + triggerRequestCacheUpdate(fn) { + this.obsidianEvents.trigger("obsidian-tasks-plugin:request-cache-update" /* RequestCacheUpdate */, fn); + } + off(eventRef) { + this.obsidianEvents.offref(eventRef); + } +}; + +// src/InlineRenderer.ts +var InlineRenderer = class { + constructor({ plugin }) { + this.markdownPostProcessor = this._markdownPostProcessor.bind(this); + plugin.registerMarkdownPostProcessor(this._markdownPostProcessor.bind(this)); + } + _markdownPostProcessor(element2, context) { + return __async(this, null, function* () { + var _a; + const { globalFilter } = getSettings(); + const renderedElements = element2.findAll(".task-list-item").filter((taskItem) => { + var _a2; + const linesText = (_a2 = taskItem.textContent) == null ? void 0 : _a2.split("\n"); + if (linesText === void 0) { + return false; + } + let firstLineText = null; + for (let i = 0; i < linesText.length; i = i + 1) { + if (linesText[i] !== "") { + firstLineText = linesText[i]; + break; + } + } + if (firstLineText === null) { + return false; + } + return firstLineText.includes(globalFilter); + }); + if (renderedElements.length === 0) { + return; + } + const path = context.sourcePath; + const section = context.getSectionInfo(element2); + if (section === null) { + return; + } + const fileLines = section.text.split("\n"); + let sectionIndex = 0; + const fileTasks = []; + for (let lineNumber = section.lineStart; lineNumber <= section.lineEnd; lineNumber++) { + const line = fileLines[lineNumber]; + if (line === void 0) { + continue; + } + const task = Task.fromLine({ + line, + path, + sectionStart: section.lineStart, + sectionIndex, + precedingHeader: null, + fallbackDate: null + }); + if (task !== null) { + fileTasks.push(task); + sectionIndex++; + } + } + for (let sectionIndex2 = 0; sectionIndex2 < renderedElements.length; sectionIndex2++) { + const task = fileTasks[sectionIndex2]; + const renderedElement = renderedElements[sectionIndex2]; + if (task === void 0 || renderedElement === void 0) { + continue; + } + const dataLine = (_a = renderedElement.getAttr("data-line")) != null ? _a : "0"; + const listIndex = Number.parseInt(dataLine, 10); + const taskElement = yield task.toLi({ + parentUlElement: element2, + listIndex + }); + const renderedChildren = renderedElement.childNodes; + for (let i = 0; i < renderedChildren.length; i = i + 1) { + const renderedChild = renderedChildren[i]; + if (renderedChild.nodeName.toLowerCase() === "div") { + taskElement.prepend(renderedChild); + } else if (renderedChild.nodeName.toLowerCase() === "ul") { + taskElement.append(renderedChild); + } + } + const originalFootnotes = renderedElement.querySelectorAll("[data-footnote-id]"); + const newFootnotes = taskElement.querySelectorAll("[data-footnote-id]"); + if (originalFootnotes.length === newFootnotes.length) { + for (let i = 0; i < originalFootnotes.length; i++) { + newFootnotes[i].replaceWith(originalFootnotes[i]); + } + } + renderedElement.replaceWith(taskElement); + } + }); + } +}; + +// src/LivePreviewExtension.ts +var import_view = require("@codemirror/view"); +var import_obsidian7 = require("obsidian"); +var newLivePreviewExtension = () => { + return import_view.ViewPlugin.fromClass(LivePreviewExtension); +}; +var LivePreviewExtension = class { + constructor(view) { + this.view = view; + this.handleClickEvent = this.handleClickEvent.bind(this); + this.view.dom.addEventListener("click", this.handleClickEvent); + } + destroy() { + this.view.dom.removeEventListener("click", this.handleClickEvent); + } + handleClickEvent(event) { + const { target } = event; + if (!target || !(target instanceof HTMLInputElement) || target.type !== "checkbox") { + return false; + } + const ancestor = target.closest("ul.plugin-tasks-query-result, div.callout-content"); + if (ancestor) { + if (ancestor.matches("div.callout-content")) { + const msg = 'obsidian-tasks-plugin warning: Tasks cannot add or remove completion dates or make the next copy of a recurring task for tasks written inside a callout when you click their checkboxes in Live Preview. \nIf you wanted Tasks to do these things, please undo your change, then either click the line of the task and use the "Toggle Task Done" command, or switch to Reading View to click the checkbox.'; + console.warn(msg); + new import_obsidian7.Notice(msg, 45e3); + } + return false; + } + const { state } = this.view; + const position = this.view.posAtDOM(target); + const line = state.doc.lineAt(position); + const task = Task.fromLine({ + line: line.text, + path: "", + sectionStart: 0, + sectionIndex: 0, + precedingHeader: null, + fallbackDate: null + }); + console.debug(`Live Preview Extension: toggle called. Position: ${position} Line: ${line.text}`); + if (task === null) { + return false; + } + event.preventDefault(); + const toggled = task.toggle(); + const toggledString = toggled.map((t) => t.toFileLineString()).join(state.lineBreak); + const transaction = state.update({ + changes: { + from: line.from, + to: line.to, + insert: toggledString + } + }); + this.view.dispatch(transaction); + const desiredCheckedStatus = target.checked; + setTimeout(() => { + target.checked = desiredCheckedStatus; + }, 1); + return true; + } +}; + +// src/QueryRenderer.ts +var import_obsidian8 = require("obsidian"); + +// src/Query/Sorter.ts +var Sorter = class { + constructor(property, comparator, reverse) { + this.property = property; + this.comparator = Sorter.maybeReverse(reverse, comparator); + } + static maybeReverse(reverse, comparator) { + return reverse ? Sorter.makeReversedComparator(comparator) : comparator; + } + static makeReversedComparator(comparator) { + return (a, b) => comparator(a, b) * -1; + } +}; + +// src/Query/Grouper.ts +var Grouper = class { + constructor(property, grouper) { + this.property = property; + this.grouper = grouper; + } +}; + +// src/Query/Filter/Field.ts +var Field = class { + canCreateFilterForLine(line) { + return Field.lineMatchesFilter(this.filterRegExp(), line); + } + static lineMatchesFilter(filter, line) { + if (filter) { + return filter.test(line); + } else { + return false; + } + } + static getMatch(filterRegExp, line) { + if (filterRegExp) { + return line.match(filterRegExp); + } else { + return null; + } + } + fieldNameSingular() { + return this.fieldName(); + } + fieldNameSingularEscaped() { + return escapeRegExp(this.fieldNameSingular()); + } + supportsSorting() { + return false; + } + parseSortLine(line) { + if (!this.supportsSorting()) { + return null; + } + if (!this.canCreateSorterForLine(line)) { + return null; + } + return this.createSorterFromLine(line); + } + canCreateSorterForLine(line) { + if (!this.supportsSorting()) { + return false; + } + return Field.lineMatchesFilter(this.sorterRegExp(), line); + } + createSorterFromLine(line) { + if (!this.supportsSorting()) { + return null; + } + const match = Field.getMatch(this.sorterRegExp(), line); + if (match === null) { + return null; + } + const reverse = !!match[1]; + return this.createSorter(reverse); + } + sorterRegExp() { + if (!this.supportsSorting()) { + throw Error(`sorterRegExp() unimplemented for ${this.fieldNameSingular()}`); + } + return new RegExp(`^sort by ${this.fieldNameSingularEscaped()}( reverse)?`); + } + comparator() { + throw Error(`comparator() unimplemented for ${this.fieldNameSingular()}`); + } + createSorter(reverse) { + return new Sorter(this.fieldNameSingular(), this.comparator(), reverse); + } + createNormalSorter() { + return this.createSorter(false); + } + createReverseSorter() { + return this.createSorter(true); + } + supportsGrouping() { + return false; + } + grouper() { + throw Error(`grouper() unimplemented for ${this.fieldNameSingular()}`); + } + createGrouper() { + return new Grouper(this.fieldNameSingular(), this.grouper()); + } +}; + +// src/Query/Explain/Explanation.ts +var Explanation = class { + constructor(description, children2 = [], symbol = "") { + this.description = description; + this.symbol = symbol; + this.children = children2; + } + static booleanAnd(children2) { + return this.combineOrCreateExplanation("All of", children2, "AND"); + } + static booleanOr(children2) { + return this.combineOrCreateExplanation("At least one of", children2, "OR"); + } + static booleanNot(children2) { + return new Explanation("None of", children2, "NOT"); + } + static booleanXor(children2) { + return new Explanation("Exactly one of", children2, "XOR"); + } + asString(currentIndentation = "") { + if (this.children.length == 0) { + return currentIndentation + this.description; + } + let result = currentIndentation + `${this.symbol}`; + if (this.children.length > 1) { + result += ` (${this.description})`; + } + result += ":"; + const newIndentation = currentIndentation + " "; + for (let i = 0; i < this.children.length; i++) { + result += ` +${this.children[i].asString(newIndentation)}`; + } + return result; + } + static combineOrCreateExplanation(description, children2, symbol) { + if (children2.length === 2) { + const child0 = children2[0]; + const child1 = children2[1]; + if (child0.symbol === symbol && child1.symbol === "") { + child0.children.push(child1); + return child0; + } + } + return new Explanation(description, children2, symbol); + } +}; + +// src/Query/Filter/Filter.ts +var Filter = class { + constructor(instruction, filterFunction, explanation) { + this.instruction = instruction; + this.explanation = explanation; + this.filterFunction = filterFunction; + } + explainFilterIndented(indent) { + const explanation = this.explanation; + const unindentedExplanation = explanation.asString(); + if (unindentedExplanation === this.instruction) { + return `${indent}${this.instruction} +`; + } else { + return `${indent}${this.instruction} => +${explanation.asString(" ")} +`; + } + } +}; +var FilterOrErrorMessage = class { + constructor(instruction) { + this.instruction = instruction; + } + get filter() { + return this._filter; + } + set filter(value) { + this._filter = value; + } + get filterFunction() { + if (this._filter) { + return this._filter.filterFunction; + } else { + return void 0; + } + } + static fromFilter(filter) { + const result = new FilterOrErrorMessage(filter.instruction); + result.filter = filter; + return result; + } + static fromError(instruction, errorMessage) { + const result = new FilterOrErrorMessage(instruction); + result.error = errorMessage; + return result; + } +}; + +// src/Query/Filter/FilterInstruction.ts +var FilterInstruction = class { + constructor(instruction, filter) { + this._instruction = instruction; + this._filter = filter; + } + canCreateFilterForLine(line) { + return line == this._instruction; + } + createFilterOrErrorMessage(line) { + const result = new FilterOrErrorMessage(line); + if (line === this._instruction) { + result.filter = new Filter(line, this._filter, new Explanation(line)); + return result; + } + result.error = `do not understand filter: ${line}`; + return result; + } +}; + +// src/Query/Filter/FilterInstructions.ts +var FilterInstructions = class { + constructor() { + this._filters = []; + } + add(instruction, filter) { + this._filters.push(new FilterInstruction(instruction, filter)); + } + canCreateFilterForLine(line) { + for (const filter of this._filters) { + if (filter.canCreateFilterForLine(line)) { + return true; + } + } + return false; + } + createFilterOrErrorMessage(line) { + for (const filter of this._filters) { + const x = filter.createFilterOrErrorMessage(line); + if (x.error === void 0) { + return x; + } + } + const result = new FilterOrErrorMessage(line); + result.error = `do not understand filter: ${line}`; + return result; + } +}; + +// src/Query/Filter/FilterInstructionsBasedField.ts +var FilterInstructionsBasedField = class extends Field { + constructor() { + super(...arguments); + this._filters = new FilterInstructions(); + } + canCreateFilterForLine(line) { + return this._filters.canCreateFilterForLine(line); + } + createFilterOrErrorMessage(line) { + return this._filters.createFilterOrErrorMessage(line); + } + filterRegExp() { + return null; + } +}; + +// src/Query/Filter/StatusField.ts +var StatusField = class extends FilterInstructionsBasedField { + constructor() { + super(); + this._filters.add( + "done", + (task) => task.status.type === "DONE" /* DONE */ || task.status.type === "CANCELLED" /* CANCELLED */ || task.status.type === "NON_TASK" /* NON_TASK */ + ); + this._filters.add( + "not done", + (task) => task.status.type === "TODO" /* TODO */ || task.status.type === "IN_PROGRESS" /* IN_PROGRESS */ + ); + } + fieldName() { + return "status"; + } + supportsSorting() { + return true; + } + comparator() { + return (a, b) => { + const oldStatusNameA = StatusField.oldStatusName(a); + const oldStatusNameB = StatusField.oldStatusName(b); + if (oldStatusNameA < oldStatusNameB) { + return 1; + } else if (oldStatusNameA > oldStatusNameB) { + return -1; + } else { + return 0; + } + }; + } + static oldStatusName(a) { + if (a.status.symbol === " ") { + return "Todo"; + } else { + return "Done"; + } + } +}; + +// src/Query/DateParser.ts +var chrono2 = __toESM(require_dist()); +var DateParser = class { + static parseDate(input, forwardDate = false) { + return window.moment( + chrono2.parseDate(input, void 0, { + forwardDate + }) + ).startOf("day"); + } +}; + +// src/Query/Filter/DateField.ts +var DateField = class extends Field { + constructor() { + super(); + this.filterInstructions = new FilterInstructions(); + this.filterInstructions.add(`has ${this.fieldName()} date`, (task) => this.date(task) !== null); + this.filterInstructions.add(`no ${this.fieldName()} date`, (task) => this.date(task) === null); + this.filterInstructions.add(`${this.fieldName()} date is invalid`, (task) => { + const date = this.date(task); + return date !== null && !date.isValid(); + }); + } + canCreateFilterForLine(line) { + if (this.filterInstructions.canCreateFilterForLine(line)) { + return true; + } + return super.canCreateFilterForLine(line); + } + createFilterOrErrorMessage(line) { + const filterResult = this.filterInstructions.createFilterOrErrorMessage(line); + if (filterResult.filter !== void 0) { + return filterResult; + } + const result = new FilterOrErrorMessage(line); + const match = Field.getMatch(this.filterRegExp(), line); + let filterFunction; + if (match !== null) { + const filterDate = DateParser.parseDate(match[2]); + if (!filterDate.isValid()) { + result.error = "do not understand " + this.fieldName() + " date"; + } else { + let relative; + if (match[1] === "before") { + filterFunction = (task) => { + const date = this.date(task); + return date ? date.isBefore(filterDate) : this.filterResultIfFieldMissing(); + }; + relative = " " + match[1]; + } else if (match[1] === "after") { + filterFunction = (task) => { + const date = this.date(task); + return date ? date.isAfter(filterDate) : this.filterResultIfFieldMissing(); + }; + relative = " " + match[1]; + } else { + filterFunction = (task) => { + const date = this.date(task); + return date ? date.isSame(filterDate) : this.filterResultIfFieldMissing(); + }; + relative = " on"; + } + const explanation = DateField.getExplanationString( + this.fieldName(), + relative, + this.filterResultIfFieldMissing(), + filterDate + ); + result.filter = new Filter(line, filterFunction, new Explanation(explanation)); + } + } else { + result.error = "do not understand query filter (" + this.fieldName() + " date)"; + } + return result; + } + static getExplanationString(fieldName, relationshipPrefixedWithSpace, filterResultIfFieldMissing, filterDate) { + const actualDate = filterDate.format("YYYY-MM-DD (dddd Do MMMM YYYY)"); + let result = `${fieldName} date is${relationshipPrefixedWithSpace} ${actualDate}`; + if (filterResultIfFieldMissing) { + result += ` OR no ${fieldName} date`; + } + return result; + } + supportsSorting() { + return true; + } + comparator() { + return (a, b) => { + return compareByDate(this.date(a), this.date(b)); + }; + } +}; + +// src/Query/Filter/DueDateField.ts +var _DueDateField = class extends DateField { + filterRegExp() { + return _DueDateField.dueRegexp; + } + fieldName() { + return "due"; + } + date(task) { + return task.dueDate; + } + filterResultIfFieldMissing() { + return false; + } +}; +var DueDateField = _DueDateField; +DueDateField.dueRegexp = /^due (before|after|on)? ?(.*)/; + +// src/Query/Filter/PriorityField.ts +var _PriorityField = class extends Field { + createFilterOrErrorMessage(line) { + const result = new FilterOrErrorMessage(line); + const priorityMatch = Field.getMatch(this.filterRegExp(), line); + if (priorityMatch !== null) { + const filterPriorityString = priorityMatch[5]; + let filterPriority = null; + switch (filterPriorityString) { + case "low": + filterPriority = "4" /* Low */; + break; + case "none": + filterPriority = "3" /* None */; + break; + case "medium": + filterPriority = "2" /* Medium */; + break; + case "high": + filterPriority = "1" /* High */; + break; + } + if (filterPriority === null) { + result.error = "do not understand priority"; + return result; + } + let explanation = line; + let filter; + switch (priorityMatch[3]) { + case "above": + filter = (task) => task.priority.localeCompare(filterPriority) < 0; + break; + case "below": + filter = (task) => task.priority.localeCompare(filterPriority) > 0; + break; + case "not": + filter = (task) => task.priority !== filterPriority; + break; + default: + filter = (task) => task.priority === filterPriority; + explanation = `${this.fieldName()} is ${filterPriorityString}`; + } + result.filter = new Filter(line, filter, new Explanation(explanation)); + } else { + result.error = "do not understand query filter (priority)"; + } + return result; + } + fieldName() { + return "priority"; + } + filterRegExp() { + return _PriorityField.priorityRegexp; + } + supportsSorting() { + return true; + } + comparator() { + return (a, b) => { + return a.priority.localeCompare(b.priority); + }; + } +}; +var PriorityField = _PriorityField; +PriorityField.priorityRegexp = /^priority(\s+is)?(\s+(above|below|not))?(\s+(low|none|medium|high))$/; + +// src/Query/Matchers/IStringMatcher.ts +var IStringMatcher = class { + matchesAnyOf(stringsToSearch) { + return stringsToSearch.some((s) => this.matches(s)); + } +}; + +// src/Query/Matchers/SubstringMatcher.ts +var SubstringMatcher = class extends IStringMatcher { + constructor(stringToFind) { + super(); + this.stringToFind = stringToFind; + } + matches(stringToSearch) { + return SubstringMatcher.stringIncludesCaseInsensitive(stringToSearch, this.stringToFind); + } + static stringIncludesCaseInsensitive(haystack, needle) { + return haystack.toLocaleLowerCase().includes(needle.toLocaleLowerCase()); + } +}; + +// src/Query/Matchers/RegexMatcher.ts +var RegexMatcher = class extends IStringMatcher { + constructor(regex) { + super(); + this.regex = regex; + } + static validateAndConstruct(regexInput) { + const regexPattern = /\/((?![*+?])(?:[^\r\n[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*])+)\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/; + const query = regexInput.match(regexPattern); + if (query !== null) { + const regExp = new RegExp(query[1], query[2]); + return new RegexMatcher(regExp); + } else { + return null; + } + } + matches(stringToSearch) { + return stringToSearch.match(this.regex) !== null; + } +}; + +// src/Query/Filter/TextField.ts +var TextField = class extends Field { + createFilterOrErrorMessage(line) { + const match = Field.getMatch(this.filterRegExp(), line); + if (match === null) { + return FilterOrErrorMessage.fromError(line, `do not understand query filter (${this.fieldName()})`); + } + const [_, filterOperator, filterValue] = match; + let matcher = null; + if (filterOperator.includes("include")) { + matcher = new SubstringMatcher(filterValue); + } else if (filterOperator.includes("regex")) { + matcher = RegexMatcher.validateAndConstruct(filterValue); + if (matcher === null) { + return FilterOrErrorMessage.fromError( + line, + `cannot parse regex (${this.fieldName()}); check your leading and trailing slashes for your query` + ); + } + } + if (matcher === null) { + return FilterOrErrorMessage.fromError(line, `do not understand query filter (${this.fieldName()})`); + } + const negate = filterOperator.match(/not/) !== null; + const filter = new Filter(line, this.getFilter(matcher, negate), new Explanation(line)); + return FilterOrErrorMessage.fromFilter(filter); + } + fieldPattern() { + return this.fieldNameSingularEscaped(); + } + filterOperatorPattern() { + return "includes|does not include|regex matches|regex does not match"; + } + filterRegExp() { + return new RegExp(`^(?:${this.fieldPattern()}) (${this.filterOperatorPattern()}) (.*)`); + } + getFilter(matcher, negate) { + return (task) => { + const match = matcher.matches(this.value(task)); + return negate ? !match : match; + }; + } + comparator() { + return (a, b) => { + return this.value(a).localeCompare(this.value(b), void 0, { numeric: true }); + }; + } + grouper() { + return (task) => { + return [this.value(task)]; + }; + } +}; + +// src/Query/Filter/PathField.ts +var PathField = class extends TextField { + fieldName() { + return "path"; + } + value(task) { + return task.path; + } + supportsSorting() { + return true; + } +}; + +// src/Query/Filter/UrgencyField.ts +var UrgencyField = class extends Field { + canCreateFilterForLine(_line) { + return false; + } + createFilterOrErrorMessage(line) { + return FilterOrErrorMessage.fromError(line, "Filtering by urgency is not yet supported"); + } + fieldName() { + return "urgency"; + } + filterRegExp() { + throw Error(`filterRegExp() unimplemented for ${this.fieldName()}`); + } + supportsSorting() { + return true; + } + comparator() { + return (a, b) => { + return b.urgency - a.urgency; + }; + } +}; + +// src/Query/Sort.ts +var Sort = class { + static by(sorters, tasks) { + const defaultComparators = [ + new UrgencyField().comparator(), + new StatusField().comparator(), + new DueDateField().comparator(), + new PriorityField().comparator(), + new PathField().comparator() + ]; + const userComparators = []; + for (const sorter of sorters) { + userComparators.push(sorter.comparator); + } + return tasks.sort(Sort.makeCompositeComparator([...userComparators, ...defaultComparators])); + } + static makeCompositeComparator(comparators) { + return (a, b) => { + for (const comparator of comparators) { + const result = comparator(a, b); + if (result !== 0) { + return result; + } + } + return 0; + }; + } +}; + +// src/Query/Filter/DescriptionField.ts +var DescriptionField = class extends TextField { + fieldName() { + return "description"; + } + value(task) { + const globalFilter = getSettings().globalFilter; + return task.description.replace(globalFilter, "").trim(); + } + supportsSorting() { + return true; + } + comparator() { + return (a, b) => { + const descriptionA = DescriptionField.cleanDescription(a.description); + const descriptionB = DescriptionField.cleanDescription(b.description); + return descriptionA.localeCompare(descriptionB, void 0, { numeric: true }); + }; + } + static cleanDescription(description) { + const globalFilter = getSettings().globalFilter; + description = description.replace(globalFilter, "").trim(); + const startsWithLinkRegex = /^\[\[?([^\]]*)]]?/; + const linkRegexMatch = description.match(startsWithLinkRegex); + if (linkRegexMatch !== null) { + const innerLinkText = linkRegexMatch[1]; + description = innerLinkText.substring(innerLinkText.indexOf("|") + 1) + description.replace(startsWithLinkRegex, ""); + } + description = this.replaceFormatting(description, /^\*\*([^*]+)\*\*/); + description = this.replaceFormatting(description, /^\*([^*]+)\*/); + description = this.replaceFormatting(description, /^==([^=]+)==/); + description = this.replaceFormatting(description, /^__([^_]+)__/); + description = this.replaceFormatting(description, /^_([^_]+)_/); + return description; + } + static replaceFormatting(description, regExp) { + const italicBoldRegexMatch = description.match(regExp); + if (italicBoldRegexMatch !== null) { + const innerItalicBoldText = italicBoldRegexMatch[1]; + description = innerItalicBoldText + description.replace(regExp, ""); + } + return description; + } +}; + +// src/Query/Filter/DoneDateField.ts +var _DoneDateField = class extends DateField { + filterRegExp() { + return _DoneDateField.doneRegexp; + } + fieldName() { + return "done"; + } + date(task) { + return task.doneDate; + } + filterResultIfFieldMissing() { + return false; + } +}; +var DoneDateField = _DoneDateField; +DoneDateField.doneRegexp = /^done (before|after|on)? ?(.*)/; + +// src/Query/Filter/ExcludeSubItemsField.ts +var ExcludeSubItemsField = class extends FilterInstructionsBasedField { + constructor() { + super(); + this._filters.add("exclude sub-items", (task) => { + if (task.indentation === "") + return true; + const lastBlockquoteMark = task.indentation.lastIndexOf(">"); + if (lastBlockquoteMark === -1) + return false; + return /^ ?$/.test(task.indentation.slice(lastBlockquoteMark + 1)); + }); + } + fieldName() { + return "exclude"; + } +}; + +// src/Query/Filter/HeadingField.ts +var HeadingField = class extends TextField { + fieldName() { + return "heading"; + } + value(task) { + if (task.precedingHeader) { + return task.precedingHeader; + } else { + return ""; + } + } + supportsSorting() { + return true; + } +}; + +// src/Query/Filter/ScheduledDateField.ts +var _ScheduledDateField = class extends DateField { + filterRegExp() { + return _ScheduledDateField.scheduledRegexp; + } + fieldName() { + return "scheduled"; + } + date(task) { + return task.scheduledDate; + } + filterResultIfFieldMissing() { + return false; + } +}; +var ScheduledDateField = _ScheduledDateField; +ScheduledDateField.scheduledRegexp = /^scheduled (before|after|on)? ?(.*)/; + +// src/Query/Filter/StartDateField.ts +var _StartDateField = class extends DateField { + filterRegExp() { + return _StartDateField.startRegexp; + } + fieldName() { + return "start"; + } + date(task) { + return task.startDate; + } + filterResultIfFieldMissing() { + return true; + } +}; +var StartDateField = _StartDateField; +StartDateField.startRegexp = /^starts (before|after|on)? ?(.*)/; + +// src/Query/Filter/HappensDateField.ts +var _HappensDateField = class extends Field { + constructor() { + super(); + this.filterInstructions = new FilterInstructions(); + this.filterInstructions.add( + _HappensDateField.instructionForFieldPresence, + (task) => this.dates(task).some((date) => date !== null) + ); + this.filterInstructions.add( + _HappensDateField.instructionForFieldAbsence, + (task) => !this.dates(task).some((date) => date !== null) + ); + } + canCreateFilterForLine(line) { + if (this.filterInstructions.canCreateFilterForLine(line)) { + return true; + } + return super.canCreateFilterForLine(line); + } + createFilterOrErrorMessage(line) { + const filterResult = this.filterInstructions.createFilterOrErrorMessage(line); + if (filterResult.filter !== void 0) { + return filterResult; + } + const result = new FilterOrErrorMessage(line); + const happensMatch = Field.getMatch(this.filterRegExp(), line); + if (happensMatch !== null) { + const filterDate = DateParser.parseDate(happensMatch[2]); + if (!filterDate.isValid()) { + result.error = "do not understand happens date"; + } else { + let filterFunction; + let relative; + if (happensMatch[1] === "before") { + filterFunction = (task) => { + return this.dates(task).some((date) => date && date.isBefore(filterDate)); + }; + relative = " " + happensMatch[1]; + } else if (happensMatch[1] === "after") { + filterFunction = (task) => { + return this.dates(task).some((date) => date && date.isAfter(filterDate)); + }; + relative = " " + happensMatch[1]; + } else { + filterFunction = (task) => { + return this.dates(task).some((date) => date && date.isSame(filterDate)); + }; + relative = " on"; + } + const explanation = DateField.getExplanationString( + "due, start or scheduled", + relative, + false, + filterDate + ); + result.filter = new Filter(line, filterFunction, new Explanation(explanation)); + } + } else { + result.error = "do not understand query filter (happens date)"; + } + return result; + } + earliestDate(task) { + const happensDates = new _HappensDateField().dates(task); + const sortedHappensDates = happensDates.sort(compareByDate); + return sortedHappensDates[0]; + } + filterRegExp() { + return _HappensDateField.happensRegexp; + } + dates(task) { + return Array.of(task.startDate, task.scheduledDate, task.dueDate); + } + fieldName() { + return "happens"; + } + supportsSorting() { + return true; + } + comparator() { + return (a, b) => { + return compareByDate(this.earliestDate(a), this.earliestDate(b)); + }; + } +}; +var HappensDateField = _HappensDateField; +HappensDateField.happensRegexp = /^happens (before|after|on)? ?(.*)/; +HappensDateField.instructionForFieldPresence = "has happens date"; +HappensDateField.instructionForFieldAbsence = "no happens date"; + +// src/Query/Filter/RecurringField.ts +var RecurringField = class extends FilterInstructionsBasedField { + constructor() { + super(); + this._filters.add("is recurring", (task) => task.recurrence !== null); + this._filters.add("is not recurring", (task) => task.recurrence === null); + } + fieldName() { + return "recurring"; + } +}; + +// src/Query/Filter/MultiTextField.ts +var MultiTextField = class extends TextField { + fieldNamePlural() { + return this.fieldNameSingular() + "s"; + } + fieldName() { + return `${this.fieldNameSingular()}/${this.fieldNamePlural()}`; + } + fieldPattern() { + return `${this.fieldNameSingular()}|${this.fieldNamePlural()}`; + } + filterOperatorPattern() { + return `${super.filterOperatorPattern()}|include|do not include`; + } + value(task) { + return this.values(task).join(", "); + } + getFilter(matcher, negate) { + return (task) => { + const match = matcher.matchesAnyOf(this.values(task)); + return negate ? !match : match; + }; + } +}; + +// src/Query/Filter/TagsField.ts +var TagsField = class extends MultiTextField { + fieldNameSingular() { + return "tag"; + } + values(task) { + return task.tags; + } + supportsSorting() { + return true; + } + createSorterFromLine(line) { + const match = line.match(this.sorterRegExp()); + if (match === null) { + return null; + } + const reverse = !!match[1]; + const propertyInstance = isNaN(+match[2]) ? 1 : +match[2]; + const comparator = TagsField.makeCompareByTagComparator(propertyInstance); + return new Sorter(this.fieldNameSingular(), comparator, reverse); + } + sorterRegExp() { + return /^sort by tag( reverse)?[\s]*(\d+)?/; + } + comparator() { + return TagsField.makeCompareByTagComparator(1); + } + static makeCompareByTagComparator(propertyInstance) { + return (a, b) => { + if (a.tags.length === 0 && b.tags.length === 0) { + return 0; + } else if (a.tags.length === 0) { + return 1; + } else if (b.tags.length === 0) { + return -1; + } + const tagInstanceToSortBy = propertyInstance - 1; + if (a.tags.length < propertyInstance && b.tags.length >= propertyInstance) { + return 1; + } else if (b.tags.length < propertyInstance && a.tags.length >= propertyInstance) { + return -1; + } else if (a.tags.length < propertyInstance && b.tags.length < propertyInstance) { + return 0; + } + const tagA = a.tags[tagInstanceToSortBy]; + const tagB = b.tags[tagInstanceToSortBy]; + return tagA.localeCompare(tagB, void 0, { numeric: true }); + }; + } +}; + +// src/Query/Filter/BooleanField.ts +var import_boon_js = __toESM(require_lib()); +var BooleanField = class extends Field { + constructor() { + super(...arguments); + this.basicBooleanRegexp = /(.*(AND|OR|XOR|NOT)\s*[("].*|\(.+\))/g; + this.supportedOperators = ["AND", "OR", "XOR", "NOT"]; + this.subFields = {}; + } + filterRegExp() { + return this.basicBooleanRegexp; + } + createFilterOrErrorMessage(line) { + return this.parseLine(line); + } + fieldName() { + return "boolean query"; + } + parseLine(line) { + const result = new FilterOrErrorMessage(line); + if (line.length === 0) { + result.error = "empty line"; + return result; + } + const preprocessed = this.preprocessExpression(line); + try { + const postfixExpression = (0, import_boon_js.parse)(preprocessed); + for (const token of postfixExpression) { + if (token.name === "IDENTIFIER" && token.value) { + const identifier = token.value.trim(); + if (!(identifier in this.subFields)) { + const parsedField = parseFilter(identifier); + if (parsedField === null) { + result.error = `couldn't parse sub-expression '${identifier}'`; + return result; + } + if (parsedField.error) { + result.error = `couldn't parse sub-expression '${identifier}': ${parsedField.error}`; + return result; + } else if (parsedField.filter) { + this.subFields[identifier] = parsedField.filter; + } + } + } else if (token.name === "OPERATOR") { + if (token.value == void 0) { + result.error = "empty operator in boolean query"; + return result; + } + if (!this.supportedOperators.includes(token.value)) { + result.error = `unknown boolean operator '${token.value}'`; + return result; + } + } + } + const filterFunction = (task) => { + return this.filterTaskWithParsedQuery(task, postfixExpression); + }; + const explanation = this.constructExplanation(postfixExpression); + result.filter = new Filter(line, filterFunction, explanation); + return result; + } catch (error) { + const message = error instanceof Error ? error.message : "unknown error type"; + result.error = `malformed boolean query -- ${message} (check the documentation for guidelines)`; + return result; + } + return result; + } + preprocessExpression(line) { + return line.replace(/\(([^()]+)\)/g, '("$1")'); + } + filterTaskWithParsedQuery(task, postfixExpression) { + const toBool = (s) => { + return s === "true"; + }; + const toString = (b) => { + return b ? "true" : "false"; + }; + const booleanStack = []; + for (const token of postfixExpression) { + if (token.name === "IDENTIFIER") { + if (token.value == null) + throw Error("null token value"); + const filter = this.subFields[token.value.trim()]; + const result = filter.filterFunction(task); + booleanStack.push(toString(result)); + } else if (token.name === "OPERATOR") { + if (token.value === "NOT") { + const arg1 = toBool(booleanStack.pop()); + booleanStack.push(toString(!arg1)); + } else if (token.value === "OR") { + const arg1 = toBool(booleanStack.pop()); + const arg2 = toBool(booleanStack.pop()); + booleanStack.push(toString(arg1 || arg2)); + } else if (token.value === "AND") { + const arg1 = toBool(booleanStack.pop()); + const arg2 = toBool(booleanStack.pop()); + booleanStack.push(toString(arg1 && arg2)); + } else if (token.value === "XOR") { + const arg1 = toBool(booleanStack.pop()); + const arg2 = toBool(booleanStack.pop()); + booleanStack.push(toString(arg1 && !arg2 || !arg1 && arg2)); + } else { + throw Error("Unsupported operator: " + token.value); + } + } else { + throw Error("Unsupported token type: " + token); + } + } + return toBool(booleanStack[0]); + } + constructExplanation(postfixExpression) { + const explanationStack = []; + for (const token of postfixExpression) { + if (token.name === "IDENTIFIER") { + if (token.value == null) + throw Error("null token value"); + const filter = this.subFields[token.value.trim()]; + explanationStack.push(filter.explanation); + } else if (token.name === "OPERATOR") { + if (token.value === "NOT") { + const arg1 = explanationStack.pop(); + explanationStack.push(Explanation.booleanNot([arg1])); + } else if (token.value === "OR") { + const arg2 = explanationStack.pop(); + const arg1 = explanationStack.pop(); + explanationStack.push(Explanation.booleanOr([arg1, arg2])); + } else if (token.value === "AND") { + const arg2 = explanationStack.pop(); + const arg1 = explanationStack.pop(); + explanationStack.push(Explanation.booleanAnd([arg1, arg2])); + } else if (token.value === "XOR") { + const arg2 = explanationStack.pop(); + const arg1 = explanationStack.pop(); + explanationStack.push(Explanation.booleanXor([arg1, arg2])); + } else { + throw Error("Unsupported operator: " + token.value); + } + } else { + throw Error("Unsupported token type: " + token); + } + } + return explanationStack[0]; + } +}; + +// src/Query/Filter/FilenameField.ts +var FilenameField = class extends TextField { + fieldName() { + return "filename"; + } + value(task) { + const filename = task.filename; + if (filename === null) { + return ""; + } + return filename + ".md"; + } + supportsSorting() { + return true; + } +}; + +// src/Query/Filter/StatusNameField.ts +var StatusNameField = class extends TextField { + constructor() { + super(); + } + fieldName() { + return "status.name"; + } + value(task) { + return task.status.name; + } + supportsSorting() { + return true; + } + supportsGrouping() { + return true; + } +}; + +// src/Query/Filter/StatusTypeField.ts +var StatusTypeField = class extends Field { + canCreateFilterForLine(line) { + const relaxedRegExp = new RegExp(`^(?:${this.fieldNameSingularEscaped()})`); + return Field.lineMatchesFilter(relaxedRegExp, line); + } + createFilterOrErrorMessage(line) { + const match = Field.getMatch(this.filterRegExp(), line); + if (match === null) { + return this.helpMessage(line); + } + const [_, filterOperator, statusTypeAsString] = match; + const statusTypeElement = StatusType[statusTypeAsString.toUpperCase()]; + if (!statusTypeElement) { + return this.helpMessage(line); + } + let filterFunction; + switch (filterOperator) { + case "is": + filterFunction = (task) => { + return task.status.type === statusTypeElement; + }; + break; + case "is not": + filterFunction = (task) => { + return task.status.type !== statusTypeElement; + }; + break; + default: + return this.helpMessage(line); + } + return FilterOrErrorMessage.fromFilter(new Filter(line, filterFunction, new Explanation(line))); + } + filterRegExp() { + return new RegExp(`^(?:${this.fieldNameSingularEscaped()}) (is|is not) ([^ ]+)$`); + } + helpMessage(line) { + const allowedTypes = Object.values(StatusType).filter((t) => t !== "EMPTY" /* EMPTY */).join(" "); + const message = `Invalid ${this.fieldNameSingular()} instruction: '${line}'. Allowed options: 'is' and 'is not' (without quotes). - Allowed values: ${t} + Allowed values: ${allowedTypes} Note: values are case-insensitive, so 'in_progress' works too, for example. - Example: ${this.fieldNameSingular()} is not NON_TASK`;return le.fromError(e,n)}fieldName(){return"status.type"}value(e){return e.status.type}supportsSorting(){return!0}comparator(){return(e,t)=>{let n=$r.groupName(e),i=$r.groupName(t);return n.localeCompare(i,void 0,{numeric:!0})}}supportsGrouping(){return!0}grouper(){return e=>[$r.groupName(e)]}static groupName(e){let t;switch(e.status.type){case"IN_PROGRESS":t="1";break;case"TODO":t="2";break;case"DONE":t="3";break;case"CANCELLED":t="4";break;case"NON_TASK":t="5";break;case"EMPTY":t="6";break}return t+" "+e.status.type}};var _o=class extends Xe{fieldName(){return"recurrence"}value(e){return e.recurrence!==null?e.recurrence.toText():""}};var cf=[()=>new go,()=>new $r,()=>new br,()=>new uo,()=>new dn,()=>new vr,()=>new Is,()=>new Ns,()=>new cn,()=>new Cs,()=>new ei,()=>new fn,()=>new pn,()=>new oo,()=>new ao,()=>new ho,()=>new yo,()=>new ti,()=>new _o];function mo(r){for(let e of cf){let t=e();if(t.canCreateFilterForLine(r))return t.createFilterOrErrorMessage(r)}return null}function rT(r){let e=/^sort by /;if(r.match(e)===null)return null;for(let t of cf){let i=t().parseSortLine(r);if(i)return i}return null}function nT(r){let e=/^group by /;if(r.match(e)===null)return null;for(let t of cf){let n=t(),i=n.fieldNameSingular();if(r===`group by ${i}`&&n.supportsGrouping())return n.createGrouper()}return null}var To=class{constructor(e,t){this.nestingLevel=e,this.name=t}};var bo=class{constructor(e){this.lastHeadingAtLevel=new Array;let n=e.keys().next().value.length;for(let i=0;it.set(o,a)),e.pop();return t}};var Eo=class extends Map{},wo=class extends vo{},Ro=class{constructor(e,t){this.groups=new Eo;let n=this.buildGroupingTree(e,t);this.groups=n.generateAllPaths(),this.groups=this.getSortedGroups()}buildGroupingTree(e,t){let n=new wo(t),i=[n];for(let s of e){let a=[];for(let o of i)for(let u of o.values){let l=Dr.getGroupNamesForTask(s,u);for(let c of l){let d=o.children.get(c);d===void 0&&(d=new wo([]),o.children.set(c,d),a.push(d)),d.values.push(u)}}i=a}return n}getSortedGroups(){return new Eo([...this.groups.entries()].sort())}};var Oo=class{constructor(e,t,n){this.groups=e,this.groupHeadings=t,this.tasks=n}tasksAsStringOfLines(){let e="";for(let t of this.tasks)e+=t.toFileLineString()+` -`;return e}toString(){let e=` -`;e+=`Group names: [${this.groups}] -`;for(let t of this.groupHeadings)e+=`${"#".repeat(4+t.nestingLevel)} ${t.name} -`;return e+=this.tasksAsStringOfLines(),e}};var Do=class{constructor(e,t){this._groups=new Array;this._totalTaskCount=0;this._totalTaskCount=t.length;let n=new Ro(e,t);this.addTasks(n)}get groups(){return this._groups}totalTasksCount(){return this._totalTaskCount}toString(){let e="";for(let n of this.groups)e+=n.toString(),e+=` ---- -`;return e+=` -${this.totalTasksCount()} tasks -`,e}addTasks(e){let t=new bo(e.groups);for(let[n,i]of e.groups){let s=t.getHeadingsForTaskGroup(n),a=new Oo(n,s,i);this.add(a)}}add(e){this._groups.push(e)}};var re=class{static fromGroupingProperty(e){return new Hn(e,re.grouperForProperty(e))}static by(e,t){return new Do(e,t)}static getGroupNamesForTask(e,t){return e.grouper(t)}static grouperForProperty(e){return re.groupers[e]}static escapeMarkdownCharacters(e){return e.replace(/\\/g,"\\\\").replace(/_/g,"\\_")}static groupByPriority(e){let t="ERROR";switch(e.priority){case"1":t="High";break;case"2":t="Medium";break;case"3":t="None";break;case"4":t="Low";break}return[`Priority ${e.priority}: ${t}`]}static groupByRecurrence(e){return e.recurrence!==null?[e.recurrence.toText()]:["None"]}static groupByRecurring(e){return e.recurrence!==null?["Recurring"]:["Not Recurring"]}static groupByStartDate(e){return[re.stringFromDate(e.startDate,"start")]}static groupByScheduledDate(e){return[re.stringFromDate(e.scheduledDate,"scheduled")]}static groupByDueDate(e){return[re.stringFromDate(e.dueDate,"due")]}static groupByDoneDate(e){return[re.stringFromDate(e.doneDate,"done")]}static groupByHappensDate(e){let t=new vr().earliestDate(e);return[re.stringFromDate(t,"happens")]}static stringFromDate(e,t){return e===null?"No "+t+" date":e.format(re.groupDateFormat)}static groupByPath(e){return[re.escapeMarkdownCharacters(e.path.replace(".md",""))]}static groupByFolder(e){let t=e.path,n=e.filename+".md",i=t.substring(0,t.lastIndexOf(n));return i===""?["/"]:[re.escapeMarkdownCharacters(i)]}static groupByFileName(e){let t=e.filename;return t===null?["Unknown Location"]:["[["+re.escapeMarkdownCharacters(t)+"]]"]}static groupByRoot(e){let t=e.path.replace(/\\/g,"/"),n=t.indexOf("/");return n==-1?["/"]:[re.escapeMarkdownCharacters(t.substring(0,n+1))]}static groupByBacklink(e){if(e.getLinkText({isFilenameUnique:!0})===null)return["Unknown Location"];let n="Unknown Location";if(e.filename!==null&&(n=re.escapeMarkdownCharacters(e.filename)),e.precedingHeader===null||e.precedingHeader.length===0)return[n];let i=re.groupByHeading(e)[0];return n===i?[n]:[`${n} > ${i}`]}static groupByStatus(e){return e.status.symbol===" "?["Todo"]:["Done"]}static groupByHeading(e){return e.precedingHeader===null||e.precedingHeader.length===0?["(No heading)"]:[e.precedingHeader]}static groupByTags(e){return e.tags.length==0?["(No tags)"]:e.tags}},Dr=re;Dr.groupDateFormat="YYYY-MM-DD dddd",Dr.groupers={backlink:re.groupByBacklink,done:re.groupByDoneDate,due:re.groupByDueDate,filename:re.groupByFileName,folder:re.groupByFolder,happens:re.groupByHappensDate,heading:re.groupByHeading,path:re.groupByPath,priority:re.groupByPriority,recurrence:re.groupByRecurrence,recurring:re.groupByRecurring,root:re.groupByRoot,scheduled:re.groupByScheduledDate,start:re.groupByStartDate,status:re.groupByStatus,tags:re.groupByTags};var li=class{constructor({source:e}){this._limit=void 0;this._layoutOptions=new bi;this._filters=[];this._error=void 0;this._sorting=[];this._grouping=[];this.groupByRegexp=/^group by (backlink|done|due|filename|folder|happens|heading|path|priority|recurrence|recurring|root|scheduled|start|status|tags)/;this.hideOptionsRegexp=/^(hide|show) (task count|backlink|priority|start date|scheduled date|done date|due date|recurrence rule|edit button|urgency)/;this.shortModeRegexp=/^short/;this.explainQueryRegexp=/^explain/;this.limitRegexp=/^limit (to )?(\d+)( tasks?)?/;this.commentRegexp=/^#.*/;this.source=e,e.split(` -`).map(t=>t.trim()).forEach(t=>{switch(!0){case t==="":break;case this.shortModeRegexp.test(t):this._layoutOptions.shortMode=!0;break;case this.explainQueryRegexp.test(t):this._layoutOptions.explainQuery=!0;break;case this.limitRegexp.test(t):this.parseLimit({line:t});break;case this.parseSortBy({line:t}):break;case this.parseGroupBy2({line:t}):break;case this.groupByRegexp.test(t):this.parseGroupBy({line:t});break;case this.hideOptionsRegexp.test(t):this.parseHideOptions({line:t});break;case this.commentRegexp.test(t):break;case this.parseFilter(t):break;default:this._error=`do not understand query: ${t}`}})}explainQuery(){return`Explanation of this Tasks code block query: - -`+this.explainQueryWithoutIntroduction()}explainQueryWithoutIntroduction(){let e="",{globalFilter:t}=U();t.length!==0&&(e+=`Only tasks containing the global filter '${t}'. - -`);let n=this.filters.length;if(n===0)e+="No filters supplied. All tasks will match the query.";else for(let i=0;i0&&(e+=` -`),e+=this.filters[i].explainFilterIndented("");return this._limit!==void 0&&(e+=` - -At most ${this._limit} task`,this._limit!==1&&(e+="s"),e+=`. -`),e}get limit(){return this._limit}get layoutOptions(){return this._layoutOptions}get filters(){return this._filters}get sorting(){return this._sorting}get grouping(){return this._grouping}get error(){return this._error}applyQueryToTasks(e){this.filters.forEach(n=>{e=e.filter(n.filterFunction)});let t=ri.by(this.sorting,e).slice(0,this.limit);return Dr.by(this.grouping,t)}parseHideOptions({line:e}){let t=e.match(this.hideOptionsRegexp);if(t!==null){let n=t[1]==="hide";switch(t[2]){case"task count":this._layoutOptions.hideTaskCount=n;break;case"backlink":this._layoutOptions.hideBacklinks=n;break;case"priority":this._layoutOptions.hidePriority=n;break;case"start date":this._layoutOptions.hideStartDate=n;break;case"scheduled date":this._layoutOptions.hideScheduledDate=n;break;case"due date":this._layoutOptions.hideDueDate=n;break;case"done date":this._layoutOptions.hideDoneDate=n;break;case"recurrence rule":this._layoutOptions.hideRecurrenceRule=n;break;case"edit button":this._layoutOptions.hideEditButton=n;break;case"urgency":this._layoutOptions.hideUrgency=n;break;default:this._error="do not understand hide/show option"}}}parseFilter(e){let t=mo(e);return t!=null?(t.filter?this._filters.push(t.filter):this._error=t.error,!0):!1}parseLimit({line:e}){let t=e.match(this.limitRegexp);t!==null?this._limit=Number.parseInt(t[2],10):this._error="do not understand query limit"}parseSortBy({line:e}){let t=rT(e);return t?(this._sorting.push(t),!0):!1}parseGroupBy({line:e}){let t=e.match(this.groupByRegexp);t!==null?this._grouping.push(Dr.fromGroupingProperty(t[1])):this._error="do not understand query grouping"}parseGroupBy2({line:e}){let t=nT(e);return t?(this._grouping.push(t),!0):!1}};var Mo=class{constructor({plugin:e,events:t}){this.addQueryRenderChild=this._addQueryRenderChild.bind(this);this.app=e.app,this.events=t,e.registerMarkdownCodeBlockProcessor("tasks",this._addQueryRenderChild.bind(this))}_addQueryRenderChild(e,t,n){return x(this,null,function*(){n.addChild(new df({app:this.app,events:this.events,container:t,source:e,filePath:n.sourcePath}))})}},df=class extends So.MarkdownRenderChild{constructor({app:t,events:n,container:i,source:s,filePath:a}){super(i);switch(this.app=t,this.events=n,this.source=s,this.filePath=a,this.containerEl.className){case"block-language-tasks":this.query=new li({source:s}),this.queryType="tasks";break;default:this.query=new li({source:s}),this.queryType="tasks";break}}onload(){this.events.triggerRequestCacheUpdate(this.render.bind(this)),this.renderEventRef=this.events.onCacheUpdate(this.render.bind(this)),this.reloadQueryAtMidnight()}onunload(){this.renderEventRef!==void 0&&this.events.off(this.renderEventRef),this.queryReloadTimeout!==void 0&&clearTimeout(this.queryReloadTimeout)}reloadQueryAtMidnight(){let t=new Date;t.setHours(24,0,0,0);let n=new Date,i=t.getTime()-n.getTime();this.queryReloadTimeout=setTimeout(()=>{this.query=new li({source:this.source}),this.events.triggerRequestCacheUpdate(this.render.bind(this)),this.reloadQueryAtMidnight()},i+1e3)}render(i){return x(this,arguments,function*({tasks:t,state:n}){var a;let s=this.containerEl.createEl("div");if(n==="Warm"&&this.query.error===void 0){console.debug(`Render ${this.queryType} called for a block in active file "${this.filePath}", to select from ${t.length} tasks: plugin state: ${n}`),this.query.layoutOptions.explainQuery&&this.createExplanation(s);let o=this.query.applyQueryToTasks(t);for(let l of o.groups){this.addGroupHeadings(s,l.groupHeadings);let{taskList:c}=yield this.createTasksList({tasks:l.tasks,content:s});s.appendChild(c)}let u=o.totalTasksCount();console.debug(`${u} of ${t.length} tasks displayed in a block in "${this.filePath}"`),this.addTaskCount(s,u)}else this.query.error!==void 0?s.createDiv().innerHTML=`
Tasks query: ${this.query.error.replace(/\n/g,"
")}
`:s.setText("Loading Tasks ...");(a=this.containerEl.firstChild)==null||a.replaceWith(s)})}createExplanation(t){let n=this.query.explainQuery(),i=t.createEl("pre");i.addClasses(["plugin-tasks-query-explanation"]),i.setText(n),t.appendChild(i)}createTasksList(i){return x(this,arguments,function*({tasks:t,content:n}){let s=t.length,a=n.createEl("ul");a.addClasses(["contains-task-list","plugin-tasks-query-result"]);for(let o=0;oh.remove());let f=this.query.layoutOptions.shortMode;this.query.layoutOptions.hideUrgency||this.addUrgency(c,u),this.query.layoutOptions.hideBacklinks||this.addBacklinks(c,u,f,l),this.query.layoutOptions.hideEditButton||this.addEditButton(c,u),a.appendChild(c)}return{taskList:a,tasksCount:s}})}addEditButton(t,n){t.createEl("a",{cls:"tasks-edit"}).onClickEvent(s=>{s.preventDefault();let a=u=>{Xa({originalTask:n,newTasks:ut.removeInferredStatusIfNeeded(n,u)})};new Xn({app:this.app,task:n,onSubmit:a}).open()})}addUrgency(t,n){let i=new Intl.NumberFormat().format(n.urgency);t.createSpan({text:i,cls:"tasks-urgency"})}addGroupHeadings(t,n){for(let i of n)this.addGroupHeading(t,i)}addGroupHeading(t,n){return x(this,null,function*(){let i;n.nestingLevel===0?i=t.createEl("h4",{cls:"tasks-group-heading"}):n.nestingLevel===1?i=t.createEl("h5",{cls:"tasks-group-heading"}):i=t.createEl("h6",{cls:"tasks-group-heading"}),yield So.MarkdownRenderer.renderMarkdown(n.name,i,this.filePath,this)})}addBacklinks(t,n,i,s){var l;let a=t.createSpan({cls:"tasks-backlink"});i||a.append(" (");let o=a.createEl("a");if(o.href=n.path,o.setAttribute("data-href",n.path),o.rel="noopener",o.target="_blank",o.addClass("internal-link"),i&&o.addClass("internal-link-short-mode"),n.precedingHeader!==null){let c=n.precedingHeader.replace(/#/g,"");o.href=o.href+"#"+c,o.setAttribute("data-href",o.getAttribute("data-href")+"#"+c)}let u;i?u=" \u{1F517}":u=(l=n.getLinkText({isFilenameUnique:s}))!=null?l:"",o.setText(u),i||a.append(")")}addTaskCount(t,n){this.query.layoutOptions.hideTaskCount||t.createDiv({text:`${n} task${n!==1?"s":""}`,cls:"tasks-count"})}isFilenameUnique({task:t}){let n=t.path.match(/([^/]*)\..+$/i);if(n===null)return;let i=n[1];return this.app.vault.getMarkdownFiles().filter(a=>{if(a.basename===i)return!0}).length<2}};var ce=require("obsidian");var iT=[{text:"Core Statuses",level:"h3",class:"",open:!0,notice:{class:"setting-item-description",text:null,html:"

These are the core statuses that Tasks supports natively, with no need for custom CSS styling or theming.

You can add edit and add your own custom statuses in the section below.

"},settings:[{name:"",description:"",type:"function",initialValue:"",placeholder:"",settingName:"insertTaskCoreStatusSettings",featureFlag:"",notice:null}]},{text:"Custom Statuses",level:"h3",class:"",open:!0,notice:{class:"setting-item-description",text:null,html:`

You should first select and install a CSS Snippet or Theme to style custom checkboxes.

Then, use the buttons below to set up your custom statuses, to match your chosen CSS checkboxes.

Note Any statuses with the same symbol as any earlier statuses will be ignored. You can confirm the actually loaded statuses by running the 'Create or edit task' command and looking at the Status drop-down.

`},settings:[{name:"",description:"",type:"function",initialValue:"",placeholder:"",settingName:"insertCustomTaskStatusSettings",featureFlag:"",notice:null}]}];var Ht=require("obsidian");var gn=class{validate(e){let t=[];return t.push(...this.validateSymbol(e)),t.push(...this.validateName(e)),t.push(...this.validateNextSymbol(e)),t}validateSymbol(e){return gn.validateOneSymbol(e.symbol,"Task Status Symbol")}validateNextSymbol(e){return gn.validateOneSymbol(e.nextStatusSymbol,"Task Next Status Symbol")}validateName(e){let t=[];return e.name.length===0&&t.push("Task Status Name cannot be empty."),t}static validateOneSymbol(e,t){let n=[];return e.length===0&&n.push(`${t} cannot be empty.`),e.length>1&&n.push(`${t} ("${e}") must be a single character.`),n}};var _n=new gn,Tt=class extends Ht.Modal{constructor(t,n,i){super(t.app);this.plugin=t;this.saved=!1;this.error=!1;this.statusSymbol=n.symbol,this.statusName=n.name,this.statusNextSymbol=n.nextStatusSymbol,this.statusAvailableAsCommand=n.availableAsCommand,this.type=n.type,this.isCoreStatus=i}statusConfiguration(){return new Ye(this.statusSymbol,this.statusName,this.statusNextSymbol,this.statusAvailableAsCommand,this.type)}display(){return x(this,null,function*(){let{contentEl:t}=this;t.empty();let n=t.createDiv(),i;new Ht.Setting(n).setName("Task Status Symbol").setDesc("This is the character between the square braces. (It can only be edited for Custom statuses, and not Core statuses.)").addText(l=>{i=l,l.setValue(this.statusSymbol).onChange(c=>{this.statusSymbol=c,Tt.setValid(l,_n.validateSymbol(this.statusConfiguration()))})}).setDisabled(this.isCoreStatus).then(l=>{Tt.setValid(i,_n.validateSymbol(this.statusConfiguration()))});let s;new Ht.Setting(n).setName("Task Status Name").setDesc("This is the friendly name of the task status.").addText(l=>{s=l,l.setValue(this.statusName).onChange(c=>{this.statusName=c,Tt.setValid(l,_n.validateName(this.statusConfiguration()))})}).then(l=>{Tt.setValid(s,_n.validateName(this.statusConfiguration()))});let a;new Ht.Setting(n).setName("Task Next Status Symbol").setDesc("When clicked on this is the symbol that should be used next.").addText(l=>{a=l,l.setValue(this.statusNextSymbol).onChange(c=>{this.statusNextSymbol=c,Tt.setValid(l,_n.validateNextSymbol(this.statusConfiguration()))})}).then(l=>{Tt.setValid(a,_n.validateNextSymbol(this.statusConfiguration()))}),new Ht.Setting(n).setName("Task Status Type").setDesc("Control how the status behaves for searching and toggling.").addDropdown(l=>{["TODO","IN_PROGRESS","DONE","CANCELLED","NON_TASK"].forEach(d=>{l.addOption(d,d)}),l.setValue(this.type).onChange(d=>{this.type=j.getTypeFromStatusTypeString(d)})}),j.tasksPluginCanCreateCommandsForStatuses()&&new Ht.Setting(n).setName("Available as command").setDesc("If enabled this status will be available as a command so you can assign a hotkey and toggle the status using it.").addToggle(l=>{l.setValue(this.statusAvailableAsCommand).onChange(c=>x(this,null,function*(){this.statusAvailableAsCommand=c}))});let o=t.createDiv(),u=new Ht.Setting(o);u.addButton(l=>(l.setTooltip("Save").setIcon("checkmark").onClick(()=>x(this,null,function*(){let c=_n.validate(this.statusConfiguration());if(c.length>0){let d=c.join(` -`)+` - -Fix errors before saving.`;new Ht.Notice(d);return}this.saved=!0,this.close()})),l)),u.addExtraButton(l=>(l.setIcon("cross").setTooltip("Cancel").onClick(()=>{this.saved=!1,this.close()}),l))})}onOpen(){this.display()}static setValidationError(t){t.inputEl.addClass("tasks-settings-is-invalid")}static removeValidationError(t){t.inputEl.removeClass("tasks-settings-is-invalid")}static setValid(t,n){n.length===0?Tt.removeValidationError(t):Tt.setValidationError(t)}};function sT(){return[[" ","Unchecked","x","TODO"],["x","Regular"," ","DONE"],["X","Checked"," ","DONE"],["-","Dropped","x","CANCELLED"],[">","Forward","x","TODO"],["D","Date","x","TODO"],["?","Question","x","TODO"],["/","Half Done","x","IN_PROGRESS"],["+","Add","x","TODO"],["R","Research","x","TODO"],["!","Important","x","TODO"],["i","Idea","x","TODO"],["B","Brainstorm","x","TODO"],["P","Pro","x","TODO"],["C","Con","x","TODO"],["Q","Quote","x","TODO"],["N","Note","x","TODO"],["b","Bookmark","x","TODO"],["I","Information","x","TODO"],["p","Paraphrase","x","TODO"],["L","Location","x","TODO"],["E","Example","x","TODO"],["A","Answer","x","TODO"],["r","Reward","x","TODO"],["c","Choice","x","TODO"],["d","Doing","x","IN_PROGRESS"],["T","Time","x","TODO"],["@","Character / Person","x","TODO"],["t","Talk","x","TODO"],["O","Outline / Plot","x","TODO"],["~","Conflict","x","TODO"],["W","World","x","TODO"],["f","Clue / Find","x","TODO"],["F","Foreshadow","x","TODO"],["H","Favorite / Health","x","TODO"],["&","Symbolism","x","TODO"],["s","Secret","x","TODO"]]}function aT(){return[[" ","to-do","x","TODO"],["/","incomplete","x","IN_PROGRESS"],["x","done"," ","DONE"],["-","canceled","x","CANCELLED"],[">","forwarded","x","TODO"],["<","scheduling","x","TODO"],["?","question","x","TODO"],["!","important","x","TODO"],["*","star","x","TODO"],['"',"quote","x","TODO"],["l","location","x","TODO"],["b","bookmark","x","TODO"],["i","information","x","TODO"],["S","savings","x","TODO"],["I","idea","x","TODO"],["p","pros","x","TODO"],["c","cons","x","TODO"],["f","fire","x","TODO"],["k","key","x","TODO"],["w","win","x","TODO"],["u","up","x","TODO"],["d","down","x","TODO"]]}var ci=class extends ce.PluginSettingTab{constructor({plugin:t}){super(t.app,t);this.customFunctions={insertTaskCoreStatusSettings:this.insertTaskCoreStatusSettings.bind(this),insertCustomTaskStatusSettings:this.insertCustomTaskStatusSettings.bind(this)};this.plugin=t}saveSettings(t){return x(this,null,function*(){yield this.plugin.saveSettings(),t&&this.display()})}display(){let{containerEl:t}=this;t.empty(),this.containerEl.addClass("tasks-settings"),t.createEl("h3",{text:"Tasks Settings"}),t.createEl("p",{cls:"tasks-setting-important",text:"Changing any settings requires a restart of obsidian."}),t.createEl("h4",{text:"Global filter Settings"}),new ce.Setting(t).setName("Global task filter").setDesc(ci.createFragmentWithHTML('

Recommended: Leave empty if you want all checklist items in your vault to be tasks managed by this plugin.

Use a global filter if you want Tasks to only act on a subset of your "- [ ]" checklist items, so that a checklist item must include the specified string in its description in order to be considered a task.

For example, if you set the global filter to #task, the Tasks plugin will only handle checklist items tagged with #task.
Other checklist items will remain normal checklist items and not appear in queries or get a done date set.

See the documentation.

')).addText(i=>{let s=U();i.setPlaceholder("e.g. #task or TODO").setValue(s.globalFilter).onChange(a=>x(this,null,function*(){ot({globalFilter:a}),yield this.plugin.saveSettings()}))}),new ce.Setting(t).setName("Remove global filter from description").setDesc("Enabling this removes the string that you set as global filter from the task description when displaying a task.").addToggle(i=>{let s=U();i.setValue(s.removeGlobalFilter).onChange(a=>x(this,null,function*(){ot({removeGlobalFilter:a}),yield this.plugin.saveSettings()}))}),t.createEl("h4",{text:"Task Statuses"});let{headingOpened:n}=U();iT.forEach(i=>{this.addOneSettingsBlock(t,i,n)}),t.createEl("h4",{text:"Date Settings"}),new ce.Setting(t).setName("Set done date on every completed task").setDesc("Enabling this will add a timestamp \u2705 YYYY-MM-DD at the end when a task is toggled to done").addToggle(i=>{let s=U();i.setValue(s.setDoneDate).onChange(a=>x(this,null,function*(){ot({setDoneDate:a}),yield this.plugin.saveSettings()}))}),new ce.Setting(t).setName("Use filename as Scheduled date for undated tasks").setDesc(ci.createFragmentWithHTML('Save time entering Scheduled (\u23F3) dates.
If this option is enabled, any undated tasks will be given a default Scheduled date extracted from their file name.
The date in the file name must be in one of YYYY-MM-DD or YYYYMMDD formats.
Undated tasks have none of Due (\u{1F4C5} ), Scheduled (\u23F3) and Start (\u{1F6EB}) dates.

See the documentation.

')).addToggle(i=>{let s=U();i.setValue(s.useFilenameAsScheduledDate).onChange(a=>x(this,null,function*(){ot({useFilenameAsScheduledDate:a}),yield this.plugin.saveSettings()}))}),new ce.Setting(t).setName("Folders with default Scheduled dates").setDesc("Leave empty if you want to use default Scheduled dates everywhere, or enter a comma-separated list of folders.").addText(i=>x(this,null,function*(){let s=U();yield this.plugin.saveSettings(),i.setValue(ci.renderFolderArray(s.filenameAsDateFolders)).onChange(a=>x(this,null,function*(){let o=ci.parseCommaSeparatedFolders(a);ot({filenameAsDateFolders:o}),yield this.plugin.saveSettings()}))})),t.createEl("h4",{text:"Auto-suggest Settings"}),new ce.Setting(t).setName("Auto-suggest task content").setDesc("Enabling this will open an intelligent suggest menu while typing inside a recognized task line.").addToggle(i=>{let s=U();i.setValue(s.autoSuggestInEditor).onChange(a=>x(this,null,function*(){ot({autoSuggestInEditor:a}),yield this.plugin.saveSettings()}))}),new ce.Setting(t).setName("Minimum match length for auto-suggest").setDesc("If higher than 0, auto-suggest will be triggered only when the beginning of any supported keywords is recognized.").addSlider(i=>{let s=U();i.setLimits(0,3,1).setValue(s.autoSuggestMinMatch).setDynamicTooltip().onChange(a=>x(this,null,function*(){ot({autoSuggestMinMatch:a}),yield this.plugin.saveSettings()}))}),new ce.Setting(t).setName("Maximum number of auto-suggestions to show").setDesc('How many suggestions should be shown when an auto-suggest menu pops up (including the "\u23CE" option).').addSlider(i=>{let s=U();i.setLimits(3,12,1).setValue(s.autoSuggestMaxItems).setDynamicTooltip().onChange(a=>x(this,null,function*(){ot({autoSuggestMaxItems:a}),yield this.plugin.saveSettings()}))}),t.createEl("h4",{text:"Dialog Settings"}),new ce.Setting(t).setName("Provide access keys in dialogs").setDesc("If the access keys (keyboard shortcuts) for various controls in dialog boxes conflict with system keyboard shortcuts or assistive technology functionality that is important for you, you may want to deactivate them here.").addToggle(i=>{let s=U();i.setValue(s.provideAccessKeys).onChange(a=>x(this,null,function*(){ot({provideAccessKeys:a}),yield this.plugin.saveSettings()}))})}addOneSettingsBlock(t,n,i){let s=t.createEl("details",{cls:"tasks-nested-settings",attr:we({},n.open||i[n.text]?{open:!0}:{})});s.empty(),s.ontoggle=()=>{i[n.text]=s.open,ot({headingOpened:i}),this.plugin.saveSettings()};let a=s.createEl("summary");if(new ce.Setting(a).setHeading().setName(n.text),a.createDiv("collapser").createDiv("handle"),n.notice!==null){let o=s.createEl("div",{cls:n.notice.class,text:n.notice.text});n.notice.html!==null&&o.insertAdjacentHTML("beforeend",n.notice.html)}n.settings.forEach(o=>{if(!(o.featureFlag!==""&&!h_(o.featureFlag))&&(o.type==="checkbox"?new ce.Setting(s).setName(o.name).setDesc(o.description).addToggle(u=>{let l=U();l.generalSettings[o.settingName]||nn(o.settingName,o.initialValue),u.setValue(l.generalSettings[o.settingName]).onChange(c=>x(this,null,function*(){nn(o.settingName,c),yield this.plugin.saveSettings()}))}):o.type==="text"?new ce.Setting(s).setName(o.name).setDesc(o.description).addText(u=>{let l=U();l.generalSettings[o.settingName]||nn(o.settingName,o.initialValue);let c=d=>x(this,null,function*(){nn(o.settingName,d),yield this.plugin.saveSettings()});u.setPlaceholder(o.placeholder.toString()).setValue(l.generalSettings[o.settingName].toString()).onChange((0,ce.debounce)(c,500,!0))}):o.type==="textarea"?new ce.Setting(s).setName(o.name).setDesc(o.description).addTextArea(u=>{let l=U();l.generalSettings[o.settingName]||nn(o.settingName,o.initialValue);let c=d=>x(this,null,function*(){nn(o.settingName,d),yield this.plugin.saveSettings()});u.setPlaceholder(o.placeholder.toString()).setValue(l.generalSettings[o.settingName].toString()).onChange((0,ce.debounce)(c,500,!0)),u.inputEl.rows=8,u.inputEl.cols=40}):o.type==="function"&&this.customFunctions[o.settingName](s,this),o.notice!==null)){let u=s.createEl("p",{cls:o.notice.class,text:o.notice.text});o.notice.html!==null&&u.insertAdjacentHTML("beforeend",o.notice.html)}})}static parseCommaSeparatedFolders(t){return t.split(",").map(n=>n.trim()).map(n=>n.replace(/^\/|\/$/g,"")).filter(n=>n!=="")}static renderFolderArray(t){return t.join(",")}insertTaskCoreStatusSettings(t,n){let{statusSettings:i}=U();i.coreStatuses.forEach(s=>{oT(t,s,i.coreStatuses,i,n,n.plugin,!0)})}insertCustomTaskStatusSettings(t,n){let{statusSettings:i}=U();i.customStatuses.forEach(c=>{oT(t,c,i.customStatuses,i,n,n.plugin,!1)}),t.createEl("div"),new ce.Setting(t).addButton(c=>{c.setButtonText("Add New Task Status").setCta().onClick(()=>x(this,null,function*(){Pe.addStatus(i.customStatuses,new Ye("","","",!1,"TODO")),yield di(i,n)}))}).infoEl.remove(),new ce.Setting(t).addButton(c=>{c.setButtonText("Add all Status types supported by Minimal Theme").setCta().onClick(()=>x(this,null,function*(){yield uT(aT(),i,n)}))}).infoEl.remove(),new ce.Setting(t).addButton(c=>{c.setButtonText("Add all Status types supported by ITS Theme").setCta().onClick(()=>x(this,null,function*(){yield uT(sT(),i,n)}))}).infoEl.remove(),new ce.Setting(t).addButton(c=>{c.setButtonText("Add All Unknown Status Types").setCta().onClick(()=>x(this,null,function*(){let d=this.plugin.getTasks(),f=he.getInstance().findUnknownStatuses(d);f.length!==0&&(f.forEach(h=>{Pe.addStatus(i.customStatuses,h)}),yield di(i,n))}))}).infoEl.remove(),new ce.Setting(t).addButton(c=>{c.setButtonText("Reset Custom Status Types to Defaults").setWarning().onClick(()=>x(this,null,function*(){Pe.resetAllCustomStatuses(i),yield di(i,n)}))}).infoEl.remove()}},qs=ci;qs.createFragmentWithHTML=t=>createFragment(n=>n.createDiv().innerHTML=t);function oT(r,e,t,n,i,s,a){let o=r.createEl("pre");o.addClass("row-for-status"),o.textContent=new j(e).previewText();let u=new ce.Setting(r);u.infoEl.replaceWith(o),a||u.addExtraButton(l=>{l.setIcon("cross").setTooltip("Delete").onClick(()=>x(this,null,function*(){Pe.deleteStatus(t,e)&&(yield di(n,i))}))}),u.addExtraButton(l=>{l.setIcon("pencil").setTooltip("Edit").onClick(()=>x(this,null,function*(){let c=new Tt(s,e,a);c.onClose=()=>x(this,null,function*(){c.saved&&Pe.replaceStatus(t,e,c.statusConfiguration())&&(yield di(n,i))}),c.open()}))}),u.infoEl.remove()}function uT(r,e,t){return x(this,null,function*(){Pe.bulkAddStatusCollection(e,r).forEach(i=>{new ce.Notice(i)}),yield di(e,t)})}function di(r,e){return x(this,null,function*(){ot({statusSettings:r}),Pe.applyToStatusRegistry(r,he.getInstance()),yield e.saveSettings(!0)})}var cT=require("obsidian");var Zk=`${$t}${jt}${Bt}`;function lT(r,e,t){let n=[];n=n.concat(eP(r,e,t)),n=n.concat(tP(r,e,t));let i=Jk(r,t),s=ff(r,/([a-zA-Z'_-]*)/g,e),a=!1;if(s&&s.length>0){let o=s[0];if(o.length>=Math.max(1,t.autoSuggestMinMatch)){let u=i.filter(l=>l.displayText.toLowerCase().includes(o.toLowerCase()));for(let l of u)n.push({suggestionType:"match",displayText:l.displayText,appendText:l.appendText,insertAt:s.index,insertSkip:o.length}),a=!0}}return!a&&t.autoSuggestMinMatch===0&&(n=n.concat(i)),n.length>0&&!n.some(o=>o.suggestionType==="match")&&n.unshift({suggestionType:"empty",displayText:"\u23CE",appendText:` -`}),n=n.slice(0,t.autoSuggestMaxItems),n}function Qk(r){if(Object.values(Ae).some(e=>e.length>0&&r.includes(e)))return!0}function Jk(r,e){let t=[];return r.includes(Bt)||t.push({displayText:`${Bt} due date`,appendText:`${Bt} `}),r.includes($t)||t.push({displayText:`${$t} start date`,appendText:`${$t} `}),r.includes(jt)||t.push({displayText:`${jt} scheduled date`,appendText:`${jt} `}),Qk(r)||(t.push({displayText:`${Ae.High} high priority`,appendText:`${Ae.High} `}),t.push({displayText:`${Ae.Medium} medium priority`,appendText:`${Ae.Medium} `}),t.push({displayText:`${Ae.Low} low priority`,appendText:`${Ae.Low} `})),r.includes(Yt)||t.push({displayText:`${Yt} recurring (repeat)`,appendText:`${Yt} `}),t}function eP(r,e,t){let n=["today","tomorrow","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","next week","next month","next year"],i=[],s=new RegExp(`([${Zk}])\\s*([0-9a-zA-Z ]*)`,"ug"),a=ff(r,s,e);if(a&&a.length>=2){let o=a[1],u=a[2];if(u.length1?yr.parseDate(Vn(u),!0):null;l&&l.isValid()&&i.push({displayText:`${l.format(S.dateFormat)}`,appendText:`${o} ${l.format(S.dateFormat)} `,insertAt:a.index,insertSkip:a[0].length});let c=1,d=5,f=n.filter(h=>u&&u.length>=c&&h.toLowerCase().includes(u.toLowerCase())).slice(0,d);f.length===0&&(f=n.slice(0,d));for(let h of f){let m=`${yr.parseDate(h,!0).format(S.dateFormat)}`;i.push({suggestionType:"match",displayText:`${h} (${m})`,appendText:`${o} ${m} `,insertAt:a.index,insertSkip:a[0].length})}}return i}function tP(r,e,t){var o;let n=["every","every day","every week","every month","every month on the","every year","every week on Sunday","every week on Monday","every week on Tuesday","every week on Wednesday","every week on Thursday","every week on Friday","every week on Saturday"],i=[],s=new RegExp(`(${Yt})\\s*([0-9a-zA-Z ]*)`,"ug"),a=ff(r,s,e);if(a&&a.length>=2){let u=a[1],l=a[2];if(l.length0){let h=(o=We.fromText({recurrenceRuleText:l,startDate:null,scheduledDate:null,dueDate:null}))==null?void 0:o.toText();if(h){let y=`${u} ${h} `;if(i.push({suggestionType:"match",displayText:`\u2705 ${h}`,appendText:y,insertAt:a.index,insertSkip:a[0].length}),a[0]==y)return[]}}let c=1,d=t.autoSuggestMaxItems/2,f=n.filter(h=>l&&l.length>=c&&h.toLowerCase().includes(l.toLowerCase())).slice(0,d);f.length===0&&l.trim().length===0&&(f=n.slice(0,d));for(let h of f)i.push({suggestionType:"match",displayText:`${h}`,appendText:`${u} ${h} `,insertAt:a.index,insertSkip:a[0].length})}return i}function ff(r,e,t){let n=r.matchAll(e);for(let i of n)if((i==null?void 0:i.index)&&i.index<=t&&t<=i.index+i[0].length)return i;return[]}var ko=class extends cT.EditorSuggest{constructor(t,n){super(t);this.settings=n}onTrigger(t,n,i){if(!this.settings.autoSuggestInEditor)return null;let s=n.getLine(t.line);return s.contains(this.settings.globalFilter)&&s.match(S.taskRegex)?{start:{line:t.line,ch:0},end:{line:t.line,ch:s.length},query:s}:null}getSuggestions(t){let n=t.query,i=t.editor.getCursor(),s=lT(n,i.ch,this.settings),a=[];for(let o of s)a.push(vt(we({},o),{context:t}));return a}renderSuggestion(t,n){n.setText(t.displayText)}selectSuggestion(t,n){var u,l,c;let i=t.context.editor;if(t.suggestionType==="empty"){this.close();let d=new KeyboardEvent("keydown",{code:"Enter",key:"Enter"});(l=(u=i==null?void 0:i.cm)==null?void 0:u.contentDOM)==null||l.dispatchEvent(d);return}let s=t.context.editor.getCursor(),a={line:s.line,ch:(c=t.insertAt)!=null?c:s.ch},o=t.insertSkip?{line:s.line,ch:a.ch+t.insertSkip}:void 0;t.context.editor.replaceRange(t.appendText,a,o),t.context.editor.setCursor({line:s.line,ch:a.ch+t.appendText.length})}};var Po=class extends dT.Plugin{onload(){return x(this,null,function*(){console.log('loading plugin "tasks"'),yield this.loadSettings(),this.addSettingTab(new qs({plugin:this})),y_({metadataCache:this.app.metadataCache,vault:this.app.vault}),yield this.loadTaskStatuses();let t=new io({obsidianEvents:this.app.workspace});this.cache=new sn({metadataCache:this.app.metadataCache,vault:this.app.vault,events:t}),this.inlineRenderer=new so({plugin:this}),this.queryRenderer=new Mo({plugin:this,events:t}),this.registerEditorExtension($_()),this.registerEditorSuggest(new ko(this.app,U())),new no({plugin:this})})}loadTaskStatuses(){return x(this,null,function*(){let{statusSettings:t}=U();Pe.applyToStatusRegistry(t,he.getInstance())})}onunload(){var t;console.log('unloading plugin "tasks"'),(t=this.cache)==null||t.unload()}loadSettings(){return x(this,null,function*(){let t=yield this.loadData();ot(t),yield this.loadTaskStatuses()})}saveSettings(){return x(this,null,function*(){yield this.saveData(U())})}getTasks(){var t;return(t=this.cache)==null?void 0:t.getTasks()}}; + Example: ${this.fieldNameSingular()} is not NON_TASK`; + return FilterOrErrorMessage.fromError(line, message); + } + fieldName() { + return "status.type"; + } + value(task) { + return task.status.type; + } + supportsSorting() { + return true; + } + comparator() { + return (a, b) => { + const keyA = StatusTypeField.groupName(a); + const keyB = StatusTypeField.groupName(b); + return keyA.localeCompare(keyB, void 0, { numeric: true }); + }; + } + supportsGrouping() { + return true; + } + grouper() { + return (task) => { + return [StatusTypeField.groupName(task)]; + }; + } + static groupName(task) { + let prefix; + switch (task.status.type) { + case "IN_PROGRESS" /* IN_PROGRESS */: + prefix = "1"; + break; + case "TODO" /* TODO */: + prefix = "2"; + break; + case "DONE" /* DONE */: + prefix = "3"; + break; + case "CANCELLED" /* CANCELLED */: + prefix = "4"; + break; + case "NON_TASK" /* NON_TASK */: + prefix = "5"; + break; + case "EMPTY" /* EMPTY */: + prefix = "6"; + break; + } + return prefix + " " + task.status.type; + } +}; + +// src/Query/Filter/RecurrenceField.ts +var RecurrenceField = class extends TextField { + fieldName() { + return "recurrence"; + } + value(task) { + if (task.recurrence !== null) { + return task.recurrence.toText(); + } else { + return ""; + } + } +}; + +// src/Query/FilterParser.ts +var fieldCreators = [ + () => new StatusNameField(), + () => new StatusTypeField(), + () => new StatusField(), + () => new RecurringField(), + () => new PriorityField(), + () => new HappensDateField(), + () => new StartDateField(), + () => new ScheduledDateField(), + () => new DueDateField(), + () => new DoneDateField(), + () => new PathField(), + () => new DescriptionField(), + () => new TagsField(), + () => new HeadingField(), + () => new ExcludeSubItemsField(), + () => new BooleanField(), + () => new FilenameField(), + () => new UrgencyField(), + () => new RecurrenceField() +]; +function parseFilter(filterString) { + for (const creator of fieldCreators) { + const field = creator(); + if (field.canCreateFilterForLine(filterString)) + return field.createFilterOrErrorMessage(filterString); + } + return null; +} +function parseSorter(sorterString) { + const sortByRegexp = /^sort by /; + if (sorterString.match(sortByRegexp) === null) { + return null; + } + for (const creator of fieldCreators) { + const field = creator(); + const sorter = field.parseSortLine(sorterString); + if (sorter) { + return sorter; + } + } + return null; +} +function parseGrouper(line) { + const groupByRegexp = /^group by /; + if (line.match(groupByRegexp) === null) { + return null; + } + for (const creator of fieldCreators) { + const field = creator(); + const fieldName = field.fieldNameSingular(); + if (line === `group by ${fieldName}`) { + if (field.supportsGrouping()) { + return field.createGrouper(); + } + } + } + return null; +} + +// src/Query/GroupHeading.ts +var GroupHeading = class { + constructor(nestingLevel, name) { + this.nestingLevel = nestingLevel; + this.name = name; + } +}; + +// src/Query/GroupHeadings.ts +var GroupHeadings = class { + constructor(groupedTasks) { + this.lastHeadingAtLevel = new Array(); + const firstGroup = groupedTasks.keys().next().value; + const groupCount = firstGroup.length; + for (let i = 0; i < groupCount; i++) { + this.lastHeadingAtLevel.push(""); + } + } + getHeadingsForTaskGroup(groupNames) { + const headingsForGroup = new Array(); + for (let level = 0; level < groupNames.length; level++) { + const group = groupNames[level]; + if (group != this.lastHeadingAtLevel[level]) { + headingsForGroup.push(new GroupHeading(level, group)); + for (let j = level; j < groupNames.length; j++) { + this.lastHeadingAtLevel[j] = ""; + } + this.lastHeadingAtLevel[level] = group; + } + } + return headingsForGroup; + } +}; + +// src/Query/GroupingTreeNode.ts +var GroupingTreeNode = class { + constructor(values) { + this.children = /* @__PURE__ */ new Map(); + this.values = []; + this.values = values; + } + generateAllPaths(pathSoFar = []) { + const resultMap = /* @__PURE__ */ new Map(); + if (this.children.size == 0) { + resultMap.set([...pathSoFar], this.values); + return resultMap; + } + for (const [property, child] of this.children) { + pathSoFar.push(property); + const childResult = child.generateAllPaths(pathSoFar); + childResult.forEach((value, key) => resultMap.set(key, value)); + pathSoFar.pop(); + } + return resultMap; + } +}; + +// src/Query/IntermediateTaskGroups.ts +var IntermediateTaskGroupsStorage = class extends Map { +}; +var TaskGroupingTreeNode = class extends GroupingTreeNode { +}; +var IntermediateTaskGroups = class { + constructor(groupings, tasks) { + this.groups = new IntermediateTaskGroupsStorage(); + const tree = this.buildGroupingTree(groupings, tasks); + this.groups = tree.generateAllPaths(); + this.groups = this.getSortedGroups(); + } + buildGroupingTree(groupings, tasks) { + const root = new TaskGroupingTreeNode(tasks); + let currentTreeLevel = [root]; + for (const grouping of groupings) { + const nextTreeLevel = []; + for (const currentTreeNode of currentTreeLevel) { + for (const task of currentTreeNode.values) { + const groupNames = Group.getGroupNamesForTask(grouping, task); + for (const groupName of groupNames) { + let child = currentTreeNode.children.get(groupName); + if (child === void 0) { + child = new TaskGroupingTreeNode([]); + currentTreeNode.children.set(groupName, child); + nextTreeLevel.push(child); + } + child.values.push(task); + } + } + } + currentTreeLevel = nextTreeLevel; + } + return root; + } + getSortedGroups() { + return new IntermediateTaskGroupsStorage([...this.groups.entries()].sort()); + } +}; + +// src/Query/TaskGroup.ts +var TaskGroup = class { + constructor(groups, groupHeadings, tasks) { + this.groups = groups; + this.groupHeadings = groupHeadings; + this.tasks = tasks; + } + tasksAsStringOfLines() { + let output = ""; + for (const task of this.tasks) { + output += task.toFileLineString() + "\n"; + } + return output; + } + toString() { + let output = "\n"; + output += `Group names: [${this.groups}] +`; + for (const heading of this.groupHeadings) { + const headingPrefix = "#".repeat(4 + heading.nestingLevel); + output += `${headingPrefix} ${heading.name} +`; + } + output += this.tasksAsStringOfLines(); + return output; + } +}; + +// src/Query/TaskGroups.ts +var TaskGroups = class { + constructor(groups, tasks) { + this._groups = new Array(); + this._totalTaskCount = 0; + this._totalTaskCount = tasks.length; + const initialGroups = new IntermediateTaskGroups(groups, tasks); + this.addTasks(initialGroups); + } + get groups() { + return this._groups; + } + totalTasksCount() { + return this._totalTaskCount; + } + toString() { + let output = ""; + for (const taskGroup of this.groups) { + output += taskGroup.toString(); + output += "\n---\n"; + } + const totalTasksCount = this.totalTasksCount(); + output += ` +${totalTasksCount} tasks +`; + return output; + } + addTasks(initialGroups) { + const grouper = new GroupHeadings(initialGroups.groups); + for (const [groups, tasks] of initialGroups.groups) { + const groupHeadings = grouper.getHeadingsForTaskGroup(groups); + const taskGroup = new TaskGroup(groups, groupHeadings, tasks); + this.add(taskGroup); + } + } + add(taskGroup) { + this._groups.push(taskGroup); + } +}; + +// src/Query/Group.ts +var _Group = class { + static fromGroupingProperty(property) { + return new Grouper(property, _Group.grouperForProperty(property)); + } + static by(grouping, tasks) { + return new TaskGroups(grouping, tasks); + } + static getGroupNamesForTask(grouping, task) { + return grouping.grouper(task); + } + static grouperForProperty(property) { + return _Group.groupers[property]; + } + static escapeMarkdownCharacters(filename) { + return filename.replace(/\\/g, "\\\\").replace(/_/g, "\\_"); + } + static groupByPriority(task) { + let priorityName = "ERROR"; + switch (task.priority) { + case "1" /* High */: + priorityName = "High"; + break; + case "2" /* Medium */: + priorityName = "Medium"; + break; + case "3" /* None */: + priorityName = "None"; + break; + case "4" /* Low */: + priorityName = "Low"; + break; + } + return [`Priority ${task.priority}: ${priorityName}`]; + } + static groupByRecurrence(task) { + if (task.recurrence !== null) { + return [task.recurrence.toText()]; + } else { + return ["None"]; + } + } + static groupByRecurring(task) { + if (task.recurrence !== null) { + return ["Recurring"]; + } else { + return ["Not Recurring"]; + } + } + static groupByStartDate(task) { + return [_Group.stringFromDate(task.startDate, "start")]; + } + static groupByScheduledDate(task) { + return [_Group.stringFromDate(task.scheduledDate, "scheduled")]; + } + static groupByDueDate(task) { + return [_Group.stringFromDate(task.dueDate, "due")]; + } + static groupByDoneDate(task) { + return [_Group.stringFromDate(task.doneDate, "done")]; + } + static groupByHappensDate(task) { + const earliestDateIfAny = new HappensDateField().earliestDate(task); + return [_Group.stringFromDate(earliestDateIfAny, "happens")]; + } + static stringFromDate(date, field) { + if (date === null) { + return "No " + field + " date"; + } + return date.format(_Group.groupDateFormat); + } + static groupByPath(task) { + return [_Group.escapeMarkdownCharacters(task.path.replace(".md", ""))]; + } + static groupByFolder(task) { + const path = task.path; + const fileNameWithExtension = task.filename + ".md"; + const folder = path.substring(0, path.lastIndexOf(fileNameWithExtension)); + if (folder === "") { + return ["/"]; + } + return [_Group.escapeMarkdownCharacters(folder)]; + } + static groupByFileName(task) { + const filename = task.filename; + if (filename === null) { + return ["Unknown Location"]; + } + return ["[[" + _Group.escapeMarkdownCharacters(filename) + "]]"]; + } + static groupByRoot(task) { + const path = task.path.replace(/\\/g, "/"); + const separatorIndex = path.indexOf("/"); + if (separatorIndex == -1) { + return ["/"]; + } + return [_Group.escapeMarkdownCharacters(path.substring(0, separatorIndex + 1))]; + } + static groupByBacklink(task) { + const linkText = task.getLinkText({ isFilenameUnique: true }); + if (linkText === null) { + return ["Unknown Location"]; + } + let filenameComponent = "Unknown Location"; + if (task.filename !== null) { + filenameComponent = _Group.escapeMarkdownCharacters(task.filename); + } + if (task.precedingHeader === null || task.precedingHeader.length === 0) { + return [filenameComponent]; + } + const headingComponent = _Group.groupByHeading(task)[0]; + if (filenameComponent === headingComponent) { + return [filenameComponent]; + } else { + return [`${filenameComponent} > ${headingComponent}`]; + } + } + static groupByStatus(task) { + if (task.status.symbol === " ") { + return ["Todo"]; + } else { + return ["Done"]; + } + } + static groupByHeading(task) { + if (task.precedingHeader === null || task.precedingHeader.length === 0) { + return ["(No heading)"]; + } + return [task.precedingHeader]; + } + static groupByTags(task) { + if (task.tags.length == 0) { + return ["(No tags)"]; + } + return task.tags; + } +}; +var Group = _Group; +Group.groupDateFormat = "YYYY-MM-DD dddd"; +Group.groupers = { + backlink: _Group.groupByBacklink, + done: _Group.groupByDoneDate, + due: _Group.groupByDueDate, + filename: _Group.groupByFileName, + folder: _Group.groupByFolder, + happens: _Group.groupByHappensDate, + heading: _Group.groupByHeading, + path: _Group.groupByPath, + priority: _Group.groupByPriority, + recurrence: _Group.groupByRecurrence, + recurring: _Group.groupByRecurring, + root: _Group.groupByRoot, + scheduled: _Group.groupByScheduledDate, + start: _Group.groupByStartDate, + status: _Group.groupByStatus, + tags: _Group.groupByTags +}; + +// src/Query/Query.ts +var Query = class { + constructor({ source }) { + this._limit = void 0; + this._layoutOptions = new LayoutOptions(); + this._filters = []; + this._error = void 0; + this._sorting = []; + this._grouping = []; + this.groupByRegexp = /^group by (backlink|done|due|filename|folder|happens|heading|path|priority|recurrence|recurring|root|scheduled|start|status|tags)/; + this.hideOptionsRegexp = /^(hide|show) (task count|backlink|priority|start date|scheduled date|done date|due date|recurrence rule|edit button|urgency)/; + this.shortModeRegexp = /^short/; + this.explainQueryRegexp = /^explain/; + this.limitRegexp = /^limit (to )?(\d+)( tasks?)?/; + this.commentRegexp = /^#.*/; + this.source = source; + source.split("\n").map((line) => line.trim()).forEach((line) => { + switch (true) { + case line === "": + break; + case this.shortModeRegexp.test(line): + this._layoutOptions.shortMode = true; + break; + case this.explainQueryRegexp.test(line): + this._layoutOptions.explainQuery = true; + break; + case this.limitRegexp.test(line): + this.parseLimit({ line }); + break; + case this.parseSortBy({ line }): + break; + case this.parseGroupBy2({ line }): + break; + case this.groupByRegexp.test(line): + this.parseGroupBy({ line }); + break; + case this.hideOptionsRegexp.test(line): + this.parseHideOptions({ line }); + break; + case this.commentRegexp.test(line): + break; + case this.parseFilter(line): + break; + default: + this._error = `do not understand query: ${line}`; + } + }); + } + explainQuery() { + return "Explanation of this Tasks code block query:\n\n" + this.explainQueryWithoutIntroduction(); + } + explainQueryWithoutIntroduction() { + let result = ""; + const { globalFilter } = getSettings(); + if (globalFilter.length !== 0) { + result += `Only tasks containing the global filter '${globalFilter}'. + +`; + } + const numberOfFilters = this.filters.length; + if (numberOfFilters === 0) { + result += "No filters supplied. All tasks will match the query."; + } else { + for (let i = 0; i < numberOfFilters; i++) { + if (i > 0) + result += "\n"; + result += this.filters[i].explainFilterIndented(""); + } + } + if (this._limit !== void 0) { + result += ` + +At most ${this._limit} task`; + if (this._limit !== 1) { + result += "s"; + } + result += ".\n"; + } + return result; + } + get limit() { + return this._limit; + } + get layoutOptions() { + return this._layoutOptions; + } + get filters() { + return this._filters; + } + get sorting() { + return this._sorting; + } + get grouping() { + return this._grouping; + } + get error() { + return this._error; + } + applyQueryToTasks(tasks) { + this.filters.forEach((filter) => { + tasks = tasks.filter(filter.filterFunction); + }); + const tasksSortedLimited = Sort.by(this.sorting, tasks).slice(0, this.limit); + return Group.by(this.grouping, tasksSortedLimited); + } + parseHideOptions({ line }) { + const hideOptionsMatch = line.match(this.hideOptionsRegexp); + if (hideOptionsMatch !== null) { + const hide = hideOptionsMatch[1] === "hide"; + const option = hideOptionsMatch[2]; + switch (option) { + case "task count": + this._layoutOptions.hideTaskCount = hide; + break; + case "backlink": + this._layoutOptions.hideBacklinks = hide; + break; + case "priority": + this._layoutOptions.hidePriority = hide; + break; + case "start date": + this._layoutOptions.hideStartDate = hide; + break; + case "scheduled date": + this._layoutOptions.hideScheduledDate = hide; + break; + case "due date": + this._layoutOptions.hideDueDate = hide; + break; + case "done date": + this._layoutOptions.hideDoneDate = hide; + break; + case "recurrence rule": + this._layoutOptions.hideRecurrenceRule = hide; + break; + case "edit button": + this._layoutOptions.hideEditButton = hide; + break; + case "urgency": + this._layoutOptions.hideUrgency = hide; + break; + default: + this._error = "do not understand hide/show option"; + } + } + } + parseFilter(line) { + const filterOrError = parseFilter(line); + if (filterOrError != null) { + if (filterOrError.filter) + this._filters.push(filterOrError.filter); + else + this._error = filterOrError.error; + return true; + } + return false; + } + parseLimit({ line }) { + const limitMatch = line.match(this.limitRegexp); + if (limitMatch !== null) { + this._limit = Number.parseInt(limitMatch[2], 10); + } else { + this._error = "do not understand query limit"; + } + } + parseSortBy({ line }) { + const sortingMaybe = parseSorter(line); + if (sortingMaybe) { + this._sorting.push(sortingMaybe); + return true; + } + return false; + } + parseGroupBy({ line }) { + const fieldMatch = line.match(this.groupByRegexp); + if (fieldMatch !== null) { + this._grouping.push(Group.fromGroupingProperty(fieldMatch[1])); + } else { + this._error = "do not understand query grouping"; + } + } + parseGroupBy2({ line }) { + const groupingMaybe = parseGrouper(line); + if (groupingMaybe) { + this._grouping.push(groupingMaybe); + return true; + } + return false; + } +}; + +// src/QueryRenderer.ts +var QueryRenderer = class { + constructor({ plugin, events }) { + this.addQueryRenderChild = this._addQueryRenderChild.bind(this); + this.app = plugin.app; + this.events = events; + plugin.registerMarkdownCodeBlockProcessor("tasks", this._addQueryRenderChild.bind(this)); + } + _addQueryRenderChild(source, element2, context) { + return __async(this, null, function* () { + context.addChild( + new QueryRenderChild({ + app: this.app, + events: this.events, + container: element2, + source, + filePath: context.sourcePath + }) + ); + }); + } +}; +var QueryRenderChild = class extends import_obsidian8.MarkdownRenderChild { + constructor({ + app, + events, + container, + source, + filePath + }) { + super(container); + this.app = app; + this.events = events; + this.source = source; + this.filePath = filePath; + switch (this.containerEl.className) { + case "block-language-tasks": + this.query = new Query({ source }); + this.queryType = "tasks"; + break; + default: + this.query = new Query({ source }); + this.queryType = "tasks"; + break; + } + } + onload() { + this.events.triggerRequestCacheUpdate(this.render.bind(this)); + this.renderEventRef = this.events.onCacheUpdate(this.render.bind(this)); + this.reloadQueryAtMidnight(); + } + onunload() { + if (this.renderEventRef !== void 0) { + this.events.off(this.renderEventRef); + } + if (this.queryReloadTimeout !== void 0) { + clearTimeout(this.queryReloadTimeout); + } + } + reloadQueryAtMidnight() { + const midnight = new Date(); + midnight.setHours(24, 0, 0, 0); + const now = new Date(); + const millisecondsToMidnight = midnight.getTime() - now.getTime(); + this.queryReloadTimeout = setTimeout(() => { + this.query = new Query({ source: this.source }); + this.events.triggerRequestCacheUpdate(this.render.bind(this)); + this.reloadQueryAtMidnight(); + }, millisecondsToMidnight + 1e3); + } + render(_0) { + return __async(this, arguments, function* ({ tasks, state }) { + var _a; + const content = this.containerEl.createEl("div"); + if (state === "Warm" /* Warm */ && this.query.error === void 0) { + console.debug( + `Render ${this.queryType} called for a block in active file "${this.filePath}", to select from ${tasks.length} tasks: plugin state: ${state}` + ); + if (this.query.layoutOptions.explainQuery) { + this.createExplanation(content); + } + const tasksSortedLimitedGrouped = this.query.applyQueryToTasks(tasks); + for (const group of tasksSortedLimitedGrouped.groups) { + this.addGroupHeadings(content, group.groupHeadings); + const { taskList } = yield this.createTasksList({ + tasks: group.tasks, + content + }); + content.appendChild(taskList); + } + const totalTasksCount = tasksSortedLimitedGrouped.totalTasksCount(); + console.debug(`${totalTasksCount} of ${tasks.length} tasks displayed in a block in "${this.filePath}"`); + this.addTaskCount(content, totalTasksCount); + } else if (this.query.error !== void 0) { + content.createDiv().innerHTML = `
Tasks query: ${this.query.error.replace(/\n/g, "
")}
`; + } else { + content.setText("Loading Tasks ..."); + } + (_a = this.containerEl.firstChild) == null ? void 0 : _a.replaceWith(content); + }); + } + createExplanation(content) { + const explanationAsString = this.query.explainQuery(); + const explanationsBlock = content.createEl("pre"); + explanationsBlock.addClasses(["plugin-tasks-query-explanation"]); + explanationsBlock.setText(explanationAsString); + content.appendChild(explanationsBlock); + } + createTasksList(_0) { + return __async(this, arguments, function* ({ + tasks, + content + }) { + const tasksCount = tasks.length; + const layout = new TaskLayout(this.query.layoutOptions); + const taskList = content.createEl("ul"); + taskList.addClasses(["contains-task-list", "plugin-tasks-query-result"]); + taskList.addClasses(layout.specificClasses); + const groupingAttribute = this.getGroupingAttribute(); + if (groupingAttribute && groupingAttribute.length > 0) + taskList.dataset.taskGroupBy = groupingAttribute; + for (let i = 0; i < tasksCount; i++) { + const task = tasks[i]; + const isFilenameUnique = this.isFilenameUnique({ task }); + const listItem = yield task.toLi({ + parentUlElement: taskList, + listIndex: i, + layoutOptions: this.query.layoutOptions, + isFilenameUnique, + taskLayout: layout + }); + const footnotes = listItem.querySelectorAll("[data-footnote-id]"); + footnotes.forEach((footnote) => footnote.remove()); + const shortMode = this.query.layoutOptions.shortMode; + const extrasSpan = listItem.createSpan("task-extras"); + if (!this.query.layoutOptions.hideUrgency) { + this.addUrgency(extrasSpan, task); + } + if (!this.query.layoutOptions.hideBacklinks) { + this.addBacklinks(extrasSpan, task, shortMode, isFilenameUnique); + } + if (!this.query.layoutOptions.hideEditButton) { + this.addEditButton(extrasSpan, task); + } + taskList.appendChild(listItem); + } + return { taskList, tasksCount }; + }); + } + addEditButton(listItem, task) { + const editTaskPencil = listItem.createEl("a", { + cls: "tasks-edit" + }); + editTaskPencil.onClickEvent((event) => { + event.preventDefault(); + const onSubmit = (updatedTasks) => { + replaceTaskWithTasks({ + originalTask: task, + newTasks: DateFallback.removeInferredStatusIfNeeded(task, updatedTasks) + }); + }; + const taskModal = new TaskModal({ + app: this.app, + task, + onSubmit + }); + taskModal.open(); + }); + } + addUrgency(listItem, task) { + const text2 = new Intl.NumberFormat().format(task.urgency); + listItem.createSpan({ text: text2, cls: "tasks-urgency" }); + } + addGroupHeadings(content, groupHeadings) { + for (const heading of groupHeadings) { + this.addGroupHeading(content, heading); + } + } + addGroupHeading(content, group) { + return __async(this, null, function* () { + let header; + if (group.nestingLevel === 0) { + header = content.createEl("h4", { + cls: "tasks-group-heading" + }); + } else if (group.nestingLevel === 1) { + header = content.createEl("h5", { + cls: "tasks-group-heading" + }); + } else { + header = content.createEl("h6", { + cls: "tasks-group-heading" + }); + } + yield import_obsidian8.MarkdownRenderer.renderMarkdown(group.name, header, this.filePath, this); + }); + } + addBacklinks(listItem, task, shortMode, isFilenameUnique) { + var _a; + const backLink = listItem.createSpan({ cls: "tasks-backlink" }); + if (!shortMode) { + backLink.append(" ("); + } + const link = backLink.createEl("a"); + link.href = task.path; + link.setAttribute("data-href", task.path); + link.rel = "noopener"; + link.target = "_blank"; + link.addClass("internal-link"); + if (shortMode) { + link.addClass("internal-link-short-mode"); + } + if (task.precedingHeader !== null) { + const sanitisedHeading = task.precedingHeader.replace(/#/g, ""); + link.href = link.href + "#" + sanitisedHeading; + link.setAttribute("data-href", link.getAttribute("data-href") + "#" + sanitisedHeading); + } + let linkText; + if (shortMode) { + linkText = " \u{1F517}"; + } else { + linkText = (_a = task.getLinkText({ isFilenameUnique })) != null ? _a : ""; + } + link.setText(linkText); + if (!shortMode) { + backLink.append(")"); + } + } + addTaskCount(content, tasksCount) { + if (!this.query.layoutOptions.hideTaskCount) { + content.createDiv({ + text: `${tasksCount} task${tasksCount !== 1 ? "s" : ""}`, + cls: "tasks-count" + }); + } + } + isFilenameUnique({ task }) { + const filenameMatch = task.path.match(/([^/]*)\..+$/i); + if (filenameMatch === null) { + return void 0; + } + const filename = filenameMatch[1]; + const allFilesWithSameName = this.app.vault.getMarkdownFiles().filter((file) => { + if (file.basename === filename) { + return true; + } + }); + return allFilesWithSameName.length < 2; + } + getGroupingAttribute() { + const groupingRules = []; + for (const group of this.query.grouping) { + groupingRules.push(group.property); + } + return groupingRules.join(","); + } +}; + +// src/Config/SettingsTab.ts +var import_obsidian10 = require("obsidian"); + +// src/Config/Themes/AnuPpuccinThemeCollection.ts +function anuppuccinSupportedStatuses() { + const zzz = [ + [" ", "Unchecked", "x", "TODO"], + ["x", "Checked", " ", "DONE"], + [">", "Rescheduled", "x", "TODO"], + ["<", "Scheduled", "x", "TODO"], + ["!", "Important", "x", "TODO"], + ["-", "Cancelled", " ", "CANCELLED"], + ["/", "In Progress", "x", "IN_PROGRESS"], + ["?", "Question", "x", "TODO"], + ["*", "Star", "x", "TODO"], + ["n", "Note", "x", "TODO"], + ["l", "Location", "x", "TODO"], + ["i", "Information", "x", "TODO"], + ["I", "Idea", "x", "TODO"], + ["S", "Amount", "x", "TODO"], + ["p", "Pro", "x", "TODO"], + ["c", "Con", "x", "TODO"], + ["b", "Bookmark", "x", "TODO"], + ['"', "Quote", "x", "TODO"], + ["0", "Speech bubble 0", "0", "NON_TASK"], + ["1", "Speech bubble 1", "1", "NON_TASK"], + ["2", "Speech bubble 2", "2", "NON_TASK"], + ["3", "Speech bubble 3", "3", "NON_TASK"], + ["4", "Speech bubble 4", "4", "NON_TASK"], + ["5", "Speech bubble 5", "5", "NON_TASK"], + ["6", "Speech bubble 6", "6", "NON_TASK"], + ["7", "Speech bubble 7", "7", "NON_TASK"], + ["8", "Speech bubble 8", "8", "NON_TASK"], + ["9", "Speech bubble 9", "9", "NON_TASK"] + ]; + return zzz; +} + +// src/Config/Themes/AuraThemeCollection.ts +function auraSupportedStatuses() { + const zzz = [ + [" ", "incomplete", "x", "TODO"], + ["x", "complete / done", " ", "DONE"], + ["-", "cancelled", " ", "CANCELLED"], + [">", "deferred", "x", "TODO"], + ["/", "in progress, or half-done", "x", "IN_PROGRESS"], + ["!", "Important", "x", "TODO"], + ["?", "question", "x", "TODO"], + ["R", "review", "x", "TODO"], + ["+", "Inbox / task that should be processed later", "x", "TODO"], + ["b", "bookmark", "x", "TODO"], + ["B", "brainstorm", "x", "TODO"], + ["D", "deferred or scheduled", "x", "TODO"], + ["I", "Info", "x", "TODO"], + ["i", "idea", "x", "TODO"], + ["N", "note", "x", "TODO"], + ["Q", "quote", "x", "TODO"], + ["W", "win / success / reward", "x", "TODO"], + ["P", "pro", "x", "TODO"], + ["C", "con", "x", "TODO"] + ]; + return zzz; +} + +// src/Config/Themes/EbullientworksThemeCollection.ts +function ebullientworksSupportedStatuses() { + const zzz = [ + [" ", "Unchecked", "x", "TODO"], + ["x", "Checked", " ", "DONE"], + ["-", "Cancelled", " ", "CANCELLED"], + ["/", "In Progress", "x", "IN_PROGRESS"], + [">", "Deferred", "x", "TODO"], + ["!", "Important", "x", "TODO"], + ["?", "Question", "x", "TODO"], + ["r", "Review", "x", "TODO"] + ]; + return zzz; +} + +// src/Config/Themes/ITSThemeCollection.ts +function itsSupportedStatuses() { + const zzz = [ + [" ", "Unchecked", "x", "TODO"], + ["x", "Regular", " ", "DONE"], + ["X", "Checked", " ", "DONE"], + ["-", "Dropped", " ", "CANCELLED"], + [">", "Forward", "x", "TODO"], + ["D", "Date", "x", "TODO"], + ["?", "Question", "x", "TODO"], + ["/", "Half Done", "x", "IN_PROGRESS"], + ["+", "Add", "x", "TODO"], + ["R", "Research", "x", "TODO"], + ["!", "Important", "x", "TODO"], + ["i", "Idea", "x", "TODO"], + ["B", "Brainstorm", "x", "TODO"], + ["P", "Pro", "x", "TODO"], + ["C", "Con", "x", "TODO"], + ["Q", "Quote", "x", "TODO"], + ["N", "Note", "x", "TODO"], + ["b", "Bookmark", "x", "TODO"], + ["I", "Information", "x", "TODO"], + ["p", "Paraphrase", "x", "TODO"], + ["L", "Location", "x", "TODO"], + ["E", "Example", "x", "TODO"], + ["A", "Answer", "x", "TODO"], + ["r", "Reward", "x", "TODO"], + ["c", "Choice", "x", "TODO"], + ["d", "Doing", "x", "IN_PROGRESS"], + ["T", "Time", "x", "TODO"], + ["@", "Character / Person", "x", "TODO"], + ["t", "Talk", "x", "TODO"], + ["O", "Outline / Plot", "x", "TODO"], + ["~", "Conflict", "x", "TODO"], + ["W", "World", "x", "TODO"], + ["f", "Clue / Find", "x", "TODO"], + ["F", "Foreshadow", "x", "TODO"], + ["H", "Favorite / Health", "x", "TODO"], + ["&", "Symbolism", "x", "TODO"], + ["s", "Secret", "x", "TODO"] + ]; + return zzz; +} + +// src/Config/Themes/MinimalThemeCollection.ts +function minimalSupportedStatuses() { + const zzz = [ + [" ", "to-do", "x", "TODO"], + ["/", "incomplete", "x", "IN_PROGRESS"], + ["x", "done", " ", "DONE"], + ["-", "canceled", " ", "CANCELLED"], + [">", "forwarded", "x", "TODO"], + ["<", "scheduling", "x", "TODO"], + ["?", "question", "x", "TODO"], + ["!", "important", "x", "TODO"], + ["*", "star", "x", "TODO"], + ['"', "quote", "x", "TODO"], + ["l", "location", "x", "TODO"], + ["b", "bookmark", "x", "TODO"], + ["i", "information", "x", "TODO"], + ["S", "savings", "x", "TODO"], + ["I", "idea", "x", "TODO"], + ["p", "pros", "x", "TODO"], + ["c", "cons", "x", "TODO"], + ["f", "fire", "x", "TODO"], + ["k", "key", "x", "TODO"], + ["w", "win", "x", "TODO"], + ["u", "up", "x", "TODO"], + ["d", "down", "x", "TODO"] + ]; + return zzz; +} + +// src/Config/Themes/ThingsThemeCollection.ts +function thingsSupportedStatuses() { + const zzz = [ + [" ", "to-do", "x", "TODO"], + ["/", "incomplete", "x", "IN_PROGRESS"], + ["x", "done", " ", "DONE"], + ["-", "canceled", " ", "CANCELLED"], + [">", "forwarded", "x", "TODO"], + ["<", "scheduling", "x", "TODO"], + ["?", "question", "x", "TODO"], + ["!", "important", "x", "TODO"], + ["*", "star", "x", "TODO"], + ['"', "quote", "x", "TODO"], + ["l", "location", "x", "TODO"], + ["b", "bookmark", "x", "TODO"], + ["i", "information", "x", "TODO"], + ["S", "savings", "x", "TODO"], + ["I", "idea", "x", "TODO"], + ["p", "pros", "x", "TODO"], + ["c", "cons", "x", "TODO"], + ["f", "fire", "x", "TODO"], + ["k", "key", "x", "TODO"], + ["w", "win", "x", "TODO"], + ["u", "up", "x", "TODO"], + ["d", "down", "x", "TODO"] + ]; + return zzz; +} + +// src/Config/settingsConfiguration.json +var settingsConfiguration_default = [ + { + text: "Core Statuses", + level: "h3", + class: "", + open: true, + notice: { + class: "setting-item-description", + text: null, + html: "

These are the core statuses that Tasks supports natively, with no need for custom CSS styling or theming.

You can add edit and add your own custom statuses in the section below.

" + }, + settings: [ + { + name: "", + description: "", + type: "function", + initialValue: "", + placeholder: "", + settingName: "insertTaskCoreStatusSettings", + featureFlag: "", + notice: null + } + ] + }, + { + text: "Custom Statuses", + level: "h3", + class: "", + open: true, + notice: { + class: "setting-item-description", + text: null, + html: `

You should first select and install a CSS Snippet or Theme to style custom checkboxes.

Then, use the buttons below to set up your custom statuses, to match your chosen CSS checkboxes.

Note Any statuses with the same symbol as any earlier statuses will be ignored. You can confirm the actually loaded statuses by running the 'Create or edit task' command and looking at the Status drop-down.

See the documentation to get started!

` + }, + settings: [ + { + name: "", + description: "", + type: "function", + initialValue: "", + placeholder: "", + settingName: "insertCustomTaskStatusSettings", + featureFlag: "", + notice: null + } + ] + } +]; + +// src/Config/CustomStatusModal.ts +var import_obsidian9 = require("obsidian"); + +// src/StatusValidator.ts +var StatusValidator = class { + validate(statusConfiguration) { + const errors = []; + errors.push(...this.validateSymbol(statusConfiguration)); + errors.push(...this.validateName(statusConfiguration)); + errors.push(...this.validateNextSymbol(statusConfiguration)); + return errors; + } + validateStatusCollectionEntry(entry) { + const [symbol, _name, nextStatusSymbol, typeAsString] = entry; + const errors = []; + errors.push(...this.validateType(typeAsString)); + if (symbol === nextStatusSymbol && typeAsString !== "NON_TASK") { + errors.push(`Status symbol '${symbol}' toggles to itself`); + } + if (errors.length > 0) { + return errors; + } + const configuration = Status.createFromImportedValue(entry).configuration; + errors.push(...this.validateSymbolTypeConventions(configuration)); + errors.push(...this.validate(configuration)); + return errors; + } + validateSymbol(statusConfiguration) { + return StatusValidator.validateOneSymbol(statusConfiguration.symbol, "Task Status Symbol"); + } + validateNextSymbol(statusConfiguration) { + return StatusValidator.validateOneSymbol(statusConfiguration.nextStatusSymbol, "Task Next Status Symbol"); + } + validateName(statusConfiguration) { + const errors = []; + if (statusConfiguration.name.length === 0) { + errors.push("Task Status Name cannot be empty."); + } + return errors; + } + validateType(symbolName) { + const statusTypeElement = StatusType[symbolName]; + const errors = []; + if (!statusTypeElement) { + errors.push(`Status Type "${symbolName}" is not a valid type`); + } + if (statusTypeElement == "EMPTY" /* EMPTY */) { + errors.push('Status Type "EMPTY" is not permitted in user data'); + } + return errors; + } + validateSymbolTypeConventions(configuration) { + const errors = []; + const symbol = configuration.symbol; + const registry = new StatusRegistry(); + const symbolToSearchFor = symbol === "X" ? "x" : symbol; + const defaultStatusFromRegistry = registry.bySymbol(symbolToSearchFor); + if (defaultStatusFromRegistry.type !== "EMPTY" /* EMPTY */) { + if (configuration.nextStatusSymbol !== defaultStatusFromRegistry.nextStatusSymbol) { + errors.push( + `Next Status Symbol for symbol '${symbol}': '${configuration.nextStatusSymbol}' is inconsistent with convention '${defaultStatusFromRegistry.nextStatusSymbol}'` + ); + } + if (configuration.type !== defaultStatusFromRegistry.type) { + errors.push( + `Status Type for symbol '${symbol}': '${configuration.type}' is inconsistent with convention '${defaultStatusFromRegistry.type}'` + ); + } + } + return errors; + } + static validateOneSymbol(symbol, symbolName) { + const errors = []; + if (symbol.length === 0) { + errors.push(`${symbolName} cannot be empty.`); + } + if (symbol.length > 1) { + errors.push(`${symbolName} ("${symbol}") must be a single character.`); + } + return errors; + } +}; + +// src/Config/CustomStatusModal.ts +var validator = new StatusValidator(); +var CustomStatusModal = class extends import_obsidian9.Modal { + constructor(plugin, statusType, isCoreStatus) { + super(plugin.app); + this.plugin = plugin; + this.saved = false; + this.error = false; + this.statusSymbol = statusType.symbol; + this.statusName = statusType.name; + this.statusNextSymbol = statusType.nextStatusSymbol; + this.statusAvailableAsCommand = statusType.availableAsCommand; + this.type = statusType.type; + this.isCoreStatus = isCoreStatus; + } + statusConfiguration() { + return new StatusConfiguration( + this.statusSymbol, + this.statusName, + this.statusNextSymbol, + this.statusAvailableAsCommand, + this.type + ); + } + display() { + return __async(this, null, function* () { + const { contentEl } = this; + contentEl.empty(); + const settingDiv = contentEl.createDiv(); + let statusSymbolText; + new import_obsidian9.Setting(settingDiv).setName("Task Status Symbol").setDesc( + "This is the character between the square braces. (It can only be edited for Custom statuses, and not Core statuses.)" + ).addText((text2) => { + statusSymbolText = text2; + text2.setValue(this.statusSymbol).onChange((v) => { + this.statusSymbol = v; + CustomStatusModal.setValid(text2, validator.validateSymbol(this.statusConfiguration())); + }); + }).setDisabled(this.isCoreStatus).then((_setting) => { + CustomStatusModal.setValid(statusSymbolText, validator.validateSymbol(this.statusConfiguration())); + }); + let statusNameText; + new import_obsidian9.Setting(settingDiv).setName("Task Status Name").setDesc("This is the friendly name of the task status.").addText((text2) => { + statusNameText = text2; + text2.setValue(this.statusName).onChange((v) => { + this.statusName = v; + CustomStatusModal.setValid(text2, validator.validateName(this.statusConfiguration())); + }); + }).then((_setting) => { + CustomStatusModal.setValid(statusNameText, validator.validateName(this.statusConfiguration())); + }); + let statusNextSymbolText; + new import_obsidian9.Setting(settingDiv).setName("Task Next Status Symbol").setDesc("When clicked on this is the symbol that should be used next.").addText((text2) => { + statusNextSymbolText = text2; + text2.setValue(this.statusNextSymbol).onChange((v) => { + this.statusNextSymbol = v; + CustomStatusModal.setValid(text2, validator.validateNextSymbol(this.statusConfiguration())); + }); + }).then((_setting) => { + CustomStatusModal.setValid( + statusNextSymbolText, + validator.validateNextSymbol(this.statusConfiguration()) + ); + }); + new import_obsidian9.Setting(settingDiv).setName("Task Status Type").setDesc("Control how the status behaves for searching and toggling.").addDropdown((dropdown) => { + const types = [ + "TODO" /* TODO */, + "IN_PROGRESS" /* IN_PROGRESS */, + "DONE" /* DONE */, + "CANCELLED" /* CANCELLED */, + "NON_TASK" /* NON_TASK */ + ]; + types.forEach((s) => { + dropdown.addOption(s, s); + }); + dropdown.setValue(this.type).onChange((v) => { + this.type = Status.getTypeFromStatusTypeString(v); + }); + }); + if (Status.tasksPluginCanCreateCommandsForStatuses()) { + new import_obsidian9.Setting(settingDiv).setName("Available as command").setDesc( + "If enabled this status will be available as a command so you can assign a hotkey and toggle the status using it." + ).addToggle((toggle) => { + toggle.setValue(this.statusAvailableAsCommand).onChange((value) => __async(this, null, function* () { + this.statusAvailableAsCommand = value; + })); + }); + } + const footerEl = contentEl.createDiv(); + const footerButtons = new import_obsidian9.Setting(footerEl); + footerButtons.addButton((b) => { + b.setTooltip("Save").setIcon("checkmark").onClick(() => __async(this, null, function* () { + const errors = validator.validate(this.statusConfiguration()); + if (errors.length > 0) { + const message = errors.join("\n") + "\n\nFix errors before saving."; + new import_obsidian9.Notice(message); + return; + } + this.saved = true; + this.close(); + })); + return b; + }); + footerButtons.addExtraButton((b) => { + b.setIcon("cross").setTooltip("Cancel").onClick(() => { + this.saved = false; + this.close(); + }); + return b; + }); + }); + } + onOpen() { + this.display(); + } + static setValidationError(textInput) { + textInput.inputEl.addClass("tasks-settings-is-invalid"); + } + static removeValidationError(textInput) { + textInput.inputEl.removeClass("tasks-settings-is-invalid"); + } + static setValid(text2, messages) { + const valid = messages.length === 0; + if (valid) { + CustomStatusModal.removeValidationError(text2); + } else { + CustomStatusModal.setValidationError(text2); + } + } +}; + +// src/Config/SettingsTab.ts +var _SettingsTab = class extends import_obsidian10.PluginSettingTab { + constructor({ plugin }) { + super(plugin.app, plugin); + this.customFunctions = { + insertTaskCoreStatusSettings: this.insertTaskCoreStatusSettings.bind(this), + insertCustomTaskStatusSettings: this.insertCustomTaskStatusSettings.bind(this) + }; + this.plugin = plugin; + } + saveSettings(update2) { + return __async(this, null, function* () { + yield this.plugin.saveSettings(); + if (update2) { + this.display(); + } + }); + } + display() { + const { containerEl } = this; + containerEl.empty(); + this.containerEl.addClass("tasks-settings"); + containerEl.createEl("h3", { text: "Tasks Settings" }); + containerEl.createEl("p", { + cls: "tasks-setting-important", + text: "Changing any settings requires a restart of obsidian." + }); + containerEl.createEl("h4", { text: "Global filter Settings" }); + new import_obsidian10.Setting(containerEl).setName("Global task filter").setDesc( + _SettingsTab.createFragmentWithHTML( + '

Recommended: Leave empty if you want all checklist items in your vault to be tasks managed by this plugin.

Use a global filter if you want Tasks to only act on a subset of your "- [ ]" checklist items, so that a checklist item must include the specified string in its description in order to be considered a task.

For example, if you set the global filter to #task, the Tasks plugin will only handle checklist items tagged with #task.
Other checklist items will remain normal checklist items and not appear in queries or get a done date set.

See the documentation.

' + ) + ).addText((text2) => { + const settings2 = getSettings(); + text2.setPlaceholder("e.g. #task or TODO").setValue(settings2.globalFilter).onChange((value) => __async(this, null, function* () { + updateSettings({ globalFilter: value }); + yield this.plugin.saveSettings(); + })); + }); + new import_obsidian10.Setting(containerEl).setName("Remove global filter from description").setDesc( + "Enabling this removes the string that you set as global filter from the task description when displaying a task." + ).addToggle((toggle) => { + const settings2 = getSettings(); + toggle.setValue(settings2.removeGlobalFilter).onChange((value) => __async(this, null, function* () { + updateSettings({ removeGlobalFilter: value }); + yield this.plugin.saveSettings(); + })); + }); + containerEl.createEl("h4", { text: "Task Statuses" }); + const { headingOpened } = getSettings(); + settingsConfiguration_default.forEach((heading) => { + this.addOneSettingsBlock(containerEl, heading, headingOpened); + }); + containerEl.createEl("h4", { text: "Date Settings" }); + new import_obsidian10.Setting(containerEl).setName("Set done date on every completed task").setDesc("Enabling this will add a timestamp \u2705 YYYY-MM-DD at the end when a task is toggled to done").addToggle((toggle) => { + const settings2 = getSettings(); + toggle.setValue(settings2.setDoneDate).onChange((value) => __async(this, null, function* () { + updateSettings({ setDoneDate: value }); + yield this.plugin.saveSettings(); + })); + }); + new import_obsidian10.Setting(containerEl).setName("Use filename as Scheduled date for undated tasks").setDesc( + _SettingsTab.createFragmentWithHTML( + 'Save time entering Scheduled (\u23F3) dates.
If this option is enabled, any undated tasks will be given a default Scheduled date extracted from their file name.
The date in the file name must be in one of YYYY-MM-DD or YYYYMMDD formats.
Undated tasks have none of Due (\u{1F4C5} ), Scheduled (\u23F3) and Start (\u{1F6EB}) dates.

See the documentation.

' + ) + ).addToggle((toggle) => { + const settings2 = getSettings(); + toggle.setValue(settings2.useFilenameAsScheduledDate).onChange((value) => __async(this, null, function* () { + updateSettings({ useFilenameAsScheduledDate: value }); + yield this.plugin.saveSettings(); + })); + }); + new import_obsidian10.Setting(containerEl).setName("Folders with default Scheduled dates").setDesc( + "Leave empty if you want to use default Scheduled dates everywhere, or enter a comma-separated list of folders." + ).addText((input) => __async(this, null, function* () { + const settings2 = getSettings(); + yield this.plugin.saveSettings(); + input.setValue(_SettingsTab.renderFolderArray(settings2.filenameAsDateFolders)).onChange((value) => __async(this, null, function* () { + const folders = _SettingsTab.parseCommaSeparatedFolders(value); + updateSettings({ filenameAsDateFolders: folders }); + yield this.plugin.saveSettings(); + })); + })); + containerEl.createEl("h4", { text: "Auto-suggest Settings" }); + new import_obsidian10.Setting(containerEl).setName("Auto-suggest task content").setDesc("Enabling this will open an intelligent suggest menu while typing inside a recognized task line.").addToggle((toggle) => { + const settings2 = getSettings(); + toggle.setValue(settings2.autoSuggestInEditor).onChange((value) => __async(this, null, function* () { + updateSettings({ autoSuggestInEditor: value }); + yield this.plugin.saveSettings(); + })); + }); + new import_obsidian10.Setting(containerEl).setName("Minimum match length for auto-suggest").setDesc( + "If higher than 0, auto-suggest will be triggered only when the beginning of any supported keywords is recognized." + ).addSlider((slider) => { + const settings2 = getSettings(); + slider.setLimits(0, 3, 1).setValue(settings2.autoSuggestMinMatch).setDynamicTooltip().onChange((value) => __async(this, null, function* () { + updateSettings({ autoSuggestMinMatch: value }); + yield this.plugin.saveSettings(); + })); + }); + new import_obsidian10.Setting(containerEl).setName("Maximum number of auto-suggestions to show").setDesc( + 'How many suggestions should be shown when an auto-suggest menu pops up (including the "\u23CE" option).' + ).addSlider((slider) => { + const settings2 = getSettings(); + slider.setLimits(3, 12, 1).setValue(settings2.autoSuggestMaxItems).setDynamicTooltip().onChange((value) => __async(this, null, function* () { + updateSettings({ autoSuggestMaxItems: value }); + yield this.plugin.saveSettings(); + })); + }); + containerEl.createEl("h4", { text: "Dialog Settings" }); + new import_obsidian10.Setting(containerEl).setName("Provide access keys in dialogs").setDesc( + "If the access keys (keyboard shortcuts) for various controls in dialog boxes conflict with system keyboard shortcuts or assistive technology functionality that is important for you, you may want to deactivate them here." + ).addToggle((toggle) => { + const settings2 = getSettings(); + toggle.setValue(settings2.provideAccessKeys).onChange((value) => __async(this, null, function* () { + updateSettings({ provideAccessKeys: value }); + yield this.plugin.saveSettings(); + })); + }); + } + addOneSettingsBlock(containerEl, heading, headingOpened) { + const detailsContainer = containerEl.createEl("details", { + cls: "tasks-nested-settings", + attr: __spreadValues({}, heading.open || headingOpened[heading.text] ? { open: true } : {}) + }); + detailsContainer.empty(); + detailsContainer.ontoggle = () => { + headingOpened[heading.text] = detailsContainer.open; + updateSettings({ headingOpened }); + this.plugin.saveSettings(); + }; + const summary = detailsContainer.createEl("summary"); + new import_obsidian10.Setting(summary).setHeading().setName(heading.text); + summary.createDiv("collapser").createDiv("handle"); + if (heading.notice !== null) { + const notice = detailsContainer.createEl("div", { + cls: heading.notice.class, + text: heading.notice.text + }); + if (heading.notice.html !== null) { + notice.insertAdjacentHTML("beforeend", heading.notice.html); + } + } + heading.settings.forEach((setting) => { + if (setting.featureFlag !== "" && !isFeatureEnabled(setting.featureFlag)) { + return; + } + if (setting.type === "checkbox") { + new import_obsidian10.Setting(detailsContainer).setName(setting.name).setDesc(setting.description).addToggle((toggle) => { + const settings2 = getSettings(); + if (!settings2.generalSettings[setting.settingName]) { + updateGeneralSetting(setting.settingName, setting.initialValue); + } + toggle.setValue(settings2.generalSettings[setting.settingName]).onChange((value) => __async(this, null, function* () { + updateGeneralSetting(setting.settingName, value); + yield this.plugin.saveSettings(); + })); + }); + } else if (setting.type === "text") { + new import_obsidian10.Setting(detailsContainer).setName(setting.name).setDesc(setting.description).addText((text2) => { + const settings2 = getSettings(); + if (!settings2.generalSettings[setting.settingName]) { + updateGeneralSetting(setting.settingName, setting.initialValue); + } + const onChange = (value) => __async(this, null, function* () { + updateGeneralSetting(setting.settingName, value); + yield this.plugin.saveSettings(); + }); + text2.setPlaceholder(setting.placeholder.toString()).setValue(settings2.generalSettings[setting.settingName].toString()).onChange((0, import_obsidian10.debounce)(onChange, 500, true)); + }); + } else if (setting.type === "textarea") { + new import_obsidian10.Setting(detailsContainer).setName(setting.name).setDesc(setting.description).addTextArea((text2) => { + const settings2 = getSettings(); + if (!settings2.generalSettings[setting.settingName]) { + updateGeneralSetting(setting.settingName, setting.initialValue); + } + const onChange = (value) => __async(this, null, function* () { + updateGeneralSetting(setting.settingName, value); + yield this.plugin.saveSettings(); + }); + text2.setPlaceholder(setting.placeholder.toString()).setValue(settings2.generalSettings[setting.settingName].toString()).onChange((0, import_obsidian10.debounce)(onChange, 500, true)); + text2.inputEl.rows = 8; + text2.inputEl.cols = 40; + }); + } else if (setting.type === "function") { + this.customFunctions[setting.settingName](detailsContainer, this); + } + if (setting.notice !== null) { + const notice = detailsContainer.createEl("p", { + cls: setting.notice.class, + text: setting.notice.text + }); + if (setting.notice.html !== null) { + notice.insertAdjacentHTML("beforeend", setting.notice.html); + } + } + }); + } + static parseCommaSeparatedFolders(input) { + return input.split(",").map((folder) => folder.trim()).map((folder) => folder.replace(/^\/|\/$/g, "")).filter((folder) => folder !== ""); + } + static renderFolderArray(folders) { + return folders.join(","); + } + insertTaskCoreStatusSettings(containerEl, settings2) { + const { statusSettings } = getSettings(); + statusSettings.coreStatuses.forEach((status_type) => { + createRowForTaskStatus( + containerEl, + status_type, + statusSettings.coreStatuses, + statusSettings, + settings2, + settings2.plugin, + true + ); + }); + } + insertCustomTaskStatusSettings(containerEl, settings2) { + const { statusSettings } = getSettings(); + statusSettings.customStatuses.forEach((status_type) => { + createRowForTaskStatus( + containerEl, + status_type, + statusSettings.customStatuses, + statusSettings, + settings2, + settings2.plugin, + false + ); + }); + containerEl.createEl("div"); + const setting = new import_obsidian10.Setting(containerEl).addButton((button) => { + button.setButtonText("Add New Task Status").setCta().onClick(() => __async(this, null, function* () { + StatusSettings.addStatus( + statusSettings.customStatuses, + new StatusConfiguration("", "", "", false, "TODO" /* TODO */) + ); + yield updateAndSaveStatusSettings(statusSettings, settings2); + })); + }); + setting.infoEl.remove(); + const themes = [ + ["AnuPpuccin Theme", anuppuccinSupportedStatuses()], + ["Ebullientworks Theme", ebullientworksSupportedStatuses()], + ["ITS Theme & SlRvb Checkboxes", itsSupportedStatuses()], + ["Minimal Theme", minimalSupportedStatuses()], + ["Things Theme", thingsSupportedStatuses()], + ["Aura Theme (Dark mode only)", auraSupportedStatuses()] + ]; + for (const [name, collection] of themes) { + const addStatusesSupportedByThisTheme = new import_obsidian10.Setting(containerEl).addButton((button) => { + const label = `${name}: Add ${collection.length} supported Statuses`; + button.setButtonText(label).onClick(() => __async(this, null, function* () { + yield addCustomStatesToSettings(collection, statusSettings, settings2); + })); + }); + addStatusesSupportedByThisTheme.infoEl.remove(); + } + const addAllUnknownStatuses = new import_obsidian10.Setting(containerEl).addButton((button) => { + button.setButtonText("Add All Unknown Status Types").setCta().onClick(() => __async(this, null, function* () { + const tasks = this.plugin.getTasks(); + const allStatuses = tasks.map((task) => { + return task.status; + }); + const unknownStatuses = StatusRegistry.getInstance().findUnknownStatuses(allStatuses); + if (unknownStatuses.length === 0) { + return; + } + unknownStatuses.forEach((s) => { + StatusSettings.addStatus(statusSettings.customStatuses, s); + }); + yield updateAndSaveStatusSettings(statusSettings, settings2); + })); + }); + addAllUnknownStatuses.infoEl.remove(); + const clearCustomStatuses = new import_obsidian10.Setting(containerEl).addButton((button) => { + button.setButtonText("Reset Custom Status Types to Defaults").setWarning().onClick(() => __async(this, null, function* () { + StatusSettings.resetAllCustomStatuses(statusSettings); + yield updateAndSaveStatusSettings(statusSettings, settings2); + })); + }); + clearCustomStatuses.infoEl.remove(); + } +}; +var SettingsTab = _SettingsTab; +SettingsTab.createFragmentWithHTML = (html) => createFragment((documentFragment) => documentFragment.createDiv().innerHTML = html); +function createRowForTaskStatus(containerEl, statusType, statuses, statusSettings, settings2, plugin, isCoreStatus) { + const taskStatusPreview = containerEl.createEl("pre"); + taskStatusPreview.addClass("row-for-status"); + taskStatusPreview.textContent = new Status(statusType).previewText(); + const setting = new import_obsidian10.Setting(containerEl); + setting.infoEl.replaceWith(taskStatusPreview); + if (!isCoreStatus) { + setting.addExtraButton((extra) => { + extra.setIcon("cross").setTooltip("Delete").onClick(() => __async(this, null, function* () { + if (StatusSettings.deleteStatus(statuses, statusType)) { + yield updateAndSaveStatusSettings(statusSettings, settings2); + } + })); + }); + } + setting.addExtraButton((extra) => { + extra.setIcon("pencil").setTooltip("Edit").onClick(() => __async(this, null, function* () { + const modal = new CustomStatusModal(plugin, statusType, isCoreStatus); + modal.onClose = () => __async(this, null, function* () { + if (modal.saved) { + if (StatusSettings.replaceStatus(statuses, statusType, modal.statusConfiguration())) { + yield updateAndSaveStatusSettings(statusSettings, settings2); + } + } + }); + modal.open(); + })); + }); + setting.infoEl.remove(); +} +function addCustomStatesToSettings(supportedStatuses, statusSettings, settings2) { + return __async(this, null, function* () { + const notices = StatusSettings.bulkAddStatusCollection(statusSettings, supportedStatuses); + notices.forEach((notice) => { + new import_obsidian10.Notice(notice); + }); + yield updateAndSaveStatusSettings(statusSettings, settings2); + }); +} +function updateAndSaveStatusSettings(statusTypes, settings2) { + return __async(this, null, function* () { + updateSettings({ + statusSettings: statusTypes + }); + StatusSettings.applyToStatusRegistry(statusTypes, StatusRegistry.getInstance()); + yield settings2.saveSettings(true); + }); +} + +// src/Suggestor/EditorSuggestorPopup.ts +var import_obsidian11 = require("obsidian"); + +// src/Suggestor/Suggestor.ts +var datePrefixCharacters = `${startDateSymbol}${scheduledDateSymbol}${dueDateSymbol}`; +function buildSuggestions(line, cursorPos, settings2) { + let suggestions = []; + suggestions = suggestions.concat(addDatesSuggestions(line, cursorPos, settings2)); + suggestions = suggestions.concat(addRecurrenceSuggestions(line, cursorPos, settings2)); + const morePossibleSuggestions = getPossibleComponentSuggestions(line, settings2); + const wordMatch = matchByPosition(line, /([a-zA-Z'_-]*)/g, cursorPos); + let addedSuggestions = false; + if (wordMatch && wordMatch.length > 0) { + const wordUnderCursor = wordMatch[0]; + if (wordUnderCursor.length >= Math.max(1, settings2.autoSuggestMinMatch)) { + const filteredSuggestions = morePossibleSuggestions.filter( + (suggestInfo) => suggestInfo.displayText.toLowerCase().includes(wordUnderCursor.toLowerCase()) + ); + for (const filtered of filteredSuggestions) { + suggestions.push({ + suggestionType: "match", + displayText: filtered.displayText, + appendText: filtered.appendText, + insertAt: wordMatch.index, + insertSkip: wordUnderCursor.length + }); + addedSuggestions = true; + } + } + } + if (!addedSuggestions && settings2.autoSuggestMinMatch === 0) + suggestions = suggestions.concat(morePossibleSuggestions); + if (suggestions.length > 0 && !suggestions.some((value) => value.suggestionType === "match")) { + suggestions.unshift({ + suggestionType: "empty", + displayText: "\u23CE", + appendText: "\n" + }); + } + suggestions = suggestions.slice(0, settings2.autoSuggestMaxItems); + return suggestions; +} +function hasPriority(line) { + if (Object.values(prioritySymbols).some((value) => value.length > 0 && line.includes(value))) + return true; +} +function getPossibleComponentSuggestions(line, _settings) { + const suggestions = []; + if (!line.includes(dueDateSymbol)) + suggestions.push({ + displayText: `${dueDateSymbol} due date`, + appendText: `${dueDateSymbol} ` + }); + if (!line.includes(startDateSymbol)) + suggestions.push({ + displayText: `${startDateSymbol} start date`, + appendText: `${startDateSymbol} ` + }); + if (!line.includes(scheduledDateSymbol)) + suggestions.push({ + displayText: `${scheduledDateSymbol} scheduled date`, + appendText: `${scheduledDateSymbol} ` + }); + if (!hasPriority(line)) { + suggestions.push({ + displayText: `${prioritySymbols.High} high priority`, + appendText: `${prioritySymbols.High} ` + }); + suggestions.push({ + displayText: `${prioritySymbols.Medium} medium priority`, + appendText: `${prioritySymbols.Medium} ` + }); + suggestions.push({ + displayText: `${prioritySymbols.Low} low priority`, + appendText: `${prioritySymbols.Low} ` + }); + } + if (!line.includes(recurrenceSymbol)) + suggestions.push({ + displayText: `${recurrenceSymbol} recurring (repeat)`, + appendText: `${recurrenceSymbol} ` + }); + return suggestions; +} +function addDatesSuggestions(line, cursorPos, settings2) { + const genericSuggestions = [ + "today", + "tomorrow", + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "next week", + "next month", + "next year" + ]; + const results = []; + const dateRegex = new RegExp(`([${datePrefixCharacters}])\\s*([0-9a-zA-Z ]*)`, "ug"); + const dateMatch = matchByPosition(line, dateRegex, cursorPos); + if (dateMatch && dateMatch.length >= 2) { + const datePrefix = dateMatch[1]; + const dateString = dateMatch[2]; + if (dateString.length < settings2.autoSuggestMinMatch) { + return []; + } + const possibleDate = dateString && dateString.length > 1 ? DateParser.parseDate(doAutocomplete(dateString), true) : null; + if (possibleDate && possibleDate.isValid()) { + results.push({ + displayText: `${possibleDate.format(TaskRegularExpressions.dateFormat)}`, + appendText: `${datePrefix} ${possibleDate.format(TaskRegularExpressions.dateFormat)} `, + insertAt: dateMatch.index, + insertSkip: dateMatch[0].length + }); + } + const minMatch = 1; + const maxGenericSuggestions = 5; + let genericMatches = genericSuggestions.filter( + (value) => dateString && dateString.length >= minMatch && value.toLowerCase().includes(dateString.toLowerCase()) + ).slice(0, maxGenericSuggestions); + if (genericMatches.length === 0) { + genericMatches = genericSuggestions.slice(0, maxGenericSuggestions); + } + for (const match of genericMatches) { + const parsedDate = DateParser.parseDate(match, true); + const formattedDate = `${parsedDate.format(TaskRegularExpressions.dateFormat)}`; + results.push({ + suggestionType: "match", + displayText: `${match} (${formattedDate})`, + appendText: `${datePrefix} ${formattedDate} `, + insertAt: dateMatch.index, + insertSkip: dateMatch[0].length + }); + } + } + return results; +} +function addRecurrenceSuggestions(line, cursorPos, settings2) { + var _a; + const genericSuggestions = [ + "every", + "every day", + "every week", + "every month", + "every month on the", + "every year", + "every week on Sunday", + "every week on Monday", + "every week on Tuesday", + "every week on Wednesday", + "every week on Thursday", + "every week on Friday", + "every week on Saturday" + ]; + const results = []; + const recurrenceRegex = new RegExp(`(${recurrenceSymbol})\\s*([0-9a-zA-Z ]*)`, "ug"); + const recurrenceMatch = matchByPosition(line, recurrenceRegex, cursorPos); + if (recurrenceMatch && recurrenceMatch.length >= 2) { + const recurrencePrefix = recurrenceMatch[1]; + const recurrenceString = recurrenceMatch[2]; + if (recurrenceString.length < settings2.autoSuggestMinMatch) + return []; + if (recurrenceString.length > 0) { + const parsedRecurrence = (_a = Recurrence.fromText({ + recurrenceRuleText: recurrenceString, + startDate: null, + scheduledDate: null, + dueDate: null + })) == null ? void 0 : _a.toText(); + if (parsedRecurrence) { + const appendedText = `${recurrencePrefix} ${parsedRecurrence} `; + results.push({ + suggestionType: "match", + displayText: `\u2705 ${parsedRecurrence}`, + appendText: appendedText, + insertAt: recurrenceMatch.index, + insertSkip: recurrenceMatch[0].length + }); + if (recurrenceMatch[0] == appendedText) + return []; + } + } + const minMatch = 1; + const maxGenericDateSuggestions = settings2.autoSuggestMaxItems / 2; + let genericMatches = genericSuggestions.filter( + (value) => recurrenceString && recurrenceString.length >= minMatch && value.toLowerCase().includes(recurrenceString.toLowerCase()) + ).slice(0, maxGenericDateSuggestions); + if (genericMatches.length === 0 && recurrenceString.trim().length === 0) { + genericMatches = genericSuggestions.slice(0, maxGenericDateSuggestions); + } + for (const match of genericMatches) { + results.push({ + suggestionType: "match", + displayText: `${match}`, + appendText: `${recurrencePrefix} ${match} `, + insertAt: recurrenceMatch.index, + insertSkip: recurrenceMatch[0].length + }); + } + } + return results; +} +function matchByPosition(s, r, position) { + const matches = s.matchAll(r); + for (const match of matches) { + if ((match == null ? void 0 : match.index) && match.index <= position && position <= match.index + match[0].length) + return match; + } + return []; +} + +// src/Suggestor/EditorSuggestorPopup.ts +var EditorSuggestor = class extends import_obsidian11.EditorSuggest { + constructor(app, settings2) { + super(app); + this.settings = settings2; + } + onTrigger(cursor, editor, _file) { + if (!this.settings.autoSuggestInEditor) + return null; + const line = editor.getLine(cursor.line); + if (line.contains(this.settings.globalFilter) && line.match(TaskRegularExpressions.taskRegex)) { + return { + start: { line: cursor.line, ch: 0 }, + end: { + line: cursor.line, + ch: line.length + }, + query: line + }; + } + return null; + } + getSuggestions(context) { + const line = context.query; + const currentCursor = context.editor.getCursor(); + const suggestions = buildSuggestions(line, currentCursor.ch, this.settings); + const suggestionsWithContext = []; + for (const suggestion of suggestions) + suggestionsWithContext.push(__spreadProps(__spreadValues({}, suggestion), { context })); + return suggestionsWithContext; + } + renderSuggestion(value, el) { + el.setText(value.displayText); + } + selectSuggestion(value, _evt) { + var _a, _b, _c; + const editor = value.context.editor; + if (value.suggestionType === "empty") { + this.close(); + const eventClone = new KeyboardEvent("keydown", { + code: "Enter", + key: "Enter" + }); + (_b = (_a = editor == null ? void 0 : editor.cm) == null ? void 0 : _a.contentDOM) == null ? void 0 : _b.dispatchEvent(eventClone); + return; + } + const currentCursor = value.context.editor.getCursor(); + const replaceFrom = { + line: currentCursor.line, + ch: (_c = value.insertAt) != null ? _c : currentCursor.ch + }; + const replaceTo = value.insertSkip ? { + line: currentCursor.line, + ch: replaceFrom.ch + value.insertSkip + } : void 0; + value.context.editor.replaceRange(value.appendText, replaceFrom, replaceTo); + value.context.editor.setCursor({ + line: currentCursor.line, + ch: replaceFrom.ch + value.appendText.length + }); + } +}; + +// src/main.ts +var TasksPlugin = class extends import_obsidian12.Plugin { + onload() { + return __async(this, null, function* () { + console.log('loading plugin "tasks"'); + yield this.loadSettings(); + this.addSettingTab(new SettingsTab({ plugin: this })); + initializeFile({ + metadataCache: this.app.metadataCache, + vault: this.app.vault + }); + yield this.loadTaskStatuses(); + const events = new TasksEvents({ obsidianEvents: this.app.workspace }); + this.cache = new Cache2({ + metadataCache: this.app.metadataCache, + vault: this.app.vault, + events + }); + this.inlineRenderer = new InlineRenderer({ plugin: this }); + this.queryRenderer = new QueryRenderer({ plugin: this, events }); + this.registerEditorExtension(newLivePreviewExtension()); + this.registerEditorSuggest(new EditorSuggestor(this.app, getSettings())); + new Commands({ plugin: this }); + }); + } + loadTaskStatuses() { + return __async(this, null, function* () { + const { statusSettings } = getSettings(); + StatusSettings.applyToStatusRegistry(statusSettings, StatusRegistry.getInstance()); + }); + } + onunload() { + var _a; + console.log('unloading plugin "tasks"'); + (_a = this.cache) == null ? void 0 : _a.unload(); + } + loadSettings() { + return __async(this, null, function* () { + const newSettings = yield this.loadData(); + updateSettings(newSettings); + yield this.loadTaskStatuses(); + }); + } + saveSettings() { + return __async(this, null, function* () { + yield this.saveData(getSettings()); + }); + } + getTasks() { + var _a; + return (_a = this.cache) == null ? void 0 : _a.getTasks(); + } +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmpzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvdXRpbHMvcGF0dGVybi50cyIsICJub2RlX21vZHVsZXMvZGF5anMvZGF5anMubWluLmpzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY2FsY3VsYXRpb24veWVhcnMudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2VuL2NvbnN0YW50cy50cyIsICJub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3F1YXJ0ZXJPZlllYXIuanMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy91dGlscy9kYXlqcy50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL3RpbWV6b25lLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvcmVzdWx0cy50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeS50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZW4vcGFyc2Vycy9FTlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOTW9udGhOYW1lUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOU2xhc2hNb250aEZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2VuL3BhcnNlcnMvRU5UaW1lRXhwcmVzc2lvblBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL3V0aWxzL3RpbWV1bml0cy50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZW4vcGFyc2Vycy9FTlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOVGltZVVuaXRMYXRlckZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9hYnN0cmFjdFJlZmluZXJzLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY29tbW9uL3JlZmluZXJzL0Fic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9yZWZpbmVycy9FTk1lcmdlRGF0ZVJhbmdlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NhbGN1bGF0aW9uL21lcmdpbmdDYWxjdWxhdGlvbi50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9yZWZpbmVycy9FTk1lcmdlRGF0ZVRpbWVSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY29tbW9uL3JlZmluZXJzL0V4dHJhY3RUaW1lem9uZUFiYnJSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY29tbW9uL3JlZmluZXJzL0V4dHJhY3RUaW1lem9uZU9mZnNldFJlZmluZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9jb21tb24vcmVmaW5lcnMvT3ZlcmxhcFJlbW92YWxSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY29tbW9uL3JlZmluZXJzL0ZvcndhcmREYXRlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9yZWZpbmVycy9Vbmxpa2VseUZvcm1hdEZpbHRlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9wYXJzZXJzL0lTT0Zvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9yZWZpbmVycy9NZXJnZVdlZWtkYXlDb21wb25lbnRSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY29uZmlndXJhdGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9jb21tb24vY2FzdWFsUmVmZXJlbmNlcy50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZW4vcGFyc2Vycy9FTkNhc3VhbERhdGVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2VuL3BhcnNlcnMvRU5DYXN1YWxUaW1lUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY2FsY3VsYXRpb24vd2Vla3MudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2VuL3BhcnNlcnMvRU5XZWVrZGF5UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOUmVsYXRpdmVEYXRlRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY2hyb25vLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY29tbW9uL3BhcnNlcnMvU2xhc2hEYXRlRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOVGltZVVuaXRDYXN1YWxSZWxhdGl2ZUZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZW4vcmVmaW5lcnMvRU5NZXJnZVJlbGF0aXZlRGF0ZVJlZmluZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2VuL2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9kZS9wYXJzZXJzL0RFVGltZUV4cHJlc3Npb25QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2RlL2NvbnN0YW50cy50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZGUvcGFyc2Vycy9ERVdlZWtkYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2RlL3BhcnNlcnMvREVTcGVjaWZpY1RpbWVFeHByZXNzaW9uUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9kZS9yZWZpbmVycy9ERU1lcmdlRGF0ZVJhbmdlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZGUvcmVmaW5lcnMvREVNZXJnZURhdGVUaW1lUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZGUvcGFyc2Vycy9ERUNhc3VhbFRpbWVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2RlL3BhcnNlcnMvREVDYXN1YWxEYXRlUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9kZS9wYXJzZXJzL0RFTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9kZS9wYXJzZXJzL0RFVGltZVVuaXRSZWxhdGl2ZUZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZGUvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2ZyL3BhcnNlcnMvRlJDYXN1YWxEYXRlUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9mci9wYXJzZXJzL0ZSQ2FzdWFsVGltZVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZnIvcGFyc2Vycy9GUlRpbWVFeHByZXNzaW9uUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9mci9yZWZpbmVycy9GUk1lcmdlRGF0ZVRpbWVSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9mci9yZWZpbmVycy9GUk1lcmdlRGF0ZVJhbmdlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZnIvY29uc3RhbnRzLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9mci9wYXJzZXJzL0ZSV2Vla2RheVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZnIvcGFyc2Vycy9GUlNwZWNpZmljVGltZUV4cHJlc3Npb25QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2ZyL3BhcnNlcnMvRlJNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2ZyL3BhcnNlcnMvRlJUaW1lVW5pdEFnb0Zvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZnIvcGFyc2Vycy9GUlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9mci9wYXJzZXJzL0ZSVGltZVVuaXRSZWxhdGl2ZUZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZnIvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2phL2NvbnN0YW50cy50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvamEvcGFyc2Vycy9KUFN0YW5kYXJkUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9qYS9yZWZpbmVycy9KUE1lcmdlRGF0ZVJhbmdlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvamEvcGFyc2Vycy9KUENhc3VhbERhdGVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2phL2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9wdC9jb25zdGFudHMudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3B0L3BhcnNlcnMvUFRXZWVrZGF5UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9wdC9wYXJzZXJzL1BUVGltZUV4cHJlc3Npb25QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3B0L3JlZmluZXJzL1BUTWVyZ2VEYXRlVGltZVJlZmluZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3B0L3JlZmluZXJzL1BUTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9wdC9wYXJzZXJzL1BUTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9wdC9wYXJzZXJzL1BUQ2FzdWFsRGF0ZVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcHQvcGFyc2Vycy9QVENhc3VhbFRpbWVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3B0L2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9ubC9yZWZpbmVycy9OTE1lcmdlRGF0ZVJhbmdlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvbmwvcmVmaW5lcnMvTkxNZXJnZURhdGVUaW1lUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvbmwvcGFyc2Vycy9OTENhc3VhbERhdGVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxDYXN1YWxUaW1lUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9ubC9jb25zdGFudHMudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxUaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvbmwvcGFyc2Vycy9OTFdlZWtkYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxNb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxNb250aE5hbWVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxTbGFzaE1vbnRoRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9ubC9wYXJzZXJzL05MVGltZUV4cHJlc3Npb25QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxDYXN1YWxZZWFyTW9udGhEYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxDYXN1YWxEYXRlVGltZVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvbmwvcGFyc2Vycy9OTFRpbWVVbml0Q2FzdWFsUmVsYXRpdmVGb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxSZWxhdGl2ZURhdGVGb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxUaW1lVW5pdEFnb0Zvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvbmwvcGFyc2Vycy9OTFRpbWVVbml0TGF0ZXJGb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW50L3BhcnNlcnMvWkhIYW50Q2FzdWFsRGF0ZVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvemgvaGFudC9jb25zdGFudHMudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnQvcGFyc2Vycy9aSEhhbnREYXRlUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW50L3BhcnNlcnMvWkhIYW50RGVhZGxpbmVGb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnQvcGFyc2Vycy9aSEhhbnRSZWxhdGlvbldlZWtkYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnQvcGFyc2Vycy9aSEhhbnRUaW1lRXhwcmVzc2lvblBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvemgvaGFudC9wYXJzZXJzL1pISGFudFdlZWtkYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnQvcmVmaW5lcnMvWkhIYW50TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW50L3JlZmluZXJzL1pISGFudE1lcmdlRGF0ZVRpbWVSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW50L2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW5zL3BhcnNlcnMvWkhIYW5zQ2FzdWFsRGF0ZVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvemgvaGFucy9jb25zdGFudHMudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnMvcGFyc2Vycy9aSEhhbnNEYXRlUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW5zL3BhcnNlcnMvWkhIYW5zRGVhZGxpbmVGb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnMvcGFyc2Vycy9aSEhhbnNSZWxhdGlvbldlZWtkYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnMvcGFyc2Vycy9aSEhhbnNUaW1lRXhwcmVzc2lvblBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvemgvaGFucy9wYXJzZXJzL1pISGFuc1dlZWtkYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnMvcmVmaW5lcnMvWkhIYW5zTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW5zL3JlZmluZXJzL1pISGFuc01lcmdlRGF0ZVRpbWVSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW5zL2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9pbmRleC50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcnUvY29uc3RhbnRzLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9ydS9wYXJzZXJzL1JVVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3J1L3BhcnNlcnMvUlVNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3J1L3BhcnNlcnMvUlVNb250aE5hbWVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3J1L3BhcnNlcnMvUlVUaW1lRXhwcmVzc2lvblBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcnUvcGFyc2Vycy9SVVRpbWVVbml0QWdvRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9ydS9yZWZpbmVycy9SVU1lcmdlRGF0ZVJhbmdlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcnUvcmVmaW5lcnMvUlVNZXJnZURhdGVUaW1lUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcnUvcGFyc2Vycy9SVUNhc3VhbERhdGVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3J1L3BhcnNlcnMvUlVDYXN1YWxUaW1lUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9ydS9wYXJzZXJzL1JVV2Vla2RheVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcnUvcGFyc2Vycy9SVVJlbGF0aXZlRGF0ZUZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcnUvcGFyc2Vycy9SVVRpbWVVbml0Q2FzdWFsUmVsYXRpdmVGb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3J1L2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL2Jvb24tanMvbGliL3R5cGVzLmpzIiwgIm5vZGVfbW9kdWxlcy9ib29uLWpzL2xpYi9wYXJzZS9jb25zdC5qcyIsICJub2RlX21vZHVsZXMvYm9vbi1qcy9saWIvbGV4L2NvbnN0LmpzIiwgIm5vZGVfbW9kdWxlcy9ib29uLWpzL2xpYi9sZXgvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL2Jvb24tanMvbGliL2xleC9sZXguanMiLCAibm9kZV9tb2R1bGVzL2Jvb24tanMvbGliL3BhcnNlL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9ib29uLWpzL2xpYi9wYXJzZS9wYXJzZS5qcyIsICJub2RlX21vZHVsZXMvYm9vbi1qcy9saWIvZXZhbHVhdGUvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL2Jvb24tanMvbGliL2V2YWx1YXRlL2NvbnN0LmpzIiwgIm5vZGVfbW9kdWxlcy9ib29uLWpzL2xpYi9ldmFsdWF0ZS9ldmFsdWF0ZS5qcyIsICJub2RlX21vZHVsZXMvYm9vbi1qcy9saWIvaW5kZXguanMiLCAic3JjL21haW4udHMiLCAic3JjL0NhY2hlLnRzIiwgIm5vZGVfbW9kdWxlcy9hc3luYy1tdXRleC9pbmRleC5tanMiLCAic3JjL1Rhc2tMYXlvdXQudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy93ZWVrZGF5LnRzIiwgIm5vZGVfbW9kdWxlcy9ycnVsZS9zcmMvaGVscGVycy50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL2RhdGV1dGlsLnRzIiwgIm5vZGVfbW9kdWxlcy9ycnVsZS9zcmMvaXRlcnJlc3VsdC50cyIsICJub2RlX21vZHVsZXMvdHNsaWIvbW9kdWxlcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL2NhbGxiYWNraXRlcnJlc3VsdC50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL25scC9pMThuLnRzIiwgIm5vZGVfbW9kdWxlcy9ycnVsZS9zcmMvbmxwL3RvdGV4dC50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL25scC9wYXJzZXRleHQudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy90eXBlcy50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL25scC9pbmRleC50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL2RhdGV0aW1lLnRzIiwgIm5vZGVfbW9kdWxlcy9ycnVsZS9zcmMvcGFyc2VvcHRpb25zLnRzIiwgIm5vZGVfbW9kdWxlcy9ycnVsZS9zcmMvcGFyc2VzdHJpbmcudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9kYXRld2l0aHpvbmUudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9vcHRpb25zdG9zdHJpbmcudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9jYWNoZS50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL21hc2tzLnRzIiwgIm5vZGVfbW9kdWxlcy9ycnVsZS9zcmMvaXRlcmluZm8veWVhcmluZm8udHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9pdGVyaW5mby9tb250aGluZm8udHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9pdGVyaW5mby9lYXN0ZXIudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9pdGVyaW5mby9pbmRleC50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL2l0ZXIvcG9zbGlzdC50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL2l0ZXIvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9ycnVsZS50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL2l0ZXJzZXQudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9ycnVsZXN0ci50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL3JydWxlc2V0LnRzIiwgInNyYy9saWIvRGF0ZVRvb2xzLnRzIiwgInNyYy9SZWN1cnJlbmNlLnRzIiwgInNyYy9TdGF0dXNDb25maWd1cmF0aW9uLnRzIiwgInNyYy9TdGF0dXMudHMiLCAic3JjL0NvbmZpZy9TdGF0dXNTZXR0aW5ncy50cyIsICJzcmMvQ29uZmlnL0ZlYXR1cmUudHMiLCAic3JjL0NvbmZpZy9TZXR0aW5ncy50cyIsICJzcmMvU3RhdHVzUmVnaXN0cnkudHMiLCAic3JjL1VyZ2VuY3kudHMiLCAic3JjL1Rhc2tMaW5lUmVuZGVyZXIudHMiLCAic3JjL0ZpbGUudHMiLCAic3JjL0RhdGVGYWxsYmFjay50cyIsICJzcmMvbGliL1JlZ0V4cFRvb2xzLnRzIiwgInNyYy9UYXNrLnRzIiwgInNyYy9saWIvTGF6eS50cyIsICJzcmMvQ29tbWFuZHMvQ3JlYXRlT3JFZGl0LnRzIiwgInNyYy9UYXNrTW9kYWwudHMiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS9pbnRlcm5hbC9pbmRleC5tanMiLCAic3JjL3VpL0VkaXRUYXNrLnN2ZWx0ZSIsICJzcmMvRGF0ZUFiYnJldmlhdGlvbnMudHMiLCAic3JjL0NvbW1hbmRzL0NyZWF0ZU9yRWRpdFRhc2tQYXJzZXIudHMiLCAic3JjL0NvbW1hbmRzL1RvZ2dsZURvbmUudHMiLCAic3JjL0NvbW1hbmRzL2luZGV4LnRzIiwgInNyYy9UYXNrc0V2ZW50cy50cyIsICJzcmMvSW5saW5lUmVuZGVyZXIudHMiLCAic3JjL0xpdmVQcmV2aWV3RXh0ZW5zaW9uLnRzIiwgInNyYy9RdWVyeVJlbmRlcmVyLnRzIiwgInNyYy9RdWVyeS9Tb3J0ZXIudHMiLCAic3JjL1F1ZXJ5L0dyb3VwZXIudHMiLCAic3JjL1F1ZXJ5L0ZpbHRlci9GaWVsZC50cyIsICJzcmMvUXVlcnkvRXhwbGFpbi9FeHBsYW5hdGlvbi50cyIsICJzcmMvUXVlcnkvRmlsdGVyL0ZpbHRlci50cyIsICJzcmMvUXVlcnkvRmlsdGVyL0ZpbHRlckluc3RydWN0aW9uLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvRmlsdGVySW5zdHJ1Y3Rpb25zLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvRmlsdGVySW5zdHJ1Y3Rpb25zQmFzZWRGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1N0YXR1c0ZpZWxkLnRzIiwgInNyYy9RdWVyeS9EYXRlUGFyc2VyLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvRGF0ZUZpZWxkLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvRHVlRGF0ZUZpZWxkLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvUHJpb3JpdHlGaWVsZC50cyIsICJzcmMvUXVlcnkvTWF0Y2hlcnMvSVN0cmluZ01hdGNoZXIudHMiLCAic3JjL1F1ZXJ5L01hdGNoZXJzL1N1YnN0cmluZ01hdGNoZXIudHMiLCAic3JjL1F1ZXJ5L01hdGNoZXJzL1JlZ2V4TWF0Y2hlci50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1RleHRGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1BhdGhGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1VyZ2VuY3lGaWVsZC50cyIsICJzcmMvUXVlcnkvU29ydC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL0Rlc2NyaXB0aW9uRmllbGQudHMiLCAic3JjL1F1ZXJ5L0ZpbHRlci9Eb25lRGF0ZUZpZWxkLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvRXhjbHVkZVN1Ykl0ZW1zRmllbGQudHMiLCAic3JjL1F1ZXJ5L0ZpbHRlci9IZWFkaW5nRmllbGQudHMiLCAic3JjL1F1ZXJ5L0ZpbHRlci9TY2hlZHVsZWREYXRlRmllbGQudHMiLCAic3JjL1F1ZXJ5L0ZpbHRlci9TdGFydERhdGVGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL0hhcHBlbnNEYXRlRmllbGQudHMiLCAic3JjL1F1ZXJ5L0ZpbHRlci9SZWN1cnJpbmdGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL011bHRpVGV4dEZpZWxkLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvVGFnc0ZpZWxkLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvQm9vbGVhbkZpZWxkLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvRmlsZW5hbWVGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1N0YXR1c05hbWVGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1N0YXR1c1R5cGVGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1JlY3VycmVuY2VGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyUGFyc2VyLnRzIiwgInNyYy9RdWVyeS9Hcm91cEhlYWRpbmcudHMiLCAic3JjL1F1ZXJ5L0dyb3VwSGVhZGluZ3MudHMiLCAic3JjL1F1ZXJ5L0dyb3VwaW5nVHJlZU5vZGUudHMiLCAic3JjL1F1ZXJ5L0ludGVybWVkaWF0ZVRhc2tHcm91cHMudHMiLCAic3JjL1F1ZXJ5L1Rhc2tHcm91cC50cyIsICJzcmMvUXVlcnkvVGFza0dyb3Vwcy50cyIsICJzcmMvUXVlcnkvR3JvdXAudHMiLCAic3JjL1F1ZXJ5L1F1ZXJ5LnRzIiwgInNyYy9Db25maWcvU2V0dGluZ3NUYWIudHMiLCAic3JjL0NvbmZpZy9UaGVtZXMvQW51UHB1Y2NpblRoZW1lQ29sbGVjdGlvbi50cyIsICJzcmMvQ29uZmlnL1RoZW1lcy9BdXJhVGhlbWVDb2xsZWN0aW9uLnRzIiwgInNyYy9Db25maWcvVGhlbWVzL0VidWxsaWVudHdvcmtzVGhlbWVDb2xsZWN0aW9uLnRzIiwgInNyYy9Db25maWcvVGhlbWVzL0lUU1RoZW1lQ29sbGVjdGlvbi50cyIsICJzcmMvQ29uZmlnL1RoZW1lcy9NaW5pbWFsVGhlbWVDb2xsZWN0aW9uLnRzIiwgInNyYy9Db25maWcvVGhlbWVzL1RoaW5nc1RoZW1lQ29sbGVjdGlvbi50cyIsICJzcmMvQ29uZmlnL0N1c3RvbVN0YXR1c01vZGFsLnRzIiwgInNyYy9TdGF0dXNWYWxpZGF0b3IudHMiLCAic3JjL1N1Z2dlc3Rvci9FZGl0b3JTdWdnZXN0b3JQb3B1cC50cyIsICJzcmMvU3VnZ2VzdG9yL1N1Z2dlc3Rvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBnbG9iYWwsIGRlZmluZSwgU3lzdGVtLCBSZWZsZWN0LCBQcm9taXNlICovXHJcbnZhciBfX2V4dGVuZHM7XHJcbnZhciBfX2Fzc2lnbjtcclxudmFyIF9fcmVzdDtcclxudmFyIF9fZGVjb3JhdGU7XHJcbnZhciBfX3BhcmFtO1xyXG52YXIgX19tZXRhZGF0YTtcclxudmFyIF9fYXdhaXRlcjtcclxudmFyIF9fZ2VuZXJhdG9yO1xyXG52YXIgX19leHBvcnRTdGFyO1xyXG52YXIgX192YWx1ZXM7XHJcbnZhciBfX3JlYWQ7XHJcbnZhciBfX3NwcmVhZDtcclxudmFyIF9fc3ByZWFkQXJyYXlzO1xyXG52YXIgX19zcHJlYWRBcnJheTtcclxudmFyIF9fYXdhaXQ7XHJcbnZhciBfX2FzeW5jR2VuZXJhdG9yO1xyXG52YXIgX19hc3luY0RlbGVnYXRvcjtcclxudmFyIF9fYXN5bmNWYWx1ZXM7XHJcbnZhciBfX21ha2VUZW1wbGF0ZU9iamVjdDtcclxudmFyIF9faW1wb3J0U3RhcjtcclxudmFyIF9faW1wb3J0RGVmYXVsdDtcclxudmFyIF9fY2xhc3NQcml2YXRlRmllbGRHZXQ7XHJcbnZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0O1xyXG52YXIgX19jbGFzc1ByaXZhdGVGaWVsZEluO1xyXG52YXIgX19jcmVhdGVCaW5kaW5nO1xyXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcclxuICAgIHZhciByb290ID0gdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6IHR5cGVvZiB0aGlzID09PSBcIm9iamVjdFwiID8gdGhpcyA6IHt9O1xyXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAgICAgZGVmaW5lKFwidHNsaWJcIiwgW1wiZXhwb3J0c1wiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsgZmFjdG9yeShjcmVhdGVFeHBvcnRlcihyb290LCBjcmVhdGVFeHBvcnRlcihleHBvcnRzKSkpOyB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgZmFjdG9yeShjcmVhdGVFeHBvcnRlcihyb290LCBjcmVhdGVFeHBvcnRlcihtb2R1bGUuZXhwb3J0cykpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGZhY3RvcnkoY3JlYXRlRXhwb3J0ZXIocm9vdCkpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gY3JlYXRlRXhwb3J0ZXIoZXhwb3J0cywgcHJldmlvdXMpIHtcclxuICAgICAgICBpZiAoZXhwb3J0cyAhPT0gcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGlkLCB2KSB7IHJldHVybiBleHBvcnRzW2lkXSA9IHByZXZpb3VzID8gcHJldmlvdXMoaWQsIHYpIDogdjsgfTtcclxuICAgIH1cclxufSlcclxuKGZ1bmN0aW9uIChleHBvcnRlcikge1xyXG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuXHJcbiAgICBfX2V4dGVuZHMgPSBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxuICAgIH07XHJcblxyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3Jlc3QgPSBmdW5jdGlvbiAocywgZSkge1xyXG4gICAgICAgIHZhciB0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fZGVjb3JhdGUgPSBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgICAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICAgICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgICAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3BhcmFtID0gZnVuY3Rpb24gKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX21ldGFkYXRhID0gZnVuY3Rpb24gKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxuICAgIH07XHJcblxyXG4gICAgX19hd2FpdGVyID0gZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fZ2VuZXJhdG9yID0gZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgICAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgX19leHBvcnRTdGFyID0gZnVuY3Rpb24obSwgbykge1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxuICAgIH07XHJcblxyXG4gICAgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbiAgICB9KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICAgICAgb1trMl0gPSBtW2tdO1xyXG4gICAgfSk7XHJcblxyXG4gICAgX192YWx1ZXMgPSBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICAgICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICAgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fcmVhZCA9IGZ1bmN0aW9uIChvLCBuKSB7XHJcbiAgICAgICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICAgICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkICovXHJcbiAgICBfX3NwcmVhZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkICovXHJcbiAgICBfX3NwcmVhZEFycmF5cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgICAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICAgICAgcmV0dXJuIHI7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fc3ByZWFkQXJyYXkgPSBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcclxuICAgICAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2F3YWl0ID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxuICAgIH07XHJcblxyXG4gICAgX19hc3luY0dlbmVyYXRvciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICAgICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7ICB9XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgICAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXN5bmNEZWxlZ2F0b3IgPSBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBpLCBwO1xyXG4gICAgICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICAgICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX2FzeW5jVmFsdWVzID0gZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICAgICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgICAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0ID0gZnVuY3Rpb24gKGNvb2tlZCwgcmF3KSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgICAgICByZXR1cm4gY29va2VkO1xyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG4gICAgfSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICAgICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2ltcG9ydFN0YXIgPSBmdW5jdGlvbiAobW9kKSB7XHJcbiAgICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgICAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICAgICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcblxyXG4gICAgX19pbXBvcnREZWZhdWx0ID0gZnVuY3Rpb24gKG1vZCkge1xyXG4gICAgICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0ID0gZnVuY3Rpb24gKHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgICAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgICAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0ID0gZnVuY3Rpb24gKHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICAgICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRJbiA9IGZ1bmN0aW9uIChzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgICAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBleHBvcnRlcihcIl9fZXh0ZW5kc1wiLCBfX2V4dGVuZHMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2Fzc2lnblwiLCBfX2Fzc2lnbik7XHJcbiAgICBleHBvcnRlcihcIl9fcmVzdFwiLCBfX3Jlc3QpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2RlY29yYXRlXCIsIF9fZGVjb3JhdGUpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3BhcmFtXCIsIF9fcGFyYW0pO1xyXG4gICAgZXhwb3J0ZXIoXCJfX21ldGFkYXRhXCIsIF9fbWV0YWRhdGEpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2F3YWl0ZXJcIiwgX19hd2FpdGVyKTtcclxuICAgIGV4cG9ydGVyKFwiX19nZW5lcmF0b3JcIiwgX19nZW5lcmF0b3IpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2V4cG9ydFN0YXJcIiwgX19leHBvcnRTdGFyKTtcclxuICAgIGV4cG9ydGVyKFwiX19jcmVhdGVCaW5kaW5nXCIsIF9fY3JlYXRlQmluZGluZyk7XHJcbiAgICBleHBvcnRlcihcIl9fdmFsdWVzXCIsIF9fdmFsdWVzKTtcclxuICAgIGV4cG9ydGVyKFwiX19yZWFkXCIsIF9fcmVhZCk7XHJcbiAgICBleHBvcnRlcihcIl9fc3ByZWFkXCIsIF9fc3ByZWFkKTtcclxuICAgIGV4cG9ydGVyKFwiX19zcHJlYWRBcnJheXNcIiwgX19zcHJlYWRBcnJheXMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3NwcmVhZEFycmF5XCIsIF9fc3ByZWFkQXJyYXkpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2F3YWl0XCIsIF9fYXdhaXQpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2FzeW5jR2VuZXJhdG9yXCIsIF9fYXN5bmNHZW5lcmF0b3IpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2FzeW5jRGVsZWdhdG9yXCIsIF9fYXN5bmNEZWxlZ2F0b3IpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2FzeW5jVmFsdWVzXCIsIF9fYXN5bmNWYWx1ZXMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX21ha2VUZW1wbGF0ZU9iamVjdFwiLCBfX21ha2VUZW1wbGF0ZU9iamVjdCk7XHJcbiAgICBleHBvcnRlcihcIl9faW1wb3J0U3RhclwiLCBfX2ltcG9ydFN0YXIpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2ltcG9ydERlZmF1bHRcIiwgX19pbXBvcnREZWZhdWx0KTtcclxuICAgIGV4cG9ydGVyKFwiX19jbGFzc1ByaXZhdGVGaWVsZEdldFwiLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KTtcclxuICAgIGV4cG9ydGVyKFwiX19jbGFzc1ByaXZhdGVGaWVsZFNldFwiLCBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KTtcclxuICAgIGV4cG9ydGVyKFwiX19jbGFzc1ByaXZhdGVGaWVsZEluXCIsIF9fY2xhc3NQcml2YXRlRmllbGRJbik7XHJcbn0pO1xyXG4iLCBudWxsLCAiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KHQ9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczp0fHxzZWxmKS5kYXlqcz1lKCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9MWUzLGU9NmU0LG49MzZlNSxyPVwibWlsbGlzZWNvbmRcIixpPVwic2Vjb25kXCIscz1cIm1pbnV0ZVwiLHU9XCJob3VyXCIsYT1cImRheVwiLG89XCJ3ZWVrXCIsZj1cIm1vbnRoXCIsaD1cInF1YXJ0ZXJcIixjPVwieWVhclwiLGQ9XCJkYXRlXCIsJD1cIkludmFsaWQgRGF0ZVwiLGw9L14oXFxkezR9KVstL10/KFxcZHsxLDJ9KT9bLS9dPyhcXGR7MCwyfSlbVHRcXHNdKihcXGR7MSwyfSk/Oj8oXFxkezEsMn0pPzo/KFxcZHsxLDJ9KT9bLjpdPyhcXGQrKT8kLyx5PS9cXFsoW15cXF1dKyldfFl7MSw0fXxNezEsNH18RHsxLDJ9fGR7MSw0fXxIezEsMn18aHsxLDJ9fGF8QXxtezEsMn18c3sxLDJ9fFp7MSwyfXxTU1MvZyxNPXtuYW1lOlwiZW5cIix3ZWVrZGF5czpcIlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5XCIuc3BsaXQoXCJfXCIpLG1vbnRoczpcIkphbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXJcIi5zcGxpdChcIl9cIil9LG09ZnVuY3Rpb24odCxlLG4pe3ZhciByPVN0cmluZyh0KTtyZXR1cm4hcnx8ci5sZW5ndGg+PWU/dDpcIlwiK0FycmF5KGUrMS1yLmxlbmd0aCkuam9pbihuKSt0fSxnPXtzOm0sejpmdW5jdGlvbih0KXt2YXIgZT0tdC51dGNPZmZzZXQoKSxuPU1hdGguYWJzKGUpLHI9TWF0aC5mbG9vcihuLzYwKSxpPW4lNjA7cmV0dXJuKGU8PTA/XCIrXCI6XCItXCIpK20ociwyLFwiMFwiKStcIjpcIittKGksMixcIjBcIil9LG06ZnVuY3Rpb24gdChlLG4pe2lmKGUuZGF0ZSgpPG4uZGF0ZSgpKXJldHVybi10KG4sZSk7dmFyIHI9MTIqKG4ueWVhcigpLWUueWVhcigpKSsobi5tb250aCgpLWUubW9udGgoKSksaT1lLmNsb25lKCkuYWRkKHIsZikscz1uLWk8MCx1PWUuY2xvbmUoKS5hZGQocisocz8tMToxKSxmKTtyZXR1cm4rKC0ocisobi1pKS8ocz9pLXU6dS1pKSl8fDApfSxhOmZ1bmN0aW9uKHQpe3JldHVybiB0PDA/TWF0aC5jZWlsKHQpfHwwOk1hdGguZmxvb3IodCl9LHA6ZnVuY3Rpb24odCl7cmV0dXJue006Zix5OmMsdzpvLGQ6YSxEOmQsaDp1LG06cyxzOmksbXM6cixROmh9W3RdfHxTdHJpbmcodHx8XCJcIikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9zJC8sXCJcIil9LHU6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR9fSxEPVwiZW5cIix2PXt9O3ZbRF09TTt2YXIgcD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIF99LFM9ZnVuY3Rpb24odCxlLG4pe3ZhciByO2lmKCF0KXJldHVybiBEO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXZbdF0mJihyPXQpLGUmJih2W3RdPWUscj10KTtlbHNle3ZhciBpPXQubmFtZTt2W2ldPXQscj1pfXJldHVybiFuJiZyJiYoRD1yKSxyfHwhbiYmRH0sdz1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHQuY2xvbmUoKTt2YXIgbj1cIm9iamVjdFwiPT10eXBlb2YgZT9lOnt9O3JldHVybiBuLmRhdGU9dCxuLmFyZ3M9YXJndW1lbnRzLG5ldyBfKG4pfSxPPWc7Ty5sPVMsTy5pPXAsTy53PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHcodCx7bG9jYWxlOmUuJEwsdXRjOmUuJHUseDplLiR4LCRvZmZzZXQ6ZS4kb2Zmc2V0fSl9O3ZhciBfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gTSh0KXt0aGlzLiRMPVModC5sb2NhbGUsbnVsbCwhMCksdGhpcy5wYXJzZSh0KX12YXIgbT1NLnByb3RvdHlwZTtyZXR1cm4gbS5wYXJzZT1mdW5jdGlvbih0KXt0aGlzLiRkPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZGF0ZSxuPXQudXRjO2lmKG51bGw9PT1lKXJldHVybiBuZXcgRGF0ZShOYU4pO2lmKE8udShlKSlyZXR1cm4gbmV3IERhdGU7aWYoZSBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIG5ldyBEYXRlKGUpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlJiYhL1okL2kudGVzdChlKSl7dmFyIHI9ZS5tYXRjaChsKTtpZihyKXt2YXIgaT1yWzJdLTF8fDAscz0ocls3XXx8XCIwXCIpLnN1YnN0cmluZygwLDMpO3JldHVybiBuP25ldyBEYXRlKERhdGUuVVRDKHJbMV0saSxyWzNdfHwxLHJbNF18fDAscls1XXx8MCxyWzZdfHwwLHMpKTpuZXcgRGF0ZShyWzFdLGksclszXXx8MSxyWzRdfHwwLHJbNV18fDAscls2XXx8MCxzKX19cmV0dXJuIG5ldyBEYXRlKGUpfSh0KSx0aGlzLiR4PXQueHx8e30sdGhpcy5pbml0KCl9LG0uaW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuJGQ7dGhpcy4keT10LmdldEZ1bGxZZWFyKCksdGhpcy4kTT10LmdldE1vbnRoKCksdGhpcy4kRD10LmdldERhdGUoKSx0aGlzLiRXPXQuZ2V0RGF5KCksdGhpcy4kSD10LmdldEhvdXJzKCksdGhpcy4kbT10LmdldE1pbnV0ZXMoKSx0aGlzLiRzPXQuZ2V0U2Vjb25kcygpLHRoaXMuJG1zPXQuZ2V0TWlsbGlzZWNvbmRzKCl9LG0uJHV0aWxzPWZ1bmN0aW9uKCl7cmV0dXJuIE99LG0uaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiEodGhpcy4kZC50b1N0cmluZygpPT09JCl9LG0uaXNTYW1lPWZ1bmN0aW9uKHQsZSl7dmFyIG49dyh0KTtyZXR1cm4gdGhpcy5zdGFydE9mKGUpPD1uJiZuPD10aGlzLmVuZE9mKGUpfSxtLmlzQWZ0ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdyh0KTx0aGlzLnN0YXJ0T2YoZSl9LG0uaXNCZWZvcmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lbmRPZihlKTx3KHQpfSxtLiRnPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTy51KHQpP3RoaXNbZV06dGhpcy5zZXQobix0KX0sbS51bml4PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZmxvb3IodGhpcy52YWx1ZU9mKCkvMWUzKX0sbS52YWx1ZU9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQuZ2V0VGltZSgpfSxtLnN0YXJ0T2Y9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ISFPLnUoZSl8fGUsaD1PLnAodCksJD1mdW5jdGlvbih0LGUpe3ZhciBpPU8udyhuLiR1P0RhdGUuVVRDKG4uJHksZSx0KTpuZXcgRGF0ZShuLiR5LGUsdCksbik7cmV0dXJuIHI/aTppLmVuZE9mKGEpfSxsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE8udyhuLnRvRGF0ZSgpW3RdLmFwcGx5KG4udG9EYXRlKFwic1wiKSwocj9bMCwwLDAsMF06WzIzLDU5LDU5LDk5OV0pLnNsaWNlKGUpKSxuKX0seT10aGlzLiRXLE09dGhpcy4kTSxtPXRoaXMuJEQsZz1cInNldFwiKyh0aGlzLiR1P1wiVVRDXCI6XCJcIik7c3dpdGNoKGgpe2Nhc2UgYzpyZXR1cm4gcj8kKDEsMCk6JCgzMSwxMSk7Y2FzZSBmOnJldHVybiByPyQoMSxNKTokKDAsTSsxKTtjYXNlIG86dmFyIEQ9dGhpcy4kbG9jYWxlKCkud2Vla1N0YXJ0fHwwLHY9KHk8RD95Kzc6eSktRDtyZXR1cm4gJChyP20tdjptKyg2LXYpLE0pO2Nhc2UgYTpjYXNlIGQ6cmV0dXJuIGwoZytcIkhvdXJzXCIsMCk7Y2FzZSB1OnJldHVybiBsKGcrXCJNaW51dGVzXCIsMSk7Y2FzZSBzOnJldHVybiBsKGcrXCJTZWNvbmRzXCIsMik7Y2FzZSBpOnJldHVybiBsKGcrXCJNaWxsaXNlY29uZHNcIiwzKTtkZWZhdWx0OnJldHVybiB0aGlzLmNsb25lKCl9fSxtLmVuZE9mPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0YXJ0T2YodCwhMSl9LG0uJHNldD1mdW5jdGlvbih0LGUpe3ZhciBuLG89Ty5wKHQpLGg9XCJzZXRcIisodGhpcy4kdT9cIlVUQ1wiOlwiXCIpLCQ9KG49e30sblthXT1oK1wiRGF0ZVwiLG5bZF09aCtcIkRhdGVcIixuW2ZdPWgrXCJNb250aFwiLG5bY109aCtcIkZ1bGxZZWFyXCIsblt1XT1oK1wiSG91cnNcIixuW3NdPWgrXCJNaW51dGVzXCIsbltpXT1oK1wiU2Vjb25kc1wiLG5bcl09aCtcIk1pbGxpc2Vjb25kc1wiLG4pW29dLGw9bz09PWE/dGhpcy4kRCsoZS10aGlzLiRXKTplO2lmKG89PT1mfHxvPT09Yyl7dmFyIHk9dGhpcy5jbG9uZSgpLnNldChkLDEpO3kuJGRbJF0obCkseS5pbml0KCksdGhpcy4kZD15LnNldChkLE1hdGgubWluKHRoaXMuJEQseS5kYXlzSW5Nb250aCgpKSkuJGR9ZWxzZSAkJiZ0aGlzLiRkWyRdKGwpO3JldHVybiB0aGlzLmluaXQoKSx0aGlzfSxtLnNldD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNsb25lKCkuJHNldCh0LGUpfSxtLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpc1tPLnAodCldKCl9LG0uYWRkPWZ1bmN0aW9uKHIsaCl7dmFyIGQsJD10aGlzO3I9TnVtYmVyKHIpO3ZhciBsPU8ucChoKSx5PWZ1bmN0aW9uKHQpe3ZhciBlPXcoJCk7cmV0dXJuIE8udyhlLmRhdGUoZS5kYXRlKCkrTWF0aC5yb3VuZCh0KnIpKSwkKX07aWYobD09PWYpcmV0dXJuIHRoaXMuc2V0KGYsdGhpcy4kTStyKTtpZihsPT09YylyZXR1cm4gdGhpcy5zZXQoYyx0aGlzLiR5K3IpO2lmKGw9PT1hKXJldHVybiB5KDEpO2lmKGw9PT1vKXJldHVybiB5KDcpO3ZhciBNPShkPXt9LGRbc109ZSxkW3VdPW4sZFtpXT10LGQpW2xdfHwxLG09dGhpcy4kZC5nZXRUaW1lKCkrcipNO3JldHVybiBPLncobSx0aGlzKX0sbS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFkZCgtMSp0LGUpfSxtLmZvcm1hdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy4kbG9jYWxlKCk7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBuLmludmFsaWREYXRlfHwkO3ZhciByPXR8fFwiWVlZWS1NTS1ERFRISDptbTpzc1pcIixpPU8ueih0aGlzKSxzPXRoaXMuJEgsdT10aGlzLiRtLGE9dGhpcy4kTSxvPW4ud2Vla2RheXMsZj1uLm1vbnRocyxoPWZ1bmN0aW9uKHQsbixpLHMpe3JldHVybiB0JiYodFtuXXx8dChlLHIpKXx8aVtuXS5zdWJzdHIoMCxzKX0sYz1mdW5jdGlvbih0KXtyZXR1cm4gTy5zKHMlMTJ8fDEyLHQsXCIwXCIpfSxkPW4ubWVyaWRpZW18fGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10PDEyP1wiQU1cIjpcIlBNXCI7cmV0dXJuIG4/ci50b0xvd2VyQ2FzZSgpOnJ9LGw9e1lZOlN0cmluZyh0aGlzLiR5KS5zbGljZSgtMiksWVlZWTp0aGlzLiR5LE06YSsxLE1NOk8ucyhhKzEsMixcIjBcIiksTU1NOmgobi5tb250aHNTaG9ydCxhLGYsMyksTU1NTTpoKGYsYSksRDp0aGlzLiRELEREOk8ucyh0aGlzLiRELDIsXCIwXCIpLGQ6U3RyaW5nKHRoaXMuJFcpLGRkOmgobi53ZWVrZGF5c01pbix0aGlzLiRXLG8sMiksZGRkOmgobi53ZWVrZGF5c1Nob3J0LHRoaXMuJFcsbywzKSxkZGRkOm9bdGhpcy4kV10sSDpTdHJpbmcocyksSEg6Ty5zKHMsMixcIjBcIiksaDpjKDEpLGhoOmMoMiksYTpkKHMsdSwhMCksQTpkKHMsdSwhMSksbTpTdHJpbmcodSksbW06Ty5zKHUsMixcIjBcIiksczpTdHJpbmcodGhpcy4kcyksc3M6Ty5zKHRoaXMuJHMsMixcIjBcIiksU1NTOk8ucyh0aGlzLiRtcywzLFwiMFwiKSxaOml9O3JldHVybiByLnJlcGxhY2UoeSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8bFt0XXx8aS5yZXBsYWNlKFwiOlwiLFwiXCIpfSkpfSxtLnV0Y09mZnNldD1mdW5jdGlvbigpe3JldHVybiAxNSotTWF0aC5yb3VuZCh0aGlzLiRkLmdldFRpbWV6b25lT2Zmc2V0KCkvMTUpfSxtLmRpZmY9ZnVuY3Rpb24ocixkLCQpe3ZhciBsLHk9Ty5wKGQpLE09dyhyKSxtPShNLnV0Y09mZnNldCgpLXRoaXMudXRjT2Zmc2V0KCkpKmUsZz10aGlzLU0sRD1PLm0odGhpcyxNKTtyZXR1cm4gRD0obD17fSxsW2NdPUQvMTIsbFtmXT1ELGxbaF09RC8zLGxbb109KGctbSkvNjA0OGU1LGxbYV09KGctbSkvODY0ZTUsbFt1XT1nL24sbFtzXT1nL2UsbFtpXT1nL3QsbClbeV18fGcsJD9EOk8uYShEKX0sbS5kYXlzSW5Nb250aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVuZE9mKGYpLiREfSxtLiRsb2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdlt0aGlzLiRMXX0sbS5sb2NhbGU9ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gdGhpcy4kTDt2YXIgbj10aGlzLmNsb25lKCkscj1TKHQsZSwhMCk7cmV0dXJuIHImJihuLiRMPXIpLG59LG0uY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gTy53KHRoaXMuJGQsdGhpcyl9LG0udG9EYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKX0sbS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/dGhpcy50b0lTT1N0cmluZygpOm51bGx9LG0udG9JU09TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZC50b0lTT1N0cmluZygpfSxtLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQudG9VVENTdHJpbmcoKX0sTX0oKSxiPV8ucHJvdG90eXBlO3JldHVybiB3LnByb3RvdHlwZT1iLFtbXCIkbXNcIixyXSxbXCIkc1wiLGldLFtcIiRtXCIsc10sW1wiJEhcIix1XSxbXCIkV1wiLGFdLFtcIiRNXCIsZl0sW1wiJHlcIixjXSxbXCIkRFwiLGRdXS5mb3JFYWNoKChmdW5jdGlvbih0KXtiW3RbMV1dPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiRnKGUsdFswXSx0WzFdKX19KSksdy5leHRlbmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC4kaXx8KHQoZSxfLHcpLHQuJGk9ITApLHd9LHcubG9jYWxlPVMsdy5pc0RheWpzPXAsdy51bml4PWZ1bmN0aW9uKHQpe3JldHVybiB3KDFlMyp0KX0sdy5lbj12W0RdLHcuTHM9dix3LnA9e30sd30pKTsiLCBudWxsLCBudWxsLCAiIWZ1bmN0aW9uKHQsbil7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9bigpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUobik6KHQ9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczp0fHxzZWxmKS5kYXlqc19wbHVnaW5fcXVhcnRlck9mWWVhcj1uKCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9XCJtb250aFwiLG49XCJxdWFydGVyXCI7cmV0dXJuIGZ1bmN0aW9uKGUsaSl7dmFyIHI9aS5wcm90b3R5cGU7ci5xdWFydGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLiR1dGlscygpLnUodCk/TWF0aC5jZWlsKCh0aGlzLm1vbnRoKCkrMSkvMyk6dGhpcy5tb250aCh0aGlzLm1vbnRoKCklMyszKih0LTEpKX07dmFyIHM9ci5hZGQ7ci5hZGQ9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gZT1OdW1iZXIoZSksdGhpcy4kdXRpbHMoKS5wKGkpPT09bj90aGlzLmFkZCgzKmUsdCk6cy5iaW5kKHRoaXMpKGUsaSl9O3ZhciB1PXIuc3RhcnRPZjtyLnN0YXJ0T2Y9ZnVuY3Rpb24oZSxpKXt2YXIgcj10aGlzLiR1dGlscygpLHM9ISFyLnUoaSl8fGk7aWYoci5wKGUpPT09bil7dmFyIG89dGhpcy5xdWFydGVyKCktMTtyZXR1cm4gcz90aGlzLm1vbnRoKDMqbykuc3RhcnRPZih0KS5zdGFydE9mKFwiZGF5XCIpOnRoaXMubW9udGgoMypvKzIpLmVuZE9mKHQpLmVuZE9mKFwiZGF5XCIpfXJldHVybiB1LmJpbmQodGhpcykoZSxpKX19fSkpOyIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgT3BlcmF0b3JzO1xuKGZ1bmN0aW9uIChPcGVyYXRvcnMpIHtcbiAgICBPcGVyYXRvcnNbXCJBTkRcIl0gPSBcIkFORFwiO1xuICAgIE9wZXJhdG9yc1tcIk9SXCJdID0gXCJPUlwiO1xuICAgIE9wZXJhdG9yc1tcIlhPUlwiXSA9IFwiWE9SXCI7XG4gICAgT3BlcmF0b3JzW1wiTk9UXCJdID0gXCJOT1RcIjtcbn0pKE9wZXJhdG9ycyA9IGV4cG9ydHMuT3BlcmF0b3JzIHx8IChleHBvcnRzLk9wZXJhdG9ycyA9IHt9KSk7XG52YXIgU3RydWN0dXJhbENoYXJhY3RlcnM7XG4oZnVuY3Rpb24gKFN0cnVjdHVyYWxDaGFyYWN0ZXJzKSB7XG4gICAgU3RydWN0dXJhbENoYXJhY3RlcnNbXCJPUEVOX1BBUkVOVEhFU0lTXCJdID0gXCIoXCI7XG4gICAgU3RydWN0dXJhbENoYXJhY3RlcnNbXCJDTE9TRV9QQVJFTlRIRVNJU1wiXSA9IFwiKVwiO1xufSkoU3RydWN0dXJhbENoYXJhY3RlcnMgPSBleHBvcnRzLlN0cnVjdHVyYWxDaGFyYWN0ZXJzIHx8IChleHBvcnRzLlN0cnVjdHVyYWxDaGFyYWN0ZXJzID0ge30pKTtcbnZhciBUb2tlbnM7XG4oZnVuY3Rpb24gKFRva2Vucykge1xuICAgIFRva2Vuc1tcIklERU5USUZJRVJcIl0gPSBcIklERU5USUZJRVJcIjtcbiAgICBUb2tlbnNbXCJPUEVSQVRPUlwiXSA9IFwiT1BFUkFUT1JcIjtcbiAgICBUb2tlbnNbXCJTVFJVQ1RVUkFMX0NIQVJBQ1RFUlwiXSA9IFwiU1RSVUNUVVJBTF9DSEFSQUNURVJcIjtcbiAgICBUb2tlbnNbXCJFT0ZcIl0gPSBcIkVPRlwiO1xuICAgIFRva2Vuc1tcIkNPTU1FTlRcIl0gPSBcIkNPTU1FTlRcIjtcbn0pKFRva2VucyA9IGV4cG9ydHMuVG9rZW5zIHx8IChleHBvcnRzLlRva2VucyA9IHt9KSk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIHR5cGVzXzEgPSByZXF1aXJlKFwiLi4vdHlwZXNcIik7XG5leHBvcnRzLk9QRVJBVE9SX1BSRUNFREVOQ0UgPSB7XG4gICAgTk9UOiAwLFxuICAgIFhPUjogMSxcbiAgICBBTkQ6IDIsXG4gICAgT1I6IDNcbn07XG5leHBvcnRzLlZBTElEX1RPS0VOUyA9IHtcbiAgICBpZGVudGlmaWVyT25seTogW1xuICAgICAgICB7IG5hbWU6IHR5cGVzXzEuVG9rZW5zLklERU5USUZJRVIgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogdHlwZXNfMS5Ub2tlbnMuU1RSVUNUVVJBTF9DSEFSQUNURVIsXG4gICAgICAgICAgICB2YWx1ZTogdHlwZXNfMS5TdHJ1Y3R1cmFsQ2hhcmFjdGVycy5PUEVOX1BBUkVOVEhFU0lTXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBpZGVudGlmaWVyT3JOb3Q6IFtcbiAgICAgICAgeyBuYW1lOiB0eXBlc18xLlRva2Vucy5JREVOVElGSUVSIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHR5cGVzXzEuVG9rZW5zLlNUUlVDVFVSQUxfQ0hBUkFDVEVSLFxuICAgICAgICAgICAgdmFsdWU6IHR5cGVzXzEuU3RydWN0dXJhbENoYXJhY3RlcnMuT1BFTl9QQVJFTlRIRVNJU1xuICAgICAgICB9LFxuICAgICAgICB7IG5hbWU6IHR5cGVzXzEuVG9rZW5zLk9QRVJBVE9SLCB2YWx1ZTogdHlwZXNfMS5PcGVyYXRvcnMuTk9UIH0sXG4gICAgXSxcbiAgICBiaW5hcnlPcGVyYXRvcjogW1xuICAgICAgICB7IG5hbWU6IHR5cGVzXzEuVG9rZW5zLk9QRVJBVE9SLCB2YWx1ZTogdHlwZXNfMS5PcGVyYXRvcnMuQU5EIH0sXG4gICAgICAgIHsgbmFtZTogdHlwZXNfMS5Ub2tlbnMuT1BFUkFUT1IsIHZhbHVlOiB0eXBlc18xLk9wZXJhdG9ycy5PUiB9LFxuICAgICAgICB7IG5hbWU6IHR5cGVzXzEuVG9rZW5zLk9QRVJBVE9SLCB2YWx1ZTogdHlwZXNfMS5PcGVyYXRvcnMuWE9SIH0sXG4gICAgXSxcbiAgICBiaW5hcnlPcGVyYXRvck9yQ2xvc2U6IFtcbiAgICAgICAgeyBuYW1lOiB0eXBlc18xLlRva2Vucy5PUEVSQVRPUiwgdmFsdWU6IHR5cGVzXzEuT3BlcmF0b3JzLkFORCB9LFxuICAgICAgICB7IG5hbWU6IHR5cGVzXzEuVG9rZW5zLk9QRVJBVE9SLCB2YWx1ZTogdHlwZXNfMS5PcGVyYXRvcnMuT1IgfSxcbiAgICAgICAgeyBuYW1lOiB0eXBlc18xLlRva2Vucy5PUEVSQVRPUiwgdmFsdWU6IHR5cGVzXzEuT3BlcmF0b3JzLlhPUiB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiB0eXBlc18xLlRva2Vucy5TVFJVQ1RVUkFMX0NIQVJBQ1RFUixcbiAgICAgICAgICAgIHZhbHVlOiB0eXBlc18xLlN0cnVjdHVyYWxDaGFyYWN0ZXJzLkNMT1NFX1BBUkVOVEhFU0lTXG4gICAgICAgIH0sXG4gICAgXVxufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgdHlwZXNfMSA9IHJlcXVpcmUoXCIuLi90eXBlc1wiKTtcbmV4cG9ydHMuU1RSVUNUVVJBTF9DSEFSQUNURVJTID0ge1xuICAgICcoJzogdHlwZXNfMS5TdHJ1Y3R1cmFsQ2hhcmFjdGVycy5PUEVOX1BBUkVOVEhFU0lTLFxuICAgICcpJzogdHlwZXNfMS5TdHJ1Y3R1cmFsQ2hhcmFjdGVycy5DTE9TRV9QQVJFTlRIRVNJU1xufTtcbmV4cG9ydHMuT1BFUkFUT1JTID0ge1xuICAgIEFORDogdHlwZXNfMS5PcGVyYXRvcnMuQU5ELFxuICAgIE9SOiB0eXBlc18xLk9wZXJhdG9ycy5PUixcbiAgICBYT1I6IHR5cGVzXzEuT3BlcmF0b3JzLlhPUixcbiAgICBOT1Q6IHR5cGVzXzEuT3BlcmF0b3JzLk5PVFxufTtcbmV4cG9ydHMuU0VQQVJBVE9SUyA9IG5ldyBTZXQoW1xuICAgIDB4MDAyMCxcbiAgICAweDAwMDksXG4gICAgMHgwMDBhLFxuICAgIDB4MDAwZCxcbl0ubWFwKGZ1bmN0aW9uIChzZXBhcmF0b3IpIHsgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KHNlcGFyYXRvcik7IH0pKTtcbmV4cG9ydHMuUVVPVEVEX0lERU5USUZJRVJfREVMSU1JVEVSID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoMHgwMDIyKTtcbmV4cG9ydHMuQ09NTUVOVF9ERUxJTUlURVIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludCgweDAwMjMpO1xuZXhwb3J0cy5FT0wgPSBTdHJpbmcuZnJvbUNvZGVQb2ludCgweDAwMGEpO1xuZXhwb3J0cy5FU0NBUEVfQ0hBUkFDVEVSID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoMHgwMDVjKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIHR5cGVzXzEgPSByZXF1aXJlKFwiLi4vdHlwZXNcIik7XG52YXIgY29uc3RfMSA9IHJlcXVpcmUoXCIuL2NvbnN0XCIpO1xuZXhwb3J0cy5jcmVhdGVSZXN1bHQgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIHJlbWFpbmluZ1N0cmluZykgeyByZXR1cm4gKHtcbiAgICB0b2tlbjogX19hc3NpZ24oeyBuYW1lOiBuYW1lIH0sICh2YWx1ZSAhPT0gbnVsbCA/IHsgdmFsdWU6IHZhbHVlIH0gOiB7fSkpLFxuICAgIHJlbWFpbmluZ1N0cmluZzogcmVtYWluaW5nU3RyaW5nXG59KTsgfTtcbmV4cG9ydHMuZ2V0Q29tbWVudCA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG4gICAgdmFyIHRva2VuRW5kID0gZXhwcmVzc2lvbi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9uLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBsZXR0ZXIgPSBleHByZXNzaW9uW2ldO1xuICAgICAgICBpZiAobGV0dGVyID09PSBjb25zdF8xLkVPTCkge1xuICAgICAgICAgICAgdG9rZW5FbmQgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4cG9ydHMuY3JlYXRlUmVzdWx0KHR5cGVzXzEuVG9rZW5zLkNPTU1FTlQsIGV4cHJlc3Npb24uc2xpY2UoMCwgdG9rZW5FbmQpLCBleHByZXNzaW9uLnNsaWNlKHRva2VuRW5kICsgMSkpO1xufTtcbmV4cG9ydHMuZ2V0UXVvdGVkSWRlbnRpZmllciA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG4gICAgdmFyIGVzY2FwZVF1b3RhdGlvbiA9IGZhbHNlO1xuICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgIHZhciB0b2tlbkVuZCA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9uLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjaGFyID0gZXhwcmVzc2lvbltpXTtcbiAgICAgICAgaWYgKHRva2VuRW5kID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY2hhciA9PT0gY29uc3RfMS5RVU9URURfSURFTlRJRklFUl9ERUxJTUlURVIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXNjYXBlUXVvdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoLTEpICsgY29uc3RfMS5RVU9URURfSURFTlRJRklFUl9ERUxJTUlURVI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbkVuZCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09IGNvbnN0XzEuRVNDQVBFX0NIQVJBQ1RFUikge1xuICAgICAgICAgICAgICAgICAgICBlc2NhcGVRdW90YXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlUXVvdGF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKz0gY2hhcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghY29uc3RfMS5TRVBBUkFUT1JTLmhhcyhjaGFyKSAmJiAhY29uc3RfMS5TVFJVQ1RVUkFMX0NIQVJBQ1RFUlNbY2hhcl0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogXCIgKyBjaGFyICsgXCIgRXhwZWN0ZWQgKSBjaGFyYWN0ZXIgb3Igc2VwYXJhdG9yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRva2VuRW5kID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgZW5kIG9mIGV4cHJlc3Npb246IGV4cGVjdGVkIFwiICsgY29uc3RfMS5RVU9URURfSURFTlRJRklFUl9ERUxJTUlURVIgKyBcIiBjaGFyYWN0ZXJcIik7XG4gICAgfVxuICAgIHJldHVybiBleHBvcnRzLmNyZWF0ZVJlc3VsdCh0eXBlc18xLlRva2Vucy5JREVOVElGSUVSLCB2YWx1ZSwgZXhwcmVzc2lvbi5zbGljZSh0b2tlbkVuZCArIDEpKTtcbn07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIHR5cGVzXzEgPSByZXF1aXJlKFwiLi4vdHlwZXNcIik7XG52YXIgY29uc3RfMSA9IHJlcXVpcmUoXCIuL2NvbnN0XCIpO1xudmFyIHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmV4cG9ydHMubGV4ID0gZnVuY3Rpb24gKGV4cHJlc3Npb24pIHtcbiAgICB2YXIgdG9rZW5TdGFydCA9IG51bGw7XG4gICAgdmFyIHRva2VuRW5kID0gbnVsbDtcbiAgICB2YXIgZGVsaW1pdGluZ0NoYXJhY3RlciA9IG51bGw7XG4gICAgLy8gTG9vcHMgdGhyb3VnaCBjaGFyYWN0ZXJzIGluIHRoZSBleHByZXNzaW9uIHVudGlsIHRoZSBuZXh0IHRva2VuIGlzIGZvdW5kXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9uLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjaGFyID0gZXhwcmVzc2lvbltpXTtcbiAgICAgICAgLy8gRmluZHMgdG9rZW0gc3RhcnQgYW5kIHJldHVybnMgaW1tZWRpYXRlbHkgcmV0dXJucyBhbnkgaWRlbnRpZmlhYmxlIHRva2Vuc1xuICAgICAgICBpZiAodG9rZW5TdGFydCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCFjb25zdF8xLlNFUEFSQVRPUlMuaGFzKGNoYXIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0cnVjdHVyYWxDaGFyID0gY29uc3RfMS5TVFJVQ1RVUkFMX0NIQVJBQ1RFUlNbY2hhcl07XG4gICAgICAgICAgICAgICAgaWYgKHN0cnVjdHVyYWxDaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0Q2hhciA9IGV4cHJlc3Npb25baSArIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RydWN0dXJhbENoYXIgPT09IHR5cGVzXzEuU3RydWN0dXJhbENoYXJhY3RlcnMuQ0xPU0VfUEFSRU5USEVTSVMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDaGFyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhY29uc3RfMS5TRVBBUkFUT1JTLmhhcyhuZXh0Q2hhcikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDaGFyICE9PSB0eXBlc18xLlN0cnVjdHVyYWxDaGFyYWN0ZXJzLkNMT1NFX1BBUkVOVEhFU0lTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogXCIgKyBuZXh0Q2hhciArIFwiLiBBIGNsb3NpbmcgcGFyZW50aGVzaXMgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgY2xvc2luZyBwYXJlbnRoZXNpcyBvciB3aGl0ZXNwYWNlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1dGlsc18xLmNyZWF0ZVJlc3VsdCh0eXBlc18xLlRva2Vucy5TVFJVQ1RVUkFMX0NIQVJBQ1RFUiwgY29uc3RfMS5TVFJVQ1RVUkFMX0NIQVJBQ1RFUlNbY2hhcl0sIGV4cHJlc3Npb24uc2xpY2UoaSArIDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gT25jZSBhIHF1b3RlZCBpZGVudGlmaWVyIGhhcyBiZWVuIGlkZW50aWZpZWQgaXQgaXMgcmV0cmlldmVkIGluIGEgc2VwYXJhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICBpZiAoY2hhciA9PT0gY29uc3RfMS5RVU9URURfSURFTlRJRklFUl9ERUxJTUlURVIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzXzEuZ2V0UXVvdGVkSWRlbnRpZmllcihleHByZXNzaW9uLnNsaWNlKGkgKyAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE9uY2UgYSBjb21tZW50IGhhcyBiZWVuIGlkZW50aWZpZWQgaXQgaXMgcmV0cmlldmVkIGluIGEgc2VwYXJhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICBpZiAoY2hhciA9PT0gY29uc3RfMS5DT01NRU5UX0RFTElNSVRFUikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXRpbHNfMS5nZXRDb21tZW50KGV4cHJlc3Npb24uc2xpY2UoaSArIDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdG9rZW5TdGFydCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBCcmVha3Mgb24gdGhlIGVuZCBvZiB0aGUgdG9rZW4gYW5kIHRocm93cyBvbiBpbnZhbGlkIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGlmIChjb25zdF8xLlNFUEFSQVRPUlMuaGFzKGNoYXIpIHx8IGNvbnN0XzEuU1RSVUNUVVJBTF9DSEFSQUNURVJTW2NoYXJdKSB7XG4gICAgICAgICAgICAgICAgdG9rZW5FbmQgPSBpO1xuICAgICAgICAgICAgICAgIGRlbGltaXRpbmdDaGFyYWN0ZXIgPSBjaGFyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09IGNvbnN0XzEuUVVPVEVEX0lERU5USUZJRVJfREVMSU1JVEVSIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYXIgPT09IGNvbnN0XzEuQ09NTUVOVF9ERUxJTUlURVIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBjaGFyYWN0ZXI6IFwiICsgY2hhcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNlcGFyYXRlcyBvcGVyYXRvcnMgZnJvbSBpZGVudGlmaWVycyBhbmQgcmV0dXJucyB0aGUgY29ycmVjdCB0b2tlblxuICAgIGlmICh0b2tlblN0YXJ0ICE9PSBudWxsKSB7XG4gICAgICAgIHRva2VuRW5kID0gKHRva2VuRW5kICE9PSBudWxsICYmIHRva2VuRW5kICE9PSB2b2lkIDAgPyB0b2tlbkVuZCA6IGV4cHJlc3Npb24ubGVuZ3RoKTtcbiAgICAgICAgdmFyIHZhbHVlID0gZXhwcmVzc2lvbi5zbGljZSh0b2tlblN0YXJ0LCB0b2tlbkVuZCk7XG4gICAgICAgIHZhciByZW1haW5pbmdTdHJpbmcgPSBleHByZXNzaW9uLnNsaWNlKHRva2VuRW5kKTtcbiAgICAgICAgaWYgKGNvbnN0XzEuT1BFUkFUT1JTW3ZhbHVlXSkge1xuICAgICAgICAgICAgaWYgKGRlbGltaXRpbmdDaGFyYWN0ZXIgJiYgIWNvbnN0XzEuU0VQQVJBVE9SUy5oYXMoZGVsaW1pdGluZ0NoYXJhY3RlcikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogXCIgKyBkZWxpbWl0aW5nQ2hhcmFjdGVyICsgXCIuIE9wZXJhdG9ycyBzaG91bGQgYmUgc2VwYXJhdGVkIHVzaW5nIHdoaXRlc3BhY2VcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXRpbHNfMS5jcmVhdGVSZXN1bHQodHlwZXNfMS5Ub2tlbnMuT1BFUkFUT1IsIGNvbnN0XzEuT1BFUkFUT1JTW3ZhbHVlXSwgcmVtYWluaW5nU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlsc18xLmNyZWF0ZVJlc3VsdCh0eXBlc18xLlRva2Vucy5JREVOVElGSUVSLCB2YWx1ZSwgcmVtYWluaW5nU3RyaW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0aGlzIGlzIHJlYWNoZWQgbm8gdG9rZW5zIHdlcmUgZm91bmQgc28gRU9GIGlzIHJldHVybmVkXG4gICAgcmV0dXJuIHV0aWxzXzEuY3JlYXRlUmVzdWx0KHR5cGVzXzEuVG9rZW5zLkVPRiwgbnVsbCwgJycpO1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX3NwcmVhZEFycmF5cyA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheXMpIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgICAgcltrXSA9IGFbal07XG4gICAgcmV0dXJuIHI7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBsZXhfMSA9IHJlcXVpcmUoXCIuLi9sZXgvbGV4XCIpO1xudmFyIHR5cGVzXzEgPSByZXF1aXJlKFwiLi4vdHlwZXNcIik7XG52YXIgY29uc3RfMSA9IHJlcXVpcmUoXCIuL2NvbnN0XCIpO1xuZXhwb3J0cy5uZXdUb2tlbkdlbmVyYXRvciA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG4gICAgdmFyIHJlbWFpbmluZ0V4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIHJldHVybiBmdW5jdGlvbiAodmFsaWRUb2tlbnMsIGVuZElzVmFsaWQpIHtcbiAgICAgICAgaWYgKGVuZElzVmFsaWQgPT09IHZvaWQgMCkgeyBlbmRJc1ZhbGlkID0gZmFsc2U7IH1cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGxleF8xLmxleChyZW1haW5pbmdFeHByZXNzaW9uKSwgdG9rZW4gPSBfYS50b2tlbiwgcmVtYWluaW5nU3RyaW5nID0gX2EucmVtYWluaW5nU3RyaW5nO1xuICAgICAgICAgICAgcmVtYWluaW5nRXhwcmVzc2lvbiA9IHJlbWFpbmluZ1N0cmluZztcbiAgICAgICAgICAgIGlmICh0b2tlbi5uYW1lICE9PSB0eXBlc18xLlRva2Vucy5DT01NRU5UKSB7XG4gICAgICAgICAgICAgICAgZXhwb3J0cy52YWxpZGF0ZVRva2VuKHRva2VuLCB2YWxpZFRva2VucywgZW5kSXNWYWxpZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn07XG5leHBvcnRzLmdldFZhbHVlID0gZnVuY3Rpb24gKGdldE5leHRUb2tlbiwgcGFyc2VyKSB7XG4gICAgdmFyIG5leHRUb2tlbiA9IGdldE5leHRUb2tlbihjb25zdF8xLlZBTElEX1RPS0VOUy5pZGVudGlmaWVyT3JOb3QpO1xuICAgIHZhciBuZWdhdGVkVmFsdWUgPSBuZXh0VG9rZW4udmFsdWUgPT09IHR5cGVzXzEuT3BlcmF0b3JzLk5PVDtcbiAgICBpZiAobmVnYXRlZFZhbHVlKSB7XG4gICAgICAgIG5leHRUb2tlbiA9IGdldE5leHRUb2tlbihjb25zdF8xLlZBTElEX1RPS0VOUy5pZGVudGlmaWVyT25seSk7XG4gICAgfVxuICAgIHZhciB2YWx1ZSA9IG5leHRUb2tlbi5uYW1lID09PSB0eXBlc18xLlRva2Vucy5TVFJVQ1RVUkFMX0NIQVJBQ1RFUlxuICAgICAgICA/IHBhcnNlcihnZXROZXh0VG9rZW4sIHRydWUpXG4gICAgICAgIDogW25leHRUb2tlbl07XG4gICAgcmV0dXJuIG5lZ2F0ZWRWYWx1ZVxuICAgICAgICA/IF9fc3ByZWFkQXJyYXlzKHZhbHVlLCBbeyBuYW1lOiB0eXBlc18xLlRva2Vucy5PUEVSQVRPUiwgdmFsdWU6IHR5cGVzXzEuT3BlcmF0b3JzLk5PVCB9XSkgOiB2YWx1ZTtcbn07XG5leHBvcnRzLnByZXZpb3VzT3BlcmF0b3JUYWtlc1ByZWNlZGVudCA9IGZ1bmN0aW9uIChwcmV2aW91c09wZXJhdG9yLCBuZXh0T3BlcmF0b3IpIHtcbiAgICByZXR1cm4gY29uc3RfMS5PUEVSQVRPUl9QUkVDRURFTkNFW3ByZXZpb3VzT3BlcmF0b3JdIDw9IGNvbnN0XzEuT1BFUkFUT1JfUFJFQ0VERU5DRVtuZXh0T3BlcmF0b3JdO1xufTtcbmV4cG9ydHMudmFsaWRhdGVUb2tlbiA9IGZ1bmN0aW9uICh0b2tlbiwgdmFsaWRUb2tlbnMsIGVuZElzVmFsaWQpIHtcbiAgICBpZiAoZW5kSXNWYWxpZCA9PT0gdm9pZCAwKSB7IGVuZElzVmFsaWQgPSBmYWxzZTsgfVxuICAgIGlmICh0b2tlbi5uYW1lID09PSB0eXBlc18xLlRva2Vucy5FT0YpIHtcbiAgICAgICAgaWYgKGVuZElzVmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIGV4cHJlc3Npb24nKTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2kgPSAwLCB2YWxpZFRva2Vuc18xID0gdmFsaWRUb2tlbnM7IF9pIDwgdmFsaWRUb2tlbnNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHZhbGlkVG9rZW4gPSB2YWxpZFRva2Vuc18xW19pXTtcbiAgICAgICAgaWYgKHZhbGlkVG9rZW4ubmFtZSA9PT0gdG9rZW4ubmFtZSkge1xuICAgICAgICAgICAgaWYgKCF2YWxpZFRva2VuLnZhbHVlIHx8IHZhbGlkVG9rZW4udmFsdWUgPT09IHRva2VuLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdG9rZW4nKTtcbn07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19zcHJlYWRBcnJheXMgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXlzKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xuICAgIHJldHVybiByO1xufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgdHlwZXNfMSA9IHJlcXVpcmUoXCIuLi90eXBlc1wiKTtcbnZhciBjb25zdF8xID0gcmVxdWlyZShcIi4vY29uc3RcIik7XG52YXIgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuLy8gUmV0dXJucyB0aGUgdG9rZW5zIHVzaW5nIHBvc3RmaXggbm90YXRpb25cbmV4cG9ydHMucGFyc2UgPSBmdW5jdGlvbiAoZXhwcmVzc2lvbikge1xuICAgIGlmICh0eXBlb2YgZXhwcmVzc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgc3RyaW5nIGJ1dCByZWNlaXZlZCBcIiArIHR5cGVvZiBleHByZXNzaW9uKTtcbiAgICB9XG4gICAgLy8gZ2V0TmV4dFRva2VuIGtlZXBzIHRyYWNrIG9mIHRoZSByZW1haW5pbmcgZXhwcmVzc2lvblxuICAgIC8vIGFuZCByZXR1cm4gdGhlIG5leHQgdG9rZW4gZWFjaCB0aW1lIGl0IGlzIGNhbGxlZFxuICAgIHZhciBnZXROZXh0VG9rZW4gPSB1dGlsc18xLm5ld1Rva2VuR2VuZXJhdG9yKGV4cHJlc3Npb24pO1xuICAgIHJldHVybiBwYXJzZUludGVybmFsKGdldE5leHRUb2tlbik7XG59O1xuLy8gcGFyc2VJbnRlcm5hbCB3aWxsIHJlY3Vyc2Ugb3ZlciBicmFja2V0ZWQgZXhwcmVzc2lvbnNcbnZhciBwYXJzZUludGVybmFsID0gZnVuY3Rpb24gKGdldE5leHRUb2tlbiwgbmVzdGVkKSB7XG4gICAgaWYgKG5lc3RlZCA9PT0gdm9pZCAwKSB7IG5lc3RlZCA9IGZhbHNlOyB9XG4gICAgLy8gVGhpcyBpbml0aWFsaXNlcyB0aGUgb3V0cHV0IHdpdGggZXZlcnl0aGluZyB1cCB0aGUgZmlyc3QgdW5uZXN0ZWQgb3BlcmF0b3JcbiAgICB2YXIgb3V0cHV0ID0gX19zcHJlYWRBcnJheXModXRpbHNfMS5nZXRWYWx1ZShnZXROZXh0VG9rZW4sIHBhcnNlSW50ZXJuYWwpKTtcbiAgICB2YXIgb3BlcmF0b3JzID0gW107XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIHZhbGlkVG9rZW5zID0gbmVzdGVkXG4gICAgICAgICAgICA/IGNvbnN0XzEuVkFMSURfVE9LRU5TLmJpbmFyeU9wZXJhdG9yT3JDbG9zZVxuICAgICAgICAgICAgOiBjb25zdF8xLlZBTElEX1RPS0VOUy5iaW5hcnlPcGVyYXRvcjtcbiAgICAgICAgLy8gUmV0cmlldmVzIHRoZSBuZXh0IFRva2VuXG4gICAgICAgIHZhciBuZXh0VG9rZW4gPSBnZXROZXh0VG9rZW4odmFsaWRUb2tlbnMsICFuZXN0ZWQpO1xuICAgICAgICBpZiAobmV4dFRva2VuLm5hbWUgPT09IHR5cGVzXzEuVG9rZW5zLkVPRiB8fCAvLyBJZiB0aGUgZW5kIG9mIGZpbGUgaXMgZm91bmQgaGVyZSB0aGVuIHJldHVybiB3aGF0IHdlIGhhdmVcbiAgICAgICAgICAgIG5leHRUb2tlbi5uYW1lID09PSB0eXBlc18xLlRva2Vucy5TVFJVQ1RVUkFMX0NIQVJBQ1RFUiAvLyBUaGUgZXhwcmVzc2lvbiB3aWxsIGJlIHJldHVybmVkIGFuZCBpbmNvcnBvcmF0ZWQgaW50byB0aGUgZmluYWwgZXhwcmVzc2lvblxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhvdXRwdXQsIF9fc3ByZWFkQXJyYXlzKG9wZXJhdG9ycykucmV2ZXJzZSgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbiBwb3N0Zml4IG5vdGF0aW9uIG9wZXJhdG9yIG9yZGVyIGlzIGRldGVybWluZWQgYnkgcHJlY2VkZW5jZVxuICAgICAgICB3aGlsZSAob3BlcmF0b3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHByZXZpb3VzT3BlcmF0b3IgPSBvcGVyYXRvcnNbb3BlcmF0b3JzLmxlbmd0aCAtIDFdIHx8IG51bGw7XG4gICAgICAgICAgICBpZiAocHJldmlvdXNPcGVyYXRvciAmJlxuICAgICAgICAgICAgICAgIHV0aWxzXzEucHJldmlvdXNPcGVyYXRvclRha2VzUHJlY2VkZW50KHByZXZpb3VzT3BlcmF0b3IudmFsdWUsIG5leHRUb2tlbi52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBfX3NwcmVhZEFycmF5cyhvdXRwdXQsIFtwcmV2aW91c09wZXJhdG9yXSk7XG4gICAgICAgICAgICAgICAgb3BlcmF0b3JzID0gb3BlcmF0b3JzLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBuZXcgb3BlcmF0b3IgaXMgbm93IGFkZGVkIHRvIHRoZSBzdGFja1xuICAgICAgICBvcGVyYXRvcnMgPSBfX3NwcmVhZEFycmF5cyhvcGVyYXRvcnMsIFtuZXh0VG9rZW5dKTtcbiAgICAgICAgLy8gT25jZSB0aGlzIGlzIGRvbmUgd2UgY2FuIGdldCBldmVyeXRoaW5nIHVudGlsIHRoZSBuZXh0IHVubmVzdGVkXG4gICAgICAgIC8vIG9wZXJhdG9yIGFuZCBhZGQgaXQgdG8gdGhlIG91dHB1dFxuICAgICAgICBvdXRwdXQgPSBfX3NwcmVhZEFycmF5cyhvdXRwdXQsIHV0aWxzXzEuZ2V0VmFsdWUoZ2V0TmV4dFRva2VuLCBwYXJzZUludGVybmFsKSk7XG4gICAgfVxufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgdHlwZXNfMSA9IHJlcXVpcmUoXCIuLi90eXBlc1wiKTtcbmV4cG9ydHMuYW5kVXRpbCA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkgeyByZXR1cm4gbGVmdCAmJiByaWdodDsgfTtcbmV4cG9ydHMub3JVdGlsID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IHJldHVybiBsZWZ0IHx8IHJpZ2h0OyB9O1xuZXhwb3J0cy54b3JVdGlsID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IHJldHVybiAhKGxlZnQgPT09IHJpZ2h0KTsgfTtcbmV4cG9ydHMubm90VXRpbCA9IGZ1bmN0aW9uIChpZGVudGlmaWVyKSB7IHJldHVybiAhaWRlbnRpZmllcjsgfTtcbmV4cG9ydHMuaXNJZGVudGlmaWVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIG5hbWUgPSBfYS5uYW1lLCB2YWx1ZSA9IF9hLnZhbHVlO1xuICAgIHJldHVybiBuYW1lID09PSB0eXBlc18xLlRva2Vucy5JREVOVElGSUVSICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59O1xuZXhwb3J0cy5pc09wZXJhdG9yID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIG5hbWUgPSBfYS5uYW1lLCB2YWx1ZSA9IF9hLnZhbHVlO1xuICAgIHJldHVybiBuYW1lID09PSB0eXBlc18xLlRva2Vucy5PUEVSQVRPUiAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xufTtcbmV4cG9ydHMudGhyb3dJbnZhbGlkRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgcG9zdGZpeCBleHByZXNzaW9uOiBcIiArIG1lc3NhZ2UpO1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBfYTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgdHlwZXNfMSA9IHJlcXVpcmUoXCIuLi90eXBlc1wiKTtcbnZhciB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5leHBvcnRzLk9QRVJBVE9SX01BUCA9IChfYSA9IHt9LFxuICAgIF9hW3R5cGVzXzEuT3BlcmF0b3JzLkFORF0gPSB1dGlsc18xLmFuZFV0aWwsXG4gICAgX2FbdHlwZXNfMS5PcGVyYXRvcnMuT1JdID0gdXRpbHNfMS5vclV0aWwsXG4gICAgX2FbdHlwZXNfMS5PcGVyYXRvcnMuWE9SXSA9IHV0aWxzXzEueG9yVXRpbCxcbiAgICBfYSk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19zcHJlYWRBcnJheXMgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXlzKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xuICAgIHJldHVybiByO1xufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgcGFyc2VfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZS9wYXJzZVwiKTtcbnZhciB0eXBlc18xID0gcmVxdWlyZShcIi4uL3R5cGVzXCIpO1xudmFyIGNvbnN0XzEgPSByZXF1aXJlKFwiLi9jb25zdFwiKTtcbnZhciB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5leHBvcnRzLmdldEV2YWx1YXRvciA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG4gICAgdmFyIHBhcnNlZEV4cHJlc3Npb24gPSBwYXJzZV8xLnBhcnNlKGV4cHJlc3Npb24pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoYm9vbGVhbk1hcCkgeyByZXR1cm4gZXhwb3J0cy5ldmFsdWF0ZShwYXJzZWRFeHByZXNzaW9uLCBib29sZWFuTWFwKTsgfTtcbn07XG5leHBvcnRzLmV2YWx1YXRlID0gZnVuY3Rpb24gKGV4cHJlc3Npb24sIGJvb2xlYW5NYXApIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGV4cHJlc3Npb24gKyBcIiBzaG91bGQgYmUgYW4gYXJyYXkuIGV2YWx1YXRlIHRha2VzIGluIGEgcGFyc2VkIGV4cHJlc3Npb24uIFVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIHBhcnNlIG9yIHVzZSBnZXRFdmFsdWF0b3JcIik7XG4gICAgfVxuICAgIC8vIFJlc29sdmVzIGVhY2ggaWRlbnRpZmllciBhbmQgYWRkcyBpdCB0byBhIHN0YWNrXG4gICAgLy8gV2hlbiBvcGVyYXRvciBpcyBmb3VuZCBpdCBvcGVyYXRlcyBvbiB0aGUgdG9wIHZhbHVlKHMpXG4gICAgLy8gb24gdGhlIHN0YWNrLCByZW1vdmVzIHRoZW0gYW5kIHJlcGxhY2VzIHRoZW0gd2l0aCB0aGVcbiAgICAvLyByZXN1bHRcbiAgICB2YXIgZXZhbHVhdGVkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVkdWNlKGZ1bmN0aW9uIChzdGFjaywgdG9rZW4sIGkpIHtcbiAgICAgICAgaWYgKCEodG9rZW4gJiYgKHV0aWxzXzEuaXNJZGVudGlmaWVyKHRva2VuKSB8fCB1dGlsc18xLmlzT3BlcmF0b3IodG9rZW4pKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdG9rZW46IFwiICsgdG9rZW4gKyBcIi4gRm91bmQgaW4gcGFyc2VkIGV4cHJlc3Npb24gYXQgaW5kZXggXCIgKyBpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4ubmFtZSA9PT0gdHlwZXNfMS5Ub2tlbnMuSURFTlRJRklFUikge1xuICAgICAgICAgICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKHN0YWNrLCBbQm9vbGVhbihib29sZWFuTWFwW3Rva2VuLnZhbHVlXSldKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2Vjb25kTGFzdEl0ZW0gPSBzdGFja1tzdGFjay5sZW5ndGggLSAyXTtcbiAgICAgICAgdmFyIGxhc3RJdGVtID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PT0gdHlwZXNfMS5PcGVyYXRvcnMuTk9UKSB7XG4gICAgICAgICAgICBpZiAobGFzdEl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHV0aWxzXzEudGhyb3dJbnZhbGlkRXhwcmVzc2lvbignbWlzc2luZyBpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoc3RhY2suc2xpY2UoMCwgLTEpLCBbdXRpbHNfMS5ub3RVdGlsKGxhc3RJdGVtKV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0SXRlbSA9PT0gdW5kZWZpbmVkIHx8IHNlY29uZExhc3RJdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHV0aWxzXzEudGhyb3dJbnZhbGlkRXhwcmVzc2lvbignbWlzc2luZyBpZGVudGlmaWVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9wZXJhdG9yVXRpbCA9IGNvbnN0XzEuT1BFUkFUT1JfTUFQW3Rva2VuLnZhbHVlXTtcbiAgICAgICAgaWYgKCFvcGVyYXRvclV0aWwpIHtcbiAgICAgICAgICAgIHV0aWxzXzEudGhyb3dJbnZhbGlkRXhwcmVzc2lvbigndW5rbm93biBvcGVyYXRvcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhzdGFjay5zbGljZSgwLCAtMiksIFtvcGVyYXRvclV0aWwoc2Vjb25kTGFzdEl0ZW0sIGxhc3RJdGVtKV0pO1xuICAgIH0sIFtdKTtcbiAgICBpZiAoZXZhbHVhdGVkRXhwcmVzc2lvbi5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdXRpbHNfMS50aHJvd0ludmFsaWRFeHByZXNzaW9uKCd0b28gbWFueSBpZGVudGlmaWVycyBhZnRlciBldmFsdWF0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiBldmFsdWF0ZWRFeHByZXNzaW9uWzBdO1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgZXZhbHVhdGVfMSA9IHJlcXVpcmUoXCIuL2V2YWx1YXRlL2V2YWx1YXRlXCIpO1xuZXhwb3J0cy5nZXRFdmFsdWF0b3IgPSBldmFsdWF0ZV8xLmdldEV2YWx1YXRvcjtcbmV4cG9ydHMuZXZhbHVhdGUgPSBldmFsdWF0ZV8xLmV2YWx1YXRlO1xudmFyIHBhcnNlXzEgPSByZXF1aXJlKFwiLi9wYXJzZS9wYXJzZVwiKTtcbmV4cG9ydHMucGFyc2UgPSBwYXJzZV8xLnBhcnNlO1xuIiwgImltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQ2FjaGUgfSBmcm9tICcuL0NhY2hlJztcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSAnLi9Db21tYW5kcyc7XG5pbXBvcnQgeyBUYXNrc0V2ZW50cyB9IGZyb20gJy4vVGFza3NFdmVudHMnO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZUZpbGUgfSBmcm9tICcuL0ZpbGUnO1xuaW1wb3J0IHsgSW5saW5lUmVuZGVyZXIgfSBmcm9tICcuL0lubGluZVJlbmRlcmVyJztcbmltcG9ydCB7IG5ld0xpdmVQcmV2aWV3RXh0ZW5zaW9uIH0gZnJvbSAnLi9MaXZlUHJldmlld0V4dGVuc2lvbic7XG5pbXBvcnQgeyBRdWVyeVJlbmRlcmVyIH0gZnJvbSAnLi9RdWVyeVJlbmRlcmVyJztcbmltcG9ydCB7IGdldFNldHRpbmdzLCB1cGRhdGVTZXR0aW5ncyB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdzJztcbmltcG9ydCB7IFNldHRpbmdzVGFiIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ3NUYWInO1xuaW1wb3J0IHsgU3RhdHVzUmVnaXN0cnkgfSBmcm9tICcuL1N0YXR1c1JlZ2lzdHJ5JztcbmltcG9ydCB7IEVkaXRvclN1Z2dlc3RvciB9IGZyb20gJy4vU3VnZ2VzdG9yL0VkaXRvclN1Z2dlc3RvclBvcHVwJztcbmltcG9ydCB7IFN0YXR1c1NldHRpbmdzIH0gZnJvbSAnLi9Db25maWcvU3RhdHVzU2V0dGluZ3MnO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi9UYXNrJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFza3NQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICAgIHByaXZhdGUgY2FjaGU6IENhY2hlIHwgdW5kZWZpbmVkO1xuICAgIHB1YmxpYyBpbmxpbmVSZW5kZXJlcjogSW5saW5lUmVuZGVyZXIgfCB1bmRlZmluZWQ7XG4gICAgcHVibGljIHF1ZXJ5UmVuZGVyZXI6IFF1ZXJ5UmVuZGVyZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBhc3luYyBvbmxvYWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdsb2FkaW5nIHBsdWdpbiBcInRhc2tzXCInKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuICAgICAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IFNldHRpbmdzVGFiKHsgcGx1Z2luOiB0aGlzIH0pKTtcblxuICAgICAgICBpbml0aWFsaXplRmlsZSh7XG4gICAgICAgICAgICBtZXRhZGF0YUNhY2hlOiB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLFxuICAgICAgICAgICAgdmF1bHQ6IHRoaXMuYXBwLnZhdWx0LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBMb2FkIGNvbmZpZ3VyZWQgc3RhdHVzIHR5cGVzLlxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRUYXNrU3RhdHVzZXMoKTtcblxuICAgICAgICBjb25zdCBldmVudHMgPSBuZXcgVGFza3NFdmVudHMoeyBvYnNpZGlhbkV2ZW50czogdGhpcy5hcHAud29ya3NwYWNlIH0pO1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IENhY2hlKHtcbiAgICAgICAgICAgIG1ldGFkYXRhQ2FjaGU6IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUsXG4gICAgICAgICAgICB2YXVsdDogdGhpcy5hcHAudmF1bHQsXG4gICAgICAgICAgICBldmVudHMsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlubGluZVJlbmRlcmVyID0gbmV3IElubGluZVJlbmRlcmVyKHsgcGx1Z2luOiB0aGlzIH0pO1xuICAgICAgICB0aGlzLnF1ZXJ5UmVuZGVyZXIgPSBuZXcgUXVlcnlSZW5kZXJlcih7IHBsdWdpbjogdGhpcywgZXZlbnRzIH0pO1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24obmV3TGl2ZVByZXZpZXdFeHRlbnNpb24oKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJFZGl0b3JTdWdnZXN0KG5ldyBFZGl0b3JTdWdnZXN0b3IodGhpcy5hcHAsIGdldFNldHRpbmdzKCkpKTtcbiAgICAgICAgbmV3IENvbW1hbmRzKHsgcGx1Z2luOiB0aGlzIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGxvYWRUYXNrU3RhdHVzZXMoKSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzU2V0dGluZ3MgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgIFN0YXR1c1NldHRpbmdzLmFwcGx5VG9TdGF0dXNSZWdpc3RyeShzdGF0dXNTZXR0aW5ncywgU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKSk7XG4gICAgfVxuXG4gICAgb251bmxvYWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd1bmxvYWRpbmcgcGx1Z2luIFwidGFza3NcIicpO1xuICAgICAgICB0aGlzLmNhY2hlPy51bmxvYWQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG4gICAgICAgIGNvbnN0IG5ld1NldHRpbmdzID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgICB1cGRhdGVTZXR0aW5ncyhuZXdTZXR0aW5ncyk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFRhc2tTdGF0dXNlcygpO1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGF0YShnZXRTZXR0aW5ncygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGFza3MoKTogVGFza1tdIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGU/LmdldFRhc2tzKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IE1ldGFkYXRhQ2FjaGUsIE5vdGljZSwgVEFic3RyYWN0RmlsZSwgVEZpbGUsIFZhdWx0IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBDYWNoZWRNZXRhZGF0YSwgRXZlbnRSZWYgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IEhlYWRpbmdDYWNoZSwgTGlzdEl0ZW1DYWNoZSwgU2VjdGlvbkNhY2hlIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgTXV0ZXggfSBmcm9tICdhc3luYy1tdXRleCc7XG5cbmltcG9ydCB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuaW1wb3J0IHR5cGUgeyBUYXNrc0V2ZW50cyB9IGZyb20gJy4vVGFza3NFdmVudHMnO1xuaW1wb3J0IHsgRGF0ZUZhbGxiYWNrIH0gZnJvbSAnLi9EYXRlRmFsbGJhY2snO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0NvbmZpZy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBMYXp5IH0gZnJvbSAnLi9saWIvTGF6eSc7XG5cbmV4cG9ydCBlbnVtIFN0YXRlIHtcbiAgICBDb2xkID0gJ0NvbGQnLFxuICAgIEluaXRpYWxpemluZyA9ICdJbml0aWFsaXppbmcnLFxuICAgIFdhcm0gPSAnV2FybScsXG59XG5cbmV4cG9ydCBjbGFzcyBDYWNoZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YUNhY2hlOiBNZXRhZGF0YUNhY2hlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YWRhdGFDYWNoZUV2ZW50UmVmZXJlbmNlczogRXZlbnRSZWZbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhdWx0OiBWYXVsdDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhdWx0RXZlbnRSZWZlcmVuY2VzOiBFdmVudFJlZltdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRzOiBUYXNrc0V2ZW50cztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50c0V2ZW50UmVmZXJlbmNlczogRXZlbnRSZWZbXTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFza3NNdXRleDogTXV0ZXg7XG4gICAgcHJpdmF0ZSBzdGF0ZTogU3RhdGU7XG4gICAgcHJpdmF0ZSB0YXNrczogVGFza1tdO1xuXG4gICAgLyoqXG4gICAgICogV2UgY2Fubm90IGtub3cgaWYgdGhpcyBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCBiZWNhdXNlIG9ic2lkaWFuIHN0YXJ0ZWRcbiAgICAgKiBvciBiZWNhdXNlIHRoZSBwbHVnaW4gd2FzIGFjdGl2YXRlZCBsYXRlci4gVGhpcyBtZWFucyB3ZSBoYXZlIHRvIGxvYWQgdGhlXG4gICAgICogd2hvbGUgdmF1bHQgb25jZSBhZnRlciB0aGUgZmlyc3QgbWV0YWRhdGEgY2FjaGUgcmVzb2x2ZSB0byBlbnN1cmUgdGhhdCB3ZVxuICAgICAqIGxvYWQgdGhlIGVudGlyZSB2YXVsdCBpbiBjYXNlIG9ic2lkaWFuIGlzIHN0YXJ0aW5nIHVwLiBJbiB0aGUgY2FzZSBvZlxuICAgICAqIG9ic2lkaWFuIHN0YXJ0aW5nLCB0aGUgdGFzayBjYWNoZSdzIGluaXRpYWwgbG9hZCB3b3VsZCBlbmQgdXAgd2l0aCAwIHRhc2tzLFxuICAgICAqIGFzIHRoZSBtZXRhZGF0YSBjYWNoZSB3b3VsZCBzdGlsbCBiZSBlbXB0eS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRlZEFmdGVyRmlyc3RSZXNvbHZlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoeyBtZXRhZGF0YUNhY2hlLCB2YXVsdCwgZXZlbnRzIH06IHsgbWV0YWRhdGFDYWNoZTogTWV0YWRhdGFDYWNoZTsgdmF1bHQ6IFZhdWx0OyBldmVudHM6IFRhc2tzRXZlbnRzIH0pIHtcbiAgICAgICAgdGhpcy5tZXRhZGF0YUNhY2hlID0gbWV0YWRhdGFDYWNoZTtcbiAgICAgICAgdGhpcy5tZXRhZGF0YUNhY2hlRXZlbnRSZWZlcmVuY2VzID0gW107XG4gICAgICAgIHRoaXMudmF1bHQgPSB2YXVsdDtcbiAgICAgICAgdGhpcy52YXVsdEV2ZW50UmVmZXJlbmNlcyA9IFtdO1xuICAgICAgICB0aGlzLmV2ZW50cyA9IGV2ZW50cztcbiAgICAgICAgdGhpcy5ldmVudHNFdmVudFJlZmVyZW5jZXMgPSBbXTtcblxuICAgICAgICB0aGlzLnRhc2tzTXV0ZXggPSBuZXcgTXV0ZXgoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNvbGQ7XG4gICAgICAgIHRoaXMudGFza3MgPSBbXTtcblxuICAgICAgICB0aGlzLmxvYWRlZEFmdGVyRmlyc3RSZXNvbHZlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0NhY2hlKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG9WYXVsdCgpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvRXZlbnRzKCk7XG5cbiAgICAgICAgdGhpcy5sb2FkVmF1bHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5sb2FkKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50UmVmZXJlbmNlIG9mIHRoaXMubWV0YWRhdGFDYWNoZUV2ZW50UmVmZXJlbmNlcykge1xuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YUNhY2hlLm9mZnJlZihldmVudFJlZmVyZW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50UmVmZXJlbmNlIG9mIHRoaXMudmF1bHRFdmVudFJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIHRoaXMudmF1bHQub2ZmcmVmKGV2ZW50UmVmZXJlbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZXZlbnRSZWZlcmVuY2Ugb2YgdGhpcy5ldmVudHNFdmVudFJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLm9mZihldmVudFJlZmVyZW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGFza3MoKTogVGFza1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFza3M7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0YXRlKCk6IFN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlTdWJzY3JpYmVycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ldmVudHMudHJpZ2dlckNhY2hlVXBkYXRlKHtcbiAgICAgICAgICAgIHRhc2tzOiB0aGlzLnRhc2tzLFxuICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3Vic2NyaWJlVG9DYWNoZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRFdmVudGVSZWZlcmVuY2UgPSB0aGlzLm1ldGFkYXRhQ2FjaGUub24oJ3Jlc29sdmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZWQgZmlyZXMgb24gZXZlcnkgY2hhbmdlLlxuICAgICAgICAgICAgLy8gV2Ugb25seSB3YW50IHRvIGluaXRpYWxpemUgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LlxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvYWRlZEFmdGVyRmlyc3RSZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWRBZnRlckZpcnN0UmVzb2x2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkVmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWV0YWRhdGFDYWNoZUV2ZW50UmVmZXJlbmNlcy5wdXNoKHJlc29sdmVkRXZlbnRlUmVmZXJlbmNlKTtcblxuICAgICAgICAvLyBEb2VzIG5vdCBmaXJlIHdoZW4gc3RhcnRpbmcgdXAgb2JzaWRpYW4gYW5kIG9ubHkgd29ya3MgZm9yIGNoYW5nZXMuXG4gICAgICAgIGNvbnN0IGNoYW5nZWRFdmVudFJlZmVyZW5jZSA9IHRoaXMubWV0YWRhdGFDYWNoZS5vbignY2hhbmdlZCcsIChmaWxlOiBURmlsZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy50YXNrc011dGV4LnJ1bkV4Y2x1c2l2ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleEZpbGUoZmlsZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWV0YWRhdGFDYWNoZUV2ZW50UmVmZXJlbmNlcy5wdXNoKGNoYW5nZWRFdmVudFJlZmVyZW5jZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb1ZhdWx0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IHVzZUZpbGVuYW1lQXNTY2hlZHVsZWREYXRlIH0gPSBnZXRTZXR0aW5ncygpO1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRFdmVudFJlZmVyZW5jZSA9IHRoaXMudmF1bHQub24oJ2NyZWF0ZScsIChmaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRhc2tzTXV0ZXgucnVuRXhjbHVzaXZlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4RmlsZShmaWxlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy52YXVsdEV2ZW50UmVmZXJlbmNlcy5wdXNoKGNyZWF0ZWRFdmVudFJlZmVyZW5jZSk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlZEV2ZW50UmVmZXJlbmNlID0gdGhpcy52YXVsdC5vbignZGVsZXRlJywgKGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGFza3NNdXRleC5ydW5FeGNsdXNpdmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGFza3MgPSB0aGlzLnRhc2tzLmZpbHRlcigodGFzazogVGFzaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5wYXRoICE9PSBmaWxlLnBhdGg7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeVN1YnNjcmliZXJzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmF1bHRFdmVudFJlZmVyZW5jZXMucHVzaChkZWxldGVkRXZlbnRSZWZlcmVuY2UpO1xuXG4gICAgICAgIGNvbnN0IHJlbmFtZWRFdmVudFJlZmVyZW5jZSA9IHRoaXMudmF1bHQub24oJ3JlbmFtZScsIChmaWxlOiBUQWJzdHJhY3RGaWxlLCBvbGRQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGFza3NNdXRleC5ydW5FeGNsdXNpdmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrRGF0ZSA9IG5ldyBMYXp5KCgpID0+IERhdGVGYWxsYmFjay5mcm9tUGF0aChmaWxlLnBhdGgpKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudGFza3MgPSB0aGlzLnRhc2tzLm1hcCgodGFzazogVGFzayk6IFRhc2sgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5wYXRoID09PSBvbGRQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZUZpbGVuYW1lQXNTY2hlZHVsZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYXNrKHsgLi4udGFzaywgcGF0aDogZmlsZS5wYXRoIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZUZhbGxiYWNrLnVwZGF0ZVRhc2tQYXRoKHRhc2ssIGZpbGUucGF0aCwgZmFsbGJhY2tEYXRlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeVN1YnNjcmliZXJzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmF1bHRFdmVudFJlZmVyZW5jZXMucHVzaChyZW5hbWVkRXZlbnRSZWZlcmVuY2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3Vic2NyaWJlVG9FdmVudHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RSZWZlcmVuY2UgPSB0aGlzLmV2ZW50cy5vblJlcXVlc3RDYWNoZVVwZGF0ZSgoaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgaGFuZGxlcih7IHRhc2tzOiB0aGlzLnRhc2tzLCBzdGF0ZTogdGhpcy5zdGF0ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzRXZlbnRSZWZlcmVuY2VzLnB1c2gocmVxdWVzdFJlZmVyZW5jZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkVmF1bHQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tzTXV0ZXgucnVuRXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5Jbml0aWFsaXppbmc7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICB0aGlzLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKS5tYXAoKGZpbGU6IFRGaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGV4RmlsZShmaWxlKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuV2FybTtcbiAgICAgICAgICAgIC8vIE5vdGlmeSB0aGF0IHRoZSBjYWNoZSBpcyBub3cgd2FybTpcbiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbmRleEZpbGUoZmlsZTogVEZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZmlsZUNhY2hlID0gdGhpcy5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICAgICAgaWYgKGZpbGVDYWNoZSA9PT0gbnVsbCB8fCBmaWxlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2xkVGFza3MgPSB0aGlzLnRhc2tzLmZpbHRlcigodGFzazogVGFzaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhc2sucGF0aCA9PT0gZmlsZS5wYXRoO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBsaXN0SXRlbXMgPSBmaWxlQ2FjaGUubGlzdEl0ZW1zO1xuICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGxpc3QgaXRlbXMgY2FjaGUsIHRoZXJlIGFyZSBubyB0YXNrcy5cbiAgICAgICAgLy8gU3RpbGwgY29udGludWUgdG8gbm90aWZ5IHdhdGNoZXJzIG9mIHJlbW92YWwuXG5cbiAgICAgICAgbGV0IG5ld1Rhc2tzOiBUYXNrW10gPSBbXTtcbiAgICAgICAgaWYgKGxpc3RJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHJlYWQgdGhlIGZpbGUgYW5kIHByb2Nlc3MgZm9yIHRhc2tzIGlmIHRoZXJlIGFyZSBsaXN0IGl0ZW1zLlxuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCB0aGlzLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XG4gICAgICAgICAgICBuZXdUYXNrcyA9IHRoaXMuZ2V0VGFza3NGcm9tRmlsZUNvbnRlbnQoZmlsZUNvbnRlbnQsIGxpc3RJdGVtcywgZmlsZUNhY2hlLCBmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBjaGFuZ2VzIGluIGFueSBvZiB0aGUgdGFza3MsIHRoZXJlJ3NcbiAgICAgICAgLy8gbm90aGluZyB0byBkbywgc28ganVzdCByZXR1cm4uXG4gICAgICAgIGlmIChUYXNrLnRhc2tzTGlzdHNJZGVudGljYWwob2xkVGFza3MsIG5ld1Rhc2tzKSkge1xuICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGtlcHQgZm9yIG5vdywgdG8gYWxsb3cgZm9yIGRlYnVnZ2luZyBkdXJpbmcgZGV2ZWxvcG1lbnQuXG4gICAgICAgICAgICAvLyBJdCBpcyB0b28gdmVyYm9zZSB0byByZWxlYXNlIHRvIHVzZXJzLlxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuZ2V0U3RhdGUoKSA9PSBTdGF0ZS5XYXJtKSB7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5kZWJ1ZyhgVGFza3MgdW5jaGFuZ2VkIGluICR7ZmlsZS5wYXRofWApO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2V0U3RhdGUoKSA9PSBTdGF0ZS5XYXJtKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBBdCBsZWFzdCBvbmUgdGFzaywgaXRzIGxpbmUgbnVtYmVyIG9yIGl0cyBoZWFkaW5nIGhhcyBjaGFuZ2VkIGluICR7ZmlsZS5wYXRofTogdHJpZ2dlcmluZyBhIHJlZnJlc2ggb2YgYWxsIGFjdGl2ZSBUYXNrcyBibG9ja3MgaW4gTGl2ZSBQcmV2aWV3IGFuZCBSZWFkaW5nIG1vZGUgdmlld3MuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgYWxsIHRhc2tzIGZyb20gdGhpcyBmaWxlIGZyb20gdGhlIGNhY2hlIGJlZm9yZVxuICAgICAgICAvLyBhZGRpbmcgdGhlIG9uZXMgdGhhdCBhcmUgY3VycmVudGx5IGluIHRoZSBmaWxlLlxuICAgICAgICB0aGlzLnRhc2tzID0gdGhpcy50YXNrcy5maWx0ZXIoKHRhc2s6IFRhc2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLnBhdGggIT09IGZpbGUucGF0aDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50YXNrcy5wdXNoKC4uLm5ld1Rhc2tzKTtcblxuICAgICAgICAvLyBBbGwgdXBkYXRlZCwgaW5mb3JtIG91ciBzdWJzY3JpYmVycy5cbiAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VGFza3NGcm9tRmlsZUNvbnRlbnQoXG4gICAgICAgIGZpbGVDb250ZW50OiBzdHJpbmcsXG4gICAgICAgIGxpc3RJdGVtczogTGlzdEl0ZW1DYWNoZVtdLFxuICAgICAgICBmaWxlQ2FjaGU6IENhY2hlZE1ldGFkYXRhLFxuICAgICAgICBmaWxlOiBURmlsZSxcbiAgICApOiBUYXNrW10ge1xuICAgICAgICBjb25zdCB0YXNrczogVGFza1tdID0gW107XG4gICAgICAgIGNvbnN0IGZpbGVMaW5lcyA9IGZpbGVDb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgY29uc3QgbGluZXNJbkZpbGUgPSBmaWxlTGluZXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIExhemlseSBzdG9yZSBkYXRlIGV4dHJhY3RlZCBmcm9tIGZpbGVuYW1lIHRvIGF2b2lkIHBhcnNpbmcgbW9yZSB0aGFuIG5lZWRlZFxuICAgICAgICAvLyBjb25zb2xlLmRlYnVnKGBnZXRUYXNrc0Zyb21GaWxlQ29udGVudCgpIHJlYWRpbmcgJHtmaWxlLnBhdGh9YCk7XG4gICAgICAgIGNvbnN0IGRhdGVGcm9tRmlsZU5hbWUgPSBuZXcgTGF6eSgoKSA9PiBEYXRlRmFsbGJhY2suZnJvbVBhdGgoZmlsZS5wYXRoKSk7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0byBzdG9yZSBzZWN0aW9uIGluZm9ybWF0aW9uIHdpdGggZXZlcnkgdGFzayBzb1xuICAgICAgICAvLyB0aGF0IHdlIGNhbiB1c2UgdGhhdCB3aGVuIHdlIHBvc3QgcHJvY2VzcyB0aGUgbWFya2Rvd25cbiAgICAgICAgLy8gcmVuZGVyZWQgbGlzdHMuXG4gICAgICAgIGxldCBjdXJyZW50U2VjdGlvbjogU2VjdGlvbkNhY2hlIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBzZWN0aW9uSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RJdGVtIG9mIGxpc3RJdGVtcykge1xuICAgICAgICAgICAgaWYgKGxpc3RJdGVtLnRhc2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBsaXN0SXRlbS5wb3NpdGlvbi5zdGFydC5saW5lO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyID49IGxpbmVzSW5GaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICBPYnNpZGlhbiBDYWNoZWRNZXRhZGF0YSBoYXMgdG9sZCB1cyB0aGF0IHRoZXJlIGlzIGEgdGFzayBvbiBsaW5lTnVtYmVyLCBidXQgdGhlcmUgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBub3QgdGhhdCBtYW55IGxpbmVzIGluIHRoZSBmaWxlLlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHdhcyB0aGUgdW5kZXJseWluZyBjYXVzZSBvZiBhbGwgdGhlICdTdHVjayBvbiBcIkxvYWRpbmcgVGFza3MuLi5cIicgbWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcyBpdCByZXN1bHRlZCBpbiB0aGUgbGluZSAndW5kZWZpbmVkJyBiZWluZyBwYXJzZWQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFNvbWVob3cgdGhlIGZpbGUgaGFkIGJlZW4gc2hvcnRlbmVkIHdoaWxzdCBPYnNpZGlhbiB3YXMgY2xvc2VkLCBtZWFuaW5nIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gT2JzaWRpYW4gc3RhcnRlZCB1cCwgaXQgZ290IHRoZSBuZXcgZmlsZSBjb250ZW50LCBidXQgc3RpbGwgaGFkIHRoZSBvbGQgY2FjaGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGFib3V0IGxvY2F0aW9ucyBvZiBsaXN0IGl0ZW1zIGluIHRoZSBmaWxlLlxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtmaWxlLnBhdGh9IE9ic2lkaWFuIGdhdmUgdXMgYSBsaW5lIG51bWJlciAke2xpbmVOdW1iZXJ9IHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZS4gJHtsaW5lc0luRmlsZX0uYCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2tzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNlY3Rpb24gPT09IG51bGwgfHwgY3VycmVudFNlY3Rpb24ucG9zaXRpb24uZW5kLmxpbmUgPCBsaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIHdlbnQgcGFzdCB0aGUgY3VycmVudCBzZWN0aW9uIChvciB0aGlzIGlzIHRoZSBmaXJzdCB0YXNrKS5cbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgc2VjdGlvbiB0aGF0IGlzIHJlbGV2YW50IGZvciB0aGlzIHRhc2sgYW5kIHRoZSBmb2xsb3dpbmcgb2YgdGhlIHNhbWUgc2VjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlY3Rpb24gPSBDYWNoZS5nZXRTZWN0aW9uKGxpbmVOdW1iZXIsIGZpbGVDYWNoZS5zZWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25JbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWN0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbm5vdCBwcm9jZXNzIGEgdGFzayB3aXRob3V0IGEgc2VjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IGZpbGVMaW5lc1tsaW5lTnVtYmVyXTtcbiAgICAgICAgICAgICAgICBpZiAobGluZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2ZpbGUucGF0aH06IGxpbmUgJHtsaW5lTnVtYmVyfSAtIGlnbm9yaW5nICd1bmRlZmluZWQnIGxpbmUuYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB0YXNrO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2sgPSBUYXNrLmZyb21MaW5lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBmaWxlLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uU3RhcnQ6IGN1cnJlbnRTZWN0aW9uLnBvc2l0aW9uLnN0YXJ0LmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjZWRpbmdIZWFkZXI6IENhY2hlLmdldFByZWNlZGluZ0hlYWRlcihsaW5lTnVtYmVyLCBmaWxlQ2FjaGUuaGVhZGluZ3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tEYXRlOiBkYXRlRnJvbUZpbGVOYW1lLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0VGFza1BhcnNpbmdFcnJvclRvVXNlcihlLCBmaWxlLCBsaXN0SXRlbSwgbGluZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0YXNrICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25JbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHRhc2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXNrcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlcG9ydFRhc2tQYXJzaW5nRXJyb3JUb1VzZXIoZTogYW55LCBmaWxlOiBURmlsZSwgbGlzdEl0ZW06IExpc3RJdGVtQ2FjaGUsIGxpbmU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBtc2cgPSBgVGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgb25lIG9mIHRoZSB0YXNrcyBpbiB0aGlzIHZhdWx0LlxuVGhlIGZvbGxvd2luZyB0YXNrIGhhcyBiZWVuIGlnbm9yZWQsIHRvIHByZXZlbnQgVGFza3MgcXVlcmllcyBnZXR0aW5nIHN0dWNrIHdpdGggJ0xvYWRpbmcgVGFza3MgLi4uJ1xuRXJyb3I6ICR7ZX1cbkZpbGU6ICR7ZmlsZS5wYXRofVxuTGluZSBudW1iZXI6ICR7bGlzdEl0ZW0ucG9zaXRpb24uc3RhcnQubGluZX1cblRhc2sgbGluZTogJHtsaW5lfVxuXG5QbGVhc2UgY3JlYXRlIGEgYnVnIHJlcG9ydCBmb3IgdGhpcyBtZXNzYWdlIGF0XG5odHRwczovL2dpdGh1Yi5jb20vb2JzaWRpYW4tdGFza3MtZ3JvdXAvb2JzaWRpYW4tdGFza3MvaXNzdWVzL25ldy9jaG9vc2VcbnRvIGhlbHAgdXMgZmluZCBhbmQgZml4IHRoZSB1bmRlcmx5aW5nIGlzc3VlLlxuXG5JbmNsdWRlOlxuLSBlaXRoZXIgYSBzY3JlZW5zaG90IG9mIHRoZSBlcnJvciBwb3B1cCwgb3IgY29weSB0aGUgdGV4dCBmcm9tIHRoZSBjb25zb2xlLCBpZiBvbiBhIGRlc2t0b3AgbWFjaGluZS5cbi0gdGhlIG91dHB1dCBmcm9tIHJ1bm5pbmcgdGhlIE9ic2lkaWFuIGNvbW1hbmQgJ1Nob3cgZGVidWcgaW5mbydcblxuVGhlIGVycm9yIHBvcHVwIHdpbGwgb25seSBiZSBzaG93biB3aGVuIFRhc2tzIGlzIHN0YXJ0aW5nIHVwLCBidXQgaWYgdGhlIGVycm9yIHBlcnNpc3RzLFxuaXQgd2lsbCBiZSBzaG93biBpbiB0aGUgY29uc29sZSBldmVyeSB0aW1lIHRoaXMgZmlsZSBpcyBlZGl0ZWQgZHVyaW5nIHRoZSBPYnNpZGlhblxuc2Vzc2lvbi5cbmA7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gU3RhdGUuSW5pdGlhbGl6aW5nKSB7XG4gICAgICAgICAgICBuZXcgTm90aWNlKG1zZywgMTAwMDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0U2VjdGlvbihsaW5lTnVtYmVyVGFzazogbnVtYmVyLCBzZWN0aW9uczogU2VjdGlvbkNhY2hlW10gfCB1bmRlZmluZWQpOiBTZWN0aW9uQ2FjaGUgfCBudWxsIHtcbiAgICAgICAgaWYgKHNlY3Rpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5wb3NpdGlvbi5zdGFydC5saW5lIDw9IGxpbmVOdW1iZXJUYXNrICYmIHNlY3Rpb24ucG9zaXRpb24uZW5kLmxpbmUgPj0gbGluZU51bWJlclRhc2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldFByZWNlZGluZ0hlYWRlcihsaW5lTnVtYmVyVGFzazogbnVtYmVyLCBoZWFkaW5nczogSGVhZGluZ0NhY2hlW10gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKGhlYWRpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByZWNlZGluZ0hlYWRlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgZm9yIChjb25zdCBoZWFkaW5nIG9mIGhlYWRpbmdzKSB7XG4gICAgICAgICAgICBpZiAoaGVhZGluZy5wb3NpdGlvbi5zdGFydC5saW5lID4gbGluZU51bWJlclRhc2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlY2VkaW5nSGVhZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJlY2VkaW5nSGVhZGVyID0gaGVhZGluZy5oZWFkaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVjZWRpbmdIZWFkZXI7XG4gICAgfVxufVxuIiwgImNvbnN0IEVfVElNRU9VVCA9IG5ldyBFcnJvcigndGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBtdXRleCB0byBiZWNvbWUgYXZhaWxhYmxlJyk7XG5jb25zdCBFX0FMUkVBRFlfTE9DS0VEID0gbmV3IEVycm9yKCdtdXRleCBhbHJlYWR5IGxvY2tlZCcpO1xuY29uc3QgRV9DQU5DRUxFRCA9IG5ldyBFcnJvcigncmVxdWVzdCBmb3IgbG9jayBjYW5jZWxlZCcpO1xuXG52YXIgX19hd2FpdGVyJDIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmNsYXNzIFNlbWFwaG9yZSB7XG4gICAgY29uc3RydWN0b3IoX21heENvbmN1cnJlbmN5LCBfY2FuY2VsRXJyb3IgPSBFX0NBTkNFTEVEKSB7XG4gICAgICAgIHRoaXMuX21heENvbmN1cnJlbmN5ID0gX21heENvbmN1cnJlbmN5O1xuICAgICAgICB0aGlzLl9jYW5jZWxFcnJvciA9IF9jYW5jZWxFcnJvcjtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5fd2FpdGVycyA9IFtdO1xuICAgICAgICBpZiAoX21heENvbmN1cnJlbmN5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2VtYXBob3JlIG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gYSBwb3NpdGl2ZSB2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gX21heENvbmN1cnJlbmN5O1xuICAgIH1cbiAgICBhY3F1aXJlKCkge1xuICAgICAgICBjb25zdCBsb2NrZWQgPSB0aGlzLmlzTG9ja2VkKCk7XG4gICAgICAgIGNvbnN0IHRpY2tldFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB0aGlzLl9xdWV1ZS5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pKTtcbiAgICAgICAgaWYgKCFsb2NrZWQpXG4gICAgICAgICAgICB0aGlzLl9kaXNwYXRjaCgpO1xuICAgICAgICByZXR1cm4gdGlja2V0UHJvbWlzZTtcbiAgICB9XG4gICAgcnVuRXhjbHVzaXZlKGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIkMih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgcmVsZWFzZV0gPSB5aWVsZCB0aGlzLmFjcXVpcmUoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkIGNhbGxiYWNrKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdhaXRGb3JVbmxvY2soKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIkMih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xvY2tlZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgd2FpdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gdGhpcy5fd2FpdGVycy5wdXNoKHsgcmVzb2x2ZSB9KSk7XG4gICAgICAgICAgICByZXR1cm4gd2FpdFByb21pc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpc0xvY2tlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlIDw9IDA7XG4gICAgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGluIDAuMy4wLCB3aWxsIGJlIHJlbW92ZWQgaW4gMC40LjAuIFVzZSBydW5FeGNsdXNpdmUgaW5zdGVhZC4gKi9cbiAgICByZWxlYXNlKCkge1xuICAgICAgICBpZiAodGhpcy5fbWF4Q29uY3VycmVuY3kgPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgbWV0aG9kIGlzIHVuYXZhaWxhYmxlIG9uIHNlbWFwaG9yZXMgd2l0aCBjb25jdXJyZW5jeSA+IDE7IHVzZSB0aGUgc2NvcGVkIHJlbGVhc2UgcmV0dXJuZWQgYnkgYWNxdWlyZSBpbnN0ZWFkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRSZWxlYXNlcikge1xuICAgICAgICAgICAgY29uc3QgcmVsZWFzZXIgPSB0aGlzLl9jdXJyZW50UmVsZWFzZXI7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50UmVsZWFzZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZWxlYXNlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5fcXVldWUuZm9yRWFjaCgodGlja2V0KSA9PiB0aWNrZXQucmVqZWN0KHRoaXMuX2NhbmNlbEVycm9yKSk7XG4gICAgICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgfVxuICAgIF9kaXNwYXRjaCgpIHtcbiAgICAgICAgY29uc3QgbmV4dFRpY2tldCA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGlmICghbmV4dFRpY2tldClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHJlbGVhc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRSZWxlYXNlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWxlYXNlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICByZWxlYXNlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZSsrO1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZVdhaXRlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoKCk7XG4gICAgICAgIH07XG4gICAgICAgIG5leHRUaWNrZXQucmVzb2x2ZShbdGhpcy5fdmFsdWUtLSwgdGhpcy5fY3VycmVudFJlbGVhc2VyXSk7XG4gICAgfVxuICAgIF9yZXNvbHZlV2FpdGVycygpIHtcbiAgICAgICAgdGhpcy5fd2FpdGVycy5mb3JFYWNoKCh3YWl0ZXIpID0+IHdhaXRlci5yZXNvbHZlKCkpO1xuICAgICAgICB0aGlzLl93YWl0ZXJzID0gW107XG4gICAgfVxufVxuXG52YXIgX19hd2FpdGVyJDEgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmNsYXNzIE11dGV4IHtcbiAgICBjb25zdHJ1Y3RvcihjYW5jZWxFcnJvcikge1xuICAgICAgICB0aGlzLl9zZW1hcGhvcmUgPSBuZXcgU2VtYXBob3JlKDEsIGNhbmNlbEVycm9yKTtcbiAgICB9XG4gICAgYWNxdWlyZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlciQxKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgWywgcmVsZWFzZXJdID0geWllbGQgdGhpcy5fc2VtYXBob3JlLmFjcXVpcmUoKTtcbiAgICAgICAgICAgIHJldHVybiByZWxlYXNlcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJ1bkV4Y2x1c2l2ZShjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLnJ1bkV4Y2x1c2l2ZSgoKSA9PiBjYWxsYmFjaygpKTtcbiAgICB9XG4gICAgaXNMb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZW1hcGhvcmUuaXNMb2NrZWQoKTtcbiAgICB9XG4gICAgd2FpdEZvclVubG9jaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbWFwaG9yZS53YWl0Rm9yVW5sb2NrKCk7XG4gICAgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGluIDAuMy4wLCB3aWxsIGJlIHJlbW92ZWQgaW4gMC40LjAuIFVzZSBydW5FeGNsdXNpdmUgaW5zdGVhZC4gKi9cbiAgICByZWxlYXNlKCkge1xuICAgICAgICB0aGlzLl9zZW1hcGhvcmUucmVsZWFzZSgpO1xuICAgIH1cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZW1hcGhvcmUuY2FuY2VsKCk7XG4gICAgfVxufVxuXG52YXIgX19hd2FpdGVyID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZnVuY3Rpb24gd2l0aFRpbWVvdXQoc3luYywgdGltZW91dCwgdGltZW91dEVycm9yID0gRV9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWNxdWlyZTogKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IGlzVGltZW91dCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXNUaW1lb3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZWplY3QodGltZW91dEVycm9yKTtcbiAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWNrZXQgPSB5aWVsZCBzeW5jLmFjcXVpcmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGVhc2UgPSBBcnJheS5pc0FycmF5KHRpY2tldCkgPyB0aWNrZXRbMV0gOiB0aWNrZXQ7XG4gICAgICAgICAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRpY2tldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpLFxuICAgICAgICBydW5FeGNsdXNpdmUoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlbGVhc2UgPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlja2V0ID0geWllbGQgdGhpcy5hY3F1aXJlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRpY2tldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPSB0aWNrZXRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgY2FsbGJhY2sodGlja2V0WzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPSB0aWNrZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCBpbiAwLjMuMCwgd2lsbCBiZSByZW1vdmVkIGluIDAuNC4wLiBVc2UgcnVuRXhjbHVzaXZlIGluc3RlYWQuICovXG4gICAgICAgIHJlbGVhc2UoKSB7XG4gICAgICAgICAgICBzeW5jLnJlbGVhc2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2FuY2VsKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN5bmMuY2FuY2VsKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHdhaXRGb3JVbmxvY2s6ICgpID0+IHN5bmMud2FpdEZvclVubG9jaygpLFxuICAgICAgICBpc0xvY2tlZDogKCkgPT4gc3luYy5pc0xvY2tlZCgpLFxuICAgIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGlzbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZnVuY3Rpb24gdHJ5QWNxdWlyZShzeW5jLCBhbHJlYWR5QWNxdWlyZWRFcnJvciA9IEVfQUxSRUFEWV9MT0NLRUQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJldHVybiB3aXRoVGltZW91dChzeW5jLCAwLCBhbHJlYWR5QWNxdWlyZWRFcnJvcik7XG59XG5cbmV4cG9ydCB7IEVfQUxSRUFEWV9MT0NLRUQsIEVfQ0FOQ0VMRUQsIEVfVElNRU9VVCwgTXV0ZXgsIFNlbWFwaG9yZSwgdHJ5QWNxdWlyZSwgd2l0aFRpbWVvdXQgfTtcbiIsICIvKipcbiAqIFZhcmlvdXMgcmVuZGVyaW5nIG9wdGlvbnMgZm9yIGEgcXVlcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXlvdXRPcHRpb25zIHtcbiAgICBoaWRlVGFza0NvdW50OiBib29sZWFuID0gZmFsc2U7XG4gICAgaGlkZUJhY2tsaW5rczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGhpZGVQcmlvcml0eTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGhpZGVTdGFydERhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBoaWRlU2NoZWR1bGVkRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGhpZGVEb25lRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGhpZGVEdWVEYXRlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaGlkZVJlY3VycmVuY2VSdWxlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaGlkZUVkaXRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBoaWRlVXJnZW5jeTogYm9vbGVhbiA9IHRydWU7XG4gICAgc2hvcnRNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gICAgZXhwbGFpblF1ZXJ5OiBib29sZWFuID0gZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIFRhc2tMYXlvdXRDb21wb25lbnQgPVxuICAgIHwgJ2Rlc2NyaXB0aW9uJ1xuICAgIHwgJ3ByaW9yaXR5J1xuICAgIHwgJ3JlY3VycmVuY2VSdWxlJ1xuICAgIHwgJ3N0YXJ0RGF0ZSdcbiAgICB8ICdzY2hlZHVsZWREYXRlJ1xuICAgIHwgJ2R1ZURhdGUnXG4gICAgfCAnZG9uZURhdGUnXG4gICAgfCAnYmxvY2tMaW5rJztcblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgdGhlIGRlc2lyZWQgbGF5b3V0IG9mIHRhc2tzIHdoZW4gdGhleSBhcmUgcmVuZGVyZWQgaW4gYSBnaXZlbiBjb25maWd1cmF0aW9uLlxuICogVGhlIGxheW91dCBpcyB1c2VkIHdoZW4gZmxhdHRlbmluZyB0aGUgdGFzayB0byBhIHN0cmluZyBhbmQgd2hlbiByZW5kZXJpbmcgcXVlcmllcywgYW5kIGNhbiBiZVxuICogbW9kaWZpZWQgYnkgYXBwbHlpbmcge0BsaW5rIExheW91dE9wdGlvbnN9IG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXNrTGF5b3V0IHtcbiAgICBwdWJsaWMgZGVmYXVsdExheW91dDogVGFza0xheW91dENvbXBvbmVudFtdID0gW1xuICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAncHJpb3JpdHknLFxuICAgICAgICAncmVjdXJyZW5jZVJ1bGUnLFxuICAgICAgICAnc3RhcnREYXRlJyxcbiAgICAgICAgJ3NjaGVkdWxlZERhdGUnLFxuICAgICAgICAnZHVlRGF0ZScsXG4gICAgICAgICdkb25lRGF0ZScsXG4gICAgICAgICdibG9ja0xpbmsnLFxuICAgIF07XG4gICAgcHVibGljIGxheW91dENvbXBvbmVudHM6IFRhc2tMYXlvdXRDb21wb25lbnRbXTtcbiAgICBwdWJsaWMgaGlkZGVuQ29tcG9uZW50czogVGFza0xheW91dENvbXBvbmVudFtdID0gW107XG4gICAgcHVibGljIG9wdGlvbnM6IExheW91dE9wdGlvbnM7XG4gICAgcHVibGljIHNwZWNpZmljQ2xhc3Nlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBMYXlvdXRPcHRpb25zLCBjb21wb25lbnRzPzogVGFza0xheW91dENvbXBvbmVudFtdKSB7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gbmV3IExheW91dE9wdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9uZW50cykge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRDb21wb25lbnRzID0gY29tcG9uZW50cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Q29tcG9uZW50cyA9IHRoaXMuZGVmYXVsdExheW91dDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxheW91dENvbXBvbmVudHMgPSB0aGlzLmFwcGx5T3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIG5ldyBsaXN0IG9mIGNvbXBvbmVudHMgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucyBhcHBsaWVkLlxuICAgICAqL1xuICAgIGFwcGx5T3B0aW9ucyhsYXlvdXRPcHRpb25zOiBMYXlvdXRPcHRpb25zKTogVGFza0xheW91dENvbXBvbmVudFtdIHtcbiAgICAgICAgLy8gUmVtb3ZlIGEgY29tcG9uZW50IGZyb20gdGhlIHRhc2tDb21wb25lbnRzIGFycmF5IGlmIHRoZSBnaXZlbiBsYXlvdXRPcHRpb24gY3JpdGVyaWEgaXMgbWV0LFxuICAgICAgICAvLyBhbmQgYWRkIHRvIHRoZSBsYXlvdXQncyBzcGVjaWZpYyBjbGFzc2VzIGxpc3QgdGhlIGNsYXNzIHRoYXQgZGVub3RlcyB0aGF0IHRoaXMgY29tcG9uZW50XG4gICAgICAgIC8vIGlzbid0IGluIHRoZSBsYXlvdXRcbiAgICAgICAgY29uc3QgcmVtb3ZlSWYgPSAoXG4gICAgICAgICAgICB0YXNrQ29tcG9uZW50czogVGFza0xheW91dENvbXBvbmVudFtdLFxuICAgICAgICAgICAgc2hvdWxkUmVtb3ZlOiBib29sZWFuLFxuICAgICAgICAgICAgY29tcG9uZW50VG9SZW1vdmU6IFRhc2tMYXlvdXRDb21wb25lbnQsXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgICAgaWYgKHNob3VsZFJlbW92ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lmaWNDbGFzc2VzLnB1c2goYHRhc2tzLWxheW91dC1oaWRlLSR7Y29tcG9uZW50VG9SZW1vdmV9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRkZW5Db21wb25lbnRzLnB1c2goY29tcG9uZW50VG9SZW1vdmUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXNrQ29tcG9uZW50cy5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQgIT0gY29tcG9uZW50VG9SZW1vdmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFza0NvbXBvbmVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFJlbW92ZSBjb21wb25lbnRzIGZyb20gdGhlIGxheW91dCBhY2NvcmRpbmcgdG8gdGhlIHRhc2sgb3B0aW9ucy4gVGhlc2UgcmVwcmVzZW50IHRoZSBleGlzdGluZyB0YXNrIG9wdGlvbnMsXG4gICAgICAgIC8vIHNvIHNvbWUgY29tcG9uZW50cyAoZS5nLiB0aGUgZGVzY3JpcHRpb24pIGFyZSBub3QgaGVyZSBiZWNhdXNlIHRoZXJlIGFyZSBubyBsYXlvdXQgb3B0aW9ucyB0byByZW1vdmUgdGhlbS5cbiAgICAgICAgbGV0IG5ld0NvbXBvbmVudHMgPSB0aGlzLmxheW91dENvbXBvbmVudHM7XG4gICAgICAgIG5ld0NvbXBvbmVudHMgPSByZW1vdmVJZihuZXdDb21wb25lbnRzLCBsYXlvdXRPcHRpb25zLmhpZGVQcmlvcml0eSwgJ3ByaW9yaXR5Jyk7XG4gICAgICAgIG5ld0NvbXBvbmVudHMgPSByZW1vdmVJZihuZXdDb21wb25lbnRzLCBsYXlvdXRPcHRpb25zLmhpZGVSZWN1cnJlbmNlUnVsZSwgJ3JlY3VycmVuY2VSdWxlJyk7XG4gICAgICAgIG5ld0NvbXBvbmVudHMgPSByZW1vdmVJZihuZXdDb21wb25lbnRzLCBsYXlvdXRPcHRpb25zLmhpZGVTdGFydERhdGUsICdzdGFydERhdGUnKTtcbiAgICAgICAgbmV3Q29tcG9uZW50cyA9IHJlbW92ZUlmKG5ld0NvbXBvbmVudHMsIGxheW91dE9wdGlvbnMuaGlkZVNjaGVkdWxlZERhdGUsICdzY2hlZHVsZWREYXRlJyk7XG4gICAgICAgIG5ld0NvbXBvbmVudHMgPSByZW1vdmVJZihuZXdDb21wb25lbnRzLCBsYXlvdXRPcHRpb25zLmhpZGVEdWVEYXRlLCAnZHVlRGF0ZScpO1xuICAgICAgICBuZXdDb21wb25lbnRzID0gcmVtb3ZlSWYobmV3Q29tcG9uZW50cywgbGF5b3V0T3B0aW9ucy5oaWRlRG9uZURhdGUsICdkb25lRGF0ZScpO1xuICAgICAgICBpZiAobGF5b3V0T3B0aW9ucy5zaG9ydE1vZGUpIHRoaXMuc3BlY2lmaWNDbGFzc2VzLnB1c2goJ3Rhc2tzLWxheW91dC1zaG9ydC1tb2RlJyk7XG4gICAgICAgIHJldHVybiBuZXdDb21wb25lbnRzO1xuICAgIH1cbn1cbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJpbXBvcnQgdHNsaWIgZnJvbSAnLi4vdHNsaWIuanMnO1xyXG5jb25zdCB7XHJcbiAgICBfX2V4dGVuZHMsXHJcbiAgICBfX2Fzc2lnbixcclxuICAgIF9fcmVzdCxcclxuICAgIF9fZGVjb3JhdGUsXHJcbiAgICBfX3BhcmFtLFxyXG4gICAgX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcixcclxuICAgIF9fZ2VuZXJhdG9yLFxyXG4gICAgX19leHBvcnRTdGFyLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nLFxyXG4gICAgX192YWx1ZXMsXHJcbiAgICBfX3JlYWQsXHJcbiAgICBfX3NwcmVhZCxcclxuICAgIF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcclxuICAgIF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxyXG59ID0gdHNsaWI7XHJcbmV4cG9ydCB7XHJcbiAgICBfX2V4dGVuZHMsXHJcbiAgICBfX2Fzc2lnbixcclxuICAgIF9fcmVzdCxcclxuICAgIF9fZGVjb3JhdGUsXHJcbiAgICBfX3BhcmFtLFxyXG4gICAgX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcixcclxuICAgIF9fZ2VuZXJhdG9yLFxyXG4gICAgX19leHBvcnRTdGFyLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nLFxyXG4gICAgX192YWx1ZXMsXHJcbiAgICBfX3JlYWQsXHJcbiAgICBfX3NwcmVhZCxcclxuICAgIF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcclxuICAgIF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxyXG59O1xyXG4iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVCeURhdGUoYTogbW9tZW50Lk1vbWVudCB8IG51bGwsIGI6IG1vbWVudC5Nb21lbnQgfCBudWxsKTogLTEgfCAwIHwgMSB7XG4gICAgaWYgKGEgIT09IG51bGwgJiYgYiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChhID09PSBudWxsICYmIGIgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChhICE9PSBudWxsICYmIGIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGEuaXNWYWxpZCgpICYmICFiLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2UgaWYgKCFhLmlzVmFsaWQoKSAmJiBiLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYS5pc0FmdGVyKGIpKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIGlmIChhLmlzQmVmb3JlKGIpKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBSUnVsZSB9IGZyb20gJ3JydWxlJztcbmltcG9ydCB7IGNvbXBhcmVCeURhdGUgfSBmcm9tICcuL2xpYi9EYXRlVG9vbHMnO1xuXG5leHBvcnQgY2xhc3MgUmVjdXJyZW5jZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBycnVsZTogUlJ1bGU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBiYXNlT25Ub2RheTogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjaGVkdWxlZERhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkdWVEYXRlOiBNb21lbnQgfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJlZmVyZW5jZSBkYXRlIGlzIHVzZWQgdG8gY2FsY3VsYXRlIGZ1dHVyZSBvY2N1cnJlbmNlcy5cbiAgICAgKlxuICAgICAqIEZ1dHVyZSBvY2N1cnJlbmNlcyB3aWxsIHJlY3VyIGJhc2VkIG9uIHRoZSByZWZlcmVuY2UgZGF0ZS5cbiAgICAgKiBUaGUgcmVmZXJlbmNlIGRhdGUgaXMgdGhlIGR1ZSBkYXRlLCBpZiBpdCBpcyBnaXZlbi5cbiAgICAgKiBPdGhlcndpc2UgdGhlIHNjaGVkdWxlZCBkYXRlLCBpZiBpdCBpcyBnaXZlbi4gQW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogUmVjdXJyZW5jZSBvZiBhbGwgZGF0ZXMgd2lsbCBiZSBrZXB0IHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2UgZGF0ZS5cbiAgICAgKiBGb3IgZXhhbXBsZTogaWYgdGhlIGR1ZSBkYXRlIGFuZCB0aGUgc3RhcnQgZGF0ZSBhcmUgZ2l2ZW4sIHRoZSBkdWUgZGF0ZVxuICAgICAqIGlzIHRoZSByZWZlcmVuY2UgZGF0ZS4gRnV0dXJlIG9jY3VycmVuY2VzIHdpbGwgaGF2ZSBhIHN0YXJ0IGRhdGUgd2l0aCB0aGVcbiAgICAgKiBzYW1lIHJlbGF0aXZlIGRpc3RhbmNlIHRvIHRoZSBkdWUgZGF0ZSBhcyB0aGUgb3JpZ2luYWwgdGFzay4gRm9yIGV4YW1wbGVcbiAgICAgKiBcInN0YXJ0cyBvbmUgd2VlayBiZWZvcmUgaXQgaXMgZHVlXCIuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWZlcmVuY2VEYXRlOiBNb21lbnQgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBycnVsZSxcbiAgICAgICAgYmFzZU9uVG9kYXksXG4gICAgICAgIHJlZmVyZW5jZURhdGUsXG4gICAgICAgIHN0YXJ0RGF0ZSxcbiAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgZHVlRGF0ZSxcbiAgICB9OiB7XG4gICAgICAgIHJydWxlOiBSUnVsZTtcbiAgICAgICAgYmFzZU9uVG9kYXk6IGJvb2xlYW47XG4gICAgICAgIHJlZmVyZW5jZURhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgICAgIHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgc2NoZWR1bGVkRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgZHVlRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMucnJ1bGUgPSBycnVsZTtcbiAgICAgICAgdGhpcy5iYXNlT25Ub2RheSA9IGJhc2VPblRvZGF5O1xuICAgICAgICB0aGlzLnJlZmVyZW5jZURhdGUgPSByZWZlcmVuY2VEYXRlO1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZWREYXRlID0gc2NoZWR1bGVkRGF0ZTtcbiAgICAgICAgdGhpcy5kdWVEYXRlID0gZHVlRGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21UZXh0KHtcbiAgICAgICAgcmVjdXJyZW5jZVJ1bGVUZXh0LFxuICAgICAgICBzdGFydERhdGUsXG4gICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgIGR1ZURhdGUsXG4gICAgfToge1xuICAgICAgICByZWN1cnJlbmNlUnVsZVRleHQ6IHN0cmluZztcbiAgICAgICAgc3RhcnREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgICAgICBzY2hlZHVsZWREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgICAgICBkdWVEYXRlOiBNb21lbnQgfCBudWxsO1xuICAgIH0pOiBSZWN1cnJlbmNlIHwgbnVsbCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHJlY3VycmVuY2VSdWxlVGV4dC5tYXRjaCgvXihbYS16QS1aMC05LCAhXSs/KSggd2hlbiBkb25lKT8kL2kpO1xuICAgICAgICAgICAgaWYgKG1hdGNoID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaXNvbGF0ZWRSdWxlVGV4dCA9IG1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VPblRvZGF5ID0gbWF0Y2hbMl0gIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IFJSdWxlLnBhcnNlVGV4dChpc29sYXRlZFJ1bGVUZXh0KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gUGljayB0aGUgcmVmZXJlbmNlIGRhdGUgZm9yIHJlY3VycmVuY2UgYmFzZWQgb24gaW1wb3J0YW5jZS5cbiAgICAgICAgICAgICAgICAvLyBBc3N1bWluZyBkdWUgZGF0ZSBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuXG4gICAgICAgICAgICAgICAgbGV0IHJlZmVyZW5jZURhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBtb21lbnQgb2JqZWN0cy5cbiAgICAgICAgICAgICAgICBpZiAoZHVlRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VEYXRlID0gd2luZG93Lm1vbWVudChkdWVEYXRlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVkdWxlZERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlRGF0ZSA9IHdpbmRvdy5tb21lbnQoc2NoZWR1bGVkRGF0ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlRGF0ZSA9IHdpbmRvdy5tb21lbnQoc3RhcnREYXRlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWJhc2VPblRvZGF5ICYmIHJlZmVyZW5jZURhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kdHN0YXJ0ID0gd2luZG93Lm1vbWVudChyZWZlcmVuY2VEYXRlKS5zdGFydE9mKCdkYXknKS51dGModHJ1ZSkudG9EYXRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kdHN0YXJ0ID0gd2luZG93Lm1vbWVudCgpLnN0YXJ0T2YoJ2RheScpLnV0Yyh0cnVlKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBycnVsZSA9IG5ldyBSUnVsZShvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3VycmVuY2Uoe1xuICAgICAgICAgICAgICAgICAgICBycnVsZSxcbiAgICAgICAgICAgICAgICAgICAgYmFzZU9uVG9kYXksXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZURhdGUsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgZHVlRGF0ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIENvdWxkIG5vdCByZWFkIHJlY3VycmVuY2UgcnVsZS4gVXNlciBwb3NzaWJseSBub3QgZG9uZSB0eXBpbmcuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9UZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB0ZXh0ID0gdGhpcy5ycnVsZS50b1RleHQoKTtcbiAgICAgICAgaWYgKHRoaXMuYmFzZU9uVG9kYXkpIHtcbiAgICAgICAgICAgIHRleHQgKz0gJyB3aGVuIGRvbmUnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0ZXMgb2YgdGhlIG5leHQgb2NjdXJyZW5jZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG5leHQgb2NjdXJyZW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dCgpOiB7XG4gICAgICAgIHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgc2NoZWR1bGVkRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgZHVlRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICB9IHwgbnVsbCB7XG4gICAgICAgIGxldCBuZXh0OiBEYXRlO1xuICAgICAgICBpZiAodGhpcy5iYXNlT25Ub2RheSkge1xuICAgICAgICAgICAgLy8gVGhlIG5leHQgb2NjdXJyZW5jZSBzaG91bGQgaGFwcGVuIGJhc2VkIG9mZiB0aGUgY3VycmVudCBkYXRlLlxuICAgICAgICAgICAgY29uc3QgdG9kYXkgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBydWxlQmFzZWRPblRvZGF5ID0gbmV3IFJSdWxlKHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLnJydWxlLm9yaWdPcHRpb25zLFxuICAgICAgICAgICAgICAgIGR0c3RhcnQ6IHRvZGF5LnN0YXJ0T2YoJ2RheScpLnV0Yyh0cnVlKS50b0RhdGUoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbmV4dCA9IHRoaXMubmV4dEFmdGVyKHRvZGF5LmVuZE9mKCdkYXknKSwgcnVsZUJhc2VkT25Ub2RheSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV4dCBvY2N1cnJlbmNlIHNob3VsZCBoYXBwZW4gYmFzZWQgb24gdGhlIG9yaWdpbmFsIHJlZmVyZW5jZVxuICAgICAgICAgICAgLy8gZGF0ZSBpZiBwb3NzaWJsZS4gT3RoZXJ3aXNlLCBiYXNlIGl0IG9uIHRvZGF5IGlmIHdlIGRvIG5vdCBoYXZlIGFcbiAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBkYXRlLlxuICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSB3aW5kb3dcbiAgICAgICAgICAgICAgICAvLyBSZWZlcmVuY2UgZGF0ZSBjYW4gYmUgYHVuZGVmaW5lZGAgdG8gbWVhbiBcInRvZGF5XCIuXG4gICAgICAgICAgICAgICAgLy8gTW9tZW50IG9ubHkgYWNjZXB0cyBgdW5kZWZpbmVkYCwgbm90IGBudWxsYC5cbiAgICAgICAgICAgICAgICAubW9tZW50KHRoaXMucmVmZXJlbmNlRGF0ZSA/PyB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgLmVuZE9mKCdkYXknKTtcblxuICAgICAgICAgICAgbmV4dCA9IHRoaXMubmV4dEFmdGVyKGFmdGVyLCB0aGlzLnJydWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBLZWVwIHRoZSByZWxhdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlZmVyZW5jZSBkYXRlIGFuZFxuICAgICAgICAgICAgLy8gc3RhcnQvc2NoZWR1bGVkL2R1ZS5cbiAgICAgICAgICAgIGxldCBzdGFydERhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHNjaGVkdWxlZERhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGR1ZURhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBPbmx5IGlmIGEgcmVmZXJlbmNlIGRhdGUgaXMgZ2l2ZW4uIEEgcmVmZXJlbmNlIGRhdGUgd2lsbCBleGlzdCBpZiBhdFxuICAgICAgICAgICAgLy8gbGVhc3Qgb25lIG9mIHRoZSBvdGhlciBkYXRlcyBpcyBzZXQuXG4gICAgICAgICAgICBpZiAodGhpcy5yZWZlcmVuY2VEYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhcnREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGlmZmVyZW5jZSA9IHdpbmRvdy5tb21lbnQuZHVyYXRpb24odGhpcy5zdGFydERhdGUuZGlmZih0aGlzLnJlZmVyZW5jZURhdGUpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9uaW5nIHNvIHRoYXQgb3JpZ2luYWwgd29uJ3QgYmUgbWFuaXB1bGF0ZWQ6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSA9IHdpbmRvdy5tb21lbnQobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJvdW5kaW5nIGRheXMgdG8gaGFuZGxlIGNyb3NzIGRheWxpZ2h0LXNhdmluZ3MtdGltZSByZWN1cnJlbmNlcy5cbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlLmFkZChNYXRoLnJvdW5kKG9yaWdpbmFsRGlmZmVyZW5jZS5hc0RheXMoKSksICdkYXlzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVkdWxlZERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEaWZmZXJlbmNlID0gd2luZG93Lm1vbWVudC5kdXJhdGlvbih0aGlzLnNjaGVkdWxlZERhdGUuZGlmZih0aGlzLnJlZmVyZW5jZURhdGUpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9uaW5nIHNvIHRoYXQgb3JpZ2luYWwgd29uJ3QgYmUgbWFuaXB1bGF0ZWQ6XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGUgPSB3aW5kb3cubW9tZW50KG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBSb3VuZGluZyBkYXlzIHRvIGhhbmRsZSBjcm9zcyBkYXlsaWdodC1zYXZpbmdzLXRpbWUgcmVjdXJyZW5jZXMuXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGUuYWRkKE1hdGgucm91bmQob3JpZ2luYWxEaWZmZXJlbmNlLmFzRGF5cygpKSwgJ2RheXMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHVlRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbERpZmZlcmVuY2UgPSB3aW5kb3cubW9tZW50LmR1cmF0aW9uKHRoaXMuZHVlRGF0ZS5kaWZmKHRoaXMucmVmZXJlbmNlRGF0ZSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsb25pbmcgc28gdGhhdCBvcmlnaW5hbCB3b24ndCBiZSBtYW5pcHVsYXRlZDpcbiAgICAgICAgICAgICAgICAgICAgZHVlRGF0ZSA9IHdpbmRvdy5tb21lbnQobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJvdW5kaW5nIGRheXMgdG8gaGFuZGxlIGNyb3NzIGRheWxpZ2h0LXNhdmluZ3MtdGltZSByZWN1cnJlbmNlcy5cbiAgICAgICAgICAgICAgICAgICAgZHVlRGF0ZS5hZGQoTWF0aC5yb3VuZChvcmlnaW5hbERpZmZlcmVuY2UuYXNEYXlzKCkpLCAnZGF5cycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGFydERhdGUsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgICAgICAgICBkdWVEYXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBpZGVudGljYWxUbyhvdGhlcjogUmVjdXJyZW5jZSkge1xuICAgICAgICBpZiAodGhpcy5iYXNlT25Ub2RheSAhPT0gb3RoZXIuYmFzZU9uVG9kYXkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXBhcmUgRGF0ZSBmaWVsZHNcbiAgICAgICAgaWYgKGNvbXBhcmVCeURhdGUodGhpcy5zdGFydERhdGUsIG90aGVyLnN0YXJ0RGF0ZSkgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcGFyZUJ5RGF0ZSh0aGlzLnNjaGVkdWxlZERhdGUsIG90aGVyLnNjaGVkdWxlZERhdGUpICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBhcmVCeURhdGUodGhpcy5kdWVEYXRlLCBvdGhlci5kdWVEYXRlKSAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudG9UZXh0KCkgPT09IG90aGVyLnRvVGV4dCgpOyAvLyB0aGlzIGFsc28gY2hlY2tzIGJhc2VPblRvZGF5XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbmV4dEFmdGVyIHJldHVybnMgdGhlIG5leHQgb2NjdXJyZW5jZSdzIGRhdGUgYWZ0ZXIgYGFmdGVyYCwgYmFzZWQgb24gdGhlIGdpdmVuIHJydWxlLlxuICAgICAqXG4gICAgICogVGhlIGNvbW1vbiBjYXNlIGlzIHRoYXQgYHJydWxlLmFmdGVyYCBjYWxjdWxhdGVzIHRoZSBuZXh0IGRhdGUgYW5kIGl0XG4gICAgICogY2FuIGJlIHVzZWQgYXMgaXMuXG4gICAgICpcbiAgICAgKiBJbiB0aGUgc3BlY2lhbCBjYXNlcyBvZiBtb250aGx5IGFuZCB5ZWFybHkgcmVjdXJyZW5jZXMsIHRoZXJlIGV4aXN0cyBhblxuICAgICAqIGVkZ2UgY2FzZSB3aGVyZSBhbiBvY2N1cnJlbmNlIGFmdGVyIHRoZSBnaXZlbiBudW1iZXIgb2YgbW9udGhzIG9yIHllYXJzXG4gICAgICogaXMgbm90IHBvc3NpYmxlLiBGb3IgZXhhbXBsZTogQSB0YXNrIGlzIGR1ZSBvbiAyMDIyLTAxLTMxIGFuZCBoYXMgYVxuICAgICAqIHJlY3VycmVuY2Ugb2YgYGV2ZXJ5IG1vbnRoYC4gV2hlbiBtYXJraW5nIHRoZSB0YXNrIGFzIGRvbmUsIHRoZSBuZXh0XG4gICAgICogb2NjdXJyZW5jZSB3aWxsIGhhcHBlbiBvbiAyMDIyLTAzLTMxLiBUaGUgcmVhc29uIGJlaW5nIHRoYXQgRmVicnVhcnlcbiAgICAgKiBkb2VzIG5vdCBoYXZlIDMxIGRheXMsIHlldCBSUnVsZSBzZXRzIGBieW1vbnRoZGF5YCB0byBgMzFgIGZvciBsYWNrIG9mXG4gICAgICogaGF2aW5nIGEgYmV0dGVyIGFsdGVybmF0aXZlLlxuICAgICAqXG4gICAgICogSW4gb3JkZXIgdG8gZml4IHRoaXMsIGBhZnRlcmAgd2lsbCBtb3ZlIGludG8gdGhlIHBhc3QgZGF5IGJ5IGRheS4gRWFjaFxuICAgICAqIGRheSwgdGhlIG5leHQgb2NjdXJyZW5jZSBpcyBjaGVja2VkIHRvIGJlIGFmdGVyIHRoZSBnaXZlbiBudW1iZXIgb2ZcbiAgICAgKiBtb250aHMgb3IgeWVhcnMuIEJ5IG1vdmluZyBgYWZ0ZXJgIGludG8gdGhlIHBhc3QgZGF5IGJ5IGRheSwgaXQgd2lsbFxuICAgICAqIGV2ZW50dWFsbHkgY2FsY3VsYXRlIHRoZSBuZXh0IG9jY3VycmVuY2UgYmFzZWQgb24gYDIwMjItMDEtMjhgLCBlbmRpbmcgdXBcbiAgICAgKiBpbiBGZWJydWFyeSBhcyB0aGUgdXNlciB3b3VsZCBleHBlY3QuXG4gICAgICovXG4gICAgcHJpdmF0ZSBuZXh0QWZ0ZXIoYWZ0ZXI6IE1vbWVudCwgcnJ1bGU6IFJSdWxlKTogRGF0ZSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSB0aW1lem9uZSwgYXMgcnJ1bGUgZG9lcyBub3QgcmVnYXJkIHRpbWV6b25lcyBhbmQgYWx3YXlzXG4gICAgICAgIC8vIGNhbGN1bGF0ZXMgaW4gVVRDLlxuICAgICAgICAvLyBUaGUgdGltZXpvbmUgaXMgYWRkZWQgYWdhaW4gYmVmb3JlIHJldHVybmluZyB0aGUgbmV4dCBkYXRlLlxuICAgICAgICBhZnRlci51dGModHJ1ZSk7XG4gICAgICAgIGxldCBuZXh0ID0gd2luZG93Lm1vbWVudChycnVsZS5hZnRlcihhZnRlci50b0RhdGUoKSkpO1xuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBtb250aGx5IHJlY3VycmVuY2UsIHRyZWF0IGl0IHNwZWNpYWwuXG4gICAgICAgIGNvbnN0IGFzVGV4dCA9IHRoaXMudG9UZXh0KCk7XG4gICAgICAgIGNvbnN0IG1vbnRoTWF0Y2ggPSBhc1RleHQubWF0Y2goL2V2ZXJ5KCBcXGQrKT8gbW9udGgocyk/KC4qKT8vKTtcbiAgICAgICAgaWYgKG1vbnRoTWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIC4uLiB1bmxlc3MgdGhlIHJ1bGUgZml4ZXMgdGhlIGRhdGUsIHN1Y2ggYXMgJ2V2ZXJ5IG1vbnRoIG9uIHRoZSAzMXN0J1xuICAgICAgICAgICAgaWYgKCFhc1RleHQuaW5jbHVkZXMoJyBvbiAnKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBSZWN1cnJlbmNlLm5leHRBZnRlck1vbnRocyhhZnRlciwgbmV4dCwgcnJ1bGUsIG1vbnRoTWF0Y2hbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHllYXJseSByZWN1cnJlbmNlLCB0cmVhdCBpdCBzcGVjaWFsLlxuICAgICAgICBjb25zdCB5ZWFyTWF0Y2ggPSBhc1RleHQubWF0Y2goL2V2ZXJ5KCBcXGQrKT8geWVhcihzKT8oLiopPy8pO1xuICAgICAgICBpZiAoeWVhck1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBuZXh0ID0gUmVjdXJyZW5jZS5uZXh0QWZ0ZXJZZWFycyhhZnRlciwgbmV4dCwgcnJ1bGUsIHllYXJNYXRjaFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIZXJlIHdlIGFkZCB0aGUgdGltZXpvbmUgYWdhaW4gdGhhdCB3ZSByZW1vdmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBtZXRob2QuXG4gICAgICAgIHJldHVybiBSZWN1cnJlbmNlLmFkZFRpbWV6b25lKG5leHQpLnRvRGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIG5leHRBZnRlck1vbnRocyBjYWxjdWxhdGVzIHRoZSBuZXh0IGRhdGUgYWZ0ZXIgYHNraXBwaW5nTW9udGhzYCBtb250aHMuXG4gICAgICpcbiAgICAgKiBgc2tpcHBpbmdNb250aHNgIGRlZmF1bHRzIHRvIGAxYCBpZiB1bmRlZmluZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmV4dEFmdGVyTW9udGhzKFxuICAgICAgICBhZnRlcjogTW9tZW50LFxuICAgICAgICBuZXh0OiBNb21lbnQsXG4gICAgICAgIHJydWxlOiBSUnVsZSxcbiAgICAgICAgc2tpcHBpbmdNb250aHM6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICApOiBNb21lbnQge1xuICAgICAgICAvLyBQYXJzZSBgc2tpcHBpbmdNb250aHNgLCBpZiBpdCBleGlzdHMuXG4gICAgICAgIGxldCBwYXJzZWRTa2lwcGluZ01vbnRoczogTnVtYmVyID0gMTtcbiAgICAgICAgaWYgKHNraXBwaW5nTW9udGhzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBhcnNlZFNraXBwaW5nTW9udGhzID0gTnVtYmVyLnBhcnNlSW50KHNraXBwaW5nTW9udGhzLnRyaW0oKSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hpbGUgd2Ugc2tpcCB0aGUgd3JvbmcgbnVtYmVyIG9mIG1vbnRocywgbW92ZSBgYWZ0ZXJgIG9uZSBkYXkgaW50byB0aGUgcGFzdC5cbiAgICAgICAgd2hpbGUgKFJlY3VycmVuY2UuaXNTa2lwcGluZ1Rvb01hbnlNb250aHMoYWZ0ZXIsIG5leHQsIHBhcnNlZFNraXBwaW5nTW9udGhzKSkge1xuICAgICAgICAgICAgLy8gVGhlIG5leHQgbGluZSBhbHRlcnMgYGFmdGVyYCB0byBiZSBvbmUgZGF5IGVhcmxpZXIuXG4gICAgICAgICAgICAvLyBUaGVuIHJldHVybnMgYG5leHRgIGJhc2VkIG9uIHRoYXQuXG4gICAgICAgICAgICBuZXh0ID0gUmVjdXJyZW5jZS5mcm9tT25lRGF5RWFybGllcihhZnRlciwgcnJ1bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaXNTa2lwcGluZ1Rvb01hbnlNb250aHMgcmV0dXJucyB0cnVlIGlmIGBuZXh0YCBpcyBtb3JlIHRoYW4gYHNraXBwaW5nTW9udGhzYCBtb250aHMgYWZ0ZXIgYGFmdGVyYC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBpc1NraXBwaW5nVG9vTWFueU1vbnRocyhhZnRlcjogTW9tZW50LCBuZXh0OiBNb21lbnQsIHNraXBwaW5nTW9udGhzOiBOdW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGRpZmZNb250aHMgPSBuZXh0Lm1vbnRoKCkgLSBhZnRlci5tb250aCgpO1xuXG4gICAgICAgIC8vIE1heWJlIHNvbWUgeWVhcnMgaGF2ZSBwYXNzZWQ/XG4gICAgICAgIGNvbnN0IGRpZmZZZWFycyA9IG5leHQueWVhcigpIC0gYWZ0ZXIueWVhcigpO1xuICAgICAgICBkaWZmTW9udGhzICs9IGRpZmZZZWFycyAqIDEyO1xuXG4gICAgICAgIHJldHVybiBkaWZmTW9udGhzID4gc2tpcHBpbmdNb250aHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbmV4dEFmdGVyWWVhcnMgY2FsY3VsYXRlcyB0aGUgbmV4dCBkYXRlIGFmdGVyIGBza2lwcGluZ1llYXJzYCB5ZWFycy5cbiAgICAgKlxuICAgICAqIGBza2lwcGluZ1llYXJzYCBkZWZhdWx0cyB0byBgMWAgaWYgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIG5leHRBZnRlclllYXJzKFxuICAgICAgICBhZnRlcjogTW9tZW50LFxuICAgICAgICBuZXh0OiBNb21lbnQsXG4gICAgICAgIHJydWxlOiBSUnVsZSxcbiAgICAgICAgc2tpcHBpbmdZZWFyczogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICk6IE1vbWVudCB7XG4gICAgICAgIC8vIFBhcnNlIGBza2lwcGluZ1llYXJzYCwgaWYgaXQgZXhpc3RzLlxuICAgICAgICBsZXQgcGFyc2VkU2tpcHBpbmdZZWFyczogTnVtYmVyID0gMTtcbiAgICAgICAgaWYgKHNraXBwaW5nWWVhcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGFyc2VkU2tpcHBpbmdZZWFycyA9IE51bWJlci5wYXJzZUludChza2lwcGluZ1llYXJzLnRyaW0oKSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hpbGUgd2Ugc2tpcCB0aGUgd3JvbmcgbnVtYmVyIG9mIHllYXJzLCBtb3ZlIGBhZnRlcmAgb25lIGRheSBpbnRvIHRoZSBwYXN0LlxuICAgICAgICB3aGlsZSAoUmVjdXJyZW5jZS5pc1NraXBwaW5nVG9vTWFueVllYXJzKGFmdGVyLCBuZXh0LCBwYXJzZWRTa2lwcGluZ1llYXJzKSkge1xuICAgICAgICAgICAgLy8gVGhlIG5leHQgbGluZSBhbHRlcnMgYGFmdGVyYCB0byBiZSBvbmUgZGF5IGVhcmxpZXIuXG4gICAgICAgICAgICAvLyBUaGVuIHJldHVybnMgYG5leHRgIGJhc2VkIG9uIHRoYXQuXG4gICAgICAgICAgICBuZXh0ID0gUmVjdXJyZW5jZS5mcm9tT25lRGF5RWFybGllcihhZnRlciwgcnJ1bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaXNTa2lwcGluZ1Rvb01hbnlZZWFycyByZXR1cm5zIHRydWUgaWYgYG5leHRgIGlzIG1vcmUgdGhhbiBgc2tpcHBpbmdZZWFyc2AgeWVhcnMgYWZ0ZXIgYGFmdGVyYC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBpc1NraXBwaW5nVG9vTWFueVllYXJzKGFmdGVyOiBNb21lbnQsIG5leHQ6IE1vbWVudCwgc2tpcHBpbmdZZWFyczogTnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBuZXh0LnllYXIoKSAtIGFmdGVyLnllYXIoKTtcblxuICAgICAgICByZXR1cm4gZGlmZiA+IHNraXBwaW5nWWVhcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZnJvbU9uZURheUVhcmxpZXIgcmV0dXJucyB0aGUgbmV4dCBvY2N1cnJlbmNlIGFmdGVyIG1vdmluZyBgYWZ0ZXJgIG9uZSBkYXkgaW50byB0aGUgcGFzdC5cbiAgICAgKlxuICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIG1hbmlwdWxhdGVzIHRoZSBnaXZlbiBpbnN0YW5jZSBvZiBgYWZ0ZXJgLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGZyb21PbmVEYXlFYXJsaWVyKGFmdGVyOiBNb21lbnQsIHJydWxlOiBSUnVsZSk6IE1vbWVudCB7XG4gICAgICAgIGFmdGVyLnN1YnRyYWN0KDEsICdkYXlzJykuZW5kT2YoJ2RheScpO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBycnVsZS5vcmlnT3B0aW9ucztcbiAgICAgICAgb3B0aW9ucy5kdHN0YXJ0ID0gYWZ0ZXIuc3RhcnRPZignZGF5JykudG9EYXRlKCk7XG4gICAgICAgIHJydWxlID0gbmV3IFJSdWxlKG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiB3aW5kb3cubW9tZW50KHJydWxlLmFmdGVyKGFmdGVyLnRvRGF0ZSgpKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYWRkVGltZXpvbmUoZGF0ZTogTW9tZW50KTogTW9tZW50IHtcbiAgICAgICAgY29uc3QgbG9jYWxUaW1lWm9uZSA9IHdpbmRvdy5tb21lbnQudXRjKGRhdGUpLmxvY2FsKHRydWUpO1xuXG4gICAgICAgIHJldHVybiBsb2NhbFRpbWVab25lLnN0YXJ0T2YoJ2RheScpO1xuICAgIH1cbn1cbiIsICIvKipcbiAqIENvbGxlY3Rpb24gb2Ygc3RhdHVzIHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgcGx1Z2luLlxuICovXG5leHBvcnQgZW51bSBTdGF0dXNUeXBlIHtcbiAgICBUT0RPID0gJ1RPRE8nLFxuICAgIERPTkUgPSAnRE9ORScsXG4gICAgSU5fUFJPR1JFU1MgPSAnSU5fUFJPR1JFU1MnLFxuICAgIENBTkNFTExFRCA9ICdDQU5DRUxMRUQnLFxuICAgIE5PTl9UQVNLID0gJ05PTl9UQVNLJyxcbiAgICBFTVBUWSA9ICdFTVBUWScsXG59XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgb2JqZWN0IHN0b3JlZCBieSB0aGUgT2JzaWRpYW4gY29uZmlndXJhdGlvbiBhbmQgdXNlZCB0byBjcmVhdGUgdGhlIHN0YXR1c1xuICogb2JqZWN0cyBmb3IgdGhlIHNlc3Npb25cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgU3RhdHVzQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgY2xhc3MgU3RhdHVzQ29uZmlndXJhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGNoYXJhY3RlciB1c2VkIGJldHdlZW4gdGhlIHR3byBzcXVhcmUgYnJhY2tldHMgaW4gdGhlIG1hcmtkb3duIHRhc2suXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3ltYm9sOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzdGF0dXMgZm9yIGRpc3BsYXkgcHVycG9zZXMuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmV4dCBzdGF0dXMgZm9yIGEgdGFzayB3aGVuIHRvZ2dsZWQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbmV4dFN0YXR1c1N5bWJvbDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSB0aGVuIGl0IGlzIHJlZ2lzdGVyZWQgYXMgYSBjb21tYW5kIHRoYXQgdGhlIHVzZXIgY2FuIG1hcCB0by5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgYXZhaWxhYmxlQXNDb21tYW5kOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdHVzIHR5cGUuIFNlZSB7QGxpbmsgU3RhdHVzVHlwZX0gZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFN0YXR1c1R5cGU7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0YXR1cy4gVGhlIHJlZ2lzdHJ5IHdpbGwgYmUgYWRkZWQgbGF0ZXIgaW4gdGhlIGNhc2VcbiAgICAgKiBvZiB0aGUgZGVmYXVsdCBzdGF0dXNlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzeW1ib2xcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7U3RhdHVzfSBuZXh0U3RhdHVzU3ltYm9sXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhdmFpbGFibGVBc0NvbW1hbmRcbiAgICAgKiBAcGFyYW0ge1N0YXR1c1R5cGV9IHR5cGVcbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHN5bWJvbDogc3RyaW5nLFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIG5leHRTdGF0dXNTeW1ib2w6IHN0cmluZyxcbiAgICAgICAgYXZhaWxhYmxlQXNDb21tYW5kOiBib29sZWFuLFxuICAgICAgICB0eXBlOiBTdGF0dXNUeXBlID0gU3RhdHVzVHlwZS5UT0RPLCAvLyBUT0RPIFJlbW92ZSBkZWZhdWx0IHZhbHVlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuc3ltYm9sID0gc3ltYm9sO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLm5leHRTdGF0dXNTeW1ib2wgPSBuZXh0U3RhdHVzU3ltYm9sO1xuICAgICAgICB0aGlzLmF2YWlsYWJsZUFzQ29tbWFuZCA9IGF2YWlsYWJsZUFzQ29tbWFuZDtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgU3RhdHVzQ29uZmlndXJhdGlvbiwgU3RhdHVzVHlwZSB9IGZyb20gJy4vU3RhdHVzQ29uZmlndXJhdGlvbic7XG5pbXBvcnQgdHlwZSB7IFN0YXR1c0NvbGxlY3Rpb25FbnRyeSB9IGZyb20gJy4vU3RhdHVzQ29sbGVjdGlvbic7XG5cbi8qKlxuICogVHJhY2tzIHRoZSBwb3NzaWJsZSBzdGF0ZXMgdGhhdCBhIHRhc2sgY2FuIGJlIGluLlxuICpcbiAqIFJlbGF0ZWQgY2xhc3NlczpcbiAqIEBzZWUgU3RhdHVzQ29uZmlndXJhdGlvblxuICogQHNlZSBTdGF0dXNSZWdpc3RyeVxuICogQHNlZSBTdGF0dXNTZXR0aW5nc1xuICogQHNlZSBTdGF0dXNTZXR0aW5nc0hlbHBlcnMudHNcbiAqIEBzZWUgQ3VzdG9tU3RhdHVzTW9kYWxcbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgU3RhdHVzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IERvbmUgc3RhdHVzLiBHb2VzIHRvIFRvZG8gd2hlbiB0b2dnbGVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEB0eXBlIHtTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgRE9ORTogU3RhdHVzID0gU3RhdHVzLm1ha2VEb25lKCk7XG5cbiAgICAvKipcbiAgICAgKiBBIGRlZmF1bHQgc3RhdHVzIG9mIGVtcHR5LCB1c2VkIHdoZW4gdGhpbmdzIGdvIHdyb25nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIEVNUFRZOiBTdGF0dXMgPSBTdGF0dXMubWFrZUVtcHR5KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBUb2RvIHN0YXR1cy4gR29lcyB0byBEb25lIHdoZW4gdG9nZ2xlZC5cbiAgICAgKiBVc2VyIG1heSBsYXRlciBiZSBhYmxlIHRvIG92ZXJyaWRlIHRoaXMgdG8gZ28gdG8gSW4gUHJvZ3Jlc3MgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAdHlwZSB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIFRPRE86IFN0YXR1cyA9IFN0YXR1cy5tYWtlVG9kbygpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmZpZ3VyYXRpb24gc3RvcmVkIGluIHRoZSBkYXRhLmpzb24gZmlsZS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtTdGF0dXNDb25maWd1cmF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgY29uZmlndXJhdGlvbjogU3RhdHVzQ29uZmlndXJhdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzeW1ib2wgdXNlZCBiZXR3ZWVuIHRoZSB0d28gc3F1YXJlIGJyYWNrZXRzIGluIHRoZSBtYXJrZG93biB0YXNrLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzXG4gICAgICovXG4gICAgcHVibGljIGdldCBzeW1ib2woKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5zeW1ib2w7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc3RhdHVzIGZvciBkaXNwbGF5IHB1cnBvc2VzLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzXG4gICAgICovXG4gICAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24ubmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHN0YXR1cyBmb3IgYSB0YXNrIHdoZW4gdG9nZ2xlZC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmV4dFN0YXR1c1N5bWJvbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLm5leHRTdGF0dXNTeW1ib2w7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSB0aGVuIGl0IGlzIHJlZ2lzdGVyZWQgYXMgYSBjb21tYW5kIHRoYXQgdGhlIHVzZXIgY2FuIG1hcCB0by5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGF2YWlsYWJsZUFzQ29tbWFuZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5hdmFpbGFibGVBc0NvbW1hbmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdHVzIHR5cGUuIFNlZSB7QGxpbmsgU3RhdHVzVHlwZX0gZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0eXBlKCk6IFN0YXR1c1R5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLnR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTdGF0dXMuIFRoZSByZWdpc3RyeSB3aWxsIGJlIGFkZGVkIGxhdGVyIGluIHRoZSBjYXNlXG4gICAgICogb2YgdGhlIGRlZmF1bHQgc3RhdHVzZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0YXR1c0NvbmZpZ3VyYXRpb259IGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbjogU3RhdHVzQ29uZmlndXJhdGlvbikge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IERvbmUgc3RhdHVzLiBHb2VzIHRvIFRvZG8gd2hlbiB0b2dnbGVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBtYWtlRG9uZSgpOiBTdGF0dXMge1xuICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhuZXcgU3RhdHVzQ29uZmlndXJhdGlvbigneCcsICdEb25lJywgJyAnLCB0cnVlLCBTdGF0dXNUeXBlLkRPTkUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGRlZmF1bHQgc3RhdHVzIG9mIGVtcHR5LCB1c2VkIHdoZW4gdGhpbmdzIGdvIHdyb25nLlxuICAgICAqL1xuICAgIHN0YXRpYyBtYWtlRW1wdHkoKTogU3RhdHVzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMobmV3IFN0YXR1c0NvbmZpZ3VyYXRpb24oJycsICdFTVBUWScsICcnLCB0cnVlLCBTdGF0dXNUeXBlLkVNUFRZKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgVG9kbyBzdGF0dXMuIEdvZXMgdG8gRG9uZSB3aGVuIHRvZ2dsZWQuXG4gICAgICogVXNlciBtYXkgbGF0ZXIgYmUgYWJsZSB0byBvdmVycmlkZSB0aGlzIHRvIGdvIHRvIEluIFByb2dyZXNzIGluc3RlYWQuXG4gICAgICovXG4gICAgc3RhdGljIG1ha2VUb2RvKCk6IFN0YXR1cyB7XG4gICAgICAgIHJldHVybiBuZXcgU3RhdHVzKG5ldyBTdGF0dXNDb25maWd1cmF0aW9uKCcgJywgJ1RvZG8nLCAneCcsIHRydWUsIFN0YXR1c1R5cGUuVE9ETykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IENhbmNlbGxlZCBzdGF0dXMuIEdvZXMgdG8gVG9kbyB3aGVuIHRvZ2dsZWQuXG4gICAgICovXG4gICAgc3RhdGljIG1ha2VDYW5jZWxsZWQoKTogU3RhdHVzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMobmV3IFN0YXR1c0NvbmZpZ3VyYXRpb24oJy0nLCAnQ2FuY2VsbGVkJywgJyAnLCB0cnVlLCBTdGF0dXNUeXBlLkNBTkNFTExFRCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IEluIFByb2dyZXNzIHN0YXR1cy4gR29lcyB0byBEb25lIHdoZW4gdG9nZ2xlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgbWFrZUluUHJvZ3Jlc3MoKTogU3RhdHVzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMobmV3IFN0YXR1c0NvbmZpZ3VyYXRpb24oJy8nLCAnSW4gUHJvZ3Jlc3MnLCAneCcsIHRydWUsIFN0YXR1c1R5cGUuSU5fUFJPR1JFU1MpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIFN0YXR1c1R5cGUgdG8gdXNlIGZvciBhIHN5bWJvbCwgaWYgaXQgaXMgbm90IGluIHRoZSBTdGF0dXNSZWdpc3RyeS5cbiAgICAgKiBUaGUgY29yZSBzeW1ib2xzIGFyZSByZWNvZ25pc2VkLlxuICAgICAqIE90aGVyIHN5bWJvbHMgYXJlIHRyZWF0ZWQgYXMgU3RhdHVzVHlwZS5UT0RPXG4gICAgICogQHBhcmFtIHN5bWJvbFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUeXBlRm9yVW5rbm93blN5bWJvbChzeW1ib2w6IHN0cmluZyk6IFN0YXR1c1R5cGUge1xuICAgICAgICBzd2l0Y2ggKHN5bWJvbCkge1xuICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICBjYXNlICdYJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzVHlwZS5ET05FO1xuICAgICAgICAgICAgY2FzZSAnLyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1c1R5cGUuSU5fUFJPR1JFU1M7XG4gICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzVHlwZS5DQU5DRUxMRUQ7XG4gICAgICAgICAgICBjYXNlICcnOlxuICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXNUeXBlLkVNUFRZO1xuICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXNUeXBlLlRPRE87XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRleHQgdGhhdCB3YXMgc2F2ZWQgZnJvbSBhIFN0YXR1c1R5cGUgdmFsdWUgYmFjayB0byBhIFN0YXR1c1R5cGUuXG4gICAgICogUmV0dXJucyBTdGF0dXNUeXBlLlRPRE8gaWYgdGhlIHN0cmluZyBpcyBub3QgdmFsaWQuXG4gICAgICogQHBhcmFtIHN0YXR1c1R5cGVBc1N0cmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUeXBlRnJvbVN0YXR1c1R5cGVTdHJpbmcoc3RhdHVzVHlwZUFzU3RyaW5nOiBzdHJpbmcpOiBTdGF0dXNUeXBlIHtcbiAgICAgICAgcmV0dXJuIFN0YXR1c1R5cGVbc3RhdHVzVHlwZUFzU3RyaW5nIGFzIGtleW9mIHR5cGVvZiBTdGF0dXNUeXBlXSB8fCBTdGF0dXNUeXBlLlRPRE87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgU3RhdHVzIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4sIHVua25vd24gc3ltYm9sLlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gU3RhdHVzUmVnaXN0cnkgZG9lcyBub3QgcmVjb2duaXNlIGEgc3ltYm9sLFxuICAgICAqIGFuZCB3ZSBkbyBub3Qgd2FudCB0byBleHBvc2UgdGhlIHVzZXIncyBkYXRhIHRvIHRoZSBTdGF0dXMuRU1QVFkgc3RhdHVzLlxuICAgICAqXG4gICAgICogVGhlIHR5cGUgaXMgc2V0IHRvIFRPRE8uXG4gICAgICogQHBhcmFtIHVua25vd25TeW1ib2xcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlVW5rbm93blN0YXR1cyh1bmtub3duU3ltYm9sOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMobmV3IFN0YXR1c0NvbmZpZ3VyYXRpb24odW5rbm93blN5bWJvbCwgJ1Vua25vd24nLCAneCcsIGZhbHNlLCBTdGF0dXNUeXBlLlRPRE8pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGJ1bGstaW1wb3J0aW5nIHNldHRpbmdzIGZyb20gYXJyYXlzIG9mIHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW1wb3J0ZWQgQW4gYXJyYXkgb2Ygc3ltYm9sLCBuYW1lLCBuZXh0IHN5bWJvbCwgc3RhdHVzIHR5cGVcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlRnJvbUltcG9ydGVkVmFsdWUoaW1wb3J0ZWQ6IFN0YXR1c0NvbGxlY3Rpb25FbnRyeSkge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBpbXBvcnRlZFswXTtcbiAgICAgICAgY29uc3QgdHlwZSA9IFN0YXR1cy5nZXRUeXBlRnJvbVN0YXR1c1R5cGVTdHJpbmcoaW1wb3J0ZWRbM10pO1xuICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhuZXcgU3RhdHVzQ29uZmlndXJhdGlvbihzeW1ib2wsIGltcG9ydGVkWzFdLCBpbXBvcnRlZFsyXSwgZmFsc2UsIHR5cGUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb21wbGV0aW9uIHN0YXR1cyBmb3IgYSB0YXNrLCB0aGlzIGlzIG9ubHkgc3VwcG9ydGVkXG4gICAgICogd2hlbiB0aGUgdGFzayBpcyBkb25lL3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsqfSAge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c1xuICAgICAqL1xuICAgIHB1YmxpYyBpc0NvbXBsZXRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gU3RhdHVzVHlwZS5ET05FO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIG9uZS1saW5lIHN1bW1hcnkgb2YgdGhlIHN0YXR1cywgZm9yIHByZXNlbnRhdGlvbiB0byB1c2Vycy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmlld1RleHQoKSB7XG4gICAgICAgIGxldCBjb21tYW5kTm90aWNlID0gJyc7XG4gICAgICAgIGlmIChTdGF0dXMudGFza3NQbHVnaW5DYW5DcmVhdGVDb21tYW5kc0ZvclN0YXR1c2VzKCkgJiYgdGhpcy5hdmFpbGFibGVBc0NvbW1hbmQpIHtcbiAgICAgICAgICAgIGNvbW1hbmROb3RpY2UgPSAnIEF2YWlsYWJsZSBhcyBhIGNvbW1hbmQuJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgYC0gWyR7dGhpcy5zeW1ib2x9XWAgKyAvLyBjb21tZW50IHRvIGJyZWFrIGxpbmVcbiAgICAgICAgICAgIGAgPT4gWyR7dGhpcy5uZXh0U3RhdHVzU3ltYm9sfV0sYCArXG4gICAgICAgICAgICBgIG5hbWU6ICcke3RoaXMubmFtZX0nLGAgK1xuICAgICAgICAgICAgYCB0eXBlOiAnJHt0aGlzLmNvbmZpZ3VyYXRpb24udHlwZX0nLmAgK1xuICAgICAgICAgICAgYCR7Y29tbWFuZE5vdGljZX1gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBUYXNrcyBjYW4geWV0IGNyZWF0ZSAnVG9nZ2xlIFN0YXR1cycgY29tbWFuZHMgZm9yIHN0YXR1c2VzXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG5vdCB5ZXQgcG9zc2libGUsIGFuZCBzbyBzb21lIFVJIGZlYXR1cmVzIGFyZSB0ZW1wb3JhcmlseSBoaWRkZW4uXG4gICAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbi10YXNrcy1ncm91cC9vYnNpZGlhbi10YXNrcy9pc3N1ZXMvMTQ4NlxuICAgICAqIE9uY2UgdGhhdCBpc3N1ZSBpcyBhZGRyZXNzZWQsIHRoaXMgbWV0aG9kIGNhbiBiZSByZW1vdmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgdGFza3NQbHVnaW5DYW5DcmVhdGVDb21tYW5kc0ZvclN0YXR1c2VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU3RhdHVzQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL1N0YXR1c0NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBTdGF0dXNSZWdpc3RyeSB9IGZyb20gJy4uL1N0YXR1c1JlZ2lzdHJ5JztcbmltcG9ydCB7IFN0YXR1cyB9IGZyb20gJy4uL1N0YXR1cyc7XG5pbXBvcnQgdHlwZSB7IFN0YXR1c0NvbGxlY3Rpb24gfSBmcm9tICcuLi9TdGF0dXNDb2xsZWN0aW9uJztcblxuLyoqXG4gKiBDbGFzcyBmb3IgZW5jYXBzdWxhdGluZyB0aGUgc2V0dGluZ3MgdGhhdCBjb250cm9sIGN1c3RvbSBzdGF0dXNlcy5cbiAqXG4gKiBNb3N0IG1ldGhvZHMgYXJlIHN0YXRpYyB0byBhbGxvdyB0aGVtIHRvIGJlIGNhbGxlZCBmcm9tIGNhbGwtYmFja3MuXG4gKlxuICogQHNlZSBTdGF0dXNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXR1c1NldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jb3JlU3RhdHVzZXMgPSBbXG4gICAgICAgICAgICAvLyBUaGUgdHdvIHN0YXR1c2VzIHRoYXQgZG8gbm90IG5lZWQgQ1NTIHN0eWxpbmdcbiAgICAgICAgICAgIFN0YXR1cy5tYWtlVG9kbygpLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBTdGF0dXMubWFrZURvbmUoKS5jb25maWd1cmF0aW9uLFxuICAgICAgICBdOyAvLyBEbyBub3QgbW9kaWZ5IGRpcmVjdGx5OiB1c2UgdGhlIHN0YXRpYyBtdXRhdGlvbiBtZXRob2RzIGluIHRoaXMgY2xhc3MuXG4gICAgICAgIHRoaXMuY3VzdG9tU3RhdHVzZXMgPSBbXG4gICAgICAgICAgICAvLyBBbnkgc3RhdHVzZXMgdGhhdCBhcmUgYWx3YXlzIHN1cHBvcnRlZCwgYnV0IG5lZWQgY3VzdG9tIENTUyBzdHlsaW5nXG4gICAgICAgICAgICBTdGF0dXMubWFrZUluUHJvZ3Jlc3MoKS5jb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgU3RhdHVzLm1ha2VDYW5jZWxsZWQoKS5jb25maWd1cmF0aW9uLFxuICAgICAgICBdOyAvLyBEbyBub3QgbW9kaWZ5IGRpcmVjdGx5OiB1c2UgdGhlIHN0YXRpYyBtdXRhdGlvbiBtZXRob2RzIGluIHRoaXMgY2xhc3MuXG4gICAgfVxuICAgIHJlYWRvbmx5IGNvcmVTdGF0dXNlczogU3RhdHVzQ29uZmlndXJhdGlvbltdO1xuICAgIHJlYWRvbmx5IGN1c3RvbVN0YXR1c2VzOiBTdGF0dXNDb25maWd1cmF0aW9uW107XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBuZXcgY3VzdG9tIHN0YXR1cy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgc3RhdGljIHNvIHRoYXQgaXQgY2FuIGJlIGNhbGxlZCBmcm9tIG1vZGFsIG9uQ2xpY2soKSBjYWxsLWJhY2tzLlxuICAgICAqXG4gICAgICogLSBDdXJyZW50bHksIGR1cGxpY2F0ZXMgYXJlIGFsbG93ZWQuXG4gICAgICogLSBBbGxvd3MgZW1wdHkgU3RhdHVzQ29uZmlndXJhdGlvbiBvYmplY3RzIC0gd2hlcmUgZXZlcnkgc3RyaW5nIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHN0YXR1c2VzXG4gICAgICogQHBhcmFtIG5ld1N0YXR1c1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYWRkU3RhdHVzKHN0YXR1c2VzOiBTdGF0dXNDb25maWd1cmF0aW9uW10sIG5ld1N0YXR1czogU3RhdHVzQ29uZmlndXJhdGlvbikge1xuICAgICAgICBzdGF0dXNlcy5wdXNoKG5ld1N0YXR1cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZSB0aGUgZ2l2ZW4gc3RhdHVzLCB0byBlZmZlY3RpdmVseSBlZGl0IGl0LlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2V0dGluZ3Mgd2VyZSBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBzdGF0aWMgc28gdGhhdCBpdCBjYW4gYmUgY2FsbGVkIGZyb20gbW9kYWwgb25DbGljaygpIGNhbGwtYmFja3MuXG4gICAgICpcbiAgICAgKiAtIERvZXMgbm90IGN1cnJlbnRseSBjaGVjayB3aGV0aGVyIHRoZSBzdGF0dXMgY2hhcmFjdGVyIGlzIHRoZSBzYW1lXG4gICAgICogLSBJZiB0aGUgc3RhdHVzIGNoYXJhY3RlciBpcyBkaWZmZXJlbnQsIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgdGhlIG5ldyBvbmUgaXMgYWxyZWFkeSB1c2VkIGluIGFub3RoZXIgc3RhdHVzXG4gICAgICogQHBhcmFtIHN0YXR1c2VzXG4gICAgICogQHBhcmFtIG9yaWdpbmFsU3RhdHVzXG4gICAgICogQHBhcmFtIG5ld1N0YXR1c1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVwbGFjZVN0YXR1cyhcbiAgICAgICAgc3RhdHVzZXM6IFN0YXR1c0NvbmZpZ3VyYXRpb25bXSxcbiAgICAgICAgb3JpZ2luYWxTdGF0dXM6IFN0YXR1c0NvbmZpZ3VyYXRpb24sXG4gICAgICAgIG5ld1N0YXR1czogU3RhdHVzQ29uZmlndXJhdGlvbixcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbmRTdGF0dXNJbmRleChvcmlnaW5hbFN0YXR1cywgc3RhdHVzZXMpO1xuICAgICAgICBpZiAoaW5kZXggPD0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0dXNlcy5zcGxpY2UoaW5kZXgsIDEsIG5ld1N0YXR1cyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgZmFjdCB0aGF0IHN0YXR1c1NldHRpbmdzLmN1c3RvbVN0YXR1c1R5cGVzLmluZGV4T2Yoc3RhdHVzQ29uZmlndXJhdGlvbilcbiAgICAgKiBzdG9wcGVkIGZpbmRpbmcgaWRlbnRpY2FsIHN0YXR1c2VzIHNpbmNlIHRoZSBhZGRpdGlvbiBvZiBTdGF0dXNDb25maWd1cmF0aW9uLnR5cGUuXG4gICAgICogQHBhcmFtIHN0YXR1c0NvbmZpZ3VyYXRpb25cbiAgICAgKiBAcGFyYW0gc3RhdHVzZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGZpbmRTdGF0dXNJbmRleChzdGF0dXNDb25maWd1cmF0aW9uOiBTdGF0dXNDb25maWd1cmF0aW9uLCBzdGF0dXNlczogU3RhdHVzQ29uZmlndXJhdGlvbltdKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU3RhdHVzQXNTdGF0dXMgPSBuZXcgU3RhdHVzKHN0YXR1c0NvbmZpZ3VyYXRpb24pO1xuICAgICAgICByZXR1cm4gc3RhdHVzZXMuZmluZEluZGV4KChzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhzKS5wcmV2aWV3VGV4dCgpID09IG9yaWdpbmFsU3RhdHVzQXNTdGF0dXMucHJldmlld1RleHQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHRoZSBnaXZlbiBzdGF0dXMuXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGRlbGV0ZWQsIGFuZCBmYWxzZSBpZiBub3QuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHN0YXRpYyBzbyB0aGF0IGl0IGNhbiBiZSBjYWxsZWQgZnJvbSBtb2RhbCBvbkNsaWNrKCkgY2FsbC1iYWNrcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0dXNlc1xuICAgICAqIEBwYXJhbSBzdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlbGV0ZVN0YXR1cyhzdGF0dXNlczogU3RhdHVzQ29uZmlndXJhdGlvbltdLCBzdGF0dXM6IFN0YXR1c0NvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbmRTdGF0dXNJbmRleChzdGF0dXMsIHN0YXR1c2VzKTtcbiAgICAgICAgaWYgKGluZGV4IDw9IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdHVzZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGFsbCBjdXN0b20gc3RhdHVzZXMuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHN0YXRpYyBzbyB0aGF0IGl0IGNhbiBiZSBjYWxsZWQgZnJvbSBtb2RhbCBvbkNsaWNrKCkgY2FsbC1iYWNrcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0dXNTZXR0aW5nc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGVsZXRlQWxsQ3VzdG9tU3RhdHVzZXMoc3RhdHVzU2V0dGluZ3M6IFN0YXR1c1NldHRpbmdzKSB7XG4gICAgICAgIHN0YXR1c1NldHRpbmdzLmN1c3RvbVN0YXR1c2VzLnNwbGljZSgwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlIHRoZSBkZWZhdWx0IGN1c3RvbSBzdGF0dXNlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0dXNTZXR0aW5nc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVzZXRBbGxDdXN0b21TdGF0dXNlcyhzdGF0dXNTZXR0aW5nczogU3RhdHVzU2V0dGluZ3MpIHtcbiAgICAgICAgU3RhdHVzU2V0dGluZ3MuZGVsZXRlQWxsQ3VzdG9tU3RhdHVzZXMoc3RhdHVzU2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBkZWZhdWx0U2V0dGluZ3MgPSBuZXcgU3RhdHVzU2V0dGluZ3MoKTtcbiAgICAgICAgZGVmYXVsdFNldHRpbmdzLmN1c3RvbVN0YXR1c2VzLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgICAgIFN0YXR1c1NldHRpbmdzLmFkZFN0YXR1cyhzdGF0dXNTZXR0aW5ncy5jdXN0b21TdGF0dXNlcywgcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNvbGxlY3Rpb24gb2YgY3VzdG9tIHN1cHBvcnRlZCBzdGF0dXNlcyB0byBhIFN0YXR1c1NldHRpbmdzLlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBwb3B1bGF0ZSB0aGUgdXNlcidzIHNldHRpbmdzLlxuICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZXhhY3QgZHVwbGljYXRlcyBhbHJlYWR5IHByZXNlbnQsIHRoZXkgYXJlIHNraXBwZWQsIGFuZCBub3RlZCBpbiB0aGUgcmV0dXJuZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHN0YXRpYyBzbyB0aGF0IGl0IGNhbiBiZSBjYWxsZWQgZnJvbSBtb2RhbCBvbkNsaWNrKCkgY2FsbC1iYWNrcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0dXNTZXR0aW5ncyBhIFN0YXR1c1NldHRpbmdzXG4gICAgICogQHBhcmFtIHN1cHBvcnRlZFN0YXR1c2VzIC0gYW4gYXJyYXkgb2Ygc3RhdHVzIHNwZWNpZmljYXRpb25zLCBmb3IgZXhhbXBsZSBgWydiJywgJ0Jvb2ttYXJrJywgJ3gnXWBcbiAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHdhcm5pbmcgbWVzc2FnZXMgdG8gc2hvdyB0aGUgdXNlciwgb25lIGZvciBlYWNoIHJlamVjdGVkIGV4YWN0IGR1cGxpY2F0ZSBzdGF0dXMuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBtaW5pbWFsU3VwcG9ydGVkU3RhdHVzZXN9LCB7QGxpbmsgaXRzU3VwcG9ydGVkU3RhdHVzZXN9XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBidWxrQWRkU3RhdHVzQ29sbGVjdGlvbihcbiAgICAgICAgc3RhdHVzU2V0dGluZ3M6IFN0YXR1c1NldHRpbmdzLFxuICAgICAgICBzdXBwb3J0ZWRTdGF0dXNlczogU3RhdHVzQ29sbGVjdGlvbixcbiAgICApOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IG5vdGljZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHN1cHBvcnRlZFN0YXR1c2VzLmZvckVhY2goKGltcG9ydGVkU3RhdHVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYXNTdGF0dXMgPSBzdGF0dXNTZXR0aW5ncy5jdXN0b21TdGF0dXNlcy5maW5kKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zeW1ib2wgPT0gaW1wb3J0ZWRTdGF0dXNbMF0gJiZcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5uYW1lID09IGltcG9ydGVkU3RhdHVzWzFdICYmXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubmV4dFN0YXR1c1N5bWJvbCA9PSBpbXBvcnRlZFN0YXR1c1syXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghaGFzU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgU3RhdHVzU2V0dGluZ3MuYWRkU3RhdHVzKHN0YXR1c1NldHRpbmdzLmN1c3RvbVN0YXR1c2VzLCBTdGF0dXMuY3JlYXRlRnJvbUltcG9ydGVkVmFsdWUoaW1wb3J0ZWRTdGF0dXMpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm90aWNlcy5wdXNoKGBUaGUgc3RhdHVzICR7aW1wb3J0ZWRTdGF0dXNbMV19ICgke2ltcG9ydGVkU3RhdHVzWzBdfSkgaXMgYWxyZWFkeSBhZGRlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBub3RpY2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGx5IHRoZSBjdXN0b20gc3RhdHVzZXMgaW4gdGhlIHN0YXR1c1NldHRpbmdzIG9iamVjdCB0byB0aGUgc3RhdHVzUmVnaXN0cnkuXG4gICAgICogQHBhcmFtIHN0YXR1c1NldHRpbmdzXG4gICAgICogQHBhcmFtIHN0YXR1c1JlZ2lzdHJ5XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBhcHBseVRvU3RhdHVzUmVnaXN0cnkoc3RhdHVzU2V0dGluZ3M6IFN0YXR1c1NldHRpbmdzLCBzdGF0dXNSZWdpc3RyeTogU3RhdHVzUmVnaXN0cnkpIHtcbiAgICAgICAgc3RhdHVzUmVnaXN0cnkuY2xlYXJTdGF0dXNlcygpO1xuICAgICAgICBzdGF0dXNTZXR0aW5ncy5jb3JlU3RhdHVzZXMuZm9yRWFjaCgoc3RhdHVzVHlwZSkgPT4ge1xuICAgICAgICAgICAgc3RhdHVzUmVnaXN0cnkuYWRkKHN0YXR1c1R5cGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RhdHVzU2V0dGluZ3MuY3VzdG9tU3RhdHVzZXMuZm9yRWFjaCgoc3RhdHVzVHlwZSkgPT4ge1xuICAgICAgICAgICAgc3RhdHVzUmVnaXN0cnkuYWRkKHN0YXR1c1R5cGUpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IGZlYXR1cmVzSnNvbiBmcm9tICcuL2ZlYXR1cmVDb25maWd1cmF0aW9uLmpzb24nO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlRmxhZyA9IHtcbiAgICBbaW50ZXJuYWxOYW1lOiBzdHJpbmddOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBUaGUgRmVhdHVyZSBjbGFzcyB0cmFja3MgYWxsIHRoZSBwb3NzaWJsZSBmZWF0dXJlcyB0aGF0IHVzZXJzIGNhbiBlbmFibGVkIHRoYXQgYXJlIGluIGRldmVsb3BtZW50LiBUaGlzIGFsbG93c1xuICogbmV3IGZlYXR1cmVzIHRvIGJlIGFkZGVkIHRvIHRoZSBwbGF0Zm9ybSBidXQgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4gVGhpcyByZWR1Y2VzIHRoZSBjb21wbGljYXRpb25zIHdoZW4gaXRcbiAqIGNvbWVzIHRvIGFkZGluZyBuZXcgZmVhdHVyZXMgYW5kIGEgbGFyZ2UgY2FzY2FkZSBvZiBkZXBlbmRlbnQgYnJhbmNoZXMuXG4gKlxuICogV2hlbiB5b3UgYWRkIGEgbmV3IGZlYXR1cmUgeW91IG5lZWQgdG8gYWRkIGl0IHRvIHRoZSBmZWF0dXJlQ29uZmlndXJhdGlvbi5qc29uIGZpbGUuIEl0IHRoZW4gbmVlZHMgdG8gYmUgYWRkZWQgdG9cbiAqIHNldHRpbmdzIHNvIGEgdXNlciBjYW4gZW5hYmxlIGl0LiBJZiB5b3Ugd2FudCBpdCBoaWRkZW4geW91IHdpbGwgbmVlZCB0byBtYW51YWxseSB1cGRhdGUgdGhlIGRhdGEuanNvbiBmaWxlLiBJbiB0aGVcbiAqIHBsdWdpbiBmb2xkZXIuXG4gKlxuICogQHNpbmNlIDIwMjItMDUtMjlcbiAqL1xuZXhwb3J0IGNsYXNzIEZlYXR1cmUge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpbnRlcm5hbE5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGluZGV4OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZGlzcGxheU5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVuYWJsZWRCeURlZmF1bHQ6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGFibGU6IGJvb2xlYW4sXG4gICAgKSB7fVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGZlYXR1cmVzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHN0YXRpY1xuICAgICAqIEB0eXBlIHtGZWF0dXJlW119XG4gICAgICogQG1lbWJlcm9mIEZlYXR1cmVcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IHZhbHVlcygpOiBGZWF0dXJlW10ge1xuICAgICAgICBsZXQgYXZhaWxhYmxlRmVhdHVyZXM6IEZlYXR1cmVbXSA9IFtdO1xuXG4gICAgICAgIGZlYXR1cmVzSnNvbi5mb3JFYWNoKChmZWF0dXJlKSA9PiB7XG4gICAgICAgICAgICBhdmFpbGFibGVGZWF0dXJlcyA9IFtcbiAgICAgICAgICAgICAgICAuLi5hdmFpbGFibGVGZWF0dXJlcyxcbiAgICAgICAgICAgICAgICBuZXcgRmVhdHVyZShcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5pbnRlcm5hbE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZGlzcGxheU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZW5hYmxlZEJ5RGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5zdGFibGUsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXZhaWxhYmxlRmVhdHVyZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgZmVhdHVyZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAdHlwZSB7RmVhdHVyZUZsYWd9XG4gICAgICogQG1lbWJlcm9mIEZlYXR1cmVcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IHNldHRpbmdzRmxhZ3MoKTogRmVhdHVyZUZsYWcge1xuICAgICAgICBjb25zdCBmZWF0dXJlRmxhZ3M6IHsgW2ludGVybmFsTmFtZTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG5cbiAgICAgICAgRmVhdHVyZS52YWx1ZXMuZm9yRWFjaCgoZmVhdHVyZSkgPT4ge1xuICAgICAgICAgICAgZmVhdHVyZUZsYWdzW2ZlYXR1cmUuaW50ZXJuYWxOYW1lXSA9IGZlYXR1cmUuZW5hYmxlZEJ5RGVmYXVsdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmZWF0dXJlRmxhZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSBuYW1lIHRvIGl0cyBjb3JyZXNwb25kaW5nIGRlZmF1bHQgRmVhdHVyZSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGNvbnZlcnQgdG8gRmVhdHVyZVxuICAgICAqIEB0aHJvd3MgUmFuZ2VFcnJvciwgaWYgYSBzdHJpbmcgdGhhdCBoYXMgbm8gY29ycmVzcG9uZGluZyBGZWF0dXJlIHZhbHVlIHdhcyBwYXNzZWQuXG4gICAgICogQHJldHVybnMgdGhlIG1hdGNoaW5nIEZlYXR1cmVcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVN0cmluZyhuYW1lOiBzdHJpbmcpOiBGZWF0dXJlIHtcbiAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIEZlYXR1cmUudmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gZmVhdHVyZS5pbnRlcm5hbE5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgICAgYElsbGVnYWwgYXJndW1lbnQgcGFzc2VkIHRvIGZyb21TdHJpbmcoKTogJHtuYW1lfSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFueSBhdmFpbGFibGUgRmVhdHVyZSAke1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSkucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgICAgIH1gLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTdGF0dXNDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vU3RhdHVzQ29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBTdGF0dXMgfSBmcm9tICcuLi9TdGF0dXMnO1xuaW1wb3J0IHsgU3RhdHVzU2V0dGluZ3MgfSBmcm9tICcuL1N0YXR1c1NldHRpbmdzJztcbmltcG9ydCB7IEZlYXR1cmUgfSBmcm9tICcuL0ZlYXR1cmUnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRmxhZyB9IGZyb20gJy4vRmVhdHVyZSc7XG5cbmludGVyZmFjZSBTZXR0aW5nc01hcCB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgSGVhZGluZ1N0YXRlID0ge1xuICAgIFtpZDogc3RyaW5nXTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3Mge1xuICAgIGdsb2JhbEZpbHRlcjogc3RyaW5nO1xuICAgIHJlbW92ZUdsb2JhbEZpbHRlcjogYm9vbGVhbjtcbiAgICBzZXREb25lRGF0ZTogYm9vbGVhbjtcbiAgICBhdXRvU3VnZ2VzdEluRWRpdG9yOiBib29sZWFuO1xuICAgIGF1dG9TdWdnZXN0TWluTWF0Y2g6IG51bWJlcjtcbiAgICBhdXRvU3VnZ2VzdE1heEl0ZW1zOiBudW1iZXI7XG4gICAgcHJvdmlkZUFjY2Vzc0tleXM6IGJvb2xlYW47XG4gICAgdXNlRmlsZW5hbWVBc1NjaGVkdWxlZERhdGU6IGJvb2xlYW47XG4gICAgZmlsZW5hbWVBc0RhdGVGb2xkZXJzOiBzdHJpbmdbXTtcblxuICAgIC8vIFRoZSBjdXN0b20gc3RhdHVzIHN0YXRlcy5cbiAgICBzdGF0dXNTZXR0aW5nczogU3RhdHVzU2V0dGluZ3M7XG5cbiAgICAvLyBDb2xsZWN0aW9uIG9mIGZlYXR1cmUgZmxhZyBJRHMgYW5kIHRoZWlyIHN0YXRlLlxuICAgIGZlYXR1cmVzOiBGZWF0dXJlRmxhZztcblxuICAgIC8vIFNldHRpbmdzIGFyZSBtb3ZlZCB0byBhIG1vcmUgZ2VuZXJhbCBtYXAgdG8gYWxsb3cgdGhlIHNldHRpbmdzIFVJIHRvIGJlXG4gICAgLy8gZHluYW1pY2FsbHkgZ2VuZXJhdGVkLlxuICAgIGdlbmVyYWxTZXR0aW5nczogU2V0dGluZ3NNYXA7XG5cbiAgICAvLyBUcmFja3MgdGhlIHN0YWdlIG9mIHRoZSBoZWFkaW5ncyBpbiB0aGUgc2V0dGluZ3MgVUkuXG4gICAgaGVhZGluZ09wZW5lZDogSGVhZGluZ1N0YXRlO1xufVxuXG5jb25zdCBkZWZhdWx0U2V0dGluZ3M6IFNldHRpbmdzID0ge1xuICAgIGdsb2JhbEZpbHRlcjogJycsXG4gICAgcmVtb3ZlR2xvYmFsRmlsdGVyOiBmYWxzZSxcbiAgICBzZXREb25lRGF0ZTogdHJ1ZSxcbiAgICBhdXRvU3VnZ2VzdEluRWRpdG9yOiB0cnVlLFxuICAgIGF1dG9TdWdnZXN0TWluTWF0Y2g6IDAsXG4gICAgYXV0b1N1Z2dlc3RNYXhJdGVtczogNixcbiAgICBwcm92aWRlQWNjZXNzS2V5czogdHJ1ZSxcbiAgICB1c2VGaWxlbmFtZUFzU2NoZWR1bGVkRGF0ZTogZmFsc2UsXG4gICAgZmlsZW5hbWVBc0RhdGVGb2xkZXJzOiBbXSxcbiAgICBzdGF0dXNTZXR0aW5nczogbmV3IFN0YXR1c1NldHRpbmdzKCksXG4gICAgZmVhdHVyZXM6IEZlYXR1cmUuc2V0dGluZ3NGbGFncyxcbiAgICBnZW5lcmFsU2V0dGluZ3M6IHtcbiAgICAgICAgLyogUHJldmVudCBkdXBsaWNhdGUgdmFsdWVzIGluIHVzZXIgc2V0dGluZ3MgZm9yIG5vdyxcbiAgICAgICAgICAgYXQgbGVhc3QgdW50aWwgSSBzdGFydCBwb3J0aW5nIHRoZSBwcmUtMS4yMy4wIHNldHRpbmdzXG4gICAgICAgICAgIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIGZyb20gc2V0dGluZ3NDb25maWd1cmF0aW9uLmpzb24uXG4gICAgICAgICAqL1xuICAgICAgICAvLyBnbG9iYWxGaWx0ZXI6ICcnLFxuICAgICAgICAvLyByZW1vdmVHbG9iYWxGaWx0ZXI6IGZhbHNlLFxuICAgICAgICAvLyBzZXREb25lRGF0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIGhlYWRpbmdPcGVuZWQ6IHt9LFxufTtcblxubGV0IHNldHRpbmdzOiBTZXR0aW5ncyA9IHsgLi4uZGVmYXVsdFNldHRpbmdzIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5ncyBhcyBhIG9iamVjdCwgaXQgd2lsbCBhbHNvIGNoZWNrIGFuZFxuICogdXBkYXRlIHRoZSBmbGFncyB0byBtYWtlIHN1cmUgdGhleSBhcmUgYWxsIHNob3duIGluIHRoZSBkYXRhLmpzb25cbiAqIGZpbGUuIEV4cG9zdXJlIHZpYSB0aGUgc2V0dGluZ3MgVUkgaXMgb3B0aW9uYWwuXG4gKlxuICogQGV4cG9ydFxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkLlxuICovXG5leHBvcnQgY29uc3QgZ2V0U2V0dGluZ3MgPSAoKTogU2V0dGluZ3MgPT4ge1xuICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG5ldyBmbGFnIGFuZCBpZiBzbyBhZGQgaXQgdG8gdGhlIHVzZXJzIHNldHRpbmdzLlxuICAgIGZvciAoY29uc3QgZmxhZyBpbiBGZWF0dXJlLnNldHRpbmdzRmxhZ3MpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmZlYXR1cmVzW2ZsYWddID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLmZlYXR1cmVzW2ZsYWddID0gRmVhdHVyZS5zZXR0aW5nc0ZsYWdzW2ZsYWddO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW4gY2FzZSBzYXZlcyBwcmUtZGF0ZWQgU3RhdHVzQ29uZmlndXJhdGlvbi50eXBlXG4gICAgLy8gVE9ETyBTcGVjaWFsIGNhc2UgZm9yIHN5bWJvbCAnWCcgb3IgJ3gnIChqdXN0IGluIGNhc2UpXG4gICAgc2V0dGluZ3Muc3RhdHVzU2V0dGluZ3MuY3VzdG9tU3RhdHVzZXMuZm9yRWFjaCgocywgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1R5cGUgPSBTdGF0dXMuZ2V0VHlwZUZyb21TdGF0dXNUeXBlU3RyaW5nKHMudHlwZSk7XG4gICAgICAgIGFycmF5W2luZGV4XSA9IG5ldyBTdGF0dXNDb25maWd1cmF0aW9uKFxuICAgICAgICAgICAgcy5zeW1ib2wgPz8gJyAnLFxuICAgICAgICAgICAgcy5uYW1lLFxuICAgICAgICAgICAgcy5uZXh0U3RhdHVzU3ltYm9sID8/ICd4JyxcbiAgICAgICAgICAgIHMuYXZhaWxhYmxlQXNDb21tYW5kLFxuICAgICAgICAgICAgbmV3VHlwZSxcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IC4uLnNldHRpbmdzIH07XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlU2V0dGluZ3MgPSAobmV3U2V0dGluZ3M6IFBhcnRpYWw8U2V0dGluZ3M+KTogU2V0dGluZ3MgPT4ge1xuICAgIHNldHRpbmdzID0geyAuLi5zZXR0aW5ncywgLi4ubmV3U2V0dGluZ3MgfTtcblxuICAgIHJldHVybiBnZXRTZXR0aW5ncygpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0U2V0dGluZ3MgPSAoKTogU2V0dGluZ3MgPT4ge1xuICAgIHJldHVybiB1cGRhdGVTZXR0aW5ncyhkZWZhdWx0U2V0dGluZ3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUdlbmVyYWxTZXR0aW5nID0gKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IGJvb2xlYW4pOiBTZXR0aW5ncyA9PiB7XG4gICAgc2V0dGluZ3MuZ2VuZXJhbFNldHRpbmdzW25hbWVdID0gdmFsdWU7XG5cbiAgICAvKiBQcmV2ZW50IGR1cGxpY2F0ZSB2YWx1ZXMgaW4gdXNlciBzZXR0aW5ncyBmb3Igbm93LFxuICAgICAgIGF0IGxlYXN0IHVudGlsIEkgc3RhcnQgcG9ydGluZyB0aGUgcHJlLTEuMjMuMCBzZXR0aW5nc1xuICAgICAgIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIGZyb20gc2V0dGluZ3NDb25maWd1cmF0aW9uLmpzb24uXG4gICAgICovXG4gICAgLy8gc3luYyB0aGUgb2xkIHNldHRpbmdzIGZvciB0aGUgbW9tZW50IHNvIGEgbGFyZ2VyIGNoYW5nZSBpcyBub3QgbmVlZGVkLlxuICAgIC8vIHVwZGF0ZVNldHRpbmdzKHtcbiAgICAvLyAgICAgZ2xvYmFsRmlsdGVyOiA8c3RyaW5nPnNldHRpbmdzLmdlbmVyYWxTZXR0aW5nc1snZ2xvYmFsRmlsdGVyJ10sXG4gICAgLy8gICAgIHJlbW92ZUdsb2JhbEZpbHRlcjogPGJvb2xlYW4+c2V0dGluZ3MuZ2VuZXJhbFNldHRpbmdzWydyZW1vdmVHbG9iYWxGaWx0ZXInXSxcbiAgICAvLyAgICAgc2V0RG9uZURhdGU6IDxib29sZWFuPnNldHRpbmdzLmdlbmVyYWxTZXR0aW5nc1snc2V0RG9uZURhdGUnXSxcbiAgICAvLyB9KTtcblxuICAgIHJldHVybiBnZXRTZXR0aW5ncygpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBmZWF0dXJlIGZyb20gc2V0dGluZ3MuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIGludGVybmFsTmFtZSB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgZmVhdHVyZS5cbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGZlYXR1cmUgaXMgZW5hYmxlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzRmVhdHVyZUVuYWJsZWQgPSAoaW50ZXJuYWxOYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gc2V0dGluZ3MuZmVhdHVyZXNbaW50ZXJuYWxOYW1lXSA/PyBmYWxzZTtcbn07XG5cbi8qKlxuICogZW5hYmxlcyB0b2dnbGluZyB0aGUgZmVhdHVyZSBhbmQgcmV0dXJuaW5nIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gd2l0aCBzdGF0ZS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0gaW50ZXJuYWxOYW1lIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmZWF0dXJlLlxuICogQHBhcmFtIGVuYWJsZWQgdGhlIGV4cGVjdGVkIHN0YXRlIG9mIHRoZSBmZWF0dXJlLlxuICogQHJldHVybnMgdGhlIGZlYXR1cmVzIHdpdGggdGhlIHNwZWNpZmllZCBmZWF0dXJlIHRvZ2dsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVGZWF0dXJlID0gKGludGVybmFsTmFtZTogc3RyaW5nLCBlbmFibGVkOiBib29sZWFuKTogRmVhdHVyZUZsYWcgPT4ge1xuICAgIHNldHRpbmdzLmZlYXR1cmVzW2ludGVybmFsTmFtZV0gPSBlbmFibGVkO1xuICAgIHJldHVybiBzZXR0aW5ncy5mZWF0dXJlcztcbn07XG4iLCAiaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi9TdGF0dXMnO1xuaW1wb3J0IHsgU3RhdHVzQ29uZmlndXJhdGlvbiwgU3RhdHVzVHlwZSB9IGZyb20gJy4vU3RhdHVzQ29uZmlndXJhdGlvbic7XG5cbi8qKlxuICogVHJhY2tzIGFsbCB0aGUgcmVnaXN0ZXJlZCBzdGF0dXNlcyBhIHRhc2sgY2FuIGhhdmUuXG4gKlxuICogVGhlcmUgYXJlIHR3byB3YXlzIG9mIHVzaW5nIHRoaXMgY2xhc3MuXG4gKiAtIEluICdwcm9kdWN0aW9uJyBjb2RlLCB0aGF0IGlzIGluIHRoZSBhY3R1YWwgcGx1Z2luIGNvZGUgdGhhdCBpcyByZWxlYXNlZCxcbiAqICAgY2FsbCBgU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKWAgdG8gb2J0YWluIHRoZSBzaW5nbGUgZ2xvYmFsIGluc3RhbmNlLlxuICogICBBbnkgY2hhbmdlcyB0byB0aGUgc3RhdHVzZXMgaW4gdGhhdCBpbnN0YW5jZSBhcmUgcmVmbGVjdGVkIGV2ZXJ5d2hlcmUgdGhyb3VnaG91dFxuICogICB0aGUgcGx1Z2luLlxuICogICBGb3IgZXhhbXBsZSwgdGhlIGNvZGUgdG8gdG9nZ2xlIHRhc2sgc3RhdHVzZXMgdXNlIHRoZSBnbG9iYWwgaW5zdGFuY2UuXG4gKiAtIFRlc3RzIG9mIFN0YXR1c1JlZ2lzdHJ5IGNhcGFiaWxpdGllcyBkbyBub3QgbmVlZCB0byBtb2RpZnkgdGhlIGdsb2JhbCBpbnN0YW5jZTpcbiAqICAgVGhleSBzaG91bGQgdXNlIGBuZXcgU3RhdHVzUmVnaXN0cnkoKWAsIHdoaWNoIG1ha2VzIGZvciBzaW1wbGVyLCBtb3JlIHJlYWRhYmxlXG4gKiAgIHRlc3RzIHRoYXQgY2FuIGJlIHJ1biBpbiBwYXJhbGxlbC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgU3RhdHVzUmVnaXN0cnlcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXR1c1JlZ2lzdHJ5IHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogU3RhdHVzUmVnaXN0cnk7XG5cbiAgICBwcml2YXRlIF9yZWdpc3RlcmVkU3RhdHVzZXM6IFN0YXR1c1tdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0YXR1cyBhbmQgcmVnaXN0ZXJzIGl0IGZvciB1c2UuIEl0IHdpbGwgYWxzbyBjaGVjayB0byBzZWVcbiAgICAgKiBpZiB0aGUgZGVmYXVsdCB0b2RvIGFuZCBkb25lIGFyZSByZWdpc3RlcmVkIGFuZCBpZiBub3QgaGFuZGxlIGl0IGludGVybmFsbHkuXG4gICAgICpcbiAgICAgKiBDb2RlIGluIHRoZSBwbHVnaW4gc2hvdWxkIHVzZSB7QGxpbmsgZ2V0SW5zdGFuY2V9IHRvIHVzZSBhbmQgbW9kaWZ5IHRoZSBnbG9iYWxcbiAgICAgKiBTdGF0dXNSZWdpc3RyeS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hZGREZWZhdWx0U3RhdHVzVHlwZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCB0aGUgcmVnaXN0ZXJlZCBzdGF0dXNlcyBtaW51cyB0aGUgZW1wdHkgc3RhdHVzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHR5cGUge1N0YXR1c1tdfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVnaXN0ZXJlZFN0YXR1c2VzKCk6IFN0YXR1c1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRTdGF0dXNlcy5maWx0ZXIoKHsgc3ltYm9sIH0pID0+IHN5bWJvbCAhPT0gU3RhdHVzLkVNUFRZLnN5bWJvbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRpYyBtZXRob2QgdGhhdCBjb250cm9scyB0aGUgYWNjZXNzIHRvIHRoZSBTdGF0dXNSZWdpc3RyeSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcmV0dXJuIHsqfSAge1N0YXR1c1JlZ2lzdHJ5fVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogU3RhdHVzUmVnaXN0cnkge1xuICAgICAgICBpZiAoIVN0YXR1c1JlZ2lzdHJ5Lmluc3RhbmNlKSB7XG4gICAgICAgICAgICBTdGF0dXNSZWdpc3RyeS5pbnN0YW5jZSA9IG5ldyBTdGF0dXNSZWdpc3RyeSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFN0YXR1c1JlZ2lzdHJ5Lmluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgU3RhdHVzIHRvIHRoZSByZWdpc3RyeSBpZiBub3QgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdGF0dXNDb25maWd1cmF0aW9uIHwgU3RhdHVzfSBzdGF0dXNcbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzUmVnaXN0cnlcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkKHN0YXR1czogU3RhdHVzQ29uZmlndXJhdGlvbiB8IFN0YXR1cyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaGFzU3ltYm9sKHN0YXR1cy5zeW1ib2wpKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzIGluc3RhbmNlb2YgU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZFN0YXR1c2VzLnB1c2goc3RhdHVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZFN0YXR1c2VzLnB1c2gobmV3IFN0YXR1cyhzdGF0dXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJlZ2lzdGVyZWQgc3RhdHVzIGJ5IHRoZSBzeW1ib2wgYmV0d2VlbiB0aGVcbiAgICAgKiBzcXVhcmUgYnJhY2VzIGluIHRoZSBtYXJrZG93biB0YXNrLlxuICAgICAqIFJldHVybnMgYW4gRU1QVFkgc3RhdHVzIGlmIHN5bWJvbCBpcyB1bmtub3duLlxuICAgICAqXG4gICAgICogQHNlZSBieVN5bWJvbE9yQ3JlYXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ltYm9sXG4gICAgICogQHJldHVybiB7Kn0gIHtTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c1JlZ2lzdHJ5XG4gICAgICovXG4gICAgcHVibGljIGJ5U3ltYm9sKHN5bWJvbDogc3RyaW5nKTogU3RhdHVzIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzU3ltYm9sKHN5bWJvbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFN5bWJvbChzeW1ib2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFN0YXR1cy5FTVBUWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIHN0YXR1cyBieSB0aGUgc3ltYm9sIGJldHdlZW4gdGhlXG4gICAgICogc3F1YXJlIGJyYWNlcyBpbiB0aGUgbWFya2Rvd24gdGFzay5cbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYSB1c2FibGUgbmV3IFN0YXR1cyB3aXRoIHRoaXMgZ2l2ZW4gc3ltYm9sIGlmIHN5bWJvbCBpcyB1bmtub3duLlxuICAgICAqIE5vdGU6IEFuIHVua25vd24gc3ltYm9sIGlzIG5vdCBhZGRlZCB0byB0aGUgcmVnaXN0cnkuXG4gICAgICpcbiAgICAgKiBAc2VlIGhhc1N5bWJvbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN5bWJvbFxuICAgICAqIEByZXR1cm4geyp9ICB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyBieVN5bWJvbE9yQ3JlYXRlKHN5bWJvbDogc3RyaW5nKTogU3RhdHVzIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzU3ltYm9sKHN5bWJvbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFN5bWJvbChzeW1ib2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFN0YXR1cy5jcmVhdGVVbmtub3duU3RhdHVzKHN5bWJvbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBzdGF0dXMgYnkgdGhlIG5hbWUgYXNzaWduZWQgYnkgdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVRvRmluZFxuICAgICAqIEByZXR1cm4geyp9ICB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyBieU5hbWUobmFtZVRvRmluZDogc3RyaW5nKTogU3RhdHVzIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlZ2lzdGVyZWRTdGF0dXNlcy5maWx0ZXIoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBuYW1lVG9GaW5kKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFN0YXR1c2VzLmZpbHRlcigoeyBuYW1lIH0pID0+IG5hbWUgPT09IG5hbWVUb0ZpbmQpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFN0YXR1cy5FTVBUWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGFycmF5IG9mIFN0YXR1cyB0eXBlcyB0byB0aGUgZGVmYXVsdCBzdGF0dXNlcy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldFRvRGVmYXVsdFN0YXR1c2VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyU3RhdHVzZXMoKTtcbiAgICAgICAgdGhpcy5hZGREZWZhdWx0U3RhdHVzVHlwZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGFycmF5IG9mIFN0YXR1cyB0eXBlcyB0byBiZSBlbXB0eS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJTdGF0dXNlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZFN0YXR1c2VzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG8gYWxsb3cgY3VzdG9tIHByb2dyZXNzaW9uIG9mIHRhc2sgc3RhdHVzIGVhY2ggc3RhdHVzIGtub3dzXG4gICAgICogd2hpY2ggc3RhdHVzIGNhbiBjb21lIGFmdGVyIGl0IGFzIGEgc3RhdGUgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyp9ICB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqIEBzZWUgZ2V0TmV4dFN0YXR1c09yQ3JlYXRlXG4gICAgICovXG4gICAgcHVibGljIGdldE5leHRTdGF0dXMoc3RhdHVzOiBTdGF0dXMpOiBTdGF0dXMge1xuICAgICAgICBpZiAoc3RhdHVzLm5leHRTdGF0dXNTeW1ib2wgIT09ICcnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U3RhdHVzID0gdGhpcy5ieVN5bWJvbChzdGF0dXMubmV4dFN0YXR1c1N5bWJvbCk7XG4gICAgICAgICAgICBpZiAobmV4dFN0YXR1cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0U3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdGF0dXMuRU1QVFk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBuZXh0IHN0YXR1cyBpZiBpdCBleGlzdHMsIGFuZCBpZiBub3QsIGNyZWF0ZSBhIG5ld1xuICAgICAqIFRPRE8gc3RhdHVzIHVzaW5nIHRoZSByZXF1ZXN0ZWQgbmV4dCBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsqfSAge1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzUmVnaXN0cnlcbiAgICAgKiBAc2VlIGdldE5leHRTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmV4dFN0YXR1c09yQ3JlYXRlKHN0YXR1czogU3RhdHVzKTogU3RhdHVzIHtcbiAgICAgICAgY29uc3QgbmV4dFN0YXR1cyA9IHRoaXMuZ2V0TmV4dFN0YXR1cyhzdGF0dXMpO1xuICAgICAgICBpZiAobmV4dFN0YXR1cy50eXBlICE9PSBTdGF0dXNUeXBlLkVNUFRZKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dFN0YXR1cztcbiAgICAgICAgfVxuICAgICAgICAvLyBzdGF0dXMgaXMgY29uZmlndXJlZCB0byBhZHZhbmNlIHRvIGEgc3ltYm9sIHRoYXQgaXMgbm90IHJlZ2lzdGVyZWQuXG4gICAgICAgIC8vIFNvIHdlIGdvIGFoZWFkIGFuZCBjcmVhdGUgaXQgYW55d2F5IC0gd2UganVzdCBjYW5ub3QgZ2l2ZSBpdCBhIG1lYW5pbmdmdWwgbmFtZS5cbiAgICAgICAgcmV0dXJuIFN0YXR1cy5jcmVhdGVVbmtub3duU3RhdHVzKHN0YXR1cy5uZXh0U3RhdHVzU3ltYm9sKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGFueSBzdGF0dXNlcyBpbiB0aGUgZ2l2ZW4gbGlzdCB0aGF0IGFyZSBub3Qga25vd24gdG8gdGhpcyByZWdpc3RyeS5cbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbGwgdW5rbm93biBzdGF0dXMgdHlwZXMgdG8gdGhlIHNldHRpbmdzLFxuICAgICAqIHRvIHNhdmUgdXNlcnMgZnJvbSBoYXZpbmcgdG8gZG8gdGhhdCBtYW51YWxseS5cbiAgICAgKlxuICAgICAqIFN0YXR1c2VzIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSBmaXJzdCBmb3VuZCBpbiB0aGVcbiAgICAgKiBzdXBwbGllZCBsaXN0LlxuICAgICAqIEBwYXJhbSBhbGxTdGF0dXNlc1xuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kVW5rbm93blN0YXR1c2VzKGFsbFN0YXR1c2VzOiBTdGF0dXNbXSk6IFN0YXR1c1tdIHtcbiAgICAgICAgY29uc3QgdW5rbm93blN0YXR1c2VzID0gYWxsU3RhdHVzZXMuZmlsdGVyKChzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuaGFzU3ltYm9sKHMuc3ltYm9sKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXNlIGEgc2VwYXJhdGUgU3RhdHVzUmVnaXN0cnkgdG8ga2VlcCB0cmFjayBvZiBkdXBsaWNhdGVzLFxuICAgICAgICAvLyBiZWNhdXNlIFNldCBpcyBubyB1c2UgdG8gdXM6XG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI5NzU5NDgwL2hvdy10by1jdXN0b21pemUtb2JqZWN0LWVxdWFsaXR5LWZvci1qYXZhc2NyaXB0LXNldFxuICAgICAgICBjb25zdCBuZXdTdGF0dXNSZWdpc3RyeSA9IG5ldyBTdGF0dXNSZWdpc3RyeSgpO1xuXG4gICAgICAgIGNvbnN0IG5hbWVkVW5pcXVlU3RhdHVzZXM6IFN0YXR1c1tdID0gW107XG4gICAgICAgIHVua25vd25TdGF0dXNlcy5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHNlZW4gdGhpcyBzeW1ib2wgYWxyZWFkeTpcbiAgICAgICAgICAgIGlmIChuZXdTdGF0dXNSZWdpc3RyeS5oYXNTeW1ib2wocy5zeW1ib2wpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHbyBhaGVhZCBhbmQgY3JlYXRlIGEgc3VpdGFibHktbmFtZWQgY29weSxcbiAgICAgICAgICAgIC8vIGluY2x1ZGluZyB0aGUgc3ltYm9sIGluIHRoZSBuYW1lLlxuICAgICAgICAgICAgY29uc3QgbmV3U3RhdHVzID0gU3RhdHVzUmVnaXN0cnkuY29weVN0YXR1c1dpdGhOZXdOYW1lKHMsIGBVbmtub3duICgke3Muc3ltYm9sfSlgKTtcbiAgICAgICAgICAgIG5hbWVkVW5pcXVlU3RhdHVzZXMucHVzaChuZXdTdGF0dXMpO1xuICAgICAgICAgICAgLy8gQW5kIGFkZCBpdCB0byBvdXIgbG9jYWwgcmVnaXN0cnksIHRvIHByZXZlbnQgZHVwbGljYXRlcy5cbiAgICAgICAgICAgIG5ld1N0YXR1c1JlZ2lzdHJ5LmFkZChuZXdTdGF0dXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5hbWVkVW5pcXVlU3RhdHVzZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY29weVN0YXR1c1dpdGhOZXdOYW1lKHM6IFN0YXR1cywgbmV3TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHN0YXR1c0NvbmZpZ3VyYXRpb24gPSBuZXcgU3RhdHVzQ29uZmlndXJhdGlvbihcbiAgICAgICAgICAgIHMuc3ltYm9sLFxuICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIHMubmV4dFN0YXR1c1N5bWJvbCxcbiAgICAgICAgICAgIHMuYXZhaWxhYmxlQXNDb21tYW5kLFxuICAgICAgICAgICAgcy50eXBlLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhzdGF0dXNDb25maWd1cmF0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIHRoZSBTdGF0dXMgdHlwZXMgYnkgdGhlIHN5bWJvbCBhbmQgcmV0dXJucyB0aGUgZmlyc3Qgb25lIGZvdW5kLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ltYm9sVG9GaW5kXG4gICAgICogQHJldHVybiB7Kn0gIHtTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c1JlZ2lzdHJ5XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRTeW1ib2woc3ltYm9sVG9GaW5kOiBzdHJpbmcpOiBTdGF0dXMge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFN0YXR1c2VzLmZpbHRlcigoeyBzeW1ib2wgfSkgPT4gc3ltYm9sID09PSBzeW1ib2xUb0ZpbmQpWzBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgYWxsIHRoZSBTdGF0dXMgdHlwZXMgYnkgdGhlIHN5bWJvbCBhbmQgcmV0dXJucyB0cnVlIGlmIGZvdW5kLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ltYm9sVG9GaW5kXG4gICAgICogQHJldHVybiB7Kn0gIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHByaXZhdGUgaGFzU3ltYm9sKHN5bWJvbFRvRmluZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3RhdHVzZXMuZmluZCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnN5bWJvbCA9PT0gc3ltYm9sVG9GaW5kO1xuICAgICAgICAgICAgfSkgIT09IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0aGUgcmVnaXN0cnkgYW5kIGFkZHMgdGhlIGRlZmF1bHQgc3RhdHVzIHR5cGVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzUmVnaXN0cnlcbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZERlZmF1bHRTdGF0dXNUeXBlcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFN0YXR1c2VzID0gW1N0YXR1cy5tYWtlVG9kbygpLCBTdGF0dXMubWFrZUluUHJvZ3Jlc3MoKSwgU3RhdHVzLm1ha2VEb25lKCksIFN0YXR1cy5tYWtlQ2FuY2VsbGVkKCldO1xuXG4gICAgICAgIGRlZmF1bHRTdGF0dXNlcy5mb3JFYWNoKChzdGF0dXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkKHN0YXR1cyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuXG5leHBvcnQgY2xhc3MgVXJnZW5jeSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZHVlQ29lZmZpY2llbnQgPSAxMi4wO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNjaGVkdWxlZENvZWZmaWNpZW50ID0gNS4wO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0YXJ0ZWRDb2VmZmljaWVudCA9IC0zLjA7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcHJpb3JpdHlDb2VmZmljaWVudCA9IDYuMDtcblxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IG1pbGxpU2Vjb25kc1BlckRheSA9IDEwMDAgKiA2MCAqIDYwICogMjQ7XG5cbiAgICBwdWJsaWMgc3RhdGljIGNhbGN1bGF0ZSh0YXNrOiBUYXNrKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHVyZ2VuY3kgPSAwLjA7XG5cbiAgICAgICAgaWYgKHRhc2suZHVlRGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gTWFwIGEgcmFuZ2Ugb2YgMjEgZGF5cyB0byB0aGUgdmFsdWUgMC4yIC0gMS4wXG4gICAgICAgICAgICBjb25zdCBkYXlzT3ZlcmR1ZSA9IE1hdGgucm91bmQod2luZG93Lm1vbWVudCgpLmRpZmYodGFzay5kdWVEYXRlKSAvIFVyZ2VuY3kubWlsbGlTZWNvbmRzUGVyRGF5KTtcblxuICAgICAgICAgICAgbGV0IGR1ZU11bHRpcGxpZXI6IG51bWJlcjtcbiAgICAgICAgICAgIGlmIChkYXlzT3ZlcmR1ZSA+PSA3LjApIHtcbiAgICAgICAgICAgICAgICBkdWVNdWx0aXBsaWVyID0gMS4wOyAvLyA8IDEgd2sgYWdvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRheXNPdmVyZHVlID49IC0xNC4wKSB7XG4gICAgICAgICAgICAgICAgLy8gRHVlIGJldHdlZW4gNyBkYXlzICgrNykgYWdvIGFuZCBpbiAxNCBkYXlzICgtMTQpXG4gICAgICAgICAgICAgICAgZHVlTXVsdGlwbGllciA9ICgoZGF5c092ZXJkdWUgKyAxNC4wKSAqIDAuOCkgLyAyMS4wICsgMC4yO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdWVNdWx0aXBsaWVyID0gMC4yOyAvLyA+IDIgd2tzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVyZ2VuY3kgKz0gZHVlTXVsdGlwbGllciAqIFVyZ2VuY3kuZHVlQ29lZmZpY2llbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzay5zY2hlZHVsZWREYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAod2luZG93Lm1vbWVudCgpLmlzU2FtZU9yQWZ0ZXIodGFzay5zY2hlZHVsZWREYXRlKSkge1xuICAgICAgICAgICAgICAgIHVyZ2VuY3kgKz0gMSAqIFVyZ2VuY3kuc2NoZWR1bGVkQ29lZmZpY2llbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzay5zdGFydERhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KCkuaXNCZWZvcmUodGFzay5zdGFydERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdXJnZW5jeSArPSAxICogVXJnZW5jeS5zdGFydGVkQ29lZmZpY2llbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHRhc2sucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIC8vIEhpZ2hcbiAgICAgICAgICAgIGNhc2UgJzEnOlxuICAgICAgICAgICAgICAgIHVyZ2VuY3kgKz0gMS4wICogVXJnZW5jeS5wcmlvcml0eUNvZWZmaWNpZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gTWVkaXVtXG4gICAgICAgICAgICBjYXNlICcyJzpcbiAgICAgICAgICAgICAgICB1cmdlbmN5ICs9IDAuNjUgKiBVcmdlbmN5LnByaW9yaXR5Q29lZmZpY2llbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBOb25lXG4gICAgICAgICAgICBjYXNlICczJzpcbiAgICAgICAgICAgICAgICB1cmdlbmN5ICs9IDAuMzI1ICogVXJnZW5jeS5wcmlvcml0eUNvZWZmaWNpZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVyZ2VuY3k7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IENvbXBvbmVudCwgTWFya2Rvd25SZW5kZXJlciB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQgKiBhcyB0YXNrTW9kdWxlIGZyb20gJy4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IExheW91dE9wdGlvbnMsIFRhc2tMYXlvdXRDb21wb25lbnQgfSBmcm9tICcuL1Rhc2tMYXlvdXQnO1xuaW1wb3J0IHsgVGFza0xheW91dCB9IGZyb20gJy4vVGFza0xheW91dCc7XG5pbXBvcnQgeyByZXBsYWNlVGFza1dpdGhUYXNrcyB9IGZyb20gJy4vRmlsZSc7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdzJztcblxuZXhwb3J0IHR5cGUgVGFza0xpbmVSZW5kZXJEZXRhaWxzID0ge1xuICAgIHBhcmVudFVsRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgLyoqIFRoZSBudGggaXRlbSBpbiB0aGlzIGxpc3QgKGluY2x1ZGluZyBub24tdGFza3MpLiAqL1xuICAgIGxpc3RJbmRleDogbnVtYmVyO1xuICAgIGxheW91dE9wdGlvbnM/OiBMYXlvdXRPcHRpb25zO1xuICAgIGlzRmlsZW5hbWVVbmlxdWU/OiBib29sZWFuO1xuICAgIHRhc2tMYXlvdXQ/OiBUYXNrTGF5b3V0O1xufTtcblxuZXhwb3J0IGNvbnN0IExheW91dENsYXNzZXM6IHsgW2MgaW4gVGFza0xheW91dENvbXBvbmVudF06IHN0cmluZyB9ID0ge1xuICAgIGRlc2NyaXB0aW9uOiAndGFzay1kZXNjcmlwdGlvbicsXG4gICAgcHJpb3JpdHk6ICd0YXNrLXByaW9yaXR5JyxcbiAgICBkdWVEYXRlOiAndGFzay1kdWUnLFxuICAgIHN0YXJ0RGF0ZTogJ3Rhc2stc3RhcnQnLFxuICAgIHNjaGVkdWxlZERhdGU6ICd0YXNrLXNjaGVkdWxlZCcsXG4gICAgZG9uZURhdGU6ICd0YXNrLWRvbmUnLFxuICAgIHJlY3VycmVuY2VSdWxlOiAndGFzay1yZWN1cnJpbmcnLFxuICAgIGJsb2NrTGluazogJycsXG59O1xuXG5jb25zdCBNQVhfREFZX1ZBTFVFX1JBTkdFID0gNztcbmNvbnN0IERBWV9WQUxVRV9PVkVSX1JBTkdFX1BPU1RGSVggPSAnZmFyJztcblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gdXNlZCB0byByZW5kZXIgYSBNYXJrZG93biB0YXNrIGxpbmUgaW50byBhbiBleGlzdGluZyBIVE1MIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFRleHRSZW5kZXJlciA9ICh0ZXh0OiBzdHJpbmcsIGVsZW1lbnQ6IEhUTUxTcGFuRWxlbWVudCwgcGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5hc3luYyBmdW5jdGlvbiBvYnNpZGlhbk1hcmtkb3duUmVuZGVyZXIodGV4dDogc3RyaW5nLCBlbGVtZW50OiBIVE1MU3BhbkVsZW1lbnQsIHBhdGg6IHN0cmluZykge1xuICAgIGF3YWl0IE1hcmtkb3duUmVuZGVyZXIucmVuZGVyTWFya2Rvd24odGV4dCwgZWxlbWVudCwgcGF0aCwgbnVsbCBhcyB1bmtub3duIGFzIENvbXBvbmVudCk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIGdpdmVuIFRhc2sgb2JqZWN0IGludG8gYW4gSFRNTCBMaXN0IEl0ZW0gKExJKSBlbGVtZW50LCB1c2luZyB0aGUgZ2l2ZW4gcmVuZGVyRGV0YWlsc1xuICogY29uZmlndXJhdGlvbiBhbmQgYSBzdXBwbGllZCBUZXh0UmVuZGVyZXIgKHR5cGljYWxseSB0aGUgT2JzaWRpYW4gTWFya2Rvd24gcmVuZGVyZXIsIGJ1dCBmb3IgdGVzdGluZ1xuICogcHVycG9zZXMgaXQgY2FuIGJlIGEgc2ltcGxlciBvbmUpLlxuICogVGhlIGVsZW1lbnQgaW5jbHVkZXMgdGhlIHRhc2sgYW5kIGl0cyB2YXJpb3VzIGNvbXBvbmVudHMgKGRlc2NyaXB0aW9uLCBwcmlvcml0eSwgYmxvY2sgbGluayBldGMpLCB0aGVcbiAqIGNoZWNrYm94IG9uIHRoZSBsZWZ0IHdpdGggaXRzIGV2ZW50IGhhbmRsaW5nIG9mIGNvbXBsZXRpbmcgdGhlIHRhc2ssIGFuZCB0aGUgYnV0dG9uIGZvciBlZGl0aW5nIHRoZSB0YXNrLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyVGFza0xpbmUoXG4gICAgdGFzazogVGFzayxcbiAgICByZW5kZXJEZXRhaWxzOiBUYXNrTGluZVJlbmRlckRldGFpbHMsXG4gICAgdGV4dFJlbmRlcmVyOiBUZXh0UmVuZGVyZXIgfCBudWxsID0gbnVsbCxcbik6IFByb21pc2U8SFRNTExJRWxlbWVudD4ge1xuICAgIGlmICghdGV4dFJlbmRlcmVyKSB0ZXh0UmVuZGVyZXIgPSBvYnNpZGlhbk1hcmtkb3duUmVuZGVyZXI7XG4gICAgY29uc3QgbGk6IEhUTUxMSUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIHJlbmRlckRldGFpbHMucGFyZW50VWxFbGVtZW50LmFwcGVuZENoaWxkKGxpKTtcblxuICAgIGxpLmNsYXNzTGlzdC5hZGQoJ3Rhc2stbGlzdC1pdGVtJywgJ3BsdWdpbi10YXNrcy1saXN0LWl0ZW0nKTtcblxuICAgIC8vIE1haW50ZW5hbmNlIG5vdGU6XG4gICAgLy8gIFdlIGRvbid0IHVzZSB0aGUgT2JzaWRpYW4gY29udmVuaWVuY2UgZnVuY3Rpb24gbGkuY3JlYXRlRWwoKSBoZXJlLCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgaXQgYXZhaWxhYmxlXG4gICAgLy8gIHdoZW4gcnVubmluZyB0ZXN0cywgYW5kIHdlIHdhbnQgdGhlIHRlc3RzIHRvIGJlIGFibGUgdG8gY3JlYXRlIHRoZSBmdWxsIGRpdiBhbmQgc3BhbiBzdHJ1Y3R1cmUsXG4gICAgLy8gIHNvIGhhZCB0byBjb252ZXJ0IGFsbCBvZiB0aGVzZSB0byB0aGUgZXF1aXZhbGVudCBidXQgbW9yZSBlbGFib3JhdGUgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgpIGFuZFxuICAgIC8vICBhcHBlbmRDaGlsZCgpIGNhbGxzLlxuICAgIGNvbnN0IHRleHRTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGxpLmFwcGVuZENoaWxkKHRleHRTcGFuKTtcbiAgICB0ZXh0U3Bhbi5jbGFzc0xpc3QuYWRkKCd0YXNrcy1saXN0LXRleHQnKTtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gYXdhaXQgdGFza1RvSHRtbCh0YXNrLCByZW5kZXJEZXRhaWxzLCB0ZXh0U3BhbiwgdGV4dFJlbmRlcmVyKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSBsaS5kYXRhc2V0W2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG5cbiAgICAvLyBOT1RFOiB0aGlzIGFyZWEgaXMgbWVudGlvbmVkIGluIGBDT05UUklCVVRJTkcubWRgIHVuZGVyIFwiSG93IGRvZXMgVGFza3MgaGFuZGxlIHN0YXR1cyBjaGFuZ2VzXCIuIFdoZW5cbiAgICAvLyBtb3ZpbmcgdGhlIGNvZGUsIHJlbWVtYmVyIHRvIHVwZGF0ZSB0aGF0IHJlZmVyZW5jZSB0b28uXG4gICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGxpLmFwcGVuZENoaWxkKGNoZWNrYm94KTtcbiAgICBjaGVja2JveC5jbGFzc0xpc3QuYWRkKCd0YXNrLWxpc3QtaXRlbS1jaGVja2JveCcpO1xuICAgIGNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgIGlmICh0YXNrLnN0YXR1cy5zeW1ib2wgIT09ICcgJykge1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgbGkuY2xhc3NMaXN0LmFkZCgnaXMtY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIGNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIEl0IGlzIHJlcXVpcmVkIHRvIHN0b3AgcHJvcGFnYXRpb24gc28gdGhhdCBvYnNpZGlhbiB3b24ndCB3cml0ZSB0aGUgZmlsZSB3aXRoIHRoZVxuICAgICAgICAvLyBjaGVja2JveCAodW4pY2hlY2tlZC4gT2JzaWRpYW4gd291bGQgd3JpdGUgYWZ0ZXIgdXMgYW5kIG92ZXJ3cml0ZSBvdXIgY2hhbmdlLlxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAvLyBTaG91bGQgYmUgcmUtcmVuZGVyZWQgYXMgZW5hYmxlZCBhZnRlciB1cGRhdGUgaW4gZmlsZS5cbiAgICAgICAgY2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCB0b2dnbGVkVGFza3MgPSB0YXNrLnRvZ2dsZSgpO1xuICAgICAgICByZXBsYWNlVGFza1dpdGhUYXNrcyh7XG4gICAgICAgICAgICBvcmlnaW5hbFRhc2s6IHRhc2ssXG4gICAgICAgICAgICBuZXdUYXNrczogdG9nZ2xlZFRhc2tzLFxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGxpLnByZXBlbmQoY2hlY2tib3gpO1xuXG4gICAgLy8gU2V0IHRoZXNlIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdG9jayBvYnNpZGlhbiBsaXN0czpcbiAgICBsaS5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFzaycsIHRhc2suc3RhdHVzLnN5bWJvbC50cmltKCkpOyAvLyBUcmltIHRvIGVuc3VyZSBlbXB0eSBhdHRyaWJ1dGUgZm9yIHNwYWNlLiBTYW1lIHdheSBhcyBvYnNpZGlhbi5cbiAgICBsaS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbGluZScsIHJlbmRlckRldGFpbHMubGlzdEluZGV4LnRvU3RyaW5nKCkpO1xuICAgIGNoZWNrYm94LnNldEF0dHJpYnV0ZSgnZGF0YS1saW5lJywgcmVuZGVyRGV0YWlscy5saXN0SW5kZXgudG9TdHJpbmcoKSk7XG5cbiAgICBpZiAocmVuZGVyRGV0YWlscy5sYXlvdXRPcHRpb25zPy5zaG9ydE1vZGUpIHtcbiAgICAgICAgYWRkVG9vbHRpcCh7IHRhc2ssIGVsZW1lbnQ6IHRleHRTcGFuLCBpc0ZpbGVuYW1lVW5pcXVlOiByZW5kZXJEZXRhaWxzLmlzRmlsZW5hbWVVbmlxdWUgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0YXNrVG9IdG1sKFxuICAgIHRhc2s6IFRhc2ssXG4gICAgcmVuZGVyRGV0YWlsczogVGFza0xpbmVSZW5kZXJEZXRhaWxzLFxuICAgIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHRleHRSZW5kZXJlcjogVGV4dFJlbmRlcmVyLFxuKTogUHJvbWlzZTxBdHRyaWJ1dGVzRGljdGlvbmFyeT4ge1xuICAgIGxldCBhbGxBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVzRGljdGlvbmFyeSA9IHt9O1xuICAgIGNvbnN0IHRhc2tMYXlvdXQgPSByZW5kZXJEZXRhaWxzLnRhc2tMYXlvdXQgPz8gbmV3IFRhc2tMYXlvdXQocmVuZGVyRGV0YWlscy5sYXlvdXRPcHRpb25zKTtcbiAgICAvLyBSZW5kZXIgYW5kIGJ1aWxkIGNsYXNzZXMgZm9yIGFsbCB0aGUgdGFzaydzIHZpc2libGUgY29tcG9uZW50c1xuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRhc2tMYXlvdXQubGF5b3V0Q29tcG9uZW50cykge1xuICAgICAgICBsZXQgY29tcG9uZW50U3RyaW5nID0gdGFzay5jb21wb25lbnRUb1N0cmluZyh0YXNrTGF5b3V0LCBjb21wb25lbnQpO1xuICAgICAgICBpZiAoY29tcG9uZW50U3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50ID09PSAnZGVzY3JpcHRpb24nKSBjb21wb25lbnRTdHJpbmcgPSByZW1vdmVHbG9iYWxGaWx0ZXJJZk5lZWRlZChjb21wb25lbnRTdHJpbmcpO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSB0ZXh0IHNwYW4gdGhhdCB3aWxsIGhvbGQgdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgICAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICAgICAgICBpZiAoc3Bhbikge1xuICAgICAgICAgICAgICAgIC8vIEluc2lkZSB0aGF0IHRleHQgc3Bhbiwgd2UgYXJlIGNyZWF0aW5nIGFub3RoZXIgaW50ZXJuYWwgc3BhbiwgdGhhdCB3aWxsIGhvbGQgdGhlIHRleHQgaXRzZWxmLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IHNlZW0gcmVkdW5kYW50LCBhbmQgYnkgZGVmYXVsdCBpdCBpbmRlZWQgZG9lcyBub3RoaW5nLCBidXQgd2UgZG8gaXQgdG8gYWxsb3cgdGhlIENTU1xuICAgICAgICAgICAgICAgIC8vIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgY29udGFpbmVyIG9mIHRoZSB0ZXh0IGFuZCB0aGUgdGV4dCBpdHNlbGYsIHNvIGl0IHdpbGwgYmUgcG9zc2libGVcbiAgICAgICAgICAgICAgICAvLyB0byBkbyB0aGluZ3MgbGlrZSBzdXJyb3VkaW5nIG9ubHkgdGhlIHRleHQgKHJhdGhlciB0aGFuIGl0cyB3aG9sZSBwbGFjZWhvbGRlcikgd2l0aCBhIGhpZ2hsaWdodFxuICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgICAgICBzcGFuLmFwcGVuZENoaWxkKGludGVybmFsU3Bhbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVuZGVyQ29tcG9uZW50VGV4dChpbnRlcm5hbFNwYW4sIGNvbXBvbmVudFN0cmluZywgY29tcG9uZW50LCB0YXNrLCB0ZXh0UmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtnZW5lcmljQ2xhc3NlcywgZGF0YUF0dHJpYnV0ZXNdID0gZ2V0Q29tcG9uZW50Q2xhc3Nlc0FuZERhdGEoY29tcG9uZW50LCB0YXNrKTtcbiAgICAgICAgICAgICAgICBhZGRJbnRlcm5hbENsYXNzZXMoY29tcG9uZW50LCBpbnRlcm5hbFNwYW4pO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZ2VuZXJpYyBjbGFzc2VzIHRoYXQgYXBwbHkgdG8gd2hhdCB0aGlzIGNvbXBvbmVudCBpcyAocHJpb3JpdHksIGR1ZSBkYXRlIGV0YylcbiAgICAgICAgICAgICAgICBzcGFuLmNsYXNzTGlzdC5hZGQoLi4uZ2VuZXJpY0NsYXNzZXMpO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlcyB0byB0aGUgY29tcG9uZW50ICgncHJpb3JpdHktbWVkaXVtJywgJ2R1ZS1wYXN0LTFkJyBldGMpXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YUF0dHJpYnV0ZXMpIHNwYW4uZGF0YXNldFtrZXldID0gZGF0YUF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgICAgICAgICBhbGxBdHRyaWJ1dGVzID0geyAuLi5hbGxBdHRyaWJ1dGVzLCAuLi5kYXRhQXR0cmlidXRlcyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm93IGJ1aWxkIGNsYXNzZXMgZm9yIHRoZSBoaWRkZW4gdGFzayBjb21wb25lbnRzIHdpdGhvdXQgcmVuZGVyaW5nIHRoZW1cbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0YXNrTGF5b3V0LmhpZGRlbkNvbXBvbmVudHMpIHtcbiAgICAgICAgY29uc3QgW18sIGRhdGFBdHRyaWJ1dGVzXSA9IGdldENvbXBvbmVudENsYXNzZXNBbmREYXRhKGNvbXBvbmVudCwgdGFzayk7XG4gICAgICAgIGFsbEF0dHJpYnV0ZXMgPSB7IC4uLmFsbEF0dHJpYnV0ZXMsIC4uLmRhdGFBdHRyaWJ1dGVzIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbEF0dHJpYnV0ZXM7XG59XG5cbi8qXG4gKiBSZW5kZXJzIHRoZSBnaXZlbiBjb21wb25lbnQgaW50byB0aGUgZ2l2ZW4gSFRNTCBzcGFuIGVsZW1lbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbmRlckNvbXBvbmVudFRleHQoXG4gICAgc3BhbjogSFRNTFNwYW5FbGVtZW50LFxuICAgIGNvbXBvbmVudFN0cmluZzogc3RyaW5nLFxuICAgIGNvbXBvbmVudDogVGFza0xheW91dENvbXBvbmVudCxcbiAgICB0YXNrOiBUYXNrLFxuICAgIHRleHRSZW5kZXJlcjogVGV4dFJlbmRlcmVyLFxuKSB7XG4gICAgaWYgKGNvbXBvbmVudCA9PT0gJ2Rlc2NyaXB0aW9uJykge1xuICAgICAgICBhd2FpdCB0ZXh0UmVuZGVyZXIoY29tcG9uZW50U3RyaW5nLCBzcGFuLCB0YXNrLnBhdGgpO1xuXG4gICAgICAgIC8vIElmIHRoZSB0YXNrIGlzIGEgYmxvY2sgcXVvdGUsIHRoZSBibG9jayBxdW90ZSB3cmFwcyB0aGUgcC10YWcgdGhhdCBjb250YWlucyB0aGUgY29udGVudC5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHVud3JhcCB0aGUgcC10YWcgKmluc2lkZSogdGhlIHN1cnJvdW5kaW5nIGJsb2NrIHF1b3RlLlxuICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHVud3JhcCB0aGUgcC10YWcgYXMgYSBkaXJlY3QgZGVzY2VuZGFudCBvZiB0aGUgc3Bhbi5cbiAgICAgICAgY29uc3QgYmxvY2tRdW90ZSA9IHNwYW4ucXVlcnlTZWxlY3RvcignYmxvY2txdW90ZScpO1xuICAgICAgICBjb25zdCBkaXJlY3RQYXJlbnRPZlBUYWcgPSBibG9ja1F1b3RlID8/IHNwYW47XG5cbiAgICAgICAgLy8gVW53cmFwIHRoZSBwLXRhZyB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSBNYXJrZG93blJlbmRlcmVyOlxuICAgICAgICBjb25zdCBwRWxlbWVudCA9IGRpcmVjdFBhcmVudE9mUFRhZy5xdWVyeVNlbGVjdG9yKCdwJyk7XG4gICAgICAgIGlmIChwRWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd2hpbGUgKHBFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICBkaXJlY3RQYXJlbnRPZlBUYWcuaW5zZXJ0QmVmb3JlKHBFbGVtZW50LmZpcnN0Q2hpbGQsIHBFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGFuIGVtcHR5IHRyYWlsaW5nIHAtdGFnIHRoYXQgdGhlIE1hcmtkb3duUmVuZGVyZXIgYXBwZW5kcyB3aGVuIHRoZXJlIGlzIGEgYmxvY2sgbGluazpcbiAgICAgICAgc3Bhbi5xdWVyeVNlbGVjdG9yQWxsKCdwJykuZm9yRWFjaCgocEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmICghcEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgcEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgZm9vdG5vdGUgdGhhdCB0aGUgTWFya2Rvd25SZW5kZXJlciBhcHBlbmRzIHdoZW4gdGhlcmUgaXMgYSBmb290bm90ZSBpbiB0aGUgdGFzazpcbiAgICAgICAgc3Bhbi5xdWVyeVNlbGVjdG9yQWxsKCcuZm9vdG5vdGVzJykuZm9yRWFjaCgoZm9vdG5vdGVFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBmb290bm90ZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNwYW4uaW5uZXJIVE1MID0gY29tcG9uZW50U3RyaW5nO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgQXR0cmlidXRlc0RpY3Rpb25hcnkgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0d28gbGlzdHMgLS0gZ2VuZXJpY0NsYXNzZXMgYW5kIGRhdGFBdHRyaWJ1dGVzIC0tIHRoYXQgZGVzY3JpYmUgdGhlXG4gKiBnaXZlbiBjb21wb25lbnQuXG4gKiBUaGUgZ2VuZXJpY0NsYXNzZXMgZGVzY3JpYmUgd2hhdCB0aGUgY29tcG9uZW50IGlzLCBlLmcuIGEgZHVlIGRhdGUgb3IgYSBwcmlvcml0eSwgYW5kIGFyZSBvbmUgb2YgdGhlXG4gKiBvcHRpb25zIGluIExheW91dENsYXNzZXMuXG4gKiBUaGUgc3BlY2lmaWNDbGFzc2VzIGRlc2NyaWJlIHRoZSBjb250ZW50IG9mIHRoZSBjb21wb25lbnQgdHJhbnNsYXRlZCB0byBhIENTUyBjbGFzcyxcbiAqIGUuZy4gdGFzay1wcmlvcml0eS1tZWRpdW0sIHRhc2stZHVlLXBhc3QtMWQgZXRjLlxuICogVE9ETyBVUERBVEVcbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50Q2xhc3Nlc0FuZERhdGEoY29tcG9uZW50OiBUYXNrTGF5b3V0Q29tcG9uZW50LCB0YXNrOiBUYXNrKTogW3N0cmluZ1tdLCBBdHRyaWJ1dGVzRGljdGlvbmFyeV0ge1xuICAgIGNvbnN0IGdlbmVyaWNDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGRhdGFBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVzRGljdGlvbmFyeSA9IHt9O1xuICAgIGNvbnN0IHNldERhdGVBdHRyaWJ1dGUgPSAoZGF0ZTogTW9tZW50LCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgZGF0ZVZhbHVlID0gZGF0ZVRvQXR0cmlidXRlKGRhdGUpO1xuICAgICAgICBpZiAoZGF0ZVZhbHVlKSBkYXRhQXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IGRhdGVWYWx1ZTtcbiAgICB9O1xuICAgIHN3aXRjaCAoY29tcG9uZW50KSB7XG4gICAgICAgIGNhc2UgJ2Rlc2NyaXB0aW9uJzpcbiAgICAgICAgICAgIGdlbmVyaWNDbGFzc2VzLnB1c2goTGF5b3V0Q2xhc3Nlcy5kZXNjcmlwdGlvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncHJpb3JpdHknOiB7XG4gICAgICAgICAgICBsZXQgcHJpb3JpdHlWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGFzay5wcmlvcml0eSA9PT0gdGFza01vZHVsZS5Qcmlvcml0eS5IaWdoKSBwcmlvcml0eVZhbHVlID0gJ2hpZ2gnO1xuICAgICAgICAgICAgZWxzZSBpZiAodGFzay5wcmlvcml0eSA9PT0gdGFza01vZHVsZS5Qcmlvcml0eS5NZWRpdW0pIHByaW9yaXR5VmFsdWUgPSAnbWVkaXVtJztcbiAgICAgICAgICAgIGVsc2UgaWYgKHRhc2sucHJpb3JpdHkgPT09IHRhc2tNb2R1bGUuUHJpb3JpdHkuTG93KSBwcmlvcml0eVZhbHVlID0gJ2xvdyc7XG4gICAgICAgICAgICBlbHNlIHByaW9yaXR5VmFsdWUgPSAnbm9uZSc7XG4gICAgICAgICAgICBkYXRhQXR0cmlidXRlc1sndGFza1ByaW9yaXR5J10gPSBwcmlvcml0eVZhbHVlO1xuICAgICAgICAgICAgZ2VuZXJpY0NsYXNzZXMucHVzaChMYXlvdXRDbGFzc2VzLnByaW9yaXR5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2R1ZURhdGUnOiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGFzay5kdWVEYXRlO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBnZW5lcmljQ2xhc3Nlcy5wdXNoKExheW91dENsYXNzZXMuZHVlRGF0ZSk7XG4gICAgICAgICAgICAgICAgc2V0RGF0ZUF0dHJpYnV0ZShkYXRlLCAndGFza0R1ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhcnREYXRlJzoge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRhc2suc3RhcnREYXRlO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBnZW5lcmljQ2xhc3Nlcy5wdXNoKExheW91dENsYXNzZXMuc3RhcnREYXRlKTtcbiAgICAgICAgICAgICAgICBzZXREYXRlQXR0cmlidXRlKGRhdGUsICd0YXNrU3RhcnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NjaGVkdWxlZERhdGUnOiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGFzay5zY2hlZHVsZWREYXRlO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBnZW5lcmljQ2xhc3Nlcy5wdXNoKExheW91dENsYXNzZXMuc2NoZWR1bGVkRGF0ZSk7XG4gICAgICAgICAgICAgICAgc2V0RGF0ZUF0dHJpYnV0ZShkYXRlLCAndGFza1NjaGVkdWxlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9uZURhdGUnOiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGFzay5kb25lRGF0ZTtcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJpY0NsYXNzZXMucHVzaChMYXlvdXRDbGFzc2VzLmRvbmVEYXRlKTtcbiAgICAgICAgICAgICAgICBzZXREYXRlQXR0cmlidXRlKGRhdGUsICd0YXNrRG9uZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncmVjdXJyZW5jZVJ1bGUnOiB7XG4gICAgICAgICAgICBnZW5lcmljQ2xhc3Nlcy5wdXNoKExheW91dENsYXNzZXMucmVjdXJyZW5jZVJ1bGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtnZW5lcmljQ2xhc3NlcywgZGF0YUF0dHJpYnV0ZXNdO1xufVxuXG4vKlxuICogQWRkcyBpbnRlcm5hbCBjbGFzc2VzIGZvciB2YXJpb3VzIGNvbXBvbmVudHMgKHJpZ2h0IG5vdyBqdXN0IHRhZ3MgYWN0dWFsbHkpLCBtZWFuaW5nIHRoYXQgd2UgbW9kaWZ5IHRoZSBleGlzdGluZ1xuICogcmVuZGVyZWQgZWxlbWVudCB0byBhZGQgY2xhc3NlcyBpbnNpZGUgaXQuXG4gKiBJbiB0aGUgY2FzZSBvZiB0YWdzLCBPYnNpZGlhbiByZW5kZXJzIGEgTWFya2Rvd24gZGVzY3JpcHRpb24gd2l0aCA8YSBjbGFzcz1cInRhZ1wiPiBlbGVtZW50cyBmb3IgdGFncy4gV2Ugd2FudCB0b1xuICogZW5hYmxlIHVzZXJzIHRvIHN0eWxlIHRoZXNlLCBzbyB3ZSBtb2RpZnkgdGhlIHJlbmRlcmVkIE1hcmtkb3duIGJ5IGFkZGluZyB0aGUgc3BlY2lmaWMgdGFnIGNsYXNzZXMgZm9yIHRoZXNlIDxhPlxuICogZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGFkZEludGVybmFsQ2xhc3Nlcyhjb21wb25lbnQ6IFRhc2tMYXlvdXRDb21wb25lbnQsIHJlbmRlcmVkQ29tcG9uZW50OiBIVE1MU3BhbkVsZW1lbnQpIHtcbiAgICBpZiAoY29tcG9uZW50ID09PSAnZGVzY3JpcHRpb24nKSB7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSByZW5kZXJlZENvbXBvbmVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWcnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdOYW1lID0gdGFnc1tpXS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIGlmICh0YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gdGFnVG9BdHRyaWJ1dGVWYWx1ZSh0YWdOYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGFnc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lKSBlbGVtZW50LmRhdGFzZXQudGFnTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBUcmFuc2xhdGUgYSByZWxhdGl2ZSBkYXRlIHRvIGEgQ1NTIGNsYXNzOiAndG9kYXknLCAnZnV0dXJlLTFkJyAoZm9yIHRvbW9ycm93KSwgJ3Bhc3QtMWQnIChmb3IgeWVzdGVyZGF5KVxuICogZXRjLlxuICogQSBjdXRvZmYgKGluIGRheXMpIGlzIGRlZmluZWQgaW4gTUFYX0RBWV9WQUxVRV9SQU5HRSwgZnJvbSBiZXlvbmQgdGhhdCBhIGdlbmVyaWMgJ2ZhcicgcG9zdGZpeCB3aWxsIGJlIGFkZGVkLlxuICogKHRoZSBjdXRvZmYgZXhpc3RzIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBmbG9vZCB0aGUgRE9NIHdpdGggcG90ZW50aWFsbHkgaHVuZHJlZHMgb2YgdW5pcXVlIGNsYXNzZXMuKVxuICovXG5mdW5jdGlvbiBkYXRlVG9BdHRyaWJ1dGUoZGF0ZTogTW9tZW50KSB7XG4gICAgY29uc3QgdG9kYXkgPSB3aW5kb3cubW9tZW50KCkuc3RhcnRPZignZGF5Jyk7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIGNvbnN0IGRpZmZEYXlzID0gdG9kYXkuZGlmZihkYXRlLCAnZGF5cycpO1xuICAgIGlmIChpc05hTihkaWZmRGF5cykpIHJldHVybiBudWxsO1xuICAgIGlmIChkaWZmRGF5cyA9PT0gMCkgcmV0dXJuICd0b2RheSc7XG4gICAgZWxzZSBpZiAoZGlmZkRheXMgPiAwKSByZXN1bHQgKz0gJ3Bhc3QtJztcbiAgICBlbHNlIGlmIChkaWZmRGF5cyA8IDApIHJlc3VsdCArPSAnZnV0dXJlLSc7XG4gICAgaWYgKE1hdGguYWJzKGRpZmZEYXlzKSA8PSBNQVhfREFZX1ZBTFVFX1JBTkdFKSB7XG4gICAgICAgIHJlc3VsdCArPSBNYXRoLmFicyhkaWZmRGF5cykudG9TdHJpbmcoKSArICdkJztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gREFZX1ZBTFVFX09WRVJfUkFOR0VfUE9TVEZJWDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIFNhbml0aXplIHRhZyBuYW1lcyBzbyB0aGV5IHdpbGwgYmUgdmFsaWQgYXR0cmlidXRlIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIEhUTUwgc3BlYzpcbiAqIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3BhcnNpbmcuaHRtbCNhdHRyaWJ1dGUtdmFsdWUtKGRvdWJsZS1xdW90ZWQpLXN0YXRlXG4gKi9cbmZ1bmN0aW9uIHRhZ1RvQXR0cmlidXRlVmFsdWUodGFnOiBzdHJpbmcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuICAgIGNvbnN0IGlsbGVnYWxDaGFycyA9IC9bXCImXFx4MDBcXHJcXG5dL2c7XG4gICAgbGV0IHNhbml0aXplZFRhZyA9IHRhZy5yZXBsYWNlKGlsbGVnYWxDaGFycywgJy0nKTtcbiAgICAvLyBBbmQgaWYgYWZ0ZXIgc2FuaXRhemF0aW9uIHRoZSBuYW1lIHN0YXJ0cyB3aXRoIGRhc2hlcyBvciB1bmRlcnNjb3JlcywgcmVtb3ZlIHRoZW0uXG4gICAgc2FuaXRpemVkVGFnID0gc2FuaXRpemVkVGFnLnJlcGxhY2UoL15bLV9dKy8sICcnKTtcbiAgICBpZiAoc2FuaXRpemVkVGFnLmxlbmd0aCA+IDApIHJldHVybiBzYW5pdGl6ZWRUYWc7XG4gICAgZWxzZSByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWRkVG9vbHRpcCh7XG4gICAgdGFzayxcbiAgICBlbGVtZW50LFxuICAgIGlzRmlsZW5hbWVVbmlxdWUsXG59OiB7XG4gICAgdGFzazogVGFzaztcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICBpc0ZpbGVuYW1lVW5pcXVlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xufSk6IHZvaWQge1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsICgpID0+IHtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IGVsZW1lbnQuY3JlYXRlRGl2KCk7XG4gICAgICAgIHRvb2x0aXAuYWRkQ2xhc3NlcyhbJ3Rvb2x0aXAnLCAnbW9kLXJpZ2h0J10pO1xuXG4gICAgICAgIGlmICh0YXNrLnJlY3VycmVuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY3VycmVuY2VEaXYgPSB0b29sdGlwLmNyZWF0ZURpdigpO1xuICAgICAgICAgICAgcmVjdXJyZW5jZURpdi5zZXRUZXh0KGAke3Rhc2tNb2R1bGUucmVjdXJyZW5jZVN5bWJvbH0gJHt0YXNrLnJlY3VycmVuY2UudG9UZXh0KCl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzay5zdGFydERhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZURpdiA9IHRvb2x0aXAuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICBzdGFydERhdGVEaXYuc2V0VGV4dChcbiAgICAgICAgICAgICAgICB0b1Rvb2x0aXBEYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWVyOiB0YXNrTW9kdWxlLnN0YXJ0RGF0ZVN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZTogdGFzay5zdGFydERhdGUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhc2suc2NoZWR1bGVkRGF0ZSkge1xuICAgICAgICAgICAgY29uc3Qgc2NoZWR1bGVkRGF0ZURpdiA9IHRvb2x0aXAuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlRGl2LnNldFRleHQoXG4gICAgICAgICAgICAgICAgdG9Ub29sdGlwRGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25pZmllcjogdGFza01vZHVsZS5zY2hlZHVsZWREYXRlU3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICBkYXRlOiB0YXNrLnNjaGVkdWxlZERhdGUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhc2suZHVlRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgZHVlRGF0ZURpdiA9IHRvb2x0aXAuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICBkdWVEYXRlRGl2LnNldFRleHQoXG4gICAgICAgICAgICAgICAgdG9Ub29sdGlwRGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25pZmllcjogdGFza01vZHVsZS5kdWVEYXRlU3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICBkYXRlOiB0YXNrLmR1ZURhdGUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhc2suZG9uZURhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRvbmVEYXRlRGl2ID0gdG9vbHRpcC5jcmVhdGVEaXYoKTtcbiAgICAgICAgICAgIGRvbmVEYXRlRGl2LnNldFRleHQoXG4gICAgICAgICAgICAgICAgdG9Ub29sdGlwRGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25pZmllcjogdGFza01vZHVsZS5kb25lRGF0ZVN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZTogdGFzay5kb25lRGF0ZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5rVGV4dCA9IHRhc2suZ2V0TGlua1RleHQoeyBpc0ZpbGVuYW1lVW5pcXVlIH0pO1xuICAgICAgICBpZiAobGlua1RleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhY2tsaW5rRGl2ID0gdG9vbHRpcC5jcmVhdGVEaXYoKTtcbiAgICAgICAgICAgIGJhY2tsaW5rRGl2LnNldFRleHQoYFx1RDgzRFx1REQxNyAke2xpbmtUZXh0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAgICAgdG9vbHRpcC5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvVG9vbHRpcERhdGUoeyBzaWduaWZpZXIsIGRhdGUgfTogeyBzaWduaWZpZXI6IHN0cmluZzsgZGF0ZTogTW9tZW50IH0pOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtzaWduaWZpZXJ9ICR7ZGF0ZS5mb3JtYXQodGFza01vZHVsZS5UYXNrUmVndWxhckV4cHJlc3Npb25zLmRhdGVGb3JtYXQpfSAoJHtkYXRlLmZyb20oXG4gICAgICAgIHdpbmRvdy5tb21lbnQoKS5zdGFydE9mKCdkYXknKSxcbiAgICApfSlgO1xufVxuXG5mdW5jdGlvbiByZW1vdmVHbG9iYWxGaWx0ZXJJZk5lZWRlZChkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBnbG9iYWxGaWx0ZXIsIHJlbW92ZUdsb2JhbEZpbHRlciB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICBpZiAocmVtb3ZlR2xvYmFsRmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbi5yZXBsYWNlKGdsb2JhbEZpbHRlciwgJycpLnRyaW0oKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xufVxuIiwgImltcG9ydCB7IE1ldGFkYXRhQ2FjaGUsIFRGaWxlLCBWYXVsdCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgTGlzdEl0ZW1DYWNoZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0NvbmZpZy9TZXR0aW5ncyc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuXG5sZXQgbWV0YWRhdGFDYWNoZTogTWV0YWRhdGFDYWNoZSB8IHVuZGVmaW5lZDtcbmxldCB2YXVsdDogVmF1bHQgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBpbml0aWFsaXplRmlsZSA9ICh7XG4gICAgbWV0YWRhdGFDYWNoZTogbmV3TWV0YWRhdGFDYWNoZSxcbiAgICB2YXVsdDogbmV3VmF1bHQsXG59OiB7XG4gICAgbWV0YWRhdGFDYWNoZTogTWV0YWRhdGFDYWNoZTtcbiAgICB2YXVsdDogVmF1bHQ7XG59KSA9PiB7XG4gICAgbWV0YWRhdGFDYWNoZSA9IG5ld01ldGFkYXRhQ2FjaGU7XG4gICAgdmF1bHQgPSBuZXdWYXVsdDtcbn07XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIG9yaWdpbmFsIHRhc2sgd2l0aCBvbmUgb3IgbW9yZSBuZXcgdGFza3MuXG4gKlxuICogSWYgeW91IHBhc3MgbW9yZSB0aGFuIG9uZSByZXBsYWNlbWVudCB0YXNrLCBhbGwgc3Vic2VxdWVudCB0YXNrcyBpbiB0aGUgc2FtZVxuICogc2VjdGlvbiBtdXN0IGJlIHJlLXJlbmRlcmVkLCBhcyB0aGVpciBzZWN0aW9uIGluZGV4ZXMgY2hhbmdlLiBBc3N1bWluZyB0aGF0XG4gKiB0aGlzIGlzIGRvbmUgZmFzdGVyIHRoYW4gdXNlciBpbnRlcmFjdGlvbiBpbiBwcmFjdGljZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGxhY2VUYXNrV2l0aFRhc2tzID0gYXN5bmMgKHtcbiAgICBvcmlnaW5hbFRhc2ssXG4gICAgbmV3VGFza3MsXG59OiB7XG4gICAgb3JpZ2luYWxUYXNrOiBUYXNrO1xuICAgIG5ld1Rhc2tzOiBUYXNrIHwgVGFza1tdO1xufSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICh2YXVsdCA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdUYXNrczogY2Fubm90IHVzZSBGaWxlIGJlZm9yZSBpbml0aWFsaXppbmcgaXQuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobmV3VGFza3MpKSB7XG4gICAgICAgIG5ld1Rhc2tzID0gW25ld1Rhc2tzXTtcbiAgICB9XG5cbiAgICB0cnlSZXBldGl0aXZlKHtcbiAgICAgICAgb3JpZ2luYWxUYXNrLFxuICAgICAgICBuZXdUYXNrcyxcbiAgICAgICAgdmF1bHQsXG4gICAgICAgIG1ldGFkYXRhQ2FjaGUsXG4gICAgICAgIHByZXZpb3VzVHJpZXM6IDAsXG4gICAgfSk7XG59O1xuXG4vKipcbiAqIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIHJlLXRyeSB3aGVuIHRoZSByZXR1cm5lZCBmaWxlIGNhY2hlIGlzIGB1bmRlZmluZWRgLlxuICogUmV0cnlpbmcgYWZ0ZXIgYSB3aGlsZSBtYXkgcmV0dXJuIGEgdmFsaWQgZmlsZSBjYWNoZS5cbiAqIFJlcG9ydGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbi10YXNrcy1ncm91cC9vYnNpZGlhbi10YXNrcy9pc3N1ZXMvODdcbiAqL1xuY29uc3QgdHJ5UmVwZXRpdGl2ZSA9IGFzeW5jICh7XG4gICAgb3JpZ2luYWxUYXNrLFxuICAgIG5ld1Rhc2tzLFxuICAgIHZhdWx0LFxuICAgIG1ldGFkYXRhQ2FjaGUsXG4gICAgcHJldmlvdXNUcmllcyxcbn06IHtcbiAgICBvcmlnaW5hbFRhc2s6IFRhc2s7XG4gICAgbmV3VGFza3M6IFRhc2tbXTtcbiAgICB2YXVsdDogVmF1bHQ7XG4gICAgbWV0YWRhdGFDYWNoZTogTWV0YWRhdGFDYWNoZTtcbiAgICBwcmV2aW91c1RyaWVzOiBudW1iZXI7XG59KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcmV0cnkgPSAoKSA9PiB7XG4gICAgICAgIGlmIChwcmV2aW91c1RyaWVzID4gMTApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Rhc2tzOiBUb28gbWFueSByZXRyaWVzLiBGaWxlIHVwZGF0ZSBub3QgcG9zc2libGUgLi4uJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gTWF0aC5taW4oTWF0aC5wb3coMTAsIHByZXZpb3VzVHJpZXMpLCAxMDApOyAvLyAxLCAxMCwgMTAwLCAxMDAsIDEwMCwgLi4uXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5UmVwZXRpdGl2ZSh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxUYXNrLFxuICAgICAgICAgICAgICAgIG5ld1Rhc2tzLFxuICAgICAgICAgICAgICAgIHZhdWx0LFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhQ2FjaGUsXG4gICAgICAgICAgICAgICAgcHJldmlvdXNUcmllczogcHJldmlvdXNUcmllcyArIDEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGZpbGUgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgob3JpZ2luYWxUYXNrLnBhdGgpO1xuICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBUYXNrczogTm8gZmlsZSBmb3VuZCBmb3IgdGFzayAke29yaWdpbmFsVGFzay5kZXNjcmlwdGlvbn0uIFJldHJ5aW5nIC4uLmApO1xuICAgICAgICByZXR1cm4gcmV0cnkoKTtcbiAgICB9XG5cbiAgICBpZiAoZmlsZS5leHRlbnNpb24gIT09ICdtZCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVGFza3M6IE9ubHkgc3VwcG9ydGluZyBmaWxlcyB3aXRoIHRoZSAubWQgZmlsZSBleHRlbnNpb24uJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ2FjaGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICBpZiAoZmlsZUNhY2hlID09IHVuZGVmaW5lZCB8fCBmaWxlQ2FjaGUgPT09IG51bGwpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBUYXNrczogTm8gZmlsZSBjYWNoZSBmb3VuZCBmb3IgZmlsZSAke2ZpbGUucGF0aH0uIFJldHJ5aW5nIC4uLmApO1xuICAgICAgICByZXR1cm4gcmV0cnkoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0SXRlbXNDYWNoZSA9IGZpbGVDYWNoZS5saXN0SXRlbXM7XG4gICAgaWYgKGxpc3RJdGVtc0NhY2hlID09PSB1bmRlZmluZWQgfHwgbGlzdEl0ZW1zQ2FjaGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVGFza3M6IE5vIGxpc3QgaXRlbXMgZm91bmQgaW4gZmlsZSBjYWNoZSBvZiAke2ZpbGUucGF0aH0uIFJldHJ5aW5nIC4uLmApO1xuICAgICAgICByZXR1cm4gcmV0cnkoKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IHZhdWx0LnJlYWQoZmlsZSk7XG4gICAgY29uc3QgZmlsZUxpbmVzID0gZmlsZUNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuXG4gICAgY29uc3QgeyBnbG9iYWxGaWx0ZXIgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgbGV0IGxpc3RJdGVtOiBMaXN0SXRlbUNhY2hlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzZWN0aW9uSW5kZXggPSAwO1xuICAgIGZvciAoY29uc3QgbGlzdEl0ZW1DYWNoZSBvZiBsaXN0SXRlbXNDYWNoZSkge1xuICAgICAgICBpZiAobGlzdEl0ZW1DYWNoZS5wb3NpdGlvbi5zdGFydC5saW5lIDwgb3JpZ2luYWxUYXNrLnNlY3Rpb25TdGFydCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdEl0ZW1DYWNoZS50YXNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGluZSA9IGZpbGVMaW5lc1tsaXN0SXRlbUNhY2hlLnBvc2l0aW9uLnN0YXJ0LmxpbmVdO1xuXG4gICAgICAgIGlmIChsaW5lLmluY2x1ZGVzKGdsb2JhbEZpbHRlcikpIHtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uSW5kZXggPT09IG9yaWdpbmFsVGFzay5zZWN0aW9uSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBsaXN0SXRlbSA9IGxpc3RJdGVtQ2FjaGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlY3Rpb25JbmRleCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChsaXN0SXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Rhc2tzOiBjb3VsZCBub3QgZmluZCB0YXNrIHRvIHRvZ2dsZSBpbiB0aGUgZmlsZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRGaWxlTGluZXMgPSBbXG4gICAgICAgIC4uLmZpbGVMaW5lcy5zbGljZSgwLCBsaXN0SXRlbS5wb3NpdGlvbi5zdGFydC5saW5lKSxcbiAgICAgICAgLi4ubmV3VGFza3MubWFwKCh0YXNrOiBUYXNrKSA9PiB0YXNrLnRvRmlsZUxpbmVTdHJpbmcoKSksXG4gICAgICAgIC4uLmZpbGVMaW5lcy5zbGljZShsaXN0SXRlbS5wb3NpdGlvbi5zdGFydC5saW5lICsgMSksIC8vIE9ubHkgc3VwcG9ydHMgc2luZ2xlLWxpbmUgdGFza3MuXG4gICAgXTtcblxuICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCB1cGRhdGVkRmlsZUxpbmVzLmpvaW4oJ1xcbicpKTtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBNb21lbnQgfSBmcm9tICdtb21lbnQvbW9tZW50JztcbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ3MnO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5cbi8qKlxuICogSW1wbGVtZW50IGRhdGUgZnJvbSBwYXRoIGRldGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRGF0ZUZhbGxiYWNrIHtcbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIHBhcnNlIHRoZSBmaWxlbmFtZSB0byBleHRyYWN0IGEgZGF0ZSB0YWtpbmcgdXNlciBzZXR0aW5ncyBpbnRvIGFjY291bnQuIElmIGRhdGUgaW5mZXJlbmNlIGlzIG5vdFxuICAgICAqIGVuYWJsZWQgcGFyc2luZyBpcyBieXBhc3NlZCBhbmQgbnVsbCBpcyByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0gcGF0aCB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaWxlXG4gICAgICogQHJldHVybiBhIE1vbWVudCBvciBudWxsIGlmIG5vIGRhdGUgd2FzIGZvdW5kLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVBhdGgocGF0aDogc3RyaW5nKTogTW9tZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHsgdXNlRmlsZW5hbWVBc1NjaGVkdWxlZERhdGUsIGZpbGVuYW1lQXNEYXRlRm9sZGVycyB9ID0gZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgICBpZiAoIXVzZUZpbGVuYW1lQXNTY2hlZHVsZWREYXRlKSB7XG4gICAgICAgICAgICAvLyBmZWF0dXJlIGlzIGRpc2FibGVkXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5tYXRjaGVzQW55Rm9sZGVyKGZpbGVuYW1lQXNEYXRlRm9sZGVycywgcGF0aCkpIHtcbiAgICAgICAgICAgIC8vIGZpbGUgaXMgbm90IGluIGFueSBmb2xkZXIgb3Igc3ViZm9sZGVyIHRoYXQgd2FzIHNlbGVjdGVkIGZvciBkYXRlIGluZmVyZW5jZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0ZUZyb21QYXRoKHBhdGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG1hdGNoZXNBbnlGb2xkZXIoZm9sZGVyczogc3RyaW5nW10sIHBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoZm9sZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIG5vIGNvbnN0cmFpbnRzIG9uIG1hdGNoaW5nIGZvbGRlcnNcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZm9sZGVycyBuZXZlciBlbmQgd2l0aCBhICcvJywgYW5kIHBhdGhzIGNvbnRhaW4gYXQgbGVhc3Qgb24gc2xhc2ggKHNlcGFyYXRpbmcgdGhlIGZvbGRlciBmcm9tIHRoZVxuICAgICAgICAvLyBmaWxlbmFtZSlcbiAgICAgICAgcmV0dXJuIGZvbGRlcnMuc29tZSgoZm9sZGVyKSA9PiBwYXRoLnN0YXJ0c1dpdGgoZm9sZGVyICsgJy8nKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdERhdGVGcm9tUGF0aChwYXRoOiBzdHJpbmcpOiBNb21lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZmlyc3RQb3MgPSBNYXRoLm1heCgwLCBwYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbiAgICAgICAgY29uc3QgbGFzdFBvcyA9IHBhdGgubGFzdEluZGV4T2YoJy4nKTtcblxuICAgICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguc3Vic3RyaW5nKGZpcnN0UG9zLCBsYXN0UG9zKTtcblxuICAgICAgICBsZXQgZGF0ZU1hdGNoID0gLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pLy5leGVjKGJhc2VuYW1lKTtcbiAgICAgICAgaWYgKCFkYXRlTWF0Y2gpIGRhdGVNYXRjaCA9IC8oXFxkezR9KShcXGR7Mn0pKFxcZHsyfSkvLmV4ZWMoYmFzZW5hbWUpO1xuXG4gICAgICAgIGlmIChkYXRlTWF0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSB3aW5kb3cubW9tZW50KFtwYXJzZUludChkYXRlTWF0Y2hbMV0pLCBwYXJzZUludChkYXRlTWF0Y2hbMl0pIC0gMSwgcGFyc2VJbnQoZGF0ZU1hdGNoWzNdKV0pO1xuICAgICAgICAgICAgaWYgKGRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZmYgYSBmYWxsYmFjayBjYW4gYmUgc2V0XG4gICAgICoqL1xuICAgIHB1YmxpYyBzdGF0aWMgY2FuQXBwbHlGYWxsYmFjayh7XG4gICAgICAgIHN0YXJ0RGF0ZSxcbiAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgZHVlRGF0ZSxcbiAgICB9OiB7XG4gICAgICAgIHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgc2NoZWR1bGVkRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgZHVlRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICB9KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzdGFydERhdGUgPT09IG51bGwgJiYgZHVlRGF0ZSA9PT0gbnVsbCAmJiBzY2hlZHVsZWREYXRlID09PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudCB0aGUgbG9naWMgdG8gdXBkYXRlIHRoZSBmaWVsZHMgcmVsYXRlZCB0byBkYXRlIGZhbGxiYWNrIG9mIGEgdGFzayB3aGVuIGl0cyBmaWxlIGhhcyBtb3ZlZFxuICAgICAqIEBwYXJhbSB0YXNrICAgICAgICAgLSB0YXNrIHRvIHVwZGF0ZVxuICAgICAqIEBwYXJhbSBuZXdQYXRoICAgICAgLSBuZXcgbG9jYXRpb25cbiAgICAgKiBAcGFyYW0gZmFsbGJhY2tEYXRlIC0gZmFsbGJhY2sgZGF0ZSBmcm9tIG5ldyBsb2NhdGlvbiwgZm9yIGVmZmljaWVuY3kuIENhbiBiZSBudWxsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyB1cGRhdGVUYXNrUGF0aCh0YXNrOiBUYXNrLCBuZXdQYXRoOiBzdHJpbmcsIGZhbGxiYWNrRGF0ZTogTW9tZW50IHwgbnVsbCk6IFRhc2sge1xuICAgICAgICAvLyBpbml0aWFsaXplIHdpdGggdmFsdWVzIGZyb20gYmVmb3JlIHRoZSBwYXRoIHdhcyBjaGFuZ2VkXG4gICAgICAgIGxldCBzY2hlZHVsZWREYXRlID0gdGFzay5zY2hlZHVsZWREYXRlO1xuICAgICAgICBsZXQgc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQgPSB0YXNrLnNjaGVkdWxlZERhdGVJc0luZmVycmVkO1xuXG4gICAgICAgIGlmIChmYWxsYmFja0RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgcGF0aCBkb2Vzbid0IGNvbnRhaW4gYSBkYXRlLi4uXG5cbiAgICAgICAgICAgIGlmIChzY2hlZHVsZWREYXRlSXNJbmZlcnJlZCkge1xuICAgICAgICAgICAgICAgIC8vIC4uLmJ1dCB0aGUgcHJldmlvdXMgcGF0aCBoYWQgb25lIDogcmVtb3ZlIGluZmVycmVkIGRhdGUgZnJvbSBUYXNrXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZWREYXRlID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gLi4uYW5kIHRoZSBvbGQgcGF0aCBkaWRuJ3QgY29udGFpbiBhbnkgZWl0aGVyIDpcbiAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLCBhbmQga2VlcCBhbnkgZXhwbGljaXRseSBzZXQgc2NoZWR1bGVkIGRhdGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgcGF0aCBjb250YWlucyBhIGRhdGUuLi5cblxuICAgICAgICAgICAgaWYgKHNjaGVkdWxlZERhdGVJc0luZmVycmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gLi4uYW5kIHdlIHVzZWQgdGhlIGZhbGxiYWNrIGRhdGUgZnJvbSB0aGUgcHJldmlvdXMgcGF0aCA6XG4gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBzY2hlZHVsZWQgZGF0ZSBmcm9tIHRoZSBuZXcgcGF0aFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGUgPSBmYWxsYmFja0RhdGU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2FuQXBwbHlGYWxsYmFjayh0YXNrKSkge1xuICAgICAgICAgICAgICAgIC8vIC4uLmFuZCB0aGUgdGFzayBpcyBjYW5kaWRhdGUgdG8gZGF0ZSBmYWxsYmFja1xuICAgICAgICAgICAgICAgIC8vIHNlc3QgdGhlIHNjaGVkdWxlZCBkYXRlIGZyb20gdGhlIG5ldyBwYXRoXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSA9IGZhbGxiYWNrRGF0ZTtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZWREYXRlSXNJbmZlcnJlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHByZXNlcnZlIGV4aXN0aW5nIGRhdGVzLCBpbmNsdWRpbmcgZXhwbGljaXQgc2NoZWR1bGVkRGF0ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBUYXNrKHtcbiAgICAgICAgICAgIC4uLnRhc2ssXG4gICAgICAgICAgICBwYXRoOiBuZXdQYXRoLFxuICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlZERhdGVJc0luZmVycmVkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gYXJyYXkgb2YgdXBkYXRlZCB0YXNrcyB0byByZW1vdmUgdGhlIGluZmVycmVkIHNjaGVkdWxlZCBkYXRlIHN0YXR1cyBpZiB0aGUgc2NoZWR1bGVkIGRhdGUgaGFzIGJlZW5cbiAgICAgKiBtb2RpZmllZCBhcyBjb21wYXJlZCB0byB0aGUgb3JpZ2luYWwgZGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlSW5mZXJyZWRTdGF0dXNJZk5lZWRlZChvcmlnaW5hbFRhc2s6IFRhc2ssIHVwZGF0ZWRUYXNrczogVGFza1tdKTogVGFza1tdIHtcbiAgICAgICAgY29uc3QgaW5mZXJyZWRTY2hlZHVsZWREYXRlID0gb3JpZ2luYWxUYXNrLnNjaGVkdWxlZERhdGVJc0luZmVycmVkID8gb3JpZ2luYWxUYXNrLnNjaGVkdWxlZERhdGUgOiBudWxsO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVkVGFza3MubWFwKCh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5mZXJyZWRTY2hlZHVsZWREYXRlICE9PSBudWxsICYmICFpbmZlcnJlZFNjaGVkdWxlZERhdGUuaXNTYW1lKHRhc2suc2NoZWR1bGVkRGF0ZSwgJ2RheScpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgYSBmYWxsYmFjayBkYXRlIHdhcyB1c2VkIGJlZm9yZSBtb2RpZmljYXRpb24sIGFuZCB0aGUgc2NoZWR1bGVkIGRhdGUgd2FzIG1vZGlmaWVkLCB3ZSBoYXZlIHRvIG1hcmtcbiAgICAgICAgICAgICAgICAvLyB0aGUgc2NoZWR1bGVkIGRhdGUgYXMgbm90IGluZmVycmVkIGFueW1vcmUuXG4gICAgICAgICAgICAgICAgdGFzayA9IG5ldyBUYXNrKHsgLi4udGFzaywgc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwgIi8qKlxuICogRXNjYXBlIGEgc3RyaW5nIHNvIGl0IGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgYSBSZWdFeHAgbGl0ZXJhbGx5LlxuICogVGFrZW4gZnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L0d1aWRlL1JlZ3VsYXJfRXhwcmVzc2lvbnMjZXNjYXBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzOiBzdHJpbmcpIHtcbiAgICAvLyBOT1RFOiA9IGlzIG5vdCBlc2NhcGVkLCBhcyBkb2luZyBzbyBnaXZlcyBlcnJvcjpcbiAgICAvLyAgICAgICAgIEludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAvKF58XFxzKWhlbGxvXFw9d29ybGQoJHxcXHMpLzogSW52YWxpZCBlc2NhcGVcbiAgICAvLyBOT1RFOiAhIGlzIG5vdCBlc2NhcGVkLCBhcyBkb2luZyBzbyBnaXZlcyBlcnJvcjpcbiAgICAvLyAgICAgICAgIEludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAvKF58XFxzKWhlbGxvXFwhd29ybGQoJHxcXHMpLzogSW52YWxpZCBlc2NhcGVcbiAgICAvLyBOT1RFOiA6IGlzIG5vdCBlc2NhcGVkLCBhcyBkb2luZyBzbyBnaXZlcyBlcnJvcjpcbiAgICAvLyAgICAgICAgIEludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAvKF58XFxzKWhlbGxvXFw6d29ybGQoJHxcXHMpLzogSW52YWxpZCBlc2NhcGVcbiAgICAvL1xuICAgIC8vIEV4cGxhbmF0aW9uIGZyb20gQEFubmFLb3JuZmVsZFNpbXBzb24gaW46XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbTcvb2JzaWRpYW4tdGFza3MvcHVsbC8xOCNpc3N1ZWNvbW1lbnQtMTE5NjExNTQwN1xuICAgIC8vIEZyb20gd2hhdCBJIGNhbiB0ZWxsLCB0aGUgdGhyZWUgbWlzc2luZyBjaGFyYWN0ZXJzIGZyb20gdGhlIG9yaWdpbmFsIHJlZ2V4IC0gOiAhID1cbiAgICAvLyBhcmUgYWxsIG9ubHkgY29uc2lkZXJlZCB0byBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgaWYgdGhleSBkaXJlY3RseSBmb2xsb3dcbiAgICAvLyBhID8gKGFsbCAzKSBvciBhID88ICghIGFuZCA9KS5cbiAgICAvLyBTbyB0aGVvcmV0aWNhbGx5IGlmIHRoZSA/IGFyZSBhbGwgZXNjYXBlZCwgdGhvc2UgdGhyZWUgY2hhcmFjdGVycyBkbyBub3QgaGF2ZSB0byBiZS5cbiAgICByZXR1cm4gcy5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xcXS9cXFxcXSkvZywgJ1xcXFwkMScpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IExheW91dE9wdGlvbnMsIFRhc2tMYXlvdXQgfSBmcm9tICcuL1Rhc2tMYXlvdXQnO1xuaW1wb3J0IHR5cGUgeyBUYXNrTGF5b3V0Q29tcG9uZW50IH0gZnJvbSAnLi9UYXNrTGF5b3V0JztcbmltcG9ydCB7IFJlY3VycmVuY2UgfSBmcm9tICcuL1JlY3VycmVuY2UnO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0NvbmZpZy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBTdGF0dXNSZWdpc3RyeSB9IGZyb20gJy4vU3RhdHVzUmVnaXN0cnknO1xuaW1wb3J0IHR5cGUgeyBTdGF0dXMgfSBmcm9tICcuL1N0YXR1cyc7XG5pbXBvcnQgeyBVcmdlbmN5IH0gZnJvbSAnLi9VcmdlbmN5JztcbmltcG9ydCB7IHJlbmRlclRhc2tMaW5lIH0gZnJvbSAnLi9UYXNrTGluZVJlbmRlcmVyJztcbmltcG9ydCB0eXBlIHsgVGFza0xpbmVSZW5kZXJEZXRhaWxzIH0gZnJvbSAnLi9UYXNrTGluZVJlbmRlcmVyJztcbmltcG9ydCB7IERhdGVGYWxsYmFjayB9IGZyb20gJy4vRGF0ZUZhbGxiYWNrJztcbmltcG9ydCAqIGFzIFJlZ0V4cFRvb2xzIGZyb20gJy4vbGliL1JlZ0V4cFRvb2xzJztcbmltcG9ydCB7IGNvbXBhcmVCeURhdGUgfSBmcm9tICcuL2xpYi9EYXRlVG9vbHMnO1xuXG4vKipcbiAqIFdoZW4gc29ydGluZywgbWFrZSBzdXJlIGxvdyBhbHdheXMgY29tZXMgYWZ0ZXIgbm9uZS4gVGhpcyB3YXkgYW55IHRhc2tzIHdpdGggbG93IHdpbGwgYmUgYmVsb3cgYW55IGV4aXRpbmdcbiAqIHRhc2tzIHRoYXQgaGF2ZSBubyBwcmlvcml0eSB3aGljaCB3b3VsZCBiZSB0aGUgZGVmYXVsdC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG5leHBvcnQgZW51bSBQcmlvcml0eSB7XG4gICAgSGlnaCA9ICcxJyxcbiAgICBNZWRpdW0gPSAnMicsXG4gICAgTm9uZSA9ICczJyxcbiAgICBMb3cgPSAnNCcsXG59XG5cbmV4cG9ydCBjb25zdCBwcmlvcml0eVN5bWJvbHMgPSB7XG4gICAgSGlnaDogJ1x1MjNFQicsXG4gICAgTWVkaXVtOiAnXHVEODNEXHVERDNDJyxcbiAgICBMb3c6ICdcdUQ4M0RcdUREM0QnLFxuICAgIE5vbmU6ICcnLFxufTtcblxuZXhwb3J0IGNvbnN0IHJlY3VycmVuY2VTeW1ib2wgPSAnXHVEODNEXHVERDAxJztcbmV4cG9ydCBjb25zdCBzdGFydERhdGVTeW1ib2wgPSAnXHVEODNEXHVERUVCJztcbmV4cG9ydCBjb25zdCBzY2hlZHVsZWREYXRlU3ltYm9sID0gJ1x1MjNGMyc7XG5leHBvcnQgY29uc3QgZHVlRGF0ZVN5bWJvbCA9ICdcdUQ4M0RcdURDQzUnO1xuZXhwb3J0IGNvbnN0IGRvbmVEYXRlU3ltYm9sID0gJ1x1MjcwNSc7XG5cbmV4cG9ydCBjbGFzcyBUYXNrUmVndWxhckV4cHJlc3Npb25zIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRhdGVGb3JtYXQgPSAnWVlZWS1NTS1ERCc7XG5cbiAgICAvLyBNYXRjaGVzIGluZGVudGF0aW9uIGJlZm9yZSBhIGxpc3QgbWFya2VyIChpbmNsdWRpbmcgPiBmb3IgcG90ZW50aWFsbHkgbmVzdGVkIGJsb2NrcXVvdGVzIG9yIE9ic2lkaWFuIGNhbGxvdXRzKVxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW5kZW50YXRpb25SZWdleCA9IC9eKFtcXHNcXHQ+XSopLztcblxuICAgIC8vIE1hdGNoZXMgLSBvciAqIGxpc3QgbWFya2Vycywgb3IgbnVtYmVyZWQgbGlzdCBtYXJrZXJzIChlZyAxLilcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGxpc3RNYXJrZXJSZWdleCA9IC8oWy0qXXxbMC05XStcXC4pLztcblxuICAgIC8vIE1hdGNoZXMgYSBjaGVja2JveCBhbmQgc2F2ZXMgdGhlIHN0YXR1cyBjaGFyYWN0ZXIgaW5zaWRlXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjaGVja2JveFJlZ2V4ID0gL1xcWyguKVxcXS91O1xuXG4gICAgLy8gTWF0Y2hlcyB0aGUgcmVzdCBvZiB0aGUgdGFzayBhZnRlciB0aGUgY2hlY2tib3guXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBhZnRlckNoZWNrYm94UmVnZXggPSAvICooLiopL3U7XG5cbiAgICAvLyBNYWluIHJlZ2V4IGZvciBwYXJzaW5nIGEgbGluZS4gSXQgbWF0Y2hlcyB0aGUgZm9sbG93aW5nOlxuICAgIC8vIC0gSW5kZW50YXRpb25cbiAgICAvLyAtIExpc3QgbWFya2VyXG4gICAgLy8gLSBTdGF0dXMgY2hhcmFjdGVyXG4gICAgLy8gLSBSZXN0IG9mIHRhc2sgYWZ0ZXIgY2hlY2tib3ggbWFya2Rvd25cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRhc2tSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuaW5kZW50YXRpb25SZWdleC5zb3VyY2UgK1xuICAgICAgICAgICAgVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5saXN0TWFya2VyUmVnZXguc291cmNlICtcbiAgICAgICAgICAgICcgKycgK1xuICAgICAgICAgICAgVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5jaGVja2JveFJlZ2V4LnNvdXJjZSArXG4gICAgICAgICAgICBUYXNrUmVndWxhckV4cHJlc3Npb25zLmFmdGVyQ2hlY2tib3hSZWdleC5zb3VyY2UsXG4gICAgICAgICd1JyxcbiAgICApO1xuXG4gICAgLy8gVXNlZCB3aXRoIHRoZSBcIkNyZWF0ZSBvciBFZGl0IFRhc2tcIiBjb21tYW5kIHRvIHBhcnNlIGluZGVudGF0aW9uIGFuZCBzdGF0dXMgaWYgcHJlc2VudFxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbm9uVGFza1JlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5pbmRlbnRhdGlvblJlZ2V4LnNvdXJjZSArXG4gICAgICAgICAgICBUYXNrUmVndWxhckV4cHJlc3Npb25zLmxpc3RNYXJrZXJSZWdleC5zb3VyY2UgK1xuICAgICAgICAgICAgJz8gKignICtcbiAgICAgICAgICAgIFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuY2hlY2tib3hSZWdleC5zb3VyY2UgK1xuICAgICAgICAgICAgJyk/JyArXG4gICAgICAgICAgICBUYXNrUmVndWxhckV4cHJlc3Npb25zLmFmdGVyQ2hlY2tib3hSZWdleC5zb3VyY2UsXG4gICAgICAgICd1JyxcbiAgICApO1xuXG4gICAgLy8gVXNlZCB3aXRoIFwiVG9nZ2xlIERvbmVcIiBjb21tYW5kIHRvIGRldGVjdCBhIGxpc3QgaXRlbSB0aGF0IGNhbiBnZXQgYSBjaGVja2JveCBhZGRlZCB0byBpdC5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGxpc3RJdGVtUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICBUYXNrUmVndWxhckV4cHJlc3Npb25zLmluZGVudGF0aW9uUmVnZXguc291cmNlICsgVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5saXN0TWFya2VyUmVnZXguc291cmNlLFxuICAgICk7XG5cbiAgICAvLyBNYXRjaCBvbiBibG9jayBsaW5rIGF0IGVuZC5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJsb2NrTGlua1JlZ2V4ID0gLyBcXF5bYS16QS1aMC05LV0rJC91O1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyByZWdleCdzIGVuZCB3aXRoIGAkYCBiZWNhdXNlIHRoZXkgd2lsbCBiZSBtYXRjaGVkIGFuZFxuICAgIC8vIHJlbW92ZWQgZnJvbSB0aGUgZW5kIHVudGlsIG5vbmUgYXJlIGxlZnQuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBwcmlvcml0eVJlZ2V4ID0gLyhbXHUyM0VCXHVEODNEXHVERDNDXHVEODNEXHVERDNEXSkkL3U7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzdGFydERhdGVSZWdleCA9IC9cdUQ4M0RcdURFRUIgKihcXGR7NH0tXFxkezJ9LVxcZHsyfSkkL3U7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzY2hlZHVsZWREYXRlUmVnZXggPSAvW1x1MjNGM1x1MjMxQl0gKihcXGR7NH0tXFxkezJ9LVxcZHsyfSkkL3U7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBkdWVEYXRlUmVnZXggPSAvW1x1RDgzRFx1RENDNVx1RDgzRFx1RENDNlx1RDgzRFx1REREM10gKihcXGR7NH0tXFxkezJ9LVxcZHsyfSkkL3U7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBkb25lRGF0ZVJlZ2V4ID0gL1x1MjcwNSAqKFxcZHs0fS1cXGR7Mn0tXFxkezJ9KSQvdTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHJlY3VycmVuY2VSZWdleCA9IC9cdUQ4M0RcdUREMDEgPyhbYS16QS1aMC05LCAhXSspJC9pdTtcblxuICAgIC8vIFJlZ2V4IHRvIG1hdGNoIGFsbCBoYXNoIHRhZ3MsIGJhc2ljYWxseSBoYXNoIGZvbGxvd2VkIGJ5IGFueXRoaW5nIGJ1dCB0aGUgY2hhcmFjdGVycyBpbiB0aGUgbmVnYXRpb24uXG4gICAgLy8gVG8gZW5zdXJlIFVSTHMgYXJlIG5vdCBjYXVnaHQgaXQgaXMgbG9va2luZyBvZiBiZWdpbm5pbmcgb2Ygc3RyaW5nIHRhZyBhbmQgYW55XG4gICAgLy8gdGFnIHRoYXQgaGFzIGEgc3BhY2UgaW4gZnJvbnQgb2YgaXQuIEFueSAjIHRoYXQgaGFzIGEgY2hhcmFjdGVyIGluIGZyb250XG4gICAgLy8gb2YgaXQgd2lsbCBiZSBpZ25vcmVkLlxuICAgIC8vIEVYQU1QTEU6XG4gICAgLy8gZGVzY3JpcHRpb246ICcjZG9nICNjYXIgaHR0cDovL3d3dy9kZGQjZXJlICNob3VzZSdcbiAgICAvLyBtYXRjaGVzOiAjZG9nLCAjY2FyLCAjaG91c2VcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGhhc2hUYWdzID0gLyhefFxccykjW14gIUAjJCVeJiooKSwuP1wiOnt9fDw+XSovZztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGhhc2hUYWdzRnJvbUVuZCA9IG5ldyBSZWdFeHAodGhpcy5oYXNoVGFncy5zb3VyY2UgKyAnJCcpO1xufVxuXG4vKipcbiAqIFRhc2sgZW5jYXBzdWxhdGVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBNYXJrRG93biB0YXNrIGFsb25nIHdpdGhcbiAqIHRoZSBleHRlbnNpb25zIHByb3ZpZGVkIGJ5IHRoaXMgcGx1Z2luLiBUaGlzIGlzIHVzZWQgdG8gcGFyc2UgYW5kXG4gKiBnZW5lcmF0ZSB0aGUgbWFya2Rvd24gdGFzayBmb3IgYWxsIHVwZGF0ZXMgYW5kIHJlcGxhY2VtZW50cy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVGFza1xuICovXG5leHBvcnQgY2xhc3MgVGFzayB7XG4gICAgcHVibGljIHJlYWRvbmx5IHN0YXR1czogU3RhdHVzO1xuICAgIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGluZGVudGF0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGxpc3RNYXJrZXI6IHN0cmluZztcbiAgICAvKiogTGluZSBudW1iZXIgd2hlcmUgdGhlIHNlY3Rpb24gc3RhcnRzIHRoYXQgY29udGFpbnMgdGhpcyB0YXNrLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzZWN0aW9uU3RhcnQ6IG51bWJlcjtcbiAgICAvKiogVGhlIGluZGV4IG9mIHRoZSBudGggdGFzayBpbiBpdHMgc2VjdGlvbi4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VjdGlvbkluZGV4OiBudW1iZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHByZWNlZGluZ0hlYWRlcjogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyByZWFkb25seSB0YWdzOiBzdHJpbmdbXTtcblxuICAgIHB1YmxpYyByZWFkb25seSBwcmlvcml0eTogUHJpb3JpdHk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhcnREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBzY2hlZHVsZWREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBkdWVEYXRlOiBNb21lbnQgfCBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBkb25lRGF0ZTogTW9tZW50IHwgbnVsbDtcblxuICAgIHB1YmxpYyByZWFkb25seSByZWN1cnJlbmNlOiBSZWN1cnJlbmNlIHwgbnVsbDtcbiAgICAvKiogVGhlIGJsb2NrTGluayBpcyBhIFwiXlwiIGFubm90YXRpb24gYWZ0ZXIgdGhlIGRhdGVzL3JlY3VycmVuY2UgcnVsZXMuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGJsb2NrTGluazogc3RyaW5nO1xuXG4gICAgLyoqIFRoZSBvcmlnaW5hbCBsaW5lIHJlYWQgZnJvbSBmaWxlLlxuICAgICAqXG4gICAgICogV2lsbCBiZSBlbXB0eSBpZiBUYXNrIHdhcyBjcmVhdGVkIHByb2dyYW1tYXRpY2FsbHlcbiAgICAgKiAoZm9yIGV4YW1wbGUsIGJ5IENyZWF0ZSBvciBFZGl0IFRhc2ssIG9yIGluIHRlc3RzLCBpbmNsdWRpbmcgdmlhIHtAbGluayBUYXNrQnVpbGRlcn0pLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBvcmlnaW5hbE1hcmtkb3duOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQ6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIF91cmdlbmN5OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgIGxpc3RNYXJrZXIsXG4gICAgICAgIHNlY3Rpb25TdGFydCxcbiAgICAgICAgc2VjdGlvbkluZGV4LFxuICAgICAgICBwcmVjZWRpbmdIZWFkZXIsXG4gICAgICAgIHByaW9yaXR5LFxuICAgICAgICBzdGFydERhdGUsXG4gICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgIGR1ZURhdGUsXG4gICAgICAgIGRvbmVEYXRlLFxuICAgICAgICByZWN1cnJlbmNlLFxuICAgICAgICBibG9ja0xpbmssXG4gICAgICAgIHRhZ3MsXG4gICAgICAgIG9yaWdpbmFsTWFya2Rvd24sXG4gICAgICAgIHNjaGVkdWxlZERhdGVJc0luZmVycmVkLFxuICAgIH06IHtcbiAgICAgICAgc3RhdHVzOiBTdGF0dXM7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgaW5kZW50YXRpb246IHN0cmluZztcbiAgICAgICAgbGlzdE1hcmtlcjogc3RyaW5nO1xuICAgICAgICBzZWN0aW9uU3RhcnQ6IG51bWJlcjtcbiAgICAgICAgc2VjdGlvbkluZGV4OiBudW1iZXI7XG4gICAgICAgIHByZWNlZGluZ0hlYWRlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgcHJpb3JpdHk6IFByaW9yaXR5O1xuICAgICAgICBzdGFydERhdGU6IG1vbWVudC5Nb21lbnQgfCBudWxsO1xuICAgICAgICBzY2hlZHVsZWREYXRlOiBtb21lbnQuTW9tZW50IHwgbnVsbDtcbiAgICAgICAgZHVlRGF0ZTogbW9tZW50Lk1vbWVudCB8IG51bGw7XG4gICAgICAgIGRvbmVEYXRlOiBtb21lbnQuTW9tZW50IHwgbnVsbDtcbiAgICAgICAgcmVjdXJyZW5jZTogUmVjdXJyZW5jZSB8IG51bGw7XG4gICAgICAgIGJsb2NrTGluazogc3RyaW5nO1xuICAgICAgICB0YWdzOiBzdHJpbmdbXSB8IFtdO1xuICAgICAgICBvcmlnaW5hbE1hcmtkb3duOiBzdHJpbmc7XG4gICAgICAgIHNjaGVkdWxlZERhdGVJc0luZmVycmVkOiBib29sZWFuO1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5pbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uO1xuICAgICAgICB0aGlzLmxpc3RNYXJrZXIgPSBsaXN0TWFya2VyO1xuICAgICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHNlY3Rpb25TdGFydDtcbiAgICAgICAgdGhpcy5zZWN0aW9uSW5kZXggPSBzZWN0aW9uSW5kZXg7XG4gICAgICAgIHRoaXMucHJlY2VkaW5nSGVhZGVyID0gcHJlY2VkaW5nSGVhZGVyO1xuXG4gICAgICAgIHRoaXMudGFncyA9IHRhZ3M7XG5cbiAgICAgICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5O1xuXG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gc3RhcnREYXRlO1xuICAgICAgICB0aGlzLnNjaGVkdWxlZERhdGUgPSBzY2hlZHVsZWREYXRlO1xuICAgICAgICB0aGlzLmR1ZURhdGUgPSBkdWVEYXRlO1xuICAgICAgICB0aGlzLmRvbmVEYXRlID0gZG9uZURhdGU7XG5cbiAgICAgICAgdGhpcy5yZWN1cnJlbmNlID0gcmVjdXJyZW5jZTtcbiAgICAgICAgdGhpcy5ibG9ja0xpbmsgPSBibG9ja0xpbms7XG4gICAgICAgIHRoaXMub3JpZ2luYWxNYXJrZG93biA9IG9yaWdpbmFsTWFya2Rvd247XG5cbiAgICAgICAgdGhpcy5zY2hlZHVsZWREYXRlSXNJbmZlcnJlZCA9IHNjaGVkdWxlZERhdGVJc0luZmVycmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRha2VzIHRoZSBnaXZlbiBsaW5lIGZyb20gYSBvYnNpZGlhbiBub3RlIGFuZCByZXR1cm5zIGEgVGFzayBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmUgLSBUaGUgZnVsbCBsaW5lIGluIHRoZSBub3RlIHRvIHBhcnNlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aCB0byB0aGUgbm90ZSBpbiBvYnNpZGlhbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2VjdGlvblN0YXJ0IC0gTGluZSBudW1iZXIgd2hlcmUgdGhlIHNlY3Rpb24gc3RhcnRzIHRoYXQgY29udGFpbnMgdGhpcyB0YXNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzZWN0aW9uSW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIG50aCB0YXNrIGluIGl0cyBzZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7KHN0cmluZyB8IG51bGwpfSBwcmVjZWRpbmdIZWFkZXIgLSBUaGUgaGVhZGVyIGJlZm9yZSB0aGlzIHRhc2suXG4gICAgICogQHBhcmFtIHsoTW9tZW50IHwgbnVsbCl9IGZhbGxiYWNrRGF0ZSAtIFRoZSBkYXRlIHRvIHVzZSBhcyB0aGUgc2NoZWR1bGVkIGRhdGUgaWYgbm8gb3RoZXIgZGF0ZSBpcyBzZXRcbiAgICAgKiBAcmV0dXJuIHsqfSAgeyhUYXNrIHwgbnVsbCl9XG4gICAgICogQG1lbWJlcm9mIFRhc2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21MaW5lKHtcbiAgICAgICAgbGluZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgc2VjdGlvblN0YXJ0LFxuICAgICAgICBzZWN0aW9uSW5kZXgsXG4gICAgICAgIHByZWNlZGluZ0hlYWRlcixcbiAgICAgICAgZmFsbGJhY2tEYXRlLFxuICAgIH06IHtcbiAgICAgICAgbGluZTogc3RyaW5nO1xuICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgIHNlY3Rpb25TdGFydDogbnVtYmVyO1xuICAgICAgICBzZWN0aW9uSW5kZXg6IG51bWJlcjtcbiAgICAgICAgcHJlY2VkaW5nSGVhZGVyOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBmYWxsYmFja0RhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgfSk6IFRhc2sgfCBudWxsIHtcbiAgICAgICAgLy8gQ2hlY2sgdGhlIGxpbmUgdG8gc2VlIGlmIGl0IGlzIGEgbWFya2Rvd24gdGFzay5cbiAgICAgICAgY29uc3QgcmVnZXhNYXRjaCA9IGxpbmUubWF0Y2goVGFza1JlZ3VsYXJFeHByZXNzaW9ucy50YXNrUmVnZXgpO1xuICAgICAgICBpZiAocmVnZXhNYXRjaCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXRjaFs0XSBpbmNsdWRlcyB0aGUgd2hvbGUgYm9keSBvZiB0aGUgdGFzayBhZnRlciB0aGUgYnJhY2tldHMuXG4gICAgICAgIGNvbnN0IGJvZHkgPSByZWdleE1hdGNoWzRdLnRyaW0oKTtcblxuICAgICAgICAvLyByZXR1cm4gaWYgdGFzayBkb2VzIG5vdCBoYXZlIHRoZSBnbG9iYWwgZmlsdGVyLiBEbyB0aGlzIGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgICAgIC8vIHJlc3Qgb2YgbWF0Y2ggdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAgICAgICAgY29uc3QgeyBnbG9iYWxGaWx0ZXIgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgIGlmICghYm9keS5pbmNsdWRlcyhnbG9iYWxGaWx0ZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZXNjcmlwdGlvbiA9IGJvZHk7XG4gICAgICAgIGNvbnN0IGluZGVudGF0aW9uID0gcmVnZXhNYXRjaFsxXTtcbiAgICAgICAgY29uc3QgbGlzdE1hcmtlciA9IHJlZ2V4TWF0Y2hbMl07XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzdGF0dXMgb2YgdGhlIHRhc2suXG4gICAgICAgIGNvbnN0IHN0YXR1c1N0cmluZyA9IHJlZ2V4TWF0Y2hbM107XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IFN0YXR1c1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuYnlTeW1ib2xPckNyZWF0ZShzdGF0dXNTdHJpbmcpO1xuXG4gICAgICAgIC8vIE1hdGNoIGZvciBibG9jayBsaW5rIGFuZCByZW1vdmUgaWYgZm91bmQuIEFsd2F5cyBleHBlY3RlZCB0byBiZVxuICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLlxuICAgICAgICBjb25zdCBibG9ja0xpbmtNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuYmxvY2tMaW5rUmVnZXgpO1xuICAgICAgICBjb25zdCBibG9ja0xpbmsgPSBibG9ja0xpbmtNYXRjaCAhPT0gbnVsbCA/IGJsb2NrTGlua01hdGNoWzBdIDogJyc7XG5cbiAgICAgICAgaWYgKGJsb2NrTGluayAhPT0gJycpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZShUYXNrUmVndWxhckV4cHJlc3Npb25zLmJsb2NrTGlua1JlZ2V4LCAnJykudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2VlcCBtYXRjaGluZyBhbmQgcmVtb3Zpbmcgc3BlY2lhbCBzdHJpbmdzIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAgICAgICAgLy8gZGVzY3JpcHRpb24gaW4gYW55IG9yZGVyLiBUaGUgbG9vcCBzaG91bGQgb25seSBydW4gb25jZSBpZiB0aGVcbiAgICAgICAgLy8gc3RyaW5ncyBhcmUgaW4gdGhlIGV4cGVjdGVkIG9yZGVyIGFmdGVyIHRoZSBkZXNjcmlwdGlvbi5cbiAgICAgICAgbGV0IG1hdGNoZWQ6IGJvb2xlYW47XG4gICAgICAgIGxldCBwcmlvcml0eTogUHJpb3JpdHkgPSBQcmlvcml0eS5Ob25lO1xuICAgICAgICBsZXQgc3RhcnREYXRlOiBNb21lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHNjaGVkdWxlZERhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGR1ZURhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgZG9uZURhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgcmVjdXJyZW5jZVJ1bGU6IHN0cmluZyA9ICcnO1xuICAgICAgICBsZXQgcmVjdXJyZW5jZTogUmVjdXJyZW5jZSB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgdGFnczogYW55ID0gW107XG4gICAgICAgIC8vIFRhZ3MgdGhhdCBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBlbmQgd2hpbGUgcGFyc2luZywgYnV0IHdlIHdhbnQgdG8gYWRkIHRoZW0gYmFjayBmb3IgYmVpbmcgcGFydCBvZiB0aGUgZGVzY3JpcHRpb24uXG4gICAgICAgIC8vIEluIHRoZSBvcmlnaW5hbCB0YXNrIGRlc2NyaXB0aW9uIHRoZXkgYXJlIHBvc3NpYmx5IG1peGVkIHdpdGggb3RoZXIgY29tcG9uZW50c1xuICAgICAgICAvLyAoZS5nLiAjdGFnMSA8ZHVlIGRhdGU+ICN0YWcyKSwgdGhleSBkbyBub3QgaGF2ZSB0byBhbGwgdHJhaWwgYWxsIHRhc2sgY29tcG9uZW50cyxcbiAgICAgICAgLy8gYnV0IGV2ZW50dWFsbHkgd2Ugd2FudCB0byBwYXN0ZSB0aGVtIGJhY2sgdG8gdGhlIHRhc2sgZGVzY3JpcHRpb24gYXQgdGhlIGVuZFxuICAgICAgICBsZXQgdHJhaWxpbmdUYWdzID0gJyc7XG4gICAgICAgIC8vIEFkZCBhIFwibWF4IHJ1bnNcIiBmYWlsc2FmZSB0byBuZXZlciBlbmQgaW4gYW4gZW5kbGVzcyBsb29wOlxuICAgICAgICBjb25zdCBtYXhSdW5zID0gMjA7XG4gICAgICAgIGxldCBydW5zID0gMDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgbWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcHJpb3JpdHlNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMucHJpb3JpdHlSZWdleCk7XG4gICAgICAgICAgICBpZiAocHJpb3JpdHlNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAocHJpb3JpdHlNYXRjaFsxXSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHByaW9yaXR5U3ltYm9scy5Mb3c6XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IFByaW9yaXR5LkxvdztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHByaW9yaXR5U3ltYm9scy5NZWRpdW06XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IFByaW9yaXR5Lk1lZGl1bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHByaW9yaXR5U3ltYm9scy5IaWdoOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBQcmlvcml0eS5IaWdoO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMucHJpb3JpdHlSZWdleCwgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZG9uZURhdGVNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuZG9uZURhdGVSZWdleCk7XG4gICAgICAgICAgICBpZiAoZG9uZURhdGVNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRvbmVEYXRlID0gd2luZG93Lm1vbWVudChkb25lRGF0ZU1hdGNoWzFdLCBUYXNrUmVndWxhckV4cHJlc3Npb25zLmRhdGVGb3JtYXQpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZShUYXNrUmVndWxhckV4cHJlc3Npb25zLmRvbmVEYXRlUmVnZXgsICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGR1ZURhdGVNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuZHVlRGF0ZVJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChkdWVEYXRlTWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkdWVEYXRlID0gd2luZG93Lm1vbWVudChkdWVEYXRlTWF0Y2hbMV0sIFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuZGF0ZUZvcm1hdCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuZHVlRGF0ZVJlZ2V4LCAnJykudHJpbSgpO1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzY2hlZHVsZWREYXRlTWF0Y2ggPSBkZXNjcmlwdGlvbi5tYXRjaChUYXNrUmVndWxhckV4cHJlc3Npb25zLnNjaGVkdWxlZERhdGVSZWdleCk7XG4gICAgICAgICAgICBpZiAoc2NoZWR1bGVkRGF0ZU1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSA9IHdpbmRvdy5tb21lbnQoc2NoZWR1bGVkRGF0ZU1hdGNoWzFdLCBUYXNrUmVndWxhckV4cHJlc3Npb25zLmRhdGVGb3JtYXQpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZShUYXNrUmVndWxhckV4cHJlc3Npb25zLnNjaGVkdWxlZERhdGVSZWdleCwgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlTWF0Y2ggPSBkZXNjcmlwdGlvbi5tYXRjaChUYXNrUmVndWxhckV4cHJlc3Npb25zLnN0YXJ0RGF0ZVJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChzdGFydERhdGVNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSA9IHdpbmRvdy5tb21lbnQoc3RhcnREYXRlTWF0Y2hbMV0sIFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuZGF0ZUZvcm1hdCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuc3RhcnREYXRlUmVnZXgsICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlY3VycmVuY2VNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMucmVjdXJyZW5jZVJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChyZWN1cnJlbmNlTWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSByZWN1cnJlbmNlIHJ1bGUsIGJ1dCAqZG8gbm90IHBhcnNlIGl0IHlldCouXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRpbmcgdGhlIFJlY3VycmVuY2Ugb2JqZWN0IHJlcXVpcmVzIGEgcmVmZXJlbmNlIGRhdGUgKGUuZy4gYSBkdWUgZGF0ZSksXG4gICAgICAgICAgICAgICAgLy8gYW5kIGl0IG1pZ2h0IGFwcGVhciBpbiB0aGUgbmV4dCAoZWFybGllciBpbiB0aGUgbGluZSkgdG9rZW5zIHRvIHBhcnNlXG4gICAgICAgICAgICAgICAgcmVjdXJyZW5jZVJ1bGUgPSByZWN1cnJlbmNlTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZShUYXNrUmVndWxhckV4cHJlc3Npb25zLnJlY3VycmVuY2VSZWdleCwgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTWF0Y2ggdGFncyBmcm9tIHRoZSBlbmQgdG8gYWxsb3cgdXNlcnMgdG8gbWl4IHRoZSB2YXJpb3VzIHRhc2sgY29tcG9uZW50cyB3aXRoXG4gICAgICAgICAgICAvLyB0YWdzLiBUaGVzZSB0YWdzIHdpbGwgYmUgYWRkZWQgYmFjayB0byB0aGUgZGVzY3JpcHRpb24gYmVsb3dcbiAgICAgICAgICAgIGNvbnN0IHRhZ3NNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuaGFzaFRhZ3NGcm9tRW5kKTtcbiAgICAgICAgICAgIGlmICh0YWdzTWF0Y2ggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZShUYXNrUmVndWxhckV4cHJlc3Npb25zLmhhc2hUYWdzRnJvbUVuZCwgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdOYW1lID0gdGFnc01hdGNoWzBdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAvLyBBZGRpbmcgdG8gdGhlIGxlZnQgYmVjYXVzZSB0aGUgbWF0Y2hpbmcgaXMgZG9uZSByaWdodC10by1sZWZ0XG4gICAgICAgICAgICAgICAgdHJhaWxpbmdUYWdzID0gdHJhaWxpbmdUYWdzLmxlbmd0aCA+IDAgPyBbdGFnTmFtZSwgdHJhaWxpbmdUYWdzXS5qb2luKCcgJykgOiB0YWdOYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydW5zKys7XG4gICAgICAgIH0gd2hpbGUgKG1hdGNoZWQgJiYgcnVucyA8PSBtYXhSdW5zKTtcblxuICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgdGFzayBkZXRhaWxzLCBwYXJzZSB0aGUgcmVjdXJyZW5jZSBydWxlIGlmIHdlIGZvdW5kIGFueVxuICAgICAgICBpZiAocmVjdXJyZW5jZVJ1bGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVjdXJyZW5jZSA9IFJlY3VycmVuY2UuZnJvbVRleHQoe1xuICAgICAgICAgICAgICAgIHJlY3VycmVuY2VSdWxlVGV4dDogcmVjdXJyZW5jZVJ1bGUsXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlLFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgICAgICAgICAgZHVlRGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5mZXIgdGhlIHNjaGVkdWxlZCBkYXRlIGZyb20gdGhlIGZpbGUgbmFtZSBpZiBub3Qgc2V0IGV4cGxpY2l0bHlcbiAgICAgICAgaWYgKERhdGVGYWxsYmFjay5jYW5BcHBseUZhbGxiYWNrKHsgc3RhcnREYXRlLCBzY2hlZHVsZWREYXRlLCBkdWVEYXRlIH0pICYmIGZhbGxiYWNrRGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSA9IGZhbGxiYWNrRGF0ZTtcbiAgICAgICAgICAgIHNjaGVkdWxlZERhdGVJc0luZmVycmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBiYWNrIGFueSB0cmFpbGluZyB0YWdzIHRvIHRoZSBkZXNjcmlwdGlvbi4gV2UgcmVtb3ZlZCB0aGVtIHNvIHdlIGNhbiBwYXJzZSB0aGUgcmVzdCBvZiB0aGVcbiAgICAgICAgLy8gY29tcG9uZW50cyBidXQgbm93IHdlIHdhbnQgdGhlbSBiYWNrLlxuICAgICAgICAvLyBUaGUgZ29hbCBpcyBmb3IgYSB0YXNrIG9mIHRoZW0gZm9ybSAnRG8gc29tZXRoaW5nICN0YWcxIChkdWUpIHRvbW9ycm93ICN0YWcyIChzdGFydCkgdG9kYXknXG4gICAgICAgIC8vIHRvIGFjdHVhbGx5IGhhdmUgdGhlIGRlc2NyaXB0aW9uICdEbyBzb21ldGhpbmcgI3RhZzEgI3RhZzInXG4gICAgICAgIGlmICh0cmFpbGluZ1RhZ3MubGVuZ3RoID4gMCkgZGVzY3JpcHRpb24gKz0gJyAnICsgdHJhaWxpbmdUYWdzO1xuXG4gICAgICAgIC8vIFRhZ3MgYXJlIGZvdW5kIGluIHRoZSBzdHJpbmcgYW5kIHB1bGxlZCBvdXQgYnV0IG5vdCByZW1vdmVkLFxuICAgICAgICAvLyBzbyB3aGVuIHJldHVybmluZyB0aGUgZW50aXJlIHRhc2sgaXQgd2lsbCBtYXRjaCB3aGF0IHRoZSB1c2VyXG4gICAgICAgIC8vIGVudGVyZWQuXG4gICAgICAgIC8vIFRoZSBnbG9iYWwgZmlsdGVyIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAgICBjb25zdCBoYXNoVGFnTWF0Y2ggPSBkZXNjcmlwdGlvbi5tYXRjaChUYXNrUmVndWxhckV4cHJlc3Npb25zLmhhc2hUYWdzKTtcbiAgICAgICAgaWYgKGhhc2hUYWdNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGFncyA9IGhhc2hUYWdNYXRjaC5maWx0ZXIoKHRhZykgPT4gdGFnICE9PSBnbG9iYWxGaWx0ZXIpLm1hcCgodGFnKSA9PiB0YWcudHJpbSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgVGFzayh7XG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGxpc3RNYXJrZXIsXG4gICAgICAgICAgICBzZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICBzZWN0aW9uSW5kZXgsXG4gICAgICAgICAgICBwcmVjZWRpbmdIZWFkZXIsXG4gICAgICAgICAgICBwcmlvcml0eSxcbiAgICAgICAgICAgIHN0YXJ0RGF0ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgICAgICBkdWVEYXRlLFxuICAgICAgICAgICAgZG9uZURhdGUsXG4gICAgICAgICAgICByZWN1cnJlbmNlLFxuICAgICAgICAgICAgYmxvY2tMaW5rLFxuICAgICAgICAgICAgdGFncyxcbiAgICAgICAgICAgIG9yaWdpbmFsTWFya2Rvd246IGxpbmUsXG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlSXNJbmZlcnJlZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIEhUTUwgcmVuZGVyZWQgTGlzdCBJdGVtIGVsZW1lbnQgKExJKSBmb3IgdGhlIGN1cnJlbnQgdGFzay5cbiAgICAgKiBAcGFyYW0ge3JlbmRlclRhaWxzfVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB0b0xpKHJlbmRlckRldGFpbHM6IFRhc2tMaW5lUmVuZGVyRGV0YWlscyk6IFByb21pc2U8SFRNTExJRWxlbWVudD4ge1xuICAgICAgICByZXR1cm4gcmVuZGVyVGFza0xpbmUodGhpcywgcmVuZGVyRGV0YWlscyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmxhdHRlbiB0aGUgdGFzayBhcyBhIHN0cmluZyB0aGF0IGluY2x1ZGVzIGFsbCBpdHMgY29tcG9uZW50cy5cbiAgICAgKiBAcGFyYW0ge0xheW91dE9wdGlvbnN9IFtsYXlvdXRPcHRpb25zXVxuICAgICAqIEByZXR1cm4geyp9ICB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXNrXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKGxheW91dE9wdGlvbnM/OiBMYXlvdXRPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdGFza0xheW91dCA9IG5ldyBUYXNrTGF5b3V0KGxheW91dE9wdGlvbnMpO1xuICAgICAgICBsZXQgdGFza1N0cmluZyA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0YXNrTGF5b3V0LmxheW91dENvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIHRhc2tTdHJpbmcgKz0gdGhpcy5jb21wb25lbnRUb1N0cmluZyh0YXNrTGF5b3V0LCBjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXNrU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBzcGVjaWZpYyBUYXNrTGF5b3V0Q29tcG9uZW50IG9mIHRoZSB0YXNrIChpdHMgZGVzY3JpcHRpb24sIHByaW9yaXR5LCBldGMpIGFzIGEgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb21wb25lbnRUb1N0cmluZyhsYXlvdXQ6IFRhc2tMYXlvdXQsIGNvbXBvbmVudDogVGFza0xheW91dENvbXBvbmVudCkge1xuICAgICAgICBzd2l0Y2ggKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgY2FzZSAnZGVzY3JpcHRpb24nOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgY2FzZSAncHJpb3JpdHknOiB7XG4gICAgICAgICAgICAgICAgbGV0IHByaW9yaXR5OiBzdHJpbmcgPSAnJztcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByaW9yaXR5ID09PSBQcmlvcml0eS5IaWdoKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gJyAnICsgcHJpb3JpdHlTeW1ib2xzLkhpZ2g7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByaW9yaXR5ID09PSBQcmlvcml0eS5NZWRpdW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSAnICcgKyBwcmlvcml0eVN5bWJvbHMuTWVkaXVtO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmlvcml0eSA9PT0gUHJpb3JpdHkuTG93KSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gJyAnICsgcHJpb3JpdHlTeW1ib2xzLkxvdztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByaW9yaXR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnc3RhcnREYXRlJzpcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3RhcnREYXRlKSByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxheW91dC5vcHRpb25zLnNob3J0TW9kZVxuICAgICAgICAgICAgICAgICAgICA/ICcgJyArIHN0YXJ0RGF0ZVN5bWJvbFxuICAgICAgICAgICAgICAgICAgICA6IGAgJHtzdGFydERhdGVTeW1ib2x9ICR7dGhpcy5zdGFydERhdGUuZm9ybWF0KFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuZGF0ZUZvcm1hdCl9YDtcbiAgICAgICAgICAgIGNhc2UgJ3NjaGVkdWxlZERhdGUnOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2hlZHVsZWREYXRlIHx8IHRoaXMuc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQpIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICByZXR1cm4gbGF5b3V0Lm9wdGlvbnMuc2hvcnRNb2RlXG4gICAgICAgICAgICAgICAgICAgID8gJyAnICsgc2NoZWR1bGVkRGF0ZVN5bWJvbFxuICAgICAgICAgICAgICAgICAgICA6IGAgJHtzY2hlZHVsZWREYXRlU3ltYm9sfSAke3RoaXMuc2NoZWR1bGVkRGF0ZS5mb3JtYXQoVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5kYXRlRm9ybWF0KX1gO1xuICAgICAgICAgICAgY2FzZSAnZG9uZURhdGUnOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb25lRGF0ZSkgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXlvdXQub3B0aW9ucy5zaG9ydE1vZGVcbiAgICAgICAgICAgICAgICAgICAgPyAnICcgKyBkb25lRGF0ZVN5bWJvbFxuICAgICAgICAgICAgICAgICAgICA6IGAgJHtkb25lRGF0ZVN5bWJvbH0gJHt0aGlzLmRvbmVEYXRlLmZvcm1hdChUYXNrUmVndWxhckV4cHJlc3Npb25zLmRhdGVGb3JtYXQpfWA7XG4gICAgICAgICAgICBjYXNlICdkdWVEYXRlJzpcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZHVlRGF0ZSkgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXlvdXQub3B0aW9ucy5zaG9ydE1vZGVcbiAgICAgICAgICAgICAgICAgICAgPyAnICcgKyBkdWVEYXRlU3ltYm9sXG4gICAgICAgICAgICAgICAgICAgIDogYCAke2R1ZURhdGVTeW1ib2x9ICR7dGhpcy5kdWVEYXRlLmZvcm1hdChUYXNrUmVndWxhckV4cHJlc3Npb25zLmRhdGVGb3JtYXQpfWA7XG4gICAgICAgICAgICBjYXNlICdyZWN1cnJlbmNlUnVsZSc6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlY3VycmVuY2UpIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICByZXR1cm4gbGF5b3V0Lm9wdGlvbnMuc2hvcnRNb2RlXG4gICAgICAgICAgICAgICAgICAgID8gJyAnICsgcmVjdXJyZW5jZVN5bWJvbFxuICAgICAgICAgICAgICAgICAgICA6IGAgJHtyZWN1cnJlbmNlU3ltYm9sfSAke3RoaXMucmVjdXJyZW5jZS50b1RleHQoKX1gO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2tMaW5rJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ibG9ja0xpbmsgPz8gJyc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gcmVuZGVyIHRhc2sgY29tcG9uZW50IG9mIHR5cGUgJyR7Y29tcG9uZW50fSdgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIFRhc2sgYXMgYSBsaXN0IGl0ZW0gd2l0aCBhIGNoZWNrYm94LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Kn0gIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRhc2tcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9GaWxlTGluZVN0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5pbmRlbnRhdGlvbn0ke3RoaXMubGlzdE1hcmtlcn0gWyR7dGhpcy5zdGF0dXMuc3ltYm9sfV0gJHt0aGlzLnRvU3RyaW5nKCl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoaXMgdGFzayBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIHRhc2tzLlxuICAgICAqXG4gICAgICogVG9nZ2xpbmcgY2FuIHJlc3VsdCBpbiBtb3JlIHRoYW4gb25lIHJldHVybmVkIHRhc2sgaW4gdGhlIGNhc2Ugb2ZcbiAgICAgKiByZWN1cnJlbmNlLiBJZiBpdCBpcyBhIHJlY3VycmluZyB0YXNrLCB0aGUgdG9nZ2xlZCB0YXNrIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAgKiB0b2dldGhlciB3aXRoIHRoZSBuZXh0IG9jY3VycmVuY2UgaW4gdGhlIG9yZGVyIGBbbmV4dCwgdG9nZ2xlZF1gLiBJZiB0aGVcbiAgICAgKiB0YXNrIGlzIG5vdCByZWN1cnJpbmcsIGl0IHdpbGwgcmV0dXJuIGBbdG9nZ2xlZF1gLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUoKTogVGFza1tdIHtcbiAgICAgICAgY29uc3QgbmV3U3RhdHVzID0gU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXROZXh0U3RhdHVzT3JDcmVhdGUodGhpcy5zdGF0dXMpO1xuXG4gICAgICAgIGxldCBuZXdEb25lRGF0ZSA9IG51bGw7XG5cbiAgICAgICAgbGV0IG5leHRPY2N1cnJlbmNlOiB7XG4gICAgICAgICAgICBzdGFydERhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgICAgICAgICAgZHVlRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChuZXdTdGF0dXMuaXNDb21wbGV0ZWQoKSkge1xuICAgICAgICAgICAgLy8gU2V0IGRvbmUgZGF0ZSBvbmx5IGlmIHNldHRpbmcgdmFsdWUgaXMgdHJ1ZVxuICAgICAgICAgICAgY29uc3QgeyBzZXREb25lRGF0ZSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgICAgIGlmIChzZXREb25lRGF0ZSkge1xuICAgICAgICAgICAgICAgIG5ld0RvbmVEYXRlID0gd2luZG93Lm1vbWVudCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIHRhc2sgaXMgbm8gbG9uZ2VyIHRvZG8sIHdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgcmVjdXJyaW5nOlxuICAgICAgICAgICAgaWYgKHRoaXMucmVjdXJyZW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5leHRPY2N1cnJlbmNlID0gdGhpcy5yZWN1cnJlbmNlLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvZ2dsZWRUYXNrID0gbmV3IFRhc2soe1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIHN0YXR1czogbmV3U3RhdHVzLFxuICAgICAgICAgICAgZG9uZURhdGU6IG5ld0RvbmVEYXRlLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBuZXdUYXNrczogVGFza1tdID0gW107XG5cbiAgICAgICAgaWYgKG5leHRPY2N1cnJlbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U3RhdHVzID0gU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXROZXh0U3RhdHVzT3JDcmVhdGUobmV3U3RhdHVzKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRUYXNrID0gbmV3IFRhc2soe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICAgICAgLi4ubmV4dE9jY3VycmVuY2UsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBuZXh0U3RhdHVzLFxuICAgICAgICAgICAgICAgIC8vIE5ldyBvY2N1cnJlbmNlcyBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBibG9jayBsaW5rLlxuICAgICAgICAgICAgICAgIC8vIEFuZCByYW5kb20gYmxvY2sgbGlua3MgZG9uJ3QgaGVscC5cbiAgICAgICAgICAgICAgICBibG9ja0xpbms6ICcnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXdUYXNrcy5wdXNoKG5leHRUYXNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIG5leHQgb2NjdXJyZW5jZSBiZWZvcmUgcHJldmlvdXMgb2NjdXJyZW5jZS5cbiAgICAgICAgbmV3VGFza3MucHVzaCh0b2dnbGVkVGFzayk7XG5cbiAgICAgICAgcmV0dXJuIG5ld1Rhc2tzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXJnZW5jeSgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5fdXJnZW5jeSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fdXJnZW5jeSA9IFVyZ2VuY3kuY2FsY3VsYXRlKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3VyZ2VuY3k7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHRhc2ssIHdpdGggdGhlIC5tZCBleHRlbnNpb24gcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbGVuYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gdGhpcy5wYXRoLm1hdGNoKC8oW14vXSspXFwubWQkLyk7XG4gICAgICAgIGlmIChmaWxlTmFtZU1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsZU5hbWVNYXRjaFsxXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgd2hlbiBsaW5raW5nIHRvIHRoZSBvcmlnaW4gb2YgdGhlIHRhc2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpc0ZpbGVuYW1lVW5pcXVlIHtib29sZWFufG51bGx9IFdoZXRoZXIgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgdGFzayBpcyB1bmlxdWUgaW4gdGhlIHZhdWx0LlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGl0IGlzIHVuZGVmaW5lZCwgdGhlIG91dGNvbWUgd2lsbCBiZSB0aGUgc2FtZSBhcyB3aXRoIGEgdW5pcXVlIGZpbGUgbmFtZTogdGhlIGZpbGUgbmFtZSBvbmx5LlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBmdWxsIHBhdGggd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TGlua1RleHQoeyBpc0ZpbGVuYW1lVW5pcXVlIH06IHsgaXNGaWxlbmFtZVVuaXF1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCB9KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGxldCBsaW5rVGV4dDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgaWYgKGlzRmlsZW5hbWVVbmlxdWUpIHtcbiAgICAgICAgICAgIGxpbmtUZXh0ID0gdGhpcy5maWxlbmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEEgc2xhc2ggYXQgdGhlIGJlZ2lubmluZyBpbmRpY2F0ZXMgdGhpcyBpcyBhIHBhdGgsIG5vdCBhIGZpbGVuYW1lLlxuICAgICAgICAgICAgbGlua1RleHQgPSAnLycgKyB0aGlzLnBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1RleHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIHdvdWxkbid0IHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhbmQgb25seSB0YWtlIHVwIHNwYWNlLlxuICAgICAgICBpZiAodGhpcy5wcmVjZWRpbmdIZWFkZXIgIT09IG51bGwgJiYgdGhpcy5wcmVjZWRpbmdIZWFkZXIgIT09IGxpbmtUZXh0KSB7XG4gICAgICAgICAgICBsaW5rVGV4dCA9IGxpbmtUZXh0ICsgJyA+ICcgKyB0aGlzLnByZWNlZGluZ0hlYWRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaW5rVGV4dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlIHR3byBsaXN0cyBvZiBUYXNrIG9iamVjdHMsIGFuZCByZXBvcnQgd2hldGhlciB0aGVpclxuICAgICAqIHRhc2tzIGFyZSBpZGVudGljYWwgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIG9wdGltaXNpbmcgY29kZSBpZiBpdCBpcyBndWFyYW50ZWVkIHRoYXRcbiAgICAgKiB0aGVyZSBhcmUgbm8gcG9zc2libGUgZGlmZmVyZW5jZXMgaW4gdGhlIHRhc2tzIGluIGEgZmlsZVxuICAgICAqIGFmdGVyIGFuIGVkaXQsIGZvciBleGFtcGxlLlxuICAgICAqXG4gICAgICogSWYgYW55IGZpZWxkIGlzIGRpZmZlcmVudCBpbiBhbnkgdGFzaywgaXQgd2lsbCByZXR1cm4gZmFsc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2xkVGFza3NcbiAgICAgKiBAcGFyYW0gbmV3VGFza3NcbiAgICAgKi9cbiAgICBzdGF0aWMgdGFza3NMaXN0c0lkZW50aWNhbChvbGRUYXNrczogVGFza1tdLCBuZXdUYXNrczogVGFza1tdKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChvbGRUYXNrcy5sZW5ndGggIT09IG5ld1Rhc2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvbGRUYXNrcy5ldmVyeSgob2xkVGFzaywgaW5kZXgpID0+IG9sZFRhc2suaWRlbnRpY2FsVG8obmV3VGFza3NbaW5kZXhdKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZSBhbGwgdGhlIGZpZWxkcyBpbiBhbm90aGVyIFRhc2ssIHRvIGRldGVjdCBhbnkgZGlmZmVyZW5jZXMgZnJvbSB0aGlzIG9uZS5cbiAgICAgKlxuICAgICAqIElmIGFueSBmaWVsZCBpcyBkaWZmZXJlbnQgaW4gYW55IHdheSwgaXQgd2lsbCByZXR1cm4gZmFsc2UuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHVzZWQgaW4gc29tZSBvcHRpbWlzYXRpb25zLCB0byBhdm9pZCB3b3JrIGlmIGFuIGVkaXQgdG8gZmlsZVxuICAgICAqIGRvZXMgbm90IGNoYW5nZSBhbnkgdGFza3MsIHNvIGl0IGlzIHZpdGFsIHRoYXQgaXRzIGRlZmluaXRpb25cbiAgICAgKiBvZiBpZGVudGljYWwgaXMgdmVyeSBzdHJpY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3RoZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpY2FsVG8ob3RoZXI6IFRhc2spIHtcbiAgICAgICAgLy8gQmFzZWQgb24gaWRlYXMgZnJvbSBrb2FsYS4gQXF1YUNhdCBhbmQgamF2YWxlbnQgaW4gRGlzY29yZDpcbiAgICAgICAgLy8gaHR0cHM6Ly9kaXNjb3JkLmNvbS9jaGFubmVscy82ODYwNTM3MDgyNjEyMjg1NzcvODQwMjg2MjY0OTY0MDIyMzAyLzk5NjczNTIwMDM4ODE4NjE4MlxuICAgICAgICAvLyBhbmQgbGF0ZXIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vdGU6IHNlY3Rpb25TdGFydCBjaGFuZ2VzIGV2ZXJ5IHRpbWUgYSBsaW5lIGlzIGFkZGVkIG9yIGRlbGV0ZWQgYmVmb3JlXG4gICAgICAgIC8vICAgICAgIGFueSBvZiB0aGUgdGFza3MgaW4gYSBmaWxlLiBUaGlzIGRvZXMgbWVhbiB0aGF0IHJlZHJhd2luZyBvZiB0YXNrcyBibG9ja3NcbiAgICAgICAgLy8gICAgICAgaGFwcGVucyBtb3JlIG9mdGVuIHRoYW4gaXMgaWRlYWwuXG4gICAgICAgIGxldCBhcmdzOiBBcnJheTxrZXlvZiBUYXNrPiA9IFtcbiAgICAgICAgICAgICdzdGF0dXMnLFxuICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICdwYXRoJyxcbiAgICAgICAgICAgICdpbmRlbnRhdGlvbicsXG4gICAgICAgICAgICAnbGlzdE1hcmtlcicsXG4gICAgICAgICAgICAnc2VjdGlvblN0YXJ0JyxcbiAgICAgICAgICAgICdzZWN0aW9uSW5kZXgnLFxuICAgICAgICAgICAgJ3ByZWNlZGluZ0hlYWRlcicsXG4gICAgICAgICAgICAncHJpb3JpdHknLFxuICAgICAgICAgICAgJ2Jsb2NrTGluaycsXG4gICAgICAgICAgICAnc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQnLFxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW2VsXSAhPT0gb3RoZXJbZWxdKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wYXJlIHRhZ3NcbiAgICAgICAgaWYgKHRoaXMudGFncy5sZW5ndGggIT09IG90aGVyLnRhZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGFncyBhcmUgdGhlIHNhbWUgb25seSBpZiB0aGUgdmFsdWVzIGFyZSBpbiB0aGUgc2FtZSBvcmRlclxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy50YWdzLmV2ZXJ5KGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50ID09PSBvdGhlci50YWdzW2luZGV4XTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcGFyZSBEYXRlIGZpZWxkc1xuICAgICAgICBhcmdzID0gWydzdGFydERhdGUnLCAnc2NoZWR1bGVkRGF0ZScsICdkdWVEYXRlJywgJ2RvbmVEYXRlJ107XG4gICAgICAgIGZvciAoY29uc3QgZWwgb2YgYXJncykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZTEgPSB0aGlzW2VsXSBhcyBNb21lbnQgfCBudWxsO1xuICAgICAgICAgICAgY29uc3QgZGF0ZTIgPSBvdGhlcltlbF0gYXMgTW9tZW50IHwgbnVsbDtcbiAgICAgICAgICAgIGlmIChjb21wYXJlQnlEYXRlKGRhdGUxLCBkYXRlMikgIT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWN1cnJlbmNlMSA9IHRoaXMucmVjdXJyZW5jZTtcbiAgICAgICAgY29uc3QgcmVjdXJyZW5jZTIgPSBvdGhlci5yZWN1cnJlbmNlO1xuICAgICAgICBpZiAocmVjdXJyZW5jZTEgPT09IG51bGwgJiYgcmVjdXJyZW5jZTIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChyZWN1cnJlbmNlMSAhPT0gbnVsbCAmJiByZWN1cnJlbmNlMiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHJlY3VycmVuY2UxICYmIHJlY3VycmVuY2UyICYmICFyZWN1cnJlbmNlMS5pZGVudGljYWxUbyhyZWN1cnJlbmNlMikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCBmb3IgdGhlIGdsb2JhbCBmaWx0ZXIgZm9yIHRoZSBwdXJwb3NlIG9mIHJlbW92aW5nIGl0IGZyb20gdGhlIGRlc2NyaXB0aW9uLCBidXQgZG8gc28gb25seVxuICAgICAqIGlmIGl0IGlzIGEgc2VwYXJhdGUgd29yZCAocHJlY2VkaW5nIHRoZSBiZWdpbm5pbmcgb2YgbGluZSBvciBhIHNwYWNlIGFuZCBmb2xsb3dlZCBieSB0aGUgZW5kIG9mIGxpbmVcbiAgICAgKiBvciBhIHNwYWNlKSwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGN1dC1vZmYgbmVzdGVkIHRhZ3MgbGlrZSAjdGFzay9zdWJ0YWcuXG4gICAgICogSWYgdGhlIGdsb2JhbCBmaWx0ZXIgZXhpc3RzIGFzIHBhcnQgb2YgYSBuZXN0ZWQgdGFnLCB3ZSBrZWVwIGl0IHVudG91Y2hlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGVzY3JpcHRpb25XaXRob3V0R2xvYmFsRmlsdGVyKCkge1xuICAgICAgICBjb25zdCB7IGdsb2JhbEZpbHRlciB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgbGV0IGRlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjtcbiAgICAgICAgaWYgKGdsb2JhbEZpbHRlci5sZW5ndGggPT09IDApIHJldHVybiBkZXNjcmlwdGlvbjtcbiAgICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBnbG9iYWwgZmlsdGVyIChhZnRlciBlc2NhcGluZyBpdCkgb25seSB3aGVuIGl0J3MgYSBjb21wbGV0ZSB3b3JkXG4gICAgICAgIGNvbnN0IGdsb2JhbEZpbHRlclJlZ2V4ID0gUmVnRXhwKCcoXnxcXFxccyknICsgUmVnRXhwVG9vbHMuZXNjYXBlUmVnRXhwKGdsb2JhbEZpbHRlcikgKyAnKCR8XFxcXHMpJywgJ3VnJyk7XG4gICAgICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uLnNlYXJjaChnbG9iYWxGaWx0ZXJSZWdleCkgPiAtMSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKGdsb2JhbEZpbHRlclJlZ2V4LCAnJDEkMicpLnJlcGxhY2UoJyAgJywgJyAnKS50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cbn1cbiIsICIvKipcbiAqIExhenkgbG9hZGVkIHZhcmlhYmxlIDogZmV0Y2hpbmcgdGhlIHZhbHVlIGlzIHBvc3Rwb25lZCB1bnRpbCB0aGUgZmlyc3QgZ2V0KClcbiAqL1xuZXhwb3J0IGNsYXNzIExhenk8VD4ge1xuICAgIHByaXZhdGUgX3ZhbHVlOiBUIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgbGF6eSBvYmplY3RcbiAgICAgKiBAcGFyYW0gZmV0Y2ggYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGEgdmFsdWVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZldGNoOiAoKSA9PiBUKSB7fVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgdGhlIGxhenkgdmFsdWUsIGNhbGxpbmcgdGhlIGZldGNoIGZ1bmN0aW9uIHRoZSBmaXJzdCB0aW1lLlxuICAgICAqL1xuICAgIGdldCB2YWx1ZSgpOiBUIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5mZXRjaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBcHAsIEVkaXRvciwgTWFya2Rvd25WaWV3LCBWaWV3IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgVGFza01vZGFsIH0gZnJvbSAnLi4vVGFza01vZGFsJztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uL1Rhc2snO1xuaW1wb3J0IHsgRGF0ZUZhbGxiYWNrIH0gZnJvbSAnLi4vRGF0ZUZhbGxiYWNrJztcbmltcG9ydCB7IHRhc2tGcm9tTGluZSB9IGZyb20gJy4vQ3JlYXRlT3JFZGl0VGFza1BhcnNlcic7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVPckVkaXQgPSAoY2hlY2tpbmc6IGJvb2xlYW4sIGVkaXRvcjogRWRpdG9yLCB2aWV3OiBWaWV3LCBhcHA6IEFwcCkgPT4ge1xuICAgIGlmIChjaGVja2luZykge1xuICAgICAgICByZXR1cm4gdmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldztcbiAgICB9XG5cbiAgICBpZiAoISh2aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3KSkge1xuICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIGR1ZSB0byBjaGVjayBhYm92ZS5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XG4gICAgY29uc3QgbGluZU51bWJlciA9IGN1cnNvclBvc2l0aW9uLmxpbmU7XG4gICAgY29uc3QgbGluZSA9IGVkaXRvci5nZXRMaW5lKGxpbmVOdW1iZXIpO1xuICAgIGNvbnN0IHRhc2sgPSB0YXNrRnJvbUxpbmUoeyBsaW5lLCBwYXRoIH0pO1xuXG4gICAgY29uc3Qgb25TdWJtaXQgPSAodXBkYXRlZFRhc2tzOiBUYXNrW10pOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IERhdGVGYWxsYmFjay5yZW1vdmVJbmZlcnJlZFN0YXR1c0lmTmVlZGVkKHRhc2ssIHVwZGF0ZWRUYXNrcylcbiAgICAgICAgICAgIC5tYXAoKHRhc2s6IFRhc2spID0+IHRhc2sudG9GaWxlTGluZVN0cmluZygpKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICBlZGl0b3Iuc2V0TGluZShsaW5lTnVtYmVyLCBzZXJpYWxpemVkKTtcbiAgICB9O1xuXG4gICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgZXZlcnkgdGltZSwgYXMgY3Vyc29yL3Rhc2sgY2FuIGNoYW5nZS5cbiAgICBjb25zdCB0YXNrTW9kYWwgPSBuZXcgVGFza01vZGFsKHtcbiAgICAgICAgYXBwLFxuICAgICAgICB0YXNrLFxuICAgICAgICBvblN1Ym1pdCxcbiAgICB9KTtcbiAgICB0YXNrTW9kYWwub3BlbigpO1xufTtcbiIsICJpbXBvcnQgeyBBcHAsIE1vZGFsIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IEVkaXRUYXNrIGZyb20gJy4vdWkvRWRpdFRhc2suc3ZlbHRlJztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQgeyBTdGF0dXNSZWdpc3RyeSB9IGZyb20gJy4vU3RhdHVzUmVnaXN0cnknO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi9TdGF0dXMnO1xuXG5leHBvcnQgY2xhc3MgVGFza01vZGFsIGV4dGVuZHMgTW9kYWwge1xuICAgIHB1YmxpYyByZWFkb25seSB0YXNrOiBUYXNrO1xuICAgIHB1YmxpYyByZWFkb25seSBvblN1Ym1pdDogKHVwZGF0ZWRUYXNrczogVGFza1tdKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IoeyBhcHAsIHRhc2ssIG9uU3VibWl0IH06IHsgYXBwOiBBcHA7IHRhc2s6IFRhc2s7IG9uU3VibWl0OiAodXBkYXRlZFRhc2tzOiBUYXNrW10pID0+IHZvaWQgfSkge1xuICAgICAgICBzdXBlcihhcHApO1xuXG4gICAgICAgIHRoaXMudGFzayA9IHRhc2s7XG4gICAgICAgIHRoaXMub25TdWJtaXQgPSAodXBkYXRlZFRhc2tzOiBUYXNrW10pID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZWRUYXNrcy5sZW5ndGggJiYgb25TdWJtaXQodXBkYXRlZFRhc2tzKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25PcGVuKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRpdGxlRWwuc2V0VGV4dCgnQ3JlYXRlIG9yIGVkaXQgVGFzaycpO1xuICAgICAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblxuICAgICAgICBjb25zdCBzdGF0dXNPcHRpb25zID0gdGhpcy5nZXRLbm93blN0YXR1c2VzQW5kQ3VycmVudFRhc2tTdGF0dXNJZk5vdEtub3duKCk7XG5cbiAgICAgICAgbmV3IEVkaXRUYXNrKHtcbiAgICAgICAgICAgIHRhcmdldDogY29udGVudEVsLFxuICAgICAgICAgICAgcHJvcHM6IHsgdGFzazogdGhpcy50YXNrLCBzdGF0dXNPcHRpb25zOiBzdGF0dXNPcHRpb25zLCBvblN1Ym1pdDogdGhpcy5vblN1Ym1pdCB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgdGFzayBiZWluZyBlZGl0ZWQgaGFzIGFuIHVua25vd24gc3RhdHVzLCBtYWtlIHN1cmUgaXQgaXMgYWRkZWRcbiAgICAgKiB0byB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICAgKiBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgc3RhdHVzIGFuZCB0aGVuIGNoYW5nZSB0aGVpclxuICAgICAqIG1pbmQgYW5kIHJldHVybiB0byB0aGUgaW5pdGlhbCBzdGF0dXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRLbm93blN0YXR1c2VzQW5kQ3VycmVudFRhc2tTdGF0dXNJZk5vdEtub3duKCkge1xuICAgICAgICBjb25zdCBzdGF0dXNPcHRpb25zOiBTdGF0dXNbXSA9IFN0YXR1c1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVnaXN0ZXJlZFN0YXR1c2VzO1xuICAgICAgICBpZiAoU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5ieVN5bWJvbCh0aGlzLnRhc2suc3RhdHVzLnN5bWJvbCkgPT09IFN0YXR1cy5FTVBUWSkge1xuICAgICAgICAgICAgc3RhdHVzT3B0aW9ucy5wdXNoKHRoaXMudGFzay5zdGF0dXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0dXNPcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICAgICAgY29udGVudEVsLmVtcHR5KCk7XG4gICAgfVxufVxuIiwgImZ1bmN0aW9uIG5vb3AoKSB7IH1cbmNvbnN0IGlkZW50aXR5ID0geCA9PiB4O1xuZnVuY3Rpb24gYXNzaWduKHRhciwgc3JjKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGZvciAoY29uc3QgayBpbiBzcmMpXG4gICAgICAgIHRhcltrXSA9IHNyY1trXTtcbiAgICByZXR1cm4gdGFyO1xufVxuZnVuY3Rpb24gaXNfcHJvbWlzZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gYWRkX2xvY2F0aW9uKGVsZW1lbnQsIGZpbGUsIGxpbmUsIGNvbHVtbiwgY2hhcikge1xuICAgIGVsZW1lbnQuX19zdmVsdGVfbWV0YSA9IHtcbiAgICAgICAgbG9jOiB7IGZpbGUsIGxpbmUsIGNvbHVtbiwgY2hhciB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJ1bihmbikge1xuICAgIHJldHVybiBmbigpO1xufVxuZnVuY3Rpb24gYmxhbmtfb2JqZWN0KCkge1xuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuZnVuY3Rpb24gcnVuX2FsbChmbnMpIHtcbiAgICBmbnMuZm9yRWFjaChydW4pO1xufVxuZnVuY3Rpb24gaXNfZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gc2FmZV9ub3RfZXF1YWwoYSwgYikge1xuICAgIHJldHVybiBhICE9IGEgPyBiID09IGIgOiBhICE9PSBiIHx8ICgoYSAmJiB0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHx8IHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKTtcbn1cbmxldCBzcmNfdXJsX2VxdWFsX2FuY2hvcjtcbmZ1bmN0aW9uIHNyY191cmxfZXF1YWwoZWxlbWVudF9zcmMsIHVybCkge1xuICAgIGlmICghc3JjX3VybF9lcXVhbF9hbmNob3IpIHtcbiAgICAgICAgc3JjX3VybF9lcXVhbF9hbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgfVxuICAgIHNyY191cmxfZXF1YWxfYW5jaG9yLmhyZWYgPSB1cmw7XG4gICAgcmV0dXJuIGVsZW1lbnRfc3JjID09PSBzcmNfdXJsX2VxdWFsX2FuY2hvci5ocmVmO1xufVxuZnVuY3Rpb24gbm90X2VxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYjtcbn1cbmZ1bmN0aW9uIGlzX2VtcHR5KG9iaikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX3N0b3JlKHN0b3JlLCBuYW1lKSB7XG4gICAgaWYgKHN0b3JlICE9IG51bGwgJiYgdHlwZW9mIHN0b3JlLnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke25hbWV9JyBpcyBub3QgYSBzdG9yZSB3aXRoIGEgJ3N1YnNjcmliZScgbWV0aG9kYCk7XG4gICAgfVxufVxuZnVuY3Rpb24gc3Vic2NyaWJlKHN0b3JlLCAuLi5jYWxsYmFja3MpIHtcbiAgICBpZiAoc3RvcmUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICB9XG4gICAgY29uc3QgdW5zdWIgPSBzdG9yZS5zdWJzY3JpYmUoLi4uY2FsbGJhY2tzKTtcbiAgICByZXR1cm4gdW5zdWIudW5zdWJzY3JpYmUgPyAoKSA9PiB1bnN1Yi51bnN1YnNjcmliZSgpIDogdW5zdWI7XG59XG5mdW5jdGlvbiBnZXRfc3RvcmVfdmFsdWUoc3RvcmUpIHtcbiAgICBsZXQgdmFsdWU7XG4gICAgc3Vic2NyaWJlKHN0b3JlLCBfID0+IHZhbHVlID0gXykoKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBjb21wb25lbnRfc3Vic2NyaWJlKGNvbXBvbmVudCwgc3RvcmUsIGNhbGxiYWNrKSB7XG4gICAgY29tcG9uZW50LiQkLm9uX2Rlc3Ryb3kucHVzaChzdWJzY3JpYmUoc3RvcmUsIGNhbGxiYWNrKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVfc2xvdChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKSB7XG4gICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jdHggPSBnZXRfc2xvdF9jb250ZXh0KGRlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZm4pO1xuICAgICAgICByZXR1cm4gZGVmaW5pdGlvblswXShzbG90X2N0eCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKSB7XG4gICAgcmV0dXJuIGRlZmluaXRpb25bMV0gJiYgZm5cbiAgICAgICAgPyBhc3NpZ24oJCRzY29wZS5jdHguc2xpY2UoKSwgZGVmaW5pdGlvblsxXShmbihjdHgpKSlcbiAgICAgICAgOiAkJHNjb3BlLmN0eDtcbn1cbmZ1bmN0aW9uIGdldF9zbG90X2NoYW5nZXMoZGVmaW5pdGlvbiwgJCRzY29wZSwgZGlydHksIGZuKSB7XG4gICAgaWYgKGRlZmluaXRpb25bMl0gJiYgZm4pIHtcbiAgICAgICAgY29uc3QgbGV0cyA9IGRlZmluaXRpb25bMl0oZm4oZGlydHkpKTtcbiAgICAgICAgaWYgKCQkc2NvcGUuZGlydHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGxldHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsZXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gW107XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1heCgkJHNjb3BlLmRpcnR5Lmxlbmd0aCwgbGV0cy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIG1lcmdlZFtpXSA9ICQkc2NvcGUuZGlydHlbaV0gfCBsZXRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJCRzY29wZS5kaXJ0eSB8IGxldHM7XG4gICAgfVxuICAgIHJldHVybiAkJHNjb3BlLmRpcnR5O1xufVxuZnVuY3Rpb24gdXBkYXRlX3Nsb3RfYmFzZShzbG90LCBzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgc2xvdF9jaGFuZ2VzLCBnZXRfc2xvdF9jb250ZXh0X2ZuKSB7XG4gICAgaWYgKHNsb3RfY2hhbmdlcykge1xuICAgICAgICBjb25zdCBzbG90X2NvbnRleHQgPSBnZXRfc2xvdF9jb250ZXh0KHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBnZXRfc2xvdF9jb250ZXh0X2ZuKTtcbiAgICAgICAgc2xvdC5wKHNsb3RfY29udGV4dCwgc2xvdF9jaGFuZ2VzKTtcbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVfc2xvdChzbG90LCBzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZGlydHksIGdldF9zbG90X2NoYW5nZXNfZm4sIGdldF9zbG90X2NvbnRleHRfZm4pIHtcbiAgICBjb25zdCBzbG90X2NoYW5nZXMgPSBnZXRfc2xvdF9jaGFuZ2VzKHNsb3RfZGVmaW5pdGlvbiwgJCRzY29wZSwgZGlydHksIGdldF9zbG90X2NoYW5nZXNfZm4pO1xuICAgIHVwZGF0ZV9zbG90X2Jhc2Uoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIHNsb3RfY2hhbmdlcywgZ2V0X3Nsb3RfY29udGV4dF9mbik7XG59XG5mdW5jdGlvbiBnZXRfYWxsX2RpcnR5X2Zyb21fc2NvcGUoJCRzY29wZSkge1xuICAgIGlmICgkJHNjb3BlLmN0eC5sZW5ndGggPiAzMikge1xuICAgICAgICBjb25zdCBkaXJ0eSA9IFtdO1xuICAgICAgICBjb25zdCBsZW5ndGggPSAkJHNjb3BlLmN0eC5sZW5ndGggLyAzMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZGlydHlbaV0gPSAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlydHk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbmZ1bmN0aW9uIGV4Y2x1ZGVfaW50ZXJuYWxfcHJvcHMocHJvcHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gcHJvcHMpXG4gICAgICAgIGlmIChrWzBdICE9PSAnJCcpXG4gICAgICAgICAgICByZXN1bHRba10gPSBwcm9wc1trXTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY29tcHV0ZV9yZXN0X3Byb3BzKHByb3BzLCBrZXlzKSB7XG4gICAgY29uc3QgcmVzdCA9IHt9O1xuICAgIGtleXMgPSBuZXcgU2V0KGtleXMpO1xuICAgIGZvciAoY29uc3QgayBpbiBwcm9wcylcbiAgICAgICAgaWYgKCFrZXlzLmhhcyhrKSAmJiBrWzBdICE9PSAnJCcpXG4gICAgICAgICAgICByZXN0W2tdID0gcHJvcHNba107XG4gICAgcmV0dXJuIHJlc3Q7XG59XG5mdW5jdGlvbiBjb21wdXRlX3Nsb3RzKHNsb3RzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2xvdHMpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gb25jZShmbikge1xuICAgIGxldCByYW4gPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKHJhbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgcmFuID0gdHJ1ZTtcbiAgICAgICAgZm4uY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbnVsbF90b19lbXB0eSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldF9zdG9yZV92YWx1ZShzdG9yZSwgcmV0LCB2YWx1ZSkge1xuICAgIHN0b3JlLnNldCh2YWx1ZSk7XG4gICAgcmV0dXJuIHJldDtcbn1cbmNvbnN0IGhhc19wcm9wID0gKG9iaiwgcHJvcCkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG5mdW5jdGlvbiBhY3Rpb25fZGVzdHJveWVyKGFjdGlvbl9yZXN1bHQpIHtcbiAgICByZXR1cm4gYWN0aW9uX3Jlc3VsdCAmJiBpc19mdW5jdGlvbihhY3Rpb25fcmVzdWx0LmRlc3Ryb3kpID8gYWN0aW9uX3Jlc3VsdC5kZXN0cm95IDogbm9vcDtcbn1cblxuY29uc3QgaXNfY2xpZW50ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG5sZXQgbm93ID0gaXNfY2xpZW50XG4gICAgPyAoKSA9PiB3aW5kb3cucGVyZm9ybWFuY2Uubm93KClcbiAgICA6ICgpID0+IERhdGUubm93KCk7XG5sZXQgcmFmID0gaXNfY2xpZW50ID8gY2IgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNiKSA6IG5vb3A7XG4vLyB1c2VkIGludGVybmFsbHkgZm9yIHRlc3RpbmdcbmZ1bmN0aW9uIHNldF9ub3coZm4pIHtcbiAgICBub3cgPSBmbjtcbn1cbmZ1bmN0aW9uIHNldF9yYWYoZm4pIHtcbiAgICByYWYgPSBmbjtcbn1cblxuY29uc3QgdGFza3MgPSBuZXcgU2V0KCk7XG5mdW5jdGlvbiBydW5fdGFza3Mobm93KSB7XG4gICAgdGFza3MuZm9yRWFjaCh0YXNrID0+IHtcbiAgICAgICAgaWYgKCF0YXNrLmMobm93KSkge1xuICAgICAgICAgICAgdGFza3MuZGVsZXRlKHRhc2spO1xuICAgICAgICAgICAgdGFzay5mKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGFza3Muc2l6ZSAhPT0gMClcbiAgICAgICAgcmFmKHJ1bl90YXNrcyk7XG59XG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkhXG4gKi9cbmZ1bmN0aW9uIGNsZWFyX2xvb3BzKCkge1xuICAgIHRhc2tzLmNsZWFyKCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdGFzayB0aGF0IHJ1bnMgb24gZWFjaCByYWYgZnJhbWVcbiAqIHVudGlsIGl0IHJldHVybnMgYSBmYWxzeSB2YWx1ZSBvciBpcyBhYm9ydGVkXG4gKi9cbmZ1bmN0aW9uIGxvb3AoY2FsbGJhY2spIHtcbiAgICBsZXQgdGFzaztcbiAgICBpZiAodGFza3Muc2l6ZSA9PT0gMClcbiAgICAgICAgcmFmKHJ1bl90YXNrcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVsZmlsbCA9PiB7XG4gICAgICAgICAgICB0YXNrcy5hZGQodGFzayA9IHsgYzogY2FsbGJhY2ssIGY6IGZ1bGZpbGwgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBhYm9ydCgpIHtcbiAgICAgICAgICAgIHRhc2tzLmRlbGV0ZSh0YXNrKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIFRyYWNrIHdoaWNoIG5vZGVzIGFyZSBjbGFpbWVkIGR1cmluZyBoeWRyYXRpb24uIFVuY2xhaW1lZCBub2RlcyBjYW4gdGhlbiBiZSByZW1vdmVkIGZyb20gdGhlIERPTVxuLy8gYXQgdGhlIGVuZCBvZiBoeWRyYXRpb24gd2l0aG91dCB0b3VjaGluZyB0aGUgcmVtYWluaW5nIG5vZGVzLlxubGV0IGlzX2h5ZHJhdGluZyA9IGZhbHNlO1xuZnVuY3Rpb24gc3RhcnRfaHlkcmF0aW5nKCkge1xuICAgIGlzX2h5ZHJhdGluZyA9IHRydWU7XG59XG5mdW5jdGlvbiBlbmRfaHlkcmF0aW5nKCkge1xuICAgIGlzX2h5ZHJhdGluZyA9IGZhbHNlO1xufVxuZnVuY3Rpb24gdXBwZXJfYm91bmQobG93LCBoaWdoLCBrZXksIHZhbHVlKSB7XG4gICAgLy8gUmV0dXJuIGZpcnN0IGluZGV4IG9mIHZhbHVlIGxhcmdlciB0aGFuIGlucHV0IHZhbHVlIGluIHRoZSByYW5nZSBbbG93LCBoaWdoKVxuICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IGxvdyArICgoaGlnaCAtIGxvdykgPj4gMSk7XG4gICAgICAgIGlmIChrZXkobWlkKSA8PSB2YWx1ZSkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvdztcbn1cbmZ1bmN0aW9uIGluaXRfaHlkcmF0ZSh0YXJnZXQpIHtcbiAgICBpZiAodGFyZ2V0Lmh5ZHJhdGVfaW5pdClcbiAgICAgICAgcmV0dXJuO1xuICAgIHRhcmdldC5oeWRyYXRlX2luaXQgPSB0cnVlO1xuICAgIC8vIFdlIGtub3cgdGhhdCBhbGwgY2hpbGRyZW4gaGF2ZSBjbGFpbV9vcmRlciB2YWx1ZXMgc2luY2UgdGhlIHVuY2xhaW1lZCBoYXZlIGJlZW4gZGV0YWNoZWQgaWYgdGFyZ2V0IGlzIG5vdCA8aGVhZD5cbiAgICBsZXQgY2hpbGRyZW4gPSB0YXJnZXQuY2hpbGROb2RlcztcbiAgICAvLyBJZiB0YXJnZXQgaXMgPGhlYWQ+LCB0aGVyZSBtYXkgYmUgY2hpbGRyZW4gd2l0aG91dCBjbGFpbV9vcmRlclxuICAgIGlmICh0YXJnZXQubm9kZU5hbWUgPT09ICdIRUFEJykge1xuICAgICAgICBjb25zdCBteUNoaWxkcmVuID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChub2RlLmNsYWltX29yZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBteUNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4gPSBteUNoaWxkcmVuO1xuICAgIH1cbiAgICAvKlxuICAgICogUmVvcmRlciBjbGFpbWVkIGNoaWxkcmVuIG9wdGltYWxseS5cbiAgICAqIFdlIGNhbiByZW9yZGVyIGNsYWltZWQgY2hpbGRyZW4gb3B0aW1hbGx5IGJ5IGZpbmRpbmcgdGhlIGxvbmdlc3Qgc3Vic2VxdWVuY2Ugb2ZcbiAgICAqIG5vZGVzIHRoYXQgYXJlIGFscmVhZHkgY2xhaW1lZCBpbiBvcmRlciBhbmQgb25seSBtb3ZpbmcgdGhlIHJlc3QuIFRoZSBsb25nZXN0XG4gICAgKiBzdWJzZXF1ZW5jZSBzdWJzZXF1ZW5jZSBvZiBub2RlcyB0aGF0IGFyZSBjbGFpbWVkIGluIG9yZGVyIGNhbiBiZSBmb3VuZCBieVxuICAgICogY29tcHV0aW5nIHRoZSBsb25nZXN0IGluY3JlYXNpbmcgc3Vic2VxdWVuY2Ugb2YgLmNsYWltX29yZGVyIHZhbHVlcy5cbiAgICAqXG4gICAgKiBUaGlzIGFsZ29yaXRobSBpcyBvcHRpbWFsIGluIGdlbmVyYXRpbmcgdGhlIGxlYXN0IGFtb3VudCBvZiByZW9yZGVyIG9wZXJhdGlvbnNcbiAgICAqIHBvc3NpYmxlLlxuICAgICpcbiAgICAqIFByb29mOlxuICAgICogV2Uga25vdyB0aGF0LCBnaXZlbiBhIHNldCBvZiByZW9yZGVyaW5nIG9wZXJhdGlvbnMsIHRoZSBub2RlcyB0aGF0IGRvIG5vdCBtb3ZlXG4gICAgKiBhbHdheXMgZm9ybSBhbiBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlLCBzaW5jZSB0aGV5IGRvIG5vdCBtb3ZlIGFtb25nIGVhY2ggb3RoZXJcbiAgICAqIG1lYW5pbmcgdGhhdCB0aGV5IG11c3QgYmUgYWxyZWFkeSBvcmRlcmVkIGFtb25nIGVhY2ggb3RoZXIuIFRodXMsIHRoZSBtYXhpbWFsXG4gICAgKiBzZXQgb2Ygbm9kZXMgdGhhdCBkbyBub3QgbW92ZSBmb3JtIGEgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlLlxuICAgICovXG4gICAgLy8gQ29tcHV0ZSBsb25nZXN0IGluY3JlYXNpbmcgc3Vic2VxdWVuY2VcbiAgICAvLyBtOiBzdWJzZXF1ZW5jZSBsZW5ndGggaiA9PiBpbmRleCBrIG9mIHNtYWxsZXN0IHZhbHVlIHRoYXQgZW5kcyBhbiBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9mIGxlbmd0aCBqXG4gICAgY29uc3QgbSA9IG5ldyBJbnQzMkFycmF5KGNoaWxkcmVuLmxlbmd0aCArIDEpO1xuICAgIC8vIFByZWRlY2Vzc29yIGluZGljZXMgKyAxXG4gICAgY29uc3QgcCA9IG5ldyBJbnQzMkFycmF5KGNoaWxkcmVuLmxlbmd0aCk7XG4gICAgbVswXSA9IC0xO1xuICAgIGxldCBsb25nZXN0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBjaGlsZHJlbltpXS5jbGFpbV9vcmRlcjtcbiAgICAgICAgLy8gRmluZCB0aGUgbGFyZ2VzdCBzdWJzZXF1ZW5jZSBsZW5ndGggc3VjaCB0aGF0IGl0IGVuZHMgaW4gYSB2YWx1ZSBsZXNzIHRoYW4gb3VyIGN1cnJlbnQgdmFsdWVcbiAgICAgICAgLy8gdXBwZXJfYm91bmQgcmV0dXJucyBmaXJzdCBncmVhdGVyIHZhbHVlLCBzbyB3ZSBzdWJ0cmFjdCBvbmVcbiAgICAgICAgLy8gd2l0aCBmYXN0IHBhdGggZm9yIHdoZW4gd2UgYXJlIG9uIHRoZSBjdXJyZW50IGxvbmdlc3Qgc3Vic2VxdWVuY2VcbiAgICAgICAgY29uc3Qgc2VxTGVuID0gKChsb25nZXN0ID4gMCAmJiBjaGlsZHJlblttW2xvbmdlc3RdXS5jbGFpbV9vcmRlciA8PSBjdXJyZW50KSA/IGxvbmdlc3QgKyAxIDogdXBwZXJfYm91bmQoMSwgbG9uZ2VzdCwgaWR4ID0+IGNoaWxkcmVuW21baWR4XV0uY2xhaW1fb3JkZXIsIGN1cnJlbnQpKSAtIDE7XG4gICAgICAgIHBbaV0gPSBtW3NlcUxlbl0gKyAxO1xuICAgICAgICBjb25zdCBuZXdMZW4gPSBzZXFMZW4gKyAxO1xuICAgICAgICAvLyBXZSBjYW4gZ3VhcmFudGVlIHRoYXQgY3VycmVudCBpcyB0aGUgc21hbGxlc3QgdmFsdWUuIE90aGVyd2lzZSwgd2Ugd291bGQgaGF2ZSBnZW5lcmF0ZWQgYSBsb25nZXIgc2VxdWVuY2UuXG4gICAgICAgIG1bbmV3TGVuXSA9IGk7XG4gICAgICAgIGxvbmdlc3QgPSBNYXRoLm1heChuZXdMZW4sIGxvbmdlc3QpO1xuICAgIH1cbiAgICAvLyBUaGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9mIG5vZGVzIChpbml0aWFsbHkgcmV2ZXJzZWQpXG4gICAgY29uc3QgbGlzID0gW107XG4gICAgLy8gVGhlIHJlc3Qgb2YgdGhlIG5vZGVzLCBub2RlcyB0aGF0IHdpbGwgYmUgbW92ZWRcbiAgICBjb25zdCB0b01vdmUgPSBbXTtcbiAgICBsZXQgbGFzdCA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gICAgZm9yIChsZXQgY3VyID0gbVtsb25nZXN0XSArIDE7IGN1ciAhPSAwOyBjdXIgPSBwW2N1ciAtIDFdKSB7XG4gICAgICAgIGxpcy5wdXNoKGNoaWxkcmVuW2N1ciAtIDFdKTtcbiAgICAgICAgZm9yICg7IGxhc3QgPj0gY3VyOyBsYXN0LS0pIHtcbiAgICAgICAgICAgIHRvTW92ZS5wdXNoKGNoaWxkcmVuW2xhc3RdKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0LS07XG4gICAgfVxuICAgIGZvciAoOyBsYXN0ID49IDA7IGxhc3QtLSkge1xuICAgICAgICB0b01vdmUucHVzaChjaGlsZHJlbltsYXN0XSk7XG4gICAgfVxuICAgIGxpcy5yZXZlcnNlKCk7XG4gICAgLy8gV2Ugc29ydCB0aGUgbm9kZXMgYmVpbmcgbW92ZWQgdG8gZ3VhcmFudGVlIHRoYXQgdGhlaXIgaW5zZXJ0aW9uIG9yZGVyIG1hdGNoZXMgdGhlIGNsYWltIG9yZGVyXG4gICAgdG9Nb3ZlLnNvcnQoKGEsIGIpID0+IGEuY2xhaW1fb3JkZXIgLSBiLmNsYWltX29yZGVyKTtcbiAgICAvLyBGaW5hbGx5LCB3ZSBtb3ZlIHRoZSBub2Rlc1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IHRvTW92ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB3aGlsZSAoaiA8IGxpcy5sZW5ndGggJiYgdG9Nb3ZlW2ldLmNsYWltX29yZGVyID49IGxpc1tqXS5jbGFpbV9vcmRlcikge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IGogPCBsaXMubGVuZ3RoID8gbGlzW2pdIDogbnVsbDtcbiAgICAgICAgdGFyZ2V0Lmluc2VydEJlZm9yZSh0b01vdmVbaV0sIGFuY2hvcik7XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwZW5kKHRhcmdldCwgbm9kZSkge1xuICAgIHRhcmdldC5hcHBlbmRDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9zdHlsZXModGFyZ2V0LCBzdHlsZV9zaGVldF9pZCwgc3R5bGVzKSB7XG4gICAgY29uc3QgYXBwZW5kX3N0eWxlc190byA9IGdldF9yb290X2Zvcl9zdHlsZSh0YXJnZXQpO1xuICAgIGlmICghYXBwZW5kX3N0eWxlc190by5nZXRFbGVtZW50QnlJZChzdHlsZV9zaGVldF9pZCkpIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBlbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZS5pZCA9IHN0eWxlX3NoZWV0X2lkO1xuICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IHN0eWxlcztcbiAgICAgICAgYXBwZW5kX3N0eWxlc2hlZXQoYXBwZW5kX3N0eWxlc190bywgc3R5bGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldF9yb290X2Zvcl9zdHlsZShub2RlKSB7XG4gICAgaWYgKCFub2RlKVxuICAgICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgY29uc3Qgcm9vdCA9IG5vZGUuZ2V0Um9vdE5vZGUgPyBub2RlLmdldFJvb3ROb2RlKCkgOiBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgaWYgKHJvb3QgJiYgcm9vdC5ob3N0KSB7XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50O1xufVxuZnVuY3Rpb24gYXBwZW5kX2VtcHR5X3N0eWxlc2hlZXQobm9kZSkge1xuICAgIGNvbnN0IHN0eWxlX2VsZW1lbnQgPSBlbGVtZW50KCdzdHlsZScpO1xuICAgIGFwcGVuZF9zdHlsZXNoZWV0KGdldF9yb290X2Zvcl9zdHlsZShub2RlKSwgc3R5bGVfZWxlbWVudCk7XG4gICAgcmV0dXJuIHN0eWxlX2VsZW1lbnQuc2hlZXQ7XG59XG5mdW5jdGlvbiBhcHBlbmRfc3R5bGVzaGVldChub2RlLCBzdHlsZSkge1xuICAgIGFwcGVuZChub2RlLmhlYWQgfHwgbm9kZSwgc3R5bGUpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2h5ZHJhdGlvbih0YXJnZXQsIG5vZGUpIHtcbiAgICBpZiAoaXNfaHlkcmF0aW5nKSB7XG4gICAgICAgIGluaXRfaHlkcmF0ZSh0YXJnZXQpO1xuICAgICAgICBpZiAoKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID09PSB1bmRlZmluZWQpIHx8ICgodGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgIT09IG51bGwpICYmICh0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZC5wYXJlbnRFbGVtZW50ICE9PSB0YXJnZXQpKSkge1xuICAgICAgICAgICAgdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTa2lwIG5vZGVzIG9mIHVuZGVmaW5lZCBvcmRlcmluZ1xuICAgICAgICB3aGlsZSAoKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkICE9PSBudWxsKSAmJiAodGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQuY2xhaW1fb3JkZXIgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID0gdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUgIT09IHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkKSB7XG4gICAgICAgICAgICAvLyBXZSBvbmx5IGluc2VydCBpZiB0aGUgb3JkZXJpbmcgb2YgdGhpcyBub2RlIHNob3VsZCBiZSBtb2RpZmllZCBvciB0aGUgcGFyZW50IG5vZGUgaXMgbm90IHRhcmdldFxuICAgICAgICAgICAgaWYgKG5vZGUuY2xhaW1fb3JkZXIgIT09IHVuZGVmaW5lZCB8fCBub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vZGUucGFyZW50Tm9kZSAhPT0gdGFyZ2V0IHx8IG5vZGUubmV4dFNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgYW5jaG9yIHx8IG51bGwpO1xufVxuZnVuY3Rpb24gaW5zZXJ0X2h5ZHJhdGlvbih0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIGlmIChpc19oeWRyYXRpbmcgJiYgIWFuY2hvcikge1xuICAgICAgICBhcHBlbmRfaHlkcmF0aW9uKHRhcmdldCwgbm9kZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vZGUucGFyZW50Tm9kZSAhPT0gdGFyZ2V0IHx8IG5vZGUubmV4dFNpYmxpbmcgIT0gYW5jaG9yKSB7XG4gICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgYW5jaG9yIHx8IG51bGwpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaChub2RlKSB7XG4gICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xufVxuZnVuY3Rpb24gZGVzdHJveV9lYWNoKGl0ZXJhdGlvbnMsIGRldGFjaGluZykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoaXRlcmF0aW9uc1tpXSlcbiAgICAgICAgICAgIGl0ZXJhdGlvbnNbaV0uZChkZXRhY2hpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVsZW1lbnQobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpO1xufVxuZnVuY3Rpb24gZWxlbWVudF9pcyhuYW1lLCBpcykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUsIHsgaXMgfSk7XG59XG5mdW5jdGlvbiBvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzKG9iaiwgZXhjbHVkZSkge1xuICAgIGNvbnN0IHRhcmdldCA9IHt9O1xuICAgIGZvciAoY29uc3QgayBpbiBvYmopIHtcbiAgICAgICAgaWYgKGhhc19wcm9wKG9iaiwgaylcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICYmIGV4Y2x1ZGUuaW5kZXhPZihrKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRhcmdldFtrXSA9IG9ialtrXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gc3ZnX2VsZW1lbnQobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgbmFtZSk7XG59XG5mdW5jdGlvbiB0ZXh0KGRhdGEpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YSk7XG59XG5mdW5jdGlvbiBzcGFjZSgpIHtcbiAgICByZXR1cm4gdGV4dCgnICcpO1xufVxuZnVuY3Rpb24gZW1wdHkoKSB7XG4gICAgcmV0dXJuIHRleHQoJycpO1xufVxuZnVuY3Rpb24gbGlzdGVuKG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICByZXR1cm4gKCkgPT4gbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHByZXZlbnRfZGVmYXVsdChmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHN0b3BfcHJvcGFnYXRpb24oZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gc2VsZihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzKVxuICAgICAgICAgICAgZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRydXN0ZWQoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGV2ZW50LmlzVHJ1c3RlZClcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICBlbHNlIGlmIChub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpICE9PSB2YWx1ZSlcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG59XG5mdW5jdGlvbiBzZXRfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobm9kZS5fX3Byb3RvX18pO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS5jc3NUZXh0ID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ19fdmFsdWUnKSB7XG4gICAgICAgICAgICBub2RlLnZhbHVlID0gbm9kZVtrZXldID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlc2NyaXB0b3JzW2tleV0gJiYgZGVzY3JpcHRvcnNba2V5XS5zZXQpIHtcbiAgICAgICAgICAgIG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF0dHIobm9kZSwga2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0X3N2Z19hdHRyaWJ1dGVzKG5vZGUsIGF0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGF0dHIobm9kZSwga2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9jdXN0b21fZWxlbWVudF9kYXRhKG5vZGUsIHByb3AsIHZhbHVlKSB7XG4gICAgaWYgKHByb3AgaW4gbm9kZSkge1xuICAgICAgICBub2RlW3Byb3BdID0gdHlwZW9mIG5vZGVbcHJvcF0gPT09ICdib29sZWFuJyAmJiB2YWx1ZSA9PT0gJycgPyB0cnVlIDogdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhdHRyKG5vZGUsIHByb3AsIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiB4bGlua19hdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBub2RlLnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgYXR0cmlidXRlLCB2YWx1ZSk7XG59XG5mdW5jdGlvbiBnZXRfYmluZGluZ19ncm91cF92YWx1ZShncm91cCwgX192YWx1ZSwgY2hlY2tlZCkge1xuICAgIGNvbnN0IHZhbHVlID0gbmV3IFNldCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGdyb3VwW2ldLmNoZWNrZWQpXG4gICAgICAgICAgICB2YWx1ZS5hZGQoZ3JvdXBbaV0uX192YWx1ZSk7XG4gICAgfVxuICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgICB2YWx1ZS5kZWxldGUoX192YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHRvX251bWJlcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJycgPyBudWxsIDogK3ZhbHVlO1xufVxuZnVuY3Rpb24gdGltZV9yYW5nZXNfdG9fYXJyYXkocmFuZ2VzKSB7XG4gICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBhcnJheS5wdXNoKHsgc3RhcnQ6IHJhbmdlcy5zdGFydChpKSwgZW5kOiByYW5nZXMuZW5kKGkpIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5mdW5jdGlvbiBjaGlsZHJlbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5jaGlsZE5vZGVzKTtcbn1cbmZ1bmN0aW9uIGluaXRfY2xhaW1faW5mbyhub2Rlcykge1xuICAgIGlmIChub2Rlcy5jbGFpbV9pbmZvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm9kZXMuY2xhaW1faW5mbyA9IHsgbGFzdF9pbmRleDogMCwgdG90YWxfY2xhaW1lZDogMCB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsYWltX25vZGUobm9kZXMsIHByZWRpY2F0ZSwgcHJvY2Vzc05vZGUsIGNyZWF0ZU5vZGUsIGRvbnRVcGRhdGVMYXN0SW5kZXggPSBmYWxzZSkge1xuICAgIC8vIFRyeSB0byBmaW5kIG5vZGVzIGluIGFuIG9yZGVyIHN1Y2ggdGhhdCB3ZSBsZW5ndGhlbiB0aGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlXG4gICAgaW5pdF9jbGFpbV9pbmZvKG5vZGVzKTtcbiAgICBjb25zdCByZXN1bHROb2RlID0gKCgpID0+IHtcbiAgICAgICAgLy8gV2UgZmlyc3QgdHJ5IHRvIGZpbmQgYW4gZWxlbWVudCBhZnRlciB0aGUgcHJldmlvdXMgb25lXG4gICAgICAgIGZvciAobGV0IGkgPSBub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXg7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gcHJvY2Vzc05vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNbaV0gPSByZXBsYWNlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkb250VXBkYXRlTGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgd2UgdHJ5IHRvIGZpbmQgb25lIGJlZm9yZVxuICAgICAgICAvLyBXZSBpdGVyYXRlIGluIHJldmVyc2Ugc28gdGhhdCB3ZSBkb24ndCBnbyB0b28gZmFyIGJhY2tcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSBwcm9jZXNzTm9kZShub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBub2Rlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2Rlc1tpXSA9IHJlcGxhY2VtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRvbnRVcGRhdGVMYXN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuY2xhaW1faW5mby5sYXN0X2luZGV4ID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVwbGFjZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBzcGxpY2VkIGJlZm9yZSB0aGUgbGFzdF9pbmRleCwgd2UgZGVjcmVhc2UgaXRcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuY2xhaW1faW5mby5sYXN0X2luZGV4LS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIGNhbid0IGZpbmQgYW55IG1hdGNoaW5nIG5vZGUsIHdlIGNyZWF0ZSBhIG5ldyBvbmVcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUoKTtcbiAgICB9KSgpO1xuICAgIHJlc3VsdE5vZGUuY2xhaW1fb3JkZXIgPSBub2Rlcy5jbGFpbV9pbmZvLnRvdGFsX2NsYWltZWQ7XG4gICAgbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkICs9IDE7XG4gICAgcmV0dXJuIHJlc3VsdE5vZGU7XG59XG5mdW5jdGlvbiBjbGFpbV9lbGVtZW50X2Jhc2Uobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMsIGNyZWF0ZV9lbGVtZW50KSB7XG4gICAgcmV0dXJuIGNsYWltX25vZGUobm9kZXMsIChub2RlKSA9PiBub2RlLm5vZGVOYW1lID09PSBuYW1lLCAobm9kZSkgPT4ge1xuICAgICAgICBjb25zdCByZW1vdmUgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG5vZGUuYXR0cmlidXRlc1tqXTtcbiAgICAgICAgICAgIGlmICghYXR0cmlidXRlc1thdHRyaWJ1dGUubmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZW1vdmUucHVzaChhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlLmZvckVhY2godiA9PiBub2RlLnJlbW92ZUF0dHJpYnV0ZSh2KSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSwgKCkgPT4gY3JlYXRlX2VsZW1lbnQobmFtZSkpO1xufVxuZnVuY3Rpb24gY2xhaW1fZWxlbWVudChub2RlcywgbmFtZSwgYXR0cmlidXRlcykge1xuICAgIHJldHVybiBjbGFpbV9lbGVtZW50X2Jhc2Uobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMsIGVsZW1lbnQpO1xufVxuZnVuY3Rpb24gY2xhaW1fc3ZnX2VsZW1lbnQobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICByZXR1cm4gY2xhaW1fZWxlbWVudF9iYXNlKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBzdmdfZWxlbWVudCk7XG59XG5mdW5jdGlvbiBjbGFpbV90ZXh0KG5vZGVzLCBkYXRhKSB7XG4gICAgcmV0dXJuIGNsYWltX25vZGUobm9kZXMsIChub2RlKSA9PiBub2RlLm5vZGVUeXBlID09PSAzLCAobm9kZSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhU3RyID0gJycgKyBkYXRhO1xuICAgICAgICBpZiAobm9kZS5kYXRhLnN0YXJ0c1dpdGgoZGF0YVN0cikpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmRhdGEubGVuZ3RoICE9PSBkYXRhU3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnNwbGl0VGV4dChkYXRhU3RyLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSBkYXRhU3RyO1xuICAgICAgICB9XG4gICAgfSwgKCkgPT4gdGV4dChkYXRhKSwgdHJ1ZSAvLyBUZXh0IG5vZGVzIHNob3VsZCBub3QgdXBkYXRlIGxhc3QgaW5kZXggc2luY2UgaXQgaXMgbGlrZWx5IG5vdCB3b3J0aCBpdCB0byBlbGltaW5hdGUgYW4gaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSBvZiBhY3R1YWwgZWxlbWVudHNcbiAgICApO1xufVxuZnVuY3Rpb24gY2xhaW1fc3BhY2Uobm9kZXMpIHtcbiAgICByZXR1cm4gY2xhaW1fdGV4dChub2RlcywgJyAnKTtcbn1cbmZ1bmN0aW9uIGZpbmRfY29tbWVudChub2RlcywgdGV4dCwgc3RhcnQpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBub2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSA4IC8qIGNvbW1lbnQgbm9kZSAqLyAmJiBub2RlLnRleHRDb250ZW50LnRyaW0oKSA9PT0gdGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGNsYWltX2h0bWxfdGFnKG5vZGVzLCBpc19zdmcpIHtcbiAgICAvLyBmaW5kIGh0bWwgb3BlbmluZyB0YWdcbiAgICBjb25zdCBzdGFydF9pbmRleCA9IGZpbmRfY29tbWVudChub2RlcywgJ0hUTUxfVEFHX1NUQVJUJywgMCk7XG4gICAgY29uc3QgZW5kX2luZGV4ID0gZmluZF9jb21tZW50KG5vZGVzLCAnSFRNTF9UQUdfRU5EJywgc3RhcnRfaW5kZXgpO1xuICAgIGlmIChzdGFydF9pbmRleCA9PT0gZW5kX2luZGV4KSB7XG4gICAgICAgIHJldHVybiBuZXcgSHRtbFRhZ0h5ZHJhdGlvbih1bmRlZmluZWQsIGlzX3N2Zyk7XG4gICAgfVxuICAgIGluaXRfY2xhaW1faW5mbyhub2Rlcyk7XG4gICAgY29uc3QgaHRtbF90YWdfbm9kZXMgPSBub2Rlcy5zcGxpY2Uoc3RhcnRfaW5kZXgsIGVuZF9pbmRleCAtIHN0YXJ0X2luZGV4ICsgMSk7XG4gICAgZGV0YWNoKGh0bWxfdGFnX25vZGVzWzBdKTtcbiAgICBkZXRhY2goaHRtbF90YWdfbm9kZXNbaHRtbF90YWdfbm9kZXMubGVuZ3RoIC0gMV0pO1xuICAgIGNvbnN0IGNsYWltZWRfbm9kZXMgPSBodG1sX3RhZ19ub2Rlcy5zbGljZSgxLCBodG1sX3RhZ19ub2Rlcy5sZW5ndGggLSAxKTtcbiAgICBmb3IgKGNvbnN0IG4gb2YgY2xhaW1lZF9ub2Rlcykge1xuICAgICAgICBuLmNsYWltX29yZGVyID0gbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkO1xuICAgICAgICBub2Rlcy5jbGFpbV9pbmZvLnRvdGFsX2NsYWltZWQgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBIdG1sVGFnSHlkcmF0aW9uKGNsYWltZWRfbm9kZXMsIGlzX3N2Zyk7XG59XG5mdW5jdGlvbiBzZXRfZGF0YSh0ZXh0LCBkYXRhKSB7XG4gICAgZGF0YSA9ICcnICsgZGF0YTtcbiAgICBpZiAodGV4dC53aG9sZVRleHQgIT09IGRhdGEpXG4gICAgICAgIHRleHQuZGF0YSA9IGRhdGE7XG59XG5mdW5jdGlvbiBzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIHZhbHVlKSB7XG4gICAgaW5wdXQudmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF90eXBlKGlucHV0LCB0eXBlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaW5wdXQudHlwZSA9IHR5cGU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfc3R5bGUobm9kZSwga2V5LCB2YWx1ZSwgaW1wb3J0YW50KSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIG5vZGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoa2V5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSwgaW1wb3J0YW50ID8gJ2ltcG9ydGFudCcgOiAnJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2VsZWN0X29wdGlvbihzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgaWYgKG9wdGlvbi5fX3ZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IC0xOyAvLyBubyBvcHRpb24gc2hvdWxkIGJlIHNlbGVjdGVkXG59XG5mdW5jdGlvbiBzZWxlY3Rfb3B0aW9ucyhzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gfnZhbHVlLmluZGV4T2Yob3B0aW9uLl9fdmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNlbGVjdF92YWx1ZShzZWxlY3QpIHtcbiAgICBjb25zdCBzZWxlY3RlZF9vcHRpb24gPSBzZWxlY3QucXVlcnlTZWxlY3RvcignOmNoZWNrZWQnKSB8fCBzZWxlY3Qub3B0aW9uc1swXTtcbiAgICByZXR1cm4gc2VsZWN0ZWRfb3B0aW9uICYmIHNlbGVjdGVkX29wdGlvbi5fX3ZhbHVlO1xufVxuZnVuY3Rpb24gc2VsZWN0X211bHRpcGxlX3ZhbHVlKHNlbGVjdCkge1xuICAgIHJldHVybiBbXS5tYXAuY2FsbChzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnOmNoZWNrZWQnKSwgb3B0aW9uID0+IG9wdGlvbi5fX3ZhbHVlKTtcbn1cbi8vIHVuZm9ydHVuYXRlbHkgdGhpcyBjYW4ndCBiZSBhIGNvbnN0YW50IGFzIHRoYXQgd291bGRuJ3QgYmUgdHJlZS1zaGFrZWFibGVcbi8vIHNvIHdlIGNhY2hlIHRoZSByZXN1bHQgaW5zdGVhZFxubGV0IGNyb3Nzb3JpZ2luO1xuZnVuY3Rpb24gaXNfY3Jvc3NvcmlnaW4oKSB7XG4gICAgaWYgKGNyb3Nzb3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY3Jvc3NvcmlnaW4gPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgdm9pZCB3aW5kb3cucGFyZW50LmRvY3VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY3Jvc3NvcmlnaW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcm9zc29yaWdpbjtcbn1cbmZ1bmN0aW9uIGFkZF9yZXNpemVfbGlzdGVuZXIobm9kZSwgZm4pIHtcbiAgICBjb25zdCBjb21wdXRlZF9zdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgaWYgKGNvbXB1dGVkX3N0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gICAgY29uc3QgaWZyYW1lID0gZWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyAnICtcbiAgICAgICAgJ292ZXJmbG93OiBoaWRkZW47IGJvcmRlcjogMDsgb3BhY2l0eTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IC0xOycpO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBpZnJhbWUudGFiSW5kZXggPSAtMTtcbiAgICBjb25zdCBjcm9zc29yaWdpbiA9IGlzX2Nyb3Nzb3JpZ2luKCk7XG4gICAgbGV0IHVuc3Vic2NyaWJlO1xuICAgIGlmIChjcm9zc29yaWdpbikge1xuICAgICAgICBpZnJhbWUuc3JjID0gXCJkYXRhOnRleHQvaHRtbCw8c2NyaXB0Pm9ucmVzaXplPWZ1bmN0aW9uKCl7cGFyZW50LnBvc3RNZXNzYWdlKDAsJyonKX08L3NjcmlwdD5cIjtcbiAgICAgICAgdW5zdWJzY3JpYmUgPSBsaXN0ZW4od2luZG93LCAnbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gaWZyYW1lLmNvbnRlbnRXaW5kb3cpXG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZnJhbWUuc3JjID0gJ2Fib3V0OmJsYW5rJztcbiAgICAgICAgaWZyYW1lLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gbGlzdGVuKGlmcmFtZS5jb250ZW50V2luZG93LCAncmVzaXplJywgZm4pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBhcHBlbmQobm9kZSwgaWZyYW1lKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoY3Jvc3NvcmlnaW4pIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodW5zdWJzY3JpYmUgJiYgaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGV0YWNoKGlmcmFtZSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZV9jbGFzcyhlbGVtZW50LCBuYW1lLCB0b2dnbGUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdFt0b2dnbGUgPyAnYWRkJyA6ICdyZW1vdmUnXShuYW1lKTtcbn1cbmZ1bmN0aW9uIGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwsIHsgYnViYmxlcyA9IGZhbHNlLCBjYW5jZWxhYmxlID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgIGUuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIGJ1YmJsZXMsIGNhbmNlbGFibGUsIGRldGFpbCk7XG4gICAgcmV0dXJuIGU7XG59XG5mdW5jdGlvbiBxdWVyeV9zZWxlY3Rvcl9hbGwoc2VsZWN0b3IsIHBhcmVudCA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShwYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xufVxuY2xhc3MgSHRtbFRhZyB7XG4gICAgY29uc3RydWN0b3IoaXNfc3ZnID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5pc19zdmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc19zdmcgPSBpc19zdmc7XG4gICAgICAgIHRoaXMuZSA9IHRoaXMubiA9IG51bGw7XG4gICAgfVxuICAgIGMoaHRtbCkge1xuICAgICAgICB0aGlzLmgoaHRtbCk7XG4gICAgfVxuICAgIG0oaHRtbCwgdGFyZ2V0LCBhbmNob3IgPSBudWxsKSB7XG4gICAgICAgIGlmICghdGhpcy5lKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc19zdmcpXG4gICAgICAgICAgICAgICAgdGhpcy5lID0gc3ZnX2VsZW1lbnQodGFyZ2V0Lm5vZGVOYW1lKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmUgPSBlbGVtZW50KHRhcmdldC5ub2RlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLnQgPSB0YXJnZXQ7XG4gICAgICAgICAgICB0aGlzLmMoaHRtbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pKGFuY2hvcik7XG4gICAgfVxuICAgIGgoaHRtbCkge1xuICAgICAgICB0aGlzLmUuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgdGhpcy5uID0gQXJyYXkuZnJvbSh0aGlzLmUuY2hpbGROb2Rlcyk7XG4gICAgfVxuICAgIGkoYW5jaG9yKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpbnNlcnQodGhpcy50LCB0aGlzLm5baV0sIGFuY2hvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcChodG1sKSB7XG4gICAgICAgIHRoaXMuZCgpO1xuICAgICAgICB0aGlzLmgoaHRtbCk7XG4gICAgICAgIHRoaXMuaSh0aGlzLmEpO1xuICAgIH1cbiAgICBkKCkge1xuICAgICAgICB0aGlzLm4uZm9yRWFjaChkZXRhY2gpO1xuICAgIH1cbn1cbmNsYXNzIEh0bWxUYWdIeWRyYXRpb24gZXh0ZW5kcyBIdG1sVGFnIHtcbiAgICBjb25zdHJ1Y3RvcihjbGFpbWVkX25vZGVzLCBpc19zdmcgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihpc19zdmcpO1xuICAgICAgICB0aGlzLmUgPSB0aGlzLm4gPSBudWxsO1xuICAgICAgICB0aGlzLmwgPSBjbGFpbWVkX25vZGVzO1xuICAgIH1cbiAgICBjKGh0bWwpIHtcbiAgICAgICAgaWYgKHRoaXMubCkge1xuICAgICAgICAgICAgdGhpcy5uID0gdGhpcy5sO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3VwZXIuYyhodG1sKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpKGFuY2hvcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaW5zZXJ0X2h5ZHJhdGlvbih0aGlzLnQsIHRoaXMubltpXSwgYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGF0dHJpYnV0ZV90b19vYmplY3QoYXR0cmlidXRlcykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmVzdWx0W2F0dHJpYnV0ZS5uYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldF9jdXN0b21fZWxlbWVudHNfc2xvdHMoZWxlbWVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGVsZW1lbnQuY2hpbGROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIHJlc3VsdFtub2RlLnNsb3QgfHwgJ2RlZmF1bHQnXSA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gd2UgbmVlZCB0byBzdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIG11bHRpcGxlIGRvY3VtZW50cyBiZWNhdXNlIGEgU3ZlbHRlIGFwcGxpY2F0aW9uIGNvdWxkIGFsc28gY29udGFpbiBpZnJhbWVzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vc3ZlbHRlanMvc3ZlbHRlL2lzc3Vlcy8zNjI0XG5jb25zdCBtYW5hZ2VkX3N0eWxlcyA9IG5ldyBNYXAoKTtcbmxldCBhY3RpdmUgPSAwO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Rhcmtza3lhcHAvc3RyaW5nLWhhc2gvYmxvYi9tYXN0ZXIvaW5kZXguanNcbmZ1bmN0aW9uIGhhc2goc3RyKSB7XG4gICAgbGV0IGhhc2ggPSA1MzgxO1xuICAgIGxldCBpID0gc3RyLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKVxuICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgXiBzdHIuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gaGFzaCA+Pj4gMDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZV9zdHlsZV9pbmZvcm1hdGlvbihkb2MsIG5vZGUpIHtcbiAgICBjb25zdCBpbmZvID0geyBzdHlsZXNoZWV0OiBhcHBlbmRfZW1wdHlfc3R5bGVzaGVldChub2RlKSwgcnVsZXM6IHt9IH07XG4gICAgbWFuYWdlZF9zdHlsZXMuc2V0KGRvYywgaW5mbyk7XG4gICAgcmV0dXJuIGluZm87XG59XG5mdW5jdGlvbiBjcmVhdGVfcnVsZShub2RlLCBhLCBiLCBkdXJhdGlvbiwgZGVsYXksIGVhc2UsIGZuLCB1aWQgPSAwKSB7XG4gICAgY29uc3Qgc3RlcCA9IDE2LjY2NiAvIGR1cmF0aW9uO1xuICAgIGxldCBrZXlmcmFtZXMgPSAne1xcbic7XG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPD0gMTsgcCArPSBzdGVwKSB7XG4gICAgICAgIGNvbnN0IHQgPSBhICsgKGIgLSBhKSAqIGVhc2UocCk7XG4gICAgICAgIGtleWZyYW1lcyArPSBwICogMTAwICsgYCV7JHtmbih0LCAxIC0gdCl9fVxcbmA7XG4gICAgfVxuICAgIGNvbnN0IHJ1bGUgPSBrZXlmcmFtZXMgKyBgMTAwJSB7JHtmbihiLCAxIC0gYil9fVxcbn1gO1xuICAgIGNvbnN0IG5hbWUgPSBgX19zdmVsdGVfJHtoYXNoKHJ1bGUpfV8ke3VpZH1gO1xuICAgIGNvbnN0IGRvYyA9IGdldF9yb290X2Zvcl9zdHlsZShub2RlKTtcbiAgICBjb25zdCB7IHN0eWxlc2hlZXQsIHJ1bGVzIH0gPSBtYW5hZ2VkX3N0eWxlcy5nZXQoZG9jKSB8fCBjcmVhdGVfc3R5bGVfaW5mb3JtYXRpb24oZG9jLCBub2RlKTtcbiAgICBpZiAoIXJ1bGVzW25hbWVdKSB7XG4gICAgICAgIHJ1bGVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgc3R5bGVzaGVldC5pbnNlcnRSdWxlKGBAa2V5ZnJhbWVzICR7bmFtZX0gJHtydWxlfWAsIHN0eWxlc2hlZXQuY3NzUnVsZXMubGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgYW5pbWF0aW9uID0gbm9kZS5zdHlsZS5hbmltYXRpb24gfHwgJyc7XG4gICAgbm9kZS5zdHlsZS5hbmltYXRpb24gPSBgJHthbmltYXRpb24gPyBgJHthbmltYXRpb259LCBgIDogJyd9JHtuYW1lfSAke2R1cmF0aW9ufW1zIGxpbmVhciAke2RlbGF5fW1zIDEgYm90aGA7XG4gICAgYWN0aXZlICs9IDE7XG4gICAgcmV0dXJuIG5hbWU7XG59XG5mdW5jdGlvbiBkZWxldGVfcnVsZShub2RlLCBuYW1lKSB7XG4gICAgY29uc3QgcHJldmlvdXMgPSAobm9kZS5zdHlsZS5hbmltYXRpb24gfHwgJycpLnNwbGl0KCcsICcpO1xuICAgIGNvbnN0IG5leHQgPSBwcmV2aW91cy5maWx0ZXIobmFtZVxuICAgICAgICA/IGFuaW0gPT4gYW5pbS5pbmRleE9mKG5hbWUpIDwgMCAvLyByZW1vdmUgc3BlY2lmaWMgYW5pbWF0aW9uXG4gICAgICAgIDogYW5pbSA9PiBhbmltLmluZGV4T2YoJ19fc3ZlbHRlJykgPT09IC0xIC8vIHJlbW92ZSBhbGwgU3ZlbHRlIGFuaW1hdGlvbnNcbiAgICApO1xuICAgIGNvbnN0IGRlbGV0ZWQgPSBwcmV2aW91cy5sZW5ndGggLSBuZXh0Lmxlbmd0aDtcbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgICBub2RlLnN0eWxlLmFuaW1hdGlvbiA9IG5leHQuam9pbignLCAnKTtcbiAgICAgICAgYWN0aXZlIC09IGRlbGV0ZWQ7XG4gICAgICAgIGlmICghYWN0aXZlKVxuICAgICAgICAgICAgY2xlYXJfcnVsZXMoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbGVhcl9ydWxlcygpIHtcbiAgICByYWYoKCkgPT4ge1xuICAgICAgICBpZiAoYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBtYW5hZ2VkX3N0eWxlcy5mb3JFYWNoKGluZm8gPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBzdHlsZXNoZWV0IH0gPSBpbmZvO1xuICAgICAgICAgICAgbGV0IGkgPSBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChpLS0pXG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldC5kZWxldGVSdWxlKGkpO1xuICAgICAgICAgICAgaW5mby5ydWxlcyA9IHt9O1xuICAgICAgICB9KTtcbiAgICAgICAgbWFuYWdlZF9zdHlsZXMuY2xlYXIoKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlX2FuaW1hdGlvbihub2RlLCBmcm9tLCBmbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFmcm9tKVxuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICBjb25zdCB0byA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGZyb20ubGVmdCA9PT0gdG8ubGVmdCAmJiBmcm9tLnJpZ2h0ID09PSB0by5yaWdodCAmJiBmcm9tLnRvcCA9PT0gdG8udG9wICYmIGZyb20uYm90dG9tID09PSB0by5ib3R0b20pXG4gICAgICAgIHJldHVybiBub29wO1xuICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIFxuICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogc2hvdWxkIHRoaXMgYmUgc2VwYXJhdGVkIGZyb20gZGVzdHJ1Y3R1cmluZz8gT3Igc3RhcnQvZW5kIGFkZGVkIHRvIHB1YmxpYyBhcGkgYW5kIGRvY3VtZW50YXRpb24/XG4gICAgc3RhcnQ6IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5LCBcbiAgICAvLyBAdHMtaWdub3JlIHRvZG86XG4gICAgZW5kID0gc3RhcnRfdGltZSArIGR1cmF0aW9uLCB0aWNrID0gbm9vcCwgY3NzIH0gPSBmbihub2RlLCB7IGZyb20sIHRvIH0sIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IG5hbWU7XG4gICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgIG5hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlbGF5KSB7XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgbmFtZSk7XG4gICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgbG9vcChub3cgPT4ge1xuICAgICAgICBpZiAoIXN0YXJ0ZWQgJiYgbm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGVkICYmIG5vdyA+PSBlbmQpIHtcbiAgICAgICAgICAgIHRpY2soMSwgMCk7XG4gICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBub3cgLSBzdGFydF90aW1lO1xuICAgICAgICAgICAgY29uc3QgdCA9IDAgKyAxICogZWFzaW5nKHAgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBzdGFydCgpO1xuICAgIHRpY2soMCwgMSk7XG4gICAgcmV0dXJuIHN0b3A7XG59XG5mdW5jdGlvbiBmaXhfcG9zaXRpb24obm9kZSkge1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICBpZiAoc3R5bGUucG9zaXRpb24gIT09ICdhYnNvbHV0ZScgJiYgc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZTtcbiAgICAgICAgY29uc3QgYSA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBub2RlLnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBhZGRfdHJhbnNmb3JtKG5vZGUsIGEpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZF90cmFuc2Zvcm0obm9kZSwgYSkge1xuICAgIGNvbnN0IGIgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChhLmxlZnQgIT09IGIubGVmdCB8fCBhLnRvcCAhPT0gYi50b3ApIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBzdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogc3R5bGUudHJhbnNmb3JtO1xuICAgICAgICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RyYW5zZm9ybX0gdHJhbnNsYXRlKCR7YS5sZWZ0IC0gYi5sZWZ0fXB4LCAke2EudG9wIC0gYi50b3B9cHgpYDtcbiAgICB9XG59XG5cbmxldCBjdXJyZW50X2NvbXBvbmVudDtcbmZ1bmN0aW9uIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICBjdXJyZW50X2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGdldF9jdXJyZW50X2NvbXBvbmVudCgpIHtcbiAgICBpZiAoIWN1cnJlbnRfY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNhbGxlZCBvdXRzaWRlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbicpO1xuICAgIHJldHVybiBjdXJyZW50X2NvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGJlZm9yZVVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmJlZm9yZV91cGRhdGUucHVzaChmbik7XG59XG5mdW5jdGlvbiBvbk1vdW50KGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQub25fbW91bnQucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZnRlclVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmFmdGVyX3VwZGF0ZS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIG9uRGVzdHJveShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLm9uX2Rlc3Ryb3kucHVzaChmbik7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudERpc3BhdGNoZXIoKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgcmV0dXJuICh0eXBlLCBkZXRhaWwsIHsgY2FuY2VsYWJsZSA9IGZhbHNlIH0gPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSBjb21wb25lbnQuJCQuY2FsbGJhY2tzW3R5cGVdO1xuICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAvLyBUT0RPIGFyZSB0aGVyZSBzaXR1YXRpb25zIHdoZXJlIGV2ZW50cyBjb3VsZCBiZSBkaXNwYXRjaGVkXG4gICAgICAgICAgICAvLyBpbiBhIHNlcnZlciAobm9uLURPTSkgZW52aXJvbm1lbnQ/XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwsIHsgY2FuY2VsYWJsZSB9KTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4ge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoY29tcG9uZW50LCBldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuZnVuY3Rpb24gc2V0Q29udGV4dChrZXksIGNvbnRleHQpIHtcbiAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LnNldChrZXksIGNvbnRleHQpO1xuICAgIHJldHVybiBjb250ZXh0O1xufVxuZnVuY3Rpb24gZ2V0Q29udGV4dChrZXkpIHtcbiAgICByZXR1cm4gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dC5nZXQoa2V5KTtcbn1cbmZ1bmN0aW9uIGdldEFsbENvbnRleHRzKCkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0O1xufVxuZnVuY3Rpb24gaGFzQ29udGV4dChrZXkpIHtcbiAgICByZXR1cm4gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dC5oYXMoa2V5KTtcbn1cbi8vIFRPRE8gZmlndXJlIG91dCBpZiB3ZSBzdGlsbCB3YW50IHRvIHN1cHBvcnRcbi8vIHNob3J0aGFuZCBldmVudHMsIG9yIGlmIHdlIHdhbnQgdG8gaW1wbGVtZW50XG4vLyBhIHJlYWwgYnViYmxpbmcgbWVjaGFuaXNtXG5mdW5jdGlvbiBidWJibGUoY29tcG9uZW50LCBldmVudCkge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IGNvbXBvbmVudC4kJC5jYWxsYmFja3NbZXZlbnQudHlwZV07XG4gICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4gZm4uY2FsbCh0aGlzLCBldmVudCkpO1xuICAgIH1cbn1cblxuY29uc3QgZGlydHlfY29tcG9uZW50cyA9IFtdO1xuY29uc3QgaW50cm9zID0geyBlbmFibGVkOiBmYWxzZSB9O1xuY29uc3QgYmluZGluZ19jYWxsYmFja3MgPSBbXTtcbmNvbnN0IHJlbmRlcl9jYWxsYmFja3MgPSBbXTtcbmNvbnN0IGZsdXNoX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgcmVzb2x2ZWRfcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xubGV0IHVwZGF0ZV9zY2hlZHVsZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIHNjaGVkdWxlX3VwZGF0ZSgpIHtcbiAgICBpZiAoIXVwZGF0ZV9zY2hlZHVsZWQpIHtcbiAgICAgICAgdXBkYXRlX3NjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgIHJlc29sdmVkX3Byb21pc2UudGhlbihmbHVzaCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdGljaygpIHtcbiAgICBzY2hlZHVsZV91cGRhdGUoKTtcbiAgICByZXR1cm4gcmVzb2x2ZWRfcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGFkZF9yZW5kZXJfY2FsbGJhY2soZm4pIHtcbiAgICByZW5kZXJfY2FsbGJhY2tzLnB1c2goZm4pO1xufVxuZnVuY3Rpb24gYWRkX2ZsdXNoX2NhbGxiYWNrKGZuKSB7XG4gICAgZmx1c2hfY2FsbGJhY2tzLnB1c2goZm4pO1xufVxuLy8gZmx1c2goKSBjYWxscyBjYWxsYmFja3MgaW4gdGhpcyBvcmRlcjpcbi8vIDEuIEFsbCBiZWZvcmVVcGRhdGUgY2FsbGJhY2tzLCBpbiBvcmRlcjogcGFyZW50cyBiZWZvcmUgY2hpbGRyZW5cbi8vIDIuIEFsbCBiaW5kOnRoaXMgY2FsbGJhY2tzLCBpbiByZXZlcnNlIG9yZGVyOiBjaGlsZHJlbiBiZWZvcmUgcGFyZW50cy5cbi8vIDMuIEFsbCBhZnRlclVwZGF0ZSBjYWxsYmFja3MsIGluIG9yZGVyOiBwYXJlbnRzIGJlZm9yZSBjaGlsZHJlbi4gRVhDRVBUXG4vLyAgICBmb3IgYWZ0ZXJVcGRhdGVzIGNhbGxlZCBkdXJpbmcgdGhlIGluaXRpYWwgb25Nb3VudCwgd2hpY2ggYXJlIGNhbGxlZCBpblxuLy8gICAgcmV2ZXJzZSBvcmRlcjogY2hpbGRyZW4gYmVmb3JlIHBhcmVudHMuXG4vLyBTaW5jZSBjYWxsYmFja3MgbWlnaHQgdXBkYXRlIGNvbXBvbmVudCB2YWx1ZXMsIHdoaWNoIGNvdWxkIHRyaWdnZXIgYW5vdGhlclxuLy8gY2FsbCB0byBmbHVzaCgpLCB0aGUgZm9sbG93aW5nIHN0ZXBzIGd1YXJkIGFnYWluc3QgdGhpczpcbi8vIDEuIER1cmluZyBiZWZvcmVVcGRhdGUsIGFueSB1cGRhdGVkIGNvbXBvbmVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGVcbi8vICAgIGRpcnR5X2NvbXBvbmVudHMgYXJyYXkgYW5kIHdpbGwgY2F1c2UgYSByZWVudHJhbnQgY2FsbCB0byBmbHVzaCgpLiBCZWNhdXNlXG4vLyAgICB0aGUgZmx1c2ggaW5kZXggaXMga2VwdCBvdXRzaWRlIHRoZSBmdW5jdGlvbiwgdGhlIHJlZW50cmFudCBjYWxsIHdpbGwgcGlja1xuLy8gICAgdXAgd2hlcmUgdGhlIGVhcmxpZXIgY2FsbCBsZWZ0IG9mZiBhbmQgZ28gdGhyb3VnaCBhbGwgZGlydHkgY29tcG9uZW50cy4gVGhlXG4vLyAgICBjdXJyZW50X2NvbXBvbmVudCB2YWx1ZSBpcyBzYXZlZCBhbmQgcmVzdG9yZWQgc28gdGhhdCB0aGUgcmVlbnRyYW50IGNhbGwgd2lsbFxuLy8gICAgbm90IGludGVyZmVyZSB3aXRoIHRoZSBcInBhcmVudFwiIGZsdXNoKCkgY2FsbC5cbi8vIDIuIGJpbmQ6dGhpcyBjYWxsYmFja3MgY2Fubm90IHRyaWdnZXIgbmV3IGZsdXNoKCkgY2FsbHMuXG4vLyAzLiBEdXJpbmcgYWZ0ZXJVcGRhdGUsIGFueSB1cGRhdGVkIGNvbXBvbmVudHMgd2lsbCBOT1QgaGF2ZSB0aGVpciBhZnRlclVwZGF0ZVxuLy8gICAgY2FsbGJhY2sgY2FsbGVkIGEgc2Vjb25kIHRpbWU7IHRoZSBzZWVuX2NhbGxiYWNrcyBzZXQsIG91dHNpZGUgdGhlIGZsdXNoKClcbi8vICAgIGZ1bmN0aW9uLCBndWFyYW50ZWVzIHRoaXMgYmVoYXZpb3IuXG5jb25zdCBzZWVuX2NhbGxiYWNrcyA9IG5ldyBTZXQoKTtcbmxldCBmbHVzaGlkeCA9IDA7IC8vIERvICpub3QqIG1vdmUgdGhpcyBpbnNpZGUgdGhlIGZsdXNoKCkgZnVuY3Rpb25cbmZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIGNvbnN0IHNhdmVkX2NvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuICAgIGRvIHtcbiAgICAgICAgLy8gZmlyc3QsIGNhbGwgYmVmb3JlVXBkYXRlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBhbmQgdXBkYXRlIGNvbXBvbmVudHNcbiAgICAgICAgd2hpbGUgKGZsdXNoaWR4IDwgZGlydHlfY29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGRpcnR5X2NvbXBvbmVudHNbZmx1c2hpZHhdO1xuICAgICAgICAgICAgZmx1c2hpZHgrKztcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpO1xuICAgICAgICAgICAgdXBkYXRlKGNvbXBvbmVudC4kJCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuICAgICAgICBkaXJ0eV9jb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgICAgIGZsdXNoaWR4ID0gMDtcbiAgICAgICAgd2hpbGUgKGJpbmRpbmdfY2FsbGJhY2tzLmxlbmd0aClcbiAgICAgICAgICAgIGJpbmRpbmdfY2FsbGJhY2tzLnBvcCgpKCk7XG4gICAgICAgIC8vIHRoZW4sIG9uY2UgY29tcG9uZW50cyBhcmUgdXBkYXRlZCwgY2FsbFxuICAgICAgICAvLyBhZnRlclVwZGF0ZSBmdW5jdGlvbnMuIFRoaXMgbWF5IGNhdXNlXG4gICAgICAgIC8vIHN1YnNlcXVlbnQgdXBkYXRlcy4uLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcl9jYWxsYmFja3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcmVuZGVyX2NhbGxiYWNrc1tpXTtcbiAgICAgICAgICAgIGlmICghc2Vlbl9jYWxsYmFja3MuaGFzKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgICAgIC8vIC4uLnNvIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgbG9vcHNcbiAgICAgICAgICAgICAgICBzZWVuX2NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgIH0gd2hpbGUgKGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoKTtcbiAgICB3aGlsZSAoZmx1c2hfY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBmbHVzaF9jYWxsYmFja3MucG9wKCkoKTtcbiAgICB9XG4gICAgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIHNlZW5fY2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHNhdmVkX2NvbXBvbmVudCk7XG59XG5mdW5jdGlvbiB1cGRhdGUoJCQpIHtcbiAgICBpZiAoJCQuZnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgJCQudXBkYXRlKCk7XG4gICAgICAgIHJ1bl9hbGwoJCQuYmVmb3JlX3VwZGF0ZSk7XG4gICAgICAgIGNvbnN0IGRpcnR5ID0gJCQuZGlydHk7XG4gICAgICAgICQkLmRpcnR5ID0gWy0xXTtcbiAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQucCgkJC5jdHgsIGRpcnR5KTtcbiAgICAgICAgJCQuYWZ0ZXJfdXBkYXRlLmZvckVhY2goYWRkX3JlbmRlcl9jYWxsYmFjayk7XG4gICAgfVxufVxuXG5sZXQgcHJvbWlzZTtcbmZ1bmN0aW9uIHdhaXQoKSB7XG4gICAgaWYgKCFwcm9taXNlKSB7XG4gICAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHByb21pc2UgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5mdW5jdGlvbiBkaXNwYXRjaChub2RlLCBkaXJlY3Rpb24sIGtpbmQpIHtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQoY3VzdG9tX2V2ZW50KGAke2RpcmVjdGlvbiA/ICdpbnRybycgOiAnb3V0cm8nfSR7a2luZH1gKSk7XG59XG5jb25zdCBvdXRyb2luZyA9IG5ldyBTZXQoKTtcbmxldCBvdXRyb3M7XG5mdW5jdGlvbiBncm91cF9vdXRyb3MoKSB7XG4gICAgb3V0cm9zID0ge1xuICAgICAgICByOiAwLFxuICAgICAgICBjOiBbXSxcbiAgICAgICAgcDogb3V0cm9zIC8vIHBhcmVudCBncm91cFxuICAgIH07XG59XG5mdW5jdGlvbiBjaGVja19vdXRyb3MoKSB7XG4gICAgaWYgKCFvdXRyb3Mucikge1xuICAgICAgICBydW5fYWxsKG91dHJvcy5jKTtcbiAgICB9XG4gICAgb3V0cm9zID0gb3V0cm9zLnA7XG59XG5mdW5jdGlvbiB0cmFuc2l0aW9uX2luKGJsb2NrLCBsb2NhbCkge1xuICAgIGlmIChibG9jayAmJiBibG9jay5pKSB7XG4gICAgICAgIG91dHJvaW5nLmRlbGV0ZShibG9jayk7XG4gICAgICAgIGJsb2NrLmkobG9jYWwpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyYW5zaXRpb25fb3V0KGJsb2NrLCBsb2NhbCwgZGV0YWNoLCBjYWxsYmFjaykge1xuICAgIGlmIChibG9jayAmJiBibG9jay5vKSB7XG4gICAgICAgIGlmIChvdXRyb2luZy5oYXMoYmxvY2spKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBvdXRyb2luZy5hZGQoYmxvY2spO1xuICAgICAgICBvdXRyb3MuYy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgIG91dHJvaW5nLmRlbGV0ZShibG9jayk7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWNoKVxuICAgICAgICAgICAgICAgICAgICBibG9jay5kKDEpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBibG9jay5vKGxvY2FsKTtcbiAgICB9XG59XG5jb25zdCBudWxsX3RyYW5zaXRpb24gPSB7IGR1cmF0aW9uOiAwIH07XG5mdW5jdGlvbiBjcmVhdGVfaW5fdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSBmYWxzZTtcbiAgICBsZXQgYW5pbWF0aW9uX25hbWU7XG4gICAgbGV0IHRhc2s7XG4gICAgbGV0IHVpZCA9IDA7XG4gICAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICAgICAgaWYgKGFuaW1hdGlvbl9uYW1lKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnbygpIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgdGljayA9IG5vb3AsIGNzcyB9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcbiAgICAgICAgaWYgKGNzcylcbiAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgMCwgMSwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcywgdWlkKyspO1xuICAgICAgICB0aWNrKDAsIDEpO1xuICAgICAgICBjb25zdCBzdGFydF90aW1lID0gbm93KCkgKyBkZWxheTtcbiAgICAgICAgY29uc3QgZW5kX3RpbWUgPSBzdGFydF90aW1lICsgZHVyYXRpb247XG4gICAgICAgIGlmICh0YXNrKVxuICAgICAgICAgICAgdGFzay5hYm9ydCgpO1xuICAgICAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCB0cnVlLCAnc3RhcnQnKSk7XG4gICAgICAgIHRhc2sgPSBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChub3cgPj0gZW5kX3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGljaygxLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgdHJ1ZSwgJ2VuZCcpO1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub3cgPj0gc3RhcnRfdGltZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZWFzaW5nKChub3cgLSBzdGFydF90aW1lKSAvIGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgdGljayh0LCAxIC0gdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJ1bm5pbmc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgc3RhcnRlZCA9IGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0KCkge1xuICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlKTtcbiAgICAgICAgICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICAgICAgd2FpdCgpLnRoZW4oZ28pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ28oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW5kKCkge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBjb25zdCBncm91cCA9IG91dHJvcztcbiAgICBncm91cC5yICs9IDE7XG4gICAgZnVuY3Rpb24gZ28oKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGlmIChjc3MpXG4gICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDEsIDAsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICBjb25zdCBzdGFydF90aW1lID0gbm93KCkgKyBkZWxheTtcbiAgICAgICAgY29uc3QgZW5kX3RpbWUgPSBzdGFydF90aW1lICsgZHVyYXRpb247XG4gICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdzdGFydCcpKTtcbiAgICAgICAgbG9vcChub3cgPT4ge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93ID49IGVuZF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIGZhbHNlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghLS1ncm91cC5yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgcmVzdWx0IGluIGBlbmQoKWAgYmVpbmcgY2FsbGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBjbGVhbiB1cCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5fYWxsKGdyb3VwLmMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEgLSB0LCB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgIHdhaXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZygpO1xuICAgICAgICAgICAgZ28oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnbygpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBlbmQocmVzZXQpIHtcbiAgICAgICAgICAgIGlmIChyZXNldCAmJiBjb25maWcudGljaykge1xuICAgICAgICAgICAgICAgIGNvbmZpZy50aWNrKDEsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUsIGFuaW1hdGlvbl9uYW1lKTtcbiAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zLCBpbnRybykge1xuICAgIGxldCBjb25maWcgPSBmbihub2RlLCBwYXJhbXMpO1xuICAgIGxldCB0ID0gaW50cm8gPyAwIDogMTtcbiAgICBsZXQgcnVubmluZ19wcm9ncmFtID0gbnVsbDtcbiAgICBsZXQgcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICBsZXQgYW5pbWF0aW9uX25hbWUgPSBudWxsO1xuICAgIGZ1bmN0aW9uIGNsZWFyX2FuaW1hdGlvbigpIHtcbiAgICAgICAgaWYgKGFuaW1hdGlvbl9uYW1lKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbml0KHByb2dyYW0sIGR1cmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGQgPSAocHJvZ3JhbS5iIC0gdCk7XG4gICAgICAgIGR1cmF0aW9uICo9IE1hdGguYWJzKGQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYTogdCxcbiAgICAgICAgICAgIGI6IHByb2dyYW0uYixcbiAgICAgICAgICAgIGQsXG4gICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgIHN0YXJ0OiBwcm9ncmFtLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBwcm9ncmFtLnN0YXJ0ICsgZHVyYXRpb24sXG4gICAgICAgICAgICBncm91cDogcHJvZ3JhbS5ncm91cFxuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnbyhiKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB7XG4gICAgICAgICAgICBzdGFydDogbm93KCkgKyBkZWxheSxcbiAgICAgICAgICAgIGJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFiKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHRvZG86IGltcHJvdmUgdHlwaW5nc1xuICAgICAgICAgICAgcHJvZ3JhbS5ncm91cCA9IG91dHJvcztcbiAgICAgICAgICAgIG91dHJvcy5yICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bm5pbmdfcHJvZ3JhbSB8fCBwZW5kaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgIHBlbmRpbmdfcHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGludHJvLCBhbmQgdGhlcmUncyBhIGRlbGF5LCB3ZSBuZWVkIHRvIGRvXG4gICAgICAgICAgICAvLyBhbiBpbml0aWFsIHRpY2sgYW5kL29yIGFwcGx5IENTUyBhbmltYXRpb24gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIHQsIGIsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGIpXG4gICAgICAgICAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IGluaXQocHJvZ3JhbSwgZHVyYXRpb24pO1xuICAgICAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCBiLCAnc3RhcnQnKSk7XG4gICAgICAgICAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdfcHJvZ3JhbSAmJiBub3cgPiBwZW5kaW5nX3Byb2dyYW0uc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gaW5pdChwZW5kaW5nX3Byb2dyYW0sIGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgcnVubmluZ19wcm9ncmFtLmIsICdzdGFydCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3NzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgdCwgcnVubmluZ19wcm9ncmFtLmIsIHJ1bm5pbmdfcHJvZ3JhbS5kdXJhdGlvbiwgMCwgZWFzaW5nLCBjb25maWcuY3NzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub3cgPj0gcnVubmluZ19wcm9ncmFtLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGljayh0ID0gcnVubmluZ19wcm9ncmFtLmIsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIHJ1bm5pbmdfcHJvZ3JhbS5iLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGRvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtLmIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cm8gXHUyMDE0IHdlIGNhbiB0aWR5IHVwIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cm8gXHUyMDE0IG5lZWRzIHRvIGJlIGNvb3JkaW5hdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghLS1ydW5uaW5nX3Byb2dyYW0uZ3JvdXAucilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hbGwocnVubmluZ19wcm9ncmFtLmdyb3VwLmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm93ID49IHJ1bm5pbmdfcHJvZ3JhbS5zdGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IG5vdyAtIHJ1bm5pbmdfcHJvZ3JhbS5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBydW5uaW5nX3Byb2dyYW0uYSArIHJ1bm5pbmdfcHJvZ3JhbS5kICogZWFzaW5nKHAgLyBydW5uaW5nX3Byb2dyYW0uZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGljayh0LCAxIC0gdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhKHJ1bm5pbmdfcHJvZ3JhbSB8fCBwZW5kaW5nX3Byb2dyYW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcnVuKGIpIHtcbiAgICAgICAgICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgd2FpdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZygpO1xuICAgICAgICAgICAgICAgICAgICBnbyhiKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGdvKGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbmQoKSB7XG4gICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IHBlbmRpbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBoYW5kbGVfcHJvbWlzZShwcm9taXNlLCBpbmZvKSB7XG4gICAgY29uc3QgdG9rZW4gPSBpbmZvLnRva2VuID0ge307XG4gICAgZnVuY3Rpb24gdXBkYXRlKHR5cGUsIGluZGV4LCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChpbmZvLnRva2VuICE9PSB0b2tlbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaW5mby5yZXNvbHZlZCA9IHZhbHVlO1xuICAgICAgICBsZXQgY2hpbGRfY3R4ID0gaW5mby5jdHg7XG4gICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2hpbGRfY3R4ID0gY2hpbGRfY3R4LnNsaWNlKCk7XG4gICAgICAgICAgICBjaGlsZF9jdHhba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJsb2NrID0gdHlwZSAmJiAoaW5mby5jdXJyZW50ID0gdHlwZSkoY2hpbGRfY3R4KTtcbiAgICAgICAgbGV0IG5lZWRzX2ZsdXNoID0gZmFsc2U7XG4gICAgICAgIGlmIChpbmZvLmJsb2NrKSB7XG4gICAgICAgICAgICBpZiAoaW5mby5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICBpbmZvLmJsb2Nrcy5mb3JFYWNoKChibG9jaywgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gaW5kZXggJiYgYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX291dHJvcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbl9vdXQoYmxvY2ssIDEsIDEsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5ibG9ja3NbaV0gPT09IGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYmxvY2tzW2ldID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX291dHJvcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmZvLmJsb2NrLmQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBibG9jay5jKCk7XG4gICAgICAgICAgICB0cmFuc2l0aW9uX2luKGJsb2NrLCAxKTtcbiAgICAgICAgICAgIGJsb2NrLm0oaW5mby5tb3VudCgpLCBpbmZvLmFuY2hvcik7XG4gICAgICAgICAgICBuZWVkc19mbHVzaCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5ibG9jayA9IGJsb2NrO1xuICAgICAgICBpZiAoaW5mby5ibG9ja3MpXG4gICAgICAgICAgICBpbmZvLmJsb2Nrc1tpbmRleF0gPSBibG9jaztcbiAgICAgICAgaWYgKG5lZWRzX2ZsdXNoKSB7XG4gICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc19wcm9taXNlKHByb21pc2UpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRfY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgICAgIHByb21pc2UudGhlbih2YWx1ZSA9PiB7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY3VycmVudF9jb21wb25lbnQpO1xuICAgICAgICAgICAgdXBkYXRlKGluZm8udGhlbiwgMSwgaW5mby52YWx1ZSwgdmFsdWUpO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY3VycmVudF9jb21wb25lbnQpO1xuICAgICAgICAgICAgdXBkYXRlKGluZm8uY2F0Y2gsIDIsIGluZm8uZXJyb3IsIGVycm9yKTtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcbiAgICAgICAgICAgIGlmICghaW5mby5oYXNDYXRjaCkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYgd2UgcHJldmlvdXNseSBoYWQgYSB0aGVuL2NhdGNoIGJsb2NrLCBkZXN0cm95IGl0XG4gICAgICAgIGlmIChpbmZvLmN1cnJlbnQgIT09IGluZm8ucGVuZGluZykge1xuICAgICAgICAgICAgdXBkYXRlKGluZm8ucGVuZGluZywgMCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGluZm8uY3VycmVudCAhPT0gaW5mby50aGVuKSB7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby50aGVuLCAxLCBpbmZvLnZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGluZm8ucmVzb2x2ZWQgPSBwcm9taXNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZV9hd2FpdF9ibG9ja19icmFuY2goaW5mbywgY3R4LCBkaXJ0eSkge1xuICAgIGNvbnN0IGNoaWxkX2N0eCA9IGN0eC5zbGljZSgpO1xuICAgIGNvbnN0IHsgcmVzb2x2ZWQgfSA9IGluZm87XG4gICAgaWYgKGluZm8uY3VycmVudCA9PT0gaW5mby50aGVuKSB7XG4gICAgICAgIGNoaWxkX2N0eFtpbmZvLnZhbHVlXSA9IHJlc29sdmVkO1xuICAgIH1cbiAgICBpZiAoaW5mby5jdXJyZW50ID09PSBpbmZvLmNhdGNoKSB7XG4gICAgICAgIGNoaWxkX2N0eFtpbmZvLmVycm9yXSA9IHJlc29sdmVkO1xuICAgIH1cbiAgICBpbmZvLmJsb2NrLnAoY2hpbGRfY3R4LCBkaXJ0eSk7XG59XG5cbmNvbnN0IGdsb2JhbHMgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IHdpbmRvd1xuICAgIDogdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gZ2xvYmFsVGhpc1xuICAgICAgICA6IGdsb2JhbCk7XG5cbmZ1bmN0aW9uIGRlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmQoMSk7XG4gICAgbG9va3VwLmRlbGV0ZShibG9jay5rZXkpO1xufVxuZnVuY3Rpb24gb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIHRyYW5zaXRpb25fb3V0KGJsb2NrLCAxLCAxLCAoKSA9PiB7XG4gICAgICAgIGxvb2t1cC5kZWxldGUoYmxvY2sua2V5KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGZpeF9hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZigpO1xuICAgIGRlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCk7XG59XG5mdW5jdGlvbiBmaXhfYW5kX291dHJvX2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5mKCk7XG4gICAgb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCk7XG59XG5mdW5jdGlvbiB1cGRhdGVfa2V5ZWRfZWFjaChvbGRfYmxvY2tzLCBkaXJ0eSwgZ2V0X2tleSwgZHluYW1pYywgY3R4LCBsaXN0LCBsb29rdXAsIG5vZGUsIGRlc3Ryb3ksIGNyZWF0ZV9lYWNoX2Jsb2NrLCBuZXh0LCBnZXRfY29udGV4dCkge1xuICAgIGxldCBvID0gb2xkX2Jsb2Nrcy5sZW5ndGg7XG4gICAgbGV0IG4gPSBsaXN0Lmxlbmd0aDtcbiAgICBsZXQgaSA9IG87XG4gICAgY29uc3Qgb2xkX2luZGV4ZXMgPSB7fTtcbiAgICB3aGlsZSAoaS0tKVxuICAgICAgICBvbGRfaW5kZXhlc1tvbGRfYmxvY2tzW2ldLmtleV0gPSBpO1xuICAgIGNvbnN0IG5ld19ibG9ja3MgPSBbXTtcbiAgICBjb25zdCBuZXdfbG9va3VwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGRlbHRhcyA9IG5ldyBNYXAoKTtcbiAgICBpID0gbjtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkX2N0eCA9IGdldF9jb250ZXh0KGN0eCwgbGlzdCwgaSk7XG4gICAgICAgIGNvbnN0IGtleSA9IGdldF9rZXkoY2hpbGRfY3R4KTtcbiAgICAgICAgbGV0IGJsb2NrID0gbG9va3VwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWJsb2NrKSB7XG4gICAgICAgICAgICBibG9jayA9IGNyZWF0ZV9lYWNoX2Jsb2NrKGtleSwgY2hpbGRfY3R4KTtcbiAgICAgICAgICAgIGJsb2NrLmMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkeW5hbWljKSB7XG4gICAgICAgICAgICBibG9jay5wKGNoaWxkX2N0eCwgZGlydHkpO1xuICAgICAgICB9XG4gICAgICAgIG5ld19sb29rdXAuc2V0KGtleSwgbmV3X2Jsb2Nrc1tpXSA9IGJsb2NrKTtcbiAgICAgICAgaWYgKGtleSBpbiBvbGRfaW5kZXhlcylcbiAgICAgICAgICAgIGRlbHRhcy5zZXQoa2V5LCBNYXRoLmFicyhpIC0gb2xkX2luZGV4ZXNba2V5XSkpO1xuICAgIH1cbiAgICBjb25zdCB3aWxsX21vdmUgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgZGlkX21vdmUgPSBuZXcgU2V0KCk7XG4gICAgZnVuY3Rpb24gaW5zZXJ0KGJsb2NrKSB7XG4gICAgICAgIHRyYW5zaXRpb25faW4oYmxvY2ssIDEpO1xuICAgICAgICBibG9jay5tKG5vZGUsIG5leHQpO1xuICAgICAgICBsb29rdXAuc2V0KGJsb2NrLmtleSwgYmxvY2spO1xuICAgICAgICBuZXh0ID0gYmxvY2suZmlyc3Q7XG4gICAgICAgIG4tLTtcbiAgICB9XG4gICAgd2hpbGUgKG8gJiYgbikge1xuICAgICAgICBjb25zdCBuZXdfYmxvY2sgPSBuZXdfYmxvY2tzW24gLSAxXTtcbiAgICAgICAgY29uc3Qgb2xkX2Jsb2NrID0gb2xkX2Jsb2Nrc1tvIC0gMV07XG4gICAgICAgIGNvbnN0IG5ld19rZXkgPSBuZXdfYmxvY2sua2V5O1xuICAgICAgICBjb25zdCBvbGRfa2V5ID0gb2xkX2Jsb2NrLmtleTtcbiAgICAgICAgaWYgKG5ld19ibG9jayA9PT0gb2xkX2Jsb2NrKSB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgICBuZXh0ID0gbmV3X2Jsb2NrLmZpcnN0O1xuICAgICAgICAgICAgby0tO1xuICAgICAgICAgICAgbi0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFuZXdfbG9va3VwLmhhcyhvbGRfa2V5KSkge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCBibG9ja1xuICAgICAgICAgICAgZGVzdHJveShvbGRfYmxvY2ssIGxvb2t1cCk7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWxvb2t1cC5oYXMobmV3X2tleSkgfHwgd2lsbF9tb3ZlLmhhcyhuZXdfa2V5KSkge1xuICAgICAgICAgICAgaW5zZXJ0KG5ld19ibG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlkX21vdmUuaGFzKG9sZF9rZXkpKSB7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGVsdGFzLmdldChuZXdfa2V5KSA+IGRlbHRhcy5nZXQob2xkX2tleSkpIHtcbiAgICAgICAgICAgIGRpZF9tb3ZlLmFkZChuZXdfa2V5KTtcbiAgICAgICAgICAgIGluc2VydChuZXdfYmxvY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2lsbF9tb3ZlLmFkZChvbGRfa2V5KTtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoby0tKSB7XG4gICAgICAgIGNvbnN0IG9sZF9ibG9jayA9IG9sZF9ibG9ja3Nbb107XG4gICAgICAgIGlmICghbmV3X2xvb2t1cC5oYXMob2xkX2Jsb2NrLmtleSkpXG4gICAgICAgICAgICBkZXN0cm95KG9sZF9ibG9jaywgbG9va3VwKTtcbiAgICB9XG4gICAgd2hpbGUgKG4pXG4gICAgICAgIGluc2VydChuZXdfYmxvY2tzW24gLSAxXSk7XG4gICAgcmV0dXJuIG5ld19ibG9ja3M7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9lYWNoX2tleXMoY3R4LCBsaXN0LCBnZXRfY29udGV4dCwgZ2V0X2tleSkge1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGdldF9rZXkoZ2V0X2NvbnRleHQoY3R4LCBsaXN0LCBpKSk7XG4gICAgICAgIGlmIChrZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBoYXZlIGR1cGxpY2F0ZSBrZXlzIGluIGEga2V5ZWQgZWFjaCcpO1xuICAgICAgICB9XG4gICAgICAgIGtleXMuYWRkKGtleSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRfc3ByZWFkX3VwZGF0ZShsZXZlbHMsIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB1cGRhdGUgPSB7fTtcbiAgICBjb25zdCB0b19udWxsX291dCA9IHt9O1xuICAgIGNvbnN0IGFjY291bnRlZF9mb3IgPSB7ICQkc2NvcGU6IDEgfTtcbiAgICBsZXQgaSA9IGxldmVscy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBjb25zdCBvID0gbGV2ZWxzW2ldO1xuICAgICAgICBjb25zdCBuID0gdXBkYXRlc1tpXTtcbiAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG8pIHtcbiAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gbikpXG4gICAgICAgICAgICAgICAgICAgIHRvX251bGxfb3V0W2tleV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbikge1xuICAgICAgICAgICAgICAgIGlmICghYWNjb3VudGVkX2ZvcltrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVtrZXldID0gbltrZXldO1xuICAgICAgICAgICAgICAgICAgICBhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldmVsc1tpXSA9IG47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvKSB7XG4gICAgICAgICAgICAgICAgYWNjb3VudGVkX2ZvcltrZXldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0b19udWxsX291dCkge1xuICAgICAgICBpZiAoIShrZXkgaW4gdXBkYXRlKSlcbiAgICAgICAgICAgIHVwZGF0ZVtrZXldID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdXBkYXRlO1xufVxuZnVuY3Rpb24gZ2V0X3NwcmVhZF9vYmplY3Qoc3ByZWFkX3Byb3BzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzcHJlYWRfcHJvcHMgPT09ICdvYmplY3QnICYmIHNwcmVhZF9wcm9wcyAhPT0gbnVsbCA/IHNwcmVhZF9wcm9wcyA6IHt9O1xufVxuXG4vLyBzb3VyY2U6IGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZGljZXMuaHRtbFxuY29uc3QgYm9vbGVhbl9hdHRyaWJ1dGVzID0gbmV3IFNldChbXG4gICAgJ2FsbG93ZnVsbHNjcmVlbicsXG4gICAgJ2FsbG93cGF5bWVudHJlcXVlc3QnLFxuICAgICdhc3luYycsXG4gICAgJ2F1dG9mb2N1cycsXG4gICAgJ2F1dG9wbGF5JyxcbiAgICAnY2hlY2tlZCcsXG4gICAgJ2NvbnRyb2xzJyxcbiAgICAnZGVmYXVsdCcsXG4gICAgJ2RlZmVyJyxcbiAgICAnZGlzYWJsZWQnLFxuICAgICdmb3Jtbm92YWxpZGF0ZScsXG4gICAgJ2hpZGRlbicsXG4gICAgJ2lzbWFwJyxcbiAgICAnbG9vcCcsXG4gICAgJ211bHRpcGxlJyxcbiAgICAnbXV0ZWQnLFxuICAgICdub21vZHVsZScsXG4gICAgJ25vdmFsaWRhdGUnLFxuICAgICdvcGVuJyxcbiAgICAncGxheXNpbmxpbmUnLFxuICAgICdyZWFkb25seScsXG4gICAgJ3JlcXVpcmVkJyxcbiAgICAncmV2ZXJzZWQnLFxuICAgICdzZWxlY3RlZCdcbl0pO1xuXG5jb25zdCB2b2lkX2VsZW1lbnRfbmFtZXMgPSAvXig/OmFyZWF8YmFzZXxicnxjb2x8Y29tbWFuZHxlbWJlZHxocnxpbWd8aW5wdXR8a2V5Z2VufGxpbmt8bWV0YXxwYXJhbXxzb3VyY2V8dHJhY2t8d2JyKSQvO1xuZnVuY3Rpb24gaXNfdm9pZChuYW1lKSB7XG4gICAgcmV0dXJuIHZvaWRfZWxlbWVudF9uYW1lcy50ZXN0KG5hbWUpIHx8IG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJyFkb2N0eXBlJztcbn1cblxuY29uc3QgaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIgPSAvW1xccydcIj4vPVxcdXtGREQwfS1cXHV7RkRFRn1cXHV7RkZGRX1cXHV7RkZGRn1cXHV7MUZGRkV9XFx1ezFGRkZGfVxcdXsyRkZGRX1cXHV7MkZGRkZ9XFx1ezNGRkZFfVxcdXszRkZGRn1cXHV7NEZGRkV9XFx1ezRGRkZGfVxcdXs1RkZGRX1cXHV7NUZGRkZ9XFx1ezZGRkZFfVxcdXs2RkZGRn1cXHV7N0ZGRkV9XFx1ezdGRkZGfVxcdXs4RkZGRX1cXHV7OEZGRkZ9XFx1ezlGRkZFfVxcdXs5RkZGRn1cXHV7QUZGRkV9XFx1e0FGRkZGfVxcdXtCRkZGRX1cXHV7QkZGRkZ9XFx1e0NGRkZFfVxcdXtDRkZGRn1cXHV7REZGRkV9XFx1e0RGRkZGfVxcdXtFRkZGRX1cXHV7RUZGRkZ9XFx1e0ZGRkZFfVxcdXtGRkZGRn1cXHV7MTBGRkZFfVxcdXsxMEZGRkZ9XS91O1xuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yXG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jbm9uY2hhcmFjdGVyXG5mdW5jdGlvbiBzcHJlYWQoYXJncywgYXR0cnNfdG9fYWRkKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpO1xuICAgIGlmIChhdHRyc190b19hZGQpIHtcbiAgICAgICAgY29uc3QgY2xhc3Nlc190b19hZGQgPSBhdHRyc190b19hZGQuY2xhc3NlcztcbiAgICAgICAgY29uc3Qgc3R5bGVzX3RvX2FkZCA9IGF0dHJzX3RvX2FkZC5zdHlsZXM7XG4gICAgICAgIGlmIChjbGFzc2VzX3RvX2FkZCkge1xuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY2xhc3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuY2xhc3MgPSBjbGFzc2VzX3RvX2FkZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuY2xhc3MgKz0gJyAnICsgY2xhc3Nlc190b19hZGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0eWxlc190b19hZGQpIHtcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLnN0eWxlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnN0eWxlID0gc3R5bGVfb2JqZWN0X3RvX3N0cmluZyhzdHlsZXNfdG9fYWRkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuc3R5bGUgPSBzdHlsZV9vYmplY3RfdG9fc3RyaW5nKG1lcmdlX3Nzcl9zdHlsZXMoYXR0cmlidXRlcy5zdHlsZSwgc3R5bGVzX3RvX2FkZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzdHIgPSAnJztcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBpZiAoaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIudGVzdChuYW1lKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICBzdHIgKz0gJyAnICsgbmFtZTtcbiAgICAgICAgZWxzZSBpZiAoYm9vbGVhbl9hdHRyaWJ1dGVzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgc3RyICs9ICcgJyArIG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3RyICs9IGAgJHtuYW1lfT1cIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbn1cbmZ1bmN0aW9uIG1lcmdlX3Nzcl9zdHlsZXMoc3R5bGVfYXR0cmlidXRlLCBzdHlsZV9kaXJlY3RpdmUpIHtcbiAgICBjb25zdCBzdHlsZV9vYmplY3QgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGluZGl2aWR1YWxfc3R5bGUgb2Ygc3R5bGVfYXR0cmlidXRlLnNwbGl0KCc7JykpIHtcbiAgICAgICAgY29uc3QgY29sb25faW5kZXggPSBpbmRpdmlkdWFsX3N0eWxlLmluZGV4T2YoJzonKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IGluZGl2aWR1YWxfc3R5bGUuc2xpY2UoMCwgY29sb25faW5kZXgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpbmRpdmlkdWFsX3N0eWxlLnNsaWNlKGNvbG9uX2luZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICBpZiAoIW5hbWUpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgc3R5bGVfb2JqZWN0W25hbWVdID0gdmFsdWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbmFtZSBpbiBzdHlsZV9kaXJlY3RpdmUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzdHlsZV9kaXJlY3RpdmVbbmFtZV07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgc3R5bGVfb2JqZWN0W25hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgc3R5bGVfb2JqZWN0W25hbWVdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHlsZV9vYmplY3Q7XG59XG5jb25zdCBlc2NhcGVkID0ge1xuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnLFxuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7J1xufTtcbmZ1bmN0aW9uIGVzY2FwZShodG1sKSB7XG4gICAgcmV0dXJuIFN0cmluZyhodG1sKS5yZXBsYWNlKC9bXCInJjw+XS9nLCBtYXRjaCA9PiBlc2NhcGVkW21hdGNoXSk7XG59XG5mdW5jdGlvbiBlc2NhcGVfYXR0cmlidXRlX3ZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBlc2NhcGUodmFsdWUpIDogdmFsdWU7XG59XG5mdW5jdGlvbiBlc2NhcGVfb2JqZWN0KG9iaikge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICByZXN1bHRba2V5XSA9IGVzY2FwZV9hdHRyaWJ1dGVfdmFsdWUob2JqW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZWFjaChpdGVtcywgZm4pIHtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBzdHIgKz0gZm4oaXRlbXNbaV0sIGkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuY29uc3QgbWlzc2luZ19jb21wb25lbnQgPSB7XG4gICAgJCRyZW5kZXI6ICgpID0+ICcnXG59O1xuZnVuY3Rpb24gdmFsaWRhdGVfY29tcG9uZW50KGNvbXBvbmVudCwgbmFtZSkge1xuICAgIGlmICghY29tcG9uZW50IHx8ICFjb21wb25lbnQuJCRyZW5kZXIpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdzdmVsdGU6Y29tcG9uZW50JylcbiAgICAgICAgICAgIG5hbWUgKz0gJyB0aGlzPXsuLi59JztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGA8JHtuYW1lfT4gaXMgbm90IGEgdmFsaWQgU1NSIGNvbXBvbmVudC4gWW91IG1heSBuZWVkIHRvIHJldmlldyB5b3VyIGJ1aWxkIGNvbmZpZyB0byBlbnN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGNvbXBpbGVkLCByYXRoZXIgdGhhbiBpbXBvcnRlZCBhcyBwcmUtY29tcGlsZWQgbW9kdWxlc2ApO1xuICAgIH1cbiAgICByZXR1cm4gY29tcG9uZW50O1xufVxuZnVuY3Rpb24gZGVidWcoZmlsZSwgbGluZSwgY29sdW1uLCB2YWx1ZXMpIHtcbiAgICBjb25zb2xlLmxvZyhge0BkZWJ1Z30gJHtmaWxlID8gZmlsZSArICcgJyA6ICcnfSgke2xpbmV9OiR7Y29sdW1ufSlgKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2codmFsdWVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgcmV0dXJuICcnO1xufVxubGV0IG9uX2Rlc3Ryb3k7XG5mdW5jdGlvbiBjcmVhdGVfc3NyX2NvbXBvbmVudChmbikge1xuICAgIGZ1bmN0aW9uICQkcmVuZGVyKHJlc3VsdCwgcHJvcHMsIGJpbmRpbmdzLCBzbG90cywgY29udGV4dCkge1xuICAgICAgICBjb25zdCBwYXJlbnRfY29tcG9uZW50ID0gY3VycmVudF9jb21wb25lbnQ7XG4gICAgICAgIGNvbnN0ICQkID0ge1xuICAgICAgICAgICAgb25fZGVzdHJveSxcbiAgICAgICAgICAgIGNvbnRleHQ6IG5ldyBNYXAoY29udGV4dCB8fCAocGFyZW50X2NvbXBvbmVudCA/IHBhcmVudF9jb21wb25lbnQuJCQuY29udGV4dCA6IFtdKSksXG4gICAgICAgICAgICAvLyB0aGVzZSB3aWxsIGJlIGltbWVkaWF0ZWx5IGRpc2NhcmRlZFxuICAgICAgICAgICAgb25fbW91bnQ6IFtdLFxuICAgICAgICAgICAgYmVmb3JlX3VwZGF0ZTogW10sXG4gICAgICAgICAgICBhZnRlcl91cGRhdGU6IFtdLFxuICAgICAgICAgICAgY2FsbGJhY2tzOiBibGFua19vYmplY3QoKVxuICAgICAgICB9O1xuICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoeyAkJCB9KTtcbiAgICAgICAgY29uc3QgaHRtbCA9IGZuKHJlc3VsdCwgcHJvcHMsIGJpbmRpbmdzLCBzbG90cyk7XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChwYXJlbnRfY29tcG9uZW50KTtcbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJlbmRlcjogKHByb3BzID0ge30sIHsgJCRzbG90cyA9IHt9LCBjb250ZXh0ID0gbmV3IE1hcCgpIH0gPSB7fSkgPT4ge1xuICAgICAgICAgICAgb25fZGVzdHJveSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB0aXRsZTogJycsIGhlYWQ6ICcnLCBjc3M6IG5ldyBTZXQoKSB9O1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9ICQkcmVuZGVyKHJlc3VsdCwgcHJvcHMsIHt9LCAkJHNsb3RzLCBjb250ZXh0KTtcbiAgICAgICAgICAgIHJ1bl9hbGwob25fZGVzdHJveSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGh0bWwsXG4gICAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IEFycmF5LmZyb20ocmVzdWx0LmNzcykubWFwKGNzcyA9PiBjc3MuY29kZSkuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgICAgIG1hcDogbnVsbCAvLyBUT0RPXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoZWFkOiByZXN1bHQudGl0bGUgKyByZXN1bHQuaGVhZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgJCRyZW5kZXJcbiAgICB9O1xufVxuZnVuY3Rpb24gYWRkX2F0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgYm9vbGVhbikge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IChib29sZWFuICYmICF2YWx1ZSkpXG4gICAgICAgIHJldHVybiAnJztcbiAgICBjb25zdCBhc3NpZ25tZW50ID0gKGJvb2xlYW4gJiYgdmFsdWUgPT09IHRydWUpID8gJycgOiBgPVwiJHtlc2NhcGVfYXR0cmlidXRlX3ZhbHVlKHZhbHVlLnRvU3RyaW5nKCkpfVwiYDtcbiAgICByZXR1cm4gYCAke25hbWV9JHthc3NpZ25tZW50fWA7XG59XG5mdW5jdGlvbiBhZGRfY2xhc3NlcyhjbGFzc2VzKSB7XG4gICAgcmV0dXJuIGNsYXNzZXMgPyBgIGNsYXNzPVwiJHtjbGFzc2VzfVwiYCA6ICcnO1xufVxuZnVuY3Rpb24gc3R5bGVfb2JqZWN0X3RvX3N0cmluZyhzdHlsZV9vYmplY3QpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc3R5bGVfb2JqZWN0KVxuICAgICAgICAuZmlsdGVyKGtleSA9PiBzdHlsZV9vYmplY3Rba2V5XSlcbiAgICAgICAgLm1hcChrZXkgPT4gYCR7a2V5fTogJHtzdHlsZV9vYmplY3Rba2V5XX07YClcbiAgICAgICAgLmpvaW4oJyAnKTtcbn1cbmZ1bmN0aW9uIGFkZF9zdHlsZXMoc3R5bGVfb2JqZWN0KSB7XG4gICAgY29uc3Qgc3R5bGVzID0gc3R5bGVfb2JqZWN0X3RvX3N0cmluZyhzdHlsZV9vYmplY3QpO1xuICAgIHJldHVybiBzdHlsZXMgPyBgIHN0eWxlPVwiJHtzdHlsZXN9XCJgIDogJyc7XG59XG5cbmZ1bmN0aW9uIGJpbmQoY29tcG9uZW50LCBuYW1lLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGluZGV4ID0gY29tcG9uZW50LiQkLnByb3BzW25hbWVdO1xuICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbXBvbmVudC4kJC5ib3VuZFtpbmRleF0gPSBjYWxsYmFjaztcbiAgICAgICAgY2FsbGJhY2soY29tcG9uZW50LiQkLmN0eFtpbmRleF0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZV9jb21wb25lbnQoYmxvY2spIHtcbiAgICBibG9jayAmJiBibG9jay5jKCk7XG59XG5mdW5jdGlvbiBjbGFpbV9jb21wb25lbnQoYmxvY2ssIHBhcmVudF9ub2Rlcykge1xuICAgIGJsb2NrICYmIGJsb2NrLmwocGFyZW50X25vZGVzKTtcbn1cbmZ1bmN0aW9uIG1vdW50X2NvbXBvbmVudChjb21wb25lbnQsIHRhcmdldCwgYW5jaG9yLCBjdXN0b21FbGVtZW50KSB7XG4gICAgY29uc3QgeyBmcmFnbWVudCwgb25fbW91bnQsIG9uX2Rlc3Ryb3ksIGFmdGVyX3VwZGF0ZSB9ID0gY29tcG9uZW50LiQkO1xuICAgIGZyYWdtZW50ICYmIGZyYWdtZW50Lm0odGFyZ2V0LCBhbmNob3IpO1xuICAgIGlmICghY3VzdG9tRWxlbWVudCkge1xuICAgICAgICAvLyBvbk1vdW50IGhhcHBlbnMgYmVmb3JlIHRoZSBpbml0aWFsIGFmdGVyVXBkYXRlXG4gICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3X29uX2Rlc3Ryb3kgPSBvbl9tb3VudC5tYXAocnVuKS5maWx0ZXIoaXNfZnVuY3Rpb24pO1xuICAgICAgICAgICAgaWYgKG9uX2Rlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgICBvbl9kZXN0cm95LnB1c2goLi4ubmV3X29uX2Rlc3Ryb3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRWRnZSBjYXNlIC0gY29tcG9uZW50IHdhcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHksXG4gICAgICAgICAgICAgICAgLy8gbW9zdCBsaWtlbHkgYXMgYSByZXN1bHQgb2YgYSBiaW5kaW5nIGluaXRpYWxpc2luZ1xuICAgICAgICAgICAgICAgIHJ1bl9hbGwobmV3X29uX2Rlc3Ryb3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9uZW50LiQkLm9uX21vdW50ID0gW107XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lfY29tcG9uZW50KGNvbXBvbmVudCwgZGV0YWNoaW5nKSB7XG4gICAgY29uc3QgJCQgPSBjb21wb25lbnQuJCQ7XG4gICAgaWYgKCQkLmZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHJ1bl9hbGwoJCQub25fZGVzdHJveSk7XG4gICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LmQoZGV0YWNoaW5nKTtcbiAgICAgICAgLy8gVE9ETyBudWxsIG91dCBvdGhlciByZWZzLCBpbmNsdWRpbmcgY29tcG9uZW50LiQkIChidXQgbmVlZCB0b1xuICAgICAgICAvLyBwcmVzZXJ2ZSBmaW5hbCBzdGF0ZT8pXG4gICAgICAgICQkLm9uX2Rlc3Ryb3kgPSAkJC5mcmFnbWVudCA9IG51bGw7XG4gICAgICAgICQkLmN0eCA9IFtdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1ha2VfZGlydHkoY29tcG9uZW50LCBpKSB7XG4gICAgaWYgKGNvbXBvbmVudC4kJC5kaXJ0eVswXSA9PT0gLTEpIHtcbiAgICAgICAgZGlydHlfY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgICAgICBjb21wb25lbnQuJCQuZGlydHkuZmlsbCgwKTtcbiAgICB9XG4gICAgY29tcG9uZW50LiQkLmRpcnR5WyhpIC8gMzEpIHwgMF0gfD0gKDEgPDwgKGkgJSAzMSkpO1xufVxuZnVuY3Rpb24gaW5pdChjb21wb25lbnQsIG9wdGlvbnMsIGluc3RhbmNlLCBjcmVhdGVfZnJhZ21lbnQsIG5vdF9lcXVhbCwgcHJvcHMsIGFwcGVuZF9zdHlsZXMsIGRpcnR5ID0gWy0xXSkge1xuICAgIGNvbnN0IHBhcmVudF9jb21wb25lbnQgPSBjdXJyZW50X2NvbXBvbmVudDtcbiAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTtcbiAgICBjb25zdCAkJCA9IGNvbXBvbmVudC4kJCA9IHtcbiAgICAgICAgZnJhZ21lbnQ6IG51bGwsXG4gICAgICAgIGN0eDogbnVsbCxcbiAgICAgICAgLy8gc3RhdGVcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIHVwZGF0ZTogbm9vcCxcbiAgICAgICAgbm90X2VxdWFsLFxuICAgICAgICBib3VuZDogYmxhbmtfb2JqZWN0KCksXG4gICAgICAgIC8vIGxpZmVjeWNsZVxuICAgICAgICBvbl9tb3VudDogW10sXG4gICAgICAgIG9uX2Rlc3Ryb3k6IFtdLFxuICAgICAgICBvbl9kaXNjb25uZWN0OiBbXSxcbiAgICAgICAgYmVmb3JlX3VwZGF0ZTogW10sXG4gICAgICAgIGFmdGVyX3VwZGF0ZTogW10sXG4gICAgICAgIGNvbnRleHQ6IG5ldyBNYXAob3B0aW9ucy5jb250ZXh0IHx8IChwYXJlbnRfY29tcG9uZW50ID8gcGFyZW50X2NvbXBvbmVudC4kJC5jb250ZXh0IDogW10pKSxcbiAgICAgICAgLy8gZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIGNhbGxiYWNrczogYmxhbmtfb2JqZWN0KCksXG4gICAgICAgIGRpcnR5LFxuICAgICAgICBza2lwX2JvdW5kOiBmYWxzZSxcbiAgICAgICAgcm9vdDogb3B0aW9ucy50YXJnZXQgfHwgcGFyZW50X2NvbXBvbmVudC4kJC5yb290XG4gICAgfTtcbiAgICBhcHBlbmRfc3R5bGVzICYmIGFwcGVuZF9zdHlsZXMoJCQucm9vdCk7XG4gICAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gICAgJCQuY3R4ID0gaW5zdGFuY2VcbiAgICAgICAgPyBpbnN0YW5jZShjb21wb25lbnQsIG9wdGlvbnMucHJvcHMgfHwge30sIChpLCByZXQsIC4uLnJlc3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVzdC5sZW5ndGggPyByZXN0WzBdIDogcmV0O1xuICAgICAgICAgICAgaWYgKCQkLmN0eCAmJiBub3RfZXF1YWwoJCQuY3R4W2ldLCAkJC5jdHhbaV0gPSB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoISQkLnNraXBfYm91bmQgJiYgJCQuYm91bmRbaV0pXG4gICAgICAgICAgICAgICAgICAgICQkLmJvdW5kW2ldKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVhZHkpXG4gICAgICAgICAgICAgICAgICAgIG1ha2VfZGlydHkoY29tcG9uZW50LCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pXG4gICAgICAgIDogW107XG4gICAgJCQudXBkYXRlKCk7XG4gICAgcmVhZHkgPSB0cnVlO1xuICAgIHJ1bl9hbGwoJCQuYmVmb3JlX3VwZGF0ZSk7XG4gICAgLy8gYGZhbHNlYCBhcyBhIHNwZWNpYWwgY2FzZSBvZiBubyBET00gY29tcG9uZW50XG4gICAgJCQuZnJhZ21lbnQgPSBjcmVhdGVfZnJhZ21lbnQgPyBjcmVhdGVfZnJhZ21lbnQoJCQuY3R4KSA6IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLnRhcmdldCkge1xuICAgICAgICBpZiAob3B0aW9ucy5oeWRyYXRlKSB7XG4gICAgICAgICAgICBzdGFydF9oeWRyYXRpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gY2hpbGRyZW4ob3B0aW9ucy50YXJnZXQpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50Lmwobm9kZXMpO1xuICAgICAgICAgICAgbm9kZXMuZm9yRWFjaChkZXRhY2gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LmMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbnRybylcbiAgICAgICAgICAgIHRyYW5zaXRpb25faW4oY29tcG9uZW50LiQkLmZyYWdtZW50KTtcbiAgICAgICAgbW91bnRfY29tcG9uZW50KGNvbXBvbmVudCwgb3B0aW9ucy50YXJnZXQsIG9wdGlvbnMuYW5jaG9yLCBvcHRpb25zLmN1c3RvbUVsZW1lbnQpO1xuICAgICAgICBlbmRfaHlkcmF0aW5nKCk7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgfVxuICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChwYXJlbnRfY29tcG9uZW50KTtcbn1cbmxldCBTdmVsdGVFbGVtZW50O1xuaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFN2ZWx0ZUVsZW1lbnQgPSBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBjb25zdCB7IG9uX21vdW50IH0gPSB0aGlzLiQkO1xuICAgICAgICAgICAgdGhpcy4kJC5vbl9kaXNjb25uZWN0ID0gb25fbW91bnQubWFwKHJ1bikuZmlsdGVyKGlzX2Z1bmN0aW9uKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLiQkLnNsb3R0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIHRvZG86IGltcHJvdmUgdHlwaW5nc1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy4kJC5zbG90dGVkW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhhdHRyLCBfb2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzW2F0dHJdID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBydW5fYWxsKHRoaXMuJCQub25fZGlzY29ubmVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgJGRlc3Ryb3koKSB7XG4gICAgICAgICAgICBkZXN0cm95X2NvbXBvbmVudCh0aGlzLCAxKTtcbiAgICAgICAgICAgIHRoaXMuJGRlc3Ryb3kgPSBub29wO1xuICAgICAgICB9XG4gICAgICAgICRvbih0eXBlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgdGhpcyBkZWxlZ2F0ZSB0byBhZGRFdmVudExpc3RlbmVyP1xuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdIHx8ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSA9IFtdKSk7XG4gICAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAkc2V0KCQkcHJvcHMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiQkc2V0ICYmICFpc19lbXB0eSgkJHByb3BzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy4kJHNldCgkJHByb3BzKTtcbiAgICAgICAgICAgICAgICB0aGlzLiQkLnNraXBfYm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIFN2ZWx0ZSBjb21wb25lbnRzLiBVc2VkIHdoZW4gZGV2PWZhbHNlLlxuICovXG5jbGFzcyBTdmVsdGVDb21wb25lbnQge1xuICAgICRkZXN0cm95KCkge1xuICAgICAgICBkZXN0cm95X2NvbXBvbmVudCh0aGlzLCAxKTtcbiAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7XG4gICAgfVxuICAgICRvbih0eXBlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTtcbiAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAkc2V0KCQkcHJvcHMpIHtcbiAgICAgICAgaWYgKHRoaXMuJCRzZXQgJiYgIWlzX2VtcHR5KCQkcHJvcHMpKSB7XG4gICAgICAgICAgICB0aGlzLiQkLnNraXBfYm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy4kJHNldCgkJHByb3BzKTtcbiAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaF9kZXYodHlwZSwgZGV0YWlsKSB7XG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21fZXZlbnQodHlwZSwgT2JqZWN0LmFzc2lnbih7IHZlcnNpb246ICczLjQ4LjAnIH0sIGRldGFpbCksIHsgYnViYmxlczogdHJ1ZSB9KSk7XG59XG5mdW5jdGlvbiBhcHBlbmRfZGV2KHRhcmdldCwgbm9kZSkge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NSW5zZXJ0JywgeyB0YXJnZXQsIG5vZGUgfSk7XG4gICAgYXBwZW5kKHRhcmdldCwgbm9kZSk7XG59XG5mdW5jdGlvbiBhcHBlbmRfaHlkcmF0aW9uX2Rldih0YXJnZXQsIG5vZGUpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlIH0pO1xuICAgIGFwcGVuZF9oeWRyYXRpb24odGFyZ2V0LCBub2RlKTtcbn1cbmZ1bmN0aW9uIGluc2VydF9kZXYodGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlLCBhbmNob3IgfSk7XG4gICAgaW5zZXJ0KHRhcmdldCwgbm9kZSwgYW5jaG9yKTtcbn1cbmZ1bmN0aW9uIGluc2VydF9oeWRyYXRpb25fZGV2KHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSwgYW5jaG9yIH0pO1xuICAgIGluc2VydF9oeWRyYXRpb24odGFyZ2V0LCBub2RlLCBhbmNob3IpO1xufVxuZnVuY3Rpb24gZGV0YWNoX2Rldihub2RlKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmUnLCB7IG5vZGUgfSk7XG4gICAgZGV0YWNoKG5vZGUpO1xufVxuZnVuY3Rpb24gZGV0YWNoX2JldHdlZW5fZGV2KGJlZm9yZSwgYWZ0ZXIpIHtcbiAgICB3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nICYmIGJlZm9yZS5uZXh0U2libGluZyAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgZGV0YWNoX2RldihiZWZvcmUubmV4dFNpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaF9iZWZvcmVfZGV2KGFmdGVyKSB7XG4gICAgd2hpbGUgKGFmdGVyLnByZXZpb3VzU2libGluZykge1xuICAgICAgICBkZXRhY2hfZGV2KGFmdGVyLnByZXZpb3VzU2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZGV0YWNoX2FmdGVyX2RldihiZWZvcmUpIHtcbiAgICB3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5fZGV2KG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zLCBoYXNfcHJldmVudF9kZWZhdWx0LCBoYXNfc3RvcF9wcm9wYWdhdGlvbikge1xuICAgIGNvbnN0IG1vZGlmaWVycyA9IG9wdGlvbnMgPT09IHRydWUgPyBbJ2NhcHR1cmUnXSA6IG9wdGlvbnMgPyBBcnJheS5mcm9tKE9iamVjdC5rZXlzKG9wdGlvbnMpKSA6IFtdO1xuICAgIGlmIChoYXNfcHJldmVudF9kZWZhdWx0KVxuICAgICAgICBtb2RpZmllcnMucHVzaCgncHJldmVudERlZmF1bHQnKTtcbiAgICBpZiAoaGFzX3N0b3BfcHJvcGFnYXRpb24pXG4gICAgICAgIG1vZGlmaWVycy5wdXNoKCdzdG9wUHJvcGFnYXRpb24nKTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUFkZEV2ZW50TGlzdGVuZXInLCB7IG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBtb2RpZmllcnMgfSk7XG4gICAgY29uc3QgZGlzcG9zZSA9IGxpc3Rlbihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmVFdmVudExpc3RlbmVyJywgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pO1xuICAgICAgICBkaXNwb3NlKCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGF0dHJfZGV2KG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBhdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxuICAgICAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVJlbW92ZUF0dHJpYnV0ZScsIHsgbm9kZSwgYXR0cmlidXRlIH0pO1xuICAgIGVsc2VcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXRBdHRyaWJ1dGUnLCB7IG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBwcm9wX2Rldihub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICBub2RlW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0UHJvcGVydHknLCB7IG5vZGUsIHByb3BlcnR5LCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIGRhdGFzZXRfZGV2KG5vZGUsIHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIG5vZGUuZGF0YXNldFtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldERhdGFzZXQnLCB7IG5vZGUsIHByb3BlcnR5LCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIHNldF9kYXRhX2Rldih0ZXh0LCBkYXRhKSB7XG4gICAgZGF0YSA9ICcnICsgZGF0YTtcbiAgICBpZiAodGV4dC53aG9sZVRleHQgPT09IGRhdGEpXG4gICAgICAgIHJldHVybjtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldERhdGEnLCB7IG5vZGU6IHRleHQsIGRhdGEgfSk7XG4gICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX2VhY2hfYXJndW1lbnQoYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdzdHJpbmcnICYmICEoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmICdsZW5ndGgnIGluIGFyZykpIHtcbiAgICAgICAgbGV0IG1zZyA9ICd7I2VhY2h9IG9ubHkgaXRlcmF0ZXMgb3ZlciBhcnJheS1saWtlIG9iamVjdHMuJztcbiAgICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgYXJnICYmIFN5bWJvbC5pdGVyYXRvciBpbiBhcmcpIHtcbiAgICAgICAgICAgIG1zZyArPSAnIFlvdSBjYW4gdXNlIGEgc3ByZWFkIHRvIGNvbnZlcnQgdGhpcyBpdGVyYWJsZSBpbnRvIGFuIGFycmF5Lic7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVfc2xvdHMobmFtZSwgc2xvdCwga2V5cykge1xuICAgIGZvciAoY29uc3Qgc2xvdF9rZXkgb2YgT2JqZWN0LmtleXMoc2xvdCkpIHtcbiAgICAgICAgaWYgKCF+a2V5cy5pbmRleE9mKHNsb3Rfa2V5KSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGA8JHtuYW1lfT4gcmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBzbG90IFwiJHtzbG90X2tleX1cIi5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX2R5bmFtaWNfZWxlbWVudCh0YWcpIHtcbiAgICBjb25zdCBpc19zdHJpbmcgPSB0eXBlb2YgdGFnID09PSAnc3RyaW5nJztcbiAgICBpZiAodGFnICYmICFpc19zdHJpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCc8c3ZlbHRlOmVsZW1lbnQ+IGV4cGVjdHMgXCJ0aGlzXCIgYXR0cmlidXRlIHRvIGJlIGEgc3RyaW5nLicpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX3ZvaWRfZHluYW1pY19lbGVtZW50KHRhZykge1xuICAgIGlmICh0YWcgJiYgaXNfdm9pZCh0YWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgPHN2ZWx0ZTplbGVtZW50IHRoaXM9XCIke3RhZ31cIj4gaXMgc2VsZi1jbG9zaW5nIGFuZCBjYW5ub3QgaGF2ZSBjb250ZW50LmApO1xuICAgIH1cbn1cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgU3ZlbHRlIGNvbXBvbmVudHMgd2l0aCBzb21lIG1pbm9yIGRldi1lbmhhbmNlbWVudHMuIFVzZWQgd2hlbiBkZXY9dHJ1ZS5cbiAqL1xuY2xhc3MgU3ZlbHRlQ29tcG9uZW50RGV2IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCAoIW9wdGlvbnMudGFyZ2V0ICYmICFvcHRpb25zLiQkaW5saW5lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ3RhcmdldCcgaXMgYSByZXF1aXJlZCBvcHRpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgJGRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLiRkZXN0cm95KCk7XG4gICAgICAgIHRoaXMuJGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvbXBvbmVudCB3YXMgYWxyZWFkeSBkZXN0cm95ZWQnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIH07XG4gICAgfVxuICAgICRjYXB0dXJlX3N0YXRlKCkgeyB9XG4gICAgJGluamVjdF9zdGF0ZSgpIHsgfVxufVxuLyoqXG4gKiBCYXNlIGNsYXNzIHRvIGNyZWF0ZSBzdHJvbmdseSB0eXBlZCBTdmVsdGUgY29tcG9uZW50cy5cbiAqIFRoaXMgb25seSBleGlzdHMgZm9yIHR5cGluZyBwdXJwb3NlcyBhbmQgc2hvdWxkIGJlIHVzZWQgaW4gYC5kLnRzYCBmaWxlcy5cbiAqXG4gKiAjIyMgRXhhbXBsZTpcbiAqXG4gKiBZb3UgaGF2ZSBjb21wb25lbnQgbGlicmFyeSBvbiBucG0gY2FsbGVkIGBjb21wb25lbnQtbGlicmFyeWAsIGZyb20gd2hpY2hcbiAqIHlvdSBleHBvcnQgYSBjb21wb25lbnQgY2FsbGVkIGBNeUNvbXBvbmVudGAuIEZvciBTdmVsdGUrVHlwZVNjcmlwdCB1c2VycyxcbiAqIHlvdSB3YW50IHRvIHByb3ZpZGUgdHlwaW5ncy4gVGhlcmVmb3JlIHlvdSBjcmVhdGUgYSBgaW5kZXguZC50c2A6XG4gKiBgYGB0c1xuICogaW1wb3J0IHsgU3ZlbHRlQ29tcG9uZW50VHlwZWQgfSBmcm9tIFwic3ZlbHRlXCI7XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnRUeXBlZDx7Zm9vOiBzdHJpbmd9PiB7fVxuICogYGBgXG4gKiBUeXBpbmcgdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgSURFcyBsaWtlIFZTIENvZGUgd2l0aCB0aGUgU3ZlbHRlIGV4dGVuc2lvblxuICogdG8gcHJvdmlkZSBpbnRlbGxpc2Vuc2UgYW5kIHRvIHVzZSB0aGUgY29tcG9uZW50IGxpa2UgdGhpcyBpbiBhIFN2ZWx0ZSBmaWxlXG4gKiB3aXRoIFR5cGVTY3JpcHQ6XG4gKiBgYGBzdmVsdGVcbiAqIDxzY3JpcHQgbGFuZz1cInRzXCI+XG4gKiBcdGltcG9ydCB7IE15Q29tcG9uZW50IH0gZnJvbSBcImNvbXBvbmVudC1saWJyYXJ5XCI7XG4gKiA8L3NjcmlwdD5cbiAqIDxNeUNvbXBvbmVudCBmb289eydiYXInfSAvPlxuICogYGBgXG4gKlxuICogIyMjIyBXaHkgbm90IG1ha2UgdGhpcyBwYXJ0IG9mIGBTdmVsdGVDb21wb25lbnQoRGV2KWA/XG4gKiBCZWNhdXNlXG4gKiBgYGB0c1xuICogY2xhc3MgQVN1YmNsYXNzT2ZTdmVsdGVDb21wb25lbnQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnQ8e2Zvbzogc3RyaW5nfT4ge31cbiAqIGNvbnN0IGNvbXBvbmVudDogdHlwZW9mIFN2ZWx0ZUNvbXBvbmVudCA9IEFTdWJjbGFzc09mU3ZlbHRlQ29tcG9uZW50O1xuICogYGBgXG4gKiB3aWxsIHRocm93IGEgdHlwZSBlcnJvciwgc28gd2UgbmVlZCB0byBzZXBhcmF0ZSB0aGUgbW9yZSBzdHJpY3RseSB0eXBlZCBjbGFzcy5cbiAqL1xuY2xhc3MgU3ZlbHRlQ29tcG9uZW50VHlwZWQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbG9vcF9ndWFyZCh0aW1lb3V0KSB7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPiB0aW1lb3V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luZmluaXRlIGxvb3AgZGV0ZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmV4cG9ydCB7IEh0bWxUYWcsIEh0bWxUYWdIeWRyYXRpb24sIFN2ZWx0ZUNvbXBvbmVudCwgU3ZlbHRlQ29tcG9uZW50RGV2LCBTdmVsdGVDb21wb25lbnRUeXBlZCwgU3ZlbHRlRWxlbWVudCwgYWN0aW9uX2Rlc3Ryb3llciwgYWRkX2F0dHJpYnV0ZSwgYWRkX2NsYXNzZXMsIGFkZF9mbHVzaF9jYWxsYmFjaywgYWRkX2xvY2F0aW9uLCBhZGRfcmVuZGVyX2NhbGxiYWNrLCBhZGRfcmVzaXplX2xpc3RlbmVyLCBhZGRfc3R5bGVzLCBhZGRfdHJhbnNmb3JtLCBhZnRlclVwZGF0ZSwgYXBwZW5kLCBhcHBlbmRfZGV2LCBhcHBlbmRfZW1wdHlfc3R5bGVzaGVldCwgYXBwZW5kX2h5ZHJhdGlvbiwgYXBwZW5kX2h5ZHJhdGlvbl9kZXYsIGFwcGVuZF9zdHlsZXMsIGFzc2lnbiwgYXR0ciwgYXR0cl9kZXYsIGF0dHJpYnV0ZV90b19vYmplY3QsIGJlZm9yZVVwZGF0ZSwgYmluZCwgYmluZGluZ19jYWxsYmFja3MsIGJsYW5rX29iamVjdCwgYnViYmxlLCBjaGVja19vdXRyb3MsIGNoaWxkcmVuLCBjbGFpbV9jb21wb25lbnQsIGNsYWltX2VsZW1lbnQsIGNsYWltX2h0bWxfdGFnLCBjbGFpbV9zcGFjZSwgY2xhaW1fc3ZnX2VsZW1lbnQsIGNsYWltX3RleHQsIGNsZWFyX2xvb3BzLCBjb21wb25lbnRfc3Vic2NyaWJlLCBjb21wdXRlX3Jlc3RfcHJvcHMsIGNvbXB1dGVfc2xvdHMsIGNyZWF0ZUV2ZW50RGlzcGF0Y2hlciwgY3JlYXRlX2FuaW1hdGlvbiwgY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbiwgY3JlYXRlX2NvbXBvbmVudCwgY3JlYXRlX2luX3RyYW5zaXRpb24sIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbiwgY3JlYXRlX3Nsb3QsIGNyZWF0ZV9zc3JfY29tcG9uZW50LCBjdXJyZW50X2NvbXBvbmVudCwgY3VzdG9tX2V2ZW50LCBkYXRhc2V0X2RldiwgZGVidWcsIGRlc3Ryb3lfYmxvY2ssIGRlc3Ryb3lfY29tcG9uZW50LCBkZXN0cm95X2VhY2gsIGRldGFjaCwgZGV0YWNoX2FmdGVyX2RldiwgZGV0YWNoX2JlZm9yZV9kZXYsIGRldGFjaF9iZXR3ZWVuX2RldiwgZGV0YWNoX2RldiwgZGlydHlfY29tcG9uZW50cywgZGlzcGF0Y2hfZGV2LCBlYWNoLCBlbGVtZW50LCBlbGVtZW50X2lzLCBlbXB0eSwgZW5kX2h5ZHJhdGluZywgZXNjYXBlLCBlc2NhcGVfYXR0cmlidXRlX3ZhbHVlLCBlc2NhcGVfb2JqZWN0LCBlc2NhcGVkLCBleGNsdWRlX2ludGVybmFsX3Byb3BzLCBmaXhfYW5kX2Rlc3Ryb3lfYmxvY2ssIGZpeF9hbmRfb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2ssIGZpeF9wb3NpdGlvbiwgZmx1c2gsIGdldEFsbENvbnRleHRzLCBnZXRDb250ZXh0LCBnZXRfYWxsX2RpcnR5X2Zyb21fc2NvcGUsIGdldF9iaW5kaW5nX2dyb3VwX3ZhbHVlLCBnZXRfY3VycmVudF9jb21wb25lbnQsIGdldF9jdXN0b21fZWxlbWVudHNfc2xvdHMsIGdldF9yb290X2Zvcl9zdHlsZSwgZ2V0X3Nsb3RfY2hhbmdlcywgZ2V0X3NwcmVhZF9vYmplY3QsIGdldF9zcHJlYWRfdXBkYXRlLCBnZXRfc3RvcmVfdmFsdWUsIGdsb2JhbHMsIGdyb3VwX291dHJvcywgaGFuZGxlX3Byb21pc2UsIGhhc0NvbnRleHQsIGhhc19wcm9wLCBpZGVudGl0eSwgaW5pdCwgaW5zZXJ0LCBpbnNlcnRfZGV2LCBpbnNlcnRfaHlkcmF0aW9uLCBpbnNlcnRfaHlkcmF0aW9uX2RldiwgaW50cm9zLCBpbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX2NoYXJhY3RlciwgaXNfY2xpZW50LCBpc19jcm9zc29yaWdpbiwgaXNfZW1wdHksIGlzX2Z1bmN0aW9uLCBpc19wcm9taXNlLCBpc192b2lkLCBsaXN0ZW4sIGxpc3Rlbl9kZXYsIGxvb3AsIGxvb3BfZ3VhcmQsIG1lcmdlX3Nzcl9zdHlsZXMsIG1pc3NpbmdfY29tcG9uZW50LCBtb3VudF9jb21wb25lbnQsIG5vb3AsIG5vdF9lcXVhbCwgbm93LCBudWxsX3RvX2VtcHR5LCBvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzLCBvbkRlc3Ryb3ksIG9uTW91bnQsIG9uY2UsIG91dHJvX2FuZF9kZXN0cm95X2Jsb2NrLCBwcmV2ZW50X2RlZmF1bHQsIHByb3BfZGV2LCBxdWVyeV9zZWxlY3Rvcl9hbGwsIHJhZiwgcnVuLCBydW5fYWxsLCBzYWZlX25vdF9lcXVhbCwgc2NoZWR1bGVfdXBkYXRlLCBzZWxlY3RfbXVsdGlwbGVfdmFsdWUsIHNlbGVjdF9vcHRpb24sIHNlbGVjdF9vcHRpb25zLCBzZWxlY3RfdmFsdWUsIHNlbGYsIHNldENvbnRleHQsIHNldF9hdHRyaWJ1dGVzLCBzZXRfY3VycmVudF9jb21wb25lbnQsIHNldF9jdXN0b21fZWxlbWVudF9kYXRhLCBzZXRfZGF0YSwgc2V0X2RhdGFfZGV2LCBzZXRfaW5wdXRfdHlwZSwgc2V0X2lucHV0X3ZhbHVlLCBzZXRfbm93LCBzZXRfcmFmLCBzZXRfc3RvcmVfdmFsdWUsIHNldF9zdHlsZSwgc2V0X3N2Z19hdHRyaWJ1dGVzLCBzcGFjZSwgc3ByZWFkLCBzcmNfdXJsX2VxdWFsLCBzdGFydF9oeWRyYXRpbmcsIHN0b3BfcHJvcGFnYXRpb24sIHN1YnNjcmliZSwgc3ZnX2VsZW1lbnQsIHRleHQsIHRpY2ssIHRpbWVfcmFuZ2VzX3RvX2FycmF5LCB0b19udW1iZXIsIHRvZ2dsZV9jbGFzcywgdHJhbnNpdGlvbl9pbiwgdHJhbnNpdGlvbl9vdXQsIHRydXN0ZWQsIHVwZGF0ZV9hd2FpdF9ibG9ja19icmFuY2gsIHVwZGF0ZV9rZXllZF9lYWNoLCB1cGRhdGVfc2xvdCwgdXBkYXRlX3Nsb3RfYmFzZSwgdmFsaWRhdGVfY29tcG9uZW50LCB2YWxpZGF0ZV9keW5hbWljX2VsZW1lbnQsIHZhbGlkYXRlX2VhY2hfYXJndW1lbnQsIHZhbGlkYXRlX2VhY2hfa2V5cywgdmFsaWRhdGVfc2xvdHMsIHZhbGlkYXRlX3N0b3JlLCB2YWxpZGF0ZV92b2lkX2R5bmFtaWNfZWxlbWVudCwgeGxpbmtfYXR0ciB9O1xuIiwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XG4gICAgaW1wb3J0ICogYXMgY2hyb25vIGZyb20gJ2Nocm9uby1ub2RlJztcbiAgICBpbXBvcnQgeyBvbk1vdW50IH0gZnJvbSAnc3ZlbHRlJztcbiAgICBpbXBvcnQgeyBSZWN1cnJlbmNlIH0gZnJvbSAnLi4vUmVjdXJyZW5jZSc7XG4gICAgaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuLi9Db25maWcvU2V0dGluZ3MnO1xuICAgIGltcG9ydCB7IFN0YXR1cyB9IGZyb20gJy4uL1N0YXR1cyc7XG4gICAgaW1wb3J0IHsgUHJpb3JpdHksIFRhc2sgfSBmcm9tICcuLi9UYXNrJztcbiAgICBpbXBvcnQge1xuICAgICAgICBwcmlvcml0eVN5bWJvbHMsXG4gICAgICAgIHJlY3VycmVuY2VTeW1ib2wsXG4gICAgICAgIHN0YXJ0RGF0ZVN5bWJvbCxcbiAgICAgICAgc2NoZWR1bGVkRGF0ZVN5bWJvbCxcbiAgICAgICAgZHVlRGF0ZVN5bWJvbCxcbiAgICB9IGZyb20gJy4uL1Rhc2snO1xuICAgIGltcG9ydCB7IGRvQXV0b2NvbXBsZXRlIH0gZnJvbSAnLi4vRGF0ZUFiYnJldmlhdGlvbnMnO1xuXG4gICAgLy8gVGhlc2UgZXhwb3J0ZWQgdmFyaWFibGVzIGFyZSBwYXNzZWQgaW4gYXMgcHJvcHMgYnkgVGFza01vZGFsLm9uT3BlbigpOlxuICAgIGV4cG9ydCBsZXQgdGFzazogVGFzaztcbiAgICBleHBvcnQgbGV0IG9uU3VibWl0OiAodXBkYXRlZFRhc2tzOiBUYXNrW10pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIGV4cG9ydCBsZXQgc3RhdHVzT3B0aW9uczogU3RhdHVzW107XG5cbiAgICBsZXQgZGVzY3JpcHRpb25JbnB1dDogSFRNTElucHV0RWxlbWVudDtcbiAgICBsZXQgZWRpdGFibGVUYXNrOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogU3RhdHVzO1xuICAgICAgICBwcmlvcml0eTogJ25vbmUnIHwgJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJztcbiAgICAgICAgcmVjdXJyZW5jZVJ1bGU6IHN0cmluZztcbiAgICAgICAgc3RhcnREYXRlOiBzdHJpbmc7XG4gICAgICAgIHNjaGVkdWxlZERhdGU6IHN0cmluZztcbiAgICAgICAgZHVlRGF0ZTogc3RyaW5nO1xuICAgICAgICBkb25lRGF0ZTogc3RyaW5nO1xuICAgICAgICBmb3J3YXJkT25seTogYm9vbGVhbjtcbiAgICB9ID0ge1xuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIHN0YXR1czogU3RhdHVzLlRPRE8sXG4gICAgICAgIHByaW9yaXR5OiAnbm9uZScsXG4gICAgICAgIHJlY3VycmVuY2VSdWxlOiAnJyxcbiAgICAgICAgc3RhcnREYXRlOiAnJyxcbiAgICAgICAgc2NoZWR1bGVkRGF0ZTogJycsXG4gICAgICAgIGR1ZURhdGU6ICcnLFxuICAgICAgICBkb25lRGF0ZTogJycsXG4gICAgICAgIGZvcndhcmRPbmx5OiB0cnVlXG4gICAgfTtcblxuICAgIGxldCBwYXJzZWRTdGFydERhdGU6IHN0cmluZyA9ICcnO1xuICAgIGxldCBwYXJzZWRTY2hlZHVsZWREYXRlOiBzdHJpbmcgPSAnJztcbiAgICBsZXQgcGFyc2VkRHVlRGF0ZTogc3RyaW5nID0gJyc7XG4gICAgbGV0IHBhcnNlZFJlY3VycmVuY2U6IHN0cmluZyA9ICcnO1xuICAgIGxldCBwYXJzZWREb25lOiBzdHJpbmcgPSAnJztcbiAgICBsZXQgYWRkR2xvYmFsRmlsdGVyT25TYXZlOiBib29sZWFuID0gZmFsc2U7XG4gICAgbGV0IHdpdGhBY2Nlc3NLZXlzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8vICd3ZWVrZW5kJyBhYmJyZXZpYXRpb24gb21taXR0ZWQgZHVlIHRvIGxhY2sgb2Ygc3BhY2UuXG4gICAgbGV0IGRhdGVQbGFjZWhvbGRlciA9XG4gICAgICAgIFwiVHJ5ICdNb25kYXknIG9yICd0b21vcnJvdycsIG9yIFt0ZHx0bXx5ZHx0d3xud3x3ZV0gdGhlbiBzcGFjZS5cIjtcblxuICAgIGNvbnN0IHByaW9yaXR5T3B0aW9uczoge1xuICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBlZGl0YWJsZVRhc2sucHJpb3JpdHksXG4gICAgICAgICAgICBsYWJlbDogc3RyaW5nLFxuICAgICAgICAgICAgc3ltYm9sOiBzdHJpbmcgfVtdID1cbiAgICAgICAgW3tcbiAgICAgICAgICAgIHZhbHVlOiAnbG93JyxcbiAgICAgICAgICAgIGxhYmVsOiAnTG93JyxcbiAgICAgICAgICAgIHN5bWJvbDogcHJpb3JpdHlTeW1ib2xzLkxvd1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICB2YWx1ZTogJ25vbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdOb3JtYWwnLFxuICAgICAgICAgICAgc3ltYm9sOiBwcmlvcml0eVN5bWJvbHMuTm9uZVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICB2YWx1ZTogJ21lZGl1bScsXG4gICAgICAgICAgICBsYWJlbDogJ01lZGl1bScsXG4gICAgICAgICAgICBzeW1ib2w6IHByaW9yaXR5U3ltYm9scy5NZWRpdW1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgdmFsdWU6ICdoaWdoJyxcbiAgICAgICAgICAgIGxhYmVsOiAnSGlnaCcsXG4gICAgICAgICAgICBzeW1ib2w6IHByaW9yaXR5U3ltYm9scy5IaWdoXG4gICAgICAgIH1dXG5cbiAgICAvKlxuICAgICAgICBNQUlOVEVOQU5DRSBOT1RFIG9uIHRoZXNlIERhdGUgZnVuY3Rpb25zOlxuICAgICAgICAgICAgUmVwZXRpdGlvdXMgZGF0ZS1yZWxhdGVkIGNvZGUgaW4gdGhpcyBmaWxlIGhhcyBiZWVuIGV4dHJhY3RlZFxuICAgICAgICAgICAgb3V0IGluIHRvIHNldmVyYWwgcGFyc2VUeXBlZERhdGVGb3IuLi4uKCkgZnVuY3Rpb25zIG92ZXIgdGltZS5cblxuICAgICAgICAgICAgVGhlcmUgaXMgc29tZSBzaW1pbGFyaXR5IGJldHdlZW4gdGhlc2UgZnVuY3Rpb25zLCBhbmQgYWxzb1xuICAgICAgICAgICAgc29tZSBzdWJ0bGUgZGlmZmVyZW5jZXMuXG5cbiAgICAgICAgICAgIEZ1dHVyZSByZWZhY3RvcmluZyB0byBzaW1wbGlmeSB0aGVtIHdvdWxkIGJlIHdlbGNvbWVkLlxuXG4gICAgICAgICAgICBXaGVuIGVkaXRpbmcgb2YgRG9uZSBkYXRlIGlzIGludHJvZHVjZWQsIHRoZSBmdW5jdGlvbnNcbiAgICAgICAgICAgIHBhcnNlVHlwZWREYXRlRm9yRGlzcGxheVVzaW5nRnV0dXJlRGF0ZSgpIGFuZCBwYXJzZVR5cGVkRGF0ZUZvckRpc3BsYXkoKVxuICAgICAgICAgICAgbWF5IGNvbGxhcHNlIGluIHRvIGEgc2luZ2xlIGNhc2UuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbnRlcmVkIHZhbHVlIGZvciBhIGRhdGUgZmllbGQsIGFuZCByZXR1cm4gdGhlIHRleHQgdG8gYmUgZGlzcGxheWVkLFxuICAgICAqIHRvIGV4cGxhaW4gaG93IHRoZSBkYXRlIHN0cmluZyB3YXMgaW50ZXJwcmV0ZWQuXG4gICAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgICAqIEBwYXJhbSB0eXBlZERhdGUgLSB3aGF0IHRoZSB1c2VyIGhhcyBlbnRlcmVkLCBzdWNoIGFzICcyMDIzLTAxLTIzJyBvciAndG9tb3Jyb3cnXG4gICAgICogQHBhcmFtIGZvcndhcmREYXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VUeXBlZERhdGVGb3JEaXNwbGF5KFxuICAgICAgICBmaWVsZE5hbWU6ICdzdGFydCcgfCAnc2NoZWR1bGVkJyB8ICdkdWUnIHwgJ2RvbmUnLFxuICAgICAgICB0eXBlZERhdGU6IHN0cmluZyxcbiAgICAgICAgZm9yd2FyZERhdGU6IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0eXBlZERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBgPGk+bm8gJHtmaWVsZE5hbWV9IGRhdGU8L2k+YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWQgPSBjaHJvbm8ucGFyc2VEYXRlKHR5cGVkRGF0ZSwgZm9yd2FyZERhdGUsIHtcbiAgICAgICAgICAgIGZvcndhcmREYXRlOiBmb3J3YXJkRGF0ZSAhPSB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocGFyc2VkICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93Lm1vbWVudChwYXJzZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgPGk+aW52YWxpZCAke2ZpZWxkTmFtZX0gZGF0ZTwvaT5gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpa2Uge0BsaW5rIHBhcnNlVHlwZWREYXRlRm9yRGlzcGxheX0gYnV0IGFsc28gYWNjb3VudHMgZm9yIHRoZSAnT25seSBmdXR1cmUgZGF0ZXMnIHNldHRpbmcuXG4gICAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgICAqIEBwYXJhbSB0eXBlZERhdGUgLSB3aGF0IHRoZSB1c2VyIGhhcyBlbnRlcmVkLCBzdWNoIGFzICcyMDIzLTAxLTIzJyBvciAndG9tb3Jyb3cnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VUeXBlZERhdGVGb3JEaXNwbGF5VXNpbmdGdXR1cmVEYXRlKGZpZWxkTmFtZTogJ3N0YXJ0JyB8ICdzY2hlZHVsZWQnIHwgJ2R1ZScgfCAnZG9uZScsIHR5cGVkRGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlVHlwZWREYXRlRm9yRGlzcGxheShcbiAgICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICAgIHR5cGVkRGF0ZSxcbiAgICAgICAgICAgIGVkaXRhYmxlVGFzay5mb3J3YXJkT25seSA/IG5ldyBEYXRlKCkgOiB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW50ZXJlZCB2YWx1ZSBmb3IgYSBkYXRlIGZpZWxkLCBhbmQgcmV0dXJuIHRoZSB2YWx1ZSB0byBiZSBzYXZlZCBpbiB0aGUgZWRpdGVkIHRhc2suXG4gICAgICogQHBhcmFtIHR5cGVkRGF0ZSAtIHdoYXQgdGhlIHVzZXIgaGFzIGVudGVyZWQsIHN1Y2ggYXMgJzIwMjMtMDEtMjMnIG9yICd0b21vcnJvdydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZVR5cGVkRGF0ZUZvclNhdmluZyh0eXBlZERhdGU6IHN0cmluZyk6IG1vbWVudC5Nb21lbnQgfCBudWxsIHtcbiAgICAgICAgbGV0IGRhdGU6IG1vbWVudC5Nb21lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IGNocm9uby5wYXJzZURhdGUoXG4gICAgICAgICAgICB0eXBlZERhdGUsXG4gICAgICAgICAgICBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgeyBmb3J3YXJkRGF0ZTogZWRpdGFibGVUYXNrLmZvcndhcmRPbmx5IH0sXG4gICAgICAgICk7XG4gICAgICAgIGlmIChwYXJzZWREYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBkYXRlID0gd2luZG93Lm1vbWVudChwYXJzZWREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICAkOiBhY2Nlc3NrZXkgPSAoa2V5OiBzdHJpbmcpID0+IHdpdGhBY2Nlc3NLZXlzID8ga2V5IDogbnVsbDtcblxuICAgICQ6IHtcbiAgICAgICAgZWRpdGFibGVUYXNrLnN0YXJ0RGF0ZSA9IGRvQXV0b2NvbXBsZXRlKGVkaXRhYmxlVGFzay5zdGFydERhdGUpO1xuICAgICAgICBwYXJzZWRTdGFydERhdGUgPSBwYXJzZVR5cGVkRGF0ZUZvckRpc3BsYXlVc2luZ0Z1dHVyZURhdGUoJ3N0YXJ0JywgZWRpdGFibGVUYXNrLnN0YXJ0RGF0ZSk7XG4gICAgfVxuXG4gICAgJDoge1xuICAgICAgICBlZGl0YWJsZVRhc2suc2NoZWR1bGVkRGF0ZSA9IGRvQXV0b2NvbXBsZXRlKGVkaXRhYmxlVGFzay5zY2hlZHVsZWREYXRlKTtcbiAgICAgICAgcGFyc2VkU2NoZWR1bGVkRGF0ZSA9IHBhcnNlVHlwZWREYXRlRm9yRGlzcGxheVVzaW5nRnV0dXJlRGF0ZSgnc2NoZWR1bGVkJywgZWRpdGFibGVUYXNrLnNjaGVkdWxlZERhdGUpO1xuICAgIH1cblxuICAgICQ6IHtcbiAgICAgICAgZWRpdGFibGVUYXNrLmR1ZURhdGUgPSBkb0F1dG9jb21wbGV0ZShlZGl0YWJsZVRhc2suZHVlRGF0ZSk7XG4gICAgICAgIHBhcnNlZER1ZURhdGUgPSBwYXJzZVR5cGVkRGF0ZUZvckRpc3BsYXlVc2luZ0Z1dHVyZURhdGUoJ2R1ZScsIGVkaXRhYmxlVGFzay5kdWVEYXRlKTtcbiAgICB9XG5cbiAgICAkOiB7XG4gICAgICAgIGlmICghZWRpdGFibGVUYXNrLnJlY3VycmVuY2VSdWxlKSB7XG4gICAgICAgICAgICBwYXJzZWRSZWN1cnJlbmNlID0gJzxpPm5vdCByZWN1cnJpbmc8Lz4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VkUmVjdXJyZW5jZSA9XG4gICAgICAgICAgICAgICAgUmVjdXJyZW5jZS5mcm9tVGV4dCh7XG4gICAgICAgICAgICAgICAgICAgIHJlY3VycmVuY2VSdWxlVGV4dDogZWRpdGFibGVUYXNrLnJlY3VycmVuY2VSdWxlLFxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGZvciByZXByZXNlbnRhdGlvbiBpbiB0aGUgbW9kYWwsIG5vIGRhdGVzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGR1ZURhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgfSk/LnRvVGV4dCgpID8/ICc8aT5pbnZhbGlkIHJlY3VycmVuY2UgcnVsZTwvaT4nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgJDoge1xuICAgICAgICBwYXJzZWREb25lID0gcGFyc2VUeXBlZERhdGVGb3JEaXNwbGF5KCdkb25lJywgZWRpdGFibGVUYXNrLmRvbmVEYXRlKTtcbiAgICB9XG5cbiAgICBvbk1vdW50KCgpID0+IHtcbiAgICAgICAgY29uc3QgeyBnbG9iYWxGaWx0ZXIsIHByb3ZpZGVBY2Nlc3NLZXlzIH0gPSBnZXRTZXR0aW5ncygpO1xuICAgICAgICB3aXRoQWNjZXNzS2V5cyA9IHByb3ZpZGVBY2Nlc3NLZXlzO1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRhc2suZ2V0RGVzY3JpcHRpb25XaXRob3V0R2xvYmFsRmlsdGVyKCk7XG4gICAgICAgIC8vIElmIHdlJ3JlIGRpc3BsYXlpbmcgdG8gdGhlIHVzZXIgdGhlIGRlc2NyaXB0aW9uIHdpdGhvdXQgdGhlIGdsb2JhbCBmaWx0ZXIgKGkuZS4gaXQgd2FzIHJlbW92ZWQgaW4gdGhlIG1ldGhvZFxuICAgICAgICAvLyBhYm92ZSksIG9yIGlmIHRoZSBkZXNjcmlwdGlvbiBkaWQgbm90IGluY2x1ZGUgYSBnbG9iYWwgZmlsdGVyIGluIHRoZSBmaXJzdCBwbGFjZSwgd2UnbGwgYWRkIHRoZSBnbG9iYWwgZmlsdGVyXG4gICAgICAgIC8vIHdoZW4gc2F2aW5nIHRoZSB0YXNrLlxuICAgICAgICAvLyBBbm90aGVyIHNwZWNpYWwgY2FzZSBpcyB3aGVuIHRoZSBnbG9iYWwgZmlsdGVyIGlzIGVtcHR5OiBpbiB0aGlzIGNhc2UgdGhlcmUncyBhbiBcImVtcHR5XCIgbWF0Y2ggaW4gdGhlIGBpbmRleE9mYFxuICAgICAgICAvLyAoaXQgcmV0dXJucyAwKSwgYW5kIHRodXMgd2UgKmRvbid0KiBzZXQgYWRkR2xvYmFsRmlsdGVyT25TYXZlLlxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gdGFzay5kZXNjcmlwdGlvbiB8fCBkZXNjcmlwdGlvbi5pbmRleE9mKGdsb2JhbEZpbHRlcikgPT0gLTEpXG4gICAgICAgICAgICBhZGRHbG9iYWxGaWx0ZXJPblNhdmUgPSB0cnVlO1xuICAgICAgICBsZXQgcHJpb3JpdHk6IHR5cGVvZiBlZGl0YWJsZVRhc2sucHJpb3JpdHkgPSAnbm9uZSc7XG4gICAgICAgIGlmICh0YXNrLnByaW9yaXR5ID09PSBQcmlvcml0eS5Mb3cpIHtcbiAgICAgICAgICAgIHByaW9yaXR5ID0gJ2xvdyc7XG4gICAgICAgIH0gZWxzZSBpZiAodGFzay5wcmlvcml0eSA9PT0gUHJpb3JpdHkuTWVkaXVtKSB7XG4gICAgICAgICAgICBwcmlvcml0eSA9ICdtZWRpdW0nO1xuICAgICAgICB9IGVsc2UgaWYgKHRhc2sucHJpb3JpdHkgPT09IFByaW9yaXR5LkhpZ2gpIHtcbiAgICAgICAgICAgIHByaW9yaXR5ID0gJ2hpZ2gnO1xuICAgICAgICB9XG5cbiAgICAgICAgZWRpdGFibGVUYXNrID0ge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBzdGF0dXM6IHRhc2suc3RhdHVzLFxuICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICByZWN1cnJlbmNlUnVsZTogdGFzay5yZWN1cnJlbmNlID8gdGFzay5yZWN1cnJlbmNlLnRvVGV4dCgpIDogJycsXG4gICAgICAgICAgICBzdGFydERhdGU6IHRhc2suc3RhcnREYXRlXG4gICAgICAgICAgICAgICAgPyB0YXNrLnN0YXJ0RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlOiB0YXNrLnNjaGVkdWxlZERhdGVcbiAgICAgICAgICAgICAgICA/IHRhc2suc2NoZWR1bGVkRGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICBkdWVEYXRlOiB0YXNrLmR1ZURhdGUgPyB0YXNrLmR1ZURhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgOiAnJyxcbiAgICAgICAgICAgIGRvbmVEYXRlOiB0YXNrLmRvbmVEYXRlID8gdGFzay5kb25lRGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6ICcnLFxuICAgICAgICAgICAgZm9yd2FyZE9ubHk6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZGVzY3JpcHRpb25JbnB1dC5mb2N1cygpO1xuICAgICAgICB9LCAxMCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBfb25Qcmlvcml0eUtleXVwID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5rZXkgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuY3RybEtleSkge1xuICAgICAgICAgICAgY29uc3QgcHJpb3JpdHlPcHRpb24gPSBwcmlvcml0eU9wdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICBvcHRpb24gPT4gb3B0aW9uLmxhYmVsLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpID09IGV2ZW50LmtleSk7XG4gICAgICAgICAgICBpZiAocHJpb3JpdHlPcHRpb24pIHtcbiAgICAgICAgICAgICAgICBlZGl0YWJsZVRhc2sucHJpb3JpdHkgPSBwcmlvcml0eU9wdGlvbi52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IF9vbkNsb3NlID0gKCkgPT4ge1xuICAgICAgICBvblN1Ym1pdChbXSk7XG4gICAgfVxuXG4gICAgY29uc3QgX29uU3VibWl0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGdsb2JhbEZpbHRlciB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgbGV0IGRlc2NyaXB0aW9uID0gZWRpdGFibGVUYXNrLmRlc2NyaXB0aW9uLnRyaW0oKTtcbiAgICAgICAgaWYgKGFkZEdsb2JhbEZpbHRlck9uU2F2ZSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBnbG9iYWxGaWx0ZXIgKyAnICcgKyBkZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHBhcnNlVHlwZWREYXRlRm9yU2F2aW5nKGVkaXRhYmxlVGFzay5zdGFydERhdGUpO1xuXG4gICAgICAgIGNvbnN0IHNjaGVkdWxlZERhdGUgPSBwYXJzZVR5cGVkRGF0ZUZvclNhdmluZyhlZGl0YWJsZVRhc2suc2NoZWR1bGVkRGF0ZSk7XG5cbiAgICAgICAgY29uc3QgZHVlRGF0ZSA9IHBhcnNlVHlwZWREYXRlRm9yU2F2aW5nKGVkaXRhYmxlVGFzay5kdWVEYXRlKTtcblxuICAgICAgICBsZXQgcmVjdXJyZW5jZTogUmVjdXJyZW5jZSB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAoZWRpdGFibGVUYXNrLnJlY3VycmVuY2VSdWxlKSB7XG4gICAgICAgICAgICByZWN1cnJlbmNlID0gUmVjdXJyZW5jZS5mcm9tVGV4dCh7XG4gICAgICAgICAgICAgICAgcmVjdXJyZW5jZVJ1bGVUZXh0OiBlZGl0YWJsZVRhc2sucmVjdXJyZW5jZVJ1bGUsXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlLFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgICAgICAgICAgZHVlRGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnNlZFByaW9yaXR5OiBQcmlvcml0eTtcbiAgICAgICAgc3dpdGNoIChlZGl0YWJsZVRhc2sucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2xvdyc6XG4gICAgICAgICAgICAgICAgcGFyc2VkUHJpb3JpdHkgPSBQcmlvcml0eS5Mb3c7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZWRpdW0nOlxuICAgICAgICAgICAgICAgIHBhcnNlZFByaW9yaXR5ID0gUHJpb3JpdHkuTWVkaXVtO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaGlnaCc6XG4gICAgICAgICAgICAgICAgcGFyc2VkUHJpb3JpdHkgPSBQcmlvcml0eS5IaWdoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBwYXJzZWRQcmlvcml0eSA9IFByaW9yaXR5Lk5vbmU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cGRhdGVkVGFzayA9IG5ldyBUYXNrKHtcbiAgICAgICAgICAgIC4uLnRhc2ssXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHN0YXR1czogZWRpdGFibGVUYXNrLnN0YXR1cyxcbiAgICAgICAgICAgIHByaW9yaXR5OiBwYXJzZWRQcmlvcml0eSxcbiAgICAgICAgICAgIHJlY3VycmVuY2UsXG4gICAgICAgICAgICBzdGFydERhdGUsXG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlLFxuICAgICAgICAgICAgZHVlRGF0ZSxcbiAgICAgICAgICAgIGRvbmVEYXRlOiB3aW5kb3dcbiAgICAgICAgICAgICAgICAubW9tZW50KGVkaXRhYmxlVGFzay5kb25lRGF0ZSwgJ1lZWVktTU0tREQnKVxuICAgICAgICAgICAgICAgIC5pc1ZhbGlkKClcbiAgICAgICAgICAgICAgICA/IHdpbmRvdy5tb21lbnQoZWRpdGFibGVUYXNrLmRvbmVEYXRlLCAnWVlZWS1NTS1ERCcpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9KTtcblxuICAgICAgICBvblN1Ym1pdChbdXBkYXRlZFRhc2tdKTtcbiAgICB9O1xuPC9zY3JpcHQ+XG5cbjxkaXYgY2xhc3M9XCJ0YXNrcy1tb2RhbFwiPlxuICAgIDxmb3JtIG9uOnN1Ym1pdHxwcmV2ZW50RGVmYXVsdD17X29uU3VibWl0fSBjbGFzczp3aXRoLWFjY2Vzc2tleXM9XCJ7d2l0aEFjY2Vzc0tleXN9XCI+XG4gICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICA8IS0tICBEZXNjcmlwdGlvbiAgLS0+XG4gICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFza3MtbW9kYWwtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlc2NyaXB0aW9uXCI+RGVzY3JpcDxzcGFuIGNsYXNzPVwiYWNjZXNza2V5XCI+dDwvc3Bhbj5pb248L2xhYmVsPlxuICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktYWNjZXNza2V5IC0tPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgYmluZDp2YWx1ZT17ZWRpdGFibGVUYXNrLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgIGJpbmQ6dGhpcz17ZGVzY3JpcHRpb25JbnB1dH1cbiAgICAgICAgICAgICAgICBpZD1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0YXNrcy1tb2RhbC1kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUYWtlIG91dCB0aGUgdHJhc2hcIlxuICAgICAgICAgICAgICAgIGFjY2Vzc2tleT17YWNjZXNza2V5KFwidFwiKX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICA8IS0tICBQcmlvcml0eSAgLS0+XG4gICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFza3MtbW9kYWwtc2VjdGlvbiB0YXNrcy1tb2RhbC1wcmlvcml0aWVzXCIgb246a2V5dXA9e19vblByaW9yaXR5S2V5dXB9PlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByaW9yaXR5LXtlZGl0YWJsZVRhc2sucHJpb3JpdHl9XCI+UHJpb3JpdHk8L2xhYmVsPlxuICAgICAgICAgICAgeyNlYWNoIHByaW9yaXR5T3B0aW9ucyBhcyB7dmFsdWUsIGxhYmVsLCBzeW1ib2x9fVxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1hY2Nlc3NrZXkgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicHJpb3JpdHkte3ZhbHVlfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kOmdyb3VwPXtlZGl0YWJsZVRhc2sucHJpb3JpdHl9XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NrZXk9e2FjY2Vzc2tleShsYWJlbC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwcmlvcml0eS17dmFsdWV9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFjY2Vzc2tleS1maXJzdFwiPntsYWJlbH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB7I2lmIHN5bWJvbCAmJiBzeW1ib2wuY2hhckNvZGVBdCgwKSA+PSAweDEwMH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57c3ltYm9sfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsvaWZ9XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgey9lYWNofVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgPCEtLSAgUmVjdXJyZW5jZSBhbmQgRGF0ZXMgIC0tPlxuICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhc2tzLW1vZGFsLXNlY3Rpb24gdGFza3MtbW9kYWwtZGF0ZXNcIj5cbiAgICAgICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICAgICAgPCEtLSAgUmVjdXJyZW5jZSAgLS0+XG4gICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJyZWN1cnJlbmNlXCIgY2xhc3M9XCJhY2Nlc3NrZXktZmlyc3RcIj5SZWN1cnM8L2xhYmVsPlxuICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktYWNjZXNza2V5IC0tPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgYmluZDp2YWx1ZT17ZWRpdGFibGVUYXNrLnJlY3VycmVuY2VSdWxlfVxuICAgICAgICAgICAgICAgIGlkPVwicmVjdXJyZW5jZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHJ5ICdldmVyeSAyIHdlZWtzIG9uIFRodXJzZGF5Jy5cIlxuICAgICAgICAgICAgICAgIGFjY2Vzc2tleT17YWNjZXNza2V5KFwiclwiKX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8Y29kZT57cmVjdXJyZW5jZVN5bWJvbH0ge0BodG1sIHBhcnNlZFJlY3VycmVuY2V9PC9jb2RlPlxuXG4gICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgICAgIDwhLS0gIER1ZSBEYXRlICAtLT5cbiAgICAgICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImR1ZVwiIGNsYXNzPVwiYWNjZXNza2V5LWZpcnN0XCI+RHVlPC9sYWJlbD5cbiAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LWFjY2Vzc2tleSAtLT5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGJpbmQ6dmFsdWU9e2VkaXRhYmxlVGFzay5kdWVEYXRlfVxuICAgICAgICAgICAgICAgIGlkPVwiZHVlXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2RhdGVQbGFjZWhvbGRlcn1cbiAgICAgICAgICAgICAgICBhY2Nlc3NrZXk9e2FjY2Vzc2tleShcImRcIil9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGNvZGU+e2R1ZURhdGVTeW1ib2x9IHtAaHRtbCBwYXJzZWREdWVEYXRlfTwvY29kZT5cblxuICAgICAgICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG4gICAgICAgICAgICA8IS0tICBTY2hlZHVsZWQgRGF0ZSAgLS0+XG4gICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzY2hlZHVsZWRcIiBjbGFzcz1cImFjY2Vzc2tleS1maXJzdFwiPlNjaGVkdWxlZDwvbGFiZWw+XG4gICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1hY2Nlc3NrZXkgLS0+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBiaW5kOnZhbHVlPXtlZGl0YWJsZVRhc2suc2NoZWR1bGVkRGF0ZX1cbiAgICAgICAgICAgICAgICBpZD1cInNjaGVkdWxlZFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtkYXRlUGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICAgICAgYWNjZXNza2V5PXthY2Nlc3NrZXkoXCJzXCIpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxjb2RlPntzY2hlZHVsZWREYXRlU3ltYm9sfSB7QGh0bWwgcGFyc2VkU2NoZWR1bGVkRGF0ZX08L2NvZGU+XG5cbiAgICAgICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICAgICAgPCEtLSAgU3RhcnQgRGF0ZSAgLS0+XG4gICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGFydFwiPlN0PHNwYW4gY2xhc3M9XCJhY2Nlc3NrZXlcIj5hPC9zcGFuPnJ0PC9sYWJlbD5cbiAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LWFjY2Vzc2tleSAtLT5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGJpbmQ6dmFsdWU9e2VkaXRhYmxlVGFzay5zdGFydERhdGV9XG4gICAgICAgICAgICAgICAgaWQ9XCJzdGFydFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtkYXRlUGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICAgICAgYWNjZXNza2V5PXthY2Nlc3NrZXkoXCJhXCIpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxjb2RlPntzdGFydERhdGVTeW1ib2x9IHtAaHRtbCBwYXJzZWRTdGFydERhdGV9PC9jb2RlPlxuXG4gICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgICAgIDwhLS0gIE9ubHkgZnV0dXJlIGRhdGVzICAtLT5cbiAgICAgICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZm9yd2FyZE9ubHlcIj5Pbmx5XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWNjZXNza2V5LWZpcnN0XCI+ZnV0dXJlPC9zcGFuPiBkYXRlczo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LWFjY2Vzc2tleSAtLT5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgYmluZDpjaGVja2VkPXtlZGl0YWJsZVRhc2suZm9yd2FyZE9ubHl9XG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZm9yd2FyZE9ubHlcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhc2stbGlzdC1pdGVtLWNoZWNrYm94IHRhc2tzLW1vZGFsLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNza2V5PXthY2Nlc3NrZXkoXCJmXCIpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG4gICAgICAgIDwhLS0gIFN0YXR1cyAgLS0+XG4gICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFza3MtbW9kYWwtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0YXR1c1wiPlN0YXR1cyA8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBiaW5kOnZhbHVlPXtlZGl0YWJsZVRhc2suc3RhdHVzfSBpZD1cInN0YXR1cy10eXBlXCIgY2xhc3M9XCJkcm9wZG93blwiPlxuICAgICAgICAgICAgICAgIHsjZWFjaCBzdGF0dXNPcHRpb25zIGFzIHN0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT17c3RhdHVzfT57c3RhdHVzLm5hbWV9IFt7c3RhdHVzLnN5bWJvbH1dPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgey9lYWNofVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YXNrcy1tb2RhbC1zZWN0aW9uIHRhc2tzLW1vZGFsLXN0YXR1c1wiPlxuICAgICAgICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG4gICAgICAgICAgICA8IS0tICBDb21wbGV0ZWQgIC0tPlxuICAgICAgICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGF0dXNcIj5Db21wbGV0ZWQ6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhc2stbGlzdC1pdGVtLWNoZWNrYm94IHRhc2tzLW1vZGFsLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17ZWRpdGFibGVUYXNrLnN0YXR1cy5pc0NvbXBsZXRlZCgpfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG4gICAgICAgICAgICA8IS0tICBEb25lIG9uICAtLT5cbiAgICAgICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5Eb25lIG9uOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8Y29kZT57QGh0bWwgcGFyc2VkRG9uZX08L2NvZGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YXNrcy1tb2RhbC1zZWN0aW9uIHRhc2tzLW1vZGFsLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwibW9kLWN0YVwiPkFwcGx5PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbjpjbGljaz17X29uQ2xvc2V9PkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+XG48L2Rpdj5cbiIsICIvLyBBYmJyZXZpYXRpb25zIGZvciBlbnRlcmluZyBkYXRlcyB3aXRoIGNocm9ub1xuLy8gTUFJTlRFTkFOQ0UgTk9URTpcbi8vICAgICAgSWYgYWRkaW5nIG1vcmUgYWJicmV2aWF0aW9ucywgcGxlYXNlIHJldmlldyBkYXRlUGxhY2Vob2xkZXIgaW4gc3JjL3VpL0VkaXRUYXNrLnN2ZWx0ZVxuY29uc3QgYWJicmV2aWF0aW9ucyA9IHtcbiAgICB0ZDogJ3RvZGF5JyxcbiAgICB0bTogJ3RvbW9ycm93JyxcbiAgICB5ZDogJ3llc3RlcmRheScsXG4gICAgdHc6ICd0aGlzIHdlZWsnLFxuICAgIG53OiAnbmV4dCB3ZWVrJyxcbiAgICB3ZWVrZW5kOiAnc2F0JyxcbiAgICB3ZTogJ3NhdCcsXG59O1xuXG4vKipcbiAqIEV4cGFuZCBhbnkgcmVjb2duaXNlZCBhYmJyZXZpYXRpb25zIGZvciBkYXRlcy5cbiAqXG4gKiBJbXBvcnRhbnQ6IHRoZSBhYmJyZXZpYXRpb24gaXMgb25seSBleHBhbmRlZCBpZiBpdCBpcyBmb29sb3dlZCBieSBhIHNwYWNlLlxuICpcbiAqIEZvciBleGFtcGxlLCAndGQgJyBpcyBleHBhbmRlZCB0byAndG9kYXknXG4gKiBAcGFyYW0gZGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZG9BdXRvY29tcGxldGUoZGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMoYWJicmV2aWF0aW9ucykpIHtcbiAgICAgICAgZGF0ZSA9IGRhdGUucmVwbGFjZShSZWdFeHAoYFxcXFxiJHtrZXl9XFxcXHNgLCAnaScpLCB2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbn1cbiIsICJpbXBvcnQgeyBTdGF0dXMgfSBmcm9tICcuLi9TdGF0dXMnO1xuaW1wb3J0IHsgUHJpb3JpdHksIFRhc2ssIFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMgfSBmcm9tICcuLi9UYXNrJztcbmltcG9ydCB7IERhdGVGYWxsYmFjayB9IGZyb20gJy4uL0RhdGVGYWxsYmFjayc7XG5pbXBvcnQgeyBTdGF0dXNSZWdpc3RyeSB9IGZyb20gJy4uL1N0YXR1c1JlZ2lzdHJ5JztcblxuLyoqXG4gKiBSZWFkIGFueSBtYXJrZG93biBsaW5lIGFuZCB0cmVhdCBpdCBhcyBhIHRhc2ssIGZvciB0aGUgcHVycG9zZXMgb2ZcbiAqIHRoZSAnQ3JlYXRlIG9yIGVkaXQgdGFzaycgbW9kYWwuXG4gKlxuICogVW5saWtlIHtAbGluayBUYXNrLmZyb21MaW5lfSwgd2hpY2ggb25seSBwcm9jZXNzZXMgdGFza3NcbiAqIGFscmVhZHkgcmVjb2duaXNlZCBieSB0aGUgVGFza3MgcGx1Z2luLCB0aGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbnkgbGluZS5cbiAqXG4gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiB0aGF0IGNvbW1hbmQsIHdoaWNoIGhhcyBiZWVuIHNlcGFyYXRlZFxuICogb3V0IHRvIGEgZGlmZmVyZW50IHNvdXJjZSBmaWxlIGluIG9yZGVyIHRvIGFsbG93IGl0cyBsb2dpYyB0byBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGxpbmUgLSBUaGUgbGluZSB0aGUgdXNlciBoYWQgY2xpY2tlZCBvbiB3aGVuIHJ1bm5pbmcgJ0NyZWF0ZSBvciBlZGl0IHRhc2snIGNvbW1hbmRcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgbGluZVxuICovXG5leHBvcnQgY29uc3QgdGFza0Zyb21MaW5lID0gKHsgbGluZSwgcGF0aCB9OiB7IGxpbmU6IHN0cmluZzsgcGF0aDogc3RyaW5nIH0pOiBUYXNrID0+IHtcbiAgICBjb25zdCBmYWxsYmFja0RhdGUgPSBEYXRlRmFsbGJhY2suZnJvbVBhdGgocGF0aCk7XG5cbiAgICBjb25zdCB0YXNrID0gVGFzay5mcm9tTGluZSh7XG4gICAgICAgIGxpbmUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHNlY3Rpb25TdGFydDogMCwgLy8gV2UgZG9uJ3QgbmVlZCB0aGlzIHRvIHRvZ2dsZSBpdCBoZXJlIGluIHRoZSBlZGl0b3IuXG4gICAgICAgIHNlY3Rpb25JbmRleDogMCwgLy8gV2UgZG9uJ3QgbmVlZCB0aGlzIHRvIHRvZ2dsZSBpdCBoZXJlIGluIHRoZSBlZGl0b3IuXG4gICAgICAgIHByZWNlZGluZ0hlYWRlcjogbnVsbCwgLy8gV2UgZG9uJ3QgbmVlZCB0aGlzIHRvIHRvZ2dsZSBpdCBoZXJlIGluIHRoZSBlZGl0b3IuXG4gICAgICAgIGZhbGxiYWNrRGF0ZSwgLy8gc2V0IHRoZSBzY2hlZHVsZWQgZGF0ZSBmcm9tIHRoZSBmaWxlbmFtZSwgc28gaXQgY2FuIGJlIGRpc3BsYXllZCBpbiB0aGUgZGlhbG9nXG4gICAgfSk7XG5cbiAgICBpZiAodGFzayAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGFzaztcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBhcmUgbm90IG9uIGEgbGluZSBvZiBhIHRhc2ssIHdlIHRha2Ugd2hhdCB3ZSBoYXZlLlxuICAgIC8vIFRoZSBub24tdGFzayBsaW5lIGNhbiBzdGlsbCBiZSBhIGNoZWNrbGlzdCwgZm9yIGV4YW1wbGUgaWYgaXQgaXMgbGFja2luZyB0aGUgZ2xvYmFsIGZpbHRlci5cbiAgICBjb25zdCBub25UYXNrTWF0Y2ggPSBsaW5lLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMubm9uVGFza1JlZ2V4KTtcbiAgICBpZiAobm9uVGFza01hdGNoID09PSBudWxsKSB7XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW47IGV2ZXJ5dGhpbmcgaW4gdGhlIHJlZ2V4IGlzIG9wdGlvbmFsLlxuICAgICAgICBjb25zb2xlLmVycm9yKCdUYXNrczogQ2Fubm90IGNyZWF0ZSB0YXNrIG9uIGxpbmU6JywgbGluZSk7XG4gICAgICAgIHJldHVybiBuZXcgVGFzayh7XG4gICAgICAgICAgICBzdGF0dXM6IFN0YXR1cy5UT0RPLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGluZGVudGF0aW9uOiAnJyxcbiAgICAgICAgICAgIGxpc3RNYXJrZXI6ICctJyxcbiAgICAgICAgICAgIHByaW9yaXR5OiBQcmlvcml0eS5Ob25lLFxuICAgICAgICAgICAgc3RhcnREYXRlOiBudWxsLFxuICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZTogbnVsbCxcbiAgICAgICAgICAgIGR1ZURhdGU6IG51bGwsXG4gICAgICAgICAgICBkb25lRGF0ZTogbnVsbCxcbiAgICAgICAgICAgIHJlY3VycmVuY2U6IG51bGwsXG4gICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSBmb2xsb3dpbmcgZmllbGRzIHRvIGVkaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICAgICAgc2VjdGlvblN0YXJ0OiAwLFxuICAgICAgICAgICAgc2VjdGlvbkluZGV4OiAwLFxuICAgICAgICAgICAgcHJlY2VkaW5nSGVhZGVyOiBudWxsLFxuICAgICAgICAgICAgYmxvY2tMaW5rOiAnJyxcbiAgICAgICAgICAgIHRhZ3M6IFtdLFxuICAgICAgICAgICAgb3JpZ2luYWxNYXJrZG93bjogJycsXG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlSXNJbmZlcnJlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGVudGF0aW9uOiBzdHJpbmcgPSBub25UYXNrTWF0Y2hbMV07XG4gICAgY29uc3QgbGlzdE1hcmtlciA9IG5vblRhc2tNYXRjaFsyXSA/PyAnLSc7XG4gICAgY29uc3Qgc3RhdHVzU3RyaW5nOiBzdHJpbmcgPSBub25UYXNrTWF0Y2hbNF0gPz8gJyAnO1xuICAgIGNvbnN0IHN0YXR1cyA9IFN0YXR1c1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuYnlTeW1ib2xPckNyZWF0ZShzdGF0dXNTdHJpbmcpO1xuXG4gICAgbGV0IGRlc2NyaXB0aW9uOiBzdHJpbmcgPSBub25UYXNrTWF0Y2hbNV07XG5cbiAgICBjb25zdCBibG9ja0xpbmtNYXRjaCA9IGxpbmUubWF0Y2goVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5ibG9ja0xpbmtSZWdleCk7XG4gICAgY29uc3QgYmxvY2tMaW5rID0gYmxvY2tMaW5rTWF0Y2ggIT09IG51bGwgPyBibG9ja0xpbmtNYXRjaFswXSA6ICcnO1xuXG4gICAgaWYgKGJsb2NrTGluayAhPT0gJycpIHtcbiAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuYmxvY2tMaW5rUmVnZXgsICcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRhc2soe1xuICAgICAgICBzdGF0dXMsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBwYXRoLFxuICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgbGlzdE1hcmtlcixcbiAgICAgICAgYmxvY2tMaW5rLFxuICAgICAgICBwcmlvcml0eTogUHJpb3JpdHkuTm9uZSxcbiAgICAgICAgc3RhcnREYXRlOiBudWxsLFxuICAgICAgICBzY2hlZHVsZWREYXRlOiBudWxsLFxuICAgICAgICBkdWVEYXRlOiBudWxsLFxuICAgICAgICBkb25lRGF0ZTogbnVsbCxcbiAgICAgICAgcmVjdXJyZW5jZTogbnVsbCxcbiAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgZm9sbG93aW5nIGZpZWxkcyB0byBlZGl0IGhlcmUgaW4gdGhlIGVkaXRvci5cbiAgICAgICAgc2VjdGlvblN0YXJ0OiAwLFxuICAgICAgICBzZWN0aW9uSW5kZXg6IDAsXG4gICAgICAgIHByZWNlZGluZ0hlYWRlcjogbnVsbCxcbiAgICAgICAgdGFnczogW10sXG4gICAgICAgIG9yaWdpbmFsTWFya2Rvd246ICcnLFxuICAgICAgICAvLyBOb3QgbmVlZGVkIHNpbmNlIHRoZSBpbmZlcnJlZCBzdGF0dXMgaXMgYWx3YXlzIHJlLWNvbXB1dGVkIGFmdGVyIHN1Ym1pdHRpbmcuXG4gICAgICAgIHNjaGVkdWxlZERhdGVJc0luZmVycmVkOiBmYWxzZSxcbiAgICB9KTtcbn07XG4iLCAiaW1wb3J0IHsgRWRpdG9yLCBNYXJrZG93blZpZXcsIFZpZXcgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBTdGF0dXNSZWdpc3RyeSB9IGZyb20gJy4uL1N0YXR1c1JlZ2lzdHJ5JztcblxuaW1wb3J0IHsgVGFzaywgVGFza1JlZ3VsYXJFeHByZXNzaW9ucyB9IGZyb20gJy4uL1Rhc2snO1xuXG5leHBvcnQgY29uc3QgdG9nZ2xlRG9uZSA9IChjaGVja2luZzogYm9vbGVhbiwgZWRpdG9yOiBFZGl0b3IsIHZpZXc6IFZpZXcpID0+IHtcbiAgICBpZiAoY2hlY2tpbmcpIHtcbiAgICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBub3QgaW4gYSBtYXJrZG93biB2aWV3LCB0aGUgY29tbWFuZCBzaG91bGRuJ3QgYmUgc2hvd24uXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgY29tbWFuZCBzaG91bGQgYWx3YXlzIHRyaWdnZXIgaW4gYSBtYXJrZG93biB2aWV3OlxuICAgICAgICAvLyAtIENvbnZlcnQgbGluZXMgdG8gbGlzdCBpdGVtcy5cbiAgICAgICAgLy8gLSBDb252ZXJ0IGxpc3QgaXRlbXMgdG8gdGFza3MuXG4gICAgICAgIC8vIC0gVG9nZ2xlIHRhc2tzJyBzdGF0dXMuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghKHZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gZHVlIHRvIGNoZWNrIGFib3ZlLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIGNlcnRhaW4gd2UgYXJlIGluIHRoZSBlZGl0b3IgZHVlIHRvIHRoZSBjaGVjayBhYm92ZS5cbiAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdDdXJzb3JQb3MgPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XG4gICAgY29uc3QgbGluZU51bWJlciA9IG9yaWdDdXJzb3JQb3MubGluZTtcbiAgICBjb25zdCBsaW5lID0gZWRpdG9yLmdldExpbmUobGluZU51bWJlcik7XG5cbiAgICBjb25zdCB0b2dnbGVkTGluZSA9IHRvZ2dsZUxpbmUobGluZSwgcGF0aCk7XG4gICAgZWRpdG9yLnNldExpbmUobGluZU51bWJlciwgdG9nZ2xlZExpbmUpO1xuXG4gICAgLyogQ3Vyc29yIHBvc2l0aW9ucyBhcmUgMC1iYXNlZCBmb3IgYm90aCBcImxpbmVcIiBhbmQgXCJjaFwiIG9mZnNldHMuXG4gICAgICogSWYgXCJjaFwiIG9mZnNldCBiaWdnZXIgdGhhbiB0aGUgbGluZSBsZW5ndGgsIHdpbGwganVzdCBjb250aW51ZSB0byBuZXh0IGxpbmUocykuXG4gICAgICogQnkgZGVmYXVsdCBcImVkaXRvci5zZXRMaW5lKClcIiBhcHBlYXJzIHRvIGVpdGhlciBrZWVwIHRoZSBjdXJzb3IgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBpZiBpdCBpcyBhbHJlYWR5IHRoZXJlLFxuICAgICAqIC4uLm9yIG1vdmUgaXQgdG8gdGhlIGJlZ2lubmluZyBpZiBpdCBpcyBhbnl3aGVyZSBlbHNlLiBMaWNhdCBleHBsYWluZWQgdGhpcyBvbiBEaXNjb3JkIGFzIFwic3RpY2tpbmdcIiB0byBvbmUgc2lkZSBvciBhbm90aGVyLlxuICAgICAqIFByZXZpb3VzbHksIFRhc2tzIHdvdWxkIHJlc2V0K21vdmUtcmlnaHQgdGhlIGN1cnNvciBpZiB0aGVyZSB3YXMgYW55IHRleHQgaW4gdGhlIGxpbmUsIGluY2x1ZGluZyBzb21ldGhpbmcgaW5zaWRlIHRoZSBjaGVja2JveCxcbiAgICAgKiBtb3ZpbmcgcmlnaHQgYnkgKHRvZ2dsZWRMaW5lLmxlbmd0aCAtIGxpbmUubGVuZ3RoKS4gKFN1cHBvc2VkbHksIGJ1dCBpdCBzdGlsbCBtb3ZlcyByaWdodCwganVzdCBieSBsZXNzLCBpZiB0aGUgdG9nZ2xlZExpbmUgaXMgc2hvcnRlciB0aGFuIHRoZSBvbGQpLlxuICAgICAqIFRoaXMgbWlzc2VkIHRoZSBuZWVkIHRvIG1vdmUgcmlnaHQgb24gdGhlIGJsYW5rIGxpbmUgdG8gXCItIFwiIGNhc2UgKGlzc3VlICM0NjApLlxuICAgICAqIFRoaXMgYWxzbyBtZWFudCB0aGUgY3Vyc29yIG1vdmVkIG5vbnNlbnNpY2FsbHkgaWYgaXQgd2FzIGJlZm9yZSBhbnkgbmV3bHkgaW5zZXJ0ZWQgdGV4dCxcbiAgICAgKiBzdWNoIGFzIGEgZG9uZSBkYXRlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUsIG9yIGFmdGVyIHRoZSBcIj5cIiB3aGVuIFwiPiAtXCIgY2hhbmdlZCB0byBcIj4gLSBbIF1cIi5cbiAgICAgKi9cbiAgICAvLyBSZXNldCB0aGUgY3Vyc29yLiBVc2UgdGhlIGRpZmZlcmVuY2UgaW4gbGluZSBsZW5ndGhzIGFuZCBvcmlnaW5hbCBjdXJzb3IgcG9zaXRpb24gdG8gZGV0ZXJtaW5lIGJlaGF2aW9yXG4gICAgZWRpdG9yLnNldEN1cnNvcih7XG4gICAgICAgIGxpbmU6IG9yaWdDdXJzb3JQb3MubGluZSxcbiAgICAgICAgY2g6IGNhbGN1bGF0ZUN1cnNvck9mZnNldChvcmlnQ3Vyc29yUG9zLmNoLCBsaW5lLCB0b2dnbGVkTGluZSksXG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdG9nZ2xlTGluZSA9IChsaW5lOiBzdHJpbmcsIHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGxldCB0b2dnbGVkTGluZSA9IGxpbmU7XG5cbiAgICBjb25zdCB0YXNrID0gVGFzay5mcm9tTGluZSh7XG4gICAgICAgIC8vIFdoeSBhcmUgd2UgdXNpbmcgVGFzay5mcm9tTGluZSBpbnN0ZWFkIG9mIHRoZSBDYWNoZSBoZXJlP1xuICAgICAgICBsaW5lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBzZWN0aW9uU3RhcnQ6IDAsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICBzZWN0aW9uSW5kZXg6IDAsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICBwcmVjZWRpbmdIZWFkZXI6IG51bGwsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICBmYWxsYmFja0RhdGU6IG51bGwsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgIH0pO1xuICAgIGlmICh0YXNrICE9PSBudWxsKSB7XG4gICAgICAgIHRvZ2dsZWRMaW5lID0gdG9nZ2xlVGFzayh0YXNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgdGFzayBpcyBudWxsIHRoaXMgbWVhbnMgdGhhdCB3ZSBoYXZlIG9uZSBvZjpcbiAgICAgICAgLy8gMS4gYSByZWd1bGFyIGNoZWNrbGlzdCBpdGVtXG4gICAgICAgIC8vIDIuIGEgbGlzdCBpdGVtXG4gICAgICAgIC8vIDMuIGEgc2ltcGxlIHRleHQgbGluZVxuICAgICAgICAvLyA0LiBhIHN0YW5kYXJkIHRhc2ssIGJ1dCB3aGljaCBkb2VzIG5vdCBjb250YWluIHRoZSBnbG9iYWwgZmlsdGVyLCB0byBiZSB0b2dnbGVkLCBidXQgbm8gZG9uZSBkYXRlIGFkZGVkLlxuXG4gICAgICAgIC8vIFRoZSB0YXNrIHJlZ2V4IHdpbGwgbWF0Y2ggY2hlY2tsaXN0IGl0ZW1zLlxuICAgICAgICBjb25zdCByZWdleE1hdGNoID0gbGluZS5tYXRjaChUYXNrUmVndWxhckV4cHJlc3Npb25zLnRhc2tSZWdleCk7XG4gICAgICAgIGlmIChyZWdleE1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUb2dnbGUgdGhlIHN0YXR1cyBvZiB0aGUgY2hlY2tsaXN0IGl0ZW0uXG4gICAgICAgICAgICBjb25zdCBzdGF0dXNTdHJpbmcgPSByZWdleE1hdGNoWzNdO1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5ieVN5bWJvbChzdGF0dXNTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgbmV3U3RhdHVzU3RyaW5nID0gc3RhdHVzLm5leHRTdGF0dXNTeW1ib2w7XG4gICAgICAgICAgICB0b2dnbGVkTGluZSA9IGxpbmUucmVwbGFjZShUYXNrUmVndWxhckV4cHJlc3Npb25zLnRhc2tSZWdleCwgYCQxLSBbJHtuZXdTdGF0dXNTdHJpbmd9XSAkNGApO1xuICAgICAgICB9IGVsc2UgaWYgKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMubGlzdEl0ZW1SZWdleC50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBsaXN0IGl0ZW0gdG8gYSBjaGVja2xpc3QgaXRlbS5cbiAgICAgICAgICAgIHRvZ2dsZWRMaW5lID0gbGluZS5yZXBsYWNlKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMubGlzdEl0ZW1SZWdleCwgJyQxJDIgWyBdJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBsaW5lIHRvIGEgbGlzdCBpdGVtLlxuICAgICAgICAgICAgdG9nZ2xlZExpbmUgPSBsaW5lLnJlcGxhY2UoVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5pbmRlbnRhdGlvblJlZ2V4LCAnJDEtICcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvZ2dsZWRMaW5lO1xufTtcblxuY29uc3QgdG9nZ2xlVGFzayA9ICh0YXNrOiBUYXNrKTogc3RyaW5nID0+IHtcbiAgICAvLyBUb2dnbGluZyBhIHJlY3VycmluZyB0YXNrIHdpbGwgcHJvZHVjZSB0d28gVGFza3NcbiAgICBjb25zdCB0b2dnbGVkVGFza3MgPSB0YXNrLnRvZ2dsZSgpO1xuICAgIHJldHVybiB0b2dnbGVkVGFza3MubWFwKCh0YXNrOiBUYXNrKSA9PiB0YXNrLnRvRmlsZUxpbmVTdHJpbmcoKSkuam9pbignXFxuJyk7XG59O1xuXG4vKiBDYXNlcyAoYW5vdGhlciB3YXkpOlxuMCkgTGluZSBnb3Qgc2hvcnRlcjogZG9uZSBkYXRlIHJlbW92ZWQgZnJvbSBlbmQgb2YgdGFzaywgY3Vyc29yIHNob3VsZCByZXNldCBvciBiZSBtb3ZlZCB0byBuZXcgZW5kIGlmIHJlc2V0IHBvc2l0aW9uIGlzIHRvbyBsb25nLlxuMSkgTGluZSBzdGF5ZWQgdGhlIHNhbWUgbGVuZ3RoOiBDaGVja2luZyAmIHVuY2hlY2tpbmcgdGV4dGJveCB0aGF0IGlzIG5vdCBhIHRhc2sgLSBjdXJzb3Igc2hvdWxkIHJlc2V0LlxuMikgTGluZSBnb3QgbG9uZ2VyOlxuICAgIGEpIExpc3QgbWFya2VyIGNvdWxkIGhhdmUgYmVlbiBhZGRlZC4gRmluZCBpdCBpbiBuZXcgdGV4dDogaWYgY3Vyc29yIHdhcyBhdCBvciByaWdodCBvZiB3aGVyZSBpdCB3YXMgYWRkZWQsIG1vdmUgdGhlIGN1cnNvciByaWdodC5cbiAgICBiKSBFbXB0eSBjaGVja2JveCBjb3VsZCBoYXZlIGJlZW4gYWRkZWQuIElmIGN1cnNvciB3YXMgYWZ0ZXIgdGhlIGxpc3QgbWFya2VyIChpbiBvbGQgb3IgbmV3KSwgaXQgc2hvdWxkIG1vdmUgcmlnaHQuXG4gICAgYykgRG9uZSBlbW9qaSBhbmQgZGF0ZSBjb3VsZCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGVuZC4gQ3Vyc29yIHNob3VsZCByZXNldCBpZiAwLCBhbmQgc3RheSBlbmQgb2YgbGluZSBvdGhlcndpc2UuXG4gICAgZCkgUmVjdXJyaW5nIHRhc2sgY291bGQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgYW5kIGRvbmUgZW1vamkgYW5kIGRhdGUgYWRkZWQgdG8gdGhlIGVuZC4gQ3VycmVudCBiZWhhdmlvciBhZGRzIHNvIG11Y2ggdG8gdGhlIG9mZnNldCB0byBtYWtlIHRoaXMgcmlnaHQuXG5cblNvIGN1cnNvciBzaG91bGQgYmUgcmVzZXQgaWYgMCwgd2hpY2ggaW5jbHVkZXMgYmVpbmcgbW92ZWQgdG8gbmV3IGVuZCBpZiBnb3Qgc2hvcnRlci4gVGhlbiBtaWdodCBuZWVkIHRvIG1vdmUgcmlnaHQgMiBvciAzLlxuKi9cbmV4cG9ydCBjb25zdCBjYWxjdWxhdGVDdXJzb3JPZmZzZXQgPSAob3JpZ0N1cnNvckNoOiBudW1iZXIsIGxpbmU6IHN0cmluZywgdG9nZ2xlZExpbmU6IHN0cmluZykgPT4ge1xuICAgIGxldCBuZXdMaW5lTGVuID0gdG9nZ2xlZExpbmUubGVuZ3RoO1xuICAgIGlmIChuZXdMaW5lTGVuIDw9IGxpbmUubGVuZ3RoKSB7XG4gICAgICAgIC8vIExpbmUgZ290IHNob3J0ZXIgb3Igc3RheWVkIHNhbWUgbGVuZ3RoLiBSZXNldCBjdXJzb3IgdG8gb3JpZ2luYWwgcG9zaXRpb24sIGNhcHBlZCBhdCBlbmQgb2YgbGluZS5cbiAgICAgICAgcmV0dXJuIG9yaWdDdXJzb3JDaCA+PSB0b2dnbGVkTGluZS5sZW5ndGggPyBuZXdMaW5lTGVuIDogb3JpZ0N1cnNvckNoO1xuICAgIH1cblxuICAgIC8vIFNwZWNpYWwtY2FzZSBmb3IgZG9uZS1kYXRlIGFwcGVuZCwgZml4ZXMgIzQ0OVxuICAgIGNvbnN0IGRvbmVEYXRlTGVuZ3RoID0gJyBcdTI3MDUgWVlZWS1NTS1ERCcubGVuZ3RoO1xuICAgIGlmICh0b2dnbGVkTGluZS5tYXRjaChUYXNrUmVndWxhckV4cHJlc3Npb25zLmRvbmVEYXRlUmVnZXgpICYmIG5ld0xpbmVMZW4gLSBsaW5lLmxlbmd0aCA+PSBkb25lRGF0ZUxlbmd0aCkge1xuICAgICAgICBuZXdMaW5lTGVuIC09IGRvbmVEYXRlTGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSByZWN1cnJpbmcgdGFza3M6IGVudGlyZSBsaW5lIHBsdXMgbmV3bGluZSBwcmVwZW5kZWQuIEZpeCBmb3IgIzQ0OSBhYm92ZSBtZWFucyBhcHBlbmRlZCBkb25lIGRhdGUgdHJlYXRlZCBjb3JyZWN0bHkuXG4gICAgaWYgKG5ld0xpbmVMZW4gPj0gMiAqIGxpbmUubGVuZ3RoICYmIHRvZ2dsZWRMaW5lLnNlYXJjaCgnLitcXG4uKycpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gb3JpZ0N1cnNvckNoICsgbmV3TGluZUxlbiAtIGxpbmUubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qIExpbmUgZ290IGxvbmdlciwgbm90IGEgcmVjdXJyaW5nIHRhc2suIFdlcmUgdGhlIGFkZGVkIGNoYXJhY3RlcnMgYmVmb3JlIG9yIGFmdGVyIHRoZSBjdXJzb3I/XG4gICAgICogQXQgdGhpcyBwb2ludCB0aGUgbGluZSBpcyBhdCBsZWFzdCBhIGxpc3QgaXRlbS4gRmluZCB0aGUgZmlyc3QgbGlzdCBtYXJrZXIuICovXG4gICAgY29uc3QgZmlyc3RMaXN0SXRlbUNoYXIgPSB0b2dnbGVkTGluZS5zZWFyY2goL1stKl0vKTtcbiAgICBpZiAob3JpZ0N1cnNvckNoIDwgZmlyc3RMaXN0SXRlbUNoYXIpIHtcbiAgICAgICAgLy8gQ3Vyc29yIHdhcyBpbiBpbmRlbnRhdGlvbi4gUmVzZXQgdG8gd2hlcmUgaXQgd2FzLlxuICAgICAgICByZXR1cm4gb3JpZ0N1cnNvckNoO1xuICAgIH1cblxuICAgIHJldHVybiBvcmlnQ3Vyc29yQ2ggKyBuZXdMaW5lTGVuIC0gbGluZS5sZW5ndGg7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgQXBwLCBFZGl0b3IsIFBsdWdpbiwgVmlldyB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IGNyZWF0ZU9yRWRpdCB9IGZyb20gJy4vQ3JlYXRlT3JFZGl0JztcblxuaW1wb3J0IHsgdG9nZ2xlRG9uZSB9IGZyb20gJy4vVG9nZ2xlRG9uZSc7XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kcyB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcblxuICAgIHByaXZhdGUgZ2V0IGFwcCgpOiBBcHAge1xuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW4uYXBwO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHsgcGx1Z2luIH06IHsgcGx1Z2luOiBQbHVnaW4gfSkge1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblxuICAgICAgICBwbHVnaW4uYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogJ2VkaXQtdGFzaycsXG4gICAgICAgICAgICBuYW1lOiAnQ3JlYXRlIG9yIGVkaXQgdGFzaycsXG4gICAgICAgICAgICBpY29uOiAncGVuY2lsJyxcbiAgICAgICAgICAgIGVkaXRvckNoZWNrQ2FsbGJhY2s6IChjaGVja2luZzogYm9vbGVhbiwgZWRpdG9yOiBFZGl0b3IsIHZpZXc6IFZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlT3JFZGl0KGNoZWNraW5nLCBlZGl0b3IsIHZpZXcsIHRoaXMuYXBwKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBsdWdpbi5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiAndG9nZ2xlLWRvbmUnLFxuICAgICAgICAgICAgbmFtZTogJ1RvZ2dsZSB0YXNrIGRvbmUnLFxuICAgICAgICAgICAgaWNvbjogJ2NoZWNrLWluLWNpcmNsZScsXG4gICAgICAgICAgICBlZGl0b3JDaGVja0NhbGxiYWNrOiB0b2dnbGVEb25lLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFdmVudFJlZiwgRXZlbnRzIGFzIE9ic2lkaWFuRXZlbnRzIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFN0YXRlIH0gZnJvbSAnLi9DYWNoZSc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuXG5lbnVtIEV2ZW50IHtcbiAgICBDYWNoZVVwZGF0ZSA9ICdvYnNpZGlhbi10YXNrcy1wbHVnaW46Y2FjaGUtdXBkYXRlJyxcbiAgICBSZXF1ZXN0Q2FjaGVVcGRhdGUgPSAnb2JzaWRpYW4tdGFza3MtcGx1Z2luOnJlcXVlc3QtY2FjaGUtdXBkYXRlJyxcbn1cblxuaW50ZXJmYWNlIENhY2hlVXBkYXRlRGF0YSB7XG4gICAgdGFza3M6IFRhc2tbXTtcbiAgICBzdGF0ZTogU3RhdGU7XG59XG5cbmV4cG9ydCBjbGFzcyBUYXNrc0V2ZW50cyB7XG4gICAgcHJpdmF0ZSBvYnNpZGlhbkV2ZW50czogT2JzaWRpYW5FdmVudHM7XG5cbiAgICBjb25zdHJ1Y3Rvcih7IG9ic2lkaWFuRXZlbnRzIH06IHsgb2JzaWRpYW5FdmVudHM6IE9ic2lkaWFuRXZlbnRzIH0pIHtcbiAgICAgICAgdGhpcy5vYnNpZGlhbkV2ZW50cyA9IG9ic2lkaWFuRXZlbnRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNhY2hlVXBkYXRlKGhhbmRsZXI6IChjYWNoZURhdGE6IENhY2hlVXBkYXRlRGF0YSkgPT4gdm9pZCk6IEV2ZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5FdmVudHMub24oRXZlbnQuQ2FjaGVVcGRhdGUsIGhhbmRsZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyQ2FjaGVVcGRhdGUoY2FjaGVEYXRhOiBDYWNoZVVwZGF0ZURhdGEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vYnNpZGlhbkV2ZW50cy50cmlnZ2VyKEV2ZW50LkNhY2hlVXBkYXRlLCBjYWNoZURhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblJlcXVlc3RDYWNoZVVwZGF0ZShoYW5kbGVyOiAoZm46IChjYWNoZURhdGE6IENhY2hlVXBkYXRlRGF0YSkgPT4gdm9pZCkgPT4gdm9pZCk6IEV2ZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5FdmVudHMub24oRXZlbnQuUmVxdWVzdENhY2hlVXBkYXRlLCBoYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlclJlcXVlc3RDYWNoZVVwZGF0ZShmbjogKGNhY2hlRGF0YTogQ2FjaGVVcGRhdGVEYXRhKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub2JzaWRpYW5FdmVudHMudHJpZ2dlcihFdmVudC5SZXF1ZXN0Q2FjaGVVcGRhdGUsIGZuKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmKGV2ZW50UmVmOiBFdmVudFJlZik6IHZvaWQge1xuICAgICAgICB0aGlzLm9ic2lkaWFuRXZlbnRzLm9mZnJlZihldmVudFJlZik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnQ29uZmlnL1NldHRpbmdzJztcblxuaW1wb3J0IHR5cGUgeyBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi9UYXNrJztcblxuZXhwb3J0IGNsYXNzIElubGluZVJlbmRlcmVyIHtcbiAgICBjb25zdHJ1Y3Rvcih7IHBsdWdpbiB9OiB7IHBsdWdpbjogUGx1Z2luIH0pIHtcbiAgICAgICAgcGx1Z2luLnJlZ2lzdGVyTWFya2Rvd25Qb3N0UHJvY2Vzc29yKHRoaXMuX21hcmtkb3duUG9zdFByb2Nlc3Nvci5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFya2Rvd25Qb3N0UHJvY2Vzc29yID0gdGhpcy5fbWFya2Rvd25Qb3N0UHJvY2Vzc29yLmJpbmQodGhpcyk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHJlbmRlcnMgYSBmaWxlJ3MgdGFzayBsaXN0IHdoZW4gcmVuZGVyZWQgaW4gUmVhZGluZyBWaWV3LCB1c2luZyByb3VnaGx5IHRoZSBzYW1lIHBpcGVsaW5lXG4gICAgICogb2YgUXVlcnlSZW5kZXJlciAoZS5nLiBpdCByZW1vdmVzIHRoZSBnbG9iYWwgZmlsdGVyIGFuZCBoYW5kbGVzIG90aGVyIGZvcm1hdHRpbmcpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgX21hcmtkb3duUG9zdFByb2Nlc3NvcihlbGVtZW50OiBIVE1MRWxlbWVudCwgY29udGV4dDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IGdsb2JhbEZpbHRlciB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgY29uc3QgcmVuZGVyZWRFbGVtZW50cyA9IGVsZW1lbnQuZmluZEFsbCgnLnRhc2stbGlzdC1pdGVtJykuZmlsdGVyKCh0YXNrSXRlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGluZXNUZXh0ID0gdGFza0l0ZW0udGV4dENvbnRlbnQ/LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIGlmIChsaW5lc1RleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT25seSB0aGUgZmlyc3QgbGluZS4gQ2FuIGJlIG11bHRpcGxlIGxpbmVzIGlmIGFuIExJIGVsZW1lbnQgY29udGFpbnMgYW4gVUwuXG4gICAgICAgICAgICAvLyBXYW50IHRvIG1hdGNoIHRoZSB0b3AgbGV2ZWwgTEkgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjaGlsZHJlbi5cbiAgICAgICAgICAgIC8vIFRoZXJlIHdhcyBhIGZhbHNlIHBvc2l0aXZlLCB3aGVuIHRoZSBMSSB3YXNuJ3QgYSB0YXNrIGl0c2VsZiwgYnV0IGNvbnRhaW5lZCB0aGVcbiAgICAgICAgICAgIC8vIGdsb2JhbCBmaWx0ZXIgaW4gY2hpbGQgTElzLlxuICAgICAgICAgICAgbGV0IGZpcnN0TGluZVRleHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBUaGUgZmlyc3QgbGluZSBpcyB0aGUgZmlyc3QgbGluZSB0aGF0IGlzIG5vdCBlbXB0eS4gRW1wdHkgbGluZXMgY2FuIGV4aXN0IHdoZW5cbiAgICAgICAgICAgIC8vIHRoZSBjaGVja2xpc3QgaW4gbWFya2Rvd24gaW5jbHVkZXMgYmxhbmsgbGluZXMgKHNlZSAjMzEzKS5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNUZXh0Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVzVGV4dFtpXSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RMaW5lVGV4dCA9IGxpbmVzVGV4dFtpXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmlyc3RMaW5lVGV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZpcnN0TGluZVRleHQuaW5jbHVkZXMoZ2xvYmFsRmlsdGVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZW5kZXJlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gTm8gdGFza3MgbWVhbnMgbm90aGluZyB0byBkby5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdGggPSBjb250ZXh0LnNvdXJjZVBhdGg7XG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBjb250ZXh0LmdldFNlY3Rpb25JbmZvKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChzZWN0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBXZSBjYW5ub3QgcHJvY2VzcyB0aGUgcmVuZGVyIHdpdGhvdXQgdGhlIHNlY3Rpb24gaW5mby5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVMaW5lcyA9IHNlY3Rpb24udGV4dC5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgbGV0IHNlY3Rpb25JbmRleCA9IDA7XG4gICAgICAgIGNvbnN0IGZpbGVUYXNrczogVGFza1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGxpbmVOdW1iZXIgPSBzZWN0aW9uLmxpbmVTdGFydDsgbGluZU51bWJlciA8PSBzZWN0aW9uLmxpbmVFbmQ7IGxpbmVOdW1iZXIrKykge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IGZpbGVMaW5lc1tsaW5lTnVtYmVyXTtcbiAgICAgICAgICAgIGlmIChsaW5lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBlbmQgdXAgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIGZpbGUsXG4gICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IHByb2Nlc3MgdGhpcyB0YXNrLlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YXNrID0gVGFzay5mcm9tTGluZSh7XG4gICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIHNlY3Rpb25TdGFydDogc2VjdGlvbi5saW5lU3RhcnQsXG4gICAgICAgICAgICAgICAgc2VjdGlvbkluZGV4LFxuICAgICAgICAgICAgICAgIHByZWNlZGluZ0hlYWRlcjogbnVsbCwgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgcHJlY2VkaW5nIGhlYWRlciBmb3IgaW4tbGluZSByZW5kZXJpbmcuXG4gICAgICAgICAgICAgICAgZmFsbGJhY2tEYXRlOiBudWxsLCAvLyBXZSBkb24ndCBuZWVkIHRoZSBmYWxsYmFjayBkYXRlIGZvciBpbi1saW5lIHJlbmRlcmluZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZpbGVUYXNrcy5wdXNoKHRhc2spO1xuICAgICAgICAgICAgICAgIHNlY3Rpb25JbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlY3Rpb24gaW5kZXggaXMgdGhlIG50aCB0YXNrIHdpdGhpbiB0aGlzIHNlY3Rpb24uXG4gICAgICAgIGZvciAobGV0IHNlY3Rpb25JbmRleCA9IDA7IHNlY3Rpb25JbmRleCA8IHJlbmRlcmVkRWxlbWVudHMubGVuZ3RoOyBzZWN0aW9uSW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgdGFzayA9IGZpbGVUYXNrc1tzZWN0aW9uSW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRFbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50c1tzZWN0aW9uSW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAodGFzayA9PT0gdW5kZWZpbmVkIHx8IHJlbmRlcmVkRWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gQXNzdW1pbmcgbWF0Y2ggb2YgdGFza3MgaW4gZmlsZSBhbmQgcmVuZGVyIHByZXZpZXcuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBtaXMtbWF0Y2ggaW4gdGhlIG51bWJlcnMsIHdlIHN0aWxsIHByb2Nlc3NcbiAgICAgICAgICAgICAgICAvLyB3aGF0IHdlIGNhbi5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGF0YUxpbmU6IHN0cmluZyA9IHJlbmRlcmVkRWxlbWVudC5nZXRBdHRyKCdkYXRhLWxpbmUnKSA/PyAnMCc7XG4gICAgICAgICAgICBjb25zdCBsaXN0SW5kZXg6IG51bWJlciA9IE51bWJlci5wYXJzZUludChkYXRhTGluZSwgMTApO1xuICAgICAgICAgICAgY29uc3QgdGFza0VsZW1lbnQgPSBhd2FpdCB0YXNrLnRvTGkoe1xuICAgICAgICAgICAgICAgIHBhcmVudFVsRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgICAgICBsaXN0SW5kZXgsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHJlbmRlcmVkIGVsZW1lbnQgY29udGFpbnMgYSBzdWItbGlzdCBvciBzdWItZGl2IChlLmcuIHRoZVxuICAgICAgICAgICAgLy8gZm9sZGluZyBhcnJvdyksIHdlIG5lZWQgdG8ga2VlcCBpdC5cbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGRyZW4gPSByZW5kZXJlZEVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyZWRDaGlsZHJlbi5sZW5ndGg7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGQgPSByZW5kZXJlZENoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlZENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkaXYnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2tFbGVtZW50LnByZXBlbmQocmVuZGVyZWRDaGlsZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJlZENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd1bCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFza0VsZW1lbnQuYXBwZW5kKHJlbmRlcmVkQ2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmUtc2V0IHRoZSBvcmlnaW5hbCBmb290bm90ZXMuXG4gICAgICAgICAgICAvLyBUaGUgbmV3bHkgcmVuZGVyZWQgSFRNTCB3b24ndCBoYXZlIHRoZSBjb3JyZWN0IGluZGV4ZXMgYW5kIGxpbmtzXG4gICAgICAgICAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBkb2N1bWVudC5cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRm9vdG5vdGVzID0gcmVuZGVyZWRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWZvb3Rub3RlLWlkXScpO1xuICAgICAgICAgICAgY29uc3QgbmV3Rm9vdG5vdGVzID0gdGFza0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZm9vdG5vdGUtaWRdJyk7XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxGb290bm90ZXMubGVuZ3RoID09PSBuZXdGb290bm90ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlnaW5hbEZvb3Rub3Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBuZXdGb290bm90ZXNbaV0ucmVwbGFjZVdpdGgob3JpZ2luYWxGb290bm90ZXNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50LnJlcGxhY2VXaXRoKHRhc2tFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBFZGl0b3JWaWV3LCBWaWV3UGx1Z2luIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblZhbHVlIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuXG5leHBvcnQgY29uc3QgbmV3TGl2ZVByZXZpZXdFeHRlbnNpb24gPSAoKSA9PiB7XG4gICAgcmV0dXJuIFZpZXdQbHVnaW4uZnJvbUNsYXNzKExpdmVQcmV2aWV3RXh0ZW5zaW9uKTtcbn07XG5cbmNsYXNzIExpdmVQcmV2aWV3RXh0ZW5zaW9uIGltcGxlbWVudHMgUGx1Z2luVmFsdWUge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlldzogRWRpdG9yVmlldztcblxuICAgIGNvbnN0cnVjdG9yKHZpZXc6IEVkaXRvclZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcblxuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrRXZlbnQgPSB0aGlzLmhhbmRsZUNsaWNrRXZlbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy52aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrRXZlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ2xpY2tFdmVudChldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7IHRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgICAgLy8gT25seSBoYW5kbGUgY2hlY2tib3ggY2xpY2tzLlxuICAgICAgICBpZiAoIXRhcmdldCB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHx8IHRhcmdldC50eXBlICE9PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBSaWdodCBub3cgT2JzaWRpYW4gQVBJIGRvZXMgbm90IGdpdmUgdXMgYSB3YXkgdG8gaGFuZGxlIGNoZWNrYm94IGNsaWNrcyBpbnNpZGUgcmVuZGVyZWQtd2lkZ2V0cy1pbi1MUCBzdWNoIGFzXG4gICAgICAgICAqIGNhbGxvdXRzLCB0YWJsZXMsIGFuZCB0cmFuc2NsdXNpb25zIGJlY2F1c2UgYHRoaXMudmlldy5wb3NBdERPTWAgd2lsbCByZXR1cm4gdGhlIGJlZ2lubmluZyBvZiB0aGUgd2lkZ2V0XG4gICAgICAgICAqIGFzIHRoZSBwb3NpdGlvbiBmb3IgYW55IGNsaWNrIGluc2lkZSB0aGUgd2lkZ2V0LlxuICAgICAgICAgKiBGb3IgY2FsbG91dHMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgdGFzayB3aWxsIG5ldmVyIGJlIGZvdW5kLCBzaW5jZSB0aGUgYGxpbmVBdGAgd2lsbCBiZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjYWxsb3V0LlxuICAgICAgICAgKiBUaGVyZWZvcmUsIHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZSBwb3AtdXAgdXNpbmcgT2JzaWRpYW4ncyBcIk5vdGljZVwiIGZlYXR1cmUsIGxvZyBhIGNvbnNvbGUgd2FybmluZywgdGhlbiByZXR1cm4uXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8vIFRhc2tzIGZyb20gXCJ0YXNrXCIgcXVlcnkgY29kZWJsb2NrcyBoYW5kbGUgdGhlbXNlbHZlcyB0aGFua3MgdG8gYHRvTGlgLCBzbyBiZSBzcGVjaWZpYyBhYm91dCBlcnJvciBtZXNzYWdpbmcsIGJ1dCBzdGlsbCByZXR1cm4uXG4gICAgICAgIGNvbnN0IGFuY2VzdG9yID0gdGFyZ2V0LmNsb3Nlc3QoJ3VsLnBsdWdpbi10YXNrcy1xdWVyeS1yZXN1bHQsIGRpdi5jYWxsb3V0LWNvbnRlbnQnKTtcbiAgICAgICAgaWYgKGFuY2VzdG9yKSB7XG4gICAgICAgICAgICBpZiAoYW5jZXN0b3IubWF0Y2hlcygnZGl2LmNhbGxvdXQtY29udGVudCcpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXJyb3IgbWVzc2FnZSBmb3Igbm93LlxuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgICAgICAgICAgICdvYnNpZGlhbi10YXNrcy1wbHVnaW4gd2FybmluZzogVGFza3MgY2Fubm90IGFkZCBvciByZW1vdmUgY29tcGxldGlvbiBkYXRlcyBvciBtYWtlIHRoZSBuZXh0IGNvcHkgb2YgYSByZWN1cnJpbmcgdGFzayBmb3IgdGFza3Mgd3JpdHRlbiBpbnNpZGUgYSBjYWxsb3V0IHdoZW4geW91IGNsaWNrIHRoZWlyIGNoZWNrYm94ZXMgaW4gTGl2ZSBQcmV2aWV3LiBcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ0lmIHlvdSB3YW50ZWQgVGFza3MgdG8gZG8gdGhlc2UgdGhpbmdzLCBwbGVhc2UgdW5kbyB5b3VyIGNoYW5nZSwgdGhlbiBlaXRoZXIgY2xpY2sgdGhlIGxpbmUgb2YgdGhlIHRhc2sgYW5kIHVzZSB0aGUgXCJUb2dnbGUgVGFzayBEb25lXCIgY29tbWFuZCwgb3Igc3dpdGNoIHRvIFJlYWRpbmcgVmlldyB0byBjbGljayB0aGUgY2hlY2tib3guJztcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgICAgICAgICAgICBuZXcgTm90aWNlKG1zZywgNDUwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcy52aWV3O1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMudmlldy5wb3NBdERPTSh0YXJnZXQpO1xuICAgICAgICBjb25zdCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHRhc2sgPSBUYXNrLmZyb21MaW5lKHtcbiAgICAgICAgICAgIGxpbmU6IGxpbmUudGV4dCxcbiAgICAgICAgICAgIC8vIE5vbmUgb2YgdGhpcyBkYXRhIGlzIHJlbGV2YW50IGhlcmUuXG4gICAgICAgICAgICAvLyBUaGUgdGFzayBpcyBjcmVhdGVkLCB0b2dnbGVkLCBhbmQgd3JpdHRlbiBiYWNrIHRvIHRoZSBDTTYgZG9jdW1lbnQsXG4gICAgICAgICAgICAvLyByZXBsYWNpbmcgdGhlIG9sZCB0YXNrIGluLXBsYWNlLlxuICAgICAgICAgICAgcGF0aDogJycsXG4gICAgICAgICAgICBzZWN0aW9uU3RhcnQ6IDAsXG4gICAgICAgICAgICBzZWN0aW9uSW5kZXg6IDAsXG4gICAgICAgICAgICBwcmVjZWRpbmdIZWFkZXI6IG51bGwsXG4gICAgICAgICAgICBmYWxsYmFja0RhdGU6IG51bGwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnNvbGUuZGVidWcoYExpdmUgUHJldmlldyBFeHRlbnNpb246IHRvZ2dsZSBjYWxsZWQuIFBvc2l0aW9uOiAke3Bvc2l0aW9ufSBMaW5lOiAke2xpbmUudGV4dH1gKTtcblxuICAgICAgICAvLyBPbmx5IGhhbmRsZSBjaGVja2JveGVzIG9mIHRhc2tzLlxuICAgICAgICBpZiAodGFzayA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBwcmV2ZW50IGRlZmF1bHQgc28gdGhhdCB0aGUgY2hlY2tib3ggaXMgb25seSBoYW5kbGVkIGJ5IHVzIGFuZCBub3Qgb2JzaWRpYW4uXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgLy8gQ2xpY2tlZCBvbiBhIHRhc2sncyBjaGVja2JveC4gVG9nZ2xlIHRoZSB0YXNrIGFuZCBzZXQgaXQuXG4gICAgICAgIGNvbnN0IHRvZ2dsZWQgPSB0YXNrLnRvZ2dsZSgpO1xuICAgICAgICBjb25zdCB0b2dnbGVkU3RyaW5nID0gdG9nZ2xlZC5tYXAoKHQpID0+IHQudG9GaWxlTGluZVN0cmluZygpKS5qb2luKHN0YXRlLmxpbmVCcmVhayk7XG5cbiAgICAgICAgLy8gQ3JlYXRlcyBhIENvZGVNaXJyb3IgdHJhbnNhY3Rpb24gaW4gb3JkZXIgdG8gdXBkYXRlIHRoZSBkb2N1bWVudC5cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBzdGF0ZS51cGRhdGUoe1xuICAgICAgICAgICAgY2hhbmdlczoge1xuICAgICAgICAgICAgICAgIGZyb206IGxpbmUuZnJvbSxcbiAgICAgICAgICAgICAgICB0bzogbGluZS50byxcbiAgICAgICAgICAgICAgICBpbnNlcnQ6IHRvZ2dsZWRTdHJpbmcsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHRyYW5zYWN0aW9uKTtcblxuICAgICAgICAvLyBEaXJ0eSB3b3JrYXJvdW5kLlxuICAgICAgICAvLyBXaGlsZSB0aGUgY29kZSBpbiB0aGlzIG1ldGhvZCBwcm9wZXJseSB1cGRhdGVzIHRoZSBgY2hlY2tlZGAgc3RhdGVcbiAgICAgICAgLy8gb2YgdGhlIHRhcmdldCBjaGVja2JveCwgc29tZSBPYnNpZGlhbiBpbnRlcm5hbHMgcmV2ZXJ0IHRoZSBzdGF0ZS5cbiAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBjaGVja2JveCB3b3VsZCByZW1haW4gaW4gaXRzIG9yaWdpbmFsIGBjaGVja2VkYFxuICAgICAgICAvLyBzdGF0ZSAoYHRydWVgIG9yIGBmYWxzZWApLCBldmVuIHRob3VnaCB0aGUgdW5kZXJseWluZyBkb2N1bWVudFxuICAgICAgICAvLyB1cGRhdGVzIGNvcnJlY3RseS5cbiAgICAgICAgLy8gQXMgYSBcImZpeFwiLCB3ZSBzZXQgdGhlIGNoZWNrYm94J3MgYGNoZWNrZWRgIHN0YXRlICphZ2FpbiogYWZ0ZXIgYVxuICAgICAgICAvLyB0aW1lb3V0IHRvIHJldmVydCBPYnNpZGlhbidzIHdyb25nZnVsIHJldmVyc2FsLlxuICAgICAgICBjb25zdCBkZXNpcmVkQ2hlY2tlZFN0YXR1cyA9IHRhcmdldC5jaGVja2VkO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRhcmdldC5jaGVja2VkID0gZGVzaXJlZENoZWNrZWRTdGF0dXM7XG4gICAgICAgIH0sIDEpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBcHAsIE1hcmtkb3duUmVuZGVyQ2hpbGQsIE1hcmtkb3duUmVuZGVyZXIsIFBsdWdpbiwgVEZpbGUgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IEV2ZW50UmVmLCBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IElRdWVyeSB9IGZyb20gJy4vSVF1ZXJ5JztcbmltcG9ydCB7IFN0YXRlIH0gZnJvbSAnLi9DYWNoZSc7XG5pbXBvcnQgeyByZXBsYWNlVGFza1dpdGhUYXNrcyB9IGZyb20gJy4vRmlsZSc7XG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gJy4vUXVlcnkvUXVlcnknO1xuaW1wb3J0IHR5cGUgeyBHcm91cEhlYWRpbmcgfSBmcm9tICcuL1F1ZXJ5L0dyb3VwSGVhZGluZyc7XG5pbXBvcnQgeyBUYXNrTW9kYWwgfSBmcm9tICcuL1Rhc2tNb2RhbCc7XG5pbXBvcnQgdHlwZSB7IFRhc2tzRXZlbnRzIH0gZnJvbSAnLi9UYXNrc0V2ZW50cyc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuaW1wb3J0IHsgRGF0ZUZhbGxiYWNrIH0gZnJvbSAnLi9EYXRlRmFsbGJhY2snO1xuaW1wb3J0IHsgVGFza0xheW91dCB9IGZyb20gJy4vVGFza0xheW91dCc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeVJlbmRlcmVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRzOiBUYXNrc0V2ZW50cztcblxuICAgIGNvbnN0cnVjdG9yKHsgcGx1Z2luLCBldmVudHMgfTogeyBwbHVnaW46IFBsdWdpbjsgZXZlbnRzOiBUYXNrc0V2ZW50cyB9KSB7XG4gICAgICAgIHRoaXMuYXBwID0gcGx1Z2luLmFwcDtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBldmVudHM7XG5cbiAgICAgICAgcGx1Z2luLnJlZ2lzdGVyTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3IoJ3Rhc2tzJywgdGhpcy5fYWRkUXVlcnlSZW5kZXJDaGlsZC5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUXVlcnlSZW5kZXJDaGlsZCA9IHRoaXMuX2FkZFF1ZXJ5UmVuZGVyQ2hpbGQuYmluZCh0aGlzKTtcblxuICAgIHByaXZhdGUgYXN5bmMgX2FkZFF1ZXJ5UmVuZGVyQ2hpbGQoc291cmNlOiBzdHJpbmcsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb250ZXh0OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQuYWRkQ2hpbGQoXG4gICAgICAgICAgICBuZXcgUXVlcnlSZW5kZXJDaGlsZCh7XG4gICAgICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgICAgICBldmVudHM6IHRoaXMuZXZlbnRzLFxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogZWxlbWVudCxcbiAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgZmlsZVBhdGg6IGNvbnRleHQuc291cmNlUGF0aCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cbn1cblxuY2xhc3MgUXVlcnlSZW5kZXJDaGlsZCBleHRlbmRzIE1hcmtkb3duUmVuZGVyQ2hpbGQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudHM6IFRhc2tzRXZlbnRzO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc291cmNlOiBzdHJpbmc7IC8vIFRoZSBjb21wbGV0ZSB0ZXh0IGluIHRoZSBpbnN0cnVjdGlvbiBibG9jaywgc3VjaCBhcyAnbm90IGRvbmVcXG5zaG9ydCBtb2RlJ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZzsgLy8gVGhlIHBhdGggb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb24gYmxvY2tcbiAgICBwcml2YXRlIHF1ZXJ5OiBJUXVlcnk7XG4gICAgcHJpdmF0ZSBxdWVyeVR5cGU6IHN0cmluZztcblxuICAgIHByaXZhdGUgcmVuZGVyRXZlbnRSZWY6IEV2ZW50UmVmIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcXVlcnlSZWxvYWRUaW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBldmVudHMsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgc291cmNlLFxuICAgICAgICBmaWxlUGF0aCxcbiAgICB9OiB7XG4gICAgICAgIGFwcDogQXBwO1xuICAgICAgICBldmVudHM6IFRhc2tzRXZlbnRzO1xuICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgICAgICBzb3VyY2U6IHN0cmluZztcbiAgICAgICAgZmlsZVBhdGg6IHN0cmluZztcbiAgICB9KSB7XG4gICAgICAgIHN1cGVyKGNvbnRhaW5lcik7XG5cbiAgICAgICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoO1xuXG4gICAgICAgIC8vIFRoZSBlbmdpbmUgaXMgY2hvc2VuIG9uIHRoZSBiYXNpcyBvZiB0aGUgY29kZSBibG9jayBsYW5ndWFnZS4gQ3VycmVudGx5XG4gICAgICAgIC8vIHRoZXJlIGlzIG9ubHkgdGhlIG1haW4gZW5naW5lIGZvciB0aGUgcGx1Z2luLCB0aGlzIGFsbG93cyBvdGhlcnMgdG8gYmVcbiAgICAgICAgLy8gYWRkZWQgbGF0ZXIuXG4gICAgICAgIHN3aXRjaCAodGhpcy5jb250YWluZXJFbC5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLWxhbmd1YWdlLXRhc2tzJzpcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gbmV3IFF1ZXJ5KHsgc291cmNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlUeXBlID0gJ3Rhc2tzJztcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gbmV3IFF1ZXJ5KHsgc291cmNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlUeXBlID0gJ3Rhc2tzJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9ubG9hZCgpIHtcbiAgICAgICAgLy8gUHJvY2VzcyB0aGUgY3VycmVudCBjYWNoZSBzdGF0ZTpcbiAgICAgICAgdGhpcy5ldmVudHMudHJpZ2dlclJlcXVlc3RDYWNoZVVwZGF0ZSh0aGlzLnJlbmRlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgLy8gTGlzdGVuIHRvIGZ1dHVyZSBjYWNoZSBjaGFuZ2VzOlxuICAgICAgICB0aGlzLnJlbmRlckV2ZW50UmVmID0gdGhpcy5ldmVudHMub25DYWNoZVVwZGF0ZSh0aGlzLnJlbmRlci5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLnJlbG9hZFF1ZXJ5QXRNaWRuaWdodCgpO1xuICAgIH1cblxuICAgIG9udW5sb2FkKCkge1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJFdmVudFJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5vZmYodGhpcy5yZW5kZXJFdmVudFJlZik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWVyeVJlbG9hZFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucXVlcnlSZWxvYWRUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbG9hZHMgdGhlIHF1ZXJ5IGFmdGVyIG1pZG5pZ2h0IHRvIHVwZGF0ZSByZXN1bHRzIGZyb20gcmVsYXRpdmUgZGF0ZSBxdWVyaWVzLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIHRoZSBxdWVyeSBgZHVlIHRvZGF5YCBjaGFuZ2VzIGV2ZXJ5IGRheS4gVGhpcyBtYWtlcyBzdXJlIHRoYXQgYWxsIHF1ZXJ5IHJlc3VsdHNcbiAgICAgKiBhcmUgcmUtcmVuZGVyZWQgYWZ0ZXIgbWlkbmlnaHQgZXZlcnkgZGF5IHRvIGVuc3VyZSB1cC10by1kYXRlIHJlc3VsdHMgd2l0aG91dCBoYXZpbmcgdG9cbiAgICAgKiByZWxvYWQgb2JzaWRpYW4uIENyZWF0aW5nIGEgbmV3IHF1ZXJ5IG9iamVjdCBmcm9tIHRoZSBzb3VyY2UgcmUtYXBwbGllcyB0aGUgcmVsYXRpdmUgZGF0ZXNcbiAgICAgKiB0byBcIm5vd1wiLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVsb2FkUXVlcnlBdE1pZG5pZ2h0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtaWRuaWdodCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIG1pZG5pZ2h0LnNldEhvdXJzKDI0LCAwLCAwLCAwKTtcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAgICAgICBjb25zdCBtaWxsaXNlY29uZHNUb01pZG5pZ2h0ID0gbWlkbmlnaHQuZ2V0VGltZSgpIC0gbm93LmdldFRpbWUoKTtcblxuICAgICAgICB0aGlzLnF1ZXJ5UmVsb2FkVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWVyeSA9IG5ldyBRdWVyeSh7IHNvdXJjZTogdGhpcy5zb3VyY2UgfSk7XG4gICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBjdXJyZW50IGNhY2hlIHN0YXRlOlxuICAgICAgICAgICAgdGhpcy5ldmVudHMudHJpZ2dlclJlcXVlc3RDYWNoZVVwZGF0ZSh0aGlzLnJlbmRlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkUXVlcnlBdE1pZG5pZ2h0KCk7XG4gICAgICAgIH0sIG1pbGxpc2Vjb25kc1RvTWlkbmlnaHQgKyAxMDAwKTsgLy8gQWRkIGJ1ZmZlciB0byBiZSBzdXJlIHRvIHJ1biBhZnRlciBtaWRuaWdodC5cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlbmRlcih7IHRhc2tzLCBzdGF0ZSB9OiB7IHRhc2tzOiBUYXNrW107IHN0YXRlOiBTdGF0ZSB9KSB7XG4gICAgICAgIC8vIERvbid0IGxvZyBhbnl0aGluZyBoZXJlLCBmb3IgYW55IHN0YXRlLCBhcyBpdCBnZW5lcmF0ZXMgaHVnZSBhbW91bnRzIG9mXG4gICAgICAgIC8vIGNvbnNvbGUgbWVzc2FnZXMgaW4gbGFyZ2UgdmF1bHRzLCBpZiBPYnNpZGlhbiB3YXMgb3BlbmVkIHdpdGggYW55XG4gICAgICAgIC8vIG5vdGVzIHdpdGggdGFza3MgY29kZSBibG9ja3MgaW4gUmVhZGluZyBvciBMaXZlIFByZXZpZXcgbW9kZS5cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbCgnZGl2Jyk7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gU3RhdGUuV2FybSAmJiB0aGlzLnF1ZXJ5LmVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgICAgICAgICAgYFJlbmRlciAke3RoaXMucXVlcnlUeXBlfSBjYWxsZWQgZm9yIGEgYmxvY2sgaW4gYWN0aXZlIGZpbGUgXCIke3RoaXMuZmlsZVBhdGh9XCIsIHRvIHNlbGVjdCBmcm9tICR7dGFza3MubGVuZ3RofSB0YXNrczogcGx1Z2luIHN0YXRlOiAke3N0YXRlfWAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5xdWVyeS5sYXlvdXRPcHRpb25zLmV4cGxhaW5RdWVyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRXhwbGFuYXRpb24oY29udGVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRhc2tzU29ydGVkTGltaXRlZEdyb3VwZWQgPSB0aGlzLnF1ZXJ5LmFwcGx5UXVlcnlUb1Rhc2tzKHRhc2tzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGFza3NTb3J0ZWRMaW1pdGVkR3JvdXBlZC5ncm91cHMpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIG5vICdncm91cCBieScgaW5zdHJ1Y3Rpb25zLCBncm91cC5ncm91cEhlYWRpbmdzXG4gICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBlbXB0eSwgYW5kIG5vIGhlYWRpbmdzIHdpbGwgYmUgYWRkZWQuXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRHcm91cEhlYWRpbmdzKGNvbnRlbnQsIGdyb3VwLmdyb3VwSGVhZGluZ3MpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0YXNrTGlzdCB9ID0gYXdhaXQgdGhpcy5jcmVhdGVUYXNrc0xpc3Qoe1xuICAgICAgICAgICAgICAgICAgICB0YXNrczogZ3JvdXAudGFza3MsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZCh0YXNrTGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0b3RhbFRhc2tzQ291bnQgPSB0YXNrc1NvcnRlZExpbWl0ZWRHcm91cGVkLnRvdGFsVGFza3NDb3VudCgpO1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhgJHt0b3RhbFRhc2tzQ291bnR9IG9mICR7dGFza3MubGVuZ3RofSB0YXNrcyBkaXNwbGF5ZWQgaW4gYSBibG9jayBpbiBcIiR7dGhpcy5maWxlUGF0aH1cImApO1xuICAgICAgICAgICAgdGhpcy5hZGRUYXNrQ291bnQoY29udGVudCwgdG90YWxUYXNrc0NvdW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnF1ZXJ5LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRlbnQuY3JlYXRlRGl2KCkuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICAgICAnPHByZT4nICsgYFRhc2tzIHF1ZXJ5OiAke3RoaXMucXVlcnkuZXJyb3IucmVwbGFjZSgvXFxuL2csICc8YnI+Jyl9YCArICc8L3ByZT4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudC5zZXRUZXh0KCdMb2FkaW5nIFRhc2tzIC4uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5maXJzdENoaWxkPy5yZXBsYWNlV2l0aChjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlICdleHBsYWluJyBpbnN0cnVjdGlvbiB0byBlbmFibGUgdGhpc1xuICAgIHByaXZhdGUgY3JlYXRlRXhwbGFuYXRpb24oY29udGVudDogSFRNTERpdkVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZXhwbGFuYXRpb25Bc1N0cmluZyA9IHRoaXMucXVlcnkuZXhwbGFpblF1ZXJ5KCk7XG5cbiAgICAgICAgY29uc3QgZXhwbGFuYXRpb25zQmxvY2sgPSBjb250ZW50LmNyZWF0ZUVsKCdwcmUnKTtcbiAgICAgICAgZXhwbGFuYXRpb25zQmxvY2suYWRkQ2xhc3NlcyhbJ3BsdWdpbi10YXNrcy1xdWVyeS1leHBsYW5hdGlvbiddKTtcbiAgICAgICAgZXhwbGFuYXRpb25zQmxvY2suc2V0VGV4dChleHBsYW5hdGlvbkFzU3RyaW5nKTtcbiAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZChleHBsYW5hdGlvbnNCbG9jayk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVUYXNrc0xpc3Qoe1xuICAgICAgICB0YXNrcyxcbiAgICAgICAgY29udGVudCxcbiAgICB9OiB7XG4gICAgICAgIHRhc2tzOiBUYXNrW107XG4gICAgICAgIGNvbnRlbnQ6IEhUTUxEaXZFbGVtZW50O1xuICAgIH0pOiBQcm9taXNlPHsgdGFza0xpc3Q6IEhUTUxVTGlzdEVsZW1lbnQ7IHRhc2tzQ291bnQ6IG51bWJlciB9PiB7XG4gICAgICAgIGNvbnN0IHRhc2tzQ291bnQgPSB0YXNrcy5sZW5ndGg7XG5cbiAgICAgICAgY29uc3QgbGF5b3V0ID0gbmV3IFRhc2tMYXlvdXQodGhpcy5xdWVyeS5sYXlvdXRPcHRpb25zKTtcbiAgICAgICAgY29uc3QgdGFza0xpc3QgPSBjb250ZW50LmNyZWF0ZUVsKCd1bCcpO1xuICAgICAgICB0YXNrTGlzdC5hZGRDbGFzc2VzKFsnY29udGFpbnMtdGFzay1saXN0JywgJ3BsdWdpbi10YXNrcy1xdWVyeS1yZXN1bHQnXSk7XG4gICAgICAgIHRhc2tMaXN0LmFkZENsYXNzZXMobGF5b3V0LnNwZWNpZmljQ2xhc3Nlcyk7XG4gICAgICAgIGNvbnN0IGdyb3VwaW5nQXR0cmlidXRlID0gdGhpcy5nZXRHcm91cGluZ0F0dHJpYnV0ZSgpO1xuICAgICAgICBpZiAoZ3JvdXBpbmdBdHRyaWJ1dGUgJiYgZ3JvdXBpbmdBdHRyaWJ1dGUubGVuZ3RoID4gMCkgdGFza0xpc3QuZGF0YXNldC50YXNrR3JvdXBCeSA9IGdyb3VwaW5nQXR0cmlidXRlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdGFzayA9IHRhc2tzW2ldO1xuICAgICAgICAgICAgY29uc3QgaXNGaWxlbmFtZVVuaXF1ZSA9IHRoaXMuaXNGaWxlbmFtZVVuaXF1ZSh7IHRhc2sgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtID0gYXdhaXQgdGFzay50b0xpKHtcbiAgICAgICAgICAgICAgICBwYXJlbnRVbEVsZW1lbnQ6IHRhc2tMaXN0LFxuICAgICAgICAgICAgICAgIGxpc3RJbmRleDogaSxcbiAgICAgICAgICAgICAgICBsYXlvdXRPcHRpb25zOiB0aGlzLnF1ZXJ5LmxheW91dE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgaXNGaWxlbmFtZVVuaXF1ZSxcbiAgICAgICAgICAgICAgICB0YXNrTGF5b3V0OiBsYXlvdXQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBmb290bm90ZXMuIFRoZXkgZG9uJ3QgcmUtYXBwZWFyIGluIGFub3RoZXIgZG9jdW1lbnQuXG4gICAgICAgICAgICBjb25zdCBmb290bm90ZXMgPSBsaXN0SXRlbS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1mb290bm90ZS1pZF0nKTtcbiAgICAgICAgICAgIGZvb3Rub3Rlcy5mb3JFYWNoKChmb290bm90ZSkgPT4gZm9vdG5vdGUucmVtb3ZlKCkpO1xuXG4gICAgICAgICAgICBjb25zdCBzaG9ydE1vZGUgPSB0aGlzLnF1ZXJ5LmxheW91dE9wdGlvbnMuc2hvcnRNb2RlO1xuXG4gICAgICAgICAgICBjb25zdCBleHRyYXNTcGFuID0gbGlzdEl0ZW0uY3JlYXRlU3BhbigndGFzay1leHRyYXMnKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnF1ZXJ5LmxheW91dE9wdGlvbnMuaGlkZVVyZ2VuY3kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFVyZ2VuY3koZXh0cmFzU3BhbiwgdGFzayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5xdWVyeS5sYXlvdXRPcHRpb25zLmhpZGVCYWNrbGlua3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEJhY2tsaW5rcyhleHRyYXNTcGFuLCB0YXNrLCBzaG9ydE1vZGUsIGlzRmlsZW5hbWVVbmlxdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMucXVlcnkubGF5b3V0T3B0aW9ucy5oaWRlRWRpdEJ1dHRvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRWRpdEJ1dHRvbihleHRyYXNTcGFuLCB0YXNrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFza0xpc3QuYXBwZW5kQ2hpbGQobGlzdEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgdGFza0xpc3QsIHRhc2tzQ291bnQgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEVkaXRCdXR0b24obGlzdEl0ZW06IEhUTUxFbGVtZW50LCB0YXNrOiBUYXNrKSB7XG4gICAgICAgIGNvbnN0IGVkaXRUYXNrUGVuY2lsID0gbGlzdEl0ZW0uY3JlYXRlRWwoJ2EnLCB7XG4gICAgICAgICAgICBjbHM6ICd0YXNrcy1lZGl0JyxcbiAgICAgICAgfSk7XG4gICAgICAgIGVkaXRUYXNrUGVuY2lsLm9uQ2xpY2tFdmVudCgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9uU3VibWl0ID0gKHVwZGF0ZWRUYXNrczogVGFza1tdKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgcmVwbGFjZVRhc2tXaXRoVGFza3Moe1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFRhc2s6IHRhc2ssXG4gICAgICAgICAgICAgICAgICAgIG5ld1Rhc2tzOiBEYXRlRmFsbGJhY2sucmVtb3ZlSW5mZXJyZWRTdGF0dXNJZk5lZWRlZCh0YXNrLCB1cGRhdGVkVGFza3MpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgZXZlcnkgdGltZSwgYXMgY3Vyc29yL3Rhc2sgY2FuIGNoYW5nZS5cbiAgICAgICAgICAgIGNvbnN0IHRhc2tNb2RhbCA9IG5ldyBUYXNrTW9kYWwoe1xuICAgICAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICAgICAgdGFzayxcbiAgICAgICAgICAgICAgICBvblN1Ym1pdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGFza01vZGFsLm9wZW4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRVcmdlbmN5KGxpc3RJdGVtOiBIVE1MRWxlbWVudCwgdGFzazogVGFzaykge1xuICAgICAgICBjb25zdCB0ZXh0ID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0KHRhc2sudXJnZW5jeSk7XG4gICAgICAgIGxpc3RJdGVtLmNyZWF0ZVNwYW4oeyB0ZXh0LCBjbHM6ICd0YXNrcy11cmdlbmN5JyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5IGhlYWRpbmdzIGZvciBhIGdyb3VwIG9mIHRhc2tzLlxuICAgICAqIEBwYXJhbSBjb250ZW50XG4gICAgICogQHBhcmFtIGdyb3VwSGVhZGluZ3MgLSBUaGUgaGVhZGluZ3MgdG8gZGlzcGxheS4gVGhpcyBjYW4gYmUgYW4gZW1wdHkgYXJyYXksXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIG5vIGhlYWRpbmdzIHdpbGwgYmUgYWRkZWQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZEdyb3VwSGVhZGluZ3MoY29udGVudDogSFRNTERpdkVsZW1lbnQsIGdyb3VwSGVhZGluZ3M6IEdyb3VwSGVhZGluZ1tdKSB7XG4gICAgICAgIGZvciAoY29uc3QgaGVhZGluZyBvZiBncm91cEhlYWRpbmdzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEdyb3VwSGVhZGluZyhjb250ZW50LCBoZWFkaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYWRkR3JvdXBIZWFkaW5nKGNvbnRlbnQ6IEhUTUxEaXZFbGVtZW50LCBncm91cDogR3JvdXBIZWFkaW5nKSB7XG4gICAgICAgIGxldCBoZWFkZXI6IGFueTtcbiAgICAgICAgLy8gSXMgaXQgcG9zc2libGUgdG8gcmVtb3ZlIHRoZSByZXBldGl0aW9uIGhlcmU/XG4gICAgICAgIC8vIElkZWFsbHksIGJ5IGNyZWF0aW5nIGEgdmFyaWFibGUgdGhhdCBjb250YWlucyBoNCwgaDUgb3IgaDZcbiAgICAgICAgLy8gYW5kIHRoZW4gb25seSBoYXZpbmcgb25lIGNhbGwgdG8gY29udGVudC5jcmVhdGVFbCgpLlxuICAgICAgICBpZiAoZ3JvdXAubmVzdGluZ0xldmVsID09PSAwKSB7XG4gICAgICAgICAgICBoZWFkZXIgPSBjb250ZW50LmNyZWF0ZUVsKCdoNCcsIHtcbiAgICAgICAgICAgICAgICBjbHM6ICd0YXNrcy1ncm91cC1oZWFkaW5nJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGdyb3VwLm5lc3RpbmdMZXZlbCA9PT0gMSkge1xuICAgICAgICAgICAgaGVhZGVyID0gY29udGVudC5jcmVhdGVFbCgnaDUnLCB7XG4gICAgICAgICAgICAgICAgY2xzOiAndGFza3MtZ3JvdXAtaGVhZGluZycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEhlYWRpbmdzIG5lc3RlZCB0byAyIG9yIG1vcmUgbGV2ZWxzIGFyZSBhbGwgZGlzcGxheWVkIHdpdGggJ2g2OlxuICAgICAgICAgICAgaGVhZGVyID0gY29udGVudC5jcmVhdGVFbCgnaDYnLCB7XG4gICAgICAgICAgICAgICAgY2xzOiAndGFza3MtZ3JvdXAtaGVhZGluZycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBNYXJrZG93blJlbmRlcmVyLnJlbmRlck1hcmtkb3duKGdyb3VwLm5hbWUsIGhlYWRlciwgdGhpcy5maWxlUGF0aCwgdGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRCYWNrbGlua3MobGlzdEl0ZW06IEhUTUxFbGVtZW50LCB0YXNrOiBUYXNrLCBzaG9ydE1vZGU6IGJvb2xlYW4sIGlzRmlsZW5hbWVVbmlxdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgYmFja0xpbmsgPSBsaXN0SXRlbS5jcmVhdGVTcGFuKHsgY2xzOiAndGFza3MtYmFja2xpbmsnIH0pO1xuXG4gICAgICAgIGlmICghc2hvcnRNb2RlKSB7XG4gICAgICAgICAgICBiYWNrTGluay5hcHBlbmQoJyAoJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5rID0gYmFja0xpbmsuY3JlYXRlRWwoJ2EnKTtcblxuICAgICAgICBsaW5rLmhyZWYgPSB0YXNrLnBhdGg7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkYXRhLWhyZWYnLCB0YXNrLnBhdGgpO1xuICAgICAgICBsaW5rLnJlbCA9ICdub29wZW5lcic7XG4gICAgICAgIGxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgIGxpbmsuYWRkQ2xhc3MoJ2ludGVybmFsLWxpbmsnKTtcbiAgICAgICAgaWYgKHNob3J0TW9kZSkge1xuICAgICAgICAgICAgbGluay5hZGRDbGFzcygnaW50ZXJuYWwtbGluay1zaG9ydC1tb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzay5wcmVjZWRpbmdIZWFkZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNhbml0aXNlZEhlYWRpbmcgPSB0YXNrLnByZWNlZGluZ0hlYWRlci5yZXBsYWNlKC8jL2csICcnKTtcbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IGxpbmsuaHJlZiArICcjJyArIHNhbml0aXNlZEhlYWRpbmc7XG4gICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZGF0YS1ocmVmJywgbGluay5nZXRBdHRyaWJ1dGUoJ2RhdGEtaHJlZicpICsgJyMnICsgc2FuaXRpc2VkSGVhZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGlua1RleHQ6IHN0cmluZztcbiAgICAgICAgaWYgKHNob3J0TW9kZSkge1xuICAgICAgICAgICAgbGlua1RleHQgPSAnIFx1RDgzRFx1REQxNyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaW5rVGV4dCA9IHRhc2suZ2V0TGlua1RleHQoeyBpc0ZpbGVuYW1lVW5pcXVlIH0pID8/ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluay5zZXRUZXh0KGxpbmtUZXh0KTtcblxuICAgICAgICBpZiAoIXNob3J0TW9kZSkge1xuICAgICAgICAgICAgYmFja0xpbmsuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRhc2tDb3VudChjb250ZW50OiBIVE1MRGl2RWxlbWVudCwgdGFza3NDb3VudDogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWVyeS5sYXlvdXRPcHRpb25zLmhpZGVUYXNrQ291bnQpIHtcbiAgICAgICAgICAgIGNvbnRlbnQuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBgJHt0YXNrc0NvdW50fSB0YXNrJHt0YXNrc0NvdW50ICE9PSAxID8gJ3MnIDogJyd9YCxcbiAgICAgICAgICAgICAgICBjbHM6ICd0YXNrcy1jb3VudCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNGaWxlbmFtZVVuaXF1ZSh7IHRhc2sgfTogeyB0YXNrOiBUYXNrIH0pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgLy8gV2lsbCBtYXRjaCB0aGUgZmlsZW5hbWUgd2l0aG91dCBleHRlbnNpb24gKHRoZSBmaWxlJ3MgXCJiYXNlbmFtZVwiKS5cbiAgICAgICAgY29uc3QgZmlsZW5hbWVNYXRjaCA9IHRhc2sucGF0aC5tYXRjaCgvKFteL10qKVxcLi4rJC9pKTtcbiAgICAgICAgaWYgKGZpbGVuYW1lTWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGZpbGVuYW1lTWF0Y2hbMV07XG4gICAgICAgIGNvbnN0IGFsbEZpbGVzV2l0aFNhbWVOYW1lID0gdGhpcy5hcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLmZpbHRlcigoZmlsZTogVEZpbGUpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWxlLmJhc2VuYW1lID09PSBmaWxlbmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIEZvdW5kIGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgKGl0IG1pZ2h0IGFjdHVhbGx5IGJlIHRoZSBzYW1lIGZpbGUsIGJ1dCB3ZSdsbCB0YWtlIHRoYXQgaW50byBhY2NvdW50IGxhdGVyLilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFsbEZpbGVzV2l0aFNhbWVOYW1lLmxlbmd0aCA8IDI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRHcm91cGluZ0F0dHJpYnV0ZSgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBpbmdSdWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLnF1ZXJ5Lmdyb3VwaW5nKSB7XG4gICAgICAgICAgICBncm91cGluZ1J1bGVzLnB1c2goZ3JvdXAucHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBncm91cGluZ1J1bGVzLmpvaW4oJywnKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vVGFzayc7XG5cbi8qKlxuICogQSBzb3J0aW5nIGZ1bmN0aW9uLCB0aGF0IHRha2VzIHR3byBUYXNrIG9iamVjdHMgYW5kIHJldHVybnNcbiAqIGFuZCByZXR1cm5zIG9uZSBvZjpcbiAqIC0gYC0xYCBvciBzb21lIG90aGVyIG5lZ2F0aXZlIG51bWJlciwgaWYgYSBpcyBsZXNzIHRoYW4gYiBieSBzb21lIG9yZGVyaW5nIGNyaXRlcmlvbi5cbiAqIC0gYCsxYCBvciBzb21lIG90aGVyIHBvc2l0aXZlIG51bWJlciwgaWYgYSBpcyBncmVhdGVyIHRoYW4gYiBieSB0aGUgb3JkZXJpbmcgY3JpdGVyaW9uLlxuICogLSBgMGAgb3Igc29tZXRpbWVzIGAtMGAsIGlmIGEgZXF1YWxzIGIgYnkgdGhlIG9yZGVyaW5nIGNyaXRlcmlvbi5cbiAqXG4gKiBUeXBpY2FsbHkgQ29tcGFyYXRvciBmdW5jdGlvbnMgYXJlIHN0b3JlZCBpbiBhIHtAbGluayBTb3J0ZXJ9IG9iamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGFyYXRvciA9IChhOiBUYXNrLCBiOiBUYXNrKSA9PiBudW1iZXI7XG5cbi8qKlxuICogU29ydGVyIHJlcHJlc2VudHMgYSBzaW5nbGUgJ3NvcnQgYnknIGluc3RydWN0aW9uLlxuICogSXQgc3RvcmVzIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIGFzIGEge0BsaW5rIENvbXBhcmF0b3J9LlxuICovXG5leHBvcnQgY2xhc3MgU29ydGVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJvcGVydHk6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29tcGFyYXRvcjogQ29tcGFyYXRvcjtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IC0gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIC0ge0BsaW5rIENvbXBhcmF0b3J9IGZ1bmN0aW9uLCBmb3Igc29ydGluZyBpbiB0aGUgc3RhbmRhcmQgZGlyZWN0aW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgSWYgYHJldmVyc2VgIGlzIHRydWUsIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBjb252ZXJ0ZWQgdG8gcmV2ZXJzZSB0aGUgc29ydCBkaXJlY3Rpb24uXG4gICAgICogQHBhcmFtIHJldmVyc2UgLSB3aGV0aGVyIHRoZSBzb3J0IG9yZGVyIHNob3VsZCBiZSByZXZlcnNlZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogc3RyaW5nLCBjb21wYXJhdG9yOiBDb21wYXJhdG9yLCByZXZlcnNlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gU29ydGVyLm1heWJlUmV2ZXJzZShyZXZlcnNlLCBjb21wYXJhdG9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYXliZVJldmVyc2UocmV2ZXJzZTogYm9vbGVhbiwgY29tcGFyYXRvcjogQ29tcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gcmV2ZXJzZSA/IFNvcnRlci5tYWtlUmV2ZXJzZWRDb21wYXJhdG9yKGNvbXBhcmF0b3IpIDogY29tcGFyYXRvcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYWtlUmV2ZXJzZWRDb21wYXJhdG9yKGNvbXBhcmF0b3I6IENvbXBhcmF0b3IpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgLy8gTm90ZTogVGhpcyBjYW4gcmV0dXJuIC0wLlxuICAgICAgICByZXR1cm4gKGEsIGIpID0+IChjb21wYXJhdG9yKGEsIGIpICogLTEpIGFzIC0xIHwgMCB8IDE7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uL1Rhc2snO1xuXG4vKipcbiAqIEEgbmFtaW5nIGZ1bmN0aW9uLCB0aGF0IHRha2VzIGEgVGFzayBvYmplY3QgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgZ3JvdXAgcHJvcGVydHkgbmFtZVxuICovXG5leHBvcnQgdHlwZSBHcm91cGVyRnVuY3Rpb24gPSAodGFzazogVGFzaykgPT4gc3RyaW5nW107XG5cbmV4cG9ydCB0eXBlIEdyb3VwaW5nUHJvcGVydHkgPVxuICAgIHwgJ2JhY2tsaW5rJ1xuICAgIHwgJ2RvbmUnXG4gICAgfCAnZHVlJ1xuICAgIHwgJ2ZpbGVuYW1lJ1xuICAgIHwgJ2ZvbGRlcidcbiAgICB8ICdoYXBwZW5zJ1xuICAgIHwgJ2hlYWRpbmcnXG4gICAgfCAncGF0aCdcbiAgICB8ICdwcmlvcml0eSdcbiAgICB8ICdyZWN1cnJlbmNlJ1xuICAgIHwgJ3JlY3VycmluZydcbiAgICB8ICdyb290J1xuICAgIHwgJ3NjaGVkdWxlZCdcbiAgICB8ICdzdGFydCdcbiAgICB8ICdzdGF0dXMnXG4gICAgfCAndGFncyc7XG5cbmV4cG9ydCBjbGFzcyBHcm91cGVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJvcGVydHk6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgZ3JvdXBlcjogR3JvdXBlckZ1bmN0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydHk6IHN0cmluZywgZ3JvdXBlcjogR3JvdXBlckZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5ncm91cGVyID0gZ3JvdXBlcjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgU29ydGVyIH0gZnJvbSAnLi4vU29ydGVyJztcbmltcG9ydCB0eXBlIHsgQ29tcGFyYXRvciB9IGZyb20gJy4uL1NvcnRlcic7XG5pbXBvcnQgKiBhcyBSZWdFeHBUb29scyBmcm9tICcuLi8uLi9saWIvUmVnRXhwVG9vbHMnO1xuaW1wb3J0IHsgR3JvdXBlciB9IGZyb20gJy4uL0dyb3VwZXInO1xuaW1wb3J0IHR5cGUgeyBHcm91cGVyRnVuY3Rpb24gfSBmcm9tICcuLi9Hcm91cGVyJztcbmltcG9ydCB0eXBlIHsgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlcic7XG5cbi8qKlxuICogRmllbGQgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgZWFjaCB0eXBlIG9mIGZpbHRlciBpbnN0cnVjdGlvbi5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgZGVyaXZlZCBjbGFzcyBTdGFydERhdGVGaWVsZCBpbXBsZW1lbnRzIHRoZSBwYXJzaW5nXG4gKiBvZiAnc3RhcnRzJyBpbnN0cnVjdGlvbnMuXG4gKlxuICogVGhlIG5hbWUgJ0ZpZWxkJyBtYXkgc2VlbSBjb25mdXNpbmcsIGFzIGl0IG1pZ2h0IGN1cnJlbnRseSBiZVxuICogZXhwZWN0ZWQgdG8gaGF2ZSB0aGUgd29yZCAnRmlsdGVyJyBpbiB0aGUgY2xhc3MgbmFtZS5cbiAqXG4gKiBDdXJyZW50IHRoaW5raW5nIGlzIHRoYXQgaXQgbWF5IHdlbGwgZXZvbHZlIGxhdGVyIHRvIGFsc28gaW1wbGVtZW50XG4gKiB0aGUgcHJlc2VuY2UgYW5kIGFic2VuY2Ugc2VhcmNoZXMgYXMgd2VsbFxuICogKHN1Y2ggJ25vIHN0YXJ0IGRhdGUnIGFuZCAnaGFzIHN0YXJ0IGRhdGUnKS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZpZWxkIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEZpbHRlcmluZ1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsYXNzIGNhbiBwYXJzZSB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gbGluZS5cbiAgICAgKlxuICAgICAqIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNoZWNrcyB3aGV0aGVyIHRoZSBsaW5lIG1hdGNoZXNcbiAgICAgKiB0aGlzLmZpbHRlclJlZ0V4cCgpLlxuICAgICAqIEBwYXJhbSBsaW5lIC0gQSBsaW5lIGZyb20gYSBgYGB0YXNrc2BgYCBibG9jay5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuQ3JlYXRlRmlsdGVyRm9yTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEZpZWxkLmxpbmVNYXRjaGVzRmlsdGVyKHRoaXMuZmlsdGVyUmVnRXhwKCksIGxpbmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBsaW5lLCBhbmQgcmV0dXJuIGVpdGhlciBhIEZpbHRlciBmdW5jdGlvbiBvciBhbiBlcnJvciBzdHJpbmcsXG4gICAgICogd2hpY2ggYXJlIGJvdGggd3JhcHBlZCBpbiBhIEZpbHRlck9yRXJyb3JNZXNzYWdlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gbGluZSAtIEEgbGluZSBmcm9tIGEgYGBgdGFza3NgYGAgYmxvY2suXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGNyZWF0ZUZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlO1xuXG4gICAgLyoqXG4gICAgICogRG9lcyB0aGUgZ2l2ZW4gbGluZSBtYXRjaCB0aGUgZ2l2ZW4gZmlsdGVyP1xuICAgICAqIEBwYXJhbSBmaWx0ZXIgLSBBIFJlZ0V4cCByZWd1bGFyIGV4cHJlc3Npb24sIHRoYXQgc3BlY2lmaWVzIG9uZSBxdWVyeSBpbnN0cnVjdGlvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgT3IgbnVsbCwgaWYgdGhlIGZpZWxkIGRvZXMgbm90IHN1cHBvcnQgcmVnZXhwLWJhc2VkIGZpbHRlcmluZy5cbiAgICAgKiBAcGFyYW0gbGluZSAtIEEgbGluZSBmcm9tIGEgdGFza3MgY29kZSBibG9jayBxdWVyeS5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBsaW5lTWF0Y2hlc0ZpbHRlcihmaWx0ZXI6IFJlZ0V4cCB8IG51bGwsIGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyLnRlc3QobGluZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG1hdGNoIGZvciB0aGUgZ2l2ZW4gZmlsdGVyLCBvciBudWxsIGlmIGl0IGRvZXMgbm90IG1hdGNoXG4gICAgICogQHBhcmFtIGZpbHRlclJlZ0V4cCAtIEEgUmVnRXhwIHJlZ3VsYXIgZXhwcmVzc2lvbiwgdGhhdCBzcGVjaWZpZXMgb25lIHF1ZXJ5IGluc3RydWN0aW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICBPciBudWxsLCBpZiB0aGUgZmllbGQgZG9lcyBub3Qgc3VwcG9ydCByZWdleHAtYmFzZWQgZmlsdGVyaW5nLlxuICAgICAqIEBwYXJhbSBsaW5lIC0gQSBsaW5lIGZyb20gYSB0YXNrcyBjb2RlIGJsb2NrIHF1ZXJ5LlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3RhdGljIGdldE1hdGNoKGZpbHRlclJlZ0V4cDogUmVnRXhwIHwgbnVsbCwgbGluZTogc3RyaW5nKTogUmVnRXhwTWF0Y2hBcnJheSB8IG51bGwge1xuICAgICAgICBpZiAoZmlsdGVyUmVnRXhwKSB7XG4gICAgICAgICAgICByZXR1cm4gbGluZS5tYXRjaChmaWx0ZXJSZWdFeHApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCB3aWxsIG1hdGNoIGEgY29ycmVjdGx5LWZvcm1lZFxuICAgICAqIGluc3RydWN0aW9uIGxpbmUgZm9yIGZpbHRlcmluZyBUYXNrcyBieSBpbnNwZWN0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLlxuICAgICAqIE9yIG51bGwsIGlmIHRoaXMgZmllbGQgZG9lcyBub3QgaGF2ZSBhIHJlZ2V4LWJhc2VkIGluc3RydWN0aW9uLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBmaWVsZCwgdG8gYmUgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy5cbiAgICAgKiBUaGlzIHVzdWFsbHkgbWF0Y2hlcyB0aGUgaW5zdHJ1Y3Rpb24gbmFtZSwgYnV0IGRvZXMgbm90IGFsd2F5c1xuICAgICAqIChzZWUgc3RhcnQgYW5kIHN0YXJ0cykuXG4gICAgICpcbiAgICAgKiBBbHNvLCBzb21lIGZpZWxkcyBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZSwgc2VwYXJhdGVkIGJ5ICcvJy5cbiAgICAgKiBTZWUge0BsaW5rIFRhZ3NGaWVsZH0sIGZvciBleGFtcGxlLlxuICAgICAqIEBwdWJsaWNcbiAgICAgKlxuICAgICAqIEBzZWUgZmllbGROYW1lU2luZ3VsYXJcbiAgICAgKiBAc2VlIGZpZWxkTmFtZVNpbmd1bGFyRXNjYXBlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBmaWVsZE5hbWUoKTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2luZ3VsYXIgZm9ybSBvZiB0aGUgZmllbGQncyBuYW1lLlxuICAgICAqIEBwdWJsaWNcbiAgICAgKlxuICAgICAqIEBzZWUgZmllbGROYW1lXG4gICAgICogQHNlZSBmaWVsZE5hbWVTaW5ndWxhckVzY2FwZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZmllbGROYW1lU2luZ3VsYXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGROYW1lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2luZ3VsYXIgZm9ybSBvZiB0aGUgZmllbGQncyBuYW1lLCBlc2NhcGVkIGZvciB1c2UgaW4gcmVndWxhciBleHByZXNzaW9ucy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgbmVlZGVkIGZvciBmaWVsZCBuYW1lcyB0aGF0IGNvbnRhaW4gYC5gIGluLCBmb3IgZXhhbXBsZS5cbiAgICAgKiBAcHVibGljXG4gICAgICpcbiAgICAgKiBAc2VlIGZpZWxkTmFtZVxuICAgICAqIEBzZWUgZmllbGROYW1lU2luZ3VsYXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZmllbGROYW1lU2luZ3VsYXJFc2NhcGVkKCkge1xuICAgICAgICByZXR1cm4gUmVnRXhwVG9vbHMuZXNjYXBlUmVnRXhwKHRoaXMuZmllbGROYW1lU2luZ3VsYXIoKSk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTb3J0aW5nXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2RlIGZvciB0aGlzIGZpZWxkIGltcGxlbWVudHMgc29ydGluZyBvZiB0YXNrcy5cbiAgICAgKlxuICAgICAqIElmIG92ZXJyaWRpbmcgdGhpcyB0byByZXR1cm4gdHJ1ZSwgaW4gb3JkZXIgdG8gZW5hYmxlIHNvcnRpbmcsXG4gICAgICogdGhlIG1ldGhvZCB7QGxpbmsgY29tcGFyYXRvcn0gbXVzdCBhbHNvIGJlIG92ZXJyaWRkZW4uXG4gICAgICovXG4gICAgcHVibGljIHN1cHBvcnRzU29ydGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGEgJ3NvcnQgYnknIGxpbmUgYW5kIHJldHVybiBhIHtAbGluayBTb3J0ZXJ9IG9iamVjdC5cbiAgICAgKlxuICAgICAqIFJldHVybnMgbnVsbCBsaW5lIGRvZXMgbm90IG1hdGNoIHRoaXMgZmllbGQgb3IgaXMgaW52YWxpZCxcbiAgICAgKiBvciB0aGlzIGZpZWxkIGRvZXMgbm90IHN1cHBvcnQgc29ydGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyc2VTb3J0TGluZShsaW5lOiBzdHJpbmcpOiBTb3J0ZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRzU29ydGluZygpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jYW5DcmVhdGVTb3J0ZXJGb3JMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNvcnRlckZyb21MaW5lKGxpbmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xhc3MgY2FuIHBhcnNlIHRoZSBnaXZlbiAnc29ydCBieScgaW5zdHJ1Y3Rpb24gbGluZS5cbiAgICAgKlxuICAgICAqIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNoZWNrcyB3aGV0aGVyIHRoZSBjbGFzcyBkb2VzIHN1cHBvcnQgc29ydGluZyxcbiAgICAgKiBhbmQgd2hldGhlciB0aGUgbGluZSBtYXRjaGVzIHRoaXMuc29ydGVyUmVnRXhwKCkuXG4gICAgICogQHBhcmFtIGxpbmUgLSBBIGxpbmUgZnJvbSBhIGBgYHRhc2tzYGBgIGJsb2NrLlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgY3JlYXRlU29ydGVyRnJvbUxpbmV9XG4gICAgICovXG4gICAgcHVibGljIGNhbkNyZWF0ZVNvcnRlckZvckxpbmUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5zdXBwb3J0c1NvcnRpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEZpZWxkLmxpbmVNYXRjaGVzRmlsdGVyKHRoaXMuc29ydGVyUmVnRXhwKCksIGxpbmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBsaW5lLCBhbmQgcmV0dXJuIGVpdGhlciBhIHtAbGluayBTb3J0ZXJ9IG9iamVjdCBvciBudWxsLlxuICAgICAqXG4gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdvcmtzIGZvciBhbGwgZmllbGRzIHRoYXQgc3VwcG9ydFxuICAgICAqIHRoZSBkZWZhdWx0IHNvcnRpbmcgcGF0dGVybiBvZiBgc29ydCBieSA8ZmllbGROYW1lPiAocmV2ZXJzZSk/YC5cbiAgICAgKlxuICAgICAqIEZpZWxkcyB0aGF0IG9mZmVyIG1vcmUgY29tcGxpY2F0ZWQgJ3NvcnQgYnknIG9wdGlvbnMgY2FuIG92ZXJyaWRlXG4gICAgICogdGhpcyBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGluZSAtIEEgJ3NvcnQgYnknIGxpbmUgZnJvbSBhIGBgYHRhc2tzYGBgIGJsb2NrLlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgY2FuQ3JlYXRlU29ydGVyRm9yTGluZX1cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU29ydGVyRnJvbUxpbmUobGluZTogc3RyaW5nKTogU29ydGVyIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5zdXBwb3J0c1NvcnRpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXRjaCA9IEZpZWxkLmdldE1hdGNoKHRoaXMuc29ydGVyUmVnRXhwKCksIGxpbmUpO1xuICAgICAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV2ZXJzZSA9ICEhbWF0Y2hbMV07XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNvcnRlcihyZXZlcnNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCB3aWxsIG1hdGNoIGEgY29ycmVjdGx5LWZvcm1lZFxuICAgICAqIGluc3RydWN0aW9uIGxpbmUgZm9yIHNvcnRpbmcgVGFza3MgYnkgdGhpcyBmaWVsZC5cbiAgICAgKlxuICAgICAqIFRocm93cyBpZiB0aGlzIGZpZWxkIGRvZXMgbm90IHN1cHBvcnQgc29ydGluZy5cbiAgICAgKlxuICAgICAqIGBtYXRjaFsxXWAgd2lsbCBiZSBlaXRoZXIgYHJldmVyc2VgIG9yIHVuZGVmaW5lZC5cbiAgICAgKlxuICAgICAqIEZpZWxkcyB0aGF0IG9mZmVyIG1vcmUgY29tcGxpY2F0ZWQgJ3NvcnQgYnknIG9wdGlvbnMgY2FuIG92ZXJyaWRlXG4gICAgICogdGhpcyBtZXRob2QuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNvcnRlclJlZ0V4cCgpOiBSZWdFeHAge1xuICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHNTb3J0aW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBzb3J0ZXJSZWdFeHAoKSB1bmltcGxlbWVudGVkIGZvciAke3RoaXMuZmllbGROYW1lU2luZ3VsYXIoKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBec29ydCBieSAke3RoaXMuZmllbGROYW1lU2luZ3VsYXJFc2NhcGVkKCl9KCByZXZlcnNlKT9gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBmdW5jdGlvbiB0byBjb21wYXJlIHR3byBUYXNrIG9iamVjdHMsIGZvciB1c2UgaW4gc29ydGluZyBieSB0aGlzIGZpZWxkJ3MgdmFsdWUuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIHN1cHBvcnRzU29ydGluZ30gZm9yIHdoYXQgdG8gZG8sIHRvIGVuYWJsZSBzdXBwb3J0IG9mIHNvcnRpbmcgaW4gYVxuICAgICAqIHBhcnRpY3VsYXIge0BsaW5rIEZpZWxkfSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29tcGFyYXRvcigpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYGNvbXBhcmF0b3IoKSB1bmltcGxlbWVudGVkIGZvciAke3RoaXMuZmllbGROYW1lU2luZ3VsYXIoKX1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB7QGxpbmsgU29ydGVyfSBvYmplY3QgZm9yIHNvcnRpbmcgdGFza3MgYnkgdGhpcyBmaWVsZCdzIHZhbHVlLlxuICAgICAqIEBwYXJhbSByZXZlcnNlIC0gZmFsc2UgZm9yIG5vcm1hbCBzb3J0IG9yZGVyLCB0cnVlIGZvciByZXZlcnNlIHNvcnQgb3JkZXIuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVNvcnRlcihyZXZlcnNlOiBib29sZWFuKTogU29ydGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTb3J0ZXIodGhpcy5maWVsZE5hbWVTaW5ndWxhcigpLCB0aGlzLmNvbXBhcmF0b3IoKSwgcmV2ZXJzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEge0BsaW5rIFNvcnRlcn0gb2JqZWN0IGZvciBzb3J0aW5nIHRhc2tzIGJ5IHRoaXMgZmllbGQncyB2YWx1ZSxcbiAgICAgKiBpbiB0aGUgc3RhbmRhcmQvbm9ybWFsIHNvcnQgb3JkZXIgZm9yIHRoaXMgZmllbGQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBjcmVhdGVSZXZlcnNlU29ydGVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVOb3JtYWxTb3J0ZXIoKTogU29ydGVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU29ydGVyKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB7QGxpbmsgU29ydGVyfSBvYmplY3QgZm9yIHNvcnRpbmcgdGFza3MgYnkgdGhpcyBmaWVsZCdzIHZhbHVlLFxuICAgICAqIGluIHRoZSByZXZlcnNlIG9mIHRoZSBzdGFuZGFyZC9ub3JtYWwgc29ydCBvcmRlciBmb3IgdGhpcyBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGNyZWF0ZU5vcm1hbFNvcnRlcn1cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUmV2ZXJzZVNvcnRlcigpOiBTb3J0ZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTb3J0ZXIodHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBHcm91cGluZ1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgY29kZSBmb3IgdGhpcyBmaWVsZCBpbXBsZW1lbnRzIGdyb3VwaW5nIG9mIHRhc2tzLlxuICAgICAqXG4gICAgICogSWYgb3ZlcnJpZGluZyB0aGlzIHRvIHJldHVybiB0cnVlLCBpbiBvcmRlciB0byBlbmFibGUgZ3JvdXBpbmcsXG4gICAgICogdGhlIG1ldGhvZCB7QGxpbmsgZ3JvdXBlcn0gbXVzdCBhbHNvIGJlIG92ZXJyaWRkZW4uXG4gICAgICovXG4gICAgcHVibGljIHN1cHBvcnRzR3JvdXBpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBmdW5jdGlvbiB0byBnZXQgYSBsaXN0IG9mIGEgdGFzaydzIGdyb3VwIG5hbWVzLCBmb3IgdXNlIGluIGdyb3VwaW5nIGJ5IHRoaXMgZmllbGQncyB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgc3VwcG9ydHNHcm91cGluZ30gZm9yIHdoYXQgdG8gZG8sIHRvIGVuYWJsZSBzdXBwb3J0IG9mIGdyb3VwaW5nIGluIGFcbiAgICAgKiBwYXJ0aWN1bGFyIHtAbGluayBGaWVsZH0gaW1wbGVtZW50YXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGdyb3VwZXIoKTogR3JvdXBlckZ1bmN0aW9uIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYGdyb3VwZXIoKSB1bmltcGxlbWVudGVkIGZvciAke3RoaXMuZmllbGROYW1lU2luZ3VsYXIoKX1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB7QGxpbmsgR3JvdXBlcn0gb2JqZWN0IGZvciBncm91cGluZyB0YXNrcyBieSB0aGlzIGZpZWxkJ3MgdmFsdWUuXG4gICAgICpcbiAgICAgKiBGb3Igbm93LCBwYXJzaW5nIG9mIGBncm91cCBieWAgbGluZXMgaXMgY3VycmVudGx5IGRvbmUgaW4ge0BsaW5rIEZpbHRlclBhcnNlci5wYXJzZUdyb3VwZXIoKX0uXG4gICAgICogTGF0ZXIsIHRoaXMgd2lsbCBwcm9iYWJseSBiZSBtb3ZlZCB0byB0aGUge0BsaW5rIEZpZWxkfSBjbGFzc2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVHcm91cGVyKCk6IEdyb3VwZXIge1xuICAgICAgICByZXR1cm4gbmV3IEdyb3VwZXIodGhpcy5maWVsZE5hbWVTaW5ndWxhcigpLCB0aGlzLmdyb3VwZXIoKSk7XG4gICAgfVxufVxuIiwgIi8qKlxuICogQW4gRXhwbGFuYXRpb24gb2JqZWN0IHN0b3JlcyBhIHRleHQgZGVzY3JpcHRpb24gb2YgYSBRdWVyeSBpbnN0cnVjdGlvbiwgb3IgYSBjb21wb25lbnQgb2Ygb25lLlxuICpcbiAqIEl0IHN1cHBvcnRzIEJvb2xlYW4gY29tYmluYXRpb25zIHZpYSB0aGUge0BsaW5rIGNoaWxkcmVufSBmaWVsZC5cbiAqXG4gKiBJbml0aWFsbHksIHRoZSB7QGxpbmsgZGVzY3JpcHRpb259IHdpbGwgc2ltcGx5IHJlc3RhdGUgdGhlIGluc3RydWN0aW9uIGZpbHRlci5cbiAqIExhdGVyLCBtb3JlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4cGxhbmF0aW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3ltYm9sOiBzdHJpbmc7IC8vIEFORCwgT1IsIE5PVCwgWE9SXG4gICAgcHVibGljIHJlYWRvbmx5IGNoaWxkcmVuOiBFeHBsYW5hdGlvbltdO1xuXG4gICAgY29uc3RydWN0b3IoZGVzY3JpcHRpb246IHN0cmluZywgY2hpbGRyZW46IEV4cGxhbmF0aW9uW10gPSBbXSwgc3ltYm9sOiBzdHJpbmcgPSAnJykge1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICAgIHRoaXMuc3ltYm9sID0gc3ltYm9sO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIEV4cGxhbmF0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgQm9vbGVhbiBBTkRcbiAgICAgKiBAcGFyYW0gY2hpbGRyZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW5BbmQoY2hpbGRyZW46IEV4cGxhbmF0aW9uW10pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tYmluZU9yQ3JlYXRlRXhwbGFuYXRpb24oJ0FsbCBvZicsIGNoaWxkcmVuLCAnQU5EJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIEV4cGxhbmF0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgQm9vbGVhbiBPUlxuICAgICAqIEBwYXJhbSBjaGlsZHJlblxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbk9yKGNoaWxkcmVuOiBFeHBsYW5hdGlvbltdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbWJpbmVPckNyZWF0ZUV4cGxhbmF0aW9uKCdBdCBsZWFzdCBvbmUgb2YnLCBjaGlsZHJlbiwgJ09SJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIEV4cGxhbmF0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgQm9vbGVhbiBOT1RcbiAgICAgKiBAcGFyYW0gY2hpbGRyZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW5Ob3QoY2hpbGRyZW46IEV4cGxhbmF0aW9uW10pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHBsYW5hdGlvbignTm9uZSBvZicsIGNoaWxkcmVuLCAnTk9UJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIEV4cGxhbmF0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgQm9vbGVhbiBYT1JcbiAgICAgKiBAcGFyYW0gY2hpbGRyZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW5Yb3IoY2hpbGRyZW46IEV4cGxhbmF0aW9uW10pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHBsYW5hdGlvbignRXhhY3RseSBvbmUgb2YnLCBjaGlsZHJlbiwgJ1hPUicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgRXhwbGFuYXRpb24uXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgaXQgd2lsbCBub3QgaGF2ZSBhIGZpbmFsIGVuZC1vZi1saW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGN1cnJlbnRJbmRlbnRhdGlvbiAtIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiBVc2VycyBjYW4gaWdub3JlIGl0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc1N0cmluZyhjdXJyZW50SW5kZW50YXRpb246IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudEluZGVudGF0aW9uICsgdGhpcy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGhhdmUgY2hpbGRyZW4sIHNvIGNvbmNhdGVuYXRlIHRoZW0gdG9nZXRoZXJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGN1cnJlbnRJbmRlbnRhdGlvbiArIGAke3RoaXMuc3ltYm9sfWA7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIFRoZSBkZXNjcmlwdGlvbnMgbGlrZSAnQWxsIG9mJywgJ05vbmUgb2YnIGFyZSBvbmUgcmVhbGx5IG1lYW5pbmdmdWxcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZmlsdGVyLiBPdGhlcndpc2UsIHRoZXkgYXJlIGp1c3QgY29uZnVzaW5nLlxuICAgICAgICAgICAgcmVzdWx0ICs9IGAgKCR7dGhpcy5kZXNjcmlwdGlvbn0pYDtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgKz0gJzonO1xuICAgICAgICBjb25zdCBuZXdJbmRlbnRhdGlvbiA9IGN1cnJlbnRJbmRlbnRhdGlvbiArICcgICc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGBcXG4ke3RoaXMuY2hpbGRyZW5baV0uYXNTdHJpbmcobmV3SW5kZW50YXRpb24pfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21iaW5lT3JDcmVhdGVFeHBsYW5hdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nLCBjaGlsZHJlbjogRXhwbGFuYXRpb25bXSwgc3ltYm9sOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgY29uc3QgY2hpbGQwID0gY2hpbGRyZW5bMF07XG4gICAgICAgICAgICBjb25zdCBjaGlsZDEgPSBjaGlsZHJlblsxXTtcbiAgICAgICAgICAgIGlmIChjaGlsZDAuc3ltYm9sID09PSBzeW1ib2wgJiYgY2hpbGQxLnN5bWJvbCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBjaGlsZDAuY2hpbGRyZW4ucHVzaChjaGlsZDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFeHBsYW5hdGlvbihkZXNjcmlwdGlvbiwgY2hpbGRyZW4sIHN5bWJvbCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uLy4uL1Rhc2snO1xuaW1wb3J0IHR5cGUgeyBFeHBsYW5hdGlvbiB9IGZyb20gJy4uL0V4cGxhaW4vRXhwbGFuYXRpb24nO1xuXG4vKipcbiAqIEEgZmlsdGVyaW5nIGZ1bmN0aW9uLCB0aGF0IHRha2VzIGEgVGFzayBvYmplY3QgYW5kIHJldHVybnNcbiAqIHdoZXRoZXIgaXQgbWF0Y2hlcyBhIHBhcnRpY3VsYXIgZmlsdGVyaW5nIGluc3RydWN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBGaWx0ZXJGdW5jdGlvbiA9ICh0YXNrOiBUYXNrKSA9PiBib29sZWFuO1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgcGFyc2VkIGZpbHRlcmluZyBpbnN0cnVjdGlvbiBmcm9tIGEgdGFza3MgY29kZSBibG9jay5cbiAqXG4gKiBDdXJyZW50bHkgaXQgcHJvdmlkZXMgYWNjZXNzIHRvOlxuICpcbiAqIC0gVGhlIG9yaWdpbmFsIHtAbGluayBpbnN0cnVjdGlvbn1cbiAqIC0gVGhlIHtAbGluayBmaWx0ZXJGdW5jdGlvbn0gLSBhIHtAbGluayBGaWx0ZXJGdW5jdGlvbn0gd2hpY2ggdGVzdHMgd2hldGhlciBhIHRhc2sgbWF0Y2hlcyB0aGUgZmlsdGVyXG4gKlxuICogTGF0ZXIsIHRoZSBwbGFuIGlzIHRvIGFkZCBhIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIG9mIHRoZSBmaWx0ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWx0ZXIge1xuICAgIHJlYWRvbmx5IGluc3RydWN0aW9uOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZXhwbGFuYXRpb246IEV4cGxhbmF0aW9uO1xuICAgIHB1YmxpYyBmaWx0ZXJGdW5jdGlvbjogRmlsdGVyRnVuY3Rpb247XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoaW5zdHJ1Y3Rpb246IHN0cmluZywgZmlsdGVyRnVuY3Rpb246IEZpbHRlckZ1bmN0aW9uLCBleHBsYW5hdGlvbjogRXhwbGFuYXRpb24pIHtcbiAgICAgICAgdGhpcy5pbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uO1xuICAgICAgICB0aGlzLmV4cGxhbmF0aW9uID0gZXhwbGFuYXRpb247XG4gICAgICAgIHRoaXMuZmlsdGVyRnVuY3Rpb24gPSBmaWx0ZXJGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwbGFpbkZpbHRlckluZGVudGVkKGluZGVudDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdGhpcy5leHBsYW5hdGlvbjtcbiAgICAgICAgY29uc3QgdW5pbmRlbnRlZEV4cGxhbmF0aW9uID0gZXhwbGFuYXRpb24uYXNTdHJpbmcoKTtcbiAgICAgICAgaWYgKHVuaW5kZW50ZWRFeHBsYW5hdGlvbiA9PT0gdGhpcy5pbnN0cnVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2luZGVudH0ke3RoaXMuaW5zdHJ1Y3Rpb259XFxuYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtpbmRlbnR9JHt0aGlzLmluc3RydWN0aW9ufSA9PlxcbiR7ZXhwbGFuYXRpb24uYXNTdHJpbmcoJyAgJyl9XFxuYDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHdoaWNoIHN0b3JlcyBvbmUgb2Y6XG4gKiAtIFRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiBzdHJpbmcgLSBhIGxpbmUgZnJvbSBhIHRhc2tzIGNvZGUgYmxvY2tcbiAqIC0gQW4gb3B0aW9uYWwge0BsaW5rIEZpbHRlcn1cbiAqIC0gQW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICpcbiAqIFRoaXMgaXMgcmVhbGx5IGN1cnJlbnRseSBhIGNvbnZlbmllbmNlIGZvciByZXR1cm5pbmcgZGF0YSBmcm9tXG4gKiB7QGxpbmsgRmllbGQuY3JlYXRlRmlsdGVyT3JFcnJvck1lc3NhZ2UoKX0gYW5kIGRlcml2ZWQgY2xhc3Nlcy5cbiAqXG4gKiBCeSB0aGUgdGltZSB0aGUgY29kZSBoYXMgZmluaXNoZWQgd2l0aCBwYXJzaW5nIHRoZSBsaW5lLCB0eXBpY2FsbHkgdGhlXG4gKiBjb250YWluZWQge0BsaW5rIEZpbHRlcn0gd2lsbCBiZSBzYXZlZCwgZm9yIGxhdGVyIHVzZSBpbiBzZWFyY2hpbmcgZm9yIFRhc2tzXG4gKiB0aGF0IG1hdGNoIHRoZSB1c2VyJ3MgZmlsdGVyIGluc3RydWN0aW9uLlxuICpcbiAqIExhdGVyLCBpdCBtYXkgZ2FpbiBoZWxwZXIgZnVuY3Rpb25zIGZvciBjb25zdHJ1Y3RpbmcgcGFyc2VyIGVycm9yIG1lc3NhZ2VzLFxuICogYXMgY3VycmVudGx5IHRoZXNlIGFyZSBjcmVhdGVkIGJ5IHNvbWUgcmF0aGVyIHJlcGV0aXRpb3VzIGNvZGUsIGFuZCBhbHNvXG4gKiB0aGVyZSBpcyBzY29wZSBmb3IgbWFraW5nIHRoZXNlIG1lc3NhZ2VzIG1vcmUgaW5mb3JtYXRpdmUgKGluY2x1ZGluZyB0aGVcbiAqIHByb2JsZW0gbGluZSwgYW5kIHBlcmhhcHMgbGlzdGluZyBhbGxvd2VkIG9wdGlvbnMpLlxuICovXG5leHBvcnQgY2xhc3MgRmlsdGVyT3JFcnJvck1lc3NhZ2Uge1xuICAgIHJlYWRvbmx5IGluc3RydWN0aW9uOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZmlsdGVyOiBGaWx0ZXIgfCB1bmRlZmluZWQ7XG4gICAgZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGluc3RydWN0aW9uOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5pbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVyKCk6IEZpbHRlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXI7XG4gICAgfVxuXG4gICAgc2V0IGZpbHRlcih2YWx1ZTogRmlsdGVyIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlciA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCBmaWx0ZXJGdW5jdGlvbigpOiBGaWx0ZXJGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLl9maWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXIuZmlsdGVyRnVuY3Rpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgRmlsdGVyT3JFcnJvck1lc3NhZ2Ugd2l0aCB0aGUgZmlsdGVyLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSBtZWFuaW5nZnVsIHtAbGluayBFeHBsYW5hdGlvbn0gdG8gYmUgc3VwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsdGVyIC0gYSB7QGxpbmsgRmlsdGVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUZpbHRlcihmaWx0ZXI6IEZpbHRlcik6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEZpbHRlck9yRXJyb3JNZXNzYWdlKGZpbHRlci5pbnN0cnVjdGlvbik7XG4gICAgICAgIHJlc3VsdC5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgRmlsdGVyT3JFcnJvck1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gaW5zdHJ1Y3Rpb25cbiAgICAgKiBAcGFyYW0gZXJyb3JNZXNzYWdlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoaW5zdHJ1Y3Rpb246IHN0cmluZywgZXJyb3JNZXNzYWdlOiBzdHJpbmcpOiBGaWx0ZXJPckVycm9yTWVzc2FnZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGaWx0ZXJPckVycm9yTWVzc2FnZShpbnN0cnVjdGlvbik7XG4gICAgICAgIHJlc3VsdC5lcnJvciA9IGVycm9yTWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRXhwbGFuYXRpb24gfSBmcm9tICcuLi9FeHBsYWluL0V4cGxhbmF0aW9uJztcbmltcG9ydCB7IEZpbHRlciwgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlcic7XG5pbXBvcnQgdHlwZSB7IEZpbHRlckZ1bmN0aW9uIH0gZnJvbSAnLi9GaWx0ZXInO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGEgc2luZ2xlIGluc3RydWN0aW9uIGZvciBmaWx0ZXJpbmcgdGFza3MsIGFuZCBpdHMgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUuXG4gKlxuICogVGhpcyBpcyByZWFsbHkgYSBoZWxwZXIgdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIGluZGl2aWR1YWwgZmlsdGVyXG4gKiBpbnN0cnVjdGlvbnMsIGhpZGluZyBhd2F5IHRoZSBkZXRhaWxzIG9mIHBhcnNpbmcgaW5kaXZpZHVhbCBpbnN0cnVjdGlvbiBsaW5lcy5cbiAqXG4gKiBUaGlzIHdpbGwgdXN1YWxseSBiZSBhY2Nlc3NlZCB2aWEge0BsaW5rIEZpbHRlckluc3RydWN0aW9ucy5hZGR9XG4gKlxuICogQHNlZSBGaWx0ZXJJbnN0cnVjdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbHRlckluc3RydWN0aW9uIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbnN0cnVjdGlvbjogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlcjogRmlsdGVyRnVuY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvcjpcbiAgICAgKiBAcGFyYW0gaW5zdHJ1Y3Rpb24gLSBGdWxsIHRleHQgb2YgdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZmlsdGVyOiBtdXN0IGJlIG1hdGNoZWQgZXhhY3RseVxuICAgICAqIEBwYXJhbSBmaWx0ZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpbnN0cnVjdGlvbjogc3RyaW5nLCBmaWx0ZXI6IEZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuX2luc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb247XG4gICAgICAgIHRoaXMuX2ZpbHRlciA9IGZpbHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQ3JlYXRlRmlsdGVyRm9yTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGxpbmUgPT0gdGhpcy5faW5zdHJ1Y3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmUpO1xuXG4gICAgICAgIGlmIChsaW5lID09PSB0aGlzLl9pbnN0cnVjdGlvbikge1xuICAgICAgICAgICAgcmVzdWx0LmZpbHRlciA9IG5ldyBGaWx0ZXIobGluZSwgdGhpcy5fZmlsdGVyLCBuZXcgRXhwbGFuYXRpb24obGluZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5lcnJvciA9IGBkbyBub3QgdW5kZXJzdGFuZCBmaWx0ZXI6ICR7bGluZX1gO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBGaWx0ZXJJbnN0cnVjdGlvbiB9IGZyb20gJy4vRmlsdGVySW5zdHJ1Y3Rpb24nO1xuaW1wb3J0IHsgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlcic7XG5pbXBvcnQgdHlwZSB7IEZpbHRlckZ1bmN0aW9uIH0gZnJvbSAnLi9GaWx0ZXInO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGEgY29sbGVjdGlvbiBvZiBpbnN0cnVjdGlvbnMgZm9yIGZpbHRlcmluZyB0YXNrcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlcnMgPSBuZXcgRmlsdGVySW5zdHJ1Y3Rpb25zKCk7XG4gKiAgICAgdGhpcy5fZmlsdGVycy5hZGQoJ2lzIHJlY3VycmluZycsICh0YXNrKSA9PiB0YXNrLnJlY3VycmVuY2UgIT09IG51bGwpO1xuICpcbiAqIEBzZWUgRmlsdGVySW5zdHJ1Y3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIEZpbHRlckluc3RydWN0aW9ucyB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyczogRmlsdGVySW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gICAgcHVibGljIGFkZChpbnN0cnVjdGlvbjogc3RyaW5nLCBmaWx0ZXI6IEZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaChuZXcgRmlsdGVySW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIGZpbHRlcikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5DcmVhdGVGaWx0ZXJGb3JMaW5lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiB0aGlzLl9maWx0ZXJzKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyLmNhbkNyZWF0ZUZpbHRlckZvckxpbmUobGluZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdGhpcy5fZmlsdGVycykge1xuICAgICAgICAgICAgY29uc3QgeCA9IGZpbHRlci5jcmVhdGVGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcbiAgICAgICAgICAgIGlmICh4LmVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcbiAgICAgICAgcmVzdWx0LmVycm9yID0gYGRvIG5vdCB1bmRlcnN0YW5kIGZpbHRlcjogJHtsaW5lfWA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9GaWVsZCc7XG5pbXBvcnQgeyBGaWx0ZXJJbnN0cnVjdGlvbnMgfSBmcm9tICcuL0ZpbHRlckluc3RydWN0aW9ucyc7XG5pbXBvcnQgdHlwZSB7IEZpbHRlck9yRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9GaWx0ZXInO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgYW4gaW1wbGVtZW50YXRpb24gZm9yIGltcGxlbWVudHMgb2Yge0BsaW5rIEZpZWxkfVxuICpcbiAqIFRoZSBuYW1lZCBvZiB0aGUgY2xhc3MgaXMgd2Vhay4gSXQgaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBmYWN0IHRoYXQgdGhlXG4gKiBjbGFzcyBpcyBlbnRpcmVseSBpbXBsZW1lbnRlZCB2aWEgdGhlIHtAbGluayBGaWx0ZXJJbnN0cnVjdGlvbnN9IGNsYXNzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmlsdGVySW5zdHJ1Y3Rpb25zQmFzZWRGaWVsZCBleHRlbmRzIEZpZWxkIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2ZpbHRlcnMgPSBuZXcgRmlsdGVySW5zdHJ1Y3Rpb25zKCk7XG5cbiAgICBwdWJsaWMgY2FuQ3JlYXRlRmlsdGVyRm9yTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnMuY2FuQ3JlYXRlRmlsdGVyRm9yTGluZShsaW5lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRmlsdGVyT3JFcnJvck1lc3NhZ2UobGluZTogc3RyaW5nKTogRmlsdGVyT3JFcnJvck1lc3NhZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVycy5jcmVhdGVGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB8IG51bGwge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IENvbXBhcmF0b3IgfSBmcm9tICcuLi9Tb3J0ZXInO1xuaW1wb3J0IHsgU3RhdHVzVHlwZSB9IGZyb20gJy4uLy4uL1N0YXR1c0NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgRmlsdGVySW5zdHJ1Y3Rpb25zQmFzZWRGaWVsZCB9IGZyb20gJy4vRmlsdGVySW5zdHJ1Y3Rpb25zQmFzZWRGaWVsZCc7XG5cbmV4cG9ydCBjbGFzcyBTdGF0dXNGaWVsZCBleHRlbmRzIEZpbHRlckluc3RydWN0aW9uc0Jhc2VkRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIC8vIEJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGNoYW5nZTogSW4gVGFza3MgMS4yMi4wIGFuZCBlYXJsaWVyLCBhbGwgdGFza3NcbiAgICAgICAgLy8gd2l0aCBhbnkgc3RhdHVzIGNoYXJhY3RlciBleGNlcHQgc3BhY2Ugd2VyZSBjb25zaWRlcmVkIGJ5IHRoZSBzdGF0dXMgZmlsdGVyXG4gICAgICAgIC8vIGluc3RydWN0aW9ucyB0byBiZSBkb25lLlxuICAgICAgICAvLyBJbiBsYXRlciB2ZXJzaW9uczpcbiAgICAgICAgLy8gICBTdGF0dXNUeXBlLkRPTkUgY291bnRzIGFzIGRvbmVcbiAgICAgICAgLy8gICBTdGF0dXNUeXBlLkNBTkNFTExFRCBjb3VudHMgYXMgZG9uZVxuICAgICAgICAvLyAgIFN0YXR1c1R5cGUuVE9ETyBjb3VudHMgYXMgbm90IGRvbmVcbiAgICAgICAgLy8gICBTdGF0dXNUeXBlLklOX1BST0dSRVNTIGNvdW50cyBhcyBub3QgZG9uZVxuICAgICAgICAvLyAgIFN0YXR1c1R5cGUuTk9OX1RBU0sgY291bnRzIGFzIGRvbmVcbiAgICAgICAgdGhpcy5fZmlsdGVycy5hZGQoXG4gICAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgICAodGFzazogVGFzaykgPT5cbiAgICAgICAgICAgICAgICB0YXNrLnN0YXR1cy50eXBlID09PSBTdGF0dXNUeXBlLkRPTkUgfHxcbiAgICAgICAgICAgICAgICB0YXNrLnN0YXR1cy50eXBlID09PSBTdGF0dXNUeXBlLkNBTkNFTExFRCB8fFxuICAgICAgICAgICAgICAgIHRhc2suc3RhdHVzLnR5cGUgPT09IFN0YXR1c1R5cGUuTk9OX1RBU0ssXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMuYWRkKFxuICAgICAgICAgICAgJ25vdCBkb25lJyxcbiAgICAgICAgICAgICh0YXNrOiBUYXNrKSA9PiB0YXNrLnN0YXR1cy50eXBlID09PSBTdGF0dXNUeXBlLlRPRE8gfHwgdGFzay5zdGF0dXMudHlwZSA9PT0gU3RhdHVzVHlwZS5JTl9QUk9HUkVTUyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnc3RhdHVzJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3VwcG9ydHNTb3J0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBmdW5jdGlvbiB0byBjb21wYXJlIHR3byBUYXNrIG9iamVjdHMsIGZvciB1c2UgaW4gc29ydGluZyBieSBzdGF0dXMuXG4gICAgICovXG4gICAgcHVibGljIGNvbXBhcmF0b3IoKTogQ29tcGFyYXRvciB7XG4gICAgICAgIC8vIEJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IG5vdGU6IEluIFRhc2tzIDEuMjIuMCBhbmQgZWFybGllciwgdGhlXG4gICAgICAgIC8vIG9ubHkgYXZhaWxhYmxlIHN0YXR1cyBuYW1lcyB3ZXJlICdUb2RvJyBhbmQgJ0RvbmUnLlxuICAgICAgICAvLyBBbmQgJ1RvZG8nIHNvcnRlZCBiZWZvcmUgJ0RvbmUnLlxuICAgICAgICByZXR1cm4gKGE6IFRhc2ssIGI6IFRhc2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFN0YXR1c05hbWVBID0gU3RhdHVzRmllbGQub2xkU3RhdHVzTmFtZShhKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZFN0YXR1c05hbWVCID0gU3RhdHVzRmllbGQub2xkU3RhdHVzTmFtZShiKTtcbiAgICAgICAgICAgIGlmIChvbGRTdGF0dXNOYW1lQSA8IG9sZFN0YXR1c05hbWVCKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9sZFN0YXR1c05hbWVBID4gb2xkU3RhdHVzTmFtZUIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG9sZFN0YXR1c05hbWUoYTogVGFzayk6IHN0cmluZyB7XG4gICAgICAgIGlmIChhLnN0YXR1cy5zeW1ib2wgPT09ICcgJykge1xuICAgICAgICAgICAgcmV0dXJuICdUb2RvJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnRG9uZSc7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0ICogYXMgY2hyb25vIGZyb20gJ2Nocm9uby1ub2RlJztcblxuZXhwb3J0IGNsYXNzIERhdGVQYXJzZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgcGFyc2VEYXRlKGlucHV0OiBzdHJpbmcsIGZvcndhcmREYXRlOiBib29sZWFuID0gZmFsc2UpOiBtb21lbnQuTW9tZW50IHtcbiAgICAgICAgLy8gVXNpbmcgc3RhcnQgb2YgZGF5IHRvIGNvcnJlY3RseSBtYXRjaCBvbiBjb21wYXJpc29uIHdpdGggb3RoZXIgZGF0ZXMgKGxpa2UgZXF1YWxpdHkpLlxuICAgICAgICByZXR1cm4gd2luZG93XG4gICAgICAgICAgICAubW9tZW50KFxuICAgICAgICAgICAgICAgIGNocm9uby5wYXJzZURhdGUoaW5wdXQsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICBmb3J3YXJkRGF0ZTogZm9yd2FyZERhdGUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3RhcnRPZignZGF5Jyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uLy4uL1Rhc2snO1xuaW1wb3J0IHsgRGF0ZVBhcnNlciB9IGZyb20gJy4uL0RhdGVQYXJzZXInO1xuaW1wb3J0IHsgRXhwbGFuYXRpb24gfSBmcm9tICcuLi9FeHBsYWluL0V4cGxhbmF0aW9uJztcbmltcG9ydCB0eXBlIHsgQ29tcGFyYXRvciB9IGZyb20gJy4uL1NvcnRlcic7XG5pbXBvcnQgeyBjb21wYXJlQnlEYXRlIH0gZnJvbSAnLi4vLi4vbGliL0RhdGVUb29scyc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vRmllbGQnO1xuaW1wb3J0IHsgRmlsdGVyLCBGaWx0ZXJPckVycm9yTWVzc2FnZSB9IGZyb20gJy4vRmlsdGVyJztcbmltcG9ydCB7IEZpbHRlckluc3RydWN0aW9ucyB9IGZyb20gJy4vRmlsdGVySW5zdHJ1Y3Rpb25zJztcblxuLyoqXG4gKiBEYXRlRmllbGQgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB0byBoZWxwIGltcGxlbWVudFxuICogYWxsIHRoZSBmaWx0ZXIgaW5zdHJ1Y3Rpb25zIHRoYXQgYWN0IG9uIGEgc2luZ2xlIHR5cGUgb2YgZGF0ZVxuICogdmFsdWUsIHN1Y2ggYXMgdGhlIGRvbmUgZGF0ZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERhdGVGaWVsZCBleHRlbmRzIEZpZWxkIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZpbHRlckluc3RydWN0aW9uczogRmlsdGVySW5zdHJ1Y3Rpb25zO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZmlsdGVySW5zdHJ1Y3Rpb25zID0gbmV3IEZpbHRlckluc3RydWN0aW9ucygpO1xuICAgICAgICB0aGlzLmZpbHRlckluc3RydWN0aW9ucy5hZGQoYGhhcyAke3RoaXMuZmllbGROYW1lKCl9IGRhdGVgLCAodGFzazogVGFzaykgPT4gdGhpcy5kYXRlKHRhc2spICE9PSBudWxsKTtcbiAgICAgICAgdGhpcy5maWx0ZXJJbnN0cnVjdGlvbnMuYWRkKGBubyAke3RoaXMuZmllbGROYW1lKCl9IGRhdGVgLCAodGFzazogVGFzaykgPT4gdGhpcy5kYXRlKHRhc2spID09PSBudWxsKTtcbiAgICAgICAgdGhpcy5maWx0ZXJJbnN0cnVjdGlvbnMuYWRkKGAke3RoaXMuZmllbGROYW1lKCl9IGRhdGUgaXMgaW52YWxpZGAsICh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlKHRhc2spO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGUgIT09IG51bGwgJiYgIWRhdGUuaXNWYWxpZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQ3JlYXRlRmlsdGVyRm9yTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVySW5zdHJ1Y3Rpb25zLmNhbkNyZWF0ZUZpbHRlckZvckxpbmUobGluZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLmNhbkNyZWF0ZUZpbHRlckZvckxpbmUobGluZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgY29uc3QgZmlsdGVyUmVzdWx0ID0gdGhpcy5maWx0ZXJJbnN0cnVjdGlvbnMuY3JlYXRlRmlsdGVyT3JFcnJvck1lc3NhZ2UobGluZSk7XG4gICAgICAgIGlmIChmaWx0ZXJSZXN1bHQuZmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgRmlsdGVyT3JFcnJvck1lc3NhZ2UobGluZSk7XG5cbiAgICAgICAgY29uc3QgbWF0Y2ggPSBGaWVsZC5nZXRNYXRjaCh0aGlzLmZpbHRlclJlZ0V4cCgpLCBsaW5lKTtcbiAgICAgICAgbGV0IGZpbHRlckZ1bmN0aW9uO1xuICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckRhdGUgPSBEYXRlUGFyc2VyLnBhcnNlRGF0ZShtYXRjaFsyXSk7XG4gICAgICAgICAgICBpZiAoIWZpbHRlckRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kICcgKyB0aGlzLmZpZWxkTmFtZSgpICsgJyBkYXRlJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlbGF0aXZlO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRnVuY3Rpb24gPSAodGFzazogVGFzaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZSh0YXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRlID8gZGF0ZS5pc0JlZm9yZShmaWx0ZXJEYXRlKSA6IHRoaXMuZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSAnICcgKyBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoWzFdID09PSAnYWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckZ1bmN0aW9uID0gKHRhc2s6IFRhc2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGUodGFzayk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZSA/IGRhdGUuaXNBZnRlcihmaWx0ZXJEYXRlKSA6IHRoaXMuZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSAnICcgKyBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGdW5jdGlvbiA9ICh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlKHRhc2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUgPyBkYXRlLmlzU2FtZShmaWx0ZXJEYXRlKSA6IHRoaXMuZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSAnIG9uJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBEYXRlRmllbGQuZ2V0RXhwbGFuYXRpb25TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGROYW1lKCksXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclJlc3VsdElmRmllbGRNaXNzaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckRhdGUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXN1bHQuZmlsdGVyID0gbmV3IEZpbHRlcihsaW5lLCBmaWx0ZXJGdW5jdGlvbiwgbmV3IEV4cGxhbmF0aW9uKGV4cGxhbmF0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSAnZG8gbm90IHVuZGVyc3RhbmQgcXVlcnkgZmlsdGVyICgnICsgdGhpcy5maWVsZE5hbWUoKSArICcgZGF0ZSknO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSB0YXNrJ3MgdmFsdWUgZm9yIHRoaXMgZGF0ZSBmaWVsZCwgaWYgYW55LlxuICAgICAqIEBwYXJhbSB0YXNrIC0gYSBUYXNrIG9iamVjdFxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGF0ZSh0YXNrOiBUYXNrKTogTW9tZW50IHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIHN0cmluZyB1c2VkIHRvIGV4cGxhaW4gYSBkYXRlLWJhc2VkIGZpbHRlclxuICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBmb3IgZXhhbXBsZSwgJ2R1ZSdcbiAgICAgKiBAcGFyYW0gcmVsYXRpb25zaGlwUHJlZml4ZWRXaXRoU3BhY2UgLSBmb3IgZXhhbXBsZSAnIGJlZm9yZScgb3IgJydcbiAgICAgKiBAcGFyYW0gZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcgLSB3aGV0aGVyIHRoZSBzZWFyY2ggbWF0Y2hlcyB0YXNrcyB3aXRob3V0IHRoZSByZXF1ZXN0ZWQgZGF0ZSB2YWx1ZVxuICAgICAqIEBwYXJhbSBmaWx0ZXJEYXRlIC0gdGhlIGRhdGUgdXNlZCBpbiB0aGUgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFeHBsYW5hdGlvblN0cmluZyhcbiAgICAgICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgICAgIHJlbGF0aW9uc2hpcFByZWZpeGVkV2l0aFNwYWNlOiBzdHJpbmcsXG4gICAgICAgIGZpbHRlclJlc3VsdElmRmllbGRNaXNzaW5nOiBib29sZWFuLFxuICAgICAgICBmaWx0ZXJEYXRlOiBtb21lbnQuTW9tZW50LFxuICAgICkge1xuICAgICAgICAvLyBFeGFtcGxlIG9mIGZvcm1hdHRlZCBkYXRlOiAnMjAyNC0wMS0wMiAoVHVlc2RheSAybmQgSmFudWFyeSAyMDI0KSdcbiAgICAgICAgY29uc3QgYWN0dWFsRGF0ZSA9IGZpbHRlckRhdGUuZm9ybWF0KCdZWVlZLU1NLUREIChkZGRkIERvIE1NTU0gWVlZWSknKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGAke2ZpZWxkTmFtZX0gZGF0ZSBpcyR7cmVsYXRpb25zaGlwUHJlZml4ZWRXaXRoU3BhY2V9ICR7YWN0dWFsRGF0ZX1gO1xuICAgICAgICBpZiAoZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgIE9SIG5vICR7ZmllbGROYW1lfSBkYXRlYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgdGFzayB0aGF0IGRvZXMgbm90IGhhdmUgdGhlIHBhcnRpY3VsYXIgZGF0ZSB2YWx1ZVxuICAgICAqIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgbWF0Y2guIEZvciBleGFtcGxlLCAnc3RhcnRzJyBzZWFyY2hlcyBtYXRjaCBhbGwgdGFza3NcbiAgICAgKiB0aGF0IGhhdmUgbm8gc3RhcnQgZGF0ZSwgd2hpY2ggYmVoYXZlcyBkaWZmZXJlbnRseSBmcm9tICdkdWUnLCAnZG9uZScgYW5kXG4gICAgICogJ3NjaGVkdWxlZCcgc2VhcmNoZXMuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBmaWx0ZXJSZXN1bHRJZkZpZWxkTWlzc2luZygpOiBib29sZWFuO1xuXG4gICAgcHVibGljIHN1cHBvcnRzU29ydGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBhcmF0b3IoKTogQ29tcGFyYXRvciB7XG4gICAgICAgIHJldHVybiAoYTogVGFzaywgYjogVGFzaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVCeURhdGUodGhpcy5kYXRlKGEpLCB0aGlzLmRhdGUoYikpO1xuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IERhdGVGaWVsZCB9IGZyb20gJy4vRGF0ZUZpZWxkJztcblxuLyoqXG4gKiBTdXBwb3J0IHRoZSAnZHVlJyBzZWFyY2ggaW5zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBEdWVEYXRlRmllbGQgZXh0ZW5kcyBEYXRlRmllbGQge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGR1ZVJlZ2V4cCA9IC9eZHVlIChiZWZvcmV8YWZ0ZXJ8b24pPyA/KC4qKS87XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB7XG4gICAgICAgIHJldHVybiBEdWVEYXRlRmllbGQuZHVlUmVnZXhwO1xuICAgIH1cbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnZHVlJztcbiAgICB9XG4gICAgcHVibGljIGRhdGUodGFzazogVGFzayk6IE1vbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGFzay5kdWVEYXRlO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUHJpb3JpdHksIFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IEV4cGxhbmF0aW9uIH0gZnJvbSAnLi4vRXhwbGFpbi9FeHBsYW5hdGlvbic7XG5pbXBvcnQgdHlwZSB7IENvbXBhcmF0b3IgfSBmcm9tICcuLi9Tb3J0ZXInO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuL0ZpZWxkJztcbmltcG9ydCB7IEZpbHRlciwgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlcic7XG5cbmV4cG9ydCBjbGFzcyBQcmlvcml0eUZpZWxkIGV4dGVuZHMgRmllbGQge1xuICAgIC8vIFRoZSB0cmljayBpbiB0aGUgZm9sbG93aW5nIHRvIG1hbmFnZSB3aGl0ZXNwYWNlIHdpdGggb3B0aW9uYWwgdmFsdWVzXG4gICAgLy8gaXMgdG8gY2FwdHVyZSB0aGVtIGluIE5lc3RlZCBDYXB0dXJlIEdyb3VwcywgbGlrZSB0aGlzOlxuICAgIC8vICAobGVhZGluZy13aGl0ZS1zcGFjZS1pbi1vdXRlci1jYXB0dXJlLWdyb3VwKHZhbHVlcy10by11c2UtYXJlLWluLWlubmVyLWNhcHR1cmUtZ3JvdXApKVxuICAgIC8vIFRoZSBjYXB0dXJlIGdyb3VwcyBhcmUgbnVtYmVyZWQgaW4gdGhlIG9yZGVyIG9mIHRoZWlyIG9wZW5pbmcgYnJhY2tldHMsIGZyb20gbGVmdCB0byByaWdodC5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwcmlvcml0eVJlZ2V4cCA9IC9ecHJpb3JpdHkoXFxzK2lzKT8oXFxzKyhhYm92ZXxiZWxvd3xub3QpKT8oXFxzKyhsb3d8bm9uZXxtZWRpdW18aGlnaCkpJC87XG5cbiAgICBjcmVhdGVGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lOiBzdHJpbmcpOiBGaWx0ZXJPckVycm9yTWVzc2FnZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlNYXRjaCA9IEZpZWxkLmdldE1hdGNoKHRoaXMuZmlsdGVyUmVnRXhwKCksIGxpbmUpO1xuICAgICAgICBpZiAocHJpb3JpdHlNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyUHJpb3JpdHlTdHJpbmcgPSBwcmlvcml0eU1hdGNoWzVdO1xuICAgICAgICAgICAgbGV0IGZpbHRlclByaW9yaXR5OiBQcmlvcml0eSB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGZpbHRlclByaW9yaXR5U3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbG93JzpcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUHJpb3JpdHkgPSBQcmlvcml0eS5Mb3c7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJQcmlvcml0eSA9IFByaW9yaXR5Lk5vbmU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21lZGl1bSc6XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclByaW9yaXR5ID0gUHJpb3JpdHkuTWVkaXVtO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdoaWdoJzpcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUHJpb3JpdHkgPSBQcmlvcml0eS5IaWdoO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpbHRlclByaW9yaXR5ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIHByaW9yaXR5JztcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZXhwbGFuYXRpb24gPSBsaW5lO1xuICAgICAgICAgICAgbGV0IGZpbHRlcjtcbiAgICAgICAgICAgIHN3aXRjaCAocHJpb3JpdHlNYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Fib3ZlJzpcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gKHRhc2s6IFRhc2spID0+IHRhc2sucHJpb3JpdHkubG9jYWxlQ29tcGFyZShmaWx0ZXJQcmlvcml0eSEpIDwgMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYmVsb3cnOlxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAodGFzazogVGFzaykgPT4gdGFzay5wcmlvcml0eS5sb2NhbGVDb21wYXJlKGZpbHRlclByaW9yaXR5ISkgPiAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdub3QnOlxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAodGFzazogVGFzaykgPT4gdGFzay5wcmlvcml0eSAhPT0gZmlsdGVyUHJpb3JpdHk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlciA9ICh0YXNrOiBUYXNrKSA9PiB0YXNrLnByaW9yaXR5ID09PSBmaWx0ZXJQcmlvcml0eTtcbiAgICAgICAgICAgICAgICAgICAgZXhwbGFuYXRpb24gPSBgJHt0aGlzLmZpZWxkTmFtZSgpfSBpcyAke2ZpbHRlclByaW9yaXR5U3RyaW5nfWA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5maWx0ZXIgPSBuZXcgRmlsdGVyKGxpbmUsIGZpbHRlciwgbmV3IEV4cGxhbmF0aW9uKGV4cGxhbmF0aW9uKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSAnZG8gbm90IHVuZGVyc3RhbmQgcXVlcnkgZmlsdGVyIChwcmlvcml0eSknO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3ByaW9yaXR5JztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB7XG4gICAgICAgIHJldHVybiBQcmlvcml0eUZpZWxkLnByaW9yaXR5UmVnZXhwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wYXJhdG9yKCk6IENvbXBhcmF0b3Ige1xuICAgICAgICByZXR1cm4gKGE6IFRhc2ssIGI6IFRhc2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhLnByaW9yaXR5LmxvY2FsZUNvbXBhcmUoYi5wcmlvcml0eSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIGEgc3RyaW5nIHZhbHVlIG1hdGNoZXMgYSBwYXJ0aWN1bGFyIGNvbmRpdGlvbi5cbiAqXG4gKiBUaGlzIGlzIHVzZWQgdG8gaGlkZSBhd2F5IHRoZSBkZXRhaWxzIG9mIHZhcmlvdXMgdGV4dCBzZWFyY2hlcywgc3VjaCBhcyB0aGVcbiAqIHNpbXBsZSBpbmNsdXNpb24gb2YgYSBzdWItc3RyaW5nLCBvciB0aGUgbW9yZSBjb21wbGV4IHJlZ3VsYXIgZXhwcmVzc2lvbiBzZWFyY2hlcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElTdHJpbmdNYXRjaGVyIHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gc3RyaW5nIG1hdGNoZXMgdGhpcyBjb25kaXRpb24uXG4gICAgICogQHBhcmFtIHN0cmluZ1RvU2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IG1hdGNoZXMoc3RyaW5nVG9TZWFyY2g6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gd2hldGhlciBhbnkgb2YgdGhlIGdpdmVuIHN0cmluZ3MgbWF0Y2hlcyB0aGlzIGNvbmRpdGlvbi5cbiAgICAgKiBAcGFyYW0gc3RyaW5nc1RvU2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIG1hdGNoZXNBbnlPZihzdHJpbmdzVG9TZWFyY2g6IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdzVG9TZWFyY2guc29tZSgocykgPT4gdGhpcy5tYXRjaGVzKHMpKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgSVN0cmluZ01hdGNoZXIgfSBmcm9tICcuL0lTdHJpbmdNYXRjaGVyJztcblxuLyoqXG4gKiBTdWJzdHJpbmctYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgSVN0cmluZ01hdGNoZXIuXG4gKlxuICogVGhpcyBkb2VzIGEgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2ggZm9yIHRoZSBnaXZlbiBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdWJzdHJpbmdNYXRjaGVyIGV4dGVuZHMgSVN0cmluZ01hdGNoZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nVG9GaW5kOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBTdWJzdHJpbmdNYXRjaGVyIG9iamVjdFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1RvRmluZCAtIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoZXMgd2lsbCBiZSBjYXNlLWluc2Vuc2l0aXZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzdHJpbmdUb0ZpbmQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnN0cmluZ1RvRmluZCA9IHN0cmluZ1RvRmluZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hlcyhzdHJpbmdUb1NlYXJjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBTdWJzdHJpbmdNYXRjaGVyLnN0cmluZ0luY2x1ZGVzQ2FzZUluc2Vuc2l0aXZlKHN0cmluZ1RvU2VhcmNoLCB0aGlzLnN0cmluZ1RvRmluZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzdHJpbmdJbmNsdWRlc0Nhc2VJbnNlbnNpdGl2ZShoYXlzdGFjazogc3RyaW5nLCBuZWVkbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaGF5c3RhY2sudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyhuZWVkbGUudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IElTdHJpbmdNYXRjaGVyIH0gZnJvbSAnLi9JU3RyaW5nTWF0Y2hlcic7XG5cbi8qKlxuICogUmVndWxhci1leHByZXNzaW9uLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIElTdHJpbmdNYXRjaGVyLlxuICovXG5leHBvcnQgY2xhc3MgUmVnZXhNYXRjaGVyIGV4dGVuZHMgSVN0cmluZ01hdGNoZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnZXg6IFJlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIFJlZ2V4TWF0Y2hlciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVnZXgge1JlZ0V4cH0gLSBBIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihyZWdleDogUmVnRXhwKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucmVnZXggPSByZWdleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBSZWdleE1hdGNoZXIgb2JqZWN0IGlmIHRoZSBzdXBwbGllZCBzdHJpbmcgaXMgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAgICogYW5kIG51bGwgaWYgbm90LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2V4SW5wdXQgLSBBIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlZ2luIHdpdGggYSAvLCBhbmQgZW5kIGVpdGhlciB3aXRoIC8gYW5kIG9wdGlvbmFsbHkgYW55XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBmbGFncy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHZhbGlkYXRlQW5kQ29uc3RydWN0KHJlZ2V4SW5wdXQ6IHN0cmluZyk6IFJlZ2V4TWF0Y2hlciB8IG51bGwge1xuICAgICAgICAvLyBDb3VydGVzeSBvZiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNzg0MzY5MS9qYXZhc2NyaXB0LXJlZ2V4LXRvLW1hdGNoLWEtcmVnZXhcbiAgICAgICAgY29uc3QgcmVnZXhQYXR0ZXJuID1cbiAgICAgICAgICAgIC9cXC8oKD8hWyorP10pKD86W15cXHJcXG5bL1xcXFxdfFxcXFwufFxcWyg/OlteXFxyXFxuXFxdXFxcXF18XFxcXC4pKl0pKylcXC8oKD86Zyg/OmltP3xtaT8pP3xpKD86Z20/fG1nPyk/fG0oPzpnaT98aWc/KT8pPykvO1xuICAgICAgICBjb25zdCBxdWVyeSA9IHJlZ2V4SW5wdXQubWF0Y2gocmVnZXhQYXR0ZXJuKTtcblxuICAgICAgICBpZiAocXVlcnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZ0V4cCA9IG5ldyBSZWdFeHAocXVlcnlbMV0sIHF1ZXJ5WzJdKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnZXhNYXRjaGVyKHJlZ0V4cCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBtYXRjaGVzKHN0cmluZ1RvU2VhcmNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1RvU2VhcmNoLm1hdGNoKHRoaXMucmVnZXgpICE9PSBudWxsO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IFN1YnN0cmluZ01hdGNoZXIgfSBmcm9tICcuLi9NYXRjaGVycy9TdWJzdHJpbmdNYXRjaGVyJztcbmltcG9ydCB7IFJlZ2V4TWF0Y2hlciB9IGZyb20gJy4uL01hdGNoZXJzL1JlZ2V4TWF0Y2hlcic7XG5pbXBvcnQgdHlwZSB7IElTdHJpbmdNYXRjaGVyIH0gZnJvbSAnLi4vTWF0Y2hlcnMvSVN0cmluZ01hdGNoZXInO1xuaW1wb3J0IHsgRXhwbGFuYXRpb24gfSBmcm9tICcuLi9FeHBsYWluL0V4cGxhbmF0aW9uJztcbmltcG9ydCB0eXBlIHsgQ29tcGFyYXRvciB9IGZyb20gJy4uL1NvcnRlcic7XG5pbXBvcnQgdHlwZSB7IEdyb3VwZXJGdW5jdGlvbiB9IGZyb20gJy4uL0dyb3VwZXInO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuL0ZpZWxkJztcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb24gfSBmcm9tICcuL0ZpbHRlcic7XG5pbXBvcnQgeyBGaWx0ZXIsIEZpbHRlck9yRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9GaWx0ZXInO1xuXG4vKipcbiAqIFRleHRGaWVsZCBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHRvIGhlbHAgaW1wbGVtZW50XG4gKiBhbGwgdGhlIGZpbHRlciBpbnN0cnVjdGlvbnMgdGhhdCBhY3Qgb24gYSBzaW5nbGUgdHlwZSBvZiBzdHJpbmdcbiAqIHZhbHVlLCBzdWNoIGFzIHRoZSBkZXNjcmlwdGlvbiBvciBmaWxlIHBhdGguXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUZXh0RmllbGQgZXh0ZW5kcyBGaWVsZCB7XG4gICAgcHVibGljIGNyZWF0ZUZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBGaWVsZC5nZXRNYXRjaCh0aGlzLmZpbHRlclJlZ0V4cCgpLCBsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBJZiBGaWVsZC5jYW5DcmVhdGVGaWx0ZXJGb3JMaW5lKCkgaGFzIGJlZW4gY2hlY2tlZCwgd2Ugc2hvdWxkIG5ldmVyIGdldFxuICAgICAgICAgICAgLy8gaW4gdG8gdGhpcyBibG9jay5cbiAgICAgICAgICAgIHJldHVybiBGaWx0ZXJPckVycm9yTWVzc2FnZS5mcm9tRXJyb3IobGluZSwgYGRvIG5vdCB1bmRlcnN0YW5kIHF1ZXJ5IGZpbHRlciAoJHt0aGlzLmZpZWxkTmFtZSgpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhbiBJU3RyaW5nTWF0Y2hlciBmb3IgdGhpcyBmaWx0ZXIsIG9yIHJldHVyblxuICAgICAgICAvLyBpZiB0aGUgaW5wdXRzIGFyZSBpbnZhbGlkLlxuICAgICAgICBjb25zdCBbXywgZmlsdGVyT3BlcmF0b3IsIGZpbHRlclZhbHVlXSA9IG1hdGNoO1xuICAgICAgICBsZXQgbWF0Y2hlcjogSVN0cmluZ01hdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgICAgICAgaWYgKGZpbHRlck9wZXJhdG9yLmluY2x1ZGVzKCdpbmNsdWRlJykpIHtcbiAgICAgICAgICAgIG1hdGNoZXIgPSBuZXcgU3Vic3RyaW5nTWF0Y2hlcihmaWx0ZXJWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyT3BlcmF0b3IuaW5jbHVkZXMoJ3JlZ2V4JykpIHtcbiAgICAgICAgICAgIG1hdGNoZXIgPSBSZWdleE1hdGNoZXIudmFsaWRhdGVBbmRDb25zdHJ1Y3QoZmlsdGVyVmFsdWUpO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRmlsdGVyT3JFcnJvck1lc3NhZ2UuZnJvbUVycm9yKFxuICAgICAgICAgICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgICAgICAgICBgY2Fubm90IHBhcnNlIHJlZ2V4ICgke3RoaXMuZmllbGROYW1lKCl9KTsgY2hlY2sgeW91ciBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIGZvciB5b3VyIHF1ZXJ5YCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hdGNoZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEl0J3MgbGlrZWx5IHRoaXMgY2FuIG5vdyBuZXZlciBiZSByZWFjaGVkLlxuICAgICAgICAgICAgLy8gUmV0YWluZWQgZm9yIHNhZmV0eSwgZm9yIG5vdy5cbiAgICAgICAgICAgIHJldHVybiBGaWx0ZXJPckVycm9yTWVzc2FnZS5mcm9tRXJyb3IobGluZSwgYGRvIG5vdCB1bmRlcnN0YW5kIHF1ZXJ5IGZpbHRlciAoJHt0aGlzLmZpZWxkTmFtZSgpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmFsbHksIHdlIGNhbiBjcmVhdGUgdGhlIEZpbHRlciwgdGhhdCB0YWtlcyBhIHRhc2tcbiAgICAgICAgLy8gYW5kIHRlc3RzIGlmIGl0IG1hdGNoZXMgdGhlIHN0cmluZyBmaWx0ZXJpbmcgcnVsZVxuICAgICAgICAvLyByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdC5cbiAgICAgICAgY29uc3QgbmVnYXRlID0gZmlsdGVyT3BlcmF0b3IubWF0Y2goL25vdC8pICE9PSBudWxsO1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBuZXcgRmlsdGVyKGxpbmUsIHRoaXMuZ2V0RmlsdGVyKG1hdGNoZXIsIG5lZ2F0ZSksIG5ldyBFeHBsYW5hdGlvbihsaW5lKSk7XG4gICAgICAgIHJldHVybiBGaWx0ZXJPckVycm9yTWVzc2FnZS5mcm9tRmlsdGVyKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZ2V4cCBwYXR0ZXJuIG1hdGNoaW5nIHRoZSBmaWVsZCdzIG5hbWUgYW5kIHBvc3NpYmxlIGFsaWFzZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZmllbGRQYXR0ZXJuKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkTmFtZVNpbmd1bGFyRXNjYXBlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWdleHAgcGF0dGVybiBtYXRjaGluZyBhbGwgcG9zc2libGUgZmlsdGVyIG9wZXJhdG9ycyBmb3IgdGhpcyBmaWVsZCxcbiAgICAgKiBzdWNoIGFzIFwiaW5jbHVkZXNcIiBvciBcImRvZXMgbm90IGluY2x1ZGVcIi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZmlsdGVyT3BlcmF0b3JQYXR0ZXJuKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnaW5jbHVkZXN8ZG9lcyBub3QgaW5jbHVkZXxyZWdleCBtYXRjaGVzfHJlZ2V4IGRvZXMgbm90IG1hdGNoJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeKD86JHt0aGlzLmZpZWxkUGF0dGVybigpfSkgKCR7dGhpcy5maWx0ZXJPcGVyYXRvclBhdHRlcm4oKX0pICguKilgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgZmllbGROYW1lKCk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZpZWxkJ3MgdmFsdWUsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgdmFsdWUgaXMgbnVsbFxuICAgICAqIEBwYXJhbSB0YXNrXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCB2YWx1ZSh0YXNrOiBUYXNrKTogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIGdldEZpbHRlcihtYXRjaGVyOiBJU3RyaW5nTWF0Y2hlciwgbmVnYXRlOiBib29sZWFuKTogRmlsdGVyRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gKHRhc2s6IFRhc2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlciEubWF0Y2hlcyh0aGlzLnZhbHVlKHRhc2spKTtcbiAgICAgICAgICAgIHJldHVybiBuZWdhdGUgPyAhbWF0Y2ggOiBtYXRjaDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Ygc29ydGluZywgZm9yIHRleHQgZmllbGRzIHdoZXJlIHNpbXBsZSBsb2NhbGUtYXdhcmUgc29ydGluZyBpcyB0aGVcbiAgICAgKiBkZXNpcmVkIGJlaGF2aW91ci5cbiAgICAgKlxuICAgICAqIEVhY2ggY2xhc3MgdGhhdCB3YW50cyB0byB1c2UgdGhpcyB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgc3VwcG9ydHNTb3J0aW5nKCkgdG8gcmV0dXJuIHRydWUsXG4gICAgICogdG8gdHVybiBvbiBzb3J0aW5nLlxuICAgICAqL1xuICAgIGNvbXBhcmF0b3IoKTogQ29tcGFyYXRvciB7XG4gICAgICAgIHJldHVybiAoYTogVGFzaywgYjogVGFzaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUoYSkubG9jYWxlQ29tcGFyZSh0aGlzLnZhbHVlKGIpLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZ3JvdXBpbmcsIGZvciB0ZXh0IGZpZWxkcyB3aGVyZSBzaW1wbGUgZ3JvdXBpbmcgYnkgZmllbGQgdmFsdWUgaXMgdGhlXG4gICAgICogZGVzaXJlZCBiZWhhdmlvdXIuXG4gICAgICpcbiAgICAgKiBFYWNoIGNsYXNzIHRoYXQgd2FudHMgdG8gdXNlIHRoaXMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHN1cHBvcnRzR3JvdXBpbmcoKSB0byByZXR1cm4gdHJ1ZSxcbiAgICAgKiB0byB0dXJuIG9uIGdyb3VwaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBncm91cGVyKCk6IEdyb3VwZXJGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiAodGFzazogVGFzaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLnZhbHVlKHRhc2spXTtcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgeyBUZXh0RmllbGQgfSBmcm9tICcuL1RleHRGaWVsZCc7XG5cbi8qKiBTdXBwb3J0IHRoZSAncGF0aCcgc2VhcmNoIGluc3RydWN0aW9uLlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhbHNvIHNlYXJjaGVzIHRoZSBmaWxlIGV4dGVuc2lvbixcbiAqIHNvICdwYXRoIGluY2x1ZGVzIC5tZCcgd2lsbCB0eXBpY2FsbHkgbWF0Y2ggYWxsIHRhc2tzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhGaWVsZCBleHRlbmRzIFRleHRGaWVsZCB7XG4gICAgcHVibGljIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3BhdGgnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZpbGUgcGF0aCBpbmNsdWRpbmcgZmlsZSBleHRlbnNpb24sIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgcGF0aCBpcyBudWxsXG4gICAgICogQHBhcmFtIHRhc2tcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgcHVibGljIHZhbHVlKHRhc2s6IFRhc2spOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGFzay5wYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbXBhcmF0b3IgfSBmcm9tICcuLi9Tb3J0ZXInO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vRmllbGQnO1xuaW1wb3J0IHsgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlcic7XG5cbi8qKlxuICogU3VwcG9ydCAndXJnZW5jeScgc29ydGluZy5cbiAqXG4gKiBOb3RlOiBTZWFyY2hpbmcgYnkgdXJnZW5jeSBpcyBub3QgeWV0IGltcGxlbWVudGVkLlxuICovXG5leHBvcnQgY2xhc3MgVXJnZW5jeUZpZWxkIGV4dGVuZHMgRmllbGQge1xuICAgIGNhbkNyZWF0ZUZpbHRlckZvckxpbmUoX2xpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY3JlYXRlRmlsdGVyT3JFcnJvck1lc3NhZ2UobGluZTogc3RyaW5nKTogRmlsdGVyT3JFcnJvck1lc3NhZ2Uge1xuICAgICAgICByZXR1cm4gRmlsdGVyT3JFcnJvck1lc3NhZ2UuZnJvbUVycm9yKGxpbmUsICdGaWx0ZXJpbmcgYnkgdXJnZW5jeSBpcyBub3QgeWV0IHN1cHBvcnRlZCcpO1xuICAgIH1cblxuICAgIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3VyZ2VuY3knO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBmaWx0ZXJSZWdFeHAoKTogUmVnRXhwIHwgbnVsbCB7XG4gICAgICAgIHRocm93IEVycm9yKGBmaWx0ZXJSZWdFeHAoKSB1bmltcGxlbWVudGVkIGZvciAke3RoaXMuZmllbGROYW1lKCl9YCk7XG4gICAgfVxuXG4gICAgc3VwcG9ydHNTb3J0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcGFyYXRvcigpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgcmV0dXJuIChhOiBUYXNrLCBiOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAvLyBIaWdoZXIgdXJnZW5jeSBzaG91bGQgYmUgc29ydGVkIGVhcmxpZXIuXG4gICAgICAgICAgICByZXR1cm4gYi51cmdlbmN5IC0gYS51cmdlbmN5O1xuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi9UYXNrJztcbmltcG9ydCB0eXBlIHsgQ29tcGFyYXRvciB9IGZyb20gJy4vU29ydGVyJztcbmltcG9ydCB0eXBlIHsgU29ydGVyIH0gZnJvbSAnLi9Tb3J0ZXInO1xuaW1wb3J0IHsgU3RhdHVzRmllbGQgfSBmcm9tICcuL0ZpbHRlci9TdGF0dXNGaWVsZCc7XG5pbXBvcnQgeyBEdWVEYXRlRmllbGQgfSBmcm9tICcuL0ZpbHRlci9EdWVEYXRlRmllbGQnO1xuaW1wb3J0IHsgUHJpb3JpdHlGaWVsZCB9IGZyb20gJy4vRmlsdGVyL1ByaW9yaXR5RmllbGQnO1xuaW1wb3J0IHsgUGF0aEZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvUGF0aEZpZWxkJztcbmltcG9ydCB7IFVyZ2VuY3lGaWVsZCB9IGZyb20gJy4vRmlsdGVyL1VyZ2VuY3lGaWVsZCc7XG5cbmV4cG9ydCBjbGFzcyBTb3J0IHtcbiAgICBwdWJsaWMgc3RhdGljIGJ5KHNvcnRlcnM6IFNvcnRlcltdLCB0YXNrczogVGFza1tdKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRDb21wYXJhdG9yczogQ29tcGFyYXRvcltdID0gW1xuICAgICAgICAgICAgbmV3IFVyZ2VuY3lGaWVsZCgpLmNvbXBhcmF0b3IoKSxcbiAgICAgICAgICAgIG5ldyBTdGF0dXNGaWVsZCgpLmNvbXBhcmF0b3IoKSxcbiAgICAgICAgICAgIG5ldyBEdWVEYXRlRmllbGQoKS5jb21wYXJhdG9yKCksXG4gICAgICAgICAgICBuZXcgUHJpb3JpdHlGaWVsZCgpLmNvbXBhcmF0b3IoKSxcbiAgICAgICAgICAgIG5ldyBQYXRoRmllbGQoKS5jb21wYXJhdG9yKCksXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgdXNlckNvbXBhcmF0b3JzOiBDb21wYXJhdG9yW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNvcnRlciBvZiBzb3J0ZXJzKSB7XG4gICAgICAgICAgICB1c2VyQ29tcGFyYXRvcnMucHVzaChzb3J0ZXIuY29tcGFyYXRvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFza3Muc29ydChTb3J0Lm1ha2VDb21wb3NpdGVDb21wYXJhdG9yKFsuLi51c2VyQ29tcGFyYXRvcnMsIC4uLmRlZmF1bHRDb21wYXJhdG9yc10pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYWtlQ29tcG9zaXRlQ29tcGFyYXRvcihjb21wYXJhdG9yczogQ29tcGFyYXRvcltdKTogQ29tcGFyYXRvciB7XG4gICAgICAgIHJldHVybiAoYSwgYikgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb21wYXJhdG9yIG9mIGNvbXBhcmF0b3JzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyYXRvcihhLCBiKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi4vLi4vQ29uZmlnL1NldHRpbmdzJztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uLy4uL1Rhc2snO1xuaW1wb3J0IHR5cGUgeyBDb21wYXJhdG9yIH0gZnJvbSAnLi4vU29ydGVyJztcbmltcG9ydCB7IFRleHRGaWVsZCB9IGZyb20gJy4vVGV4dEZpZWxkJztcblxuLyoqXG4gKiBTdXBwb3J0IHRoZSAnZGVzY3JpcHRpb24nIHNlYXJjaCBpbnN0cnVjdGlvbi5cbiAqXG4gKiBOb3RlIHRoYXQgRGVzY3JpcHRpb25GaWVsZC52YWx1ZSgpIHJldHVybnMgdGhlIGRlc2NyaXB0aW9uXG4gKiB3aXRoIHRoZSBnbG9iYWwgZmlsdGVyIChpZiBhbnkpIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXNjcmlwdGlvbkZpZWxkIGV4dGVuZHMgVGV4dEZpZWxkIHtcbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnZGVzY3JpcHRpb24nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgdGFzaydzIGRlc2NyaXB0aW9uLCB3aXRoIGFueSBnbG9iYWwgdGFnIHJlbW92ZWRcbiAgICAgKlxuICAgICAqIFByb21vdGVkIHRvIHB1YmxpYywgdG8gZW5hYmxlIHRlc3RpbmcuXG4gICAgICogQHBhcmFtIHRhc2tcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgcHVibGljIHZhbHVlKHRhc2s6IFRhc2spOiBzdHJpbmcge1xuICAgICAgICAvLyBSZW1vdmUgZ2xvYmFsIGZpbHRlciBmcm9tIGRlc2NyaXB0aW9uIG1hdGNoIGlmIHByZXNlbnQuXG4gICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIG1hdGNoIG9ubHkgb24gdGhlIGNvbnRlbnQgb2YgdGhlIHRhc2ssIG5vdFxuICAgICAgICAvLyB0aGUgZ2xvYmFsIGZpbHRlci5cbiAgICAgICAgY29uc3QgZ2xvYmFsRmlsdGVyID0gZ2V0U2V0dGluZ3MoKS5nbG9iYWxGaWx0ZXI7XG4gICAgICAgIHJldHVybiB0YXNrLmRlc2NyaXB0aW9uLnJlcGxhY2UoZ2xvYmFsRmlsdGVyLCAnJykudHJpbSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGZ1bmN0aW9uIHRvIGNvbXBhcmUgdGhlIGRlc2NyaXB0aW9uIGJ5IGhvdyBpdCBpcyByZW5kZXJlZCBpbiBtYXJrZG93bi5cbiAgICAgKlxuICAgICAqIERvZXMgbm90IHVzZSB0aGUgTWFya2Rvd25SZW5kZXJlciwgYnV0IHRyaWVzIHRvIG1hdGNoIHJlZ2V4ZXMgaW5zdGVhZFxuICAgICAqIGluIG9yZGVyIHRvIGJlIHNpbXBsZXIsIGZhc3RlciwgYW5kIG5vdCBhc3luYy5cbiAgICAgKlxuICAgICAqIE9ubHkgc2VhcmNoZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkZXNjcmlwdGlvbi4gTWFya2Rvd24gbGF0ZXIgaW4gdGhlIHRhayBpcyB1bmNoYW5nZWQuXG4gICAgICovXG4gICAgcHVibGljIGNvbXBhcmF0b3IoKTogQ29tcGFyYXRvciB7XG4gICAgICAgIHJldHVybiAoYTogVGFzaywgYjogVGFzaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb25BID0gRGVzY3JpcHRpb25GaWVsZC5jbGVhbkRlc2NyaXB0aW9uKGEuZGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb25CID0gRGVzY3JpcHRpb25GaWVsZC5jbGVhbkRlc2NyaXB0aW9uKGIuZGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uQS5sb2NhbGVDb21wYXJlKGRlc2NyaXB0aW9uQiwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBgKmAsIGA9YCwgYW5kIGBbYCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlc2NyaXB0aW9uLlxuICAgICAqXG4gICAgICogV2lsbCByZW1vdmUgdGhlbSBvbmx5IGlmIHRoZXkgYXJlIGNsb3NpbmcuXG4gICAgICogUHJvcGVybHkgcmVhZHMgbGlua3MgW1tsaWtlIHRoaXN8b25lXV0gKG5vdGUgcGlwZSkuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjbGVhbkRlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBnbG9iYWxGaWx0ZXIgPSBnZXRTZXR0aW5ncygpLmdsb2JhbEZpbHRlcjtcbiAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKGdsb2JhbEZpbHRlciwgJycpLnRyaW0oKTtcblxuICAgICAgICBjb25zdCBzdGFydHNXaXRoTGlua1JlZ2V4ID0gL15cXFtcXFs/KFteXFxdXSopXV0/LztcbiAgICAgICAgY29uc3QgbGlua1JlZ2V4TWF0Y2ggPSBkZXNjcmlwdGlvbi5tYXRjaChzdGFydHNXaXRoTGlua1JlZ2V4KTtcbiAgICAgICAgaWYgKGxpbmtSZWdleE1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBpbm5lckxpbmtUZXh0ID0gbGlua1JlZ2V4TWF0Y2hbMV07XG4gICAgICAgICAgICAvLyBGb3IgYSBsaW5rLCB3ZSBoYXZlIHRvIGNoZWNrIHdoZXRoZXIgaXQgaGFzIGFub3RoZXIgdmlzaWJsZSBuYW1lIHNldC5cbiAgICAgICAgICAgIC8vIEZvciBleGFtcGxlIGBbW3RoaXMgaXMgdGhlIGxpbmt8YnV0IHRoaXMgaXMgYWN0dWFsbHkgc2hvd25dXWAuXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9XG4gICAgICAgICAgICAgICAgaW5uZXJMaW5rVGV4dC5zdWJzdHJpbmcoaW5uZXJMaW5rVGV4dC5pbmRleE9mKCd8JykgKyAxKSArIGRlc2NyaXB0aW9uLnJlcGxhY2Uoc3RhcnRzV2l0aExpbmtSZWdleCwgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzY3JpcHRpb24gPSB0aGlzLnJlcGxhY2VGb3JtYXR0aW5nKGRlc2NyaXB0aW9uLCAvXlxcKlxcKihbXipdKylcXCpcXCovKTtcbiAgICAgICAgZGVzY3JpcHRpb24gPSB0aGlzLnJlcGxhY2VGb3JtYXR0aW5nKGRlc2NyaXB0aW9uLCAvXlxcKihbXipdKylcXCovKTtcbiAgICAgICAgZGVzY3JpcHRpb24gPSB0aGlzLnJlcGxhY2VGb3JtYXR0aW5nKGRlc2NyaXB0aW9uLCAvXj09KFtePV0rKT09Lyk7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gdGhpcy5yZXBsYWNlRm9ybWF0dGluZyhkZXNjcmlwdGlvbiwgL15fXyhbXl9dKylfXy8pO1xuICAgICAgICBkZXNjcmlwdGlvbiA9IHRoaXMucmVwbGFjZUZvcm1hdHRpbmcoZGVzY3JpcHRpb24sIC9eXyhbXl9dKylfLyk7XG5cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBzb21lIGZvcm1hdHRpbmcgZnJvbSB0ZXh0XG4gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uXG4gICAgICogQHBhcmFtIHJlZ0V4cCBBIHJlZ3VsYXIgZXhwcmVzc2lvbiAtIGFsbCBtYXRjaGluZyB0ZXh0IGlzIGRpc2NhcmRlZCBleGNlcHQgdGhlIGZpcnN0IGdyb3VwXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVwbGFjZUZvcm1hdHRpbmcoZGVzY3JpcHRpb246IHN0cmluZywgcmVnRXhwOiBSZWdFeHApIHtcbiAgICAgICAgY29uc3QgaXRhbGljQm9sZFJlZ2V4TWF0Y2ggPSBkZXNjcmlwdGlvbi5tYXRjaChyZWdFeHApO1xuICAgICAgICBpZiAoaXRhbGljQm9sZFJlZ2V4TWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVySXRhbGljQm9sZFRleHQgPSBpdGFsaWNCb2xkUmVnZXhNYXRjaFsxXTtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gaW5uZXJJdGFsaWNCb2xkVGV4dCArIGRlc2NyaXB0aW9uLnJlcGxhY2UocmVnRXhwLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IERhdGVGaWVsZCB9IGZyb20gJy4vRGF0ZUZpZWxkJztcblxuLyoqXG4gKiBTdXBwb3J0IHRoZSAnZG9uZScgc2VhcmNoIGluc3RydWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRG9uZURhdGVGaWVsZCBleHRlbmRzIERhdGVGaWVsZCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZG9uZVJlZ2V4cCA9IC9eZG9uZSAoYmVmb3JlfGFmdGVyfG9uKT8gPyguKikvO1xuXG4gICAgcHJvdGVjdGVkIGZpbHRlclJlZ0V4cCgpOiBSZWdFeHAge1xuICAgICAgICByZXR1cm4gRG9uZURhdGVGaWVsZC5kb25lUmVnZXhwO1xuICAgIH1cbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnZG9uZSc7XG4gICAgfVxuICAgIHB1YmxpYyBkYXRlKHRhc2s6IFRhc2spOiBNb21lbnQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRhc2suZG9uZURhdGU7XG4gICAgfVxuICAgIHByb3RlY3RlZCBmaWx0ZXJSZXN1bHRJZkZpZWxkTWlzc2luZygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBGaWx0ZXJJbnN0cnVjdGlvbnNCYXNlZEZpZWxkIH0gZnJvbSAnLi9GaWx0ZXJJbnN0cnVjdGlvbnNCYXNlZEZpZWxkJztcblxuLyoqXG4gKiBJbXBsZW1lbnRzICdleGNsdWRlIHN1Yi1pdGVtcycgZmlsdGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBFeGNsdWRlU3ViSXRlbXNGaWVsZCBleHRlbmRzIEZpbHRlckluc3RydWN0aW9uc0Jhc2VkRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuX2ZpbHRlcnMuYWRkKCdleGNsdWRlIHN1Yi1pdGVtcycsICh0YXNrKSA9PiB7XG4gICAgICAgICAgICBpZiAodGFzay5pbmRlbnRhdGlvbiA9PT0gJycpIHJldHVybiB0cnVlOyAvLyBubyBpbmRlbnRhdGlvbiwgbm90IGEgc3ViaXRlbVxuXG4gICAgICAgICAgICBjb25zdCBsYXN0QmxvY2txdW90ZU1hcmsgPSB0YXNrLmluZGVudGF0aW9uLmxhc3RJbmRleE9mKCc+Jyk7XG4gICAgICAgICAgICBpZiAobGFzdEJsb2NrcXVvdGVNYXJrID09PSAtMSkgcmV0dXJuIGZhbHNlOyAvLyBpbmRlbnRhdGlvbiBwcmVzZW50LCBub3QgaW4gYSBibG9ja3F1b3RlLCBzdWJpdGVtXG5cbiAgICAgICAgICAgIC8vIFVwIHRvIG9uZSBzcGFjZSBhbGxvd2VkIGFmdGVyIGxhc3QgPiBpbiBibG9ja3F1b3RlL2NhbGxvdXQsIG90aGVyd2lzZSBzdWJpdGVtXG4gICAgICAgICAgICByZXR1cm4gL14gPyQvLnRlc3QodGFzay5pbmRlbnRhdGlvbi5zbGljZShsYXN0QmxvY2txdW90ZU1hcmsgKyAxKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdleGNsdWRlJztcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgeyBUZXh0RmllbGQgfSBmcm9tICcuL1RleHRGaWVsZCc7XG5cbi8qKiBTdXBwb3J0IHRoZSAnaGVhZGluZycgc2VhcmNoIGluc3RydWN0aW9uLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEhlYWRpbmdGaWVsZCBleHRlbmRzIFRleHRGaWVsZCB7XG4gICAgcHVibGljIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2hlYWRpbmcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHByZWNlZGluZyBoZWFkaW5nLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGhlYWRpbmcgaXMgbnVsbFxuICAgICAqIEBwYXJhbSB0YXNrXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHB1YmxpYyB2YWx1ZSh0YXNrOiBUYXNrKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRhc2sucHJlY2VkaW5nSGVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFzay5wcmVjZWRpbmdIZWFkZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IERhdGVGaWVsZCB9IGZyb20gJy4vRGF0ZUZpZWxkJztcblxuLyoqXG4gKiBTdXBwb3J0IHRoZSAnc2NoZWR1bGVkJyBzZWFyY2ggaW5zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlZHVsZWREYXRlRmllbGQgZXh0ZW5kcyBEYXRlRmllbGQge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNjaGVkdWxlZFJlZ2V4cCA9IC9ec2NoZWR1bGVkIChiZWZvcmV8YWZ0ZXJ8b24pPyA/KC4qKS87XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB7XG4gICAgICAgIHJldHVybiBTY2hlZHVsZWREYXRlRmllbGQuc2NoZWR1bGVkUmVnZXhwO1xuICAgIH1cbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnc2NoZWR1bGVkJztcbiAgICB9XG4gICAgcHVibGljIGRhdGUodGFzazogVGFzayk6IE1vbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGFzay5zY2hlZHVsZWREYXRlO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgeyBEYXRlRmllbGQgfSBmcm9tICcuL0RhdGVGaWVsZCc7XG5cbi8qKlxuICogU3VwcG9ydCB0aGUgJ3N0YXJ0cycgc2VhcmNoIGluc3RydWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU3RhcnREYXRlRmllbGQgZXh0ZW5kcyBEYXRlRmllbGQge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0YXJ0UmVnZXhwID0gL15zdGFydHMgKGJlZm9yZXxhZnRlcnxvbik/ID8oLiopLztcblxuICAgIHByb3RlY3RlZCBmaWx0ZXJSZWdFeHAoKTogUmVnRXhwIHtcbiAgICAgICAgcmV0dXJuIFN0YXJ0RGF0ZUZpZWxkLnN0YXJ0UmVnZXhwO1xuICAgIH1cbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnc3RhcnQnO1xuICAgIH1cbiAgICBwdWJsaWMgZGF0ZSh0YXNrOiBUYXNrKTogTW9tZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0YXNrLnN0YXJ0RGF0ZTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGZpbHRlclJlc3VsdElmRmllbGRNaXNzaW5nKCkge1xuICAgICAgICAvLyByZWZlcmVuY2U6IGh0dHBzOi8vb2JzaWRpYW4tdGFza3MtZ3JvdXAuZ2l0aHViLmlvL29ic2lkaWFuLXRhc2tzL3F1ZXJpZXMvZmlsdGVycy8jc3RhcnQtZGF0ZVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgeyBEYXRlUGFyc2VyIH0gZnJvbSAnLi4vRGF0ZVBhcnNlcic7XG5pbXBvcnQgeyBFeHBsYW5hdGlvbiB9IGZyb20gJy4uL0V4cGxhaW4vRXhwbGFuYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBDb21wYXJhdG9yIH0gZnJvbSAnLi4vU29ydGVyJztcbmltcG9ydCB7IGNvbXBhcmVCeURhdGUgfSBmcm9tICcuLi8uLi9saWIvRGF0ZVRvb2xzJztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9GaWVsZCc7XG5pbXBvcnQgeyBGaWx0ZXIsIEZpbHRlck9yRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9GaWx0ZXInO1xuaW1wb3J0IHsgRmlsdGVySW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9GaWx0ZXJJbnN0cnVjdGlvbnMnO1xuaW1wb3J0IHsgRGF0ZUZpZWxkIH0gZnJvbSAnLi9EYXRlRmllbGQnO1xuXG4vKipcbiAqIFN1cHBvcnQgdGhlICdoYXBwZW5zJyBzZWFyY2ggaW5zdHJ1Y3Rpb24sIHdoaWNoIHNlYXJjaGVzIGFsbCBvZlxuICogc3RhcnQsIHNjaGVkdWxlZCBhbmQgZHVlIGRhdGVzLlxuICovXG5leHBvcnQgY2xhc3MgSGFwcGVuc0RhdGVGaWVsZCBleHRlbmRzIEZpZWxkIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBoYXBwZW5zUmVnZXhwID0gL15oYXBwZW5zIChiZWZvcmV8YWZ0ZXJ8b24pPyA/KC4qKS87XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW5zdHJ1Y3Rpb25Gb3JGaWVsZFByZXNlbmNlID0gJ2hhcyBoYXBwZW5zIGRhdGUnO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGluc3RydWN0aW9uRm9yRmllbGRBYnNlbmNlID0gJ25vIGhhcHBlbnMgZGF0ZSc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWx0ZXJJbnN0cnVjdGlvbnM6IEZpbHRlckluc3RydWN0aW9ucztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZpbHRlckluc3RydWN0aW9ucyA9IG5ldyBGaWx0ZXJJbnN0cnVjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJJbnN0cnVjdGlvbnMuYWRkKEhhcHBlbnNEYXRlRmllbGQuaW5zdHJ1Y3Rpb25Gb3JGaWVsZFByZXNlbmNlLCAodGFzazogVGFzaykgPT5cbiAgICAgICAgICAgIHRoaXMuZGF0ZXModGFzaykuc29tZSgoZGF0ZSkgPT4gZGF0ZSAhPT0gbnVsbCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlsdGVySW5zdHJ1Y3Rpb25zLmFkZChcbiAgICAgICAgICAgIEhhcHBlbnNEYXRlRmllbGQuaW5zdHJ1Y3Rpb25Gb3JGaWVsZEFic2VuY2UsXG4gICAgICAgICAgICAodGFzazogVGFzaykgPT4gIXRoaXMuZGF0ZXModGFzaykuc29tZSgoZGF0ZSkgPT4gZGF0ZSAhPT0gbnVsbCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkNyZWF0ZUZpbHRlckZvckxpbmUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlckluc3RydWN0aW9ucy5jYW5DcmVhdGVGaWx0ZXJGb3JMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuY2FuQ3JlYXRlRmlsdGVyRm9yTGluZShsaW5lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRmlsdGVyT3JFcnJvck1lc3NhZ2UobGluZTogc3RyaW5nKTogRmlsdGVyT3JFcnJvck1lc3NhZ2Uge1xuICAgICAgICBjb25zdCBmaWx0ZXJSZXN1bHQgPSB0aGlzLmZpbHRlckluc3RydWN0aW9ucy5jcmVhdGVGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcbiAgICAgICAgaWYgKGZpbHRlclJlc3VsdC5maWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlclJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcblxuICAgICAgICBjb25zdCBoYXBwZW5zTWF0Y2ggPSBGaWVsZC5nZXRNYXRjaCh0aGlzLmZpbHRlclJlZ0V4cCgpLCBsaW5lKTtcbiAgICAgICAgaWYgKGhhcHBlbnNNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRGF0ZSA9IERhdGVQYXJzZXIucGFyc2VEYXRlKGhhcHBlbnNNYXRjaFsyXSk7XG4gICAgICAgICAgICBpZiAoIWZpbHRlckRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIGhhcHBlbnMgZGF0ZSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJGdW5jdGlvbjtcbiAgICAgICAgICAgICAgICBsZXQgcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgaWYgKGhhcHBlbnNNYXRjaFsxXSA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRnVuY3Rpb24gPSAodGFzazogVGFzaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZXModGFzaykuc29tZSgoZGF0ZSkgPT4gZGF0ZSAmJiBkYXRlLmlzQmVmb3JlKGZpbHRlckRhdGUpKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSAnICcgKyBoYXBwZW5zTWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYXBwZW5zTWF0Y2hbMV0gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRnVuY3Rpb24gPSAodGFzazogVGFzaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZXModGFzaykuc29tZSgoZGF0ZSkgPT4gZGF0ZSAmJiBkYXRlLmlzQWZ0ZXIoZmlsdGVyRGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSA9ICcgJyArIGhhcHBlbnNNYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGdW5jdGlvbiA9ICh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlcyh0YXNrKS5zb21lKChkYXRlKSA9PiBkYXRlICYmIGRhdGUuaXNTYW1lKGZpbHRlckRhdGUpKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSAnIG9uJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBEYXRlRmllbGQuZ2V0RXhwbGFuYXRpb25TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICdkdWUsIHN0YXJ0IG9yIHNjaGVkdWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRGF0ZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5maWx0ZXIgPSBuZXcgRmlsdGVyKGxpbmUsIGZpbHRlckZ1bmN0aW9uLCBuZXcgRXhwbGFuYXRpb24oZXhwbGFuYXRpb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvciA9ICdkbyBub3QgdW5kZXJzdGFuZCBxdWVyeSBmaWx0ZXIgKGhhcHBlbnMgZGF0ZSknO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBlYXJsaWVzdCBvZiB0aGUgZGF0ZXMgdXNlZCBieSAnaGFwcGVucycgaW4gdGhlIGdpdmVuIHRhc2ssIG9yIG51bGwgaWYgbm9uZSBzZXQuXG4gICAgICpcbiAgICAgKiBHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZSBlYXJsaWVzdCBkYXRlIGlzIGNvbnNpZGVyZWQgdG8gYmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHksXG4gICAgICogYXMgaXQgaXMgdGhlIGZpcnN0IHBvaW50IGF0IHdoaWNoIHRoZSB1c2VyIG1pZ2h0IHdpc2ggdG8gYWN0IG9uIHRoZSB0YXNrLlxuICAgICAqIEBwYXJhbSB0YXNrXG4gICAgICovXG4gICAgcHVibGljIGVhcmxpZXN0RGF0ZSh0YXNrOiBUYXNrKTogTW9tZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGhhcHBlbnNEYXRlcyA9IG5ldyBIYXBwZW5zRGF0ZUZpZWxkKCkuZGF0ZXModGFzayk7XG4gICAgICAgIGNvbnN0IHNvcnRlZEhhcHBlbnNEYXRlcyA9IGhhcHBlbnNEYXRlcy5zb3J0KGNvbXBhcmVCeURhdGUpO1xuICAgICAgICByZXR1cm4gc29ydGVkSGFwcGVuc0RhdGVzWzBdO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBmaWx0ZXJSZWdFeHAoKTogUmVnRXhwIHtcbiAgICAgICAgcmV0dXJuIEhhcHBlbnNEYXRlRmllbGQuaGFwcGVuc1JlZ2V4cDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHRhc2sncyBzdGFydCwgc2NoZWR1bGVkIGFuZCBkdWUgZGF0ZXMsIGFueSBvciBhbGwgb2Ygd2hpY2ggbWF5IGJlIG51bGwuXG4gICAgICovXG4gICAgcHVibGljIGRhdGVzKHRhc2s6IFRhc2spOiAoTW9tZW50IHwgbnVsbClbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5vZih0YXNrLnN0YXJ0RGF0ZSwgdGFzay5zY2hlZHVsZWREYXRlLCB0YXNrLmR1ZURhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdoYXBwZW5zJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3VwcG9ydHNTb3J0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHNvcnRzIG9uIHRoZSBlYXJsaWVzdCBvZiBzdGFydCwgc2NoZWR1bGVkIGFuZCBkdWUgZGF0ZXMuXG4gICAgICovXG4gICAgcHVibGljIGNvbXBhcmF0b3IoKTogQ29tcGFyYXRvciB7XG4gICAgICAgIHJldHVybiAoYTogVGFzaywgYjogVGFzaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVCeURhdGUodGhpcy5lYXJsaWVzdERhdGUoYSksIHRoaXMuZWFybGllc3REYXRlKGIpKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmlsdGVySW5zdHJ1Y3Rpb25zQmFzZWRGaWVsZCB9IGZyb20gJy4vRmlsdGVySW5zdHJ1Y3Rpb25zQmFzZWRGaWVsZCc7XG5cbmV4cG9ydCBjbGFzcyBSZWN1cnJpbmdGaWVsZCBleHRlbmRzIEZpbHRlckluc3RydWN0aW9uc0Jhc2VkRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9maWx0ZXJzLmFkZCgnaXMgcmVjdXJyaW5nJywgKHRhc2spID0+IHRhc2sucmVjdXJyZW5jZSAhPT0gbnVsbCk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMuYWRkKCdpcyBub3QgcmVjdXJyaW5nJywgKHRhc2spID0+IHRhc2sucmVjdXJyZW5jZSA9PT0gbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3JlY3VycmluZyc7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uLy4uL1Rhc2snO1xuaW1wb3J0IHR5cGUgeyBJU3RyaW5nTWF0Y2hlciB9IGZyb20gJy4uL01hdGNoZXJzL0lTdHJpbmdNYXRjaGVyJztcbmltcG9ydCB7IFRleHRGaWVsZCB9IGZyb20gJy4vVGV4dEZpZWxkJztcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb24gfSBmcm9tICcuL0ZpbHRlcic7XG5cbi8qKlxuICogTXVsdGlUZXh0RmllbGQgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB0byBoZWxwIGltcGxlbWVudFxuICogYWxsIHRoZSBmaWx0ZXIgaW5zdHJ1Y3Rpb25zIHRoYXQgYWN0IG9uIG11bHRpcGxlIHN0cmluZyB2YWx1ZXNcbiAqIHN1Y2ggYXMgdGhlIHRhZ3MuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNdWx0aVRleHRGaWVsZCBleHRlbmRzIFRleHRGaWVsZCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2luZ3VsYXIgZm9ybSBvZiB0aGUgZmllbGQncyBuYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBmaWVsZE5hbWVTaW5ndWxhcigpOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwbHVyYWwgZm9ybSBvZiB0aGUgZmllbGQncyBuYW1lLlxuICAgICAqIElmIG5vdCBvdmVycmlkZGVuLCByZXR1cm5zIHRoZSBzaW5ndWxhciBmb3JtIGFwcGVuZGVkIHdpdGggYW4gXCJzXCIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGZpZWxkTmFtZVBsdXJhbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZE5hbWVTaW5ndWxhcigpICsgJ3MnO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZmllbGROYW1lU2luZ3VsYXIoKX0vJHt0aGlzLmZpZWxkTmFtZVBsdXJhbCgpfWA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGZpZWxkUGF0dGVybigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5maWVsZE5hbWVTaW5ndWxhcigpfXwke3RoaXMuZmllbGROYW1lUGx1cmFsKCl9YDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyT3BlcmF0b3JQYXR0ZXJuKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtzdXBlci5maWx0ZXJPcGVyYXRvclBhdHRlcm4oKX18aW5jbHVkZXxkbyBub3QgaW5jbHVkZWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgbm90IG92ZXJyaWRkZW4sIHJldHVybnMgYSBjb21tYS1zZXBhcmF0ZWQgY29uY2F0ZW5hdGlvbiBvZiBhbGxcbiAgICAgKiB0aGUgdmFsdWVzIG9mIHRoaXMgZmllbGQgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGFyZSBub3QgdmFsdWVzXG4gICAgICogQHBhcmFtIHRhc2tcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgcHVibGljIHZhbHVlKHRhc2s6IFRhc2spOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXModGFzaykuam9pbignLCAnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiB2YWx1ZXMgb2YgdGhpcyBmaWVsZCwgb3IgYW4gZW1wdHkgYXJyYXlcbiAgICAgKiBpZiB0aGUgZmllbGQgaGFzIG5vIHZhbHVlc1xuICAgICAqIEBwYXJhbSB0YXNrXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCB2YWx1ZXModGFzazogVGFzayk6IHN0cmluZ1tdO1xuXG4gICAgcHJvdGVjdGVkIGdldEZpbHRlcihtYXRjaGVyOiBJU3RyaW5nTWF0Y2hlciwgbmVnYXRlOiBib29sZWFuKTogRmlsdGVyRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gKHRhc2s6IFRhc2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlciEubWF0Y2hlc0FueU9mKHRoaXMudmFsdWVzKHRhc2spKTtcbiAgICAgICAgICAgIHJldHVybiBuZWdhdGUgPyAhbWF0Y2ggOiBtYXRjaDtcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IENvbXBhcmF0b3IgfSBmcm9tICcuLi9Tb3J0ZXInO1xuaW1wb3J0IHsgU29ydGVyIH0gZnJvbSAnLi4vU29ydGVyJztcbmltcG9ydCB7IE11bHRpVGV4dEZpZWxkIH0gZnJvbSAnLi9NdWx0aVRleHRGaWVsZCc7XG5cbi8qKlxuICogU3VwcG9ydCB0aGUgJ3RhZycgYW5kICd0YWdzJyBzZWFyY2ggaW5zdHJ1Y3Rpb25zLlxuICpcbiAqIFRhZ3MgY2FuIGJlIHNlYXJjaGVkIGZvciB3aXRoIGFuZCB3aXRob3V0IHRoZSBoYXNoIHRhZyBhdCB0aGUgc3RhcnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWdzRmllbGQgZXh0ZW5kcyBNdWx0aVRleHRGaWVsZCB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBGaWx0ZXJpbmdcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgcHVibGljIGZpZWxkTmFtZVNpbmd1bGFyKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAndGFnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0YXNrLnRhZ3M7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTb3J0aW5nXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIHB1YmxpYyBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBPdmVycmlkZGVuIHRvIGFkZCBzdXBwb3J0IGZvciB0YWcgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxpbmVcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU29ydGVyRnJvbUxpbmUobGluZTogc3RyaW5nKTogU29ydGVyIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLnNvcnRlclJlZ0V4cCgpKTtcbiAgICAgICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldmVyc2UgPSAhIW1hdGNoWzFdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUluc3RhbmNlID0gaXNOYU4oK21hdGNoWzJdKSA/IDEgOiArbWF0Y2hbMl07XG4gICAgICAgIGNvbnN0IGNvbXBhcmF0b3IgPSBUYWdzRmllbGQubWFrZUNvbXBhcmVCeVRhZ0NvbXBhcmF0b3IocHJvcGVydHlJbnN0YW5jZSk7XG4gICAgICAgIHJldHVybiBuZXcgU29ydGVyKHRoaXMuZmllbGROYW1lU2luZ3VsYXIoKSwgY29tcGFyYXRvciwgcmV2ZXJzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgd2lsbCBtYXRjaCBhIGNvcnJlY3RseS1mb3JtZWRcbiAgICAgKiBpbnN0cnVjdGlvbiBsaW5lIGZvciBzb3J0aW5nIFRhc2tzIGJ5IHRhZy5cbiAgICAgKlxuICAgICAqIGBtYXRjaFsxXWAgd2lsbCBiZSBlaXRoZXIgYHJldmVyc2VgIG9yIHVuZGVmaW5lZC5cbiAgICAgKiBgbWF0Y2hbMl1gIHdpbGwgYmUgZWl0aGVyIHRoZSB0YWcgbnVtYmVyIG9yIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc29ydGVyUmVnRXhwKCk6IFJlZ0V4cCB7XG4gICAgICAgIHJldHVybiAvXnNvcnQgYnkgdGFnKCByZXZlcnNlKT9bXFxzXSooXFxkKyk/LztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSAke0BsaW5rIENvbXBhcmF0b3J9IHRoYXQgc29ydHMgYnkgdGhlIGZpcnN0IHRhZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29tcGFyYXRvcigpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgcmV0dXJuIFRhZ3NGaWVsZC5tYWtlQ29tcGFyZUJ5VGFnQ29tcGFyYXRvcigxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYWtlQ29tcGFyZUJ5VGFnQ29tcGFyYXRvcihwcm9wZXJ0eUluc3RhbmNlOiBudW1iZXIpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgcmV0dXJuIChhOiBUYXNrLCBiOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAvLyBJZiBubyB0YWdzIHRoZW4gYXNzdW1lIHRoZXkgYXJlIGVxdWFsLlxuICAgICAgICAgICAgaWYgKGEudGFncy5sZW5ndGggPT09IDAgJiYgYi50YWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhLnRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gYSBpcyBsZXNzIHRoYW4gYlxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChiLnRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gYiBpcyBsZXNzIHRoYW4gYVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQXJyYXlzIHN0YXJ0IGF0IDAgYnV0IHRoZSB1c2VycyBzcGVjaWZ5IGEgdGFnIHN0YXJ0aW5nIGF0IDEuXG4gICAgICAgICAgICBjb25zdCB0YWdJbnN0YW5jZVRvU29ydEJ5ID0gcHJvcGVydHlJbnN0YW5jZSAtIDE7XG5cbiAgICAgICAgICAgIGlmIChhLnRhZ3MubGVuZ3RoIDwgcHJvcGVydHlJbnN0YW5jZSAmJiBiLnRhZ3MubGVuZ3RoID49IHByb3BlcnR5SW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYi50YWdzLmxlbmd0aCA8IHByb3BlcnR5SW5zdGFuY2UgJiYgYS50YWdzLmxlbmd0aCA+PSBwcm9wZXJ0eUluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhLnRhZ3MubGVuZ3RoIDwgcHJvcGVydHlJbnN0YW5jZSAmJiBiLnRhZ3MubGVuZ3RoIDwgcHJvcGVydHlJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWdBID0gYS50YWdzW3RhZ0luc3RhbmNlVG9Tb3J0QnldO1xuICAgICAgICAgICAgY29uc3QgdGFnQiA9IGIudGFnc1t0YWdJbnN0YW5jZVRvU29ydEJ5XTtcbiAgICAgICAgICAgIHJldHVybiB0YWdBLmxvY2FsZUNvbXBhcmUodGFnQiwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUgfSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB7IHBhcnNlIGFzIGJvb25QYXJzZSB9IGZyb20gJ2Jvb24tanMnO1xuaW1wb3J0IHR5cGUgeyBQb3N0Zml4RXhwcmVzc2lvbiB9IGZyb20gJ2Jvb24tanMnO1xuXG5pbXBvcnQgeyBwYXJzZUZpbHRlciB9IGZyb20gJy4uL0ZpbHRlclBhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IEV4cGxhbmF0aW9uIH0gZnJvbSAnLi4vRXhwbGFpbi9FeHBsYW5hdGlvbic7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vRmllbGQnO1xuaW1wb3J0IHsgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlcic7XG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuL0ZpbHRlcic7XG5cbi8qKlxuICogQm9vbGVhbkZpZWxkIGlzIGEgJ2NvbnRhaW5lcicgZmllbGQgdHlwZSB0aGF0IHBhcnNlcyBhIGhpZ2gtbGV2ZWwgZmlsdGVyaW5nIHF1ZXJ5IG9mXG4gKiB0aGUgZm9ybWF0IC0tXG4gKiAgICAoZmlsdGVyMSkgQU5EICgoZmlsdGVyMikgT1IgKGZpbHRlcjMpKVxuICogVGhlIGZpbHRlcnMgY2FuIGJlIG1peGVkIGFuZCBtYXRjaGVkIHdpdGggYW55IGJvb2xlYW4gb3BlcmF0b3JzIGFzIGxvbmcgYXMgdGhlIGluZGl2aWR1YWwgZmlsdGVycyBhcmVcbiAqIHdyYXBwZWQgaW4gZWl0aGVyIHBhcmFudGhlc2lzIG9yIHF1b3RlcyAtLSAoZmlsdGVyMSkgb3IgXCJmaWx0ZXIxXCIuXG4gKiBXaGF0IGhhcHBlbnMgaW50ZXJuYWxseSBpcyB0aGF0IHdoZW4gdGhlIGJvb2xlYW4gZmllbGQgaXMgYXNrZWQgdG8gY3JlYXRlIGEgZmlsdGVyLCBpdCBwYXJzZXMgdGhlIGJvb2xlYW5cbiAqIHF1ZXJ5IGludG8gYSBsb2dpY2FsIHBvc3RmaXggZXhwcmVzc2lvbiAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmV2ZXJzZV9Qb2xpc2hfbm90YXRpb24pLFxuICogd2l0aCB0aGUgaW5kaXZpZHVhbCBmaWx0ZXIgY29tcG9uZW50cyBhcyBcImlkZW50aWZpZXJcIiB0b2tlbnMuXG4gKiBUaGVzZSBpZGVudGlmaWVycyBoYXZlIGFuIGFzc29jaWF0ZWQgYWN0dWFsIEZpbHRlciAod2hpY2ggaXMgY2FjaGVkIGR1cmluZyB0aGUgcXVlcnkgcGFyc2luZykuXG4gKiBUaGUgcmV0dXJuZWQgRmlsdGVyIG9mIHRoZSB3aG9sZSBib29sZWFuIHF1ZXJ5IGlzIGV2ZW50dWFsbHkgYSBmdW5jdGlvbiB0aGF0IGZvciBlYWNoIFRhc2sgb2JqZWN0LFxuICogZXZhbHVhdGVzIHRoZSBjb21wbGV0ZSBwb3N0Zml4IGV4cHJlc3Npb24gYnkgZ29pbmcgdGhyb3VnaCB0aGUgaW5kaXZpZHVhbCBmaWx0ZXJzIGFuZCB0aGVuIHJlc29sdmluZ1xuICogdGhlIGV4cHJlc3Npb24gaW50byBhIHNpbmdsZSBib29sZWFuIGVudGl0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJvb2xlYW5GaWVsZCBleHRlbmRzIEZpZWxkIHtcbiAgICAvLyBGaXJzdCBwYXR0ZXJuIGluIHRoaXMgbWF0Y2hlcyBjb252ZW50aW9uYWwgKGZpbHRlcjEpIE9SIChmaWx0ZXIyKSBhbmQgc2ltaWxhclxuICAgIC8vIFNlY29uZCBwYXR0ZXJuIG1hdGNoZXMgKGZpbHRlcjEpIC0gdGhhdCBpcywgZW5zdXJlcyB0aGF0IGEgc2luZ2xlIGZpbHRlciBpcyB0cmVhdGVkIGFzIHZhbGlkXG4gICAgcHJpdmF0ZSByZWFkb25seSBiYXNpY0Jvb2xlYW5SZWdleHAgPSAvKC4qKEFORHxPUnxYT1J8Tk9UKVxccypbKFwiXS4qfFxcKC4rXFwpKS9nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3VwcG9ydGVkT3BlcmF0b3JzID0gWydBTkQnLCAnT1InLCAnWE9SJywgJ05PVCddO1xuICAgIHByaXZhdGUgc3ViRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXI+ID0ge307XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2ljQm9vbGVhblJlZ2V4cDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRmlsdGVyT3JFcnJvck1lc3NhZ2UobGluZTogc3RyaW5nKTogRmlsdGVyT3JFcnJvck1lc3NhZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpbmUobGluZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4gcXVlcnknO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgYnVpbGRzIGEgRmlsdGVyIGZvciBhIGNvbXBsZXRlIGJvb2xlYW4gcXVlcnkgYnk6XG4gICAgICogMS4gUHJlcHJvY2Vzc2luZyB0aGUgZXhwcmVzc2lvbiBpbnRvIHNvbWV0aGluZyBvdXIgaGVscGVyIHBhY2thZ2UsIGJvb24tanMsIGtub3dzIGhvdyB0byBidWlsZCBhbiBleHByZXNzaW9uIGZvci5cbiAgICAgKiAyLiBDcmVhdGluZyBhIHBvc3RmaXggbG9naWNhbCBleHByZXNzaW9uIHVzaW5nIGJvb24tanMsIHdoaWNoIGhhcyAtXG4gICAgICogICAgYS4gSWRlbnRpZmllcnMgKGxlYXZlcyksIHdoaWNoIGFyZSByZWd1bGFyIEZpZWxkIGZpbHRlcnMgcmVwcmVzZW50ZWQgYXMgdGhlaXIgc3RyaW5nLlxuICAgICAqICAgIGIuIE9wZXJhdG9ycywgd2hpY2ggYXJlIGxvZ2ljYWwgb3BlcmF0b3JzIGJldHdlZW4gaWRlbnRpZmllcnMgb3IgYmV0d2VlbiBwYXJlbnRoZXNpcy5cbiAgICAgKiAzLiBDcmVhdGluZyB0aGUgZmlsdGVyIGZ1bmN0aW9ucyBmb3IgYWxsIHRoZSBJZGVudGlmaWVycyBpbiB0aGUgZXhwcmVzc2lvbiBhbmQgY2FjaGluZyB0aGVtIGluIHRoaXMuc3ViRmllbGRzLlxuICAgICAqIDQuIFJldHVybmluZyBhIGZpbmFsIGZ1bmN0aW9uIGZpbHRlciwgd2hpY2ggZm9yIGVhY2ggVGFzayBjYW4gcnVuIHRoZSBjb21wbGV0ZSBxdWVyeS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlTGluZShsaW5lOiBzdHJpbmcpOiBGaWx0ZXJPckVycm9yTWVzc2FnZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSAnZW1wdHkgbGluZSc7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXByb2Nlc3NlZCA9IHRoaXMucHJlcHJvY2Vzc0V4cHJlc3Npb24obGluZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSAocHJlcHJvY2Vzc2VkKSBsaW5lIGludG8gYSBwb3N0Zml4IGxvZ2ljYWwgZXhwcmVzc2lvblxuICAgICAgICAgICAgY29uc3QgcG9zdGZpeEV4cHJlc3Npb24gPSBib29uUGFyc2UocHJlcHJvY2Vzc2VkKTtcbiAgICAgICAgICAgIC8vIENvbnN0cnVjdCBzdWItZmllbGQgbWFwLCBpLmUuIGhhdmUgc3ViRmllbGRzIGluY2x1ZGUgYSBmaWx0ZXIgZnVuY3Rpb24gZm9yIGV2ZXJ5XG4gICAgICAgICAgICAvLyBmaW5hbCB0b2tlbiBpbiB0aGUgZXhwcmVzc2lvblxuICAgICAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBwb3N0Zml4RXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi5uYW1lID09PSAnSURFTlRJRklFUicgJiYgdG9rZW4udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRva2VuLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWRlbnRpZmllciBpbiB0aGlzLnN1YkZpZWxkcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEZpZWxkID0gcGFyc2VGaWx0ZXIoaWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkRmllbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXJyb3IgPSBgY291bGRuJ3QgcGFyc2Ugc3ViLWV4cHJlc3Npb24gJyR7aWRlbnRpZmllcn0nYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZEZpZWxkLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gYGNvdWxkbid0IHBhcnNlIHN1Yi1leHByZXNzaW9uICcke2lkZW50aWZpZXJ9JzogJHtwYXJzZWRGaWVsZC5lcnJvcn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlZEZpZWxkLmZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3ViRmllbGRzW2lkZW50aWZpZXJdID0gcGFyc2VkRmllbGQuZmlsdGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbi5uYW1lID09PSAnT1BFUkFUT1InKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoaWxlIHdlJ3JlIGFscmVhZHkgaXRlcmF0aW5nIG92ZXIgdGhlIGV4cHJlc3Npb24sIGFsdGhvdWdoIHdlIGRvbid0IG5lZWQgdGhlIG9wZXJhdG9ycyBhdFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHN0YWdlIGJ1dCBvbmx5IGluIGZpbHRlclRhc2tXaXRoUGFyc2VkUXVlcnkgYmVsb3csIHdlJ3JlIHVzaW5nIHRoZSBvcHBvcnR1bml0eSB0byB2ZXJpZnlcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhleSBhcmUgdmFsaWQuIElmIHdlIHdvbid0LCB0aGVuIGFuIGludmFsaWQgb3BlcmF0b3Igd2lsbCBvbmx5IGJlIGRldGVjdGVkIHdoZW4gdGhlIHF1ZXJ5IGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIHJ1biBvbiBhIHRhc2tcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gJ2VtcHR5IG9wZXJhdG9yIGluIGJvb2xlYW4gcXVlcnknO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydGVkT3BlcmF0b3JzLmluY2x1ZGVzKHRva2VuLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gYHVua25vd24gYm9vbGVhbiBvcGVyYXRvciAnJHt0b2tlbi52YWx1ZX0nYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGZpbHRlciB3aXRoIGZpbHRlciBmdW5jdGlvbiB0aGF0IGNhbiBydW4gdGhlIGNvbXBsZXRlIHF1ZXJ5XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJGdW5jdGlvbiA9ICh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyVGFza1dpdGhQYXJzZWRRdWVyeSh0YXNrLCBwb3N0Zml4RXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0aGlzLmNvbnN0cnVjdEV4cGxhbmF0aW9uKHBvc3RmaXhFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIHJlc3VsdC5maWx0ZXIgPSBuZXcgRmlsdGVyKGxpbmUsIGZpbHRlckZ1bmN0aW9uLCBleHBsYW5hdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3IgdHlwZSc7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSBgbWFsZm9ybWVkIGJvb2xlYW4gcXVlcnkgLS0gJHttZXNzYWdlfSAoY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIGd1aWRlbGluZXMpYDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXByb2Nlc3NFeHByZXNzaW9uKGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8vIFByZXBhcmUgdGhlIHF1ZXJ5IHRvIGJlIHByb2Nlc3NlZCBieSBib29uLWpzLlxuICAgICAgICAvLyBCb29uIGRvZXNuJ3QgcHJvY2VzcyBleHByZXNzaW9uIHdpdGggc3BhY2VzIHVubGVzcyB0aGV5IGFyZSBzdXJyb3VuZGVkIGJ5IHF1b3Rlcywgc28gcmVwbGFjZVxuICAgICAgICAvLyAoZHVlIHRvZGF5KSBieSAoXCJkdWUgdG9kYXlcIikuXG4gICAgICAgIHJldHVybiBsaW5lLnJlcGxhY2UoL1xcKChbXigpXSspXFwpL2csICcoXCIkMVwiKScpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVGhpcyBydW4gYSBUYXNrIG9iamVjdCB0aHJvdWdoIGEgY29tcGxldGUgYm9vbGVhbiBleHByZXNzaW9uLlxuICAgICAqIEl0IGJhc2ljYWxseSByZXNvbHZlcyB0aGUgcG9zdGZpeCBleHByZXNzaW9uIHVudGlsIGl0IGlzIHJlZHVjZWQgaW50byBhIHNpbmdsZSBib29sZWFuIHZhbHVlLFxuICAgICAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBsZXRlIGV4cHJlc3Npb24uXG4gICAgICogU2VlIGhlcmUgaG93IGl0IHdvcmtzOiBodHRwOi8vd3d3LmJ0ZWNoc21hcnRjbGFzcy5jb20vZGF0YV9zdHJ1Y3R1cmVzL3Bvc3RmaXgtZXZhbHVhdGlvbi5odG1sXG4gICAgICogQW5vdGhlciByZWZlcmVuY2U6IGh0dHBzOi8vd3d3LnR1dG9yaWFsc3BvaW50LmNvbS9FdmFsdWF0ZS1Qb3N0Zml4LUV4cHJlc3Npb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbHRlclRhc2tXaXRoUGFyc2VkUXVlcnkodGFzazogVGFzaywgcG9zdGZpeEV4cHJlc3Npb246IFBvc3RmaXhFeHByZXNzaW9uKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRvQm9vbCA9IChzOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzID09PSAndHJ1ZSc7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRvU3RyaW5nID0gKGI6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBiID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYm9vbGVhblN0YWNrOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHBvc3RmaXhFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4ubmFtZSA9PT0gJ0lERU5USUZJRVInKSB7XG4gICAgICAgICAgICAgICAgLy8gSWRlbnRpZmllcnMgYXJlIHRoZSBzdWItZmllbGRzIG9mIHRoZSBleHByZXNzaW9uLCB0aGUgYWN0dWFsIGZpbHRlcnMsIGUuZy4gJ2Rlc2NyaXB0aW9uIGluY2x1ZGVzIGZvbycuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggaWRlbnRpZmllciB3ZSBjcmVhdGVkIGVhcmxpZXIgdGhlIGNvcnJlc3BvbmRpbmcgRmlsdGVyLCBzbyBub3cgd2UgY2FuIGp1c3QgZXZhbHVhdGUgdGhlIGdpdmVuXG4gICAgICAgICAgICAgICAgLy8gdGFzayBmb3IgZWFjaCBpZGVudGlmaWVyIHRoYXQgd2UgZmluZCBpbiB0aGUgcG9zdGZpeCBleHByZXNzaW9uLlxuICAgICAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PSBudWxsKSB0aHJvdyBFcnJvcignbnVsbCB0b2tlbiB2YWx1ZScpOyAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5zdWJGaWVsZHNbdG9rZW4udmFsdWUudHJpbSgpXTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmaWx0ZXIuZmlsdGVyRnVuY3Rpb24odGFzayk7XG4gICAgICAgICAgICAgICAgYm9vbGVhblN0YWNrLnB1c2godG9TdHJpbmcocmVzdWx0KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuLm5hbWUgPT09ICdPUEVSQVRPUicpIHtcbiAgICAgICAgICAgICAgICAvLyBUbyBldmFsdWF0ZSBhbiBvcGVyYXRvciB3ZSBuZWVkIHRvIHBvcCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGl0ZW1zIGZyb20gdGhlIGJvb2xlYW4gc3RhY2ssXG4gICAgICAgICAgICAgICAgLy8gZG8gdGhlIGxvZ2ljYWwgZXZhbHVhdGlvbiBhbmQgcHVzaCBiYWNrIHRoZSByZXN1bHRcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4udmFsdWUgPT09ICdOT1QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZzEgPSB0b0Jvb2woYm9vbGVhblN0YWNrLnBvcCgpKTtcbiAgICAgICAgICAgICAgICAgICAgYm9vbGVhblN0YWNrLnB1c2godG9TdHJpbmcoIWFyZzEpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnT1InKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZzEgPSB0b0Jvb2woYm9vbGVhblN0YWNrLnBvcCgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJnMiA9IHRvQm9vbChib29sZWFuU3RhY2sucG9wKCkpO1xuICAgICAgICAgICAgICAgICAgICBib29sZWFuU3RhY2sucHVzaCh0b1N0cmluZyhhcmcxIHx8IGFyZzIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnQU5EJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmcxID0gdG9Cb29sKGJvb2xlYW5TdGFjay5wb3AoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZzIgPSB0b0Jvb2woYm9vbGVhblN0YWNrLnBvcCgpKTtcbiAgICAgICAgICAgICAgICAgICAgYm9vbGVhblN0YWNrLnB1c2godG9TdHJpbmcoYXJnMSAmJiBhcmcyKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ1hPUicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJnMSA9IHRvQm9vbChib29sZWFuU3RhY2sucG9wKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmcyID0gdG9Cb29sKGJvb2xlYW5TdGFjay5wb3AoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJvb2xlYW5TdGFjay5wdXNoKHRvU3RyaW5nKChhcmcxICYmICFhcmcyKSB8fCAoIWFyZzEgJiYgYXJnMikpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVW5zdXBwb3J0ZWQgb3BlcmF0b3I6ICcgKyB0b2tlbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVW5zdXBwb3J0ZWQgdG9rZW4gdHlwZTogJyArIHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFdmVudHVhbGx5IHRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gZm9yIHRoaXMgVGFzayBpcyB0aGUgb25seSBpdGVtIGxlZnQgaW4gdGhlIGJvb2xlYW4gc3RhY2tcbiAgICAgICAgcmV0dXJuIHRvQm9vbChib29sZWFuU3RhY2tbMF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhbiB7QGxpbmsgRXhwbGFuYXRpb259IHJlcHJlc2VudGluZyB0aGUgY29tcGxldGUgQm9vbGVhbiBpbnN0cnVjdGlvbiBjdXJyZW50bHkgYmVpbmcgYW5hbHlzZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zdGZpeEV4cHJlc3Npb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnN0cnVjdEV4cGxhbmF0aW9uKHBvc3RmaXhFeHByZXNzaW9uOiBQb3N0Zml4RXhwcmVzc2lvbik6IEV4cGxhbmF0aW9uIHtcbiAgICAgICAgLy8gRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBjb2RlLCBzZWUgdGhlIEpTZG9jIGFuZCBjb21tZW50cyBvZiBmaWx0ZXJUYXNrV2l0aFBhcnNlZFF1ZXJ5KClcbiAgICAgICAgY29uc3QgZXhwbGFuYXRpb25TdGFjazogRXhwbGFuYXRpb25bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHBvc3RmaXhFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4ubmFtZSA9PT0gJ0lERU5USUZJRVInKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlID09IG51bGwpIHRocm93IEVycm9yKCdudWxsIHRva2VuIHZhbHVlJyk7IC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLnN1YkZpZWxkc1t0b2tlbi52YWx1ZS50cmltKCldO1xuICAgICAgICAgICAgICAgIGV4cGxhbmF0aW9uU3RhY2sucHVzaChmaWx0ZXIuZXhwbGFuYXRpb24pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbi5uYW1lID09PSAnT1BFUkFUT1InKSB7XG4gICAgICAgICAgICAgICAgLy8gVG8gZXZhbHVhdGUgYW4gb3BlcmF0b3Igd2UgbmVlZCB0byBwb3AgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBpdGVtcyBmcm9tIHRoZSBib29sZWFuIHN0YWNrLFxuICAgICAgICAgICAgICAgIC8vIGRvIHRoZSBsb2dpY2FsIGV2YWx1YXRpb24gYW5kIHB1c2ggYmFjayB0aGUgcmVzdWx0XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlID09PSAnTk9UJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmcxID0gZXhwbGFuYXRpb25TdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwbGFuYXRpb25TdGFjay5wdXNoKEV4cGxhbmF0aW9uLmJvb2xlYW5Ob3QoW2FyZzEhXSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4udmFsdWUgPT09ICdPUicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJnMiA9IGV4cGxhbmF0aW9uU3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZzEgPSBleHBsYW5hdGlvblN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBleHBsYW5hdGlvblN0YWNrLnB1c2goRXhwbGFuYXRpb24uYm9vbGVhbk9yKFthcmcxISwgYXJnMiFdKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ0FORCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJnMiA9IGV4cGxhbmF0aW9uU3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZzEgPSBleHBsYW5hdGlvblN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBleHBsYW5hdGlvblN0YWNrLnB1c2goRXhwbGFuYXRpb24uYm9vbGVhbkFuZChbYXJnMSEsIGFyZzIhXSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4udmFsdWUgPT09ICdYT1InKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZzIgPSBleHBsYW5hdGlvblN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmcxID0gZXhwbGFuYXRpb25TdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwbGFuYXRpb25TdGFjay5wdXNoKEV4cGxhbmF0aW9uLmJvb2xlYW5Yb3IoW2FyZzEhLCBhcmcyIV0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVW5zdXBwb3J0ZWQgb3BlcmF0b3I6ICcgKyB0b2tlbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVW5zdXBwb3J0ZWQgdG9rZW4gdHlwZTogJyArIHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFdmVudHVhbGx5IHRoZSBFeHBsYW5hdGlvbiBpcyB0aGUgb25seSBpdGVtIGxlZnQgaW4gdGhlIGJvb2xlYW4gc3RhY2tcbiAgICAgICAgcmV0dXJuIGV4cGxhbmF0aW9uU3RhY2tbMF07XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uLy4uL1Rhc2snO1xuaW1wb3J0IHsgVGV4dEZpZWxkIH0gZnJvbSAnLi9UZXh0RmllbGQnO1xuXG4vKiogU3VwcG9ydCB0aGUgJ2ZpbGVuYW1lJyBzZWFyY2ggaW5zdHJ1Y3Rpb24uXG4gKlxuICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFsc28gc2VhcmNoZXMgdGhlIGZpbGUgZXh0ZW5zaW9uLFxuICogc28gJ2ZpbGVuYW1lIGluY2x1ZGVzIC5tZCcgd2lsbCB0eXBpY2FsbHkgbWF0Y2ggYWxsIHRhc2tzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVuYW1lRmllbGQgZXh0ZW5kcyBUZXh0RmllbGQge1xuICAgIHB1YmxpYyBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdmaWxlbmFtZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIGluY2x1ZGluZyBmaWxlIGV4dGVuc2lvbiwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSB0YXNrIGRvZXMgbm90IGhhdmUgYSBmaWxlbmFtZVxuICAgICAqIEBwYXJhbSB0YXNrXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHB1YmxpYyB2YWx1ZSh0YXNrOiBUYXNrKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSB0YXNrLmZpbGVuYW1lO1xuICAgICAgICBpZiAoZmlsZW5hbWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZW5hbWUgKyAnLm1kJztcbiAgICB9XG5cbiAgICBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IFRleHRGaWVsZCB9IGZyb20gJy4vVGV4dEZpZWxkJztcblxuLyoqXG4gKiBBIHtAbGluayBGaWVsZH0gaW1wbGVtZW50YXRpb24gZm9yIHNlYXJjaGluZyBzdGF0dXMubmFtZVxuICovXG5leHBvcnQgY2xhc3MgU3RhdHVzTmFtZUZpZWxkIGV4dGVuZHMgVGV4dEZpZWxkIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnc3RhdHVzLm5hbWUnO1xuICAgIH1cblxuICAgIHZhbHVlKHRhc2s6IFRhc2spOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGFzay5zdGF0dXMubmFtZTtcbiAgICB9XG5cbiAgICBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0c0dyb3VwaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IEdyb3VwZXJGdW5jdGlvbiB9IGZyb20gJy4uL0dyb3VwZXInO1xuaW1wb3J0IHsgU3RhdHVzVHlwZSB9IGZyb20gJy4uLy4uL1N0YXR1c0NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBDb21wYXJhdG9yIH0gZnJvbSAnLi4vU29ydGVyJztcbmltcG9ydCB7IEV4cGxhbmF0aW9uIH0gZnJvbSAnLi4vRXhwbGFpbi9FeHBsYW5hdGlvbic7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vRmllbGQnO1xuaW1wb3J0IHsgRmlsdGVyLCBGaWx0ZXJPckVycm9yTWVzc2FnZSB9IGZyb20gJy4vRmlsdGVyJztcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb24gfSBmcm9tICcuL0ZpbHRlcic7XG5cbi8qKlxuICogQSAke0BsaW5rIEZpZWxkfSBpbXBsZW1lbnRhdGlvbiBmb3Igc2VhcmNoaW5nIHN0YXR1cy50eXBlXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGF0dXNUeXBlRmllbGQgZXh0ZW5kcyBGaWVsZCB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBGaWx0ZXJpbmdcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHB1YmxpYyBjYW5DcmVhdGVGaWx0ZXJGb3JMaW5lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBVc2UgYSByZWxheGVkIHJlZ2V4cCwganVzdCBjaGVja2luZyBmaWVsZCBuYW1lIGFuZCBub3QgdGhlIGNvbnRlbnRzLFxuICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBwYXJzZSB0aGUgbGluZSBsYXRlciBhbmQgZ2l2ZSBtZWFuaW5nZnVsIGVycm9ycyBpZiB1c2VyIHVzZXMgaW52YWxpZCB2YWx1ZXMuXG4gICAgICAgIGNvbnN0IHJlbGF4ZWRSZWdFeHAgPSBuZXcgUmVnRXhwKGBeKD86JHt0aGlzLmZpZWxkTmFtZVNpbmd1bGFyRXNjYXBlZCgpfSlgKTtcbiAgICAgICAgcmV0dXJuIEZpZWxkLmxpbmVNYXRjaGVzRmlsdGVyKHJlbGF4ZWRSZWdFeHAsIGxpbmUpO1xuICAgIH1cblxuICAgIGNyZWF0ZUZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBGaWVsZC5nZXRNYXRjaCh0aGlzLmZpbHRlclJlZ0V4cCgpLCBsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGdldCBoZXJlLCBiZWNhdXNlIGNhbkNyZWF0ZUZpbHRlckZvckxpbmUoKSB1c2VzIGEgbW9yZSByZWxheGVkIHJlZ2V4cC5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhlbHBNZXNzYWdlKGxpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW18sIGZpbHRlck9wZXJhdG9yLCBzdGF0dXNUeXBlQXNTdHJpbmddID0gbWF0Y2g7XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzVHlwZUVsZW1lbnQgPSBTdGF0dXNUeXBlW3N0YXR1c1R5cGVBc1N0cmluZy50b1VwcGVyQ2FzZSgpIGFzIGtleW9mIHR5cGVvZiBTdGF0dXNUeXBlXTtcbiAgICAgICAgaWYgKCFzdGF0dXNUeXBlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVscE1lc3NhZ2UobGluZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmlsdGVyRnVuY3Rpb246IEZpbHRlckZ1bmN0aW9uO1xuXG4gICAgICAgIHN3aXRjaCAoZmlsdGVyT3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgJ2lzJzpcbiAgICAgICAgICAgICAgICBmaWx0ZXJGdW5jdGlvbiA9ICh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLnN0YXR1cy50eXBlID09PSBzdGF0dXNUeXBlRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaXMgbm90JzpcbiAgICAgICAgICAgICAgICBmaWx0ZXJGdW5jdGlvbiA9ICh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLnN0YXR1cy50eXBlICE9PSBzdGF0dXNUeXBlRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oZWxwTWVzc2FnZShsaW5lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBGaWx0ZXJPckVycm9yTWVzc2FnZS5mcm9tRmlsdGVyKG5ldyBGaWx0ZXIobGluZSwgZmlsdGVyRnVuY3Rpb24sIG5ldyBFeHBsYW5hdGlvbihsaW5lKSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBmaWx0ZXJSZWdFeHAoKTogUmVnRXhwIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeKD86JHt0aGlzLmZpZWxkTmFtZVNpbmd1bGFyRXNjYXBlZCgpfSkgKGlzfGlzIG5vdCkgKFteIF0rKSRgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhlbHBNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgY29uc3QgYWxsb3dlZFR5cGVzID0gT2JqZWN0LnZhbHVlcyhTdGF0dXNUeXBlKVxuICAgICAgICAgICAgLmZpbHRlcigodCkgPT4gdCAhPT0gU3RhdHVzVHlwZS5FTVBUWSlcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBJbnZhbGlkICR7dGhpcy5maWVsZE5hbWVTaW5ndWxhcigpfSBpbnN0cnVjdGlvbjogJyR7bGluZX0nLlxuICAgIEFsbG93ZWQgb3B0aW9uczogJ2lzJyBhbmQgJ2lzIG5vdCcgKHdpdGhvdXQgcXVvdGVzKS5cbiAgICBBbGxvd2VkIHZhbHVlczogICR7YWxsb3dlZFR5cGVzfVxuICAgICAgICAgICAgICAgICAgICAgTm90ZTogdmFsdWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gJ2luX3Byb2dyZXNzJyB3b3JrcyB0b28sIGZvciBleGFtcGxlLlxuICAgIEV4YW1wbGU6ICAgICAgICAgJHt0aGlzLmZpZWxkTmFtZVNpbmd1bGFyKCl9IGlzIG5vdCBOT05fVEFTS2A7XG4gICAgICAgIHJldHVybiBGaWx0ZXJPckVycm9yTWVzc2FnZS5mcm9tRXJyb3IobGluZSwgbWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3N0YXR1cy50eXBlJztcbiAgICB9XG5cbiAgICB2YWx1ZSh0YXNrOiBUYXNrKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRhc2suc3RhdHVzLnR5cGU7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTb3J0aW5nXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIHN1cHBvcnRzU29ydGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29tcGFyYXRvcigpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgcmV0dXJuIChhOiBUYXNrLCBiOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXlBID0gU3RhdHVzVHlwZUZpZWxkLmdyb3VwTmFtZShhKTtcbiAgICAgICAgICAgIGNvbnN0IGtleUIgPSBTdGF0dXNUeXBlRmllbGQuZ3JvdXBOYW1lKGIpO1xuICAgICAgICAgICAgcmV0dXJuIGtleUEubG9jYWxlQ29tcGFyZShrZXlCLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEdyb3VwaW5nXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIHB1YmxpYyBzdXBwb3J0c0dyb3VwaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ3JvdXBlcigpOiBHcm91cGVyRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gKHRhc2s6IFRhc2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbU3RhdHVzVHlwZUZpZWxkLmdyb3VwTmFtZSh0YXNrKV07XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBOYW1lKHRhc2s6IFRhc2spIHtcbiAgICAgICAgbGV0IHByZWZpeDogc3RyaW5nO1xuICAgICAgICAvLyBBZGQgYSBudW1lcmljIHByZWZpeCB0byBzb3J0IGluIHRvIGEgbWVhbmluZ2Z1bCBvcmRlciBmb3IgdXNlcnNcbiAgICAgICAgc3dpdGNoICh0YXNrLnN0YXR1cy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFN0YXR1c1R5cGUuSU5fUFJPR1JFU1M6XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gJzEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdGF0dXNUeXBlLlRPRE86XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gJzInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdGF0dXNUeXBlLkRPTkU6XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gJzMnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdGF0dXNUeXBlLkNBTkNFTExFRDpcbiAgICAgICAgICAgICAgICBwcmVmaXggPSAnNCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN0YXR1c1R5cGUuTk9OX1RBU0s6XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gJzUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdGF0dXNUeXBlLkVNUFRZOlxuICAgICAgICAgICAgICAgIHByZWZpeCA9ICc2JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlZml4ICsgJyAnICsgdGFzay5zdGF0dXMudHlwZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgeyBUZXh0RmllbGQgfSBmcm9tICcuL1RleHRGaWVsZCc7XG5cbmV4cG9ydCBjbGFzcyBSZWN1cnJlbmNlRmllbGQgZXh0ZW5kcyBUZXh0RmllbGQge1xuICAgIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3JlY3VycmVuY2UnO1xuICAgIH1cblxuICAgIHZhbHVlKHRhc2s6IFRhc2spOiBzdHJpbmcge1xuICAgICAgICBpZiAodGFzay5yZWN1cnJlbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFzay5yZWN1cnJlbmNlIS50b1RleHQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBEZXNjcmlwdGlvbkZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvRGVzY3JpcHRpb25GaWVsZCc7XG5pbXBvcnQgeyBEb25lRGF0ZUZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvRG9uZURhdGVGaWVsZCc7XG5pbXBvcnQgeyBEdWVEYXRlRmllbGQgfSBmcm9tICcuL0ZpbHRlci9EdWVEYXRlRmllbGQnO1xuaW1wb3J0IHsgRXhjbHVkZVN1Ykl0ZW1zRmllbGQgfSBmcm9tICcuL0ZpbHRlci9FeGNsdWRlU3ViSXRlbXNGaWVsZCc7XG5pbXBvcnQgeyBIZWFkaW5nRmllbGQgfSBmcm9tICcuL0ZpbHRlci9IZWFkaW5nRmllbGQnO1xuaW1wb3J0IHsgUGF0aEZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvUGF0aEZpZWxkJztcbmltcG9ydCB7IFByaW9yaXR5RmllbGQgfSBmcm9tICcuL0ZpbHRlci9Qcmlvcml0eUZpZWxkJztcbmltcG9ydCB7IFNjaGVkdWxlZERhdGVGaWVsZCB9IGZyb20gJy4vRmlsdGVyL1NjaGVkdWxlZERhdGVGaWVsZCc7XG5pbXBvcnQgeyBTdGFydERhdGVGaWVsZCB9IGZyb20gJy4vRmlsdGVyL1N0YXJ0RGF0ZUZpZWxkJztcbmltcG9ydCB7IEhhcHBlbnNEYXRlRmllbGQgfSBmcm9tICcuL0ZpbHRlci9IYXBwZW5zRGF0ZUZpZWxkJztcbmltcG9ydCB7IFJlY3VycmluZ0ZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvUmVjdXJyaW5nRmllbGQnO1xuaW1wb3J0IHsgU3RhdHVzRmllbGQgfSBmcm9tICcuL0ZpbHRlci9TdGF0dXNGaWVsZCc7XG5pbXBvcnQgeyBUYWdzRmllbGQgfSBmcm9tICcuL0ZpbHRlci9UYWdzRmllbGQnO1xuaW1wb3J0IHsgQm9vbGVhbkZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvQm9vbGVhbkZpZWxkJztcbmltcG9ydCB7IEZpbGVuYW1lRmllbGQgfSBmcm9tICcuL0ZpbHRlci9GaWxlbmFtZUZpZWxkJztcbmltcG9ydCB7IFVyZ2VuY3lGaWVsZCB9IGZyb20gJy4vRmlsdGVyL1VyZ2VuY3lGaWVsZCc7XG5pbXBvcnQgeyBTdGF0dXNOYW1lRmllbGQgfSBmcm9tICcuL0ZpbHRlci9TdGF0dXNOYW1lRmllbGQnO1xuaW1wb3J0IHsgU3RhdHVzVHlwZUZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvU3RhdHVzVHlwZUZpZWxkJztcblxuaW1wb3J0IHsgUmVjdXJyZW5jZUZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvUmVjdXJyZW5jZUZpZWxkJztcbmltcG9ydCB0eXBlIHsgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlci9GaWx0ZXInO1xuaW1wb3J0IHR5cGUgeyBTb3J0ZXIgfSBmcm9tICcuL1NvcnRlcic7XG5pbXBvcnQgdHlwZSB7IEdyb3VwZXIgfSBmcm9tICcuL0dyb3VwZXInO1xuXG5jb25zdCBmaWVsZENyZWF0b3JzID0gW1xuICAgICgpID0+IG5ldyBTdGF0dXNOYW1lRmllbGQoKSwgLy8gc3RhdHVzLm5hbWUgaXMgYmVmb3JlIHN0YXR1cywgdG8gYXZvaWQgYW1iaWd1aXR5XG4gICAgKCkgPT4gbmV3IFN0YXR1c1R5cGVGaWVsZCgpLCAvLyBzdGF0dXMudHlwZSBpcyBiZWZvcmUgc3RhdHVzLCB0byBhdm9pZCBhbWJpZ3VpdHlcbiAgICAoKSA9PiBuZXcgU3RhdHVzRmllbGQoKSxcbiAgICAoKSA9PiBuZXcgUmVjdXJyaW5nRmllbGQoKSxcbiAgICAoKSA9PiBuZXcgUHJpb3JpdHlGaWVsZCgpLFxuICAgICgpID0+IG5ldyBIYXBwZW5zRGF0ZUZpZWxkKCksXG4gICAgKCkgPT4gbmV3IFN0YXJ0RGF0ZUZpZWxkKCksXG4gICAgKCkgPT4gbmV3IFNjaGVkdWxlZERhdGVGaWVsZCgpLFxuICAgICgpID0+IG5ldyBEdWVEYXRlRmllbGQoKSxcbiAgICAoKSA9PiBuZXcgRG9uZURhdGVGaWVsZCgpLFxuICAgICgpID0+IG5ldyBQYXRoRmllbGQoKSxcbiAgICAoKSA9PiBuZXcgRGVzY3JpcHRpb25GaWVsZCgpLFxuICAgICgpID0+IG5ldyBUYWdzRmllbGQoKSxcbiAgICAoKSA9PiBuZXcgSGVhZGluZ0ZpZWxkKCksXG4gICAgKCkgPT4gbmV3IEV4Y2x1ZGVTdWJJdGVtc0ZpZWxkKCksXG4gICAgKCkgPT4gbmV3IEJvb2xlYW5GaWVsZCgpLFxuICAgICgpID0+IG5ldyBGaWxlbmFtZUZpZWxkKCksXG4gICAgKCkgPT4gbmV3IFVyZ2VuY3lGaWVsZCgpLFxuICAgICgpID0+IG5ldyBSZWN1cnJlbmNlRmllbGQoKSxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZpbHRlcihmaWx0ZXJTdHJpbmc6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBjcmVhdG9yIG9mIGZpZWxkQ3JlYXRvcnMpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjcmVhdG9yKCk7XG4gICAgICAgIGlmIChmaWVsZC5jYW5DcmVhdGVGaWx0ZXJGb3JMaW5lKGZpbHRlclN0cmluZykpIHJldHVybiBmaWVsZC5jcmVhdGVGaWx0ZXJPckVycm9yTWVzc2FnZShmaWx0ZXJTdHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU29ydGVyKHNvcnRlclN0cmluZzogc3RyaW5nKTogU29ydGVyIHwgbnVsbCB7XG4gICAgLy8gTmV3IHN0eWxlIHBhcnNpbmcsIHVzaW5nIHNvcnRpbmcgd2hpY2ggaXMgZG9uZSBieSB0aGUgRmllbGQgY2xhc3Nlcy5cblxuICAgIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgd2hldGhlciBsaW5lIGJlZ2lucyB3aXRoICdzb3J0IGJ5J1xuICAgIGNvbnN0IHNvcnRCeVJlZ2V4cCA9IC9ec29ydCBieSAvO1xuICAgIGlmIChzb3J0ZXJTdHJpbmcubWF0Y2goc29ydEJ5UmVnZXhwKSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTZWUgaWYgYW55IG9mIHRoZSBmaWVsZHMgY2FuIHBhcnNlIHRoZSBsaW5lLlxuICAgIGZvciAoY29uc3QgY3JlYXRvciBvZiBmaWVsZENyZWF0b3JzKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY3JlYXRvcigpO1xuICAgICAgICBjb25zdCBzb3J0ZXIgPSBmaWVsZC5wYXJzZVNvcnRMaW5lKHNvcnRlclN0cmluZyk7XG4gICAgICAgIGlmIChzb3J0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3J0ZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUdyb3VwZXIobGluZTogc3RyaW5nKTogR3JvdXBlciB8IG51bGwge1xuICAgIC8vIE5ldyBzdHlsZSBwYXJzaW5nLCB1c2luZyBncm91cGluZyB3aGljaCBpcyBkb25lIGJ5IHRoZSBGaWVsZCBjbGFzc2VzLlxuXG4gICAgLy8gT3B0aW1pc2F0aW9uOiBDaGVjayB3aGV0aGVyIGxpbmUgYmVnaW5zIHdpdGggJ2dyb3VwIGJ5J1xuICAgIGNvbnN0IGdyb3VwQnlSZWdleHAgPSAvXmdyb3VwIGJ5IC87XG4gICAgaWYgKGxpbmUubWF0Y2goZ3JvdXBCeVJlZ2V4cCkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gU2VlIGlmIGFueSBvZiB0aGUgZmllbGRzIGNhbiBwYXJzZSB0aGUgbGluZS5cbiAgICBmb3IgKGNvbnN0IGNyZWF0b3Igb2YgZmllbGRDcmVhdG9ycykge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNyZWF0b3IoKTtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gZmllbGQuZmllbGROYW1lU2luZ3VsYXIoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IGBncm91cCBieSAke2ZpZWxkTmFtZX1gKSB7XG4gICAgICAgICAgICBpZiAoZmllbGQuc3VwcG9ydHNHcm91cGluZygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmNyZWF0ZUdyb3VwZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbiIsICIvKipcbiAqIEdyb3VwSGVhZGluZyBjb250YWlucyB0aGUgZGF0YSBuZWVkZWQgdG8gcmVuZGVyIG9uZSBoZWFkaW5nIGZvciBhIGdyb3VwIG9mIHRhc2tzXG4gKi9cbmV4cG9ydCBjbGFzcyBHcm91cEhlYWRpbmcge1xuICAgIC8qKlxuICAgICAqIEhvdyBuZXN0ZWQgdGhlIGhlYWRpbmcgaXMuXG4gICAgICogMCBpcyB0aGUgZmlyc3QgZ3JvdXAsIG1lYW5pbmcgdGhpcyBoZWFkaW5nIHdhcyBnZW5lcmF0ZWQgYnlcbiAgICAgKiB0aGUgZmlyc3QgJ2dyb3VwIGJ5JyBpbnN0cnVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbmVzdGluZ0xldmVsOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCB0byBiZSBkaXNwbGF5ZWQgZm9yIHRoZSBncm91cC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgR3JvdXBIZWFkaW5nIG9iamVjdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZXN0aW5nTGV2ZWwgLSBTZWUgdGhpcy5uZXN0aW5nTGV2ZWwgZm9yIGRldGFpbHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBmb3IgdGhlIGdyb3VwXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmVzdGluZ0xldmVsOiBudW1iZXIsIG5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLm5lc3RpbmdMZXZlbCA9IG5lc3RpbmdMZXZlbDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgR3JvdXBIZWFkaW5nIH0gZnJvbSAnLi9Hcm91cEhlYWRpbmcnO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzU3RvcmFnZSB9IGZyb20gJy4vSW50ZXJtZWRpYXRlVGFza0dyb3Vwcyc7XG5cbi8qXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBHcm91cC50c1xuICovXG5cbi8qKlxuICogRXhwbGFuYXRpb24gb2YgdGhlIGFsZ29yaXRobXMgdXNlZCBoZXJlLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgdGV4dCBpcyB0YWtlbiBmcm9tXG4gKiBodHRwczovL2Rpc2NvcmQuY29tL2NoYW5uZWxzLzY4NjA1MzcwODI2MTIyODU3Ny84NDAyODYyNjQ5NjQwMjIzMDIvOTU1MjQwODEyOTczODA5Njc0XG4gKlxuICogVGhlIFByb2JsZW1cbiAqID09PT09PT09PT09XG4gKlxuICogSW1hZ2luZSB0aGF0IHRoZSB1c2VyIGhhcyBzdXBwbGllZCAzICdncm91cCBieScgaW5zdHJ1Y3Rpb25zLCBhbmQgaW4gb3JkZXJcbiAqIHRvIHByZXNlbnQgdGhlIHJlc3VsdHMsIHdlIHNpbXBseSBjb25jYXRlbmF0ZSB0aGUgZ3JvdXAgbmFtZXMgdG9nZXRoZXJcbiAqIHdpdGggJz4nLlxuICpcbiAqIFNvIHRoZSBkaXNwbGF5IG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2U6XG4gKiAgICAgICMjIyMgMTAuMCA+IDIwMjItMDMtMjAgPiBTb21lIGhlYWRpbmcgbmFtZVxuICogICAgICAtIHRhc2sgMVxuICogICAgICAtIHRhc2sgMlxuICogICAgICAjIyMjIDEwLjAgPiAyMDIyLTAzLTIyID4gU29tZSBoZWFkaW5nIG5hbWVcbiAqICAgICAgLSB0YXNrIDdcbiAqICAgICAgLSB0YXNrIDlcbiAqXG4gKiBUaGUgaGVhZGluZ3MgZ2V0IHZlcnkgaGFyZCB0byByZWFkLCB2ZXJ5IHF1aWNrbHkuXG4gKlxuICogV2hhdCB3ZSB3YW50IGluc3RlYWQgaXM6XG4gKiAgICAgICMjIyMgMTAuMFxuICogICAgICAjIyMjIyAyMDIyLTAzLTIwXG4gKiAgICAgICMjIyMjIyBTb21lIGhlYWRpbmcgbmFtZVxuICogICAgICAtIHRhc2sgMVxuICogICAgICAtIHRhc2sgMlxuICogICAgICAjIyMjIyAyMDIyLTAzLTIyXG4gKiAgICAgICMjIyMjIyBTb21lIGhlYWRpbmcgbmFtZVxuICogICAgICAtIHRhc2sgN1xuICogICAgICAtIHRhc2sgOVxuICpcbiAqIEknbSBzdHJ1Z2dsaW5nIHRvIGdldCBteSBoZWFkIGFyb3VuZCBob3csIGluIFRTLCBJIGNhbiBzdG9yZSBzb21ldGhpbmcgbGlrZSBhIHRyZWUgc3RydWN0dXJlLFxuICogb2YgYXJiaXRyYXJ5IGRlcHRoIC0gdG8gcmVwcmVzZW50IHRoZSBncm91cGVkIHRhc2tzLlxuICpcbiAqIHBqZWJ5J3MgYW5zd2VyXG4gKiA9PT09PT09PT09PT09PVxuICpcbiAqIFVzZXIgcGplYnkgcmVwbGllZDpcbiAqIGh0dHBzOi8vZGlzY29yZC5jb20vY2hhbm5lbHMvNjg2MDUzNzA4MjYxMjI4NTc3Lzg0MDI4NjI2NDk2NDAyMjMwMi85NTU1Nzk1NjAwMzQ5ODM5NDZcbiAqXG4gKiBJZiBhbGwgeW91J3JlIGRvaW5nIGlzIGdlbmVyYXRpbmcgaGVhZGluZ3MsIHRoZSBzaW1wbGUgYWxnb3JpdGhtIHdvdWxkIGJlIHRvIHNvcnQgZXZlcnl0aGluZyBieSBhIG11bHRpLXZhbHVlIGtleSAtXG4gKiBpLmUuLCBbbGV2ZWwgMSwgbGV2ZWwgMiwgLi4uLCBpdGVtIHNvcnQga2V5XSAtLSB0aGVuIGl0ZXJhdGUgdGhlIHdob2xlIGxpc3QgYW5kIG91dHB1dCBhIGhlYWRpbmcgZm9yIGVhY2ggbGV2ZWxcbiAqIHdoZXJlIHRoZSB2YWx1ZSBjaGFuZ2VkLlxuICpcbiAqIGkuZS4sIHlvdSBzdGFydCB3aXRoIGEgW251bGwsIG51bGwsIG51bGwsIG51bGwuLi4uXSBcImxhc3Qgc2VlblwiIGFycmF5IGFuZCBjb21wYXJlIGl0IGl0ZW0gYnkgaXRlbSB0byB0aGUgY3VycmVudFxuICogaXRlbSdzIGRhdGEsIGFuZCBvdXRwdXQgYSBoZWFkaW5nIG9mIHRoZSBjb3JyZWN0IGxldmVsIGlmIHRoZXJlJ3MgYSBjaGFuZ2UsIHVwZGF0aW5nIHRoZSBpdGVtIGluIHlvdXJcbiAqIFwibGFzdCBzZWVuXCIgYXJyYXkuXG4gKlxuICogaS5lLiBpZiB0aGUgZmlyc3QgaXRlbSBpcyBkaWZmZXJlbnQsIG91dHB1dCBhbiBIMSBmb3IgdGhlIG5ldyB2YWx1ZSBhbmQgc2V0IHRoZSByZXN0IG9mIHRoZSBhcnJheSB0byBudWxsLlxuICogSWYgdGhlIHNlY29uZCBpdGVtIGlzIGFsc28gZGlmZmVyZW50LCBvdXRwdXQgYW4gSDIsIHNhdmUgdGhlIHZhbHVlLCBzZXQgdGhlIHJlc3QgdG8gbnVsbCwgYW5kIHNvIG9uLlxuICogQWZ0ZXIgYWxsIHRoZSBsZXZlbHMgYXJlIGNoZWNrZWQsIG91dHB1dCB0aGUgYWN0dWFsIGl0ZW0uXG4gKiBJZiB0aGVyZSBhcmUgbm8gY2hhbmdlcywgdGhlbiBiYXNpY2FsbHkgeW91J2xsIGp1c3QgYmUgb3V0cHV0dGluZyB0aGUgaXRlbS5cbiAqIE5vIHRyZWVzIG9yIGdyYXBocyBvciB3aGF0bm90IG5lZWRlZC5cbiAqXG4gKiBZb3UgY291bGQgYWxzbyBqdXN0IGtlZXAgdGhlIGxhc3QgaXRlbSBhbmQgc2V0IGEgZmxhZyBhcyBzb29uIGFzIHNvbWV0aGluZyBkb2Vzbid0IG1hdGNoLCBhbmQga2VlcCBvdXRwdXR0aW5nXG4gKiBoZWFkaW5ncyBhcyBzb29uIGFzIHRoZSBmbGFnIGlzIHNldC5cbiAqXG4gKiBXaGF0IHRoZSBjb2RlIGRvZXNcbiAqID09PT09PT09PT09PT09PT09PVxuICpcbiAqIFRoZSBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzIGNsYXNzIGJlbG93IGRvZXMgdGhlIGluaXRpYWwgZ3JvdXBpbmcgYW5kIHNvcnRpbmcuXG4gKlxuICogVGhlIEdyb3VwSGVhZGluZ3MgY2xhc3MgYmVsb3cgaW1wbGVtZW50cyBwamVieSdzIGhlYWRpbmcgZGV0ZWN0aW9uIGFsZ29yaXRobSwgYnV0IGluc3RlYWQgb2YgZG9pbmcgdGhlIHByaW50aW5nIGRpcmVjdGx5LFxuICogaXQgcmV0dXJucyB0aGUgY2FsY3VsYXRlZCBoZWFkaW5nIGxldmVscyBpbiBhbiBhcnJheSBvZiBHcm91cEhlYWRpbmcgb2JqZWN0cywgZm9yIGxhdGVyIHVzZSBpbiBRdWVyeVJlbmRlcmVyLnRzLlxuICovXG5cbi8qKlxuICogR3JvdXBIZWFkaW5ncyBjYWxjdWxhdGVzIHdoaWNoIGhlYWRpbmdzIG5lZWQgdG8gYmUgZGlzcGxheWVkLCBmb3JcbiAqIGEgZ2l2ZW4gZ3JvdXAgb2YgdGFza3MuXG4gKlxuICogU2VlIHRoZSBleHBsYW5hdGlvbiBpbiBHcm91cEhlYWRpbmdzLnRzIGZvciBob3cgaXQgd29ya3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBHcm91cEhlYWRpbmdzIHtcbiAgICBwcml2YXRlIGxhc3RIZWFkaW5nQXRMZXZlbCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihncm91cGVkVGFza3M6IEludGVybWVkaWF0ZVRhc2tHcm91cHNTdG9yYWdlKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0R3JvdXAgPSBncm91cGVkVGFza3Mua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgY29uc3QgZ3JvdXBDb3VudCA9IGZpcnN0R3JvdXAubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5sYXN0SGVhZGluZ0F0TGV2ZWwucHVzaCgnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIG1pbmltYWwgc2V0IG9mIGhlYWRpbmdzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZFxuICAgICAqIGJlZm9yZSB0aGUgdGFza3Mgd2l0aCB0aGUgZ2l2ZW4gZ3JvdXAgbmFtZXMuXG4gICAgICpcbiAgICAgKiBEYXRhIGZvciBlYWNoIHJlcXVpcmVkIGhlYWRpbmcgaXMgc3RvcmVkIGluIGEgR3JvdXBIZWFkaW5nIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lcyAwIG9yIG1vcmUgZ3JvdXAgbmFtZXMsIG9uZSBwZXIgJ2dyb3VwIGJ5JyBsaW5lXG4gICAgICovXG4gICAgZ2V0SGVhZGluZ3NGb3JUYXNrR3JvdXAoZ3JvdXBOYW1lczogc3RyaW5nW10pOiBHcm91cEhlYWRpbmdbXSB7XG4gICAgICAgIC8vIFNlZSAncGplYnkncyBhbnN3ZXInIGFib3ZlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzIGFsZ29yaXRobS5cbiAgICAgICAgY29uc3QgaGVhZGluZ3NGb3JHcm91cCA9IG5ldyBBcnJheTxHcm91cEhlYWRpbmc+KCk7XG4gICAgICAgIGZvciAobGV0IGxldmVsID0gMDsgbGV2ZWwgPCBncm91cE5hbWVzLmxlbmd0aDsgbGV2ZWwrKykge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBncm91cE5hbWVzW2xldmVsXTtcbiAgICAgICAgICAgIGlmIChncm91cCAhPSB0aGlzLmxhc3RIZWFkaW5nQXRMZXZlbFtsZXZlbF0pIHtcbiAgICAgICAgICAgICAgICBoZWFkaW5nc0Zvckdyb3VwLnB1c2gobmV3IEdyb3VwSGVhZGluZyhsZXZlbCwgZ3JvdXApKTtcbiAgICAgICAgICAgICAgICAvLyBSZXNldCBhbGwgdGhlIGxvd2VyIGhlYWRpbmcgbGV2ZWxzIHRvIHVuLXNlZW5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gbGV2ZWw7IGogPCBncm91cE5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEhlYWRpbmdBdExldmVsW2pdID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEhlYWRpbmdBdExldmVsW2xldmVsXSA9IGdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFkaW5nc0Zvckdyb3VwO1xuICAgIH1cbn1cbiIsICIvKipcbiAqIEEgbm9kZSBpbiB0aGUgZ3JvdXBpbmcgdHJlZS4gVGhlIG5vZGUgY29udGFpbnMgdGhlXG4gKiBsaXN0IG9mIHZhbHVlcyBtYXRjaGluZyB0aGUgcGF0aCBmcm9tIHRoZSByb290IHNvIGZhciwgYW5kIGl0cyBjaGlsZHJlblxuICogYXJlIHRoZSBmdXJ0aGVyIGdyb3VwaW5nIG9mIHRob3NlIHZhbHVlcy5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBHcm91cGluZ1RyZWVOb2RlPFQ+IHtcbiAgICBjaGlsZHJlbjogTWFwPHN0cmluZywgR3JvdXBpbmdUcmVlTm9kZTxUPj4gPSBuZXcgTWFwKCk7XG4gICAgdmFsdWVzOiBUW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHZhbHVlczogVFtdKSB7XG4gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZSB0cmVlIHRvIGdlbmVyYXRlIGFsbCB0aGUgcGF0aHMgdG8gdGhlIGxlYXZlcy5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBtYXAgZnJvbSBldmVyeSBsZWFmIHBhdGgsIHRvIHRoZSBsaXN0IG9mIHZhbHVlc1xuICAgICAqIG1hdGNoaW5nIHRoaXMgcGF0aC5cbiAgICAgKiBOT1RFOiBUaGUgbm9kZSBpdHNlbGYgZG9lc24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBwYXRocy5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZUFsbFBhdGhzKHBhdGhTb0Zhcjogc3RyaW5nW10gPSBbXSk6IE1hcDxzdHJpbmdbXSwgVFtdPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4uc2l6ZSA9PSAwKSB7XG4gICAgICAgICAgICAvLyBCYXNlIGNhc2U6IExlYWYgbm9kZS4gUG9wdWxhdGUgdGhlIHJlc3VsdHMgbWFwIHdpdGggdGhlIHBhdGggdG9cbiAgICAgICAgICAgIC8vIHRoaXMgbm9kZSwgYW5kIHRoZSB2YWx1ZXMgdGhhdCBtYXRjaCB0aGlzIHBhdGguXG4gICAgICAgICAgICByZXN1bHRNYXAuc2V0KFsuLi5wYXRoU29GYXJdLCB0aGlzLnZhbHVlcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0TWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBbcHJvcGVydHksIGNoaWxkXSBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBwYXRoU29GYXIucHVzaChwcm9wZXJ0eSk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZFJlc3VsdCA9IGNoaWxkLmdlbmVyYXRlQWxsUGF0aHMocGF0aFNvRmFyKTtcbiAgICAgICAgICAgIGNoaWxkUmVzdWx0LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHJlc3VsdE1hcC5zZXQoa2V5LCB2YWx1ZSkpO1xuICAgICAgICAgICAgcGF0aFNvRmFyLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRNYXA7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uL1Rhc2snO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICcuL0dyb3VwJztcbmltcG9ydCB0eXBlIHsgR3JvdXBlciB9IGZyb20gJy4vR3JvdXBlcic7XG5pbXBvcnQgeyBHcm91cGluZ1RyZWVOb2RlIH0gZnJvbSAnLi9Hcm91cGluZ1RyZWVOb2RlJztcblxuLyoqXG4gKiBTdG9yYWdlIHVzZWQgZm9yIHRoZSBpbml0aWFsIGdyb3VwaW5nIHRvZ2V0aGVyIG9mIHRhc2tzLlxuICpcbiAqIFRoZSBrZXlzIG9mIHRoZSBtYXAgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZ3JvdXBzLlxuICogRm9yIGV4YW1wbGUsIG9uZSBzZXQgb2Yga2V5cyBtaWdodCBiZSBbJ0ZvbGRlciBOYW1lLycsICdGaWxlIE5hbWUnXVxuICogYW5kIHRoZSB2YWx1ZXMgd291bGQgYmUgYWxsIHRoZSBtYXRjaGluZyBUYXNrcyBmcm9tIHRoYXQgZmlsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEludGVybWVkaWF0ZVRhc2tHcm91cHNTdG9yYWdlIGV4dGVuZHMgTWFwPHN0cmluZ1tdLCBUYXNrW10+IHt9XG5cbi8qXG4gKiBBIHRyZWUgb2YgdGFza3Mgd2hlcmUgZXZlcnkgbGV2ZWwgaW4gdGhlIHRyZWUgY29ycmVzcG9uZHMgdG8gYSBncm91cGluZyBwcm9wZXJ0eS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZTpcbiAqICMgSGVhZGluZyAxXG4gKiAtIFsgXSBUYXNrIDFcbiAqICMgSGVhZGluZyAyXG4gKiAtIFsgXSBUYXNrIDJcbiAqIC0gW1hdIFRhc2sgM1xuICpcbiAqIEFuZCB3ZSBncm91cCBieSBoZWFkaW5nIHRoZW4gc3RhdHVzLCB0aGUgdHJlZSB3aWxsIGxvb2sgbGlrZTpcbiAqXG4gKiAgICAgICAgICAgICAgICAgICBSb290IFtUMSwgVDIsIFQzXVxuICogICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICBcXFxuICogICAgICAgICAgICAgIEhlYWRpbmcgMSBbVDFdICAgICBIZWFkaW5nIFtUMiwgVDNdXG4gKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgLyAgICAgICAgXFxcbiAqICAgICAgICAgICAgICAgVE9ETyBbVDFdICAgICBUT0RPIFtUMl0gICAgRG9uZSBbVDNdXG4gKlxuICogVGhlIG5pY2UgcHJvcGVydHkgb2YgdGhpcyB0cmVlIGlzIHRoYXQgZXZlcnkgcGF0aCBmcm9tIHRoZSByb290IHRvIGEgbGVhZiwgbWFwc1xuICogdG8gaG93IHRoZSB0YXNrcyB3aWxsIGJlIHJlbmRlcmVkLlxuICpcbiAqIE5PVEU6IFRoZSBzYW1lIHRhc2sgY2FuIGFwcGVhciBpbiBtdWx0aXBsZSBsZWFmIG5vZGVzLCBpZiBpdCBtYXRjaGVzIG11bHRpcGxlIHBhdGhzLlxuICovXG5jbGFzcyBUYXNrR3JvdXBpbmdUcmVlTm9kZSBleHRlbmRzIEdyb3VwaW5nVHJlZU5vZGU8VGFzaz4ge31cblxuLyoqXG4gKiBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzIGRvZXMgdGhlIGluaXRpYWwgZ3JvdXBpbmcgdG9nZXRoZXIgb2YgdGFza3MsXG4gKiBpbiBhbHBoYWJldGljYWwgb3JkZXIgYnkgZ3JvdXAgbmFtZXMuXG4gKlxuICogSXQgaXMgZXNzZW50aWFsbHkgYSB0aGluIHdyYXBwZXIgYXJvdW5kIE1hcCAtIHNlZSBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzU3RvcmFnZS5cbiAqXG4gKiBJdCBpcyBuYW1lZCBcIkludGVybWVkaWF0ZVwiIGJlY2F1c2UgaXRzIHJlc3VsdHMgYXJlIG9ubHkgdGVtcG9yYXJ5LlxuICogVGhleSB3aWxsIGJlIGRpc2NhcmRlZCBvbmNlIHRoZSBmaW5hbCBUYXNrR3JvdXBzIG9iamVjdCBpcyBjcmVhdGVkLlxuICpcbiAqIElkZWFsbHksIHRoaXMgY29kZSB3b3VsZCBiZSBzaW1wbGlmaWVkIGFuZCBtb3ZlZCBpbiB0byBUYXNrR3JvdXBzLlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJtZWRpYXRlVGFza0dyb3VwcyB7XG4gICAgcHVibGljIGdyb3VwcyA9IG5ldyBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzU3RvcmFnZSgpO1xuXG4gICAgLyoqXG4gICAgICogR3JvdXAgYSBsaXN0IG9mIHRhc2tzLCBhY2NvcmRpbmcgdG8gb25lIG9yIG1vcmUgdGFzayBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIGdyb3VwaW5ncyAwIG9yIG1vcmUgR3JvdXBpbmcgdmFsdWVzLCBvbmUgcGVyICdncm91cCBieScgbGluZVxuICAgICAqIEBwYXJhbSB0YXNrcyBUaGUgdGFza3MgdGhhdCBtYXRjaCB0aGUgdGFzayBibG9jaydzIFF1ZXJ5XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZ3JvdXBpbmdzOiBHcm91cGVyW10sIHRhc2tzOiBUYXNrW10pIHtcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMuYnVpbGRHcm91cGluZ1RyZWUoZ3JvdXBpbmdzLCB0YXNrcyk7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gdHJlZS5nZW5lcmF0ZUFsbFBhdGhzKCk7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gdGhpcy5nZXRTb3J0ZWRHcm91cHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgZ3JvdXBpbmcgdHJlZSB0aGF0IGdyb3VwcyB0aGUgcGFzc2VkIEB0YXNrcyBieSB0aGUgcGFzc2VkIEBncm91cGluZ3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZEdyb3VwaW5nVHJlZShncm91cGluZ3M6IEdyb3VwZXJbXSwgdGFza3M6IFRhc2tbXSk6IFRhc2tHcm91cGluZ1RyZWVOb2RlIHtcbiAgICAgICAgLy8gVGhlIHRyZWUgaXMgYnVpbGQgbGF5ZXIgYnkgbGF5ZXIsIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QuXG4gICAgICAgIC8vIEF0IGV2ZXJ5IGxldmVsLCB3ZSBpdGVyYXRlIG9uIHRoZSBub2RlcyBvZiB0aGF0IGxldmVsIHRvIGdlbmVyYXRlXG4gICAgICAgIC8vIHRoZSBuZXh0IG9uZSB1c2luZyB0aGUgbmV4dCBncm91cGluZy5cblxuICAgICAgICAvLyBUaGUgcm9vdCBvZiB0aGUgdHJlZSBjb250YWlucyBhbGwgdGhlIHRhc2tzLlxuICAgICAgICBjb25zdCByb290ID0gbmV3IFRhc2tHcm91cGluZ1RyZWVOb2RlKHRhc2tzKTtcblxuICAgICAgICBsZXQgY3VycmVudFRyZWVMZXZlbCA9IFtyb290XTtcbiAgICAgICAgZm9yIChjb25zdCBncm91cGluZyBvZiBncm91cGluZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRUcmVlTGV2ZWwgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudFRyZWVOb2RlIG9mIGN1cnJlbnRUcmVlTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgY3VycmVudFRyZWVOb2RlLnZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cE5hbWVzID0gR3JvdXAuZ2V0R3JvdXBOYW1lc0ZvclRhc2soZ3JvdXBpbmcsIHRhc2spO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwTmFtZSBvZiBncm91cE5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSBjdXJyZW50VHJlZU5vZGUuY2hpbGRyZW4uZ2V0KGdyb3VwTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gbmV3IFRhc2tHcm91cGluZ1RyZWVOb2RlKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJlZU5vZGUuY2hpbGRyZW4uc2V0KGdyb3VwTmFtZSwgY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUcmVlTGV2ZWwucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC52YWx1ZXMucHVzaCh0YXNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRUcmVlTGV2ZWwgPSBuZXh0VHJlZUxldmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTb3J0ZWRHcm91cHMoKSB7XG4gICAgICAgIC8vIGdyb3Vwcy5rZXlzKCkgd2lsbCBpbml0aWFsbHkgYmUgaW4gdGhlIG9yZGVyIHRoZSBlbnRyaWVzIHdlcmUgYWRkZWQsXG4gICAgICAgIC8vIHNvIGVmZmVjdGl2ZWx5IHJhbmRvbS5cbiAgICAgICAgLy8gUmV0dXJuIGEgZHVwbGljYXRlIG1hcCwgd2l0aCB0aGUga2V5cyAodGhhdCBpcywgZ3JvdXAgbmFtZXMpIHNvcnRlZCBpbiBhbHBoYWJldGljYWwgb3JkZXI6XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJtZWRpYXRlVGFza0dyb3Vwc1N0b3JhZ2UoWy4uLnRoaXMuZ3JvdXBzLmVudHJpZXMoKV0uc29ydCgpKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IEdyb3VwSGVhZGluZyB9IGZyb20gJy4vR3JvdXBIZWFkaW5nJztcblxuLyoqXG4gKiBUYXNrR3JvdXAgc3RvcmVzIGEgc2luZ2xlIGdyb3VwIG9mIHRhc2tzLCB0aGF0IGFsbCBzaGFyZSB0aGUgc2FtZSBncm91cCBuYW1lcy5cbiAqIFRhc2tHcm91cCBvYmplY3RzIGFyZSBzdG9yZWQgaW4gYSBUYXNrR3JvdXBzIG9iamVjdC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIHVzZXIgc3VwcGxpZWQgdGhlc2UgJ2dyb3VwIGJ5JyBsaW5lczpcbiAqICAgZ3JvdXAgYnkgZm9sZGVyXG4gKiAgIGdyb3VwIGJ5IGZpbGVuYW1lXG4gKiAgIGdyb3VwIGJ5IGhlYWRpbmdcbiAqIFRoZW4gdGhlIG5hbWVzIG9mIG9uZSBUYXNrR3JvdXAgbWlnaHQgYmUgdGhpczpcbiAqICAgU29tZS9Gb2xkZXIvSW4vVGhlL1ZhdWx0XG4gKiAgIEEgUGFydGljdWxhciBGaWxlIE5hbWVcbiAqICAgTXkgbG92ZWx5IGhlYWRpbmdcbiAqIEFuZCB0aGUgVGFza0dyb3VwIHdvdWxkIHN0b3JlIGFsbCB0aGUgdGFza3MgZnJvbSB0aGF0IGxvY2F0aW9uXG4gKiB0aGF0IG1hdGNoIHRoZSB0YXNrIGJsb2NrJ3MgZmlsdGVycywgaW4gdGhlIHRhc2sgYmxvY2sncyBzb3J0IG9yZGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXNrR3JvdXAge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lcyBvZiB0aGUgZ3JvdXAgcHJvcGVydGllcyBmb3IgdGhpcyBzZXQgb2YgdGFza3MsXG4gICAgICogaW4gdGhlIG9yZGVyIG9mIHRoZSAnZ3JvdXAgYnknIGxpbmVzIHRoZSB1c2VyIHNwZWNpZmllZFxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBncm91cHM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGhlYWRpbmdzIHRvIGJlIGRpc3BsYXllZCBpbiBmcm9udCBvZiB0aGlzIHNldCBvZiB0YXNrcyxcbiAgICAgKiB3aGVuIHJlbmRlcmluZyB0aGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEl0IG9ubHkgY29udGFpbnMgdGhlIG1pbmltYWwgc2V0IG9mIGhlYWRpbmdzIHJlcXVpcmVkIHRvIHNlcGFyYXRlXG4gICAgICogdGhpcyBncm91cCBvZiB0YXNrcyBmcm9tIHRoZSBwcmV2aW91cyBncm91cCBvZiB0YXNrcy5cbiAgICAgKlxuICAgICAqIElmIHRoZXJlIHdlcmUgbm8gJ2dyb3VwIGJ5JyBpbnN0cnVjdGlvbnMgaW4gdGhlIHRhc2tzIGNvZGUgYmxvY2ssXG4gICAgICogdGhpcyB3aWxsIGJlIGVtcHR5LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBncm91cEhlYWRpbmdzOiBHcm91cEhlYWRpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFsbCB0aGUgdGFza3MgdGhhdCBtYXRjaCB0aGUgdXNlcidzIGZpbHRlcnMgYW5kIHRoYXQgaGF2ZSB0aGVcbiAgICAgKiBncm91cCBuYW1lcyBleGFjdGx5IG1hdGNoaW5nIGdyb3VwcygpLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB0YXNrczogVGFza1tdO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IgZm9yIFRhc2tHcm91cFxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGdyb3VwcyAtIFNlZSB0aGlzLmdyb3VwcyBmb3IgZGV0YWlsc1xuICAgICAqIEBwYXJhbSB7R3JvdXBIZWFkaW5nW119IGdyb3VwSGVhZGluZ3MgLSBTZWUgdGhpcy5ncm91cEhlYWRpbmdzIGZvciBkZXRhaWxzXG4gICAgICogQHBhcmFtIHRhc2tzIHtUYXNrW119IC0gU2VlIHRoaXMudGFza3MgZm9yIGRldGFpbHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihncm91cHM6IHN0cmluZ1tdLCBncm91cEhlYWRpbmdzOiBHcm91cEhlYWRpbmdbXSwgdGFza3M6IFRhc2tbXSkge1xuICAgICAgICB0aGlzLmdyb3VwcyA9IGdyb3VwcztcbiAgICAgICAgdGhpcy5ncm91cEhlYWRpbmdzID0gZ3JvdXBIZWFkaW5ncztcbiAgICAgICAgdGhpcy50YXNrcyA9IHRhc2tzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbWFya2Rvd24tZm9ybWF0IHJlcHJlc2VudGF0aW9uIG9mIGFsbCB0aGUgdGFza3MgaW4gdGhpcyBncm91cC5cbiAgICAgKlxuICAgICAqIFVzZWZ1bCBmb3IgdGVzdGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdGFza3NBc1N0cmluZ09mTGluZXMoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG91dHB1dCA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy50YXNrcykge1xuICAgICAgICAgICAgb3V0cHV0ICs9IHRhc2sudG9GaWxlTGluZVN0cmluZygpICsgJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdGFzayBncm91cCwgaW5jbHVkaW5nIG5hbWVzXG4gICAgICogYW5kIGhlYWRpbmdzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIHVzZWQgaW4gc25hcHNob3QgdGVzdGluZywgc28gaWYgdGhlIGZvcm1hdCBpc1xuICAgICAqIGNoYW5nZWQsIHRoZSBzbmFwc2hvdHMgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQuXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBvdXRwdXQgPSAnXFxuJztcbiAgICAgICAgb3V0cHV0ICs9IGBHcm91cCBuYW1lczogWyR7dGhpcy5ncm91cHN9XVxcbmA7XG5cbiAgICAgICAgZm9yIChjb25zdCBoZWFkaW5nIG9mIHRoaXMuZ3JvdXBIZWFkaW5ncykge1xuICAgICAgICAgICAgLy8gVGhlc2UgaGVhZGluZ3MgbWltaWMgdGhlIGJlaGF2aW91ciBvZiBRdWVyeVJlbmRlcmVyLFxuICAgICAgICAgICAgLy8gd2hpY2ggdXNlcyAnaDQnLCAnaDUnIGFuZCAnaDYnIGZvciBuZXN0ZWQgZ3JvdXBzLlxuICAgICAgICAgICAgY29uc3QgaGVhZGluZ1ByZWZpeCA9ICcjJy5yZXBlYXQoNCArIGhlYWRpbmcubmVzdGluZ0xldmVsKTtcbiAgICAgICAgICAgIG91dHB1dCArPSBgJHtoZWFkaW5nUHJlZml4fSAke2hlYWRpbmcubmFtZX1cXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0ICs9IHRoaXMudGFza3NBc1N0cmluZ09mTGluZXMoKTtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IEdyb3VwZXIgfSBmcm9tICcuL0dyb3VwZXInO1xuaW1wb3J0IHsgR3JvdXBIZWFkaW5ncyB9IGZyb20gJy4vR3JvdXBIZWFkaW5ncyc7XG5pbXBvcnQgeyBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzIH0gZnJvbSAnLi9JbnRlcm1lZGlhdGVUYXNrR3JvdXBzJztcbmltcG9ydCB7IFRhc2tHcm91cCB9IGZyb20gJy4vVGFza0dyb3VwJztcblxuLyoqXG4gKiBUYXNrR3JvdXAgc3RvcmVzIGFsbCB0aGUgZ3JvdXBzIG9mIHRhc2tzIGdlbmVyYXRlZCBieSBhbnkgJ2dyb3VwIGJ5J1xuICogaW5zdHJ1Y3Rpb25zIGluIHRoZSB0YXNrIGJsb2NrLlxuICovXG5leHBvcnQgY2xhc3MgVGFza0dyb3VwcyB7XG4gICAgcHJpdmF0ZSBfZ3JvdXBzOiBUYXNrR3JvdXBbXSA9IG5ldyBBcnJheTxUYXNrR3JvdXA+KCk7XG4gICAgcHJpdmF0ZSBfdG90YWxUYXNrQ291bnQgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IgZm9yIFRhc2tHcm91cHNcbiAgICAgKiBAcGFyYW0ge0dyb3VwZXJbXX0gZ3JvdXBzIC0gMCBvciBtb3JlIEdyb3VwaW5nIHZhbHVlcyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgcGVyICdncm91cCBieScgbGluZSBpbiB0aGUgdGFzayBxdWVyeSBibG9ja1xuICAgICAqIEBwYXJhbSB7VGFza1tdfSB0YXNrcyAtIDAgbW9yZSBtb3JlIFRhc2sgb2JqZWN0cywgd2l0aCBhbGwgdGhlIHRhc2tzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcgdGhlIHF1ZXJ5LCBhbHJlYWR5IGluIHNvcnQgb3JkZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihncm91cHM6IEdyb3VwZXJbXSwgdGFza3M6IFRhc2tbXSkge1xuICAgICAgICAvLyBHcm91cGluZyBkb2Vzbid0IGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRhc2tzLCBhbmQgYWxsIHRoZSB0YXNrc1xuICAgICAgICAvLyB3aWxsIGJlIHNob3duIGluIGF0IGxlYXN0IG9uZSBncm91cC5cbiAgICAgICAgdGhpcy5fdG90YWxUYXNrQ291bnQgPSB0YXNrcy5sZW5ndGg7XG5cbiAgICAgICAgY29uc3QgaW5pdGlhbEdyb3VwcyA9IG5ldyBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzKGdyb3VwcywgdGFza3MpO1xuICAgICAgICB0aGlzLmFkZFRhc2tzKGluaXRpYWxHcm91cHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsbCB0aGUgdGFza3MgbWF0Y2hpbmcgdGhlIHF1ZXJ5LCBncm91cGVkIHRvZ2V0aGVyLCBhbmQgaW4gdGhlIG9yZGVyXG4gICAgICogdGhhdCB0aGV5IHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBncm91cHMoKTogVGFza0dyb3VwW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdGFza3MgbWF0Y2hpbmcgdGhlIHF1ZXJ5LlxuICAgICAqL1xuICAgIHB1YmxpYyB0b3RhbFRhc2tzQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b3RhbFRhc2tDb3VudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGFsbCB0aGUgdGFzayBncm91cHMuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyB1c2VkIGluIHNuYXBzaG90IHRlc3RpbmcsIHNvIGlmIHRoZSBmb3JtYXQgaXNcbiAgICAgKiBjaGFuZ2VkLCB0aGUgc25hcHNob3RzIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgdGFza0dyb3VwIG9mIHRoaXMuZ3JvdXBzKSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gdGFza0dyb3VwLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBvdXRwdXQgKz0gJ1xcbi0tLVxcbic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWxUYXNrc0NvdW50ID0gdGhpcy50b3RhbFRhc2tzQ291bnQoKTtcbiAgICAgICAgb3V0cHV0ICs9IGBcXG4ke3RvdGFsVGFza3NDb3VudH0gdGFza3NcXG5gO1xuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVGFza3MoaW5pdGlhbEdyb3VwczogSW50ZXJtZWRpYXRlVGFza0dyb3Vwcykge1xuICAgICAgICAvLyBHZXQgdGhlIGhlYWRpbmdzXG4gICAgICAgIGNvbnN0IGdyb3VwZXIgPSBuZXcgR3JvdXBIZWFkaW5ncyhpbml0aWFsR3JvdXBzLmdyb3Vwcyk7XG5cbiAgICAgICAgLy8gQnVpbGQgYSBjb250YWluZXIgb2YgYWxsIHRoZSBncm91cHNcbiAgICAgICAgZm9yIChjb25zdCBbZ3JvdXBzLCB0YXNrc10gb2YgaW5pdGlhbEdyb3Vwcy5ncm91cHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwSGVhZGluZ3MgPSBncm91cGVyLmdldEhlYWRpbmdzRm9yVGFza0dyb3VwKGdyb3Vwcyk7XG4gICAgICAgICAgICBjb25zdCB0YXNrR3JvdXAgPSBuZXcgVGFza0dyb3VwKGdyb3VwcywgZ3JvdXBIZWFkaW5ncywgdGFza3MpO1xuICAgICAgICAgICAgdGhpcy5hZGQodGFza0dyb3VwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkKHRhc2tHcm91cDogVGFza0dyb3VwKSB7XG4gICAgICAgIHRoaXMuX2dyb3Vwcy5wdXNoKHRhc2tHcm91cCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uL1Rhc2snO1xuaW1wb3J0IHsgUHJpb3JpdHkgfSBmcm9tICcuLi9UYXNrJztcbmltcG9ydCB7IFRhc2tHcm91cHMgfSBmcm9tICcuL1Rhc2tHcm91cHMnO1xuaW1wb3J0IHsgSGFwcGVuc0RhdGVGaWVsZCB9IGZyb20gJy4vRmlsdGVyL0hhcHBlbnNEYXRlRmllbGQnO1xuaW1wb3J0IHsgR3JvdXBlciB9IGZyb20gJy4vR3JvdXBlcic7XG5pbXBvcnQgdHlwZSB7IEdyb3VwZXJGdW5jdGlvbiwgR3JvdXBpbmdQcm9wZXJ0eSB9IGZyb20gJy4vR3JvdXBlcic7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlICdncm91cCBieScgaW5zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBHcm91cCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZ3JvdXBEYXRlRm9ybWF0ID0gJ1lZWVktTU0tREQgZGRkZCc7XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21Hcm91cGluZ1Byb3BlcnR5KHByb3BlcnR5OiBHcm91cGluZ1Byb3BlcnR5KTogR3JvdXBlciB7XG4gICAgICAgIHJldHVybiBuZXcgR3JvdXBlcihwcm9wZXJ0eSwgR3JvdXAuZ3JvdXBlckZvclByb3BlcnR5KHByb3BlcnR5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR3JvdXAgYSBsaXN0IG9mIHRhc2tzLCBhY2NvcmRpbmcgdG8gb25lIG9yIG1vcmUgdGFzayBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIGdyb3VwaW5nIDAgb3IgbW9yZSBHcm91cGluZyB2YWx1ZXMsIG9uZSBwZXIgJ2dyb3VwIGJ5JyBsaW5lXG4gICAgICogQHBhcmFtIHRhc2tzIFRoZSB0YXNrcyB0aGF0IG1hdGNoIHRoZSB0YXNrIGJsb2NrJ3MgUXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGJ5KGdyb3VwaW5nOiBHcm91cGVyW10sIHRhc2tzOiBUYXNrW10pOiBUYXNrR3JvdXBzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYXNrR3JvdXBzKGdyb3VwaW5nLCB0YXNrcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9mIGEgc2luZ2xlIHRhc2sgZm9yIHRoZSBwYXNzZWQgZ3JvdXBpbmcgcHJvcGVydHlcbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCBzdHJpbmcgd2lsbCBiZSByZW5kZXJlZCwgc28gYW55IHNwZWNpYWwgTWFya2Rvd24gY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cGluZ1xuICAgICAqIEBwYXJhbSB0YXNrXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRHcm91cE5hbWVzRm9yVGFzayhncm91cGluZzogR3JvdXBlciwgdGFzazogVGFzayk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwaW5nLmdyb3VwZXIodGFzayk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBncm91cGVyRm9yUHJvcGVydHkocHJvcGVydHk6IEdyb3VwaW5nUHJvcGVydHkpOiBHcm91cGVyRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gR3JvdXAuZ3JvdXBlcnNbcHJvcGVydHldO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdyb3VwZXJzOiBSZWNvcmQ8R3JvdXBpbmdQcm9wZXJ0eSwgR3JvdXBlckZ1bmN0aW9uPiA9IHtcbiAgICAgICAgYmFja2xpbms6IEdyb3VwLmdyb3VwQnlCYWNrbGluayxcbiAgICAgICAgZG9uZTogR3JvdXAuZ3JvdXBCeURvbmVEYXRlLFxuICAgICAgICBkdWU6IEdyb3VwLmdyb3VwQnlEdWVEYXRlLFxuICAgICAgICBmaWxlbmFtZTogR3JvdXAuZ3JvdXBCeUZpbGVOYW1lLFxuICAgICAgICBmb2xkZXI6IEdyb3VwLmdyb3VwQnlGb2xkZXIsXG4gICAgICAgIGhhcHBlbnM6IEdyb3VwLmdyb3VwQnlIYXBwZW5zRGF0ZSxcbiAgICAgICAgaGVhZGluZzogR3JvdXAuZ3JvdXBCeUhlYWRpbmcsXG4gICAgICAgIHBhdGg6IEdyb3VwLmdyb3VwQnlQYXRoLFxuICAgICAgICBwcmlvcml0eTogR3JvdXAuZ3JvdXBCeVByaW9yaXR5LFxuICAgICAgICByZWN1cnJlbmNlOiBHcm91cC5ncm91cEJ5UmVjdXJyZW5jZSxcbiAgICAgICAgcmVjdXJyaW5nOiBHcm91cC5ncm91cEJ5UmVjdXJyaW5nLFxuICAgICAgICByb290OiBHcm91cC5ncm91cEJ5Um9vdCxcbiAgICAgICAgc2NoZWR1bGVkOiBHcm91cC5ncm91cEJ5U2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgc3RhcnQ6IEdyb3VwLmdyb3VwQnlTdGFydERhdGUsXG4gICAgICAgIHN0YXR1czogR3JvdXAuZ3JvdXBCeVN0YXR1cyxcbiAgICAgICAgdGFnczogR3JvdXAuZ3JvdXBCeVRhZ3MsXG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhdGljIGVzY2FwZU1hcmtkb3duQ2hhcmFjdGVycyhmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vd2lsc29ubWFyLmdpdGh1Yi5pby9tYXJrZG93bi10ZXh0LWZvci1naXRodWItZnJvbS1odG1sLyNzcGVjaWFsLWNoYXJhY3RlcnNcbiAgICAgICAgcmV0dXJuIGZpbGVuYW1lLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvXy9nLCAnXFxcXF8nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBncm91cEJ5UHJpb3JpdHkodGFzazogVGFzayk6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHByaW9yaXR5TmFtZSA9ICdFUlJPUic7XG4gICAgICAgIHN3aXRjaCAodGFzay5wcmlvcml0eSkge1xuICAgICAgICAgICAgY2FzZSBQcmlvcml0eS5IaWdoOlxuICAgICAgICAgICAgICAgIHByaW9yaXR5TmFtZSA9ICdIaWdoJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUHJpb3JpdHkuTWVkaXVtOlxuICAgICAgICAgICAgICAgIHByaW9yaXR5TmFtZSA9ICdNZWRpdW0nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQcmlvcml0eS5Ob25lOlxuICAgICAgICAgICAgICAgIHByaW9yaXR5TmFtZSA9ICdOb25lJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUHJpb3JpdHkuTG93OlxuICAgICAgICAgICAgICAgIHByaW9yaXR5TmFtZSA9ICdMb3cnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbYFByaW9yaXR5ICR7dGFzay5wcmlvcml0eX06ICR7cHJpb3JpdHlOYW1lfWBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdyb3VwQnlSZWN1cnJlbmNlKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICh0YXNrLnJlY3VycmVuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGFzay5yZWN1cnJlbmNlIS50b1RleHQoKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gWydOb25lJ107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBncm91cEJ5UmVjdXJyaW5nKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICh0YXNrLnJlY3VycmVuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbJ1JlY3VycmluZyddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFsnTm90IFJlY3VycmluZyddO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeVN0YXJ0RGF0ZSh0YXNrOiBUYXNrKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gW0dyb3VwLnN0cmluZ0Zyb21EYXRlKHRhc2suc3RhcnREYXRlLCAnc3RhcnQnKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeVNjaGVkdWxlZERhdGUodGFzazogVGFzayk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFtHcm91cC5zdHJpbmdGcm9tRGF0ZSh0YXNrLnNjaGVkdWxlZERhdGUsICdzY2hlZHVsZWQnKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeUR1ZURhdGUodGFzazogVGFzayk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFtHcm91cC5zdHJpbmdGcm9tRGF0ZSh0YXNrLmR1ZURhdGUsICdkdWUnKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeURvbmVEYXRlKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBbR3JvdXAuc3RyaW5nRnJvbURhdGUodGFzay5kb25lRGF0ZSwgJ2RvbmUnKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeUhhcHBlbnNEYXRlKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGVhcmxpZXN0RGF0ZUlmQW55ID0gbmV3IEhhcHBlbnNEYXRlRmllbGQoKS5lYXJsaWVzdERhdGUodGFzayk7XG4gICAgICAgIHJldHVybiBbR3JvdXAuc3RyaW5nRnJvbURhdGUoZWFybGllc3REYXRlSWZBbnksICdoYXBwZW5zJyldO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ0Zyb21EYXRlKGRhdGU6IG1vbWVudC5Nb21lbnQgfCBudWxsLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnTm8gJyArIGZpZWxkICsgJyBkYXRlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZS5mb3JtYXQoR3JvdXAuZ3JvdXBEYXRlRm9ybWF0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBncm91cEJ5UGF0aCh0YXNrOiBUYXNrKTogc3RyaW5nW10ge1xuICAgICAgICAvLyBEb2VzIHRoaXMgbmVlZCB0byBiZSBtYWRlIHN0cmljdGVyP1xuICAgICAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgb2YgZ2V0dGluZyB0aGUgZmlsZSBuYW1lP1xuICAgICAgICByZXR1cm4gW0dyb3VwLmVzY2FwZU1hcmtkb3duQ2hhcmFjdGVycyh0YXNrLnBhdGgucmVwbGFjZSgnLm1kJywgJycpKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeUZvbGRlcih0YXNrOiBUYXNrKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBwYXRoID0gdGFzay5wYXRoO1xuICAgICAgICBjb25zdCBmaWxlTmFtZVdpdGhFeHRlbnNpb24gPSB0YXNrLmZpbGVuYW1lICsgJy5tZCc7XG4gICAgICAgIGNvbnN0IGZvbGRlciA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoZmlsZU5hbWVXaXRoRXh0ZW5zaW9uKSk7XG4gICAgICAgIGlmIChmb2xkZXIgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gWycvJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtHcm91cC5lc2NhcGVNYXJrZG93bkNoYXJhY3RlcnMoZm9sZGVyKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeUZpbGVOYW1lKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIC8vIE5vdGUgY3VycmVudCBsaW1pdGF0aW9uOiBUYXNrcyBmcm9tIGRpZmZlcmVudCBub3RlcyB3aXRoIHRoZVxuICAgICAgICAvLyBzYW1lIG5hbWUgd2lsbCBiZSBncm91cGVkIHRvZ2V0aGVyLCBldmVuIHRob3VnaCB0aGV5IGFyZSBpblxuICAgICAgICAvLyBkaWZmZXJlbnQgZmlsZXMgYW5kIHRoZWlyIGxpbmtzIHdpbGwgbG9vayBkaWZmZXJlbnQuXG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGFzay5maWxlbmFtZTtcbiAgICAgICAgaWYgKGZpbGVuYW1lID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gWydVbmtub3duIExvY2F0aW9uJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFsnW1snICsgR3JvdXAuZXNjYXBlTWFya2Rvd25DaGFyYWN0ZXJzKGZpbGVuYW1lKSArICddXSddO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdyb3VwQnlSb290KHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSB0YXNrLnBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHBhdGguaW5kZXhPZignLycpO1xuICAgICAgICBpZiAoc2VwYXJhdG9ySW5kZXggPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBbJy8nXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW0dyb3VwLmVzY2FwZU1hcmtkb3duQ2hhcmFjdGVycyhwYXRoLnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCArIDEpKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeUJhY2tsaW5rKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGxpbmtUZXh0ID0gdGFzay5nZXRMaW5rVGV4dCh7IGlzRmlsZW5hbWVVbmlxdWU6IHRydWUgfSk7XG4gICAgICAgIGlmIChsaW5rVGV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFsnVW5rbm93biBMb2NhdGlvbiddO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZpbGVuYW1lQ29tcG9uZW50ID0gJ1Vua25vd24gTG9jYXRpb24nO1xuXG4gICAgICAgIGlmICh0YXNrLmZpbGVuYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBNYXJrZG93biBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlIG5hbWUgbXVzdCBiZSBlc2NhcGVkLlxuICAgICAgICAgICAgZmlsZW5hbWVDb21wb25lbnQgPSBHcm91cC5lc2NhcGVNYXJrZG93bkNoYXJhY3RlcnModGFzay5maWxlbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzay5wcmVjZWRpbmdIZWFkZXIgPT09IG51bGwgfHwgdGFzay5wcmVjZWRpbmdIZWFkZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW2ZpbGVuYW1lQ29tcG9uZW50XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmtkb3duIGNoYXJhY3RlcnMgaW4gdGhlIGhlYWRpbmcgbXVzdCBOT1QgYmUgZXNjYXBlZC5cbiAgICAgICAgY29uc3QgaGVhZGluZ0NvbXBvbmVudCA9IEdyb3VwLmdyb3VwQnlIZWFkaW5nKHRhc2spWzBdO1xuXG4gICAgICAgIGlmIChmaWxlbmFtZUNvbXBvbmVudCA9PT0gaGVhZGluZ0NvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFtmaWxlbmFtZUNvbXBvbmVudF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW2Ake2ZpbGVuYW1lQ29tcG9uZW50fSA+ICR7aGVhZGluZ0NvbXBvbmVudH1gXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdyb3VwQnlTdGF0dXModGFzazogVGFzayk6IHN0cmluZ1tdIHtcbiAgICAgICAgLy8gQmFja3dhcmRzLWNvbXBhdGliaWxpdHkgbm90ZTogSW4gVGFza3MgMS4yMi4wIGFuZCBlYXJsaWVyLCB0aGUgb25seVxuICAgICAgICAvLyBuYW1lcyB1c2VkIGJ5ICdncm91cCBieSBzdGF0dXMnIHdlcmUgJ1RvZG8nIGFuZCAnRG9uZScgLSBhbmRcbiAgICAgICAgLy8gYW55IGNoYXJhY3RlciBvdGhlciB0aGFuIGEgc3BhY2Ugd2FzIGNvbnNpZGVyZWQgdG8gYmUgJ0RvbmUnLlxuICAgICAgICBpZiAodGFzay5zdGF0dXMuc3ltYm9sID09PSAnICcpIHtcbiAgICAgICAgICAgIHJldHVybiBbJ1RvZG8nXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbJ0RvbmUnXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdyb3VwQnlIZWFkaW5nKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICh0YXNrLnByZWNlZGluZ0hlYWRlciA9PT0gbnVsbCB8fCB0YXNrLnByZWNlZGluZ0hlYWRlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbJyhObyBoZWFkaW5nKSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGFzay5wcmVjZWRpbmdIZWFkZXJdO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdyb3VwQnlUYWdzKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICh0YXNrLnRhZ3MubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbJyhObyB0YWdzKSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXNrLnRhZ3M7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IExheW91dE9wdGlvbnMgfSBmcm9tICcuLi9UYXNrTGF5b3V0JztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uL1Rhc2snO1xuaW1wb3J0IHR5cGUgeyBJUXVlcnkgfSBmcm9tICcuLi9JUXVlcnknO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuLi9Db25maWcvU2V0dGluZ3MnO1xuaW1wb3J0IHsgU29ydCB9IGZyb20gJy4vU29ydCc7XG5pbXBvcnQgdHlwZSB7IFNvcnRlciB9IGZyb20gJy4vU29ydGVyJztcbmltcG9ydCB0eXBlIHsgVGFza0dyb3VwcyB9IGZyb20gJy4vVGFza0dyb3Vwcyc7XG5pbXBvcnQgKiBhcyBGaWx0ZXJQYXJzZXIgZnJvbSAnLi9GaWx0ZXJQYXJzZXInO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICcuL0dyb3VwJztcbmltcG9ydCB0eXBlIHsgR3JvdXBlciB9IGZyb20gJy4vR3JvdXBlcic7XG5pbXBvcnQgdHlwZSB7IEdyb3VwaW5nUHJvcGVydHkgfSBmcm9tICcuL0dyb3VwZXInO1xuaW1wb3J0IHR5cGUgeyBGaWx0ZXIgfSBmcm9tICcuL0ZpbHRlci9GaWx0ZXInO1xuXG5leHBvcnQgY2xhc3MgUXVlcnkgaW1wbGVtZW50cyBJUXVlcnkge1xuICAgIHB1YmxpYyBzb3VyY2U6IHN0cmluZztcblxuICAgIHByaXZhdGUgX2xpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBfbGF5b3V0T3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IG5ldyBMYXlvdXRPcHRpb25zKCk7XG4gICAgcHJpdmF0ZSBfZmlsdGVyczogRmlsdGVyW10gPSBbXTtcbiAgICBwcml2YXRlIF9lcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgX3NvcnRpbmc6IFNvcnRlcltdID0gW107XG4gICAgcHJpdmF0ZSBfZ3JvdXBpbmc6IEdyb3VwZXJbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBncm91cEJ5UmVnZXhwID1cbiAgICAgICAgL15ncm91cCBieSAoYmFja2xpbmt8ZG9uZXxkdWV8ZmlsZW5hbWV8Zm9sZGVyfGhhcHBlbnN8aGVhZGluZ3xwYXRofHByaW9yaXR5fHJlY3VycmVuY2V8cmVjdXJyaW5nfHJvb3R8c2NoZWR1bGVkfHN0YXJ0fHN0YXR1c3x0YWdzKS87XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhpZGVPcHRpb25zUmVnZXhwID1cbiAgICAgICAgL14oaGlkZXxzaG93KSAodGFzayBjb3VudHxiYWNrbGlua3xwcmlvcml0eXxzdGFydCBkYXRlfHNjaGVkdWxlZCBkYXRlfGRvbmUgZGF0ZXxkdWUgZGF0ZXxyZWN1cnJlbmNlIHJ1bGV8ZWRpdCBidXR0b258dXJnZW5jeSkvO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2hvcnRNb2RlUmVnZXhwID0gL15zaG9ydC87XG4gICAgcHJpdmF0ZSByZWFkb25seSBleHBsYWluUXVlcnlSZWdleHAgPSAvXmV4cGxhaW4vO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBsaW1pdFJlZ2V4cCA9IC9ebGltaXQgKHRvICk/KFxcZCspKCB0YXNrcz8pPy87XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1lbnRSZWdleHAgPSAvXiMuKi87XG5cbiAgICBjb25zdHJ1Y3Rvcih7IHNvdXJjZSB9OiB7IHNvdXJjZTogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgLm1hcCgobGluZTogc3RyaW5nKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAgICAgICAgIC5mb3JFYWNoKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBsaW5lID09PSAnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuc2hvcnRNb2RlUmVnZXhwLnRlc3QobGluZSk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRPcHRpb25zLnNob3J0TW9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLmV4cGxhaW5RdWVyeVJlZ2V4cC50ZXN0KGxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5leHBsYWluUXVlcnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5saW1pdFJlZ2V4cC50ZXN0KGxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUxpbWl0KHsgbGluZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMucGFyc2VTb3J0QnkoeyBsaW5lIH0pOlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5wYXJzZUdyb3VwQnkyKHsgbGluZSB9KTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuZ3JvdXBCeVJlZ2V4cC50ZXN0KGxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUdyb3VwQnkoeyBsaW5lIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5oaWRlT3B0aW9uc1JlZ2V4cC50ZXN0KGxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUhpZGVPcHRpb25zKHsgbGluZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuY29tbWVudFJlZ2V4cC50ZXN0KGxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tbWVudCBsaW5lcyBhcmUgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5wYXJzZUZpbHRlcihsaW5lKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSBgZG8gbm90IHVuZGVyc3RhbmQgcXVlcnk6ICR7bGluZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBleHBsYWluUXVlcnkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdFeHBsYW5hdGlvbiBvZiB0aGlzIFRhc2tzIGNvZGUgYmxvY2sgcXVlcnk6XFxuXFxuJyArIHRoaXMuZXhwbGFpblF1ZXJ5V2l0aG91dEludHJvZHVjdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBleHBsYWluUXVlcnlXaXRob3V0SW50cm9kdWN0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcblxuICAgICAgICBjb25zdCB7IGdsb2JhbEZpbHRlciB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgaWYgKGdsb2JhbEZpbHRlci5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgT25seSB0YXNrcyBjb250YWluaW5nIHRoZSBnbG9iYWwgZmlsdGVyICcke2dsb2JhbEZpbHRlcn0nLlxcblxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBudW1iZXJPZkZpbHRlcnMgPSB0aGlzLmZpbHRlcnMubGVuZ3RoO1xuICAgICAgICBpZiAobnVtYmVyT2ZGaWx0ZXJzID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJ05vIGZpbHRlcnMgc3VwcGxpZWQuIEFsbCB0YXNrcyB3aWxsIG1hdGNoIHRoZSBxdWVyeS4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZkZpbHRlcnM7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpID4gMCkgcmVzdWx0ICs9ICdcXG4nO1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLmZpbHRlcnNbaV0uZXhwbGFpbkZpbHRlckluZGVudGVkKCcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gYFxcblxcbkF0IG1vc3QgJHt0aGlzLl9saW1pdH0gdGFza2A7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGltaXQgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3MnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ICs9ICcuXFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsaW1pdCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGltaXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsYXlvdXRPcHRpb25zKCk6IExheW91dE9wdGlvbnMge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5b3V0T3B0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcnMoKTogRmlsdGVyW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvcnRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0aW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ3JvdXBpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVycm9yKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXBwbHlRdWVyeVRvVGFza3ModGFza3M6IFRhc2tbXSk6IFRhc2tHcm91cHMge1xuICAgICAgICB0aGlzLmZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICAgICAgICB0YXNrcyA9IHRhc2tzLmZpbHRlcihmaWx0ZXIuZmlsdGVyRnVuY3Rpb24pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0YXNrc1NvcnRlZExpbWl0ZWQgPSBTb3J0LmJ5KHRoaXMuc29ydGluZywgdGFza3MpLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuICAgICAgICByZXR1cm4gR3JvdXAuYnkodGhpcy5ncm91cGluZywgdGFza3NTb3J0ZWRMaW1pdGVkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlSGlkZU9wdGlvbnMoeyBsaW5lIH06IHsgbGluZTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGlkZU9wdGlvbnNNYXRjaCA9IGxpbmUubWF0Y2godGhpcy5oaWRlT3B0aW9uc1JlZ2V4cCk7XG4gICAgICAgIGlmIChoaWRlT3B0aW9uc01hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBoaWRlID0gaGlkZU9wdGlvbnNNYXRjaFsxXSA9PT0gJ2hpZGUnO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gaGlkZU9wdGlvbnNNYXRjaFsyXTtcblxuICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICAgICAgICBjYXNlICd0YXNrIGNvdW50JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlVGFza0NvdW50ID0gaGlkZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYmFja2xpbmsnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRPcHRpb25zLmhpZGVCYWNrbGlua3MgPSBoaWRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdwcmlvcml0eSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE9wdGlvbnMuaGlkZVByaW9yaXR5ID0gaGlkZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RhcnQgZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE9wdGlvbnMuaGlkZVN0YXJ0RGF0ZSA9IGhpZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NjaGVkdWxlZCBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlU2NoZWR1bGVkRGF0ZSA9IGhpZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2R1ZSBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlRHVlRGF0ZSA9IGhpZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvbmUgZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE9wdGlvbnMuaGlkZURvbmVEYXRlID0gaGlkZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncmVjdXJyZW5jZSBydWxlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlUmVjdXJyZW5jZVJ1bGUgPSBoaWRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlZGl0IGJ1dHRvbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE9wdGlvbnMuaGlkZUVkaXRCdXR0b24gPSBoaWRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd1cmdlbmN5JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlVXJnZW5jeSA9IGhpZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIGhpZGUvc2hvdyBvcHRpb24nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZUZpbHRlcihsaW5lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyT3JFcnJvciA9IEZpbHRlclBhcnNlci5wYXJzZUZpbHRlcihsaW5lKTtcbiAgICAgICAgaWYgKGZpbHRlck9yRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGZpbHRlck9yRXJyb3IuZmlsdGVyKSB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyT3JFcnJvci5maWx0ZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLl9lcnJvciA9IGZpbHRlck9yRXJyb3IuZXJyb3I7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZUxpbWl0KHsgbGluZSB9OiB7IGxpbmU6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpbWl0TWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMubGltaXRSZWdleHApO1xuICAgICAgICBpZiAobGltaXRNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gbGltaXRNYXRjaFsyXSBpcyBwZXIgcmVnZXggYWx3YXlzIGRpZ2l0cyBhbmQgdGhlcmVmb3JlIHBhcnNhYmxlLlxuICAgICAgICAgICAgdGhpcy5fbGltaXQgPSBOdW1iZXIucGFyc2VJbnQobGltaXRNYXRjaFsyXSwgMTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSAnZG8gbm90IHVuZGVyc3RhbmQgcXVlcnkgbGltaXQnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZVNvcnRCeSh7IGxpbmUgfTogeyBsaW5lOiBzdHJpbmcgfSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzb3J0aW5nTWF5YmUgPSBGaWx0ZXJQYXJzZXIucGFyc2VTb3J0ZXIobGluZSk7XG4gICAgICAgIGlmIChzb3J0aW5nTWF5YmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvcnRpbmcucHVzaChzb3J0aW5nTWF5YmUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9sZC1zdHlsZSBwYXJzaW5nIG9mIGBncm91cCBieWAgbGluZXMsIGZvciBncm91cGluZyB0aGF0IGlzIGltcGxlbWVudGVkIHdpdGggc3RhdGljXG4gICAgICogbWV0aG9kcyBpbiB7QGxpbmsgR3JvdXB9LCB0aGF0IGFyZSBsb29rZWQgdXAgZnJvbSBhIHtAbGluayBHcm91cGluZ1Byb3BlcnR5fS5cbiAgICAgKlxuICAgICAqIFRoZXNlIHdpbGwgYmUgZ3JhZHVhbGx5IG1pZ3JhdGVkIHRvIHRoZSBncm91cGluZyBtZXRob2QgaW4ge0BsaW5rIEZpZWxkfVxuICAgICAqIGNsYXNzZXMsIGFmdGVyIHdoaWNoIHRoaXMgbWV0aG9kIHdpbGwgYmUgZGVsZXRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaW5lXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAc2VlIHBhcnNlR3JvdXBCeTJcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlR3JvdXBCeSh7IGxpbmUgfTogeyBsaW5lOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZE1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmdyb3VwQnlSZWdleHApO1xuICAgICAgICBpZiAoZmllbGRNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fZ3JvdXBpbmcucHVzaChHcm91cC5mcm9tR3JvdXBpbmdQcm9wZXJ0eShmaWVsZE1hdGNoWzFdIGFzIEdyb3VwaW5nUHJvcGVydHkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIHF1ZXJ5IGdyb3VwaW5nJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5ldy1zdHlsZSBwYXJzaW5nIG9mIGBncm91cCBieWAgbGluZXMsIGZvciBncm91cGluZyB0aGF0IGlzIGltcGxlbWVudGVkIGluIHRoZSB7QGxpbmsgRmllbGR9XG4gICAgICogY2xhc3Nlcy5cbiAgICAgKlxuICAgICAqIE9uY2UgdGhlIG9yaWdpbmFsIHtAbGluayBwYXJzZUdyb3VwQnl9IGhhcyBiZWVuIHJlbW92ZWQsIHJlbmFtZSB0aGlzIHRvIHBhcnNlR3JvdXBCeSgpXG4gICAgICogQHBhcmFtIGxpbmVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBzZWUgcGFyc2VHcm91cEJ5XG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZUdyb3VwQnkyKHsgbGluZSB9OiB7IGxpbmU6IHN0cmluZyB9KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGdyb3VwaW5nTWF5YmUgPSBGaWx0ZXJQYXJzZXIucGFyc2VHcm91cGVyKGxpbmUpO1xuICAgICAgICBpZiAoZ3JvdXBpbmdNYXliZSkge1xuICAgICAgICAgICAgdGhpcy5fZ3JvdXBpbmcucHVzaChncm91cGluZ01heWJlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTm90aWNlLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBkZWJvdW5jZSB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IFN0YXR1c0NvbmZpZ3VyYXRpb24sIFN0YXR1c1R5cGUgfSBmcm9tICcuLi9TdGF0dXNDb25maWd1cmF0aW9uJztcbmltcG9ydCB0eXBlIFRhc2tzUGx1Z2luIGZyb20gJy4uL21haW4nO1xuaW1wb3J0IHsgU3RhdHVzUmVnaXN0cnkgfSBmcm9tICcuLi9TdGF0dXNSZWdpc3RyeSc7XG5pbXBvcnQgeyBTdGF0dXMgfSBmcm9tICcuLi9TdGF0dXMnO1xuaW1wb3J0IHR5cGUgeyBTdGF0dXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vU3RhdHVzQ29sbGVjdGlvbic7XG5pbXBvcnQgKiBhcyBUaGVtZXMgZnJvbSAnLi9UaGVtZXMnO1xuaW1wb3J0IHR5cGUgeyBIZWFkaW5nU3RhdGUgfSBmcm9tICcuL1NldHRpbmdzJztcbmltcG9ydCB7IGdldFNldHRpbmdzLCBpc0ZlYXR1cmVFbmFibGVkLCB1cGRhdGVHZW5lcmFsU2V0dGluZywgdXBkYXRlU2V0dGluZ3MgfSBmcm9tICcuL1NldHRpbmdzJztcbmltcG9ydCB7IFN0YXR1c1NldHRpbmdzIH0gZnJvbSAnLi9TdGF0dXNTZXR0aW5ncyc7XG5pbXBvcnQgc2V0dGluZ3NKc29uIGZyb20gJy4vc2V0dGluZ3NDb25maWd1cmF0aW9uLmpzb24nO1xuXG5pbXBvcnQgeyBDdXN0b21TdGF0dXNNb2RhbCB9IGZyb20gJy4vQ3VzdG9tU3RhdHVzTW9kYWwnO1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgICAvLyBJZiB0aGUgVUkgbmVlZHMgYSBtb3JlIGNvbXBsZXggc2V0dGluZyB5b3UgY2FuIGNyZWF0ZSBhXG4gICAgLy8gY3VzdG9tIGZ1bmN0aW9uIGFuZCBzcGVjaWZ5IGl0IGZyb20gdGhlIGpzb24gZmlsZS4gSXQgd2lsbFxuICAgIC8vIHRoZW4gYmUgcmVuZGVyZWQgaW5zdGVhZCBvZiBhIG5vcm1hbCBjaGVja2JveCBvciB0ZXh0IGJveC5cbiAgICBjdXN0b21GdW5jdGlvbnM6IHsgW0s6IHN0cmluZ106IEZ1bmN0aW9uIH0gPSB7XG4gICAgICAgIGluc2VydFRhc2tDb3JlU3RhdHVzU2V0dGluZ3M6IHRoaXMuaW5zZXJ0VGFza0NvcmVTdGF0dXNTZXR0aW5ncy5iaW5kKHRoaXMpLFxuICAgICAgICBpbnNlcnRDdXN0b21UYXNrU3RhdHVzU2V0dGluZ3M6IHRoaXMuaW5zZXJ0Q3VzdG9tVGFza1N0YXR1c1NldHRpbmdzLmJpbmQodGhpcyksXG4gICAgfTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luOiBUYXNrc1BsdWdpbjtcblxuICAgIGNvbnN0cnVjdG9yKHsgcGx1Z2luIH06IHsgcGx1Z2luOiBUYXNrc1BsdWdpbiB9KSB7XG4gICAgICAgIHN1cGVyKHBsdWdpbi5hcHAsIHBsdWdpbik7XG5cbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlRnJhZ21lbnRXaXRoSFRNTCA9IChodG1sOiBzdHJpbmcpID0+XG4gICAgICAgIGNyZWF0ZUZyYWdtZW50KChkb2N1bWVudEZyYWdtZW50KSA9PiAoZG9jdW1lbnRGcmFnbWVudC5jcmVhdGVEaXYoKS5pbm5lckhUTUwgPSBodG1sKSk7XG5cbiAgICBwdWJsaWMgYXN5bmMgc2F2ZVNldHRpbmdzKHVwZGF0ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cbiAgICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcGxheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuICAgICAgICBjb250YWluZXJFbC5lbXB0eSgpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmFkZENsYXNzKCd0YXNrcy1zZXR0aW5ncycpO1xuXG4gICAgICAgIC8vIEZvciByZWFzb25zIEkgZG9uJ3QgdW5kZXJzdGFuZCwgJ2gyJyBpcyB0aW55IGluIFNldHRpbmdzLFxuICAgICAgICAvLyBzbyBJIGhhdmUgdXNlZCAnaDMnIGFzIHRoZSBsYXJnZXN0IGhlYWRpbmcuXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMycsIHsgdGV4dDogJ1Rhc2tzIFNldHRpbmdzJyB9KTtcbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ3AnLCB7XG4gICAgICAgICAgICBjbHM6ICd0YXNrcy1zZXR0aW5nLWltcG9ydGFudCcsXG4gICAgICAgICAgICB0ZXh0OiAnQ2hhbmdpbmcgYW55IHNldHRpbmdzIHJlcXVpcmVzIGEgcmVzdGFydCBvZiBvYnNpZGlhbi4nLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2g0JywgeyB0ZXh0OiAnR2xvYmFsIGZpbHRlciBTZXR0aW5ncycgfSk7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0dsb2JhbCB0YXNrIGZpbHRlcicpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICBTZXR0aW5nc1RhYi5jcmVhdGVGcmFnbWVudFdpdGhIVE1MKFxuICAgICAgICAgICAgICAgICAgICAnPHA+PGI+UmVjb21tZW5kZWQ6IExlYXZlIGVtcHR5IGlmIHlvdSB3YW50IGFsbCBjaGVja2xpc3QgaXRlbXMgaW4geW91ciB2YXVsdCB0byBiZSB0YXNrcyBtYW5hZ2VkIGJ5IHRoaXMgcGx1Z2luLjwvYj48L3A+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHA+VXNlIGEgZ2xvYmFsIGZpbHRlciBpZiB5b3Ugd2FudCBUYXNrcyB0byBvbmx5IGFjdCBvbiBhIHN1YnNldCBvZiB5b3VyIFwiPGNvZGU+LSBbIF08L2NvZGU+XCIgY2hlY2tsaXN0IGl0ZW1zLCBzbyB0aGF0ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2EgY2hlY2tsaXN0IGl0ZW0gbXVzdCBpbmNsdWRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGluIGl0cyBkZXNjcmlwdGlvbiBpbiBvcmRlciB0byBiZSBjb25zaWRlcmVkIGEgdGFzay48cD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8cD5Gb3IgZXhhbXBsZSwgaWYgeW91IHNldCB0aGUgZ2xvYmFsIGZpbHRlciB0byA8Y29kZT4jdGFzazwvY29kZT4sIHRoZSBUYXNrcyBwbHVnaW4gd2lsbCBvbmx5IGhhbmRsZSBjaGVja2xpc3QgaXRlbXMgdGFnZ2VkIHdpdGggPGNvZGU+I3Rhc2s8L2NvZGU+LjwvYnI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnT3RoZXIgY2hlY2tsaXN0IGl0ZW1zIHdpbGwgcmVtYWluIG5vcm1hbCBjaGVja2xpc3QgaXRlbXMgYW5kIG5vdCBhcHBlYXIgaW4gcXVlcmllcyBvciBnZXQgYSBkb25lIGRhdGUgc2V0LjwvcD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8cD5TZWUgdGhlIDxhIGhyZWY9XCJodHRwczovL29ic2lkaWFuLXRhc2tzLWdyb3VwLmdpdGh1Yi5pby9vYnNpZGlhbi10YXNrcy9nZXR0aW5nLXN0YXJ0ZWQvZ2xvYmFsLWZpbHRlci9cIj5kb2N1bWVudGF0aW9uPC9hPi48L3A+JyxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJIHdhbnRlZCB0byBtYWtlIHRoaXMgc2F5ICdmb3IgZXhhbXBsZSwgI3Rhc2sgb3IgVE9ETydcbiAgICAgICAgICAgICAgICAvLyBidXQgd2Fzbid0IGFibGUgdG8gZmlndXJlIG91dCBob3cgdG8gbWFrZSB0aGUgdGV4dCBib3hcbiAgICAgICAgICAgICAgICAvLyB3aWRlIGVub3VnaCBmb3IgdGhlIHdob2xlIHN0cmluZyB0byBiZSB2aXNpYmxlLlxuICAgICAgICAgICAgICAgIHRleHQuc2V0UGxhY2Vob2xkZXIoJ2UuZy4gI3Rhc2sgb3IgVE9ETycpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5nbG9iYWxGaWx0ZXIpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldHRpbmdzKHsgZ2xvYmFsRmlsdGVyOiB2YWx1ZSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnUmVtb3ZlIGdsb2JhbCBmaWx0ZXIgZnJvbSBkZXNjcmlwdGlvbicpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAnRW5hYmxpbmcgdGhpcyByZW1vdmVzIHRoZSBzdHJpbmcgdGhhdCB5b3Ugc2V0IGFzIGdsb2JhbCBmaWx0ZXIgZnJvbSB0aGUgdGFzayBkZXNjcmlwdGlvbiB3aGVuIGRpc3BsYXlpbmcgYSB0YXNrLicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG5cbiAgICAgICAgICAgICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MucmVtb3ZlR2xvYmFsRmlsdGVyKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2V0dGluZ3MoeyByZW1vdmVHbG9iYWxGaWx0ZXI6IHZhbHVlIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoNCcsIHsgdGV4dDogJ1Rhc2sgU3RhdHVzZXMnIH0pO1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgICAgICBjb25zdCB7IGhlYWRpbmdPcGVuZWQgfSA9IGdldFNldHRpbmdzKCk7XG5cbiAgICAgICAgc2V0dGluZ3NKc29uLmZvckVhY2goKGhlYWRpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkT25lU2V0dGluZ3NCbG9jayhjb250YWluZXJFbCwgaGVhZGluZywgaGVhZGluZ09wZW5lZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDQnLCB7IHRleHQ6ICdEYXRlIFNldHRpbmdzJyB9KTtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnU2V0IGRvbmUgZGF0ZSBvbiBldmVyeSBjb21wbGV0ZWQgdGFzaycpXG4gICAgICAgICAgICAuc2V0RGVzYygnRW5hYmxpbmcgdGhpcyB3aWxsIGFkZCBhIHRpbWVzdGFtcCBcdTI3MDUgWVlZWS1NTS1ERCBhdCB0aGUgZW5kIHdoZW4gYSB0YXNrIGlzIHRvZ2dsZWQgdG8gZG9uZScpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnNldERvbmVEYXRlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2V0dGluZ3MoeyBzZXREb25lRGF0ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnVXNlIGZpbGVuYW1lIGFzIFNjaGVkdWxlZCBkYXRlIGZvciB1bmRhdGVkIHRhc2tzJylcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgIFNldHRpbmdzVGFiLmNyZWF0ZUZyYWdtZW50V2l0aEhUTUwoXG4gICAgICAgICAgICAgICAgICAgICdTYXZlIHRpbWUgZW50ZXJpbmcgU2NoZWR1bGVkIChcdTIzRjMpIGRhdGVzLjwvYnI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgYW55IHVuZGF0ZWQgdGFza3Mgd2lsbCBiZSBnaXZlbiBhIGRlZmF1bHQgU2NoZWR1bGVkIGRhdGUgZXh0cmFjdGVkIGZyb20gdGhlaXIgZmlsZSBuYW1lLjwvYnI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGRhdGUgaW4gdGhlIGZpbGUgbmFtZSBtdXN0IGJlIGluIG9uZSBvZiA8Y29kZT5ZWVlZLU1NLUREPC9jb2RlPiBvciA8Y29kZT5ZWVlZTU1ERDwvY29kZT4gZm9ybWF0cy48L2JyPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZGF0ZWQgdGFza3MgaGF2ZSBub25lIG9mIER1ZSAoXHVEODNEXHVEQ0M1ICksIFNjaGVkdWxlZCAoXHUyM0YzKSBhbmQgU3RhcnQgKFx1RDgzRFx1REVFQikgZGF0ZXMuPC9icj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8cD5TZWUgdGhlIDxhIGhyZWY9XCJodHRwczovL29ic2lkaWFuLXRhc2tzLWdyb3VwLmdpdGh1Yi5pby9vYnNpZGlhbi10YXNrcy9nZXR0aW5nLXN0YXJ0ZWQvdXNlLWZpbGVuYW1lLWFzLWRlZmF1bHQtZGF0ZS9cIj5kb2N1bWVudGF0aW9uPC9hPi48L3A+JyxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy51c2VGaWxlbmFtZUFzU2NoZWR1bGVkRGF0ZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldHRpbmdzKHsgdXNlRmlsZW5hbWVBc1NjaGVkdWxlZERhdGU6IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0ZvbGRlcnMgd2l0aCBkZWZhdWx0IFNjaGVkdWxlZCBkYXRlcycpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAnTGVhdmUgZW1wdHkgaWYgeW91IHdhbnQgdG8gdXNlIGRlZmF1bHQgU2NoZWR1bGVkIGRhdGVzIGV2ZXJ5d2hlcmUsIG9yIGVudGVyIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZm9sZGVycy4nLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZFRleHQoYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIGlucHV0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShTZXR0aW5nc1RhYi5yZW5kZXJGb2xkZXJBcnJheShzZXR0aW5ncy5maWxlbmFtZUFzRGF0ZUZvbGRlcnMpKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2xkZXJzID0gU2V0dGluZ3NUYWIucGFyc2VDb21tYVNlcGFyYXRlZEZvbGRlcnModmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2V0dGluZ3MoeyBmaWxlbmFtZUFzRGF0ZUZvbGRlcnM6IGZvbGRlcnMgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2g0JywgeyB0ZXh0OiAnQXV0by1zdWdnZXN0IFNldHRpbmdzJyB9KTtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnQXV0by1zdWdnZXN0IHRhc2sgY29udGVudCcpXG4gICAgICAgICAgICAuc2V0RGVzYygnRW5hYmxpbmcgdGhpcyB3aWxsIG9wZW4gYW4gaW50ZWxsaWdlbnQgc3VnZ2VzdCBtZW51IHdoaWxlIHR5cGluZyBpbnNpZGUgYSByZWNvZ25pemVkIHRhc2sgbGluZS4nKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5hdXRvU3VnZ2VzdEluRWRpdG9yKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2V0dGluZ3MoeyBhdXRvU3VnZ2VzdEluRWRpdG9yOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdNaW5pbXVtIG1hdGNoIGxlbmd0aCBmb3IgYXV0by1zdWdnZXN0JylcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICdJZiBoaWdoZXIgdGhhbiAwLCBhdXRvLXN1Z2dlc3Qgd2lsbCBiZSB0cmlnZ2VyZWQgb25seSB3aGVuIHRoZSBiZWdpbm5pbmcgb2YgYW55IHN1cHBvcnRlZCBrZXl3b3JkcyBpcyByZWNvZ25pemVkLicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkU2xpZGVyKChzbGlkZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgc2xpZGVyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRMaW1pdHMoMCwgMywgMSlcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmF1dG9TdWdnZXN0TWluTWF0Y2gpXG4gICAgICAgICAgICAgICAgICAgIC5zZXREeW5hbWljVG9vbHRpcCgpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldHRpbmdzKHsgYXV0b1N1Z2dlc3RNaW5NYXRjaDogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdNYXhpbXVtIG51bWJlciBvZiBhdXRvLXN1Z2dlc3Rpb25zIHRvIHNob3cnKVxuICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgJ0hvdyBtYW55IHN1Z2dlc3Rpb25zIHNob3VsZCBiZSBzaG93biB3aGVuIGFuIGF1dG8tc3VnZ2VzdCBtZW51IHBvcHMgdXAgKGluY2x1ZGluZyB0aGUgXCJcdTIzQ0VcIiBvcHRpb24pLicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkU2xpZGVyKChzbGlkZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgc2xpZGVyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRMaW1pdHMoMywgMTIsIDEpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5hdXRvU3VnZ2VzdE1heEl0ZW1zKVxuICAgICAgICAgICAgICAgICAgICAuc2V0RHluYW1pY1Rvb2x0aXAoKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZXR0aW5ncyh7IGF1dG9TdWdnZXN0TWF4SXRlbXM6IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoNCcsIHsgdGV4dDogJ0RpYWxvZyBTZXR0aW5ncycgfSk7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ1Byb3ZpZGUgYWNjZXNzIGtleXMgaW4gZGlhbG9ncycpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAnSWYgdGhlIGFjY2VzcyBrZXlzIChrZXlib2FyZCBzaG9ydGN1dHMpIGZvciB2YXJpb3VzIGNvbnRyb2xzJyArXG4gICAgICAgICAgICAgICAgICAgICcgaW4gZGlhbG9nIGJveGVzIGNvbmZsaWN0IHdpdGggc3lzdGVtIGtleWJvYXJkIHNob3J0Y3V0cycgK1xuICAgICAgICAgICAgICAgICAgICAnIG9yIGFzc2lzdGl2ZSB0ZWNobm9sb2d5IGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBpbXBvcnRhbnQgZm9yIHlvdSwnICtcbiAgICAgICAgICAgICAgICAgICAgJyB5b3UgbWF5IHdhbnQgdG8gZGVhY3RpdmF0ZSB0aGVtIGhlcmUuJyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MucHJvdmlkZUFjY2Vzc0tleXMpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZXR0aW5ncyh7IHByb3ZpZGVBY2Nlc3NLZXlzOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE9uZVNldHRpbmdzQmxvY2soY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LCBoZWFkaW5nOiBhbnksIGhlYWRpbmdPcGVuZWQ6IEhlYWRpbmdTdGF0ZSkge1xuICAgICAgICBjb25zdCBkZXRhaWxzQ29udGFpbmVyID0gY29udGFpbmVyRWwuY3JlYXRlRWwoJ2RldGFpbHMnLCB7XG4gICAgICAgICAgICBjbHM6ICd0YXNrcy1uZXN0ZWQtc2V0dGluZ3MnLFxuICAgICAgICAgICAgYXR0cjoge1xuICAgICAgICAgICAgICAgIC4uLihoZWFkaW5nLm9wZW4gfHwgaGVhZGluZ09wZW5lZFtoZWFkaW5nLnRleHRdID8geyBvcGVuOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgZGV0YWlsc0NvbnRhaW5lci5lbXB0eSgpO1xuICAgICAgICBkZXRhaWxzQ29udGFpbmVyLm9udG9nZ2xlID0gKCkgPT4ge1xuICAgICAgICAgICAgaGVhZGluZ09wZW5lZFtoZWFkaW5nLnRleHRdID0gZGV0YWlsc0NvbnRhaW5lci5vcGVuO1xuICAgICAgICAgICAgdXBkYXRlU2V0dGluZ3MoeyBoZWFkaW5nT3BlbmVkOiBoZWFkaW5nT3BlbmVkIH0pO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkZXRhaWxzQ29udGFpbmVyLmNyZWF0ZUVsKCdzdW1tYXJ5Jyk7XG4gICAgICAgIG5ldyBTZXR0aW5nKHN1bW1hcnkpLnNldEhlYWRpbmcoKS5zZXROYW1lKGhlYWRpbmcudGV4dCk7XG4gICAgICAgIHN1bW1hcnkuY3JlYXRlRGl2KCdjb2xsYXBzZXInKS5jcmVhdGVEaXYoJ2hhbmRsZScpO1xuXG4gICAgICAgIC8vIGRldGFpbHNDb250YWluZXIuY3JlYXRlRWwoaGVhZGluZy5sZXZlbCBhcyBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXAsIHsgdGV4dDogaGVhZGluZy50ZXh0IH0pO1xuXG4gICAgICAgIGlmIChoZWFkaW5nLm5vdGljZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgbm90aWNlID0gZGV0YWlsc0NvbnRhaW5lci5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgICAgICAgICAgIGNsczogaGVhZGluZy5ub3RpY2UuY2xhc3MsXG4gICAgICAgICAgICAgICAgdGV4dDogaGVhZGluZy5ub3RpY2UudGV4dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGhlYWRpbmcubm90aWNlLmh0bWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBub3RpY2UuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBoZWFkaW5nLm5vdGljZS5odG1sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBwcm9jZXNzIGFsbCB0aGUgc2V0dGluZ3MgZnJvbSBzZXR0aW5nc0NvbmZpZ3VyYXRpb24uanNvbiBhbmQgcmVuZGVyXG4gICAgICAgIC8vIHRoZW0gb3V0IHJlZHVjaW5nIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGUgY29kZSBpbiB0aGlzIGZpbGUuIFRoaXMgd2lsbCBiZWNvbWVcbiAgICAgICAgLy8gbW9yZSBpbXBvcnRhbnQgYXMgZmVhdHVyZXMgYXJlIGJlaW5nIGFkZGVkIG92ZXIgdGltZS5cbiAgICAgICAgaGVhZGluZy5zZXR0aW5ncy5mb3JFYWNoKChzZXR0aW5nOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmZlYXR1cmVGbGFnICE9PSAnJyAmJiAhaXNGZWF0dXJlRW5hYmxlZChzZXR0aW5nLmZlYXR1cmVGbGFnKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBzZXR0aW5ncyBjb25maWd1cmF0aW9uIGhhcyBhIGZlYXR1cmVGbGFnIHNldCBhbmQgdGhlIHVzZXIgaGFzIG5vdFxuICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQgaXQuIFNraXAgYWRkaW5nIHRoZSBzZXR0aW5ncyBvcHRpb24uXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNldHRpbmcudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICAgIG5ldyBTZXR0aW5nKGRldGFpbHNDb250YWluZXIpXG4gICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKHNldHRpbmcubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLnNldERlc2Moc2V0dGluZy5kZXNjcmlwdGlvbilcbiAgICAgICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmdlbmVyYWxTZXR0aW5nc1tzZXR0aW5nLnNldHRpbmdOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdlbmVyYWxTZXR0aW5nKHNldHRpbmcuc2V0dGluZ05hbWUsIHNldHRpbmcuaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSg8Ym9vbGVhbj5zZXR0aW5ncy5nZW5lcmFsU2V0dGluZ3Nbc2V0dGluZy5zZXR0aW5nTmFtZV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVHZW5lcmFsU2V0dGluZyhzZXR0aW5nLnNldHRpbmdOYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICBuZXcgU2V0dGluZyhkZXRhaWxzQ29udGFpbmVyKVxuICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShzZXR0aW5nLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgIC5zZXREZXNjKHNldHRpbmcuZGVzY3JpcHRpb24pXG4gICAgICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmdlbmVyYWxTZXR0aW5nc1tzZXR0aW5nLnNldHRpbmdOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdlbmVyYWxTZXR0aW5nKHNldHRpbmcuc2V0dGluZ05hbWUsIHNldHRpbmcuaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25DaGFuZ2UgPSBhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdlbmVyYWxTZXR0aW5nKHNldHRpbmcuc2V0dGluZ05hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuc2V0UGxhY2Vob2xkZXIoc2V0dGluZy5wbGFjZWhvbGRlci50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5nZW5lcmFsU2V0dGluZ3Nbc2V0dGluZy5zZXR0aW5nTmFtZV0udG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoZGVib3VuY2Uob25DaGFuZ2UsIDUwMCwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZy50eXBlID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgICAgICAgICAgbmV3IFNldHRpbmcoZGV0YWlsc0NvbnRhaW5lcilcbiAgICAgICAgICAgICAgICAgICAgLnNldE5hbWUoc2V0dGluZy5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAuc2V0RGVzYyhzZXR0aW5nLmRlc2NyaXB0aW9uKVxuICAgICAgICAgICAgICAgICAgICAuYWRkVGV4dEFyZWEoKHRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3MuZ2VuZXJhbFNldHRpbmdzW3NldHRpbmcuc2V0dGluZ05hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2VuZXJhbFNldHRpbmcoc2V0dGluZy5zZXR0aW5nTmFtZSwgc2V0dGluZy5pbml0aWFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbkNoYW5nZSA9IGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2VuZXJhbFNldHRpbmcoc2V0dGluZy5zZXR0aW5nTmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRQbGFjZWhvbGRlcihzZXR0aW5nLnBsYWNlaG9sZGVyLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmdlbmVyYWxTZXR0aW5nc1tzZXR0aW5nLnNldHRpbmdOYW1lXS50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShkZWJvdW5jZShvbkNoYW5nZSwgNTAwLCB0cnVlKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuaW5wdXRFbC5yb3dzID0gODtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuaW5wdXRFbC5jb2xzID0gNDA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5nLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUZ1bmN0aW9uc1tzZXR0aW5nLnNldHRpbmdOYW1lXShkZXRhaWxzQ29udGFpbmVyLCB0aGlzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNldHRpbmcubm90aWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm90aWNlID0gZGV0YWlsc0NvbnRhaW5lci5jcmVhdGVFbCgncCcsIHtcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBzZXR0aW5nLm5vdGljZS5jbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogc2V0dGluZy5ub3RpY2UudGV4dCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5ub3RpY2UuaHRtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBub3RpY2UuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBzZXR0aW5nLm5vdGljZS5odG1sKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHBhcnNlQ29tbWFTZXBhcmF0ZWRGb2xkZXJzKGlucHV0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICAgICAgICAgIC8vIGEgbGltaXRhdGlvbiBpcyB0aGF0IGZvbGRlciBuYW1lcyBtYXkgbm90IGNvbnRhaW4gY29tbWFzXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgICAubWFwKChmb2xkZXIpID0+IGZvbGRlci50cmltKCkpXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXNcbiAgICAgICAgICAgICAgICAubWFwKChmb2xkZXIpID0+IGZvbGRlci5yZXBsYWNlKC9eXFwvfFxcLyQvZywgJycpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGZvbGRlcikgPT4gZm9sZGVyICE9PSAnJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyByZW5kZXJGb2xkZXJBcnJheShmb2xkZXJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBmb2xkZXJzLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXR0aW5ncyBmb3IgQ29yZSBUYXNrIFN0YXR1c1xuICAgICAqIFRoZXNlIGFyZSBidWlsdC1pbiBzdGF0dXNlcyB0aGF0IGNhbiBoYXZlIG1pbmltYWwgZWRpdHMgbWFkZSxcbiAgICAgKiBidXQgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIGRlbGV0ZWQgb3IgYWRkZWQgdG8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXJFbFxuICAgICAqIEBwYXJhbSB7U2V0dGluZ3NUYWJ9IHNldHRpbmdzXG4gICAgICogQG1lbWJlcm9mIFNldHRpbmdzVGFiXG4gICAgICovXG4gICAgaW5zZXJ0VGFza0NvcmVTdGF0dXNTZXR0aW5ncyhjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIHNldHRpbmdzOiBTZXR0aW5nc1RhYikge1xuICAgICAgICBjb25zdCB7IHN0YXR1c1NldHRpbmdzIH0gPSBnZXRTZXR0aW5ncygpO1xuXG4gICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIE9uZSByb3cgcGVyIGNvcmUgc3RhdHVzIGluIHRoZSBzZXR0aW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICBzdGF0dXNTZXR0aW5ncy5jb3JlU3RhdHVzZXMuZm9yRWFjaCgoc3RhdHVzX3R5cGUpID0+IHtcbiAgICAgICAgICAgIGNyZWF0ZVJvd0ZvclRhc2tTdGF0dXMoXG4gICAgICAgICAgICAgICAgY29udGFpbmVyRWwsXG4gICAgICAgICAgICAgICAgc3RhdHVzX3R5cGUsXG4gICAgICAgICAgICAgICAgc3RhdHVzU2V0dGluZ3MuY29yZVN0YXR1c2VzLFxuICAgICAgICAgICAgICAgIHN0YXR1c1NldHRpbmdzLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzLnBsdWdpbixcbiAgICAgICAgICAgICAgICB0cnVlLCAvLyBpc0NvcmVTdGF0dXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHRpbmdzIGZvciBDdXN0b20gVGFzayBTdGF0dXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lckVsXG4gICAgICogQHBhcmFtIHtTZXR0aW5nc1RhYn0gc2V0dGluZ3NcbiAgICAgKiBAbWVtYmVyb2YgU2V0dGluZ3NUYWJcbiAgICAgKi9cbiAgICBpbnNlcnRDdXN0b21UYXNrU3RhdHVzU2V0dGluZ3MoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LCBzZXR0aW5nczogU2V0dGluZ3NUYWIpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXNTZXR0aW5ncyB9ID0gZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBPbmUgcm93IHBlciBjdXN0b20gc3RhdHVzIGluIHRoZSBzZXR0aW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICBzdGF0dXNTZXR0aW5ncy5jdXN0b21TdGF0dXNlcy5mb3JFYWNoKChzdGF0dXNfdHlwZSkgPT4ge1xuICAgICAgICAgICAgY3JlYXRlUm93Rm9yVGFza1N0YXR1cyhcbiAgICAgICAgICAgICAgICBjb250YWluZXJFbCxcbiAgICAgICAgICAgICAgICBzdGF0dXNfdHlwZSxcbiAgICAgICAgICAgICAgICBzdGF0dXNTZXR0aW5ncy5jdXN0b21TdGF0dXNlcyxcbiAgICAgICAgICAgICAgICBzdGF0dXNTZXR0aW5ncyxcbiAgICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5wbHVnaW4sXG4gICAgICAgICAgICAgICAgZmFsc2UsIC8vIGlzQ29yZVN0YXR1c1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2RpdicpO1xuXG4gICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tICdBZGQgTmV3IFRhc2sgU3RhdHVzJyBidXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgICAgY29uc3Qgc2V0dGluZyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKS5hZGRCdXR0b24oKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgLnNldEJ1dHRvblRleHQoJ0FkZCBOZXcgVGFzayBTdGF0dXMnKVxuICAgICAgICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgU3RhdHVzU2V0dGluZ3MuYWRkU3RhdHVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzU2V0dGluZ3MuY3VzdG9tU3RhdHVzZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzQ29uZmlndXJhdGlvbignJywgJycsICcnLCBmYWxzZSwgU3RhdHVzVHlwZS5UT0RPKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlQW5kU2F2ZVN0YXR1c1NldHRpbmdzKHN0YXR1c1NldHRpbmdzLCBzZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXR0aW5nLmluZm9FbC5yZW1vdmUoKTtcblxuICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBBZGQgYWxsIFN0YXR1cyB0eXBlcyBzdXBwb3J0ZWQgYnkgLi4uIGJ1dHRvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgICAgdHlwZSBOYW1lZFRoZW1lID0gW3N0cmluZywgU3RhdHVzQ29sbGVjdGlvbl07XG4gICAgICAgIGNvbnN0IHRoZW1lczogTmFtZWRUaGVtZVtdID0gW1xuICAgICAgICAgICAgLy8gTGlnaHQgYW5kIERhcmsgdGhlbWVzIC0gYWxwaGFiZXRpY2FsIG9yZGVyXG4gICAgICAgICAgICBbJ0FudVBwdWNjaW4gVGhlbWUnLCBUaGVtZXMuYW51cHB1Y2NpblN1cHBvcnRlZFN0YXR1c2VzKCldLFxuICAgICAgICAgICAgWydFYnVsbGllbnR3b3JrcyBUaGVtZScsIFRoZW1lcy5lYnVsbGllbnR3b3Jrc1N1cHBvcnRlZFN0YXR1c2VzKCldLFxuICAgICAgICAgICAgWydJVFMgVGhlbWUgJiBTbFJ2YiBDaGVja2JveGVzJywgVGhlbWVzLml0c1N1cHBvcnRlZFN0YXR1c2VzKCldLFxuICAgICAgICAgICAgWydNaW5pbWFsIFRoZW1lJywgVGhlbWVzLm1pbmltYWxTdXBwb3J0ZWRTdGF0dXNlcygpXSxcbiAgICAgICAgICAgIFsnVGhpbmdzIFRoZW1lJywgVGhlbWVzLnRoaW5nc1N1cHBvcnRlZFN0YXR1c2VzKCldLFxuICAgICAgICAgICAgLy8gRGFyayBvbmx5IHRoZW1lcyAtIGFscGhhYmV0aWNhbCBvcmRlclxuICAgICAgICAgICAgWydBdXJhIFRoZW1lIChEYXJrIG1vZGUgb25seSknLCBUaGVtZXMuYXVyYVN1cHBvcnRlZFN0YXR1c2VzKCldLFxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb2xsZWN0aW9uXSBvZiB0aGVtZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFkZFN0YXR1c2VzU3VwcG9ydGVkQnlUaGlzVGhlbWUgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbCkuYWRkQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGAke25hbWV9OiBBZGQgJHtjb2xsZWN0aW9uLmxlbmd0aH0gc3VwcG9ydGVkIFN0YXR1c2VzYDtcbiAgICAgICAgICAgICAgICBidXR0b24uc2V0QnV0dG9uVGV4dChsYWJlbCkub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFkZEN1c3RvbVN0YXRlc1RvU2V0dGluZ3MoY29sbGVjdGlvbiwgc3RhdHVzU2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYWRkU3RhdHVzZXNTdXBwb3J0ZWRCeVRoaXNUaGVtZS5pbmZvRWwucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAnQWRkIEFsbCBVbmtub3duIFN0YXR1cyBUeXBlcycgYnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gICAgICAgIGNvbnN0IGFkZEFsbFVua25vd25TdGF0dXNlcyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKS5hZGRCdXR0b24oKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgLnNldEJ1dHRvblRleHQoJ0FkZCBBbGwgVW5rbm93biBTdGF0dXMgVHlwZXMnKVxuICAgICAgICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFza3MgPSB0aGlzLnBsdWdpbi5nZXRUYXNrcygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxTdGF0dXNlcyA9IHRhc2tzIS5tYXAoKHRhc2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLnN0YXR1cztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVua25vd25TdGF0dXNlcyA9IFN0YXR1c1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZmluZFVua25vd25TdGF0dXNlcyhhbGxTdGF0dXNlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duU3RhdHVzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdW5rbm93blN0YXR1c2VzLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c1NldHRpbmdzLmFkZFN0YXR1cyhzdGF0dXNTZXR0aW5ncy5jdXN0b21TdGF0dXNlcywgcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB1cGRhdGVBbmRTYXZlU3RhdHVzU2V0dGluZ3Moc3RhdHVzU2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFkZEFsbFVua25vd25TdGF0dXNlcy5pbmZvRWwucmVtb3ZlKCk7XG5cbiAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gJ1Jlc2V0IEN1c3RvbSBTdGF0dXMgVHlwZXMgdG8gRGVmYXVsdHMnIGJ1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICBjb25zdCBjbGVhckN1c3RvbVN0YXR1c2VzID0gbmV3IFNldHRpbmcoY29udGFpbmVyRWwpLmFkZEJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAuc2V0QnV0dG9uVGV4dCgnUmVzZXQgQ3VzdG9tIFN0YXR1cyBUeXBlcyB0byBEZWZhdWx0cycpXG4gICAgICAgICAgICAgICAgLnNldFdhcm5pbmcoKVxuICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgU3RhdHVzU2V0dGluZ3MucmVzZXRBbGxDdXN0b21TdGF0dXNlcyhzdGF0dXNTZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZUFuZFNhdmVTdGF0dXNTZXR0aW5ncyhzdGF0dXNTZXR0aW5ncywgc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgY2xlYXJDdXN0b21TdGF0dXNlcy5pbmZvRWwucmVtb3ZlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgcm93IHRvIHNlZSBhbmQgbW9kaWZ5IHNldHRpbmdzIGZvciBhIHNpbmdsZSB0YXNrIHN0YXR1cyB0eXBlLlxuICogQHBhcmFtIGNvbnRhaW5lckVsXG4gKiBAcGFyYW0gc3RhdHVzVHlwZSAtIFRoZSBzdGF0dXMgdHlwZSB0byBiZSBlZGl0ZWQuXG4gKiBAcGFyYW0gc3RhdHVzZXMgLSBUaGUgbGlzdCBvZiBzdGF0dXNlcyB0aGF0IHN0YXR1c1R5cGUgaXMgc3RvcmVkIGluLlxuICogQHBhcmFtIHN0YXR1c1NldHRpbmdzIC0gQWxsIHRoZSBzdGF0dXMgdHlwZXMgYWxyZWFkeSBpbiB0aGUgdXNlcidzIHNldHRpbmdzLCBFWENFUFQgdGhlIHN0YW5kYXJkIG9uZXMuXG4gKiBAcGFyYW0gc2V0dGluZ3NcbiAqIEBwYXJhbSBwbHVnaW5cbiAqIEBwYXJhbSBpc0NvcmVTdGF0dXMgLSB3aGV0aGVyIHRoZSBzdGF0dXMgaXMgYSBjb3JlIHN0YXR1c1xuICovXG5mdW5jdGlvbiBjcmVhdGVSb3dGb3JUYXNrU3RhdHVzKFxuICAgIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCxcbiAgICBzdGF0dXNUeXBlOiBTdGF0dXNDb25maWd1cmF0aW9uLFxuICAgIHN0YXR1c2VzOiBTdGF0dXNDb25maWd1cmF0aW9uW10sXG4gICAgc3RhdHVzU2V0dGluZ3M6IFN0YXR1c1NldHRpbmdzLFxuICAgIHNldHRpbmdzOiBTZXR0aW5nc1RhYixcbiAgICBwbHVnaW46IFRhc2tzUGx1Z2luLFxuICAgIGlzQ29yZVN0YXR1czogYm9vbGVhbixcbikge1xuICAgIC8vY29uc3QgdGFza1N0YXR1c0RpdiA9IGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdkaXYnKTtcblxuICAgIGNvbnN0IHRhc2tTdGF0dXNQcmV2aWV3ID0gY29udGFpbmVyRWwuY3JlYXRlRWwoJ3ByZScpO1xuICAgIHRhc2tTdGF0dXNQcmV2aWV3LmFkZENsYXNzKCdyb3ctZm9yLXN0YXR1cycpO1xuICAgIHRhc2tTdGF0dXNQcmV2aWV3LnRleHRDb250ZW50ID0gbmV3IFN0YXR1cyhzdGF0dXNUeXBlKS5wcmV2aWV3VGV4dCgpO1xuXG4gICAgY29uc3Qgc2V0dGluZyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKTtcblxuICAgIHNldHRpbmcuaW5mb0VsLnJlcGxhY2VXaXRoKHRhc2tTdGF0dXNQcmV2aWV3KTtcblxuICAgIGlmICghaXNDb3JlU3RhdHVzKSB7XG4gICAgICAgIHNldHRpbmcuYWRkRXh0cmFCdXR0b24oKGV4dHJhKSA9PiB7XG4gICAgICAgICAgICBleHRyYVxuICAgICAgICAgICAgICAgIC5zZXRJY29uKCdjcm9zcycpXG4gICAgICAgICAgICAgICAgLnNldFRvb2x0aXAoJ0RlbGV0ZScpXG4gICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoU3RhdHVzU2V0dGluZ3MuZGVsZXRlU3RhdHVzKHN0YXR1c2VzLCBzdGF0dXNUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlQW5kU2F2ZVN0YXR1c1NldHRpbmdzKHN0YXR1c1NldHRpbmdzLCBzZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0dGluZy5hZGRFeHRyYUJ1dHRvbigoZXh0cmEpID0+IHtcbiAgICAgICAgZXh0cmFcbiAgICAgICAgICAgIC5zZXRJY29uKCdwZW5jaWwnKVxuICAgICAgICAgICAgLnNldFRvb2x0aXAoJ0VkaXQnKVxuICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGFsID0gbmV3IEN1c3RvbVN0YXR1c01vZGFsKHBsdWdpbiwgc3RhdHVzVHlwZSwgaXNDb3JlU3RhdHVzKTtcblxuICAgICAgICAgICAgICAgIG1vZGFsLm9uQ2xvc2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RhbC5zYXZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN0YXR1c1NldHRpbmdzLnJlcGxhY2VTdGF0dXMoc3RhdHVzZXMsIHN0YXR1c1R5cGUsIG1vZGFsLnN0YXR1c0NvbmZpZ3VyYXRpb24oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB1cGRhdGVBbmRTYXZlU3RhdHVzU2V0dGluZ3Moc3RhdHVzU2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBtb2RhbC5vcGVuKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNldHRpbmcuaW5mb0VsLnJlbW92ZSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhZGRDdXN0b21TdGF0ZXNUb1NldHRpbmdzKFxuICAgIHN1cHBvcnRlZFN0YXR1c2VzOiBTdGF0dXNDb2xsZWN0aW9uLFxuICAgIHN0YXR1c1NldHRpbmdzOiBTdGF0dXNTZXR0aW5ncyxcbiAgICBzZXR0aW5nczogU2V0dGluZ3NUYWIsXG4pIHtcbiAgICBjb25zdCBub3RpY2VzID0gU3RhdHVzU2V0dGluZ3MuYnVsa0FkZFN0YXR1c0NvbGxlY3Rpb24oc3RhdHVzU2V0dGluZ3MsIHN1cHBvcnRlZFN0YXR1c2VzKTtcblxuICAgIG5vdGljZXMuZm9yRWFjaCgobm90aWNlKSA9PiB7XG4gICAgICAgIG5ldyBOb3RpY2Uobm90aWNlKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHVwZGF0ZUFuZFNhdmVTdGF0dXNTZXR0aW5ncyhzdGF0dXNTZXR0aW5ncywgc2V0dGluZ3MpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVBbmRTYXZlU3RhdHVzU2V0dGluZ3Moc3RhdHVzVHlwZXM6IFN0YXR1c1NldHRpbmdzLCBzZXR0aW5nczogU2V0dGluZ3NUYWIpIHtcbiAgICB1cGRhdGVTZXR0aW5ncyh7XG4gICAgICAgIHN0YXR1c1NldHRpbmdzOiBzdGF0dXNUeXBlcyxcbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYWN0aXZlIHN0YXR1c2VzLlxuICAgIC8vIFRoaXMgc2F2ZXMgdGhlIHVzZXIgZnJvbSBoYXZpbmcgdG8gcmVzdGFydCBPYnNpZGlhbiBpbiBvcmRlciB0byBhcHBseSB0aGUgY2hhbmdlZCBzdGF0dXMoZXMpLlxuICAgIFN0YXR1c1NldHRpbmdzLmFwcGx5VG9TdGF0dXNSZWdpc3RyeShzdGF0dXNUeXBlcywgU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKSk7XG5cbiAgICBhd2FpdCBzZXR0aW5ncy5zYXZlU2V0dGluZ3ModHJ1ZSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGF0dXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vU3RhdHVzQ29sbGVjdGlvbic7XG5cbi8qKlxuICogU3RhdHVzIHN1cHBvcnRlZCBieSB0aGUgQW51UHB1Y2NpbiB0aGVtZS4ge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9BbnViaXNOZWtoZXQvQW51UHB1Y2Npbn1cbiAqIEBzZWUge0BsaW5rIFN0YXR1c1NldHRpbmdzLmJ1bGtBZGRTdGF0dXNDb2xsZWN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gYW51cHB1Y2NpblN1cHBvcnRlZFN0YXR1c2VzKCkge1xuICAgIGNvbnN0IHp6ejogU3RhdHVzQ29sbGVjdGlvbiA9IFtcbiAgICAgICAgWycgJywgJ1VuY2hlY2tlZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd4JywgJ0NoZWNrZWQnLCAnICcsICdET05FJ10sXG4gICAgICAgIFsnPicsICdSZXNjaGVkdWxlZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyc8JywgJ1NjaGVkdWxlZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWychJywgJ0ltcG9ydGFudCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyctJywgJ0NhbmNlbGxlZCcsICcgJywgJ0NBTkNFTExFRCddLFxuICAgICAgICBbJy8nLCAnSW4gUHJvZ3Jlc3MnLCAneCcsICdJTl9QUk9HUkVTUyddLFxuICAgICAgICBbJz8nLCAnUXVlc3Rpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnKicsICdTdGFyJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ24nLCAnTm90ZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydsJywgJ0xvY2F0aW9uJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2knLCAnSW5mb3JtYXRpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnSScsICdJZGVhJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ1MnLCAnQW1vdW50JywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ3AnLCAnUHJvJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2MnLCAnQ29uJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2InLCAnQm9va21hcmsnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnXCInLCAnUXVvdGUnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnMCcsICdTcGVlY2ggYnViYmxlIDAnLCAnMCcsICdOT05fVEFTSyddLFxuICAgICAgICBbJzEnLCAnU3BlZWNoIGJ1YmJsZSAxJywgJzEnLCAnTk9OX1RBU0snXSxcbiAgICAgICAgWycyJywgJ1NwZWVjaCBidWJibGUgMicsICcyJywgJ05PTl9UQVNLJ10sXG4gICAgICAgIFsnMycsICdTcGVlY2ggYnViYmxlIDMnLCAnMycsICdOT05fVEFTSyddLFxuICAgICAgICBbJzQnLCAnU3BlZWNoIGJ1YmJsZSA0JywgJzQnLCAnTk9OX1RBU0snXSxcbiAgICAgICAgWyc1JywgJ1NwZWVjaCBidWJibGUgNScsICc1JywgJ05PTl9UQVNLJ10sXG4gICAgICAgIFsnNicsICdTcGVlY2ggYnViYmxlIDYnLCAnNicsICdOT05fVEFTSyddLFxuICAgICAgICBbJzcnLCAnU3BlZWNoIGJ1YmJsZSA3JywgJzcnLCAnTk9OX1RBU0snXSxcbiAgICAgICAgWyc4JywgJ1NwZWVjaCBidWJibGUgOCcsICc4JywgJ05PTl9UQVNLJ10sXG4gICAgICAgIFsnOScsICdTcGVlY2ggYnViYmxlIDknLCAnOScsICdOT05fVEFTSyddLFxuICAgIF07XG4gICAgcmV0dXJuIHp6ejtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFN0YXR1c0NvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi9TdGF0dXNDb2xsZWN0aW9uJztcblxuLyoqXG4gKiBTdGF0dXMgc3VwcG9ydGVkIGJ5IHRoZSBBdXJhIHRoZW1lLiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzaHdpbmphZGhhdjgxOC9vYnNpZGlhbi1hdXJhfVxuICogQHNlZSB7QGxpbmsgU3RhdHVzU2V0dGluZ3MuYnVsa0FkZFN0YXR1c0NvbGxlY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXJhU3VwcG9ydGVkU3RhdHVzZXMoKSB7XG4gICAgY29uc3Qgenp6OiBTdGF0dXNDb2xsZWN0aW9uID0gW1xuICAgICAgICBbJyAnLCAnaW5jb21wbGV0ZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd4JywgJ2NvbXBsZXRlIC8gZG9uZScsICcgJywgJ0RPTkUnXSxcbiAgICAgICAgWyctJywgJ2NhbmNlbGxlZCcsICcgJywgJ0NBTkNFTExFRCddLFxuICAgICAgICBbJz4nLCAnZGVmZXJyZWQnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnLycsICdpbiBwcm9ncmVzcywgb3IgaGFsZi1kb25lJywgJ3gnLCAnSU5fUFJPR1JFU1MnXSxcbiAgICAgICAgWychJywgJ0ltcG9ydGFudCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyc/JywgJ3F1ZXN0aW9uJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ1InLCAncmV2aWV3JywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJysnLCAnSW5ib3ggLyB0YXNrIHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBsYXRlcicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydiJywgJ2Jvb2ttYXJrJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0InLCAnYnJhaW5zdG9ybScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydEJywgJ2RlZmVycmVkIG9yIHNjaGVkdWxlZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydJJywgJ0luZm8nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnaScsICdpZGVhJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ04nLCAnbm90ZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydRJywgJ3F1b3RlJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ1cnLCAnd2luIC8gc3VjY2VzcyAvIHJld2FyZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydQJywgJ3BybycsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydDJywgJ2NvbicsICd4JywgJ1RPRE8nXSxcbiAgICBdO1xuICAgIHJldHVybiB6eno7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGF0dXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vU3RhdHVzQ29sbGVjdGlvbic7XG5cbi8qKlxuICogU3RhdHVzIHN1cHBvcnRlZCBieSB0aGUgRWJ1bGxpZW50d29ya3MgdGhlbWUuIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZWJ1bGxpZW50L29ic2lkaWFuLXRoZW1lLWVidWxsaWVudHdvcmtzfVxuICogQHNlZSB7QGxpbmsgU3RhdHVzU2V0dGluZ3MuYnVsa0FkZFN0YXR1c0NvbGxlY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlYnVsbGllbnR3b3Jrc1N1cHBvcnRlZFN0YXR1c2VzKCkge1xuICAgIGNvbnN0IHp6ejogU3RhdHVzQ29sbGVjdGlvbiA9IFtcbiAgICAgICAgWycgJywgJ1VuY2hlY2tlZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd4JywgJ0NoZWNrZWQnLCAnICcsICdET05FJ10sXG4gICAgICAgIFsnLScsICdDYW5jZWxsZWQnLCAnICcsICdDQU5DRUxMRUQnXSxcbiAgICAgICAgWycvJywgJ0luIFByb2dyZXNzJywgJ3gnLCAnSU5fUFJPR1JFU1MnXSxcbiAgICAgICAgWyc+JywgJ0RlZmVycmVkJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJyEnLCAnSW1wb3J0YW50JywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJz8nLCAnUXVlc3Rpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsncicsICdSZXZpZXcnLCAneCcsICdUT0RPJ10sXG4gICAgXTtcbiAgICByZXR1cm4genp6O1xufVxuIiwgImltcG9ydCB0eXBlIHsgU3RhdHVzQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL1N0YXR1c0NvbGxlY3Rpb24nO1xuXG4vKipcbiAqIFN0YXR1cyBzdXBwb3J0ZWQgYnkgdGhlIElUUyB0aGVtZS4ge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9TbFJ2Yi9PYnNpZGlhbi0tSVRTLVRoZW1lfVxuICogVmFsdWVzIHJlY29nbmlzZWQgYnkgVGFza3MgYXJlIGV4Y2x1ZGVkLlxuICogQHNlZSB7QGxpbmsgU3RhdHVzU2V0dGluZ3MuYnVsa0FkZFN0YXR1c0NvbGxlY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdHNTdXBwb3J0ZWRTdGF0dXNlcygpIHtcbiAgICBjb25zdCB6eno6IFN0YXR1c0NvbGxlY3Rpb24gPSBbXG4gICAgICAgIFsnICcsICdVbmNoZWNrZWQnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsneCcsICdSZWd1bGFyJywgJyAnLCAnRE9ORSddLFxuICAgICAgICBbJ1gnLCAnQ2hlY2tlZCcsICcgJywgJ0RPTkUnXSxcbiAgICAgICAgWyctJywgJ0Ryb3BwZWQnLCAnICcsICdDQU5DRUxMRUQnXSxcbiAgICAgICAgWyc+JywgJ0ZvcndhcmQnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnRCcsICdEYXRlJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJz8nLCAnUXVlc3Rpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnLycsICdIYWxmIERvbmUnLCAneCcsICdJTl9QUk9HUkVTUyddLFxuICAgICAgICBbJysnLCAnQWRkJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ1InLCAnUmVzZWFyY2gnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnIScsICdJbXBvcnRhbnQnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnaScsICdJZGVhJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0InLCAnQnJhaW5zdG9ybScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydQJywgJ1BybycsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydDJywgJ0NvbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydRJywgJ1F1b3RlJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ04nLCAnTm90ZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydiJywgJ0Jvb2ttYXJrJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0knLCAnSW5mb3JtYXRpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsncCcsICdQYXJhcGhyYXNlJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0wnLCAnTG9jYXRpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnRScsICdFeGFtcGxlJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0EnLCAnQW5zd2VyJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ3InLCAnUmV3YXJkJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2MnLCAnQ2hvaWNlJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2QnLCAnRG9pbmcnLCAneCcsICdJTl9QUk9HUkVTUyddLFxuICAgICAgICBbJ1QnLCAnVGltZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydAJywgJ0NoYXJhY3RlciAvIFBlcnNvbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd0JywgJ1RhbGsnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnTycsICdPdXRsaW5lIC8gUGxvdCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd+JywgJ0NvbmZsaWN0JywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ1cnLCAnV29ybGQnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnZicsICdDbHVlIC8gRmluZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydGJywgJ0ZvcmVzaGFkb3cnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnSCcsICdGYXZvcml0ZSAvIEhlYWx0aCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWycmJywgJ1N5bWJvbGlzbScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydzJywgJ1NlY3JldCcsICd4JywgJ1RPRE8nXSxcbiAgICBdO1xuICAgIHJldHVybiB6eno7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGF0dXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vU3RhdHVzQ29sbGVjdGlvbic7XG5cbi8qKlxuICogU3RhdHVzIHN1cHBvcnRlZCBieSB0aGUgTWluaW1hbCB0aGVtZS4ge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9rZXBhbm8vb2JzaWRpYW4tbWluaW1hbH1cbiAqIFZhbHVlcyByZWNvZ25pc2VkIGJ5IFRhc2tzIGFyZSBleGNsdWRlZC5cbiAqIEBzZWUge0BsaW5rIFN0YXR1c1NldHRpbmdzLmJ1bGtBZGRTdGF0dXNDb2xsZWN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWluaW1hbFN1cHBvcnRlZFN0YXR1c2VzKCkge1xuICAgIGNvbnN0IHp6ejogU3RhdHVzQ29sbGVjdGlvbiA9IFtcbiAgICAgICAgWycgJywgJ3RvLWRvJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJy8nLCAnaW5jb21wbGV0ZScsICd4JywgJ0lOX1BST0dSRVNTJ10sXG4gICAgICAgIFsneCcsICdkb25lJywgJyAnLCAnRE9ORSddLFxuICAgICAgICBbJy0nLCAnY2FuY2VsZWQnLCAnICcsICdDQU5DRUxMRUQnXSxcbiAgICAgICAgWyc+JywgJ2ZvcndhcmRlZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyc8JywgJ3NjaGVkdWxpbmcnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnPycsICdxdWVzdGlvbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWychJywgJ2ltcG9ydGFudCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWycqJywgJ3N0YXInLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnXCInLCAncXVvdGUnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnbCcsICdsb2NhdGlvbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydiJywgJ2Jvb2ttYXJrJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2knLCAnaW5mb3JtYXRpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnUycsICdzYXZpbmdzJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0knLCAnaWRlYScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydwJywgJ3Byb3MnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnYycsICdjb25zJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2YnLCAnZmlyZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydrJywgJ2tleScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd3JywgJ3dpbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd1JywgJ3VwJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2QnLCAnZG93bicsICd4JywgJ1RPRE8nXSxcbiAgICBdO1xuICAgIHJldHVybiB6eno7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGF0dXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vU3RhdHVzQ29sbGVjdGlvbic7XG5cbi8qKlxuICogU3RhdHVzIHN1cHBvcnRlZCBieSB0aGUgVGhpbmdzIHRoZW1lLiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2NvbGluZWNrZXJ0L29ic2lkaWFuLXRoaW5nc31cbiAqIEBzZWUge0BsaW5rIFN0YXR1c1NldHRpbmdzLmJ1bGtBZGRTdGF0dXNDb2xsZWN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGhpbmdzU3VwcG9ydGVkU3RhdHVzZXMoKSB7XG4gICAgY29uc3Qgenp6OiBTdGF0dXNDb2xsZWN0aW9uID0gW1xuICAgICAgICAvLyBCYXNpY1xuICAgICAgICBbJyAnLCAndG8tZG8nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnLycsICdpbmNvbXBsZXRlJywgJ3gnLCAnSU5fUFJPR1JFU1MnXSxcbiAgICAgICAgWyd4JywgJ2RvbmUnLCAnICcsICdET05FJ10sXG4gICAgICAgIFsnLScsICdjYW5jZWxlZCcsICcgJywgJ0NBTkNFTExFRCddLFxuICAgICAgICBbJz4nLCAnZm9yd2FyZGVkJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJzwnLCAnc2NoZWR1bGluZycsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgLy8gRXh0cmFzXG4gICAgICAgIFsnPycsICdxdWVzdGlvbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWychJywgJ2ltcG9ydGFudCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWycqJywgJ3N0YXInLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnXCInLCAncXVvdGUnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnbCcsICdsb2NhdGlvbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydiJywgJ2Jvb2ttYXJrJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2knLCAnaW5mb3JtYXRpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnUycsICdzYXZpbmdzJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0knLCAnaWRlYScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydwJywgJ3Byb3MnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnYycsICdjb25zJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2YnLCAnZmlyZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydrJywgJ2tleScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd3JywgJ3dpbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd1JywgJ3VwJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2QnLCAnZG93bicsICd4JywgJ1RPRE8nXSxcbiAgICBdO1xuICAgIHJldHVybiB6eno7XG59XG4iLCAiaW1wb3J0IHsgTW9kYWwsIE5vdGljZSwgU2V0dGluZywgVGV4dENvbXBvbmVudCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgU3RhdHVzQ29uZmlndXJhdGlvbiwgU3RhdHVzVHlwZSB9IGZyb20gJy4uL1N0YXR1c0NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgU3RhdHVzVmFsaWRhdG9yIH0gZnJvbSAnLi4vU3RhdHVzVmFsaWRhdG9yJztcbmltcG9ydCB7IFN0YXR1cyB9IGZyb20gJy4uL1N0YXR1cyc7XG5cbmNvbnN0IHZhbGlkYXRvciA9IG5ldyBTdGF0dXNWYWxpZGF0b3IoKTtcblxuZXhwb3J0IGNsYXNzIEN1c3RvbVN0YXR1c01vZGFsIGV4dGVuZHMgTW9kYWwge1xuICAgIHN0YXR1c1N5bWJvbDogc3RyaW5nO1xuICAgIHN0YXR1c05hbWU6IHN0cmluZztcbiAgICBzdGF0dXNOZXh0U3ltYm9sOiBzdHJpbmc7XG4gICAgc3RhdHVzQXZhaWxhYmxlQXNDb21tYW5kOiBib29sZWFuO1xuICAgIHR5cGU6IFN0YXR1c1R5cGU7XG5cbiAgICBzYXZlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc0NvcmVTdGF0dXM6IGJvb2xlYW47XG4gICAgY29uc3RydWN0b3IocHVibGljIHBsdWdpbjogUGx1Z2luLCBzdGF0dXNUeXBlOiBTdGF0dXNDb25maWd1cmF0aW9uLCBpc0NvcmVTdGF0dXM6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocGx1Z2luLmFwcCk7XG4gICAgICAgIHRoaXMuc3RhdHVzU3ltYm9sID0gc3RhdHVzVHlwZS5zeW1ib2w7XG4gICAgICAgIHRoaXMuc3RhdHVzTmFtZSA9IHN0YXR1c1R5cGUubmFtZTtcbiAgICAgICAgdGhpcy5zdGF0dXNOZXh0U3ltYm9sID0gc3RhdHVzVHlwZS5uZXh0U3RhdHVzU3ltYm9sO1xuICAgICAgICB0aGlzLnN0YXR1c0F2YWlsYWJsZUFzQ29tbWFuZCA9IHN0YXR1c1R5cGUuYXZhaWxhYmxlQXNDb21tYW5kO1xuICAgICAgICB0aGlzLnR5cGUgPSBzdGF0dXNUeXBlLnR5cGU7XG4gICAgICAgIHRoaXMuaXNDb3JlU3RhdHVzID0gaXNDb3JlU3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHtAbGluayBTdGF0dXNDb25maWd1cmF0aW9ufSBmcm9tIHRoZSBtb2RhbCdzIGNvbnRlbnRzXG4gICAgICovXG4gICAgcHVibGljIHN0YXR1c0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RhdHVzQ29uZmlndXJhdGlvbihcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzU3ltYm9sLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXNOYW1lLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXNOZXh0U3ltYm9sLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXNBdmFpbGFibGVBc0NvbW1hbmQsXG4gICAgICAgICAgICB0aGlzLnR5cGUsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYXN5bmMgZGlzcGxheSgpIHtcbiAgICAgICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cbiAgICAgICAgY29udGVudEVsLmVtcHR5KCk7XG5cbiAgICAgICAgY29uc3Qgc2V0dGluZ0RpdiA9IGNvbnRlbnRFbC5jcmVhdGVEaXYoKTtcbiAgICAgICAgLy9jb25zdCB0aXRsZSA9IHRoaXMudGl0bGUgPz8gJy4uLic7XG5cbiAgICAgICAgbGV0IHN0YXR1c1N5bWJvbFRleHQ6IFRleHRDb21wb25lbnQ7XG4gICAgICAgIG5ldyBTZXR0aW5nKHNldHRpbmdEaXYpXG4gICAgICAgICAgICAuc2V0TmFtZSgnVGFzayBTdGF0dXMgU3ltYm9sJylcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICdUaGlzIGlzIHRoZSBjaGFyYWN0ZXIgYmV0d2VlbiB0aGUgc3F1YXJlIGJyYWNlcy4gKEl0IGNhbiBvbmx5IGJlIGVkaXRlZCBmb3IgQ3VzdG9tIHN0YXR1c2VzLCBhbmQgbm90IENvcmUgc3RhdHVzZXMuKScsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgIHN0YXR1c1N5bWJvbFRleHQgPSB0ZXh0O1xuICAgICAgICAgICAgICAgIHRleHQuc2V0VmFsdWUodGhpcy5zdGF0dXNTeW1ib2wpLm9uQ2hhbmdlKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzU3ltYm9sID0gdjtcbiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tU3RhdHVzTW9kYWwuc2V0VmFsaWQodGV4dCwgdmFsaWRhdG9yLnZhbGlkYXRlU3ltYm9sKHRoaXMuc3RhdHVzQ29uZmlndXJhdGlvbigpKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnNldERpc2FibGVkKHRoaXMuaXNDb3JlU3RhdHVzKVxuICAgICAgICAgICAgLnRoZW4oKF9zZXR0aW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gU2hvdyBhbnkgZXJyb3IgaWYgdGhlIGluaXRpYWwgdmFsdWUgbG9hZGVkIGlzIGluY29ycmVjdC5cbiAgICAgICAgICAgICAgICBDdXN0b21TdGF0dXNNb2RhbC5zZXRWYWxpZChzdGF0dXNTeW1ib2xUZXh0LCB2YWxpZGF0b3IudmFsaWRhdGVTeW1ib2wodGhpcy5zdGF0dXNDb25maWd1cmF0aW9uKCkpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBzdGF0dXNOYW1lVGV4dDogVGV4dENvbXBvbmVudDtcbiAgICAgICAgbmV3IFNldHRpbmcoc2V0dGluZ0RpdilcbiAgICAgICAgICAgIC5zZXROYW1lKCdUYXNrIFN0YXR1cyBOYW1lJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdUaGlzIGlzIHRoZSBmcmllbmRseSBuYW1lIG9mIHRoZSB0YXNrIHN0YXR1cy4nKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+IHtcbiAgICAgICAgICAgICAgICBzdGF0dXNOYW1lVGV4dCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnN0YXR1c05hbWUpLm9uQ2hhbmdlKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTmFtZSA9IHY7XG4gICAgICAgICAgICAgICAgICAgIEN1c3RvbVN0YXR1c01vZGFsLnNldFZhbGlkKHRleHQsIHZhbGlkYXRvci52YWxpZGF0ZU5hbWUodGhpcy5zdGF0dXNDb25maWd1cmF0aW9uKCkpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoX3NldHRpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBDdXN0b21TdGF0dXNNb2RhbC5zZXRWYWxpZChzdGF0dXNOYW1lVGV4dCwgdmFsaWRhdG9yLnZhbGlkYXRlTmFtZSh0aGlzLnN0YXR1c0NvbmZpZ3VyYXRpb24oKSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHN0YXR1c05leHRTeW1ib2xUZXh0OiBUZXh0Q29tcG9uZW50O1xuICAgICAgICBuZXcgU2V0dGluZyhzZXR0aW5nRGl2KVxuICAgICAgICAgICAgLnNldE5hbWUoJ1Rhc2sgTmV4dCBTdGF0dXMgU3ltYm9sJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdXaGVuIGNsaWNrZWQgb24gdGhpcyBpcyB0aGUgc3ltYm9sIHRoYXQgc2hvdWxkIGJlIHVzZWQgbmV4dC4nKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+IHtcbiAgICAgICAgICAgICAgICBzdGF0dXNOZXh0U3ltYm9sVGV4dCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnN0YXR1c05leHRTeW1ib2wpLm9uQ2hhbmdlKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTmV4dFN5bWJvbCA9IHY7XG4gICAgICAgICAgICAgICAgICAgIEN1c3RvbVN0YXR1c01vZGFsLnNldFZhbGlkKHRleHQsIHZhbGlkYXRvci52YWxpZGF0ZU5leHRTeW1ib2wodGhpcy5zdGF0dXNDb25maWd1cmF0aW9uKCkpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoX3NldHRpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBDdXN0b21TdGF0dXNNb2RhbC5zZXRWYWxpZChcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzTmV4dFN5bWJvbFRleHQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZU5leHRTeW1ib2wodGhpcy5zdGF0dXNDb25maWd1cmF0aW9uKCkpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhzZXR0aW5nRGl2KVxuICAgICAgICAgICAgLnNldE5hbWUoJ1Rhc2sgU3RhdHVzIFR5cGUnKVxuICAgICAgICAgICAgLnNldERlc2MoJ0NvbnRyb2wgaG93IHRoZSBzdGF0dXMgYmVoYXZlcyBmb3Igc2VhcmNoaW5nIGFuZCB0b2dnbGluZy4nKVxuICAgICAgICAgICAgLmFkZERyb3Bkb3duKChkcm9wZG93bikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVzID0gW1xuICAgICAgICAgICAgICAgICAgICBTdGF0dXNUeXBlLlRPRE8sXG4gICAgICAgICAgICAgICAgICAgIFN0YXR1c1R5cGUuSU5fUFJPR1JFU1MsXG4gICAgICAgICAgICAgICAgICAgIFN0YXR1c1R5cGUuRE9ORSxcbiAgICAgICAgICAgICAgICAgICAgU3RhdHVzVHlwZS5DQU5DRUxMRUQsXG4gICAgICAgICAgICAgICAgICAgIFN0YXR1c1R5cGUuTk9OX1RBU0ssXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB0eXBlcy5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbihzLCBzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnR5cGUpLm9uQ2hhbmdlKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IFN0YXR1cy5nZXRUeXBlRnJvbVN0YXR1c1R5cGVTdHJpbmcodik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoU3RhdHVzLnRhc2tzUGx1Z2luQ2FuQ3JlYXRlQ29tbWFuZHNGb3JTdGF0dXNlcygpKSB7XG4gICAgICAgICAgICBuZXcgU2V0dGluZyhzZXR0aW5nRGl2KVxuICAgICAgICAgICAgICAgIC5zZXROYW1lKCdBdmFpbGFibGUgYXMgY29tbWFuZCcpXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgICAgICdJZiBlbmFibGVkIHRoaXMgc3RhdHVzIHdpbGwgYmUgYXZhaWxhYmxlIGFzIGEgY29tbWFuZCBzbyB5b3UgY2FuIGFzc2lnbiBhIGhvdGtleSBhbmQgdG9nZ2xlIHRoZSBzdGF0dXMgdXNpbmcgaXQuJyxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnN0YXR1c0F2YWlsYWJsZUFzQ29tbWFuZCkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0F2YWlsYWJsZUFzQ29tbWFuZCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvb3RlckVsID0gY29udGVudEVsLmNyZWF0ZURpdigpO1xuICAgICAgICBjb25zdCBmb290ZXJCdXR0b25zID0gbmV3IFNldHRpbmcoZm9vdGVyRWwpO1xuICAgICAgICBmb290ZXJCdXR0b25zLmFkZEJ1dHRvbigoYikgPT4ge1xuICAgICAgICAgICAgYi5zZXRUb29sdGlwKCdTYXZlJylcbiAgICAgICAgICAgICAgICAuc2V0SWNvbignY2hlY2ttYXJrJylcbiAgICAgICAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRvci52YWxpZGF0ZSh0aGlzLnN0YXR1c0NvbmZpZ3VyYXRpb24oKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9ycy5qb2luKCdcXG4nKSArICdcXG5cXG4nICsgJ0ZpeCBlcnJvcnMgYmVmb3JlIHNhdmluZy4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5kZWJ1ZyhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9vdGVyQnV0dG9ucy5hZGRFeHRyYUJ1dHRvbigoYikgPT4ge1xuICAgICAgICAgICAgYi5zZXRJY29uKCdjcm9zcycpXG4gICAgICAgICAgICAgICAgLnNldFRvb2x0aXAoJ0NhbmNlbCcpXG4gICAgICAgICAgICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGVUaXRsZShhZG1vbml0aW9uUHJldmlldzogSFRNTEVsZW1lbnQsIHRpdGxlOiBzdHJpbmcpIHtcbiAgICAvLyAgICAgbGV0IHRpdGxlU3BhbiA9IGFkbW9uaXRpb25QcmV2aWV3LnF1ZXJ5U2VsZWN0b3IoJy5hZG1vbml0aW9uLXRpdGxlLWNvbnRlbnQnKTtcbiAgICAvLyAgICAgbGV0IGljb25FbCA9IGFkbW9uaXRpb25QcmV2aWV3LnF1ZXJ5U2VsZWN0b3IoJy5hZG1vbml0aW9uLXRpdGxlLWljb24nKTtcbiAgICAvLyAgICAgdGl0bGVTcGFuLnRleHRDb250ZW50ID0gdGl0bGU7XG4gICAgLy8gICAgIHRpdGxlU3Bhbi5wcmVwZW5kKGljb25FbCk7XG4gICAgLy8gfVxuICAgIG9uT3BlbigpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNldFZhbGlkYXRpb25FcnJvcih0ZXh0SW5wdXQ6IFRleHRDb21wb25lbnQpIHtcbiAgICAgICAgdGV4dElucHV0LmlucHV0RWwuYWRkQ2xhc3MoJ3Rhc2tzLXNldHRpbmdzLWlzLWludmFsaWQnKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVtb3ZlVmFsaWRhdGlvbkVycm9yKHRleHRJbnB1dDogVGV4dENvbXBvbmVudCkge1xuICAgICAgICB0ZXh0SW5wdXQuaW5wdXRFbC5yZW1vdmVDbGFzcygndGFza3Mtc2V0dGluZ3MtaXMtaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHNldFZhbGlkKHRleHQ6IFRleHRDb21wb25lbnQsIG1lc3NhZ2VzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCB2YWxpZCA9IG1lc3NhZ2VzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgICBDdXN0b21TdGF0dXNNb2RhbC5yZW1vdmVWYWxpZGF0aW9uRXJyb3IodGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBDdXN0b21TdGF0dXNNb2RhbC5zZXRWYWxpZGF0aW9uRXJyb3IodGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGF0dXNDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9TdGF0dXNDb25maWd1cmF0aW9uJztcbmltcG9ydCB7IFN0YXR1c1R5cGUgfSBmcm9tICcuL1N0YXR1c0NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBTdGF0dXNDb2xsZWN0aW9uRW50cnkgfSBmcm9tICcuL1N0YXR1c0NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi9TdGF0dXMnO1xuaW1wb3J0IHsgU3RhdHVzUmVnaXN0cnkgfSBmcm9tICcuL1N0YXR1c1JlZ2lzdHJ5JztcblxuZXhwb3J0IGNsYXNzIFN0YXR1c1ZhbGlkYXRvciB7XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRhdGUgaW4gdGhpcyBvYmplY3QgaXMgdmFsaWQsIGFuZCByZXR1cm4gZXJyb3IgbWVzc2FnZShzKSBmb3IgZGlzcGxheSBpZiBub3QuXG4gICAgICovXG4gICAgcHVibGljIHZhbGlkYXRlKHN0YXR1c0NvbmZpZ3VyYXRpb246IFN0YXR1c0NvbmZpZ3VyYXRpb24pOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAvLyBNZXNzYWdlcyBhcmUgYWRkZWQgaW4gdGhlIG9yZGVyIGZpZWxkcyBhcmUgc2hvd24gd2hlbiBlZGl0aW5nIHN0YXR1c2VzLlxuICAgICAgICBlcnJvcnMucHVzaCguLi50aGlzLnZhbGlkYXRlU3ltYm9sKHN0YXR1c0NvbmZpZ3VyYXRpb24pKTtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4udGhpcy52YWxpZGF0ZU5hbWUoc3RhdHVzQ29uZmlndXJhdGlvbikpO1xuICAgICAgICBlcnJvcnMucHVzaCguLi50aGlzLnZhbGlkYXRlTmV4dFN5bWJvbChzdGF0dXNDb25maWd1cmF0aW9uKSk7XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBkYXRhIGluIFN0YXR1c0NvbGxlY3Rpb24gbGlzdHMuIFRoZXNlIGFyZSB0aGUgZGVzY3JpcHRpb25zIG9mIHN0YXR1c2VzIGluIHZhcmlvdXMgdGhlbWVzLFxuICAgICAqIHRoYXQgYXJlIGltcG9ydGVkIHZpYSBvbmUtY2xpY2sgYnV0dG9ucyBpbiB0aGUgQ3VzdG9tIFN0YXR1cyBzZXR0aW5ncy5cbiAgICAgKlxuICAgICAqIFRoaXMgZG9lcyBhIGZldyBjaGVja3MgdG8gZ3VhcmQgYWdhaW5zdCBodW1hbiBlcnJvciB3aGVuIGNyZWF0aW5nIHRoZSBsaXN0cywgYW5kIHRoZW5cbiAgICAgKiBhbHNvIGNhbGxzIHtAbGluayB2YWxpZGF0ZX0gdG9vLlxuICAgICAqIEBwYXJhbSBlbnRyeVxuICAgICAqL1xuICAgIHB1YmxpYyB2YWxpZGF0ZVN0YXR1c0NvbGxlY3Rpb25FbnRyeShlbnRyeTogU3RhdHVzQ29sbGVjdGlvbkVudHJ5KSB7XG4gICAgICAgIGNvbnN0IFtzeW1ib2wsIF9uYW1lLCBuZXh0U3RhdHVzU3ltYm9sLCB0eXBlQXNTdHJpbmddID0gZW50cnk7XG5cbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIC8vIENoZWNrcyB0aGF0IGNhbiBvbmx5IGJlIGRvbmUgb24gdGhlIHJhdyBkYXRhLlxuICAgICAgICAvLyBTdGF0dXMuY3JlYXRlRnJvbUltcG9ydGVkVmFsdWUoKSBmYWxscyBiYWNrIHRvIFN0YXR1c1R5cGUuVE9ETyBpZiB0aGVcbiAgICAgICAgLy8gdHlwZSBzdHJpbmcgaXMgbm90IHJlY29nbmlzZWQsIHNvIHdlIGhhdmUgdG8gdGVzdCB0aGF0IGZpcnN0LlxuICAgICAgICBlcnJvcnMucHVzaCguLi50aGlzLnZhbGlkYXRlVHlwZSh0eXBlQXNTdHJpbmcpKTtcblxuICAgICAgICAvLyBGb3IgdXNlcnMsIGl0IGlzIHZhbGlkIHRvIGhhdmUgYSBzdGF0dXMgdGhhdCB0b2dnbGVzIHRvIGl0c2VsZi5cbiAgICAgICAgLy8gRm9yIGltcG9ydGVkIGRhdGEgZm9yIHRoZW1lcywgaXQgc2VlbXMgd29ydGggcHJldmVudGluZyB0aGF0IHNpdHVhdGlvbixcbiAgICAgICAgLy8gdG8gZ3VhcmQgYWdhaW5zdCBodW1hbiBlcnJvciB3aGVuIHNldHRpbmcgdXAgdGhlIHN0YXR1cyBjb2xsZWN0aW9ucy5cbiAgICAgICAgLy8gQnV0IG1ha2UgYW4gZXhjZXB0aW9uIGZvciBhbnkgbm9uLXRhc2tzIGluIGltcG9ydGVkIGRhdGEuXG4gICAgICAgIGlmIChzeW1ib2wgPT09IG5leHRTdGF0dXNTeW1ib2wgJiYgdHlwZUFzU3RyaW5nICE9PSAnTk9OX1RBU0snKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChgU3RhdHVzIHN5bWJvbCAnJHtzeW1ib2x9JyB0b2dnbGVzIHRvIGl0c2VsZmApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHJhdyBkYXRhIHdhcyBub3QgdmFsaWQsIHJldHVybiBub3csIHRvIGF2b2lkIHBvdGVudGlhbGx5IG1pc2xlYWRpbmdcbiAgICAgICAgLy8gZXJyb3JzIGZyb20gbGF0ZXIgY2hlY2tzLlxuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gU3RhdHVzLmNyZWF0ZUZyb21JbXBvcnRlZFZhbHVlKGVudHJ5KS5jb25maWd1cmF0aW9uO1xuICAgICAgICBlcnJvcnMucHVzaCguLi50aGlzLnZhbGlkYXRlU3ltYm9sVHlwZUNvbnZlbnRpb25zKGNvbmZpZ3VyYXRpb24pKTtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4udGhpcy52YWxpZGF0ZShjb25maWd1cmF0aW9uKSk7XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGVTeW1ib2woc3RhdHVzQ29uZmlndXJhdGlvbjogU3RhdHVzQ29uZmlndXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFN0YXR1c1ZhbGlkYXRvci52YWxpZGF0ZU9uZVN5bWJvbChzdGF0dXNDb25maWd1cmF0aW9uLnN5bWJvbCwgJ1Rhc2sgU3RhdHVzIFN5bWJvbCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZU5leHRTeW1ib2woc3RhdHVzQ29uZmlndXJhdGlvbjogU3RhdHVzQ29uZmlndXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFN0YXR1c1ZhbGlkYXRvci52YWxpZGF0ZU9uZVN5bWJvbChzdGF0dXNDb25maWd1cmF0aW9uLm5leHRTdGF0dXNTeW1ib2wsICdUYXNrIE5leHQgU3RhdHVzIFN5bWJvbCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZU5hbWUoc3RhdHVzQ29uZmlndXJhdGlvbjogU3RhdHVzQ29uZmlndXJhdGlvbikge1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChzdGF0dXNDb25maWd1cmF0aW9uLm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaCgnVGFzayBTdGF0dXMgTmFtZSBjYW5ub3QgYmUgZW1wdHkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGVUeXBlKHN5bWJvbE5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzVHlwZUVsZW1lbnQgPSBTdGF0dXNUeXBlW3N5bWJvbE5hbWUgYXMga2V5b2YgdHlwZW9mIFN0YXR1c1R5cGVdO1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICghc3RhdHVzVHlwZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGBTdGF0dXMgVHlwZSBcIiR7c3ltYm9sTmFtZX1cIiBpcyBub3QgYSB2YWxpZCB0eXBlYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXR1c1R5cGVFbGVtZW50ID09IFN0YXR1c1R5cGUuRU1QVFkpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKCdTdGF0dXMgVHlwZSBcIkVNUFRZXCIgaXMgbm90IHBlcm1pdHRlZCBpbiB1c2VyIGRhdGEnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZVN5bWJvbFR5cGVDb252ZW50aW9ucyhjb25maWd1cmF0aW9uOiBTdGF0dXNDb25maWd1cmF0aW9uKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgY29uc3Qgc3ltYm9sID0gY29uZmlndXJhdGlvbi5zeW1ib2w7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IFN0YXR1c1JlZ2lzdHJ5KCk7XG4gICAgICAgIGNvbnN0IHN5bWJvbFRvU2VhcmNoRm9yID0gc3ltYm9sID09PSAnWCcgPyAneCcgOiBzeW1ib2w7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRTdGF0dXNGcm9tUmVnaXN0cnkgPSByZWdpc3RyeS5ieVN5bWJvbChzeW1ib2xUb1NlYXJjaEZvcik7XG4gICAgICAgIGlmIChkZWZhdWx0U3RhdHVzRnJvbVJlZ2lzdHJ5LnR5cGUgIT09IFN0YXR1c1R5cGUuRU1QVFkpIHtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLm5leHRTdGF0dXNTeW1ib2wgIT09IGRlZmF1bHRTdGF0dXNGcm9tUmVnaXN0cnkubmV4dFN0YXR1c1N5bWJvbCkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgTmV4dCBTdGF0dXMgU3ltYm9sIGZvciBzeW1ib2wgJyR7c3ltYm9sfSc6ICcke2NvbmZpZ3VyYXRpb24ubmV4dFN0YXR1c1N5bWJvbH0nIGlzIGluY29uc2lzdGVudCB3aXRoIGNvbnZlbnRpb24gJyR7ZGVmYXVsdFN0YXR1c0Zyb21SZWdpc3RyeS5uZXh0U3RhdHVzU3ltYm9sfSdgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi50eXBlICE9PSBkZWZhdWx0U3RhdHVzRnJvbVJlZ2lzdHJ5LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYFN0YXR1cyBUeXBlIGZvciBzeW1ib2wgJyR7c3ltYm9sfSc6ICcke2NvbmZpZ3VyYXRpb24udHlwZX0nIGlzIGluY29uc2lzdGVudCB3aXRoIGNvbnZlbnRpb24gJyR7ZGVmYXVsdFN0YXR1c0Zyb21SZWdpc3RyeS50eXBlfSdgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHZhbGlkYXRlT25lU3ltYm9sKHN5bWJvbDogc3RyaW5nLCBzeW1ib2xOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKHN5bWJvbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke3N5bWJvbE5hbWV9IGNhbm5vdCBiZSBlbXB0eS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzeW1ib2wubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7c3ltYm9sTmFtZX0gKFwiJHtzeW1ib2x9XCIpIG11c3QgYmUgYSBzaW5nbGUgY2hhcmFjdGVyLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEFwcCwgRWRpdG9yLCBFZGl0b3JTdWdnZXN0LCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgRWRpdG9yUG9zaXRpb24sIEVkaXRvclN1Z2dlc3RDb250ZXh0LCBFZGl0b3JTdWdnZXN0VHJpZ2dlckluZm8gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgU2V0dGluZ3MgfSBmcm9tICcuLi9Db25maWcvU2V0dGluZ3MnO1xuaW1wb3J0ICogYXMgdGFzayBmcm9tICcuLi9UYXNrJztcbmltcG9ydCB7IGJ1aWxkU3VnZ2VzdGlvbnMgfSBmcm9tICcuL1N1Z2dlc3Rvcic7XG5pbXBvcnQgdHlwZSB7IFN1Z2dlc3RJbmZvIH0gZnJvbSAnLi9TdWdnZXN0b3InO1xuXG5leHBvcnQgdHlwZSBTdWdnZXN0SW5mb1dpdGhDb250ZXh0ID0gU3VnZ2VzdEluZm8gJiB7XG4gICAgY29udGV4dDogRWRpdG9yU3VnZ2VzdENvbnRleHQ7XG59O1xuXG5leHBvcnQgY2xhc3MgRWRpdG9yU3VnZ2VzdG9yIGV4dGVuZHMgRWRpdG9yU3VnZ2VzdDxTdWdnZXN0SW5mb1dpdGhDb250ZXh0PiB7XG4gICAgcHJpdmF0ZSBzZXR0aW5nczogU2V0dGluZ3M7XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgc2V0dGluZ3M6IFNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKGFwcCk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB9XG5cbiAgICBvblRyaWdnZXIoY3Vyc29yOiBFZGl0b3JQb3NpdGlvbiwgZWRpdG9yOiBFZGl0b3IsIF9maWxlOiBURmlsZSk6IEVkaXRvclN1Z2dlc3RUcmlnZ2VySW5mbyB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuYXV0b1N1Z2dlc3RJbkVkaXRvcikgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBlZGl0b3IuZ2V0TGluZShjdXJzb3IubGluZSk7XG4gICAgICAgIGlmIChsaW5lLmNvbnRhaW5zKHRoaXMuc2V0dGluZ3MuZ2xvYmFsRmlsdGVyKSAmJiBsaW5lLm1hdGNoKHRhc2suVGFza1JlZ3VsYXJFeHByZXNzaW9ucy50YXNrUmVnZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiB7IGxpbmU6IGN1cnNvci5saW5lLCBjaDogMCB9LFxuICAgICAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAgICAgICBsaW5lOiBjdXJzb3IubGluZSxcbiAgICAgICAgICAgICAgICAgICAgY2g6IGxpbmUubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcXVlcnk6IGxpbmUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldFN1Z2dlc3Rpb25zKGNvbnRleHQ6IEVkaXRvclN1Z2dlc3RDb250ZXh0KTogU3VnZ2VzdEluZm9XaXRoQ29udGV4dFtdIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGNvbnRleHQucXVlcnk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDdXJzb3IgPSBjb250ZXh0LmVkaXRvci5nZXRDdXJzb3IoKTtcblxuICAgICAgICBjb25zdCBzdWdnZXN0aW9uczogU3VnZ2VzdEluZm9bXSA9IGJ1aWxkU3VnZ2VzdGlvbnMobGluZSwgY3VycmVudEN1cnNvci5jaCwgdGhpcy5zZXR0aW5ncyk7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBlZGl0b3IgY29udGV4dCB0byBhbGwgdGhlIHN1Z2dlc3Rpb25zXG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zV2l0aENvbnRleHQ6IFN1Z2dlc3RJbmZvV2l0aENvbnRleHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHN1Z2dlc3Rpb24gb2Ygc3VnZ2VzdGlvbnMpIHN1Z2dlc3Rpb25zV2l0aENvbnRleHQucHVzaCh7IC4uLnN1Z2dlc3Rpb24sIGNvbnRleHQ6IGNvbnRleHQgfSk7XG5cbiAgICAgICAgcmV0dXJuIHN1Z2dlc3Rpb25zV2l0aENvbnRleHQ7XG4gICAgfVxuXG4gICAgcmVuZGVyU3VnZ2VzdGlvbih2YWx1ZTogU3VnZ2VzdEluZm9XaXRoQ29udGV4dCwgZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGVsLnNldFRleHQodmFsdWUuZGlzcGxheVRleHQpO1xuICAgIH1cblxuICAgIHNlbGVjdFN1Z2dlc3Rpb24odmFsdWU6IFN1Z2dlc3RJbmZvV2l0aENvbnRleHQsIF9ldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHZhbHVlLmNvbnRleHQuZWRpdG9yO1xuICAgICAgICBpZiAodmFsdWUuc3VnZ2VzdGlvblR5cGUgPT09ICdlbXB0eScpIHtcbiAgICAgICAgICAgIC8vIENsb3NlIHRoZSBzdWdnZXN0aW9uIGRpYWxvZyBhbmQgc2ltdWxhdGUgYW4gRW50ZXIgcHJlc3MgdG8gdGhlIGVkaXRvclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRDbG9uZSA9IG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywge1xuICAgICAgICAgICAgICAgIGNvZGU6ICdFbnRlcicsXG4gICAgICAgICAgICAgICAga2V5OiAnRW50ZXInLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAoZWRpdG9yIGFzIGFueSk/LmNtPy5jb250ZW50RE9NPy5kaXNwYXRjaEV2ZW50KGV2ZW50Q2xvbmUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDdXJzb3IgPSB2YWx1ZS5jb250ZXh0LmVkaXRvci5nZXRDdXJzb3IoKTtcbiAgICAgICAgY29uc3QgcmVwbGFjZUZyb20gPSB7XG4gICAgICAgICAgICBsaW5lOiBjdXJyZW50Q3Vyc29yLmxpbmUsXG4gICAgICAgICAgICBjaDogdmFsdWUuaW5zZXJ0QXQgPz8gY3VycmVudEN1cnNvci5jaCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVwbGFjZVRvID0gdmFsdWUuaW5zZXJ0U2tpcFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBsaW5lOiBjdXJyZW50Q3Vyc29yLmxpbmUsXG4gICAgICAgICAgICAgICAgICBjaDogcmVwbGFjZUZyb20uY2ggKyB2YWx1ZS5pbnNlcnRTa2lwLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFsdWUuY29udGV4dC5lZGl0b3IucmVwbGFjZVJhbmdlKHZhbHVlLmFwcGVuZFRleHQsIHJlcGxhY2VGcm9tLCByZXBsYWNlVG8pO1xuICAgICAgICB2YWx1ZS5jb250ZXh0LmVkaXRvci5zZXRDdXJzb3Ioe1xuICAgICAgICAgICAgbGluZTogY3VycmVudEN1cnNvci5saW5lLFxuICAgICAgICAgICAgY2g6IHJlcGxhY2VGcm9tLmNoICsgdmFsdWUuYXBwZW5kVGV4dC5sZW5ndGgsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNldHRpbmdzIH0gZnJvbSAnLi4vQ29uZmlnL1NldHRpbmdzJztcbmltcG9ydCB7IERhdGVQYXJzZXIgfSBmcm9tICcuLi9RdWVyeS9EYXRlUGFyc2VyJztcbmltcG9ydCB7IGRvQXV0b2NvbXBsZXRlIH0gZnJvbSAnLi4vRGF0ZUFiYnJldmlhdGlvbnMnO1xuaW1wb3J0IHsgUmVjdXJyZW5jZSB9IGZyb20gJy4uL1JlY3VycmVuY2UnO1xuXG5pbXBvcnQgKiBhcyB0YXNrIGZyb20gJy4uL1Rhc2snO1xuXG5jb25zdCBkYXRlUHJlZml4Q2hhcmFjdGVycyA9IGAke3Rhc2suc3RhcnREYXRlU3ltYm9sfSR7dGFzay5zY2hlZHVsZWREYXRlU3ltYm9sfSR7dGFzay5kdWVEYXRlU3ltYm9sfWA7XG5cbi8qXG4gKiBBIHN1Z2dlc3Rpb24gcHJlc2VudGVkIHRvIHRoZSB1c2VyIGFuZCBzb21lIG1ldGFkYXRhIGFib3V0IGl0LlxuICovXG5leHBvcnQgdHlwZSBTdWdnZXN0SW5mbyA9IHtcbiAgICBzdWdnZXN0aW9uVHlwZT86ICdtYXRjaCcgfCAnZGVmYXVsdCcgfCAnZW1wdHknO1xuICAgIC8vIFdoYXQgdG8gZGlzcGxheSB0byB0aGUgdXNlclxuICAgIGRpc3BsYXlUZXh0OiBzdHJpbmc7XG4gICAgLy8gV2hhdCB0byBhcHBlbmQgdG8gdGhlIG5vdGVcbiAgICBhcHBlbmRUZXh0OiBzdHJpbmc7XG4gICAgLy8gQXQgd2hhdCBpbmRleCBpbiB0aGUgbGluZSB0byBkbyB0aGUgaW5zZXJ0aW9uIChpZiBub3Qgc3BlY2lmaWVkLCB0aGUgY3Vyc29yIGxvY2F0aW9uIGlzIHVzZWQpXG4gICAgaW5zZXJ0QXQ/OiBudW1iZXI7XG4gICAgLy8gSG93IG1hbnkgY2hhcmFjdGVycyB0byBza2lwIGZyb20gdGhlIG9yaWdpbmFsIGxpbmUgKGUuZy4gaWYgcmVwbGFjaW5nIGV4aXN0aW5nIHRleHQpXG4gICAgaW5zZXJ0U2tpcD86IG51bWJlcjtcbn07XG5cbi8qXG4gKiBSZXR1cm4gYSBsaXN0IG9mIHN1Z2dlc3Rpb25zLCBlaXRoZXIgZ2VuZXJpYyBvciBtb3JlIGZpbmUtZ3JhaW5lZCB0byB0aGUgd29yZHMgYXQgdGhlIGN1cnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3VnZ2VzdGlvbnMobGluZTogc3RyaW5nLCBjdXJzb3JQb3M6IG51bWJlciwgc2V0dGluZ3M6IFNldHRpbmdzKTogU3VnZ2VzdEluZm9bXSB7XG4gICAgbGV0IHN1Z2dlc3Rpb25zOiBTdWdnZXN0SW5mb1tdID0gW107XG5cbiAgICAvLyBTdGVwIDE6IGFkZCBkYXRlIHN1Z2dlc3Rpb25zIGlmIHJlbGV2YW50XG4gICAgc3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5jb25jYXQoYWRkRGF0ZXNTdWdnZXN0aW9ucyhsaW5lLCBjdXJzb3JQb3MsIHNldHRpbmdzKSk7XG5cbiAgICAvLyBTdGVwIDI6IGFkZCByZWN1cnJlbmNlIHN1Z2dlc3Rpb25zIGlmIHJlbGV2YW50XG4gICAgc3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5jb25jYXQoYWRkUmVjdXJyZW5jZVN1Z2dlc3Rpb25zKGxpbmUsIGN1cnNvclBvcywgc2V0dGluZ3MpKTtcblxuICAgIC8vIFN0ZXAgMzogYWRkIG1vcmUgZ2VuZXJhbCBzdWdnZXN0aW9ucyAoJ2R1ZScsICdyZWN1cnJlbmNlJyBldGMpXG4gICAgY29uc3QgbW9yZVBvc3NpYmxlU3VnZ2VzdGlvbnMgPSBnZXRQb3NzaWJsZUNvbXBvbmVudFN1Z2dlc3Rpb25zKGxpbmUsIHNldHRpbmdzKTtcbiAgICAvLyBXZSBub3cgZmlsdGVyIHRoZSBnZW5lcmFsIHN1Z2dlc3Rpb25zIGFjY29yZGluZyB0byB0aGUgd29yZCBhdCB0aGUgY3Vyc29yLiBJZiB0aGVyZSdzXG4gICAgLy8gc29tZXRoaW5nIHRvIG1hdGNoLCB3ZSBmaWx0ZXIgdGhlIHN1Z2dlc3Rpb25zIGFjY29yZGluZ2x5LCBzbyB0aGUgdXNlciBjYW4gZ2V0IG1vcmUgc3BlY2lmaWNcbiAgICAvLyByZXN1bHRzIGFjY29yZGluZyB0byB3aGF0IHNoZSdzIHR5cGluZy5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIGdvb2QgbWF0Y2gsIHByZXNlbnQgdGhlIHN1Z2dlc3Rpb25zIGFzIHRoZXkgYXJlXG4gICAgY29uc3Qgd29yZE1hdGNoID0gbWF0Y2hCeVBvc2l0aW9uKGxpbmUsIC8oW2EtekEtWidfLV0qKS9nLCBjdXJzb3JQb3MpO1xuICAgIGxldCBhZGRlZFN1Z2dlc3Rpb25zID0gZmFsc2U7XG4gICAgaWYgKHdvcmRNYXRjaCAmJiB3b3JkTWF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB3b3JkVW5kZXJDdXJzb3IgPSB3b3JkTWF0Y2hbMF07XG4gICAgICAgIGlmICh3b3JkVW5kZXJDdXJzb3IubGVuZ3RoID49IE1hdGgubWF4KDEsIHNldHRpbmdzLmF1dG9TdWdnZXN0TWluTWF0Y2gpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFN1Z2dlc3Rpb25zID0gbW9yZVBvc3NpYmxlU3VnZ2VzdGlvbnMuZmlsdGVyKChzdWdnZXN0SW5mbykgPT5cbiAgICAgICAgICAgICAgICBzdWdnZXN0SW5mby5kaXNwbGF5VGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHdvcmRVbmRlckN1cnNvci50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbHRlcmVkIG9mIGZpbHRlcmVkU3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvblR5cGU6ICdtYXRjaCcsXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlUZXh0OiBmaWx0ZXJlZC5kaXNwbGF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVGV4dDogZmlsdGVyZWQuYXBwZW5kVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QXQ6IHdvcmRNYXRjaC5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0U2tpcDogd29yZFVuZGVyQ3Vyc29yLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhZGRlZFN1Z2dlc3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUaGF0J3Mgd2hlcmUgd2UncmUgYWRkaW5nIGFsbCB0aGUgc3VnZ2VzdGlvbnMgaW4gY2FzZSB0aGVyZSdzIG5vdGhpbmcgc3BlY2lmaWMgdG8gbWF0Y2hcbiAgICAvLyAoYW5kIHdlJ3JlIGFsbG93ZWQgYnkgdGhlIHNldHRpbmdzIHRvIGJyaW5nIGJhY2sgYSB6ZXJvLXNpemVkIG1hdGNoKVxuICAgIGlmICghYWRkZWRTdWdnZXN0aW9ucyAmJiBzZXR0aW5ncy5hdXRvU3VnZ2VzdE1pbk1hdGNoID09PSAwKVxuICAgICAgICBzdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zLmNvbmNhdChtb3JlUG9zc2libGVTdWdnZXN0aW9ucyk7XG5cbiAgICAvLyBVbmxlc3Mgd2UgaGF2ZSBhIHN1Z2dlc3Rpb24gdGhhdCBpcyBhIG1hdGNoIGZvciBzb21ldGhpbmcgdGhlIHVzZXIgaXMgY3VycmVudGx5IHR5cGluZywgYWRkXG4gICAgLy8gYW4gJ0VudGVyJyBlbnRyeSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZW51LCBzbyBhbiBFbnRlciBwcmVzcyB3aWxsIG1vdmUgdG8gdGhlIG5leHQgbGluZVxuICAgIC8vIHJhdGhlciB0aGFuIGluc2VydCBhIHN1Z2dlc3Rpb25cbiAgICBpZiAoc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCAmJiAhc3VnZ2VzdGlvbnMuc29tZSgodmFsdWUpID0+IHZhbHVlLnN1Z2dlc3Rpb25UeXBlID09PSAnbWF0Y2gnKSkge1xuICAgICAgICAvLyBObyBhY3R1YWwgbWF0Y2gsIG9ubHkgZGVmYXVsdCBvbmVzXG4gICAgICAgIHN1Z2dlc3Rpb25zLnVuc2hpZnQoe1xuICAgICAgICAgICAgc3VnZ2VzdGlvblR5cGU6ICdlbXB0eScsXG4gICAgICAgICAgICBkaXNwbGF5VGV4dDogJ1x1MjNDRScsXG4gICAgICAgICAgICBhcHBlbmRUZXh0OiAnXFxuJyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRWl0aGVyIHdheSwgYWZ0ZXIgYWxsIHRoZSBhZ2dyZWdhdGlvbnMgYWJvdmUsIG5ldmVyIHN1Z2dlc3QgbW9yZSB0aGFuIHRoZSBtYXggaXRlbXNcbiAgICBzdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zLnNsaWNlKDAsIHNldHRpbmdzLmF1dG9TdWdnZXN0TWF4SXRlbXMpO1xuXG4gICAgcmV0dXJuIHN1Z2dlc3Rpb25zO1xufVxuXG5mdW5jdGlvbiBoYXNQcmlvcml0eShsaW5lOiBzdHJpbmcpIHtcbiAgICBpZiAoT2JqZWN0LnZhbHVlcyh0YXNrLnByaW9yaXR5U3ltYm9scykuc29tZSgodmFsdWUpID0+IHZhbHVlLmxlbmd0aCA+IDAgJiYgbGluZS5pbmNsdWRlcyh2YWx1ZSkpKSByZXR1cm4gdHJ1ZTtcbn1cblxuLypcbiAqIEdldCBzdWdnZXN0aW9ucyBmb3IgZ2VuZXJpYyB0YXNrIGNvbXBvbmVudHMsIGUuZy4gYSBwcmlvcml0eSBvciBhICdkdWUnIHN5bWJvbFxuICovXG5mdW5jdGlvbiBnZXRQb3NzaWJsZUNvbXBvbmVudFN1Z2dlc3Rpb25zKGxpbmU6IHN0cmluZywgX3NldHRpbmdzOiBTZXR0aW5ncyk6IFN1Z2dlc3RJbmZvW10ge1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBTdWdnZXN0SW5mb1tdID0gW107XG5cbiAgICBpZiAoIWxpbmUuaW5jbHVkZXModGFzay5kdWVEYXRlU3ltYm9sKSlcbiAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dDogYCR7dGFzay5kdWVEYXRlU3ltYm9sfSBkdWUgZGF0ZWAsXG4gICAgICAgICAgICBhcHBlbmRUZXh0OiBgJHt0YXNrLmR1ZURhdGVTeW1ib2x9IGAsXG4gICAgICAgIH0pO1xuICAgIGlmICghbGluZS5pbmNsdWRlcyh0YXNrLnN0YXJ0RGF0ZVN5bWJvbCkpXG4gICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgZGlzcGxheVRleHQ6IGAke3Rhc2suc3RhcnREYXRlU3ltYm9sfSBzdGFydCBkYXRlYCxcbiAgICAgICAgICAgIGFwcGVuZFRleHQ6IGAke3Rhc2suc3RhcnREYXRlU3ltYm9sfSBgLFxuICAgICAgICB9KTtcbiAgICBpZiAoIWxpbmUuaW5jbHVkZXModGFzay5zY2hlZHVsZWREYXRlU3ltYm9sKSlcbiAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dDogYCR7dGFzay5zY2hlZHVsZWREYXRlU3ltYm9sfSBzY2hlZHVsZWQgZGF0ZWAsXG4gICAgICAgICAgICBhcHBlbmRUZXh0OiBgJHt0YXNrLnNjaGVkdWxlZERhdGVTeW1ib2x9IGAsXG4gICAgICAgIH0pO1xuICAgIGlmICghaGFzUHJpb3JpdHkobGluZSkpIHtcbiAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dDogYCR7dGFzay5wcmlvcml0eVN5bWJvbHMuSGlnaH0gaGlnaCBwcmlvcml0eWAsXG4gICAgICAgICAgICBhcHBlbmRUZXh0OiBgJHt0YXNrLnByaW9yaXR5U3ltYm9scy5IaWdofSBgLFxuICAgICAgICB9KTtcbiAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dDogYCR7dGFzay5wcmlvcml0eVN5bWJvbHMuTWVkaXVtfSBtZWRpdW0gcHJpb3JpdHlgLFxuICAgICAgICAgICAgYXBwZW5kVGV4dDogYCR7dGFzay5wcmlvcml0eVN5bWJvbHMuTWVkaXVtfSBgLFxuICAgICAgICB9KTtcbiAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dDogYCR7dGFzay5wcmlvcml0eVN5bWJvbHMuTG93fSBsb3cgcHJpb3JpdHlgLFxuICAgICAgICAgICAgYXBwZW5kVGV4dDogYCR7dGFzay5wcmlvcml0eVN5bWJvbHMuTG93fSBgLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFsaW5lLmluY2x1ZGVzKHRhc2sucmVjdXJyZW5jZVN5bWJvbCkpXG4gICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgZGlzcGxheVRleHQ6IGAke3Rhc2sucmVjdXJyZW5jZVN5bWJvbH0gcmVjdXJyaW5nIChyZXBlYXQpYCxcbiAgICAgICAgICAgIGFwcGVuZFRleHQ6IGAke3Rhc2sucmVjdXJyZW5jZVN5bWJvbH0gYCxcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gc3VnZ2VzdGlvbnM7XG59XG5cbi8qXG4gKiBJZiB0aGUgY3Vyc29yIGlzIGxvY2F0ZWQgaW4gYSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgZGF0ZSAoZHVlLCBzdGFydCBkYXRlIG9yIHNjaGVkdWxlZCBkYXRlKSxcbiAqIHN1Z2dlc3Qgb3B0aW9ucyBmb3Igd2hhdCB0byBlbnRlciBhcyBhIGRhdGUuXG4gKiBUaGlzIGhhcyB0d28gcGFydHM6IGVpdGhlciBnZW5lcmljIHByZWRlZmluZWQgc3VnZ2VzdGlvbnMsIG9yIGEgc2luZ2xlIHN1Z2dlc3Rpb24gdGhhdCBpcyBhIHBhcnNlZCByZXN1bHRcbiAqIG9mIHdoYXQgdGhlIHVzZXIgaXMgdHlwaW5nLlxuICogR2VuZXJpYyBwcmVkZWZpbmVkIHN1Z2dlc3Rpb25zLCBpbiB0dXJuLCBhbHNvIGhhdmUgdHdvIG9wdGlvbnM6IGVpdGhlciBmaWx0ZXJlZCAoaWYgdGhlIHVzZXIgc3RhcnRlZCB0eXBpbmdcbiAqIHNvbWV0aGluZyB3aGVyZSBhIGRhdGUgaXMgZXhwZWN0ZWQpIG9yIHVuZmlsdGVyZWRcbiAqL1xuZnVuY3Rpb24gYWRkRGF0ZXNTdWdnZXN0aW9ucyhsaW5lOiBzdHJpbmcsIGN1cnNvclBvczogbnVtYmVyLCBzZXR0aW5nczogU2V0dGluZ3MpOiBTdWdnZXN0SW5mb1tdIHtcbiAgICBjb25zdCBnZW5lcmljU3VnZ2VzdGlvbnMgPSBbXG4gICAgICAgICd0b2RheScsXG4gICAgICAgICd0b21vcnJvdycsXG4gICAgICAgICdTdW5kYXknLFxuICAgICAgICAnTW9uZGF5JyxcbiAgICAgICAgJ1R1ZXNkYXknLFxuICAgICAgICAnV2VkbmVzZGF5JyxcbiAgICAgICAgJ1RodXJzZGF5JyxcbiAgICAgICAgJ0ZyaWRheScsXG4gICAgICAgICdTYXR1cmRheScsXG4gICAgICAgICduZXh0IHdlZWsnLFxuICAgICAgICAnbmV4dCBtb250aCcsXG4gICAgICAgICduZXh0IHllYXInLFxuICAgIF07XG5cbiAgICBjb25zdCByZXN1bHRzOiBTdWdnZXN0SW5mb1tdID0gW107XG4gICAgY29uc3QgZGF0ZVJlZ2V4ID0gbmV3IFJlZ0V4cChgKFske2RhdGVQcmVmaXhDaGFyYWN0ZXJzfV0pXFxcXHMqKFswLTlhLXpBLVogXSopYCwgJ3VnJyk7XG4gICAgY29uc3QgZGF0ZU1hdGNoID0gbWF0Y2hCeVBvc2l0aW9uKGxpbmUsIGRhdGVSZWdleCwgY3Vyc29yUG9zKTtcbiAgICBpZiAoZGF0ZU1hdGNoICYmIGRhdGVNYXRjaC5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBkYXRlUHJlZml4ID0gZGF0ZU1hdGNoWzFdO1xuICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZGF0ZU1hdGNoWzJdO1xuICAgICAgICBpZiAoZGF0ZVN0cmluZy5sZW5ndGggPCBzZXR0aW5ncy5hdXRvU3VnZ2VzdE1pbk1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSBlbnRlcmVkIHRleHQgYXMgYSB2YWxpZCBkYXRlLlxuICAgICAgICAvLyBXZSBwYXNzIGZvcndhcmREYXRlPXRydWUgdG8gcGFyc2VEYXRlIGJlY2F1c2Ugd2UgZXhwZWN0IGR1ZSwgc3RhcnQgYW5kIHNjaGVkdWxlZCBkYXRlcyB0b1xuICAgICAgICAvLyBiZSBpbiB0aGUgZnV0dXJlLCBpLmUuIGlmIHRvZGF5IGlzIFN1bmRheSBhbmQgdGhlIHVzZXIgdHlwZWQgXCJkdWUgPEVudGVyPiBTYXR1cmRheVwiLCBzaGVcbiAgICAgICAgLy8gbW9zdCBsaWtlbHkgbWVhbnMgU2F0dXJkYXkgKmluIHRoZSBmdXR1cmUqIGFuZCBub3QgeWVzdGVyZGF5LlxuICAgICAgICBjb25zdCBwb3NzaWJsZURhdGUgPVxuICAgICAgICAgICAgZGF0ZVN0cmluZyAmJiBkYXRlU3RyaW5nLmxlbmd0aCA+IDEgPyBEYXRlUGFyc2VyLnBhcnNlRGF0ZShkb0F1dG9jb21wbGV0ZShkYXRlU3RyaW5nKSwgdHJ1ZSkgOiBudWxsO1xuICAgICAgICBpZiAocG9zc2libGVEYXRlICYmIHBvc3NpYmxlRGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZW1zIGxpa2UgdGhlIHRleHQgdGhhdCB0aGUgdXNlciB0eXBlZCBjYW4gYmUgcGFyc2VkIGFzIGEgdmFsaWQgZGF0ZS5cbiAgICAgICAgICAgIC8vIFByZXNlbnQgaXRzIGNvbXBsZXRlZCBmb3JtIGFzIGEgMXN0IHN1Z2dlc3Rpb25cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGlzcGxheVRleHQ6IGAke3Bvc3NpYmxlRGF0ZS5mb3JtYXQodGFzay5UYXNrUmVndWxhckV4cHJlc3Npb25zLmRhdGVGb3JtYXQpfWAsXG4gICAgICAgICAgICAgICAgYXBwZW5kVGV4dDogYCR7ZGF0ZVByZWZpeH0gJHtwb3NzaWJsZURhdGUuZm9ybWF0KHRhc2suVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5kYXRlRm9ybWF0KX0gYCxcbiAgICAgICAgICAgICAgICBpbnNlcnRBdDogZGF0ZU1hdGNoLmluZGV4LFxuICAgICAgICAgICAgICAgIGluc2VydFNraXA6IGRhdGVNYXRjaFswXS5sZW5ndGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdyB0byBnZW5lcmljIHByZWRlZmluZWQgc3VnZ2VzdGlvbnMuXG4gICAgICAgIC8vIElmIHdlIGdldCBhIHBhcnRpYWwgbWF0Y2ggd2l0aCBzb21lIG9mIHRoZSBzdWdnZXN0aW9ucyAoZS5nLiB0aGUgdXNlciBzdGFydGVkIHR5cGluZyBcInRvXCIpLFxuICAgICAgICAvLyB3ZSB1c2UgdGhhdCBmb3IgbWF0Y2hlcyAoXCJ0b21vcnJvd1wiLCBcInRvZGF5XCIgZXRjKS5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBqdXN0IGRpc3BsYXkgdGhlIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMsIGFuZCBlaXRoZXIgd2F5LCB0cnVuY2F0ZSB0aGVtIGV2ZW50dWFsbHkgdG9cbiAgICAgICAgLy8gYSBtYXggbnVtYmVyLiBXZSB3YW50IHRoZSBtYXggbnVtYmVyIHRvIGJlIGFyb3VuZCBoYWxmIHRoZSB0b3RhbCBhbGxvd2VkIG1hdGNoZXMsIHRvIGFsc28gYWxsb3dcbiAgICAgICAgLy8gc29tZSBnbG9iYWwgZ2VuZXJpYyBtYXRjaGVzIChlLmcuIHRhc2sgY29tcG9uZW50cykgdG8gZmluZCB0aGVpciB3YXkgdG8gdGhlIG1lbnVcbiAgICAgICAgY29uc3QgbWluTWF0Y2ggPSAxO1xuICAgICAgICBjb25zdCBtYXhHZW5lcmljU3VnZ2VzdGlvbnMgPSA1O1xuICAgICAgICBsZXQgZ2VuZXJpY01hdGNoZXMgPSBnZW5lcmljU3VnZ2VzdGlvbnNcbiAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICBkYXRlU3RyaW5nICYmXG4gICAgICAgICAgICAgICAgICAgIGRhdGVTdHJpbmcubGVuZ3RoID49IG1pbk1hdGNoICYmXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZGF0ZVN0cmluZy50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zbGljZSgwLCBtYXhHZW5lcmljU3VnZ2VzdGlvbnMpO1xuICAgICAgICBpZiAoZ2VuZXJpY01hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBEbyBjb21wbGV0ZWx5IGdlbmVyaWMgZGF0ZSBzdWdnZXN0aW9uc1xuICAgICAgICAgICAgZ2VuZXJpY01hdGNoZXMgPSBnZW5lcmljU3VnZ2VzdGlvbnMuc2xpY2UoMCwgbWF4R2VuZXJpY1N1Z2dlc3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGdlbmVyaWNNYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWREYXRlID0gRGF0ZVBhcnNlci5wYXJzZURhdGUobWF0Y2gsIHRydWUpO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IGAke3BhcnNlZERhdGUuZm9ybWF0KHRhc2suVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5kYXRlRm9ybWF0KX1gO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uVHlwZTogJ21hdGNoJyxcbiAgICAgICAgICAgICAgICBkaXNwbGF5VGV4dDogYCR7bWF0Y2h9ICgke2Zvcm1hdHRlZERhdGV9KWAsXG4gICAgICAgICAgICAgICAgYXBwZW5kVGV4dDogYCR7ZGF0ZVByZWZpeH0gJHtmb3JtYXR0ZWREYXRlfSBgLFxuICAgICAgICAgICAgICAgIGluc2VydEF0OiBkYXRlTWF0Y2guaW5kZXgsXG4gICAgICAgICAgICAgICAgaW5zZXJ0U2tpcDogZGF0ZU1hdGNoWzBdLmxlbmd0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG4vKlxuICogSWYgdGhlIGN1cnNvciBpcyBsb2NhdGVkIGluIGEgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIHJlY3VycmVuY2UgZGVzY3JpcHRpb24sIHN1Z2dlc3Qgb3B0aW9uc1xuICogZm9yIHdoYXQgdG8gZW50ZXIgYXMgYSByZWN1cnJlbmNlLlxuICogVGhpcyBoYXMgdHdvIHBhcnRzOiBlaXRoZXIgZ2VuZXJpYyBwcmVkZWZpbmVkIHN1Z2dlc3Rpb25zLCBvciBhIHNpbmdsZSBzdWdnZXN0aW9uIHRoYXQgaXMgYSBwYXJzZWQgcmVzdWx0XG4gKiBvZiB3aGF0IHRoZSB1c2VyIGlzIHR5cGluZy5cbiAqIEdlbmVyaWMgcHJlZGVmaW5lZCBzdWdnZXN0aW9ucywgaW4gdHVybiwgYWxzbyBoYXZlIHR3byBvcHRpb25zOiBlaXRoZXIgZmlsdGVyZWQgKGlmIHRoZSB1c2VyIHN0YXJ0ZWQgdHlwaW5nXG4gKiBzb21ldGhpbmcgd2hlcmUgYSByZWN1cnJlbmNlIGlzIGV4cGVjdGVkKSBvciB1bmZpbHRlcmVkXG4gKi9cbmZ1bmN0aW9uIGFkZFJlY3VycmVuY2VTdWdnZXN0aW9ucyhsaW5lOiBzdHJpbmcsIGN1cnNvclBvczogbnVtYmVyLCBzZXR0aW5nczogU2V0dGluZ3MpIHtcbiAgICBjb25zdCBnZW5lcmljU3VnZ2VzdGlvbnMgPSBbXG4gICAgICAgICdldmVyeScsXG4gICAgICAgICdldmVyeSBkYXknLFxuICAgICAgICAnZXZlcnkgd2VlaycsXG4gICAgICAgICdldmVyeSBtb250aCcsXG4gICAgICAgICdldmVyeSBtb250aCBvbiB0aGUnLFxuICAgICAgICAnZXZlcnkgeWVhcicsXG4gICAgICAgICdldmVyeSB3ZWVrIG9uIFN1bmRheScsXG4gICAgICAgICdldmVyeSB3ZWVrIG9uIE1vbmRheScsXG4gICAgICAgICdldmVyeSB3ZWVrIG9uIFR1ZXNkYXknLFxuICAgICAgICAnZXZlcnkgd2VlayBvbiBXZWRuZXNkYXknLFxuICAgICAgICAnZXZlcnkgd2VlayBvbiBUaHVyc2RheScsXG4gICAgICAgICdldmVyeSB3ZWVrIG9uIEZyaWRheScsXG4gICAgICAgICdldmVyeSB3ZWVrIG9uIFNhdHVyZGF5JyxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVzdWx0czogU3VnZ2VzdEluZm9bXSA9IFtdO1xuICAgIGNvbnN0IHJlY3VycmVuY2VSZWdleCA9IG5ldyBSZWdFeHAoYCgke3Rhc2sucmVjdXJyZW5jZVN5bWJvbH0pXFxcXHMqKFswLTlhLXpBLVogXSopYCwgJ3VnJyk7XG4gICAgY29uc3QgcmVjdXJyZW5jZU1hdGNoID0gbWF0Y2hCeVBvc2l0aW9uKGxpbmUsIHJlY3VycmVuY2VSZWdleCwgY3Vyc29yUG9zKTtcbiAgICBpZiAocmVjdXJyZW5jZU1hdGNoICYmIHJlY3VycmVuY2VNYXRjaC5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCByZWN1cnJlbmNlUHJlZml4ID0gcmVjdXJyZW5jZU1hdGNoWzFdO1xuICAgICAgICBjb25zdCByZWN1cnJlbmNlU3RyaW5nID0gcmVjdXJyZW5jZU1hdGNoWzJdO1xuICAgICAgICBpZiAocmVjdXJyZW5jZVN0cmluZy5sZW5ndGggPCBzZXR0aW5ncy5hdXRvU3VnZ2VzdE1pbk1hdGNoKSByZXR1cm4gW107XG4gICAgICAgIGlmIChyZWN1cnJlbmNlU3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSB0ZXh0IG1hdGNoZXMgYSB2YWxpZCByZWN1cmVuY2UgZGVzY3JpcHRpb24sIHByZXNlbnQgaXQgYXMgYSAxc3Qgc3VnZ2VzdGlvbi5cbiAgICAgICAgICAgIC8vIFdlIGFsc28gYWRkIGEgbmljZSBjaGVja21hcmsgaW4gdGhpcyBjYXNlIHRvIGRlbm90ZSBpdCdzIGEgY29tcGxldGUgdmFsaWQgcmVjdXJyZW5jZSBkZXNjcmlwdGlvblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkUmVjdXJyZW5jZSA9IFJlY3VycmVuY2UuZnJvbVRleHQoe1xuICAgICAgICAgICAgICAgIHJlY3VycmVuY2VSdWxlVGV4dDogcmVjdXJyZW5jZVN0cmluZyxcbiAgICAgICAgICAgICAgICBzdGFydERhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBkdWVEYXRlOiBudWxsLFxuICAgICAgICAgICAgfSk/LnRvVGV4dCgpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZFJlY3VycmVuY2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcHBlbmRlZFRleHQgPSBgJHtyZWN1cnJlbmNlUHJlZml4fSAke3BhcnNlZFJlY3VycmVuY2V9IGA7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvblR5cGU6ICdtYXRjaCcsXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlUZXh0OiBgXHUyNzA1ICR7cGFyc2VkUmVjdXJyZW5jZX1gLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUZXh0OiBhcHBlbmRlZFRleHQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydEF0OiByZWN1cnJlbmNlTWF0Y2guaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFNraXA6IHJlY3VycmVuY2VNYXRjaFswXS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZ1bGwgbWF0Y2ggaW5jbHVkZXMgYSBjb21wbGV0ZSB2YWxpZCBzdWdnZXN0aW9uICplbmRpbmcgd2l0aCBzcGFjZSosXG4gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc3VnZ2VzdCBhbnl0aGluZy4gVGhlIHVzZXIgaXMgdHJ5aW5nIHRvIGNvbnRpbnVlIHRvIHR5cGUgc29tZXRoaW5nIHRoYXQgaXMgbGlrZWx5XG4gICAgICAgICAgICAgICAgLy8gbm90IHJlbGF0ZWQgdG8gcmVjdXJyZW5jZS4gV2hlbiBzaGUgc3RhcnRzIGEgbmV3IHdvcmQsIG1heWJlIHRoZSByZWN1cnJlbmNlIG1hdGNoZXNcbiAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIHJlbGV2YW50IGFnYWluXG4gICAgICAgICAgICAgICAgaWYgKHJlY3VycmVuY2VNYXRjaFswXSA9PSBhcHBlbmRlZFRleHQpIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdyB0byBnZW5lcmljIHByZWRlZmluZWQgc3VnZ2VzdGlvbnMuXG4gICAgICAgIC8vIElmIHdlIGdldCBhIHBhcnRpYWwgbWF0Y2ggd2l0aCBzb21lIG9mIHRoZSBzdWdnZXN0aW9ucyAoZS5nLiB0aGUgdXNlciBzdGFydGVkIHR5cGluZyBcImV2ZXJ5IGRcIiksXG4gICAgICAgIC8vIHdlIHVzZSB0aGF0IGZvciBtYXRjaGVzIChcImV2ZXJ5IGRheVwiKS5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBqdXN0IGRpc3BsYXkgdGhlIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMsIGFuZCBlaXRoZXIgd2F5LCB0cnVuY2F0ZSB0aGVtIGV2ZW50dWFsbHkgdG9cbiAgICAgICAgLy8gYSBtYXggbnVtYmVyLlxuICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiByZWN1cnJlbmNlIHJ1bGVzLCB0aGUgbWF4IG51bWJlciBzaG91bGQgYmUgc21hbGwgZW5vdWdoIHRvIGFsbG93IHVzZXJzIHRvIFwiZXNjYXBlXCJcbiAgICAgICAgLy8gdGhlIG1vZGUgb2Ygd3JpdGluZyBhIHJlY3VycmVuY2UgcnVsZSwgaS5lLiB3ZSBzaG91bGQgbGVhdmUgZW5vdWdoIHNwYWNlIGZvciBjb21wb25lbnQgc3VnZ2VzdGlvbnNcbiAgICAgICAgY29uc3QgbWluTWF0Y2ggPSAxO1xuICAgICAgICBjb25zdCBtYXhHZW5lcmljRGF0ZVN1Z2dlc3Rpb25zID0gc2V0dGluZ3MuYXV0b1N1Z2dlc3RNYXhJdGVtcyAvIDI7XG4gICAgICAgIGxldCBnZW5lcmljTWF0Y2hlcyA9IGdlbmVyaWNTdWdnZXN0aW9uc1xuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgIHJlY3VycmVuY2VTdHJpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJyZW5jZVN0cmluZy5sZW5ndGggPj0gbWluTWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhyZWN1cnJlbmNlU3RyaW5nLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnNsaWNlKDAsIG1heEdlbmVyaWNEYXRlU3VnZ2VzdGlvbnMpO1xuICAgICAgICBpZiAoZ2VuZXJpY01hdGNoZXMubGVuZ3RoID09PSAwICYmIHJlY3VycmVuY2VTdHJpbmcudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBubyBhY3R1YWwgbWF0Y2ggc28gZG8gY29tcGxldGVseSBnZW5lcmljIHJlY3VycmVuY2Ugc3VnZ2VzdGlvbnMsIGJ1dCBub3QgaWZcbiAgICAgICAgICAgIC8vIHRoZXJlICp3YXMqIGEgdGV4dCB0byBtYXRjaCAoYmVjYXVzZSBpdCBtZWFucyB0aGUgdXNlciBpcyBhY3R1YWxseSB0eXBpbmcgc29tZXRoaW5nIGVsc2UpXG4gICAgICAgICAgICBnZW5lcmljTWF0Y2hlcyA9IGdlbmVyaWNTdWdnZXN0aW9ucy5zbGljZSgwLCBtYXhHZW5lcmljRGF0ZVN1Z2dlc3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGdlbmVyaWNNYXRjaGVzKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25UeXBlOiAnbWF0Y2gnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlUZXh0OiBgJHttYXRjaH1gLFxuICAgICAgICAgICAgICAgIGFwcGVuZFRleHQ6IGAke3JlY3VycmVuY2VQcmVmaXh9ICR7bWF0Y2h9IGAsXG4gICAgICAgICAgICAgICAgaW5zZXJ0QXQ6IHJlY3VycmVuY2VNYXRjaC5pbmRleCxcbiAgICAgICAgICAgICAgICBpbnNlcnRTa2lwOiByZWN1cnJlbmNlTWF0Y2hbMF0ubGVuZ3RoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBNYXRjaGVzIGEgc3RyaW5nIHdpdGggYSByZWdleCBhY2NvcmRpbmcgdG8gYSBwb3NpdGlvbiAodHlwaWNhbGx5IG9mIGEgY3Vyc29yKS5cbiAqIFdpbGwgcmV0dXJuIGEgcmVzdWx0IG9ubHkgaWYgYSBtYXRjaCBleGlzdHMgYW5kIHRoZSBnaXZlbiBwb3NpdGlvbiBpcyBwYXJ0IG9mIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hCeVBvc2l0aW9uKHM6IHN0cmluZywgcjogUmVnRXhwLCBwb3NpdGlvbjogbnVtYmVyKTogUmVnRXhwTWF0Y2hBcnJheSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHMubWF0Y2hBbGwocik7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgIGlmIChtYXRjaD8uaW5kZXggJiYgbWF0Y2guaW5kZXggPD0gcG9zaXRpb24gJiYgcG9zaXRpb24gPD0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpIHJldHVybiBtYXRjaDtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUEseUNBQUFBLFNBQUE7QUFlQSxRQUFJQztBQUNKLFFBQUlDO0FBQ0os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QUFFRSxLQUFFLEtBQUssSUFBSUQsRUFBQyxHQUFFRSxLQUFFLEtBQUssTUFBTUQsS0FBRSxFQUFFLEdBQUVFLEtBQUVGLEtBQUU7QUFBRyxnQkFBT0QsTUFBRyxJQUFFLE1BQUksT0FBSyxFQUFFRSxJQUFFLEdBQUUsR0FBRyxJQUFFLE1BQUksRUFBRUMsSUFBRSxHQUFFLEdBQUc7QUFBQSxNQUFDLEdBQUUsR0FBRSxTQUFTSixHQUFFQyxJQUFFQyxJQUFFO0FBQUMsWUFBR0QsR0FBRSxLQUFLLElBQUVDLEdBQUUsS0FBSztBQUFFLGlCQUFNLENBQUNGLEdBQUVFLElBQUVELEVBQUM7QUFBRSxZQUFJRSxLQUFFLE1BQUlELEdBQUUsS0FBSyxJQUFFRCxHQUFFLEtBQUssTUFBSUMsR0FBRSxNQUFNLElBQUVELEdBQUUsTUFBTSxJQUFHRyxLQUFFSCxHQUFFLE1BQU0sRUFBRSxJQUFJRSxJQUFFLENBQUMsR0FBRUUsS0FBRUgsS0FBRUUsS0FBRSxHQUFFRSxLQUFFTCxHQUFFLE1BQU0sRUFBRSxJQUFJRSxNQUFHRSxLQUFFLEtBQUcsSUFBRyxDQUFDO0FBQUUsZUFBTSxFQUFFLEVBQUVGLE1BQUdELEtBQUVFLE9BQUlDLEtBQUVELEtBQUVFLEtBQUVBLEtBQUVGLFFBQUs7QUFBQSxNQUFFLEdBQUUsR0FBRSxTQUFTSixJQUFFO0FBQUMsZUFBT0EsS0FBRSxJQUFFLEtBQUssS0FBS0EsRUFBQyxLQUFHLElBQUUsS0FBSyxNQUFNQSxFQUFDO0FBQUEsTUFBQyxHQUFFLEdBQUUsU0FBU0EsSUFBRTtBQUFDLGVBQU0sRUFBQyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLElBQUcsR0FBRSxHQUFFLEVBQUMsRUFBRUEsT0FBSSxPQUFPQSxNQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsUUFBUSxNQUFLLEVBQUU7QUFBQSxNQUFDLEdBQUUsR0FBRSxTQUFTQSxJQUFFO0FBQUMsZUFBTyxXQUFTQTtBQUFBLE1BQUMs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QUNMLE1BQU07TUFDTixNQUFNO01BQ04sT0FBTztNQUNQLE1BQU07TUFDTixNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLE9BQU87TUFDUCxPQUFPO01BQ1AsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixNQUFNO01BQ04sT0FBTztNQUNQLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLElBQUk7TUFDSixNQUFNO01BQ04sS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixPQUFPO01BQ1AsTUFBTTtNQUNOLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxPQUFPO01BQ1AsTUFBTTtNQUNOLEtBQUs7TUFDTCxNQUFNO01BQ04sTUFBTTtNQUNOLE1BQU07TUFDTixNQUFNO01BQ04sT0FBTztNQUNQLE1BQU07TUFDTixNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsT0FBTztNQUNQLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sTUFBTTtNQUNOLE9BQU87TUFDUCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxPQUFPO01BQ1AsTUFBTTtNQUNOLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sTUFBTTtNQUNOLE1BQU07TUFDTixLQUFLO01BQ0wsSUFBSTtNQUNKLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE9BQU87TUFDUCxNQUFNO01BQ04sS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsTUFBTTtNQUNOLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxJQUFJO01BQ0osT0FBTztNQUNQLE1BQU07TUFDTixNQUFNO01BQ04sT0FBTztNQUNQLE1BQU07O0FBR1YsYUFBZ0IsaUJBQWlCLGVBQStCOztBQUM1RCxVQUFJLGtCQUFrQixRQUFRLGtCQUFrQixRQUFXO0FBQ3ZELGVBQU87O0FBR1gsVUFBSSxPQUFPLGtCQUFrQixVQUFVO0FBQ25DLGVBQU87O0FBR1gsY0FBTyxLQUFBLFFBQUEsa0JBQWtCLG9CQUFjLFFBQUEsT0FBQSxTQUFBLEtBQUk7SUFDL0M7QUFWQSxZQUFBLG1CQUFBOzs7Ozs7Ozs7Ozs7O0FDaE1BLFFBQUEsa0JBQUFHLGlCQUFBLHVCQUFBO0FBQ0EsUUFBQSxVQUFBQSxpQkFBQSxtQkFBQTtBQUNBLFFBQUEsVUFBQTtBQUNBLFFBQUEsYUFBQTtBQUNBLFlBQUEsUUFBTSxPQUFPLGdCQUFBLE9BQWE7QUFFMUIsUUFBYSx3QkFBYixNQUFrQztNQUk5QixZQUFZLE9BQStCOztBQUN2QyxnQkFBUSxVQUFLLFFBQUwsVUFBSyxTQUFMLFFBQVMsSUFBSSxLQUFJO0FBQ3pCLFlBQUksaUJBQWlCLE1BQU07QUFDdkIsZUFBSyxVQUFVO2VBQ1o7QUFDSCxlQUFLLFdBQVUsS0FBQSxNQUFNLGFBQU8sUUFBQSxPQUFBLFNBQUEsS0FBSSxJQUFJLEtBQUk7QUFDeEMsZUFBSyxpQkFBaUIsV0FBQSxpQkFBaUIsTUFBTSxRQUFROztNQUU3RDs7QUFaSixZQUFBLHdCQUFBO0FBZUEsUUFBYSxvQkFBYixNQUE4QjtNQUsxQixZQUFZLFdBQWtDLGlCQUErQztBQUN6RixhQUFLLFlBQVk7QUFDakIsYUFBSyxjQUFjLENBQUE7QUFDbkIsYUFBSyxnQkFBZ0IsQ0FBQTtBQUNyQixZQUFJLGlCQUFpQjtBQUNqQixxQkFBVyxPQUFPLGlCQUFpQjtBQUMvQixpQkFBSyxZQUFZLE9BQW9CLGdCQUFnQjs7O0FBSTdELGNBQU0sV0FBVyxRQUFBLFFBQU0sVUFBVSxPQUFPO0FBQ3hDLGFBQUssTUFBTSxPQUFPLFNBQVMsS0FBSSxDQUFFO0FBQ2pDLGFBQUssTUFBTSxTQUFTLFNBQVMsTUFBSyxJQUFLLENBQUM7QUFDeEMsYUFBSyxNQUFNLFFBQVEsU0FBUyxLQUFJLENBQUU7QUFDbEMsYUFBSyxNQUFNLFFBQVEsRUFBRTtBQUNyQixhQUFLLE1BQU0sVUFBVSxDQUFDO0FBQ3RCLGFBQUssTUFBTSxVQUFVLENBQUM7QUFDdEIsYUFBSyxNQUFNLGVBQWUsQ0FBQztNQUMvQjtNQUVBLElBQUksV0FBb0I7QUFDcEIsWUFBSSxhQUFhLEtBQUssYUFBYTtBQUMvQixpQkFBTyxLQUFLLFlBQVk7O0FBRzVCLFlBQUksYUFBYSxLQUFLLGVBQWU7QUFDakMsaUJBQU8sS0FBSyxjQUFjOztBQUc5QixlQUFPO01BQ1g7TUFFQSxVQUFVLFdBQW9CO0FBQzFCLGVBQU8sYUFBYSxLQUFLO01BQzdCO01BRUEsdUJBQW9CO0FBQ2hCLGVBQU8sT0FBTyxLQUFLLEtBQUssV0FBVztNQUN2QztNQUVBLE1BQU0sV0FBc0IsT0FBYTtBQUNyQyxZQUFJLGFBQWEsS0FBSyxhQUFhO0FBQy9CLGlCQUFPOztBQUVYLGFBQUssY0FBYyxhQUFhO0FBQ2hDLGVBQU87TUFDWDtNQUVBLE9BQU8sV0FBc0IsT0FBYTtBQUN0QyxhQUFLLFlBQVksYUFBYTtBQUM5QixlQUFPLEtBQUssY0FBYztBQUMxQixlQUFPO01BQ1g7TUFFQSxPQUFPLFdBQW9CO0FBQ3ZCLGVBQU8sS0FBSyxZQUFZO0FBQ3hCLGVBQU8sS0FBSyxjQUFjO01BQzlCO01BRUEsUUFBSztBQUNELGNBQU0sWUFBWSxJQUFJLGtCQUFrQixLQUFLLFNBQVM7QUFDdEQsa0JBQVUsY0FBYyxDQUFBO0FBQ3hCLGtCQUFVLGdCQUFnQixDQUFBO0FBRTFCLG1CQUFXLE9BQU8sS0FBSyxhQUFhO0FBQ2hDLG9CQUFVLFlBQVksT0FBb0IsS0FBSyxZQUFZOztBQUcvRCxtQkFBVyxPQUFPLEtBQUssZUFBZTtBQUNsQyxvQkFBVSxjQUFjLE9BQW9CLEtBQUssY0FBYzs7QUFHbkUsZUFBTztNQUNYO01BRUEsYUFBVTtBQUNOLGVBQU8sQ0FBQyxLQUFLLFVBQVUsTUFBTSxLQUFLLENBQUMsS0FBSyxVQUFVLFFBQVEsS0FBSyxDQUFDLEtBQUssVUFBVSxRQUFRO01BQzNGO01BRUEsYUFBVTtBQUNOLGVBQU8sQ0FBQyxLQUFLLFVBQVUsU0FBUyxLQUFLLENBQUMsS0FBSyxVQUFVLEtBQUssS0FBSyxDQUFDLEtBQUssVUFBVSxPQUFPO01BQzFGO01BRUEseUJBQXNCO0FBQ2xCLGVBQU8sS0FBSyxVQUFVLFNBQVMsS0FBSyxDQUFDLEtBQUssVUFBVSxLQUFLLEtBQUssQ0FBQyxLQUFLLFVBQVUsT0FBTztNQUN6RjtNQUVBLDBCQUF1QjtBQUNuQixlQUFPLEtBQUssVUFBVSxLQUFLLEtBQUssS0FBSyxVQUFVLE9BQU8sS0FBSyxDQUFDLEtBQUssVUFBVSxNQUFNO01BQ3JGO01BRUEsY0FBVztBQUNQLGNBQU0sT0FBTyxLQUFLLDhCQUE2QjtBQUUvQyxZQUFJLEtBQUssWUFBVyxNQUFPLEtBQUssSUFBSSxNQUFNO0FBQUcsaUJBQU87QUFDcEQsWUFBSSxLQUFLLFNBQVEsTUFBTyxLQUFLLElBQUksT0FBTyxJQUFJO0FBQUcsaUJBQU87QUFDdEQsWUFBSSxLQUFLLFFBQU8sTUFBTyxLQUFLLElBQUksS0FBSztBQUFHLGlCQUFPO0FBQy9DLFlBQUksS0FBSyxJQUFJLE1BQU0sS0FBSyxRQUFRLEtBQUssU0FBUSxLQUFNLEtBQUssSUFBSSxNQUFNO0FBQUcsaUJBQU87QUFDNUUsWUFBSSxLQUFLLElBQUksUUFBUSxLQUFLLFFBQVEsS0FBSyxXQUFVLEtBQU0sS0FBSyxJQUFJLFFBQVE7QUFBRyxpQkFBTztBQUVsRixlQUFPO01BQ1g7TUFFQSxXQUFRO0FBQ0osZUFBTyxvQ0FBb0MsS0FBSyxVQUFVLEtBQUssV0FBVyxxQkFBcUIsS0FBSyxVQUNoRyxLQUFLLGFBQWEsa0JBQ0osS0FBSyxVQUFVLEtBQUssU0FBUztNQUNuRDtNQUVBLFFBQUs7QUFDRCxlQUFPLFFBQUEsUUFBTSxLQUFLLEtBQUksQ0FBRTtNQUM1QjtNQUVBLE9BQUk7QUFDQSxjQUFNLE9BQU8sS0FBSyw4QkFBNkI7QUFDL0MsZUFBTyxJQUFJLEtBQUssS0FBSyxRQUFPLElBQUssS0FBSyxrQ0FBa0MsSUFBSSxJQUFJLEdBQUs7TUFDekY7TUFFUSxnQ0FBNkI7QUFDakMsY0FBTSxPQUFPLElBQUksS0FDYixLQUFLLElBQUksTUFBTSxHQUNmLEtBQUssSUFBSSxPQUFPLElBQUksR0FDcEIsS0FBSyxJQUFJLEtBQUssR0FDZCxLQUFLLElBQUksTUFBTSxHQUNmLEtBQUssSUFBSSxRQUFRLEdBQ2pCLEtBQUssSUFBSSxRQUFRLEdBQ2pCLEtBQUssSUFBSSxhQUFhLENBQUM7QUFHM0IsYUFBSyxZQUFZLEtBQUssSUFBSSxNQUFNLENBQUM7QUFDakMsZUFBTztNQUNYO01BRVEsa0NBQWtDLE1BQVc7O0FBQ2pELFlBQUksQ0FBQyxRQUFRLEtBQUssUUFBTyxJQUFLLEdBQUc7QUFHN0IsaUJBQU8sSUFBSSxLQUFJOztBQUduQixjQUFNLHdCQUF3QixDQUFDLEtBQUssa0JBQWlCO0FBQ3JELGNBQU0sd0JBQ0YsTUFBQSxLQUFBLEtBQUssSUFBSSxnQkFBZ0IsT0FBQyxRQUFBLE9BQUEsU0FBQSxLQUFJLEtBQUssVUFBVSxvQkFBYyxRQUFBLE9BQUEsU0FBQSxLQUFJO0FBRW5FLGVBQU8sd0JBQXdCO01BQ25DO01BRUEsT0FBTyw0QkFDSCxXQUNBLFdBQXdDO0FBRXhDLFlBQUksT0FBTyxRQUFBLFFBQU0sVUFBVSxPQUFPO0FBQ2xDLG1CQUFXLE9BQU8sV0FBVztBQUN6QixpQkFBTyxLQUFLLElBQUksVUFBVSxNQUFtQixHQUFnQjs7QUFHakUsY0FBTSxhQUFhLElBQUksa0JBQWtCLFNBQVM7QUFDbEQsWUFBSSxVQUFVLFdBQVcsVUFBVSxhQUFhLFVBQVUsV0FBVztBQUNqRSxrQkFBQSxrQkFBa0IsWUFBWSxJQUFJO0FBQ2xDLGtCQUFBLGtCQUFrQixZQUFZLElBQUk7QUFDbEMsY0FBSSxVQUFVLG1CQUFtQixNQUFNO0FBQ25DLHVCQUFXLE9BQU8sa0JBQWtCLENBQUMsVUFBVSxRQUFRLGtCQUFpQixDQUFFOztlQUUzRTtBQUNILGtCQUFBLGlCQUFpQixZQUFZLElBQUk7QUFDakMsY0FBSSxVQUFVLG1CQUFtQixNQUFNO0FBQ25DLHVCQUFXLE1BQU0sa0JBQWtCLENBQUMsVUFBVSxRQUFRLGtCQUFpQixDQUFFOztBQUc3RSxjQUFJLFVBQVUsTUFBTTtBQUNoQix1QkFBVyxPQUFPLE9BQU8sS0FBSyxLQUFJLENBQUU7QUFDcEMsdUJBQVcsT0FBTyxTQUFTLEtBQUssTUFBSyxJQUFLLENBQUM7QUFDM0MsdUJBQVcsT0FBTyxRQUFRLEtBQUssS0FBSSxDQUFFO2lCQUNsQztBQUNILGdCQUFJLFVBQVUsU0FBUztBQUNuQix5QkFBVyxNQUFNLFdBQVcsS0FBSyxJQUFHLENBQUU7O0FBRzFDLHVCQUFXLE1BQU0sT0FBTyxLQUFLLEtBQUksQ0FBRTtBQUNuQyxnQkFBSSxVQUFVLFVBQVU7QUFDcEIseUJBQVcsT0FBTyxTQUFTLEtBQUssTUFBSyxJQUFLLENBQUM7QUFDM0MseUJBQVcsT0FBTyxRQUFRLEtBQUssS0FBSSxDQUFFO21CQUNsQztBQUNILHlCQUFXLE1BQU0sU0FBUyxLQUFLLE1BQUssSUFBSyxDQUFDO0FBQzFDLGtCQUFJLFVBQVUsU0FBUztBQUNuQiwyQkFBVyxPQUFPLFFBQVEsS0FBSyxLQUFJLENBQUU7cUJBQ2xDO0FBQ0gsMkJBQVcsTUFBTSxRQUFRLEtBQUssS0FBSSxDQUFFOzs7OztBQU1wRCxlQUFPO01BQ1g7O0FBdk1KLFlBQUEsb0JBQUE7QUEwTUEsUUFBYSxnQkFBYixNQUEwQjtNQVV0QixZQUNJLFdBQ0EsT0FDQUMsT0FDQSxPQUNBLEtBQXVCO0FBRXZCLGFBQUssWUFBWTtBQUNqQixhQUFLLFVBQVUsVUFBVTtBQUN6QixhQUFLLFFBQVE7QUFDYixhQUFLLE9BQU9BO0FBQ1osYUFBSyxRQUFRLFNBQVMsSUFBSSxrQkFBa0IsU0FBUztBQUNyRCxhQUFLLE1BQU07TUFDZjtNQUVBLFFBQUs7QUFDRCxjQUFNLFNBQVMsSUFBSSxjQUFjLEtBQUssV0FBVyxLQUFLLE9BQU8sS0FBSyxJQUFJO0FBQ3RFLGVBQU8sUUFBUSxLQUFLLFFBQVEsS0FBSyxNQUFNLE1BQUssSUFBSztBQUNqRCxlQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFLLElBQUs7QUFDM0MsZUFBTztNQUNYO01BRUEsT0FBSTtBQUNBLGVBQU8sS0FBSyxNQUFNLEtBQUk7TUFDMUI7TUFFQSxXQUFRO0FBQ0osZUFBTywwQkFBMEIsS0FBSyxpQkFBaUIsS0FBSztNQUNoRTs7QUF0Q0osWUFBQSxnQkFBQTs7Ozs7Ozs7OztBQzFOQSxRQUFzQix5Q0FBdEIsTUFBNEQ7TUFBNUQsY0FBQTtBQU9ZLGFBQUEscUJBQThCO0FBQzlCLGFBQUEsZ0JBQXlCO01BMkJyQztNQXpCSSxzQkFBbUI7QUFDZixlQUFPO01BQ1g7TUFFQSxRQUFRLFNBQXVCO0FBQzNCLGNBQU0sZUFBZSxLQUFLLGFBQWEsT0FBTztBQUM5QyxZQUFJLGdCQUFnQixLQUFLLG9CQUFvQjtBQUN6QyxpQkFBTyxLQUFLOztBQUdoQixhQUFLLGdCQUFnQixJQUFJLE9BQU8sR0FBRyxLQUFLLG9CQUFtQixJQUFLLGFBQWEsVUFBVSxhQUFhLEtBQUs7QUFDekcsYUFBSyxxQkFBcUI7QUFDMUIsZUFBTyxLQUFLO01BQ2hCO01BRUEsUUFBUSxTQUF5QixPQUF1Qjs7QUFDcEQsY0FBTSxVQUFTLEtBQUEsTUFBTSxRQUFFLFFBQUEsT0FBQSxTQUFBLEtBQUk7QUFDM0IsY0FBTSxRQUFRLE1BQU0sUUFBUSxPQUFPO0FBQ25DLGNBQU0sS0FBSyxNQUFNLEdBQUcsVUFBVSxPQUFPLE1BQU07QUFDM0MsaUJBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsZ0JBQU0sSUFBSSxLQUFLLE1BQU07O0FBR3pCLGVBQU8sS0FBSyxhQUFhLFNBQVMsS0FBSztNQUMzQzs7QUFsQ0osWUFBQSx5Q0FBQTs7Ozs7Ozs7O0FDUEEsUUFBQSxjQUFBO0FBRUEsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQU0sc0JBQXNCLElBQUksT0FDNUIsdUZBQ3NFLFlBQUEsZ0NBQ3RFLEdBQUc7QUFHUCxRQUFNLHlCQUF5QixJQUFJLE9BQy9CLGtFQUFrRSxZQUFBLGdDQUNsRSxHQUFHO0FBR1AsUUFBcUIsK0JBQXJCLGNBQTBELGlDQUFBLHVDQUFzQztNQUM1RixhQUFhLFNBQXVCO0FBQ2hDLGVBQU8sUUFBUSxPQUFPLGNBQWMseUJBQXlCO01BQ2pFO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFlBQVksWUFBQSxlQUFlLE1BQU0sRUFBRTtBQUN6QyxlQUFPLFVBQUEsa0JBQWtCLDRCQUE0QixRQUFRLFdBQVcsU0FBUztNQUNyRjs7QUFSSixZQUFBLFVBQUE7Ozs7Ozs7OztBQ2RBLFFBQUEsVUFBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFHQSxRQUFNLFVBQVUsSUFBSSxPQUNoQixtQkFDUSxZQUFBLHFGQUdJLFlBQUEsNERBR0osVUFBQSxnQkFBZ0IsWUFBQSxnQkFBZ0IsMkJBRzVCLFlBQUEseUNBR1osR0FBRztBQUdQLFFBQU0sYUFBYTtBQUNuQixRQUFNLGdCQUFnQjtBQUN0QixRQUFNLG1CQUFtQjtBQUN6QixRQUFNLGFBQWE7QUFFbkIsUUFBcUIsZ0NBQXJCLGNBQTJELGlDQUFBLHVDQUFzQztNQUM3RixlQUFZO0FBQ1IsZUFBTztNQUNYO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFNBQVMsUUFBUSxvQkFBb0IsTUFBTSxPQUFPLE1BQU0sRUFBRTtBQUVoRSxjQUFNLFFBQVEsWUFBQSxpQkFBaUIsTUFBTSxrQkFBa0IsWUFBVztBQUNsRSxjQUFNLE1BQU0sWUFBQSwwQkFBMEIsTUFBTSxXQUFXO0FBQ3ZELFlBQUksTUFBTSxJQUFJO0FBRVYsZ0JBQU0sUUFBUSxNQUFNLFFBQVEsTUFBTSxZQUFZO0FBQzlDLGlCQUFPOztBQUdYLGVBQU8sTUFBTSxPQUFPLFNBQVMsS0FBSztBQUNsQyxlQUFPLE1BQU0sT0FBTyxPQUFPLEdBQUc7QUFFOUIsWUFBSSxNQUFNLGFBQWE7QUFDbkIsZ0JBQU0sYUFBYSxZQUFBLFVBQVUsTUFBTSxXQUFXO0FBQzlDLGlCQUFPLE1BQU0sT0FBTyxRQUFRLFVBQVU7ZUFDbkM7QUFDSCxnQkFBTSxPQUFPLFFBQUEscUJBQXFCLFFBQVEsU0FBUyxLQUFLLEtBQUs7QUFDN0QsaUJBQU8sTUFBTSxNQUFNLFFBQVEsSUFBSTs7QUFHbkMsWUFBSSxNQUFNLGdCQUFnQjtBQUN0QixnQkFBTSxVQUFVLFlBQUEsMEJBQTBCLE1BQU0sY0FBYztBQUU5RCxpQkFBTyxNQUFNLE9BQU8sTUFBTSxNQUFLO0FBQy9CLGlCQUFPLElBQUksT0FBTyxPQUFPLE9BQU87O0FBR3BDLGVBQU87TUFDWDs7QUFuQ0osWUFBQSxVQUFBOzs7Ozs7Ozs7QUMvQkEsUUFBQSxVQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLElBQUksVUFBQSxnQkFBZ0IsWUFBQSxnQkFBZ0Isd0JBRTVCLFlBQUEsaUVBR0EsWUFBQSxzREFJQSxZQUFBLHNDQUdSLEdBQUc7QUFHUCxRQUFNLG1CQUFtQjtBQUN6QixRQUFNLGFBQWE7QUFDbkIsUUFBTSxnQkFBZ0I7QUFDdEIsUUFBTSxhQUFhO0FBWW5CLFFBQXFCLGdDQUFyQixjQUEyRCxpQ0FBQSx1Q0FBc0M7TUFDN0YsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxRQUFRLFlBQUEsaUJBQWlCLE1BQU0sa0JBQWtCLFlBQVc7QUFDbEUsY0FBTSxNQUFNLFlBQUEsMEJBQTBCLE1BQU0sV0FBVztBQUN2RCxZQUFJLE1BQU0sSUFBSTtBQUNWLGlCQUFPOztBQUdYLGNBQU0sYUFBYSxRQUFRLHdCQUF3QjtVQUMvQztVQUNBO1NBQ0g7QUFFRCxZQUFJLE1BQU0sYUFBYTtBQUNuQixnQkFBTSxPQUFPLFlBQUEsVUFBVSxNQUFNLFdBQVc7QUFDeEMscUJBQVcsT0FBTyxRQUFRLElBQUk7ZUFDM0I7QUFDSCxnQkFBTSxPQUFPLFFBQUEscUJBQXFCLFFBQVEsU0FBUyxLQUFLLEtBQUs7QUFDN0QscUJBQVcsTUFBTSxRQUFRLElBQUk7O0FBR2pDLFlBQUksQ0FBQyxNQUFNLGdCQUFnQjtBQUN2QixpQkFBTzs7QUFJWCxjQUFNLFVBQVUsWUFBQSwwQkFBMEIsTUFBTSxjQUFjO0FBQzlELGNBQU0sU0FBUyxRQUFRLG9CQUFvQixNQUFNLE9BQU8sTUFBTSxFQUFFO0FBQ2hFLGVBQU8sUUFBUTtBQUNmLGVBQU8sTUFBTSxXQUFXLE1BQUs7QUFDN0IsZUFBTyxJQUFJLE9BQU8sT0FBTyxPQUFPO0FBRWhDLGVBQU87TUFDWDs7QUFyQ0osWUFBQSxVQUFBOzs7Ozs7Ozs7QUN2Q0EsUUFBQSxjQUFBO0FBRUEsUUFBQSxVQUFBO0FBQ0EsUUFBQSxZQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLGlCQUNRLFVBQUEsZ0JBQWdCLFlBQUEsZ0JBQWdCLHNCQUd2QixZQUFBLG9EQUdqQixHQUFHO0FBR1AsUUFBTSxlQUFlO0FBQ3JCLFFBQU0sbUJBQW1CO0FBQ3pCLFFBQU0sYUFBYTtBQVNuQixRQUFxQixvQkFBckIsY0FBK0MsaUNBQUEsdUNBQXNDO01BQ2pGLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sWUFBWSxNQUFNLGtCQUFrQixZQUFXO0FBR3JELFlBQUksTUFBTSxHQUFHLFVBQVUsS0FBSyxDQUFDLFlBQUEsMkJBQTJCLFlBQVk7QUFDaEUsaUJBQU87O0FBR1gsY0FBTSxTQUFTLFFBQVEsb0JBQ25CLE1BQU0sU0FBUyxNQUFNLGlCQUFpQixJQUFJLFFBQzFDLE1BQU0sUUFBUSxNQUFNLEdBQUcsTUFBTTtBQUVqQyxlQUFPLE1BQU0sTUFBTSxPQUFPLENBQUM7QUFFM0IsY0FBTSxRQUFRLFlBQUEsaUJBQWlCO0FBQy9CLGVBQU8sTUFBTSxPQUFPLFNBQVMsS0FBSztBQUVsQyxZQUFJLE1BQU0sYUFBYTtBQUNuQixnQkFBTSxPQUFPLFlBQUEsVUFBVSxNQUFNLFdBQVc7QUFDeEMsaUJBQU8sTUFBTSxPQUFPLFFBQVEsSUFBSTtlQUM3QjtBQUNILGdCQUFNLE9BQU8sUUFBQSxxQkFBcUIsUUFBUSxTQUFTLEdBQUcsS0FBSztBQUMzRCxpQkFBTyxNQUFNLE1BQU0sUUFBUSxJQUFJOztBQUduQyxlQUFPO01BQ1g7O0FBL0JKLFlBQUEsVUFBQTs7Ozs7Ozs7O0FDNUJBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFTQSxRQUFNLFVBQVUsSUFBSSxPQUNoQiw0QkFDVyxVQUFBLGdCQUFnQixZQUFBLGdCQUFnQixvREFHM0MsR0FBRztBQUdQLFFBQU0sb0JBQW9CO0FBQzFCLFFBQU0sbUJBQW1CO0FBQ3pCLFFBQU0scUJBQXFCO0FBQzNCLFFBQU0sb0JBQW9CO0FBRTFCLFFBQXFCLDZCQUFyQixjQUF3RCxpQ0FBQSx1Q0FBc0M7TUFDMUYsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxRQUFRLE1BQU0sc0JBQ2QsU0FBUyxNQUFNLG1CQUFtQixJQUNsQyxZQUFBLGlCQUFpQixNQUFNLGtCQUFrQixZQUFXO0FBRTFELFlBQUksUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUN6QixpQkFBTzs7QUFHWCxjQUFNLE9BQU8sU0FBUyxNQUFNLGtCQUFrQjtBQUM5QyxjQUFNLE1BQU0sU0FBUyxNQUFNLGtCQUFrQjtBQUU3QyxlQUFPO1VBQ0g7VUFDQTtVQUNBOztNQUVSOztBQXRCSixZQUFBLFVBQUE7Ozs7Ozs7OztBQ3ZCQSxRQUFBLG1DQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FBTyxvQ0FBeUMsR0FBRztBQUV2RSxRQUFNLGNBQWM7QUFDcEIsUUFBTSxhQUFhO0FBT25CLFFBQXFCLDJCQUFyQixjQUFzRCxpQ0FBQSx1Q0FBc0M7TUFDeEYsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxPQUFPLFNBQVMsTUFBTSxXQUFXO0FBQ3ZDLGNBQU0sUUFBUSxTQUFTLE1BQU0sWUFBWTtBQUV6QyxlQUFPLFFBQVEsd0JBQXVCLEVBQUcsTUFBTSxPQUFPLENBQUMsRUFBRSxPQUFPLFNBQVMsS0FBSyxFQUFFLE9BQU8sUUFBUSxJQUFJO01BQ3ZHOztBQVZKLFlBQUEsVUFBQTs7Ozs7Ozs7OztBQ1pBLFFBQUEsVUFBQTtBQUdBLGFBQVMsbUJBQW1CLGNBQXNCLGVBQXVCLGVBQXVCLE9BQWE7QUFDekcsYUFBTyxJQUFJLE9BQ0gsR0FBRyxlQUNBLHdJQVlBLGlCQUNQLEtBQUs7SUFFYjtBQUdBLGFBQVMsb0JBQW9CLGdCQUF3QixpQkFBdUI7QUFDeEUsYUFBTyxJQUFJLE9BQ1AsS0FBSyx3SkFXRSxtQkFDUCxHQUFHO0lBRVg7QUFFQSxRQUFNLGFBQWE7QUFDbkIsUUFBTSxlQUFlO0FBQ3JCLFFBQU0sZUFBZTtBQUNyQixRQUFNLHFCQUFxQjtBQUMzQixRQUFNLG1CQUFtQjtBQUV6QixRQUFzQiwrQkFBdEIsTUFBa0Q7TUFLOUMsWUFBWSxhQUFhLE9BQUs7QUFpVnRCLGFBQUEsc0JBQXNCO0FBQ3RCLGFBQUEsc0JBQXNCO0FBQ3RCLGFBQUEsMkJBQTJCO0FBcUIzQixhQUFBLHVCQUF1QjtBQUN2QixhQUFBLHdCQUF3QjtBQUN4QixhQUFBLDRCQUE0QjtBQXpXaEMsYUFBSyxhQUFhO01BQ3RCO01BRUEsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLDZCQUEwQjtBQUN0QixlQUFPO01BQ1g7TUFFQSxnQkFBYTtBQUNULGVBQU87TUFDWDtNQUVBLGtCQUFlO0FBQ1gsZUFBTztNQUNYO01BRUEsUUFBUSxTQUF1QjtBQUMzQixlQUFPLEtBQUssa0NBQWlDO01BQ2pEO01BRUEsUUFBUSxTQUF5QixPQUF1QjtBQUNwRCxjQUFNLGtCQUFrQixLQUFLLDZCQUE2QixTQUFTLEtBQUs7QUFDeEUsWUFBSSxDQUFDLGlCQUFpQjtBQUNsQixnQkFBTSxTQUFTLE1BQU0sR0FBRztBQUN4QixpQkFBTzs7QUFHWCxjQUFNLFFBQVEsTUFBTSxRQUFRLE1BQU0sR0FBRztBQUNyQyxjQUFNQyxRQUFPLE1BQU0sR0FBRyxVQUFVLE1BQU0sR0FBRyxNQUFNO0FBQy9DLGNBQU0sU0FBUyxRQUFRLG9CQUFvQixPQUFPQSxPQUFNLGVBQWU7QUFDdkUsY0FBTSxTQUFTLE1BQU0sR0FBRztBQUV4QixjQUFNLGdCQUFnQixRQUFRLEtBQUssVUFBVSxNQUFNLEtBQUs7QUFDeEQsY0FBTSxtQkFBbUIsS0FBSyxvQ0FBbUM7QUFDakUsY0FBTSxpQkFBaUIsaUJBQWlCLEtBQUssYUFBYTtBQUcxRCxZQUFJQSxNQUFLLE1BQU0sVUFBVSxLQUFLLGtCQUFrQixlQUFlLEdBQUcsTUFBTSx1QkFBdUIsR0FBRztBQUM5RixpQkFBTzs7QUFHWCxZQUNJLENBQUMsa0JBRUQsZUFBZSxHQUFHLE1BQU0sdUJBQXVCLEdBQ2pEO0FBQ0UsaUJBQU8sS0FBSyxzQ0FBc0MsTUFBTTs7QUFHNUQsZUFBTyxNQUFNLEtBQUssK0JBQStCLFNBQVMsZ0JBQWdCLE1BQU07QUFDaEYsWUFBSSxPQUFPLEtBQUs7QUFDWixpQkFBTyxRQUFRLGVBQWU7O0FBR2xDLGVBQU8sS0FBSyxtQ0FBbUMsTUFBTTtNQUN6RDtNQUVBLDZCQUNJLFNBQ0EsT0FDQSxTQUFTLE9BQUs7QUFFZCxjQUFNLGFBQWEsUUFBUSx3QkFBdUI7QUFDbEQsWUFBSSxTQUFTO0FBQ2IsWUFBSSxXQUFXO0FBR2YsWUFBSSxPQUFPLFNBQVMsTUFBTSxXQUFXO0FBQ3JDLFlBQUksT0FBTyxLQUFLO0FBQ1osY0FBSSxLQUFLLGNBQWMsTUFBTSxpQkFBaUIsTUFBTTtBQUNoRCxtQkFBTzs7QUFHWCxtQkFBUyxPQUFPO0FBQ2hCLGlCQUFPLEtBQUssTUFBTSxPQUFPLEdBQUc7O0FBR2hDLFlBQUksT0FBTyxJQUFJO0FBQ1gsaUJBQU87O0FBSVgsWUFBSSxNQUFNLGlCQUFpQixNQUFNO0FBQzdCLGNBQUksTUFBTSxjQUFjLFVBQVUsS0FBSyxDQUFDLE1BQU0sbUJBQW1CO0FBRTdELG1CQUFPOztBQUdYLG1CQUFTLFNBQVMsTUFBTSxhQUFhOztBQUd6QyxZQUFJLFVBQVUsSUFBSTtBQUNkLGlCQUFPOztBQUdYLFlBQUksT0FBTyxJQUFJO0FBQ1gscUJBQVcsUUFBQSxTQUFTOztBQUl4QixZQUFJLE1BQU0scUJBQXFCLE1BQU07QUFDakMsY0FBSSxPQUFPO0FBQUksbUJBQU87QUFDdEIsZ0JBQU0sT0FBTyxNQUFNLGtCQUFrQixHQUFHLFlBQVc7QUFDbkQsY0FBSSxRQUFRLEtBQUs7QUFDYix1QkFBVyxRQUFBLFNBQVM7QUFDcEIsZ0JBQUksUUFBUSxJQUFJO0FBQ1oscUJBQU87OztBQUlmLGNBQUksUUFBUSxLQUFLO0FBQ2IsdUJBQVcsUUFBQSxTQUFTO0FBQ3BCLGdCQUFJLFFBQVEsSUFBSTtBQUNaLHNCQUFROzs7O0FBS3BCLG1CQUFXLE9BQU8sUUFBUSxJQUFJO0FBQzlCLG1CQUFXLE9BQU8sVUFBVSxNQUFNO0FBRWxDLFlBQUksYUFBYSxNQUFNO0FBQ25CLHFCQUFXLE9BQU8sWUFBWSxRQUFRO2VBQ25DO0FBQ0gsY0FBSSxPQUFPLElBQUk7QUFDWCx1QkFBVyxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7aUJBQ3JDO0FBQ0gsdUJBQVcsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFOzs7QUFLaEQsWUFBSSxNQUFNLHVCQUF1QixNQUFNO0FBQ25DLGdCQUFNLGNBQWMsU0FBUyxNQUFNLG9CQUFvQixVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQ3RFLGNBQUksZUFBZTtBQUFNLG1CQUFPO0FBRWhDLHFCQUFXLE9BQU8sZUFBZSxXQUFXOztBQUloRCxZQUFJLE1BQU0saUJBQWlCLE1BQU07QUFDN0IsZ0JBQU0sU0FBUyxTQUFTLE1BQU0sYUFBYTtBQUMzQyxjQUFJLFVBQVU7QUFBSSxtQkFBTztBQUV6QixxQkFBVyxPQUFPLFVBQVUsTUFBTTs7QUFHdEMsZUFBTztNQUNYO01BRUEsK0JBQ0ksU0FDQSxPQUNBLFFBQXFCO0FBRXJCLGNBQU0sYUFBYSxRQUFRLHdCQUF1QjtBQUdsRCxZQUFJLE1BQU0sdUJBQXVCLE1BQU07QUFDbkMsZ0JBQU0sY0FBYyxTQUFTLE1BQU0sb0JBQW9CLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDdEUsY0FBSSxlQUFlO0FBQU0sbUJBQU87QUFFaEMscUJBQVcsT0FBTyxlQUFlLFdBQVc7O0FBSWhELFlBQUksTUFBTSxpQkFBaUIsTUFBTTtBQUM3QixnQkFBTSxTQUFTLFNBQVMsTUFBTSxhQUFhO0FBQzNDLGNBQUksVUFBVTtBQUFJLG1CQUFPO0FBRXpCLHFCQUFXLE9BQU8sVUFBVSxNQUFNOztBQUd0QyxZQUFJLE9BQU8sU0FBUyxNQUFNLFdBQVc7QUFDckMsWUFBSSxTQUFTO0FBQ2IsWUFBSSxXQUFXO0FBR2YsWUFBSSxNQUFNLGlCQUFpQixNQUFNO0FBQzdCLG1CQUFTLFNBQVMsTUFBTSxhQUFhO21CQUM5QixPQUFPLEtBQUs7QUFDbkIsbUJBQVMsT0FBTztBQUNoQixpQkFBTyxLQUFLLE1BQU0sT0FBTyxHQUFHOztBQUdoQyxZQUFJLFVBQVUsTUFBTSxPQUFPLElBQUk7QUFDM0IsaUJBQU87O0FBR1gsWUFBSSxRQUFRLElBQUk7QUFDWixxQkFBVyxRQUFBLFNBQVM7O0FBSXhCLFlBQUksTUFBTSxxQkFBcUIsTUFBTTtBQUNqQyxjQUFJLE9BQU8sSUFBSTtBQUNYLG1CQUFPOztBQUdYLGdCQUFNLE9BQU8sTUFBTSxrQkFBa0IsR0FBRyxZQUFXO0FBQ25ELGNBQUksUUFBUSxLQUFLO0FBQ2IsdUJBQVcsUUFBQSxTQUFTO0FBQ3BCLGdCQUFJLFFBQVEsSUFBSTtBQUNaLHFCQUFPO0FBQ1Asa0JBQUksQ0FBQyxXQUFXLFVBQVUsS0FBSyxHQUFHO0FBQzlCLDJCQUFXLE1BQU0sT0FBTyxXQUFXLElBQUksS0FBSyxJQUFJLENBQUM7Ozs7QUFLN0QsY0FBSSxRQUFRLEtBQUs7QUFDYix1QkFBVyxRQUFBLFNBQVM7QUFDcEIsZ0JBQUksUUFBUTtBQUFJLHNCQUFROztBQUc1QixjQUFJLENBQUMsT0FBTyxNQUFNLFVBQVUsVUFBVSxHQUFHO0FBQ3JDLGdCQUFJLFlBQVksUUFBQSxTQUFTLElBQUk7QUFDekIscUJBQU8sTUFBTSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFFMUMsa0JBQUksT0FBTyxNQUFNLElBQUksTUFBTSxLQUFLLElBQUk7QUFDaEMsdUJBQU8sTUFBTSxPQUFPLFFBQVEsQ0FBQzs7bUJBRTlCO0FBQ0gscUJBQU8sTUFBTSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFFMUMsa0JBQUksT0FBTyxNQUFNLElBQUksTUFBTSxLQUFLLElBQUk7QUFDaEMsdUJBQU8sTUFBTSxPQUFPLFFBQVEsT0FBTyxNQUFNLElBQUksTUFBTSxJQUFJLEVBQUU7Ozs7O0FBTXpFLG1CQUFXLE9BQU8sUUFBUSxJQUFJO0FBQzlCLG1CQUFXLE9BQU8sVUFBVSxNQUFNO0FBRWxDLFlBQUksWUFBWSxHQUFHO0FBQ2YscUJBQVcsT0FBTyxZQUFZLFFBQVE7ZUFDbkM7QUFDSCxnQkFBTSxZQUFZLE9BQU8sTUFBTSxVQUFVLFVBQVUsS0FBSyxPQUFPLE1BQU0sSUFBSSxNQUFNLElBQUk7QUFDbkYsY0FBSSxXQUFXO0FBQ1gsZ0JBQUksT0FBTyxNQUFNLElBQUksTUFBTSxJQUFJLEtBQUssTUFBTTtBQUV0Qyx5QkFBVyxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7dUJBQ2pDLFFBQVEsSUFBSTtBQUNuQix5QkFBVyxPQUFPLFFBQVEsT0FBTyxFQUFFO0FBQ25DLHlCQUFXLE9BQU8sWUFBWSxRQUFBLFNBQVMsRUFBRTs7cUJBRXRDLE9BQU8sSUFBSTtBQUNsQix1QkFBVyxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7cUJBQ2pDLFFBQVEsSUFBSTtBQUNuQix1QkFBVyxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7OztBQUloRCxZQUFJLFdBQVcsS0FBSSxFQUFHLFFBQU8sSUFBSyxPQUFPLE1BQU0sS0FBSSxFQUFHLFFBQU8sR0FBSTtBQUM3RCxxQkFBVyxNQUFNLE9BQU8sV0FBVyxJQUFJLEtBQUssSUFBSSxDQUFDOztBQUdyRCxlQUFPO01BQ1g7TUFFUSxzQ0FBc0MsUUFBTTtBQUVoRCxZQUFJLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRztBQUMzQixpQkFBTzs7QUFJWCxZQUFJLE9BQU8sS0FBSyxNQUFNLFdBQVcsR0FBRztBQUNoQyxpQkFBTzs7QUFJWCxZQUFJLE9BQU8sS0FBSyxNQUFNLFdBQVcsR0FBRztBQUNoQyxpQkFBTzs7QUFJWCxjQUFNLG9CQUFvQixPQUFPLEtBQUssTUFBTSxvQkFBb0I7QUFDaEUsWUFBSSxtQkFBbUI7QUFDbkIsZ0JBQU0sZ0JBQXdCLGtCQUFrQjtBQUdoRCxjQUFJLEtBQUssWUFBWTtBQUNqQixtQkFBTzs7QUFJWCxjQUFJLGNBQWMsU0FBUyxHQUFHLEtBQUssQ0FBQyxjQUFjLE1BQU0sZUFBZSxHQUFHO0FBQ3RFLG1CQUFPOztBQUlYLGdCQUFNLGtCQUFrQixTQUFTLGFBQWE7QUFDOUMsY0FBSSxrQkFBa0IsSUFBSTtBQUN0QixtQkFBTzs7O0FBSWYsZUFBTztNQUNYO01BRVEsbUNBQW1DLFFBQU07QUFDN0MsWUFBSSxPQUFPLEtBQUssTUFBTSxXQUFXLEdBQUc7QUFDaEMsaUJBQU87O0FBSVgsY0FBTSxvQkFBb0IsT0FBTyxLQUFLLE1BQU0scUNBQXFDO0FBQ2pGLFlBQUksbUJBQW1CO0FBRW5CLGNBQUksS0FBSyxZQUFZO0FBQ2pCLG1CQUFPOztBQUdYLGdCQUFNLGtCQUEwQixrQkFBa0I7QUFDbEQsZ0JBQU0sZ0JBQXdCLGtCQUFrQjtBQUVoRCxjQUFJLGNBQWMsU0FBUyxHQUFHLEtBQUssQ0FBQyxjQUFjLE1BQU0sZUFBZSxHQUFHO0FBQ3RFLG1CQUFPOztBQUlYLGdCQUFNLGtCQUFrQixTQUFTLGFBQWE7QUFDOUMsZ0JBQU0sb0JBQW9CLFNBQVMsZUFBZTtBQUNsRCxjQUFJLGtCQUFrQixNQUFNLG9CQUFvQixJQUFJO0FBQ2hELG1CQUFPOzs7QUFJZixlQUFPO01BQ1g7TUFNQSxvQ0FBaUM7QUFDN0IsY0FBTSxnQkFBZ0IsS0FBSyxjQUFhO0FBQ3hDLGNBQU0sZ0JBQWdCLEtBQUssY0FBYTtBQUV4QyxZQUFJLEtBQUssd0JBQXdCLGlCQUFpQixLQUFLLHdCQUF3QixlQUFlO0FBQzFGLGlCQUFPLEtBQUs7O0FBR2hCLGFBQUssMkJBQTJCLG1CQUM1QixLQUFLLDJCQUEwQixHQUMvQixlQUNBLGVBQ0EsS0FBSyxhQUFZLENBQUU7QUFFdkIsYUFBSyxzQkFBc0I7QUFDM0IsYUFBSyxzQkFBc0I7QUFDM0IsZUFBTyxLQUFLO01BQ2hCO01BTUEsc0NBQW1DO0FBQy9CLGNBQU0saUJBQWlCLEtBQUssZUFBYztBQUMxQyxjQUFNLGtCQUFrQixLQUFLLGdCQUFlO0FBRTVDLFlBQUksS0FBSyx5QkFBeUIsa0JBQWtCLEtBQUssMEJBQTBCLGlCQUFpQjtBQUNoRyxpQkFBTyxLQUFLOztBQUdoQixhQUFLLDRCQUE0QixvQkFBb0IsZ0JBQWdCLGVBQWU7QUFDcEYsYUFBSyx1QkFBdUI7QUFDNUIsYUFBSyx3QkFBd0I7QUFDN0IsZUFBTyxLQUFLO01BQ2hCOztBQTdYSixZQUFBLCtCQUFBOzs7Ozs7Ozs7QUNoREEsUUFBQSxVQUFBO0FBQ0EsUUFBQSxpQ0FBQTtBQUVBLFFBQXFCLHlCQUFyQixjQUFvRCwrQkFBQSw2QkFBNEI7TUFDNUUsWUFBWSxZQUFVO0FBQ2xCLGNBQU0sVUFBVTtNQUNwQjtNQUVBLGlCQUFjO0FBQ1YsZUFBTztNQUNYO01BRUEsZ0JBQWE7QUFDVCxlQUFPO01BQ1g7TUFFQSxnQkFBYTtBQUNULGVBQU87TUFDWDtNQUVBLDZCQUE2QixTQUF5QixPQUF1QjtBQUN6RSxjQUFNLGFBQWEsTUFBTSw2QkFBNkIsU0FBUyxLQUFLO0FBQ3BFLFlBQUksWUFBWTtBQUNaLGNBQUksTUFBTSxHQUFHLFNBQVMsT0FBTyxHQUFHO0FBQzVCLGtCQUFNLE9BQU8sV0FBVyxJQUFJLE1BQU07QUFDbEMsZ0JBQUksUUFBUSxLQUFLLE9BQU8sSUFBSTtBQUN4Qix5QkFBVyxPQUFPLFFBQVEsV0FBVyxJQUFJLE1BQU0sSUFBSSxFQUFFO0FBQ3JELHlCQUFXLE9BQU8sWUFBWSxRQUFBLFNBQVMsRUFBRTt1QkFDbEMsT0FBTyxHQUFHO0FBQ2pCLHlCQUFXLE9BQU8sWUFBWSxRQUFBLFNBQVMsRUFBRTs7O0FBSWpELGNBQUksTUFBTSxHQUFHLFNBQVMsV0FBVyxHQUFHO0FBQ2hDLHVCQUFXLE9BQU8sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN6QyxrQkFBTSxPQUFPLFdBQVcsSUFBSSxNQUFNO0FBQ2xDLGdCQUFJLFFBQVEsS0FBSyxRQUFRLEdBQUc7QUFDeEIseUJBQVcsT0FBTyxRQUFRLFdBQVcsSUFBSSxNQUFNLElBQUksRUFBRTs7O0FBSTdELGNBQUksTUFBTSxHQUFHLFNBQVMsU0FBUyxHQUFHO0FBQzlCLHVCQUFXLE9BQU8sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN6QyxrQkFBTSxPQUFPLFdBQVcsSUFBSSxNQUFNO0FBQ2xDLGdCQUFJLE9BQU8sSUFBSTtBQUNYLHlCQUFXLE9BQU8sUUFBUSxXQUFXLElBQUksTUFBTSxDQUFDOzs7O0FBSzVELGVBQU87TUFDWDs7QUFoREosWUFBQSxVQUFBOzs7Ozs7Ozs7O0FDQUEsYUFBZ0IsaUJBQWlCLFdBQW9CO0FBQ2pELFlBQU0sV0FBVyxDQUFBO0FBQ2pCLGlCQUFXLE9BQU8sV0FBVztBQUV6QixpQkFBUyxPQUFPLENBQUMsVUFBVTs7QUFHL0IsYUFBTztJQUNYO0FBUkEsWUFBQSxtQkFBQTtBQVVBLGFBQWdCLG9CQUFvQixZQUErQixXQUFvQjtBQUNuRixZQUFNLFNBQVMsV0FBVyxNQUFLO0FBRS9CLFVBQUksT0FBTyxXQUFXLE1BQUs7QUFDM0IsaUJBQVcsT0FBTyxXQUFXO0FBRXpCLGVBQU8sS0FBSyxJQUFJLFVBQVUsTUFBTSxHQUFnQjs7QUFHcEQsVUFBSSxTQUFTLGFBQWEsT0FBTyxhQUFhLFVBQVUsYUFBYSxXQUFXLGFBQWEsVUFBVSxXQUFXO0FBQzlHLGVBQU8sTUFBTSxPQUFPLEtBQUssS0FBSSxDQUFFO0FBQy9CLGVBQU8sTUFBTSxTQUFTLEtBQUssTUFBSyxJQUFLLENBQUM7QUFDdEMsZUFBTyxNQUFNLFFBQVEsS0FBSyxLQUFJLENBQUU7O0FBR3BDLFVBQUksWUFBWSxhQUFhLFlBQVksYUFBYSxVQUFVLFdBQVc7QUFDdkUsZUFBTyxNQUFNLFVBQVUsS0FBSyxPQUFNLENBQUU7QUFDcEMsZUFBTyxNQUFNLFVBQVUsS0FBSyxPQUFNLENBQUU7QUFDcEMsZUFBTyxNQUFNLFFBQVEsS0FBSyxLQUFJLENBQUU7O0FBR3BDLGFBQU87SUFDWDtBQXRCQSxZQUFBLHNCQUFBOzs7Ozs7Ozs7QUNkQSxRQUFBLGNBQUE7QUFDQSxRQUFBLFlBQUE7QUFDQSxRQUFBLG1DQUFBO0FBQ0EsUUFBQSxjQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FBTyxJQUFJLFlBQUEsa0VBQWtFLEdBQUc7QUFDcEcsUUFBTSxpQkFBaUIsSUFBSSxPQUFPLElBQUksWUFBQSwrQ0FBK0MsR0FBRztBQUV4RixRQUFxQiw0QkFBckIsY0FBdUQsaUNBQUEsdUNBQXNDO01BQ3pGLFlBQW9CLFlBQW1CO0FBQ25DLGNBQUs7QUFEVyxhQUFBLGFBQUE7TUFFcEI7TUFFQSxlQUFZO0FBQ1IsZUFBTyxLQUFLLGFBQWEsaUJBQWlCO01BQzlDO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFlBQVksWUFBQSxlQUFlLE1BQU0sRUFBRTtBQUN6QyxjQUFNLGtCQUFrQixZQUFBLGlCQUFpQixTQUFTO0FBRWxELGVBQU8sVUFBQSxrQkFBa0IsNEJBQTRCLFFBQVEsV0FBVyxlQUFlO01BQzNGOztBQWRKLFlBQUEsVUFBQTs7Ozs7Ozs7O0FDUkEsUUFBQSxjQUFBO0FBQ0EsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLElBQUksWUFBQSwyRkFDSixHQUFHO0FBR1AsUUFBTSxpQkFBaUIsSUFBSSxPQUFPLE1BQVcsWUFBQSxxQkFBcUIsa0NBQTRDLEdBQUc7QUFDakgsUUFBTSxzQkFBc0I7QUFFNUIsUUFBcUIsOEJBQXJCLGNBQXlELGlDQUFBLHVDQUFzQztNQUMzRixZQUFvQixZQUFtQjtBQUNuQyxjQUFLO0FBRFcsYUFBQSxhQUFBO01BRXBCO01BRUEsZUFBWTtBQUNSLGVBQU8sS0FBSyxhQUFhLGlCQUFpQjtNQUM5QztNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxZQUFZLFlBQUEsZUFBZSxNQUFNLG9CQUFvQjtBQUMzRCxlQUFPLFVBQUEsa0JBQWtCLDRCQUE0QixRQUFRLFdBQVcsU0FBUztNQUNyRjs7QUFaSixZQUFBLFVBQUE7Ozs7Ozs7Ozs7QUNQQSxRQUFzQkMsVUFBdEIsTUFBNEI7TUFHeEIsT0FBTyxTQUF5QixTQUF3QjtBQUNwRCxlQUFPLFFBQVEsT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRLFNBQVMsQ0FBQyxDQUFDO01BQ3pEOztBQUxKLFlBQUEsU0FBQUE7QUFXQSxRQUFzQixpQkFBdEIsTUFBb0M7TUFlaEMsT0FBTyxTQUF5QixTQUF3QjtBQUNwRCxZQUFJLFFBQVEsU0FBUyxHQUFHO0FBQ3BCLGlCQUFPOztBQUdYLGNBQU0sZ0JBQWlDLENBQUE7QUFDdkMsWUFBSSxZQUFZLFFBQVE7QUFDeEIsWUFBSSxhQUFhO0FBRWpCLGlCQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxLQUFLO0FBQ3JDLHVCQUFhLFFBQVE7QUFFckIsZ0JBQU0sY0FBYyxRQUFRLEtBQUssVUFBVSxVQUFVLFFBQVEsVUFBVSxLQUFLLFFBQVEsV0FBVyxLQUFLO0FBQ3BHLGNBQUksQ0FBQyxLQUFLLG1CQUFtQixhQUFhLFdBQVcsWUFBWSxPQUFPLEdBQUc7QUFDdkUsMEJBQWMsS0FBSyxTQUFTO0FBQzVCLHdCQUFZO2lCQUNUO0FBQ0gsa0JBQU0sT0FBTztBQUNiLGtCQUFNLFFBQVE7QUFDZCxrQkFBTSxlQUFlLEtBQUssYUFBYSxhQUFhLE1BQU0sT0FBTyxPQUFPO0FBQ3hFLG9CQUFRLE1BQU0sTUFBSztBQUNmLHNCQUFRLElBQUksR0FBRyxLQUFLLFlBQVksZUFBZSxZQUFZLGNBQWMsY0FBYztZQUMzRixDQUFDO0FBRUQsd0JBQVk7OztBQUlwQixZQUFJLGFBQWEsTUFBTTtBQUNuQix3QkFBYyxLQUFLLFNBQVM7O0FBR2hDLGVBQU87TUFDWDs7QUFoREosWUFBQSxpQkFBQTs7Ozs7Ozs7O0FDWkEsUUFBQSxxQkFBQTtBQUVBLFFBQThCLGdDQUE5QixjQUFvRSxtQkFBQSxlQUFjO01BRzlFLG1CQUFtQixhQUFhLGVBQWUsWUFBVTtBQUNyRCxlQUFPLENBQUMsY0FBYyxPQUFPLENBQUMsV0FBVyxPQUFPLFlBQVksTUFBTSxLQUFLLGVBQWMsQ0FBRSxLQUFLO01BQ2hHO01BRUEsYUFBYSxhQUFhLFlBQVksVUFBUTtBQUMxQyxZQUFJLENBQUMsV0FBVyxNQUFNLHVCQUFzQixLQUFNLENBQUMsU0FBUyxNQUFNLHVCQUFzQixHQUFJO0FBQ3hGLG1CQUFTLE1BQU0scUJBQW9CLEVBQUcsUUFBUSxDQUFDLFFBQU87QUFDbEQsZ0JBQUksQ0FBQyxXQUFXLE1BQU0sVUFBVSxHQUFHLEdBQUc7QUFDbEMseUJBQVcsTUFBTSxPQUFPLEtBQUssU0FBUyxNQUFNLElBQUksR0FBRyxDQUFDOztVQUU1RCxDQUFDO0FBRUQscUJBQVcsTUFBTSxxQkFBb0IsRUFBRyxRQUFRLENBQUMsUUFBTztBQUNwRCxnQkFBSSxDQUFDLFNBQVMsTUFBTSxVQUFVLEdBQUcsR0FBRztBQUNoQyx1QkFBUyxNQUFNLE9BQU8sS0FBSyxXQUFXLE1BQU0sSUFBSSxHQUFHLENBQUM7O1VBRTVELENBQUM7O0FBR0wsWUFBSSxXQUFXLE1BQU0sS0FBSSxFQUFHLFFBQU8sSUFBSyxTQUFTLE1BQU0sS0FBSSxFQUFHLFFBQU8sR0FBSTtBQUNyRSxjQUFJLGFBQWEsV0FBVyxNQUFNLE1BQUs7QUFDdkMsY0FBSSxXQUFXLFNBQVMsTUFBTSxNQUFLO0FBRW5DLGNBQUksV0FBVyxNQUFNLHVCQUFzQixLQUFNLFdBQVcsSUFBSSxJQUFJLE1BQU0sRUFBRSxTQUFTLFFBQVEsR0FBRztBQUM1Rix5QkFBYSxXQUFXLElBQUksSUFBSSxNQUFNO0FBQ3RDLHVCQUFXLE1BQU0sTUFBTSxPQUFPLFdBQVcsS0FBSSxDQUFFO0FBQy9DLHVCQUFXLE1BQU0sTUFBTSxTQUFTLFdBQVcsTUFBSyxJQUFLLENBQUM7QUFDdEQsdUJBQVcsTUFBTSxNQUFNLFFBQVEsV0FBVyxLQUFJLENBQUU7cUJBQ3pDLFNBQVMsTUFBTSx1QkFBc0IsS0FBTSxTQUFTLElBQUksR0FBRyxNQUFNLEVBQUUsUUFBUSxVQUFVLEdBQUc7QUFDL0YsdUJBQVcsU0FBUyxJQUFJLEdBQUcsTUFBTTtBQUNqQyxxQkFBUyxNQUFNLE1BQU0sT0FBTyxTQUFTLEtBQUksQ0FBRTtBQUMzQyxxQkFBUyxNQUFNLE1BQU0sU0FBUyxTQUFTLE1BQUssSUFBSyxDQUFDO0FBQ2xELHFCQUFTLE1BQU0sTUFBTSxRQUFRLFNBQVMsS0FBSSxDQUFFO2lCQUN6QztBQUNILGFBQUMsVUFBVSxVQUFVLElBQUksQ0FBQyxZQUFZLFFBQVE7OztBQUl0RCxjQUFNLFNBQVMsV0FBVyxNQUFLO0FBQy9CLGVBQU8sUUFBUSxXQUFXO0FBQzFCLGVBQU8sTUFBTSxTQUFTO0FBQ3RCLGVBQU8sUUFBUSxLQUFLLElBQUksV0FBVyxPQUFPLFNBQVMsS0FBSztBQUN4RCxZQUFJLFdBQVcsUUFBUSxTQUFTLE9BQU87QUFDbkMsaUJBQU8sT0FBTyxXQUFXLE9BQU8sY0FBYyxTQUFTO2VBQ3BEO0FBQ0gsaUJBQU8sT0FBTyxTQUFTLE9BQU8sY0FBYyxXQUFXOztBQUczRCxlQUFPO01BQ1g7O0FBcERKLFlBQUEsVUFBQTs7Ozs7Ozs7Ozs7O0FDSEEsUUFBQSxrQ0FBQUMsaUJBQUEsdUNBQUE7QUFRQSxRQUFxQiwwQkFBckIsY0FBcUQsZ0NBQUEsUUFBNkI7TUFDOUUsaUJBQWM7QUFDVixlQUFPO01BQ1g7O0FBSEosWUFBQSxVQUFBOzs7Ozs7Ozs7O0FDWEEsUUFBQSxVQUFBO0FBRUEsYUFBZ0Isb0JBQW9CLFlBQTJCLFlBQXlCO0FBQ3BGLFlBQU0sU0FBUyxXQUFXLE1BQUs7QUFDL0IsWUFBTSxZQUFZLFdBQVc7QUFDN0IsWUFBTSxZQUFZLFdBQVc7QUFFN0IsYUFBTyxRQUFRLHVCQUF1QixXQUFXLFNBQVM7QUFDMUQsVUFBSSxXQUFXLE9BQU8sUUFBUSxXQUFXLE9BQU8sTUFBTTtBQUNsRCxjQUFNLFVBQVUsV0FBVyxPQUFPLE9BQU8sV0FBVyxRQUFRLFdBQVc7QUFDdkUsY0FBTSxVQUFVLFdBQVcsT0FBTyxPQUFPLFdBQVcsUUFBUSxXQUFXO0FBQ3ZFLGNBQU0sY0FBYyx1QkFBdUIsU0FBUyxPQUFPO0FBRTNELFlBQUksV0FBVyxPQUFPLFFBQVEsWUFBWSxLQUFJLEVBQUcsUUFBTyxJQUFLLE9BQU8sTUFBTSxLQUFJLEVBQUcsUUFBTyxHQUFJO0FBRXhGLGNBQUksWUFBWSxVQUFVLEtBQUssR0FBRztBQUM5Qix3QkFBWSxPQUFPLE9BQU8sWUFBWSxJQUFJLEtBQUssSUFBSSxDQUFDO2lCQUNqRDtBQUNILHdCQUFZLE1BQU0sT0FBTyxZQUFZLElBQUksS0FBSyxJQUFJLENBQUM7OztBQUkzRCxlQUFPLE1BQU07O0FBR2pCLGFBQU87SUFDWDtBQXhCQSxZQUFBLHNCQUFBO0FBMEJBLGFBQWdCLHVCQUNaLGVBQ0EsZUFBZ0M7QUFFaEMsWUFBTSxvQkFBb0IsY0FBYyxNQUFLO0FBRTdDLFVBQUksY0FBYyxVQUFVLE1BQU0sR0FBRztBQUNqQywwQkFBa0IsT0FBTyxRQUFRLGNBQWMsSUFBSSxNQUFNLENBQUM7QUFDMUQsMEJBQWtCLE9BQU8sVUFBVSxjQUFjLElBQUksUUFBUSxDQUFDO0FBRTlELFlBQUksY0FBYyxVQUFVLFFBQVEsR0FBRztBQUNuQyw0QkFBa0IsT0FBTyxVQUFVLGNBQWMsSUFBSSxRQUFRLENBQUM7QUFFOUQsY0FBSSxjQUFjLFVBQVUsYUFBYSxHQUFHO0FBQ3hDLDhCQUFrQixPQUFPLGVBQWUsY0FBYyxJQUFJLGFBQWEsQ0FBQztpQkFDckU7QUFDSCw4QkFBa0IsTUFBTSxlQUFlLGNBQWMsSUFBSSxhQUFhLENBQUM7O2VBRXhFO0FBQ0gsNEJBQWtCLE1BQU0sVUFBVSxjQUFjLElBQUksUUFBUSxDQUFDO0FBQzdELDRCQUFrQixNQUFNLGVBQWUsY0FBYyxJQUFJLGFBQWEsQ0FBQzs7YUFFeEU7QUFDSCwwQkFBa0IsTUFBTSxRQUFRLGNBQWMsSUFBSSxNQUFNLENBQUM7QUFDekQsMEJBQWtCLE1BQU0sVUFBVSxjQUFjLElBQUksUUFBUSxDQUFDO0FBQzdELDBCQUFrQixNQUFNLFVBQVUsY0FBYyxJQUFJLFFBQVEsQ0FBQztBQUM3RCwwQkFBa0IsTUFBTSxlQUFlLGNBQWMsSUFBSSxhQUFhLENBQUM7O0FBRzNFLFVBQUksY0FBYyxVQUFVLGdCQUFnQixHQUFHO0FBQzNDLDBCQUFrQixPQUFPLGtCQUFrQixjQUFjLElBQUksZ0JBQWdCLENBQUM7O0FBR2xGLFVBQUksY0FBYyxVQUFVLFVBQVUsR0FBRztBQUNyQywwQkFBa0IsT0FBTyxZQUFZLGNBQWMsSUFBSSxVQUFVLENBQUM7aUJBQzNELGNBQWMsSUFBSSxVQUFVLEtBQUssUUFBUSxrQkFBa0IsSUFBSSxVQUFVLEtBQUssTUFBTTtBQUMzRiwwQkFBa0IsTUFBTSxZQUFZLGNBQWMsSUFBSSxVQUFVLENBQUM7O0FBR3JFLFVBQUksa0JBQWtCLElBQUksVUFBVSxLQUFLLFFBQUEsU0FBUyxNQUFNLGtCQUFrQixJQUFJLE1BQU0sSUFBSSxJQUFJO0FBQ3hGLFlBQUksY0FBYyxVQUFVLE1BQU0sR0FBRztBQUNqQyw0QkFBa0IsT0FBTyxRQUFRLGtCQUFrQixJQUFJLE1BQU0sSUFBSSxFQUFFO2VBQ2hFO0FBQ0gsNEJBQWtCLE1BQU0sUUFBUSxrQkFBa0IsSUFBSSxNQUFNLElBQUksRUFBRTs7O0FBSTFFLGFBQU87SUFDWDtBQWhEQSxZQUFBLHlCQUFBOzs7Ozs7Ozs7QUN6QkEsUUFBQSxxQkFBQTtBQUVBLFFBQUEsdUJBQUE7QUFFQSxRQUE4Qix5QkFBOUIsY0FBNkQsbUJBQUEsZUFBYztNQUd2RSxtQkFBbUIsYUFBcUIsZUFBOEIsWUFBeUI7QUFDM0YsZ0JBQ00sY0FBYyxNQUFNLFdBQVUsS0FBTSxXQUFXLE1BQU0sV0FBVSxLQUM1RCxXQUFXLE1BQU0sV0FBVSxLQUFNLGNBQWMsTUFBTSxXQUFVLE1BQ3BFLFlBQVksTUFBTSxLQUFLLGVBQWMsQ0FBRSxLQUFLO01BRXBEO01BRUEsYUFBYSxhQUFxQixlQUE4QixZQUF5QjtBQUNyRixjQUFNLFNBQVMsY0FBYyxNQUFNLFdBQVUsSUFDdkMscUJBQUEsb0JBQW9CLGVBQWUsVUFBVSxJQUM3QyxxQkFBQSxvQkFBb0IsWUFBWSxhQUFhO0FBRW5ELGVBQU8sUUFBUSxjQUFjO0FBQzdCLGVBQU8sT0FBTyxjQUFjLE9BQU8sY0FBYyxXQUFXO0FBQzVELGVBQU87TUFDWDs7QUFuQkosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNSQSxRQUFBLGlDQUFBQyxpQkFBQSxzQ0FBQTtBQVFBLFFBQXFCLHlCQUFyQixjQUFvRCwrQkFBQSxRQUE0QjtNQUM1RSxpQkFBYztBQUNWLGVBQU8sSUFBSSxPQUFPLDBDQUEwQztNQUNoRTs7QUFISixZQUFBLFVBQUE7Ozs7Ozs7OztBQ0pBLFFBQU0sd0JBQXdCLElBQUksT0FBTyw0Q0FBNEMsR0FBRztBQUN4RixRQUFNLDRCQUE0QjtNQUM5QixNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxNQUFNO01BQ04sTUFBTTtNQUNOLE1BQU07TUFDTixNQUFNO01BQ04sS0FBSztNQUNMLE9BQU87TUFDUCxNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLE1BQU07TUFDTixPQUFPO01BQ1AsTUFBTTtNQUNOLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsT0FBTztNQUNQLE9BQU87TUFDUCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLE1BQU07TUFDTixPQUFPO01BQ1AsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsSUFBSTtNQUNKLE1BQU07TUFDTixLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLE9BQU87TUFDUCxNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE9BQU87TUFDUCxNQUFNO01BQ04sS0FBSztNQUNMLE1BQU07TUFDTixNQUFNO01BQ04sTUFBTTtNQUNOLE1BQU07TUFDTixPQUFPO01BQ1AsTUFBTTtNQUNOLE1BQU07TUFDTixNQUFNO01BQ04sS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxPQUFPO01BQ1AsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixNQUFNO01BQ04sT0FBTztNQUNQLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLE9BQU87TUFDUCxNQUFNO01BQ04sS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxJQUFJO01BQ0osS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNM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LHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN2QztlQUVDO0FBQ0Qsc0JBQVUsTUFBTSxRQUFRLENBQUM7QUFDekIsc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3ZDO2VBRUM7ZUFDQTtBQUNELHNCQUFVLE1BQU0sUUFBUSxFQUFFO0FBQzFCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN2QztlQUVDO0FBQ0Qsc0JBQVUsTUFBTSxRQUFRLEVBQUU7QUFDMUIsc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3ZDO2VBRUM7QUFDRCxzQkFBVSxNQUFNLFFBQVEsRUFBRTtBQUMxQixzQkFBVSxNQUFNLFVBQVUsQ0FBQztBQUMzQixzQkFBVSxNQUFNLFVBQVUsQ0FBQztBQUMzQixzQkFBVSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFDdkM7ZUFFQztBQUNELHNCQUFVLE1BQU0sUUFBUSxFQUFFO0FBQzFCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN2QztlQUVDO0FBQ0QsZ0JBQUksVUFBVSxJQUFJLE1BQU0sSUFBSSxHQUFHO0FBQzNCLDBCQUFZLFlBQUEsb0JBQW9CLFdBQVcsRUFBRSxPQUFPLEVBQUMsQ0FBRTs7QUFHM0Qsc0JBQVUsTUFBTSxRQUFRLENBQUM7QUFDekIsc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxV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UyxZQUFZLENBQUM7QUFBQSxJQUNyQztBQUFBO0FBQUEsRUFFTyxXQUErQjtBQXJFMUM7QUFzRVEsWUFBTyxVQUFLLFVBQUwsbUJBQVk7QUFBQSxFQUN2QjtBQUNKOyIsCiAgIm5hbWVzIjogWyJtb2R1bGUiLCAiX19leHRlbmRzIiwgIl9fYXNzaWduIiwgIl9fcmVzdCIsICJfX2RlY29yYXRlIiwgIl9fcGFyYW0iLCAiX19tZXRhZGF0YSIsICJfX2F3YWl0ZXIiLCAiX19nZW5lcmF0b3IiLCAiX19leHBvcnRTdGFyIiwgIl9fdmFsdWVzIiwgIl9fcmVhZCIsICJfX3NwcmVhZCIsICJfX3NwcmVhZEFycmF5cyIsICJfX3NwcmVhZEFycmF5IiwgIl9fYXdhaXQiLCAiX19hc3luY0dlbmVyYXRvciIsICJfX2FzeW5jRGVsZWdhdG9yIiwgIl9fYXN5bmNWYWx1ZXMiLCAiX19tYWtlVGVtcGxhdGVPYmplY3QiLCAiX19pbXBvcnRTdGFyIiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwgIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiLCAiX19jbGFzc1ByaXZhdGVGaWVsZEluIiwgIl9fY3JlYXRlQmluZGluZyIsICJleHBvcnRzIiwgInYiLCAibW9kdWxlIiwgInQiLCAiZSIsICJuIiwgInIiLCAiaSIsICJzIiwgInUiLCAiTSIsICJtIiwgImgiLCAiJCIsICJsIiwgInkiLCAiZyIsICJEIiwgInYiLCAibyIsICJkIiwgImEiLCAiZiIsICJjIiwgIl9faW1wb3J0RGVmYXVsdCIsICJtb2R1bGUiLCAidCIsICJlIiwgImkiLCAiciIsICJzIiwgIl9faW1wb3J0RGVmYXVsdCIsICJ0ZXh0IiwgInRleHQiLCAiRmlsdGVyIiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX2EiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0U3RhciIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJ0ZXh0IiwgInRleHQiLCAiX19pbXBvcnREZWZhdWx0IiwgInRleHQiLCAicGFyc2VEYXRlIiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydFN0YXIiLCAiX19pbXBvcnREZWZhdWx0IiwgInRleHQiLCAicGFyc2VEYXRlIiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydFN0YXIiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAidGV4dCIsICJwYXJzZURhdGUiLCAidGV4dCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydFN0YXIiLCAidGV4dCIsICJfX2ltcG9ydERlZmF1bHQiLCAidGV4dCIsICJwYXJzZURhdGUiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydFN0YXIiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJ0ZXh0IiwgInBhcnNlRGF0ZSIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0U3RhciIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAidGV4dCIsICJwYXJzZURhdGUiLCAiX19pbXBvcnREZWZhdWx0IiwgInRleHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJ0ZXh0IiwgInBhcnNlRGF0ZSIsICJfX2ltcG9ydERlZmF1bHQiLCAidGV4dCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgInRleHQiLCAicGFyc2VEYXRlIiwgIl9fZXhwb3J0U3RhciIsICJfX2ltcG9ydFN0YXIiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydFN0YXIiLCAiX19pbXBvcnRTdGFyIiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgInRleHQiLCAicGFyc2VEYXRlIiwgIl9faW1wb3J0U3RhciIsICJNZXJpZGllbSIsICJ0ZXh0IiwgInBhcnNlRGF0ZSIsICJPcGVyYXRvcnMiLCAiU3RydWN0dXJhbENoYXJhY3RlcnMiLCAiVG9rZW5zIiwgInJlcXVpcmVfY29uc3QiLCAiX19hc3NpZ24iLCAicmVxdWlyZV91dGlscyIsICJfX3NwcmVhZEFycmF5cyIsICJfX3NwcmVhZEFycmF5cyIsICJyZXF1aXJlX3V0aWxzIiwgInJlcXVpcmVfY29uc3QiLCAiX19zcHJlYWRBcnJheXMiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJlbGVtZW50IiwgIldlZWtkYXkiLCAiZGF0ZXV0aWwiLCAiSXRlclJlc3VsdCIsICJ0c2xpYiIsICJDYWxsYmFja0l0ZXJSZXN1bHQiLCAiVG9UZXh0IiwgIlBhcnNlciIsICJ0ZXh0IiwgIkZyZXF1ZW5jeSIsICJ0ZXh0IiwgIlRpbWUiLCAiRGF0ZVRpbWUiLCAiYXR0ciIsICJEYXRlV2l0aFpvbmUiLCAiZGVmYXVsdEtleXMiLCAia2V5IiwgInZhbHVlIiwgIkNhY2hlIiwgIml0ZW0iLCAiaSIsICJJdGVyaW5mbyIsICJSUnVsZSIsICJ0ZXh0IiwgInpvbmVkRGF0ZSIsICJERUZBVUxUX09QVElPTlMiLCAidmFsIiwgImluaXRpYWxpemVPcHRpb25zIiwgImRlZmF1bHRLZXlzIiwgIlJSdWxlU2V0IiwgInRleHQiLCAiU3RhdHVzVHlwZSIsICJkZWZhdWx0U2V0dGluZ3MiLCAiZWxlbWVudCIsICJlbGVtZW50IiwgImltcG9ydF9vYnNpZGlhbiIsICJ2YXVsdCIsICJtZXRhZGF0YUNhY2hlIiwgInRleHQiLCAiZWxlbWVudCIsICJwRWxlbWVudCIsICJlbGVtZW50IiwgIkNhY2hlIiwgIm1ldGFkYXRhQ2FjaGUiLCAidmF1bHQiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJlbGVtZW50IiwgInRleHQiLCAiZWxlbWVudCIsICJpbnN0YW5jZSIsICJjcmVhdGVfZnJhZ21lbnQiLCAiYXR0ciIsICJjdHgiLCAidGFzayIsICJpbXBvcnRfb2JzaWRpYW4iLCAidGFzayIsICJlbGVtZW50IiwgIl9hIiwgInNlY3Rpb25JbmRleCIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImNoaWxkcmVuIiwgImNocm9ubyIsICJib29uUGFyc2UiLCAiZWxlbWVudCIsICJ0ZXh0IiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAidGV4dCIsICJ1cGRhdGUiLCAidGV4dCIsICJzZXR0aW5ncyIsICJpbXBvcnRfb2JzaWRpYW4iLCAic2V0dGluZ3MiLCAic2V0dGluZ3MiLCAiQ2FjaGUiXQp9Cg== diff --git a/resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-query-styling.css b/resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-query-styling.css index fdd89a294a..bd91c46e6e 100644 --- a/resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-query-styling.css +++ b/resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-query-styling.css @@ -1,4 +1,4 @@ -.block-language-tasks:has(ul.plugin-tasks-query-result.tasks-group-by-priority) .tasks-group-heading { +.block-language-tasks:has(ul.plugin-tasks-query-result[data-task-group-by="priority"]) .tasks-group-heading { color: red; } diff --git a/src/Commands/CreateOrEdit.ts b/src/Commands/CreateOrEdit.ts index ab35c51af3..d9cc30f486 100644 --- a/src/Commands/CreateOrEdit.ts +++ b/src/Commands/CreateOrEdit.ts @@ -1,10 +1,11 @@ -import { App, Editor, MarkdownView, View } from 'obsidian'; +import { App, Editor, MarkdownView } from 'obsidian'; +import type { MarkdownFileInfo } from 'obsidian'; import { TaskModal } from '../TaskModal'; import type { Task } from '../Task'; import { DateFallback } from '../DateFallback'; import { taskFromLine } from './CreateOrEditTaskParser'; -export const createOrEdit = (checking: boolean, editor: Editor, view: View, app: App) => { +export const createOrEdit = (checking: boolean, editor: Editor, view: MarkdownView | MarkdownFileInfo, app: App) => { if (checking) { return view instanceof MarkdownView; } diff --git a/src/Commands/ToggleDone.ts b/src/Commands/ToggleDone.ts index bb76df30b1..96c2c802fe 100644 --- a/src/Commands/ToggleDone.ts +++ b/src/Commands/ToggleDone.ts @@ -1,9 +1,10 @@ -import { Editor, MarkdownView, View } from 'obsidian'; +import { Editor, MarkdownView } from 'obsidian'; +import type { MarkdownFileInfo } from 'obsidian'; import { StatusRegistry } from '../StatusRegistry'; import { Task, TaskRegularExpressions } from '../Task'; -export const toggleDone = (checking: boolean, editor: Editor, view: View) => { +export const toggleDone = (checking: boolean, editor: Editor, view: MarkdownView | MarkdownFileInfo) => { if (checking) { if (!(view instanceof MarkdownView)) { // If we are not in a markdown view, the command shouldn't be shown. diff --git a/src/Commands/index.ts b/src/Commands/index.ts index b235ba1120..20a9dd2c50 100644 --- a/src/Commands/index.ts +++ b/src/Commands/index.ts @@ -1,4 +1,4 @@ -import type { App, Editor, Plugin, View } from 'obsidian'; +import type { App, Editor, MarkdownFileInfo, MarkdownView, Plugin } from 'obsidian'; import { createOrEdit } from './CreateOrEdit'; import { toggleDone } from './ToggleDone'; @@ -17,7 +17,7 @@ export class Commands { id: 'edit-task', name: 'Create or edit task', icon: 'pencil', - editorCheckCallback: (checking: boolean, editor: Editor, view: View) => { + editorCheckCallback: (checking: boolean, editor: Editor, view: MarkdownView | MarkdownFileInfo) => { return createOrEdit(checking, editor, view, this.app); }, }); diff --git a/src/QueryRenderer.ts b/src/QueryRenderer.ts index 2190bf6f6a..8c2e5838d6 100644 --- a/src/QueryRenderer.ts +++ b/src/QueryRenderer.ts @@ -190,8 +190,8 @@ class QueryRenderChild extends MarkdownRenderChild { const taskList = content.createEl('ul'); taskList.addClasses(['contains-task-list', 'plugin-tasks-query-result']); taskList.addClasses(layout.specificClasses); - // TODO TEMP add tests - taskList.addClasses(this.getGroupingClasses()); + const groupingAttribute = this.getGroupingAttribute(); + if (groupingAttribute && groupingAttribute.length > 0) taskList.dataset.taskGroupBy = groupingAttribute; for (let i = 0; i < tasksCount; i++) { const task = tasks[i]; const isFilenameUnique = this.isFilenameUnique({ task }); @@ -359,12 +359,11 @@ class QueryRenderChild extends MarkdownRenderChild { return allFilesWithSameName.length < 2; } - private getGroupingClasses() { - const classes: string[] = []; + private getGroupingAttribute() { + const groupingRules: string[] = []; for (const group of this.query.grouping) { - const className = `tasks-group-by-${group.property}`; - classes.push(className); + groupingRules.push(group.property); } - return classes; + return groupingRules.join(','); } } diff --git a/src/TaskLineRenderer.ts b/src/TaskLineRenderer.ts index 2ceab90b71..df1a07502d 100644 --- a/src/TaskLineRenderer.ts +++ b/src/TaskLineRenderer.ts @@ -27,8 +27,8 @@ export const LayoutClasses: { [c in TaskLayoutComponent]: string } = { blockLink: '', }; -const MAX_DAY_CLASS_RANGE = 7; -const DAY_CLASS_OVER_RANGE_POSTFIX = 'far'; +const MAX_DAY_VALUE_RANGE = 7; +const DAY_VALUE_OVER_RANGE_POSTFIX = 'far'; /** * The function used to render a Markdown task line into an existing HTML element. @@ -65,8 +65,8 @@ export async function renderTaskLine( const textSpan = document.createElement('span'); li.appendChild(textSpan); textSpan.classList.add('tasks-list-text'); - const classes = await taskToHtml(task, renderDetails, textSpan, textRenderer); - li.classList.add(...classes); + const attributes = await taskToHtml(task, renderDetails, textSpan, textRenderer); + for (const key in attributes) li.dataset[key] = attributes[key]; // NOTE: this area is mentioned in `CONTRIBUTING.md` under "How does Tasks handle status changes". When // moving the code, remember to update that reference too. @@ -113,8 +113,8 @@ async function taskToHtml( renderDetails: TaskLineRenderDetails, parentElement: HTMLElement, textRenderer: TextRenderer, -) { - const allSpecificClasses: string[] = []; +): Promise { + let allAttributes: AttributesDictionary = {}; const taskLayout = renderDetails.taskLayout ?? new TaskLayout(renderDetails.layoutOptions); // Render and build classes for all the task's visible components for (const component of taskLayout.layoutComponents) { @@ -132,25 +132,24 @@ async function taskToHtml( const internalSpan = document.createElement('span'); span.appendChild(internalSpan); await renderComponentText(internalSpan, componentString, component, task, textRenderer); - const [genericClasses, specificClasses] = getComponentClasses(component, task); + const [genericClasses, dataAttributes] = getComponentClassesAndData(component, task); addInternalClasses(component, internalSpan); // Add the generic classes that apply to what this component is (priority, due date etc) span.classList.add(...genericClasses); - // Add the specific classes that describe the content of the component - // (task-priority-medium, task-due-past-1d etc). - span.classList.add(...specificClasses); - allSpecificClasses.push(...specificClasses); + // Add the attributes to the component ('priority-medium', 'due-past-1d' etc) + for (const key in dataAttributes) span.dataset[key] = dataAttributes[key]; + allAttributes = { ...allAttributes, ...dataAttributes }; } } } // Now build classes for the hidden task components without rendering them for (const component of taskLayout.hiddenComponents) { - const [_, specificClasses] = getComponentClasses(component, task); - allSpecificClasses.push(...specificClasses); + const [_, dataAttributes] = getComponentClassesAndData(component, task); + allAttributes = { ...allAttributes, ...dataAttributes }; } - return allSpecificClasses; + return allAttributes; } /* @@ -197,41 +196,41 @@ async function renderComponentText( } } +export type AttributesDictionary = { [key: string]: string }; + /** - * This function returns two lists of tags -- genericClasses and specificClasses -- that describe the + * This function returns two lists -- genericClasses and dataAttributes -- that describe the * given component. * The genericClasses describe what the component is, e.g. a due date or a priority, and are one of the * options in LayoutClasses. - * The specificClasses describe the content of the component translated to a CSS class, - * e.g. task-priority-medium, task-due-past-1d etc. + * The dataAttributes describe the content of the component, e.g. `data-task-priority="medium"`, `data-task-due="past-1d"` etc. */ -function getComponentClasses(component: TaskLayoutComponent, task: Task) { +function getComponentClassesAndData(component: TaskLayoutComponent, task: Task): [string[], AttributesDictionary] { const genericClasses: string[] = []; - const specificClasses: string[] = []; + const dataAttributes: AttributesDictionary = {}; + const setDateAttribute = (date: Moment, attributeName: string) => { + const dateValue = dateToAttribute(date); + if (dateValue) dataAttributes[attributeName] = dateValue; + }; switch (component) { case 'description': genericClasses.push(LayoutClasses.description); - for (const tag of task.tags) { - const className = tagToClassName(tag); - if (className) specificClasses.push(className); - } break; case 'priority': { - let priorityClass = null; - if (task.priority === taskModule.Priority.High) priorityClass = 'task-priority-high'; - else if (task.priority === taskModule.Priority.Medium) priorityClass = 'task-priority-medium'; - else if (task.priority === taskModule.Priority.Low) priorityClass = 'task-priority-low'; - else priorityClass = 'task-priority-none'; + let priorityValue = null; + if (task.priority === taskModule.Priority.High) priorityValue = 'high'; + else if (task.priority === taskModule.Priority.Medium) priorityValue = 'medium'; + else if (task.priority === taskModule.Priority.Low) priorityValue = 'low'; + else priorityValue = 'none'; + dataAttributes['taskPriority'] = priorityValue; genericClasses.push(LayoutClasses.priority); - specificClasses.push(priorityClass); break; } case 'dueDate': { const date = task.dueDate; if (date) { genericClasses.push(LayoutClasses.dueDate); - const dateClass = dateToClassName(date); - if (dateClass) specificClasses.push('task-due-' + dateClass); + setDateAttribute(date, 'taskDue'); } break; } @@ -239,8 +238,7 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { const date = task.startDate; if (date) { genericClasses.push(LayoutClasses.startDate); - const dateClass = dateToClassName(date); - if (dateClass) specificClasses.push('task-start-' + dateClass); + setDateAttribute(date, 'taskStart'); } break; } @@ -248,8 +246,7 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { const date = task.scheduledDate; if (date) { genericClasses.push(LayoutClasses.scheduledDate); - const dateClass = dateToClassName(date); - if (dateClass) specificClasses.push('task-scheduled-' + dateClass); + setDateAttribute(date, 'taskScheduled'); } break; } @@ -257,8 +254,7 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { const date = task.doneDate; if (date) { genericClasses.push(LayoutClasses.doneDate); - const dateClass = dateToClassName(date); - if (dateClass) specificClasses.push('task-done-' + dateClass); + setDateAttribute(date, 'taskDone'); } break; } @@ -267,7 +263,7 @@ function getComponentClasses(component: TaskLayoutComponent, task: Task) { break; } } - return [genericClasses, specificClasses]; + return [genericClasses, dataAttributes]; } /* @@ -283,8 +279,9 @@ function addInternalClasses(component: TaskLayoutComponent, renderedComponent: H for (let i = 0; i < tags.length; i++) { const tagName = tags[i].textContent; if (tagName) { - const className = tagToClassName(tagName); - if (className) tags[i].classList.add(className); + const className = tagToAttributeValue(tagName); + const element = tags[i] as HTMLElement; + if (className) element.dataset.tagName = className; } } } @@ -293,10 +290,10 @@ function addInternalClasses(component: TaskLayoutComponent, renderedComponent: H /** * Translate a relative date to a CSS class: 'today', 'future-1d' (for tomorrow), 'past-1d' (for yesterday) * etc. - * A cutoff (in days) is defined in MAX_DAY_CLASS_RANGE, from beyond that a generic 'far' postfix will be added. + * A cutoff (in days) is defined in MAX_DAY_VALUE_RANGE, from beyond that a generic 'far' postfix will be added. * (the cutoff exists because we don't want to flood the DOM with potentially hundreds of unique classes.) */ -function dateToClassName(date: Moment) { +function dateToAttribute(date: Moment) { const today = window.moment().startOf('day'); let result = ''; const diffDays = today.diff(date, 'days'); @@ -304,25 +301,25 @@ function dateToClassName(date: Moment) { if (diffDays === 0) return 'today'; else if (diffDays > 0) result += 'past-'; else if (diffDays < 0) result += 'future-'; - if (Math.abs(diffDays) <= MAX_DAY_CLASS_RANGE) { + if (Math.abs(diffDays) <= MAX_DAY_VALUE_RANGE) { result += Math.abs(diffDays).toString() + 'd'; } else { - result += DAY_CLASS_OVER_RANGE_POSTFIX; + result += DAY_VALUE_OVER_RANGE_POSTFIX; } return result; } /* - * Convert a tag name to a name that can be used as a CSS class, sanitizing them according to CSS class - * name rules. - * Taken from here: https://stackoverflow.com/questions/448981/which-characters-are-valid-in-css-class-names-selectors + * Sanitize tag names so they will be valid attribute values according to the HTML spec: + * https://html.spec.whatwg.org/multipage/parsing.html#attribute-value-(double-quoted)-state */ -function tagToClassName(tag: string) { - const illegalCssClassChars = /[^_a-zA-Z0-9-]/g; - let sanitizedTag = tag.replace(illegalCssClassChars, '-'); +function tagToAttributeValue(tag: string) { + // eslint-disable-next-line no-control-regex + const illegalChars = /["&\x00\r\n]/g; + let sanitizedTag = tag.replace(illegalChars, '-'); // And if after sanitazation the name starts with dashes or underscores, remove them. sanitizedTag = sanitizedTag.replace(/^[-_]+/, ''); - if (sanitizedTag.length > 0) return `task-tag-${sanitizedTag}`; + if (sanitizedTag.length > 0) return sanitizedTag; else return null; } diff --git a/tests/TaskLineRenderer.test.ts b/tests/TaskLineRenderer.test.ts index dcd65cfd3b..23ac45065f 100644 --- a/tests/TaskLineRenderer.test.ts +++ b/tests/TaskLineRenderer.test.ts @@ -3,7 +3,7 @@ */ import moment from 'moment'; import { LayoutClasses, renderTaskLine } from '../src/TaskLineRenderer'; -import type { TextRenderer } from '../src/TaskLineRenderer'; +import type { AttributesDictionary, TextRenderer } from '../src/TaskLineRenderer'; import { resetSettings, updateSettings } from '../src/Config/Settings'; import { LayoutOptions } from '../src/TaskLayout'; import type { Task } from '../src/Task'; @@ -222,7 +222,7 @@ describe('task line rendering', () => { taskLine: string, layoutOptions: Partial, mainClass: string, - moreClasses: string[], + attributes: AttributesDictionary, ) => { const task = fromLine({ line: taskLine, @@ -235,8 +235,11 @@ describe('task line rendering', () => { for (const childSpan of Array.from(textSpan.children)) { if (childSpan.classList.contains(mainClass)) { found = true; - const spanClasses = Array.from(childSpan.classList).filter((c) => c != mainClass); - expect(spanClasses).toEqual(moreClasses); + const spanElement = childSpan as HTMLSpanElement; + // Now verify the attributes + for (const key in attributes) { + expect(spanElement.dataset[key]).toEqual(attributes[key]); + } } } expect(found).toBeTruthy(); @@ -246,7 +249,7 @@ describe('task line rendering', () => { taskLine: string, layoutOptions: Partial, hiddenGenericClass: string, - expectedSpecificClass: string, + attributes: AttributesDictionary, ) => { const task = fromLine({ line: taskLine, @@ -258,8 +261,11 @@ describe('task line rendering', () => { for (const childSpan of Array.from(textSpan.children)) { expect(childSpan.classList.contains(hiddenGenericClass)).toBeFalsy(); } - const li = parentRender.children[0]; - expect(li.classList.contains(expectedSpecificClass)).toBeTruthy(); + const li = parentRender.children[0] as HTMLElement; + // Now verify the attributes + for (const key in attributes) { + expect(li.dataset[key]).toEqual(attributes[key]); + } }; it('renders priority with its correct classes', async () => { @@ -267,19 +273,19 @@ describe('task line rendering', () => { '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', {}, LayoutClasses.priority, - ['task-priority-high'], + { taskPriority: 'high' }, ); await testComponentClasses( '- [ ] Full task 🔼 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', {}, LayoutClasses.priority, - ['task-priority-medium'], + { taskPriority: 'medium' }, ); await testComponentClasses( '- [ ] Full task 🔽 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', {}, LayoutClasses.priority, - ['task-priority-low'], + { taskPriority: 'low' }, ); }); @@ -288,144 +294,140 @@ describe('task line rendering', () => { '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', {}, LayoutClasses.recurrenceRule, - [], + {}, ); }); it('adds a correct "today" CSS class to dates', async () => { const today = DateParser.parseDate('today').format(TaskRegularExpressions.dateFormat); - await testComponentClasses(`- [ ] Full task ⏫ 📅 ${today}`, {}, LayoutClasses.dueDate, ['task-due-today']); - await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${today}`, {}, LayoutClasses.scheduledDate, [ - 'task-scheduled-today', - ]); - await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${today}`, {}, LayoutClasses.startDate, ['task-start-today']); - await testComponentClasses(`- [x] Done task ✅ ${today}`, {}, LayoutClasses.doneDate, ['task-done-today']); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${today}`, {}, LayoutClasses.dueDate, { taskDue: 'today' }); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${today}`, {}, LayoutClasses.scheduledDate, { + taskScheduled: 'today', + }); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${today}`, {}, LayoutClasses.startDate, { + taskStart: 'today', + }); + await testComponentClasses(`- [x] Done task ✅ ${today}`, {}, LayoutClasses.doneDate, { taskDone: 'today' }); }); it('adds a correct "future-1d" CSS class to dates', async () => { const future = DateParser.parseDate('tomorrow').format(TaskRegularExpressions.dateFormat); - await testComponentClasses(`- [ ] Full task ⏫ 📅 ${future}`, {}, LayoutClasses.dueDate, [ - 'task-due-future-1d', - ]); - await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${future}`, {}, LayoutClasses.scheduledDate, [ - 'task-scheduled-future-1d', - ]); - await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${future}`, {}, LayoutClasses.startDate, [ - 'task-start-future-1d', - ]); - await testComponentClasses(`- [x] Done task ✅ ${future}`, {}, LayoutClasses.doneDate, ['task-done-future-1d']); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${future}`, {}, LayoutClasses.dueDate, { + taskDue: 'future-1d', + }); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${future}`, {}, LayoutClasses.scheduledDate, { + taskScheduled: 'future-1d', + }); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${future}`, {}, LayoutClasses.startDate, { + taskStart: 'future-1d', + }); + await testComponentClasses(`- [x] Done task ✅ ${future}`, {}, LayoutClasses.doneDate, { + taskDone: 'future-1d', + }); }); it('adds a correct "future-7d" CSS class to dates', async () => { const future = DateParser.parseDate('in 7 days').format(TaskRegularExpressions.dateFormat); - await testComponentClasses(`- [ ] Full task ⏫ 📅 ${future}`, {}, LayoutClasses.dueDate, [ - 'task-due-future-7d', - ]); - await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${future}`, {}, LayoutClasses.scheduledDate, [ - 'task-scheduled-future-7d', - ]); - await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${future}`, {}, LayoutClasses.startDate, [ - 'task-start-future-7d', - ]); - await testComponentClasses(`- [x] Done task ✅ ${future}`, {}, LayoutClasses.doneDate, ['task-done-future-7d']); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${future}`, {}, LayoutClasses.dueDate, { + taskDue: 'future-7d', + }); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${future}`, {}, LayoutClasses.scheduledDate, { + taskScheduled: 'future-7d', + }); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${future}`, {}, LayoutClasses.startDate, { + taskStart: 'future-7d', + }); + await testComponentClasses(`- [x] Done task ✅ ${future}`, {}, LayoutClasses.doneDate, { + taskDone: 'future-7d', + }); }); it('adds a correct "past-1d" CSS class to dates', async () => { const past = DateParser.parseDate('yesterday').format(TaskRegularExpressions.dateFormat); - await testComponentClasses(`- [ ] Full task ⏫ 📅 ${past}`, {}, LayoutClasses.dueDate, ['task-due-past-1d']); - await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${past}`, {}, LayoutClasses.scheduledDate, [ - 'task-scheduled-past-1d', - ]); - await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${past}`, {}, LayoutClasses.startDate, [ - 'task-start-past-1d', - ]); - await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, ['task-done-past-1d']); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${past}`, {}, LayoutClasses.dueDate, { taskDue: 'past-1d' }); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${past}`, {}, LayoutClasses.scheduledDate, { + taskScheduled: 'past-1d', + }); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${past}`, {}, LayoutClasses.startDate, { + taskStart: 'past-1d', + }); + await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, { taskDone: 'past-1d' }); }); it('adds a correct "past-7d" CSS class to dates', async () => { const past = DateParser.parseDate('7 days ago').format(TaskRegularExpressions.dateFormat); - await testComponentClasses(`- [ ] Full task ⏫ 📅 ${past}`, {}, LayoutClasses.dueDate, ['task-due-past-7d']); - await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${past}`, {}, LayoutClasses.scheduledDate, [ - 'task-scheduled-past-7d', - ]); - await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${past}`, {}, LayoutClasses.startDate, [ - 'task-start-past-7d', - ]); - await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, ['task-done-past-7d']); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${past}`, {}, LayoutClasses.dueDate, { taskDue: 'past-7d' }); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${past}`, {}, LayoutClasses.scheduledDate, { + taskScheduled: 'past-7d', + }); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${past}`, {}, LayoutClasses.startDate, { + taskStart: 'past-7d', + }); + await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, { taskDone: 'past-7d' }); }); it('adds the classes "...future-far" and "...past-far" to dates that are further than 7 days', async () => { const future = DateParser.parseDate('in 8 days').format(TaskRegularExpressions.dateFormat); - await testComponentClasses(`- [ ] Full task ⏫ 📅 ${future}`, {}, LayoutClasses.dueDate, [ - 'task-due-future-far', - ]); - await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${future}`, {}, LayoutClasses.scheduledDate, [ - 'task-scheduled-future-far', - ]); - await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${future}`, {}, LayoutClasses.startDate, [ - 'task-start-future-far', - ]); - await testComponentClasses(`- [x] Done task ✅ ${future}`, {}, LayoutClasses.doneDate, [ - 'task-done-future-far', - ]); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${future}`, {}, LayoutClasses.dueDate, { + taskDue: 'future-far', + }); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${future}`, {}, LayoutClasses.scheduledDate, { + taskScheduled: 'future-far', + }); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${future}`, {}, LayoutClasses.startDate, { + taskStart: 'future-far', + }); + await testComponentClasses(`- [x] Done task ✅ ${future}`, {}, LayoutClasses.doneDate, { + taskDone: 'future-far', + }); const past = DateParser.parseDate('8 days ago').format(TaskRegularExpressions.dateFormat); - await testComponentClasses(`- [ ] Full task ⏫ 📅 ${past}`, {}, LayoutClasses.dueDate, ['task-due-past-far']); - await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${past}`, {}, LayoutClasses.scheduledDate, [ - 'task-scheduled-past-far', - ]); - await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${past}`, {}, LayoutClasses.startDate, [ - 'task-start-past-far', - ]); - await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, ['task-done-past-far']); + await testComponentClasses(`- [ ] Full task ⏫ 📅 ${past}`, {}, LayoutClasses.dueDate, { taskDue: 'past-far' }); + await testComponentClasses(`- [ ] Full task ⏫ ⏳ ${past}`, {}, LayoutClasses.scheduledDate, { + taskScheduled: 'past-far', + }); + await testComponentClasses(`- [ ] Full task ⏫ 🛫 ${past}`, {}, LayoutClasses.startDate, { + taskStart: 'past-far', + }); + await testComponentClasses(`- [x] Done task ✅ ${past}`, {}, LayoutClasses.doneDate, { taskDone: 'past-far' }); }); it('does not add specific classes to invalid dates', async () => { - await testComponentClasses('- [ ] Full task ⏫ 📅 2023-02-29', {}, LayoutClasses.dueDate, []); - }); - - it('adds classes for task tags', async () => { - await testComponentClasses('- [ ] Task with #tag1 #tag2/subtag', {}, LayoutClasses.description, [ - 'task-tag-tag1', - 'task-tag-tag2-subtag', - ]); - }); - - it('correctly sanitizes tag names to be legal CSS classes', async () => { - await testComponentClasses('- [ ] Task with #$ #_tag/אבג/x #__other/tag', {}, LayoutClasses.description, [ - 'task-tag-tag-----x', - 'task-tag-other-tag', - ]); + await testComponentClasses('- [ ] Full task ⏫ 📅 2023-02-29', {}, LayoutClasses.dueDate, {}); }); - // TODO TEMP add documentation it('does not render hidden components but sets their specific classes to the upper li element', async () => { await testHiddenComponentClasses( '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', { hidePriority: true }, LayoutClasses.priority, - 'task-priority-high', + { taskPriority: 'high' }, ); await testHiddenComponentClasses( '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', { hideDueDate: true }, LayoutClasses.dueDate, - 'task-due-past-far', + { taskDue: 'past-far' }, ); await testHiddenComponentClasses( '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', { hideScheduledDate: true }, LayoutClasses.scheduledDate, - 'task-scheduled-past-far', + { taskScheduled: 'past-far' }, ); await testHiddenComponentClasses( '- [ ] Full task ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', { hideStartDate: true }, LayoutClasses.startDate, - 'task-start-past-far', + { taskStart: 'past-far' }, ); }); - // TODO TEMP add to documentation + // Unlike the default renderer in createMockParentAndRender, this one accepts a raw HTML rather + // than a text, used for the following tests + const mockInnerHtmlRenderer = async (text: string, element: HTMLSpanElement, _path: string) => { + element.innerHTML = text; + }; + /* * In this test we try to imitate Obsidian's Markdown renderer more thoroughly than other tests, * so we can verify that the rendering code adds the correct tag classes inside the rendered @@ -433,25 +435,35 @@ describe('task line rendering', () => { * Note that this test, just like the code that it tests, assumed a specific rendered structure * by Obsidian, which is not guaranteed by the API. */ - it('adds tag specific classes inside the description span', async () => { + it('adds tag attributes inside the description span', async () => { const taskLine = '- [ ] Class with #someTag'; const task = fromLine({ line: taskLine, }); - - // Unlike the default renderer in createMockParentAndRender, this one accepts a raw HTML rather - // than a text - const mockInnerHtmlRenderer = async (text: string, element: HTMLSpanElement, _path: string) => { - element.innerHTML = text; - }; const parentRender = await createMockParentAndRender(task, new LayoutOptions(), mockInnerHtmlRenderer); const textSpan = getTextSpan(parentRender); const descriptionSpan = textSpan.children[0].children[0] as HTMLElement; expect(descriptionSpan.textContent).toEqual('Class with #someTag'); - const tagSpan = descriptionSpan.children[0]; + const tagSpan = descriptionSpan.children[0] as HTMLSpanElement; expect(tagSpan.textContent).toEqual('#someTag'); expect(tagSpan.classList[0]).toEqual('tag'); - expect(tagSpan.classList[1]).toEqual('task-tag-someTag'); + expect(tagSpan.dataset.tagName).toEqual('#someTag'); + }); + + it('sanitizes tag names when put into data attributes', async () => { + const taskLine = '- [ ] Class with #illegal"data&attribute'; + const task = fromLine({ + line: taskLine, + }); + const parentRender = await createMockParentAndRender(task, new LayoutOptions(), mockInnerHtmlRenderer); + + const textSpan = getTextSpan(parentRender); + const descriptionSpan = textSpan.children[0].children[0] as HTMLElement; + expect(descriptionSpan.textContent).toEqual('Class with #illegal"data&attribute'); + const tagSpan = descriptionSpan.children[0] as HTMLSpanElement; + expect(tagSpan.textContent).toEqual('#illegal"data&attribute'); + expect(tagSpan.classList[0]).toEqual('tag'); + expect(tagSpan.dataset.tagName).toEqual('#illegal-data-attribute'); }); }); From c266cb110ab301e3fb287e3235eda03030881502 Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Sun, 19 Mar 2023 20:54:38 +0000 Subject: [PATCH 14/29] fix: Revert changes that were inconsistent with package.json versions It may be that c2efb51c7e4263e600ac3431e8ac7aec80e76e89 was created with node_modules/ content that didn't match the current package.json, most likely matching what was already on main. --- src/Commands/CreateOrEdit.ts | 5 ++--- src/Commands/ToggleDone.ts | 5 ++--- src/Commands/index.ts | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/Commands/CreateOrEdit.ts b/src/Commands/CreateOrEdit.ts index d9cc30f486..ab35c51af3 100644 --- a/src/Commands/CreateOrEdit.ts +++ b/src/Commands/CreateOrEdit.ts @@ -1,11 +1,10 @@ -import { App, Editor, MarkdownView } from 'obsidian'; -import type { MarkdownFileInfo } from 'obsidian'; +import { App, Editor, MarkdownView, View } from 'obsidian'; import { TaskModal } from '../TaskModal'; import type { Task } from '../Task'; import { DateFallback } from '../DateFallback'; import { taskFromLine } from './CreateOrEditTaskParser'; -export const createOrEdit = (checking: boolean, editor: Editor, view: MarkdownView | MarkdownFileInfo, app: App) => { +export const createOrEdit = (checking: boolean, editor: Editor, view: View, app: App) => { if (checking) { return view instanceof MarkdownView; } diff --git a/src/Commands/ToggleDone.ts b/src/Commands/ToggleDone.ts index 96c2c802fe..bb76df30b1 100644 --- a/src/Commands/ToggleDone.ts +++ b/src/Commands/ToggleDone.ts @@ -1,10 +1,9 @@ -import { Editor, MarkdownView } from 'obsidian'; -import type { MarkdownFileInfo } from 'obsidian'; +import { Editor, MarkdownView, View } from 'obsidian'; import { StatusRegistry } from '../StatusRegistry'; import { Task, TaskRegularExpressions } from '../Task'; -export const toggleDone = (checking: boolean, editor: Editor, view: MarkdownView | MarkdownFileInfo) => { +export const toggleDone = (checking: boolean, editor: Editor, view: View) => { if (checking) { if (!(view instanceof MarkdownView)) { // If we are not in a markdown view, the command shouldn't be shown. diff --git a/src/Commands/index.ts b/src/Commands/index.ts index 20a9dd2c50..b235ba1120 100644 --- a/src/Commands/index.ts +++ b/src/Commands/index.ts @@ -1,4 +1,4 @@ -import type { App, Editor, MarkdownFileInfo, MarkdownView, Plugin } from 'obsidian'; +import type { App, Editor, Plugin, View } from 'obsidian'; import { createOrEdit } from './CreateOrEdit'; import { toggleDone } from './ToggleDone'; @@ -17,7 +17,7 @@ export class Commands { id: 'edit-task', name: 'Create or edit task', icon: 'pencil', - editorCheckCallback: (checking: boolean, editor: Editor, view: MarkdownView | MarkdownFileInfo) => { + editorCheckCallback: (checking: boolean, editor: Editor, view: View) => { return createOrEdit(checking, editor, view, this.app); }, }); From ef23dc22186b9fc800d23f83a5b3bdd572c81109 Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Sun, 19 Mar 2023 21:04:26 +0000 Subject: [PATCH 15/29] fix: Revert main.js added in c2efb51c7e4263e600ac3431e8ac7aec80e76e89. This is causing a conflict in the merge with main. --- .../plugins/obsidian-tasks-plugin/main.js | 19548 +--------------- 1 file changed, 48 insertions(+), 19500 deletions(-) diff --git a/resources/sample_vaults/Tasks-Demo/.obsidian/plugins/obsidian-tasks-plugin/main.js b/resources/sample_vaults/Tasks-Demo/.obsidian/plugins/obsidian-tasks-plugin/main.js index e3f6edf627..6da4a77022 100644 --- a/resources/sample_vaults/Tasks-Demo/.obsidian/plugins/obsidian-tasks-plugin/main.js +++ b/resources/sample_vaults/Tasks-Demo/.obsidian/plugins/obsidian-tasks-plugin/main.js @@ -122,14563 +122,25 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); -var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -var __async = (__this, __arguments, generator) => { - return new Promise((resolve, reject) => { - var fulfilled = (value) => { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - }; - var rejected = (value) => { - try { - step(generator.throw(value)); - } catch (e) { - reject(e); - } - }; - var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); - step((generator = generator.apply(__this, __arguments)).next()); - }); -}; - -// node_modules/tslib/tslib.js -var require_tslib = __commonJS({ - "node_modules/tslib/tslib.js"(exports, module2) { - var __extends2; - var __assign2; - var __rest2; - var __decorate2; - var __param2; - var __metadata2; - var __awaiter2; - var __generator2; - var __exportStar2; - var __values2; - var __read2; - var __spread2; - var __spreadArrays2; - var __spreadArray2; - var __await2; - var __asyncGenerator2; - var __asyncDelegator2; - var __asyncValues2; - var __makeTemplateObject2; - var __importStar2; - var __importDefault2; - var __classPrivateFieldGet2; - var __classPrivateFieldSet2; - var __classPrivateFieldIn2; - var __createBinding2; - (function(factory) { - var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {}; - if (typeof define === "function" && define.amd) { - define("tslib", ["exports"], function(exports2) { - factory(createExporter(root, createExporter(exports2))); - }); - } else if (typeof module2 === "object" && typeof module2.exports === "object") { - factory(createExporter(root, createExporter(module2.exports))); - } else { - factory(createExporter(root)); - } - function createExporter(exports2, previous) { - if (exports2 !== root) { - if (typeof Object.create === "function") { - Object.defineProperty(exports2, "__esModule", { value: true }); - } else { - exports2.__esModule = true; - } - } - return function(id, v) { - return exports2[id] = previous ? previous(id, v) : v; - }; - } - })(function(exporter) { - var 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]; - }; - __extends2 = function(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { - this.constructor = d; - } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - __assign2 = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - __rest2 = function(s, e) { - var t = {}; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; - }; - __decorate2 = function(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") - r = Reflect.decorate(decorators, target, key, desc); - else - for (var i = decorators.length - 1; i >= 0; i--) - if (d = decorators[i]) - r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - __param2 = function(paramIndex, decorator) { - return function(target, key) { - decorator(target, key, paramIndex); - }; - }; - __metadata2 = function(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") - return Reflect.metadata(metadataKey, metadataValue); - }; - __awaiter2 = 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()); - }); - }; - __generator2 = function(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 }; - } - }; - __exportStar2 = function(m, o) { - for (var p in m) - if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) - __createBinding2(o, m, p); - }; - __createBinding2 = Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - o[k2] = m[k]; - }; - __values2 = function(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) - return m.call(o); - if (o && typeof o.length === "number") - return { - next: function() { - if (o && i >= o.length) - o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); - }; - __read2 = function(o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) - return o; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) - ar.push(r.value); - } catch (error) { - e = { error }; - } finally { - try { - if (r && !r.done && (m = i["return"])) - m.call(i); - } finally { - if (e) - throw e.error; - } - } - return ar; - }; - __spread2 = function() { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read2(arguments[i])); - return ar; - }; - __spreadArrays2 = function() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - }; - __spreadArray2 = function(to, from, pack) { - if (pack || arguments.length === 2) - for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) - ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } - } - return to.concat(ar || Array.prototype.slice.call(from)); - }; - __await2 = function(v) { - return this instanceof __await2 ? (this.v = v, this) : new __await2(v); - }; - __asyncGenerator2 = function(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { - return this; - }, i; - function verb(n) { - if (g[n]) - i[n] = function(v) { - return new Promise(function(a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await2 ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); - } - function fulfill(value) { - resume("next", value); - } - function reject(value) { - resume("throw", value); - } - function settle(f, v) { - if (f(v), q.shift(), q.length) - resume(q[0][0], q[0][1]); - } - }; - __asyncDelegator2 = function(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function(e) { - throw e; - }), verb("return"), i[Symbol.iterator] = function() { - return this; - }, i; - function verb(n, f) { - i[n] = o[n] ? function(v) { - return (p = !p) ? { value: __await2(o[n](v)), done: n === "return" } : f ? f(v) : v; - } : f; - } - }; - __asyncValues2 = function(o) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values2 === "function" ? __values2(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function(v) { - return new Promise(function(resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function(v2) { - resolve({ value: v2, done: d }); - }, reject); - } - }; - __makeTemplateObject2 = function(cooked, raw) { - if (Object.defineProperty) { - Object.defineProperty(cooked, "raw", { value: raw }); - } else { - cooked.raw = raw; - } - return cooked; - }; - var __setModuleDefault = Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }; - __importStar2 = function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding2(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - __importDefault2 = function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - __classPrivateFieldGet2 = function(receiver, state, kind, f) { - if (kind === "a" && !f) - throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) - throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); - }; - __classPrivateFieldSet2 = function(receiver, state, value, kind, f) { - if (kind === "m") - throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) - throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) - throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; - }; - __classPrivateFieldIn2 = function(state, receiver) { - if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") - throw new TypeError("Cannot use 'in' operator on non-object"); - return typeof state === "function" ? receiver === state : state.has(receiver); - }; - exporter("__extends", __extends2); - exporter("__assign", __assign2); - exporter("__rest", __rest2); - exporter("__decorate", __decorate2); - exporter("__param", __param2); - exporter("__metadata", __metadata2); - exporter("__awaiter", __awaiter2); - exporter("__generator", __generator2); - exporter("__exportStar", __exportStar2); - exporter("__createBinding", __createBinding2); - exporter("__values", __values2); - exporter("__read", __read2); - exporter("__spread", __spread2); - exporter("__spreadArrays", __spreadArrays2); - exporter("__spreadArray", __spreadArray2); - exporter("__await", __await2); - exporter("__asyncGenerator", __asyncGenerator2); - exporter("__asyncDelegator", __asyncDelegator2); - exporter("__asyncValues", __asyncValues2); - exporter("__makeTemplateObject", __makeTemplateObject2); - exporter("__importStar", __importStar2); - exporter("__importDefault", __importDefault2); - exporter("__classPrivateFieldGet", __classPrivateFieldGet2); - exporter("__classPrivateFieldSet", __classPrivateFieldSet2); - exporter("__classPrivateFieldIn", __classPrivateFieldIn2); - }); - } -}); - -// node_modules/chrono-node/dist/utils/pattern.js -var require_pattern = __commonJS({ - "node_modules/chrono-node/dist/utils/pattern.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.matchAnyPattern = exports.extractTerms = exports.repeatedTimeunitPattern = void 0; - function repeatedTimeunitPattern(prefix, singleTimeunitPattern) { - const singleTimeunitPatternNoCapture = singleTimeunitPattern.replace(/\((?!\?)/g, "(?:"); - return `${prefix}${singleTimeunitPatternNoCapture}\\s{0,5}(?:,?\\s{0,5}${singleTimeunitPatternNoCapture}){0,10}`; - } - exports.repeatedTimeunitPattern = repeatedTimeunitPattern; - function extractTerms(dictionary) { - let keys; - if (dictionary instanceof Array) { - keys = [...dictionary]; - } else if (dictionary instanceof Map) { - keys = Array.from(dictionary.keys()); - } else { - keys = Object.keys(dictionary); - } - return keys; - } - exports.extractTerms = extractTerms; - function matchAnyPattern(dictionary) { - const joinedTerms = extractTerms(dictionary).sort((a, b) => b.length - a.length).join("|").replace(/\./g, "\\."); - return `(?:${joinedTerms})`; - } - exports.matchAnyPattern = matchAnyPattern; - } -}); - -// node_modules/dayjs/dayjs.min.js -var require_dayjs_min = __commonJS({ - "node_modules/dayjs/dayjs.min.js"(exports, module2) { - !function(t, e) { - "object" == typeof exports && "undefined" != typeof module2 ? module2.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).dayjs = e(); - }(exports, function() { - "use strict"; - var t = 1e3, e = 6e4, n = 36e5, r = "millisecond", i = "second", s = "minute", u = "hour", a = "day", o = "week", f = "month", h = "quarter", c = "year", d = "date", $ = "Invalid Date", l = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_") }, m = function(t2, e2, n2) { - var r2 = String(t2); - return !r2 || r2.length >= e2 ? t2 : "" + Array(e2 + 1 - r2.length).join(n2) + t2; - }, g = { s: m, z: function(t2) { - var e2 = -t2.utcOffset(), n2 = Math.abs(e2), r2 = Math.floor(n2 / 60), i2 = n2 % 60; - return (e2 <= 0 ? "+" : "-") + m(r2, 2, "0") + ":" + m(i2, 2, "0"); - }, m: function t2(e2, n2) { - if (e2.date() < n2.date()) - return -t2(n2, e2); - var r2 = 12 * (n2.year() - e2.year()) + (n2.month() - e2.month()), i2 = e2.clone().add(r2, f), s2 = n2 - i2 < 0, u2 = e2.clone().add(r2 + (s2 ? -1 : 1), f); - return +(-(r2 + (n2 - i2) / (s2 ? i2 - u2 : u2 - i2)) || 0); - }, a: function(t2) { - return t2 < 0 ? Math.ceil(t2) || 0 : Math.floor(t2); - }, p: function(t2) { - return { M: f, y: c, w: o, d: a, D: d, h: u, m: s, s: i, ms: r, Q: h }[t2] || String(t2 || "").toLowerCase().replace(/s$/, ""); - }, u: function(t2) { - return void 0 === t2; - } }, D = "en", v = {}; - v[D] = M; - var p = function(t2) { - return t2 instanceof _; - }, S = function(t2, e2, n2) { - var r2; - if (!t2) - return D; - if ("string" == typeof t2) - v[t2] && (r2 = t2), e2 && (v[t2] = e2, r2 = t2); - else { - var i2 = t2.name; - v[i2] = t2, r2 = i2; - } - return !n2 && r2 && (D = r2), r2 || !n2 && D; - }, w = function(t2, e2) { - if (p(t2)) - return t2.clone(); - var n2 = "object" == typeof e2 ? e2 : {}; - return n2.date = t2, n2.args = arguments, new _(n2); - }, O = g; - O.l = S, O.i = p, O.w = function(t2, e2) { - return w(t2, { locale: e2.$L, utc: e2.$u, x: e2.$x, $offset: e2.$offset }); - }; - var _ = function() { - function M2(t2) { - this.$L = S(t2.locale, null, true), this.parse(t2); - } - var m2 = M2.prototype; - return m2.parse = function(t2) { - this.$d = function(t3) { - var e2 = t3.date, n2 = t3.utc; - if (null === e2) - return new Date(NaN); - if (O.u(e2)) - return new Date(); - if (e2 instanceof Date) - return new Date(e2); - if ("string" == typeof e2 && !/Z$/i.test(e2)) { - var r2 = e2.match(l); - if (r2) { - var i2 = r2[2] - 1 || 0, s2 = (r2[7] || "0").substring(0, 3); - return n2 ? new Date(Date.UTC(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2)) : new Date(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2); - } - } - return new Date(e2); - }(t2), this.$x = t2.x || {}, this.init(); - }, m2.init = function() { - var t2 = this.$d; - this.$y = t2.getFullYear(), this.$M = t2.getMonth(), this.$D = t2.getDate(), this.$W = t2.getDay(), this.$H = t2.getHours(), this.$m = t2.getMinutes(), this.$s = t2.getSeconds(), this.$ms = t2.getMilliseconds(); - }, m2.$utils = function() { - return O; - }, m2.isValid = function() { - return !(this.$d.toString() === $); - }, m2.isSame = function(t2, e2) { - var n2 = w(t2); - return this.startOf(e2) <= n2 && n2 <= this.endOf(e2); - }, m2.isAfter = function(t2, e2) { - return w(t2) < this.startOf(e2); - }, m2.isBefore = function(t2, e2) { - return this.endOf(e2) < w(t2); - }, m2.$g = function(t2, e2, n2) { - return O.u(t2) ? this[e2] : this.set(n2, t2); - }, m2.unix = function() { - return Math.floor(this.valueOf() / 1e3); - }, m2.valueOf = function() { - return this.$d.getTime(); - }, m2.startOf = function(t2, e2) { - var n2 = this, r2 = !!O.u(e2) || e2, h2 = O.p(t2), $2 = function(t3, e3) { - var i2 = O.w(n2.$u ? Date.UTC(n2.$y, e3, t3) : new Date(n2.$y, e3, t3), n2); - return r2 ? i2 : i2.endOf(a); - }, l2 = function(t3, e3) { - return O.w(n2.toDate()[t3].apply(n2.toDate("s"), (r2 ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e3)), n2); - }, y2 = this.$W, M3 = this.$M, m3 = this.$D, g2 = "set" + (this.$u ? "UTC" : ""); - switch (h2) { - case c: - return r2 ? $2(1, 0) : $2(31, 11); - case f: - return r2 ? $2(1, M3) : $2(0, M3 + 1); - case o: - var D2 = this.$locale().weekStart || 0, v2 = (y2 < D2 ? y2 + 7 : y2) - D2; - return $2(r2 ? m3 - v2 : m3 + (6 - v2), M3); - case a: - case d: - return l2(g2 + "Hours", 0); - case u: - return l2(g2 + "Minutes", 1); - case s: - return l2(g2 + "Seconds", 2); - case i: - return l2(g2 + "Milliseconds", 3); - default: - return this.clone(); - } - }, m2.endOf = function(t2) { - return this.startOf(t2, false); - }, m2.$set = function(t2, e2) { - var n2, o2 = O.p(t2), h2 = "set" + (this.$u ? "UTC" : ""), $2 = (n2 = {}, n2[a] = h2 + "Date", n2[d] = h2 + "Date", n2[f] = h2 + "Month", n2[c] = h2 + "FullYear", n2[u] = h2 + "Hours", n2[s] = h2 + "Minutes", n2[i] = h2 + "Seconds", n2[r] = h2 + "Milliseconds", n2)[o2], l2 = o2 === a ? this.$D + (e2 - this.$W) : e2; - if (o2 === f || o2 === c) { - var y2 = this.clone().set(d, 1); - y2.$d[$2](l2), y2.init(), this.$d = y2.set(d, Math.min(this.$D, y2.daysInMonth())).$d; - } else - $2 && this.$d[$2](l2); - return this.init(), this; - }, m2.set = function(t2, e2) { - return this.clone().$set(t2, e2); - }, m2.get = function(t2) { - return this[O.p(t2)](); - }, m2.add = function(r2, h2) { - var d2, $2 = this; - r2 = Number(r2); - var l2 = O.p(h2), y2 = function(t2) { - var e2 = w($2); - return O.w(e2.date(e2.date() + Math.round(t2 * r2)), $2); - }; - if (l2 === f) - return this.set(f, this.$M + r2); - if (l2 === c) - return this.set(c, this.$y + r2); - if (l2 === a) - return y2(1); - if (l2 === o) - return y2(7); - var M3 = (d2 = {}, d2[s] = e, d2[u] = n, d2[i] = t, d2)[l2] || 1, m3 = this.$d.getTime() + r2 * M3; - return O.w(m3, this); - }, m2.subtract = function(t2, e2) { - return this.add(-1 * t2, e2); - }, m2.format = function(t2) { - var e2 = this, n2 = this.$locale(); - if (!this.isValid()) - return n2.invalidDate || $; - var r2 = t2 || "YYYY-MM-DDTHH:mm:ssZ", i2 = O.z(this), s2 = this.$H, u2 = this.$m, a2 = this.$M, o2 = n2.weekdays, f2 = n2.months, h2 = function(t3, n3, i3, s3) { - return t3 && (t3[n3] || t3(e2, r2)) || i3[n3].substr(0, s3); - }, c2 = function(t3) { - return O.s(s2 % 12 || 12, t3, "0"); - }, d2 = n2.meridiem || function(t3, e3, n3) { - var r3 = t3 < 12 ? "AM" : "PM"; - return n3 ? r3.toLowerCase() : r3; - }, l2 = { YY: String(this.$y).slice(-2), YYYY: this.$y, M: a2 + 1, MM: O.s(a2 + 1, 2, "0"), MMM: h2(n2.monthsShort, a2, f2, 3), MMMM: h2(f2, a2), D: this.$D, DD: O.s(this.$D, 2, "0"), d: String(this.$W), dd: h2(n2.weekdaysMin, this.$W, o2, 2), ddd: h2(n2.weekdaysShort, this.$W, o2, 3), dddd: o2[this.$W], H: String(s2), HH: O.s(s2, 2, "0"), h: c2(1), hh: c2(2), a: d2(s2, u2, true), A: d2(s2, u2, false), m: String(u2), mm: O.s(u2, 2, "0"), s: String(this.$s), ss: O.s(this.$s, 2, "0"), SSS: O.s(this.$ms, 3, "0"), Z: i2 }; - return r2.replace(y, function(t3, e3) { - return e3 || l2[t3] || i2.replace(":", ""); - }); - }, m2.utcOffset = function() { - return 15 * -Math.round(this.$d.getTimezoneOffset() / 15); - }, m2.diff = function(r2, d2, $2) { - var l2, y2 = O.p(d2), M3 = w(r2), m3 = (M3.utcOffset() - this.utcOffset()) * e, g2 = this - M3, D2 = O.m(this, M3); - return D2 = (l2 = {}, l2[c] = D2 / 12, l2[f] = D2, l2[h] = D2 / 3, l2[o] = (g2 - m3) / 6048e5, l2[a] = (g2 - m3) / 864e5, l2[u] = g2 / n, l2[s] = g2 / e, l2[i] = g2 / t, l2)[y2] || g2, $2 ? D2 : O.a(D2); - }, m2.daysInMonth = function() { - return this.endOf(f).$D; - }, m2.$locale = function() { - return v[this.$L]; - }, m2.locale = function(t2, e2) { - if (!t2) - return this.$L; - var n2 = this.clone(), r2 = S(t2, e2, true); - return r2 && (n2.$L = r2), n2; - }, m2.clone = function() { - return O.w(this.$d, this); - }, m2.toDate = function() { - return new Date(this.valueOf()); - }, m2.toJSON = function() { - return this.isValid() ? this.toISOString() : null; - }, m2.toISOString = function() { - return this.$d.toISOString(); - }, m2.toString = function() { - return this.$d.toUTCString(); - }, M2; - }(), b = _.prototype; - return w.prototype = b, [["$ms", r], ["$s", i], ["$m", s], ["$H", u], ["$W", a], ["$M", f], ["$y", c], ["$D", d]].forEach(function(t2) { - b[t2[1]] = function(e2) { - return this.$g(e2, t2[0], t2[1]); - }; - }), w.extend = function(t2, e2) { - return t2.$i || (t2(e2, _, w), t2.$i = true), w; - }, w.locale = S, w.isDayjs = p, w.unix = function(t2) { - return w(1e3 * t2); - }, w.en = v[D], w.Ls = v, w.p = {}, w; - }); - } -}); - -// node_modules/chrono-node/dist/calculation/years.js -var require_years = __commonJS({ - "node_modules/chrono-node/dist/calculation/years.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.findYearClosestToRef = exports.findMostLikelyADYear = void 0; - var dayjs_1 = __importDefault2(require_dayjs_min()); - function findMostLikelyADYear(yearNumber) { - if (yearNumber < 100) { - if (yearNumber > 50) { - yearNumber = yearNumber + 1900; - } else { - yearNumber = yearNumber + 2e3; - } - } - return yearNumber; - } - exports.findMostLikelyADYear = findMostLikelyADYear; - function findYearClosestToRef(refDate, day, month) { - const refMoment = dayjs_1.default(refDate); - let dateMoment = refMoment; - dateMoment = dateMoment.month(month - 1); - dateMoment = dateMoment.date(day); - dateMoment = dateMoment.year(refMoment.year()); - const nextYear = dateMoment.add(1, "y"); - const lastYear = dateMoment.add(-1, "y"); - if (Math.abs(nextYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) { - dateMoment = nextYear; - } else if (Math.abs(lastYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) { - dateMoment = lastYear; - } - return dateMoment.year(); - } - exports.findYearClosestToRef = findYearClosestToRef; - } -}); - -// node_modules/chrono-node/dist/locales/en/constants.js -var require_constants = __commonJS({ - "node_modules/chrono-node/dist/locales/en/constants.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.FULL_MONTH_NAME_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; - var pattern_1 = require_pattern(); - var years_1 = require_years(); - exports.WEEKDAY_DICTIONARY = { - sunday: 0, - sun: 0, - "sun.": 0, - monday: 1, - mon: 1, - "mon.": 1, - tuesday: 2, - tue: 2, - "tue.": 2, - wednesday: 3, - wed: 3, - "wed.": 3, - thursday: 4, - thurs: 4, - "thurs.": 4, - thur: 4, - "thur.": 4, - thu: 4, - "thu.": 4, - friday: 5, - fri: 5, - "fri.": 5, - saturday: 6, - sat: 6, - "sat.": 6 - }; - exports.FULL_MONTH_NAME_DICTIONARY = { - january: 1, - february: 2, - march: 3, - april: 4, - may: 5, - june: 6, - july: 7, - august: 8, - september: 9, - october: 10, - november: 11, - december: 12 - }; - exports.MONTH_DICTIONARY = Object.assign(Object.assign({}, exports.FULL_MONTH_NAME_DICTIONARY), { jan: 1, "jan.": 1, feb: 2, "feb.": 2, mar: 3, "mar.": 3, apr: 4, "apr.": 4, jun: 6, "jun.": 6, jul: 7, "jul.": 7, aug: 8, "aug.": 8, sep: 9, "sep.": 9, sept: 9, "sept.": 9, oct: 10, "oct.": 10, nov: 11, "nov.": 11, dec: 12, "dec.": 12 }); - exports.INTEGER_WORD_DICTIONARY = { - one: 1, - two: 2, - three: 3, - four: 4, - five: 5, - six: 6, - seven: 7, - eight: 8, - nine: 9, - ten: 10, - eleven: 11, - twelve: 12 - }; - exports.ORDINAL_WORD_DICTIONARY = { - first: 1, - second: 2, - third: 3, - fourth: 4, - fifth: 5, - sixth: 6, - seventh: 7, - eighth: 8, - ninth: 9, - tenth: 10, - eleventh: 11, - twelfth: 12, - thirteenth: 13, - fourteenth: 14, - fifteenth: 15, - sixteenth: 16, - seventeenth: 17, - eighteenth: 18, - nineteenth: 19, - twentieth: 20, - "twenty first": 21, - "twenty-first": 21, - "twenty second": 22, - "twenty-second": 22, - "twenty third": 23, - "twenty-third": 23, - "twenty fourth": 24, - "twenty-fourth": 24, - "twenty fifth": 25, - "twenty-fifth": 25, - "twenty sixth": 26, - "twenty-sixth": 26, - "twenty seventh": 27, - "twenty-seventh": 27, - "twenty eighth": 28, - "twenty-eighth": 28, - "twenty ninth": 29, - "twenty-ninth": 29, - "thirtieth": 30, - "thirty first": 31, - "thirty-first": 31 - }; - exports.TIME_UNIT_DICTIONARY = { - sec: "second", - second: "second", - seconds: "second", - min: "minute", - mins: "minute", - minute: "minute", - minutes: "minute", - h: "hour", - hr: "hour", - hrs: "hour", - hour: "hour", - hours: "hour", - day: "d", - days: "d", - week: "week", - weeks: "week", - month: "month", - months: "month", - qtr: "quarter", - quarter: "quarter", - quarters: "quarter", - y: "year", - yr: "year", - year: "year", - years: "year" - }; - exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s{0,2}an?)?|an?\\b(?:\\s{0,2}few)?|few|several|a?\\s{0,2}couple\\s{0,2}(?:of)?)`; - function parseNumberPattern(match) { - const num = match.toLowerCase(); - if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { - return exports.INTEGER_WORD_DICTIONARY[num]; - } else if (num === "a" || num === "an") { - return 1; - } else if (num.match(/few/)) { - return 3; - } else if (num.match(/half/)) { - return 0.5; - } else if (num.match(/couple/)) { - return 2; - } else if (num.match(/several/)) { - return 7; - } - return parseFloat(num); - } - exports.parseNumberPattern = parseNumberPattern; - exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:st|nd|rd|th)?)`; - function parseOrdinalNumberPattern(match) { - let num = match.toLowerCase(); - if (exports.ORDINAL_WORD_DICTIONARY[num] !== void 0) { - return exports.ORDINAL_WORD_DICTIONARY[num]; - } - num = num.replace(/(?:st|nd|rd|th)$/i, ""); - return parseInt(num); - } - exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; - exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s{0,2}(?:BE|AD|BC|BCE|CE)|[1-2][0-9]{3}|[5-9][0-9])`; - function parseYear(match) { - if (/BE/i.test(match)) { - match = match.replace(/BE/i, ""); - return parseInt(match) - 543; - } - if (/BCE?/i.test(match)) { - match = match.replace(/BCE?/i, ""); - return -parseInt(match); - } - if (/(AD|CE)/i.test(match)) { - match = match.replace(/(AD|CE)/i, ""); - return parseInt(match); - } - const rawYearNumber = parseInt(match); - return years_1.findMostLikelyADYear(rawYearNumber); - } - exports.parseYear = parseYear; - var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,3}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})`; - var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); - exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:about|around)\\s{0,3})?`, SINGLE_TIME_UNIT_PATTERN); - function parseTimeUnits(timeunitText) { - const fragments = {}; - let remainingText = timeunitText; - let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - while (match) { - collectDateTimeFragment(fragments, match); - remainingText = remainingText.substring(match[0].length).trim(); - match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - } - return fragments; - } - exports.parseTimeUnits = parseTimeUnits; - function collectDateTimeFragment(fragments, match) { - const num = parseNumberPattern(match[1]); - const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; - fragments[unit] = num; - } - } -}); - -// node_modules/dayjs/plugin/quarterOfYear.js -var require_quarterOfYear = __commonJS({ - "node_modules/dayjs/plugin/quarterOfYear.js"(exports, module2) { - !function(t, n) { - "object" == typeof exports && "undefined" != typeof module2 ? module2.exports = n() : "function" == typeof define && define.amd ? define(n) : (t = "undefined" != typeof globalThis ? globalThis : t || self).dayjs_plugin_quarterOfYear = n(); - }(exports, function() { - "use strict"; - var t = "month", n = "quarter"; - return function(e, i) { - var r = i.prototype; - r.quarter = function(t2) { - return this.$utils().u(t2) ? Math.ceil((this.month() + 1) / 3) : this.month(this.month() % 3 + 3 * (t2 - 1)); - }; - var s = r.add; - r.add = function(e2, i2) { - return e2 = Number(e2), this.$utils().p(i2) === n ? this.add(3 * e2, t) : s.bind(this)(e2, i2); - }; - var u = r.startOf; - r.startOf = function(e2, i2) { - var r2 = this.$utils(), s2 = !!r2.u(i2) || i2; - if (r2.p(e2) === n) { - var o = this.quarter() - 1; - return s2 ? this.month(3 * o).startOf(t).startOf("day") : this.month(3 * o + 2).endOf(t).endOf("day"); - } - return u.bind(this)(e2, i2); - }; - }; - }); - } -}); - -// node_modules/chrono-node/dist/utils/dayjs.js -var require_dayjs = __commonJS({ - "node_modules/chrono-node/dist/utils/dayjs.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.implySimilarTime = exports.assignSimilarTime = exports.assignSimilarDate = exports.assignTheNextDay = void 0; - var index_1 = require_dist(); - function assignTheNextDay(component, targetDayJs) { - targetDayJs = targetDayJs.add(1, "day"); - assignSimilarDate(component, targetDayJs); - implySimilarTime(component, targetDayJs); - } - exports.assignTheNextDay = assignTheNextDay; - function assignSimilarDate(component, targetDayJs) { - component.assign("day", targetDayJs.date()); - component.assign("month", targetDayJs.month() + 1); - component.assign("year", targetDayJs.year()); - } - exports.assignSimilarDate = assignSimilarDate; - function assignSimilarTime(component, targetDayJs) { - component.assign("hour", targetDayJs.hour()); - component.assign("minute", targetDayJs.minute()); - component.assign("second", targetDayJs.second()); - component.assign("millisecond", targetDayJs.millisecond()); - if (component.get("hour") < 12) { - component.assign("meridiem", index_1.Meridiem.AM); - } else { - component.assign("meridiem", index_1.Meridiem.PM); - } - } - exports.assignSimilarTime = assignSimilarTime; - function implySimilarTime(component, targetDayJs) { - component.imply("hour", targetDayJs.hour()); - component.imply("minute", targetDayJs.minute()); - component.imply("second", targetDayJs.second()); - component.imply("millisecond", targetDayJs.millisecond()); - } - exports.implySimilarTime = implySimilarTime; - } -}); - -// node_modules/chrono-node/dist/timezone.js -var require_timezone = __commonJS({ - "node_modules/chrono-node/dist/timezone.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.toTimezoneOffset = exports.TIMEZONE_ABBR_MAP = void 0; - exports.TIMEZONE_ABBR_MAP = { - ACDT: 630, - ACST: 570, - ADT: -180, - AEDT: 660, - AEST: 600, - AFT: 270, - AKDT: -480, - AKST: -540, - ALMT: 360, - AMST: -180, - AMT: -240, - ANAST: 720, - ANAT: 720, - AQTT: 300, - ART: -180, - AST: -240, - AWDT: 540, - AWST: 480, - AZOST: 0, - AZOT: -60, - AZST: 300, - AZT: 240, - BNT: 480, - BOT: -240, - BRST: -120, - BRT: -180, - BST: 60, - BTT: 360, - CAST: 480, - CAT: 120, - CCT: 390, - CDT: -300, - CEST: 120, - CET: 60, - CHADT: 825, - CHAST: 765, - CKT: -600, - CLST: -180, - CLT: -240, - COT: -300, - CST: -360, - CVT: -60, - CXT: 420, - ChST: 600, - DAVT: 420, - EASST: -300, - EAST: -360, - EAT: 180, - ECT: -300, - EDT: -240, - EEST: 180, - EET: 120, - EGST: 0, - EGT: -60, - EST: -300, - ET: -300, - FJST: 780, - FJT: 720, - FKST: -180, - FKT: -240, - FNT: -120, - GALT: -360, - GAMT: -540, - GET: 240, - GFT: -180, - GILT: 720, - GMT: 0, - GST: 240, - GYT: -240, - HAA: -180, - HAC: -300, - HADT: -540, - HAE: -240, - HAP: -420, - HAR: -360, - HAST: -600, - HAT: -90, - HAY: -480, - HKT: 480, - HLV: -210, - HNA: -240, - HNC: -360, - HNE: -300, - HNP: -480, - HNR: -420, - HNT: -150, - HNY: -540, - HOVT: 420, - ICT: 420, - IDT: 180, - IOT: 360, - IRDT: 270, - IRKST: 540, - IRKT: 540, - IRST: 210, - IST: 330, - JST: 540, - KGT: 360, - KRAST: 480, - KRAT: 480, - KST: 540, - KUYT: 240, - LHDT: 660, - LHST: 630, - LINT: 840, - MAGST: 720, - MAGT: 720, - MART: -510, - MAWT: 300, - MDT: -360, - MESZ: 120, - MEZ: 60, - MHT: 720, - MMT: 390, - MSD: 240, - MSK: 180, - MST: -420, - MUT: 240, - MVT: 300, - MYT: 480, - NCT: 660, - NDT: -90, - NFT: 690, - NOVST: 420, - NOVT: 360, - NPT: 345, - NST: -150, - NUT: -660, - NZDT: 780, - NZST: 720, - OMSST: 420, - OMST: 420, - PDT: -420, - PET: -300, - PETST: 720, - PETT: 720, - PGT: 600, - PHOT: 780, - PHT: 480, - PKT: 300, - PMDT: -120, - PMST: -180, - PONT: 660, - PST: -480, - PT: -480, - PWT: 540, - PYST: -180, - PYT: -240, - RET: 240, - SAMT: 240, - SAST: 120, - SBT: 660, - SCT: 240, - SGT: 480, - SRT: -180, - SST: -660, - TAHT: -600, - TFT: 300, - TJT: 300, - TKT: 780, - TLT: 540, - TMT: 300, - TVT: 720, - ULAT: 480, - UTC: 0, - UYST: -120, - UYT: -180, - UZT: 300, - VET: -210, - VLAST: 660, - VLAT: 660, - VUT: 660, - WAST: 120, - WAT: 60, - WEST: 60, - WESZ: 60, - WET: 0, - WEZ: 0, - WFT: 720, - WGST: -120, - WGT: -180, - WIB: 420, - WIT: 540, - WITA: 480, - WST: 780, - WT: 0, - YAKST: 600, - YAKT: 600, - YAPT: 600, - YEKST: 360, - YEKT: 360 - }; - function toTimezoneOffset(timezoneInput) { - var _a; - if (timezoneInput === null || timezoneInput === void 0) { - return null; - } - if (typeof timezoneInput === "number") { - return timezoneInput; - } - return (_a = exports.TIMEZONE_ABBR_MAP[timezoneInput]) !== null && _a !== void 0 ? _a : null; - } - exports.toTimezoneOffset = toTimezoneOffset; - } -}); - -// node_modules/chrono-node/dist/results.js -var require_results = __commonJS({ - "node_modules/chrono-node/dist/results.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.ParsingResult = exports.ParsingComponents = exports.ReferenceWithTimezone = void 0; - var quarterOfYear_1 = __importDefault2(require_quarterOfYear()); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var dayjs_2 = require_dayjs(); - var timezone_1 = require_timezone(); - dayjs_1.default.extend(quarterOfYear_1.default); - var ReferenceWithTimezone = class { - constructor(input) { - var _a; - input = input !== null && input !== void 0 ? input : new Date(); - if (input instanceof Date) { - this.instant = input; - } else { - this.instant = (_a = input.instant) !== null && _a !== void 0 ? _a : new Date(); - this.timezoneOffset = timezone_1.toTimezoneOffset(input.timezone); - } - } - }; - exports.ReferenceWithTimezone = ReferenceWithTimezone; - var ParsingComponents = class { - constructor(reference, knownComponents) { - this.reference = reference; - this.knownValues = {}; - this.impliedValues = {}; - if (knownComponents) { - for (const key in knownComponents) { - this.knownValues[key] = knownComponents[key]; - } - } - const refDayJs = dayjs_1.default(reference.instant); - this.imply("day", refDayJs.date()); - this.imply("month", refDayJs.month() + 1); - this.imply("year", refDayJs.year()); - this.imply("hour", 12); - this.imply("minute", 0); - this.imply("second", 0); - this.imply("millisecond", 0); - } - get(component) { - if (component in this.knownValues) { - return this.knownValues[component]; - } - if (component in this.impliedValues) { - return this.impliedValues[component]; - } - return null; - } - isCertain(component) { - return component in this.knownValues; - } - getCertainComponents() { - return Object.keys(this.knownValues); - } - imply(component, value) { - if (component in this.knownValues) { - return this; - } - this.impliedValues[component] = value; - return this; - } - assign(component, value) { - this.knownValues[component] = value; - delete this.impliedValues[component]; - return this; - } - delete(component) { - delete this.knownValues[component]; - delete this.impliedValues[component]; - } - clone() { - const component = new ParsingComponents(this.reference); - component.knownValues = {}; - component.impliedValues = {}; - for (const key in this.knownValues) { - component.knownValues[key] = this.knownValues[key]; - } - for (const key in this.impliedValues) { - component.impliedValues[key] = this.impliedValues[key]; - } - return component; - } - isOnlyDate() { - return !this.isCertain("hour") && !this.isCertain("minute") && !this.isCertain("second"); - } - isOnlyTime() { - return !this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month"); - } - isOnlyWeekdayComponent() { - return this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month"); - } - isOnlyDayMonthComponent() { - return this.isCertain("day") && this.isCertain("month") && !this.isCertain("year"); - } - isValidDate() { - const date = this.dateWithoutTimezoneAdjustment(); - if (date.getFullYear() !== this.get("year")) - return false; - if (date.getMonth() !== this.get("month") - 1) - return false; - if (date.getDate() !== this.get("day")) - return false; - if (this.get("hour") != null && date.getHours() != this.get("hour")) - return false; - if (this.get("minute") != null && date.getMinutes() != this.get("minute")) - return false; - return true; - } - toString() { - return `[ParsingComponents {knownValues: ${JSON.stringify(this.knownValues)}, impliedValues: ${JSON.stringify(this.impliedValues)}}, reference: ${JSON.stringify(this.reference)}]`; - } - dayjs() { - return dayjs_1.default(this.date()); - } - date() { - const date = this.dateWithoutTimezoneAdjustment(); - return new Date(date.getTime() + this.getSystemTimezoneAdjustmentMinute(date) * 6e4); - } - dateWithoutTimezoneAdjustment() { - const date = new Date(this.get("year"), this.get("month") - 1, this.get("day"), this.get("hour"), this.get("minute"), this.get("second"), this.get("millisecond")); - date.setFullYear(this.get("year")); - return date; - } - getSystemTimezoneAdjustmentMinute(date) { - var _a, _b; - if (!date || date.getTime() < 0) { - date = new Date(); - } - const currentTimezoneOffset = -date.getTimezoneOffset(); - const targetTimezoneOffset = (_b = (_a = this.get("timezoneOffset")) !== null && _a !== void 0 ? _a : this.reference.timezoneOffset) !== null && _b !== void 0 ? _b : currentTimezoneOffset; - return currentTimezoneOffset - targetTimezoneOffset; - } - static createRelativeFromReference(reference, fragments) { - let date = dayjs_1.default(reference.instant); - for (const key in fragments) { - date = date.add(fragments[key], key); - } - const components = new ParsingComponents(reference); - if (fragments["hour"] || fragments["minute"] || fragments["second"]) { - dayjs_2.assignSimilarTime(components, date); - dayjs_2.assignSimilarDate(components, date); - if (reference.timezoneOffset !== null) { - components.assign("timezoneOffset", -reference.instant.getTimezoneOffset()); - } - } else { - dayjs_2.implySimilarTime(components, date); - if (reference.timezoneOffset !== null) { - components.imply("timezoneOffset", -reference.instant.getTimezoneOffset()); - } - if (fragments["d"]) { - components.assign("day", date.date()); - components.assign("month", date.month() + 1); - components.assign("year", date.year()); - } else { - if (fragments["week"]) { - components.imply("weekday", date.day()); - } - components.imply("day", date.date()); - if (fragments["month"]) { - components.assign("month", date.month() + 1); - components.assign("year", date.year()); - } else { - components.imply("month", date.month() + 1); - if (fragments["year"]) { - components.assign("year", date.year()); - } else { - components.imply("year", date.year()); - } - } - } - } - return components; - } - }; - exports.ParsingComponents = ParsingComponents; - var ParsingResult = class { - constructor(reference, index, text2, start, end) { - this.reference = reference; - this.refDate = reference.instant; - this.index = index; - this.text = text2; - this.start = start || new ParsingComponents(reference); - this.end = end; - } - clone() { - const result = new ParsingResult(this.reference, this.index, this.text); - result.start = this.start ? this.start.clone() : null; - result.end = this.end ? this.end.clone() : null; - return result; - } - date() { - return this.start.date(); - } - toString() { - return `[ParsingResult {index: ${this.index}, text: '${this.text}', ...}]`; - } - }; - exports.ParsingResult = ParsingResult; - } -}); - -// node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js -var require_AbstractParserWithWordBoundary = __commonJS({ - "node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.AbstractParserWithWordBoundaryChecking = void 0; - var AbstractParserWithWordBoundaryChecking = class { - constructor() { - this.cachedInnerPattern = null; - this.cachedPattern = null; - } - patternLeftBoundary() { - return `(\\W|^)`; - } - pattern(context) { - const innerPattern = this.innerPattern(context); - if (innerPattern == this.cachedInnerPattern) { - return this.cachedPattern; - } - this.cachedPattern = new RegExp(`${this.patternLeftBoundary()}${innerPattern.source}`, innerPattern.flags); - this.cachedInnerPattern = innerPattern; - return this.cachedPattern; - } - extract(context, match) { - var _a; - const header = (_a = match[1]) !== null && _a !== void 0 ? _a : ""; - match.index = match.index + header.length; - match[0] = match[0].substring(header.length); - for (let i = 2; i < match.length; i++) { - match[i - 1] = match[i]; - } - return this.innerExtract(context, match); - } - }; - exports.AbstractParserWithWordBoundaryChecking = AbstractParserWithWordBoundaryChecking; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js -var require_ENTimeUnitWithinFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN_WITH_PREFIX = new RegExp(`(?:within|in|for)\\s*(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); - var PATTERN_WITHOUT_PREFIX = new RegExp(`(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); - var ENTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return context.option.forwardDate ? PATTERN_WITHOUT_PREFIX : PATTERN_WITH_PREFIX; - } - innerExtract(context, match) { - const timeUnits = constants_1.parseTimeUnits(match[1]); - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - }; - exports.default = ENTimeUnitWithinFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js -var require_ENMonthNameLittleEndianParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var years_1 = require_years(); - var constants_1 = require_constants(); - var constants_2 = require_constants(); - var constants_3 = require_constants(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`(?:on\\s{0,3})?(${constants_3.ORDINAL_NUMBER_PATTERN})(?:\\s{0,3}(?:to|\\-|\\\u2013|until|through|till)?\\s{0,3}(${constants_3.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s{0,3}(?:of)?\\s{0,3})(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s{0,3})(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); - var DATE_GROUP = 1; - var DATE_TO_GROUP = 2; - var MONTH_NAME_GROUP = 3; - var YEAR_GROUP = 4; - var ENMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); - if (day > 31) { - match.index = match.index + match[DATE_GROUP].length; - return null; - } - result.start.assign("month", month); - result.start.assign("day", day); - if (match[YEAR_GROUP]) { - const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); - result.start.assign("year", yearNumber); - } else { - const year = years_1.findYearClosestToRef(context.refDate, day, month); - result.start.imply("year", year); - } - if (match[DATE_TO_GROUP]) { - const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); - result.end = result.start.clone(); - result.end.assign("day", endDate); - } - return result; - } - }; - exports.default = ENMonthNameLittleEndianParser; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js -var require_ENMonthNameMiddleEndianParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var years_1 = require_years(); - var constants_1 = require_constants(); - var constants_2 = require_constants(); - var constants_3 = require_constants(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:-|/|\\s*,?\\s*)(${constants_2.ORDINAL_NUMBER_PATTERN})(?!\\s*(?:am|pm))\\s*(?:(?:to|\\-)\\s*(${constants_2.ORDINAL_NUMBER_PATTERN})\\s*)?(?:(?:-|/|\\s*,?\\s*)(${constants_3.YEAR_PATTERN}))?(?=\\W|$)(?!\\:\\d)`, "i"); - var MONTH_NAME_GROUP = 1; - var DATE_GROUP = 2; - var DATE_TO_GROUP = 3; - var YEAR_GROUP = 4; - var ENMonthNameMiddleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]); - if (day > 31) { - return null; - } - const components = context.createParsingComponents({ - day, - month - }); - if (match[YEAR_GROUP]) { - const year = constants_3.parseYear(match[YEAR_GROUP]); - components.assign("year", year); - } else { - const year = years_1.findYearClosestToRef(context.refDate, day, month); - components.imply("year", year); - } - if (!match[DATE_TO_GROUP]) { - return components; - } - const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); - const result = context.createParsingResult(match.index, match[0]); - result.start = components; - result.end = components.clone(); - result.end.assign("day", endDate); - return result; - } - }; - exports.default = ENMonthNameMiddleEndianParser; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameParser.js -var require_ENMonthNameParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants(); - var years_1 = require_years(); - var pattern_1 = require_pattern(); - var constants_2 = require_constants(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`((?:in)\\s*)?(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${constants_2.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`, "i"); - var PREFIX_GROUP = 1; - var MONTH_NAME_GROUP = 2; - var YEAR_GROUP = 3; - var ENMonthNameParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const monthName = match[MONTH_NAME_GROUP].toLowerCase(); - if (match[0].length <= 3 && !constants_1.FULL_MONTH_NAME_DICTIONARY[monthName]) { - return null; - } - const result = context.createParsingResult(match.index + (match[PREFIX_GROUP] || "").length, match.index + match[0].length); - result.start.imply("day", 1); - const month = constants_1.MONTH_DICTIONARY[monthName]; - result.start.assign("month", month); - if (match[YEAR_GROUP]) { - const year = constants_2.parseYear(match[YEAR_GROUP]); - result.start.assign("year", year); - } else { - const year = years_1.findYearClosestToRef(context.refDate, 1, month); - result.start.imply("year", year); - } - return result; - } - }; - exports.default = ENMonthNameParser; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENCasualYearMonthDayParser.js -var require_ENCasualYearMonthDayParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENCasualYearMonthDayParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s](?:(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]([0-9]{1,2})(?=\\W|$)`, "i"); - var YEAR_NUMBER_GROUP = 1; - var MONTH_NAME_GROUP = 2; - var MONTH_NUMBER_GROUP = 3; - var DATE_NUMBER_GROUP = 4; - var ENCasualYearMonthDayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const month = match[MONTH_NUMBER_GROUP] ? parseInt(match[MONTH_NUMBER_GROUP]) : constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - if (month < 1 || month > 12) { - return null; - } - const year = parseInt(match[YEAR_NUMBER_GROUP]); - const day = parseInt(match[DATE_NUMBER_GROUP]); - return { - day, - month, - year - }; - } - }; - exports.default = ENCasualYearMonthDayParser; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENSlashMonthFormatParser.js -var require_ENSlashMonthFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENSlashMonthFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})", "i"); - var MONTH_GROUP = 1; - var YEAR_GROUP = 2; - var ENSlashMonthFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const year = parseInt(match[YEAR_GROUP]); - const month = parseInt(match[MONTH_GROUP]); - return context.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year); - } - }; - exports.default = ENSlashMonthFormatParser; - } -}); - -// node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js -var require_AbstractTimeExpressionParser = __commonJS({ - "node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.AbstractTimeExpressionParser = void 0; - var index_1 = require_dist(); - function primaryTimePattern(leftBoundary, primaryPrefix, primarySuffix, flags) { - return new RegExp(`${leftBoundary}${primaryPrefix}(\\d{1,4})(?:(?:\\.|:|\uFF1A)(\\d{1,2})(?:(?::|\uFF1A)(\\d{2})(?:\\.(\\d{1,6}))?)?)?(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?${primarySuffix}`, flags); - } - function followingTimePatten(followingPhase, followingSuffix) { - return new RegExp(`^(${followingPhase})(\\d{1,4})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:\\.(\\d{1,6}))?)?)?(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?${followingSuffix}`, "i"); - } - var HOUR_GROUP = 2; - var MINUTE_GROUP = 3; - var SECOND_GROUP = 4; - var MILLI_SECOND_GROUP = 5; - var AM_PM_HOUR_GROUP = 6; - var AbstractTimeExpressionParser = class { - constructor(strictMode = false) { - this.cachedPrimaryPrefix = null; - this.cachedPrimarySuffix = null; - this.cachedPrimaryTimePattern = null; - this.cachedFollowingPhase = null; - this.cachedFollowingSuffix = null; - this.cachedFollowingTimePatten = null; - this.strictMode = strictMode; - } - patternFlags() { - return "i"; - } - primaryPatternLeftBoundary() { - return `(^|\\s|T|\\b)`; - } - primarySuffix() { - return `(?=\\W|$)`; - } - followingSuffix() { - return `(?=\\W|$)`; - } - pattern(context) { - return this.getPrimaryTimePatternThroughCache(); - } - extract(context, match) { - const startComponents = this.extractPrimaryTimeComponents(context, match); - if (!startComponents) { - match.index += match[0].length; - return null; - } - const index = match.index + match[1].length; - const text2 = match[0].substring(match[1].length); - const result = context.createParsingResult(index, text2, startComponents); - match.index += match[0].length; - const remainingText = context.text.substring(match.index); - const followingPattern = this.getFollowingTimePatternThroughCache(); - const followingMatch = followingPattern.exec(remainingText); - if (text2.match(/^\d{3,4}/) && followingMatch && followingMatch[0].match(/^\s*([+-])\s*\d{2,4}$/)) { - return null; - } - if (!followingMatch || followingMatch[0].match(/^\s*([+-])\s*\d{3,4}$/)) { - return this.checkAndReturnWithoutFollowingPattern(result); - } - result.end = this.extractFollowingTimeComponents(context, followingMatch, result); - if (result.end) { - result.text += followingMatch[0]; - } - return this.checkAndReturnWithFollowingPattern(result); - } - extractPrimaryTimeComponents(context, match, strict = false) { - const components = context.createParsingComponents(); - let minute = 0; - let meridiem = null; - let hour = parseInt(match[HOUR_GROUP]); - if (hour > 100) { - if (this.strictMode || match[MINUTE_GROUP] != null) { - return null; - } - minute = hour % 100; - hour = Math.floor(hour / 100); - } - if (hour > 24) { - return null; - } - if (match[MINUTE_GROUP] != null) { - if (match[MINUTE_GROUP].length == 1 && !match[AM_PM_HOUR_GROUP]) { - return null; - } - minute = parseInt(match[MINUTE_GROUP]); - } - if (minute >= 60) { - return null; - } - if (hour > 12) { - meridiem = index_1.Meridiem.PM; - } - if (match[AM_PM_HOUR_GROUP] != null) { - if (hour > 12) - return null; - const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); - if (ampm == "a") { - meridiem = index_1.Meridiem.AM; - if (hour == 12) { - hour = 0; - } - } - if (ampm == "p") { - meridiem = index_1.Meridiem.PM; - if (hour != 12) { - hour += 12; - } - } - } - components.assign("hour", hour); - components.assign("minute", minute); - if (meridiem !== null) { - components.assign("meridiem", meridiem); - } else { - if (hour < 12) { - components.imply("meridiem", index_1.Meridiem.AM); - } else { - components.imply("meridiem", index_1.Meridiem.PM); - } - } - if (match[MILLI_SECOND_GROUP] != null) { - const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3)); - if (millisecond >= 1e3) - return null; - components.assign("millisecond", millisecond); - } - if (match[SECOND_GROUP] != null) { - const second = parseInt(match[SECOND_GROUP]); - if (second >= 60) - return null; - components.assign("second", second); - } - return components; - } - extractFollowingTimeComponents(context, match, result) { - const components = context.createParsingComponents(); - if (match[MILLI_SECOND_GROUP] != null) { - const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3)); - if (millisecond >= 1e3) - return null; - components.assign("millisecond", millisecond); - } - if (match[SECOND_GROUP] != null) { - const second = parseInt(match[SECOND_GROUP]); - if (second >= 60) - return null; - components.assign("second", second); - } - let hour = parseInt(match[HOUR_GROUP]); - let minute = 0; - let meridiem = -1; - if (match[MINUTE_GROUP] != null) { - minute = parseInt(match[MINUTE_GROUP]); - } else if (hour > 100) { - minute = hour % 100; - hour = Math.floor(hour / 100); - } - if (minute >= 60 || hour > 24) { - return null; - } - if (hour >= 12) { - meridiem = index_1.Meridiem.PM; - } - if (match[AM_PM_HOUR_GROUP] != null) { - if (hour > 12) { - return null; - } - const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); - if (ampm == "a") { - meridiem = index_1.Meridiem.AM; - if (hour == 12) { - hour = 0; - if (!components.isCertain("day")) { - components.imply("day", components.get("day") + 1); - } - } - } - if (ampm == "p") { - meridiem = index_1.Meridiem.PM; - if (hour != 12) - hour += 12; - } - if (!result.start.isCertain("meridiem")) { - if (meridiem == index_1.Meridiem.AM) { - result.start.imply("meridiem", index_1.Meridiem.AM); - if (result.start.get("hour") == 12) { - result.start.assign("hour", 0); - } - } else { - result.start.imply("meridiem", index_1.Meridiem.PM); - if (result.start.get("hour") != 12) { - result.start.assign("hour", result.start.get("hour") + 12); - } - } - } - } - components.assign("hour", hour); - components.assign("minute", minute); - if (meridiem >= 0) { - components.assign("meridiem", meridiem); - } else { - const startAtPM = result.start.isCertain("meridiem") && result.start.get("hour") > 12; - if (startAtPM) { - if (result.start.get("hour") - 12 > hour) { - components.imply("meridiem", index_1.Meridiem.AM); - } else if (hour <= 12) { - components.assign("hour", hour + 12); - components.assign("meridiem", index_1.Meridiem.PM); - } - } else if (hour > 12) { - components.imply("meridiem", index_1.Meridiem.PM); - } else if (hour <= 12) { - components.imply("meridiem", index_1.Meridiem.AM); - } - } - if (components.date().getTime() < result.start.date().getTime()) { - components.imply("day", components.get("day") + 1); - } - return components; - } - checkAndReturnWithoutFollowingPattern(result) { - if (result.text.match(/^\d$/)) { - return null; - } - if (result.text.match(/^\d\d\d+$/)) { - return null; - } - if (result.text.match(/\d[apAP]$/)) { - return null; - } - const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)$/); - if (endingWithNumbers) { - const endingNumbers = endingWithNumbers[1]; - if (this.strictMode) { - return null; - } - if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) { - return null; - } - const endingNumberVal = parseInt(endingNumbers); - if (endingNumberVal > 24) { - return null; - } - } - return result; - } - checkAndReturnWithFollowingPattern(result) { - if (result.text.match(/^\d+-\d+$/)) { - return null; - } - const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)\s*-\s*(\d[\d.]+)$/); - if (endingWithNumbers) { - if (this.strictMode) { - return null; - } - const startingNumbers = endingWithNumbers[1]; - const endingNumbers = endingWithNumbers[2]; - if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) { - return null; - } - const endingNumberVal = parseInt(endingNumbers); - const startingNumberVal = parseInt(startingNumbers); - if (endingNumberVal > 24 || startingNumberVal > 24) { - return null; - } - } - return result; - } - getPrimaryTimePatternThroughCache() { - const primaryPrefix = this.primaryPrefix(); - const primarySuffix = this.primarySuffix(); - if (this.cachedPrimaryPrefix === primaryPrefix && this.cachedPrimarySuffix === primarySuffix) { - return this.cachedPrimaryTimePattern; - } - this.cachedPrimaryTimePattern = primaryTimePattern(this.primaryPatternLeftBoundary(), primaryPrefix, primarySuffix, this.patternFlags()); - this.cachedPrimaryPrefix = primaryPrefix; - this.cachedPrimarySuffix = primarySuffix; - return this.cachedPrimaryTimePattern; - } - getFollowingTimePatternThroughCache() { - const followingPhase = this.followingPhase(); - const followingSuffix = this.followingSuffix(); - if (this.cachedFollowingPhase === followingPhase && this.cachedFollowingSuffix === followingSuffix) { - return this.cachedFollowingTimePatten; - } - this.cachedFollowingTimePatten = followingTimePatten(followingPhase, followingSuffix); - this.cachedFollowingPhase = followingPhase; - this.cachedFollowingSuffix = followingSuffix; - return this.cachedFollowingTimePatten; - } - }; - exports.AbstractTimeExpressionParser = AbstractTimeExpressionParser; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENTimeExpressionParser.js -var require_ENTimeExpressionParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENTimeExpressionParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var index_1 = require_dist(); - var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); - var ENTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { - constructor(strictMode) { - super(strictMode); - } - followingPhase() { - return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|to|\\?)\\s*"; - } - primaryPrefix() { - return "(?:(?:at|from)\\s*)??"; - } - primarySuffix() { - return "(?:\\s*(?:o\\W*clock|at\\s*night|in\\s*the\\s*(?:morning|afternoon)))?(?!/)(?=\\W|$)"; - } - extractPrimaryTimeComponents(context, match) { - const components = super.extractPrimaryTimeComponents(context, match); - if (components) { - if (match[0].endsWith("night")) { - const hour = components.get("hour"); - if (hour >= 6 && hour < 12) { - components.assign("hour", components.get("hour") + 12); - components.assign("meridiem", index_1.Meridiem.PM); - } else if (hour < 6) { - components.assign("meridiem", index_1.Meridiem.AM); - } - } - if (match[0].endsWith("afternoon")) { - components.assign("meridiem", index_1.Meridiem.PM); - const hour = components.get("hour"); - if (hour >= 0 && hour <= 6) { - components.assign("hour", components.get("hour") + 12); - } - } - if (match[0].endsWith("morning")) { - components.assign("meridiem", index_1.Meridiem.AM); - const hour = components.get("hour"); - if (hour < 12) { - components.assign("hour", components.get("hour")); - } - } - } - return components; - } - }; - exports.default = ENTimeExpressionParser; - } -}); - -// node_modules/chrono-node/dist/utils/timeunits.js -var require_timeunits = __commonJS({ - "node_modules/chrono-node/dist/utils/timeunits.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.addImpliedTimeUnits = exports.reverseTimeUnits = void 0; - function reverseTimeUnits(timeUnits) { - const reversed = {}; - for (const key in timeUnits) { - reversed[key] = -timeUnits[key]; - } - return reversed; - } - exports.reverseTimeUnits = reverseTimeUnits; - function addImpliedTimeUnits(components, timeUnits) { - const output = components.clone(); - let date = components.dayjs(); - for (const key in timeUnits) { - date = date.add(timeUnits[key], key); - } - if ("day" in timeUnits || "d" in timeUnits || "week" in timeUnits || "month" in timeUnits || "year" in timeUnits) { - output.imply("day", date.date()); - output.imply("month", date.month() + 1); - output.imply("year", date.year()); - } - if ("second" in timeUnits || "minute" in timeUnits || "hour" in timeUnits) { - output.imply("second", date.second()); - output.imply("minute", date.minute()); - output.imply("hour", date.hour()); - } - return output; - } - exports.addImpliedTimeUnits = addImpliedTimeUnits; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js -var require_ENTimeUnitAgoFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var timeunits_1 = require_timeunits(); - var PATTERN = new RegExp(`(${constants_1.TIME_UNITS_PATTERN})\\s{0,5}(?:ago|before|earlier)(?=(?:\\W|$))`, "i"); - var STRICT_PATTERN = new RegExp(`(${constants_1.TIME_UNITS_PATTERN})\\s{0,5}ago(?=(?:\\W|$))`, "i"); - var ENTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - constructor(strictMode) { - super(); - this.strictMode = strictMode; - } - innerPattern() { - return this.strictMode ? STRICT_PATTERN : PATTERN; - } - innerExtract(context, match) { - const timeUnits = constants_1.parseTimeUnits(match[1]); - const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); - return results_1.ParsingComponents.createRelativeFromReference(context.reference, outputTimeUnits); - } - }; - exports.default = ENTimeUnitAgoFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js -var require_ENTimeUnitLaterFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`(${constants_1.TIME_UNITS_PATTERN})\\s{0,5}(?:later|after|from now|henceforth|forward|out)(?=(?:\\W|$))`, "i"); - var STRICT_PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(later|from now)(?=(?:\\W|$))", "i"); - var GROUP_NUM_TIMEUNITS = 1; - var ENTimeUnitLaterFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - constructor(strictMode) { - super(); - this.strictMode = strictMode; - } - innerPattern() { - return this.strictMode ? STRICT_PATTERN : PATTERN; - } - innerExtract(context, match) { - const fragments = constants_1.parseTimeUnits(match[GROUP_NUM_TIMEUNITS]); - return results_1.ParsingComponents.createRelativeFromReference(context.reference, fragments); - } - }; - exports.default = ENTimeUnitLaterFormatParser; - } -}); - -// node_modules/chrono-node/dist/common/abstractRefiners.js -var require_abstractRefiners = __commonJS({ - "node_modules/chrono-node/dist/common/abstractRefiners.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.MergingRefiner = exports.Filter = void 0; - var Filter2 = class { - refine(context, results) { - return results.filter((r) => this.isValid(context, r)); - } - }; - exports.Filter = Filter2; - var MergingRefiner = class { - refine(context, results) { - if (results.length < 2) { - return results; - } - const mergedResults = []; - let curResult = results[0]; - let nextResult = null; - for (let i = 1; i < results.length; i++) { - nextResult = results[i]; - const textBetween = context.text.substring(curResult.index + curResult.text.length, nextResult.index); - if (!this.shouldMergeResults(textBetween, curResult, nextResult, context)) { - mergedResults.push(curResult); - curResult = nextResult; - } else { - const left = curResult; - const right = nextResult; - const mergedResult = this.mergeResults(textBetween, left, right, context); - context.debug(() => { - console.log(`${this.constructor.name} merged ${left} and ${right} into ${mergedResult}`); - }); - curResult = mergedResult; - } - } - if (curResult != null) { - mergedResults.push(curResult); - } - return mergedResults; - } - }; - exports.MergingRefiner = MergingRefiner; - } -}); - -// node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js -var require_AbstractMergeDateRangeRefiner = __commonJS({ - "node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var abstractRefiners_1 = require_abstractRefiners(); - var AbstractMergeDateRangeRefiner = class extends abstractRefiners_1.MergingRefiner { - shouldMergeResults(textBetween, currentResult, nextResult) { - return !currentResult.end && !nextResult.end && textBetween.match(this.patternBetween()) != null; - } - mergeResults(textBetween, fromResult, toResult) { - if (!fromResult.start.isOnlyWeekdayComponent() && !toResult.start.isOnlyWeekdayComponent()) { - toResult.start.getCertainComponents().forEach((key) => { - if (!fromResult.start.isCertain(key)) { - fromResult.start.assign(key, toResult.start.get(key)); - } - }); - fromResult.start.getCertainComponents().forEach((key) => { - if (!toResult.start.isCertain(key)) { - toResult.start.assign(key, fromResult.start.get(key)); - } - }); - } - if (fromResult.start.date().getTime() > toResult.start.date().getTime()) { - let fromMoment = fromResult.start.dayjs(); - let toMoment = toResult.start.dayjs(); - if (fromResult.start.isOnlyWeekdayComponent() && fromMoment.add(-7, "days").isBefore(toMoment)) { - fromMoment = fromMoment.add(-7, "days"); - fromResult.start.imply("day", fromMoment.date()); - fromResult.start.imply("month", fromMoment.month() + 1); - fromResult.start.imply("year", fromMoment.year()); - } else if (toResult.start.isOnlyWeekdayComponent() && toMoment.add(7, "days").isAfter(fromMoment)) { - toMoment = toMoment.add(7, "days"); - toResult.start.imply("day", toMoment.date()); - toResult.start.imply("month", toMoment.month() + 1); - toResult.start.imply("year", toMoment.year()); - } else { - [toResult, fromResult] = [fromResult, toResult]; - } - } - const result = fromResult.clone(); - result.start = fromResult.start; - result.end = toResult.start; - result.index = Math.min(fromResult.index, toResult.index); - if (fromResult.index < toResult.index) { - result.text = fromResult.text + textBetween + toResult.text; - } else { - result.text = toResult.text + textBetween + fromResult.text; - } - return result; - } - }; - exports.default = AbstractMergeDateRangeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateRangeRefiner.js -var require_ENMergeDateRangeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateRangeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); - var ENMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { - patternBetween() { - return /^\s*(to|-)\s*$/i; - } - }; - exports.default = ENMergeDateRangeRefiner; - } -}); - -// node_modules/chrono-node/dist/calculation/mergingCalculation.js -var require_mergingCalculation = __commonJS({ - "node_modules/chrono-node/dist/calculation/mergingCalculation.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.mergeDateTimeComponent = exports.mergeDateTimeResult = void 0; - var index_1 = require_dist(); - function mergeDateTimeResult(dateResult, timeResult) { - const result = dateResult.clone(); - const beginDate = dateResult.start; - const beginTime = timeResult.start; - result.start = mergeDateTimeComponent(beginDate, beginTime); - if (dateResult.end != null || timeResult.end != null) { - const endDate = dateResult.end == null ? dateResult.start : dateResult.end; - const endTime = timeResult.end == null ? timeResult.start : timeResult.end; - const endDateTime = mergeDateTimeComponent(endDate, endTime); - if (dateResult.end == null && endDateTime.date().getTime() < result.start.date().getTime()) { - if (endDateTime.isCertain("day")) { - endDateTime.assign("day", endDateTime.get("day") + 1); - } else { - endDateTime.imply("day", endDateTime.get("day") + 1); - } - } - result.end = endDateTime; - } - return result; - } - exports.mergeDateTimeResult = mergeDateTimeResult; - function mergeDateTimeComponent(dateComponent, timeComponent) { - const dateTimeComponent = dateComponent.clone(); - if (timeComponent.isCertain("hour")) { - dateTimeComponent.assign("hour", timeComponent.get("hour")); - dateTimeComponent.assign("minute", timeComponent.get("minute")); - if (timeComponent.isCertain("second")) { - dateTimeComponent.assign("second", timeComponent.get("second")); - if (timeComponent.isCertain("millisecond")) { - dateTimeComponent.assign("millisecond", timeComponent.get("millisecond")); - } else { - dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); - } - } else { - dateTimeComponent.imply("second", timeComponent.get("second")); - dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); - } - } else { - dateTimeComponent.imply("hour", timeComponent.get("hour")); - dateTimeComponent.imply("minute", timeComponent.get("minute")); - dateTimeComponent.imply("second", timeComponent.get("second")); - dateTimeComponent.imply("millisecond", timeComponent.get("millisecond")); - } - if (timeComponent.isCertain("timezoneOffset")) { - dateTimeComponent.assign("timezoneOffset", timeComponent.get("timezoneOffset")); - } - if (timeComponent.isCertain("meridiem")) { - dateTimeComponent.assign("meridiem", timeComponent.get("meridiem")); - } else if (timeComponent.get("meridiem") != null && dateTimeComponent.get("meridiem") == null) { - dateTimeComponent.imply("meridiem", timeComponent.get("meridiem")); - } - if (dateTimeComponent.get("meridiem") == index_1.Meridiem.PM && dateTimeComponent.get("hour") < 12) { - if (timeComponent.isCertain("hour")) { - dateTimeComponent.assign("hour", dateTimeComponent.get("hour") + 12); - } else { - dateTimeComponent.imply("hour", dateTimeComponent.get("hour") + 12); - } - } - return dateTimeComponent; - } - exports.mergeDateTimeComponent = mergeDateTimeComponent; - } -}); - -// node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js -var require_AbstractMergeDateTimeRefiner = __commonJS({ - "node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var abstractRefiners_1 = require_abstractRefiners(); - var mergingCalculation_1 = require_mergingCalculation(); - var ENMergeDateTimeRefiner = class extends abstractRefiners_1.MergingRefiner { - shouldMergeResults(textBetween, currentResult, nextResult) { - return (currentResult.start.isOnlyDate() && nextResult.start.isOnlyTime() || nextResult.start.isOnlyDate() && currentResult.start.isOnlyTime()) && textBetween.match(this.patternBetween()) != null; - } - mergeResults(textBetween, currentResult, nextResult) { - const result = currentResult.start.isOnlyDate() ? mergingCalculation_1.mergeDateTimeResult(currentResult, nextResult) : mergingCalculation_1.mergeDateTimeResult(nextResult, currentResult); - result.index = currentResult.index; - result.text = currentResult.text + textBetween + nextResult.text; - return result; - } - }; - exports.default = ENMergeDateTimeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateTimeRefiner.js -var require_ENMergeDateTimeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateTimeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); - var ENMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return new RegExp("^\\s*(T|at|after|before|on|of|,|-)?\\s*$"); - } - }; - exports.default = ENMergeDateTimeRefiner; - } -}); - -// node_modules/chrono-node/dist/common/refiners/ExtractTimezoneAbbrRefiner.js -var require_ExtractTimezoneAbbrRefiner = __commonJS({ - "node_modules/chrono-node/dist/common/refiners/ExtractTimezoneAbbrRefiner.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var TIMEZONE_NAME_PATTERN = new RegExp("^\\s*,?\\s*\\(?([A-Z]{2,4})\\)?(?=\\W|$)", "i"); - var DEFAULT_TIMEZONE_ABBR_MAP = { - ACDT: 630, - ACST: 570, - ADT: -180, - AEDT: 660, - AEST: 600, - AFT: 270, - AKDT: -480, - AKST: -540, - ALMT: 360, - AMST: -180, - AMT: -240, - ANAST: 720, - ANAT: 720, - AQTT: 300, - ART: -180, - AST: -240, - AWDT: 540, - AWST: 480, - AZOST: 0, - AZOT: -60, - AZST: 300, - AZT: 240, - BNT: 480, - BOT: -240, - BRST: -120, - BRT: -180, - BST: 60, - BTT: 360, - CAST: 480, - CAT: 120, - CCT: 390, - CDT: -300, - CEST: 120, - CET: 60, - CHADT: 825, - CHAST: 765, - CKT: -600, - CLST: -180, - CLT: -240, - COT: -300, - CST: -360, - CVT: -60, - CXT: 420, - ChST: 600, - DAVT: 420, - EASST: -300, - EAST: -360, - EAT: 180, - ECT: -300, - EDT: -240, - EEST: 180, - EET: 120, - EGST: 0, - EGT: -60, - EST: -300, - ET: -300, - FJST: 780, - FJT: 720, - FKST: -180, - FKT: -240, - FNT: -120, - GALT: -360, - GAMT: -540, - GET: 240, - GFT: -180, - GILT: 720, - GMT: 0, - GST: 240, - GYT: -240, - HAA: -180, - HAC: -300, - HADT: -540, - HAE: -240, - HAP: -420, - HAR: -360, - HAST: -600, - HAT: -90, - HAY: -480, - HKT: 480, - HLV: -210, - HNA: -240, - HNC: -360, - HNE: -300, - HNP: -480, - HNR: -420, - HNT: -150, - HNY: -540, - HOVT: 420, - ICT: 420, - IDT: 180, - IOT: 360, - IRDT: 270, - IRKST: 540, - IRKT: 540, - IRST: 210, - IST: 330, - JST: 540, - KGT: 360, - KRAST: 480, - KRAT: 480, - KST: 540, - KUYT: 240, - LHDT: 660, - LHST: 630, - LINT: 840, - MAGST: 720, - MAGT: 720, - MART: -510, - MAWT: 300, - MDT: -360, - MESZ: 120, - MEZ: 60, - MHT: 720, - MMT: 390, - MSD: 240, - MSK: 240, - MST: -420, - MUT: 240, - MVT: 300, - MYT: 480, - NCT: 660, - NDT: -90, - NFT: 690, - NOVST: 420, - NOVT: 360, - NPT: 345, - NST: -150, - NUT: -660, - NZDT: 780, - NZST: 720, - OMSST: 420, - OMST: 420, - PDT: -420, - PET: -300, - PETST: 720, - PETT: 720, - PGT: 600, - PHOT: 780, - PHT: 480, - PKT: 300, - PMDT: -120, - PMST: -180, - PONT: 660, - PST: -480, - PT: -480, - PWT: 540, - PYST: -180, - PYT: -240, - RET: 240, - SAMT: 240, - SAST: 120, - SBT: 660, - SCT: 240, - SGT: 480, - SRT: -180, - SST: -660, - TAHT: -600, - TFT: 300, - TJT: 300, - TKT: 780, - TLT: 540, - TMT: 300, - TVT: 720, - ULAT: 480, - UTC: 0, - UYST: -120, - UYT: -180, - UZT: 300, - VET: -210, - VLAST: 660, - VLAT: 660, - VUT: 660, - WAST: 120, - WAT: 60, - WEST: 60, - WESZ: 60, - WET: 0, - WEZ: 0, - WFT: 720, - WGST: -120, - WGT: -180, - WIB: 420, - WIT: 540, - WITA: 480, - WST: 780, - WT: 0, - YAKST: 600, - YAKT: 600, - YAPT: 600, - YEKST: 360, - YEKT: 360 - }; - var ExtractTimezoneAbbrRefiner = class { - constructor(timezoneOverrides) { - this.timezone = Object.assign(Object.assign({}, DEFAULT_TIMEZONE_ABBR_MAP), timezoneOverrides); - } - refine(context, results) { - var _a; - const timezoneOverrides = (_a = context.option.timezones) !== null && _a !== void 0 ? _a : {}; - results.forEach((result) => { - var _a2, _b; - const suffix = context.text.substring(result.index + result.text.length); - const match = TIMEZONE_NAME_PATTERN.exec(suffix); - if (!match) { - return; - } - const timezoneAbbr = match[1].toUpperCase(); - const extractedTimezoneOffset = (_b = (_a2 = timezoneOverrides[timezoneAbbr]) !== null && _a2 !== void 0 ? _a2 : this.timezone[timezoneAbbr]) !== null && _b !== void 0 ? _b : null; - if (extractedTimezoneOffset === null) { - return; - } - context.debug(() => { - console.log(`Extracting timezone: '${timezoneAbbr}' into: ${extractedTimezoneOffset} for: ${result.start}`); - }); - const currentTimezoneOffset = result.start.get("timezoneOffset"); - if (currentTimezoneOffset !== null && extractedTimezoneOffset != currentTimezoneOffset) { - if (result.start.isCertain("timezoneOffset")) { - return; - } - if (timezoneAbbr != match[1]) { - return; - } - } - if (result.start.isOnlyDate()) { - if (timezoneAbbr != match[1]) { - return; - } - } - result.text += match[0]; - if (!result.start.isCertain("timezoneOffset")) { - result.start.assign("timezoneOffset", extractedTimezoneOffset); - } - if (result.end != null && !result.end.isCertain("timezoneOffset")) { - result.end.assign("timezoneOffset", extractedTimezoneOffset); - } - }); - return results; - } - }; - exports.default = ExtractTimezoneAbbrRefiner; - } -}); - -// node_modules/chrono-node/dist/common/refiners/ExtractTimezoneOffsetRefiner.js -var require_ExtractTimezoneOffsetRefiner = __commonJS({ - "node_modules/chrono-node/dist/common/refiners/ExtractTimezoneOffsetRefiner.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var TIMEZONE_OFFSET_PATTERN = new RegExp("^\\s*(?:\\(?(?:GMT|UTC)\\s?)?([+-])(\\d{1,2})(?::?(\\d{2}))?\\)?", "i"); - var TIMEZONE_OFFSET_SIGN_GROUP = 1; - var TIMEZONE_OFFSET_HOUR_OFFSET_GROUP = 2; - var TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP = 3; - var ExtractTimezoneOffsetRefiner = class { - refine(context, results) { - results.forEach(function(result) { - if (result.start.isCertain("timezoneOffset")) { - return; - } - const suffix = context.text.substring(result.index + result.text.length); - const match = TIMEZONE_OFFSET_PATTERN.exec(suffix); - if (!match) { - return; - } - context.debug(() => { - console.log(`Extracting timezone: '${match[0]}' into : ${result}`); - }); - const hourOffset = parseInt(match[TIMEZONE_OFFSET_HOUR_OFFSET_GROUP]); - const minuteOffset = parseInt(match[TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP] || "0"); - let timezoneOffset = hourOffset * 60 + minuteOffset; - if (timezoneOffset > 14 * 60) { - return; - } - if (match[TIMEZONE_OFFSET_SIGN_GROUP] === "-") { - timezoneOffset = -timezoneOffset; - } - if (result.end != null) { - result.end.assign("timezoneOffset", timezoneOffset); - } - result.start.assign("timezoneOffset", timezoneOffset); - result.text += match[0]; - }); - return results; - } - }; - exports.default = ExtractTimezoneOffsetRefiner; - } -}); - -// node_modules/chrono-node/dist/common/refiners/OverlapRemovalRefiner.js -var require_OverlapRemovalRefiner = __commonJS({ - "node_modules/chrono-node/dist/common/refiners/OverlapRemovalRefiner.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var OverlapRemovalRefiner = class { - refine(context, results) { - if (results.length < 2) { - return results; - } - const filteredResults = []; - let prevResult = results[0]; - for (let i = 1; i < results.length; i++) { - const result = results[i]; - if (result.index < prevResult.index + prevResult.text.length) { - if (result.text.length > prevResult.text.length) { - prevResult = result; - } - } else { - filteredResults.push(prevResult); - prevResult = result; - } - } - if (prevResult != null) { - filteredResults.push(prevResult); - } - return filteredResults; - } - }; - exports.default = OverlapRemovalRefiner; - } -}); - -// node_modules/chrono-node/dist/common/refiners/ForwardDateRefiner.js -var require_ForwardDateRefiner = __commonJS({ - "node_modules/chrono-node/dist/common/refiners/ForwardDateRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var ForwardDateRefiner = class { - refine(context, results) { - if (!context.option.forwardDate) { - return results; - } - results.forEach(function(result) { - let refMoment = dayjs_1.default(context.refDate); - if (result.start.isOnlyDayMonthComponent() && refMoment.isAfter(result.start.dayjs())) { - for (let i = 0; i < 3 && refMoment.isAfter(result.start.dayjs()); i++) { - result.start.imply("year", result.start.get("year") + 1); - context.debug(() => { - console.log(`Forward yearly adjusted for ${result} (${result.start})`); - }); - if (result.end && !result.end.isCertain("year")) { - result.end.imply("year", result.end.get("year") + 1); - context.debug(() => { - console.log(`Forward yearly adjusted for ${result} (${result.end})`); - }); - } - } - } - if (result.start.isOnlyWeekdayComponent() && refMoment.isAfter(result.start.dayjs())) { - if (refMoment.day() >= result.start.get("weekday")) { - refMoment = refMoment.day(result.start.get("weekday") + 7); - } else { - refMoment = refMoment.day(result.start.get("weekday")); - } - result.start.imply("day", refMoment.date()); - result.start.imply("month", refMoment.month() + 1); - result.start.imply("year", refMoment.year()); - context.debug(() => { - console.log(`Forward weekly adjusted for ${result} (${result.start})`); - }); - if (result.end && result.end.isOnlyWeekdayComponent()) { - if (refMoment.day() > result.end.get("weekday")) { - refMoment = refMoment.day(result.end.get("weekday") + 7); - } else { - refMoment = refMoment.day(result.end.get("weekday")); - } - result.end.imply("day", refMoment.date()); - result.end.imply("month", refMoment.month() + 1); - result.end.imply("year", refMoment.year()); - context.debug(() => { - console.log(`Forward weekly adjusted for ${result} (${result.end})`); - }); - } - } - }); - return results; - } - }; - exports.default = ForwardDateRefiner; - } -}); - -// node_modules/chrono-node/dist/common/refiners/UnlikelyFormatFilter.js -var require_UnlikelyFormatFilter = __commonJS({ - "node_modules/chrono-node/dist/common/refiners/UnlikelyFormatFilter.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var abstractRefiners_1 = require_abstractRefiners(); - var UnlikelyFormatFilter = class extends abstractRefiners_1.Filter { - constructor(strictMode) { - super(); - this.strictMode = strictMode; - } - isValid(context, result) { - if (result.text.replace(" ", "").match(/^\d*(\.\d*)?$/)) { - context.debug(() => { - console.log(`Removing unlikely result '${result.text}'`); - }); - return false; - } - if (!result.start.isValidDate()) { - context.debug(() => { - console.log(`Removing invalid result: ${result} (${result.start})`); - }); - return false; - } - if (result.end && !result.end.isValidDate()) { - context.debug(() => { - console.log(`Removing invalid result: ${result} (${result.end})`); - }); - return false; - } - if (this.strictMode) { - return this.isStrictModeValid(context, result); - } - return true; - } - isStrictModeValid(context, result) { - if (result.start.isOnlyWeekdayComponent()) { - context.debug(() => { - console.log(`(Strict) Removing weekday only component: ${result} (${result.end})`); - }); - return false; - } - if (result.start.isOnlyTime() && (!result.start.isCertain("hour") || !result.start.isCertain("minute"))) { - context.debug(() => { - console.log(`(Strict) Removing uncertain time component: ${result} (${result.end})`); - }); - return false; - } - return true; - } - }; - exports.default = UnlikelyFormatFilter; - } -}); - -// node_modules/chrono-node/dist/common/parsers/ISOFormatParser.js -var require_ISOFormatParser = __commonJS({ - "node_modules/chrono-node/dist/common/parsers/ISOFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp("([0-9]{4})\\-([0-9]{1,2})\\-([0-9]{1,2})(?:T([0-9]{1,2}):([0-9]{1,2})(?::([0-9]{1,2})(?:\\.(\\d{1,4}))?)?(?:Z|([+-]\\d{2}):?(\\d{2})?)?)?(?=\\W|$)", "i"); - var YEAR_NUMBER_GROUP = 1; - var MONTH_NUMBER_GROUP = 2; - var DATE_NUMBER_GROUP = 3; - var HOUR_NUMBER_GROUP = 4; - var MINUTE_NUMBER_GROUP = 5; - var SECOND_NUMBER_GROUP = 6; - var MILLISECOND_NUMBER_GROUP = 7; - var TZD_HOUR_OFFSET_GROUP = 8; - var TZD_MINUTE_OFFSET_GROUP = 9; - var ISOFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const components = {}; - components["year"] = parseInt(match[YEAR_NUMBER_GROUP]); - components["month"] = parseInt(match[MONTH_NUMBER_GROUP]); - components["day"] = parseInt(match[DATE_NUMBER_GROUP]); - if (match[HOUR_NUMBER_GROUP] != null) { - components["hour"] = parseInt(match[HOUR_NUMBER_GROUP]); - components["minute"] = parseInt(match[MINUTE_NUMBER_GROUP]); - if (match[SECOND_NUMBER_GROUP] != null) { - components["second"] = parseInt(match[SECOND_NUMBER_GROUP]); - } - if (match[MILLISECOND_NUMBER_GROUP] != null) { - components["millisecond"] = parseInt(match[MILLISECOND_NUMBER_GROUP]); - } - if (match[TZD_HOUR_OFFSET_GROUP] == null) { - components["timezoneOffset"] = 0; - } else { - const hourOffset = parseInt(match[TZD_HOUR_OFFSET_GROUP]); - let minuteOffset = 0; - if (match[TZD_MINUTE_OFFSET_GROUP] != null) { - minuteOffset = parseInt(match[TZD_MINUTE_OFFSET_GROUP]); - } - let offset = hourOffset * 60; - if (offset < 0) { - offset -= minuteOffset; - } else { - offset += minuteOffset; - } - components["timezoneOffset"] = offset; - } - } - return components; - } - }; - exports.default = ISOFormatParser; - } -}); - -// node_modules/chrono-node/dist/common/refiners/MergeWeekdayComponentRefiner.js -var require_MergeWeekdayComponentRefiner = __commonJS({ - "node_modules/chrono-node/dist/common/refiners/MergeWeekdayComponentRefiner.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var abstractRefiners_1 = require_abstractRefiners(); - var MergeWeekdayComponentRefiner = class extends abstractRefiners_1.MergingRefiner { - mergeResults(textBetween, currentResult, nextResult) { - const newResult = nextResult.clone(); - newResult.index = currentResult.index; - newResult.text = currentResult.text + textBetween + newResult.text; - newResult.start.assign("weekday", currentResult.start.get("weekday")); - if (newResult.end) { - newResult.end.assign("weekday", currentResult.start.get("weekday")); - } - return newResult; - } - shouldMergeResults(textBetween, currentResult, nextResult) { - const weekdayThenNormalDate = currentResult.start.isOnlyWeekdayComponent() && !currentResult.start.isCertain("hour") && nextResult.start.isCertain("day"); - return weekdayThenNormalDate && textBetween.match(/^,?\s*$/) != null; - } - }; - exports.default = MergeWeekdayComponentRefiner; - } -}); - -// node_modules/chrono-node/dist/configurations.js -var require_configurations = __commonJS({ - "node_modules/chrono-node/dist/configurations.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.includeCommonConfiguration = void 0; - var ExtractTimezoneAbbrRefiner_1 = __importDefault2(require_ExtractTimezoneAbbrRefiner()); - var ExtractTimezoneOffsetRefiner_1 = __importDefault2(require_ExtractTimezoneOffsetRefiner()); - var OverlapRemovalRefiner_1 = __importDefault2(require_OverlapRemovalRefiner()); - var ForwardDateRefiner_1 = __importDefault2(require_ForwardDateRefiner()); - var UnlikelyFormatFilter_1 = __importDefault2(require_UnlikelyFormatFilter()); - var ISOFormatParser_1 = __importDefault2(require_ISOFormatParser()); - var MergeWeekdayComponentRefiner_1 = __importDefault2(require_MergeWeekdayComponentRefiner()); - function includeCommonConfiguration(configuration, strictMode = false) { - configuration.parsers.unshift(new ISOFormatParser_1.default()); - configuration.refiners.unshift(new MergeWeekdayComponentRefiner_1.default()); - configuration.refiners.unshift(new ExtractTimezoneAbbrRefiner_1.default()); - configuration.refiners.unshift(new ExtractTimezoneOffsetRefiner_1.default()); - configuration.refiners.unshift(new OverlapRemovalRefiner_1.default()); - configuration.refiners.push(new OverlapRemovalRefiner_1.default()); - configuration.refiners.push(new ForwardDateRefiner_1.default()); - configuration.refiners.push(new UnlikelyFormatFilter_1.default(strictMode)); - return configuration; - } - exports.includeCommonConfiguration = includeCommonConfiguration; - } -}); - -// node_modules/chrono-node/dist/common/casualReferences.js -var require_casualReferences = __commonJS({ - "node_modules/chrono-node/dist/common/casualReferences.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.noon = exports.morning = exports.midnight = exports.yesterdayEvening = exports.evening = exports.lastNight = exports.tonight = exports.theDayAfter = exports.tomorrow = exports.theDayBefore = exports.yesterday = exports.today = exports.now = void 0; - var results_1 = require_results(); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var dayjs_2 = require_dayjs(); - var index_1 = require_dist(); - function now(reference) { - const targetDate = dayjs_1.default(reference.instant); - const component = new results_1.ParsingComponents(reference, {}); - dayjs_2.assignSimilarDate(component, targetDate); - dayjs_2.assignSimilarTime(component, targetDate); - if (reference.timezoneOffset !== null) { - component.assign("timezoneOffset", targetDate.utcOffset()); - } - return component; - } - exports.now = now; - function today(reference) { - const targetDate = dayjs_1.default(reference.instant); - const component = new results_1.ParsingComponents(reference, {}); - dayjs_2.assignSimilarDate(component, targetDate); - dayjs_2.implySimilarTime(component, targetDate); - return component; - } - exports.today = today; - function yesterday(reference) { - return theDayBefore(reference, 1); - } - exports.yesterday = yesterday; - function theDayBefore(reference, numDay) { - return theDayAfter(reference, -numDay); - } - exports.theDayBefore = theDayBefore; - function tomorrow(reference) { - return theDayAfter(reference, 1); - } - exports.tomorrow = tomorrow; - function theDayAfter(reference, nDays) { - let targetDate = dayjs_1.default(reference.instant); - const component = new results_1.ParsingComponents(reference, {}); - targetDate = targetDate.add(nDays, "day"); - dayjs_2.assignSimilarDate(component, targetDate); - dayjs_2.implySimilarTime(component, targetDate); - return component; - } - exports.theDayAfter = theDayAfter; - function tonight(reference, implyHour = 22) { - const targetDate = dayjs_1.default(reference.instant); - const component = new results_1.ParsingComponents(reference, {}); - component.imply("hour", implyHour); - component.imply("meridiem", index_1.Meridiem.PM); - dayjs_2.assignSimilarDate(component, targetDate); - return component; - } - exports.tonight = tonight; - function lastNight(reference, implyHour = 0) { - let targetDate = dayjs_1.default(reference.instant); - const component = new results_1.ParsingComponents(reference, {}); - if (targetDate.hour() < 6) { - targetDate = targetDate.add(-1, "day"); - } - dayjs_2.assignSimilarDate(component, targetDate); - component.imply("hour", implyHour); - return component; - } - exports.lastNight = lastNight; - function evening(reference, implyHour = 20) { - const component = new results_1.ParsingComponents(reference, {}); - component.imply("meridiem", index_1.Meridiem.PM); - component.imply("hour", implyHour); - return component; - } - exports.evening = evening; - function yesterdayEvening(reference, implyHour = 20) { - let targetDate = dayjs_1.default(reference.instant); - const component = new results_1.ParsingComponents(reference, {}); - targetDate = targetDate.add(-1, "day"); - dayjs_2.assignSimilarDate(component, targetDate); - component.imply("hour", implyHour); - component.imply("meridiem", index_1.Meridiem.PM); - return component; - } - exports.yesterdayEvening = yesterdayEvening; - function midnight(reference) { - const component = new results_1.ParsingComponents(reference, {}); - component.imply("hour", 0); - component.imply("minute", 0); - component.imply("second", 0); - return component; - } - exports.midnight = midnight; - function morning(reference, implyHour = 6) { - const component = new results_1.ParsingComponents(reference, {}); - component.imply("meridiem", index_1.Meridiem.AM); - component.imply("hour", implyHour); - return component; - } - exports.morning = morning; - function noon(reference) { - const component = new results_1.ParsingComponents(reference, {}); - component.imply("meridiem", index_1.Meridiem.AM); - component.imply("hour", 12); - return component; - } - exports.noon = noon; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENCasualDateParser.js -var require_ENCasualDateParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENCasualDateParser.js"(exports) { - "use strict"; - var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar2 = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding2(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var dayjs_2 = require_dayjs(); - var references = __importStar2(require_casualReferences()); - var PATTERN = /(now|today|tonight|tomorrow|tmr|tmrw|yesterday|last\s*night)(?=\W|$)/i; - var ENCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return PATTERN; - } - innerExtract(context, match) { - let targetDate = dayjs_1.default(context.refDate); - const lowerText = match[0].toLowerCase(); - const component = context.createParsingComponents(); - switch (lowerText) { - case "now": - return references.now(context.reference); - case "today": - return references.today(context.reference); - case "yesterday": - return references.yesterday(context.reference); - case "tomorrow": - case "tmr": - case "tmrw": - return references.tomorrow(context.reference); - case "tonight": - return references.tonight(context.reference); - default: - if (lowerText.match(/last\s*night/)) { - if (targetDate.hour() > 6) { - targetDate = targetDate.add(-1, "day"); - } - dayjs_2.assignSimilarDate(component, targetDate); - component.imply("hour", 0); - } - break; - } - return component; - } - }; - exports.default = ENCasualDateParser; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENCasualTimeParser.js -var require_ENCasualTimeParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENCasualTimeParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var index_1 = require_dist(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var dayjs_2 = require_dayjs(); - var PATTERN = /(?:this)?\s{0,3}(morning|afternoon|evening|night|midnight|noon)(?=\W|$)/i; - var ENCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const targetDate = dayjs_1.default(context.refDate); - const component = context.createParsingComponents(); - switch (match[1].toLowerCase()) { - case "afternoon": - component.imply("meridiem", index_1.Meridiem.PM); - component.imply("hour", 15); - break; - case "evening": - case "night": - component.imply("meridiem", index_1.Meridiem.PM); - component.imply("hour", 20); - break; - case "midnight": - dayjs_2.assignTheNextDay(component, targetDate); - component.imply("hour", 0); - component.imply("minute", 0); - component.imply("second", 0); - break; - case "morning": - component.imply("meridiem", index_1.Meridiem.AM); - component.imply("hour", 6); - break; - case "noon": - component.imply("meridiem", index_1.Meridiem.AM); - component.imply("hour", 12); - break; - } - return component; - } - }; - exports.default = ENCasualTimeParser; - } -}); - -// node_modules/chrono-node/dist/calculation/weeks.js -var require_weeks = __commonJS({ - "node_modules/chrono-node/dist/calculation/weeks.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.toDayJSClosestWeekday = exports.toDayJSWeekday = void 0; - var dayjs_1 = __importDefault2(require_dayjs_min()); - function toDayJSWeekday(refDate, offset, modifier) { - if (!modifier) { - return toDayJSClosestWeekday(refDate, offset); - } - let date = dayjs_1.default(refDate); - switch (modifier) { - case "this": - date = date.day(offset); - break; - case "next": - date = date.day(offset + 7); - break; - case "last": - date = date.day(offset - 7); - break; - } - return date; - } - exports.toDayJSWeekday = toDayJSWeekday; - function toDayJSClosestWeekday(refDate, offset) { - let date = dayjs_1.default(refDate); - const refOffset = date.day(); - if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { - date = date.day(offset - 7); - } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { - date = date.day(offset + 7); - } else { - date = date.day(offset); - } - return date; - } - exports.toDayJSClosestWeekday = toDayJSClosestWeekday; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENWeekdayParser.js -var require_ENWeekdayParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENWeekdayParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var weeks_1 = require_weeks(); - var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:on\\s*?)?(?:(this|last|past|next)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(this|last|past|next)\\s*week)?(?=\\W|$)`, "i"); - var PREFIX_GROUP = 1; - var WEEKDAY_GROUP = 2; - var POSTFIX_GROUP = 3; - var ENWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); - const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; - const prefix = match[PREFIX_GROUP]; - const postfix = match[POSTFIX_GROUP]; - let modifierWord = prefix || postfix; - modifierWord = modifierWord || ""; - modifierWord = modifierWord.toLowerCase(); - let modifier = null; - if (modifierWord == "last" || modifierWord == "past") { - modifier = "last"; - } else if (modifierWord == "next") { - modifier = "next"; - } else if (modifierWord == "this") { - modifier = "this"; - } - const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); - return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); - } - }; - exports.default = ENWeekdayParser; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENRelativeDateFormatParser.js -var require_ENRelativeDateFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENRelativeDateFormatParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants(); - var results_1 = require_results(); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var pattern_1 = require_pattern(); - var PATTERN = new RegExp(`(this|last|past|next|after\\s*this)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)(?=\\W|$)`, "i"); - var MODIFIER_WORD_GROUP = 1; - var RELATIVE_WORD_GROUP = 2; - var ENRelativeDateFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const modifier = match[MODIFIER_WORD_GROUP].toLowerCase(); - const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase(); - const timeunit = constants_1.TIME_UNIT_DICTIONARY[unitWord]; - if (modifier == "next" || modifier.startsWith("after")) { - const timeUnits = {}; - timeUnits[timeunit] = 1; - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - if (modifier == "last" || modifier == "past") { - const timeUnits = {}; - timeUnits[timeunit] = -1; - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - const components = context.createParsingComponents(); - let date = dayjs_1.default(context.reference.instant); - if (unitWord.match(/week/i)) { - date = date.add(-date.get("d"), "d"); - components.imply("day", date.date()); - components.imply("month", date.month() + 1); - components.imply("year", date.year()); - } else if (unitWord.match(/month/i)) { - date = date.add(-date.date() + 1, "d"); - components.imply("day", date.date()); - components.assign("year", date.year()); - components.assign("month", date.month() + 1); - } else if (unitWord.match(/year/i)) { - date = date.add(-date.date() + 1, "d"); - date = date.add(-date.month(), "month"); - components.imply("day", date.date()); - components.imply("month", date.month() + 1); - components.assign("year", date.year()); - } - return components; - } - }; - exports.default = ENRelativeDateFormatParser; - } -}); - -// node_modules/chrono-node/dist/chrono.js -var require_chrono = __commonJS({ - "node_modules/chrono-node/dist/chrono.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.ParsingContext = exports.Chrono = void 0; - var results_1 = require_results(); - var en_1 = require_en(); - var Chrono = class { - constructor(configuration) { - configuration = configuration || en_1.createCasualConfiguration(); - this.parsers = [...configuration.parsers]; - this.refiners = [...configuration.refiners]; - } - clone() { - return new Chrono({ - parsers: [...this.parsers], - refiners: [...this.refiners] - }); - } - parseDate(text2, referenceDate, option) { - const results = this.parse(text2, referenceDate, option); - return results.length > 0 ? results[0].start.date() : null; - } - parse(text2, referenceDate, option) { - const context = new ParsingContext(text2, referenceDate, option); - let results = []; - this.parsers.forEach((parser) => { - const parsedResults = Chrono.executeParser(context, parser); - results = results.concat(parsedResults); - }); - results.sort((a, b) => { - return a.index - b.index; - }); - this.refiners.forEach(function(refiner) { - results = refiner.refine(context, results); - }); - return results; - } - static executeParser(context, parser) { - const results = []; - const pattern = parser.pattern(context); - const originalText = context.text; - let remainingText = context.text; - let match = pattern.exec(remainingText); - while (match) { - const index = match.index + originalText.length - remainingText.length; - match.index = index; - const result = parser.extract(context, match); - if (!result) { - remainingText = originalText.substring(match.index + 1); - match = pattern.exec(remainingText); - continue; - } - let parsedResult = null; - if (result instanceof results_1.ParsingResult) { - parsedResult = result; - } else if (result instanceof results_1.ParsingComponents) { - parsedResult = context.createParsingResult(match.index, match[0]); - parsedResult.start = result; - } else { - parsedResult = context.createParsingResult(match.index, match[0], result); - } - context.debug(() => console.log(`${parser.constructor.name} extracted result ${parsedResult}`)); - results.push(parsedResult); - remainingText = originalText.substring(index + parsedResult.text.length); - match = pattern.exec(remainingText); - } - return results; - } - }; - exports.Chrono = Chrono; - var ParsingContext = class { - constructor(text2, refDate, option) { - this.text = text2; - this.reference = new results_1.ReferenceWithTimezone(refDate); - this.option = option !== null && option !== void 0 ? option : {}; - this.refDate = this.reference.instant; - } - createParsingComponents(components) { - if (components instanceof results_1.ParsingComponents) { - return components; - } - return new results_1.ParsingComponents(this.reference, components); - } - createParsingResult(index, textOrEndIndex, startComponents, endComponents) { - const text2 = typeof textOrEndIndex === "string" ? textOrEndIndex : this.text.substring(index, textOrEndIndex); - const start = startComponents ? this.createParsingComponents(startComponents) : null; - const end = endComponents ? this.createParsingComponents(endComponents) : null; - return new results_1.ParsingResult(this.reference, index, text2, start, end); - } - debug(block) { - if (this.option.debug) { - if (this.option.debug instanceof Function) { - this.option.debug(block); - } else { - const handler = this.option.debug; - handler.debug(block); - } - } - } - }; - exports.ParsingContext = ParsingContext; - } -}); - -// node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js -var require_SlashDateFormatParser = __commonJS({ - "node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var years_1 = require_years(); - var PATTERN = new RegExp("([^\\d]|^)([0-3]{0,1}[0-9]{1})[\\/\\.\\-]([0-3]{0,1}[0-9]{1})(?:[\\/\\.\\-]([0-9]{4}|[0-9]{2}))?(\\W|$)", "i"); - var OPENING_GROUP = 1; - var ENDING_GROUP = 5; - var FIRST_NUMBERS_GROUP = 2; - var SECOND_NUMBERS_GROUP = 3; - var YEAR_GROUP = 4; - var SlashDateFormatParser = class { - constructor(littleEndian) { - this.groupNumberMonth = littleEndian ? SECOND_NUMBERS_GROUP : FIRST_NUMBERS_GROUP; - this.groupNumberDay = littleEndian ? FIRST_NUMBERS_GROUP : SECOND_NUMBERS_GROUP; - } - pattern() { - return PATTERN; - } - extract(context, match) { - if (match[OPENING_GROUP] == "/" || match[ENDING_GROUP] == "/") { - match.index += match[0].length; - return; - } - const index = match.index + match[OPENING_GROUP].length; - const text2 = match[0].substr(match[OPENING_GROUP].length, match[0].length - match[OPENING_GROUP].length - match[ENDING_GROUP].length); - if (text2.match(/^\d\.\d$/) || text2.match(/^\d\.\d{1,2}\.\d{1,2}\s*$/)) { - return; - } - if (!match[YEAR_GROUP] && match[0].indexOf("/") < 0) { - return; - } - const result = context.createParsingResult(index, text2); - let month = parseInt(match[this.groupNumberMonth]); - let day = parseInt(match[this.groupNumberDay]); - if (month < 1 || month > 12) { - if (month > 12) { - if (day >= 1 && day <= 12 && month <= 31) { - [day, month] = [month, day]; - } else { - return null; - } - } - } - if (day < 1 || day > 31) { - return null; - } - result.start.assign("day", day); - result.start.assign("month", month); - if (match[YEAR_GROUP]) { - const rawYearNumber = parseInt(match[YEAR_GROUP]); - const year = years_1.findMostLikelyADYear(rawYearNumber); - result.start.assign("year", year); - } else { - const year = years_1.findYearClosestToRef(context.refDate, day, month); - result.start.imply("year", year); - } - return result; - } - }; - exports.default = SlashDateFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js -var require_ENTimeUnitCasualRelativeFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var timeunits_1 = require_timeunits(); - var PATTERN = new RegExp(`(this|last|past|next|after|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); - var ENTimeUnitCasualRelativeFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const prefix = match[1].toLowerCase(); - let timeUnits = constants_1.parseTimeUnits(match[2]); - switch (prefix) { - case "last": - case "past": - case "-": - timeUnits = timeunits_1.reverseTimeUnits(timeUnits); - break; - } - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - }; - exports.default = ENTimeUnitCasualRelativeFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/en/refiners/ENMergeRelativeDateRefiner.js -var require_ENMergeRelativeDateRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/en/refiners/ENMergeRelativeDateRefiner.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var abstractRefiners_1 = require_abstractRefiners(); - var results_1 = require_results(); - var constants_1 = require_constants(); - var timeunits_1 = require_timeunits(); - function hasImpliedEarlierReferenceDate(result) { - return result.text.match(/\s+(before|from)$/i) != null; - } - function hasImpliedLaterReferenceDate(result) { - return result.text.match(/\s+(after|since)$/i) != null; - } - var ENMergeRelativeDateRefiner = class extends abstractRefiners_1.MergingRefiner { - patternBetween() { - return /^\s*$/i; - } - shouldMergeResults(textBetween, currentResult, nextResult) { - if (!textBetween.match(this.patternBetween())) { - return false; - } - if (!hasImpliedEarlierReferenceDate(currentResult) && !hasImpliedLaterReferenceDate(currentResult)) { - return false; - } - return !!nextResult.start.get("day") && !!nextResult.start.get("month") && !!nextResult.start.get("year"); - } - mergeResults(textBetween, currentResult, nextResult) { - let timeUnits = constants_1.parseTimeUnits(currentResult.text); - if (hasImpliedEarlierReferenceDate(currentResult)) { - timeUnits = timeunits_1.reverseTimeUnits(timeUnits); - } - const components = results_1.ParsingComponents.createRelativeFromReference(new results_1.ReferenceWithTimezone(nextResult.start.date()), timeUnits); - return new results_1.ParsingResult(nextResult.reference, currentResult.index, `${currentResult.text}${textBetween}${nextResult.text}`, components); - } - }; - exports.default = ENMergeRelativeDateRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/en/index.js -var require_en = __commonJS({ - "node_modules/chrono-node/dist/locales/en/index.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.GB = exports.strict = exports.casual = void 0; - var ENTimeUnitWithinFormatParser_1 = __importDefault2(require_ENTimeUnitWithinFormatParser()); - var ENMonthNameLittleEndianParser_1 = __importDefault2(require_ENMonthNameLittleEndianParser()); - var ENMonthNameMiddleEndianParser_1 = __importDefault2(require_ENMonthNameMiddleEndianParser()); - var ENMonthNameParser_1 = __importDefault2(require_ENMonthNameParser()); - var ENCasualYearMonthDayParser_1 = __importDefault2(require_ENCasualYearMonthDayParser()); - var ENSlashMonthFormatParser_1 = __importDefault2(require_ENSlashMonthFormatParser()); - var ENTimeExpressionParser_1 = __importDefault2(require_ENTimeExpressionParser()); - var ENTimeUnitAgoFormatParser_1 = __importDefault2(require_ENTimeUnitAgoFormatParser()); - var ENTimeUnitLaterFormatParser_1 = __importDefault2(require_ENTimeUnitLaterFormatParser()); - var ENMergeDateRangeRefiner_1 = __importDefault2(require_ENMergeDateRangeRefiner()); - var ENMergeDateTimeRefiner_1 = __importDefault2(require_ENMergeDateTimeRefiner()); - var configurations_1 = require_configurations(); - var ENCasualDateParser_1 = __importDefault2(require_ENCasualDateParser()); - var ENCasualTimeParser_1 = __importDefault2(require_ENCasualTimeParser()); - var ENWeekdayParser_1 = __importDefault2(require_ENWeekdayParser()); - var ENRelativeDateFormatParser_1 = __importDefault2(require_ENRelativeDateFormatParser()); - var chrono_1 = require_chrono(); - var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); - var ENTimeUnitCasualRelativeFormatParser_1 = __importDefault2(require_ENTimeUnitCasualRelativeFormatParser()); - var ENMergeRelativeDateRefiner_1 = __importDefault2(require_ENMergeRelativeDateRefiner()); - exports.casual = new chrono_1.Chrono(createCasualConfiguration(false)); - exports.strict = new chrono_1.Chrono(createConfiguration(true, false)); - exports.GB = new chrono_1.Chrono(createConfiguration(false, true)); - function parse(text2, ref, option) { - return exports.casual.parse(text2, ref, option); - } - exports.parse = parse; - function parseDate3(text2, ref, option) { - return exports.casual.parseDate(text2, ref, option); - } - exports.parseDate = parseDate3; - function createCasualConfiguration(littleEndian = false) { - const option = createConfiguration(false, littleEndian); - option.parsers.unshift(new ENCasualDateParser_1.default()); - option.parsers.unshift(new ENCasualTimeParser_1.default()); - option.parsers.unshift(new ENMonthNameParser_1.default()); - option.parsers.unshift(new ENRelativeDateFormatParser_1.default()); - option.parsers.unshift(new ENTimeUnitCasualRelativeFormatParser_1.default()); - return option; - } - exports.createCasualConfiguration = createCasualConfiguration; - function createConfiguration(strictMode = true, littleEndian = false) { - return configurations_1.includeCommonConfiguration({ - parsers: [ - new SlashDateFormatParser_1.default(littleEndian), - new ENTimeUnitWithinFormatParser_1.default(), - new ENMonthNameLittleEndianParser_1.default(), - new ENMonthNameMiddleEndianParser_1.default(), - new ENWeekdayParser_1.default(), - new ENCasualYearMonthDayParser_1.default(), - new ENSlashMonthFormatParser_1.default(), - new ENTimeExpressionParser_1.default(strictMode), - new ENTimeUnitAgoFormatParser_1.default(strictMode), - new ENTimeUnitLaterFormatParser_1.default(strictMode) - ], - refiners: [new ENMergeRelativeDateRefiner_1.default(), new ENMergeDateTimeRefiner_1.default(), new ENMergeDateRangeRefiner_1.default()] - }, strictMode); - } - exports.createConfiguration = createConfiguration; - } -}); - -// node_modules/chrono-node/dist/locales/de/parsers/DETimeExpressionParser.js -var require_DETimeExpressionParser = __commonJS({ - "node_modules/chrono-node/dist/locales/de/parsers/DETimeExpressionParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); - var DETimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { - primaryPrefix() { - return "(?:(?:um|von)\\s*)?"; - } - followingPhase() { - return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|bis)\\s*"; - } - extractPrimaryTimeComponents(context, match) { - if (match[0].match(/^\s*\d{4}\s*$/)) { - return null; - } - return super.extractPrimaryTimeComponents(context, match); - } - }; - exports.default = DETimeExpressionParser; - } -}); - -// node_modules/chrono-node/dist/locales/de/constants.js -var require_constants2 = __commonJS({ - "node_modules/chrono-node/dist/locales/de/constants.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; - var pattern_1 = require_pattern(); - var years_1 = require_years(); - exports.WEEKDAY_DICTIONARY = { - "sonntag": 0, - "so": 0, - "montag": 1, - "mo": 1, - "dienstag": 2, - "di": 2, - "mittwoch": 3, - "mi": 3, - "donnerstag": 4, - "do": 4, - "freitag": 5, - "fr": 5, - "samstag": 6, - "sa": 6 - }; - exports.MONTH_DICTIONARY = { - "januar": 1, - "j\xE4nner": 1, - "janner": 1, - "jan": 1, - "jan.": 1, - "februar": 2, - "feber": 2, - "feb": 2, - "feb.": 2, - "m\xE4rz": 3, - "maerz": 3, - "m\xE4r": 3, - "m\xE4r.": 3, - "mrz": 3, - "mrz.": 3, - "april": 4, - "apr": 4, - "apr.": 4, - "mai": 5, - "juni": 6, - "jun": 6, - "jun.": 6, - "juli": 7, - "jul": 7, - "jul.": 7, - "august": 8, - "aug": 8, - "aug.": 8, - "september": 9, - "sep": 9, - "sep.": 9, - "sept": 9, - "sept.": 9, - "oktober": 10, - "okt": 10, - "okt.": 10, - "november": 11, - "nov": 11, - "nov.": 11, - "dezember": 12, - "dez": 12, - "dez.": 12 - }; - exports.INTEGER_WORD_DICTIONARY = { - "eins": 1, - "eine": 1, - "einem": 1, - "einen": 1, - "einer": 1, - "zwei": 2, - "drei": 3, - "vier": 4, - "f\xFCnf": 5, - "fuenf": 5, - "sechs": 6, - "sieben": 7, - "acht": 8, - "neun": 9, - "zehn": 10, - "elf": 11, - "zw\xF6lf": 12, - "zwoelf": 12 - }; - exports.TIME_UNIT_DICTIONARY = { - sek: "second", - sekunde: "second", - sekunden: "second", - min: "minute", - minute: "minute", - minuten: "minute", - h: "hour", - std: "hour", - stunde: "hour", - stunden: "hour", - tag: "d", - tage: "d", - tagen: "d", - woche: "week", - wochen: "week", - monat: "month", - monate: "month", - monaten: "month", - monats: "month", - quartal: "quarter", - quartals: "quarter", - quartale: "quarter", - quartalen: "quarter", - a: "year", - j: "year", - jr: "year", - jahr: "year", - jahre: "year", - jahren: "year", - jahres: "year" - }; - exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?\\b(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`; - function parseNumberPattern(match) { - const num = match.toLowerCase(); - if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { - return exports.INTEGER_WORD_DICTIONARY[num]; - } else if (num === "a" || num === "an") { - return 1; - } else if (num.match(/few/)) { - return 3; - } else if (num.match(/half/)) { - return 0.5; - } else if (num.match(/couple/)) { - return 2; - } else if (num.match(/several/)) { - return 7; - } - return parseFloat(num); - } - exports.parseNumberPattern = parseNumberPattern; - exports.YEAR_PATTERN = `(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*(?:C(?:hr)?|(?:u\\.?|d\\.?(?:\\s*g\\.?)?)?\\s*Z)\\.?|\\s*(?:u\\.?|d\\.?(?:\\s*g\\.)?)\\s*Z\\.?)?)`; - function parseYear(match) { - if (/v/i.test(match)) { - return -parseInt(match.replace(/[^0-9]+/gi, "")); - } - if (/n/i.test(match)) { - return parseInt(match.replace(/[^0-9]+/gi, "")); - } - if (/z/i.test(match)) { - return parseInt(match.replace(/[^0-9]+/gi, "")); - } - const rawYearNumber = parseInt(match); - return years_1.findMostLikelyADYear(rawYearNumber); - } - exports.parseYear = parseYear; - var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; - var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); - exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN); - function parseTimeUnits(timeunitText) { - const fragments = {}; - let remainingText = timeunitText; - let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - while (match) { - collectDateTimeFragment(fragments, match); - remainingText = remainingText.substring(match[0].length); - match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - } - return fragments; - } - exports.parseTimeUnits = parseTimeUnits; - function collectDateTimeFragment(fragments, match) { - const num = parseNumberPattern(match[1]); - const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; - fragments[unit] = num; - } - } -}); - -// node_modules/chrono-node/dist/locales/de/parsers/DEWeekdayParser.js -var require_DEWeekdayParser = __commonJS({ - "node_modules/chrono-node/dist/locales/de/parsers/DEWeekdayParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants2(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var weeks_1 = require_weeks(); - var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:a[mn]\\s*?)?(?:(diese[mn]|letzte[mn]|n(?:\xE4|ae)chste[mn])\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(diese|letzte|n(?:\xE4|ae)chste)\\s*woche)?(?=\\W|$)`, "i"); - var PREFIX_GROUP = 1; - var SUFFIX_GROUP = 3; - var WEEKDAY_GROUP = 2; - var DEWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); - const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; - const prefix = match[PREFIX_GROUP]; - const postfix = match[SUFFIX_GROUP]; - let modifierWord = prefix || postfix; - modifierWord = modifierWord || ""; - modifierWord = modifierWord.toLowerCase(); - let modifier = null; - if (modifierWord.match(/letzte/)) { - modifier = "last"; - } else if (modifierWord.match(/chste/)) { - modifier = "next"; - } else if (modifierWord.match(/diese/)) { - modifier = "this"; - } - const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); - return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); - } - }; - exports.default = DEWeekdayParser; - } -}); - -// node_modules/chrono-node/dist/locales/de/parsers/DESpecificTimeExpressionParser.js -var require_DESpecificTimeExpressionParser = __commonJS({ - "node_modules/chrono-node/dist/locales/de/parsers/DESpecificTimeExpressionParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var index_1 = require_dist(); - var FIRST_REG_PATTERN = new RegExp("(^|\\s|T)(?:(?:um|von)\\s*)?(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s)?)?(?:\\s*Uhr)?(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?(?=\\W|$)", "i"); - var SECOND_REG_PATTERN = new RegExp("^\\s*(\\-|\\\u2013|\\~|\\\u301C|bis(?:\\s+um)?|\\?)\\s*(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s)?)?(?:\\s*Uhr)?(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?(?=\\W|$)", "i"); - var HOUR_GROUP = 2; - var MINUTE_GROUP = 3; - var SECOND_GROUP = 4; - var AM_PM_HOUR_GROUP = 5; - var DESpecificTimeExpressionParser = class { - pattern(context) { - return FIRST_REG_PATTERN; - } - extract(context, match) { - const result = context.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length)); - if (result.text.match(/^\d{4}$/)) { - match.index += match[0].length; - return null; - } - result.start = DESpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match); - if (!result.start) { - match.index += match[0].length; - return null; - } - const remainingText = context.text.substring(match.index + match[0].length); - const secondMatch = SECOND_REG_PATTERN.exec(remainingText); - if (secondMatch) { - result.end = DESpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch); - if (result.end) { - result.text += secondMatch[0]; - } - } - return result; - } - static extractTimeComponent(extractingComponents, match) { - let hour = 0; - let minute = 0; - let meridiem = null; - hour = parseInt(match[HOUR_GROUP]); - if (match[MINUTE_GROUP] != null) { - minute = parseInt(match[MINUTE_GROUP]); - } - if (minute >= 60 || hour > 24) { - return null; - } - if (hour >= 12) { - meridiem = index_1.Meridiem.PM; - } - if (match[AM_PM_HOUR_GROUP] != null) { - if (hour > 12) - return null; - const ampm = match[AM_PM_HOUR_GROUP].toLowerCase(); - if (ampm.match(/morgen|vormittag/)) { - meridiem = index_1.Meridiem.AM; - if (hour == 12) { - hour = 0; - } - } - if (ampm.match(/nachmittag|abend/)) { - meridiem = index_1.Meridiem.PM; - if (hour != 12) { - hour += 12; - } - } - if (ampm.match(/nacht/)) { - if (hour == 12) { - meridiem = index_1.Meridiem.AM; - hour = 0; - } else if (hour < 6) { - meridiem = index_1.Meridiem.AM; - } else { - meridiem = index_1.Meridiem.PM; - hour += 12; - } - } - } - extractingComponents.assign("hour", hour); - extractingComponents.assign("minute", minute); - if (meridiem !== null) { - extractingComponents.assign("meridiem", meridiem); - } else { - if (hour < 12) { - extractingComponents.imply("meridiem", index_1.Meridiem.AM); - } else { - extractingComponents.imply("meridiem", index_1.Meridiem.PM); - } - } - if (match[SECOND_GROUP] != null) { - const second = parseInt(match[SECOND_GROUP]); - if (second >= 60) - return null; - extractingComponents.assign("second", second); - } - return extractingComponents; - } - }; - exports.default = DESpecificTimeExpressionParser; - } -}); - -// node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateRangeRefiner.js -var require_DEMergeDateRangeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateRangeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); - var DEMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { - patternBetween() { - return /^\s*(bis(?:\s*(?:am|zum))?|-)\s*$/i; - } - }; - exports.default = DEMergeDateRangeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateTimeRefiner.js -var require_DEMergeDateTimeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateTimeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); - var DEMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return new RegExp("^\\s*(T|um|am|,|-)?\\s*$"); - } - }; - exports.default = DEMergeDateTimeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/de/parsers/DECasualTimeParser.js -var require_DECasualTimeParser = __commonJS({ - "node_modules/chrono-node/dist/locales/de/parsers/DECasualTimeParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var index_1 = require_dist(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var dayjs_2 = require_dayjs(); - var timeunits_1 = require_timeunits(); - var DECasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return /(diesen)?\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht)(?=\W|$)/i; - } - innerExtract(context, match) { - const targetDate = dayjs_1.default(context.refDate); - const timeKeywordPattern = match[2].toLowerCase(); - const component = context.createParsingComponents(); - dayjs_2.implySimilarTime(component, targetDate); - return DECasualTimeParser.extractTimeComponents(component, timeKeywordPattern); - } - static extractTimeComponents(component, timeKeywordPattern) { - switch (timeKeywordPattern) { - case "morgen": - component.imply("hour", 6); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", index_1.Meridiem.AM); - break; - case "vormittag": - component.imply("hour", 9); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", index_1.Meridiem.AM); - break; - case "mittag": - case "mittags": - component.imply("hour", 12); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", index_1.Meridiem.AM); - break; - case "nachmittag": - component.imply("hour", 15); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", index_1.Meridiem.PM); - break; - case "abend": - component.imply("hour", 18); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", index_1.Meridiem.PM); - break; - case "nacht": - component.imply("hour", 22); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", index_1.Meridiem.PM); - break; - case "mitternacht": - if (component.get("hour") > 1) { - component = timeunits_1.addImpliedTimeUnits(component, { "day": 1 }); - } - component.imply("hour", 0); - component.imply("minute", 0); - component.imply("second", 0); - component.imply("meridiem", index_1.Meridiem.AM); - break; - } - return component; - } - }; - exports.default = DECasualTimeParser; - } -}); - -// node_modules/chrono-node/dist/locales/de/parsers/DECasualDateParser.js -var require_DECasualDateParser = __commonJS({ - "node_modules/chrono-node/dist/locales/de/parsers/DECasualDateParser.js"(exports) { - "use strict"; - var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar2 = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding2(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var dayjs_2 = require_dayjs(); - var DECasualTimeParser_1 = __importDefault2(require_DECasualTimeParser()); - var references = __importStar2(require_casualReferences()); - var PATTERN = new RegExp(`(jetzt|heute|morgen|\xFCbermorgen|uebermorgen|gestern|vorgestern|letzte\\s*nacht)(?:\\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht))?(?=\\W|$)`, "i"); - var DATE_GROUP = 1; - var TIME_GROUP = 2; - var DECasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return PATTERN; - } - innerExtract(context, match) { - let targetDate = dayjs_1.default(context.refDate); - const dateKeyword = (match[DATE_GROUP] || "").toLowerCase(); - const timeKeyword = (match[TIME_GROUP] || "").toLowerCase(); - let component = context.createParsingComponents(); - switch (dateKeyword) { - case "jetzt": - component = references.now(context.reference); - break; - case "heute": - component = references.today(context.reference); - break; - case "morgen": - dayjs_2.assignTheNextDay(component, targetDate); - break; - case "\xFCbermorgen": - case "uebermorgen": - targetDate = targetDate.add(1, "day"); - dayjs_2.assignTheNextDay(component, targetDate); - break; - case "gestern": - targetDate = targetDate.add(-1, "day"); - dayjs_2.assignSimilarDate(component, targetDate); - dayjs_2.implySimilarTime(component, targetDate); - break; - case "vorgestern": - targetDate = targetDate.add(-2, "day"); - dayjs_2.assignSimilarDate(component, targetDate); - dayjs_2.implySimilarTime(component, targetDate); - break; - default: - if (dateKeyword.match(/letzte\s*nacht/)) { - if (targetDate.hour() > 6) { - targetDate = targetDate.add(-1, "day"); - } - dayjs_2.assignSimilarDate(component, targetDate); - component.imply("hour", 0); - } - break; - } - if (timeKeyword) { - component = DECasualTimeParser_1.default.extractTimeComponents(component, timeKeyword); - } - return component; - } - }; - exports.default = DECasualDateParser; - } -}); - -// node_modules/chrono-node/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js -var require_DEMonthNameLittleEndianParser = __commonJS({ - "node_modules/chrono-node/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var years_1 = require_years(); - var constants_1 = require_constants2(); - var constants_2 = require_constants2(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`(?:am\\s*?)?(?:den\\s*?)?([0-9]{1,2})\\.(?:\\s*(?:bis(?:\\s*(?:am|zum))?|\\-|\\\u2013|\\s)\\s*([0-9]{1,2})\\.?)?\\s*(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); - var DATE_GROUP = 1; - var DATE_TO_GROUP = 2; - var MONTH_NAME_GROUP = 3; - var YEAR_GROUP = 4; - var DEMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = parseInt(match[DATE_GROUP]); - if (day > 31) { - match.index = match.index + match[DATE_GROUP].length; - return null; - } - result.start.assign("month", month); - result.start.assign("day", day); - if (match[YEAR_GROUP]) { - const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); - result.start.assign("year", yearNumber); - } else { - const year = years_1.findYearClosestToRef(context.refDate, day, month); - result.start.imply("year", year); - } - if (match[DATE_TO_GROUP]) { - const endDate = parseInt(match[DATE_TO_GROUP]); - result.end = result.start.clone(); - result.end.assign("day", endDate); - } - return result; - } - }; - exports.default = DEMonthNameLittleEndianParser; - } -}); - -// node_modules/chrono-node/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.js -var require_DETimeUnitRelativeFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/de/parsers/DETimeUnitRelativeFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants2(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var timeunits_1 = require_timeunits(); - var pattern_1 = require_pattern(); - var DETimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - constructor() { - super(); - } - innerPattern() { - return new RegExp(`(?:\\s*((?:n\xE4chste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?|vor|in)\\s*)?(${constants_1.NUMBER_PATTERN})?(?:\\s*(n\xE4chste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?)?\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})`, "i"); - } - innerExtract(context, match) { - const num = match[2] ? constants_1.parseNumberPattern(match[2]) : 1; - const unit = constants_1.TIME_UNIT_DICTIONARY[match[4].toLowerCase()]; - let timeUnits = {}; - timeUnits[unit] = num; - let modifier = match[1] || match[3] || ""; - modifier = modifier.toLowerCase(); - if (!modifier) { - return; - } - if (/vor/.test(modifier) || /letzte/.test(modifier) || /vergangen/.test(modifier)) { - timeUnits = timeunits_1.reverseTimeUnits(timeUnits); - } - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - }; - exports.default = DETimeUnitAgoFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/de/index.js -var require_de = __commonJS({ - "node_modules/chrono-node/dist/locales/de/index.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; - var configurations_1 = require_configurations(); - var chrono_1 = require_chrono(); - var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); - var ISOFormatParser_1 = __importDefault2(require_ISOFormatParser()); - var DETimeExpressionParser_1 = __importDefault2(require_DETimeExpressionParser()); - var DEWeekdayParser_1 = __importDefault2(require_DEWeekdayParser()); - var DESpecificTimeExpressionParser_1 = __importDefault2(require_DESpecificTimeExpressionParser()); - var DEMergeDateRangeRefiner_1 = __importDefault2(require_DEMergeDateRangeRefiner()); - var DEMergeDateTimeRefiner_1 = __importDefault2(require_DEMergeDateTimeRefiner()); - var DECasualDateParser_1 = __importDefault2(require_DECasualDateParser()); - var DECasualTimeParser_1 = __importDefault2(require_DECasualTimeParser()); - var DEMonthNameLittleEndianParser_1 = __importDefault2(require_DEMonthNameLittleEndianParser()); - var DETimeUnitRelativeFormatParser_1 = __importDefault2(require_DETimeUnitRelativeFormatParser()); - exports.casual = new chrono_1.Chrono(createCasualConfiguration()); - exports.strict = new chrono_1.Chrono(createConfiguration(true)); - function parse(text2, ref, option) { - return exports.casual.parse(text2, ref, option); - } - exports.parse = parse; - function parseDate3(text2, ref, option) { - return exports.casual.parseDate(text2, ref, option); - } - exports.parseDate = parseDate3; - function createCasualConfiguration(littleEndian = true) { - const option = createConfiguration(false, littleEndian); - option.parsers.unshift(new DECasualTimeParser_1.default()); - option.parsers.unshift(new DECasualDateParser_1.default()); - option.parsers.unshift(new DETimeUnitRelativeFormatParser_1.default()); - return option; - } - exports.createCasualConfiguration = createCasualConfiguration; - function createConfiguration(strictMode = true, littleEndian = true) { - return configurations_1.includeCommonConfiguration({ - parsers: [ - new ISOFormatParser_1.default(), - new SlashDateFormatParser_1.default(littleEndian), - new DETimeExpressionParser_1.default(), - new DESpecificTimeExpressionParser_1.default(), - new DEMonthNameLittleEndianParser_1.default(), - new DEWeekdayParser_1.default() - ], - refiners: [new DEMergeDateRangeRefiner_1.default(), new DEMergeDateTimeRefiner_1.default()] - }, strictMode); - } - exports.createConfiguration = createConfiguration; - } -}); - -// node_modules/chrono-node/dist/locales/fr/parsers/FRCasualDateParser.js -var require_FRCasualDateParser = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/parsers/FRCasualDateParser.js"(exports) { - "use strict"; - var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar2 = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding2(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var index_1 = require_dist(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var dayjs_2 = require_dayjs(); - var references = __importStar2(require_casualReferences()); - var FRCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return /(maintenant|aujourd'hui|demain|hier|cette\s*nuit|la\s*veille)(?=\W|$)/i; - } - innerExtract(context, match) { - let targetDate = dayjs_1.default(context.refDate); - const lowerText = match[0].toLowerCase(); - const component = context.createParsingComponents(); - switch (lowerText) { - case "maintenant": - return references.now(context.reference); - case "aujourd'hui": - return references.today(context.reference); - case "hier": - return references.yesterday(context.reference); - case "demain": - return references.tomorrow(context.reference); - default: - if (lowerText.match(/cette\s*nuit/)) { - dayjs_2.assignSimilarDate(component, targetDate); - component.imply("hour", 22); - component.imply("meridiem", index_1.Meridiem.PM); - } else if (lowerText.match(/la\s*veille/)) { - targetDate = targetDate.add(-1, "day"); - dayjs_2.assignSimilarDate(component, targetDate); - component.imply("hour", 0); - } - } - return component; - } - }; - exports.default = FRCasualDateParser; - } -}); - -// node_modules/chrono-node/dist/locales/fr/parsers/FRCasualTimeParser.js -var require_FRCasualTimeParser = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/parsers/FRCasualTimeParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var index_1 = require_dist(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var FRCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return /(cet?)?\s*(matin|soir|après-midi|aprem|a midi|à minuit)(?=\W|$)/i; - } - innerExtract(context, match) { - const suffixLower = match[2].toLowerCase(); - const component = context.createParsingComponents(); - switch (suffixLower) { - case "apr\xE8s-midi": - case "aprem": - component.imply("hour", 14); - component.imply("minute", 0); - component.imply("meridiem", index_1.Meridiem.PM); - break; - case "soir": - component.imply("hour", 18); - component.imply("minute", 0); - component.imply("meridiem", index_1.Meridiem.PM); - break; - case "matin": - component.imply("hour", 8); - component.imply("minute", 0); - component.imply("meridiem", index_1.Meridiem.AM); - break; - case "a midi": - component.imply("hour", 12); - component.imply("minute", 0); - component.imply("meridiem", index_1.Meridiem.AM); - break; - case "\xE0 minuit": - component.imply("hour", 0); - component.imply("meridiem", index_1.Meridiem.AM); - break; - } - return component; - } - }; - exports.default = FRCasualTimeParser; - } -}); - -// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeExpressionParser.js -var require_FRTimeExpressionParser = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeExpressionParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); - var FRTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { - primaryPrefix() { - return "(?:(?:[\xE0a])\\s*)?"; - } - followingPhase() { - return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|[\xE0a]|\\?)\\s*"; - } - extractPrimaryTimeComponents(context, match) { - if (match[0].match(/^\s*\d{4}\s*$/)) { - return null; - } - return super.extractPrimaryTimeComponents(context, match); - } - }; - exports.default = FRTimeExpressionParser; - } -}); - -// node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js -var require_FRMergeDateTimeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); - var FRMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return new RegExp("^\\s*(T|\xE0|a|vers|de|,|-)?\\s*$"); - } - }; - exports.default = FRMergeDateTimeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js -var require_FRMergeDateRangeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); - var FRMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { - patternBetween() { - return /^\s*(à|a|-)\s*$/i; - } - }; - exports.default = FRMergeDateRangeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/fr/constants.js -var require_constants3 = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/constants.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; - var pattern_1 = require_pattern(); - exports.WEEKDAY_DICTIONARY = { - "dimanche": 0, - "dim": 0, - "lundi": 1, - "lun": 1, - "mardi": 2, - "mar": 2, - "mercredi": 3, - "mer": 3, - "jeudi": 4, - "jeu": 4, - "vendredi": 5, - "ven": 5, - "samedi": 6, - "sam": 6 - }; - exports.MONTH_DICTIONARY = { - "janvier": 1, - "jan": 1, - "jan.": 1, - "f\xE9vrier": 2, - "f\xE9v": 2, - "f\xE9v.": 2, - "fevrier": 2, - "fev": 2, - "fev.": 2, - "mars": 3, - "mar": 3, - "mar.": 3, - "avril": 4, - "avr": 4, - "avr.": 4, - "mai": 5, - "juin": 6, - "jun": 6, - "juillet": 7, - "juil": 7, - "jul": 7, - "jul.": 7, - "ao\xFBt": 8, - "aout": 8, - "septembre": 9, - "sep": 9, - "sep.": 9, - "sept": 9, - "sept.": 9, - "octobre": 10, - "oct": 10, - "oct.": 10, - "novembre": 11, - "nov": 11, - "nov.": 11, - "d\xE9cembre": 12, - "decembre": 12, - "dec": 12, - "dec.": 12 - }; - exports.INTEGER_WORD_DICTIONARY = { - "un": 1, - "deux": 2, - "trois": 3, - "quatre": 4, - "cinq": 5, - "six": 6, - "sept": 7, - "huit": 8, - "neuf": 9, - "dix": 10, - "onze": 11, - "douze": 12, - "treize": 13 - }; - exports.TIME_UNIT_DICTIONARY = { - "sec": "second", - "seconde": "second", - "secondes": "second", - "min": "minute", - "mins": "minute", - "minute": "minute", - "minutes": "minute", - "h": "hour", - "hr": "hour", - "hrs": "hour", - "heure": "hour", - "heures": "hour", - "jour": "d", - "jours": "d", - "semaine": "week", - "semaines": "week", - "mois": "month", - "trimestre": "quarter", - "trimestres": "quarter", - "ans": "year", - "ann\xE9e": "year", - "ann\xE9es": "year" - }; - exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|une?\\b|quelques?|demi-?)`; - function parseNumberPattern(match) { - const num = match.toLowerCase(); - if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { - return exports.INTEGER_WORD_DICTIONARY[num]; - } else if (num === "une" || num === "un") { - return 1; - } else if (num.match(/quelques?/)) { - return 3; - } else if (num.match(/demi-?/)) { - return 0.5; - } - return parseFloat(num); - } - exports.parseNumberPattern = parseNumberPattern; - exports.ORDINAL_NUMBER_PATTERN = `(?:[0-9]{1,2}(?:er)?)`; - function parseOrdinalNumberPattern(match) { - let num = match.toLowerCase(); - num = num.replace(/(?:er)$/i, ""); - return parseInt(num); - } - exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; - exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:AC|AD|p\\.\\s*C(?:hr?)?\\.\\s*n\\.)|[1-2][0-9]{3}|[5-9][0-9])`; - function parseYear(match) { - if (/AC/i.test(match)) { - match = match.replace(/BC/i, ""); - return -parseInt(match); - } - if (/AD/i.test(match) || /C/i.test(match)) { - match = match.replace(/[^\d]+/i, ""); - return parseInt(match); - } - let yearNumber = parseInt(match); - if (yearNumber < 100) { - if (yearNumber > 50) { - yearNumber = yearNumber + 1900; - } else { - yearNumber = yearNumber + 2e3; - } - } - return yearNumber; - } - exports.parseYear = parseYear; - var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; - var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); - exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN); - function parseTimeUnits(timeunitText) { - const fragments = {}; - let remainingText = timeunitText; - let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - while (match) { - collectDateTimeFragment(fragments, match); - remainingText = remainingText.substring(match[0].length); - match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - } - return fragments; - } - exports.parseTimeUnits = parseTimeUnits; - function collectDateTimeFragment(fragments, match) { - const num = parseNumberPattern(match[1]); - const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; - fragments[unit] = num; - } - } -}); - -// node_modules/chrono-node/dist/locales/fr/parsers/FRWeekdayParser.js -var require_FRWeekdayParser = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/parsers/FRWeekdayParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants3(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var weeks_1 = require_weeks(); - var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:(?:ce)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(dernier|prochain)\\s*)?(?=\\W|\\d|$)`, "i"); - var WEEKDAY_GROUP = 1; - var POSTFIX_GROUP = 2; - var FRWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); - const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; - if (offset === void 0) { - return null; - } - let suffix = match[POSTFIX_GROUP]; - suffix = suffix || ""; - suffix = suffix.toLowerCase(); - let modifier = null; - if (suffix == "dernier") { - modifier = "last"; - } else if (suffix == "prochain") { - modifier = "next"; - } - const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); - return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); - } - }; - exports.default = FRWeekdayParser; - } -}); - -// node_modules/chrono-node/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js -var require_FRSpecificTimeExpressionParser = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var index_1 = require_dist(); - var FIRST_REG_PATTERN = new RegExp("(^|\\s|T)(?:(?:[\xE0a])\\s*)?(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s|:)?)?(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?(?=\\W|$)", "i"); - var SECOND_REG_PATTERN = new RegExp("^\\s*(\\-|\\\u2013|\\~|\\\u301C|[\xE0a]|\\?)\\s*(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s|:)?)?(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?(?=\\W|$)", "i"); - var HOUR_GROUP = 2; - var MINUTE_GROUP = 3; - var SECOND_GROUP = 4; - var AM_PM_HOUR_GROUP = 5; - var FRSpecificTimeExpressionParser = class { - pattern(context) { - return FIRST_REG_PATTERN; - } - extract(context, match) { - const result = context.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length)); - if (result.text.match(/^\d{4}$/)) { - match.index += match[0].length; - return null; - } - result.start = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match); - if (!result.start) { - match.index += match[0].length; - return null; - } - const remainingText = context.text.substring(match.index + match[0].length); - const secondMatch = SECOND_REG_PATTERN.exec(remainingText); - if (secondMatch) { - result.end = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch); - if (result.end) { - result.text += secondMatch[0]; - } - } - return result; - } - static extractTimeComponent(extractingComponents, match) { - let hour = 0; - let minute = 0; - let meridiem = null; - hour = parseInt(match[HOUR_GROUP]); - if (match[MINUTE_GROUP] != null) { - minute = parseInt(match[MINUTE_GROUP]); - } - if (minute >= 60 || hour > 24) { - return null; - } - if (hour >= 12) { - meridiem = index_1.Meridiem.PM; - } - if (match[AM_PM_HOUR_GROUP] != null) { - if (hour > 12) - return null; - const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); - if (ampm == "a") { - meridiem = index_1.Meridiem.AM; - if (hour == 12) { - hour = 0; - } - } - if (ampm == "p") { - meridiem = index_1.Meridiem.PM; - if (hour != 12) { - hour += 12; - } - } - } - extractingComponents.assign("hour", hour); - extractingComponents.assign("minute", minute); - if (meridiem !== null) { - extractingComponents.assign("meridiem", meridiem); - } else { - if (hour < 12) { - extractingComponents.imply("meridiem", index_1.Meridiem.AM); - } else { - extractingComponents.imply("meridiem", index_1.Meridiem.PM); - } - } - if (match[SECOND_GROUP] != null) { - const second = parseInt(match[SECOND_GROUP]); - if (second >= 60) - return null; - extractingComponents.assign("second", second); - } - return extractingComponents; - } - }; - exports.default = FRSpecificTimeExpressionParser; - } -}); - -// node_modules/chrono-node/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js -var require_FRMonthNameLittleEndianParser = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var years_1 = require_years(); - var constants_1 = require_constants3(); - var constants_2 = require_constants3(); - var constants_3 = require_constants3(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`(?:on\\s*?)?(${constants_3.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:au|\\-|\\\u2013|jusqu'au?|\\s)\\s*(${constants_3.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:de)?\\s*)(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); - var DATE_GROUP = 1; - var DATE_TO_GROUP = 2; - var MONTH_NAME_GROUP = 3; - var YEAR_GROUP = 4; - var FRMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); - if (day > 31) { - match.index = match.index + match[DATE_GROUP].length; - return null; - } - result.start.assign("month", month); - result.start.assign("day", day); - if (match[YEAR_GROUP]) { - const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); - result.start.assign("year", yearNumber); - } else { - const year = years_1.findYearClosestToRef(context.refDate, day, month); - result.start.imply("year", year); - } - if (match[DATE_TO_GROUP]) { - const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); - result.end = result.start.clone(); - result.end.assign("day", endDate); - } - return result; - } - }; - exports.default = FRMonthNameLittleEndianParser; - } -}); - -// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js -var require_FRTimeUnitAgoFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants3(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var timeunits_1 = require_timeunits(); - var FRTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - constructor() { - super(); - } - innerPattern() { - return new RegExp(`il y a\\s*(${constants_1.TIME_UNITS_PATTERN})(?=(?:\\W|$))`, "i"); - } - innerExtract(context, match) { - const timeUnits = constants_1.parseTimeUnits(match[1]); - const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); - return results_1.ParsingComponents.createRelativeFromReference(context.reference, outputTimeUnits); - } - }; - exports.default = FRTimeUnitAgoFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js -var require_FRTimeUnitWithinFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants3(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var FRTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return new RegExp(`(?:dans|en|pour|pendant|de)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); - } - innerExtract(context, match) { - const timeUnits = constants_1.parseTimeUnits(match[1]); - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - }; - exports.default = FRTimeUnitWithinFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js -var require_FRTimeUnitRelativeFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants3(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var timeunits_1 = require_timeunits(); - var pattern_1 = require_pattern(); - var FRTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - constructor() { - super(); - } - innerPattern() { - return new RegExp(`(?:les?|la|l'|du|des?)\\s*(${constants_1.NUMBER_PATTERN})?(?:\\s*(prochaine?s?|derni[e\xE8]re?s?|pass[\xE9e]e?s?|pr[\xE9e]c[\xE9e]dents?|suivante?s?))?\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?:\\s*(prochaine?s?|derni[e\xE8]re?s?|pass[\xE9e]e?s?|pr[\xE9e]c[\xE9e]dents?|suivante?s?))?`, "i"); - } - innerExtract(context, match) { - const num = match[1] ? constants_1.parseNumberPattern(match[1]) : 1; - const unit = constants_1.TIME_UNIT_DICTIONARY[match[3].toLowerCase()]; - let timeUnits = {}; - timeUnits[unit] = num; - let modifier = match[2] || match[4] || ""; - modifier = modifier.toLowerCase(); - if (!modifier) { - return; - } - if (/derni[eè]re?s?/.test(modifier) || /pass[ée]e?s?/.test(modifier) || /pr[ée]c[ée]dents?/.test(modifier)) { - timeUnits = timeunits_1.reverseTimeUnits(timeUnits); - } - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - }; - exports.default = FRTimeUnitAgoFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/fr/index.js -var require_fr = __commonJS({ - "node_modules/chrono-node/dist/locales/fr/index.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; - var configurations_1 = require_configurations(); - var chrono_1 = require_chrono(); - var FRCasualDateParser_1 = __importDefault2(require_FRCasualDateParser()); - var FRCasualTimeParser_1 = __importDefault2(require_FRCasualTimeParser()); - var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); - var FRTimeExpressionParser_1 = __importDefault2(require_FRTimeExpressionParser()); - var FRMergeDateTimeRefiner_1 = __importDefault2(require_FRMergeDateTimeRefiner()); - var FRMergeDateRangeRefiner_1 = __importDefault2(require_FRMergeDateRangeRefiner()); - var FRWeekdayParser_1 = __importDefault2(require_FRWeekdayParser()); - var FRSpecificTimeExpressionParser_1 = __importDefault2(require_FRSpecificTimeExpressionParser()); - var FRMonthNameLittleEndianParser_1 = __importDefault2(require_FRMonthNameLittleEndianParser()); - var FRTimeUnitAgoFormatParser_1 = __importDefault2(require_FRTimeUnitAgoFormatParser()); - var FRTimeUnitWithinFormatParser_1 = __importDefault2(require_FRTimeUnitWithinFormatParser()); - var FRTimeUnitRelativeFormatParser_1 = __importDefault2(require_FRTimeUnitRelativeFormatParser()); - exports.casual = new chrono_1.Chrono(createCasualConfiguration()); - exports.strict = new chrono_1.Chrono(createConfiguration(true)); - function parse(text2, ref, option) { - return exports.casual.parse(text2, ref, option); - } - exports.parse = parse; - function parseDate3(text2, ref, option) { - return exports.casual.parseDate(text2, ref, option); - } - exports.parseDate = parseDate3; - function createCasualConfiguration(littleEndian = true) { - const option = createConfiguration(false, littleEndian); - option.parsers.unshift(new FRCasualDateParser_1.default()); - option.parsers.unshift(new FRCasualTimeParser_1.default()); - option.parsers.unshift(new FRTimeUnitRelativeFormatParser_1.default()); - return option; - } - exports.createCasualConfiguration = createCasualConfiguration; - function createConfiguration(strictMode = true, littleEndian = true) { - return configurations_1.includeCommonConfiguration({ - parsers: [ - new SlashDateFormatParser_1.default(littleEndian), - new FRMonthNameLittleEndianParser_1.default(), - new FRTimeExpressionParser_1.default(), - new FRSpecificTimeExpressionParser_1.default(), - new FRTimeUnitAgoFormatParser_1.default(), - new FRTimeUnitWithinFormatParser_1.default(), - new FRWeekdayParser_1.default() - ], - refiners: [new FRMergeDateTimeRefiner_1.default(), new FRMergeDateRangeRefiner_1.default()] - }, strictMode); - } - exports.createConfiguration = createConfiguration; - } -}); - -// node_modules/chrono-node/dist/locales/ja/constants.js -var require_constants4 = __commonJS({ - "node_modules/chrono-node/dist/locales/ja/constants.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.toHankaku = void 0; - function toHankaku(text2) { - return String(text2).replace(/\u2019/g, "'").replace(/\u201D/g, '"').replace(/\u3000/g, " ").replace(/\uFFE5/g, "\xA5").replace(/[\uFF01\uFF03-\uFF06\uFF08\uFF09\uFF0C-\uFF19\uFF1C-\uFF1F\uFF21-\uFF3B\uFF3D\uFF3F\uFF41-\uFF5B\uFF5D\uFF5E]/g, alphaNum); - } - exports.toHankaku = toHankaku; - function alphaNum(token) { - return String.fromCharCode(token.charCodeAt(0) - 65248); - } - } -}); - -// node_modules/chrono-node/dist/locales/ja/parsers/JPStandardParser.js -var require_JPStandardParser = __commonJS({ - "node_modules/chrono-node/dist/locales/ja/parsers/JPStandardParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants4(); - var years_1 = require_years(); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var PATTERN = /(?:(?:([同今本])|((昭和|平成|令和)?([0-90-9]{1,4}|元)))年\s*)?([0-90-9]{1,2})月\s*([0-90-9]{1,2})日/i; - var SPECIAL_YEAR_GROUP = 1; - var TYPICAL_YEAR_GROUP = 2; - var ERA_GROUP = 3; - var YEAR_NUMBER_GROUP = 4; - var MONTH_GROUP = 5; - var DAY_GROUP = 6; - var JPStandardParser = class { - pattern() { - return PATTERN; - } - extract(context, match) { - const month = parseInt(constants_1.toHankaku(match[MONTH_GROUP])); - const day = parseInt(constants_1.toHankaku(match[DAY_GROUP])); - const components = context.createParsingComponents({ - day, - month - }); - if (match[SPECIAL_YEAR_GROUP] && match[SPECIAL_YEAR_GROUP].match("\u540C|\u4ECA|\u672C")) { - const moment = dayjs_1.default(context.refDate); - components.assign("year", moment.year()); - } - if (match[TYPICAL_YEAR_GROUP]) { - const yearNumText = match[YEAR_NUMBER_GROUP]; - let year = yearNumText == "\u5143" ? 1 : parseInt(constants_1.toHankaku(yearNumText)); - if (match[ERA_GROUP] == "\u4EE4\u548C") { - year += 2018; - } else if (match[ERA_GROUP] == "\u5E73\u6210") { - year += 1988; - } else if (match[ERA_GROUP] == "\u662D\u548C") { - year += 1925; - } - components.assign("year", year); - } else { - const year = years_1.findYearClosestToRef(context.refDate, day, month); - components.imply("year", year); - } - return components; - } - }; - exports.default = JPStandardParser; - } -}); - -// node_modules/chrono-node/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js -var require_JPMergeDateRangeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); - var JPMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { - patternBetween() { - return /^\s*(から|ー|-)\s*$/i; - } - }; - exports.default = JPMergeDateRangeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/ja/parsers/JPCasualDateParser.js -var require_JPCasualDateParser = __commonJS({ - "node_modules/chrono-node/dist/locales/ja/parsers/JPCasualDateParser.js"(exports) { - "use strict"; - var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar2 = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding2(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var index_1 = require_dist(); - var references = __importStar2(require_casualReferences()); - var PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i; - var JPCasualDateParser = class { - pattern() { - return PATTERN; - } - extract(context, match) { - const text2 = match[0]; - const date = dayjs_1.default(context.refDate); - const components = context.createParsingComponents(); - switch (text2) { - case "\u6628\u65E5": - return references.yesterday(context.reference); - case "\u660E\u65E5": - return references.tomorrow(context.reference); - case "\u4ECA\u65E5": - case "\u5F53\u65E5": - return references.today(context.reference); - } - if (text2 == "\u4ECA\u591C" || text2 == "\u4ECA\u5915" || text2 == "\u4ECA\u6669") { - components.imply("hour", 22); - components.assign("meridiem", index_1.Meridiem.PM); - } else if (text2.match("\u4ECA\u671D")) { - components.imply("hour", 6); - components.assign("meridiem", index_1.Meridiem.AM); - } - components.assign("day", date.date()); - components.assign("month", date.month() + 1); - components.assign("year", date.year()); - return components; - } - }; - exports.default = JPCasualDateParser; - } -}); - -// node_modules/chrono-node/dist/locales/ja/index.js -var require_ja = __commonJS({ - "node_modules/chrono-node/dist/locales/ja/index.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; - var JPStandardParser_1 = __importDefault2(require_JPStandardParser()); - var JPMergeDateRangeRefiner_1 = __importDefault2(require_JPMergeDateRangeRefiner()); - var JPCasualDateParser_1 = __importDefault2(require_JPCasualDateParser()); - var chrono_1 = require_chrono(); - exports.casual = new chrono_1.Chrono(createCasualConfiguration()); - exports.strict = new chrono_1.Chrono(createConfiguration()); - function parse(text2, ref, option) { - return exports.casual.parse(text2, ref, option); - } - exports.parse = parse; - function parseDate3(text2, ref, option) { - return exports.casual.parseDate(text2, ref, option); - } - exports.parseDate = parseDate3; - function createCasualConfiguration() { - const option = createConfiguration(); - option.parsers.unshift(new JPCasualDateParser_1.default()); - return option; - } - exports.createCasualConfiguration = createCasualConfiguration; - function createConfiguration() { - return { - parsers: [new JPStandardParser_1.default()], - refiners: [new JPMergeDateRangeRefiner_1.default()] - }; - } - exports.createConfiguration = createConfiguration; - } -}); - -// node_modules/chrono-node/dist/locales/pt/constants.js -var require_constants5 = __commonJS({ - "node_modules/chrono-node/dist/locales/pt/constants.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.parseYear = exports.YEAR_PATTERN = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; - exports.WEEKDAY_DICTIONARY = { - "domingo": 0, - "dom": 0, - "segunda": 1, - "segunda-feira": 1, - "seg": 1, - "ter\xE7a": 2, - "ter\xE7a-feira": 2, - "ter": 2, - "quarta": 3, - "quarta-feira": 3, - "qua": 3, - "quinta": 4, - "quinta-feira": 4, - "qui": 4, - "sexta": 5, - "sexta-feira": 5, - "sex": 5, - "s\xE1bado": 6, - "sabado": 6, - "sab": 6 - }; - exports.MONTH_DICTIONARY = { - "janeiro": 1, - "jan": 1, - "jan.": 1, - "fevereiro": 2, - "fev": 2, - "fev.": 2, - "mar\xE7o": 3, - "mar": 3, - "mar.": 3, - "abril": 4, - "abr": 4, - "abr.": 4, - "maio": 5, - "mai": 5, - "mai.": 5, - "junho": 6, - "jun": 6, - "jun.": 6, - "julho": 7, - "jul": 7, - "jul.": 7, - "agosto": 8, - "ago": 8, - "ago.": 8, - "setembro": 9, - "set": 9, - "set.": 9, - "outubro": 10, - "out": 10, - "out.": 10, - "novembro": 11, - "nov": 11, - "nov.": 11, - "dezembro": 12, - "dez": 12, - "dez.": 12 - }; - exports.YEAR_PATTERN = "[0-9]{1,4}(?![^\\s]\\d)(?:\\s*[a|d]\\.?\\s*c\\.?|\\s*a\\.?\\s*d\\.?)?"; - function parseYear(match) { - if (match.match(/^[0-9]{1,4}$/)) { - let yearNumber = parseInt(match); - if (yearNumber < 100) { - if (yearNumber > 50) { - yearNumber = yearNumber + 1900; - } else { - yearNumber = yearNumber + 2e3; - } - } - return yearNumber; - } - if (match.match(/a\.?\s*c\.?/i)) { - match = match.replace(/a\.?\s*c\.?/i, ""); - return -parseInt(match); - } - return parseInt(match); - } - exports.parseYear = parseYear; - } -}); - -// node_modules/chrono-node/dist/locales/pt/parsers/PTWeekdayParser.js -var require_PTWeekdayParser = __commonJS({ - "node_modules/chrono-node/dist/locales/pt/parsers/PTWeekdayParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants5(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var weeks_1 = require_weeks(); - var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:(este|esta|passado|pr[o\xF3]ximo)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(este|esta|passado|pr[\xF3o]ximo)\\s*semana)?(?=\\W|\\d|$)`, "i"); - var PREFIX_GROUP = 1; - var WEEKDAY_GROUP = 2; - var POSTFIX_GROUP = 3; - var PTWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); - const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; - if (offset === void 0) { - return null; - } - const prefix = match[PREFIX_GROUP]; - const postfix = match[POSTFIX_GROUP]; - let norm = prefix || postfix || ""; - norm = norm.toLowerCase(); - let modifier = null; - if (norm == "passado") { - modifier = "this"; - } else if (norm == "pr\xF3ximo" || norm == "proximo") { - modifier = "next"; - } else if (norm == "este") { - modifier = "this"; - } - const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); - return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); - } - }; - exports.default = PTWeekdayParser; - } -}); - -// node_modules/chrono-node/dist/locales/pt/parsers/PTTimeExpressionParser.js -var require_PTTimeExpressionParser = __commonJS({ - "node_modules/chrono-node/dist/locales/pt/parsers/PTTimeExpressionParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); - var PTTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { - primaryPrefix() { - return "(?:(?:ao?|\xE0s?|das|da|de|do)\\s*)?"; - } - followingPhase() { - return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|a(?:o)?|\\?)\\s*"; - } - }; - exports.default = PTTimeExpressionParser; - } -}); - -// node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js -var require_PTMergeDateTimeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); - var PTMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return new RegExp("^\\s*(?:,|\xE0)?\\s*$"); - } - }; - exports.default = PTMergeDateTimeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js -var require_PTMergeDateRangeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); - var PTMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { - patternBetween() { - return /^\s*(?:-)\s*$/i; - } - }; - exports.default = PTMergeDateRangeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js -var require_PTMonthNameLittleEndianParser = __commonJS({ - "node_modules/chrono-node/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var years_1 = require_years(); - var constants_1 = require_constants5(); - var constants_2 = require_constants5(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`([0-9]{1,2})(?:\xBA|\xAA|\xB0)?(?:\\s*(?:desde|de|\\-|\\\u2013|ao?|\\s)\\s*([0-9]{1,2})(?:\xBA|\xAA|\xB0)?)?\\s*(?:de)?\\s*(?:-|/|\\s*(?:de|,)?\\s*)(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:\\s*(?:de|,)?\\s*(${constants_2.YEAR_PATTERN}))?(?=\\W|$)`, "i"); - var DATE_GROUP = 1; - var DATE_TO_GROUP = 2; - var MONTH_NAME_GROUP = 3; - var YEAR_GROUP = 4; - var PTMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = parseInt(match[DATE_GROUP]); - if (day > 31) { - match.index = match.index + match[DATE_GROUP].length; - return null; - } - result.start.assign("month", month); - result.start.assign("day", day); - if (match[YEAR_GROUP]) { - const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); - result.start.assign("year", yearNumber); - } else { - const year = years_1.findYearClosestToRef(context.refDate, day, month); - result.start.imply("year", year); - } - if (match[DATE_TO_GROUP]) { - const endDate = parseInt(match[DATE_TO_GROUP]); - result.end = result.start.clone(); - result.end.assign("day", endDate); - } - return result; - } - }; - exports.default = PTMonthNameLittleEndianParser; - } -}); - -// node_modules/chrono-node/dist/locales/pt/parsers/PTCasualDateParser.js -var require_PTCasualDateParser = __commonJS({ - "node_modules/chrono-node/dist/locales/pt/parsers/PTCasualDateParser.js"(exports) { - "use strict"; - var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar2 = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding2(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var references = __importStar2(require_casualReferences()); - var PTCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return /(agora|hoje|amanha|amanhã|ontem)(?=\W|$)/i; - } - innerExtract(context, match) { - const lowerText = match[0].toLowerCase(); - const component = context.createParsingComponents(); - switch (lowerText) { - case "agora": - return references.now(context.reference); - case "hoje": - return references.today(context.reference); - case "amanha": - case "amanh\xE3": - return references.tomorrow(context.reference); - case "ontem": - return references.yesterday(context.reference); - } - return component; - } - }; - exports.default = PTCasualDateParser; - } -}); - -// node_modules/chrono-node/dist/locales/pt/parsers/PTCasualTimeParser.js -var require_PTCasualTimeParser = __commonJS({ - "node_modules/chrono-node/dist/locales/pt/parsers/PTCasualTimeParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var index_1 = require_dist(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var dayjs_1 = require_dayjs(); - var dayjs_2 = __importDefault2(require_dayjs_min()); - var PTCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return /(?:esta\s*)?(manha|manhã|tarde|meia-noite|meio-dia|noite)(?=\W|$)/i; - } - innerExtract(context, match) { - const targetDate = dayjs_2.default(context.refDate); - const component = context.createParsingComponents(); - switch (match[1].toLowerCase()) { - case "tarde": - component.imply("meridiem", index_1.Meridiem.PM); - component.imply("hour", 15); - break; - case "noite": - component.imply("meridiem", index_1.Meridiem.PM); - component.imply("hour", 22); - break; - case "manha": - case "manh\xE3": - component.imply("meridiem", index_1.Meridiem.AM); - component.imply("hour", 6); - break; - case "meia-noite": - dayjs_1.assignTheNextDay(component, targetDate); - component.imply("hour", 0); - component.imply("minute", 0); - component.imply("second", 0); - break; - case "meio-dia": - component.imply("meridiem", index_1.Meridiem.AM); - component.imply("hour", 12); - break; - } - return component; - } - }; - exports.default = PTCasualTimeParser; - } -}); - -// node_modules/chrono-node/dist/locales/pt/index.js -var require_pt = __commonJS({ - "node_modules/chrono-node/dist/locales/pt/index.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; - var configurations_1 = require_configurations(); - var chrono_1 = require_chrono(); - var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); - var PTWeekdayParser_1 = __importDefault2(require_PTWeekdayParser()); - var PTTimeExpressionParser_1 = __importDefault2(require_PTTimeExpressionParser()); - var PTMergeDateTimeRefiner_1 = __importDefault2(require_PTMergeDateTimeRefiner()); - var PTMergeDateRangeRefiner_1 = __importDefault2(require_PTMergeDateRangeRefiner()); - var PTMonthNameLittleEndianParser_1 = __importDefault2(require_PTMonthNameLittleEndianParser()); - var PTCasualDateParser_1 = __importDefault2(require_PTCasualDateParser()); - var PTCasualTimeParser_1 = __importDefault2(require_PTCasualTimeParser()); - exports.casual = new chrono_1.Chrono(createCasualConfiguration()); - exports.strict = new chrono_1.Chrono(createConfiguration(true)); - function parse(text2, ref, option) { - return exports.casual.parse(text2, ref, option); - } - exports.parse = parse; - function parseDate3(text2, ref, option) { - return exports.casual.parseDate(text2, ref, option); - } - exports.parseDate = parseDate3; - function createCasualConfiguration(littleEndian = true) { - const option = createConfiguration(false, littleEndian); - option.parsers.push(new PTCasualDateParser_1.default()); - option.parsers.push(new PTCasualTimeParser_1.default()); - return option; - } - exports.createCasualConfiguration = createCasualConfiguration; - function createConfiguration(strictMode = true, littleEndian = true) { - return configurations_1.includeCommonConfiguration({ - parsers: [ - new SlashDateFormatParser_1.default(littleEndian), - new PTWeekdayParser_1.default(), - new PTTimeExpressionParser_1.default(), - new PTMonthNameLittleEndianParser_1.default() - ], - refiners: [new PTMergeDateTimeRefiner_1.default(), new PTMergeDateRangeRefiner_1.default()] - }, strictMode); - } - exports.createConfiguration = createConfiguration; - } -}); - -// node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js -var require_NLMergeDateRangeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); - var NLMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { - patternBetween() { - return /^\s*(tot|-)\s*$/i; - } - }; - exports.default = NLMergeDateRangeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js -var require_NLMergeDateTimeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); - var NLMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return new RegExp("^\\s*(om|na|voor|in de|,|-)?\\s*$"); - } - }; - exports.default = NLMergeDateTimeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateParser.js -var require_NLCasualDateParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateParser.js"(exports) { - "use strict"; - var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar2 = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding2(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var references = __importStar2(require_casualReferences()); - var NLCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return /(nu|vandaag|morgen|morgend|gisteren)(?=\W|$)/i; - } - innerExtract(context, match) { - const lowerText = match[0].toLowerCase(); - const component = context.createParsingComponents(); - switch (lowerText) { - case "nu": - return references.now(context.reference); - case "vandaag": - return references.today(context.reference); - case "morgen": - case "morgend": - return references.tomorrow(context.reference); - case "gisteren": - return references.yesterday(context.reference); - } - return component; - } - }; - exports.default = NLCasualDateParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualTimeParser.js -var require_NLCasualTimeParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualTimeParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var index_1 = require_dist(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var dayjs_2 = require_dayjs(); - var DAY_GROUP = 1; - var MOMENT_GROUP = 2; - var NLCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return /(deze)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i; - } - innerExtract(context, match) { - const targetDate = dayjs_1.default(context.refDate); - const component = context.createParsingComponents(); - if (match[DAY_GROUP] === "deze") { - component.assign("day", context.refDate.getDate()); - component.assign("month", context.refDate.getMonth() + 1); - component.assign("year", context.refDate.getFullYear()); - } - switch (match[MOMENT_GROUP].toLowerCase()) { - case "namiddag": - case "'s namiddags": - component.imply("meridiem", index_1.Meridiem.PM); - component.imply("hour", 15); - break; - case "avond": - case "'s avonds'": - component.imply("meridiem", index_1.Meridiem.PM); - component.imply("hour", 20); - break; - case "middernacht": - dayjs_2.assignTheNextDay(component, targetDate); - component.imply("hour", 0); - component.imply("minute", 0); - component.imply("second", 0); - break; - case "ochtend": - case "'s ochtends": - component.imply("meridiem", index_1.Meridiem.AM); - component.imply("hour", 6); - break; - case "middag": - case "'s middags": - component.imply("meridiem", index_1.Meridiem.AM); - component.imply("hour", 12); - break; - } - return component; - } - }; - exports.default = NLCasualTimeParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/constants.js -var require_constants6 = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/constants.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0; - var pattern_1 = require_pattern(); - var years_1 = require_years(); - exports.WEEKDAY_DICTIONARY = { - zondag: 0, - zon: 0, - "zon.": 0, - zo: 0, - "zo.": 0, - maandag: 1, - ma: 1, - "ma.": 1, - dinsdag: 2, - din: 2, - "din.": 2, - di: 2, - "di.": 2, - woensdag: 3, - woe: 3, - "woe.": 3, - wo: 3, - "wo.": 3, - donderdag: 4, - dond: 4, - "dond.": 4, - do: 4, - "do.": 4, - vrijdag: 5, - vrij: 5, - "vrij.": 5, - vr: 5, - "vr.": 5, - zaterdag: 6, - zat: 6, - "zat.": 6, - "za": 6, - "za.": 6 - }; - exports.MONTH_DICTIONARY = { - januari: 1, - jan: 1, - "jan.": 1, - februari: 2, - feb: 2, - "feb.": 2, - maart: 3, - mar: 3, - "mar.": 3, - april: 4, - apr: 4, - "apr.": 4, - mei: 5, - juni: 6, - jun: 6, - "jun.": 6, - juli: 7, - jul: 7, - "jul.": 7, - augustus: 8, - aug: 8, - "aug.": 8, - september: 9, - sep: 9, - "sep.": 9, - sept: 9, - "sept.": 9, - oktober: 10, - okt: 10, - "okt.": 10, - november: 11, - nov: 11, - "nov.": 11, - december: 12, - dec: 12, - "dec.": 12 - }; - exports.INTEGER_WORD_DICTIONARY = { - een: 1, - twee: 2, - drie: 3, - vier: 4, - vijf: 5, - zes: 6, - zeven: 7, - acht: 8, - negen: 9, - tien: 10, - elf: 11, - twaalf: 12 - }; - exports.ORDINAL_WORD_DICTIONARY = { - eerste: 1, - tweede: 2, - derde: 3, - vierde: 4, - vijfde: 5, - zesde: 6, - zevende: 7, - achtste: 8, - negende: 9, - tiende: 10, - elfde: 11, - twaalfde: 12, - dertiende: 13, - veertiende: 14, - vijftiende: 15, - zestiende: 16, - zeventiende: 17, - achttiende: 18, - negentiende: 19, - twintigste: 20, - "eenentwintigste": 21, - "twee\xEBntwintigste": 22, - "drieentwintigste": 23, - "vierentwintigste": 24, - "vijfentwintigste": 25, - "zesentwintigste": 26, - "zevenentwintigste": 27, - "achtentwintig": 28, - "negenentwintig": 29, - "dertigste": 30, - "eenendertigste": 31 - }; - exports.TIME_UNIT_DICTIONARY = { - sec: "second", - second: "second", - seconden: "second", - min: "minute", - mins: "minute", - minute: "minute", - minuut: "minute", - minuten: "minute", - minuutje: "minute", - h: "hour", - hr: "hour", - hrs: "hour", - uur: "hour", - u: "hour", - uren: "hour", - dag: "d", - dagen: "d", - week: "week", - weken: "week", - maand: "month", - maanden: "month", - jaar: "year", - jr: "year", - jaren: "year" - }; - exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+[\\.,][0-9]+|halve?|half|paar)`; - function parseNumberPattern(match) { - const num = match.toLowerCase(); - if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { - return exports.INTEGER_WORD_DICTIONARY[num]; - } else if (num === "paar") { - return 2; - } else if (num === "half" || num.match(/halve?/)) { - return 0.5; - } - return parseFloat(num.replace(",", ".")); - } - exports.parseNumberPattern = parseNumberPattern; - exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:ste|de)?)`; - function parseOrdinalNumberPattern(match) { - let num = match.toLowerCase(); - if (exports.ORDINAL_WORD_DICTIONARY[num] !== void 0) { - return exports.ORDINAL_WORD_DICTIONARY[num]; - } - num = num.replace(/(?:ste|de)$/i, ""); - return parseInt(num); - } - exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; - exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:voor Christus|na Christus)|[1-2][0-9]{3}|[5-9][0-9])`; - function parseYear(match) { - if (/voor Christus/i.test(match)) { - match = match.replace(/voor Christus/i, ""); - return -parseInt(match); - } - if (/na Christus/i.test(match)) { - match = match.replace(/na Christus/i, ""); - return parseInt(match); - } - const rawYearNumber = parseInt(match); - return years_1.findMostLikelyADYear(rawYearNumber); - } - exports.parseYear = parseYear; - var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`; - var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); - exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:binnen|in)\\s*)?`, SINGLE_TIME_UNIT_PATTERN); - function parseTimeUnits(timeunitText) { - const fragments = {}; - let remainingText = timeunitText; - let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - while (match) { - collectDateTimeFragment(fragments, match); - remainingText = remainingText.substring(match[0].length); - match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - } - return fragments; - } - exports.parseTimeUnits = parseTimeUnits; - function collectDateTimeFragment(fragments, match) { - const num = parseNumberPattern(match[1]); - const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; - fragments[unit] = num; - } - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js -var require_NLTimeUnitWithinFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants6(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var NLTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return new RegExp(`(?:binnen|in|binnen de|voor)\\s*(` + constants_1.TIME_UNITS_PATTERN + `)(?=\\W|$)`, "i"); - } - innerExtract(context, match) { - const timeUnits = constants_1.parseTimeUnits(match[1]); - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - }; - exports.default = NLTimeUnitWithinFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLWeekdayParser.js -var require_NLWeekdayParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLWeekdayParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants6(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var weeks_1 = require_weeks(); - var PATTERN = new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:op\\s*?)?(?:(deze|vorige|volgende)\\s*(?:week\\s*)?)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?=\\W|$)`, "i"); - var PREFIX_GROUP = 1; - var WEEKDAY_GROUP = 2; - var POSTFIX_GROUP = 3; - var NLWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); - const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; - const prefix = match[PREFIX_GROUP]; - const postfix = match[POSTFIX_GROUP]; - let modifierWord = prefix || postfix; - modifierWord = modifierWord || ""; - modifierWord = modifierWord.toLowerCase(); - let modifier = null; - if (modifierWord == "vorige") { - modifier = "last"; - } else if (modifierWord == "volgende") { - modifier = "next"; - } else if (modifierWord == "deze") { - modifier = "this"; - } - const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); - return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); - } - }; - exports.default = NLWeekdayParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js -var require_NLMonthNameMiddleEndianParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var years_1 = require_years(); - var constants_1 = require_constants6(); - var constants_2 = require_constants6(); - var constants_3 = require_constants6(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`(?:on\\s*?)?(${constants_2.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:tot|\\-|\\\u2013|until|through|till|\\s)\\s*(${constants_2.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:of)?\\s*)(` + pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY) + `)(?:(?:-|/|,?\\s*)(${constants_3.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`, "i"); - var MONTH_NAME_GROUP = 3; - var DATE_GROUP = 1; - var DATE_TO_GROUP = 2; - var YEAR_GROUP = 4; - var NLMonthNameMiddleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]); - if (day > 31) { - match.index = match.index + match[DATE_GROUP].length; - return null; - } - const components = context.createParsingComponents({ - day, - month - }); - if (match[YEAR_GROUP]) { - const year = constants_3.parseYear(match[YEAR_GROUP]); - components.assign("year", year); - } else { - const year = years_1.findYearClosestToRef(context.refDate, day, month); - components.imply("year", year); - } - if (!match[DATE_TO_GROUP]) { - return components; - } - const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); - const result = context.createParsingResult(match.index, match[0]); - result.start = components; - result.end = components.clone(); - result.end.assign("day", endDate); - return result; - } - }; - exports.default = NLMonthNameMiddleEndianParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameParser.js -var require_NLMonthNameParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants6(); - var years_1 = require_years(); - var pattern_1 = require_pattern(); - var constants_2 = require_constants6(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${constants_2.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`, "i"); - var MONTH_NAME_GROUP = 1; - var YEAR_GROUP = 2; - var NLMonthNameParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const components = context.createParsingComponents(); - components.imply("day", 1); - const monthName = match[MONTH_NAME_GROUP]; - const month = constants_1.MONTH_DICTIONARY[monthName.toLowerCase()]; - components.assign("month", month); - if (match[YEAR_GROUP]) { - const year = constants_2.parseYear(match[YEAR_GROUP]); - components.assign("year", year); - } else { - const year = years_1.findYearClosestToRef(context.refDate, 1, month); - components.imply("year", year); - } - return components; - } - }; - exports.default = NLMonthNameParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLSlashMonthFormatParser.js -var require_NLSlashMonthFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLSlashMonthFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})", "i"); - var MONTH_GROUP = 1; - var YEAR_GROUP = 2; - var NLSlashMonthFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const year = parseInt(match[YEAR_GROUP]); - const month = parseInt(match[MONTH_GROUP]); - return context.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year); - } - }; - exports.default = NLSlashMonthFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeExpressionParser.js -var require_NLTimeExpressionParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeExpressionParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); - var NLTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { - primaryPrefix() { - return "(?:(?:om)\\s*)?"; - } - followingPhase() { - return "\\s*(?:\\-|\\\u2013|\\~|\\\u301C|om|\\?)\\s*"; - } - primarySuffix() { - return "(?:\\s*(?:uur))?(?!/)(?=\\W|$)"; - } - extractPrimaryTimeComponents(context, match) { - if (match[0].match(/^\s*\d{4}\s*$/)) { - return null; - } - return super.extractPrimaryTimeComponents(context, match); - } - }; - exports.default = NLTimeExpressionParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js -var require_NLCasualYearMonthDayParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants6(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s](?:(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]([0-9]{1,2})(?=\\W|$)`, "i"); - var YEAR_NUMBER_GROUP = 1; - var MONTH_NAME_GROUP = 2; - var MONTH_NUMBER_GROUP = 3; - var DATE_NUMBER_GROUP = 4; - var NLCasualYearMonthDayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const month = match[MONTH_NUMBER_GROUP] ? parseInt(match[MONTH_NUMBER_GROUP]) : constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - if (month < 1 || month > 12) { - return null; - } - const year = parseInt(match[YEAR_NUMBER_GROUP]); - const day = parseInt(match[DATE_NUMBER_GROUP]); - return { - day, - month, - year - }; - } - }; - exports.default = NLCasualYearMonthDayParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateTimeParser.js -var require_NLCasualDateTimeParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateTimeParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var index_1 = require_dist(); - var dayjs_1 = require_dayjs(); - var dayjs_2 = __importDefault2(require_dayjs_min()); - var DATE_GROUP = 1; - var TIME_OF_DAY_GROUP = 2; - var NLCasualDateTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return /(gisteren|morgen|van)(ochtend|middag|namiddag|avond|nacht)(?=\W|$)/i; - } - innerExtract(context, match) { - const dateText = match[DATE_GROUP].toLowerCase(); - const timeText = match[TIME_OF_DAY_GROUP].toLowerCase(); - const component = context.createParsingComponents(); - const targetDate = dayjs_2.default(context.refDate); - switch (dateText) { - case "gisteren": - dayjs_1.assignSimilarDate(component, targetDate.add(-1, "day")); - break; - case "van": - dayjs_1.assignSimilarDate(component, targetDate); - break; - case "morgen": - dayjs_1.assignTheNextDay(component, targetDate); - break; - } - switch (timeText) { - case "ochtend": - component.imply("meridiem", index_1.Meridiem.AM); - component.imply("hour", 6); - break; - case "middag": - component.imply("meridiem", index_1.Meridiem.AM); - component.imply("hour", 12); - break; - case "namiddag": - component.imply("meridiem", index_1.Meridiem.PM); - component.imply("hour", 15); - break; - case "avond": - component.imply("meridiem", index_1.Meridiem.PM); - component.imply("hour", 20); - break; - } - return component; - } - }; - exports.default = NLCasualDateTimeParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js -var require_NLTimeUnitCasualRelativeFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitCasualRelativeFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants6(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var timeunits_1 = require_timeunits(); - var PATTERN = new RegExp(`(deze|vorige|afgelopen|komende|over|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i"); - var NLTimeUnitCasualRelativeFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const prefix = match[1].toLowerCase(); - let timeUnits = constants_1.parseTimeUnits(match[2]); - switch (prefix) { - case "vorige": - case "afgelopen": - case "-": - timeUnits = timeunits_1.reverseTimeUnits(timeUnits); - break; - } - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - }; - exports.default = NLTimeUnitCasualRelativeFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLRelativeDateFormatParser.js -var require_NLRelativeDateFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLRelativeDateFormatParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants6(); - var results_1 = require_results(); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var pattern_1 = require_pattern(); - var PATTERN = new RegExp(`(dit|deze|komende|volgend|volgende|afgelopen|vorige)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)(?=\\W|$)`, "i"); - var MODIFIER_WORD_GROUP = 1; - var RELATIVE_WORD_GROUP = 2; - var NLRelativeDateFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const modifier = match[MODIFIER_WORD_GROUP].toLowerCase(); - const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase(); - const timeunit = constants_1.TIME_UNIT_DICTIONARY[unitWord]; - if (modifier == "volgend" || modifier == "volgende" || modifier == "komende") { - const timeUnits = {}; - timeUnits[timeunit] = 1; - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - if (modifier == "afgelopen" || modifier == "vorige") { - const timeUnits = {}; - timeUnits[timeunit] = -1; - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - const components = context.createParsingComponents(); - let date = dayjs_1.default(context.reference.instant); - if (unitWord.match(/week/i)) { - date = date.add(-date.get("d"), "d"); - components.imply("day", date.date()); - components.imply("month", date.month() + 1); - components.imply("year", date.year()); - } else if (unitWord.match(/maand/i)) { - date = date.add(-date.date() + 1, "d"); - components.imply("day", date.date()); - components.assign("year", date.year()); - components.assign("month", date.month() + 1); - } else if (unitWord.match(/jaar/i)) { - date = date.add(-date.date() + 1, "d"); - date = date.add(-date.month(), "month"); - components.imply("day", date.date()); - components.imply("month", date.month() + 1); - components.assign("year", date.year()); - } - return components; - } - }; - exports.default = NLRelativeDateFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitAgoFormatParser.js -var require_NLTimeUnitAgoFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitAgoFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants6(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var timeunits_1 = require_timeunits(); - var PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(?:geleden|voor|eerder)(?=(?:\\W|$))", "i"); - var STRICT_PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")geleden(?=(?:\\W|$))", "i"); - var NLTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - constructor(strictMode) { - super(); - this.strictMode = strictMode; - } - innerPattern() { - return this.strictMode ? STRICT_PATTERN : PATTERN; - } - innerExtract(context, match) { - const timeUnits = constants_1.parseTimeUnits(match[1]); - const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); - return results_1.ParsingComponents.createRelativeFromReference(context.reference, outputTimeUnits); - } - }; - exports.default = NLTimeUnitAgoFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitLaterFormatParser.js -var require_NLTimeUnitLaterFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitLaterFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants6(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(later|na|vanaf nu|voortaan|vooruit|uit)(?=(?:\\W|$))", "i"); - var STRICT_PATTERN = new RegExp("(" + constants_1.TIME_UNITS_PATTERN + ")(later|vanaf nu)(?=(?:\\W|$))", "i"); - var GROUP_NUM_TIMEUNITS = 1; - var NLTimeUnitLaterFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - constructor(strictMode) { - super(); - this.strictMode = strictMode; - } - innerPattern() { - return this.strictMode ? STRICT_PATTERN : PATTERN; - } - innerExtract(context, match) { - const fragments = constants_1.parseTimeUnits(match[GROUP_NUM_TIMEUNITS]); - return results_1.ParsingComponents.createRelativeFromReference(context.reference, fragments); - } - }; - exports.default = NLTimeUnitLaterFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/nl/index.js -var require_nl = __commonJS({ - "node_modules/chrono-node/dist/locales/nl/index.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; - var configurations_1 = require_configurations(); - var chrono_1 = require_chrono(); - var NLMergeDateRangeRefiner_1 = __importDefault2(require_NLMergeDateRangeRefiner()); - var NLMergeDateTimeRefiner_1 = __importDefault2(require_NLMergeDateTimeRefiner()); - var NLCasualDateParser_1 = __importDefault2(require_NLCasualDateParser()); - var NLCasualTimeParser_1 = __importDefault2(require_NLCasualTimeParser()); - var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); - var NLTimeUnitWithinFormatParser_1 = __importDefault2(require_NLTimeUnitWithinFormatParser()); - var NLWeekdayParser_1 = __importDefault2(require_NLWeekdayParser()); - var NLMonthNameMiddleEndianParser_1 = __importDefault2(require_NLMonthNameMiddleEndianParser()); - var NLMonthNameParser_1 = __importDefault2(require_NLMonthNameParser()); - var NLSlashMonthFormatParser_1 = __importDefault2(require_NLSlashMonthFormatParser()); - var NLTimeExpressionParser_1 = __importDefault2(require_NLTimeExpressionParser()); - var NLCasualYearMonthDayParser_1 = __importDefault2(require_NLCasualYearMonthDayParser()); - var NLCasualDateTimeParser_1 = __importDefault2(require_NLCasualDateTimeParser()); - var NLTimeUnitCasualRelativeFormatParser_1 = __importDefault2(require_NLTimeUnitCasualRelativeFormatParser()); - var NLRelativeDateFormatParser_1 = __importDefault2(require_NLRelativeDateFormatParser()); - var NLTimeUnitAgoFormatParser_1 = __importDefault2(require_NLTimeUnitAgoFormatParser()); - var NLTimeUnitLaterFormatParser_1 = __importDefault2(require_NLTimeUnitLaterFormatParser()); - exports.casual = new chrono_1.Chrono(createCasualConfiguration()); - exports.strict = new chrono_1.Chrono(createConfiguration(true)); - function parse(text2, ref, option) { - return exports.casual.parse(text2, ref, option); - } - exports.parse = parse; - function parseDate3(text2, ref, option) { - return exports.casual.parseDate(text2, ref, option); - } - exports.parseDate = parseDate3; - function createCasualConfiguration(littleEndian = true) { - const option = createConfiguration(false, littleEndian); - option.parsers.unshift(new NLCasualDateParser_1.default()); - option.parsers.unshift(new NLCasualTimeParser_1.default()); - option.parsers.unshift(new NLCasualDateTimeParser_1.default()); - option.parsers.unshift(new NLMonthNameParser_1.default()); - option.parsers.unshift(new NLRelativeDateFormatParser_1.default()); - option.parsers.unshift(new NLTimeUnitCasualRelativeFormatParser_1.default()); - return option; - } - exports.createCasualConfiguration = createCasualConfiguration; - function createConfiguration(strictMode = true, littleEndian = true) { - return configurations_1.includeCommonConfiguration({ - parsers: [ - new SlashDateFormatParser_1.default(littleEndian), - new NLTimeUnitWithinFormatParser_1.default(), - new NLMonthNameMiddleEndianParser_1.default(), - new NLMonthNameParser_1.default(), - new NLWeekdayParser_1.default(), - new NLCasualYearMonthDayParser_1.default(), - new NLSlashMonthFormatParser_1.default(), - new NLTimeExpressionParser_1.default(strictMode), - new NLTimeUnitAgoFormatParser_1.default(strictMode), - new NLTimeUnitLaterFormatParser_1.default(strictMode) - ], - refiners: [new NLMergeDateTimeRefiner_1.default(), new NLMergeDateRangeRefiner_1.default()] - }, strictMode); - } - exports.createConfiguration = createConfiguration; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantCasualDateParser.js -var require_ZHHantCasualDateParser = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantCasualDateParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var NOW_GROUP = 1; - var DAY_GROUP_1 = 2; - var TIME_GROUP_1 = 3; - var TIME_GROUP_2 = 4; - var DAY_GROUP_3 = 5; - var TIME_GROUP_3 = 6; - var ZHHantCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return new RegExp("(\u800C\u5BB6|\u7ACB(?:\u523B|\u5373)|\u5373\u523B)|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s|,|\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?", "i"); - } - innerExtract(context, match) { - const index = match.index; - const result = context.createParsingResult(index, match[0]); - const refMoment = dayjs_1.default(context.refDate); - let startMoment = refMoment; - if (match[NOW_GROUP]) { - result.start.imply("hour", refMoment.hour()); - result.start.imply("minute", refMoment.minute()); - result.start.imply("second", refMoment.second()); - result.start.imply("millisecond", refMoment.millisecond()); - } else if (match[DAY_GROUP_1]) { - const day1 = match[DAY_GROUP_1]; - const time1 = match[TIME_GROUP_1]; - if (day1 == "\u660E" || day1 == "\u807D") { - if (refMoment.hour() > 1) { - startMoment = startMoment.add(1, "day"); - } - } else if (day1 == "\u6628" || day1 == "\u5C0B" || day1 == "\u7434") { - startMoment = startMoment.add(-1, "day"); - } else if (day1 == "\u524D") { - startMoment = startMoment.add(-2, "day"); - } else if (day1 == "\u5927\u524D") { - startMoment = startMoment.add(-3, "day"); - } else if (day1 == "\u5F8C") { - startMoment = startMoment.add(2, "day"); - } else if (day1 == "\u5927\u5F8C") { - startMoment = startMoment.add(3, "day"); - } - if (time1 == "\u65E9" || time1 == "\u671D") { - result.start.imply("hour", 6); - } else if (time1 == "\u665A") { - result.start.imply("hour", 22); - result.start.imply("meridiem", 1); - } - } else if (match[TIME_GROUP_2]) { - const timeString2 = match[TIME_GROUP_2]; - const time2 = timeString2[0]; - if (time2 == "\u65E9" || time2 == "\u671D" || time2 == "\u4E0A") { - result.start.imply("hour", 6); - } else if (time2 == "\u4E0B" || time2 == "\u664F") { - result.start.imply("hour", 15); - result.start.imply("meridiem", 1); - } else if (time2 == "\u4E2D") { - result.start.imply("hour", 12); - result.start.imply("meridiem", 1); - } else if (time2 == "\u591C" || time2 == "\u665A") { - result.start.imply("hour", 22); - result.start.imply("meridiem", 1); - } else if (time2 == "\u51CC") { - result.start.imply("hour", 0); - } - } else if (match[DAY_GROUP_3]) { - const day3 = match[DAY_GROUP_3]; - if (day3 == "\u660E" || day3 == "\u807D") { - if (refMoment.hour() > 1) { - startMoment = startMoment.add(1, "day"); - } - } else if (day3 == "\u6628" || day3 == "\u5C0B" || day3 == "\u7434") { - startMoment = startMoment.add(-1, "day"); - } else if (day3 == "\u524D") { - startMoment = startMoment.add(-2, "day"); - } else if (day3 == "\u5927\u524D") { - startMoment = startMoment.add(-3, "day"); - } else if (day3 == "\u5F8C") { - startMoment = startMoment.add(2, "day"); - } else if (day3 == "\u5927\u5F8C") { - startMoment = startMoment.add(3, "day"); - } - const timeString3 = match[TIME_GROUP_3]; - if (timeString3) { - const time3 = timeString3[0]; - if (time3 == "\u65E9" || time3 == "\u671D" || time3 == "\u4E0A") { - result.start.imply("hour", 6); - } else if (time3 == "\u4E0B" || time3 == "\u664F") { - result.start.imply("hour", 15); - result.start.imply("meridiem", 1); - } else if (time3 == "\u4E2D") { - result.start.imply("hour", 12); - result.start.imply("meridiem", 1); - } else if (time3 == "\u591C" || time3 == "\u665A") { - result.start.imply("hour", 22); - result.start.imply("meridiem", 1); - } else if (time3 == "\u51CC") { - result.start.imply("hour", 0); - } - } - } - result.start.assign("day", startMoment.date()); - result.start.assign("month", startMoment.month() + 1); - result.start.assign("year", startMoment.year()); - return result; - } - }; - exports.default = ZHHantCasualDateParser; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hant/constants.js -var require_constants7 = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hant/constants.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.zhStringToYear = exports.zhStringToNumber = exports.WEEKDAY_OFFSET = exports.NUMBER = void 0; - exports.NUMBER = { - "\u96F6": 0, - "\u4E00": 1, - "\u4E8C": 2, - "\u5169": 2, - "\u4E09": 3, - "\u56DB": 4, - "\u4E94": 5, - "\u516D": 6, - "\u4E03": 7, - "\u516B": 8, - "\u4E5D": 9, - "\u5341": 10, - "\u5EFF": 20, - "\u5345": 30 - }; - exports.WEEKDAY_OFFSET = { - "\u5929": 0, - "\u65E5": 0, - "\u4E00": 1, - "\u4E8C": 2, - "\u4E09": 3, - "\u56DB": 4, - "\u4E94": 5, - "\u516D": 6 - }; - function zhStringToNumber(text2) { - let number = 0; - for (let i = 0; i < text2.length; i++) { - const char = text2[i]; - if (char === "\u5341") { - number = number === 0 ? exports.NUMBER[char] : number * exports.NUMBER[char]; - } else { - number += exports.NUMBER[char]; - } - } - return number; - } - exports.zhStringToNumber = zhStringToNumber; - function zhStringToYear(text2) { - let string = ""; - for (let i = 0; i < text2.length; i++) { - const char = text2[i]; - string = string + exports.NUMBER[char]; - } - return parseInt(string); - } - exports.zhStringToYear = zhStringToYear; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantDateParser.js -var require_ZHHantDateParser = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantDateParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var constants_1 = require_constants7(); - var YEAR_GROUP = 1; - var MONTH_GROUP = 2; - var DAY_GROUP = 3; - var ZHHantDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return new RegExp("(\\d{2,4}|[" + Object.keys(constants_1.NUMBER).join("") + "]{4}|[" + Object.keys(constants_1.NUMBER).join("") + "]{2})?(?:\\s*)(?:\u5E74)?(?:[\\s|,|\uFF0C]*)(\\d{1,2}|[" + Object.keys(constants_1.NUMBER).join("") + "]{1,2})(?:\\s*)(?:\u6708)(?:\\s*)(\\d{1,2}|[" + Object.keys(constants_1.NUMBER).join("") + "]{1,2})?(?:\\s*)(?:\u65E5|\u865F)?"); - } - innerExtract(context, match) { - const startMoment = dayjs_1.default(context.refDate); - const result = context.createParsingResult(match.index, match[0]); - let month = parseInt(match[MONTH_GROUP]); - if (isNaN(month)) - month = constants_1.zhStringToNumber(match[MONTH_GROUP]); - result.start.assign("month", month); - if (match[DAY_GROUP]) { - let day = parseInt(match[DAY_GROUP]); - if (isNaN(day)) - day = constants_1.zhStringToNumber(match[DAY_GROUP]); - result.start.assign("day", day); - } else { - result.start.imply("day", startMoment.date()); - } - if (match[YEAR_GROUP]) { - let year = parseInt(match[YEAR_GROUP]); - if (isNaN(year)) - year = constants_1.zhStringToYear(match[YEAR_GROUP]); - result.start.assign("year", year); - } else { - result.start.imply("year", startMoment.year()); - } - return result; - } - }; - exports.default = ZHHantDateParser; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantDeadlineFormatParser.js -var require_ZHHantDeadlineFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantDeadlineFormatParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var constants_1 = require_constants7(); - var PATTERN = new RegExp("(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+|\u534A|\u5E7E)(?:\\s*)(?:\u500B)?(\u79D2(?:\u9418)?|\u5206\u9418|\u5C0F\u6642|\u9418|\u65E5|\u5929|\u661F\u671F|\u79AE\u62DC|\u6708|\u5E74)(?:(?:\u4E4B|\u904E)?\u5F8C|(?:\u4E4B)?\u5167)", "i"); - var NUMBER_GROUP = 1; - var UNIT_GROUP = 2; - var ZHHantDeadlineFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - let number = parseInt(match[NUMBER_GROUP]); - if (isNaN(number)) { - number = constants_1.zhStringToNumber(match[NUMBER_GROUP]); - } - if (isNaN(number)) { - const string = match[NUMBER_GROUP]; - if (string === "\u5E7E") { - number = 3; - } else if (string === "\u534A") { - number = 0.5; - } else { - return null; - } - } - let date = dayjs_1.default(context.refDate); - const unit = match[UNIT_GROUP]; - const unitAbbr = unit[0]; - if (unitAbbr.match(/[日天星禮月年]/)) { - if (unitAbbr == "\u65E5" || unitAbbr == "\u5929") { - date = date.add(number, "d"); - } else if (unitAbbr == "\u661F" || unitAbbr == "\u79AE") { - date = date.add(number * 7, "d"); - } else if (unitAbbr == "\u6708") { - date = date.add(number, "month"); - } else if (unitAbbr == "\u5E74") { - date = date.add(number, "year"); - } - result.start.assign("year", date.year()); - result.start.assign("month", date.month() + 1); - result.start.assign("day", date.date()); - return result; - } - if (unitAbbr == "\u79D2") { - date = date.add(number, "second"); - } else if (unitAbbr == "\u5206") { - date = date.add(number, "minute"); - } else if (unitAbbr == "\u5C0F" || unitAbbr == "\u9418") { - date = date.add(number, "hour"); - } - result.start.imply("year", date.year()); - result.start.imply("month", date.month() + 1); - result.start.imply("day", date.date()); - result.start.assign("hour", date.hour()); - result.start.assign("minute", date.minute()); - result.start.assign("second", date.second()); - return result; - } - }; - exports.default = ZHHantDeadlineFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantRelationWeekdayParser.js -var require_ZHHantRelationWeekdayParser = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantRelationWeekdayParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var constants_1 = require_constants7(); - var PATTERN = new RegExp("(?\u4E0A|\u4ECA|\u4E0B|\u9019|\u5462)(?:\u500B)?(?:\u661F\u671F|\u79AE\u62DC|\u9031)(?" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")"); - var ZHHantRelationWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const dayOfWeek = match.groups.weekday; - const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek]; - if (offset === void 0) - return null; - let modifier = null; - const prefix = match.groups.prefix; - if (prefix == "\u4E0A") { - modifier = "last"; - } else if (prefix == "\u4E0B") { - modifier = "next"; - } else if (prefix == "\u4ECA" || prefix == "\u9019" || prefix == "\u5462") { - modifier = "this"; - } - let startMoment = dayjs_1.default(context.refDate); - let startMomentFixed = false; - const refOffset = startMoment.day(); - if (modifier == "last" || modifier == "past") { - startMoment = startMoment.day(offset - 7); - startMomentFixed = true; - } else if (modifier == "next") { - startMoment = startMoment.day(offset + 7); - startMomentFixed = true; - } else if (modifier == "this") { - startMoment = startMoment.day(offset); - } else { - if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { - startMoment = startMoment.day(offset - 7); - } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { - startMoment = startMoment.day(offset + 7); - } else { - startMoment = startMoment.day(offset); - } - } - result.start.assign("weekday", offset); - if (startMomentFixed) { - result.start.assign("day", startMoment.date()); - result.start.assign("month", startMoment.month() + 1); - result.start.assign("year", startMoment.year()); - } else { - result.start.imply("day", startMoment.date()); - result.start.imply("month", startMoment.month() + 1); - result.start.imply("year", startMoment.year()); - } - return result; - } - }; - exports.default = ZHHantRelationWeekdayParser; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantTimeExpressionParser.js -var require_ZHHantTimeExpressionParser = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantTimeExpressionParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var constants_1 = require_constants7(); - var FIRST_REG_PATTERN = new RegExp("(?:\u7531|\u5F9E|\u81EA)?(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)(?:\\s*)(?:\u9EDE|\u6642|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?", "i"); - var SECOND_REG_PATTERN = new RegExp("(?:^\\s*(?:\u5230|\u81F3|\\-|\\\u2013|\\~|\\\u301C)\\s*)(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)(?:\\s*)(?:\u9EDE|\u6642|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?", "i"); - var DAY_GROUP_1 = 1; - var ZH_AM_PM_HOUR_GROUP_1 = 2; - var ZH_AM_PM_HOUR_GROUP_2 = 3; - var DAY_GROUP_3 = 4; - var ZH_AM_PM_HOUR_GROUP_3 = 5; - var HOUR_GROUP = 6; - var MINUTE_GROUP = 7; - var SECOND_GROUP = 8; - var AM_PM_HOUR_GROUP = 9; - var ZHHantTimeExpressionParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return FIRST_REG_PATTERN; - } - innerExtract(context, match) { - if (match.index > 0 && context.text[match.index - 1].match(/\w/)) { - return null; - } - const refMoment = dayjs_1.default(context.refDate); - const result = context.createParsingResult(match.index, match[0]); - const startMoment = refMoment.clone(); - if (match[DAY_GROUP_1]) { - var day1 = match[DAY_GROUP_1]; - if (day1 == "\u660E" || day1 == "\u807D") { - if (refMoment.hour() > 1) { - startMoment.add(1, "day"); - } - } else if (day1 == "\u6628" || day1 == "\u5C0B" || day1 == "\u7434") { - startMoment.add(-1, "day"); - } else if (day1 == "\u524D") { - startMoment.add(-2, "day"); - } else if (day1 == "\u5927\u524D") { - startMoment.add(-3, "day"); - } else if (day1 == "\u5F8C") { - startMoment.add(2, "day"); - } else if (day1 == "\u5927\u5F8C") { - startMoment.add(3, "day"); - } - result.start.assign("day", startMoment.date()); - result.start.assign("month", startMoment.month() + 1); - result.start.assign("year", startMoment.year()); - } else if (match[DAY_GROUP_3]) { - var day3 = match[DAY_GROUP_3]; - if (day3 == "\u660E" || day3 == "\u807D") { - startMoment.add(1, "day"); - } else if (day3 == "\u6628" || day3 == "\u5C0B" || day3 == "\u7434") { - startMoment.add(-1, "day"); - } else if (day3 == "\u524D") { - startMoment.add(-2, "day"); - } else if (day3 == "\u5927\u524D") { - startMoment.add(-3, "day"); - } else if (day3 == "\u5F8C") { - startMoment.add(2, "day"); - } else if (day3 == "\u5927\u5F8C") { - startMoment.add(3, "day"); - } - result.start.assign("day", startMoment.date()); - result.start.assign("month", startMoment.month() + 1); - result.start.assign("year", startMoment.year()); - } else { - result.start.imply("day", startMoment.date()); - result.start.imply("month", startMoment.month() + 1); - result.start.imply("year", startMoment.year()); - } - let hour = 0; - let minute = 0; - let meridiem = -1; - if (match[SECOND_GROUP]) { - var second = parseInt(match[SECOND_GROUP]); - if (isNaN(second)) { - second = constants_1.zhStringToNumber(match[SECOND_GROUP]); - } - if (second >= 60) - return null; - result.start.assign("second", second); - } - hour = parseInt(match[HOUR_GROUP]); - if (isNaN(hour)) { - hour = constants_1.zhStringToNumber(match[HOUR_GROUP]); - } - if (match[MINUTE_GROUP]) { - if (match[MINUTE_GROUP] == "\u534A") { - minute = 30; - } else if (match[MINUTE_GROUP] == "\u6B63" || match[MINUTE_GROUP] == "\u6574") { - minute = 0; - } else { - minute = parseInt(match[MINUTE_GROUP]); - if (isNaN(minute)) { - minute = constants_1.zhStringToNumber(match[MINUTE_GROUP]); - } - } - } else if (hour > 100) { - minute = hour % 100; - hour = Math.floor(hour / 100); - } - if (minute >= 60) { - return null; - } - if (hour > 24) { - return null; - } - if (hour >= 12) { - meridiem = 1; - } - if (match[AM_PM_HOUR_GROUP]) { - if (hour > 12) - return null; - var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); - if (ampm == "a") { - meridiem = 0; - if (hour == 12) - hour = 0; - } - if (ampm == "p") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } else if (match[ZH_AM_PM_HOUR_GROUP_1]) { - var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1]; - var zhAMPM1 = zhAMPMString1[0]; - if (zhAMPM1 == "\u671D" || zhAMPM1 == "\u65E9") { - meridiem = 0; - if (hour == 12) - hour = 0; - } else if (zhAMPM1 == "\u665A") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } else if (match[ZH_AM_PM_HOUR_GROUP_2]) { - var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2]; - var zhAMPM2 = zhAMPMString2[0]; - if (zhAMPM2 == "\u4E0A" || zhAMPM2 == "\u671D" || zhAMPM2 == "\u65E9" || zhAMPM2 == "\u51CC") { - meridiem = 0; - if (hour == 12) - hour = 0; - } else if (zhAMPM2 == "\u4E0B" || zhAMPM2 == "\u664F" || zhAMPM2 == "\u665A") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } else if (match[ZH_AM_PM_HOUR_GROUP_3]) { - var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3]; - var zhAMPM3 = zhAMPMString3[0]; - if (zhAMPM3 == "\u4E0A" || zhAMPM3 == "\u671D" || zhAMPM3 == "\u65E9" || zhAMPM3 == "\u51CC") { - meridiem = 0; - if (hour == 12) - hour = 0; - } else if (zhAMPM3 == "\u4E0B" || zhAMPM3 == "\u664F" || zhAMPM3 == "\u665A") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } - result.start.assign("hour", hour); - result.start.assign("minute", minute); - if (meridiem >= 0) { - result.start.assign("meridiem", meridiem); - } else { - if (hour < 12) { - result.start.imply("meridiem", 0); - } else { - result.start.imply("meridiem", 1); - } - } - match = SECOND_REG_PATTERN.exec(context.text.substring(result.index + result.text.length)); - if (!match) { - if (result.text.match(/^\d+$/)) { - return null; - } - return result; - } - const endMoment = startMoment.clone(); - result.end = context.createParsingComponents(); - if (match[DAY_GROUP_1]) { - var day1 = match[DAY_GROUP_1]; - if (day1 == "\u660E" || day1 == "\u807D") { - if (refMoment.hour() > 1) { - endMoment.add(1, "day"); - } - } else if (day1 == "\u6628" || day1 == "\u5C0B" || day1 == "\u7434") { - endMoment.add(-1, "day"); - } else if (day1 == "\u524D") { - endMoment.add(-2, "day"); - } else if (day1 == "\u5927\u524D") { - endMoment.add(-3, "day"); - } else if (day1 == "\u5F8C") { - endMoment.add(2, "day"); - } else if (day1 == "\u5927\u5F8C") { - endMoment.add(3, "day"); - } - result.end.assign("day", endMoment.date()); - result.end.assign("month", endMoment.month() + 1); - result.end.assign("year", endMoment.year()); - } else if (match[DAY_GROUP_3]) { - var day3 = match[DAY_GROUP_3]; - if (day3 == "\u660E" || day3 == "\u807D") { - endMoment.add(1, "day"); - } else if (day3 == "\u6628" || day3 == "\u5C0B" || day3 == "\u7434") { - endMoment.add(-1, "day"); - } else if (day3 == "\u524D") { - endMoment.add(-2, "day"); - } else if (day3 == "\u5927\u524D") { - endMoment.add(-3, "day"); - } else if (day3 == "\u5F8C") { - endMoment.add(2, "day"); - } else if (day3 == "\u5927\u5F8C") { - endMoment.add(3, "day"); - } - result.end.assign("day", endMoment.date()); - result.end.assign("month", endMoment.month() + 1); - result.end.assign("year", endMoment.year()); - } else { - result.end.imply("day", endMoment.date()); - result.end.imply("month", endMoment.month() + 1); - result.end.imply("year", endMoment.year()); - } - hour = 0; - minute = 0; - meridiem = -1; - if (match[SECOND_GROUP]) { - var second = parseInt(match[SECOND_GROUP]); - if (isNaN(second)) { - second = constants_1.zhStringToNumber(match[SECOND_GROUP]); - } - if (second >= 60) - return null; - result.end.assign("second", second); - } - hour = parseInt(match[HOUR_GROUP]); - if (isNaN(hour)) { - hour = constants_1.zhStringToNumber(match[HOUR_GROUP]); - } - if (match[MINUTE_GROUP]) { - if (match[MINUTE_GROUP] == "\u534A") { - minute = 30; - } else if (match[MINUTE_GROUP] == "\u6B63" || match[MINUTE_GROUP] == "\u6574") { - minute = 0; - } else { - minute = parseInt(match[MINUTE_GROUP]); - if (isNaN(minute)) { - minute = constants_1.zhStringToNumber(match[MINUTE_GROUP]); - } - } - } else if (hour > 100) { - minute = hour % 100; - hour = Math.floor(hour / 100); - } - if (minute >= 60) { - return null; - } - if (hour > 24) { - return null; - } - if (hour >= 12) { - meridiem = 1; - } - if (match[AM_PM_HOUR_GROUP]) { - if (hour > 12) - return null; - var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); - if (ampm == "a") { - meridiem = 0; - if (hour == 12) - hour = 0; - } - if (ampm == "p") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - if (!result.start.isCertain("meridiem")) { - if (meridiem == 0) { - result.start.imply("meridiem", 0); - if (result.start.get("hour") == 12) { - result.start.assign("hour", 0); - } - } else { - result.start.imply("meridiem", 1); - if (result.start.get("hour") != 12) { - result.start.assign("hour", result.start.get("hour") + 12); - } - } - } - } else if (match[ZH_AM_PM_HOUR_GROUP_1]) { - var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1]; - var zhAMPM1 = zhAMPMString1[0]; - if (zhAMPM1 == "\u671D" || zhAMPM1 == "\u65E9") { - meridiem = 0; - if (hour == 12) - hour = 0; - } else if (zhAMPM1 == "\u665A") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } else if (match[ZH_AM_PM_HOUR_GROUP_2]) { - var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2]; - var zhAMPM2 = zhAMPMString2[0]; - if (zhAMPM2 == "\u4E0A" || zhAMPM2 == "\u671D" || zhAMPM2 == "\u65E9" || zhAMPM2 == "\u51CC") { - meridiem = 0; - if (hour == 12) - hour = 0; - } else if (zhAMPM2 == "\u4E0B" || zhAMPM2 == "\u664F" || zhAMPM2 == "\u665A") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } else if (match[ZH_AM_PM_HOUR_GROUP_3]) { - var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3]; - var zhAMPM3 = zhAMPMString3[0]; - if (zhAMPM3 == "\u4E0A" || zhAMPM3 == "\u671D" || zhAMPM3 == "\u65E9" || zhAMPM3 == "\u51CC") { - meridiem = 0; - if (hour == 12) - hour = 0; - } else if (zhAMPM3 == "\u4E0B" || zhAMPM3 == "\u664F" || zhAMPM3 == "\u665A") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } - result.text = result.text + match[0]; - result.end.assign("hour", hour); - result.end.assign("minute", minute); - if (meridiem >= 0) { - result.end.assign("meridiem", meridiem); - } else { - const startAtPM = result.start.isCertain("meridiem") && result.start.get("meridiem") == 1; - if (startAtPM && result.start.get("hour") > hour) { - result.end.imply("meridiem", 0); - } else if (hour > 12) { - result.end.imply("meridiem", 1); - } - } - if (result.end.date().getTime() < result.start.date().getTime()) { - result.end.imply("day", result.end.get("day") + 1); - } - return result; - } - }; - exports.default = ZHHantTimeExpressionParser; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantWeekdayParser.js -var require_ZHHantWeekdayParser = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hant/parsers/ZHHantWeekdayParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var constants_1 = require_constants7(); - var PATTERN = new RegExp("(?:\u661F\u671F|\u79AE\u62DC|\u9031)(?" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")"); - var ZHHantWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const dayOfWeek = match.groups.weekday; - const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek]; - if (offset === void 0) - return null; - let startMoment = dayjs_1.default(context.refDate); - const startMomentFixed = false; - const refOffset = startMoment.day(); - if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { - startMoment = startMoment.day(offset - 7); - } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { - startMoment = startMoment.day(offset + 7); - } else { - startMoment = startMoment.day(offset); - } - result.start.assign("weekday", offset); - if (startMomentFixed) { - result.start.assign("day", startMoment.date()); - result.start.assign("month", startMoment.month() + 1); - result.start.assign("year", startMoment.year()); - } else { - result.start.imply("day", startMoment.date()); - result.start.imply("month", startMoment.month() + 1); - result.start.imply("year", startMoment.year()); - } - return result; - } - }; - exports.default = ZHHantWeekdayParser; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hant/refiners/ZHHantMergeDateRangeRefiner.js -var require_ZHHantMergeDateRangeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hant/refiners/ZHHantMergeDateRangeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); - var ZHHantMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { - patternBetween() { - return /^\s*(至|到|\-|\~|~|-|ー)\s*$/i; - } - }; - exports.default = ZHHantMergeDateRangeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hant/refiners/ZHHantMergeDateTimeRefiner.js -var require_ZHHantMergeDateTimeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hant/refiners/ZHHantMergeDateTimeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); - var ZHHantMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return /^\s*$/i; - } - }; - exports.default = ZHHantMergeDateTimeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hant/index.js -var require_hant = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hant/index.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = exports.hant = void 0; - var chrono_1 = require_chrono(); - var ExtractTimezoneOffsetRefiner_1 = __importDefault2(require_ExtractTimezoneOffsetRefiner()); - var configurations_1 = require_configurations(); - var ZHHantCasualDateParser_1 = __importDefault2(require_ZHHantCasualDateParser()); - var ZHHantDateParser_1 = __importDefault2(require_ZHHantDateParser()); - var ZHHantDeadlineFormatParser_1 = __importDefault2(require_ZHHantDeadlineFormatParser()); - var ZHHantRelationWeekdayParser_1 = __importDefault2(require_ZHHantRelationWeekdayParser()); - var ZHHantTimeExpressionParser_1 = __importDefault2(require_ZHHantTimeExpressionParser()); - var ZHHantWeekdayParser_1 = __importDefault2(require_ZHHantWeekdayParser()); - var ZHHantMergeDateRangeRefiner_1 = __importDefault2(require_ZHHantMergeDateRangeRefiner()); - var ZHHantMergeDateTimeRefiner_1 = __importDefault2(require_ZHHantMergeDateTimeRefiner()); - exports.hant = new chrono_1.Chrono(createCasualConfiguration()); - exports.casual = new chrono_1.Chrono(createCasualConfiguration()); - exports.strict = new chrono_1.Chrono(createConfiguration()); - function parse(text2, ref, option) { - return exports.casual.parse(text2, ref, option); - } - exports.parse = parse; - function parseDate3(text2, ref, option) { - return exports.casual.parseDate(text2, ref, option); - } - exports.parseDate = parseDate3; - function createCasualConfiguration() { - const option = createConfiguration(); - option.parsers.unshift(new ZHHantCasualDateParser_1.default()); - return option; - } - exports.createCasualConfiguration = createCasualConfiguration; - function createConfiguration() { - const configuration = configurations_1.includeCommonConfiguration({ - parsers: [ - new ZHHantDateParser_1.default(), - new ZHHantRelationWeekdayParser_1.default(), - new ZHHantWeekdayParser_1.default(), - new ZHHantTimeExpressionParser_1.default(), - new ZHHantDeadlineFormatParser_1.default() - ], - refiners: [new ZHHantMergeDateRangeRefiner_1.default(), new ZHHantMergeDateTimeRefiner_1.default()] - }); - configuration.refiners = configuration.refiners.filter((refiner) => !(refiner instanceof ExtractTimezoneOffsetRefiner_1.default)); - return configuration; - } - exports.createConfiguration = createConfiguration; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansCasualDateParser.js -var require_ZHHansCasualDateParser = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansCasualDateParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var NOW_GROUP = 1; - var DAY_GROUP_1 = 2; - var TIME_GROUP_1 = 3; - var TIME_GROUP_2 = 4; - var DAY_GROUP_3 = 5; - var TIME_GROUP_3 = 6; - var ZHHansCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern(context) { - return new RegExp("(\u73B0\u5728|\u7ACB(?:\u523B|\u5373)|\u5373\u523B)|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s|,|\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?", "i"); - } - innerExtract(context, match) { - const index = match.index; - const result = context.createParsingResult(index, match[0]); - const refMoment = dayjs_1.default(context.refDate); - let startMoment = refMoment; - if (match[NOW_GROUP]) { - result.start.imply("hour", refMoment.hour()); - result.start.imply("minute", refMoment.minute()); - result.start.imply("second", refMoment.second()); - result.start.imply("millisecond", refMoment.millisecond()); - } else if (match[DAY_GROUP_1]) { - const day1 = match[DAY_GROUP_1]; - const time1 = match[TIME_GROUP_1]; - if (day1 == "\u660E") { - if (refMoment.hour() > 1) { - startMoment = startMoment.add(1, "day"); - } - } else if (day1 == "\u6628") { - startMoment = startMoment.add(-1, "day"); - } else if (day1 == "\u524D") { - startMoment = startMoment.add(-2, "day"); - } else if (day1 == "\u5927\u524D") { - startMoment = startMoment.add(-3, "day"); - } else if (day1 == "\u540E") { - startMoment = startMoment.add(2, "day"); - } else if (day1 == "\u5927\u540E") { - startMoment = startMoment.add(3, "day"); - } - if (time1 == "\u65E9") { - result.start.imply("hour", 6); - } else if (time1 == "\u665A") { - result.start.imply("hour", 22); - result.start.imply("meridiem", 1); - } - } else if (match[TIME_GROUP_2]) { - const timeString2 = match[TIME_GROUP_2]; - const time2 = timeString2[0]; - if (time2 == "\u65E9" || time2 == "\u4E0A") { - result.start.imply("hour", 6); - } else if (time2 == "\u4E0B") { - result.start.imply("hour", 15); - result.start.imply("meridiem", 1); - } else if (time2 == "\u4E2D") { - result.start.imply("hour", 12); - result.start.imply("meridiem", 1); - } else if (time2 == "\u591C" || time2 == "\u665A") { - result.start.imply("hour", 22); - result.start.imply("meridiem", 1); - } else if (time2 == "\u51CC") { - result.start.imply("hour", 0); - } - } else if (match[DAY_GROUP_3]) { - const day3 = match[DAY_GROUP_3]; - if (day3 == "\u660E") { - if (refMoment.hour() > 1) { - startMoment = startMoment.add(1, "day"); - } - } else if (day3 == "\u6628") { - startMoment = startMoment.add(-1, "day"); - } else if (day3 == "\u524D") { - startMoment = startMoment.add(-2, "day"); - } else if (day3 == "\u5927\u524D") { - startMoment = startMoment.add(-3, "day"); - } else if (day3 == "\u540E") { - startMoment = startMoment.add(2, "day"); - } else if (day3 == "\u5927\u540E") { - startMoment = startMoment.add(3, "day"); - } - const timeString3 = match[TIME_GROUP_3]; - if (timeString3) { - const time3 = timeString3[0]; - if (time3 == "\u65E9" || time3 == "\u4E0A") { - result.start.imply("hour", 6); - } else if (time3 == "\u4E0B") { - result.start.imply("hour", 15); - result.start.imply("meridiem", 1); - } else if (time3 == "\u4E2D") { - result.start.imply("hour", 12); - result.start.imply("meridiem", 1); - } else if (time3 == "\u591C" || time3 == "\u665A") { - result.start.imply("hour", 22); - result.start.imply("meridiem", 1); - } else if (time3 == "\u51CC") { - result.start.imply("hour", 0); - } - } - } - result.start.assign("day", startMoment.date()); - result.start.assign("month", startMoment.month() + 1); - result.start.assign("year", startMoment.year()); - return result; - } - }; - exports.default = ZHHansCasualDateParser; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hans/constants.js -var require_constants8 = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hans/constants.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.zhStringToYear = exports.zhStringToNumber = exports.WEEKDAY_OFFSET = exports.NUMBER = void 0; - exports.NUMBER = { - "\u96F6": 0, - "\u3007": 0, - "\u4E00": 1, - "\u4E8C": 2, - "\u4E24": 2, - "\u4E09": 3, - "\u56DB": 4, - "\u4E94": 5, - "\u516D": 6, - "\u4E03": 7, - "\u516B": 8, - "\u4E5D": 9, - "\u5341": 10 - }; - exports.WEEKDAY_OFFSET = { - "\u5929": 0, - "\u65E5": 0, - "\u4E00": 1, - "\u4E8C": 2, - "\u4E09": 3, - "\u56DB": 4, - "\u4E94": 5, - "\u516D": 6 - }; - function zhStringToNumber(text2) { - let number = 0; - for (let i = 0; i < text2.length; i++) { - const char = text2[i]; - if (char === "\u5341") { - number = number === 0 ? exports.NUMBER[char] : number * exports.NUMBER[char]; - } else { - number += exports.NUMBER[char]; - } - } - return number; - } - exports.zhStringToNumber = zhStringToNumber; - function zhStringToYear(text2) { - let string = ""; - for (let i = 0; i < text2.length; i++) { - const char = text2[i]; - string = string + exports.NUMBER[char]; - } - return parseInt(string); - } - exports.zhStringToYear = zhStringToYear; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansDateParser.js -var require_ZHHansDateParser = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansDateParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var constants_1 = require_constants8(); - var YEAR_GROUP = 1; - var MONTH_GROUP = 2; - var DAY_GROUP = 3; - var ZHHansDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return new RegExp("(\\d{2,4}|[" + Object.keys(constants_1.NUMBER).join("") + "]{4}|[" + Object.keys(constants_1.NUMBER).join("") + "]{2})?(?:\\s*)(?:\u5E74)?(?:[\\s|,|\uFF0C]*)(\\d{1,2}|[" + Object.keys(constants_1.NUMBER).join("") + "]{1,3})(?:\\s*)(?:\u6708)(?:\\s*)(\\d{1,2}|[" + Object.keys(constants_1.NUMBER).join("") + "]{1,3})?(?:\\s*)(?:\u65E5|\u53F7)?"); - } - innerExtract(context, match) { - const startMoment = dayjs_1.default(context.refDate); - const result = context.createParsingResult(match.index, match[0]); - let month = parseInt(match[MONTH_GROUP]); - if (isNaN(month)) - month = constants_1.zhStringToNumber(match[MONTH_GROUP]); - result.start.assign("month", month); - if (match[DAY_GROUP]) { - let day = parseInt(match[DAY_GROUP]); - if (isNaN(day)) - day = constants_1.zhStringToNumber(match[DAY_GROUP]); - result.start.assign("day", day); - } else { - result.start.imply("day", startMoment.date()); - } - if (match[YEAR_GROUP]) { - let year = parseInt(match[YEAR_GROUP]); - if (isNaN(year)) - year = constants_1.zhStringToYear(match[YEAR_GROUP]); - result.start.assign("year", year); - } else { - result.start.imply("year", startMoment.year()); - } - return result; - } - }; - exports.default = ZHHansDateParser; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.js -var require_ZHHansDeadlineFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansDeadlineFormatParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var constants_1 = require_constants8(); - var PATTERN = new RegExp("(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+|\u534A|\u51E0)(?:\\s*)(?:\u4E2A)?(\u79D2(?:\u949F)?|\u5206\u949F|\u5C0F\u65F6|\u949F|\u65E5|\u5929|\u661F\u671F|\u793C\u62DC|\u6708|\u5E74)(?:(?:\u4E4B|\u8FC7)?\u540E|(?:\u4E4B)?\u5185)", "i"); - var NUMBER_GROUP = 1; - var UNIT_GROUP = 2; - var ZHHansDeadlineFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - let number = parseInt(match[NUMBER_GROUP]); - if (isNaN(number)) { - number = constants_1.zhStringToNumber(match[NUMBER_GROUP]); - } - if (isNaN(number)) { - const string = match[NUMBER_GROUP]; - if (string === "\u51E0") { - number = 3; - } else if (string === "\u534A") { - number = 0.5; - } else { - return null; - } - } - let date = dayjs_1.default(context.refDate); - const unit = match[UNIT_GROUP]; - const unitAbbr = unit[0]; - if (unitAbbr.match(/[日天星礼月年]/)) { - if (unitAbbr == "\u65E5" || unitAbbr == "\u5929") { - date = date.add(number, "d"); - } else if (unitAbbr == "\u661F" || unitAbbr == "\u793C") { - date = date.add(number * 7, "d"); - } else if (unitAbbr == "\u6708") { - date = date.add(number, "month"); - } else if (unitAbbr == "\u5E74") { - date = date.add(number, "year"); - } - result.start.assign("year", date.year()); - result.start.assign("month", date.month() + 1); - result.start.assign("day", date.date()); - return result; - } - if (unitAbbr == "\u79D2") { - date = date.add(number, "second"); - } else if (unitAbbr == "\u5206") { - date = date.add(number, "minute"); - } else if (unitAbbr == "\u5C0F" || unitAbbr == "\u949F") { - date = date.add(number, "hour"); - } - result.start.imply("year", date.year()); - result.start.imply("month", date.month() + 1); - result.start.imply("day", date.date()); - result.start.assign("hour", date.hour()); - result.start.assign("minute", date.minute()); - result.start.assign("second", date.second()); - return result; - } - }; - exports.default = ZHHansDeadlineFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansRelationWeekdayParser.js -var require_ZHHansRelationWeekdayParser = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansRelationWeekdayParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var constants_1 = require_constants8(); - var PATTERN = new RegExp("(?\u4E0A|\u4E0B|\u8FD9)(?:\u4E2A)?(?:\u661F\u671F|\u793C\u62DC|\u5468)(?" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")"); - var ZHHansRelationWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const dayOfWeek = match.groups.weekday; - const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek]; - if (offset === void 0) - return null; - let modifier = null; - const prefix = match.groups.prefix; - if (prefix == "\u4E0A") { - modifier = "last"; - } else if (prefix == "\u4E0B") { - modifier = "next"; - } else if (prefix == "\u8FD9") { - modifier = "this"; - } - let startMoment = dayjs_1.default(context.refDate); - let startMomentFixed = false; - const refOffset = startMoment.day(); - if (modifier == "last" || modifier == "past") { - startMoment = startMoment.day(offset - 7); - startMomentFixed = true; - } else if (modifier == "next") { - startMoment = startMoment.day(offset + 7); - startMomentFixed = true; - } else if (modifier == "this") { - startMoment = startMoment.day(offset); - } else { - if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { - startMoment = startMoment.day(offset - 7); - } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { - startMoment = startMoment.day(offset + 7); - } else { - startMoment = startMoment.day(offset); - } - } - result.start.assign("weekday", offset); - if (startMomentFixed) { - result.start.assign("day", startMoment.date()); - result.start.assign("month", startMoment.month() + 1); - result.start.assign("year", startMoment.year()); - } else { - result.start.imply("day", startMoment.date()); - result.start.imply("month", startMoment.month() + 1); - result.start.imply("year", startMoment.year()); - } - return result; - } - }; - exports.default = ZHHansRelationWeekdayParser; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js -var require_ZHHansTimeExpressionParser = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var constants_1 = require_constants8(); - var FIRST_REG_PATTERN = new RegExp("(?:\u4ECE|\u81EA)?(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)(?:\\s*)(?:\u70B9|\u65F6|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?", "i"); - var SECOND_REG_PATTERN = new RegExp("(?:^\\s*(?:\u5230|\u81F3|\\-|\\\u2013|\\~|\\\u301C)\\s*)(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)(?:\\s*)(?:\u70B9|\u65F6|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|[" + Object.keys(constants_1.NUMBER).join("") + "]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?", "i"); - var DAY_GROUP_1 = 1; - var ZH_AM_PM_HOUR_GROUP_1 = 2; - var ZH_AM_PM_HOUR_GROUP_2 = 3; - var DAY_GROUP_3 = 4; - var ZH_AM_PM_HOUR_GROUP_3 = 5; - var HOUR_GROUP = 6; - var MINUTE_GROUP = 7; - var SECOND_GROUP = 8; - var AM_PM_HOUR_GROUP = 9; - var ZHHansTimeExpressionParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return FIRST_REG_PATTERN; - } - innerExtract(context, match) { - if (match.index > 0 && context.text[match.index - 1].match(/\w/)) { - return null; - } - const refMoment = dayjs_1.default(context.refDate); - const result = context.createParsingResult(match.index, match[0]); - const startMoment = refMoment.clone(); - if (match[DAY_GROUP_1]) { - const day1 = match[DAY_GROUP_1]; - if (day1 == "\u660E") { - if (refMoment.hour() > 1) { - startMoment.add(1, "day"); - } - } else if (day1 == "\u6628") { - startMoment.add(-1, "day"); - } else if (day1 == "\u524D") { - startMoment.add(-2, "day"); - } else if (day1 == "\u5927\u524D") { - startMoment.add(-3, "day"); - } else if (day1 == "\u540E") { - startMoment.add(2, "day"); - } else if (day1 == "\u5927\u540E") { - startMoment.add(3, "day"); - } - result.start.assign("day", startMoment.date()); - result.start.assign("month", startMoment.month() + 1); - result.start.assign("year", startMoment.year()); - } else if (match[DAY_GROUP_3]) { - const day3 = match[DAY_GROUP_3]; - if (day3 == "\u660E") { - startMoment.add(1, "day"); - } else if (day3 == "\u6628") { - startMoment.add(-1, "day"); - } else if (day3 == "\u524D") { - startMoment.add(-2, "day"); - } else if (day3 == "\u5927\u524D") { - startMoment.add(-3, "day"); - } else if (day3 == "\u540E") { - startMoment.add(2, "day"); - } else if (day3 == "\u5927\u540E") { - startMoment.add(3, "day"); - } - result.start.assign("day", startMoment.date()); - result.start.assign("month", startMoment.month() + 1); - result.start.assign("year", startMoment.year()); - } else { - result.start.imply("day", startMoment.date()); - result.start.imply("month", startMoment.month() + 1); - result.start.imply("year", startMoment.year()); - } - let hour = 0; - let minute = 0; - let meridiem = -1; - if (match[SECOND_GROUP]) { - let second = parseInt(match[SECOND_GROUP]); - if (isNaN(second)) { - second = constants_1.zhStringToNumber(match[SECOND_GROUP]); - } - if (second >= 60) - return null; - result.start.assign("second", second); - } - hour = parseInt(match[HOUR_GROUP]); - if (isNaN(hour)) { - hour = constants_1.zhStringToNumber(match[HOUR_GROUP]); - } - if (match[MINUTE_GROUP]) { - if (match[MINUTE_GROUP] == "\u534A") { - minute = 30; - } else if (match[MINUTE_GROUP] == "\u6B63" || match[MINUTE_GROUP] == "\u6574") { - minute = 0; - } else { - minute = parseInt(match[MINUTE_GROUP]); - if (isNaN(minute)) { - minute = constants_1.zhStringToNumber(match[MINUTE_GROUP]); - } - } - } else if (hour > 100) { - minute = hour % 100; - hour = Math.floor(hour / 100); - } - if (minute >= 60) { - return null; - } - if (hour > 24) { - return null; - } - if (hour >= 12) { - meridiem = 1; - } - if (match[AM_PM_HOUR_GROUP]) { - if (hour > 12) - return null; - const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); - if (ampm == "a") { - meridiem = 0; - if (hour == 12) - hour = 0; - } - if (ampm == "p") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } else if (match[ZH_AM_PM_HOUR_GROUP_1]) { - const zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1]; - const zhAMPM1 = zhAMPMString1[0]; - if (zhAMPM1 == "\u65E9") { - meridiem = 0; - if (hour == 12) - hour = 0; - } else if (zhAMPM1 == "\u665A") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } else if (match[ZH_AM_PM_HOUR_GROUP_2]) { - const zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2]; - const zhAMPM2 = zhAMPMString2[0]; - if (zhAMPM2 == "\u4E0A" || zhAMPM2 == "\u65E9" || zhAMPM2 == "\u51CC") { - meridiem = 0; - if (hour == 12) - hour = 0; - } else if (zhAMPM2 == "\u4E0B" || zhAMPM2 == "\u665A") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } else if (match[ZH_AM_PM_HOUR_GROUP_3]) { - const zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3]; - const zhAMPM3 = zhAMPMString3[0]; - if (zhAMPM3 == "\u4E0A" || zhAMPM3 == "\u65E9" || zhAMPM3 == "\u51CC") { - meridiem = 0; - if (hour == 12) - hour = 0; - } else if (zhAMPM3 == "\u4E0B" || zhAMPM3 == "\u665A") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } - result.start.assign("hour", hour); - result.start.assign("minute", minute); - if (meridiem >= 0) { - result.start.assign("meridiem", meridiem); - } else { - if (hour < 12) { - result.start.imply("meridiem", 0); - } else { - result.start.imply("meridiem", 1); - } - } - match = SECOND_REG_PATTERN.exec(context.text.substring(result.index + result.text.length)); - if (!match) { - if (result.text.match(/^\d+$/)) { - return null; - } - return result; - } - const endMoment = startMoment.clone(); - result.end = context.createParsingComponents(); - if (match[DAY_GROUP_1]) { - const day1 = match[DAY_GROUP_1]; - if (day1 == "\u660E") { - if (refMoment.hour() > 1) { - endMoment.add(1, "day"); - } - } else if (day1 == "\u6628") { - endMoment.add(-1, "day"); - } else if (day1 == "\u524D") { - endMoment.add(-2, "day"); - } else if (day1 == "\u5927\u524D") { - endMoment.add(-3, "day"); - } else if (day1 == "\u540E") { - endMoment.add(2, "day"); - } else if (day1 == "\u5927\u540E") { - endMoment.add(3, "day"); - } - result.end.assign("day", endMoment.date()); - result.end.assign("month", endMoment.month() + 1); - result.end.assign("year", endMoment.year()); - } else if (match[DAY_GROUP_3]) { - const day3 = match[DAY_GROUP_3]; - if (day3 == "\u660E") { - endMoment.add(1, "day"); - } else if (day3 == "\u6628") { - endMoment.add(-1, "day"); - } else if (day3 == "\u524D") { - endMoment.add(-2, "day"); - } else if (day3 == "\u5927\u524D") { - endMoment.add(-3, "day"); - } else if (day3 == "\u540E") { - endMoment.add(2, "day"); - } else if (day3 == "\u5927\u540E") { - endMoment.add(3, "day"); - } - result.end.assign("day", endMoment.date()); - result.end.assign("month", endMoment.month() + 1); - result.end.assign("year", endMoment.year()); - } else { - result.end.imply("day", endMoment.date()); - result.end.imply("month", endMoment.month() + 1); - result.end.imply("year", endMoment.year()); - } - hour = 0; - minute = 0; - meridiem = -1; - if (match[SECOND_GROUP]) { - let second = parseInt(match[SECOND_GROUP]); - if (isNaN(second)) { - second = constants_1.zhStringToNumber(match[SECOND_GROUP]); - } - if (second >= 60) - return null; - result.end.assign("second", second); - } - hour = parseInt(match[HOUR_GROUP]); - if (isNaN(hour)) { - hour = constants_1.zhStringToNumber(match[HOUR_GROUP]); - } - if (match[MINUTE_GROUP]) { - if (match[MINUTE_GROUP] == "\u534A") { - minute = 30; - } else if (match[MINUTE_GROUP] == "\u6B63" || match[MINUTE_GROUP] == "\u6574") { - minute = 0; - } else { - minute = parseInt(match[MINUTE_GROUP]); - if (isNaN(minute)) { - minute = constants_1.zhStringToNumber(match[MINUTE_GROUP]); - } - } - } else if (hour > 100) { - minute = hour % 100; - hour = Math.floor(hour / 100); - } - if (minute >= 60) { - return null; - } - if (hour > 24) { - return null; - } - if (hour >= 12) { - meridiem = 1; - } - if (match[AM_PM_HOUR_GROUP]) { - if (hour > 12) - return null; - const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase(); - if (ampm == "a") { - meridiem = 0; - if (hour == 12) - hour = 0; - } - if (ampm == "p") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - if (!result.start.isCertain("meridiem")) { - if (meridiem == 0) { - result.start.imply("meridiem", 0); - if (result.start.get("hour") == 12) { - result.start.assign("hour", 0); - } - } else { - result.start.imply("meridiem", 1); - if (result.start.get("hour") != 12) { - result.start.assign("hour", result.start.get("hour") + 12); - } - } - } - } else if (match[ZH_AM_PM_HOUR_GROUP_1]) { - const zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1]; - const zhAMPM1 = zhAMPMString1[0]; - if (zhAMPM1 == "\u65E9") { - meridiem = 0; - if (hour == 12) - hour = 0; - } else if (zhAMPM1 == "\u665A") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } else if (match[ZH_AM_PM_HOUR_GROUP_2]) { - const zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2]; - const zhAMPM2 = zhAMPMString2[0]; - if (zhAMPM2 == "\u4E0A" || zhAMPM2 == "\u65E9" || zhAMPM2 == "\u51CC") { - meridiem = 0; - if (hour == 12) - hour = 0; - } else if (zhAMPM2 == "\u4E0B" || zhAMPM2 == "\u665A") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } else if (match[ZH_AM_PM_HOUR_GROUP_3]) { - const zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3]; - const zhAMPM3 = zhAMPMString3[0]; - if (zhAMPM3 == "\u4E0A" || zhAMPM3 == "\u65E9" || zhAMPM3 == "\u51CC") { - meridiem = 0; - if (hour == 12) - hour = 0; - } else if (zhAMPM3 == "\u4E0B" || zhAMPM3 == "\u665A") { - meridiem = 1; - if (hour != 12) - hour += 12; - } - } - result.text = result.text + match[0]; - result.end.assign("hour", hour); - result.end.assign("minute", minute); - if (meridiem >= 0) { - result.end.assign("meridiem", meridiem); - } else { - const startAtPM = result.start.isCertain("meridiem") && result.start.get("meridiem") == 1; - if (startAtPM && result.start.get("hour") > hour) { - result.end.imply("meridiem", 0); - } else if (hour > 12) { - result.end.imply("meridiem", 1); - } - } - if (result.end.date().getTime() < result.start.date().getTime()) { - result.end.imply("day", result.end.get("day") + 1); - } - return result; - } - }; - exports.default = ZHHansTimeExpressionParser; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansWeekdayParser.js -var require_ZHHansWeekdayParser = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hans/parsers/ZHHansWeekdayParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var constants_1 = require_constants8(); - var PATTERN = new RegExp("(?:\u661F\u671F|\u793C\u62DC|\u5468)(?" + Object.keys(constants_1.WEEKDAY_OFFSET).join("|") + ")"); - var ZHHansWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const dayOfWeek = match.groups.weekday; - const offset = constants_1.WEEKDAY_OFFSET[dayOfWeek]; - if (offset === void 0) - return null; - let startMoment = dayjs_1.default(context.refDate); - const startMomentFixed = false; - const refOffset = startMoment.day(); - if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) { - startMoment = startMoment.day(offset - 7); - } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) { - startMoment = startMoment.day(offset + 7); - } else { - startMoment = startMoment.day(offset); - } - result.start.assign("weekday", offset); - if (startMomentFixed) { - result.start.assign("day", startMoment.date()); - result.start.assign("month", startMoment.month() + 1); - result.start.assign("year", startMoment.year()); - } else { - result.start.imply("day", startMoment.date()); - result.start.imply("month", startMoment.month() + 1); - result.start.imply("year", startMoment.year()); - } - return result; - } - }; - exports.default = ZHHansWeekdayParser; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hans/refiners/ZHHansMergeDateRangeRefiner.js -var require_ZHHansMergeDateRangeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hans/refiners/ZHHansMergeDateRangeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); - var ZHHansMergeDateRangeRefiner = class extends AbstractMergeDateRangeRefiner_1.default { - patternBetween() { - return /^\s*(至|到|-|~|~|-|ー)\s*$/i; - } - }; - exports.default = ZHHansMergeDateRangeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hans/refiners/ZHHansMergeDateTimeRefiner.js -var require_ZHHansMergeDateTimeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hans/refiners/ZHHansMergeDateTimeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); - var ZHHansMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return /^\s*$/i; - } - }; - exports.default = ZHHansMergeDateTimeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/zh/hans/index.js -var require_hans = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/hans/index.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = exports.hans = void 0; - var chrono_1 = require_chrono(); - var ExtractTimezoneOffsetRefiner_1 = __importDefault2(require_ExtractTimezoneOffsetRefiner()); - var configurations_1 = require_configurations(); - var ZHHansCasualDateParser_1 = __importDefault2(require_ZHHansCasualDateParser()); - var ZHHansDateParser_1 = __importDefault2(require_ZHHansDateParser()); - var ZHHansDeadlineFormatParser_1 = __importDefault2(require_ZHHansDeadlineFormatParser()); - var ZHHansRelationWeekdayParser_1 = __importDefault2(require_ZHHansRelationWeekdayParser()); - var ZHHansTimeExpressionParser_1 = __importDefault2(require_ZHHansTimeExpressionParser()); - var ZHHansWeekdayParser_1 = __importDefault2(require_ZHHansWeekdayParser()); - var ZHHansMergeDateRangeRefiner_1 = __importDefault2(require_ZHHansMergeDateRangeRefiner()); - var ZHHansMergeDateTimeRefiner_1 = __importDefault2(require_ZHHansMergeDateTimeRefiner()); - exports.hans = new chrono_1.Chrono(createCasualConfiguration()); - exports.casual = new chrono_1.Chrono(createCasualConfiguration()); - exports.strict = new chrono_1.Chrono(createConfiguration()); - function parse(text2, ref, option) { - return exports.casual.parse(text2, ref, option); - } - exports.parse = parse; - function parseDate3(text2, ref, option) { - return exports.casual.parseDate(text2, ref, option); - } - exports.parseDate = parseDate3; - function createCasualConfiguration() { - const option = createConfiguration(); - option.parsers.unshift(new ZHHansCasualDateParser_1.default()); - return option; - } - exports.createCasualConfiguration = createCasualConfiguration; - function createConfiguration() { - const configuration = configurations_1.includeCommonConfiguration({ - parsers: [ - new ZHHansDateParser_1.default(), - new ZHHansRelationWeekdayParser_1.default(), - new ZHHansWeekdayParser_1.default(), - new ZHHansTimeExpressionParser_1.default(), - new ZHHansDeadlineFormatParser_1.default() - ], - refiners: [new ZHHansMergeDateRangeRefiner_1.default(), new ZHHansMergeDateTimeRefiner_1.default()] - }); - configuration.refiners = configuration.refiners.filter((refiner) => !(refiner instanceof ExtractTimezoneOffsetRefiner_1.default)); - return configuration; - } - exports.createConfiguration = createConfiguration; - } -}); - -// node_modules/chrono-node/dist/locales/zh/index.js -var require_zh = __commonJS({ - "node_modules/chrono-node/dist/locales/zh/index.js"(exports) { - "use strict"; - var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __exportStar2 = exports && exports.__exportStar || function(m, exports2) { - for (var p in m) - if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p)) - __createBinding2(exports2, m, p); - }; - var __importStar2 = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding2(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.hans = void 0; - __exportStar2(require_hant(), exports); - exports.hans = __importStar2(require_hans()); - } -}); - -// node_modules/chrono-node/dist/locales/ru/constants.js -var require_constants9 = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/constants.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.FULL_MONTH_NAME_DICTIONARY = exports.WEEKDAY_DICTIONARY = exports.REGEX_PARTS = void 0; - var pattern_1 = require_pattern(); - var years_1 = require_years(); - exports.REGEX_PARTS = { - leftBoundary: "([^\\p{L}\\p{N}_]|^)", - rightBoundary: "(?=[^\\p{L}\\p{N}_]|$)", - flags: "iu" - }; - exports.WEEKDAY_DICTIONARY = { - \u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435: 0, - \u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u044F: 0, - \u0432\u0441\u043A: 0, - "\u0432\u0441\u043A.": 0, - \u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A: 1, - \u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A\u0430: 1, - \u043F\u043D: 1, - "\u043F\u043D.": 1, - \u0432\u0442\u043E\u0440\u043D\u0438\u043A: 2, - \u0432\u0442\u043E\u0440\u043D\u0438\u043A\u0430: 2, - \u0432\u0442: 2, - "\u0432\u0442.": 2, - \u0441\u0440\u0435\u0434\u0430: 3, - \u0441\u0440\u0435\u0434\u044B: 3, - \u0441\u0440\u0435\u0434\u0443: 3, - \u0441\u0440: 3, - "\u0441\u0440.": 3, - \u0447\u0435\u0442\u0432\u0435\u0440\u0433: 4, - \u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430: 4, - \u0447\u0442: 4, - "\u0447\u0442.": 4, - \u043F\u044F\u0442\u043D\u0438\u0446\u0430: 5, - \u043F\u044F\u0442\u043D\u0438\u0446\u0443: 5, - \u043F\u044F\u0442\u043D\u0438\u0446\u044B: 5, - \u043F\u0442: 5, - "\u043F\u0442.": 5, - \u0441\u0443\u0431\u0431\u043E\u0442\u0430: 6, - \u0441\u0443\u0431\u0431\u043E\u0442\u0443: 6, - \u0441\u0443\u0431\u0431\u043E\u0442\u044B: 6, - \u0441\u0431: 6, - "\u0441\u0431.": 6 - }; - exports.FULL_MONTH_NAME_DICTIONARY = { - \u044F\u043D\u0432\u0430\u0440\u044C: 1, - \u044F\u043D\u0432\u0430\u0440\u044F: 1, - \u044F\u043D\u0432\u0430\u0440\u0435: 1, - \u0444\u0435\u0432\u0440\u044F\u043B\u044C: 2, - \u0444\u0435\u0432\u0440\u044F\u043B\u044F: 2, - \u0444\u0435\u0432\u0440\u044F\u043B\u0435: 2, - \u043C\u0430\u0440\u0442: 3, - \u043C\u0430\u0440\u0442\u0430: 3, - \u043C\u0430\u0440\u0442\u0435: 3, - \u0430\u043F\u0440\u0435\u043B\u044C: 4, - \u0430\u043F\u0440\u0435\u043B\u044F: 4, - \u0430\u043F\u0440\u0435\u043B\u0435: 4, - \u043C\u0430\u0439: 5, - \u043C\u0430\u044F: 5, - \u043C\u0430\u0435: 5, - \u0438\u044E\u043D\u044C: 6, - \u0438\u044E\u043D\u044F: 6, - \u0438\u044E\u043D\u0435: 6, - \u0438\u044E\u043B\u044C: 7, - \u0438\u044E\u043B\u044F: 7, - \u0438\u044E\u043B\u0435: 7, - \u0430\u0432\u0433\u0443\u0441\u0442: 8, - \u0430\u0432\u0433\u0443\u0441\u0442\u0430: 8, - \u0430\u0432\u0433\u0443\u0441\u0442\u0435: 8, - \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C: 9, - \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044F: 9, - \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u0435: 9, - \u043E\u043A\u0442\u044F\u0431\u0440\u044C: 10, - \u043E\u043A\u0442\u044F\u0431\u0440\u044F: 10, - \u043E\u043A\u0442\u044F\u0431\u0440\u0435: 10, - \u043D\u043E\u044F\u0431\u0440\u044C: 11, - \u043D\u043E\u044F\u0431\u0440\u044F: 11, - \u043D\u043E\u044F\u0431\u0440\u0435: 11, - \u0434\u0435\u043A\u0430\u0431\u0440\u044C: 12, - \u0434\u0435\u043A\u0430\u0431\u0440\u044F: 12, - \u0434\u0435\u043A\u0430\u0431\u0440\u0435: 12 - }; - exports.MONTH_DICTIONARY = Object.assign(Object.assign({}, exports.FULL_MONTH_NAME_DICTIONARY), { \u044F\u043D\u0432: 1, "\u044F\u043D\u0432.": 1, \u0444\u0435\u0432: 2, "\u0444\u0435\u0432.": 2, \u043C\u0430\u0440: 3, "\u043C\u0430\u0440.": 3, \u0430\u043F\u0440: 4, "\u0430\u043F\u0440.": 4, \u0430\u0432\u0433: 8, "\u0430\u0432\u0433.": 8, \u0441\u0435\u043D: 9, "\u0441\u0435\u043D.": 9, \u043E\u043A\u0442: 10, "\u043E\u043A\u0442.": 10, \u043D\u043E\u044F: 11, "\u043D\u043E\u044F.": 11, \u0434\u0435\u043A: 12, "\u0434\u0435\u043A.": 12 }); - exports.INTEGER_WORD_DICTIONARY = { - \u043E\u0434\u0438\u043D: 1, - \u043E\u0434\u043D\u0430: 1, - \u043E\u0434\u043D\u043E\u0439: 1, - \u043E\u0434\u043D\u0443: 1, - \u0434\u0432\u0435: 2, - \u0434\u0432\u0430: 2, - \u0434\u0432\u0443\u0445: 2, - \u0442\u0440\u0438: 3, - \u0442\u0440\u0435\u0445: 3, - \u0442\u0440\u0451\u0445: 3, - \u0447\u0435\u0442\u044B\u0440\u0435: 4, - \u0447\u0435\u0442\u044B\u0440\u0435\u0445: 4, - \u0447\u0435\u0442\u044B\u0440\u0451\u0445: 4, - \u043F\u044F\u0442\u044C: 5, - \u043F\u044F\u0442\u0438: 5, - \u0448\u0435\u0441\u0442\u044C: 6, - \u0448\u0435\u0441\u0442\u0438: 6, - \u0441\u0435\u043C\u044C: 7, - \u0441\u0435\u043C\u0438: 7, - \u0432\u043E\u0441\u0435\u043C\u044C: 8, - \u0432\u043E\u0441\u0435\u043C\u044C\u043C\u0438: 8, - \u0434\u0435\u0432\u044F\u0442\u044C: 9, - \u0434\u0435\u0432\u044F\u0442\u0438: 9, - \u0434\u0435\u0441\u044F\u0442\u044C: 10, - \u0434\u0435\u0441\u044F\u0442\u0438: 10, - \u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u044C: 11, - \u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u0438: 11, - \u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u044C: 12, - \u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u0438: 12 - }; - exports.ORDINAL_WORD_DICTIONARY = { - \u043F\u0435\u0440\u0432\u043E\u0435: 1, - \u043F\u0435\u0440\u0432\u043E\u0433\u043E: 1, - \u0432\u0442\u043E\u0440\u043E\u0435: 2, - \u0432\u0442\u043E\u0440\u043E\u0433\u043E: 2, - \u0442\u0440\u0435\u0442\u044C\u0435: 3, - \u0442\u0440\u0435\u0442\u044C\u0435\u0433\u043E: 3, - \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0435: 4, - \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0433\u043E: 4, - \u043F\u044F\u0442\u043E\u0435: 5, - \u043F\u044F\u0442\u043E\u0433\u043E: 5, - \u0448\u0435\u0441\u0442\u043E\u0435: 6, - \u0448\u0435\u0441\u0442\u043E\u0433\u043E: 6, - \u0441\u0435\u0434\u044C\u043C\u043E\u0435: 7, - \u0441\u0435\u0434\u044C\u043C\u043E\u0433\u043E: 7, - \u0432\u043E\u0441\u044C\u043C\u043E\u0435: 8, - \u0432\u043E\u0441\u044C\u043C\u043E\u0433\u043E: 8, - \u0434\u0435\u0432\u044F\u0442\u043E\u0435: 9, - \u0434\u0435\u0432\u044F\u0442\u043E\u0433\u043E: 9, - \u0434\u0435\u0441\u044F\u0442\u043E\u0435: 10, - \u0434\u0435\u0441\u044F\u0442\u043E\u0433\u043E: 10, - \u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 11, - \u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 11, - \u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 12, - \u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 12, - \u0442\u0440\u0438\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 13, - \u0442\u0440\u0438\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 13, - \u0447\u0435\u0442\u044B\u0440\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 14, - \u0447\u0435\u0442\u044B\u0440\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 14, - \u043F\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 15, - \u043F\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 15, - \u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 16, - \u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 16, - \u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 17, - \u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 17, - \u0432\u043E\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 18, - \u0432\u043E\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 18, - \u0434\u0435\u0432\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 19, - \u0434\u0435\u0432\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 19, - \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u043E\u0435: 20, - \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E: 20, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435": 21, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0433\u043E": 21, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u0442\u043E\u0440\u043E\u0435": 22, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u0442\u043E\u0440\u043E\u0433\u043E": 22, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0442\u0440\u0435\u0442\u044C\u0435": 23, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0442\u0440\u0435\u0442\u044C\u0435\u0433\u043E": 23, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0435": 24, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0433\u043E": 24, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u044F\u0442\u043E\u0435": 25, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u044F\u0442\u043E\u0433\u043E": 25, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0448\u0435\u0441\u0442\u043E\u0435": 26, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0448\u0435\u0441\u0442\u043E\u0433\u043E": 26, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0441\u0435\u0434\u044C\u043C\u043E\u0435": 27, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0441\u0435\u0434\u044C\u043C\u043E\u0433\u043E": 27, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u043E\u0441\u044C\u043C\u043E\u0435": 28, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u043E\u0441\u044C\u043C\u043E\u0433\u043E": 28, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0434\u0435\u0432\u044F\u0442\u043E\u0435": 29, - "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0434\u0435\u0432\u044F\u0442\u043E\u0433\u043E": 29, - "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u043E\u0435": 30, - "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u043E\u0433\u043E": 30, - "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435": 31, - "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0433\u043E": 31 - }; - exports.TIME_UNIT_DICTIONARY = { - \u0441\u0435\u043A: "second", - \u0441\u0435\u043A\u0443\u043D\u0434\u0430: "second", - \u0441\u0435\u043A\u0443\u043D\u0434: "second", - \u0441\u0435\u043A\u0443\u043D\u0434\u044B: "second", - \u0441\u0435\u043A\u0443\u043D\u0434\u0443: "second", - \u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0430: "second", - \u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0438: "second", - \u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u0435\u043A: "second", - \u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0443: "second", - \u043C\u0438\u043D: "minute", - \u043C\u0438\u043D\u0443\u0442\u0430: "minute", - \u043C\u0438\u043D\u0443\u0442: "minute", - \u043C\u0438\u043D\u0443\u0442\u044B: "minute", - \u043C\u0438\u043D\u0443\u0442\u0443: "minute", - \u043C\u0438\u043D\u0443\u0442\u043E\u043A: "minute", - \u043C\u0438\u043D\u0443\u0442\u043A\u0438: "minute", - \u043C\u0438\u043D\u0443\u0442\u043A\u0443: "minute", - \u0447\u0430\u0441: "hour", - \u0447\u0430\u0441\u043E\u0432: "hour", - \u0447\u0430\u0441\u0430: "hour", - \u0447\u0430\u0441\u0443: "hour", - \u0447\u0430\u0441\u0438\u043A\u043E\u0432: "hour", - \u0447\u0430\u0441\u0438\u043A\u0430: "hour", - \u0447\u0430\u0441\u0438\u043A\u0435: "hour", - \u0447\u0430\u0441\u0438\u043A: "hour", - \u0434\u0435\u043D\u044C: "d", - \u0434\u043D\u044F: "d", - \u0434\u043D\u0435\u0439: "d", - \u0441\u0443\u0442\u043E\u043A: "d", - \u0441\u0443\u0442\u043A\u0438: "d", - \u043D\u0435\u0434\u0435\u043B\u044F: "week", - \u043D\u0435\u0434\u0435\u043B\u0435: "week", - \u043D\u0435\u0434\u0435\u043B\u0438: "week", - \u043D\u0435\u0434\u0435\u043B\u044E: "week", - \u043D\u0435\u0434\u0435\u043B\u044C: "week", - \u043D\u0435\u0434\u0435\u043B\u044C\u043A\u0435: "week", - \u043D\u0435\u0434\u0435\u043B\u044C\u043A\u0438: "week", - \u043D\u0435\u0434\u0435\u043B\u0435\u043A: "week", - \u043C\u0435\u0441\u044F\u0446: "month", - \u043C\u0435\u0441\u044F\u0446\u0435: "month", - \u043C\u0435\u0441\u044F\u0446\u0435\u0432: "month", - \u043C\u0435\u0441\u044F\u0446\u0430: "month", - \u043A\u0432\u0430\u0440\u0442\u0430\u043B: "quarter", - \u043A\u0432\u0430\u0440\u0442\u0430\u043B\u0435: "quarter", - \u043A\u0432\u0430\u0440\u0442\u0430\u043B\u043E\u0432: "quarter", - \u0433\u043E\u0434: "year", - \u0433\u043E\u0434\u0430: "year", - \u0433\u043E\u0434\u0443: "year", - \u0433\u043E\u0434\u043E\u0432: "year", - \u043B\u0435\u0442: "year", - \u0433\u043E\u0434\u0438\u043A: "year", - \u0433\u043E\u0434\u0438\u043A\u0430: "year", - \u0433\u043E\u0434\u0438\u043A\u043E\u0432: "year" - }; - exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|\u043F\u043E\u043B|\u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E|\u043F\u0430\u0440(?:\u044B|\u0443)|\\s{0,3})`; - function parseNumberPattern(match) { - const num = match.toLowerCase(); - if (exports.INTEGER_WORD_DICTIONARY[num] !== void 0) { - return exports.INTEGER_WORD_DICTIONARY[num]; - } - if (num.match(/несколько/)) { - return 3; - } else if (num.match(/пол/)) { - return 0.5; - } else if (num.match(/пар/)) { - return 2; - } else if (num === "") { - return 1; - } - return parseFloat(num); - } - exports.parseNumberPattern = parseNumberPattern; - exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:\u0433\u043E|\u043E\u0433\u043E|\u0435|\u043E\u0435)?)`; - function parseOrdinalNumberPattern(match) { - let num = match.toLowerCase(); - if (exports.ORDINAL_WORD_DICTIONARY[num] !== void 0) { - return exports.ORDINAL_WORD_DICTIONARY[num]; - } - num = num.replace(/(?:st|nd|rd|th)$/i, ""); - return parseInt(num); - } - exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern; - var year = "(?:\\s+(?:\u0433\u043E\u0434\u0443|\u0433\u043E\u0434\u0430|\u0433\u043E\u0434|\u0433|\u0433.))?"; - exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}${year}\\s*(?:\u043D.\u044D.|\u0434\u043E \u043D.\u044D.|\u043D. \u044D.|\u0434\u043E \u043D. \u044D.)|[1-2][0-9]{3}${year}|[5-9][0-9]${year})`; - function parseYear(match) { - if (/(год|года|г|г.)/i.test(match)) { - match = match.replace(/(год|года|г|г.)/i, ""); - } - if (/(до н.э.|до н. э.)/i.test(match)) { - match = match.replace(/(до н.э.|до н. э.)/i, ""); - return -parseInt(match); - } - if (/(н. э.|н.э.)/i.test(match)) { - match = match.replace(/(н. э.|н.э.)/i, ""); - return parseInt(match); - } - const rawYearNumber = parseInt(match); - return years_1.findMostLikelyADYear(rawYearNumber); - } - exports.parseYear = parseYear; - var SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,3}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})`; - var SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i"); - exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:\u043E\u043A\u043E\u043B\u043E|\u043F\u0440\u0438\u043C\u0435\u0440\u043D\u043E)\\s{0,3})?`, SINGLE_TIME_UNIT_PATTERN); - function parseTimeUnits(timeunitText) { - const fragments = {}; - let remainingText = timeunitText; - let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - while (match) { - collectDateTimeFragment(fragments, match); - remainingText = remainingText.substring(match[0].length).trim(); - match = SINGLE_TIME_UNIT_REGEX.exec(remainingText); - } - return fragments; - } - exports.parseTimeUnits = parseTimeUnits; - function collectDateTimeFragment(fragments, match) { - const num = parseNumberPattern(match[1]); - const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()]; - fragments[unit] = num; - } - } -}); - -// node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitWithinFormatParser.js -var require_RUTimeUnitWithinFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitWithinFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants9(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = `(?:(?:\u043E\u043A\u043E\u043B\u043E|\u043F\u0440\u0438\u043C\u0435\u0440\u043D\u043E)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})${constants_1.REGEX_PARTS.rightBoundary}`; - var PATTERN_WITH_PREFIX = new RegExp(`(?:\u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0435|\u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0438)\\s*${PATTERN}`, constants_1.REGEX_PARTS.flags); - var PATTERN_WITHOUT_PREFIX = new RegExp(PATTERN, "i"); - var RUTimeUnitWithinFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - patternLeftBoundary() { - return constants_1.REGEX_PARTS.leftBoundary; - } - innerPattern(context) { - return context.option.forwardDate ? PATTERN_WITHOUT_PREFIX : PATTERN_WITH_PREFIX; - } - innerExtract(context, match) { - const timeUnits = constants_1.parseTimeUnits(match[1]); - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - }; - exports.default = RUTimeUnitWithinFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/ru/parsers/RUMonthNameLittleEndianParser.js -var require_RUMonthNameLittleEndianParser = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/parsers/RUMonthNameLittleEndianParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var years_1 = require_years(); - var constants_1 = require_constants9(); - var constants_2 = require_constants9(); - var constants_3 = require_constants9(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`(?:\u0441)?\\s*(${constants_3.ORDINAL_NUMBER_PATTERN})(?:\\s{0,3}(?:\u043F\u043E|-|\u2013|\u0434\u043E)?\\s{0,3}(${constants_3.ORDINAL_NUMBER_PATTERN}))?(?:-|\\/|\\s{0,3}(?:of)?\\s{0,3})(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})(?:(?:-|\\/|,?\\s{0,3})(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); - var DATE_GROUP = 1; - var DATE_TO_GROUP = 2; - var MONTH_NAME_GROUP = 3; - var YEAR_GROUP = 4; - var RUMonthNameLittleEndianParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - patternLeftBoundary() { - return constants_1.REGEX_PARTS.leftBoundary; - } - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const result = context.createParsingResult(match.index, match[0]); - const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()]; - const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]); - if (day > 31) { - match.index = match.index + match[DATE_GROUP].length; - return null; - } - result.start.assign("month", month); - result.start.assign("day", day); - if (match[YEAR_GROUP]) { - const yearNumber = constants_2.parseYear(match[YEAR_GROUP]); - result.start.assign("year", yearNumber); - } else { - const year = years_1.findYearClosestToRef(context.refDate, day, month); - result.start.imply("year", year); - } - if (match[DATE_TO_GROUP]) { - const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]); - result.end = result.start.clone(); - result.end.assign("day", endDate); - } - return result; - } - }; - exports.default = RUMonthNameLittleEndianParser; - } -}); - -// node_modules/chrono-node/dist/locales/ru/parsers/RUMonthNameParser.js -var require_RUMonthNameParser = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/parsers/RUMonthNameParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants9(); - var years_1 = require_years(); - var pattern_1 = require_pattern(); - var constants_2 = require_constants9(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var PATTERN = new RegExp(`((?:\u0432)\\s*)?(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${constants_2.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`, constants_1.REGEX_PARTS.flags); - var MONTH_NAME_GROUP = 2; - var YEAR_GROUP = 3; - var RUMonthNameParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - patternLeftBoundary() { - return constants_1.REGEX_PARTS.leftBoundary; - } - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const monthName = match[MONTH_NAME_GROUP].toLowerCase(); - if (match[0].length <= 3 && !constants_1.FULL_MONTH_NAME_DICTIONARY[monthName]) { - return null; - } - const result = context.createParsingResult(match.index, match.index + match[0].length); - result.start.imply("day", 1); - const month = constants_1.MONTH_DICTIONARY[monthName]; - result.start.assign("month", month); - if (match[YEAR_GROUP]) { - const year = constants_2.parseYear(match[YEAR_GROUP]); - result.start.assign("year", year); - } else { - const year = years_1.findYearClosestToRef(context.refDate, 1, month); - result.start.imply("year", year); - } - return result; - } - }; - exports.default = RUMonthNameParser; - } -}); - -// node_modules/chrono-node/dist/locales/ru/parsers/RUTimeExpressionParser.js -var require_RUTimeExpressionParser = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/parsers/RUTimeExpressionParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var index_1 = require_dist(); - var AbstractTimeExpressionParser_1 = require_AbstractTimeExpressionParser(); - var constants_1 = require_constants9(); - var RUTimeExpressionParser = class extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser { - constructor(strictMode) { - super(strictMode); - } - patternFlags() { - return constants_1.REGEX_PARTS.flags; - } - primaryPatternLeftBoundary() { - return `(^|\\s|T|(?:[^\\p{L}\\p{N}_]))`; - } - followingPhase() { - return `\\s*(?:\\-|\\\u2013|\\~|\\\u301C|\u0434\u043E|\u0438|\u043F\u043E|\\?)\\s*`; - } - primaryPrefix() { - return `(?:(?:\u0432|\u0441)\\s*)??`; - } - primarySuffix() { - return `(?:\\s*(?:\u0443\u0442\u0440\u0430|\u0432\u0435\u0447\u0435\u0440\u0430|\u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043B\u0443\u0434\u043D\u044F))?(?!\\/)${constants_1.REGEX_PARTS.rightBoundary}`; - } - extractPrimaryTimeComponents(context, match) { - const components = super.extractPrimaryTimeComponents(context, match); - if (components) { - if (match[0].endsWith("\u0432\u0435\u0447\u0435\u0440\u0430")) { - const hour = components.get("hour"); - if (hour >= 6 && hour < 12) { - components.assign("hour", components.get("hour") + 12); - components.assign("meridiem", index_1.Meridiem.PM); - } else if (hour < 6) { - components.assign("meridiem", index_1.Meridiem.AM); - } - } - if (match[0].endsWith("\u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043B\u0443\u0434\u043D\u044F")) { - components.assign("meridiem", index_1.Meridiem.PM); - const hour = components.get("hour"); - if (hour >= 0 && hour <= 6) { - components.assign("hour", components.get("hour") + 12); - } - } - if (match[0].endsWith("\u0443\u0442\u0440\u0430")) { - components.assign("meridiem", index_1.Meridiem.AM); - const hour = components.get("hour"); - if (hour < 12) { - components.assign("hour", components.get("hour")); - } - } - } - return components; - } - }; - exports.default = RUTimeExpressionParser; - } -}); - -// node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitAgoFormatParser.js -var require_RUTimeUnitAgoFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitAgoFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants9(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var timeunits_1 = require_timeunits(); - var PATTERN = new RegExp(`(${constants_1.TIME_UNITS_PATTERN})\\s{0,5}\u043D\u0430\u0437\u0430\u0434(?=(?:\\W|$))`, constants_1.REGEX_PARTS.flags); - var RUTimeUnitAgoFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - patternLeftBoundary() { - return constants_1.REGEX_PARTS.leftBoundary; - } - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const timeUnits = constants_1.parseTimeUnits(match[1]); - const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits); - return results_1.ParsingComponents.createRelativeFromReference(context.reference, outputTimeUnits); - } - }; - exports.default = RUTimeUnitAgoFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/ru/refiners/RUMergeDateRangeRefiner.js -var require_RUMergeDateRangeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/refiners/RUMergeDateRangeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateRangeRefiner_1 = __importDefault2(require_AbstractMergeDateRangeRefiner()); - var xf = class extends AbstractMergeDateRangeRefiner_1.default { - patternBetween() { - return /^\s*(и до|и по|до|по|-)\s*$/i; - } - }; - exports.default = xf; - } -}); - -// node_modules/chrono-node/dist/locales/ru/refiners/RUMergeDateTimeRefiner.js -var require_RUMergeDateTimeRefiner = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/refiners/RUMergeDateTimeRefiner.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractMergeDateTimeRefiner_1 = __importDefault2(require_AbstractMergeDateTimeRefiner()); - var RUMergeDateTimeRefiner = class extends AbstractMergeDateTimeRefiner_1.default { - patternBetween() { - return new RegExp(`^\\s*(T|\u0432|,|-)?\\s*$`); - } - }; - exports.default = RUMergeDateTimeRefiner; - } -}); - -// node_modules/chrono-node/dist/locales/ru/parsers/RUCasualDateParser.js -var require_RUCasualDateParser = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/parsers/RUCasualDateParser.js"(exports) { - "use strict"; - var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar2 = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding2(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var references = __importStar2(require_casualReferences()); - var constants_1 = require_constants9(); - var PATTERN = new RegExp(`(?:\u0441|\u0441\u043E)?\\s*(\u0441\u0435\u0433\u043E\u0434\u043D\u044F|\u0432\u0447\u0435\u0440\u0430|\u0437\u0430\u0432\u0442\u0440\u0430|\u043F\u043E\u0441\u043B\u0435\u0437\u0430\u0432\u0442\u0440\u0430|\u043F\u043E\u0437\u0430\u0432\u0447\u0435\u0440\u0430)${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); - var RUCasualDateParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - patternLeftBoundary() { - return constants_1.REGEX_PARTS.leftBoundary; - } - innerPattern(context) { - return PATTERN; - } - innerExtract(context, match) { - const lowerText = match[1].toLowerCase(); - const component = context.createParsingComponents(); - switch (lowerText) { - case "\u0441\u0435\u0433\u043E\u0434\u043D\u044F": - return references.today(context.reference); - case "\u0432\u0447\u0435\u0440\u0430": - return references.yesterday(context.reference); - case "\u0437\u0430\u0432\u0442\u0440\u0430": - return references.tomorrow(context.reference); - case "\u043F\u043E\u0441\u043B\u0435\u0437\u0430\u0432\u0442\u0440\u0430": - return references.theDayAfter(context.reference, 2); - case "\u043F\u043E\u0437\u0430\u0432\u0447\u0435\u0440\u0430": - return references.theDayBefore(context.reference, 2); - } - return component; - } - }; - exports.default = RUCasualDateParser; - } -}); - -// node_modules/chrono-node/dist/locales/ru/parsers/RUCasualTimeParser.js -var require_RUCasualTimeParser = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/parsers/RUCasualTimeParser.js"(exports) { - "use strict"; - var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar2 = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding2(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var references = __importStar2(require_casualReferences()); - var dayjs_1 = require_dayjs(); - var dayjs_2 = __importDefault2(require_dayjs_min()); - var constants_1 = require_constants9(); - var PATTERN = new RegExp(`(\u0441\u0435\u0439\u0447\u0430\u0441|\u043F\u0440\u043E\u0448\u043B\u044B\u043C\\s*\u0432\u0435\u0447\u0435\u0440\u043E\u043C|\u043F\u0440\u043E\u0448\u043B\u043E\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u0441\u0435\u0433\u043E\u0434\u043D\u044F\\s*\u043D\u043E\u0447\u044C\u044E|\u044D\u0442\u043E\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u043D\u043E\u0447\u044C\u044E|\u044D\u0442\u0438\u043C \u0443\u0442\u0440\u043E\u043C|\u0443\u0442\u0440\u043E\u043C|\u0443\u0442\u0440\u0430|\u0432\\s*\u043F\u043E\u043B\u0434\u0435\u043D\u044C|\u0432\u0435\u0447\u0435\u0440\u043E\u043C|\u0432\u0435\u0447\u0435\u0440\u0430|\u0432\\s*\u043F\u043E\u043B\u043D\u043E\u0447\u044C)${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); - var RUCasualTimeParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - patternLeftBoundary() { - return constants_1.REGEX_PARTS.leftBoundary; - } - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - let targetDate = dayjs_2.default(context.refDate); - const lowerText = match[0].toLowerCase(); - const component = context.createParsingComponents(); - if (lowerText === "\u0441\u0435\u0439\u0447\u0430\u0441") { - return references.now(context.reference); - } - if (lowerText === "\u0432\u0435\u0447\u0435\u0440\u043E\u043C" || lowerText === "\u0432\u0435\u0447\u0435\u0440\u0430") { - return references.evening(context.reference); - } - if (lowerText.endsWith("\u0443\u0442\u0440\u043E\u043C") || lowerText.endsWith("\u0443\u0442\u0440\u0430")) { - return references.morning(context.reference); - } - if (lowerText.match(/в\s*полдень/)) { - return references.noon(context.reference); - } - if (lowerText.match(/прошлой\s*ночью/)) { - return references.lastNight(context.reference); - } - if (lowerText.match(/прошлым\s*вечером/)) { - return references.yesterdayEvening(context.reference); - } - if (lowerText.match(/следующей\s*ночью/)) { - const daysToAdd = targetDate.hour() < 22 ? 1 : 2; - targetDate = targetDate.add(daysToAdd, "day"); - dayjs_1.assignSimilarDate(component, targetDate); - component.imply("hour", 0); - } - if (lowerText.match(/в\s*полночь/) || lowerText.endsWith("\u043D\u043E\u0447\u044C\u044E")) { - return references.midnight(context.reference); - } - return component; - } - }; - exports.default = RUCasualTimeParser; - } -}); - -// node_modules/chrono-node/dist/locales/ru/parsers/RUWeekdayParser.js -var require_RUWeekdayParser = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/parsers/RUWeekdayParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants9(); - var pattern_1 = require_pattern(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var weeks_1 = require_weeks(); - var PATTERN = new RegExp(`(?:(?:,|\\(|\uFF08)\\s*)?(?:\u0432\\s*?)?(?:(\u044D\u0442\u0443|\u044D\u0442\u043E\u0442|\u043F\u0440\u043E\u0448\u043B\u044B\u0439|\u043F\u0440\u043E\u0448\u043B\u0443\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E)\\s*)?(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})(?:\\s*(?:,|\\)|\uFF09))?(?:\\s*\u043D\u0430\\s*(\u044D\u0442\u043E\u0439|\u043F\u0440\u043E\u0448\u043B\u043E\u0439|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439)\\s*\u043D\u0435\u0434\u0435\u043B\u0435)?${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); - var PREFIX_GROUP = 1; - var WEEKDAY_GROUP = 2; - var POSTFIX_GROUP = 3; - var RUWeekdayParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - innerPattern() { - return PATTERN; - } - patternLeftBoundary() { - return constants_1.REGEX_PARTS.leftBoundary; - } - innerExtract(context, match) { - const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase(); - const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek]; - const prefix = match[PREFIX_GROUP]; - const postfix = match[POSTFIX_GROUP]; - let modifierWord = prefix || postfix; - modifierWord = modifierWord || ""; - modifierWord = modifierWord.toLowerCase(); - let modifier = null; - if (modifierWord == "\u043F\u0440\u043E\u0448\u043B\u044B\u0439" || modifierWord == "\u043F\u0440\u043E\u0448\u043B\u0443\u044E" || modifierWord == "\u043F\u0440\u043E\u0448\u043B\u043E\u0439") { - modifier = "last"; - } else if (modifierWord == "\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439" || modifierWord == "\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E" || modifierWord == "\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439" || modifierWord == "\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E") { - modifier = "next"; - } else if (modifierWord == "\u044D\u0442\u043E\u0442" || modifierWord == "\u044D\u0442\u0443" || modifierWord == "\u044D\u0442\u043E\u0439") { - modifier = "this"; - } - const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier); - return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year()); - } - }; - exports.default = RUWeekdayParser; - } -}); - -// node_modules/chrono-node/dist/locales/ru/parsers/RURelativeDateFormatParser.js -var require_RURelativeDateFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/parsers/RURelativeDateFormatParser.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants9(); - var results_1 = require_results(); - var dayjs_1 = __importDefault2(require_dayjs_min()); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var pattern_1 = require_pattern(); - var PATTERN = new RegExp(`(\u0432 \u043F\u0440\u043E\u0448\u043B\u043E\u043C|\u043D\u0430 \u043F\u0440\u043E\u0448\u043B\u043E\u0439|\u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439|\u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C|\u043D\u0430 \u044D\u0442\u043E\u0439|\u0432 \u044D\u0442\u043E\u043C)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); - var MODIFIER_WORD_GROUP = 1; - var RELATIVE_WORD_GROUP = 2; - var RURelativeDateFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - patternLeftBoundary() { - return constants_1.REGEX_PARTS.leftBoundary; - } - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const modifier = match[MODIFIER_WORD_GROUP].toLowerCase(); - const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase(); - const timeunit = constants_1.TIME_UNIT_DICTIONARY[unitWord]; - if (modifier == "\u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439" || modifier == "\u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C") { - const timeUnits = {}; - timeUnits[timeunit] = 1; - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - if (modifier == "\u0432 \u043F\u0440\u043E\u0448\u043B\u043E\u043C" || modifier == "\u043D\u0430 \u043F\u0440\u043E\u0448\u043B\u043E\u0439") { - const timeUnits = {}; - timeUnits[timeunit] = -1; - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - const components = context.createParsingComponents(); - let date = dayjs_1.default(context.reference.instant); - if (timeunit.match(/week/i)) { - date = date.add(-date.get("d"), "d"); - components.imply("day", date.date()); - components.imply("month", date.month() + 1); - components.imply("year", date.year()); - } else if (timeunit.match(/month/i)) { - date = date.add(-date.date() + 1, "d"); - components.imply("day", date.date()); - components.assign("year", date.year()); - components.assign("month", date.month() + 1); - } else if (timeunit.match(/year/i)) { - date = date.add(-date.date() + 1, "d"); - date = date.add(-date.month(), "month"); - components.imply("day", date.date()); - components.imply("month", date.month() + 1); - components.assign("year", date.year()); - } - return components; - } - }; - exports.default = RURelativeDateFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.js -var require_RUTimeUnitCasualRelativeFormatParser = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/parsers/RUTimeUnitCasualRelativeFormatParser.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var constants_1 = require_constants9(); - var results_1 = require_results(); - var AbstractParserWithWordBoundary_1 = require_AbstractParserWithWordBoundary(); - var timeunits_1 = require_timeunits(); - var PATTERN = new RegExp(`(\u044D\u0442\u0438|\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435|\u043F\u0440\u043E\u0448\u043B\u044B\u0435|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435|\u043F\u043E\u0441\u043B\u0435|\u0447\u0435\u0440\u0435\u0437|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})${constants_1.REGEX_PARTS.rightBoundary}`, constants_1.REGEX_PARTS.flags); - var RUTimeUnitCasualRelativeFormatParser = class extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking { - patternLeftBoundary() { - return constants_1.REGEX_PARTS.leftBoundary; - } - innerPattern() { - return PATTERN; - } - innerExtract(context, match) { - const prefix = match[1].toLowerCase(); - let timeUnits = constants_1.parseTimeUnits(match[2]); - switch (prefix) { - case "\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435": - case "\u043F\u0440\u043E\u0448\u043B\u044B\u0435": - case "-": - timeUnits = timeunits_1.reverseTimeUnits(timeUnits); - break; - } - return results_1.ParsingComponents.createRelativeFromReference(context.reference, timeUnits); - } - }; - exports.default = RUTimeUnitCasualRelativeFormatParser; - } -}); - -// node_modules/chrono-node/dist/locales/ru/index.js -var require_ru = __commonJS({ - "node_modules/chrono-node/dist/locales/ru/index.js"(exports) { - "use strict"; - var __importDefault2 = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0; - var RUTimeUnitWithinFormatParser_1 = __importDefault2(require_RUTimeUnitWithinFormatParser()); - var RUMonthNameLittleEndianParser_1 = __importDefault2(require_RUMonthNameLittleEndianParser()); - var RUMonthNameParser_1 = __importDefault2(require_RUMonthNameParser()); - var RUTimeExpressionParser_1 = __importDefault2(require_RUTimeExpressionParser()); - var RUTimeUnitAgoFormatParser_1 = __importDefault2(require_RUTimeUnitAgoFormatParser()); - var RUMergeDateRangeRefiner_1 = __importDefault2(require_RUMergeDateRangeRefiner()); - var RUMergeDateTimeRefiner_1 = __importDefault2(require_RUMergeDateTimeRefiner()); - var configurations_1 = require_configurations(); - var RUCasualDateParser_1 = __importDefault2(require_RUCasualDateParser()); - var RUCasualTimeParser_1 = __importDefault2(require_RUCasualTimeParser()); - var RUWeekdayParser_1 = __importDefault2(require_RUWeekdayParser()); - var RURelativeDateFormatParser_1 = __importDefault2(require_RURelativeDateFormatParser()); - var chrono_1 = require_chrono(); - var SlashDateFormatParser_1 = __importDefault2(require_SlashDateFormatParser()); - var RUTimeUnitCasualRelativeFormatParser_1 = __importDefault2(require_RUTimeUnitCasualRelativeFormatParser()); - exports.casual = new chrono_1.Chrono(createCasualConfiguration()); - exports.strict = new chrono_1.Chrono(createConfiguration(true)); - function parse(text2, ref, option) { - return exports.casual.parse(text2, ref, option); - } - exports.parse = parse; - function parseDate3(text2, ref, option) { - return exports.casual.parseDate(text2, ref, option); - } - exports.parseDate = parseDate3; - function createCasualConfiguration() { - const option = createConfiguration(false); - option.parsers.unshift(new RUCasualDateParser_1.default()); - option.parsers.unshift(new RUCasualTimeParser_1.default()); - option.parsers.unshift(new RUMonthNameParser_1.default()); - option.parsers.unshift(new RURelativeDateFormatParser_1.default()); - option.parsers.unshift(new RUTimeUnitCasualRelativeFormatParser_1.default()); - return option; - } - exports.createCasualConfiguration = createCasualConfiguration; - function createConfiguration(strictMode = true) { - return configurations_1.includeCommonConfiguration({ - parsers: [ - new SlashDateFormatParser_1.default(true), - new RUTimeUnitWithinFormatParser_1.default(), - new RUMonthNameLittleEndianParser_1.default(), - new RUWeekdayParser_1.default(), - new RUTimeExpressionParser_1.default(strictMode), - new RUTimeUnitAgoFormatParser_1.default() - ], - refiners: [new RUMergeDateTimeRefiner_1.default(), new RUMergeDateRangeRefiner_1.default()] - }, strictMode); - } - exports.createConfiguration = createConfiguration; - } -}); - -// node_modules/chrono-node/dist/index.js -var require_dist = __commonJS({ - "node_modules/chrono-node/dist/index.js"(exports) { - "use strict"; - var __createBinding2 = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar2 = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding2(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.parseDate = exports.parse = exports.casual = exports.strict = exports.ru = exports.zh = exports.nl = exports.pt = exports.ja = exports.fr = exports.de = exports.Meridiem = exports.Chrono = exports.en = void 0; - var en = __importStar2(require_en()); - exports.en = en; - var chrono_1 = require_chrono(); - Object.defineProperty(exports, "Chrono", { enumerable: true, get: function() { - return chrono_1.Chrono; - } }); - var Meridiem; - (function(Meridiem2) { - Meridiem2[Meridiem2["AM"] = 0] = "AM"; - Meridiem2[Meridiem2["PM"] = 1] = "PM"; - })(Meridiem = exports.Meridiem || (exports.Meridiem = {})); - var de = __importStar2(require_de()); - exports.de = de; - var fr = __importStar2(require_fr()); - exports.fr = fr; - var ja = __importStar2(require_ja()); - exports.ja = ja; - var pt = __importStar2(require_pt()); - exports.pt = pt; - var nl = __importStar2(require_nl()); - exports.nl = nl; - var zh = __importStar2(require_zh()); - exports.zh = zh; - var ru = __importStar2(require_ru()); - exports.ru = ru; - exports.strict = en.strict; - exports.casual = en.casual; - function parse(text2, ref, option) { - return exports.casual.parse(text2, ref, option); - } - exports.parse = parse; - function parseDate3(text2, ref, option) { - return exports.casual.parseDate(text2, ref, option); - } - exports.parseDate = parseDate3; - } -}); - -// node_modules/boon-js/lib/types.js -var require_types = __commonJS({ - "node_modules/boon-js/lib/types.js"(exports) { - "use strict"; - exports.__esModule = true; - var Operators; - (function(Operators2) { - Operators2["AND"] = "AND"; - Operators2["OR"] = "OR"; - Operators2["XOR"] = "XOR"; - Operators2["NOT"] = "NOT"; - })(Operators = exports.Operators || (exports.Operators = {})); - var StructuralCharacters; - (function(StructuralCharacters2) { - StructuralCharacters2["OPEN_PARENTHESIS"] = "("; - StructuralCharacters2["CLOSE_PARENTHESIS"] = ")"; - })(StructuralCharacters = exports.StructuralCharacters || (exports.StructuralCharacters = {})); - var Tokens; - (function(Tokens2) { - Tokens2["IDENTIFIER"] = "IDENTIFIER"; - Tokens2["OPERATOR"] = "OPERATOR"; - Tokens2["STRUCTURAL_CHARACTER"] = "STRUCTURAL_CHARACTER"; - Tokens2["EOF"] = "EOF"; - Tokens2["COMMENT"] = "COMMENT"; - })(Tokens = exports.Tokens || (exports.Tokens = {})); - } -}); - -// node_modules/boon-js/lib/parse/const.js -var require_const = __commonJS({ - "node_modules/boon-js/lib/parse/const.js"(exports) { - "use strict"; - exports.__esModule = true; - var types_1 = require_types(); - exports.OPERATOR_PRECEDENCE = { - NOT: 0, - XOR: 1, - AND: 2, - OR: 3 - }; - exports.VALID_TOKENS = { - identifierOnly: [ - { name: types_1.Tokens.IDENTIFIER }, - { - name: types_1.Tokens.STRUCTURAL_CHARACTER, - value: types_1.StructuralCharacters.OPEN_PARENTHESIS - } - ], - identifierOrNot: [ - { name: types_1.Tokens.IDENTIFIER }, - { - name: types_1.Tokens.STRUCTURAL_CHARACTER, - value: types_1.StructuralCharacters.OPEN_PARENTHESIS - }, - { name: types_1.Tokens.OPERATOR, value: types_1.Operators.NOT } - ], - binaryOperator: [ - { name: types_1.Tokens.OPERATOR, value: types_1.Operators.AND }, - { name: types_1.Tokens.OPERATOR, value: types_1.Operators.OR }, - { name: types_1.Tokens.OPERATOR, value: types_1.Operators.XOR } - ], - binaryOperatorOrClose: [ - { name: types_1.Tokens.OPERATOR, value: types_1.Operators.AND }, - { name: types_1.Tokens.OPERATOR, value: types_1.Operators.OR }, - { name: types_1.Tokens.OPERATOR, value: types_1.Operators.XOR }, - { - name: types_1.Tokens.STRUCTURAL_CHARACTER, - value: types_1.StructuralCharacters.CLOSE_PARENTHESIS - } - ] - }; - } -}); - -// node_modules/boon-js/lib/lex/const.js -var require_const2 = __commonJS({ - "node_modules/boon-js/lib/lex/const.js"(exports) { - "use strict"; - exports.__esModule = true; - var types_1 = require_types(); - exports.STRUCTURAL_CHARACTERS = { - "(": types_1.StructuralCharacters.OPEN_PARENTHESIS, - ")": types_1.StructuralCharacters.CLOSE_PARENTHESIS - }; - exports.OPERATORS = { - AND: types_1.Operators.AND, - OR: types_1.Operators.OR, - XOR: types_1.Operators.XOR, - NOT: types_1.Operators.NOT - }; - exports.SEPARATORS = new Set([ - 32, - 9, - 10, - 13 - ].map(function(separator) { - return String.fromCodePoint(separator); - })); - exports.QUOTED_IDENTIFIER_DELIMITER = String.fromCodePoint(34); - exports.COMMENT_DELIMITER = String.fromCodePoint(35); - exports.EOL = String.fromCodePoint(10); - exports.ESCAPE_CHARACTER = String.fromCodePoint(92); - } -}); - -// node_modules/boon-js/lib/lex/utils.js -var require_utils = __commonJS({ - "node_modules/boon-js/lib/lex/utils.js"(exports) { - "use strict"; - var __assign2 = exports && exports.__assign || function() { - __assign2 = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign2.apply(this, arguments); - }; - exports.__esModule = true; - var types_1 = require_types(); - var const_1 = require_const2(); - exports.createResult = function(name, value, remainingString) { - return { - token: __assign2({ name }, value !== null ? { value } : {}), - remainingString - }; - }; - exports.getComment = function(expression) { - var tokenEnd = expression.length; - for (var i = 0; i < expression.length; i += 1) { - var letter = expression[i]; - if (letter === const_1.EOL) { - tokenEnd = i; - break; - } - } - return exports.createResult(types_1.Tokens.COMMENT, expression.slice(0, tokenEnd), expression.slice(tokenEnd + 1)); - }; - exports.getQuotedIdentifier = function(expression) { - var escapeQuotation = false; - var value = ""; - var tokenEnd = null; - for (var i = 0; i < expression.length; i += 1) { - var char = expression[i]; - if (tokenEnd === null) { - if (char === const_1.QUOTED_IDENTIFIER_DELIMITER) { - if (escapeQuotation) { - value = value.slice(-1) + const_1.QUOTED_IDENTIFIER_DELIMITER; - } else { - tokenEnd = i; - } - } else { - if (char === const_1.ESCAPE_CHARACTER) { - escapeQuotation = true; - } else { - escapeQuotation = false; - } - value = value += char; - } - } else { - if (!const_1.SEPARATORS.has(char) && !const_1.STRUCTURAL_CHARACTERS[char]) { - throw new Error("Unexpected character: " + char + " Expected ) character or separator"); - } - break; - } - } - if (tokenEnd === null) { - throw new Error("Unexpected end of expression: expected " + const_1.QUOTED_IDENTIFIER_DELIMITER + " character"); - } - return exports.createResult(types_1.Tokens.IDENTIFIER, value, expression.slice(tokenEnd + 1)); - }; - } -}); - -// node_modules/boon-js/lib/lex/lex.js -var require_lex = __commonJS({ - "node_modules/boon-js/lib/lex/lex.js"(exports) { - "use strict"; - exports.__esModule = true; - var types_1 = require_types(); - var const_1 = require_const2(); - var utils_1 = require_utils(); - exports.lex = function(expression) { - var tokenStart = null; - var tokenEnd = null; - var delimitingCharacter = null; - for (var i = 0; i < expression.length; i += 1) { - var char = expression[i]; - if (tokenStart === null) { - if (!const_1.SEPARATORS.has(char)) { - var structuralChar = const_1.STRUCTURAL_CHARACTERS[char]; - if (structuralChar) { - var nextChar = expression[i + 1]; - if (structuralChar === types_1.StructuralCharacters.CLOSE_PARENTHESIS && nextChar && !const_1.SEPARATORS.has(nextChar) && nextChar !== types_1.StructuralCharacters.CLOSE_PARENTHESIS) { - throw new Error("Unexpected character: " + nextChar + ". A closing parenthesis should be followed by another closing parenthesis or whitespace"); - } - return utils_1.createResult(types_1.Tokens.STRUCTURAL_CHARACTER, const_1.STRUCTURAL_CHARACTERS[char], expression.slice(i + 1)); - } - if (char === const_1.QUOTED_IDENTIFIER_DELIMITER) { - return utils_1.getQuotedIdentifier(expression.slice(i + 1)); - } - if (char === const_1.COMMENT_DELIMITER) { - return utils_1.getComment(expression.slice(i + 1)); - } - tokenStart = i; - } - } else { - if (const_1.SEPARATORS.has(char) || const_1.STRUCTURAL_CHARACTERS[char]) { - tokenEnd = i; - delimitingCharacter = char; - break; - } else { - if (char === const_1.QUOTED_IDENTIFIER_DELIMITER || char === const_1.COMMENT_DELIMITER) { - throw new Error("Unexpected character: " + char); - } - } - } - } - if (tokenStart !== null) { - tokenEnd = tokenEnd !== null && tokenEnd !== void 0 ? tokenEnd : expression.length; - var value = expression.slice(tokenStart, tokenEnd); - var remainingString = expression.slice(tokenEnd); - if (const_1.OPERATORS[value]) { - if (delimitingCharacter && !const_1.SEPARATORS.has(delimitingCharacter)) { - throw new Error("Unexpected character: " + delimitingCharacter + ". Operators should be separated using whitespace"); - } - return utils_1.createResult(types_1.Tokens.OPERATOR, const_1.OPERATORS[value], remainingString); - } else { - return utils_1.createResult(types_1.Tokens.IDENTIFIER, value, remainingString); - } - } - return utils_1.createResult(types_1.Tokens.EOF, null, ""); - }; - } -}); - -// node_modules/boon-js/lib/parse/utils.js -var require_utils2 = __commonJS({ - "node_modules/boon-js/lib/parse/utils.js"(exports) { - "use strict"; - var __spreadArrays2 = exports && exports.__spreadArrays || function() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - }; - exports.__esModule = true; - var lex_1 = require_lex(); - var types_1 = require_types(); - var const_1 = require_const(); - exports.newTokenGenerator = function(expression) { - var remainingExpression = expression; - return function(validTokens, endIsValid) { - if (endIsValid === void 0) { - endIsValid = false; - } - while (true) { - var _a = lex_1.lex(remainingExpression), token = _a.token, remainingString = _a.remainingString; - remainingExpression = remainingString; - if (token.name !== types_1.Tokens.COMMENT) { - exports.validateToken(token, validTokens, endIsValid); - return token; - } - } - }; - }; - exports.getValue = function(getNextToken, parser) { - var nextToken = getNextToken(const_1.VALID_TOKENS.identifierOrNot); - var negatedValue = nextToken.value === types_1.Operators.NOT; - if (negatedValue) { - nextToken = getNextToken(const_1.VALID_TOKENS.identifierOnly); - } - var value = nextToken.name === types_1.Tokens.STRUCTURAL_CHARACTER ? parser(getNextToken, true) : [nextToken]; - return negatedValue ? __spreadArrays2(value, [{ name: types_1.Tokens.OPERATOR, value: types_1.Operators.NOT }]) : value; - }; - exports.previousOperatorTakesPrecedent = function(previousOperator, nextOperator) { - return const_1.OPERATOR_PRECEDENCE[previousOperator] <= const_1.OPERATOR_PRECEDENCE[nextOperator]; - }; - exports.validateToken = function(token, validTokens, endIsValid) { - if (endIsValid === void 0) { - endIsValid = false; - } - if (token.name === types_1.Tokens.EOF) { - if (endIsValid) { - return; - } - throw new Error("Unexpected end of expression"); - } - for (var _i = 0, validTokens_1 = validTokens; _i < validTokens_1.length; _i++) { - var validToken = validTokens_1[_i]; - if (validToken.name === token.name) { - if (!validToken.value || validToken.value === token.value) { - return; - } - } - } - throw new TypeError("Invalid token"); - }; - } -}); - -// node_modules/boon-js/lib/parse/parse.js -var require_parse = __commonJS({ - "node_modules/boon-js/lib/parse/parse.js"(exports) { - "use strict"; - var __spreadArrays2 = exports && exports.__spreadArrays || function() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - }; - exports.__esModule = true; - var types_1 = require_types(); - var const_1 = require_const(); - var utils_1 = require_utils2(); - exports.parse = function(expression) { - if (typeof expression !== "string") { - throw new Error("Expected string but received " + typeof expression); - } - var getNextToken = utils_1.newTokenGenerator(expression); - return parseInternal(getNextToken); - }; - var parseInternal = function(getNextToken, nested) { - if (nested === void 0) { - nested = false; - } - var output = __spreadArrays2(utils_1.getValue(getNextToken, parseInternal)); - var operators = []; - while (true) { - var validTokens = nested ? const_1.VALID_TOKENS.binaryOperatorOrClose : const_1.VALID_TOKENS.binaryOperator; - var nextToken = getNextToken(validTokens, !nested); - if (nextToken.name === types_1.Tokens.EOF || nextToken.name === types_1.Tokens.STRUCTURAL_CHARACTER) { - return __spreadArrays2(output, __spreadArrays2(operators).reverse()); - } - while (operators.length) { - var previousOperator = operators[operators.length - 1] || null; - if (previousOperator && utils_1.previousOperatorTakesPrecedent(previousOperator.value, nextToken.value)) { - output = __spreadArrays2(output, [previousOperator]); - operators = operators.slice(0, -1); - } else { - break; - } - } - operators = __spreadArrays2(operators, [nextToken]); - output = __spreadArrays2(output, utils_1.getValue(getNextToken, parseInternal)); - } - }; - } -}); - -// node_modules/boon-js/lib/evaluate/utils.js -var require_utils3 = __commonJS({ - "node_modules/boon-js/lib/evaluate/utils.js"(exports) { - "use strict"; - exports.__esModule = true; - var types_1 = require_types(); - exports.andUtil = function(left, right) { - return left && right; - }; - exports.orUtil = function(left, right) { - return left || right; - }; - exports.xorUtil = function(left, right) { - return !(left === right); - }; - exports.notUtil = function(identifier) { - return !identifier; - }; - exports.isIdentifier = function(_a) { - var name = _a.name, value = _a.value; - return name === types_1.Tokens.IDENTIFIER && typeof value === "string"; - }; - exports.isOperator = function(_a) { - var name = _a.name, value = _a.value; - return name === types_1.Tokens.OPERATOR && typeof value === "string"; - }; - exports.throwInvalidExpression = function(message) { - throw new TypeError("Invalid postfix expression: " + message); - }; - } -}); - -// node_modules/boon-js/lib/evaluate/const.js -var require_const3 = __commonJS({ - "node_modules/boon-js/lib/evaluate/const.js"(exports) { - "use strict"; - var _a; - exports.__esModule = true; - var types_1 = require_types(); - var utils_1 = require_utils3(); - exports.OPERATOR_MAP = (_a = {}, _a[types_1.Operators.AND] = utils_1.andUtil, _a[types_1.Operators.OR] = utils_1.orUtil, _a[types_1.Operators.XOR] = utils_1.xorUtil, _a); - } -}); - -// node_modules/boon-js/lib/evaluate/evaluate.js -var require_evaluate = __commonJS({ - "node_modules/boon-js/lib/evaluate/evaluate.js"(exports) { - "use strict"; - var __spreadArrays2 = exports && exports.__spreadArrays || function() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - }; - exports.__esModule = true; - var parse_1 = require_parse(); - var types_1 = require_types(); - var const_1 = require_const3(); - var utils_1 = require_utils3(); - exports.getEvaluator = function(expression) { - var parsedExpression = parse_1.parse(expression); - return function(booleanMap) { - return exports.evaluate(parsedExpression, booleanMap); - }; - }; - exports.evaluate = function(expression, booleanMap) { - if (!Array.isArray(expression)) { - throw new Error(expression + " should be an array. evaluate takes in a parsed expression. Use in combination with parse or use getEvaluator"); - } - var evaluatedExpression = expression.reduce(function(stack, token, i) { - if (!(token && (utils_1.isIdentifier(token) || utils_1.isOperator(token)))) { - throw new Error("Invalid token: " + token + ". Found in parsed expression at index " + i); - } - if (token.name === types_1.Tokens.IDENTIFIER) { - return __spreadArrays2(stack, [Boolean(booleanMap[token.value])]); - } - var secondLastItem = stack[stack.length - 2]; - var lastItem = stack[stack.length - 1]; - if (token.value === types_1.Operators.NOT) { - if (lastItem === void 0) { - utils_1.throwInvalidExpression("missing identifier"); - } - return __spreadArrays2(stack.slice(0, -1), [utils_1.notUtil(lastItem)]); - } - if (lastItem === void 0 || secondLastItem === void 0) { - utils_1.throwInvalidExpression("missing identifier"); - } - var operatorUtil = const_1.OPERATOR_MAP[token.value]; - if (!operatorUtil) { - utils_1.throwInvalidExpression("unknown operator"); - } - return __spreadArrays2(stack.slice(0, -2), [operatorUtil(secondLastItem, lastItem)]); - }, []); - if (evaluatedExpression.length !== 1) { - utils_1.throwInvalidExpression("too many identifiers after evaluation"); - } - return evaluatedExpression[0]; - }; - } -}); - -// node_modules/boon-js/lib/index.js -var require_lib = __commonJS({ - "node_modules/boon-js/lib/index.js"(exports) { - "use strict"; - exports.__esModule = true; - var evaluate_1 = require_evaluate(); - exports.getEvaluator = evaluate_1.getEvaluator; - exports.evaluate = evaluate_1.evaluate; - var parse_1 = require_parse(); - exports.parse = parse_1.parse; - } -}); - -// src/main.ts -var main_exports = {}; -__export(main_exports, { - default: () => TasksPlugin -}); -module.exports = __toCommonJS(main_exports); -var import_obsidian12 = require("obsidian"); - -// src/Cache.ts -var import_obsidian3 = require("obsidian"); - -// node_modules/async-mutex/index.mjs -var E_TIMEOUT = new Error("timeout while waiting for mutex to become available"); -var E_ALREADY_LOCKED = new Error("mutex already locked"); -var E_CANCELED = new Error("request for lock canceled"); -var __awaiter$2 = 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()); - }); -}; -var Semaphore = class { - constructor(_maxConcurrency, _cancelError = E_CANCELED) { - this._maxConcurrency = _maxConcurrency; - this._cancelError = _cancelError; - this._queue = []; - this._waiters = []; - if (_maxConcurrency <= 0) { - throw new Error("semaphore must be initialized to a positive value"); - } - this._value = _maxConcurrency; - } - acquire() { - const locked = this.isLocked(); - const ticketPromise = new Promise((resolve, reject) => this._queue.push({ resolve, reject })); - if (!locked) - this._dispatch(); - return ticketPromise; - } - runExclusive(callback) { - return __awaiter$2(this, void 0, void 0, function* () { - const [value, release] = yield this.acquire(); - try { - return yield callback(value); - } finally { - release(); - } - }); - } - waitForUnlock() { - return __awaiter$2(this, void 0, void 0, function* () { - if (!this.isLocked()) { - return Promise.resolve(); - } - const waitPromise = new Promise((resolve) => this._waiters.push({ resolve })); - return waitPromise; - }); - } - isLocked() { - return this._value <= 0; - } - release() { - if (this._maxConcurrency > 1) { - throw new Error("this method is unavailable on semaphores with concurrency > 1; use the scoped release returned by acquire instead"); - } - if (this._currentReleaser) { - const releaser = this._currentReleaser; - this._currentReleaser = void 0; - releaser(); - } - } - cancel() { - this._queue.forEach((ticket) => ticket.reject(this._cancelError)); - this._queue = []; - } - _dispatch() { - const nextTicket = this._queue.shift(); - if (!nextTicket) - return; - let released = false; - this._currentReleaser = () => { - if (released) - return; - released = true; - this._value++; - this._resolveWaiters(); - this._dispatch(); - }; - nextTicket.resolve([this._value--, this._currentReleaser]); - } - _resolveWaiters() { - this._waiters.forEach((waiter) => waiter.resolve()); - this._waiters = []; - } -}; -var __awaiter$1 = 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()); - }); -}; -var Mutex = class { - constructor(cancelError) { - this._semaphore = new Semaphore(1, cancelError); - } - acquire() { - return __awaiter$1(this, void 0, void 0, function* () { - const [, releaser] = yield this._semaphore.acquire(); - return releaser; - }); - } - runExclusive(callback) { - return this._semaphore.runExclusive(() => callback()); - } - isLocked() { - return this._semaphore.isLocked(); - } - waitForUnlock() { - return this._semaphore.waitForUnlock(); - } - release() { - this._semaphore.release(); - } - cancel() { - return this._semaphore.cancel(); - } -}; - -// src/TaskLayout.ts -var LayoutOptions = class { - constructor() { - this.hideTaskCount = false; - this.hideBacklinks = false; - this.hidePriority = false; - this.hideStartDate = false; - this.hideScheduledDate = false; - this.hideDoneDate = false; - this.hideDueDate = false; - this.hideRecurrenceRule = false; - this.hideEditButton = false; - this.hideUrgency = true; - this.shortMode = false; - this.explainQuery = false; - } -}; -var TaskLayout = class { - constructor(options, components) { - this.defaultLayout = [ - "description", - "priority", - "recurrenceRule", - "startDate", - "scheduledDate", - "dueDate", - "doneDate", - "blockLink" - ]; - this.hiddenComponents = []; - this.specificClasses = []; - if (options) { - this.options = options; - } else { - this.options = new LayoutOptions(); - } - if (components) { - this.layoutComponents = components; - } else { - this.layoutComponents = this.defaultLayout; - } - this.layoutComponents = this.applyOptions(this.options); - } - applyOptions(layoutOptions) { - const removeIf = (taskComponents, shouldRemove, componentToRemove) => { - if (shouldRemove) { - this.specificClasses.push(`tasks-layout-hide-${componentToRemove}`); - this.hiddenComponents.push(componentToRemove); - return taskComponents.filter((element2) => element2 != componentToRemove); - } else { - return taskComponents; - } - }; - let newComponents = this.layoutComponents; - newComponents = removeIf(newComponents, layoutOptions.hidePriority, "priority"); - newComponents = removeIf(newComponents, layoutOptions.hideRecurrenceRule, "recurrenceRule"); - newComponents = removeIf(newComponents, layoutOptions.hideStartDate, "startDate"); - newComponents = removeIf(newComponents, layoutOptions.hideScheduledDate, "scheduledDate"); - newComponents = removeIf(newComponents, layoutOptions.hideDueDate, "dueDate"); - newComponents = removeIf(newComponents, layoutOptions.hideDoneDate, "doneDate"); - if (layoutOptions.shortMode) - this.specificClasses.push("tasks-layout-short-mode"); - return newComponents; - } -}; - -// node_modules/rrule/dist/esm/weekday.js -var ALL_WEEKDAYS = [ - "MO", - "TU", - "WE", - "TH", - "FR", - "SA", - "SU" -]; -var Weekday = function() { - function Weekday2(weekday, n) { - if (n === 0) - throw new Error("Can't create weekday with n == 0"); - this.weekday = weekday; - this.n = n; - } - Weekday2.fromStr = function(str) { - return new Weekday2(ALL_WEEKDAYS.indexOf(str)); - }; - Weekday2.prototype.nth = function(n) { - return this.n === n ? this : new Weekday2(this.weekday, n); - }; - Weekday2.prototype.equals = function(other) { - return this.weekday === other.weekday && this.n === other.n; - }; - Weekday2.prototype.toString = function() { - var s = ALL_WEEKDAYS[this.weekday]; - if (this.n) - s = (this.n > 0 ? "+" : "") + String(this.n) + s; - return s; - }; - Weekday2.prototype.getJsWeekday = function() { - return this.weekday === 6 ? 0 : this.weekday + 1; - }; - return Weekday2; -}(); - -// node_modules/rrule/dist/esm/helpers.js -var isPresent = function(value) { - return value !== null && value !== void 0; -}; -var isNumber = function(value) { - return typeof value === "number"; -}; -var isWeekdayStr = function(value) { - return typeof value === "string" && ALL_WEEKDAYS.includes(value); -}; -var isArray = Array.isArray; -var range = function(start, end) { - if (end === void 0) { - end = start; - } - if (arguments.length === 1) { - end = start; - start = 0; - } - var rang = []; - for (var i = start; i < end; i++) - rang.push(i); - return rang; -}; -var repeat = function(value, times) { - var i = 0; - var array = []; - if (isArray(value)) { - for (; i < times; i++) - array[i] = [].concat(value); - } else { - for (; i < times; i++) - array[i] = value; - } - return array; -}; -var toArray = function(item) { - if (isArray(item)) { - return item; - } - return [item]; -}; -function padStart(item, targetLength, padString) { - if (padString === void 0) { - padString = " "; - } - var str = String(item); - targetLength = targetLength >> 0; - if (str.length > targetLength) { - return String(str); - } - targetLength = targetLength - str.length; - if (targetLength > padString.length) { - padString += repeat(padString, targetLength / padString.length); - } - return padString.slice(0, targetLength) + String(str); -} -var split = function(str, sep, num) { - var splits = str.split(sep); - return num ? splits.slice(0, num).concat([splits.slice(num).join(sep)]) : splits; -}; -var pymod = function(a, b) { - var r = a % b; - return r * b < 0 ? r + b : r; -}; -var divmod = function(a, b) { - return { div: Math.floor(a / b), mod: pymod(a, b) }; -}; -var empty = function(obj) { - return !isPresent(obj) || obj.length === 0; -}; -var notEmpty = function(obj) { - return !empty(obj); -}; -var includes = function(arr, val) { - return notEmpty(arr) && arr.indexOf(val) !== -1; -}; - -// node_modules/rrule/dist/esm/dateutil.js -var dateutil; -(function(dateutil2) { - dateutil2.MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - dateutil2.ONE_DAY = 1e3 * 60 * 60 * 24; - dateutil2.MAXYEAR = 9999; - dateutil2.ORDINAL_BASE = new Date(Date.UTC(1970, 0, 1)); - dateutil2.PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5]; - dateutil2.getYearDay = function(date) { - var dateNoTime = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); - return Math.ceil((dateNoTime.valueOf() - new Date(date.getUTCFullYear(), 0, 1).valueOf()) / dateutil2.ONE_DAY) + 1; - }; - dateutil2.isLeapYear = function(year) { - return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0; - }; - dateutil2.isDate = function(value) { - return value instanceof Date; - }; - dateutil2.isValidDate = function(value) { - return dateutil2.isDate(value) && !isNaN(value.getTime()); - }; - dateutil2.tzOffset = function(date) { - return date.getTimezoneOffset() * 60 * 1e3; - }; - dateutil2.daysBetween = function(date1, date2) { - var date1ms = date1.getTime() - dateutil2.tzOffset(date1); - var date2ms = date2.getTime() - dateutil2.tzOffset(date2); - var differencems = date1ms - date2ms; - return Math.round(differencems / dateutil2.ONE_DAY); - }; - dateutil2.toOrdinal = function(date) { - return dateutil2.daysBetween(date, dateutil2.ORDINAL_BASE); - }; - dateutil2.fromOrdinal = function(ordinal) { - return new Date(dateutil2.ORDINAL_BASE.getTime() + ordinal * dateutil2.ONE_DAY); - }; - dateutil2.getMonthDays = function(date) { - var month = date.getUTCMonth(); - return month === 1 && dateutil2.isLeapYear(date.getUTCFullYear()) ? 29 : dateutil2.MONTH_DAYS[month]; - }; - dateutil2.getWeekday = function(date) { - return dateutil2.PY_WEEKDAYS[date.getUTCDay()]; - }; - dateutil2.monthRange = function(year, month) { - var date = new Date(Date.UTC(year, month, 1)); - return [dateutil2.getWeekday(date), dateutil2.getMonthDays(date)]; - }; - dateutil2.combine = function(date, time) { - time = time || date; - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds())); - }; - dateutil2.clone = function(date) { - var dolly = new Date(date.getTime()); - return dolly; - }; - dateutil2.cloneDates = function(dates) { - var clones = []; - for (var i = 0; i < dates.length; i++) { - clones.push(dateutil2.clone(dates[i])); - } - return clones; - }; - dateutil2.sort = function(dates) { - dates.sort(function(a, b) { - return a.getTime() - b.getTime(); - }); - }; - dateutil2.timeToUntilString = function(time, utc) { - if (utc === void 0) { - utc = true; - } - var date = new Date(time); - return [ - padStart(date.getUTCFullYear().toString(), 4, "0"), - padStart(date.getUTCMonth() + 1, 2, "0"), - padStart(date.getUTCDate(), 2, "0"), - "T", - padStart(date.getUTCHours(), 2, "0"), - padStart(date.getUTCMinutes(), 2, "0"), - padStart(date.getUTCSeconds(), 2, "0"), - utc ? "Z" : "" - ].join(""); - }; - dateutil2.untilStringToDate = function(until) { - var re = /^(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2})Z?)?$/; - var bits = re.exec(until); - if (!bits) - throw new Error("Invalid UNTIL value: ".concat(until)); - return new Date(Date.UTC(parseInt(bits[1], 10), parseInt(bits[2], 10) - 1, parseInt(bits[3], 10), parseInt(bits[5], 10) || 0, parseInt(bits[6], 10) || 0, parseInt(bits[7], 10) || 0)); - }; -})(dateutil || (dateutil = {})); -var dateutil_default = dateutil; - -// node_modules/rrule/dist/esm/iterresult.js -var IterResult = function() { - function IterResult2(method, args) { - this.minDate = null; - this.maxDate = null; - this._result = []; - this.total = 0; - this.method = method; - this.args = args; - if (method === "between") { - this.maxDate = args.inc ? args.before : new Date(args.before.getTime() - 1); - this.minDate = args.inc ? args.after : new Date(args.after.getTime() + 1); - } else if (method === "before") { - this.maxDate = args.inc ? args.dt : new Date(args.dt.getTime() - 1); - } else if (method === "after") { - this.minDate = args.inc ? args.dt : new Date(args.dt.getTime() + 1); - } - } - IterResult2.prototype.accept = function(date) { - ++this.total; - var tooEarly = this.minDate && date < this.minDate; - var tooLate = this.maxDate && date > this.maxDate; - if (this.method === "between") { - if (tooEarly) - return true; - if (tooLate) - return false; - } else if (this.method === "before") { - if (tooLate) - return false; - } else if (this.method === "after") { - if (tooEarly) - return true; - this.add(date); - return false; - } - return this.add(date); - }; - IterResult2.prototype.add = function(date) { - this._result.push(date); - return true; - }; - IterResult2.prototype.getValue = function() { - var res = this._result; - switch (this.method) { - case "all": - case "between": - return res; - case "before": - case "after": - default: - return res.length ? res[res.length - 1] : null; - } - }; - IterResult2.prototype.clone = function() { - return new IterResult2(this.method, this.args); - }; - return IterResult2; -}(); -var iterresult_default = IterResult; - -// node_modules/tslib/modules/index.js -var import_tslib = __toESM(require_tslib(), 1); -var { - __extends, - __assign, - __rest, - __decorate, - __param, - __metadata, - __awaiter, - __generator, - __exportStar, - __createBinding, - __values, - __read, - __spread, - __spreadArrays, - __spreadArray, - __await, - __asyncGenerator, - __asyncDelegator, - __asyncValues, - __makeTemplateObject, - __importStar, - __importDefault, - __classPrivateFieldGet, - __classPrivateFieldSet, - __classPrivateFieldIn -} = import_tslib.default; - -// node_modules/rrule/dist/esm/callbackiterresult.js -var CallbackIterResult = function(_super) { - __extends(CallbackIterResult2, _super); - function CallbackIterResult2(method, args, iterator) { - var _this = _super.call(this, method, args) || this; - _this.iterator = iterator; - return _this; - } - CallbackIterResult2.prototype.add = function(date) { - if (this.iterator(date, this._result.length)) { - this._result.push(date); - return true; - } - return false; - }; - return CallbackIterResult2; -}(iterresult_default); -var callbackiterresult_default = CallbackIterResult; - -// node_modules/rrule/dist/esm/nlp/i18n.js -var ENGLISH = { - dayNames: [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" - ], - monthNames: [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" - ], - tokens: { - SKIP: /^[ \r\n\t]+|^\.$/, - number: /^[1-9][0-9]*/, - numberAsText: /^(one|two|three)/i, - every: /^every/i, - "day(s)": /^days?/i, - "weekday(s)": /^weekdays?/i, - "week(s)": /^weeks?/i, - "hour(s)": /^hours?/i, - "minute(s)": /^minutes?/i, - "month(s)": /^months?/i, - "year(s)": /^years?/i, - on: /^(on|in)/i, - at: /^(at)/i, - the: /^the/i, - first: /^first/i, - second: /^second/i, - third: /^third/i, - nth: /^([1-9][0-9]*)(\.|th|nd|rd|st)/i, - last: /^last/i, - for: /^for/i, - "time(s)": /^times?/i, - until: /^(un)?til/i, - monday: /^mo(n(day)?)?/i, - tuesday: /^tu(e(s(day)?)?)?/i, - wednesday: /^we(d(n(esday)?)?)?/i, - thursday: /^th(u(r(sday)?)?)?/i, - friday: /^fr(i(day)?)?/i, - saturday: /^sa(t(urday)?)?/i, - sunday: /^su(n(day)?)?/i, - january: /^jan(uary)?/i, - february: /^feb(ruary)?/i, - march: /^mar(ch)?/i, - april: /^apr(il)?/i, - may: /^may/i, - june: /^june?/i, - july: /^july?/i, - august: /^aug(ust)?/i, - september: /^sep(t(ember)?)?/i, - october: /^oct(ober)?/i, - november: /^nov(ember)?/i, - december: /^dec(ember)?/i, - comma: /^(,\s*|(and|or)\s*)+/i - } -}; -var i18n_default = ENGLISH; - -// node_modules/rrule/dist/esm/nlp/totext.js -var contains = function(arr, val) { - return arr.indexOf(val) !== -1; -}; -var defaultGetText = function(id) { - return id.toString(); -}; -var defaultDateFormatter = function(year, month, day) { - return "".concat(month, " ").concat(day, ", ").concat(year); -}; -var ToText = function() { - function ToText2(rrule, gettext, language, dateFormatter) { - if (gettext === void 0) { - gettext = defaultGetText; - } - if (language === void 0) { - language = i18n_default; - } - if (dateFormatter === void 0) { - dateFormatter = defaultDateFormatter; - } - this.text = []; - this.language = language || i18n_default; - this.gettext = gettext; - this.dateFormatter = dateFormatter; - this.rrule = rrule; - this.options = rrule.options; - this.origOptions = rrule.origOptions; - if (this.origOptions.bymonthday) { - var bymonthday = [].concat(this.options.bymonthday); - var bynmonthday = [].concat(this.options.bynmonthday); - bymonthday.sort(function(a, b) { - return a - b; - }); - bynmonthday.sort(function(a, b) { - return b - a; - }); - this.bymonthday = bymonthday.concat(bynmonthday); - if (!this.bymonthday.length) - this.bymonthday = null; - } - if (isPresent(this.origOptions.byweekday)) { - var byweekday = !isArray(this.origOptions.byweekday) ? [this.origOptions.byweekday] : this.origOptions.byweekday; - var days = String(byweekday); - this.byweekday = { - allWeeks: byweekday.filter(function(weekday) { - return !weekday.n; - }), - someWeeks: byweekday.filter(function(weekday) { - return Boolean(weekday.n); - }), - isWeekdays: days.indexOf("MO") !== -1 && days.indexOf("TU") !== -1 && days.indexOf("WE") !== -1 && days.indexOf("TH") !== -1 && days.indexOf("FR") !== -1 && days.indexOf("SA") === -1 && days.indexOf("SU") === -1, - isEveryDay: days.indexOf("MO") !== -1 && days.indexOf("TU") !== -1 && days.indexOf("WE") !== -1 && days.indexOf("TH") !== -1 && days.indexOf("FR") !== -1 && days.indexOf("SA") !== -1 && days.indexOf("SU") !== -1 - }; - var sortWeekDays = function(a, b) { - return a.weekday - b.weekday; - }; - this.byweekday.allWeeks.sort(sortWeekDays); - this.byweekday.someWeeks.sort(sortWeekDays); - if (!this.byweekday.allWeeks.length) - this.byweekday.allWeeks = null; - if (!this.byweekday.someWeeks.length) - this.byweekday.someWeeks = null; - } else { - this.byweekday = null; - } - } - ToText2.isFullyConvertible = function(rrule) { - var canConvert = true; - if (!(rrule.options.freq in ToText2.IMPLEMENTED)) - return false; - if (rrule.origOptions.until && rrule.origOptions.count) - return false; - for (var key in rrule.origOptions) { - if (contains(["dtstart", "wkst", "freq"], key)) - return true; - if (!contains(ToText2.IMPLEMENTED[rrule.options.freq], key)) - return false; - } - return canConvert; - }; - ToText2.prototype.isFullyConvertible = function() { - return ToText2.isFullyConvertible(this.rrule); - }; - ToText2.prototype.toString = function() { - var gettext = this.gettext; - if (!(this.options.freq in ToText2.IMPLEMENTED)) { - return gettext("RRule error: Unable to fully convert this rrule to text"); - } - this.text = [gettext("every")]; - this[RRule.FREQUENCIES[this.options.freq]](); - if (this.options.until) { - this.add(gettext("until")); - var until = this.options.until; - this.add(this.dateFormatter(until.getUTCFullYear(), this.language.monthNames[until.getUTCMonth()], until.getUTCDate())); - } else if (this.options.count) { - this.add(gettext("for")).add(this.options.count.toString()).add(this.plural(this.options.count) ? gettext("times") : gettext("time")); - } - if (!this.isFullyConvertible()) - this.add(gettext("(~ approximate)")); - return this.text.join(""); - }; - ToText2.prototype.HOURLY = function() { - var gettext = this.gettext; - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - this.add(this.plural(this.options.interval) ? gettext("hours") : gettext("hour")); - }; - ToText2.prototype.MINUTELY = function() { - var gettext = this.gettext; - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - this.add(this.plural(this.options.interval) ? gettext("minutes") : gettext("minute")); - }; - ToText2.prototype.DAILY = function() { - var gettext = this.gettext; - if (this.options.interval !== 1) - this.add(this.options.interval.toString()); - if (this.byweekday && this.byweekday.isWeekdays) { - this.add(this.plural(this.options.interval) ? gettext("weekdays") : gettext("weekday")); - } else { - this.add(this.plural(this.options.interval) ? gettext("days") : gettext("day")); - } - if (this.origOptions.bymonth) { - this.add(gettext("in")); - this._bymonth(); - } - if (this.bymonthday) { - this._bymonthday(); - } else if (this.byweekday) { - this._byweekday(); - } else if (this.origOptions.byhour) { - this._byhour(); - } - }; - ToText2.prototype.WEEKLY = function() { - var gettext = this.gettext; - if (this.options.interval !== 1) { - this.add(this.options.interval.toString()).add(this.plural(this.options.interval) ? gettext("weeks") : gettext("week")); - } - if (this.byweekday && this.byweekday.isWeekdays) { - if (this.options.interval === 1) { - this.add(this.plural(this.options.interval) ? gettext("weekdays") : gettext("weekday")); - } else { - this.add(gettext("on")).add(gettext("weekdays")); - } - } else if (this.byweekday && this.byweekday.isEveryDay) { - this.add(this.plural(this.options.interval) ? gettext("days") : gettext("day")); - } else { - if (this.options.interval === 1) - this.add(gettext("week")); - if (this.origOptions.bymonth) { - this.add(gettext("in")); - this._bymonth(); - } - if (this.bymonthday) { - this._bymonthday(); - } else if (this.byweekday) { - this._byweekday(); - } - } - }; - ToText2.prototype.MONTHLY = function() { - var gettext = this.gettext; - if (this.origOptions.bymonth) { - if (this.options.interval !== 1) { - this.add(this.options.interval.toString()).add(gettext("months")); - if (this.plural(this.options.interval)) - this.add(gettext("in")); - } else { - } - this._bymonth(); - } else { - if (this.options.interval !== 1) { - this.add(this.options.interval.toString()); - } - this.add(this.plural(this.options.interval) ? gettext("months") : gettext("month")); - } - if (this.bymonthday) { - this._bymonthday(); - } else if (this.byweekday && this.byweekday.isWeekdays) { - this.add(gettext("on")).add(gettext("weekdays")); - } else if (this.byweekday) { - this._byweekday(); - } - }; - ToText2.prototype.YEARLY = function() { - var gettext = this.gettext; - if (this.origOptions.bymonth) { - if (this.options.interval !== 1) { - this.add(this.options.interval.toString()); - this.add(gettext("years")); - } else { - } - this._bymonth(); - } else { - if (this.options.interval !== 1) { - this.add(this.options.interval.toString()); - } - this.add(this.plural(this.options.interval) ? gettext("years") : gettext("year")); - } - if (this.bymonthday) { - this._bymonthday(); - } else if (this.byweekday) { - this._byweekday(); - } - if (this.options.byyearday) { - this.add(gettext("on the")).add(this.list(this.options.byyearday, this.nth, gettext("and"))).add(gettext("day")); - } - if (this.options.byweekno) { - this.add(gettext("in")).add(this.plural(this.options.byweekno.length) ? gettext("weeks") : gettext("week")).add(this.list(this.options.byweekno, void 0, gettext("and"))); - } - }; - ToText2.prototype._bymonthday = function() { - var gettext = this.gettext; - if (this.byweekday && this.byweekday.allWeeks) { - this.add(gettext("on")).add(this.list(this.byweekday.allWeeks, this.weekdaytext, gettext("or"))).add(gettext("the")).add(this.list(this.bymonthday, this.nth, gettext("or"))); - } else { - this.add(gettext("on the")).add(this.list(this.bymonthday, this.nth, gettext("and"))); - } - }; - ToText2.prototype._byweekday = function() { - var gettext = this.gettext; - if (this.byweekday.allWeeks && !this.byweekday.isWeekdays) { - this.add(gettext("on")).add(this.list(this.byweekday.allWeeks, this.weekdaytext)); - } - if (this.byweekday.someWeeks) { - if (this.byweekday.allWeeks) - this.add(gettext("and")); - this.add(gettext("on the")).add(this.list(this.byweekday.someWeeks, this.weekdaytext, gettext("and"))); - } - }; - ToText2.prototype._byhour = function() { - var gettext = this.gettext; - this.add(gettext("at")).add(this.list(this.origOptions.byhour, void 0, gettext("and"))); - }; - ToText2.prototype._bymonth = function() { - this.add(this.list(this.options.bymonth, this.monthtext, this.gettext("and"))); - }; - ToText2.prototype.nth = function(n) { - n = parseInt(n.toString(), 10); - var nth; - var gettext = this.gettext; - if (n === -1) - return gettext("last"); - var npos = Math.abs(n); - switch (npos) { - case 1: - case 21: - case 31: - nth = npos + gettext("st"); - break; - case 2: - case 22: - nth = npos + gettext("nd"); - break; - case 3: - case 23: - nth = npos + gettext("rd"); - break; - default: - nth = npos + gettext("th"); - } - return n < 0 ? nth + " " + gettext("last") : nth; - }; - ToText2.prototype.monthtext = function(m) { - return this.language.monthNames[m - 1]; - }; - ToText2.prototype.weekdaytext = function(wday) { - var weekday = isNumber(wday) ? (wday + 1) % 7 : wday.getJsWeekday(); - return (wday.n ? this.nth(wday.n) + " " : "") + this.language.dayNames[weekday]; - }; - ToText2.prototype.plural = function(n) { - return n % 100 !== 1; - }; - ToText2.prototype.add = function(s) { - this.text.push(" "); - this.text.push(s); - return this; - }; - ToText2.prototype.list = function(arr, callback, finalDelim, delim) { - var _this = this; - if (delim === void 0) { - delim = ","; - } - if (!isArray(arr)) { - arr = [arr]; - } - var delimJoin = function(array, delimiter, finalDelimiter) { - var list = ""; - for (var i = 0; i < array.length; i++) { - if (i !== 0) { - if (i === array.length - 1) { - list += " " + finalDelimiter + " "; - } else { - list += delimiter + " "; - } - } - list += array[i]; - } - return list; - }; - callback = callback || function(o) { - return o.toString(); - }; - var realCallback = function(arg) { - return callback && callback.call(_this, arg); - }; - if (finalDelim) { - return delimJoin(arr.map(realCallback), delim, finalDelim); - } else { - return arr.map(realCallback).join(delim + " "); - } - }; - return ToText2; -}(); -var totext_default = ToText; - -// node_modules/rrule/dist/esm/nlp/parsetext.js -var Parser = function() { - function Parser2(rules) { - this.done = true; - this.rules = rules; - } - Parser2.prototype.start = function(text2) { - this.text = text2; - this.done = false; - return this.nextSymbol(); - }; - Parser2.prototype.isDone = function() { - return this.done && this.symbol === null; - }; - Parser2.prototype.nextSymbol = function() { - var best; - var bestSymbol; - this.symbol = null; - this.value = null; - do { - if (this.done) - return false; - var rule = void 0; - best = null; - for (var name_1 in this.rules) { - rule = this.rules[name_1]; - var match = rule.exec(this.text); - if (match) { - if (best === null || match[0].length > best[0].length) { - best = match; - bestSymbol = name_1; - } - } - } - if (best != null) { - this.text = this.text.substr(best[0].length); - if (this.text === "") - this.done = true; - } - if (best == null) { - this.done = true; - this.symbol = null; - this.value = null; - return; - } - } while (bestSymbol === "SKIP"); - this.symbol = bestSymbol; - this.value = best; - return true; - }; - Parser2.prototype.accept = function(name) { - if (this.symbol === name) { - if (this.value) { - var v = this.value; - this.nextSymbol(); - return v; - } - this.nextSymbol(); - return true; - } - return false; - }; - Parser2.prototype.acceptNumber = function() { - return this.accept("number"); - }; - Parser2.prototype.expect = function(name) { - if (this.accept(name)) - return true; - throw new Error("expected " + name + " but found " + this.symbol); - }; - return Parser2; -}(); -function parseText(text2, language) { - if (language === void 0) { - language = i18n_default; - } - var options = {}; - var ttr = new Parser(language.tokens); - if (!ttr.start(text2)) - return null; - S(); - return options; - function S() { - ttr.expect("every"); - var n = ttr.acceptNumber(); - if (n) - options.interval = parseInt(n[0], 10); - if (ttr.isDone()) - throw new Error("Unexpected end"); - switch (ttr.symbol) { - case "day(s)": - options.freq = RRule.DAILY; - if (ttr.nextSymbol()) { - AT(); - F(); - } - break; - case "weekday(s)": - options.freq = RRule.WEEKLY; - options.byweekday = [RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR]; - ttr.nextSymbol(); - F(); - break; - case "week(s)": - options.freq = RRule.WEEKLY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case "hour(s)": - options.freq = RRule.HOURLY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case "minute(s)": - options.freq = RRule.MINUTELY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case "month(s)": - options.freq = RRule.MONTHLY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case "year(s)": - options.freq = RRule.YEARLY; - if (ttr.nextSymbol()) { - ON(); - F(); - } - break; - case "monday": - case "tuesday": - case "wednesday": - case "thursday": - case "friday": - case "saturday": - case "sunday": - options.freq = RRule.WEEKLY; - var key = ttr.symbol.substr(0, 2).toUpperCase(); - options.byweekday = [RRule[key]]; - if (!ttr.nextSymbol()) - return; - while (ttr.accept("comma")) { - if (ttr.isDone()) - throw new Error("Unexpected end"); - var wkd = decodeWKD(); - if (!wkd) { - throw new Error("Unexpected symbol " + ttr.symbol + ", expected weekday"); - } - options.byweekday.push(RRule[wkd]); - ttr.nextSymbol(); - } - MDAYs(); - F(); - break; - case "january": - case "february": - case "march": - case "april": - case "may": - case "june": - case "july": - case "august": - case "september": - case "october": - case "november": - case "december": - options.freq = RRule.YEARLY; - options.bymonth = [decodeM()]; - if (!ttr.nextSymbol()) - return; - while (ttr.accept("comma")) { - if (ttr.isDone()) - throw new Error("Unexpected end"); - var m = decodeM(); - if (!m) { - throw new Error("Unexpected symbol " + ttr.symbol + ", expected month"); - } - options.bymonth.push(m); - ttr.nextSymbol(); - } - ON(); - F(); - break; - default: - throw new Error("Unknown symbol"); - } - } - function ON() { - var on = ttr.accept("on"); - var the = ttr.accept("the"); - if (!(on || the)) - return; - do { - var nth = decodeNTH(); - var wkd = decodeWKD(); - var m = decodeM(); - if (nth) { - if (wkd) { - ttr.nextSymbol(); - if (!options.byweekday) - options.byweekday = []; - options.byweekday.push(RRule[wkd].nth(nth)); - } else { - if (!options.bymonthday) - options.bymonthday = []; - options.bymonthday.push(nth); - ttr.accept("day(s)"); - } - } else if (wkd) { - ttr.nextSymbol(); - if (!options.byweekday) - options.byweekday = []; - options.byweekday.push(RRule[wkd]); - } else if (ttr.symbol === "weekday(s)") { - ttr.nextSymbol(); - if (!options.byweekday) { - options.byweekday = [RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR]; - } - } else if (ttr.symbol === "week(s)") { - ttr.nextSymbol(); - var n = ttr.acceptNumber(); - if (!n) { - throw new Error("Unexpected symbol " + ttr.symbol + ", expected week number"); - } - options.byweekno = [parseInt(n[0], 10)]; - while (ttr.accept("comma")) { - n = ttr.acceptNumber(); - if (!n) { - throw new Error("Unexpected symbol " + ttr.symbol + "; expected monthday"); - } - options.byweekno.push(parseInt(n[0], 10)); - } - } else if (m) { - ttr.nextSymbol(); - if (!options.bymonth) - options.bymonth = []; - options.bymonth.push(m); - } else { - return; - } - } while (ttr.accept("comma") || ttr.accept("the") || ttr.accept("on")); - } - function AT() { - var at = ttr.accept("at"); - if (!at) - return; - do { - var n = ttr.acceptNumber(); - if (!n) { - throw new Error("Unexpected symbol " + ttr.symbol + ", expected hour"); - } - options.byhour = [parseInt(n[0], 10)]; - while (ttr.accept("comma")) { - n = ttr.acceptNumber(); - if (!n) { - throw new Error("Unexpected symbol " + ttr.symbol + "; expected hour"); - } - options.byhour.push(parseInt(n[0], 10)); - } - } while (ttr.accept("comma") || ttr.accept("at")); - } - function decodeM() { - switch (ttr.symbol) { - case "january": - return 1; - case "february": - return 2; - case "march": - return 3; - case "april": - return 4; - case "may": - return 5; - case "june": - return 6; - case "july": - return 7; - case "august": - return 8; - case "september": - return 9; - case "october": - return 10; - case "november": - return 11; - case "december": - return 12; - default: - return false; - } - } - function decodeWKD() { - switch (ttr.symbol) { - case "monday": - case "tuesday": - case "wednesday": - case "thursday": - case "friday": - case "saturday": - case "sunday": - return ttr.symbol.substr(0, 2).toUpperCase(); - default: - return false; - } - } - function decodeNTH() { - switch (ttr.symbol) { - case "last": - ttr.nextSymbol(); - return -1; - case "first": - ttr.nextSymbol(); - return 1; - case "second": - ttr.nextSymbol(); - return ttr.accept("last") ? -2 : 2; - case "third": - ttr.nextSymbol(); - return ttr.accept("last") ? -3 : 3; - case "nth": - var v = parseInt(ttr.value[1], 10); - if (v < -366 || v > 366) - throw new Error("Nth out of range: " + v); - ttr.nextSymbol(); - return ttr.accept("last") ? -v : v; - default: - return false; - } - } - function MDAYs() { - ttr.accept("on"); - ttr.accept("the"); - var nth = decodeNTH(); - if (!nth) - return; - options.bymonthday = [nth]; - ttr.nextSymbol(); - while (ttr.accept("comma")) { - nth = decodeNTH(); - if (!nth) { - throw new Error("Unexpected symbol " + ttr.symbol + "; expected monthday"); - } - options.bymonthday.push(nth); - ttr.nextSymbol(); - } - } - function F() { - if (ttr.symbol === "until") { - var date = Date.parse(ttr.text); - if (!date) - throw new Error("Cannot parse until date:" + ttr.text); - options.until = new Date(date); - } else if (ttr.accept("for")) { - options.count = parseInt(ttr.value[0], 10); - ttr.expect("number"); - } - } -} - -// node_modules/rrule/dist/esm/types.js -var Frequency; -(function(Frequency2) { - Frequency2[Frequency2["YEARLY"] = 0] = "YEARLY"; - Frequency2[Frequency2["MONTHLY"] = 1] = "MONTHLY"; - Frequency2[Frequency2["WEEKLY"] = 2] = "WEEKLY"; - Frequency2[Frequency2["DAILY"] = 3] = "DAILY"; - Frequency2[Frequency2["HOURLY"] = 4] = "HOURLY"; - Frequency2[Frequency2["MINUTELY"] = 5] = "MINUTELY"; - Frequency2[Frequency2["SECONDLY"] = 6] = "SECONDLY"; -})(Frequency || (Frequency = {})); -function freqIsDailyOrGreater(freq) { - return freq < Frequency.HOURLY; -} - -// node_modules/rrule/dist/esm/nlp/index.js -var fromText = function(text2, language) { - if (language === void 0) { - language = i18n_default; - } - return new RRule(parseText(text2, language) || void 0); -}; -var common = [ - "count", - "until", - "interval", - "byweekday", - "bymonthday", - "bymonth" -]; -totext_default.IMPLEMENTED = []; -totext_default.IMPLEMENTED[Frequency.HOURLY] = common; -totext_default.IMPLEMENTED[Frequency.MINUTELY] = common; -totext_default.IMPLEMENTED[Frequency.DAILY] = ["byhour"].concat(common); -totext_default.IMPLEMENTED[Frequency.WEEKLY] = common; -totext_default.IMPLEMENTED[Frequency.MONTHLY] = common; -totext_default.IMPLEMENTED[Frequency.YEARLY] = ["byweekno", "byyearday"].concat(common); -var toText = function(rrule, gettext, language, dateFormatter) { - return new totext_default(rrule, gettext, language, dateFormatter).toString(); -}; -var isFullyConvertible = totext_default.isFullyConvertible; - -// node_modules/rrule/dist/esm/datetime.js -var Time = function() { - function Time2(hour, minute, second, millisecond) { - this.hour = hour; - this.minute = minute; - this.second = second; - this.millisecond = millisecond || 0; - } - Time2.prototype.getHours = function() { - return this.hour; - }; - Time2.prototype.getMinutes = function() { - return this.minute; - }; - Time2.prototype.getSeconds = function() { - return this.second; - }; - Time2.prototype.getMilliseconds = function() { - return this.millisecond; - }; - Time2.prototype.getTime = function() { - return (this.hour * 60 * 60 + this.minute * 60 + this.second) * 1e3 + this.millisecond; - }; - return Time2; -}(); -var DateTime = function(_super) { - __extends(DateTime2, _super); - function DateTime2(year, month, day, hour, minute, second, millisecond) { - var _this = _super.call(this, hour, minute, second, millisecond) || this; - _this.year = year; - _this.month = month; - _this.day = day; - return _this; - } - DateTime2.fromDate = function(date) { - return new this(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.valueOf() % 1e3); - }; - DateTime2.prototype.getWeekday = function() { - return dateutil.getWeekday(new Date(this.getTime())); - }; - DateTime2.prototype.getTime = function() { - return new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond)).getTime(); - }; - DateTime2.prototype.getDay = function() { - return this.day; - }; - DateTime2.prototype.getMonth = function() { - return this.month; - }; - DateTime2.prototype.getYear = function() { - return this.year; - }; - DateTime2.prototype.addYears = function(years) { - this.year += years; - }; - DateTime2.prototype.addMonths = function(months) { - this.month += months; - if (this.month > 12) { - var yearDiv = Math.floor(this.month / 12); - var monthMod = pymod(this.month, 12); - this.month = monthMod; - this.year += yearDiv; - if (this.month === 0) { - this.month = 12; - --this.year; - } - } - }; - DateTime2.prototype.addWeekly = function(days, wkst) { - if (wkst > this.getWeekday()) { - this.day += -(this.getWeekday() + 1 + (6 - wkst)) + days * 7; - } else { - this.day += -(this.getWeekday() - wkst) + days * 7; - } - this.fixDay(); - }; - DateTime2.prototype.addDaily = function(days) { - this.day += days; - this.fixDay(); - }; - DateTime2.prototype.addHours = function(hours, filtered, byhour) { - if (filtered) { - this.hour += Math.floor((23 - this.hour) / hours) * hours; - } - for (; ; ) { - this.hour += hours; - var _a = divmod(this.hour, 24), dayDiv = _a.div, hourMod = _a.mod; - if (dayDiv) { - this.hour = hourMod; - this.addDaily(dayDiv); - } - if (empty(byhour) || includes(byhour, this.hour)) - break; - } - }; - DateTime2.prototype.addMinutes = function(minutes, filtered, byhour, byminute) { - if (filtered) { - this.minute += Math.floor((1439 - (this.hour * 60 + this.minute)) / minutes) * minutes; - } - for (; ; ) { - this.minute += minutes; - var _a = divmod(this.minute, 60), hourDiv = _a.div, minuteMod = _a.mod; - if (hourDiv) { - this.minute = minuteMod; - this.addHours(hourDiv, false, byhour); - } - if ((empty(byhour) || includes(byhour, this.hour)) && (empty(byminute) || includes(byminute, this.minute))) { - break; - } - } - }; - DateTime2.prototype.addSeconds = function(seconds, filtered, byhour, byminute, bysecond) { - if (filtered) { - this.second += Math.floor((86399 - (this.hour * 3600 + this.minute * 60 + this.second)) / seconds) * seconds; - } - for (; ; ) { - this.second += seconds; - var _a = divmod(this.second, 60), minuteDiv = _a.div, secondMod = _a.mod; - if (minuteDiv) { - this.second = secondMod; - this.addMinutes(minuteDiv, false, byhour, byminute); - } - if ((empty(byhour) || includes(byhour, this.hour)) && (empty(byminute) || includes(byminute, this.minute)) && (empty(bysecond) || includes(bysecond, this.second))) { - break; - } - } - }; - DateTime2.prototype.fixDay = function() { - if (this.day <= 28) { - return; - } - var daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1]; - if (this.day <= daysinmonth) { - return; - } - while (this.day > daysinmonth) { - this.day -= daysinmonth; - ++this.month; - if (this.month === 13) { - this.month = 1; - ++this.year; - if (this.year > dateutil.MAXYEAR) { - return; - } - } - daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1]; - } - }; - DateTime2.prototype.add = function(options, filtered) { - var freq = options.freq, interval = options.interval, wkst = options.wkst, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; - switch (freq) { - case Frequency.YEARLY: - return this.addYears(interval); - case Frequency.MONTHLY: - return this.addMonths(interval); - case Frequency.WEEKLY: - return this.addWeekly(interval, wkst); - case Frequency.DAILY: - return this.addDaily(interval); - case Frequency.HOURLY: - return this.addHours(interval, filtered, byhour); - case Frequency.MINUTELY: - return this.addMinutes(interval, filtered, byhour, byminute); - case Frequency.SECONDLY: - return this.addSeconds(interval, filtered, byhour, byminute, bysecond); - } - }; - return DateTime2; -}(Time); - -// node_modules/rrule/dist/esm/parseoptions.js -function initializeOptions(options) { - var invalid = []; - var keys = Object.keys(options); - for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { - var key = keys_1[_i]; - if (!includes(defaultKeys, key)) - invalid.push(key); - if (dateutil_default.isDate(options[key]) && !dateutil_default.isValidDate(options[key])) { - invalid.push(key); - } - } - if (invalid.length) { - throw new Error("Invalid options: " + invalid.join(", ")); - } - return __assign({}, options); -} -function parseOptions(options) { - var opts = __assign(__assign({}, DEFAULT_OPTIONS), initializeOptions(options)); - if (isPresent(opts.byeaster)) - opts.freq = RRule.YEARLY; - if (!(isPresent(opts.freq) && RRule.FREQUENCIES[opts.freq])) { - throw new Error("Invalid frequency: ".concat(opts.freq, " ").concat(options.freq)); - } - if (!opts.dtstart) - opts.dtstart = new Date(new Date().setMilliseconds(0)); - if (!isPresent(opts.wkst)) { - opts.wkst = RRule.MO.weekday; - } else if (isNumber(opts.wkst)) { - } else { - opts.wkst = opts.wkst.weekday; - } - if (isPresent(opts.bysetpos)) { - if (isNumber(opts.bysetpos)) - opts.bysetpos = [opts.bysetpos]; - for (var i = 0; i < opts.bysetpos.length; i++) { - var v = opts.bysetpos[i]; - if (v === 0 || !(v >= -366 && v <= 366)) { - throw new Error("bysetpos must be between 1 and 366, or between -366 and -1"); - } - } - } - if (!(Boolean(opts.byweekno) || notEmpty(opts.byweekno) || notEmpty(opts.byyearday) || Boolean(opts.bymonthday) || notEmpty(opts.bymonthday) || isPresent(opts.byweekday) || isPresent(opts.byeaster))) { - switch (opts.freq) { - case RRule.YEARLY: - if (!opts.bymonth) - opts.bymonth = opts.dtstart.getUTCMonth() + 1; - opts.bymonthday = opts.dtstart.getUTCDate(); - break; - case RRule.MONTHLY: - opts.bymonthday = opts.dtstart.getUTCDate(); - break; - case RRule.WEEKLY: - opts.byweekday = [dateutil_default.getWeekday(opts.dtstart)]; - break; - } - } - if (isPresent(opts.bymonth) && !isArray(opts.bymonth)) { - opts.bymonth = [opts.bymonth]; - } - if (isPresent(opts.byyearday) && !isArray(opts.byyearday) && isNumber(opts.byyearday)) { - opts.byyearday = [opts.byyearday]; - } - if (!isPresent(opts.bymonthday)) { - opts.bymonthday = []; - opts.bynmonthday = []; - } else if (isArray(opts.bymonthday)) { - var bymonthday = []; - var bynmonthday = []; - for (var i = 0; i < opts.bymonthday.length; i++) { - var v = opts.bymonthday[i]; - if (v > 0) { - bymonthday.push(v); - } else if (v < 0) { - bynmonthday.push(v); - } - } - opts.bymonthday = bymonthday; - opts.bynmonthday = bynmonthday; - } else if (opts.bymonthday < 0) { - opts.bynmonthday = [opts.bymonthday]; - opts.bymonthday = []; - } else { - opts.bynmonthday = []; - opts.bymonthday = [opts.bymonthday]; - } - if (isPresent(opts.byweekno) && !isArray(opts.byweekno)) { - opts.byweekno = [opts.byweekno]; - } - if (!isPresent(opts.byweekday)) { - opts.bynweekday = null; - } else if (isNumber(opts.byweekday)) { - opts.byweekday = [opts.byweekday]; - opts.bynweekday = null; - } else if (isWeekdayStr(opts.byweekday)) { - opts.byweekday = [Weekday.fromStr(opts.byweekday).weekday]; - opts.bynweekday = null; - } else if (opts.byweekday instanceof Weekday) { - if (!opts.byweekday.n || opts.freq > RRule.MONTHLY) { - opts.byweekday = [opts.byweekday.weekday]; - opts.bynweekday = null; - } else { - opts.bynweekday = [[opts.byweekday.weekday, opts.byweekday.n]]; - opts.byweekday = null; - } - } else { - var byweekday = []; - var bynweekday = []; - for (var i = 0; i < opts.byweekday.length; i++) { - var wday = opts.byweekday[i]; - if (isNumber(wday)) { - byweekday.push(wday); - continue; - } else if (isWeekdayStr(wday)) { - byweekday.push(Weekday.fromStr(wday).weekday); - continue; - } - if (!wday.n || opts.freq > RRule.MONTHLY) { - byweekday.push(wday.weekday); - } else { - bynweekday.push([wday.weekday, wday.n]); - } - } - opts.byweekday = notEmpty(byweekday) ? byweekday : null; - opts.bynweekday = notEmpty(bynweekday) ? bynweekday : null; - } - if (!isPresent(opts.byhour)) { - opts.byhour = opts.freq < RRule.HOURLY ? [opts.dtstart.getUTCHours()] : null; - } else if (isNumber(opts.byhour)) { - opts.byhour = [opts.byhour]; - } - if (!isPresent(opts.byminute)) { - opts.byminute = opts.freq < RRule.MINUTELY ? [opts.dtstart.getUTCMinutes()] : null; - } else if (isNumber(opts.byminute)) { - opts.byminute = [opts.byminute]; - } - if (!isPresent(opts.bysecond)) { - opts.bysecond = opts.freq < RRule.SECONDLY ? [opts.dtstart.getUTCSeconds()] : null; - } else if (isNumber(opts.bysecond)) { - opts.bysecond = [opts.bysecond]; - } - return { parsedOptions: opts }; -} -function buildTimeset(opts) { - var millisecondModulo = opts.dtstart.getTime() % 1e3; - if (!freqIsDailyOrGreater(opts.freq)) { - return []; - } - var timeset = []; - opts.byhour.forEach(function(hour) { - opts.byminute.forEach(function(minute) { - opts.bysecond.forEach(function(second) { - timeset.push(new Time(hour, minute, second, millisecondModulo)); - }); - }); - }); - return timeset; -} - -// node_modules/rrule/dist/esm/parsestring.js -function parseString(rfcString) { - var options = rfcString.split("\n").map(parseLine).filter(function(x) { - return x !== null; - }); - return __assign(__assign({}, options[0]), options[1]); -} -function parseDtstart(line) { - var options = {}; - var dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\s]+)/i.exec(line); - if (!dtstartWithZone) { - return options; - } - var tzid = dtstartWithZone[1], dtstart = dtstartWithZone[2]; - if (tzid) { - options.tzid = tzid; - } - options.dtstart = dateutil_default.untilStringToDate(dtstart); - return options; -} -function parseLine(rfcString) { - rfcString = rfcString.replace(/^\s+|\s+$/, ""); - if (!rfcString.length) - return null; - var header = /^([A-Z]+?)[:;]/.exec(rfcString.toUpperCase()); - if (!header) { - return parseRrule(rfcString); - } - var key = header[1]; - switch (key.toUpperCase()) { - case "RRULE": - case "EXRULE": - return parseRrule(rfcString); - case "DTSTART": - return parseDtstart(rfcString); - default: - throw new Error("Unsupported RFC prop ".concat(key, " in ").concat(rfcString)); - } -} -function parseRrule(line) { - var strippedLine = line.replace(/^RRULE:/i, ""); - var options = parseDtstart(strippedLine); - var attrs = line.replace(/^(?:RRULE|EXRULE):/i, "").split(";"); - attrs.forEach(function(attr2) { - var _a = attr2.split("="), key = _a[0], value = _a[1]; - switch (key.toUpperCase()) { - case "FREQ": - options.freq = Frequency[value.toUpperCase()]; - break; - case "WKST": - options.wkst = Days[value.toUpperCase()]; - break; - case "COUNT": - case "INTERVAL": - case "BYSETPOS": - case "BYMONTH": - case "BYMONTHDAY": - case "BYYEARDAY": - case "BYWEEKNO": - case "BYHOUR": - case "BYMINUTE": - case "BYSECOND": - var num = parseNumber(value); - var optionKey = key.toLowerCase(); - options[optionKey] = num; - break; - case "BYWEEKDAY": - case "BYDAY": - options.byweekday = parseWeekday(value); - break; - case "DTSTART": - case "TZID": - var dtstart = parseDtstart(line); - options.tzid = dtstart.tzid; - options.dtstart = dtstart.dtstart; - break; - case "UNTIL": - options.until = dateutil_default.untilStringToDate(value); - break; - case "BYEASTER": - options.byeaster = Number(value); - break; - default: - throw new Error("Unknown RRULE property '" + key + "'"); - } - }); - return options; -} -function parseNumber(value) { - if (value.indexOf(",") !== -1) { - var values = value.split(","); - return values.map(parseIndividualNumber); - } - return parseIndividualNumber(value); -} -function parseIndividualNumber(value) { - if (/^[+-]?\d+$/.test(value)) { - return Number(value); - } - return value; -} -function parseWeekday(value) { - var days = value.split(","); - return days.map(function(day) { - if (day.length === 2) { - return Days[day]; - } - var parts = day.match(/^([+-]?\d{1,2})([A-Z]{2})$/); - if (!parts || parts.length < 3) { - throw new SyntaxError("Invalid weekday string: ".concat(day)); - } - var n = Number(parts[1]); - var wdaypart = parts[2]; - var wday = Days[wdaypart].weekday; - return new Weekday(wday, n); - }); -} - -// node_modules/rrule/dist/esm/datewithzone.js -var DateWithZone = function() { - function DateWithZone2(date, tzid) { - if (isNaN(date.getTime())) { - throw new RangeError("Invalid date passed to DateWithZone"); - } - this.date = date; - this.tzid = tzid; - } - Object.defineProperty(DateWithZone2.prototype, "isUTC", { - get: function() { - return !this.tzid || this.tzid.toUpperCase() === "UTC"; - }, - enumerable: false, - configurable: true - }); - DateWithZone2.prototype.toString = function() { - var datestr = dateutil_default.timeToUntilString(this.date.getTime(), this.isUTC); - if (!this.isUTC) { - return ";TZID=".concat(this.tzid, ":").concat(datestr); - } - return ":".concat(datestr); - }; - DateWithZone2.prototype.getTime = function() { - return this.date.getTime(); - }; - DateWithZone2.prototype.rezonedDate = function() { - var _a; - if (this.isUTC) { - return this.date; - } - var localTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; - var dateInLocalTZ = new Date(this.date.toLocaleString(void 0, { timeZone: localTimeZone })); - var dateInTargetTZ = new Date(this.date.toLocaleString(void 0, { timeZone: (_a = this.tzid) !== null && _a !== void 0 ? _a : "UTC" })); - var tzOffset = dateInTargetTZ.getTime() - dateInLocalTZ.getTime(); - return new Date(this.date.getTime() - tzOffset); - }; - return DateWithZone2; -}(); - -// node_modules/rrule/dist/esm/optionstostring.js -function optionsToString(options) { - var rrule = []; - var dtstart = ""; - var keys = Object.keys(options); - var defaultKeys2 = Object.keys(DEFAULT_OPTIONS); - for (var i = 0; i < keys.length; i++) { - if (keys[i] === "tzid") - continue; - if (!includes(defaultKeys2, keys[i])) - continue; - var key = keys[i].toUpperCase(); - var value = options[keys[i]]; - var outValue = ""; - if (!isPresent(value) || isArray(value) && !value.length) - continue; - switch (key) { - case "FREQ": - outValue = RRule.FREQUENCIES[options.freq]; - break; - case "WKST": - if (isNumber(value)) { - outValue = new Weekday(value).toString(); - } else { - outValue = value.toString(); - } - break; - case "BYWEEKDAY": - key = "BYDAY"; - outValue = toArray(value).map(function(wday) { - if (wday instanceof Weekday) { - return wday; - } - if (isArray(wday)) { - return new Weekday(wday[0], wday[1]); - } - return new Weekday(wday); - }).toString(); - break; - case "DTSTART": - dtstart = buildDtstart(value, options.tzid); - break; - case "UNTIL": - outValue = dateutil_default.timeToUntilString(value, !options.tzid); - break; - default: - if (isArray(value)) { - var strValues = []; - for (var j = 0; j < value.length; j++) { - strValues[j] = String(value[j]); - } - outValue = strValues.toString(); - } else { - outValue = String(value); - } - } - if (outValue) { - rrule.push([key, outValue]); - } - } - var rules = rrule.map(function(_a) { - var key2 = _a[0], value2 = _a[1]; - return "".concat(key2, "=").concat(value2.toString()); - }).join(";"); - var ruleString = ""; - if (rules !== "") { - ruleString = "RRULE:".concat(rules); - } - return [dtstart, ruleString].filter(function(x) { - return !!x; - }).join("\n"); -} -function buildDtstart(dtstart, tzid) { - if (!dtstart) { - return ""; - } - return "DTSTART" + new DateWithZone(new Date(dtstart), tzid).toString(); -} - -// node_modules/rrule/dist/esm/cache.js -function argsMatch(left, right) { - if (Array.isArray(left)) { - if (!Array.isArray(right)) - return false; - if (left.length !== right.length) - return false; - return left.every(function(date, i) { - return date.getTime() === right[i].getTime(); - }); - } - if (left instanceof Date) { - return right instanceof Date && left.getTime() === right.getTime(); - } - return left === right; -} -var Cache = function() { - function Cache3() { - this.all = false; - this.before = []; - this.after = []; - this.between = []; - } - Cache3.prototype._cacheAdd = function(what, value, args) { - if (value) { - value = value instanceof Date ? dateutil_default.clone(value) : dateutil_default.cloneDates(value); - } - if (what === "all") { - this.all = value; - } else { - args._value = value; - this[what].push(args); - } - }; - Cache3.prototype._cacheGet = function(what, args) { - var cached = false; - var argsKeys = args ? Object.keys(args) : []; - var findCacheDiff = function(item2) { - for (var i2 = 0; i2 < argsKeys.length; i2++) { - var key = argsKeys[i2]; - if (!argsMatch(args[key], item2[key])) { - return true; - } - } - return false; - }; - var cachedObject = this[what]; - if (what === "all") { - cached = this.all; - } else if (isArray(cachedObject)) { - for (var i = 0; i < cachedObject.length; i++) { - var item = cachedObject[i]; - if (argsKeys.length && findCacheDiff(item)) - continue; - cached = item._value; - break; - } - } - if (!cached && this.all) { - var iterResult = new iterresult_default(what, args); - for (var i = 0; i < this.all.length; i++) { - if (!iterResult.accept(this.all[i])) - break; - } - cached = iterResult.getValue(); - this._cacheAdd(what, cached, args); - } - return isArray(cached) ? dateutil_default.cloneDates(cached) : cached instanceof Date ? dateutil_default.clone(cached) : cached; - }; - return Cache3; -}(); - -// node_modules/rrule/dist/esm/masks.js -var M365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], repeat(1, 31), true), repeat(2, 28), true), repeat(3, 31), true), repeat(4, 30), true), repeat(5, 31), true), repeat(6, 30), true), repeat(7, 31), true), repeat(8, 31), true), repeat(9, 30), true), repeat(10, 31), true), repeat(11, 30), true), repeat(12, 31), true), repeat(1, 7), true); -var M366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], repeat(1, 31), true), repeat(2, 29), true), repeat(3, 31), true), repeat(4, 30), true), repeat(5, 31), true), repeat(6, 30), true), repeat(7, 31), true), repeat(8, 31), true), repeat(9, 30), true), repeat(10, 31), true), repeat(11, 30), true), repeat(12, 31), true), repeat(1, 7), true); -var M28 = range(1, 29); -var M29 = range(1, 30); -var M30 = range(1, 31); -var M31 = range(1, 32); -var MDAY366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], M31, true), M29, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31.slice(0, 7), true); -var MDAY365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], M31, true), M28, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31.slice(0, 7), true); -var NM28 = range(-28, 0); -var NM29 = range(-29, 0); -var NM30 = range(-30, 0); -var NM31 = range(-31, 0); -var NMDAY366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], NM31, true), NM29, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31.slice(0, 7), true); -var NMDAY365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], NM31, true), NM28, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31.slice(0, 7), true); -var M366RANGE = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]; -var M365RANGE = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; -var WDAYMASK = function() { - var wdaymask = []; - for (var i = 0; i < 55; i++) - wdaymask = wdaymask.concat(range(7)); - return wdaymask; -}(); - -// node_modules/rrule/dist/esm/iterinfo/yearinfo.js -function rebuildYear(year, options) { - var firstyday = new Date(Date.UTC(year, 0, 1)); - var yearlen = dateutil_default.isLeapYear(year) ? 366 : 365; - var nextyearlen = dateutil_default.isLeapYear(year + 1) ? 366 : 365; - var yearordinal = dateutil_default.toOrdinal(firstyday); - var yearweekday = dateutil_default.getWeekday(firstyday); - var result = __assign(__assign({ yearlen, nextyearlen, yearordinal, yearweekday }, baseYearMasks(year)), { wnomask: null }); - if (empty(options.byweekno)) { - return result; - } - result.wnomask = repeat(0, yearlen + 7); - var firstwkst; - var wyearlen; - var no1wkst = firstwkst = pymod(7 - yearweekday + options.wkst, 7); - if (no1wkst >= 4) { - no1wkst = 0; - wyearlen = result.yearlen + pymod(yearweekday - options.wkst, 7); - } else { - wyearlen = yearlen - no1wkst; - } - var div = Math.floor(wyearlen / 7); - var mod = pymod(wyearlen, 7); - var numweeks = Math.floor(div + mod / 4); - for (var j = 0; j < options.byweekno.length; j++) { - var n = options.byweekno[j]; - if (n < 0) { - n += numweeks + 1; - } - if (!(n > 0 && n <= numweeks)) { - continue; - } - var i = void 0; - if (n > 1) { - i = no1wkst + (n - 1) * 7; - if (no1wkst !== firstwkst) { - i -= 7 - firstwkst; - } - } else { - i = no1wkst; - } - for (var k = 0; k < 7; k++) { - result.wnomask[i] = 1; - i++; - if (result.wdaymask[i] === options.wkst) - break; - } - } - if (includes(options.byweekno, 1)) { - var i = no1wkst + numweeks * 7; - if (no1wkst !== firstwkst) - i -= 7 - firstwkst; - if (i < yearlen) { - for (var j = 0; j < 7; j++) { - result.wnomask[i] = 1; - i += 1; - if (result.wdaymask[i] === options.wkst) - break; - } - } - } - if (no1wkst) { - var lnumweeks = void 0; - if (!includes(options.byweekno, -1)) { - var lyearweekday = dateutil_default.getWeekday(new Date(Date.UTC(year - 1, 0, 1))); - var lno1wkst = pymod(7 - lyearweekday.valueOf() + options.wkst, 7); - var lyearlen = dateutil_default.isLeapYear(year - 1) ? 366 : 365; - var weekst = void 0; - if (lno1wkst >= 4) { - lno1wkst = 0; - weekst = lyearlen + pymod(lyearweekday - options.wkst, 7); - } else { - weekst = yearlen - no1wkst; - } - lnumweeks = Math.floor(52 + pymod(weekst, 7) / 4); - } else { - lnumweeks = -1; - } - if (includes(options.byweekno, lnumweeks)) { - for (var i = 0; i < no1wkst; i++) - result.wnomask[i] = 1; - } - } - return result; -} -function baseYearMasks(year) { - var yearlen = dateutil_default.isLeapYear(year) ? 366 : 365; - var firstyday = new Date(Date.UTC(year, 0, 1)); - var wday = dateutil_default.getWeekday(firstyday); - if (yearlen === 365) { - return { - mmask: M365MASK, - mdaymask: MDAY365MASK, - nmdaymask: NMDAY365MASK, - wdaymask: WDAYMASK.slice(wday), - mrange: M365RANGE - }; - } - return { - mmask: M366MASK, - mdaymask: MDAY366MASK, - nmdaymask: NMDAY366MASK, - wdaymask: WDAYMASK.slice(wday), - mrange: M366RANGE - }; -} - -// node_modules/rrule/dist/esm/iterinfo/monthinfo.js -function rebuildMonth(year, month, yearlen, mrange, wdaymask, options) { - var result = { - lastyear: year, - lastmonth: month, - nwdaymask: [] - }; - var ranges = []; - if (options.freq === RRule.YEARLY) { - if (empty(options.bymonth)) { - ranges = [[0, yearlen]]; - } else { - for (var j = 0; j < options.bymonth.length; j++) { - month = options.bymonth[j]; - ranges.push(mrange.slice(month - 1, month + 1)); - } - } - } else if (options.freq === RRule.MONTHLY) { - ranges = [mrange.slice(month - 1, month + 1)]; - } - if (empty(ranges)) { - return result; - } - result.nwdaymask = repeat(0, yearlen); - for (var j = 0; j < ranges.length; j++) { - var rang = ranges[j]; - var first = rang[0]; - var last = rang[1] - 1; - for (var k = 0; k < options.bynweekday.length; k++) { - var i = void 0; - var _a = options.bynweekday[k], wday = _a[0], n = _a[1]; - if (n < 0) { - i = last + (n + 1) * 7; - i -= pymod(wdaymask[i] - wday, 7); - } else { - i = first + (n - 1) * 7; - i += pymod(7 - wdaymask[i] + wday, 7); - } - if (first <= i && i <= last) - result.nwdaymask[i] = 1; - } - } - return result; -} - -// node_modules/rrule/dist/esm/iterinfo/easter.js -function easter(y, offset) { - if (offset === void 0) { - offset = 0; - } - var a = y % 19; - var b = Math.floor(y / 100); - var c = y % 100; - var d = Math.floor(b / 4); - var e = b % 4; - var f = Math.floor((b + 8) / 25); - var g = Math.floor((b - f + 1) / 3); - var h = Math.floor(19 * a + b - d - g + 15) % 30; - var i = Math.floor(c / 4); - var k = c % 4; - var l = Math.floor(32 + 2 * e + 2 * i - h - k) % 7; - var m = Math.floor((a + 11 * h + 22 * l) / 451); - var month = Math.floor((h + l - 7 * m + 114) / 31); - var day = (h + l - 7 * m + 114) % 31 + 1; - var date = Date.UTC(y, month - 1, day + offset); - var yearStart = Date.UTC(y, 0, 1); - return [Math.ceil((date - yearStart) / (1e3 * 60 * 60 * 24))]; -} - -// node_modules/rrule/dist/esm/iterinfo/index.js -var Iterinfo = function() { - function Iterinfo2(options) { - this.options = options; - } - Iterinfo2.prototype.rebuild = function(year, month) { - var options = this.options; - if (year !== this.lastyear) { - this.yearinfo = rebuildYear(year, options); - } - if (notEmpty(options.bynweekday) && (month !== this.lastmonth || year !== this.lastyear)) { - var _a = this.yearinfo, yearlen = _a.yearlen, mrange = _a.mrange, wdaymask = _a.wdaymask; - this.monthinfo = rebuildMonth(year, month, yearlen, mrange, wdaymask, options); - } - if (isPresent(options.byeaster)) { - this.eastermask = easter(year, options.byeaster); - } - }; - Object.defineProperty(Iterinfo2.prototype, "lastyear", { - get: function() { - return this.monthinfo ? this.monthinfo.lastyear : null; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Iterinfo2.prototype, "lastmonth", { - get: function() { - return this.monthinfo ? this.monthinfo.lastmonth : null; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Iterinfo2.prototype, "yearlen", { - get: function() { - return this.yearinfo.yearlen; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Iterinfo2.prototype, "yearordinal", { - get: function() { - return this.yearinfo.yearordinal; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Iterinfo2.prototype, "mrange", { - get: function() { - return this.yearinfo.mrange; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Iterinfo2.prototype, "wdaymask", { - get: function() { - return this.yearinfo.wdaymask; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Iterinfo2.prototype, "mmask", { - get: function() { - return this.yearinfo.mmask; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Iterinfo2.prototype, "wnomask", { - get: function() { - return this.yearinfo.wnomask; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Iterinfo2.prototype, "nwdaymask", { - get: function() { - return this.monthinfo ? this.monthinfo.nwdaymask : []; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Iterinfo2.prototype, "nextyearlen", { - get: function() { - return this.yearinfo.nextyearlen; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Iterinfo2.prototype, "mdaymask", { - get: function() { - return this.yearinfo.mdaymask; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Iterinfo2.prototype, "nmdaymask", { - get: function() { - return this.yearinfo.nmdaymask; - }, - enumerable: false, - configurable: true - }); - Iterinfo2.prototype.ydayset = function() { - return [range(this.yearlen), 0, this.yearlen]; - }; - Iterinfo2.prototype.mdayset = function(_, month) { - var start = this.mrange[month - 1]; - var end = this.mrange[month]; - var set = repeat(null, this.yearlen); - for (var i = start; i < end; i++) - set[i] = i; - return [set, start, end]; - }; - Iterinfo2.prototype.wdayset = function(year, month, day) { - var set = repeat(null, this.yearlen + 7); - var i = dateutil_default.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - this.yearordinal; - var start = i; - for (var j = 0; j < 7; j++) { - set[i] = i; - ++i; - if (this.wdaymask[i] === this.options.wkst) - break; - } - return [set, start, i]; - }; - Iterinfo2.prototype.ddayset = function(year, month, day) { - var set = repeat(null, this.yearlen); - var i = dateutil_default.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - this.yearordinal; - set[i] = i; - return [set, i, i + 1]; - }; - Iterinfo2.prototype.htimeset = function(hour, _, second, millisecond) { - var _this = this; - var set = []; - this.options.byminute.forEach(function(minute) { - set = set.concat(_this.mtimeset(hour, minute, second, millisecond)); - }); - dateutil_default.sort(set); - return set; - }; - Iterinfo2.prototype.mtimeset = function(hour, minute, _, millisecond) { - var set = this.options.bysecond.map(function(second) { - return new Time(hour, minute, second, millisecond); - }); - dateutil_default.sort(set); - return set; - }; - Iterinfo2.prototype.stimeset = function(hour, minute, second, millisecond) { - return [new Time(hour, minute, second, millisecond)]; - }; - Iterinfo2.prototype.getdayset = function(freq) { - switch (freq) { - case Frequency.YEARLY: - return this.ydayset.bind(this); - case Frequency.MONTHLY: - return this.mdayset.bind(this); - case Frequency.WEEKLY: - return this.wdayset.bind(this); - case Frequency.DAILY: - return this.ddayset.bind(this); - default: - return this.ddayset.bind(this); - } - }; - Iterinfo2.prototype.gettimeset = function(freq) { - switch (freq) { - case Frequency.HOURLY: - return this.htimeset.bind(this); - case Frequency.MINUTELY: - return this.mtimeset.bind(this); - case Frequency.SECONDLY: - return this.stimeset.bind(this); - } - }; - return Iterinfo2; -}(); -var iterinfo_default = Iterinfo; - -// node_modules/rrule/dist/esm/iter/poslist.js -function buildPoslist(bysetpos, timeset, start, end, ii, dayset) { - var poslist = []; - for (var j = 0; j < bysetpos.length; j++) { - var daypos = void 0; - var timepos = void 0; - var pos = bysetpos[j]; - if (pos < 0) { - daypos = Math.floor(pos / timeset.length); - timepos = pymod(pos, timeset.length); - } else { - daypos = Math.floor((pos - 1) / timeset.length); - timepos = pymod(pos - 1, timeset.length); - } - var tmp = []; - for (var k = start; k < end; k++) { - var val = dayset[k]; - if (!isPresent(val)) - continue; - tmp.push(val); - } - var i = void 0; - if (daypos < 0) { - i = tmp.slice(daypos)[0]; - } else { - i = tmp[daypos]; - } - var time = timeset[timepos]; - var date = dateutil_default.fromOrdinal(ii.yearordinal + i); - var res = dateutil_default.combine(date, time); - if (!includes(poslist, res)) - poslist.push(res); - } - dateutil_default.sort(poslist); - return poslist; -} - -// node_modules/rrule/dist/esm/iter/index.js -function iter(iterResult, options) { - var dtstart = options.dtstart, freq = options.freq, interval = options.interval, until = options.until, bysetpos = options.bysetpos; - var count = options.count; - if (count === 0 || interval === 0) { - return emitResult(iterResult); - } - var counterDate = DateTime.fromDate(dtstart); - var ii = new iterinfo_default(options); - ii.rebuild(counterDate.year, counterDate.month); - var timeset = makeTimeset(ii, counterDate, options); - for (; ; ) { - var _a = ii.getdayset(freq)(counterDate.year, counterDate.month, counterDate.day), dayset = _a[0], start = _a[1], end = _a[2]; - var filtered = removeFilteredDays(dayset, start, end, ii, options); - if (notEmpty(bysetpos)) { - var poslist = buildPoslist(bysetpos, timeset, start, end, ii, dayset); - for (var j = 0; j < poslist.length; j++) { - var res = poslist[j]; - if (until && res > until) { - return emitResult(iterResult); - } - if (res >= dtstart) { - var rezonedDate = rezoneIfNeeded(res, options); - if (!iterResult.accept(rezonedDate)) { - return emitResult(iterResult); - } - if (count) { - --count; - if (!count) { - return emitResult(iterResult); - } - } - } - } - } else { - for (var j = start; j < end; j++) { - var currentDay = dayset[j]; - if (!isPresent(currentDay)) { - continue; - } - var date = dateutil_default.fromOrdinal(ii.yearordinal + currentDay); - for (var k = 0; k < timeset.length; k++) { - var time = timeset[k]; - var res = dateutil_default.combine(date, time); - if (until && res > until) { - return emitResult(iterResult); - } - if (res >= dtstart) { - var rezonedDate = rezoneIfNeeded(res, options); - if (!iterResult.accept(rezonedDate)) { - return emitResult(iterResult); - } - if (count) { - --count; - if (!count) { - return emitResult(iterResult); - } - } - } - } - } - } - if (options.interval === 0) { - return emitResult(iterResult); - } - counterDate.add(options, filtered); - if (counterDate.year > dateutil_default.MAXYEAR) { - return emitResult(iterResult); - } - if (!freqIsDailyOrGreater(freq)) { - timeset = ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, 0); - } - ii.rebuild(counterDate.year, counterDate.month); - } -} -function isFiltered(ii, currentDay, options) { - var bymonth = options.bymonth, byweekno = options.byweekno, byweekday = options.byweekday, byeaster = options.byeaster, bymonthday = options.bymonthday, bynmonthday = options.bynmonthday, byyearday = options.byyearday; - return notEmpty(bymonth) && !includes(bymonth, ii.mmask[currentDay]) || notEmpty(byweekno) && !ii.wnomask[currentDay] || notEmpty(byweekday) && !includes(byweekday, ii.wdaymask[currentDay]) || notEmpty(ii.nwdaymask) && !ii.nwdaymask[currentDay] || byeaster !== null && !includes(ii.eastermask, currentDay) || (notEmpty(bymonthday) || notEmpty(bynmonthday)) && !includes(bymonthday, ii.mdaymask[currentDay]) && !includes(bynmonthday, ii.nmdaymask[currentDay]) || notEmpty(byyearday) && (currentDay < ii.yearlen && !includes(byyearday, currentDay + 1) && !includes(byyearday, -ii.yearlen + currentDay) || currentDay >= ii.yearlen && !includes(byyearday, currentDay + 1 - ii.yearlen) && !includes(byyearday, -ii.nextyearlen + currentDay - ii.yearlen)); -} -function rezoneIfNeeded(date, options) { - return new DateWithZone(date, options.tzid).rezonedDate(); -} -function emitResult(iterResult) { - return iterResult.getValue(); -} -function removeFilteredDays(dayset, start, end, ii, options) { - var filtered = false; - for (var dayCounter = start; dayCounter < end; dayCounter++) { - var currentDay = dayset[dayCounter]; - filtered = isFiltered(ii, currentDay, options); - if (filtered) - dayset[currentDay] = null; - } - return filtered; -} -function makeTimeset(ii, counterDate, options) { - var freq = options.freq, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; - if (freqIsDailyOrGreater(freq)) { - return buildTimeset(options); - } - if (freq >= RRule.HOURLY && notEmpty(byhour) && !includes(byhour, counterDate.hour) || freq >= RRule.MINUTELY && notEmpty(byminute) && !includes(byminute, counterDate.minute) || freq >= RRule.SECONDLY && notEmpty(bysecond) && !includes(bysecond, counterDate.second)) { - return []; - } - return ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, counterDate.millisecond); -} - -// node_modules/rrule/dist/esm/rrule.js -var Days = { - MO: new Weekday(0), - TU: new Weekday(1), - WE: new Weekday(2), - TH: new Weekday(3), - FR: new Weekday(4), - SA: new Weekday(5), - SU: new Weekday(6) -}; -var DEFAULT_OPTIONS = { - freq: Frequency.YEARLY, - dtstart: null, - interval: 1, - wkst: Days.MO, - count: null, - until: null, - tzid: null, - bysetpos: null, - bymonth: null, - bymonthday: null, - bynmonthday: null, - byyearday: null, - byweekno: null, - byweekday: null, - bynweekday: null, - byhour: null, - byminute: null, - bysecond: null, - byeaster: null -}; -var defaultKeys = Object.keys(DEFAULT_OPTIONS); -var RRule = function() { - function RRule2(options, noCache) { - if (options === void 0) { - options = {}; - } - if (noCache === void 0) { - noCache = false; - } - this._cache = noCache ? null : new Cache(); - this.origOptions = initializeOptions(options); - var parsedOptions = parseOptions(options).parsedOptions; - this.options = parsedOptions; - } - RRule2.parseText = function(text2, language) { - return parseText(text2, language); - }; - RRule2.fromText = function(text2, language) { - return fromText(text2, language); - }; - RRule2.fromString = function(str) { - return new RRule2(RRule2.parseString(str) || void 0); - }; - RRule2.prototype._iter = function(iterResult) { - return iter(iterResult, this.options); - }; - RRule2.prototype._cacheGet = function(what, args) { - if (!this._cache) - return false; - return this._cache._cacheGet(what, args); - }; - RRule2.prototype._cacheAdd = function(what, value, args) { - if (!this._cache) - return; - return this._cache._cacheAdd(what, value, args); - }; - RRule2.prototype.all = function(iterator) { - if (iterator) { - return this._iter(new callbackiterresult_default("all", {}, iterator)); - } - var result = this._cacheGet("all"); - if (result === false) { - result = this._iter(new iterresult_default("all", {})); - this._cacheAdd("all", result); - } - return result; - }; - RRule2.prototype.between = function(after, before, inc, iterator) { - if (inc === void 0) { - inc = false; - } - if (!dateutil_default.isValidDate(after) || !dateutil_default.isValidDate(before)) { - throw new Error("Invalid date passed in to RRule.between"); - } - var args = { - before, - after, - inc - }; - if (iterator) { - return this._iter(new callbackiterresult_default("between", args, iterator)); - } - var result = this._cacheGet("between", args); - if (result === false) { - result = this._iter(new iterresult_default("between", args)); - this._cacheAdd("between", result, args); - } - return result; - }; - RRule2.prototype.before = function(dt, inc) { - if (inc === void 0) { - inc = false; - } - if (!dateutil_default.isValidDate(dt)) { - throw new Error("Invalid date passed in to RRule.before"); - } - var args = { dt, inc }; - var result = this._cacheGet("before", args); - if (result === false) { - result = this._iter(new iterresult_default("before", args)); - this._cacheAdd("before", result, args); - } - return result; - }; - RRule2.prototype.after = function(dt, inc) { - if (inc === void 0) { - inc = false; - } - if (!dateutil_default.isValidDate(dt)) { - throw new Error("Invalid date passed in to RRule.after"); - } - var args = { dt, inc }; - var result = this._cacheGet("after", args); - if (result === false) { - result = this._iter(new iterresult_default("after", args)); - this._cacheAdd("after", result, args); - } - return result; - }; - RRule2.prototype.count = function() { - return this.all().length; - }; - RRule2.prototype.toString = function() { - return optionsToString(this.origOptions); - }; - RRule2.prototype.toText = function(gettext, language, dateFormatter) { - return toText(this, gettext, language, dateFormatter); - }; - RRule2.prototype.isFullyConvertibleToText = function() { - return isFullyConvertible(this); - }; - RRule2.prototype.clone = function() { - return new RRule2(this.origOptions); - }; - RRule2.FREQUENCIES = [ - "YEARLY", - "MONTHLY", - "WEEKLY", - "DAILY", - "HOURLY", - "MINUTELY", - "SECONDLY" - ]; - RRule2.YEARLY = Frequency.YEARLY; - RRule2.MONTHLY = Frequency.MONTHLY; - RRule2.WEEKLY = Frequency.WEEKLY; - RRule2.DAILY = Frequency.DAILY; - RRule2.HOURLY = Frequency.HOURLY; - RRule2.MINUTELY = Frequency.MINUTELY; - RRule2.SECONDLY = Frequency.SECONDLY; - RRule2.MO = Days.MO; - RRule2.TU = Days.TU; - RRule2.WE = Days.WE; - RRule2.TH = Days.TH; - RRule2.FR = Days.FR; - RRule2.SA = Days.SA; - RRule2.SU = Days.SU; - RRule2.parseString = parseString; - RRule2.optionsToString = optionsToString; - return RRule2; -}(); - -// node_modules/rrule/dist/esm/iterset.js -function iterSet(iterResult, _rrule, _exrule, _rdate, _exdate, tzid) { - var _exdateHash = {}; - var _accept = iterResult.accept; - function evalExdate(after, before) { - _exrule.forEach(function(rrule) { - rrule.between(after, before, true).forEach(function(date) { - _exdateHash[Number(date)] = true; - }); - }); - } - _exdate.forEach(function(date) { - var zonedDate2 = new DateWithZone(date, tzid).rezonedDate(); - _exdateHash[Number(zonedDate2)] = true; - }); - iterResult.accept = function(date) { - var dt = Number(date); - if (isNaN(dt)) - return _accept.call(this, date); - if (!_exdateHash[dt]) { - evalExdate(new Date(dt - 1), new Date(dt + 1)); - if (!_exdateHash[dt]) { - _exdateHash[dt] = true; - return _accept.call(this, date); - } - } - return true; - }; - if (iterResult.method === "between") { - evalExdate(iterResult.args.after, iterResult.args.before); - iterResult.accept = function(date) { - var dt = Number(date); - if (!_exdateHash[dt]) { - _exdateHash[dt] = true; - return _accept.call(this, date); - } - return true; - }; - } - for (var i = 0; i < _rdate.length; i++) { - var zonedDate = new DateWithZone(_rdate[i], tzid).rezonedDate(); - if (!iterResult.accept(new Date(zonedDate.getTime()))) - break; - } - _rrule.forEach(function(rrule) { - iter(iterResult, rrule.options); - }); - var res = iterResult._result; - dateutil_default.sort(res); - switch (iterResult.method) { - case "all": - case "between": - return res; - case "before": - return res.length && res[res.length - 1] || null; - case "after": - default: - return res.length && res[0] || null; - } -} - -// node_modules/rrule/dist/esm/rrulestr.js -var DEFAULT_OPTIONS2 = { - dtstart: null, - cache: false, - unfold: false, - forceset: false, - compatible: false, - tzid: null -}; -function parseInput(s, options) { - var rrulevals = []; - var rdatevals = []; - var exrulevals = []; - var exdatevals = []; - var parsedDtstart = parseDtstart(s); - var dtstart = parsedDtstart.dtstart; - var tzid = parsedDtstart.tzid; - var lines = splitIntoLines(s, options.unfold); - lines.forEach(function(line) { - var _a; - if (!line) - return; - var _b = breakDownLine(line), name = _b.name, parms = _b.parms, value = _b.value; - switch (name.toUpperCase()) { - case "RRULE": - if (parms.length) { - throw new Error("unsupported RRULE parm: ".concat(parms.join(","))); - } - rrulevals.push(parseString(line)); - break; - case "RDATE": - var _c = (_a = /RDATE(?:;TZID=([^:=]+))?/i.exec(line)) !== null && _a !== void 0 ? _a : [], rdateTzid = _c[1]; - if (rdateTzid && !tzid) { - tzid = rdateTzid; - } - rdatevals = rdatevals.concat(parseRDate(value, parms)); - break; - case "EXRULE": - if (parms.length) { - throw new Error("unsupported EXRULE parm: ".concat(parms.join(","))); - } - exrulevals.push(parseString(value)); - break; - case "EXDATE": - exdatevals = exdatevals.concat(parseRDate(value, parms)); - break; - case "DTSTART": - break; - default: - throw new Error("unsupported property: " + name); - } - }); - return { - dtstart, - tzid, - rrulevals, - rdatevals, - exrulevals, - exdatevals - }; -} -function buildRule(s, options) { - var _a = parseInput(s, options), rrulevals = _a.rrulevals, rdatevals = _a.rdatevals, exrulevals = _a.exrulevals, exdatevals = _a.exdatevals, dtstart = _a.dtstart, tzid = _a.tzid; - var noCache = options.cache === false; - if (options.compatible) { - options.forceset = true; - options.unfold = true; - } - if (options.forceset || rrulevals.length > 1 || rdatevals.length || exrulevals.length || exdatevals.length) { - var rset_1 = new RRuleSet(noCache); - rset_1.dtstart(dtstart); - rset_1.tzid(tzid || void 0); - rrulevals.forEach(function(val2) { - rset_1.rrule(new RRule(groomRruleOptions(val2, dtstart, tzid), noCache)); - }); - rdatevals.forEach(function(date) { - rset_1.rdate(date); - }); - exrulevals.forEach(function(val2) { - rset_1.exrule(new RRule(groomRruleOptions(val2, dtstart, tzid), noCache)); - }); - exdatevals.forEach(function(date) { - rset_1.exdate(date); - }); - if (options.compatible && options.dtstart) - rset_1.rdate(dtstart); - return rset_1; - } - var val = rrulevals[0] || {}; - return new RRule(groomRruleOptions(val, val.dtstart || options.dtstart || dtstart, val.tzid || options.tzid || tzid), noCache); -} -function rrulestr(s, options) { - if (options === void 0) { - options = {}; - } - return buildRule(s, initializeOptions2(options)); -} -function groomRruleOptions(val, dtstart, tzid) { - return __assign(__assign({}, val), { dtstart, tzid }); -} -function initializeOptions2(options) { - var invalid = []; - var keys = Object.keys(options); - var defaultKeys2 = Object.keys(DEFAULT_OPTIONS2); - keys.forEach(function(key) { - if (!includes(defaultKeys2, key)) - invalid.push(key); - }); - if (invalid.length) { - throw new Error("Invalid options: " + invalid.join(", ")); - } - return __assign(__assign({}, DEFAULT_OPTIONS2), options); -} -function extractName(line) { - if (line.indexOf(":") === -1) { - return { - name: "RRULE", - value: line - }; - } - var _a = split(line, ":", 1), name = _a[0], value = _a[1]; - return { - name, - value - }; -} -function breakDownLine(line) { - var _a = extractName(line), name = _a.name, value = _a.value; - var parms = name.split(";"); - if (!parms) - throw new Error("empty property name"); - return { - name: parms[0].toUpperCase(), - parms: parms.slice(1), - value - }; -} -function splitIntoLines(s, unfold) { - if (unfold === void 0) { - unfold = false; - } - s = s && s.trim(); - if (!s) - throw new Error("Invalid empty string"); - if (!unfold) { - return s.split(/\s/); - } - var lines = s.split("\n"); - var i = 0; - while (i < lines.length) { - var line = lines[i] = lines[i].replace(/\s+$/g, ""); - if (!line) { - lines.splice(i, 1); - } else if (i > 0 && line[0] === " ") { - lines[i - 1] += line.slice(1); - lines.splice(i, 1); - } else { - i += 1; - } - } - return lines; -} -function validateDateParm(parms) { - parms.forEach(function(parm) { - if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) { - throw new Error("unsupported RDATE/EXDATE parm: " + parm); - } - }); -} -function parseRDate(rdateval, parms) { - validateDateParm(parms); - return rdateval.split(",").map(function(datestr) { - return dateutil_default.untilStringToDate(datestr); - }); -} - -// node_modules/rrule/dist/esm/rruleset.js -function createGetterSetter(fieldName) { - var _this = this; - return function(field) { - if (field !== void 0) { - _this["_".concat(fieldName)] = field; - } - if (_this["_".concat(fieldName)] !== void 0) { - return _this["_".concat(fieldName)]; - } - for (var i = 0; i < _this._rrule.length; i++) { - var field_1 = _this._rrule[i].origOptions[fieldName]; - if (field_1) { - return field_1; - } - } - }; -} -var RRuleSet = function(_super) { - __extends(RRuleSet2, _super); - function RRuleSet2(noCache) { - if (noCache === void 0) { - noCache = false; - } - var _this = _super.call(this, {}, noCache) || this; - _this.dtstart = createGetterSetter.apply(_this, ["dtstart"]); - _this.tzid = createGetterSetter.apply(_this, ["tzid"]); - _this._rrule = []; - _this._rdate = []; - _this._exrule = []; - _this._exdate = []; - return _this; - } - RRuleSet2.prototype._iter = function(iterResult) { - return iterSet(iterResult, this._rrule, this._exrule, this._rdate, this._exdate, this.tzid()); - }; - RRuleSet2.prototype.rrule = function(rrule) { - _addRule(rrule, this._rrule); - }; - RRuleSet2.prototype.exrule = function(rrule) { - _addRule(rrule, this._exrule); - }; - RRuleSet2.prototype.rdate = function(date) { - _addDate(date, this._rdate); - }; - RRuleSet2.prototype.exdate = function(date) { - _addDate(date, this._exdate); - }; - RRuleSet2.prototype.rrules = function() { - return this._rrule.map(function(e) { - return rrulestr(e.toString()); - }); - }; - RRuleSet2.prototype.exrules = function() { - return this._exrule.map(function(e) { - return rrulestr(e.toString()); - }); - }; - RRuleSet2.prototype.rdates = function() { - return this._rdate.map(function(e) { - return new Date(e.getTime()); - }); - }; - RRuleSet2.prototype.exdates = function() { - return this._exdate.map(function(e) { - return new Date(e.getTime()); - }); - }; - RRuleSet2.prototype.valueOf = function() { - var result = []; - if (!this._rrule.length && this._dtstart) { - result = result.concat(optionsToString({ dtstart: this._dtstart })); - } - this._rrule.forEach(function(rrule) { - result = result.concat(rrule.toString().split("\n")); - }); - this._exrule.forEach(function(exrule) { - result = result.concat(exrule.toString().split("\n").map(function(line) { - return line.replace(/^RRULE:/, "EXRULE:"); - }).filter(function(line) { - return !/^DTSTART/.test(line); - })); - }); - if (this._rdate.length) { - result.push(rdatesToString("RDATE", this._rdate, this.tzid())); - } - if (this._exdate.length) { - result.push(rdatesToString("EXDATE", this._exdate, this.tzid())); - } - return result; - }; - RRuleSet2.prototype.toString = function() { - return this.valueOf().join("\n"); - }; - RRuleSet2.prototype.clone = function() { - var rrs = new RRuleSet2(!!this._cache); - this._rrule.forEach(function(rule) { - return rrs.rrule(rule.clone()); - }); - this._exrule.forEach(function(rule) { - return rrs.exrule(rule.clone()); - }); - this._rdate.forEach(function(date) { - return rrs.rdate(new Date(date.getTime())); - }); - this._exdate.forEach(function(date) { - return rrs.exdate(new Date(date.getTime())); - }); - return rrs; - }; - return RRuleSet2; -}(RRule); -function _addRule(rrule, collection) { - if (!(rrule instanceof RRule)) { - throw new TypeError(String(rrule) + " is not RRule instance"); - } - if (!includes(collection.map(String), String(rrule))) { - collection.push(rrule); - } -} -function _addDate(date, collection) { - if (!(date instanceof Date)) { - throw new TypeError(String(date) + " is not Date instance"); - } - if (!includes(collection.map(Number), Number(date))) { - collection.push(date); - dateutil_default.sort(collection); - } -} -function rdatesToString(param, rdates, tzid) { - var isUTC = !tzid || tzid.toUpperCase() === "UTC"; - var header = isUTC ? "".concat(param, ":") : "".concat(param, ";TZID=").concat(tzid, ":"); - var dateString = rdates.map(function(rdate) { - return dateutil_default.timeToUntilString(rdate.valueOf(), isUTC); - }).join(","); - return "".concat(header).concat(dateString); -} - -// src/lib/DateTools.ts -function compareByDate(a, b) { - if (a !== null && b === null) { - return -1; - } else if (a === null && b !== null) { - return 1; - } else if (a !== null && b !== null) { - if (a.isValid() && !b.isValid()) { - return -1; - } else if (!a.isValid() && b.isValid()) { - return 1; - } - if (a.isAfter(b)) { - return 1; - } else if (a.isBefore(b)) { - return -1; - } else { - return 0; - } - } else { - return 0; - } -} - -// src/Recurrence.ts -var Recurrence = class { - constructor({ - rrule, - baseOnToday, - referenceDate, - startDate, - scheduledDate, - dueDate - }) { - this.rrule = rrule; - this.baseOnToday = baseOnToday; - this.referenceDate = referenceDate; - this.startDate = startDate; - this.scheduledDate = scheduledDate; - this.dueDate = dueDate; - } - static fromText({ - recurrenceRuleText, - startDate, - scheduledDate, - dueDate - }) { - try { - const match = recurrenceRuleText.match(/^([a-zA-Z0-9, !]+?)( when done)?$/i); - if (match == null) { - return null; - } - const isolatedRuleText = match[1].trim(); - const baseOnToday = match[2] !== void 0; - const options = RRule.parseText(isolatedRuleText); - if (options !== null) { - let referenceDate = null; - if (dueDate) { - referenceDate = window.moment(dueDate); - } else if (scheduledDate) { - referenceDate = window.moment(scheduledDate); - } else if (startDate) { - referenceDate = window.moment(startDate); - } - if (!baseOnToday && referenceDate !== null) { - options.dtstart = window.moment(referenceDate).startOf("day").utc(true).toDate(); - } else { - options.dtstart = window.moment().startOf("day").utc(true).toDate(); - } - const rrule = new RRule(options); - return new Recurrence({ - rrule, - baseOnToday, - referenceDate, - startDate, - scheduledDate, - dueDate - }); - } - } catch (error) { - } - return null; - } - toText() { - let text2 = this.rrule.toText(); - if (this.baseOnToday) { - text2 += " when done"; - } - return text2; - } - next() { - var _a; - let next; - if (this.baseOnToday) { - const today = window.moment(); - const ruleBasedOnToday = new RRule(__spreadProps(__spreadValues({}, this.rrule.origOptions), { - dtstart: today.startOf("day").utc(true).toDate() - })); - next = this.nextAfter(today.endOf("day"), ruleBasedOnToday); - } else { - const after = window.moment((_a = this.referenceDate) != null ? _a : void 0).endOf("day"); - next = this.nextAfter(after, this.rrule); - } - if (next !== null) { - let startDate = null; - let scheduledDate = null; - let dueDate = null; - if (this.referenceDate) { - if (this.startDate) { - const originalDifference = window.moment.duration(this.startDate.diff(this.referenceDate)); - startDate = window.moment(next); - startDate.add(Math.round(originalDifference.asDays()), "days"); - } - if (this.scheduledDate) { - const originalDifference = window.moment.duration(this.scheduledDate.diff(this.referenceDate)); - scheduledDate = window.moment(next); - scheduledDate.add(Math.round(originalDifference.asDays()), "days"); - } - if (this.dueDate) { - const originalDifference = window.moment.duration(this.dueDate.diff(this.referenceDate)); - dueDate = window.moment(next); - dueDate.add(Math.round(originalDifference.asDays()), "days"); - } - } - return { - startDate, - scheduledDate, - dueDate - }; - } - return null; - } - identicalTo(other) { - if (this.baseOnToday !== other.baseOnToday) { - return false; - } - if (compareByDate(this.startDate, other.startDate) !== 0) { - return false; - } - if (compareByDate(this.scheduledDate, other.scheduledDate) !== 0) { - return false; - } - if (compareByDate(this.dueDate, other.dueDate) !== 0) { - return false; - } - return this.toText() === other.toText(); - } - nextAfter(after, rrule) { - after.utc(true); - let next = window.moment(rrule.after(after.toDate())); - const asText = this.toText(); - const monthMatch = asText.match(/every( \d+)? month(s)?(.*)?/); - if (monthMatch !== null) { - if (!asText.includes(" on ")) { - next = Recurrence.nextAfterMonths(after, next, rrule, monthMatch[1]); - } - } - const yearMatch = asText.match(/every( \d+)? year(s)?(.*)?/); - if (yearMatch !== null) { - next = Recurrence.nextAfterYears(after, next, rrule, yearMatch[1]); - } - return Recurrence.addTimezone(next).toDate(); - } - static nextAfterMonths(after, next, rrule, skippingMonths) { - let parsedSkippingMonths = 1; - if (skippingMonths !== void 0) { - parsedSkippingMonths = Number.parseInt(skippingMonths.trim(), 10); - } - while (Recurrence.isSkippingTooManyMonths(after, next, parsedSkippingMonths)) { - next = Recurrence.fromOneDayEarlier(after, rrule); - } - return next; - } - static isSkippingTooManyMonths(after, next, skippingMonths) { - let diffMonths = next.month() - after.month(); - const diffYears = next.year() - after.year(); - diffMonths += diffYears * 12; - return diffMonths > skippingMonths; - } - static nextAfterYears(after, next, rrule, skippingYears) { - let parsedSkippingYears = 1; - if (skippingYears !== void 0) { - parsedSkippingYears = Number.parseInt(skippingYears.trim(), 10); - } - while (Recurrence.isSkippingTooManyYears(after, next, parsedSkippingYears)) { - next = Recurrence.fromOneDayEarlier(after, rrule); - } - return next; - } - static isSkippingTooManyYears(after, next, skippingYears) { - const diff = next.year() - after.year(); - return diff > skippingYears; - } - static fromOneDayEarlier(after, rrule) { - after.subtract(1, "days").endOf("day"); - const options = rrule.origOptions; - options.dtstart = after.startOf("day").toDate(); - rrule = new RRule(options); - return window.moment(rrule.after(after.toDate())); - } - static addTimezone(date) { - const localTimeZone = window.moment.utc(date).local(true); - return localTimeZone.startOf("day"); - } -}; - -// src/StatusConfiguration.ts -var StatusType = /* @__PURE__ */ ((StatusType2) => { - StatusType2["TODO"] = "TODO"; - StatusType2["DONE"] = "DONE"; - StatusType2["IN_PROGRESS"] = "IN_PROGRESS"; - StatusType2["CANCELLED"] = "CANCELLED"; - StatusType2["NON_TASK"] = "NON_TASK"; - StatusType2["EMPTY"] = "EMPTY"; - return StatusType2; -})(StatusType || {}); -var StatusConfiguration = class { - constructor(symbol, name, nextStatusSymbol, availableAsCommand, type = "TODO" /* TODO */) { - this.symbol = symbol; - this.name = name; - this.nextStatusSymbol = nextStatusSymbol; - this.availableAsCommand = availableAsCommand; - this.type = type; - } -}; - -// src/Status.ts -var _Status = class { - get symbol() { - return this.configuration.symbol; - } - get name() { - return this.configuration.name; - } - get nextStatusSymbol() { - return this.configuration.nextStatusSymbol; - } - get availableAsCommand() { - return this.configuration.availableAsCommand; - } - get type() { - return this.configuration.type; - } - constructor(configuration) { - this.configuration = configuration; - } - static makeDone() { - return new _Status(new StatusConfiguration("x", "Done", " ", true, "DONE" /* DONE */)); - } - static makeEmpty() { - return new _Status(new StatusConfiguration("", "EMPTY", "", true, "EMPTY" /* EMPTY */)); - } - static makeTodo() { - return new _Status(new StatusConfiguration(" ", "Todo", "x", true, "TODO" /* TODO */)); - } - static makeCancelled() { - return new _Status(new StatusConfiguration("-", "Cancelled", " ", true, "CANCELLED" /* CANCELLED */)); - } - static makeInProgress() { - return new _Status(new StatusConfiguration("/", "In Progress", "x", true, "IN_PROGRESS" /* IN_PROGRESS */)); - } - static getTypeForUnknownSymbol(symbol) { - switch (symbol) { - case "x": - case "X": - return "DONE" /* DONE */; - case "/": - return "IN_PROGRESS" /* IN_PROGRESS */; - case "-": - return "CANCELLED" /* CANCELLED */; - case "": - return "EMPTY" /* EMPTY */; - case " ": - default: - return "TODO" /* TODO */; - } - } - static getTypeFromStatusTypeString(statusTypeAsString) { - return StatusType[statusTypeAsString] || "TODO" /* TODO */; - } - static createUnknownStatus(unknownSymbol) { - return new _Status(new StatusConfiguration(unknownSymbol, "Unknown", "x", false, "TODO" /* TODO */)); - } - static createFromImportedValue(imported) { - const symbol = imported[0]; - const type = _Status.getTypeFromStatusTypeString(imported[3]); - return new _Status(new StatusConfiguration(symbol, imported[1], imported[2], false, type)); - } - isCompleted() { - return this.type === "DONE" /* DONE */; - } - previewText() { - let commandNotice = ""; - if (_Status.tasksPluginCanCreateCommandsForStatuses() && this.availableAsCommand) { - commandNotice = " Available as a command."; - } - return `- [${this.symbol}] => [${this.nextStatusSymbol}], name: '${this.name}', type: '${this.configuration.type}'.${commandNotice}`; - } - static tasksPluginCanCreateCommandsForStatuses() { - return false; - } -}; -var Status = _Status; -Status.DONE = _Status.makeDone(); -Status.EMPTY = _Status.makeEmpty(); -Status.TODO = _Status.makeTodo(); - -// src/Config/StatusSettings.ts -var StatusSettings = class { - constructor() { - this.coreStatuses = [ - Status.makeTodo().configuration, - Status.makeDone().configuration - ]; - this.customStatuses = [ - Status.makeInProgress().configuration, - Status.makeCancelled().configuration - ]; - } - static addStatus(statuses, newStatus) { - statuses.push(newStatus); - } - static replaceStatus(statuses, originalStatus, newStatus) { - const index = this.findStatusIndex(originalStatus, statuses); - if (index <= -1) { - return false; - } - statuses.splice(index, 1, newStatus); - return true; - } - static findStatusIndex(statusConfiguration, statuses) { - const originalStatusAsStatus = new Status(statusConfiguration); - return statuses.findIndex((s) => { - return new Status(s).previewText() == originalStatusAsStatus.previewText(); - }); - } - static deleteStatus(statuses, status) { - const index = this.findStatusIndex(status, statuses); - if (index <= -1) { - return false; - } - statuses.splice(index, 1); - return true; - } - static deleteAllCustomStatuses(statusSettings) { - statusSettings.customStatuses.splice(0); - } - static resetAllCustomStatuses(statusSettings) { - StatusSettings.deleteAllCustomStatuses(statusSettings); - const defaultSettings2 = new StatusSettings(); - defaultSettings2.customStatuses.forEach((s) => { - StatusSettings.addStatus(statusSettings.customStatuses, s); - }); - } - static bulkAddStatusCollection(statusSettings, supportedStatuses) { - const notices = []; - supportedStatuses.forEach((importedStatus) => { - const hasStatus = statusSettings.customStatuses.find((element2) => { - return element2.symbol == importedStatus[0] && element2.name == importedStatus[1] && element2.nextStatusSymbol == importedStatus[2]; - }); - if (!hasStatus) { - StatusSettings.addStatus(statusSettings.customStatuses, Status.createFromImportedValue(importedStatus)); - } else { - notices.push(`The status ${importedStatus[1]} (${importedStatus[0]}) is already added.`); - } - }); - return notices; - } - static applyToStatusRegistry(statusSettings, statusRegistry) { - statusRegistry.clearStatuses(); - statusSettings.coreStatuses.forEach((statusType) => { - statusRegistry.add(statusType); - }); - statusSettings.customStatuses.forEach((statusType) => { - statusRegistry.add(statusType); - }); - } -}; - -// src/Config/featureConfiguration.json -var featureConfiguration_default = [ - { - index: 9999, - internalName: "INTERNAL_TESTING_ENABLED_BY_DEFAULT", - displayName: "Test Item. Used to validate the Feature Framework.", - description: "Description", - enabledByDefault: true, - stable: false - } -]; - -// src/Config/Feature.ts -var Feature = class { - constructor(internalName, index, description, displayName, enabledByDefault, stable) { - this.internalName = internalName; - this.index = index; - this.description = description; - this.displayName = displayName; - this.enabledByDefault = enabledByDefault; - this.stable = stable; - } - static get values() { - let availableFeatures = []; - featureConfiguration_default.forEach((feature) => { - availableFeatures = [ - ...availableFeatures, - new Feature( - feature.internalName, - feature.index, - feature.description, - feature.displayName, - feature.enabledByDefault, - feature.stable - ) - ]; - }); - return availableFeatures; - } - static get settingsFlags() { - const featureFlags = {}; - Feature.values.forEach((feature) => { - featureFlags[feature.internalName] = feature.enabledByDefault; - }); - return featureFlags; - } - static fromString(name) { - for (const feature of Feature.values) { - if (name === feature.internalName) { - return feature; - } - } - throw new RangeError( - `Illegal argument passed to fromString(): ${name} does not correspond to any available Feature ${this.prototype.constructor.name}` - ); - } -}; - -// src/Config/Settings.ts -var defaultSettings = { - globalFilter: "", - removeGlobalFilter: false, - setDoneDate: true, - autoSuggestInEditor: true, - autoSuggestMinMatch: 0, - autoSuggestMaxItems: 6, - provideAccessKeys: true, - useFilenameAsScheduledDate: false, - filenameAsDateFolders: [], - statusSettings: new StatusSettings(), - features: Feature.settingsFlags, - generalSettings: {}, - headingOpened: {} -}; -var settings = __spreadValues({}, defaultSettings); -var getSettings = () => { - for (const flag in Feature.settingsFlags) { - if (settings.features[flag] === void 0) { - settings.features[flag] = Feature.settingsFlags[flag]; - } - } - settings.statusSettings.customStatuses.forEach((s, index, array) => { - var _a, _b; - const newType = Status.getTypeFromStatusTypeString(s.type); - array[index] = new StatusConfiguration( - (_a = s.symbol) != null ? _a : " ", - s.name, - (_b = s.nextStatusSymbol) != null ? _b : "x", - s.availableAsCommand, - newType - ); - }); - return __spreadValues({}, settings); -}; -var updateSettings = (newSettings) => { - settings = __spreadValues(__spreadValues({}, settings), newSettings); - return getSettings(); -}; -var updateGeneralSetting = (name, value) => { - settings.generalSettings[name] = value; - return getSettings(); -}; -var isFeatureEnabled = (internalName) => { - var _a; - return (_a = settings.features[internalName]) != null ? _a : false; -}; - -// src/StatusRegistry.ts -var StatusRegistry = class { - constructor() { - this._registeredStatuses = []; - this.addDefaultStatusTypes(); - } - get registeredStatuses() { - return this._registeredStatuses.filter(({ symbol }) => symbol !== Status.EMPTY.symbol); - } - static getInstance() { - if (!StatusRegistry.instance) { - StatusRegistry.instance = new StatusRegistry(); - } - return StatusRegistry.instance; - } - add(status) { - if (!this.hasSymbol(status.symbol)) { - if (status instanceof Status) { - this._registeredStatuses.push(status); - } else { - this._registeredStatuses.push(new Status(status)); - } - } - } - bySymbol(symbol) { - if (this.hasSymbol(symbol)) { - return this.getSymbol(symbol); - } - return Status.EMPTY; - } - bySymbolOrCreate(symbol) { - if (this.hasSymbol(symbol)) { - return this.getSymbol(symbol); - } - return Status.createUnknownStatus(symbol); - } - byName(nameToFind) { - if (this._registeredStatuses.filter(({ name }) => name === nameToFind).length > 0) { - return this._registeredStatuses.filter(({ name }) => name === nameToFind)[0]; - } - return Status.EMPTY; - } - resetToDefaultStatuses() { - this.clearStatuses(); - this.addDefaultStatusTypes(); - } - clearStatuses() { - this._registeredStatuses = []; - } - getNextStatus(status) { - if (status.nextStatusSymbol !== "") { - const nextStatus = this.bySymbol(status.nextStatusSymbol); - if (nextStatus !== null) { - return nextStatus; - } - } - return Status.EMPTY; - } - getNextStatusOrCreate(status) { - const nextStatus = this.getNextStatus(status); - if (nextStatus.type !== "EMPTY" /* EMPTY */) { - return nextStatus; - } - return Status.createUnknownStatus(status.nextStatusSymbol); - } - findUnknownStatuses(allStatuses) { - const unknownStatuses = allStatuses.filter((s) => { - return !this.hasSymbol(s.symbol); - }); - const newStatusRegistry = new StatusRegistry(); - const namedUniqueStatuses = []; - unknownStatuses.forEach((s) => { - if (newStatusRegistry.hasSymbol(s.symbol)) { - return; - } - const newStatus = StatusRegistry.copyStatusWithNewName(s, `Unknown (${s.symbol})`); - namedUniqueStatuses.push(newStatus); - newStatusRegistry.add(newStatus); - }); - return namedUniqueStatuses; - } - static copyStatusWithNewName(s, newName) { - const statusConfiguration = new StatusConfiguration( - s.symbol, - newName, - s.nextStatusSymbol, - s.availableAsCommand, - s.type - ); - return new Status(statusConfiguration); - } - getSymbol(symbolToFind) { - return this._registeredStatuses.filter(({ symbol }) => symbol === symbolToFind)[0]; - } - hasSymbol(symbolToFind) { - return this._registeredStatuses.find((element2) => { - return element2.symbol === symbolToFind; - }) !== void 0; - } - addDefaultStatusTypes() { - const defaultStatuses = [Status.makeTodo(), Status.makeInProgress(), Status.makeDone(), Status.makeCancelled()]; - defaultStatuses.forEach((status) => { - this.add(status); - }); - } -}; - -// src/Urgency.ts -var _Urgency = class { - static calculate(task) { - let urgency = 0; - if (task.dueDate !== null) { - const daysOverdue = Math.round(window.moment().diff(task.dueDate) / _Urgency.milliSecondsPerDay); - let dueMultiplier; - if (daysOverdue >= 7) { - dueMultiplier = 1; - } else if (daysOverdue >= -14) { - dueMultiplier = (daysOverdue + 14) * 0.8 / 21 + 0.2; - } else { - dueMultiplier = 0.2; - } - urgency += dueMultiplier * _Urgency.dueCoefficient; - } - if (task.scheduledDate !== null) { - if (window.moment().isSameOrAfter(task.scheduledDate)) { - urgency += 1 * _Urgency.scheduledCoefficient; - } - } - if (task.startDate !== null) { - if (window.moment().isBefore(task.startDate)) { - urgency += 1 * _Urgency.startedCoefficient; - } - } - switch (task.priority) { - case "1": - urgency += 1 * _Urgency.priorityCoefficient; - break; - case "2": - urgency += 0.65 * _Urgency.priorityCoefficient; - break; - case "3": - urgency += 0.325 * _Urgency.priorityCoefficient; - break; - } - return urgency; - } -}; -var Urgency = _Urgency; -Urgency.dueCoefficient = 12; -Urgency.scheduledCoefficient = 5; -Urgency.startedCoefficient = -3; -Urgency.priorityCoefficient = 6; -Urgency.milliSecondsPerDay = 1e3 * 60 * 60 * 24; - -// src/TaskLineRenderer.ts -var import_obsidian2 = require("obsidian"); - -// src/File.ts -var import_obsidian = require("obsidian"); -var metadataCache; -var vault; -var initializeFile = ({ - metadataCache: newMetadataCache, - vault: newVault -}) => { - metadataCache = newMetadataCache; - vault = newVault; -}; -var replaceTaskWithTasks = (_0) => __async(void 0, [_0], function* ({ - originalTask, - newTasks -}) { - if (vault === void 0 || metadataCache === void 0) { - console.error("Tasks: cannot use File before initializing it."); - return; - } - if (!Array.isArray(newTasks)) { - newTasks = [newTasks]; - } - tryRepetitive({ - originalTask, - newTasks, - vault, - metadataCache, - previousTries: 0 - }); -}); -var tryRepetitive = (_0) => __async(void 0, [_0], function* ({ - originalTask, - newTasks, - vault: vault2, - metadataCache: metadataCache2, - previousTries -}) { - const retry = () => { - if (previousTries > 10) { - console.error("Tasks: Too many retries. File update not possible ..."); - return; - } - const timeout = Math.min(Math.pow(10, previousTries), 100); - setTimeout(() => { - tryRepetitive({ - originalTask, - newTasks, - vault: vault2, - metadataCache: metadataCache2, - previousTries: previousTries + 1 - }); - }, timeout); - }; - const file = vault2.getAbstractFileByPath(originalTask.path); - if (!(file instanceof import_obsidian.TFile)) { - console.warn(`Tasks: No file found for task ${originalTask.description}. Retrying ...`); - return retry(); - } - if (file.extension !== "md") { - console.error("Tasks: Only supporting files with the .md file extension."); - return; - } - const fileCache = metadataCache2.getFileCache(file); - if (fileCache == void 0 || fileCache === null) { - console.warn(`Tasks: No file cache found for file ${file.path}. Retrying ...`); - return retry(); - } - const listItemsCache = fileCache.listItems; - if (listItemsCache === void 0 || listItemsCache.length === 0) { - console.warn(`Tasks: No list items found in file cache of ${file.path}. Retrying ...`); - return retry(); - } - const fileContent = yield vault2.read(file); - const fileLines = fileContent.split("\n"); - const { globalFilter } = getSettings(); - let listItem; - let sectionIndex = 0; - for (const listItemCache of listItemsCache) { - if (listItemCache.position.start.line < originalTask.sectionStart) { - continue; - } - if (listItemCache.task === void 0) { - continue; - } - const line = fileLines[listItemCache.position.start.line]; - if (line.includes(globalFilter)) { - if (sectionIndex === originalTask.sectionIndex) { - listItem = listItemCache; - break; - } - sectionIndex++; - } - } - if (listItem === void 0) { - console.error("Tasks: could not find task to toggle in the file."); - return; - } - const updatedFileLines = [ - ...fileLines.slice(0, listItem.position.start.line), - ...newTasks.map((task) => task.toFileLineString()), - ...fileLines.slice(listItem.position.start.line + 1) - ]; - yield vault2.modify(file, updatedFileLines.join("\n")); -}); - -// src/TaskLineRenderer.ts -var LayoutClasses = { - description: "task-description", - priority: "task-priority", - dueDate: "task-due", - startDate: "task-start", - scheduledDate: "task-scheduled", - doneDate: "task-done", - recurrenceRule: "task-recurring", - blockLink: "" -}; -var MAX_DAY_VALUE_RANGE = 7; -var DAY_VALUE_OVER_RANGE_POSTFIX = "far"; -function obsidianMarkdownRenderer(text2, element2, path) { - return __async(this, null, function* () { - yield import_obsidian2.MarkdownRenderer.renderMarkdown(text2, element2, path, null); - }); -} -function renderTaskLine(task, renderDetails, textRenderer = null) { - return __async(this, null, function* () { - var _a; - if (!textRenderer) - textRenderer = obsidianMarkdownRenderer; - const li = document.createElement("li"); - renderDetails.parentUlElement.appendChild(li); - li.classList.add("task-list-item", "plugin-tasks-list-item"); - const textSpan = document.createElement("span"); - li.appendChild(textSpan); - textSpan.classList.add("tasks-list-text"); - const attributes = yield taskToHtml(task, renderDetails, textSpan, textRenderer); - for (const key in attributes) - li.dataset[key] = attributes[key]; - const checkbox = document.createElement("input"); - li.appendChild(checkbox); - checkbox.classList.add("task-list-item-checkbox"); - checkbox.type = "checkbox"; - if (task.status.symbol !== " ") { - checkbox.checked = true; - li.classList.add("is-checked"); - } - checkbox.addEventListener("click", (event) => { - event.preventDefault(); - event.stopPropagation(); - checkbox.disabled = true; - const toggledTasks = task.toggle(); - replaceTaskWithTasks({ - originalTask: task, - newTasks: toggledTasks - }); - }); - li.prepend(checkbox); - li.setAttribute("data-task", task.status.symbol.trim()); - li.setAttribute("data-line", renderDetails.listIndex.toString()); - checkbox.setAttribute("data-line", renderDetails.listIndex.toString()); - if ((_a = renderDetails.layoutOptions) == null ? void 0 : _a.shortMode) { - addTooltip({ task, element: textSpan, isFilenameUnique: renderDetails.isFilenameUnique }); - } - return li; - }); -} -function taskToHtml(task, renderDetails, parentElement, textRenderer) { - return __async(this, null, function* () { - var _a; - let allAttributes = {}; - const taskLayout = (_a = renderDetails.taskLayout) != null ? _a : new TaskLayout(renderDetails.layoutOptions); - for (const component of taskLayout.layoutComponents) { - let componentString = task.componentToString(taskLayout, component); - if (componentString) { - if (component === "description") - componentString = removeGlobalFilterIfNeeded(componentString); - const span = document.createElement("span"); - parentElement.appendChild(span); - if (span) { - const internalSpan = document.createElement("span"); - span.appendChild(internalSpan); - yield renderComponentText(internalSpan, componentString, component, task, textRenderer); - const [genericClasses, dataAttributes] = getComponentClassesAndData(component, task); - addInternalClasses(component, internalSpan); - span.classList.add(...genericClasses); - for (const key in dataAttributes) - span.dataset[key] = dataAttributes[key]; - allAttributes = __spreadValues(__spreadValues({}, allAttributes), dataAttributes); - } - } - } - for (const component of taskLayout.hiddenComponents) { - const [_, dataAttributes] = getComponentClassesAndData(component, task); - allAttributes = __spreadValues(__spreadValues({}, allAttributes), dataAttributes); - } - return allAttributes; - }); -} -function renderComponentText(span, componentString, component, task, textRenderer) { - return __async(this, null, function* () { - if (component === "description") { - yield textRenderer(componentString, span, task.path); - const blockQuote = span.querySelector("blockquote"); - const directParentOfPTag = blockQuote != null ? blockQuote : span; - const pElement = directParentOfPTag.querySelector("p"); - if (pElement !== null) { - while (pElement.firstChild) { - directParentOfPTag.insertBefore(pElement.firstChild, pElement); - } - pElement.remove(); - } - span.querySelectorAll("p").forEach((pElement2) => { - if (!pElement2.hasChildNodes()) { - pElement2.remove(); - } - }); - span.querySelectorAll(".footnotes").forEach((footnoteElement) => { - footnoteElement.remove(); - }); - } else { - span.innerHTML = componentString; - } - }); -} -function getComponentClassesAndData(component, task) { - const genericClasses = []; - const dataAttributes = {}; - const setDateAttribute = (date, attributeName) => { - const dateValue = dateToAttribute(date); - if (dateValue) - dataAttributes[attributeName] = dateValue; - }; - switch (component) { - case "description": - genericClasses.push(LayoutClasses.description); - break; - case "priority": { - let priorityValue = null; - if (task.priority === "1" /* High */) - priorityValue = "high"; - else if (task.priority === "2" /* Medium */) - priorityValue = "medium"; - else if (task.priority === "4" /* Low */) - priorityValue = "low"; - else - priorityValue = "none"; - dataAttributes["taskPriority"] = priorityValue; - genericClasses.push(LayoutClasses.priority); - break; - } - case "dueDate": { - const date = task.dueDate; - if (date) { - genericClasses.push(LayoutClasses.dueDate); - setDateAttribute(date, "taskDue"); - } - break; - } - case "startDate": { - const date = task.startDate; - if (date) { - genericClasses.push(LayoutClasses.startDate); - setDateAttribute(date, "taskStart"); - } - break; - } - case "scheduledDate": { - const date = task.scheduledDate; - if (date) { - genericClasses.push(LayoutClasses.scheduledDate); - setDateAttribute(date, "taskScheduled"); - } - break; - } - case "doneDate": { - const date = task.doneDate; - if (date) { - genericClasses.push(LayoutClasses.doneDate); - setDateAttribute(date, "taskDone"); - } - break; - } - case "recurrenceRule": { - genericClasses.push(LayoutClasses.recurrenceRule); - break; - } - } - return [genericClasses, dataAttributes]; -} -function addInternalClasses(component, renderedComponent) { - if (component === "description") { - const tags = renderedComponent.getElementsByClassName("tag"); - for (let i = 0; i < tags.length; i++) { - const tagName = tags[i].textContent; - if (tagName) { - const className = tagToAttributeValue(tagName); - const element2 = tags[i]; - if (className) - element2.dataset.tagName = className; - } - } - } -} -function dateToAttribute(date) { - const today = window.moment().startOf("day"); - let result = ""; - const diffDays = today.diff(date, "days"); - if (isNaN(diffDays)) - return null; - if (diffDays === 0) - return "today"; - else if (diffDays > 0) - result += "past-"; - else if (diffDays < 0) - result += "future-"; - if (Math.abs(diffDays) <= MAX_DAY_VALUE_RANGE) { - result += Math.abs(diffDays).toString() + "d"; - } else { - result += DAY_VALUE_OVER_RANGE_POSTFIX; - } - return result; -} -function tagToAttributeValue(tag) { - const illegalChars = /["&\x00\r\n]/g; - let sanitizedTag = tag.replace(illegalChars, "-"); - sanitizedTag = sanitizedTag.replace(/^[-_]+/, ""); - if (sanitizedTag.length > 0) - return sanitizedTag; - else - return null; -} -function addTooltip({ - task, - element: element2, - isFilenameUnique -}) { - element2.addEventListener("mouseenter", () => { - const tooltip = element2.createDiv(); - tooltip.addClasses(["tooltip", "mod-right"]); - if (task.recurrence) { - const recurrenceDiv = tooltip.createDiv(); - recurrenceDiv.setText(`${recurrenceSymbol} ${task.recurrence.toText()}`); - } - if (task.startDate) { - const startDateDiv = tooltip.createDiv(); - startDateDiv.setText( - toTooltipDate({ - signifier: startDateSymbol, - date: task.startDate - }) - ); - } - if (task.scheduledDate) { - const scheduledDateDiv = tooltip.createDiv(); - scheduledDateDiv.setText( - toTooltipDate({ - signifier: scheduledDateSymbol, - date: task.scheduledDate - }) - ); - } - if (task.dueDate) { - const dueDateDiv = tooltip.createDiv(); - dueDateDiv.setText( - toTooltipDate({ - signifier: dueDateSymbol, - date: task.dueDate - }) - ); - } - if (task.doneDate) { - const doneDateDiv = tooltip.createDiv(); - doneDateDiv.setText( - toTooltipDate({ - signifier: doneDateSymbol, - date: task.doneDate - }) - ); - } - const linkText = task.getLinkText({ isFilenameUnique }); - if (linkText) { - const backlinkDiv = tooltip.createDiv(); - backlinkDiv.setText(`\u{1F517} ${linkText}`); - } - element2.addEventListener("mouseleave", () => { - tooltip.remove(); - }); - }); -} -function toTooltipDate({ signifier, date }) { - return `${signifier} ${date.format(TaskRegularExpressions.dateFormat)} (${date.from( - window.moment().startOf("day") - )})`; -} -function removeGlobalFilterIfNeeded(description) { - const { globalFilter, removeGlobalFilter } = getSettings(); - if (removeGlobalFilter) { - return description.replace(globalFilter, "").trim(); - } - return description; -} - -// src/DateFallback.ts -var DateFallback = class { - static fromPath(path) { - const { useFilenameAsScheduledDate, filenameAsDateFolders } = getSettings(); - if (!useFilenameAsScheduledDate) { - return null; - } - if (!this.matchesAnyFolder(filenameAsDateFolders, path)) { - return null; - } - return this.extractDateFromPath(path); - } - static matchesAnyFolder(folders, path) { - if (folders.length === 0) { - return true; - } - return folders.some((folder) => path.startsWith(folder + "/")); - } - static extractDateFromPath(path) { - const firstPos = Math.max(0, path.lastIndexOf("/") + 1); - const lastPos = path.lastIndexOf("."); - const basename = path.substring(firstPos, lastPos); - let dateMatch = /(\d{4})-(\d{2})-(\d{2})/.exec(basename); - if (!dateMatch) - dateMatch = /(\d{4})(\d{2})(\d{2})/.exec(basename); - if (dateMatch) { - const date = window.moment([parseInt(dateMatch[1]), parseInt(dateMatch[2]) - 1, parseInt(dateMatch[3])]); - if (date.isValid()) { - return date; - } - } - return null; - } - static canApplyFallback({ - startDate, - scheduledDate, - dueDate - }) { - return startDate === null && dueDate === null && scheduledDate === null; - } - static updateTaskPath(task, newPath, fallbackDate) { - let scheduledDate = task.scheduledDate; - let scheduledDateIsInferred = task.scheduledDateIsInferred; - if (fallbackDate === null) { - if (scheduledDateIsInferred) { - scheduledDateIsInferred = false; - scheduledDate = null; - } else { - } - } else { - if (scheduledDateIsInferred) { - scheduledDate = fallbackDate; - } else if (this.canApplyFallback(task)) { - scheduledDate = fallbackDate; - scheduledDateIsInferred = true; - } else { - } - } - return new Task(__spreadProps(__spreadValues({}, task), { - path: newPath, - scheduledDate, - scheduledDateIsInferred - })); - } - static removeInferredStatusIfNeeded(originalTask, updatedTasks) { - const inferredScheduledDate = originalTask.scheduledDateIsInferred ? originalTask.scheduledDate : null; - return updatedTasks.map((task) => { - if (inferredScheduledDate !== null && !inferredScheduledDate.isSame(task.scheduledDate, "day")) { - task = new Task(__spreadProps(__spreadValues({}, task), { scheduledDateIsInferred: false })); - } - return task; - }); - } -}; - -// src/lib/RegExpTools.ts -function escapeRegExp(s) { - return s.replace(/([.*+?^${}()|[\]/\\])/g, "\\$1"); -} - -// src/Task.ts -var prioritySymbols = { - High: "\u23EB", - Medium: "\u{1F53C}", - Low: "\u{1F53D}", - None: "" -}; -var recurrenceSymbol = "\u{1F501}"; -var startDateSymbol = "\u{1F6EB}"; -var scheduledDateSymbol = "\u23F3"; -var dueDateSymbol = "\u{1F4C5}"; -var doneDateSymbol = "\u2705"; -var _TaskRegularExpressions = class { -}; -var TaskRegularExpressions = _TaskRegularExpressions; -TaskRegularExpressions.dateFormat = "YYYY-MM-DD"; -TaskRegularExpressions.indentationRegex = /^([\s\t>]*)/; -TaskRegularExpressions.listMarkerRegex = /([-*]|[0-9]+\.)/; -TaskRegularExpressions.checkboxRegex = /\[(.)\]/u; -TaskRegularExpressions.afterCheckboxRegex = / *(.*)/u; -TaskRegularExpressions.taskRegex = new RegExp( - _TaskRegularExpressions.indentationRegex.source + _TaskRegularExpressions.listMarkerRegex.source + " +" + _TaskRegularExpressions.checkboxRegex.source + _TaskRegularExpressions.afterCheckboxRegex.source, - "u" -); -TaskRegularExpressions.nonTaskRegex = new RegExp( - _TaskRegularExpressions.indentationRegex.source + _TaskRegularExpressions.listMarkerRegex.source + "? *(" + _TaskRegularExpressions.checkboxRegex.source + ")?" + _TaskRegularExpressions.afterCheckboxRegex.source, - "u" -); -TaskRegularExpressions.listItemRegex = new RegExp( - _TaskRegularExpressions.indentationRegex.source + _TaskRegularExpressions.listMarkerRegex.source -); -TaskRegularExpressions.blockLinkRegex = / \^[a-zA-Z0-9-]+$/u; -TaskRegularExpressions.priorityRegex = /([⏫🔼🔽])$/u; -TaskRegularExpressions.startDateRegex = /🛫 *(\d{4}-\d{2}-\d{2})$/u; -TaskRegularExpressions.scheduledDateRegex = /[⏳⌛] *(\d{4}-\d{2}-\d{2})$/u; -TaskRegularExpressions.dueDateRegex = /[📅📆🗓] *(\d{4}-\d{2}-\d{2})$/u; -TaskRegularExpressions.doneDateRegex = /✅ *(\d{4}-\d{2}-\d{2})$/u; -TaskRegularExpressions.recurrenceRegex = /🔁 ?([a-zA-Z0-9, !]+)$/iu; -TaskRegularExpressions.hashTags = /(^|\s)#[^ !@#$%^&*(),.?":{}|<>]*/g; -TaskRegularExpressions.hashTagsFromEnd = new RegExp(_TaskRegularExpressions.hashTags.source + "$"); -var Task = class { - constructor({ - status, - description, - path, - indentation, - listMarker, - sectionStart, - sectionIndex, - precedingHeader, - priority, - startDate, - scheduledDate, - dueDate, - doneDate, - recurrence, - blockLink, - tags, - originalMarkdown, - scheduledDateIsInferred - }) { - this._urgency = null; - this.status = status; - this.description = description; - this.path = path; - this.indentation = indentation; - this.listMarker = listMarker; - this.sectionStart = sectionStart; - this.sectionIndex = sectionIndex; - this.precedingHeader = precedingHeader; - this.tags = tags; - this.priority = priority; - this.startDate = startDate; - this.scheduledDate = scheduledDate; - this.dueDate = dueDate; - this.doneDate = doneDate; - this.recurrence = recurrence; - this.blockLink = blockLink; - this.originalMarkdown = originalMarkdown; - this.scheduledDateIsInferred = scheduledDateIsInferred; - } - static fromLine({ - line, - path, - sectionStart, - sectionIndex, - precedingHeader, - fallbackDate - }) { - const regexMatch = line.match(TaskRegularExpressions.taskRegex); - if (regexMatch === null) { - return null; - } - const body = regexMatch[4].trim(); - const { globalFilter } = getSettings(); - if (!body.includes(globalFilter)) { - return null; - } - let description = body; - const indentation = regexMatch[1]; - const listMarker = regexMatch[2]; - const statusString = regexMatch[3]; - const status = StatusRegistry.getInstance().bySymbolOrCreate(statusString); - const blockLinkMatch = description.match(TaskRegularExpressions.blockLinkRegex); - const blockLink = blockLinkMatch !== null ? blockLinkMatch[0] : ""; - if (blockLink !== "") { - description = description.replace(TaskRegularExpressions.blockLinkRegex, "").trim(); - } - let matched; - let priority = "3" /* None */; - let startDate = null; - let scheduledDate = null; - let scheduledDateIsInferred = false; - let dueDate = null; - let doneDate = null; - let recurrenceRule = ""; - let recurrence = null; - let tags = []; - let trailingTags = ""; - const maxRuns = 20; - let runs = 0; - do { - matched = false; - const priorityMatch = description.match(TaskRegularExpressions.priorityRegex); - if (priorityMatch !== null) { - switch (priorityMatch[1]) { - case prioritySymbols.Low: - priority = "4" /* Low */; - break; - case prioritySymbols.Medium: - priority = "2" /* Medium */; - break; - case prioritySymbols.High: - priority = "1" /* High */; - break; - } - description = description.replace(TaskRegularExpressions.priorityRegex, "").trim(); - matched = true; - } - const doneDateMatch = description.match(TaskRegularExpressions.doneDateRegex); - if (doneDateMatch !== null) { - doneDate = window.moment(doneDateMatch[1], TaskRegularExpressions.dateFormat); - description = description.replace(TaskRegularExpressions.doneDateRegex, "").trim(); - matched = true; - } - const dueDateMatch = description.match(TaskRegularExpressions.dueDateRegex); - if (dueDateMatch !== null) { - dueDate = window.moment(dueDateMatch[1], TaskRegularExpressions.dateFormat); - description = description.replace(TaskRegularExpressions.dueDateRegex, "").trim(); - matched = true; - } - const scheduledDateMatch = description.match(TaskRegularExpressions.scheduledDateRegex); - if (scheduledDateMatch !== null) { - scheduledDate = window.moment(scheduledDateMatch[1], TaskRegularExpressions.dateFormat); - description = description.replace(TaskRegularExpressions.scheduledDateRegex, "").trim(); - matched = true; - } - const startDateMatch = description.match(TaskRegularExpressions.startDateRegex); - if (startDateMatch !== null) { - startDate = window.moment(startDateMatch[1], TaskRegularExpressions.dateFormat); - description = description.replace(TaskRegularExpressions.startDateRegex, "").trim(); - matched = true; - } - const recurrenceMatch = description.match(TaskRegularExpressions.recurrenceRegex); - if (recurrenceMatch !== null) { - recurrenceRule = recurrenceMatch[1].trim(); - description = description.replace(TaskRegularExpressions.recurrenceRegex, "").trim(); - matched = true; - } - const tagsMatch = description.match(TaskRegularExpressions.hashTagsFromEnd); - if (tagsMatch != null) { - description = description.replace(TaskRegularExpressions.hashTagsFromEnd, "").trim(); - matched = true; - const tagName = tagsMatch[0].trim(); - trailingTags = trailingTags.length > 0 ? [tagName, trailingTags].join(" ") : tagName; - } - runs++; - } while (matched && runs <= maxRuns); - if (recurrenceRule.length > 0) { - recurrence = Recurrence.fromText({ - recurrenceRuleText: recurrenceRule, - startDate, - scheduledDate, - dueDate - }); - } - if (DateFallback.canApplyFallback({ startDate, scheduledDate, dueDate }) && fallbackDate !== null) { - scheduledDate = fallbackDate; - scheduledDateIsInferred = true; - } - if (trailingTags.length > 0) - description += " " + trailingTags; - const hashTagMatch = description.match(TaskRegularExpressions.hashTags); - if (hashTagMatch !== null) { - tags = hashTagMatch.filter((tag) => tag !== globalFilter).map((tag) => tag.trim()); - } - return new Task({ - status, - description, - path, - indentation, - listMarker, - sectionStart, - sectionIndex, - precedingHeader, - priority, - startDate, - scheduledDate, - dueDate, - doneDate, - recurrence, - blockLink, - tags, - originalMarkdown: line, - scheduledDateIsInferred - }); - } - toLi(renderDetails) { - return __async(this, null, function* () { - return renderTaskLine(this, renderDetails); - }); - } - toString(layoutOptions) { - const taskLayout = new TaskLayout(layoutOptions); - let taskString = ""; - for (const component of taskLayout.layoutComponents) { - taskString += this.componentToString(taskLayout, component); - } - return taskString; - } - componentToString(layout, component) { - var _a; - switch (component) { - case "description": - return this.description; - case "priority": { - let priority = ""; - if (this.priority === "1" /* High */) { - priority = " " + prioritySymbols.High; - } else if (this.priority === "2" /* Medium */) { - priority = " " + prioritySymbols.Medium; - } else if (this.priority === "4" /* Low */) { - priority = " " + prioritySymbols.Low; - } - return priority; - } - case "startDate": - if (!this.startDate) - return ""; - return layout.options.shortMode ? " " + startDateSymbol : ` ${startDateSymbol} ${this.startDate.format(TaskRegularExpressions.dateFormat)}`; - case "scheduledDate": - if (!this.scheduledDate || this.scheduledDateIsInferred) - return ""; - return layout.options.shortMode ? " " + scheduledDateSymbol : ` ${scheduledDateSymbol} ${this.scheduledDate.format(TaskRegularExpressions.dateFormat)}`; - case "doneDate": - if (!this.doneDate) - return ""; - return layout.options.shortMode ? " " + doneDateSymbol : ` ${doneDateSymbol} ${this.doneDate.format(TaskRegularExpressions.dateFormat)}`; - case "dueDate": - if (!this.dueDate) - return ""; - return layout.options.shortMode ? " " + dueDateSymbol : ` ${dueDateSymbol} ${this.dueDate.format(TaskRegularExpressions.dateFormat)}`; - case "recurrenceRule": - if (!this.recurrence) - return ""; - return layout.options.shortMode ? " " + recurrenceSymbol : ` ${recurrenceSymbol} ${this.recurrence.toText()}`; - case "blockLink": - return (_a = this.blockLink) != null ? _a : ""; - default: - throw new Error(`Don't know how to render task component of type '${component}'`); - } - } - toFileLineString() { - return `${this.indentation}${this.listMarker} [${this.status.symbol}] ${this.toString()}`; - } - toggle() { - const newStatus = StatusRegistry.getInstance().getNextStatusOrCreate(this.status); - let newDoneDate = null; - let nextOccurrence = null; - if (newStatus.isCompleted()) { - const { setDoneDate } = getSettings(); - if (setDoneDate) { - newDoneDate = window.moment(); - } - if (this.recurrence !== null) { - nextOccurrence = this.recurrence.next(); - } - } - const toggledTask = new Task(__spreadProps(__spreadValues({}, this), { - status: newStatus, - doneDate: newDoneDate - })); - const newTasks = []; - if (nextOccurrence !== null) { - const nextStatus = StatusRegistry.getInstance().getNextStatusOrCreate(newStatus); - const nextTask = new Task(__spreadProps(__spreadValues(__spreadValues({}, this), nextOccurrence), { - status: nextStatus, - blockLink: "" - })); - newTasks.push(nextTask); - } - newTasks.push(toggledTask); - return newTasks; - } - get urgency() { - if (this._urgency === null) { - this._urgency = Urgency.calculate(this); - } - return this._urgency; - } - get filename() { - const fileNameMatch = this.path.match(/([^/]+)\.md$/); - if (fileNameMatch !== null) { - return fileNameMatch[1]; - } else { - return null; - } - } - getLinkText({ isFilenameUnique }) { - let linkText; - if (isFilenameUnique) { - linkText = this.filename; - } else { - linkText = "/" + this.path; - } - if (linkText === null) { - return null; - } - if (this.precedingHeader !== null && this.precedingHeader !== linkText) { - linkText = linkText + " > " + this.precedingHeader; - } - return linkText; - } - static tasksListsIdentical(oldTasks, newTasks) { - if (oldTasks.length !== newTasks.length) { - return false; - } - return oldTasks.every((oldTask, index) => oldTask.identicalTo(newTasks[index])); - } - identicalTo(other) { - let args = [ - "status", - "description", - "path", - "indentation", - "listMarker", - "sectionStart", - "sectionIndex", - "precedingHeader", - "priority", - "blockLink", - "scheduledDateIsInferred" - ]; - for (const el of args) { - if (this[el] !== other[el]) - return false; - } - if (this.tags.length !== other.tags.length) { - return false; - } - if (!this.tags.every(function(element2, index) { - return element2 === other.tags[index]; - })) { - return false; - } - args = ["startDate", "scheduledDate", "dueDate", "doneDate"]; - for (const el of args) { - const date1 = this[el]; - const date2 = other[el]; - if (compareByDate(date1, date2) !== 0) { - return false; - } - } - const recurrence1 = this.recurrence; - const recurrence2 = other.recurrence; - if (recurrence1 === null && recurrence2 !== null) { - return false; - } else if (recurrence1 !== null && recurrence2 === null) { - return false; - } else if (recurrence1 && recurrence2 && !recurrence1.identicalTo(recurrence2)) { - return false; - } - return true; - } - getDescriptionWithoutGlobalFilter() { - const { globalFilter } = getSettings(); - let description = this.description; - if (globalFilter.length === 0) - return description; - const globalFilterRegex = RegExp("(^|\\s)" + escapeRegExp(globalFilter) + "($|\\s)", "ug"); - if (this.description.search(globalFilterRegex) > -1) { - description = description.replace(globalFilterRegex, "$1$2").replace(" ", " ").trim(); - } - return description; - } -}; - -// src/lib/Lazy.ts -var Lazy = class { - constructor(fetch) { - this.fetch = fetch; - this._value = void 0; - } - get value() { - if (this._value === void 0) { - this._value = this.fetch(); - } - return this._value; - } -}; - -// src/Cache.ts -var Cache2 = class { - constructor({ metadataCache: metadataCache2, vault: vault2, events }) { - this.metadataCache = metadataCache2; - this.metadataCacheEventReferences = []; - this.vault = vault2; - this.vaultEventReferences = []; - this.events = events; - this.eventsEventReferences = []; - this.tasksMutex = new Mutex(); - this.state = "Cold" /* Cold */; - this.tasks = []; - this.loadedAfterFirstResolve = false; - this.subscribeToCache(); - this.subscribeToVault(); - this.subscribeToEvents(); - this.loadVault(); - } - unload() { - for (const eventReference of this.metadataCacheEventReferences) { - this.metadataCache.offref(eventReference); - } - for (const eventReference of this.vaultEventReferences) { - this.vault.offref(eventReference); - } - for (const eventReference of this.eventsEventReferences) { - this.events.off(eventReference); - } - } - getTasks() { - return this.tasks; - } - getState() { - return this.state; - } - notifySubscribers() { - this.events.triggerCacheUpdate({ - tasks: this.tasks, - state: this.state - }); - } - subscribeToCache() { - const resolvedEventeReference = this.metadataCache.on("resolved", () => __async(this, null, function* () { - if (!this.loadedAfterFirstResolve) { - this.loadedAfterFirstResolve = true; - this.loadVault(); - } - })); - this.metadataCacheEventReferences.push(resolvedEventeReference); - const changedEventReference = this.metadataCache.on("changed", (file) => { - this.tasksMutex.runExclusive(() => { - this.indexFile(file); - }); - }); - this.metadataCacheEventReferences.push(changedEventReference); - } - subscribeToVault() { - const { useFilenameAsScheduledDate } = getSettings(); - const createdEventReference = this.vault.on("create", (file) => { - if (!(file instanceof import_obsidian3.TFile)) { - return; - } - this.tasksMutex.runExclusive(() => { - this.indexFile(file); - }); - }); - this.vaultEventReferences.push(createdEventReference); - const deletedEventReference = this.vault.on("delete", (file) => { - if (!(file instanceof import_obsidian3.TFile)) { - return; - } - this.tasksMutex.runExclusive(() => { - this.tasks = this.tasks.filter((task) => { - return task.path !== file.path; - }); - this.notifySubscribers(); - }); - }); - this.vaultEventReferences.push(deletedEventReference); - const renamedEventReference = this.vault.on("rename", (file, oldPath) => { - if (!(file instanceof import_obsidian3.TFile)) { - return; - } - this.tasksMutex.runExclusive(() => { - const fallbackDate = new Lazy(() => DateFallback.fromPath(file.path)); - this.tasks = this.tasks.map((task) => { - if (task.path === oldPath) { - if (!useFilenameAsScheduledDate) { - return new Task(__spreadProps(__spreadValues({}, task), { path: file.path })); - } else { - return DateFallback.updateTaskPath(task, file.path, fallbackDate.value); - } - } else { - return task; - } - }); - this.notifySubscribers(); - }); - }); - this.vaultEventReferences.push(renamedEventReference); - } - subscribeToEvents() { - const requestReference = this.events.onRequestCacheUpdate((handler) => { - handler({ tasks: this.tasks, state: this.state }); - }); - this.eventsEventReferences.push(requestReference); - } - loadVault() { - return this.tasksMutex.runExclusive(() => __async(this, null, function* () { - this.state = "Initializing" /* Initializing */; - yield Promise.all( - this.vault.getMarkdownFiles().map((file) => { - return this.indexFile(file); - }) - ); - this.state = "Warm" /* Warm */; - this.notifySubscribers(); - })); - } - indexFile(file) { - return __async(this, null, function* () { - const fileCache = this.metadataCache.getFileCache(file); - if (fileCache === null || fileCache === void 0) { - return; - } - const oldTasks = this.tasks.filter((task) => { - return task.path === file.path; - }); - const listItems = fileCache.listItems; - let newTasks = []; - if (listItems !== void 0) { - const fileContent = yield this.vault.cachedRead(file); - newTasks = this.getTasksFromFileContent(fileContent, listItems, fileCache, file); - } - if (Task.tasksListsIdentical(oldTasks, newTasks)) { - return; - } - if (this.getState() == "Warm" /* Warm */) { - console.debug( - `At least one task, its line number or its heading has changed in ${file.path}: triggering a refresh of all active Tasks blocks in Live Preview and Reading mode views.` - ); - } - this.tasks = this.tasks.filter((task) => { - return task.path !== file.path; - }); - this.tasks.push(...newTasks); - this.notifySubscribers(); - }); - } - getTasksFromFileContent(fileContent, listItems, fileCache, file) { - const tasks = []; - const fileLines = fileContent.split("\n"); - const linesInFile = fileLines.length; - const dateFromFileName = new Lazy(() => DateFallback.fromPath(file.path)); - let currentSection = null; - let sectionIndex = 0; - for (const listItem of listItems) { - if (listItem.task !== void 0) { - const lineNumber = listItem.position.start.line; - if (lineNumber >= linesInFile) { - console.log( - `${file.path} Obsidian gave us a line number ${lineNumber} past the end of the file. ${linesInFile}.` - ); - return tasks; - } - if (currentSection === null || currentSection.position.end.line < lineNumber) { - currentSection = Cache2.getSection(lineNumber, fileCache.sections); - sectionIndex = 0; - } - if (currentSection === null) { - continue; - } - const line = fileLines[lineNumber]; - if (line === void 0) { - console.log(`${file.path}: line ${lineNumber} - ignoring 'undefined' line.`); - continue; - } - let task; - try { - task = Task.fromLine({ - line, - path: file.path, - sectionStart: currentSection.position.start.line, - sectionIndex, - precedingHeader: Cache2.getPrecedingHeader(lineNumber, fileCache.headings), - fallbackDate: dateFromFileName.value - }); - } catch (e) { - this.reportTaskParsingErrorToUser(e, file, listItem, line); - continue; - } - if (task !== null) { - sectionIndex++; - tasks.push(task); - } - } - } - return tasks; - } - reportTaskParsingErrorToUser(e, file, listItem, line) { - const msg = `There was an error reading one of the tasks in this vault. +"use strict";var fT=Object.create;var Ti=Object.defineProperty,pT=Object.defineProperties,hT=Object.getOwnPropertyDescriptor,mT=Object.getOwnPropertyDescriptors,yT=Object.getOwnPropertyNames,Sf=Object.getOwnPropertySymbols,gT=Object.getPrototypeOf,Pf=Object.prototype.hasOwnProperty,_T=Object.prototype.propertyIsEnumerable;var kf=(r,e,t)=>e in r?Ti(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,we=(r,e)=>{for(var t in e||(e={}))Pf.call(e,t)&&kf(r,t,e[t]);if(Sf)for(var t of Sf(e))_T.call(e,t)&&kf(r,t,e[t]);return r},vt=(r,e)=>pT(r,mT(e));var p=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),TT=(r,e)=>{for(var t in e)Ti(r,t,{get:e[t],enumerable:!0})},Af=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of yT(e))!Pf.call(r,i)&&i!==t&&Ti(r,i,{get:()=>e[i],enumerable:!(n=hT(e,i))||n.enumerable});return r};var Ks=(r,e,t)=>(t=r!=null?fT(gT(r)):{},Af(e||!r||!r.__esModule?Ti(t,"default",{value:r,enumerable:!0}):t,r)),bT=r=>Af(Ti({},"__esModule",{value:!0}),r);var x=(r,e,t)=>new Promise((n,i)=>{var s=u=>{try{o(t.next(u))}catch(l){i(l)}},a=u=>{try{o(t.throw(u))}catch(l){i(l)}},o=u=>u.done?n(u.value):Promise.resolve(u.value).then(s,a);o((t=t.apply(r,e)).next())});var rp=p((hP,ea)=>{var If,Ff,Uf,Lf,qf,Wf,Yf,$f,jf,Qs,Io,Bf,Gf,Hf,Dn,zf,Kf,Vf,Xf,Zf,Qf,Jf,ep,tp,Js;(function(r){var e=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(n){r(t(e,t(n)))}):typeof ea=="object"&&typeof ea.exports=="object"?r(t(e,t(ea.exports))):r(t(e));function t(n,i){return n!==e&&(typeof Object.create=="function"?Object.defineProperty(n,"__esModule",{value:!0}):n.__esModule=!0),function(s,a){return n[s]=i?i(s,a):a}}})(function(r){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var s in i)Object.prototype.hasOwnProperty.call(i,s)&&(n[s]=i[s])};If=function(n,i){if(typeof i!="function"&&i!==null)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");e(n,i);function s(){this.constructor=n}n.prototype=i===null?Object.create(i):(s.prototype=i.prototype,new s)},Ff=Object.assign||function(n){for(var i,s=1,a=arguments.length;s=0;c--)(l=n[c])&&(u=(o<3?l(u):o>3?l(i,s,u):l(i,s))||u);return o>3&&u&&Object.defineProperty(i,s,u),u},qf=function(n,i){return function(s,a){i(s,a,n)}},Wf=function(n,i){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,i)},Yf=function(n,i,s,a){function o(u){return u instanceof s?u:new s(function(l){l(u)})}return new(s||(s=Promise))(function(u,l){function c(h){try{f(a.next(h))}catch(y){l(y)}}function d(h){try{f(a.throw(h))}catch(y){l(y)}}function f(h){h.done?u(h.value):o(h.value).then(c,d)}f((a=a.apply(n,i||[])).next())})},$f=function(n,i){var s={label:0,sent:function(){if(u[0]&1)throw u[1];return u[1]},trys:[],ops:[]},a,o,u,l;return l={next:c(0),throw:c(1),return:c(2)},typeof Symbol=="function"&&(l[Symbol.iterator]=function(){return this}),l;function c(f){return function(h){return d([f,h])}}function d(f){if(a)throw new TypeError("Generator is already executing.");for(;s;)try{if(a=1,o&&(u=f[0]&2?o.return:f[0]?o.throw||((u=o.return)&&u.call(o),0):o.next)&&!(u=u.call(o,f[1])).done)return u;switch(o=0,u&&(f=[f[0]&2,u.value]),f[0]){case 0:case 1:u=f;break;case 4:return s.label++,{value:f[1],done:!1};case 5:s.label++,o=f[1],f=[0];continue;case 7:f=s.ops.pop(),s.trys.pop();continue;default:if(u=s.trys,!(u=u.length>0&&u[u.length-1])&&(f[0]===6||f[0]===2)){s=0;continue}if(f[0]===3&&(!u||f[1]>u[0]&&f[1]=n.length&&(n=void 0),{value:n&&n[a++],done:!n}}};throw new TypeError(i?"Object is not iterable.":"Symbol.iterator is not defined.")},Io=function(n,i){var s=typeof Symbol=="function"&&n[Symbol.iterator];if(!s)return n;var a=s.call(n),o,u=[],l;try{for(;(i===void 0||i-- >0)&&!(o=a.next()).done;)u.push(o.value)}catch(c){l={error:c}}finally{try{o&&!o.done&&(s=a.return)&&s.call(a)}finally{if(l)throw l.error}}return u},Bf=function(){for(var n=[],i=0;i1||c(m,g)})})}function c(m,g){try{d(a[m](g))}catch(R){y(u[0][3],R)}}function d(m){m.value instanceof Dn?Promise.resolve(m.value.v).then(f,h):y(u[0][2],m)}function f(m){c("next",m)}function h(m){c("throw",m)}function y(m,g){m(g),u.shift(),u.length&&c(u[0][0],u[0][1])}},Kf=function(n){var i,s;return i={},a("next"),a("throw",function(o){throw o}),a("return"),i[Symbol.iterator]=function(){return this},i;function a(o,u){i[o]=n[o]?function(l){return(s=!s)?{value:Dn(n[o](l)),done:o==="return"}:u?u(l):l}:u}},Vf=function(n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i=n[Symbol.asyncIterator],s;return i?i.call(n):(n=typeof Qs=="function"?Qs(n):n[Symbol.iterator](),s={},a("next"),a("throw"),a("return"),s[Symbol.asyncIterator]=function(){return this},s);function a(u){s[u]=n[u]&&function(l){return new Promise(function(c,d){l=n[u](l),o(c,d,l.done,l.value)})}}function o(u,l,c,d){Promise.resolve(d).then(function(f){u({value:f,done:c})},l)}},Xf=function(n,i){return Object.defineProperty?Object.defineProperty(n,"raw",{value:i}):n.raw=i,n};var t=Object.create?function(n,i){Object.defineProperty(n,"default",{enumerable:!0,value:i})}:function(n,i){n.default=i};Zf=function(n){if(n&&n.__esModule)return n;var i={};if(n!=null)for(var s in n)s!=="default"&&Object.prototype.hasOwnProperty.call(n,s)&&Js(i,n,s);return t(i,n),i},Qf=function(n){return n&&n.__esModule?n:{default:n}},Jf=function(n,i,s,a){if(s==="a"&&!a)throw new TypeError("Private accessor was defined without a getter");if(typeof i=="function"?n!==i||!a:!i.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return s==="m"?a:s==="a"?a.call(n):a?a.value:i.get(n)},ep=function(n,i,s,a,o){if(a==="m")throw new TypeError("Private method is not writable");if(a==="a"&&!o)throw new TypeError("Private accessor was defined without a setter");if(typeof i=="function"?n!==i||!o:!i.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return a==="a"?o.call(n,s):o?o.value=s:i.set(n,s),s},tp=function(n,i){if(i===null||typeof i!="object"&&typeof i!="function")throw new TypeError("Cannot use 'in' operator on non-object");return typeof n=="function"?i===n:n.has(i)},r("__extends",If),r("__assign",Ff),r("__rest",Uf),r("__decorate",Lf),r("__param",qf),r("__metadata",Wf),r("__awaiter",Yf),r("__generator",$f),r("__exportStar",jf),r("__createBinding",Js),r("__values",Qs),r("__read",Io),r("__spread",Bf),r("__spreadArrays",Gf),r("__spreadArray",Hf),r("__await",Dn),r("__asyncGenerator",zf),r("__asyncDelegator",Kf),r("__asyncValues",Vf),r("__makeTemplateObject",Xf),r("__importStar",Zf),r("__importDefault",Qf),r("__classPrivateFieldGet",Jf),r("__classPrivateFieldSet",ep),r("__classPrivateFieldIn",tp)})});var ie=p(Ar=>{"use strict";Object.defineProperty(Ar,"__esModule",{value:!0});Ar.matchAnyPattern=Ar.extractTerms=Ar.repeatedTimeunitPattern=void 0;function ZT(r,e){let t=e.replace(/\((?!\?)/g,"(?:");return`${r}${t}\\s{0,5}(?:,?\\s{0,5}${t}){0,10}`}Ar.repeatedTimeunitPattern=ZT;function Fp(r){let e;return r instanceof Array?e=[...r]:r instanceof Map?e=Array.from(r.keys()):e=Object.keys(r),e}Ar.extractTerms=Fp;function QT(r){return`(?:${Fp(r).sort((t,n)=>n.length-t.length).join("|").replace(/\./g,"\\.")})`}Ar.matchAnyPattern=QT});var ee=p((Yo,$o)=>{(function(r,e){typeof Yo=="object"&&typeof $o!="undefined"?$o.exports=e():typeof define=="function"&&define.amd?define(e):(r=typeof globalThis!="undefined"?globalThis:r||self).dayjs=e()})(Yo,function(){"use strict";var r=1e3,e=6e4,t=36e5,n="millisecond",i="second",s="minute",a="hour",o="day",u="week",l="month",c="quarter",d="year",f="date",h="Invalid Date",y=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,m=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,g={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},R=function(A,E,b){var C=String(A);return!C||C.length>=E?A:""+Array(E+1-C.length).join(b)+A},O={s:R,z:function(A){var E=-A.utcOffset(),b=Math.abs(E),C=Math.floor(b/60),v=b%60;return(E<=0?"+":"-")+R(C,2,"0")+":"+R(v,2,"0")},m:function A(E,b){if(E.date(){"use strict";var JT=xr&&xr.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(xr,"__esModule",{value:!0});xr.findYearClosestToRef=xr.findMostLikelyADYear=void 0;var eb=JT(ee());function tb(r){return r<100&&(r>50?r=r+1900:r=r+2e3),r}xr.findMostLikelyADYear=tb;function rb(r,e,t){let n=eb.default(r),i=n;i=i.month(t-1),i=i.date(e),i=i.year(n.year());let s=i.add(1,"y"),a=i.add(-1,"y");return Math.abs(s.diff(n)){"use strict";Object.defineProperty($,"__esModule",{value:!0});$.parseTimeUnits=$.TIME_UNITS_PATTERN=$.parseYear=$.YEAR_PATTERN=$.parseOrdinalNumberPattern=$.ORDINAL_NUMBER_PATTERN=$.parseNumberPattern=$.NUMBER_PATTERN=$.TIME_UNIT_DICTIONARY=$.ORDINAL_WORD_DICTIONARY=$.INTEGER_WORD_DICTIONARY=$.MONTH_DICTIONARY=$.FULL_MONTH_NAME_DICTIONARY=$.WEEKDAY_DICTIONARY=void 0;var na=ie(),nb=je();$.WEEKDAY_DICTIONARY={sunday:0,sun:0,"sun.":0,monday:1,mon:1,"mon.":1,tuesday:2,tue:2,"tue.":2,wednesday:3,wed:3,"wed.":3,thursday:4,thurs:4,"thurs.":4,thur:4,"thur.":4,thu:4,"thu.":4,friday:5,fri:5,"fri.":5,saturday:6,sat:6,"sat.":6};$.FULL_MONTH_NAME_DICTIONARY={january:1,february:2,march:3,april:4,may:5,june:6,july:7,august:8,september:9,october:10,november:11,december:12};$.MONTH_DICTIONARY=Object.assign(Object.assign({},$.FULL_MONTH_NAME_DICTIONARY),{jan:1,"jan.":1,feb:2,"feb.":2,mar:3,"mar.":3,apr:4,"apr.":4,jun:6,"jun.":6,jul:7,"jul.":7,aug:8,"aug.":8,sep:9,"sep.":9,sept:9,"sept.":9,oct:10,"oct.":10,nov:11,"nov.":11,dec:12,"dec.":12});$.INTEGER_WORD_DICTIONARY={one:1,two:2,three:3,four:4,five:5,six:6,seven:7,eight:8,nine:9,ten:10,eleven:11,twelve:12};$.ORDINAL_WORD_DICTIONARY={first:1,second:2,third:3,fourth:4,fifth:5,sixth:6,seventh:7,eighth:8,ninth:9,tenth:10,eleventh:11,twelfth:12,thirteenth:13,fourteenth:14,fifteenth:15,sixteenth:16,seventeenth:17,eighteenth:18,nineteenth:19,twentieth:20,"twenty first":21,"twenty-first":21,"twenty second":22,"twenty-second":22,"twenty third":23,"twenty-third":23,"twenty fourth":24,"twenty-fourth":24,"twenty fifth":25,"twenty-fifth":25,"twenty sixth":26,"twenty-sixth":26,"twenty seventh":27,"twenty-seventh":27,"twenty eighth":28,"twenty-eighth":28,"twenty ninth":29,"twenty-ninth":29,thirtieth:30,"thirty first":31,"thirty-first":31};$.TIME_UNIT_DICTIONARY={sec:"second",second:"second",seconds:"second",min:"minute",mins:"minute",minute:"minute",minutes:"minute",h:"hour",hr:"hour",hrs:"hour",hour:"hour",hours:"hour",day:"d",days:"d",week:"week",weeks:"week",month:"month",months:"month",qtr:"quarter",quarter:"quarter",quarters:"quarter",y:"year",yr:"year",year:"year",years:"year"};$.NUMBER_PATTERN=`(?:${na.matchAnyPattern($.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s{0,2}an?)?|an?\\b(?:\\s{0,2}few)?|few|several|a?\\s{0,2}couple\\s{0,2}(?:of)?)`;function Lp(r){let e=r.toLowerCase();return $.INTEGER_WORD_DICTIONARY[e]!==void 0?$.INTEGER_WORD_DICTIONARY[e]:e==="a"||e==="an"?1:e.match(/few/)?3:e.match(/half/)?.5:e.match(/couple/)?2:e.match(/several/)?7:parseFloat(e)}$.parseNumberPattern=Lp;$.ORDINAL_NUMBER_PATTERN=`(?:${na.matchAnyPattern($.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:st|nd|rd|th)?)`;function ib(r){let e=r.toLowerCase();return $.ORDINAL_WORD_DICTIONARY[e]!==void 0?$.ORDINAL_WORD_DICTIONARY[e]:(e=e.replace(/(?:st|nd|rd|th)$/i,""),parseInt(e))}$.parseOrdinalNumberPattern=ib;$.YEAR_PATTERN="(?:[1-9][0-9]{0,3}\\s{0,2}(?:BE|AD|BC|BCE|CE)|[1-2][0-9]{3}|[5-9][0-9])";function sb(r){if(/BE/i.test(r))return r=r.replace(/BE/i,""),parseInt(r)-543;if(/BCE?/i.test(r))return r=r.replace(/BCE?/i,""),-parseInt(r);if(/(AD|CE)/i.test(r))return r=r.replace(/(AD|CE)/i,""),parseInt(r);let e=parseInt(r);return nb.findMostLikelyADYear(e)}$.parseYear=sb;var qp=`(${$.NUMBER_PATTERN})\\s{0,3}(${na.matchAnyPattern($.TIME_UNIT_DICTIONARY)})`,Up=new RegExp(qp,"i");$.TIME_UNITS_PATTERN=na.repeatedTimeunitPattern("(?:(?:about|around)\\s{0,3})?",qp);function ab(r){let e={},t=r,n=Up.exec(t);for(;n;)ob(e,n),t=t.substring(n[0].length).trim(),n=Up.exec(t);return e}$.parseTimeUnits=ab;function ob(r,e){let t=Lp(e[1]),n=$.TIME_UNIT_DICTIONARY[e[2].toLowerCase()];r[n]=t}});var Wp=p((jo,Bo)=>{(function(r,e){typeof jo=="object"&&typeof Bo!="undefined"?Bo.exports=e():typeof define=="function"&&define.amd?define(e):(r=typeof globalThis!="undefined"?globalThis:r||self).dayjs_plugin_quarterOfYear=e()})(jo,function(){"use strict";var r="month",e="quarter";return function(t,n){var i=n.prototype;i.quarter=function(o){return this.$utils().u(o)?Math.ceil((this.month()+1)/3):this.month(this.month()%3+3*(o-1))};var s=i.add;i.add=function(o,u){return o=Number(o),this.$utils().p(u)===e?this.add(3*o,r):s.bind(this)(o,u)};var a=i.startOf;i.startOf=function(o,u){var l=this.$utils(),c=!!l.u(u)||u;if(l.p(o)===e){var d=this.quarter()-1;return c?this.month(3*d).startOf(r).startOf("day"):this.month(3*d+2).endOf(r).endOf("day")}return a.bind(this)(o,u)}}})});var Rt=p(Xt=>{"use strict";Object.defineProperty(Xt,"__esModule",{value:!0});Xt.implySimilarTime=Xt.assignSimilarTime=Xt.assignSimilarDate=Xt.assignTheNextDay=void 0;var Yp=ke();function ub(r,e){e=e.add(1,"day"),$p(r,e),jp(r,e)}Xt.assignTheNextDay=ub;function $p(r,e){r.assign("day",e.date()),r.assign("month",e.month()+1),r.assign("year",e.year())}Xt.assignSimilarDate=$p;function lb(r,e){r.assign("hour",e.hour()),r.assign("minute",e.minute()),r.assign("second",e.second()),r.assign("millisecond",e.millisecond()),r.get("hour")<12?r.assign("meridiem",Yp.Meridiem.AM):r.assign("meridiem",Yp.Meridiem.PM)}Xt.assignSimilarTime=lb;function jp(r,e){r.imply("hour",e.hour()),r.imply("minute",e.minute()),r.imply("second",e.second()),r.imply("millisecond",e.millisecond())}Xt.implySimilarTime=jp});var Bp=p(Hr=>{"use strict";Object.defineProperty(Hr,"__esModule",{value:!0});Hr.toTimezoneOffset=Hr.TIMEZONE_ABBR_MAP=void 0;Hr.TIMEZONE_ABBR_MAP={ACDT:630,ACST:570,ADT:-180,AEDT:660,AEST:600,AFT:270,AKDT:-480,AKST:-540,ALMT:360,AMST:-180,AMT:-240,ANAST:720,ANAT:720,AQTT:300,ART:-180,AST:-240,AWDT:540,AWST:480,AZOST:0,AZOT:-60,AZST:300,AZT:240,BNT:480,BOT:-240,BRST:-120,BRT:-180,BST:60,BTT:360,CAST:480,CAT:120,CCT:390,CDT:-300,CEST:120,CET:60,CHADT:825,CHAST:765,CKT:-600,CLST:-180,CLT:-240,COT:-300,CST:-360,CVT:-60,CXT:420,ChST:600,DAVT:420,EASST:-300,EAST:-360,EAT:180,ECT:-300,EDT:-240,EEST:180,EET:120,EGST:0,EGT:-60,EST:-300,ET:-300,FJST:780,FJT:720,FKST:-180,FKT:-240,FNT:-120,GALT:-360,GAMT:-540,GET:240,GFT:-180,GILT:720,GMT:0,GST:240,GYT:-240,HAA:-180,HAC:-300,HADT:-540,HAE:-240,HAP:-420,HAR:-360,HAST:-600,HAT:-90,HAY:-480,HKT:480,HLV:-210,HNA:-240,HNC:-360,HNE:-300,HNP:-480,HNR:-420,HNT:-150,HNY:-540,HOVT:420,ICT:420,IDT:180,IOT:360,IRDT:270,IRKST:540,IRKT:540,IRST:210,IST:330,JST:540,KGT:360,KRAST:480,KRAT:480,KST:540,KUYT:240,LHDT:660,LHST:630,LINT:840,MAGST:720,MAGT:720,MART:-510,MAWT:300,MDT:-360,MESZ:120,MEZ:60,MHT:720,MMT:390,MSD:240,MSK:180,MST:-420,MUT:240,MVT:300,MYT:480,NCT:660,NDT:-90,NFT:690,NOVST:420,NOVT:360,NPT:345,NST:-150,NUT:-660,NZDT:780,NZST:720,OMSST:420,OMST:420,PDT:-420,PET:-300,PETST:720,PETT:720,PGT:600,PHOT:780,PHT:480,PKT:300,PMDT:-120,PMST:-180,PONT:660,PST:-480,PT:-480,PWT:540,PYST:-180,PYT:-240,RET:240,SAMT:240,SAST:120,SBT:660,SCT:240,SGT:480,SRT:-180,SST:-660,TAHT:-600,TFT:300,TJT:300,TKT:780,TLT:540,TMT:300,TVT:720,ULAT:480,UTC:0,UYST:-120,UYT:-180,UZT:300,VET:-210,VLAST:660,VLAT:660,VUT:660,WAST:120,WAT:60,WEST:60,WESZ:60,WET:0,WEZ:0,WFT:720,WGST:-120,WGT:-180,WIB:420,WIT:540,WITA:480,WST:780,WT:0,YAKST:600,YAKT:600,YAPT:600,YEKST:360,YEKT:360};function cb(r){var e;return r==null?null:typeof r=="number"?r:(e=Hr.TIMEZONE_ABBR_MAP[r])!==null&&e!==void 0?e:null}Hr.toTimezoneOffset=cb});var be=p(Zt=>{"use strict";var Gp=Zt&&Zt.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Zt,"__esModule",{value:!0});Zt.ParsingResult=Zt.ParsingComponents=Zt.ReferenceWithTimezone=void 0;var db=Gp(Wp()),ia=Gp(ee()),Go=Rt(),fb=Bp();ia.default.extend(db.default);var Ho=class{constructor(e){var t;e=e!=null?e:new Date,e instanceof Date?this.instant=e:(this.instant=(t=e.instant)!==null&&t!==void 0?t:new Date,this.timezoneOffset=fb.toTimezoneOffset(e.timezone))}};Zt.ReferenceWithTimezone=Ho;var zr=class{constructor(e,t){if(this.reference=e,this.knownValues={},this.impliedValues={},t)for(let i in t)this.knownValues[i]=t[i];let n=ia.default(e.instant);this.imply("day",n.date()),this.imply("month",n.month()+1),this.imply("year",n.year()),this.imply("hour",12),this.imply("minute",0),this.imply("second",0),this.imply("millisecond",0)}get(e){return e in this.knownValues?this.knownValues[e]:e in this.impliedValues?this.impliedValues[e]:null}isCertain(e){return e in this.knownValues}getCertainComponents(){return Object.keys(this.knownValues)}imply(e,t){return e in this.knownValues?this:(this.impliedValues[e]=t,this)}assign(e,t){return this.knownValues[e]=t,delete this.impliedValues[e],this}delete(e){delete this.knownValues[e],delete this.impliedValues[e]}clone(){let e=new zr(this.reference);e.knownValues={},e.impliedValues={};for(let t in this.knownValues)e.knownValues[t]=this.knownValues[t];for(let t in this.impliedValues)e.impliedValues[t]=this.impliedValues[t];return e}isOnlyDate(){return!this.isCertain("hour")&&!this.isCertain("minute")&&!this.isCertain("second")}isOnlyTime(){return!this.isCertain("weekday")&&!this.isCertain("day")&&!this.isCertain("month")}isOnlyWeekdayComponent(){return this.isCertain("weekday")&&!this.isCertain("day")&&!this.isCertain("month")}isOnlyDayMonthComponent(){return this.isCertain("day")&&this.isCertain("month")&&!this.isCertain("year")}isValidDate(){let e=this.dateWithoutTimezoneAdjustment();return!(e.getFullYear()!==this.get("year")||e.getMonth()!==this.get("month")-1||e.getDate()!==this.get("day")||this.get("hour")!=null&&e.getHours()!=this.get("hour")||this.get("minute")!=null&&e.getMinutes()!=this.get("minute"))}toString(){return`[ParsingComponents {knownValues: ${JSON.stringify(this.knownValues)}, impliedValues: ${JSON.stringify(this.impliedValues)}}, reference: ${JSON.stringify(this.reference)}]`}dayjs(){return ia.default(this.date())}date(){let e=this.dateWithoutTimezoneAdjustment();return new Date(e.getTime()+this.getSystemTimezoneAdjustmentMinute(e)*6e4)}dateWithoutTimezoneAdjustment(){let e=new Date(this.get("year"),this.get("month")-1,this.get("day"),this.get("hour"),this.get("minute"),this.get("second"),this.get("millisecond"));return e.setFullYear(this.get("year")),e}getSystemTimezoneAdjustmentMinute(e){var t,n;(!e||e.getTime()<0)&&(e=new Date);let i=-e.getTimezoneOffset(),s=(n=(t=this.get("timezoneOffset"))!==null&&t!==void 0?t:this.reference.timezoneOffset)!==null&&n!==void 0?n:i;return i-s}static createRelativeFromReference(e,t){let n=ia.default(e.instant);for(let s in t)n=n.add(t[s],s);let i=new zr(e);return t.hour||t.minute||t.second?(Go.assignSimilarTime(i,n),Go.assignSimilarDate(i,n),e.timezoneOffset!==null&&i.assign("timezoneOffset",-e.instant.getTimezoneOffset())):(Go.implySimilarTime(i,n),e.timezoneOffset!==null&&i.imply("timezoneOffset",-e.instant.getTimezoneOffset()),t.d?(i.assign("day",n.date()),i.assign("month",n.month()+1),i.assign("year",n.year())):(t.week&&i.imply("weekday",n.day()),i.imply("day",n.date()),t.month?(i.assign("month",n.month()+1),i.assign("year",n.year())):(i.imply("month",n.month()+1),t.year?i.assign("year",n.year()):i.imply("year",n.year())))),i}};Zt.ParsingComponents=zr;var Mi=class{constructor(e,t,n,i,s){this.reference=e,this.refDate=e.instant,this.index=t,this.text=n,this.start=i||new zr(e),this.end=s}clone(){let e=new Mi(this.reference,this.index,this.text);return e.start=this.start?this.start.clone():null,e.end=this.end?this.end.clone():null,e}date(){return this.start.date()}toString(){return`[ParsingResult {index: ${this.index}, text: '${this.text}', ...}]`}};Zt.ParsingResult=Mi});var M=p(sa=>{"use strict";Object.defineProperty(sa,"__esModule",{value:!0});sa.AbstractParserWithWordBoundaryChecking=void 0;var zo=class{constructor(){this.cachedInnerPattern=null,this.cachedPattern=null}patternLeftBoundary(){return"(\\W|^)"}pattern(e){let t=this.innerPattern(e);return t==this.cachedInnerPattern?this.cachedPattern:(this.cachedPattern=new RegExp(`${this.patternLeftBoundary()}${t.source}`,t.flags),this.cachedInnerPattern=t,this.cachedPattern)}extract(e,t){var n;let i=(n=t[1])!==null&&n!==void 0?n:"";t.index=t.index+i.length,t[0]=t[0].substring(i.length);for(let s=2;s{"use strict";Object.defineProperty(Xo,"__esModule",{value:!0});var Vo=Be(),pb=be(),hb=M(),mb=new RegExp(`(?:within|in|for)\\s*(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${Vo.TIME_UNITS_PATTERN})(?=\\W|$)`,"i"),yb=new RegExp(`(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${Vo.TIME_UNITS_PATTERN})(?=\\W|$)`,"i"),Ko=class extends hb.AbstractParserWithWordBoundaryChecking{innerPattern(e){return e.option.forwardDate?yb:mb}innerExtract(e,t){let n=Vo.parseTimeUnits(t[1]);return pb.ParsingComponents.createRelativeFromReference(e.reference,n)}};Xo.default=Ko});var Qp=p(Qo=>{"use strict";Object.defineProperty(Qo,"__esModule",{value:!0});var gb=je(),Xp=Be(),Zp=Be(),aa=Be(),_b=ie(),Tb=M(),bb=new RegExp(`(?:on\\s{0,3})?(${aa.ORDINAL_NUMBER_PATTERN})(?:\\s{0,3}(?:to|\\-|\\\u2013|until|through|till)?\\s{0,3}(${aa.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s{0,3}(?:of)?\\s{0,3})(${_b.matchAnyPattern(Xp.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s{0,3})(${Zp.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`,"i"),zp=1,Kp=2,vb=3,Vp=4,Zo=class extends Tb.AbstractParserWithWordBoundaryChecking{innerPattern(){return bb}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=Xp.MONTH_DICTIONARY[t[vb].toLowerCase()],s=aa.parseOrdinalNumberPattern(t[zp]);if(s>31)return t.index=t.index+t[zp].length,null;if(n.start.assign("month",i),n.start.assign("day",s),t[Vp]){let a=Zp.parseYear(t[Vp]);n.start.assign("year",a)}else{let a=gb.findYearClosestToRef(e.refDate,s,i);n.start.imply("year",a)}if(t[Kp]){let a=aa.parseOrdinalNumberPattern(t[Kp]);n.end=n.start.clone(),n.end.assign("day",a)}return n}};Qo.default=Zo});var nh=p(eu=>{"use strict";Object.defineProperty(eu,"__esModule",{value:!0});var Eb=je(),th=Be(),oa=Be(),rh=Be(),wb=ie(),Rb=M(),Ob=new RegExp(`(${wb.matchAnyPattern(th.MONTH_DICTIONARY)})(?:-|/|\\s*,?\\s*)(${oa.ORDINAL_NUMBER_PATTERN})(?!\\s*(?:am|pm))\\s*(?:(?:to|\\-)\\s*(${oa.ORDINAL_NUMBER_PATTERN})\\s*)?(?:(?:-|/|\\s*,?\\s*)(${rh.YEAR_PATTERN}))?(?=\\W|$)(?!\\:\\d)`,"i"),Db=1,Mb=2,Jp=3,eh=4,Jo=class extends Rb.AbstractParserWithWordBoundaryChecking{innerPattern(){return Ob}innerExtract(e,t){let n=th.MONTH_DICTIONARY[t[Db].toLowerCase()],i=oa.parseOrdinalNumberPattern(t[Mb]);if(i>31)return null;let s=e.createParsingComponents({day:i,month:n});if(t[eh]){let u=rh.parseYear(t[eh]);s.assign("year",u)}else{let u=Eb.findYearClosestToRef(e.refDate,i,n);s.imply("year",u)}if(!t[Jp])return s;let a=oa.parseOrdinalNumberPattern(t[Jp]),o=e.createParsingResult(t.index,t[0]);return o.start=s,o.end=s.clone(),o.end.assign("day",a),o}};eu.default=Jo});var ah=p(nu=>{"use strict";Object.defineProperty(nu,"__esModule",{value:!0});var tu=Be(),Sb=je(),kb=ie(),sh=Be(),Pb=M(),Ab=new RegExp(`((?:in)\\s*)?(${kb.matchAnyPattern(tu.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${sh.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`,"i"),xb=1,Cb=2,ih=3,ru=class extends Pb.AbstractParserWithWordBoundaryChecking{innerPattern(){return Ab}innerExtract(e,t){let n=t[Cb].toLowerCase();if(t[0].length<=3&&!tu.FULL_MONTH_NAME_DICTIONARY[n])return null;let i=e.createParsingResult(t.index+(t[xb]||"").length,t.index+t[0].length);i.start.imply("day",1);let s=tu.MONTH_DICTIONARY[n];if(i.start.assign("month",s),t[ih]){let a=sh.parseYear(t[ih]);i.start.assign("year",a)}else{let a=Sb.findYearClosestToRef(e.refDate,1,s);i.start.imply("year",a)}return i}};nu.default=ru});var lh=p(su=>{"use strict";Object.defineProperty(su,"__esModule",{value:!0});var uh=Be(),Nb=ie(),Ib=M(),Fb=new RegExp(`([0-9]{4})[\\.\\/\\s](?:(${Nb.matchAnyPattern(uh.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]([0-9]{1,2})(?=\\W|$)`,"i"),Ub=1,Lb=2,oh=3,qb=4,iu=class extends Ib.AbstractParserWithWordBoundaryChecking{innerPattern(){return Fb}innerExtract(e,t){let n=t[oh]?parseInt(t[oh]):uh.MONTH_DICTIONARY[t[Lb].toLowerCase()];if(n<1||n>12)return null;let i=parseInt(t[Ub]);return{day:parseInt(t[qb]),month:n,year:i}}};su.default=iu});var ch=p(ou=>{"use strict";Object.defineProperty(ou,"__esModule",{value:!0});var Wb=M(),Yb=new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})","i"),$b=1,jb=2,au=class extends Wb.AbstractParserWithWordBoundaryChecking{innerPattern(){return Yb}innerExtract(e,t){let n=parseInt(t[jb]),i=parseInt(t[$b]);return e.createParsingComponents().imply("day",1).assign("month",i).assign("year",n)}};ou.default=au});var Kr=p(ca=>{"use strict";Object.defineProperty(ca,"__esModule",{value:!0});ca.AbstractTimeExpressionParser=void 0;var Je=ke();function Bb(r,e,t,n){return new RegExp(`${r}${e}(\\d{1,4})(?:(?:\\.|:|\uFF1A)(\\d{1,2})(?:(?::|\uFF1A)(\\d{2})(?:\\.(\\d{1,6}))?)?)?(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?${t}`,n)}function Gb(r,e){return new RegExp(`^(${r})(\\d{1,4})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:(?:\\.|\\:|\\\uFF1A)(\\d{1,2})(?:\\.(\\d{1,6}))?)?)?(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?${e}`,"i")}var dh=2,Pn=3,ua=4,la=5,Si=6,uu=class{constructor(e=!1){this.cachedPrimaryPrefix=null,this.cachedPrimarySuffix=null,this.cachedPrimaryTimePattern=null,this.cachedFollowingPhase=null,this.cachedFollowingSuffix=null,this.cachedFollowingTimePatten=null,this.strictMode=e}patternFlags(){return"i"}primaryPatternLeftBoundary(){return"(^|\\s|T|\\b)"}primarySuffix(){return"(?=\\W|$)"}followingSuffix(){return"(?=\\W|$)"}pattern(e){return this.getPrimaryTimePatternThroughCache()}extract(e,t){let n=this.extractPrimaryTimeComponents(e,t);if(!n)return t.index+=t[0].length,null;let i=t.index+t[1].length,s=t[0].substring(t[1].length),a=e.createParsingResult(i,s,n);t.index+=t[0].length;let o=e.text.substring(t.index),l=this.getFollowingTimePatternThroughCache().exec(o);return s.match(/^\d{3,4}/)&&l&&l[0].match(/^\s*([+-])\s*\d{2,4}$/)?null:!l||l[0].match(/^\s*([+-])\s*\d{3,4}$/)?this.checkAndReturnWithoutFollowingPattern(a):(a.end=this.extractFollowingTimeComponents(e,l,a),a.end&&(a.text+=l[0]),this.checkAndReturnWithFollowingPattern(a))}extractPrimaryTimeComponents(e,t,n=!1){let i=e.createParsingComponents(),s=0,a=null,o=parseInt(t[dh]);if(o>100){if(this.strictMode||t[Pn]!=null)return null;s=o%100,o=Math.floor(o/100)}if(o>24)return null;if(t[Pn]!=null){if(t[Pn].length==1&&!t[Si])return null;s=parseInt(t[Pn])}if(s>=60)return null;if(o>12&&(a=Je.Meridiem.PM),t[Si]!=null){if(o>12)return null;let u=t[Si][0].toLowerCase();u=="a"&&(a=Je.Meridiem.AM,o==12&&(o=0)),u=="p"&&(a=Je.Meridiem.PM,o!=12&&(o+=12))}if(i.assign("hour",o),i.assign("minute",s),a!==null?i.assign("meridiem",a):o<12?i.imply("meridiem",Je.Meridiem.AM):i.imply("meridiem",Je.Meridiem.PM),t[la]!=null){let u=parseInt(t[la].substring(0,3));if(u>=1e3)return null;i.assign("millisecond",u)}if(t[ua]!=null){let u=parseInt(t[ua]);if(u>=60)return null;i.assign("second",u)}return i}extractFollowingTimeComponents(e,t,n){let i=e.createParsingComponents();if(t[la]!=null){let u=parseInt(t[la].substring(0,3));if(u>=1e3)return null;i.assign("millisecond",u)}if(t[ua]!=null){let u=parseInt(t[ua]);if(u>=60)return null;i.assign("second",u)}let s=parseInt(t[dh]),a=0,o=-1;if(t[Pn]!=null?a=parseInt(t[Pn]):s>100&&(a=s%100,s=Math.floor(s/100)),a>=60||s>24)return null;if(s>=12&&(o=Je.Meridiem.PM),t[Si]!=null){if(s>12)return null;let u=t[Si][0].toLowerCase();u=="a"&&(o=Je.Meridiem.AM,s==12&&(s=0,i.isCertain("day")||i.imply("day",i.get("day")+1))),u=="p"&&(o=Je.Meridiem.PM,s!=12&&(s+=12)),n.start.isCertain("meridiem")||(o==Je.Meridiem.AM?(n.start.imply("meridiem",Je.Meridiem.AM),n.start.get("hour")==12&&n.start.assign("hour",0)):(n.start.imply("meridiem",Je.Meridiem.PM),n.start.get("hour")!=12&&n.start.assign("hour",n.start.get("hour")+12)))}return i.assign("hour",s),i.assign("minute",a),o>=0?i.assign("meridiem",o):n.start.isCertain("meridiem")&&n.start.get("hour")>12?n.start.get("hour")-12>s?i.imply("meridiem",Je.Meridiem.AM):s<=12&&(i.assign("hour",s+12),i.assign("meridiem",Je.Meridiem.PM)):s>12?i.imply("meridiem",Je.Meridiem.PM):s<=12&&i.imply("meridiem",Je.Meridiem.AM),i.date().getTime()24)return null}return e}checkAndReturnWithFollowingPattern(e){if(e.text.match(/^\d+-\d+$/))return null;let t=e.text.match(/[^\d:.](\d[\d.]+)\s*-\s*(\d[\d.]+)$/);if(t){if(this.strictMode)return null;let n=t[1],i=t[2];if(i.includes(".")&&!i.match(/\d(\.\d{2})+$/))return null;let s=parseInt(i),a=parseInt(n);if(s>24||a>24)return null}return e}getPrimaryTimePatternThroughCache(){let e=this.primaryPrefix(),t=this.primarySuffix();return this.cachedPrimaryPrefix===e&&this.cachedPrimarySuffix===t?this.cachedPrimaryTimePattern:(this.cachedPrimaryTimePattern=Bb(this.primaryPatternLeftBoundary(),e,t,this.patternFlags()),this.cachedPrimaryPrefix=e,this.cachedPrimarySuffix=t,this.cachedPrimaryTimePattern)}getFollowingTimePatternThroughCache(){let e=this.followingPhase(),t=this.followingSuffix();return this.cachedFollowingPhase===e&&this.cachedFollowingSuffix===t?this.cachedFollowingTimePatten:(this.cachedFollowingTimePatten=Gb(e,t),this.cachedFollowingPhase=e,this.cachedFollowingSuffix=t,this.cachedFollowingTimePatten)}};ca.AbstractTimeExpressionParser=uu});var fh=p(cu=>{"use strict";Object.defineProperty(cu,"__esModule",{value:!0});var da=ke(),Hb=Kr(),lu=class extends Hb.AbstractTimeExpressionParser{constructor(e){super(e)}followingPhase(){return"\\s*(?:\\-|\\\u2013|\\~|\\\u301C|to|\\?)\\s*"}primaryPrefix(){return"(?:(?:at|from)\\s*)??"}primarySuffix(){return"(?:\\s*(?:o\\W*clock|at\\s*night|in\\s*the\\s*(?:morning|afternoon)))?(?!/)(?=\\W|$)"}extractPrimaryTimeComponents(e,t){let n=super.extractPrimaryTimeComponents(e,t);if(n){if(t[0].endsWith("night")){let i=n.get("hour");i>=6&&i<12?(n.assign("hour",n.get("hour")+12),n.assign("meridiem",da.Meridiem.PM)):i<6&&n.assign("meridiem",da.Meridiem.AM)}if(t[0].endsWith("afternoon")){n.assign("meridiem",da.Meridiem.PM);let i=n.get("hour");i>=0&&i<=6&&n.assign("hour",n.get("hour")+12)}t[0].endsWith("morning")&&(n.assign("meridiem",da.Meridiem.AM),n.get("hour")<12&&n.assign("hour",n.get("hour")))}return n}};cu.default=lu});var Ot=p(An=>{"use strict";Object.defineProperty(An,"__esModule",{value:!0});An.addImpliedTimeUnits=An.reverseTimeUnits=void 0;function zb(r){let e={};for(let t in r)e[t]=-r[t];return e}An.reverseTimeUnits=zb;function Kb(r,e){let t=r.clone(),n=r.dayjs();for(let i in e)n=n.add(e[i],i);return("day"in e||"d"in e||"week"in e||"month"in e||"year"in e)&&(t.imply("day",n.date()),t.imply("month",n.month()+1),t.imply("year",n.year())),("second"in e||"minute"in e||"hour"in e)&&(t.imply("second",n.second()),t.imply("minute",n.minute()),t.imply("hour",n.hour())),t}An.addImpliedTimeUnits=Kb});var ph=p(pu=>{"use strict";Object.defineProperty(pu,"__esModule",{value:!0});var fu=Be(),Vb=be(),Xb=M(),Zb=Ot(),Qb=new RegExp(`(${fu.TIME_UNITS_PATTERN})\\s{0,5}(?:ago|before|earlier)(?=(?:\\W|$))`,"i"),Jb=new RegExp(`(${fu.TIME_UNITS_PATTERN})\\s{0,5}ago(?=(?:\\W|$))`,"i"),du=class extends Xb.AbstractParserWithWordBoundaryChecking{constructor(e){super(),this.strictMode=e}innerPattern(){return this.strictMode?Jb:Qb}innerExtract(e,t){let n=fu.parseTimeUnits(t[1]),i=Zb.reverseTimeUnits(n);return Vb.ParsingComponents.createRelativeFromReference(e.reference,i)}};pu.default=du});var hh=p(yu=>{"use strict";Object.defineProperty(yu,"__esModule",{value:!0});var mu=Be(),ev=be(),tv=M(),rv=new RegExp(`(${mu.TIME_UNITS_PATTERN})\\s{0,5}(?:later|after|from now|henceforth|forward|out)(?=(?:\\W|$))`,"i"),nv=new RegExp("("+mu.TIME_UNITS_PATTERN+")(later|from now)(?=(?:\\W|$))","i"),iv=1,hu=class extends tv.AbstractParserWithWordBoundaryChecking{constructor(e){super(),this.strictMode=e}innerPattern(){return this.strictMode?nv:rv}innerExtract(e,t){let n=mu.parseTimeUnits(t[iv]);return ev.ParsingComponents.createRelativeFromReference(e.reference,n)}};yu.default=hu});var Cn=p(xn=>{"use strict";Object.defineProperty(xn,"__esModule",{value:!0});xn.MergingRefiner=xn.Filter=void 0;var gu=class{refine(e,t){return t.filter(n=>this.isValid(e,n))}};xn.Filter=gu;var _u=class{refine(e,t){if(t.length<2)return t;let n=[],i=t[0],s=null;for(let a=1;a{console.log(`${this.constructor.name} merged ${u} and ${l} into ${c}`)}),i=c}}return i!=null&&n.push(i),n}};xn.MergingRefiner=_u});var Qt=p(bu=>{"use strict";Object.defineProperty(bu,"__esModule",{value:!0});var sv=Cn(),Tu=class extends sv.MergingRefiner{shouldMergeResults(e,t,n){return!t.end&&!n.end&&e.match(this.patternBetween())!=null}mergeResults(e,t,n){if(!t.start.isOnlyWeekdayComponent()&&!n.start.isOnlyWeekdayComponent()&&(n.start.getCertainComponents().forEach(s=>{t.start.isCertain(s)||t.start.assign(s,n.start.get(s))}),t.start.getCertainComponents().forEach(s=>{n.start.isCertain(s)||n.start.assign(s,t.start.get(s))})),t.start.date().getTime()>n.start.date().getTime()){let s=t.start.dayjs(),a=n.start.dayjs();t.start.isOnlyWeekdayComponent()&&s.add(-7,"days").isBefore(a)?(s=s.add(-7,"days"),t.start.imply("day",s.date()),t.start.imply("month",s.month()+1),t.start.imply("year",s.year())):n.start.isOnlyWeekdayComponent()&&a.add(7,"days").isAfter(s)?(a=a.add(7,"days"),n.start.imply("day",a.date()),n.start.imply("month",a.month()+1),n.start.imply("year",a.year())):[n,t]=[t,n]}let i=t.clone();return i.start=t.start,i.end=n.start,i.index=Math.min(t.index,n.index),t.index{"use strict";var av=ki&&ki.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ki,"__esModule",{value:!0});var ov=av(Qt()),vu=class extends ov.default{patternBetween(){return/^\s*(to|-)\s*$/i}};ki.default=vu});var yh=p(Nn=>{"use strict";Object.defineProperty(Nn,"__esModule",{value:!0});Nn.mergeDateTimeComponent=Nn.mergeDateTimeResult=void 0;var uv=ke();function lv(r,e){let t=r.clone(),n=r.start,i=e.start;if(t.start=Eu(n,i),r.end!=null||e.end!=null){let s=r.end==null?r.start:r.end,a=e.end==null?e.start:e.end,o=Eu(s,a);r.end==null&&o.date().getTime(){"use strict";Object.defineProperty(Ru,"__esModule",{value:!0});var cv=Cn(),gh=yh(),wu=class extends cv.MergingRefiner{shouldMergeResults(e,t,n){return(t.start.isOnlyDate()&&n.start.isOnlyTime()||n.start.isOnlyDate()&&t.start.isOnlyTime())&&e.match(this.patternBetween())!=null}mergeResults(e,t,n){let i=t.start.isOnlyDate()?gh.mergeDateTimeResult(t,n):gh.mergeDateTimeResult(n,t);return i.index=t.index,i.text=t.text+e+n.text,i}};Ru.default=wu});var _h=p(Pi=>{"use strict";var dv=Pi&&Pi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Pi,"__esModule",{value:!0});var fv=dv(or()),Ou=class extends fv.default{patternBetween(){return new RegExp("^\\s*(T|at|after|before|on|of|,|-)?\\s*$")}};Pi.default=Ou});var Th=p(Mu=>{"use strict";Object.defineProperty(Mu,"__esModule",{value:!0});var pv=new RegExp("^\\s*,?\\s*\\(?([A-Z]{2,4})\\)?(?=\\W|$)","i"),hv={ACDT:630,ACST:570,ADT:-180,AEDT:660,AEST:600,AFT:270,AKDT:-480,AKST:-540,ALMT:360,AMST:-180,AMT:-240,ANAST:720,ANAT:720,AQTT:300,ART:-180,AST:-240,AWDT:540,AWST:480,AZOST:0,AZOT:-60,AZST:300,AZT:240,BNT:480,BOT:-240,BRST:-120,BRT:-180,BST:60,BTT:360,CAST:480,CAT:120,CCT:390,CDT:-300,CEST:120,CET:60,CHADT:825,CHAST:765,CKT:-600,CLST:-180,CLT:-240,COT:-300,CST:-360,CVT:-60,CXT:420,ChST:600,DAVT:420,EASST:-300,EAST:-360,EAT:180,ECT:-300,EDT:-240,EEST:180,EET:120,EGST:0,EGT:-60,EST:-300,ET:-300,FJST:780,FJT:720,FKST:-180,FKT:-240,FNT:-120,GALT:-360,GAMT:-540,GET:240,GFT:-180,GILT:720,GMT:0,GST:240,GYT:-240,HAA:-180,HAC:-300,HADT:-540,HAE:-240,HAP:-420,HAR:-360,HAST:-600,HAT:-90,HAY:-480,HKT:480,HLV:-210,HNA:-240,HNC:-360,HNE:-300,HNP:-480,HNR:-420,HNT:-150,HNY:-540,HOVT:420,ICT:420,IDT:180,IOT:360,IRDT:270,IRKST:540,IRKT:540,IRST:210,IST:330,JST:540,KGT:360,KRAST:480,KRAT:480,KST:540,KUYT:240,LHDT:660,LHST:630,LINT:840,MAGST:720,MAGT:720,MART:-510,MAWT:300,MDT:-360,MESZ:120,MEZ:60,MHT:720,MMT:390,MSD:240,MSK:240,MST:-420,MUT:240,MVT:300,MYT:480,NCT:660,NDT:-90,NFT:690,NOVST:420,NOVT:360,NPT:345,NST:-150,NUT:-660,NZDT:780,NZST:720,OMSST:420,OMST:420,PDT:-420,PET:-300,PETST:720,PETT:720,PGT:600,PHOT:780,PHT:480,PKT:300,PMDT:-120,PMST:-180,PONT:660,PST:-480,PT:-480,PWT:540,PYST:-180,PYT:-240,RET:240,SAMT:240,SAST:120,SBT:660,SCT:240,SGT:480,SRT:-180,SST:-660,TAHT:-600,TFT:300,TJT:300,TKT:780,TLT:540,TMT:300,TVT:720,ULAT:480,UTC:0,UYST:-120,UYT:-180,UZT:300,VET:-210,VLAST:660,VLAT:660,VUT:660,WAST:120,WAT:60,WEST:60,WESZ:60,WET:0,WEZ:0,WFT:720,WGST:-120,WGT:-180,WIB:420,WIT:540,WITA:480,WST:780,WT:0,YAKST:600,YAKT:600,YAPT:600,YEKST:360,YEKT:360},Du=class{constructor(e){this.timezone=Object.assign(Object.assign({},hv),e)}refine(e,t){var n;let i=(n=e.option.timezones)!==null&&n!==void 0?n:{};return t.forEach(s=>{var a,o;let u=e.text.substring(s.index+s.text.length),l=pv.exec(u);if(!l)return;let c=l[1].toUpperCase(),d=(o=(a=i[c])!==null&&a!==void 0?a:this.timezone[c])!==null&&o!==void 0?o:null;if(d===null)return;e.debug(()=>{console.log(`Extracting timezone: '${c}' into: ${d} for: ${s.start}`)});let f=s.start.get("timezoneOffset");f!==null&&d!=f&&(s.start.isCertain("timezoneOffset")||c!=l[1])||s.start.isOnlyDate()&&c!=l[1]||(s.text+=l[0],s.start.isCertain("timezoneOffset")||s.start.assign("timezoneOffset",d),s.end!=null&&!s.end.isCertain("timezoneOffset")&&s.end.assign("timezoneOffset",d))}),t}};Mu.default=Du});var fa=p(ku=>{"use strict";Object.defineProperty(ku,"__esModule",{value:!0});var mv=new RegExp("^\\s*(?:\\(?(?:GMT|UTC)\\s?)?([+-])(\\d{1,2})(?::?(\\d{2}))?\\)?","i"),yv=1,gv=2,_v=3,Su=class{refine(e,t){return t.forEach(function(n){if(n.start.isCertain("timezoneOffset"))return;let i=e.text.substring(n.index+n.text.length),s=mv.exec(i);if(!s)return;e.debug(()=>{console.log(`Extracting timezone: '${s[0]}' into : ${n}`)});let a=parseInt(s[gv]),o=parseInt(s[_v]||"0"),u=a*60+o;u>14*60||(s[yv]==="-"&&(u=-u),n.end!=null&&n.end.assign("timezoneOffset",u),n.start.assign("timezoneOffset",u),n.text+=s[0])}),t}};ku.default=Su});var bh=p(Au=>{"use strict";Object.defineProperty(Au,"__esModule",{value:!0});var Pu=class{refine(e,t){if(t.length<2)return t;let n=[],i=t[0];for(let s=1;si.text.length&&(i=a):(n.push(i),i=a)}return i!=null&&n.push(i),n}};Au.default=Pu});var vh=p(Ai=>{"use strict";var Tv=Ai&&Ai.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ai,"__esModule",{value:!0});var bv=Tv(ee()),xu=class{refine(e,t){return e.option.forwardDate&&t.forEach(function(n){let i=bv.default(e.refDate);if(n.start.isOnlyDayMonthComponent()&&i.isAfter(n.start.dayjs()))for(let s=0;s<3&&i.isAfter(n.start.dayjs());s++)n.start.imply("year",n.start.get("year")+1),e.debug(()=>{console.log(`Forward yearly adjusted for ${n} (${n.start})`)}),n.end&&!n.end.isCertain("year")&&(n.end.imply("year",n.end.get("year")+1),e.debug(()=>{console.log(`Forward yearly adjusted for ${n} (${n.end})`)}));n.start.isOnlyWeekdayComponent()&&i.isAfter(n.start.dayjs())&&(i.day()>=n.start.get("weekday")?i=i.day(n.start.get("weekday")+7):i=i.day(n.start.get("weekday")),n.start.imply("day",i.date()),n.start.imply("month",i.month()+1),n.start.imply("year",i.year()),e.debug(()=>{console.log(`Forward weekly adjusted for ${n} (${n.start})`)}),n.end&&n.end.isOnlyWeekdayComponent()&&(i.day()>n.end.get("weekday")?i=i.day(n.end.get("weekday")+7):i=i.day(n.end.get("weekday")),n.end.imply("day",i.date()),n.end.imply("month",i.month()+1),n.end.imply("year",i.year()),e.debug(()=>{console.log(`Forward weekly adjusted for ${n} (${n.end})`)})))}),t}};Ai.default=xu});var Eh=p(Nu=>{"use strict";Object.defineProperty(Nu,"__esModule",{value:!0});var vv=Cn(),Cu=class extends vv.Filter{constructor(e){super(),this.strictMode=e}isValid(e,t){return t.text.replace(" ","").match(/^\d*(\.\d*)?$/)?(e.debug(()=>{console.log(`Removing unlikely result '${t.text}'`)}),!1):t.start.isValidDate()?t.end&&!t.end.isValidDate()?(e.debug(()=>{console.log(`Removing invalid result: ${t} (${t.end})`)}),!1):this.strictMode?this.isStrictModeValid(e,t):!0:(e.debug(()=>{console.log(`Removing invalid result: ${t} (${t.start})`)}),!1)}isStrictModeValid(e,t){return t.start.isOnlyWeekdayComponent()?(e.debug(()=>{console.log(`(Strict) Removing weekday only component: ${t} (${t.end})`)}),!1):t.start.isOnlyTime()&&(!t.start.isCertain("hour")||!t.start.isCertain("minute"))?(e.debug(()=>{console.log(`(Strict) Removing uncertain time component: ${t} (${t.end})`)}),!1):!0}};Nu.default=Cu});var Uu=p(Fu=>{"use strict";Object.defineProperty(Fu,"__esModule",{value:!0});var Ev=M(),wv=new RegExp("([0-9]{4})\\-([0-9]{1,2})\\-([0-9]{1,2})(?:T([0-9]{1,2}):([0-9]{1,2})(?::([0-9]{1,2})(?:\\.(\\d{1,4}))?)?(?:Z|([+-]\\d{2}):?(\\d{2})?)?)?(?=\\W|$)","i"),Rv=1,Ov=2,Dv=3,wh=4,Mv=5,Rh=6,Oh=7,Dh=8,Mh=9,Iu=class extends Ev.AbstractParserWithWordBoundaryChecking{innerPattern(){return wv}innerExtract(e,t){let n={};if(n.year=parseInt(t[Rv]),n.month=parseInt(t[Ov]),n.day=parseInt(t[Dv]),t[wh]!=null)if(n.hour=parseInt(t[wh]),n.minute=parseInt(t[Mv]),t[Rh]!=null&&(n.second=parseInt(t[Rh])),t[Oh]!=null&&(n.millisecond=parseInt(t[Oh])),t[Dh]==null)n.timezoneOffset=0;else{let i=parseInt(t[Dh]),s=0;t[Mh]!=null&&(s=parseInt(t[Mh]));let a=i*60;a<0?a-=s:a+=s,n.timezoneOffset=a}return n}};Fu.default=Iu});var Sh=p(qu=>{"use strict";Object.defineProperty(qu,"__esModule",{value:!0});var Sv=Cn(),Lu=class extends Sv.MergingRefiner{mergeResults(e,t,n){let i=n.clone();return i.index=t.index,i.text=t.text+e+i.text,i.start.assign("weekday",t.start.get("weekday")),i.end&&i.end.assign("weekday",t.start.get("weekday")),i}shouldMergeResults(e,t,n){return t.start.isOnlyWeekdayComponent()&&!t.start.isCertain("hour")&&n.start.isCertain("day")&&e.match(/^,?\s*$/)!=null}};qu.default=Lu});var ur=p(In=>{"use strict";var Vr=In&&In.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(In,"__esModule",{value:!0});In.includeCommonConfiguration=void 0;var kv=Vr(Th()),Pv=Vr(fa()),kh=Vr(bh()),Av=Vr(vh()),xv=Vr(Eh()),Cv=Vr(Uu()),Nv=Vr(Sh());function Iv(r,e=!1){return r.parsers.unshift(new Cv.default),r.refiners.unshift(new Nv.default),r.refiners.unshift(new kv.default),r.refiners.unshift(new Pv.default),r.refiners.unshift(new kh.default),r.refiners.push(new kh.default),r.refiners.push(new Av.default),r.refiners.push(new xv.default(e)),r}In.includeCommonConfiguration=Iv});var cr=p(ne=>{"use strict";var Fv=ne&&ne.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ne,"__esModule",{value:!0});ne.noon=ne.morning=ne.midnight=ne.yesterdayEvening=ne.evening=ne.lastNight=ne.tonight=ne.theDayAfter=ne.tomorrow=ne.theDayBefore=ne.yesterday=ne.today=ne.now=void 0;var Jt=be(),Fn=Fv(ee()),lr=Rt(),xi=ke();function Uv(r){let e=Fn.default(r.instant),t=new Jt.ParsingComponents(r,{});return lr.assignSimilarDate(t,e),lr.assignSimilarTime(t,e),r.timezoneOffset!==null&&t.assign("timezoneOffset",e.utcOffset()),t}ne.now=Uv;function Lv(r){let e=Fn.default(r.instant),t=new Jt.ParsingComponents(r,{});return lr.assignSimilarDate(t,e),lr.implySimilarTime(t,e),t}ne.today=Lv;function qv(r){return Ph(r,1)}ne.yesterday=qv;function Ph(r,e){return Wu(r,-e)}ne.theDayBefore=Ph;function Wv(r){return Wu(r,1)}ne.tomorrow=Wv;function Wu(r,e){let t=Fn.default(r.instant),n=new Jt.ParsingComponents(r,{});return t=t.add(e,"day"),lr.assignSimilarDate(n,t),lr.implySimilarTime(n,t),n}ne.theDayAfter=Wu;function Yv(r,e=22){let t=Fn.default(r.instant),n=new Jt.ParsingComponents(r,{});return n.imply("hour",e),n.imply("meridiem",xi.Meridiem.PM),lr.assignSimilarDate(n,t),n}ne.tonight=Yv;function $v(r,e=0){let t=Fn.default(r.instant),n=new Jt.ParsingComponents(r,{});return t.hour()<6&&(t=t.add(-1,"day")),lr.assignSimilarDate(n,t),n.imply("hour",e),n}ne.lastNight=$v;function jv(r,e=20){let t=new Jt.ParsingComponents(r,{});return t.imply("meridiem",xi.Meridiem.PM),t.imply("hour",e),t}ne.evening=jv;function Bv(r,e=20){let t=Fn.default(r.instant),n=new Jt.ParsingComponents(r,{});return t=t.add(-1,"day"),lr.assignSimilarDate(n,t),n.imply("hour",e),n.imply("meridiem",xi.Meridiem.PM),n}ne.yesterdayEvening=Bv;function Gv(r){let e=new Jt.ParsingComponents(r,{});return e.imply("hour",0),e.imply("minute",0),e.imply("second",0),e}ne.midnight=Gv;function Hv(r,e=6){let t=new Jt.ParsingComponents(r,{});return t.imply("meridiem",xi.Meridiem.AM),t.imply("hour",e),t}ne.morning=Hv;function zv(r){let e=new Jt.ParsingComponents(r,{});return e.imply("meridiem",xi.Meridiem.AM),e.imply("hour",12),e}ne.noon=zv});var Ah=p(Nt=>{"use strict";var Kv=Nt&&Nt.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),Vv=Nt&&Nt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),Xv=Nt&&Nt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&Kv(e,r,t);return Vv(e,r),e},Zv=Nt&&Nt.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Nt,"__esModule",{value:!0});var Qv=Zv(ee()),Jv=M(),eE=Rt(),Ci=Xv(cr()),tE=/(now|today|tonight|tomorrow|tmr|tmrw|yesterday|last\s*night)(?=\W|$)/i,Yu=class extends Jv.AbstractParserWithWordBoundaryChecking{innerPattern(e){return tE}innerExtract(e,t){let n=Qv.default(e.refDate),i=t[0].toLowerCase(),s=e.createParsingComponents();switch(i){case"now":return Ci.now(e.reference);case"today":return Ci.today(e.reference);case"yesterday":return Ci.yesterday(e.reference);case"tomorrow":case"tmr":case"tmrw":return Ci.tomorrow(e.reference);case"tonight":return Ci.tonight(e.reference);default:i.match(/last\s*night/)&&(n.hour()>6&&(n=n.add(-1,"day")),eE.assignSimilarDate(s,n),s.imply("hour",0));break}return s}};Nt.default=Yu});var xh=p(Ni=>{"use strict";var rE=Ni&&Ni.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ni,"__esModule",{value:!0});var pa=ke(),nE=M(),iE=rE(ee()),sE=Rt(),aE=/(?:this)?\s{0,3}(morning|afternoon|evening|night|midnight|noon)(?=\W|$)/i,$u=class extends nE.AbstractParserWithWordBoundaryChecking{innerPattern(){return aE}innerExtract(e,t){let n=iE.default(e.refDate),i=e.createParsingComponents();switch(t[1].toLowerCase()){case"afternoon":i.imply("meridiem",pa.Meridiem.PM),i.imply("hour",15);break;case"evening":case"night":i.imply("meridiem",pa.Meridiem.PM),i.imply("hour",20);break;case"midnight":sE.assignTheNextDay(i,n),i.imply("hour",0),i.imply("minute",0),i.imply("second",0);break;case"morning":i.imply("meridiem",pa.Meridiem.AM),i.imply("hour",6);break;case"noon":i.imply("meridiem",pa.Meridiem.AM),i.imply("hour",12);break}return i}};Ni.default=$u});var Xr=p(Cr=>{"use strict";var oE=Cr&&Cr.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Cr,"__esModule",{value:!0});Cr.toDayJSClosestWeekday=Cr.toDayJSWeekday=void 0;var Ch=oE(ee());function uE(r,e,t){if(!t)return Nh(r,e);let n=Ch.default(r);switch(t){case"this":n=n.day(e);break;case"next":n=n.day(e+7);break;case"last":n=n.day(e-7);break}return n}Cr.toDayJSWeekday=uE;function Nh(r,e){let t=Ch.default(r),n=t.day();return Math.abs(e-7-n){"use strict";Object.defineProperty(Bu,"__esModule",{value:!0});var Ih=Be(),lE=ie(),cE=M(),dE=Xr(),fE=new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:on\\s*?)?(?:(this|last|past|next)\\s*)?(${lE.matchAnyPattern(Ih.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(this|last|past|next)\\s*week)?(?=\\W|$)`,"i"),pE=1,hE=2,mE=3,ju=class extends cE.AbstractParserWithWordBoundaryChecking{innerPattern(){return fE}innerExtract(e,t){let n=t[hE].toLowerCase(),i=Ih.WEEKDAY_DICTIONARY[n],s=t[pE],a=t[mE],o=s||a;o=o||"",o=o.toLowerCase();let u=null;o=="last"||o=="past"?u="last":o=="next"?u="next":o=="this"&&(u="this");let l=dE.toDayJSWeekday(e.refDate,i,u);return e.createParsingComponents().assign("weekday",i).imply("day",l.date()).imply("month",l.month()+1).imply("year",l.year())}};Bu.default=ju});var qh=p(Ii=>{"use strict";var yE=Ii&&Ii.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ii,"__esModule",{value:!0});var Lh=Be(),Uh=be(),gE=yE(ee()),_E=M(),TE=ie(),bE=new RegExp(`(this|last|past|next|after\\s*this)\\s*(${TE.matchAnyPattern(Lh.TIME_UNIT_DICTIONARY)})(?=\\s*)(?=\\W|$)`,"i"),vE=1,EE=2,Gu=class extends _E.AbstractParserWithWordBoundaryChecking{innerPattern(){return bE}innerExtract(e,t){let n=t[vE].toLowerCase(),i=t[EE].toLowerCase(),s=Lh.TIME_UNIT_DICTIONARY[i];if(n=="next"||n.startsWith("after")){let u={};return u[s]=1,Uh.ParsingComponents.createRelativeFromReference(e.reference,u)}if(n=="last"||n=="past"){let u={};return u[s]=-1,Uh.ParsingComponents.createRelativeFromReference(e.reference,u)}let a=e.createParsingComponents(),o=gE.default(e.reference.instant);return i.match(/week/i)?(o=o.add(-o.get("d"),"d"),a.imply("day",o.date()),a.imply("month",o.month()+1),a.imply("year",o.year())):i.match(/month/i)?(o=o.add(-o.date()+1,"d"),a.imply("day",o.date()),a.assign("year",o.year()),a.assign("month",o.month()+1)):i.match(/year/i)&&(o=o.add(-o.date()+1,"d"),o=o.add(-o.month(),"month"),a.imply("day",o.date()),a.imply("month",o.month()+1),a.assign("year",o.year())),a}};Ii.default=Gu});var It=p(qn=>{"use strict";Object.defineProperty(qn,"__esModule",{value:!0});qn.ParsingContext=qn.Chrono=void 0;var Un=be(),wE=Hu(),Ln=class{constructor(e){e=e||wE.createCasualConfiguration(),this.parsers=[...e.parsers],this.refiners=[...e.refiners]}clone(){return new Ln({parsers:[...this.parsers],refiners:[...this.refiners]})}parseDate(e,t,n){let i=this.parse(e,t,n);return i.length>0?i[0].start.date():null}parse(e,t,n){let i=new ha(e,t,n),s=[];return this.parsers.forEach(a=>{let o=Ln.executeParser(i,a);s=s.concat(o)}),s.sort((a,o)=>a.index-o.index),this.refiners.forEach(function(a){s=a.refine(i,s)}),s}static executeParser(e,t){let n=[],i=t.pattern(e),s=e.text,a=e.text,o=i.exec(a);for(;o;){let u=o.index+s.length-a.length;o.index=u;let l=t.extract(e,o);if(!l){a=s.substring(o.index+1),o=i.exec(a);continue}let c=null;l instanceof Un.ParsingResult?c=l:l instanceof Un.ParsingComponents?(c=e.createParsingResult(o.index,o[0]),c.start=l):c=e.createParsingResult(o.index,o[0],l),e.debug(()=>console.log(`${t.constructor.name} extracted result ${c}`)),n.push(c),a=s.substring(u+c.text.length),o=i.exec(a)}return n}};qn.Chrono=Ln;var ha=class{constructor(e,t,n){this.text=e,this.reference=new Un.ReferenceWithTimezone(t),this.option=n!=null?n:{},this.refDate=this.reference.instant}createParsingComponents(e){return e instanceof Un.ParsingComponents?e:new Un.ParsingComponents(this.reference,e)}createParsingResult(e,t,n,i){let s=typeof t=="string"?t:this.text.substring(e,t),a=n?this.createParsingComponents(n):null,o=i?this.createParsingComponents(i):null;return new Un.ParsingResult(this.reference,e,s,a,o)}debug(e){this.option.debug&&(this.option.debug instanceof Function?this.option.debug(e):this.option.debug.debug(e))}};qn.ParsingContext=ha});var Zr=p(Vu=>{"use strict";Object.defineProperty(Vu,"__esModule",{value:!0});var Wh=je(),RE=new RegExp("([^\\d]|^)([0-3]{0,1}[0-9]{1})[\\/\\.\\-]([0-3]{0,1}[0-9]{1})(?:[\\/\\.\\-]([0-9]{4}|[0-9]{2}))?(\\W|$)","i"),ma=1,Yh=5,$h=2,jh=3,zu=4,Ku=class{constructor(e){this.groupNumberMonth=e?jh:$h,this.groupNumberDay=e?$h:jh}pattern(){return RE}extract(e,t){if(t[ma]=="/"||t[Yh]=="/"){t.index+=t[0].length;return}let n=t.index+t[ma].length,i=t[0].substr(t[ma].length,t[0].length-t[ma].length-t[Yh].length);if(i.match(/^\d\.\d$/)||i.match(/^\d\.\d{1,2}\.\d{1,2}\s*$/)||!t[zu]&&t[0].indexOf("/")<0)return;let s=e.createParsingResult(n,i),a=parseInt(t[this.groupNumberMonth]),o=parseInt(t[this.groupNumberDay]);if((a<1||a>12)&&a>12)if(o>=1&&o<=12&&a<=31)[o,a]=[a,o];else return null;if(o<1||o>31)return null;if(s.start.assign("day",o),s.start.assign("month",a),t[zu]){let u=parseInt(t[zu]),l=Wh.findMostLikelyADYear(u);s.start.assign("year",l)}else{let u=Wh.findYearClosestToRef(e.refDate,o,a);s.start.imply("year",u)}return s}};Vu.default=Ku});var Gh=p(Zu=>{"use strict";Object.defineProperty(Zu,"__esModule",{value:!0});var Bh=Be(),OE=be(),DE=M(),ME=Ot(),SE=new RegExp(`(this|last|past|next|after|\\+|-)\\s*(${Bh.TIME_UNITS_PATTERN})(?=\\W|$)`,"i"),Xu=class extends DE.AbstractParserWithWordBoundaryChecking{innerPattern(){return SE}innerExtract(e,t){let n=t[1].toLowerCase(),i=Bh.parseTimeUnits(t[2]);switch(n){case"last":case"past":case"-":i=ME.reverseTimeUnits(i);break}return OE.ParsingComponents.createRelativeFromReference(e.reference,i)}};Zu.default=Xu});var zh=p(el=>{"use strict";Object.defineProperty(el,"__esModule",{value:!0});var kE=Cn(),Qu=be(),PE=Be(),AE=Ot();function Hh(r){return r.text.match(/\s+(before|from)$/i)!=null}function xE(r){return r.text.match(/\s+(after|since)$/i)!=null}var Ju=class extends kE.MergingRefiner{patternBetween(){return/^\s*$/i}shouldMergeResults(e,t,n){return!e.match(this.patternBetween())||!Hh(t)&&!xE(t)?!1:!!n.start.get("day")&&!!n.start.get("month")&&!!n.start.get("year")}mergeResults(e,t,n){let i=PE.parseTimeUnits(t.text);Hh(t)&&(i=AE.reverseTimeUnits(i));let s=Qu.ParsingComponents.createRelativeFromReference(new Qu.ReferenceWithTimezone(n.start.date()),i);return new Qu.ParsingResult(n.reference,t.index,`${t.text}${e}${n.text}`,s)}};el.default=Ju});var Hu=p(Oe=>{"use strict";var Ce=Oe&&Oe.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Oe,"__esModule",{value:!0});Oe.createConfiguration=Oe.createCasualConfiguration=Oe.parseDate=Oe.parse=Oe.GB=Oe.strict=Oe.casual=void 0;var CE=Ce(Hp()),NE=Ce(Qp()),IE=Ce(nh()),FE=Ce(ah()),UE=Ce(lh()),LE=Ce(ch()),qE=Ce(fh()),WE=Ce(ph()),YE=Ce(hh()),$E=Ce(mh()),jE=Ce(_h()),BE=ur(),GE=Ce(Ah()),HE=Ce(xh()),zE=Ce(Fh()),KE=Ce(qh()),tl=It(),VE=Ce(Zr()),XE=Ce(Gh()),ZE=Ce(zh());Oe.casual=new tl.Chrono(Kh(!1));Oe.strict=new tl.Chrono(ya(!0,!1));Oe.GB=new tl.Chrono(ya(!1,!0));function QE(r,e,t){return Oe.casual.parse(r,e,t)}Oe.parse=QE;function JE(r,e,t){return Oe.casual.parseDate(r,e,t)}Oe.parseDate=JE;function Kh(r=!1){let e=ya(!1,r);return e.parsers.unshift(new GE.default),e.parsers.unshift(new HE.default),e.parsers.unshift(new FE.default),e.parsers.unshift(new KE.default),e.parsers.unshift(new XE.default),e}Oe.createCasualConfiguration=Kh;function ya(r=!0,e=!1){return BE.includeCommonConfiguration({parsers:[new VE.default(e),new CE.default,new NE.default,new IE.default,new zE.default,new UE.default,new LE.default,new qE.default(r),new WE.default(r),new YE.default(r)],refiners:[new ZE.default,new jE.default,new $E.default]},r)}Oe.createConfiguration=ya});var Vh=p(nl=>{"use strict";Object.defineProperty(nl,"__esModule",{value:!0});var e1=Kr(),rl=class extends e1.AbstractTimeExpressionParser{primaryPrefix(){return"(?:(?:um|von)\\s*)?"}followingPhase(){return"\\s*(?:\\-|\\\u2013|\\~|\\\u301C|bis)\\s*"}extractPrimaryTimeComponents(e,t){return t[0].match(/^\s*\d{4}\s*$/)?null:super.extractPrimaryTimeComponents(e,t)}};nl.default=rl});var Fi=p(ae=>{"use strict";Object.defineProperty(ae,"__esModule",{value:!0});ae.parseTimeUnits=ae.TIME_UNITS_PATTERN=ae.parseYear=ae.YEAR_PATTERN=ae.parseNumberPattern=ae.NUMBER_PATTERN=ae.TIME_UNIT_DICTIONARY=ae.INTEGER_WORD_DICTIONARY=ae.MONTH_DICTIONARY=ae.WEEKDAY_DICTIONARY=void 0;var il=ie(),t1=je();ae.WEEKDAY_DICTIONARY={sonntag:0,so:0,montag:1,mo:1,dienstag:2,di:2,mittwoch:3,mi:3,donnerstag:4,do:4,freitag:5,fr:5,samstag:6,sa:6};ae.MONTH_DICTIONARY={januar:1,j\u00E4nner:1,janner:1,jan:1,"jan.":1,februar:2,feber:2,feb:2,"feb.":2,m\u00E4rz:3,maerz:3,m\u00E4r:3,"m\xE4r.":3,mrz:3,"mrz.":3,april:4,apr:4,"apr.":4,mai:5,juni:6,jun:6,"jun.":6,juli:7,jul:7,"jul.":7,august:8,aug:8,"aug.":8,september:9,sep:9,"sep.":9,sept:9,"sept.":9,oktober:10,okt:10,"okt.":10,november:11,nov:11,"nov.":11,dezember:12,dez:12,"dez.":12};ae.INTEGER_WORD_DICTIONARY={eins:1,eine:1,einem:1,einen:1,einer:1,zwei:2,drei:3,vier:4,f\u00FCnf:5,fuenf:5,sechs:6,sieben:7,acht:8,neun:9,zehn:10,elf:11,zw\u00F6lf:12,zwoelf:12};ae.TIME_UNIT_DICTIONARY={sek:"second",sekunde:"second",sekunden:"second",min:"minute",minute:"minute",minuten:"minute",h:"hour",std:"hour",stunde:"hour",stunden:"hour",tag:"d",tage:"d",tagen:"d",woche:"week",wochen:"week",monat:"month",monate:"month",monaten:"month",monats:"month",quartal:"quarter",quartals:"quarter",quartale:"quarter",quartalen:"quarter",a:"year",j:"year",jr:"year",jahr:"year",jahre:"year",jahren:"year",jahres:"year"};ae.NUMBER_PATTERN=`(?:${il.matchAnyPattern(ae.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?\\b(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`;function Zh(r){let e=r.toLowerCase();return ae.INTEGER_WORD_DICTIONARY[e]!==void 0?ae.INTEGER_WORD_DICTIONARY[e]:e==="a"||e==="an"?1:e.match(/few/)?3:e.match(/half/)?.5:e.match(/couple/)?2:e.match(/several/)?7:parseFloat(e)}ae.parseNumberPattern=Zh;ae.YEAR_PATTERN="(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*(?:C(?:hr)?|(?:u\\.?|d\\.?(?:\\s*g\\.?)?)?\\s*Z)\\.?|\\s*(?:u\\.?|d\\.?(?:\\s*g\\.)?)\\s*Z\\.?)?)";function r1(r){if(/v/i.test(r))return-parseInt(r.replace(/[^0-9]+/gi,""));if(/n/i.test(r))return parseInt(r.replace(/[^0-9]+/gi,""));if(/z/i.test(r))return parseInt(r.replace(/[^0-9]+/gi,""));let e=parseInt(r);return t1.findMostLikelyADYear(e)}ae.parseYear=r1;var Qh=`(${ae.NUMBER_PATTERN})\\s{0,5}(${il.matchAnyPattern(ae.TIME_UNIT_DICTIONARY)})\\s{0,5}`,Xh=new RegExp(Qh,"i");ae.TIME_UNITS_PATTERN=il.repeatedTimeunitPattern("",Qh);function n1(r){let e={},t=r,n=Xh.exec(t);for(;n;)i1(e,n),t=t.substring(n[0].length),n=Xh.exec(t);return e}ae.parseTimeUnits=n1;function i1(r,e){let t=Zh(e[1]),n=ae.TIME_UNIT_DICTIONARY[e[2].toLowerCase()];r[n]=t}});var em=p(al=>{"use strict";Object.defineProperty(al,"__esModule",{value:!0});var Jh=Fi(),s1=ie(),a1=M(),o1=Xr(),u1=new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:a[mn]\\s*?)?(?:(diese[mn]|letzte[mn]|n(?:\xE4|ae)chste[mn])\\s*)?(${s1.matchAnyPattern(Jh.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(diese|letzte|n(?:\xE4|ae)chste)\\s*woche)?(?=\\W|$)`,"i"),l1=1,c1=3,d1=2,sl=class extends a1.AbstractParserWithWordBoundaryChecking{innerPattern(){return u1}innerExtract(e,t){let n=t[d1].toLowerCase(),i=Jh.WEEKDAY_DICTIONARY[n],s=t[l1],a=t[c1],o=s||a;o=o||"",o=o.toLowerCase();let u=null;o.match(/letzte/)?u="last":o.match(/chste/)?u="next":o.match(/diese/)&&(u="this");let l=o1.toDayJSWeekday(e.refDate,i,u);return e.createParsingComponents().assign("weekday",i).imply("day",l.date()).imply("month",l.month()+1).imply("year",l.year())}};al.default=sl});var im=p(ol=>{"use strict";Object.defineProperty(ol,"__esModule",{value:!0});var Nr=ke(),f1=new RegExp("(^|\\s|T)(?:(?:um|von)\\s*)?(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s)?)?(?:\\s*Uhr)?(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?(?=\\W|$)","i"),p1=new RegExp("^\\s*(\\-|\\\u2013|\\~|\\\u301C|bis(?:\\s+um)?|\\?)\\s*(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s)?)?(?:\\s*Uhr)?(?:\\s*(morgens|vormittags|nachmittags|abends|nachts|am\\s+(?:Morgen|Vormittag|Nachmittag|Abend)|in\\s+der\\s+Nacht))?(?=\\W|$)","i"),h1=2,tm=3,rm=4,nm=5,Wn=class{pattern(e){return f1}extract(e,t){let n=e.createParsingResult(t.index+t[1].length,t[0].substring(t[1].length));if(n.text.match(/^\d{4}$/)||(n.start=Wn.extractTimeComponent(n.start.clone(),t),!n.start))return t.index+=t[0].length,null;let i=e.text.substring(t.index+t[0].length),s=p1.exec(i);return s&&(n.end=Wn.extractTimeComponent(n.start.clone(),s),n.end&&(n.text+=s[0])),n}static extractTimeComponent(e,t){let n=0,i=0,s=null;if(n=parseInt(t[h1]),t[tm]!=null&&(i=parseInt(t[tm])),i>=60||n>24)return null;if(n>=12&&(s=Nr.Meridiem.PM),t[nm]!=null){if(n>12)return null;let a=t[nm].toLowerCase();a.match(/morgen|vormittag/)&&(s=Nr.Meridiem.AM,n==12&&(n=0)),a.match(/nachmittag|abend/)&&(s=Nr.Meridiem.PM,n!=12&&(n+=12)),a.match(/nacht/)&&(n==12?(s=Nr.Meridiem.AM,n=0):n<6?s=Nr.Meridiem.AM:(s=Nr.Meridiem.PM,n+=12))}if(e.assign("hour",n),e.assign("minute",i),s!==null?e.assign("meridiem",s):n<12?e.imply("meridiem",Nr.Meridiem.AM):e.imply("meridiem",Nr.Meridiem.PM),t[rm]!=null){let a=parseInt(t[rm]);if(a>=60)return null;e.assign("second",a)}return e}};ol.default=Wn});var sm=p(Ui=>{"use strict";var m1=Ui&&Ui.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ui,"__esModule",{value:!0});var y1=m1(Qt()),ul=class extends y1.default{patternBetween(){return/^\s*(bis(?:\s*(?:am|zum))?|-)\s*$/i}};Ui.default=ul});var am=p(Li=>{"use strict";var g1=Li&&Li.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Li,"__esModule",{value:!0});var _1=g1(or()),ll=class extends _1.default{patternBetween(){return new RegExp("^\\s*(T|um|am|,|-)?\\s*$")}};Li.default=ll});var cl=p(Wi=>{"use strict";var T1=Wi&&Wi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Wi,"__esModule",{value:!0});var b1=T1(ee()),Qr=ke(),v1=M(),E1=Rt(),w1=Ot(),qi=class extends v1.AbstractParserWithWordBoundaryChecking{innerPattern(e){return/(diesen)?\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht)(?=\W|$)/i}innerExtract(e,t){let n=b1.default(e.refDate),i=t[2].toLowerCase(),s=e.createParsingComponents();return E1.implySimilarTime(s,n),qi.extractTimeComponents(s,i)}static extractTimeComponents(e,t){switch(t){case"morgen":e.imply("hour",6),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.AM);break;case"vormittag":e.imply("hour",9),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.AM);break;case"mittag":case"mittags":e.imply("hour",12),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.AM);break;case"nachmittag":e.imply("hour",15),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.PM);break;case"abend":e.imply("hour",18),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.PM);break;case"nacht":e.imply("hour",22),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.PM);break;case"mitternacht":e.get("hour")>1&&(e=w1.addImpliedTimeUnits(e,{day:1})),e.imply("hour",0),e.imply("minute",0),e.imply("second",0),e.imply("meridiem",Qr.Meridiem.AM);break}return e}};Wi.default=qi});var lm=p(Ft=>{"use strict";var R1=Ft&&Ft.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),O1=Ft&&Ft.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),D1=Ft&&Ft.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&R1(e,r,t);return O1(e,r),e},um=Ft&&Ft.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ft,"__esModule",{value:!0});var M1=um(ee()),S1=M(),Jr=Rt(),k1=um(cl()),om=D1(cr()),P1=new RegExp("(jetzt|heute|morgen|\xFCbermorgen|uebermorgen|gestern|vorgestern|letzte\\s*nacht)(?:\\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht))?(?=\\W|$)","i"),A1=1,x1=2,dl=class extends S1.AbstractParserWithWordBoundaryChecking{innerPattern(e){return P1}innerExtract(e,t){let n=M1.default(e.refDate),i=(t[A1]||"").toLowerCase(),s=(t[x1]||"").toLowerCase(),a=e.createParsingComponents();switch(i){case"jetzt":a=om.now(e.reference);break;case"heute":a=om.today(e.reference);break;case"morgen":Jr.assignTheNextDay(a,n);break;case"\xFCbermorgen":case"uebermorgen":n=n.add(1,"day"),Jr.assignTheNextDay(a,n);break;case"gestern":n=n.add(-1,"day"),Jr.assignSimilarDate(a,n),Jr.implySimilarTime(a,n);break;case"vorgestern":n=n.add(-2,"day"),Jr.assignSimilarDate(a,n),Jr.implySimilarTime(a,n);break;default:i.match(/letzte\s*nacht/)&&(n.hour()>6&&(n=n.add(-1,"day")),Jr.assignSimilarDate(a,n),a.imply("hour",0));break}return s&&(a=k1.default.extractTimeComponents(a,s)),a}};Ft.default=dl});var mm=p(pl=>{"use strict";Object.defineProperty(pl,"__esModule",{value:!0});var C1=je(),pm=Fi(),hm=Fi(),N1=ie(),I1=M(),F1=new RegExp(`(?:am\\s*?)?(?:den\\s*?)?([0-9]{1,2})\\.(?:\\s*(?:bis(?:\\s*(?:am|zum))?|\\-|\\\u2013|\\s)\\s*([0-9]{1,2})\\.?)?\\s*(${N1.matchAnyPattern(pm.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s*)(${hm.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`,"i"),cm=1,dm=2,U1=3,fm=4,fl=class extends I1.AbstractParserWithWordBoundaryChecking{innerPattern(){return F1}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=pm.MONTH_DICTIONARY[t[U1].toLowerCase()],s=parseInt(t[cm]);if(s>31)return t.index=t.index+t[cm].length,null;if(n.start.assign("month",i),n.start.assign("day",s),t[fm]){let a=hm.parseYear(t[fm]);n.start.assign("year",a)}else{let a=C1.findYearClosestToRef(e.refDate,s,i);n.start.imply("year",a)}if(t[dm]){let a=parseInt(t[dm]);n.end=n.start.clone(),n.end.assign("day",a)}return n}};pl.default=fl});var ym=p(ml=>{"use strict";Object.defineProperty(ml,"__esModule",{value:!0});var ga=Fi(),L1=be(),q1=M(),W1=Ot(),Y1=ie(),hl=class extends q1.AbstractParserWithWordBoundaryChecking{constructor(){super()}innerPattern(){return new RegExp(`(?:\\s*((?:n\xE4chste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?|vor|in)\\s*)?(${ga.NUMBER_PATTERN})?(?:\\s*(n\xE4chste|kommende|folgende|letzte|vergangene|vorige|vor(?:her|an)gegangene)(?:s|n|m|r)?)?\\s*(${Y1.matchAnyPattern(ga.TIME_UNIT_DICTIONARY)})`,"i")}innerExtract(e,t){let n=t[2]?ga.parseNumberPattern(t[2]):1,i=ga.TIME_UNIT_DICTIONARY[t[4].toLowerCase()],s={};s[i]=n;let a=t[1]||t[3]||"";if(a=a.toLowerCase(),!!a)return(/vor/.test(a)||/letzte/.test(a)||/vergangen/.test(a))&&(s=W1.reverseTimeUnits(s)),L1.ParsingComponents.createRelativeFromReference(e.reference,s)}};ml.default=hl});var Tm=p(Ne=>{"use strict";var Ut=Ne&&Ne.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ne,"__esModule",{value:!0});Ne.createConfiguration=Ne.createCasualConfiguration=Ne.parseDate=Ne.parse=Ne.strict=Ne.casual=void 0;var $1=ur(),gm=It(),j1=Ut(Zr()),B1=Ut(Uu()),G1=Ut(Vh()),H1=Ut(em()),z1=Ut(im()),K1=Ut(sm()),V1=Ut(am()),X1=Ut(lm()),Z1=Ut(cl()),Q1=Ut(mm()),J1=Ut(ym());Ne.casual=new gm.Chrono(_m());Ne.strict=new gm.Chrono(yl(!0));function ew(r,e,t){return Ne.casual.parse(r,e,t)}Ne.parse=ew;function tw(r,e,t){return Ne.casual.parseDate(r,e,t)}Ne.parseDate=tw;function _m(r=!0){let e=yl(!1,r);return e.parsers.unshift(new Z1.default),e.parsers.unshift(new X1.default),e.parsers.unshift(new J1.default),e}Ne.createCasualConfiguration=_m;function yl(r=!0,e=!0){return $1.includeCommonConfiguration({parsers:[new B1.default,new j1.default(e),new G1.default,new z1.default,new Q1.default,new H1.default],refiners:[new K1.default,new V1.default]},r)}Ne.createConfiguration=yl});var vm=p(Lt=>{"use strict";var rw=Lt&&Lt.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),nw=Lt&&Lt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),iw=Lt&&Lt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&rw(e,r,t);return nw(e,r),e},sw=Lt&&Lt.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Lt,"__esModule",{value:!0});var aw=sw(ee()),ow=ke(),uw=M(),bm=Rt(),_a=iw(cr()),gl=class extends uw.AbstractParserWithWordBoundaryChecking{innerPattern(e){return/(maintenant|aujourd'hui|demain|hier|cette\s*nuit|la\s*veille)(?=\W|$)/i}innerExtract(e,t){let n=aw.default(e.refDate),i=t[0].toLowerCase(),s=e.createParsingComponents();switch(i){case"maintenant":return _a.now(e.reference);case"aujourd'hui":return _a.today(e.reference);case"hier":return _a.yesterday(e.reference);case"demain":return _a.tomorrow(e.reference);default:i.match(/cette\s*nuit/)?(bm.assignSimilarDate(s,n),s.imply("hour",22),s.imply("meridiem",ow.Meridiem.PM)):i.match(/la\s*veille/)&&(n=n.add(-1,"day"),bm.assignSimilarDate(s,n),s.imply("hour",0))}return s}};Lt.default=gl});var Em=p(Tl=>{"use strict";Object.defineProperty(Tl,"__esModule",{value:!0});var Yi=ke(),lw=M(),_l=class extends lw.AbstractParserWithWordBoundaryChecking{innerPattern(e){return/(cet?)?\s*(matin|soir|après-midi|aprem|a midi|à minuit)(?=\W|$)/i}innerExtract(e,t){let n=t[2].toLowerCase(),i=e.createParsingComponents();switch(n){case"apr\xE8s-midi":case"aprem":i.imply("hour",14),i.imply("minute",0),i.imply("meridiem",Yi.Meridiem.PM);break;case"soir":i.imply("hour",18),i.imply("minute",0),i.imply("meridiem",Yi.Meridiem.PM);break;case"matin":i.imply("hour",8),i.imply("minute",0),i.imply("meridiem",Yi.Meridiem.AM);break;case"a midi":i.imply("hour",12),i.imply("minute",0),i.imply("meridiem",Yi.Meridiem.AM);break;case"\xE0 minuit":i.imply("hour",0),i.imply("meridiem",Yi.Meridiem.AM);break}return i}};Tl.default=_l});var wm=p(vl=>{"use strict";Object.defineProperty(vl,"__esModule",{value:!0});var cw=Kr(),bl=class extends cw.AbstractTimeExpressionParser{primaryPrefix(){return"(?:(?:[\xE0a])\\s*)?"}followingPhase(){return"\\s*(?:\\-|\\\u2013|\\~|\\\u301C|[\xE0a]|\\?)\\s*"}extractPrimaryTimeComponents(e,t){return t[0].match(/^\s*\d{4}\s*$/)?null:super.extractPrimaryTimeComponents(e,t)}};vl.default=bl});var Rm=p($i=>{"use strict";var dw=$i&&$i.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty($i,"__esModule",{value:!0});var fw=dw(or()),El=class extends fw.default{patternBetween(){return new RegExp("^\\s*(T|\xE0|a|vers|de|,|-)?\\s*$")}};$i.default=El});var Om=p(ji=>{"use strict";var pw=ji&&ji.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ji,"__esModule",{value:!0});var hw=pw(Qt()),wl=class extends hw.default{patternBetween(){return/^\s*(à|a|-)\s*$/i}};ji.default=wl});var Ir=p(te=>{"use strict";Object.defineProperty(te,"__esModule",{value:!0});te.parseTimeUnits=te.TIME_UNITS_PATTERN=te.parseYear=te.YEAR_PATTERN=te.parseOrdinalNumberPattern=te.ORDINAL_NUMBER_PATTERN=te.parseNumberPattern=te.NUMBER_PATTERN=te.TIME_UNIT_DICTIONARY=te.INTEGER_WORD_DICTIONARY=te.MONTH_DICTIONARY=te.WEEKDAY_DICTIONARY=void 0;var Rl=ie();te.WEEKDAY_DICTIONARY={dimanche:0,dim:0,lundi:1,lun:1,mardi:2,mar:2,mercredi:3,mer:3,jeudi:4,jeu:4,vendredi:5,ven:5,samedi:6,sam:6};te.MONTH_DICTIONARY={janvier:1,jan:1,"jan.":1,f\u00E9vrier:2,f\u00E9v:2,"f\xE9v.":2,fevrier:2,fev:2,"fev.":2,mars:3,mar:3,"mar.":3,avril:4,avr:4,"avr.":4,mai:5,juin:6,jun:6,juillet:7,juil:7,jul:7,"jul.":7,ao\u00FBt:8,aout:8,septembre:9,sep:9,"sep.":9,sept:9,"sept.":9,octobre:10,oct:10,"oct.":10,novembre:11,nov:11,"nov.":11,d\u00E9cembre:12,decembre:12,dec:12,"dec.":12};te.INTEGER_WORD_DICTIONARY={un:1,deux:2,trois:3,quatre:4,cinq:5,six:6,sept:7,huit:8,neuf:9,dix:10,onze:11,douze:12,treize:13};te.TIME_UNIT_DICTIONARY={sec:"second",seconde:"second",secondes:"second",min:"minute",mins:"minute",minute:"minute",minutes:"minute",h:"hour",hr:"hour",hrs:"hour",heure:"hour",heures:"hour",jour:"d",jours:"d",semaine:"week",semaines:"week",mois:"month",trimestre:"quarter",trimestres:"quarter",ans:"year",ann\u00E9e:"year",ann\u00E9es:"year"};te.NUMBER_PATTERN=`(?:${Rl.matchAnyPattern(te.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|une?\\b|quelques?|demi-?)`;function Mm(r){let e=r.toLowerCase();return te.INTEGER_WORD_DICTIONARY[e]!==void 0?te.INTEGER_WORD_DICTIONARY[e]:e==="une"||e==="un"?1:e.match(/quelques?/)?3:e.match(/demi-?/)?.5:parseFloat(e)}te.parseNumberPattern=Mm;te.ORDINAL_NUMBER_PATTERN="(?:[0-9]{1,2}(?:er)?)";function mw(r){let e=r.toLowerCase();return e=e.replace(/(?:er)$/i,""),parseInt(e)}te.parseOrdinalNumberPattern=mw;te.YEAR_PATTERN="(?:[1-9][0-9]{0,3}\\s*(?:AC|AD|p\\.\\s*C(?:hr?)?\\.\\s*n\\.)|[1-2][0-9]{3}|[5-9][0-9])";function yw(r){if(/AC/i.test(r))return r=r.replace(/BC/i,""),-parseInt(r);if(/AD/i.test(r)||/C/i.test(r))return r=r.replace(/[^\d]+/i,""),parseInt(r);let e=parseInt(r);return e<100&&(e>50?e=e+1900:e=e+2e3),e}te.parseYear=yw;var Sm=`(${te.NUMBER_PATTERN})\\s{0,5}(${Rl.matchAnyPattern(te.TIME_UNIT_DICTIONARY)})\\s{0,5}`,Dm=new RegExp(Sm,"i");te.TIME_UNITS_PATTERN=Rl.repeatedTimeunitPattern("",Sm);function gw(r){let e={},t=r,n=Dm.exec(t);for(;n;)_w(e,n),t=t.substring(n[0].length),n=Dm.exec(t);return e}te.parseTimeUnits=gw;function _w(r,e){let t=Mm(e[1]),n=te.TIME_UNIT_DICTIONARY[e[2].toLowerCase()];r[n]=t}});var Pm=p(Dl=>{"use strict";Object.defineProperty(Dl,"__esModule",{value:!0});var km=Ir(),Tw=ie(),bw=M(),vw=Xr(),Ew=new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:(?:ce)\\s*)?(${Tw.matchAnyPattern(km.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(dernier|prochain)\\s*)?(?=\\W|\\d|$)`,"i"),ww=1,Rw=2,Ol=class extends bw.AbstractParserWithWordBoundaryChecking{innerPattern(){return Ew}innerExtract(e,t){let n=t[ww].toLowerCase(),i=km.WEEKDAY_DICTIONARY[n];if(i===void 0)return null;let s=t[Rw];s=s||"",s=s.toLowerCase();let a=null;s=="dernier"?a="last":s=="prochain"&&(a="next");let o=vw.toDayJSWeekday(e.refDate,i,a);return e.createParsingComponents().assign("weekday",i).imply("day",o.date()).imply("month",o.month()+1).imply("year",o.year())}};Dl.default=Ol});var Nm=p(Ml=>{"use strict";Object.defineProperty(Ml,"__esModule",{value:!0});var Bi=ke(),Ow=new RegExp("(^|\\s|T)(?:(?:[\xE0a])\\s*)?(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s|:)?)?(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?(?=\\W|$)","i"),Dw=new RegExp("^\\s*(\\-|\\\u2013|\\~|\\\u301C|[\xE0a]|\\?)\\s*(\\d{1,2})(?:h|:)?(?:(\\d{1,2})(?:m|:)?)?(?:(\\d{1,2})(?:s|:)?)?(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?(?=\\W|$)","i"),Mw=2,Am=3,xm=4,Cm=5,Yn=class{pattern(e){return Ow}extract(e,t){let n=e.createParsingResult(t.index+t[1].length,t[0].substring(t[1].length));if(n.text.match(/^\d{4}$/)||(n.start=Yn.extractTimeComponent(n.start.clone(),t),!n.start))return t.index+=t[0].length,null;let i=e.text.substring(t.index+t[0].length),s=Dw.exec(i);return s&&(n.end=Yn.extractTimeComponent(n.start.clone(),s),n.end&&(n.text+=s[0])),n}static extractTimeComponent(e,t){let n=0,i=0,s=null;if(n=parseInt(t[Mw]),t[Am]!=null&&(i=parseInt(t[Am])),i>=60||n>24)return null;if(n>=12&&(s=Bi.Meridiem.PM),t[Cm]!=null){if(n>12)return null;let a=t[Cm][0].toLowerCase();a=="a"&&(s=Bi.Meridiem.AM,n==12&&(n=0)),a=="p"&&(s=Bi.Meridiem.PM,n!=12&&(n+=12))}if(e.assign("hour",n),e.assign("minute",i),s!==null?e.assign("meridiem",s):n<12?e.imply("meridiem",Bi.Meridiem.AM):e.imply("meridiem",Bi.Meridiem.PM),t[xm]!=null){let a=parseInt(t[xm]);if(a>=60)return null;e.assign("second",a)}return e}};Ml.default=Yn});var Wm=p(kl=>{"use strict";Object.defineProperty(kl,"__esModule",{value:!0});var Sw=je(),Lm=Ir(),qm=Ir(),Ta=Ir(),kw=ie(),Pw=M(),Aw=new RegExp(`(?:on\\s*?)?(${Ta.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:au|\\-|\\\u2013|jusqu'au?|\\s)\\s*(${Ta.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:de)?\\s*)(${kw.matchAnyPattern(Lm.MONTH_DICTIONARY)})(?:(?:-|/|,?\\s*)(${qm.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`,"i"),Im=1,Fm=2,xw=3,Um=4,Sl=class extends Pw.AbstractParserWithWordBoundaryChecking{innerPattern(){return Aw}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=Lm.MONTH_DICTIONARY[t[xw].toLowerCase()],s=Ta.parseOrdinalNumberPattern(t[Im]);if(s>31)return t.index=t.index+t[Im].length,null;if(n.start.assign("month",i),n.start.assign("day",s),t[Um]){let a=qm.parseYear(t[Um]);n.start.assign("year",a)}else{let a=Sw.findYearClosestToRef(e.refDate,s,i);n.start.imply("year",a)}if(t[Fm]){let a=Ta.parseOrdinalNumberPattern(t[Fm]);n.end=n.start.clone(),n.end.assign("day",a)}return n}};kl.default=Sl});var $m=p(Al=>{"use strict";Object.defineProperty(Al,"__esModule",{value:!0});var Ym=Ir(),Cw=be(),Nw=M(),Iw=Ot(),Pl=class extends Nw.AbstractParserWithWordBoundaryChecking{constructor(){super()}innerPattern(){return new RegExp(`il y a\\s*(${Ym.TIME_UNITS_PATTERN})(?=(?:\\W|$))`,"i")}innerExtract(e,t){let n=Ym.parseTimeUnits(t[1]),i=Iw.reverseTimeUnits(n);return Cw.ParsingComponents.createRelativeFromReference(e.reference,i)}};Al.default=Pl});var Bm=p(Cl=>{"use strict";Object.defineProperty(Cl,"__esModule",{value:!0});var jm=Ir(),Fw=be(),Uw=M(),xl=class extends Uw.AbstractParserWithWordBoundaryChecking{innerPattern(){return new RegExp(`(?:dans|en|pour|pendant|de)\\s*(${jm.TIME_UNITS_PATTERN})(?=\\W|$)`,"i")}innerExtract(e,t){let n=jm.parseTimeUnits(t[1]);return Fw.ParsingComponents.createRelativeFromReference(e.reference,n)}};Cl.default=xl});var Gm=p(Il=>{"use strict";Object.defineProperty(Il,"__esModule",{value:!0});var ba=Ir(),Lw=be(),qw=M(),Ww=Ot(),Yw=ie(),Nl=class extends qw.AbstractParserWithWordBoundaryChecking{constructor(){super()}innerPattern(){return new RegExp(`(?:les?|la|l'|du|des?)\\s*(${ba.NUMBER_PATTERN})?(?:\\s*(prochaine?s?|derni[e\xE8]re?s?|pass[\xE9e]e?s?|pr[\xE9e]c[\xE9e]dents?|suivante?s?))?\\s*(${Yw.matchAnyPattern(ba.TIME_UNIT_DICTIONARY)})(?:\\s*(prochaine?s?|derni[e\xE8]re?s?|pass[\xE9e]e?s?|pr[\xE9e]c[\xE9e]dents?|suivante?s?))?`,"i")}innerExtract(e,t){let n=t[1]?ba.parseNumberPattern(t[1]):1,i=ba.TIME_UNIT_DICTIONARY[t[3].toLowerCase()],s={};s[i]=n;let a=t[2]||t[4]||"";if(a=a.toLowerCase(),!!a)return(/derni[eè]re?s?/.test(a)||/pass[ée]e?s?/.test(a)||/pr[ée]c[ée]dents?/.test(a))&&(s=Ww.reverseTimeUnits(s)),Lw.ParsingComponents.createRelativeFromReference(e.reference,s)}};Il.default=Nl});var Km=p(Ie=>{"use strict";var Dt=Ie&&Ie.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ie,"__esModule",{value:!0});Ie.createConfiguration=Ie.createCasualConfiguration=Ie.parseDate=Ie.parse=Ie.strict=Ie.casual=void 0;var $w=ur(),Hm=It(),jw=Dt(vm()),Bw=Dt(Em()),Gw=Dt(Zr()),Hw=Dt(wm()),zw=Dt(Rm()),Kw=Dt(Om()),Vw=Dt(Pm()),Xw=Dt(Nm()),Zw=Dt(Wm()),Qw=Dt($m()),Jw=Dt(Bm()),e0=Dt(Gm());Ie.casual=new Hm.Chrono(zm());Ie.strict=new Hm.Chrono(Fl(!0));function t0(r,e,t){return Ie.casual.parse(r,e,t)}Ie.parse=t0;function r0(r,e,t){return Ie.casual.parseDate(r,e,t)}Ie.parseDate=r0;function zm(r=!0){let e=Fl(!1,r);return e.parsers.unshift(new jw.default),e.parsers.unshift(new Bw.default),e.parsers.unshift(new e0.default),e}Ie.createCasualConfiguration=zm;function Fl(r=!0,e=!0){return $w.includeCommonConfiguration({parsers:[new Gw.default(e),new Zw.default,new Hw.default,new Xw.default,new Qw.default,new Jw.default,new Vw.default],refiners:[new zw.default,new Kw.default]},r)}Ie.createConfiguration=Fl});var Vm=p(va=>{"use strict";Object.defineProperty(va,"__esModule",{value:!0});va.toHankaku=void 0;function n0(r){return String(r).replace(/\u2019/g,"'").replace(/\u201D/g,'"').replace(/\u3000/g," ").replace(/\uFFE5/g,"\xA5").replace(/[\uFF01\uFF03-\uFF06\uFF08\uFF09\uFF0C-\uFF19\uFF1C-\uFF1F\uFF21-\uFF3B\uFF3D\uFF3F\uFF41-\uFF5B\uFF5D\uFF5E]/g,i0)}va.toHankaku=n0;function i0(r){return String.fromCharCode(r.charCodeAt(0)-65248)}});var Zm=p(Gi=>{"use strict";var s0=Gi&&Gi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Gi,"__esModule",{value:!0});var Ul=Vm(),a0=je(),o0=s0(ee()),u0=/(?:(?:([同今本])|((昭和|平成|令和)?([0-90-9]{1,4}|元)))年\s*)?([0-90-9]{1,2})月\s*([0-90-9]{1,2})日/i,Xm=1,l0=2,Ll=3,c0=4,d0=5,f0=6,ql=class{pattern(){return u0}extract(e,t){let n=parseInt(Ul.toHankaku(t[d0])),i=parseInt(Ul.toHankaku(t[f0])),s=e.createParsingComponents({day:i,month:n});if(t[Xm]&&t[Xm].match("\u540C|\u4ECA|\u672C")){let a=o0.default(e.refDate);s.assign("year",a.year())}if(t[l0]){let a=t[c0],o=a=="\u5143"?1:parseInt(Ul.toHankaku(a));t[Ll]=="\u4EE4\u548C"?o+=2018:t[Ll]=="\u5E73\u6210"?o+=1988:t[Ll]=="\u662D\u548C"&&(o+=1925),s.assign("year",o)}else{let a=a0.findYearClosestToRef(e.refDate,i,n);s.imply("year",a)}return s}};Gi.default=ql});var Qm=p(Hi=>{"use strict";var p0=Hi&&Hi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Hi,"__esModule",{value:!0});var h0=p0(Qt()),Wl=class extends h0.default{patternBetween(){return/^\s*(から|ー|-)\s*$/i}};Hi.default=Wl});var ey=p(qt=>{"use strict";var m0=qt&&qt.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),y0=qt&&qt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),g0=qt&&qt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&m0(e,r,t);return y0(e,r),e},_0=qt&&qt.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(qt,"__esModule",{value:!0});var T0=_0(ee()),Jm=ke(),Yl=g0(cr()),b0=/今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i,$l=class{pattern(){return b0}extract(e,t){let n=t[0],i=T0.default(e.refDate),s=e.createParsingComponents();switch(n){case"\u6628\u65E5":return Yl.yesterday(e.reference);case"\u660E\u65E5":return Yl.tomorrow(e.reference);case"\u4ECA\u65E5":case"\u5F53\u65E5":return Yl.today(e.reference)}return n=="\u4ECA\u591C"||n=="\u4ECA\u5915"||n=="\u4ECA\u6669"?(s.imply("hour",22),s.assign("meridiem",Jm.Meridiem.PM)):n.match("\u4ECA\u671D")&&(s.imply("hour",6),s.assign("meridiem",Jm.Meridiem.AM)),s.assign("day",i.date()),s.assign("month",i.month()+1),s.assign("year",i.year()),s}};qt.default=$l});var ny=p(Fe=>{"use strict";var jl=Fe&&Fe.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Fe,"__esModule",{value:!0});Fe.createConfiguration=Fe.createCasualConfiguration=Fe.parseDate=Fe.parse=Fe.strict=Fe.casual=void 0;var v0=jl(Zm()),E0=jl(Qm()),w0=jl(ey()),ty=It();Fe.casual=new ty.Chrono(ry());Fe.strict=new ty.Chrono(Bl());function R0(r,e,t){return Fe.casual.parse(r,e,t)}Fe.parse=R0;function O0(r,e,t){return Fe.casual.parseDate(r,e,t)}Fe.parseDate=O0;function ry(){let r=Bl();return r.parsers.unshift(new w0.default),r}Fe.createCasualConfiguration=ry;function Bl(){return{parsers:[new v0.default],refiners:[new E0.default]}}Fe.createConfiguration=Bl});var Ea=p(er=>{"use strict";Object.defineProperty(er,"__esModule",{value:!0});er.parseYear=er.YEAR_PATTERN=er.MONTH_DICTIONARY=er.WEEKDAY_DICTIONARY=void 0;er.WEEKDAY_DICTIONARY={domingo:0,dom:0,segunda:1,"segunda-feira":1,seg:1,ter\u00E7a:2,"ter\xE7a-feira":2,ter:2,quarta:3,"quarta-feira":3,qua:3,quinta:4,"quinta-feira":4,qui:4,sexta:5,"sexta-feira":5,sex:5,s\u00E1bado:6,sabado:6,sab:6};er.MONTH_DICTIONARY={janeiro:1,jan:1,"jan.":1,fevereiro:2,fev:2,"fev.":2,mar\u00E7o:3,mar:3,"mar.":3,abril:4,abr:4,"abr.":4,maio:5,mai:5,"mai.":5,junho:6,jun:6,"jun.":6,julho:7,jul:7,"jul.":7,agosto:8,ago:8,"ago.":8,setembro:9,set:9,"set.":9,outubro:10,out:10,"out.":10,novembro:11,nov:11,"nov.":11,dezembro:12,dez:12,"dez.":12};er.YEAR_PATTERN="[0-9]{1,4}(?![^\\s]\\d)(?:\\s*[a|d]\\.?\\s*c\\.?|\\s*a\\.?\\s*d\\.?)?";function D0(r){if(r.match(/^[0-9]{1,4}$/)){let e=parseInt(r);return e<100&&(e>50?e=e+1900:e=e+2e3),e}return r.match(/a\.?\s*c\.?/i)?(r=r.replace(/a\.?\s*c\.?/i,""),-parseInt(r)):parseInt(r)}er.parseYear=D0});var sy=p(Hl=>{"use strict";Object.defineProperty(Hl,"__esModule",{value:!0});var iy=Ea(),M0=ie(),S0=M(),k0=Xr(),P0=new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:(este|esta|passado|pr[o\xF3]ximo)\\s*)?(${M0.matchAnyPattern(iy.WEEKDAY_DICTIONARY)})(?:\\s*(?:\\,|\\)|\\\uFF09))?(?:\\s*(este|esta|passado|pr[\xF3o]ximo)\\s*semana)?(?=\\W|\\d|$)`,"i"),A0=1,x0=2,C0=3,Gl=class extends S0.AbstractParserWithWordBoundaryChecking{innerPattern(){return P0}innerExtract(e,t){let n=t[x0].toLowerCase(),i=iy.WEEKDAY_DICTIONARY[n];if(i===void 0)return null;let s=t[A0],a=t[C0],o=s||a||"";o=o.toLowerCase();let u=null;o=="passado"?u="this":o=="pr\xF3ximo"||o=="proximo"?u="next":o=="este"&&(u="this");let l=k0.toDayJSWeekday(e.refDate,i,u);return e.createParsingComponents().assign("weekday",i).imply("day",l.date()).imply("month",l.month()+1).imply("year",l.year())}};Hl.default=Gl});var ay=p(Kl=>{"use strict";Object.defineProperty(Kl,"__esModule",{value:!0});var N0=Kr(),zl=class extends N0.AbstractTimeExpressionParser{primaryPrefix(){return"(?:(?:ao?|\xE0s?|das|da|de|do)\\s*)?"}followingPhase(){return"\\s*(?:\\-|\\\u2013|\\~|\\\u301C|a(?:o)?|\\?)\\s*"}};Kl.default=zl});var oy=p(zi=>{"use strict";var I0=zi&&zi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(zi,"__esModule",{value:!0});var F0=I0(or()),Vl=class extends F0.default{patternBetween(){return new RegExp("^\\s*(?:,|\xE0)?\\s*$")}};zi.default=Vl});var uy=p(Ki=>{"use strict";var U0=Ki&&Ki.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ki,"__esModule",{value:!0});var L0=U0(Qt()),Xl=class extends L0.default{patternBetween(){return/^\s*(?:-)\s*$/i}};Ki.default=Xl});var hy=p(Ql=>{"use strict";Object.defineProperty(Ql,"__esModule",{value:!0});var q0=je(),fy=Ea(),py=Ea(),W0=ie(),Y0=M(),$0=new RegExp(`([0-9]{1,2})(?:\xBA|\xAA|\xB0)?(?:\\s*(?:desde|de|\\-|\\\u2013|ao?|\\s)\\s*([0-9]{1,2})(?:\xBA|\xAA|\xB0)?)?\\s*(?:de)?\\s*(?:-|/|\\s*(?:de|,)?\\s*)(${W0.matchAnyPattern(fy.MONTH_DICTIONARY)})(?:\\s*(?:de|,)?\\s*(${py.YEAR_PATTERN}))?(?=\\W|$)`,"i"),ly=1,cy=2,j0=3,dy=4,Zl=class extends Y0.AbstractParserWithWordBoundaryChecking{innerPattern(){return $0}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=fy.MONTH_DICTIONARY[t[j0].toLowerCase()],s=parseInt(t[ly]);if(s>31)return t.index=t.index+t[ly].length,null;if(n.start.assign("month",i),n.start.assign("day",s),t[dy]){let a=py.parseYear(t[dy]);n.start.assign("year",a)}else{let a=q0.findYearClosestToRef(e.refDate,s,i);n.start.imply("year",a)}if(t[cy]){let a=parseInt(t[cy]);n.end=n.start.clone(),n.end.assign("day",a)}return n}};Ql.default=Zl});var my=p(dr=>{"use strict";var B0=dr&&dr.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),G0=dr&&dr.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),H0=dr&&dr.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&B0(e,r,t);return G0(e,r),e};Object.defineProperty(dr,"__esModule",{value:!0});var z0=M(),wa=H0(cr()),Jl=class extends z0.AbstractParserWithWordBoundaryChecking{innerPattern(e){return/(agora|hoje|amanha|amanhã|ontem)(?=\W|$)/i}innerExtract(e,t){let n=t[0].toLowerCase(),i=e.createParsingComponents();switch(n){case"agora":return wa.now(e.reference);case"hoje":return wa.today(e.reference);case"amanha":case"amanh\xE3":return wa.tomorrow(e.reference);case"ontem":return wa.yesterday(e.reference)}return i}};dr.default=Jl});var yy=p(Vi=>{"use strict";var K0=Vi&&Vi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Vi,"__esModule",{value:!0});var Ra=ke(),V0=M(),X0=Rt(),Z0=K0(ee()),ec=class extends V0.AbstractParserWithWordBoundaryChecking{innerPattern(){return/(?:esta\s*)?(manha|manhã|tarde|meia-noite|meio-dia|noite)(?=\W|$)/i}innerExtract(e,t){let n=Z0.default(e.refDate),i=e.createParsingComponents();switch(t[1].toLowerCase()){case"tarde":i.imply("meridiem",Ra.Meridiem.PM),i.imply("hour",15);break;case"noite":i.imply("meridiem",Ra.Meridiem.PM),i.imply("hour",22);break;case"manha":case"manh\xE3":i.imply("meridiem",Ra.Meridiem.AM),i.imply("hour",6);break;case"meia-noite":X0.assignTheNextDay(i,n),i.imply("hour",0),i.imply("minute",0),i.imply("second",0);break;case"meio-dia":i.imply("meridiem",Ra.Meridiem.AM),i.imply("hour",12);break}return i}};Vi.default=ec});var Ty=p(Ue=>{"use strict";var Fr=Ue&&Ue.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ue,"__esModule",{value:!0});Ue.createConfiguration=Ue.createCasualConfiguration=Ue.parseDate=Ue.parse=Ue.strict=Ue.casual=void 0;var Q0=ur(),gy=It(),J0=Fr(Zr()),eR=Fr(sy()),tR=Fr(ay()),rR=Fr(oy()),nR=Fr(uy()),iR=Fr(hy()),sR=Fr(my()),aR=Fr(yy());Ue.casual=new gy.Chrono(_y());Ue.strict=new gy.Chrono(tc(!0));function oR(r,e,t){return Ue.casual.parse(r,e,t)}Ue.parse=oR;function uR(r,e,t){return Ue.casual.parseDate(r,e,t)}Ue.parseDate=uR;function _y(r=!0){let e=tc(!1,r);return e.parsers.push(new sR.default),e.parsers.push(new aR.default),e}Ue.createCasualConfiguration=_y;function tc(r=!0,e=!0){return Q0.includeCommonConfiguration({parsers:[new J0.default(e),new eR.default,new tR.default,new iR.default],refiners:[new rR.default,new nR.default]},r)}Ue.createConfiguration=tc});var by=p(Xi=>{"use strict";var lR=Xi&&Xi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Xi,"__esModule",{value:!0});var cR=lR(Qt()),rc=class extends cR.default{patternBetween(){return/^\s*(tot|-)\s*$/i}};Xi.default=rc});var vy=p(Zi=>{"use strict";var dR=Zi&&Zi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Zi,"__esModule",{value:!0});var fR=dR(or()),nc=class extends fR.default{patternBetween(){return new RegExp("^\\s*(om|na|voor|in de|,|-)?\\s*$")}};Zi.default=nc});var Ey=p(fr=>{"use strict";var pR=fr&&fr.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),hR=fr&&fr.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),mR=fr&&fr.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&pR(e,r,t);return hR(e,r),e};Object.defineProperty(fr,"__esModule",{value:!0});var yR=M(),Oa=mR(cr()),ic=class extends yR.AbstractParserWithWordBoundaryChecking{innerPattern(e){return/(nu|vandaag|morgen|morgend|gisteren)(?=\W|$)/i}innerExtract(e,t){let n=t[0].toLowerCase(),i=e.createParsingComponents();switch(n){case"nu":return Oa.now(e.reference);case"vandaag":return Oa.today(e.reference);case"morgen":case"morgend":return Oa.tomorrow(e.reference);case"gisteren":return Oa.yesterday(e.reference)}return i}};fr.default=ic});var wy=p(Qi=>{"use strict";var gR=Qi&&Qi.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Qi,"__esModule",{value:!0});var Da=ke(),_R=M(),TR=gR(ee()),bR=Rt(),vR=1,ER=2,sc=class extends _R.AbstractParserWithWordBoundaryChecking{innerPattern(){return/(deze)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i}innerExtract(e,t){let n=TR.default(e.refDate),i=e.createParsingComponents();switch(t[vR]==="deze"&&(i.assign("day",e.refDate.getDate()),i.assign("month",e.refDate.getMonth()+1),i.assign("year",e.refDate.getFullYear())),t[ER].toLowerCase()){case"namiddag":case"'s namiddags":i.imply("meridiem",Da.Meridiem.PM),i.imply("hour",15);break;case"avond":case"'s avonds'":i.imply("meridiem",Da.Meridiem.PM),i.imply("hour",20);break;case"middernacht":bR.assignTheNextDay(i,n),i.imply("hour",0),i.imply("minute",0),i.imply("second",0);break;case"ochtend":case"'s ochtends":i.imply("meridiem",Da.Meridiem.AM),i.imply("hour",6);break;case"middag":case"'s middags":i.imply("meridiem",Da.Meridiem.AM),i.imply("hour",12);break}return i}};Qi.default=sc});var pt=p(K=>{"use strict";Object.defineProperty(K,"__esModule",{value:!0});K.parseTimeUnits=K.TIME_UNITS_PATTERN=K.parseYear=K.YEAR_PATTERN=K.parseOrdinalNumberPattern=K.ORDINAL_NUMBER_PATTERN=K.parseNumberPattern=K.NUMBER_PATTERN=K.TIME_UNIT_DICTIONARY=K.ORDINAL_WORD_DICTIONARY=K.INTEGER_WORD_DICTIONARY=K.MONTH_DICTIONARY=K.WEEKDAY_DICTIONARY=void 0;var Ma=ie(),wR=je();K.WEEKDAY_DICTIONARY={zondag:0,zon:0,"zon.":0,zo:0,"zo.":0,maandag:1,ma:1,"ma.":1,dinsdag:2,din:2,"din.":2,di:2,"di.":2,woensdag:3,woe:3,"woe.":3,wo:3,"wo.":3,donderdag:4,dond:4,"dond.":4,do:4,"do.":4,vrijdag:5,vrij:5,"vrij.":5,vr:5,"vr.":5,zaterdag:6,zat:6,"zat.":6,za:6,"za.":6};K.MONTH_DICTIONARY={januari:1,jan:1,"jan.":1,februari:2,feb:2,"feb.":2,maart:3,mar:3,"mar.":3,april:4,apr:4,"apr.":4,mei:5,juni:6,jun:6,"jun.":6,juli:7,jul:7,"jul.":7,augustus:8,aug:8,"aug.":8,september:9,sep:9,"sep.":9,sept:9,"sept.":9,oktober:10,okt:10,"okt.":10,november:11,nov:11,"nov.":11,december:12,dec:12,"dec.":12};K.INTEGER_WORD_DICTIONARY={een:1,twee:2,drie:3,vier:4,vijf:5,zes:6,zeven:7,acht:8,negen:9,tien:10,elf:11,twaalf:12};K.ORDINAL_WORD_DICTIONARY={eerste:1,tweede:2,derde:3,vierde:4,vijfde:5,zesde:6,zevende:7,achtste:8,negende:9,tiende:10,elfde:11,twaalfde:12,dertiende:13,veertiende:14,vijftiende:15,zestiende:16,zeventiende:17,achttiende:18,negentiende:19,twintigste:20,eenentwintigste:21,twee\u00EBntwintigste:22,drieentwintigste:23,vierentwintigste:24,vijfentwintigste:25,zesentwintigste:26,zevenentwintigste:27,achtentwintig:28,negenentwintig:29,dertigste:30,eenendertigste:31};K.TIME_UNIT_DICTIONARY={sec:"second",second:"second",seconden:"second",min:"minute",mins:"minute",minute:"minute",minuut:"minute",minuten:"minute",minuutje:"minute",h:"hour",hr:"hour",hrs:"hour",uur:"hour",u:"hour",uren:"hour",dag:"d",dagen:"d",week:"week",weken:"week",maand:"month",maanden:"month",jaar:"year",jr:"year",jaren:"year"};K.NUMBER_PATTERN=`(?:${Ma.matchAnyPattern(K.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+[\\.,][0-9]+|halve?|half|paar)`;function Oy(r){let e=r.toLowerCase();return K.INTEGER_WORD_DICTIONARY[e]!==void 0?K.INTEGER_WORD_DICTIONARY[e]:e==="paar"?2:e==="half"||e.match(/halve?/)?.5:parseFloat(e.replace(",","."))}K.parseNumberPattern=Oy;K.ORDINAL_NUMBER_PATTERN=`(?:${Ma.matchAnyPattern(K.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:ste|de)?)`;function RR(r){let e=r.toLowerCase();return K.ORDINAL_WORD_DICTIONARY[e]!==void 0?K.ORDINAL_WORD_DICTIONARY[e]:(e=e.replace(/(?:ste|de)$/i,""),parseInt(e))}K.parseOrdinalNumberPattern=RR;K.YEAR_PATTERN="(?:[1-9][0-9]{0,3}\\s*(?:voor Christus|na Christus)|[1-2][0-9]{3}|[5-9][0-9])";function OR(r){if(/voor Christus/i.test(r))return r=r.replace(/voor Christus/i,""),-parseInt(r);if(/na Christus/i.test(r))return r=r.replace(/na Christus/i,""),parseInt(r);let e=parseInt(r);return wR.findMostLikelyADYear(e)}K.parseYear=OR;var Dy=`(${K.NUMBER_PATTERN})\\s{0,5}(${Ma.matchAnyPattern(K.TIME_UNIT_DICTIONARY)})\\s{0,5}`,Ry=new RegExp(Dy,"i");K.TIME_UNITS_PATTERN=Ma.repeatedTimeunitPattern("(?:(?:binnen|in)\\s*)?",Dy);function DR(r){let e={},t=r,n=Ry.exec(t);for(;n;)MR(e,n),t=t.substring(n[0].length),n=Ry.exec(t);return e}K.parseTimeUnits=DR;function MR(r,e){let t=Oy(e[1]),n=K.TIME_UNIT_DICTIONARY[e[2].toLowerCase()];r[n]=t}});var Sy=p(oc=>{"use strict";Object.defineProperty(oc,"__esModule",{value:!0});var My=pt(),SR=be(),kR=M(),ac=class extends kR.AbstractParserWithWordBoundaryChecking{innerPattern(){return new RegExp("(?:binnen|in|binnen de|voor)\\s*("+My.TIME_UNITS_PATTERN+")(?=\\W|$)","i")}innerExtract(e,t){let n=My.parseTimeUnits(t[1]);return SR.ParsingComponents.createRelativeFromReference(e.reference,n)}};oc.default=ac});var Py=p(lc=>{"use strict";Object.defineProperty(lc,"__esModule",{value:!0});var ky=pt(),PR=ie(),AR=M(),xR=Xr(),CR=new RegExp(`(?:(?:\\,|\\(|\\\uFF08)\\s*)?(?:op\\s*?)?(?:(deze|vorige|volgende)\\s*(?:week\\s*)?)?(${PR.matchAnyPattern(ky.WEEKDAY_DICTIONARY)})(?=\\W|$)`,"i"),NR=1,IR=2,FR=3,uc=class extends AR.AbstractParserWithWordBoundaryChecking{innerPattern(){return CR}innerExtract(e,t){let n=t[IR].toLowerCase(),i=ky.WEEKDAY_DICTIONARY[n],s=t[NR],a=t[FR],o=s||a;o=o||"",o=o.toLowerCase();let u=null;o=="vorige"?u="last":o=="volgende"?u="next":o=="deze"&&(u="this");let l=xR.toDayJSWeekday(e.refDate,i,u);return e.createParsingComponents().assign("weekday",i).imply("day",l.date()).imply("month",l.month()+1).imply("year",l.year())}};lc.default=uc});var Fy=p(dc=>{"use strict";Object.defineProperty(dc,"__esModule",{value:!0});var UR=je(),Ny=pt(),Sa=pt(),Iy=pt(),LR=ie(),qR=M(),WR=new RegExp(`(?:on\\s*?)?(${Sa.ORDINAL_NUMBER_PATTERN})(?:\\s*(?:tot|\\-|\\\u2013|until|through|till|\\s)\\s*(${Sa.ORDINAL_NUMBER_PATTERN}))?(?:-|/|\\s*(?:of)?\\s*)(`+LR.matchAnyPattern(Ny.MONTH_DICTIONARY)+`)(?:(?:-|/|,?\\s*)(${Iy.YEAR_PATTERN}(?![^\\s]\\d)))?(?=\\W|$)`,"i"),YR=3,Ay=1,xy=2,Cy=4,cc=class extends qR.AbstractParserWithWordBoundaryChecking{innerPattern(){return WR}innerExtract(e,t){let n=Ny.MONTH_DICTIONARY[t[YR].toLowerCase()],i=Sa.parseOrdinalNumberPattern(t[Ay]);if(i>31)return t.index=t.index+t[Ay].length,null;let s=e.createParsingComponents({day:i,month:n});if(t[Cy]){let u=Iy.parseYear(t[Cy]);s.assign("year",u)}else{let u=UR.findYearClosestToRef(e.refDate,i,n);s.imply("year",u)}if(!t[xy])return s;let a=Sa.parseOrdinalNumberPattern(t[xy]),o=e.createParsingResult(t.index,t[0]);return o.start=s,o.end=s.clone(),o.end.assign("day",a),o}};dc.default=cc});var Wy=p(pc=>{"use strict";Object.defineProperty(pc,"__esModule",{value:!0});var Ly=pt(),$R=je(),jR=ie(),qy=pt(),BR=M(),GR=new RegExp(`(${jR.matchAnyPattern(Ly.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${qy.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`,"i"),HR=1,Uy=2,fc=class extends BR.AbstractParserWithWordBoundaryChecking{innerPattern(){return GR}innerExtract(e,t){let n=e.createParsingComponents();n.imply("day",1);let i=t[HR],s=Ly.MONTH_DICTIONARY[i.toLowerCase()];if(n.assign("month",s),t[Uy]){let a=qy.parseYear(t[Uy]);n.assign("year",a)}else{let a=$R.findYearClosestToRef(e.refDate,1,s);n.imply("year",a)}return n}};pc.default=fc});var Yy=p(mc=>{"use strict";Object.defineProperty(mc,"__esModule",{value:!0});var zR=M(),KR=new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})","i"),VR=1,XR=2,hc=class extends zR.AbstractParserWithWordBoundaryChecking{innerPattern(){return KR}innerExtract(e,t){let n=parseInt(t[XR]),i=parseInt(t[VR]);return e.createParsingComponents().imply("day",1).assign("month",i).assign("year",n)}};mc.default=hc});var $y=p(gc=>{"use strict";Object.defineProperty(gc,"__esModule",{value:!0});var ZR=Kr(),yc=class extends ZR.AbstractTimeExpressionParser{primaryPrefix(){return"(?:(?:om)\\s*)?"}followingPhase(){return"\\s*(?:\\-|\\\u2013|\\~|\\\u301C|om|\\?)\\s*"}primarySuffix(){return"(?:\\s*(?:uur))?(?!/)(?=\\W|$)"}extractPrimaryTimeComponents(e,t){return t[0].match(/^\s*\d{4}\s*$/)?null:super.extractPrimaryTimeComponents(e,t)}};gc.default=yc});var Gy=p(Tc=>{"use strict";Object.defineProperty(Tc,"__esModule",{value:!0});var By=pt(),QR=ie(),JR=M(),eO=new RegExp(`([0-9]{4})[\\.\\/\\s](?:(${QR.matchAnyPattern(By.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]([0-9]{1,2})(?=\\W|$)`,"i"),tO=1,rO=2,jy=3,nO=4,_c=class extends JR.AbstractParserWithWordBoundaryChecking{innerPattern(){return eO}innerExtract(e,t){let n=t[jy]?parseInt(t[jy]):By.MONTH_DICTIONARY[t[rO].toLowerCase()];if(n<1||n>12)return null;let i=parseInt(t[tO]);return{day:parseInt(t[nO]),month:n,year:i}}};Tc.default=_c});var Hy=p(Ji=>{"use strict";var iO=Ji&&Ji.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Ji,"__esModule",{value:!0});var sO=M(),ka=ke(),bc=Rt(),aO=iO(ee()),oO=1,uO=2,vc=class extends sO.AbstractParserWithWordBoundaryChecking{innerPattern(e){return/(gisteren|morgen|van)(ochtend|middag|namiddag|avond|nacht)(?=\W|$)/i}innerExtract(e,t){let n=t[oO].toLowerCase(),i=t[uO].toLowerCase(),s=e.createParsingComponents(),a=aO.default(e.refDate);switch(n){case"gisteren":bc.assignSimilarDate(s,a.add(-1,"day"));break;case"van":bc.assignSimilarDate(s,a);break;case"morgen":bc.assignTheNextDay(s,a);break}switch(i){case"ochtend":s.imply("meridiem",ka.Meridiem.AM),s.imply("hour",6);break;case"middag":s.imply("meridiem",ka.Meridiem.AM),s.imply("hour",12);break;case"namiddag":s.imply("meridiem",ka.Meridiem.PM),s.imply("hour",15);break;case"avond":s.imply("meridiem",ka.Meridiem.PM),s.imply("hour",20);break}return s}};Ji.default=vc});var Ky=p(wc=>{"use strict";Object.defineProperty(wc,"__esModule",{value:!0});var zy=pt(),lO=be(),cO=M(),dO=Ot(),fO=new RegExp(`(deze|vorige|afgelopen|komende|over|\\+|-)\\s*(${zy.TIME_UNITS_PATTERN})(?=\\W|$)`,"i"),Ec=class extends cO.AbstractParserWithWordBoundaryChecking{innerPattern(){return fO}innerExtract(e,t){let n=t[1].toLowerCase(),i=zy.parseTimeUnits(t[2]);switch(n){case"vorige":case"afgelopen":case"-":i=dO.reverseTimeUnits(i);break}return lO.ParsingComponents.createRelativeFromReference(e.reference,i)}};wc.default=Ec});var Zy=p(es=>{"use strict";var pO=es&&es.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(es,"__esModule",{value:!0});var Xy=pt(),Vy=be(),hO=pO(ee()),mO=M(),yO=ie(),gO=new RegExp(`(dit|deze|komende|volgend|volgende|afgelopen|vorige)\\s*(${yO.matchAnyPattern(Xy.TIME_UNIT_DICTIONARY)})(?=\\s*)(?=\\W|$)`,"i"),_O=1,TO=2,Rc=class extends mO.AbstractParserWithWordBoundaryChecking{innerPattern(){return gO}innerExtract(e,t){let n=t[_O].toLowerCase(),i=t[TO].toLowerCase(),s=Xy.TIME_UNIT_DICTIONARY[i];if(n=="volgend"||n=="volgende"||n=="komende"){let u={};return u[s]=1,Vy.ParsingComponents.createRelativeFromReference(e.reference,u)}if(n=="afgelopen"||n=="vorige"){let u={};return u[s]=-1,Vy.ParsingComponents.createRelativeFromReference(e.reference,u)}let a=e.createParsingComponents(),o=hO.default(e.reference.instant);return i.match(/week/i)?(o=o.add(-o.get("d"),"d"),a.imply("day",o.date()),a.imply("month",o.month()+1),a.imply("year",o.year())):i.match(/maand/i)?(o=o.add(-o.date()+1,"d"),a.imply("day",o.date()),a.assign("year",o.year()),a.assign("month",o.month()+1)):i.match(/jaar/i)&&(o=o.add(-o.date()+1,"d"),o=o.add(-o.month(),"month"),a.imply("day",o.date()),a.imply("month",o.month()+1),a.assign("year",o.year())),a}};es.default=Rc});var Qy=p(Mc=>{"use strict";Object.defineProperty(Mc,"__esModule",{value:!0});var Dc=pt(),bO=be(),vO=M(),EO=Ot(),wO=new RegExp("("+Dc.TIME_UNITS_PATTERN+")(?:geleden|voor|eerder)(?=(?:\\W|$))","i"),RO=new RegExp("("+Dc.TIME_UNITS_PATTERN+")geleden(?=(?:\\W|$))","i"),Oc=class extends vO.AbstractParserWithWordBoundaryChecking{constructor(e){super(),this.strictMode=e}innerPattern(){return this.strictMode?RO:wO}innerExtract(e,t){let n=Dc.parseTimeUnits(t[1]),i=EO.reverseTimeUnits(n);return bO.ParsingComponents.createRelativeFromReference(e.reference,i)}};Mc.default=Oc});var Jy=p(Pc=>{"use strict";Object.defineProperty(Pc,"__esModule",{value:!0});var kc=pt(),OO=be(),DO=M(),MO=new RegExp("("+kc.TIME_UNITS_PATTERN+")(later|na|vanaf nu|voortaan|vooruit|uit)(?=(?:\\W|$))","i"),SO=new RegExp("("+kc.TIME_UNITS_PATTERN+")(later|vanaf nu)(?=(?:\\W|$))","i"),kO=1,Sc=class extends DO.AbstractParserWithWordBoundaryChecking{constructor(e){super(),this.strictMode=e}innerPattern(){return this.strictMode?SO:MO}innerExtract(e,t){let n=kc.parseTimeUnits(t[kO]);return OO.ParsingComponents.createRelativeFromReference(e.reference,n)}};Pc.default=Sc});var ng=p(Le=>{"use strict";var Ge=Le&&Le.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Le,"__esModule",{value:!0});Le.createConfiguration=Le.createCasualConfiguration=Le.parseDate=Le.parse=Le.strict=Le.casual=void 0;var PO=ur(),eg=It(),AO=Ge(by()),xO=Ge(vy()),CO=Ge(Ey()),NO=Ge(wy()),IO=Ge(Zr()),FO=Ge(Sy()),UO=Ge(Py()),LO=Ge(Fy()),tg=Ge(Wy()),qO=Ge(Yy()),WO=Ge($y()),YO=Ge(Gy()),$O=Ge(Hy()),jO=Ge(Ky()),BO=Ge(Zy()),GO=Ge(Qy()),HO=Ge(Jy());Le.casual=new eg.Chrono(rg());Le.strict=new eg.Chrono(Ac(!0));function zO(r,e,t){return Le.casual.parse(r,e,t)}Le.parse=zO;function KO(r,e,t){return Le.casual.parseDate(r,e,t)}Le.parseDate=KO;function rg(r=!0){let e=Ac(!1,r);return e.parsers.unshift(new CO.default),e.parsers.unshift(new NO.default),e.parsers.unshift(new $O.default),e.parsers.unshift(new tg.default),e.parsers.unshift(new BO.default),e.parsers.unshift(new jO.default),e}Le.createCasualConfiguration=rg;function Ac(r=!0,e=!0){return PO.includeCommonConfiguration({parsers:[new IO.default(e),new FO.default,new LO.default,new tg.default,new UO.default,new YO.default,new qO.default,new WO.default(r),new GO.default(r),new HO.default(r)],refiners:[new xO.default,new AO.default]},r)}Le.createConfiguration=Ac});var og=p(ts=>{"use strict";var VO=ts&&ts.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ts,"__esModule",{value:!0});var XO=VO(ee()),ZO=M(),QO=1,ig=2,JO=3,sg=4,ag=5,eD=6,xc=class extends ZO.AbstractParserWithWordBoundaryChecking{innerPattern(e){return new RegExp("(\u800C\u5BB6|\u7ACB(?:\u523B|\u5373)|\u5373\u523B)|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s|,|\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?","i")}innerExtract(e,t){let n=t.index,i=e.createParsingResult(n,t[0]),s=XO.default(e.refDate),a=s;if(t[QO])i.start.imply("hour",s.hour()),i.start.imply("minute",s.minute()),i.start.imply("second",s.second()),i.start.imply("millisecond",s.millisecond());else if(t[ig]){let o=t[ig],u=t[JO];o=="\u660E"||o=="\u807D"?s.hour()>1&&(a=a.add(1,"day")):o=="\u6628"||o=="\u5C0B"||o=="\u7434"?a=a.add(-1,"day"):o=="\u524D"?a=a.add(-2,"day"):o=="\u5927\u524D"?a=a.add(-3,"day"):o=="\u5F8C"?a=a.add(2,"day"):o=="\u5927\u5F8C"&&(a=a.add(3,"day")),u=="\u65E9"||u=="\u671D"?i.start.imply("hour",6):u=="\u665A"&&(i.start.imply("hour",22),i.start.imply("meridiem",1))}else if(t[sg]){let u=t[sg][0];u=="\u65E9"||u=="\u671D"||u=="\u4E0A"?i.start.imply("hour",6):u=="\u4E0B"||u=="\u664F"?(i.start.imply("hour",15),i.start.imply("meridiem",1)):u=="\u4E2D"?(i.start.imply("hour",12),i.start.imply("meridiem",1)):u=="\u591C"||u=="\u665A"?(i.start.imply("hour",22),i.start.imply("meridiem",1)):u=="\u51CC"&&i.start.imply("hour",0)}else if(t[ag]){let o=t[ag];o=="\u660E"||o=="\u807D"?s.hour()>1&&(a=a.add(1,"day")):o=="\u6628"||o=="\u5C0B"||o=="\u7434"?a=a.add(-1,"day"):o=="\u524D"?a=a.add(-2,"day"):o=="\u5927\u524D"?a=a.add(-3,"day"):o=="\u5F8C"?a=a.add(2,"day"):o=="\u5927\u5F8C"&&(a=a.add(3,"day"));let u=t[eD];if(u){let l=u[0];l=="\u65E9"||l=="\u671D"||l=="\u4E0A"?i.start.imply("hour",6):l=="\u4E0B"||l=="\u664F"?(i.start.imply("hour",15),i.start.imply("meridiem",1)):l=="\u4E2D"?(i.start.imply("hour",12),i.start.imply("meridiem",1)):l=="\u591C"||l=="\u665A"?(i.start.imply("hour",22),i.start.imply("meridiem",1)):l=="\u51CC"&&i.start.imply("hour",0)}}return i.start.assign("day",a.date()),i.start.assign("month",a.month()+1),i.start.assign("year",a.year()),i}};ts.default=xc});var $n=p(nt=>{"use strict";Object.defineProperty(nt,"__esModule",{value:!0});nt.zhStringToYear=nt.zhStringToNumber=nt.WEEKDAY_OFFSET=nt.NUMBER=void 0;nt.NUMBER={\u96F6:0,\u4E00:1,\u4E8C:2,\u5169:2,\u4E09:3,\u56DB:4,\u4E94:5,\u516D:6,\u4E03:7,\u516B:8,\u4E5D:9,\u5341:10,\u5EFF:20,\u5345:30};nt.WEEKDAY_OFFSET={\u5929:0,\u65E5:0,\u4E00:1,\u4E8C:2,\u4E09:3,\u56DB:4,\u4E94:5,\u516D:6};function tD(r){let e=0;for(let t=0;t{"use strict";var nD=rs&&rs.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(rs,"__esModule",{value:!0});var iD=nD(ee()),sD=M(),en=$n(),Cc=1,ug=2,Nc=3,Ic=class extends sD.AbstractParserWithWordBoundaryChecking{innerPattern(){return new RegExp("(\\d{2,4}|["+Object.keys(en.NUMBER).join("")+"]{4}|["+Object.keys(en.NUMBER).join("")+"]{2})?(?:\\s*)(?:\u5E74)?(?:[\\s|,|\uFF0C]*)(\\d{1,2}|["+Object.keys(en.NUMBER).join("")+"]{1,2})(?:\\s*)(?:\u6708)(?:\\s*)(\\d{1,2}|["+Object.keys(en.NUMBER).join("")+"]{1,2})?(?:\\s*)(?:\u65E5|\u865F)?")}innerExtract(e,t){let n=iD.default(e.refDate),i=e.createParsingResult(t.index,t[0]),s=parseInt(t[ug]);if(isNaN(s)&&(s=en.zhStringToNumber(t[ug])),i.start.assign("month",s),t[Nc]){let a=parseInt(t[Nc]);isNaN(a)&&(a=en.zhStringToNumber(t[Nc])),i.start.assign("day",a)}else i.start.imply("day",n.date());if(t[Cc]){let a=parseInt(t[Cc]);isNaN(a)&&(a=en.zhStringToYear(t[Cc])),i.start.assign("year",a)}else i.start.imply("year",n.year());return i}};rs.default=Ic});var dg=p(ns=>{"use strict";var aD=ns&&ns.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ns,"__esModule",{value:!0});var oD=aD(ee()),uD=M(),cg=$n(),lD=new RegExp("(\\d+|["+Object.keys(cg.NUMBER).join("")+"]+|\u534A|\u5E7E)(?:\\s*)(?:\u500B)?(\u79D2(?:\u9418)?|\u5206\u9418|\u5C0F\u6642|\u9418|\u65E5|\u5929|\u661F\u671F|\u79AE\u62DC|\u6708|\u5E74)(?:(?:\u4E4B|\u904E)?\u5F8C|(?:\u4E4B)?\u5167)","i"),Fc=1,cD=2,Uc=class extends uD.AbstractParserWithWordBoundaryChecking{innerPattern(){return lD}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=parseInt(t[Fc]);if(isNaN(i)&&(i=cg.zhStringToNumber(t[Fc])),isNaN(i)){let u=t[Fc];if(u==="\u5E7E")i=3;else if(u==="\u534A")i=.5;else return null}let s=oD.default(e.refDate),o=t[cD][0];return o.match(/[日天星禮月年]/)?(o=="\u65E5"||o=="\u5929"?s=s.add(i,"d"):o=="\u661F"||o=="\u79AE"?s=s.add(i*7,"d"):o=="\u6708"?s=s.add(i,"month"):o=="\u5E74"&&(s=s.add(i,"year")),n.start.assign("year",s.year()),n.start.assign("month",s.month()+1),n.start.assign("day",s.date()),n):(o=="\u79D2"?s=s.add(i,"second"):o=="\u5206"?s=s.add(i,"minute"):(o=="\u5C0F"||o=="\u9418")&&(s=s.add(i,"hour")),n.start.imply("year",s.year()),n.start.imply("month",s.month()+1),n.start.imply("day",s.date()),n.start.assign("hour",s.hour()),n.start.assign("minute",s.minute()),n.start.assign("second",s.second()),n)}};ns.default=Uc});var pg=p(is=>{"use strict";var dD=is&&is.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(is,"__esModule",{value:!0});var fD=dD(ee()),pD=M(),fg=$n(),hD=new RegExp("(?\u4E0A|\u4ECA|\u4E0B|\u9019|\u5462)(?:\u500B)?(?:\u661F\u671F|\u79AE\u62DC|\u9031)(?"+Object.keys(fg.WEEKDAY_OFFSET).join("|")+")"),Lc=class extends pD.AbstractParserWithWordBoundaryChecking{innerPattern(){return hD}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=t.groups.weekday,s=fg.WEEKDAY_OFFSET[i];if(s===void 0)return null;let a=null,o=t.groups.prefix;o=="\u4E0A"?a="last":o=="\u4E0B"?a="next":(o=="\u4ECA"||o=="\u9019"||o=="\u5462")&&(a="this");let u=fD.default(e.refDate),l=!1,c=u.day();return a=="last"||a=="past"?(u=u.day(s-7),l=!0):a=="next"?(u=u.day(s+7),l=!0):a=="this"?u=u.day(s):Math.abs(s-7-c){"use strict";var mD=ss&&ss.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ss,"__esModule",{value:!0});var yD=mD(ee()),gD=M(),St=$n(),_D=new RegExp("(?:\u7531|\u5F9E|\u81EA)?(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|["+Object.keys(St.NUMBER).join("")+"]+)(?:\\s*)(?:\u9EDE|\u6642|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|["+Object.keys(St.NUMBER).join("")+"]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|["+Object.keys(St.NUMBER).join("")+"]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?","i"),TD=new RegExp("(?:^\\s*(?:\u5230|\u81F3|\\-|\\\u2013|\\~|\\\u301C)\\s*)(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u5F8C|\u5927\u5F8C|\u807D|\u6628|\u5C0B|\u7434)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348|\u665D)|\u671D(?:\u65E9)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348|\u665D)|\u664F(?:\u665D)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|["+Object.keys(St.NUMBER).join("")+"]+)(?:\\s*)(?:\u9EDE|\u6642|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|["+Object.keys(St.NUMBER).join("")+"]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|["+Object.keys(St.NUMBER).join("")+"]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?","i"),Pa=1,Aa=2,xa=3,Ca=4,Na=5,Ia=6,Mt=7,jn=8,Fa=9,qc=class extends gD.AbstractParserWithWordBoundaryChecking{innerPattern(){return _D}innerExtract(e,t){if(t.index>0&&e.text[t.index-1].match(/\w/))return null;let n=yD.default(e.refDate),i=e.createParsingResult(t.index,t[0]),s=n.clone();if(t[Pa]){var a=t[Pa];a=="\u660E"||a=="\u807D"?n.hour()>1&&s.add(1,"day"):a=="\u6628"||a=="\u5C0B"||a=="\u7434"?s.add(-1,"day"):a=="\u524D"?s.add(-2,"day"):a=="\u5927\u524D"?s.add(-3,"day"):a=="\u5F8C"?s.add(2,"day"):a=="\u5927\u5F8C"&&s.add(3,"day"),i.start.assign("day",s.date()),i.start.assign("month",s.month()+1),i.start.assign("year",s.year())}else if(t[Ca]){var o=t[Ca];o=="\u660E"||o=="\u807D"?s.add(1,"day"):o=="\u6628"||o=="\u5C0B"||o=="\u7434"?s.add(-1,"day"):o=="\u524D"?s.add(-2,"day"):o=="\u5927\u524D"?s.add(-3,"day"):o=="\u5F8C"?s.add(2,"day"):o=="\u5927\u5F8C"&&s.add(3,"day"),i.start.assign("day",s.date()),i.start.assign("month",s.month()+1),i.start.assign("year",s.year())}else i.start.imply("day",s.date()),i.start.imply("month",s.month()+1),i.start.imply("year",s.year());let u=0,l=0,c=-1;if(t[jn]){var d=parseInt(t[jn]);if(isNaN(d)&&(d=St.zhStringToNumber(t[jn])),d>=60)return null;i.start.assign("second",d)}if(u=parseInt(t[Ia]),isNaN(u)&&(u=St.zhStringToNumber(t[Ia])),t[Mt]?t[Mt]=="\u534A"?l=30:t[Mt]=="\u6B63"||t[Mt]=="\u6574"?l=0:(l=parseInt(t[Mt]),isNaN(l)&&(l=St.zhStringToNumber(t[Mt]))):u>100&&(l=u%100,u=Math.floor(u/100)),l>=60||u>24)return null;if(u>=12&&(c=1),t[Fa]){if(u>12)return null;var f=t[Fa][0].toLowerCase();f=="a"&&(c=0,u==12&&(u=0)),f=="p"&&(c=1,u!=12&&(u+=12))}else if(t[Aa]){var h=t[Aa],y=h[0];y=="\u671D"||y=="\u65E9"?(c=0,u==12&&(u=0)):y=="\u665A"&&(c=1,u!=12&&(u+=12))}else if(t[xa]){var m=t[xa],g=m[0];g=="\u4E0A"||g=="\u671D"||g=="\u65E9"||g=="\u51CC"?(c=0,u==12&&(u=0)):(g=="\u4E0B"||g=="\u664F"||g=="\u665A")&&(c=1,u!=12&&(u+=12))}else if(t[Na]){var R=t[Na],O=R[0];O=="\u4E0A"||O=="\u671D"||O=="\u65E9"||O=="\u51CC"?(c=0,u==12&&(u=0)):(O=="\u4E0B"||O=="\u664F"||O=="\u665A")&&(c=1,u!=12&&(u+=12))}if(i.start.assign("hour",u),i.start.assign("minute",l),c>=0?i.start.assign("meridiem",c):u<12?i.start.imply("meridiem",0):i.start.imply("meridiem",1),t=TD.exec(e.text.substring(i.index+i.text.length)),!t)return i.text.match(/^\d+$/)?null:i;let P=s.clone();if(i.end=e.createParsingComponents(),t[Pa]){var a=t[Pa];a=="\u660E"||a=="\u807D"?n.hour()>1&&P.add(1,"day"):a=="\u6628"||a=="\u5C0B"||a=="\u7434"?P.add(-1,"day"):a=="\u524D"?P.add(-2,"day"):a=="\u5927\u524D"?P.add(-3,"day"):a=="\u5F8C"?P.add(2,"day"):a=="\u5927\u5F8C"&&P.add(3,"day"),i.end.assign("day",P.date()),i.end.assign("month",P.month()+1),i.end.assign("year",P.year())}else if(t[Ca]){var o=t[Ca];o=="\u660E"||o=="\u807D"?P.add(1,"day"):o=="\u6628"||o=="\u5C0B"||o=="\u7434"?P.add(-1,"day"):o=="\u524D"?P.add(-2,"day"):o=="\u5927\u524D"?P.add(-3,"day"):o=="\u5F8C"?P.add(2,"day"):o=="\u5927\u5F8C"&&P.add(3,"day"),i.end.assign("day",P.date()),i.end.assign("month",P.month()+1),i.end.assign("year",P.year())}else i.end.imply("day",P.date()),i.end.imply("month",P.month()+1),i.end.imply("year",P.year());if(u=0,l=0,c=-1,t[jn]){var d=parseInt(t[jn]);if(isNaN(d)&&(d=St.zhStringToNumber(t[jn])),d>=60)return null;i.end.assign("second",d)}if(u=parseInt(t[Ia]),isNaN(u)&&(u=St.zhStringToNumber(t[Ia])),t[Mt]?t[Mt]=="\u534A"?l=30:t[Mt]=="\u6B63"||t[Mt]=="\u6574"?l=0:(l=parseInt(t[Mt]),isNaN(l)&&(l=St.zhStringToNumber(t[Mt]))):u>100&&(l=u%100,u=Math.floor(u/100)),l>=60||u>24)return null;if(u>=12&&(c=1),t[Fa]){if(u>12)return null;var f=t[Fa][0].toLowerCase();f=="a"&&(c=0,u==12&&(u=0)),f=="p"&&(c=1,u!=12&&(u+=12)),i.start.isCertain("meridiem")||(c==0?(i.start.imply("meridiem",0),i.start.get("hour")==12&&i.start.assign("hour",0)):(i.start.imply("meridiem",1),i.start.get("hour")!=12&&i.start.assign("hour",i.start.get("hour")+12)))}else if(t[Aa]){var h=t[Aa],y=h[0];y=="\u671D"||y=="\u65E9"?(c=0,u==12&&(u=0)):y=="\u665A"&&(c=1,u!=12&&(u+=12))}else if(t[xa]){var m=t[xa],g=m[0];g=="\u4E0A"||g=="\u671D"||g=="\u65E9"||g=="\u51CC"?(c=0,u==12&&(u=0)):(g=="\u4E0B"||g=="\u664F"||g=="\u665A")&&(c=1,u!=12&&(u+=12))}else if(t[Na]){var R=t[Na],O=R[0];O=="\u4E0A"||O=="\u671D"||O=="\u65E9"||O=="\u51CC"?(c=0,u==12&&(u=0)):(O=="\u4E0B"||O=="\u664F"||O=="\u665A")&&(c=1,u!=12&&(u+=12))}return i.text=i.text+t[0],i.end.assign("hour",u),i.end.assign("minute",l),c>=0?i.end.assign("meridiem",c):i.start.isCertain("meridiem")&&i.start.get("meridiem")==1&&i.start.get("hour")>u?i.end.imply("meridiem",0):u>12&&i.end.imply("meridiem",1),i.end.date().getTime(){"use strict";var bD=as&&as.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(as,"__esModule",{value:!0});var vD=bD(ee()),ED=M(),mg=$n(),wD=new RegExp("(?:\u661F\u671F|\u79AE\u62DC|\u9031)(?"+Object.keys(mg.WEEKDAY_OFFSET).join("|")+")"),Wc=class extends ED.AbstractParserWithWordBoundaryChecking{innerPattern(){return wD}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=t.groups.weekday,s=mg.WEEKDAY_OFFSET[i];if(s===void 0)return null;let a=vD.default(e.refDate),o=!1,u=a.day();return Math.abs(s-7-u){"use strict";var RD=os&&os.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(os,"__esModule",{value:!0});var OD=RD(Qt()),Yc=class extends OD.default{patternBetween(){return/^\s*(至|到|\-|\~|~|-|ー)\s*$/i}};os.default=Yc});var _g=p(us=>{"use strict";var DD=us&&us.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(us,"__esModule",{value:!0});var MD=DD(or()),$c=class extends MD.default{patternBetween(){return/^\s*$/i}};us.default=$c});var Tg=p(De=>{"use strict";var pr=De&&De.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(De,"__esModule",{value:!0});De.createConfiguration=De.createCasualConfiguration=De.parseDate=De.parse=De.strict=De.casual=De.hant=void 0;var jc=It(),SD=pr(fa()),kD=ur(),PD=pr(og()),AD=pr(lg()),xD=pr(dg()),CD=pr(pg()),ND=pr(hg()),ID=pr(yg()),FD=pr(gg()),UD=pr(_g());De.hant=new jc.Chrono(Bc());De.casual=new jc.Chrono(Bc());De.strict=new jc.Chrono(Gc());function LD(r,e,t){return De.casual.parse(r,e,t)}De.parse=LD;function qD(r,e,t){return De.casual.parseDate(r,e,t)}De.parseDate=qD;function Bc(){let r=Gc();return r.parsers.unshift(new PD.default),r}De.createCasualConfiguration=Bc;function Gc(){let r=kD.includeCommonConfiguration({parsers:[new AD.default,new CD.default,new ID.default,new ND.default,new xD.default],refiners:[new FD.default,new UD.default]});return r.refiners=r.refiners.filter(e=>!(e instanceof SD.default)),r}De.createConfiguration=Gc});var wg=p(ls=>{"use strict";var WD=ls&&ls.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ls,"__esModule",{value:!0});var YD=WD(ee()),$D=M(),jD=1,bg=2,BD=3,vg=4,Eg=5,GD=6,Hc=class extends $D.AbstractParserWithWordBoundaryChecking{innerPattern(e){return new RegExp("(\u73B0\u5728|\u7ACB(?:\u523B|\u5373)|\u5373\u523B)|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s|,|\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?","i")}innerExtract(e,t){let n=t.index,i=e.createParsingResult(n,t[0]),s=YD.default(e.refDate),a=s;if(t[jD])i.start.imply("hour",s.hour()),i.start.imply("minute",s.minute()),i.start.imply("second",s.second()),i.start.imply("millisecond",s.millisecond());else if(t[bg]){let o=t[bg],u=t[BD];o=="\u660E"?s.hour()>1&&(a=a.add(1,"day")):o=="\u6628"?a=a.add(-1,"day"):o=="\u524D"?a=a.add(-2,"day"):o=="\u5927\u524D"?a=a.add(-3,"day"):o=="\u540E"?a=a.add(2,"day"):o=="\u5927\u540E"&&(a=a.add(3,"day")),u=="\u65E9"?i.start.imply("hour",6):u=="\u665A"&&(i.start.imply("hour",22),i.start.imply("meridiem",1))}else if(t[vg]){let u=t[vg][0];u=="\u65E9"||u=="\u4E0A"?i.start.imply("hour",6):u=="\u4E0B"?(i.start.imply("hour",15),i.start.imply("meridiem",1)):u=="\u4E2D"?(i.start.imply("hour",12),i.start.imply("meridiem",1)):u=="\u591C"||u=="\u665A"?(i.start.imply("hour",22),i.start.imply("meridiem",1)):u=="\u51CC"&&i.start.imply("hour",0)}else if(t[Eg]){let o=t[Eg];o=="\u660E"?s.hour()>1&&(a=a.add(1,"day")):o=="\u6628"?a=a.add(-1,"day"):o=="\u524D"?a=a.add(-2,"day"):o=="\u5927\u524D"?a=a.add(-3,"day"):o=="\u540E"?a=a.add(2,"day"):o=="\u5927\u540E"&&(a=a.add(3,"day"));let u=t[GD];if(u){let l=u[0];l=="\u65E9"||l=="\u4E0A"?i.start.imply("hour",6):l=="\u4E0B"?(i.start.imply("hour",15),i.start.imply("meridiem",1)):l=="\u4E2D"?(i.start.imply("hour",12),i.start.imply("meridiem",1)):l=="\u591C"||l=="\u665A"?(i.start.imply("hour",22),i.start.imply("meridiem",1)):l=="\u51CC"&&i.start.imply("hour",0)}}return i.start.assign("day",a.date()),i.start.assign("month",a.month()+1),i.start.assign("year",a.year()),i}};ls.default=Hc});var Bn=p(it=>{"use strict";Object.defineProperty(it,"__esModule",{value:!0});it.zhStringToYear=it.zhStringToNumber=it.WEEKDAY_OFFSET=it.NUMBER=void 0;it.NUMBER={\u96F6:0,"\u3007":0,\u4E00:1,\u4E8C:2,\u4E24:2,\u4E09:3,\u56DB:4,\u4E94:5,\u516D:6,\u4E03:7,\u516B:8,\u4E5D:9,\u5341:10};it.WEEKDAY_OFFSET={\u5929:0,\u65E5:0,\u4E00:1,\u4E8C:2,\u4E09:3,\u56DB:4,\u4E94:5,\u516D:6};function HD(r){let e=0;for(let t=0;t{"use strict";var KD=cs&&cs.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(cs,"__esModule",{value:!0});var VD=KD(ee()),XD=M(),tn=Bn(),zc=1,Rg=2,Kc=3,Vc=class extends XD.AbstractParserWithWordBoundaryChecking{innerPattern(){return new RegExp("(\\d{2,4}|["+Object.keys(tn.NUMBER).join("")+"]{4}|["+Object.keys(tn.NUMBER).join("")+"]{2})?(?:\\s*)(?:\u5E74)?(?:[\\s|,|\uFF0C]*)(\\d{1,2}|["+Object.keys(tn.NUMBER).join("")+"]{1,3})(?:\\s*)(?:\u6708)(?:\\s*)(\\d{1,2}|["+Object.keys(tn.NUMBER).join("")+"]{1,3})?(?:\\s*)(?:\u65E5|\u53F7)?")}innerExtract(e,t){let n=VD.default(e.refDate),i=e.createParsingResult(t.index,t[0]),s=parseInt(t[Rg]);if(isNaN(s)&&(s=tn.zhStringToNumber(t[Rg])),i.start.assign("month",s),t[Kc]){let a=parseInt(t[Kc]);isNaN(a)&&(a=tn.zhStringToNumber(t[Kc])),i.start.assign("day",a)}else i.start.imply("day",n.date());if(t[zc]){let a=parseInt(t[zc]);isNaN(a)&&(a=tn.zhStringToYear(t[zc])),i.start.assign("year",a)}else i.start.imply("year",n.year());return i}};cs.default=Vc});var Mg=p(ds=>{"use strict";var ZD=ds&&ds.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ds,"__esModule",{value:!0});var QD=ZD(ee()),JD=M(),Dg=Bn(),eM=new RegExp("(\\d+|["+Object.keys(Dg.NUMBER).join("")+"]+|\u534A|\u51E0)(?:\\s*)(?:\u4E2A)?(\u79D2(?:\u949F)?|\u5206\u949F|\u5C0F\u65F6|\u949F|\u65E5|\u5929|\u661F\u671F|\u793C\u62DC|\u6708|\u5E74)(?:(?:\u4E4B|\u8FC7)?\u540E|(?:\u4E4B)?\u5185)","i"),Xc=1,tM=2,Zc=class extends JD.AbstractParserWithWordBoundaryChecking{innerPattern(){return eM}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=parseInt(t[Xc]);if(isNaN(i)&&(i=Dg.zhStringToNumber(t[Xc])),isNaN(i)){let u=t[Xc];if(u==="\u51E0")i=3;else if(u==="\u534A")i=.5;else return null}let s=QD.default(e.refDate),o=t[tM][0];return o.match(/[日天星礼月年]/)?(o=="\u65E5"||o=="\u5929"?s=s.add(i,"d"):o=="\u661F"||o=="\u793C"?s=s.add(i*7,"d"):o=="\u6708"?s=s.add(i,"month"):o=="\u5E74"&&(s=s.add(i,"year")),n.start.assign("year",s.year()),n.start.assign("month",s.month()+1),n.start.assign("day",s.date()),n):(o=="\u79D2"?s=s.add(i,"second"):o=="\u5206"?s=s.add(i,"minute"):(o=="\u5C0F"||o=="\u949F")&&(s=s.add(i,"hour")),n.start.imply("year",s.year()),n.start.imply("month",s.month()+1),n.start.imply("day",s.date()),n.start.assign("hour",s.hour()),n.start.assign("minute",s.minute()),n.start.assign("second",s.second()),n)}};ds.default=Zc});var kg=p(fs=>{"use strict";var rM=fs&&fs.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(fs,"__esModule",{value:!0});var nM=rM(ee()),iM=M(),Sg=Bn(),sM=new RegExp("(?\u4E0A|\u4E0B|\u8FD9)(?:\u4E2A)?(?:\u661F\u671F|\u793C\u62DC|\u5468)(?"+Object.keys(Sg.WEEKDAY_OFFSET).join("|")+")"),Qc=class extends iM.AbstractParserWithWordBoundaryChecking{innerPattern(){return sM}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=t.groups.weekday,s=Sg.WEEKDAY_OFFSET[i];if(s===void 0)return null;let a=null,o=t.groups.prefix;o=="\u4E0A"?a="last":o=="\u4E0B"?a="next":o=="\u8FD9"&&(a="this");let u=nM.default(e.refDate),l=!1,c=u.day();return a=="last"||a=="past"?(u=u.day(s-7),l=!0):a=="next"?(u=u.day(s+7),l=!0):a=="this"?u=u.day(s):Math.abs(s-7-c){"use strict";var aM=ps&&ps.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ps,"__esModule",{value:!0});var oM=aM(ee()),uM=M(),Pt=Bn(),lM=new RegExp("(?:\u4ECE|\u81EA)?(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|["+Object.keys(Pt.NUMBER).join("")+"]+)(?:\\s*)(?:\u70B9|\u65F6|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|["+Object.keys(Pt.NUMBER).join("")+"]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|["+Object.keys(Pt.NUMBER).join("")+"]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?","i"),cM=new RegExp("(?:^\\s*(?:\u5230|\u81F3|\\-|\\\u2013|\\~|\\\u301C)\\s*)(?:(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(\u65E9|\u671D|\u665A)|(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668))|(\u4ECA|\u660E|\u524D|\u5927\u524D|\u540E|\u5927\u540E|\u6628)(?:\u65E5|\u5929)(?:[\\s,\uFF0C]*)(?:(\u4E0A(?:\u5348)|\u65E9(?:\u4E0A)|\u4E0B(?:\u5348)|\u665A(?:\u4E0A)|\u591C(?:\u665A)?|\u4E2D(?:\u5348)|\u51CC(?:\u6668)))?)?(?:[\\s,\uFF0C]*)(?:(\\d+|["+Object.keys(Pt.NUMBER).join("")+"]+)(?:\\s*)(?:\u70B9|\u65F6|:|\uFF1A)(?:\\s*)(\\d+|\u534A|\u6B63|\u6574|["+Object.keys(Pt.NUMBER).join("")+"]+)?(?:\\s*)(?:\u5206|:|\uFF1A)?(?:\\s*)(\\d+|["+Object.keys(Pt.NUMBER).join("")+"]+)?(?:\\s*)(?:\u79D2)?)(?:\\s*(A.M.|P.M.|AM?|PM?))?","i"),Ua=1,La=2,qa=3,Wa=4,Ya=5,$a=6,kt=7,Gn=8,ja=9,Jc=class extends uM.AbstractParserWithWordBoundaryChecking{innerPattern(){return lM}innerExtract(e,t){if(t.index>0&&e.text[t.index-1].match(/\w/))return null;let n=oM.default(e.refDate),i=e.createParsingResult(t.index,t[0]),s=n.clone();if(t[Ua]){let c=t[Ua];c=="\u660E"?n.hour()>1&&s.add(1,"day"):c=="\u6628"?s.add(-1,"day"):c=="\u524D"?s.add(-2,"day"):c=="\u5927\u524D"?s.add(-3,"day"):c=="\u540E"?s.add(2,"day"):c=="\u5927\u540E"&&s.add(3,"day"),i.start.assign("day",s.date()),i.start.assign("month",s.month()+1),i.start.assign("year",s.year())}else if(t[Wa]){let c=t[Wa];c=="\u660E"?s.add(1,"day"):c=="\u6628"?s.add(-1,"day"):c=="\u524D"?s.add(-2,"day"):c=="\u5927\u524D"?s.add(-3,"day"):c=="\u540E"?s.add(2,"day"):c=="\u5927\u540E"&&s.add(3,"day"),i.start.assign("day",s.date()),i.start.assign("month",s.month()+1),i.start.assign("year",s.year())}else i.start.imply("day",s.date()),i.start.imply("month",s.month()+1),i.start.imply("year",s.year());let a=0,o=0,u=-1;if(t[Gn]){let c=parseInt(t[Gn]);if(isNaN(c)&&(c=Pt.zhStringToNumber(t[Gn])),c>=60)return null;i.start.assign("second",c)}if(a=parseInt(t[$a]),isNaN(a)&&(a=Pt.zhStringToNumber(t[$a])),t[kt]?t[kt]=="\u534A"?o=30:t[kt]=="\u6B63"||t[kt]=="\u6574"?o=0:(o=parseInt(t[kt]),isNaN(o)&&(o=Pt.zhStringToNumber(t[kt]))):a>100&&(o=a%100,a=Math.floor(a/100)),o>=60||a>24)return null;if(a>=12&&(u=1),t[ja]){if(a>12)return null;let c=t[ja][0].toLowerCase();c=="a"&&(u=0,a==12&&(a=0)),c=="p"&&(u=1,a!=12&&(a+=12))}else if(t[La]){let d=t[La][0];d=="\u65E9"?(u=0,a==12&&(a=0)):d=="\u665A"&&(u=1,a!=12&&(a+=12))}else if(t[qa]){let d=t[qa][0];d=="\u4E0A"||d=="\u65E9"||d=="\u51CC"?(u=0,a==12&&(a=0)):(d=="\u4E0B"||d=="\u665A")&&(u=1,a!=12&&(a+=12))}else if(t[Ya]){let d=t[Ya][0];d=="\u4E0A"||d=="\u65E9"||d=="\u51CC"?(u=0,a==12&&(a=0)):(d=="\u4E0B"||d=="\u665A")&&(u=1,a!=12&&(a+=12))}if(i.start.assign("hour",a),i.start.assign("minute",o),u>=0?i.start.assign("meridiem",u):a<12?i.start.imply("meridiem",0):i.start.imply("meridiem",1),t=cM.exec(e.text.substring(i.index+i.text.length)),!t)return i.text.match(/^\d+$/)?null:i;let l=s.clone();if(i.end=e.createParsingComponents(),t[Ua]){let c=t[Ua];c=="\u660E"?n.hour()>1&&l.add(1,"day"):c=="\u6628"?l.add(-1,"day"):c=="\u524D"?l.add(-2,"day"):c=="\u5927\u524D"?l.add(-3,"day"):c=="\u540E"?l.add(2,"day"):c=="\u5927\u540E"&&l.add(3,"day"),i.end.assign("day",l.date()),i.end.assign("month",l.month()+1),i.end.assign("year",l.year())}else if(t[Wa]){let c=t[Wa];c=="\u660E"?l.add(1,"day"):c=="\u6628"?l.add(-1,"day"):c=="\u524D"?l.add(-2,"day"):c=="\u5927\u524D"?l.add(-3,"day"):c=="\u540E"?l.add(2,"day"):c=="\u5927\u540E"&&l.add(3,"day"),i.end.assign("day",l.date()),i.end.assign("month",l.month()+1),i.end.assign("year",l.year())}else i.end.imply("day",l.date()),i.end.imply("month",l.month()+1),i.end.imply("year",l.year());if(a=0,o=0,u=-1,t[Gn]){let c=parseInt(t[Gn]);if(isNaN(c)&&(c=Pt.zhStringToNumber(t[Gn])),c>=60)return null;i.end.assign("second",c)}if(a=parseInt(t[$a]),isNaN(a)&&(a=Pt.zhStringToNumber(t[$a])),t[kt]?t[kt]=="\u534A"?o=30:t[kt]=="\u6B63"||t[kt]=="\u6574"?o=0:(o=parseInt(t[kt]),isNaN(o)&&(o=Pt.zhStringToNumber(t[kt]))):a>100&&(o=a%100,a=Math.floor(a/100)),o>=60||a>24)return null;if(a>=12&&(u=1),t[ja]){if(a>12)return null;let c=t[ja][0].toLowerCase();c=="a"&&(u=0,a==12&&(a=0)),c=="p"&&(u=1,a!=12&&(a+=12)),i.start.isCertain("meridiem")||(u==0?(i.start.imply("meridiem",0),i.start.get("hour")==12&&i.start.assign("hour",0)):(i.start.imply("meridiem",1),i.start.get("hour")!=12&&i.start.assign("hour",i.start.get("hour")+12)))}else if(t[La]){let d=t[La][0];d=="\u65E9"?(u=0,a==12&&(a=0)):d=="\u665A"&&(u=1,a!=12&&(a+=12))}else if(t[qa]){let d=t[qa][0];d=="\u4E0A"||d=="\u65E9"||d=="\u51CC"?(u=0,a==12&&(a=0)):(d=="\u4E0B"||d=="\u665A")&&(u=1,a!=12&&(a+=12))}else if(t[Ya]){let d=t[Ya][0];d=="\u4E0A"||d=="\u65E9"||d=="\u51CC"?(u=0,a==12&&(a=0)):(d=="\u4E0B"||d=="\u665A")&&(u=1,a!=12&&(a+=12))}return i.text=i.text+t[0],i.end.assign("hour",a),i.end.assign("minute",o),u>=0?i.end.assign("meridiem",u):i.start.isCertain("meridiem")&&i.start.get("meridiem")==1&&i.start.get("hour")>a?i.end.imply("meridiem",0):a>12&&i.end.imply("meridiem",1),i.end.date().getTime(){"use strict";var dM=hs&&hs.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(hs,"__esModule",{value:!0});var fM=dM(ee()),pM=M(),Ag=Bn(),hM=new RegExp("(?:\u661F\u671F|\u793C\u62DC|\u5468)(?"+Object.keys(Ag.WEEKDAY_OFFSET).join("|")+")"),ed=class extends pM.AbstractParserWithWordBoundaryChecking{innerPattern(){return hM}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=t.groups.weekday,s=Ag.WEEKDAY_OFFSET[i];if(s===void 0)return null;let a=fM.default(e.refDate),o=!1,u=a.day();return Math.abs(s-7-u){"use strict";var mM=ms&&ms.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ms,"__esModule",{value:!0});var yM=mM(Qt()),td=class extends yM.default{patternBetween(){return/^\s*(至|到|-|~|~|-|ー)\s*$/i}};ms.default=td});var Ng=p(ys=>{"use strict";var gM=ys&&ys.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(ys,"__esModule",{value:!0});var _M=gM(or()),rd=class extends _M.default{patternBetween(){return/^\s*$/i}};ys.default=rd});var Ig=p(Me=>{"use strict";var hr=Me&&Me.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Me,"__esModule",{value:!0});Me.createConfiguration=Me.createCasualConfiguration=Me.parseDate=Me.parse=Me.strict=Me.casual=Me.hans=void 0;var nd=It(),TM=hr(fa()),bM=ur(),vM=hr(wg()),EM=hr(Og()),wM=hr(Mg()),RM=hr(kg()),OM=hr(Pg()),DM=hr(xg()),MM=hr(Cg()),SM=hr(Ng());Me.hans=new nd.Chrono(id());Me.casual=new nd.Chrono(id());Me.strict=new nd.Chrono(sd());function kM(r,e,t){return Me.casual.parse(r,e,t)}Me.parse=kM;function PM(r,e,t){return Me.casual.parseDate(r,e,t)}Me.parseDate=PM;function id(){let r=sd();return r.parsers.unshift(new vM.default),r}Me.createCasualConfiguration=id;function sd(){let r=bM.includeCommonConfiguration({parsers:[new EM.default,new RM.default,new DM.default,new OM.default,new wM.default],refiners:[new MM.default,new SM.default]});return r.refiners=r.refiners.filter(e=>!(e instanceof TM.default)),r}Me.createConfiguration=sd});var Ug=p(ht=>{"use strict";var Fg=ht&&ht.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),AM=ht&&ht.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),xM=ht&&ht.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Fg(e,r,t)},CM=ht&&ht.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&Fg(e,r,t);return AM(e,r),e};Object.defineProperty(ht,"__esModule",{value:!0});ht.hans=void 0;xM(Tg(),ht);ht.hans=CM(Ig())});var st=p(Y=>{"use strict";Object.defineProperty(Y,"__esModule",{value:!0});Y.parseTimeUnits=Y.TIME_UNITS_PATTERN=Y.parseYear=Y.YEAR_PATTERN=Y.parseOrdinalNumberPattern=Y.ORDINAL_NUMBER_PATTERN=Y.parseNumberPattern=Y.NUMBER_PATTERN=Y.TIME_UNIT_DICTIONARY=Y.ORDINAL_WORD_DICTIONARY=Y.INTEGER_WORD_DICTIONARY=Y.MONTH_DICTIONARY=Y.FULL_MONTH_NAME_DICTIONARY=Y.WEEKDAY_DICTIONARY=Y.REGEX_PARTS=void 0;var Ba=ie(),NM=je();Y.REGEX_PARTS={leftBoundary:"([^\\p{L}\\p{N}_]|^)",rightBoundary:"(?=[^\\p{L}\\p{N}_]|$)",flags:"iu"};Y.WEEKDAY_DICTIONARY={\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435:0,\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u044F:0,\u0432\u0441\u043A:0,"\u0432\u0441\u043A.":0,\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A:1,\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A\u0430:1,\u043F\u043D:1,"\u043F\u043D.":1,\u0432\u0442\u043E\u0440\u043D\u0438\u043A:2,\u0432\u0442\u043E\u0440\u043D\u0438\u043A\u0430:2,\u0432\u0442:2,"\u0432\u0442.":2,\u0441\u0440\u0435\u0434\u0430:3,\u0441\u0440\u0435\u0434\u044B:3,\u0441\u0440\u0435\u0434\u0443:3,\u0441\u0440:3,"\u0441\u0440.":3,\u0447\u0435\u0442\u0432\u0435\u0440\u0433:4,\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430:4,\u0447\u0442:4,"\u0447\u0442.":4,\u043F\u044F\u0442\u043D\u0438\u0446\u0430:5,\u043F\u044F\u0442\u043D\u0438\u0446\u0443:5,\u043F\u044F\u0442\u043D\u0438\u0446\u044B:5,\u043F\u0442:5,"\u043F\u0442.":5,\u0441\u0443\u0431\u0431\u043E\u0442\u0430:6,\u0441\u0443\u0431\u0431\u043E\u0442\u0443:6,\u0441\u0443\u0431\u0431\u043E\u0442\u044B:6,\u0441\u0431:6,"\u0441\u0431.":6};Y.FULL_MONTH_NAME_DICTIONARY={\u044F\u043D\u0432\u0430\u0440\u044C:1,\u044F\u043D\u0432\u0430\u0440\u044F:1,\u044F\u043D\u0432\u0430\u0440\u0435:1,\u0444\u0435\u0432\u0440\u044F\u043B\u044C:2,\u0444\u0435\u0432\u0440\u044F\u043B\u044F:2,\u0444\u0435\u0432\u0440\u044F\u043B\u0435:2,\u043C\u0430\u0440\u0442:3,\u043C\u0430\u0440\u0442\u0430:3,\u043C\u0430\u0440\u0442\u0435:3,\u0430\u043F\u0440\u0435\u043B\u044C:4,\u0430\u043F\u0440\u0435\u043B\u044F:4,\u0430\u043F\u0440\u0435\u043B\u0435:4,\u043C\u0430\u0439:5,\u043C\u0430\u044F:5,\u043C\u0430\u0435:5,\u0438\u044E\u043D\u044C:6,\u0438\u044E\u043D\u044F:6,\u0438\u044E\u043D\u0435:6,\u0438\u044E\u043B\u044C:7,\u0438\u044E\u043B\u044F:7,\u0438\u044E\u043B\u0435:7,\u0430\u0432\u0433\u0443\u0441\u0442:8,\u0430\u0432\u0433\u0443\u0441\u0442\u0430:8,\u0430\u0432\u0433\u0443\u0441\u0442\u0435:8,\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C:9,\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044F:9,\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u0435:9,\u043E\u043A\u0442\u044F\u0431\u0440\u044C:10,\u043E\u043A\u0442\u044F\u0431\u0440\u044F:10,\u043E\u043A\u0442\u044F\u0431\u0440\u0435:10,\u043D\u043E\u044F\u0431\u0440\u044C:11,\u043D\u043E\u044F\u0431\u0440\u044F:11,\u043D\u043E\u044F\u0431\u0440\u0435:11,\u0434\u0435\u043A\u0430\u0431\u0440\u044C:12,\u0434\u0435\u043A\u0430\u0431\u0440\u044F:12,\u0434\u0435\u043A\u0430\u0431\u0440\u0435:12};Y.MONTH_DICTIONARY=Object.assign(Object.assign({},Y.FULL_MONTH_NAME_DICTIONARY),{\u044F\u043D\u0432:1,"\u044F\u043D\u0432.":1,\u0444\u0435\u0432:2,"\u0444\u0435\u0432.":2,\u043C\u0430\u0440:3,"\u043C\u0430\u0440.":3,\u0430\u043F\u0440:4,"\u0430\u043F\u0440.":4,\u0430\u0432\u0433:8,"\u0430\u0432\u0433.":8,\u0441\u0435\u043D:9,"\u0441\u0435\u043D.":9,\u043E\u043A\u0442:10,"\u043E\u043A\u0442.":10,\u043D\u043E\u044F:11,"\u043D\u043E\u044F.":11,\u0434\u0435\u043A:12,"\u0434\u0435\u043A.":12});Y.INTEGER_WORD_DICTIONARY={\u043E\u0434\u0438\u043D:1,\u043E\u0434\u043D\u0430:1,\u043E\u0434\u043D\u043E\u0439:1,\u043E\u0434\u043D\u0443:1,\u0434\u0432\u0435:2,\u0434\u0432\u0430:2,\u0434\u0432\u0443\u0445:2,\u0442\u0440\u0438:3,\u0442\u0440\u0435\u0445:3,\u0442\u0440\u0451\u0445:3,\u0447\u0435\u0442\u044B\u0440\u0435:4,\u0447\u0435\u0442\u044B\u0440\u0435\u0445:4,\u0447\u0435\u0442\u044B\u0440\u0451\u0445:4,\u043F\u044F\u0442\u044C:5,\u043F\u044F\u0442\u0438:5,\u0448\u0435\u0441\u0442\u044C:6,\u0448\u0435\u0441\u0442\u0438:6,\u0441\u0435\u043C\u044C:7,\u0441\u0435\u043C\u0438:7,\u0432\u043E\u0441\u0435\u043C\u044C:8,\u0432\u043E\u0441\u0435\u043C\u044C\u043C\u0438:8,\u0434\u0435\u0432\u044F\u0442\u044C:9,\u0434\u0435\u0432\u044F\u0442\u0438:9,\u0434\u0435\u0441\u044F\u0442\u044C:10,\u0434\u0435\u0441\u044F\u0442\u0438:10,\u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u044C:11,\u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u0438:11,\u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u044C:12,\u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u0438:12};Y.ORDINAL_WORD_DICTIONARY={\u043F\u0435\u0440\u0432\u043E\u0435:1,\u043F\u0435\u0440\u0432\u043E\u0433\u043E:1,\u0432\u0442\u043E\u0440\u043E\u0435:2,\u0432\u0442\u043E\u0440\u043E\u0433\u043E:2,\u0442\u0440\u0435\u0442\u044C\u0435:3,\u0442\u0440\u0435\u0442\u044C\u0435\u0433\u043E:3,\u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0435:4,\u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0433\u043E:4,\u043F\u044F\u0442\u043E\u0435:5,\u043F\u044F\u0442\u043E\u0433\u043E:5,\u0448\u0435\u0441\u0442\u043E\u0435:6,\u0448\u0435\u0441\u0442\u043E\u0433\u043E:6,\u0441\u0435\u0434\u044C\u043C\u043E\u0435:7,\u0441\u0435\u0434\u044C\u043C\u043E\u0433\u043E:7,\u0432\u043E\u0441\u044C\u043C\u043E\u0435:8,\u0432\u043E\u0441\u044C\u043C\u043E\u0433\u043E:8,\u0434\u0435\u0432\u044F\u0442\u043E\u0435:9,\u0434\u0435\u0432\u044F\u0442\u043E\u0433\u043E:9,\u0434\u0435\u0441\u044F\u0442\u043E\u0435:10,\u0434\u0435\u0441\u044F\u0442\u043E\u0433\u043E:10,\u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:11,\u043E\u0434\u0438\u043D\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:11,\u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:12,\u0434\u0432\u0435\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:12,\u0442\u0440\u0438\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:13,\u0442\u0440\u0438\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:13,\u0447\u0435\u0442\u044B\u0440\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:14,\u0447\u0435\u0442\u044B\u0440\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:14,\u043F\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:15,\u043F\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:15,\u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:16,\u0448\u0435\u0441\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:16,\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:17,\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:17,\u0432\u043E\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:18,\u0432\u043E\u0441\u0435\u043C\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:18,\u0434\u0435\u0432\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0435:19,\u0434\u0435\u0432\u044F\u0442\u043D\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:19,\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u043E\u0435:20,\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u043E\u0433\u043E:20,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435":21,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0433\u043E":21,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u0442\u043E\u0440\u043E\u0435":22,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u0442\u043E\u0440\u043E\u0433\u043E":22,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0442\u0440\u0435\u0442\u044C\u0435":23,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0442\u0440\u0435\u0442\u044C\u0435\u0433\u043E":23,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0435":24,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043E\u0433\u043E":24,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u044F\u0442\u043E\u0435":25,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u043F\u044F\u0442\u043E\u0433\u043E":25,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0448\u0435\u0441\u0442\u043E\u0435":26,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0448\u0435\u0441\u0442\u043E\u0433\u043E":26,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0441\u0435\u0434\u044C\u043C\u043E\u0435":27,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0441\u0435\u0434\u044C\u043C\u043E\u0433\u043E":27,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u043E\u0441\u044C\u043C\u043E\u0435":28,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0432\u043E\u0441\u044C\u043C\u043E\u0433\u043E":28,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0434\u0435\u0432\u044F\u0442\u043E\u0435":29,"\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C \u0434\u0435\u0432\u044F\u0442\u043E\u0433\u043E":29,\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u043E\u0435:30,\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u043E\u0433\u043E:30,"\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435":31,"\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0433\u043E":31};Y.TIME_UNIT_DICTIONARY={\u0441\u0435\u043A:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u0430:"second",\u0441\u0435\u043A\u0443\u043D\u0434:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u044B:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u0443:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0430:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0438:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u0435\u043A:"second",\u0441\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0443:"second",\u043C\u0438\u043D:"minute",\u043C\u0438\u043D\u0443\u0442\u0430:"minute",\u043C\u0438\u043D\u0443\u0442:"minute",\u043C\u0438\u043D\u0443\u0442\u044B:"minute",\u043C\u0438\u043D\u0443\u0442\u0443:"minute",\u043C\u0438\u043D\u0443\u0442\u043E\u043A:"minute",\u043C\u0438\u043D\u0443\u0442\u043A\u0438:"minute",\u043C\u0438\u043D\u0443\u0442\u043A\u0443:"minute",\u0447\u0430\u0441:"hour",\u0447\u0430\u0441\u043E\u0432:"hour",\u0447\u0430\u0441\u0430:"hour",\u0447\u0430\u0441\u0443:"hour",\u0447\u0430\u0441\u0438\u043A\u043E\u0432:"hour",\u0447\u0430\u0441\u0438\u043A\u0430:"hour",\u0447\u0430\u0441\u0438\u043A\u0435:"hour",\u0447\u0430\u0441\u0438\u043A:"hour",\u0434\u0435\u043D\u044C:"d",\u0434\u043D\u044F:"d",\u0434\u043D\u0435\u0439:"d",\u0441\u0443\u0442\u043E\u043A:"d",\u0441\u0443\u0442\u043A\u0438:"d",\u043D\u0435\u0434\u0435\u043B\u044F:"week",\u043D\u0435\u0434\u0435\u043B\u0435:"week",\u043D\u0435\u0434\u0435\u043B\u0438:"week",\u043D\u0435\u0434\u0435\u043B\u044E:"week",\u043D\u0435\u0434\u0435\u043B\u044C:"week",\u043D\u0435\u0434\u0435\u043B\u044C\u043A\u0435:"week",\u043D\u0435\u0434\u0435\u043B\u044C\u043A\u0438:"week",\u043D\u0435\u0434\u0435\u043B\u0435\u043A:"week",\u043C\u0435\u0441\u044F\u0446:"month",\u043C\u0435\u0441\u044F\u0446\u0435:"month",\u043C\u0435\u0441\u044F\u0446\u0435\u0432:"month",\u043C\u0435\u0441\u044F\u0446\u0430:"month",\u043A\u0432\u0430\u0440\u0442\u0430\u043B:"quarter",\u043A\u0432\u0430\u0440\u0442\u0430\u043B\u0435:"quarter",\u043A\u0432\u0430\u0440\u0442\u0430\u043B\u043E\u0432:"quarter",\u0433\u043E\u0434:"year",\u0433\u043E\u0434\u0430:"year",\u0433\u043E\u0434\u0443:"year",\u0433\u043E\u0434\u043E\u0432:"year",\u043B\u0435\u0442:"year",\u0433\u043E\u0434\u0438\u043A:"year",\u0433\u043E\u0434\u0438\u043A\u0430:"year",\u0433\u043E\u0434\u0438\u043A\u043E\u0432:"year"};Y.NUMBER_PATTERN=`(?:${Ba.matchAnyPattern(Y.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|\u043F\u043E\u043B|\u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E|\u043F\u0430\u0440(?:\u044B|\u0443)|\\s{0,3})`;function qg(r){let e=r.toLowerCase();return Y.INTEGER_WORD_DICTIONARY[e]!==void 0?Y.INTEGER_WORD_DICTIONARY[e]:e.match(/несколько/)?3:e.match(/пол/)?.5:e.match(/пар/)?2:e===""?1:parseFloat(e)}Y.parseNumberPattern=qg;Y.ORDINAL_NUMBER_PATTERN=`(?:${Ba.matchAnyPattern(Y.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:\u0433\u043E|\u043E\u0433\u043E|\u0435|\u043E\u0435)?)`;function IM(r){let e=r.toLowerCase();return Y.ORDINAL_WORD_DICTIONARY[e]!==void 0?Y.ORDINAL_WORD_DICTIONARY[e]:(e=e.replace(/(?:st|nd|rd|th)$/i,""),parseInt(e))}Y.parseOrdinalNumberPattern=IM;var ad="(?:\\s+(?:\u0433\u043E\u0434\u0443|\u0433\u043E\u0434\u0430|\u0433\u043E\u0434|\u0433|\u0433.))?";Y.YEAR_PATTERN=`(?:[1-9][0-9]{0,3}${ad}\\s*(?:\u043D.\u044D.|\u0434\u043E \u043D.\u044D.|\u043D. \u044D.|\u0434\u043E \u043D. \u044D.)|[1-2][0-9]{3}${ad}|[5-9][0-9]${ad})`;function FM(r){if(/(год|года|г|г.)/i.test(r)&&(r=r.replace(/(год|года|г|г.)/i,"")),/(до н.э.|до н. э.)/i.test(r))return r=r.replace(/(до н.э.|до н. э.)/i,""),-parseInt(r);if(/(н. э.|н.э.)/i.test(r))return r=r.replace(/(н. э.|н.э.)/i,""),parseInt(r);let e=parseInt(r);return NM.findMostLikelyADYear(e)}Y.parseYear=FM;var Wg=`(${Y.NUMBER_PATTERN})\\s{0,3}(${Ba.matchAnyPattern(Y.TIME_UNIT_DICTIONARY)})`,Lg=new RegExp(Wg,"i");Y.TIME_UNITS_PATTERN=Ba.repeatedTimeunitPattern("(?:(?:\u043E\u043A\u043E\u043B\u043E|\u043F\u0440\u0438\u043C\u0435\u0440\u043D\u043E)\\s{0,3})?",Wg);function UM(r){let e={},t=r,n=Lg.exec(t);for(;n;)LM(e,n),t=t.substring(n[0].length).trim(),n=Lg.exec(t);return e}Y.parseTimeUnits=UM;function LM(r,e){let t=qg(e[1]),n=Y.TIME_UNIT_DICTIONARY[e[2].toLowerCase()];r[n]=t}});var $g=p(ud=>{"use strict";Object.defineProperty(ud,"__esModule",{value:!0});var gs=st(),qM=be(),WM=M(),Yg=`(?:(?:\u043E\u043A\u043E\u043B\u043E|\u043F\u0440\u0438\u043C\u0435\u0440\u043D\u043E)\\s*(?:~\\s*)?)?(${gs.TIME_UNITS_PATTERN})${gs.REGEX_PARTS.rightBoundary}`,YM=new RegExp(`(?:\u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0435|\u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0438)\\s*${Yg}`,gs.REGEX_PARTS.flags),$M=new RegExp(Yg,"i"),od=class extends WM.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return gs.REGEX_PARTS.leftBoundary}innerPattern(e){return e.option.forwardDate?$M:YM}innerExtract(e,t){let n=gs.parseTimeUnits(t[1]);return qM.ParsingComponents.createRelativeFromReference(e.reference,n)}};ud.default=od});var zg=p(cd=>{"use strict";Object.defineProperty(cd,"__esModule",{value:!0});var jM=je(),_s=st(),Hg=st(),Ga=st(),BM=ie(),GM=M(),HM=new RegExp(`(?:\u0441)?\\s*(${Ga.ORDINAL_NUMBER_PATTERN})(?:\\s{0,3}(?:\u043F\u043E|-|\u2013|\u0434\u043E)?\\s{0,3}(${Ga.ORDINAL_NUMBER_PATTERN}))?(?:-|\\/|\\s{0,3}(?:of)?\\s{0,3})(${BM.matchAnyPattern(_s.MONTH_DICTIONARY)})(?:(?:-|\\/|,?\\s{0,3})(${Hg.YEAR_PATTERN}(?![^\\s]\\d)))?${_s.REGEX_PARTS.rightBoundary}`,_s.REGEX_PARTS.flags),jg=1,Bg=2,zM=3,Gg=4,ld=class extends GM.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return _s.REGEX_PARTS.leftBoundary}innerPattern(){return HM}innerExtract(e,t){let n=e.createParsingResult(t.index,t[0]),i=_s.MONTH_DICTIONARY[t[zM].toLowerCase()],s=Ga.parseOrdinalNumberPattern(t[jg]);if(s>31)return t.index=t.index+t[jg].length,null;if(n.start.assign("month",i),n.start.assign("day",s),t[Gg]){let a=Hg.parseYear(t[Gg]);n.start.assign("year",a)}else{let a=jM.findYearClosestToRef(e.refDate,s,i);n.start.imply("year",a)}if(t[Bg]){let a=Ga.parseOrdinalNumberPattern(t[Bg]);n.end=n.start.clone(),n.end.assign("day",a)}return n}};cd.default=ld});var Xg=p(fd=>{"use strict";Object.defineProperty(fd,"__esModule",{value:!0});var Ts=st(),KM=je(),VM=ie(),Vg=st(),XM=M(),ZM=new RegExp(`((?:\u0432)\\s*)?(${VM.matchAnyPattern(Ts.MONTH_DICTIONARY)})\\s*(?:[,-]?\\s*(${Vg.YEAR_PATTERN})?)?(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)`,Ts.REGEX_PARTS.flags),QM=2,Kg=3,dd=class extends XM.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return Ts.REGEX_PARTS.leftBoundary}innerPattern(){return ZM}innerExtract(e,t){let n=t[QM].toLowerCase();if(t[0].length<=3&&!Ts.FULL_MONTH_NAME_DICTIONARY[n])return null;let i=e.createParsingResult(t.index,t.index+t[0].length);i.start.imply("day",1);let s=Ts.MONTH_DICTIONARY[n];if(i.start.assign("month",s),t[Kg]){let a=Vg.parseYear(t[Kg]);i.start.assign("year",a)}else{let a=KM.findYearClosestToRef(e.refDate,1,s);i.start.imply("year",a)}return i}};fd.default=dd});var Qg=p(hd=>{"use strict";Object.defineProperty(hd,"__esModule",{value:!0});var Ha=ke(),JM=Kr(),Zg=st(),pd=class extends JM.AbstractTimeExpressionParser{constructor(e){super(e)}patternFlags(){return Zg.REGEX_PARTS.flags}primaryPatternLeftBoundary(){return"(^|\\s|T|(?:[^\\p{L}\\p{N}_]))"}followingPhase(){return"\\s*(?:\\-|\\\u2013|\\~|\\\u301C|\u0434\u043E|\u0438|\u043F\u043E|\\?)\\s*"}primaryPrefix(){return"(?:(?:\u0432|\u0441)\\s*)??"}primarySuffix(){return`(?:\\s*(?:\u0443\u0442\u0440\u0430|\u0432\u0435\u0447\u0435\u0440\u0430|\u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043B\u0443\u0434\u043D\u044F))?(?!\\/)${Zg.REGEX_PARTS.rightBoundary}`}extractPrimaryTimeComponents(e,t){let n=super.extractPrimaryTimeComponents(e,t);if(n){if(t[0].endsWith("\u0432\u0435\u0447\u0435\u0440\u0430")){let i=n.get("hour");i>=6&&i<12?(n.assign("hour",n.get("hour")+12),n.assign("meridiem",Ha.Meridiem.PM)):i<6&&n.assign("meridiem",Ha.Meridiem.AM)}if(t[0].endsWith("\u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043B\u0443\u0434\u043D\u044F")){n.assign("meridiem",Ha.Meridiem.PM);let i=n.get("hour");i>=0&&i<=6&&n.assign("hour",n.get("hour")+12)}t[0].endsWith("\u0443\u0442\u0440\u0430")&&(n.assign("meridiem",Ha.Meridiem.AM),n.get("hour")<12&&n.assign("hour",n.get("hour")))}return n}};hd.default=pd});var Jg=p(yd=>{"use strict";Object.defineProperty(yd,"__esModule",{value:!0});var za=st(),eS=be(),tS=M(),rS=Ot(),nS=new RegExp(`(${za.TIME_UNITS_PATTERN})\\s{0,5}\u043D\u0430\u0437\u0430\u0434(?=(?:\\W|$))`,za.REGEX_PARTS.flags),md=class extends tS.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return za.REGEX_PARTS.leftBoundary}innerPattern(){return nS}innerExtract(e,t){let n=za.parseTimeUnits(t[1]),i=rS.reverseTimeUnits(n);return eS.ParsingComponents.createRelativeFromReference(e.reference,i)}};yd.default=md});var e_=p(bs=>{"use strict";var iS=bs&&bs.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(bs,"__esModule",{value:!0});var sS=iS(Qt()),gd=class extends sS.default{patternBetween(){return/^\s*(и до|и по|до|по|-)\s*$/i}};bs.default=gd});var t_=p(vs=>{"use strict";var aS=vs&&vs.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(vs,"__esModule",{value:!0});var oS=aS(or()),_d=class extends oS.default{patternBetween(){return new RegExp("^\\s*(T|\u0432|,|-)?\\s*$")}};vs.default=_d});var r_=p(mr=>{"use strict";var uS=mr&&mr.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),lS=mr&&mr.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),cS=mr&&mr.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&uS(e,r,t);return lS(e,r),e};Object.defineProperty(mr,"__esModule",{value:!0});var dS=M(),Es=cS(cr()),Td=st(),fS=new RegExp(`(?:\u0441|\u0441\u043E)?\\s*(\u0441\u0435\u0433\u043E\u0434\u043D\u044F|\u0432\u0447\u0435\u0440\u0430|\u0437\u0430\u0432\u0442\u0440\u0430|\u043F\u043E\u0441\u043B\u0435\u0437\u0430\u0432\u0442\u0440\u0430|\u043F\u043E\u0437\u0430\u0432\u0447\u0435\u0440\u0430)${Td.REGEX_PARTS.rightBoundary}`,Td.REGEX_PARTS.flags),bd=class extends dS.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return Td.REGEX_PARTS.leftBoundary}innerPattern(e){return fS}innerExtract(e,t){let n=t[1].toLowerCase(),i=e.createParsingComponents();switch(n){case"\u0441\u0435\u0433\u043E\u0434\u043D\u044F":return Es.today(e.reference);case"\u0432\u0447\u0435\u0440\u0430":return Es.yesterday(e.reference);case"\u0437\u0430\u0432\u0442\u0440\u0430":return Es.tomorrow(e.reference);case"\u043F\u043E\u0441\u043B\u0435\u0437\u0430\u0432\u0442\u0440\u0430":return Es.theDayAfter(e.reference,2);case"\u043F\u043E\u0437\u0430\u0432\u0447\u0435\u0440\u0430":return Es.theDayBefore(e.reference,2)}return i}};mr.default=bd});var n_=p(Wt=>{"use strict";var pS=Wt&&Wt.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),hS=Wt&&Wt.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),mS=Wt&&Wt.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&pS(e,r,t);return hS(e,r),e},yS=Wt&&Wt.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Wt,"__esModule",{value:!0});var gS=M(),rn=mS(cr()),_S=Rt(),TS=yS(ee()),vd=st(),bS=new RegExp(`(\u0441\u0435\u0439\u0447\u0430\u0441|\u043F\u0440\u043E\u0448\u043B\u044B\u043C\\s*\u0432\u0435\u0447\u0435\u0440\u043E\u043C|\u043F\u0440\u043E\u0448\u043B\u043E\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u0441\u0435\u0433\u043E\u0434\u043D\u044F\\s*\u043D\u043E\u0447\u044C\u044E|\u044D\u0442\u043E\u0439\\s*\u043D\u043E\u0447\u044C\u044E|\u043D\u043E\u0447\u044C\u044E|\u044D\u0442\u0438\u043C \u0443\u0442\u0440\u043E\u043C|\u0443\u0442\u0440\u043E\u043C|\u0443\u0442\u0440\u0430|\u0432\\s*\u043F\u043E\u043B\u0434\u0435\u043D\u044C|\u0432\u0435\u0447\u0435\u0440\u043E\u043C|\u0432\u0435\u0447\u0435\u0440\u0430|\u0432\\s*\u043F\u043E\u043B\u043D\u043E\u0447\u044C)${vd.REGEX_PARTS.rightBoundary}`,vd.REGEX_PARTS.flags),Ed=class extends gS.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return vd.REGEX_PARTS.leftBoundary}innerPattern(){return bS}innerExtract(e,t){let n=TS.default(e.refDate),i=t[0].toLowerCase(),s=e.createParsingComponents();if(i==="\u0441\u0435\u0439\u0447\u0430\u0441")return rn.now(e.reference);if(i==="\u0432\u0435\u0447\u0435\u0440\u043E\u043C"||i==="\u0432\u0435\u0447\u0435\u0440\u0430")return rn.evening(e.reference);if(i.endsWith("\u0443\u0442\u0440\u043E\u043C")||i.endsWith("\u0443\u0442\u0440\u0430"))return rn.morning(e.reference);if(i.match(/в\s*полдень/))return rn.noon(e.reference);if(i.match(/прошлой\s*ночью/))return rn.lastNight(e.reference);if(i.match(/прошлым\s*вечером/))return rn.yesterdayEvening(e.reference);if(i.match(/следующей\s*ночью/)){let a=n.hour()<22?1:2;n=n.add(a,"day"),_S.assignSimilarDate(s,n),s.imply("hour",0)}return i.match(/в\s*полночь/)||i.endsWith("\u043D\u043E\u0447\u044C\u044E")?rn.midnight(e.reference):s}};Wt.default=Ed});var i_=p(Rd=>{"use strict";Object.defineProperty(Rd,"__esModule",{value:!0});var ws=st(),vS=ie(),ES=M(),wS=Xr(),RS=new RegExp(`(?:(?:,|\\(|\uFF08)\\s*)?(?:\u0432\\s*?)?(?:(\u044D\u0442\u0443|\u044D\u0442\u043E\u0442|\u043F\u0440\u043E\u0448\u043B\u044B\u0439|\u043F\u0440\u043E\u0448\u043B\u0443\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E)\\s*)?(${vS.matchAnyPattern(ws.WEEKDAY_DICTIONARY)})(?:\\s*(?:,|\\)|\uFF09))?(?:\\s*\u043D\u0430\\s*(\u044D\u0442\u043E\u0439|\u043F\u0440\u043E\u0448\u043B\u043E\u0439|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439)\\s*\u043D\u0435\u0434\u0435\u043B\u0435)?${ws.REGEX_PARTS.rightBoundary}`,ws.REGEX_PARTS.flags),OS=1,DS=2,MS=3,wd=class extends ES.AbstractParserWithWordBoundaryChecking{innerPattern(){return RS}patternLeftBoundary(){return ws.REGEX_PARTS.leftBoundary}innerExtract(e,t){let n=t[DS].toLowerCase(),i=ws.WEEKDAY_DICTIONARY[n],s=t[OS],a=t[MS],o=s||a;o=o||"",o=o.toLowerCase();let u=null;o=="\u043F\u0440\u043E\u0448\u043B\u044B\u0439"||o=="\u043F\u0440\u043E\u0448\u043B\u0443\u044E"||o=="\u043F\u0440\u043E\u0448\u043B\u043E\u0439"?u="last":o=="\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439"||o=="\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E"||o=="\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439"||o=="\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E"?u="next":(o=="\u044D\u0442\u043E\u0442"||o=="\u044D\u0442\u0443"||o=="\u044D\u0442\u043E\u0439")&&(u="this");let l=wS.toDayJSWeekday(e.refDate,i,u);return e.createParsingComponents().assign("weekday",i).imply("day",l.date()).imply("month",l.month()+1).imply("year",l.year())}};Rd.default=wd});var a_=p(Os=>{"use strict";var SS=Os&&Os.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(Os,"__esModule",{value:!0});var Rs=st(),s_=be(),kS=SS(ee()),PS=M(),AS=ie(),xS=new RegExp(`(\u0432 \u043F\u0440\u043E\u0448\u043B\u043E\u043C|\u043D\u0430 \u043F\u0440\u043E\u0448\u043B\u043E\u0439|\u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439|\u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C|\u043D\u0430 \u044D\u0442\u043E\u0439|\u0432 \u044D\u0442\u043E\u043C)\\s*(${AS.matchAnyPattern(Rs.TIME_UNIT_DICTIONARY)})(?=\\s*)${Rs.REGEX_PARTS.rightBoundary}`,Rs.REGEX_PARTS.flags),CS=1,NS=2,Od=class extends PS.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return Rs.REGEX_PARTS.leftBoundary}innerPattern(){return xS}innerExtract(e,t){let n=t[CS].toLowerCase(),i=t[NS].toLowerCase(),s=Rs.TIME_UNIT_DICTIONARY[i];if(n=="\u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439"||n=="\u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C"){let u={};return u[s]=1,s_.ParsingComponents.createRelativeFromReference(e.reference,u)}if(n=="\u0432 \u043F\u0440\u043E\u0448\u043B\u043E\u043C"||n=="\u043D\u0430 \u043F\u0440\u043E\u0448\u043B\u043E\u0439"){let u={};return u[s]=-1,s_.ParsingComponents.createRelativeFromReference(e.reference,u)}let a=e.createParsingComponents(),o=kS.default(e.reference.instant);return s.match(/week/i)?(o=o.add(-o.get("d"),"d"),a.imply("day",o.date()),a.imply("month",o.month()+1),a.imply("year",o.year())):s.match(/month/i)?(o=o.add(-o.date()+1,"d"),a.imply("day",o.date()),a.assign("year",o.year()),a.assign("month",o.month()+1)):s.match(/year/i)&&(o=o.add(-o.date()+1,"d"),o=o.add(-o.month(),"month"),a.imply("day",o.date()),a.imply("month",o.month()+1),a.assign("year",o.year())),a}};Os.default=Od});var o_=p(Md=>{"use strict";Object.defineProperty(Md,"__esModule",{value:!0});var Ds=st(),IS=be(),FS=M(),US=Ot(),LS=new RegExp(`(\u044D\u0442\u0438|\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435|\u043F\u0440\u043E\u0448\u043B\u044B\u0435|\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435|\u043F\u043E\u0441\u043B\u0435|\u0447\u0435\u0440\u0435\u0437|\\+|-)\\s*(${Ds.TIME_UNITS_PATTERN})${Ds.REGEX_PARTS.rightBoundary}`,Ds.REGEX_PARTS.flags),Dd=class extends FS.AbstractParserWithWordBoundaryChecking{patternLeftBoundary(){return Ds.REGEX_PARTS.leftBoundary}innerPattern(){return LS}innerExtract(e,t){let n=t[1].toLowerCase(),i=Ds.parseTimeUnits(t[2]);switch(n){case"\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435":case"\u043F\u0440\u043E\u0448\u043B\u044B\u0435":case"-":i=US.reverseTimeUnits(i);break}return IS.ParsingComponents.createRelativeFromReference(e.reference,i)}};Md.default=Dd});var c_=p(qe=>{"use strict";var mt=qe&&qe.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(qe,"__esModule",{value:!0});qe.createConfiguration=qe.createCasualConfiguration=qe.parseDate=qe.parse=qe.strict=qe.casual=void 0;var qS=mt($g()),WS=mt(zg()),YS=mt(Xg()),$S=mt(Qg()),jS=mt(Jg()),BS=mt(e_()),GS=mt(t_()),HS=ur(),zS=mt(r_()),KS=mt(n_()),VS=mt(i_()),XS=mt(a_()),u_=It(),ZS=mt(Zr()),QS=mt(o_());qe.casual=new u_.Chrono(l_());qe.strict=new u_.Chrono(Sd(!0));function JS(r,e,t){return qe.casual.parse(r,e,t)}qe.parse=JS;function ek(r,e,t){return qe.casual.parseDate(r,e,t)}qe.parseDate=ek;function l_(){let r=Sd(!1);return r.parsers.unshift(new zS.default),r.parsers.unshift(new KS.default),r.parsers.unshift(new YS.default),r.parsers.unshift(new XS.default),r.parsers.unshift(new QS.default),r}qe.createCasualConfiguration=l_;function Sd(r=!0){return HS.includeCommonConfiguration({parsers:[new ZS.default(!0),new qS.default,new WS.default,new VS.default,new $S.default(r),new jS.default],refiners:[new GS.default,new BS.default]},r)}qe.createConfiguration=Sd});var ke=p(G=>{"use strict";var tk=G&&G.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),rk=G&&G.__setModuleDefault||(Object.create?function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}:function(r,e){r.default=e}),Ur=G&&G.__importStar||function(r){if(r&&r.__esModule)return r;var e={};if(r!=null)for(var t in r)t!=="default"&&Object.prototype.hasOwnProperty.call(r,t)&&tk(e,r,t);return rk(e,r),e};Object.defineProperty(G,"__esModule",{value:!0});G.parseDate=G.parse=G.casual=G.strict=G.ru=G.zh=G.nl=G.pt=G.ja=G.fr=G.de=G.Meridiem=G.Chrono=G.en=void 0;var kd=Ur(Hu());G.en=kd;var nk=It();Object.defineProperty(G,"Chrono",{enumerable:!0,get:function(){return nk.Chrono}});var ik;(function(r){r[r.AM=0]="AM",r[r.PM=1]="PM"})(ik=G.Meridiem||(G.Meridiem={}));var sk=Ur(Tm());G.de=sk;var ak=Ur(Km());G.fr=ak;var ok=Ur(ny());G.ja=ok;var uk=Ur(Ty());G.pt=uk;var lk=Ur(ng());G.nl=lk;var ck=Ur(Ug());G.zh=ck;var dk=Ur(c_());G.ru=dk;G.strict=kd.strict;G.casual=kd.casual;function fk(r,e,t){return G.casual.parse(r,e,t)}G.parse=fk;function pk(r,e,t){return G.casual.parseDate(r,e,t)}G.parseDate=pk});var nr=p(Yr=>{"use strict";Yr.__esModule=!0;var Yk;(function(r){r.AND="AND",r.OR="OR",r.XOR="XOR",r.NOT="NOT"})(Yk=Yr.Operators||(Yr.Operators={}));var $k;(function(r){r.OPEN_PARENTHESIS="(",r.CLOSE_PARENTHESIS=")"})($k=Yr.StructuralCharacters||(Yr.StructuralCharacters={}));var jk;(function(r){r.IDENTIFIER="IDENTIFIER",r.OPERATOR="OPERATOR",r.STRUCTURAL_CHARACTER="STRUCTURAL_CHARACTER",r.EOF="EOF",r.COMMENT="COMMENT"})(jk=Yr.Tokens||(Yr.Tokens={}))});var Qd=p(co=>{"use strict";co.__esModule=!0;var ve=nr();co.OPERATOR_PRECEDENCE={NOT:0,XOR:1,AND:2,OR:3};co.VALID_TOKENS={identifierOnly:[{name:ve.Tokens.IDENTIFIER},{name:ve.Tokens.STRUCTURAL_CHARACTER,value:ve.StructuralCharacters.OPEN_PARENTHESIS}],identifierOrNot:[{name:ve.Tokens.IDENTIFIER},{name:ve.Tokens.STRUCTURAL_CHARACTER,value:ve.StructuralCharacters.OPEN_PARENTHESIS},{name:ve.Tokens.OPERATOR,value:ve.Operators.NOT}],binaryOperator:[{name:ve.Tokens.OPERATOR,value:ve.Operators.AND},{name:ve.Tokens.OPERATOR,value:ve.Operators.OR},{name:ve.Tokens.OPERATOR,value:ve.Operators.XOR}],binaryOperatorOrClose:[{name:ve.Tokens.OPERATOR,value:ve.Operators.AND},{name:ve.Tokens.OPERATOR,value:ve.Operators.OR},{name:ve.Tokens.OPERATOR,value:ve.Operators.XOR},{name:ve.Tokens.STRUCTURAL_CHARACTER,value:ve.StructuralCharacters.CLOSE_PARENTHESIS}]}});var Jd=p(Er=>{"use strict";Er.__esModule=!0;var ii=nr();Er.STRUCTURAL_CHARACTERS={"(":ii.StructuralCharacters.OPEN_PARENTHESIS,")":ii.StructuralCharacters.CLOSE_PARENTHESIS};Er.OPERATORS={AND:ii.Operators.AND,OR:ii.Operators.OR,XOR:ii.Operators.XOR,NOT:ii.Operators.NOT};Er.SEPARATORS=new Set([32,9,10,13].map(function(r){return String.fromCodePoint(r)}));Er.QUOTED_IDENTIFIER_DELIMITER=String.fromCodePoint(34);Er.COMMENT_DELIMITER=String.fromCodePoint(35);Er.EOL=String.fromCodePoint(10);Er.ESCAPE_CHARACTER=String.fromCodePoint(92)});var B_=p(wr=>{"use strict";var ef=wr&&wr.__assign||function(){return ef=Object.assign||function(r){for(var e,t=1,n=arguments.length;t{"use strict";tf.__esModule=!0;var si=nr(),_t=Jd(),ai=B_();tf.lex=function(r){for(var e=null,t=null,n=null,i=0;i{"use strict";var Bk=Rr&&Rr.__spreadArrays||function(){for(var r=0,e=0,t=arguments.length;e{"use strict";var ui=Fs&&Fs.__spreadArrays||function(){for(var r=0,e=0,t=arguments.length;e{"use strict";Or.__esModule=!0;var V_=nr();Or.andUtil=function(r,e){return r&&e};Or.orUtil=function(r,e){return r||e};Or.xorUtil=function(r,e){return r!==e};Or.notUtil=function(r){return!r};Or.isIdentifier=function(r){var e=r.name,t=r.value;return e===V_.Tokens.IDENTIFIER&&typeof t=="string"};Or.isOperator=function(r){var e=r.name,t=r.value;return e===V_.Tokens.OPERATOR&&typeof t=="string"};Or.throwInvalidExpression=function(r){throw new TypeError("Invalid postfix expression: "+r)}});var X_=p(uf=>{"use strict";var Us;uf.__esModule=!0;var af=nr(),of=sf();uf.OPERATOR_MAP=(Us={},Us[af.Operators.AND]=of.andUtil,Us[af.Operators.OR]=of.orUtil,Us[af.Operators.XOR]=of.xorUtil,Us)});var Q_=p(yn=>{"use strict";var lf=yn&&yn.__spreadArrays||function(){for(var r=0,e=0,t=arguments.length;e{"use strict";Ls.__esModule=!0;var J_=Q_();Ls.getEvaluator=J_.getEvaluator;Ls.evaluate=J_.evaluate;var Kk=nf();Ls.parse=Kk.parse});var rP={};TT(rP,{default:()=>Po});module.exports=bT(rP);var dT=require("obsidian");var zn=require("obsidian");var iP=new Error("timeout while waiting for mutex to become available"),sP=new Error("mutex already locked"),vT=new Error("request for lock canceled"),xf=function(r,e,t,n){function i(s){return s instanceof t?s:new t(function(a){a(s)})}return new(t||(t=Promise))(function(s,a){function o(c){try{l(n.next(c))}catch(d){a(d)}}function u(c){try{l(n.throw(c))}catch(d){a(d)}}function l(c){c.done?s(c.value):i(c.value).then(o,u)}l((n=n.apply(r,e||[])).next())})},Co=class{constructor(e,t=vT){if(this._maxConcurrency=e,this._cancelError=t,this._queue=[],this._waiters=[],e<=0)throw new Error("semaphore must be initialized to a positive value");this._value=e}acquire(){let e=this.isLocked(),t=new Promise((n,i)=>this._queue.push({resolve:n,reject:i}));return e||this._dispatch(),t}runExclusive(e){return xf(this,void 0,void 0,function*(){let[t,n]=yield this.acquire();try{return yield e(t)}finally{n()}})}waitForUnlock(){return xf(this,void 0,void 0,function*(){return this.isLocked()?new Promise(t=>this._waiters.push({resolve:t})):Promise.resolve()})}isLocked(){return this._value<=0}release(){if(this._maxConcurrency>1)throw new Error("this method is unavailable on semaphores with concurrency > 1; use the scoped release returned by acquire instead");if(this._currentReleaser){let e=this._currentReleaser;this._currentReleaser=void 0,e()}}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatch(){let e=this._queue.shift();if(!e)return;let t=!1;this._currentReleaser=()=>{t||(t=!0,this._value++,this._resolveWaiters(),this._dispatch())},e.resolve([this._value--,this._currentReleaser])}_resolveWaiters(){this._waiters.forEach(e=>e.resolve()),this._waiters=[]}},ET=function(r,e,t,n){function i(s){return s instanceof t?s:new t(function(a){a(s)})}return new(t||(t=Promise))(function(s,a){function o(c){try{l(n.next(c))}catch(d){a(d)}}function u(c){try{l(n.throw(c))}catch(d){a(d)}}function l(c){c.done?s(c.value):i(c.value).then(o,u)}l((n=n.apply(r,e||[])).next())})},Vs=class{constructor(e){this._semaphore=new Co(1,e)}acquire(){return ET(this,void 0,void 0,function*(){let[,e]=yield this._semaphore.acquire();return e})}runExclusive(e){return this._semaphore.runExclusive(()=>e())}isLocked(){return this._semaphore.isLocked()}waitForUnlock(){return this._semaphore.waitForUnlock()}release(){this._semaphore.release()}cancel(){return this._semaphore.cancel()}};var bi=class{constructor(){this.hideTaskCount=!1;this.hideBacklinks=!1;this.hidePriority=!1;this.hideStartDate=!1;this.hideScheduledDate=!1;this.hideDoneDate=!1;this.hideDueDate=!1;this.hideRecurrenceRule=!1;this.hideEditButton=!1;this.hideUrgency=!0;this.shortMode=!1;this.explainQuery=!1}},On=class{constructor(e,t){this.defaultLayout=["description","priority","recurrenceRule","startDate","scheduledDate","dueDate","doneDate","blockLink"];e?this.options=e:this.options=new bi,t?this.layoutComponents=t:this.layoutComponents=this.defaultLayout,this.layoutComponents=this.applyOptions(this.options)}applyOptions(e){let t=(i,s,a)=>s?i.filter(o=>o!=a):i,n=this.layoutComponents;return n=t(n,e.hidePriority,"priority"),n=t(n,e.hideRecurrenceRule,"recurrenceRule"),n=t(n,e.hideStartDate,"startDate"),n=t(n,e.hideScheduledDate,"scheduledDate"),n=t(n,e.hideDueDate,"dueDate"),n=t(n,e.hideDoneDate,"doneDate"),n}};var Xs=["MO","TU","WE","TH","FR","SA","SU"],Re=function(){function r(e,t){if(t===0)throw new Error("Can't create weekday with n == 0");this.weekday=e,this.n=t}return r.fromStr=function(e){return new r(Xs.indexOf(e))},r.prototype.nth=function(e){return this.n===e?this:new r(this.weekday,e)},r.prototype.equals=function(e){return this.weekday===e.weekday&&this.n===e.n},r.prototype.toString=function(){var e=Xs[this.weekday];return this.n&&(e=(this.n>0?"+":"")+String(this.n)+e),e},r.prototype.getJsWeekday=function(){return this.weekday===6?0:this.weekday+1},r}();var pe=function(r){return r!=null},dt=function(r){return typeof r=="number"},No=function(r){return typeof r=="string"&&Xs.includes(r)},$e=Array.isArray,Et=function(r,e){e===void 0&&(e=r),arguments.length===1&&(e=r,r=0);for(var t=[],n=r;n>0,n.length>e?String(n):(e=e-n.length,e>t.length&&(t+=V(t,e/t.length)),t.slice(0,e)+String(n))}var Nf=function(r,e,t){var n=r.split(e);return t?n.slice(0,t).concat([n.slice(t).join(e)]):n},He=function(r,e){var t=r%e;return t*e<0?t+e:t},Zs=function(r,e){return{div:Math.floor(r/e),mod:He(r,e)}},ft=function(r){return!pe(r)||r.length===0},Ee=function(r){return!ft(r)},Z=function(r,e){return Ee(r)&&r.indexOf(e)!==-1};var Sr;(function(r){r.MONTH_DAYS=[31,28,31,30,31,30,31,31,30,31,30,31],r.ONE_DAY=1e3*60*60*24,r.MAXYEAR=9999,r.ORDINAL_BASE=new Date(Date.UTC(1970,0,1)),r.PY_WEEKDAYS=[6,0,1,2,3,4,5],r.getYearDay=function(e){var t=new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate());return Math.ceil((t.valueOf()-new Date(e.getUTCFullYear(),0,1).valueOf())/r.ONE_DAY)+1},r.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},r.isDate=function(e){return e instanceof Date},r.isValidDate=function(e){return r.isDate(e)&&!isNaN(e.getTime())},r.tzOffset=function(e){return e.getTimezoneOffset()*60*1e3},r.daysBetween=function(e,t){var n=e.getTime()-r.tzOffset(e),i=t.getTime()-r.tzOffset(t),s=n-i;return Math.round(s/r.ONE_DAY)},r.toOrdinal=function(e){return r.daysBetween(e,r.ORDINAL_BASE)},r.fromOrdinal=function(e){return new Date(r.ORDINAL_BASE.getTime()+e*r.ONE_DAY)},r.getMonthDays=function(e){var t=e.getUTCMonth();return t===1&&r.isLeapYear(e.getUTCFullYear())?29:r.MONTH_DAYS[t]},r.getWeekday=function(e){return r.PY_WEEKDAYS[e.getUTCDay()]},r.monthRange=function(e,t){var n=new Date(Date.UTC(e,t,1));return[r.getWeekday(n),r.getMonthDays(n)]},r.combine=function(e,t){return t=t||e,new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()))},r.clone=function(e){var t=new Date(e.getTime());return t},r.cloneDates=function(e){for(var t=[],n=0;nthis.maxDate;if(this.method==="between"){if(t)return!0;if(n)return!1}else if(this.method==="before"){if(n)return!1}else if(this.method==="after")return t?!0:(this.add(e),!1);return this.add(e)},r.prototype.add=function(e){return this._result.push(e),!0},r.prototype.getValue=function(){var e=this._result;switch(this.method){case"all":case"between":return e;case"before":case"after":default:return e.length?e[e.length-1]:null}},r.prototype.clone=function(){return new r(this.method,this.args)},r}(),sr=wT;var np=Ks(rp(),1),{__extends:Mn,__assign:Qe,__rest:mP,__decorate:yP,__param:gP,__metadata:_P,__awaiter:TP,__generator:bP,__exportStar:vP,__createBinding:EP,__values:wP,__read:RP,__spread:OP,__spreadArrays:DP,__spreadArray:T,__await:MP,__asyncGenerator:SP,__asyncDelegator:kP,__asyncValues:PP,__makeTemplateObject:AP,__importStar:xP,__importDefault:CP,__classPrivateFieldGet:NP,__classPrivateFieldSet:IP,__classPrivateFieldIn:FP}=np.default;var RT=function(r){Mn(e,r);function e(t,n,i){var s=r.call(this,t,n)||this;return s.iterator=i,s}return e.prototype.add=function(t){return this.iterator(t,this._result.length)?(this._result.push(t),!0):!1},e}(sr),Fo=RT;var OT={dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],tokens:{SKIP:/^[ \r\n\t]+|^\.$/,number:/^[1-9][0-9]*/,numberAsText:/^(one|two|three)/i,every:/^every/i,"day(s)":/^days?/i,"weekday(s)":/^weekdays?/i,"week(s)":/^weeks?/i,"hour(s)":/^hours?/i,"minute(s)":/^minutes?/i,"month(s)":/^months?/i,"year(s)":/^years?/i,on:/^(on|in)/i,at:/^(at)/i,the:/^the/i,first:/^first/i,second:/^second/i,third:/^third/i,nth:/^([1-9][0-9]*)(\.|th|nd|rd|st)/i,last:/^last/i,for:/^for/i,"time(s)":/^times?/i,until:/^(un)?til/i,monday:/^mo(n(day)?)?/i,tuesday:/^tu(e(s(day)?)?)?/i,wednesday:/^we(d(n(esday)?)?)?/i,thursday:/^th(u(r(sday)?)?)?/i,friday:/^fr(i(day)?)?/i,saturday:/^sa(t(urday)?)?/i,sunday:/^su(n(day)?)?/i,january:/^jan(uary)?/i,february:/^feb(ruary)?/i,march:/^mar(ch)?/i,april:/^apr(il)?/i,may:/^may/i,june:/^june?/i,july:/^july?/i,august:/^aug(ust)?/i,september:/^sep(t(ember)?)?/i,october:/^oct(ober)?/i,november:/^nov(ember)?/i,december:/^dec(ember)?/i,comma:/^(,\s*|(and|or)\s*)+/i}},Br=OT;var ip=function(r,e){return r.indexOf(e)!==-1},DT=function(r){return r.toString()},MT=function(r,e,t){return"".concat(e," ").concat(t,", ").concat(r)},ST=function(){function r(e,t,n,i){if(t===void 0&&(t=DT),n===void 0&&(n=Br),i===void 0&&(i=MT),this.text=[],this.language=n||Br,this.gettext=t,this.dateFormatter=i,this.rrule=e,this.options=e.options,this.origOptions=e.origOptions,this.origOptions.bymonthday){var s=[].concat(this.options.bymonthday),a=[].concat(this.options.bynmonthday);s.sort(function(c,d){return c-d}),a.sort(function(c,d){return d-c}),this.bymonthday=s.concat(a),this.bymonthday.length||(this.bymonthday=null)}if(pe(this.origOptions.byweekday)){var o=$e(this.origOptions.byweekday)?this.origOptions.byweekday:[this.origOptions.byweekday],u=String(o);this.byweekday={allWeeks:o.filter(function(c){return!c.n}),someWeeks:o.filter(function(c){return Boolean(c.n)}),isWeekdays:u.indexOf("MO")!==-1&&u.indexOf("TU")!==-1&&u.indexOf("WE")!==-1&&u.indexOf("TH")!==-1&&u.indexOf("FR")!==-1&&u.indexOf("SA")===-1&&u.indexOf("SU")===-1,isEveryDay:u.indexOf("MO")!==-1&&u.indexOf("TU")!==-1&&u.indexOf("WE")!==-1&&u.indexOf("TH")!==-1&&u.indexOf("FR")!==-1&&u.indexOf("SA")!==-1&&u.indexOf("SU")!==-1};var l=function(c,d){return c.weekday-d.weekday};this.byweekday.allWeeks.sort(l),this.byweekday.someWeeks.sort(l),this.byweekday.allWeeks.length||(this.byweekday.allWeeks=null),this.byweekday.someWeeks.length||(this.byweekday.someWeeks=null)}else this.byweekday=null}return r.isFullyConvertible=function(e){var t=!0;if(!(e.options.freq in r.IMPLEMENTED)||e.origOptions.until&&e.origOptions.count)return!1;for(var n in e.origOptions){if(ip(["dtstart","wkst","freq"],n))return!0;if(!ip(r.IMPLEMENTED[e.options.freq],n))return!1}return t},r.prototype.isFullyConvertible=function(){return r.isFullyConvertible(this.rrule)},r.prototype.toString=function(){var e=this.gettext;if(!(this.options.freq in r.IMPLEMENTED))return e("RRule error: Unable to fully convert this rrule to text");if(this.text=[e("every")],this[k.FREQUENCIES[this.options.freq]](),this.options.until){this.add(e("until"));var t=this.options.until;this.add(this.dateFormatter(t.getUTCFullYear(),this.language.monthNames[t.getUTCMonth()],t.getUTCDate()))}else this.options.count&&this.add(e("for")).add(this.options.count.toString()).add(this.plural(this.options.count)?e("times"):e("time"));return this.isFullyConvertible()||this.add(e("(~ approximate)")),this.text.join("")},r.prototype.HOURLY=function(){var e=this.gettext;this.options.interval!==1&&this.add(this.options.interval.toString()),this.add(this.plural(this.options.interval)?e("hours"):e("hour"))},r.prototype.MINUTELY=function(){var e=this.gettext;this.options.interval!==1&&this.add(this.options.interval.toString()),this.add(this.plural(this.options.interval)?e("minutes"):e("minute"))},r.prototype.DAILY=function(){var e=this.gettext;this.options.interval!==1&&this.add(this.options.interval.toString()),this.byweekday&&this.byweekday.isWeekdays?this.add(this.plural(this.options.interval)?e("weekdays"):e("weekday")):this.add(this.plural(this.options.interval)?e("days"):e("day")),this.origOptions.bymonth&&(this.add(e("in")),this._bymonth()),this.bymonthday?this._bymonthday():this.byweekday?this._byweekday():this.origOptions.byhour&&this._byhour()},r.prototype.WEEKLY=function(){var e=this.gettext;this.options.interval!==1&&this.add(this.options.interval.toString()).add(this.plural(this.options.interval)?e("weeks"):e("week")),this.byweekday&&this.byweekday.isWeekdays?this.options.interval===1?this.add(this.plural(this.options.interval)?e("weekdays"):e("weekday")):this.add(e("on")).add(e("weekdays")):this.byweekday&&this.byweekday.isEveryDay?this.add(this.plural(this.options.interval)?e("days"):e("day")):(this.options.interval===1&&this.add(e("week")),this.origOptions.bymonth&&(this.add(e("in")),this._bymonth()),this.bymonthday?this._bymonthday():this.byweekday&&this._byweekday())},r.prototype.MONTHLY=function(){var e=this.gettext;this.origOptions.bymonth?(this.options.interval!==1&&(this.add(this.options.interval.toString()).add(e("months")),this.plural(this.options.interval)&&this.add(e("in"))),this._bymonth()):(this.options.interval!==1&&this.add(this.options.interval.toString()),this.add(this.plural(this.options.interval)?e("months"):e("month"))),this.bymonthday?this._bymonthday():this.byweekday&&this.byweekday.isWeekdays?this.add(e("on")).add(e("weekdays")):this.byweekday&&this._byweekday()},r.prototype.YEARLY=function(){var e=this.gettext;this.origOptions.bymonth?(this.options.interval!==1&&(this.add(this.options.interval.toString()),this.add(e("years"))),this._bymonth()):(this.options.interval!==1&&this.add(this.options.interval.toString()),this.add(this.plural(this.options.interval)?e("years"):e("year"))),this.bymonthday?this._bymonthday():this.byweekday&&this._byweekday(),this.options.byyearday&&this.add(e("on the")).add(this.list(this.options.byyearday,this.nth,e("and"))).add(e("day")),this.options.byweekno&&this.add(e("in")).add(this.plural(this.options.byweekno.length)?e("weeks"):e("week")).add(this.list(this.options.byweekno,void 0,e("and")))},r.prototype._bymonthday=function(){var e=this.gettext;this.byweekday&&this.byweekday.allWeeks?this.add(e("on")).add(this.list(this.byweekday.allWeeks,this.weekdaytext,e("or"))).add(e("the")).add(this.list(this.bymonthday,this.nth,e("or"))):this.add(e("on the")).add(this.list(this.bymonthday,this.nth,e("and")))},r.prototype._byweekday=function(){var e=this.gettext;this.byweekday.allWeeks&&!this.byweekday.isWeekdays&&this.add(e("on")).add(this.list(this.byweekday.allWeeks,this.weekdaytext)),this.byweekday.someWeeks&&(this.byweekday.allWeeks&&this.add(e("and")),this.add(e("on the")).add(this.list(this.byweekday.someWeeks,this.weekdaytext,e("and"))))},r.prototype._byhour=function(){var e=this.gettext;this.add(e("at")).add(this.list(this.origOptions.byhour,void 0,e("and")))},r.prototype._bymonth=function(){this.add(this.list(this.options.bymonth,this.monthtext,this.gettext("and")))},r.prototype.nth=function(e){e=parseInt(e.toString(),10);var t,n=this.gettext;if(e===-1)return n("last");var i=Math.abs(e);switch(i){case 1:case 21:case 31:t=i+n("st");break;case 2:case 22:t=i+n("nd");break;case 3:case 23:t=i+n("rd");break;default:t=i+n("th")}return e<0?t+" "+n("last"):t},r.prototype.monthtext=function(e){return this.language.monthNames[e-1]},r.prototype.weekdaytext=function(e){var t=dt(e)?(e+1)%7:e.getJsWeekday();return(e.n?this.nth(e.n)+" ":"")+this.language.dayNames[t]},r.prototype.plural=function(e){return e%100!==1},r.prototype.add=function(e){return this.text.push(" "),this.text.push(e),this},r.prototype.list=function(e,t,n,i){var s=this;i===void 0&&(i=","),$e(e)||(e=[e]);var a=function(u,l,c){for(var d="",f=0;fe[0].length)&&(e=s,t=i)}if(e!=null&&(this.text=this.text.substr(e[0].length),this.text===""&&(this.done=!0)),e==null){this.done=!0,this.symbol=null,this.value=null;return}}while(t==="SKIP");return this.symbol=t,this.value=e,!0},r.prototype.accept=function(e){if(this.symbol===e){if(this.value){var t=this.value;return this.nextSymbol(),t}return this.nextSymbol(),!0}return!1},r.prototype.acceptNumber=function(){return this.accept("number")},r.prototype.expect=function(e){if(this.accept(e))return!0;throw new Error("expected "+e+" but found "+this.symbol)},r}();function vi(r,e){e===void 0&&(e=Br);var t={},n=new kT(e.tokens);if(!n.start(r))return null;return i(),t;function i(){n.expect("every");var f=n.acceptNumber();if(f&&(t.interval=parseInt(f[0],10)),n.isDone())throw new Error("Unexpected end");switch(n.symbol){case"day(s)":t.freq=k.DAILY,n.nextSymbol()&&(a(),d());break;case"weekday(s)":t.freq=k.WEEKLY,t.byweekday=[k.MO,k.TU,k.WE,k.TH,k.FR],n.nextSymbol(),d();break;case"week(s)":t.freq=k.WEEKLY,n.nextSymbol()&&(s(),d());break;case"hour(s)":t.freq=k.HOURLY,n.nextSymbol()&&(s(),d());break;case"minute(s)":t.freq=k.MINUTELY,n.nextSymbol()&&(s(),d());break;case"month(s)":t.freq=k.MONTHLY,n.nextSymbol()&&(s(),d());break;case"year(s)":t.freq=k.YEARLY,n.nextSymbol()&&(s(),d());break;case"monday":case"tuesday":case"wednesday":case"thursday":case"friday":case"saturday":case"sunday":t.freq=k.WEEKLY;var h=n.symbol.substr(0,2).toUpperCase();if(t.byweekday=[k[h]],!n.nextSymbol())return;for(;n.accept("comma");){if(n.isDone())throw new Error("Unexpected end");var y=u();if(!y)throw new Error("Unexpected symbol "+n.symbol+", expected weekday");t.byweekday.push(k[y]),n.nextSymbol()}c(),d();break;case"january":case"february":case"march":case"april":case"may":case"june":case"july":case"august":case"september":case"october":case"november":case"december":if(t.freq=k.YEARLY,t.bymonth=[o()],!n.nextSymbol())return;for(;n.accept("comma");){if(n.isDone())throw new Error("Unexpected end");var m=o();if(!m)throw new Error("Unexpected symbol "+n.symbol+", expected month");t.bymonth.push(m),n.nextSymbol()}s(),d();break;default:throw new Error("Unknown symbol")}}function s(){var f=n.accept("on"),h=n.accept("the");if(!!(f||h))do{var y=l(),m=u(),g=o();if(y)m?(n.nextSymbol(),t.byweekday||(t.byweekday=[]),t.byweekday.push(k[m].nth(y))):(t.bymonthday||(t.bymonthday=[]),t.bymonthday.push(y),n.accept("day(s)"));else if(m)n.nextSymbol(),t.byweekday||(t.byweekday=[]),t.byweekday.push(k[m]);else if(n.symbol==="weekday(s)")n.nextSymbol(),t.byweekday||(t.byweekday=[k.MO,k.TU,k.WE,k.TH,k.FR]);else if(n.symbol==="week(s)"){n.nextSymbol();var R=n.acceptNumber();if(!R)throw new Error("Unexpected symbol "+n.symbol+", expected week number");for(t.byweekno=[parseInt(R[0],10)];n.accept("comma");){if(R=n.acceptNumber(),!R)throw new Error("Unexpected symbol "+n.symbol+"; expected monthday");t.byweekno.push(parseInt(R[0],10))}}else if(g)n.nextSymbol(),t.bymonth||(t.bymonth=[]),t.bymonth.push(g);else return}while(n.accept("comma")||n.accept("the")||n.accept("on"))}function a(){var f=n.accept("at");if(!!f)do{var h=n.acceptNumber();if(!h)throw new Error("Unexpected symbol "+n.symbol+", expected hour");for(t.byhour=[parseInt(h[0],10)];n.accept("comma");){if(h=n.acceptNumber(),!h)throw new Error("Unexpected symbol "+n.symbol+"; expected hour");t.byhour.push(parseInt(h[0],10))}}while(n.accept("comma")||n.accept("at"))}function o(){switch(n.symbol){case"january":return 1;case"february":return 2;case"march":return 3;case"april":return 4;case"may":return 5;case"june":return 6;case"july":return 7;case"august":return 8;case"september":return 9;case"october":return 10;case"november":return 11;case"december":return 12;default:return!1}}function u(){switch(n.symbol){case"monday":case"tuesday":case"wednesday":case"thursday":case"friday":case"saturday":case"sunday":return n.symbol.substr(0,2).toUpperCase();default:return!1}}function l(){switch(n.symbol){case"last":return n.nextSymbol(),-1;case"first":return n.nextSymbol(),1;case"second":return n.nextSymbol(),n.accept("last")?-2:2;case"third":return n.nextSymbol(),n.accept("last")?-3:3;case"nth":var f=parseInt(n.value[1],10);if(f<-366||f>366)throw new Error("Nth out of range: "+f);return n.nextSymbol(),n.accept("last")?-f:f;default:return!1}}function c(){n.accept("on"),n.accept("the");var f=l();if(!!f)for(t.bymonthday=[f],n.nextSymbol();n.accept("comma");){if(f=l(),!f)throw new Error("Unexpected symbol "+n.symbol+"; expected monthday");t.bymonthday.push(f),n.nextSymbol()}}function d(){if(n.symbol==="until"){var f=Date.parse(n.text);if(!f)throw new Error("Cannot parse until date:"+n.text);t.until=new Date(f)}else n.accept("for")&&(t.count=parseInt(n.value[0],10),n.expect("number"))}}var z;(function(r){r[r.YEARLY=0]="YEARLY",r[r.MONTHLY=1]="MONTHLY",r[r.WEEKLY=2]="WEEKLY",r[r.DAILY=3]="DAILY",r[r.HOURLY=4]="HOURLY",r[r.MINUTELY=5]="MINUTELY",r[r.SECONDLY=6]="SECONDLY"})(z||(z={}));function Ei(r){return r12){var n=Math.floor(this.month/12),i=He(this.month,12);this.month=i,this.year+=n,this.month===0&&(this.month=12,--this.year)}},e.prototype.addWeekly=function(t,n){n>this.getWeekday()?this.day+=-(this.getWeekday()+1+(6-n))+t*7:this.day+=-(this.getWeekday()-n)+t*7,this.fixDay()},e.prototype.addDaily=function(t){this.day+=t,this.fixDay()},e.prototype.addHours=function(t,n,i){for(n&&(this.hour+=Math.floor((23-this.hour)/t)*t);;){this.hour+=t;var s=Zs(this.hour,24),a=s.div,o=s.mod;if(a&&(this.hour=o,this.addDaily(a)),ft(i)||Z(i,this.hour))break}},e.prototype.addMinutes=function(t,n,i,s){for(n&&(this.minute+=Math.floor((1439-(this.hour*60+this.minute))/t)*t);;){this.minute+=t;var a=Zs(this.minute,60),o=a.div,u=a.mod;if(o&&(this.minute=u,this.addHours(o,!1,i)),(ft(i)||Z(i,this.hour))&&(ft(s)||Z(s,this.minute)))break}},e.prototype.addSeconds=function(t,n,i,s,a){for(n&&(this.second+=Math.floor((86399-(this.hour*3600+this.minute*60+this.second))/t)*t);;){this.second+=t;var o=Zs(this.second,60),u=o.div,l=o.mod;if(u&&(this.second=l,this.addMinutes(u,!1,i,s)),(ft(i)||Z(i,this.hour))&&(ft(s)||Z(s,this.minute))&&(ft(a)||Z(a,this.second)))break}},e.prototype.fixDay=function(){if(!(this.day<=28)){var t=Sr.monthRange(this.year,this.month-1)[1];if(!(this.day<=t))for(;this.day>t;){if(this.day-=t,++this.month,this.month===13&&(this.month=1,++this.year,this.year>Sr.MAXYEAR))return;t=Sr.monthRange(this.year,this.month-1)[1]}}},e.prototype.add=function(t,n){var i=t.freq,s=t.interval,a=t.wkst,o=t.byhour,u=t.byminute,l=t.bysecond;switch(i){case z.YEARLY:return this.addYears(s);case z.MONTHLY:return this.addMonths(s);case z.WEEKLY:return this.addWeekly(s,a);case z.DAILY:return this.addDaily(s);case z.HOURLY:return this.addHours(s,n,o);case z.MINUTELY:return this.addMinutes(s,n,o,u);case z.SECONDLY:return this.addSeconds(s,n,o,u,l)}},e}(kn);function Uo(r){for(var e=[],t=Object.keys(r),n=0,i=t;n=-366&&n<=366))throw new Error("bysetpos must be between 1 and 366, or between -366 and -1")}}if(!(Boolean(e.byweekno)||Ee(e.byweekno)||Ee(e.byyearday)||Boolean(e.bymonthday)||Ee(e.bymonthday)||pe(e.byweekday)||pe(e.byeaster)))switch(e.freq){case k.YEARLY:e.bymonth||(e.bymonth=e.dtstart.getUTCMonth()+1),e.bymonthday=e.dtstart.getUTCDate();break;case k.MONTHLY:e.bymonthday=e.dtstart.getUTCDate();break;case k.WEEKLY:e.byweekday=[I.getWeekday(e.dtstart)];break}if(pe(e.bymonth)&&!$e(e.bymonth)&&(e.bymonth=[e.bymonth]),pe(e.byyearday)&&!$e(e.byyearday)&&dt(e.byyearday)&&(e.byyearday=[e.byyearday]),!pe(e.bymonthday))e.bymonthday=[],e.bynmonthday=[];else if($e(e.bymonthday)){for(var i=[],s=[],t=0;t0?i.push(n):n<0&&s.push(n)}e.bymonthday=i,e.bynmonthday=s}else e.bymonthday<0?(e.bynmonthday=[e.bymonthday],e.bymonthday=[]):(e.bynmonthday=[],e.bymonthday=[e.bymonthday]);if(pe(e.byweekno)&&!$e(e.byweekno)&&(e.byweekno=[e.byweekno]),!pe(e.byweekday))e.bynweekday=null;else if(dt(e.byweekday))e.byweekday=[e.byweekday],e.bynweekday=null;else if(No(e.byweekday))e.byweekday=[Re.fromStr(e.byweekday).weekday],e.bynweekday=null;else if(e.byweekday instanceof Re)!e.byweekday.n||e.freq>k.MONTHLY?(e.byweekday=[e.byweekday.weekday],e.bynweekday=null):(e.bynweekday=[[e.byweekday.weekday,e.byweekday.n]],e.byweekday=null);else{for(var a=[],o=[],t=0;tk.MONTHLY?a.push(u.weekday):o.push([u.weekday,u.n])}e.byweekday=Ee(a)?a:null,e.bynweekday=Ee(o)?o:null}return pe(e.byhour)?dt(e.byhour)&&(e.byhour=[e.byhour]):e.byhour=e.freq=4?(c=0,l=o.yearlen+He(a-e.wkst,7)):l=n-c;for(var d=Math.floor(l/7),f=He(l,7),h=Math.floor(d+f/4),y=0;y0&&m<=h){var g=void 0;m>1?(g=c+(m-1)*7,c!==u&&(g-=7-u)):g=c;for(var R=0;R<7&&(o.wnomask[g]=1,g++,o.wdaymask[g]!==e.wkst);R++);}}if(Z(e.byweekno,1)){var g=c+h*7;if(c!==u&&(g-=7-u),g=4?(X=0,Te=ye+He(P-e.wkst,7)):Te=n-c,O=Math.floor(52+He(Te,7)/4)}if(Z(e.byweekno,O))for(var g=0;gs)return ar(r);if(O>=t){var P=Sp(O,e);if(!r.accept(P)||o&&(--o,!o))return ar(r)}}else for(var R=h;Rs)return ar(r);if(O>=t){var P=Sp(O,e);if(!r.accept(P)||o&&(--o,!o))return ar(r)}}}if(e.interval===0||(u.add(e,m),u.year>I.MAXYEAR))return ar(r);Ei(n)||(c=l.gettimeset(n)(u.hour,u.minute,u.second,0)),l.rebuild(u.year,u.month)}}function YT(r,e,t){var n=t.bymonth,i=t.byweekno,s=t.byweekday,a=t.byeaster,o=t.bymonthday,u=t.bynmonthday,l=t.byyearday;return Ee(n)&&!Z(n,r.mmask[e])||Ee(i)&&!r.wnomask[e]||Ee(s)&&!Z(s,r.wdaymask[e])||Ee(r.nwdaymask)&&!r.nwdaymask[e]||a!==null&&!Z(r.eastermask,e)||(Ee(o)||Ee(u))&&!Z(o,r.mdaymask[e])&&!Z(u,r.nmdaymask[e])||Ee(l)&&(e=r.yearlen&&!Z(l,e+1-r.yearlen)&&!Z(l,-r.nextyearlen+e-r.yearlen))}function Sp(r,e){return new Gr(r,e.tzid).rezonedDate()}function ar(r){return r.getValue()}function $T(r,e,t,n,i){for(var s=!1,a=e;a=k.HOURLY&&Ee(i)&&!Z(i,e.hour)||n>=k.MINUTELY&&Ee(s)&&!Z(s,e.minute)||n>=k.SECONDLY&&Ee(a)&&!Z(a,e.second)?[]:r.gettimeset(n)(e.hour,e.minute,e.second,e.millisecond)}var wt={MO:new Re(0),TU:new Re(1),WE:new Re(2),TH:new Re(3),FR:new Re(4),SA:new Re(5),SU:new Re(6)},wi={freq:z.YEARLY,dtstart:null,interval:1,wkst:wt.MO,count:null,until:null,tzid:null,bysetpos:null,bymonth:null,bymonthday:null,bynmonthday:null,byyearday:null,byweekno:null,byweekday:null,bynweekday:null,byhour:null,byminute:null,bysecond:null,byeaster:null},dp=Object.keys(wi),k=function(){function r(e,t){e===void 0&&(e={}),t===void 0&&(t=!1),this._cache=t?null:new hp,this.origOptions=Uo(e);var n=lp(e).parsedOptions;this.options=n}return r.parseText=function(e,t){return vi(e,t)},r.fromText=function(e,t){return sp(e,t)},r.fromString=function(e){return new r(r.parseString(e)||void 0)},r.prototype._iter=function(e){return ta(e,this.options)},r.prototype._cacheGet=function(e,t){return this._cache?this._cache._cacheGet(e,t):!1},r.prototype._cacheAdd=function(e,t,n){if(!!this._cache)return this._cache._cacheAdd(e,t,n)},r.prototype.all=function(e){if(e)return this._iter(new Fo("all",{},e));var t=this._cacheGet("all");return t===!1&&(t=this._iter(new sr("all",{})),this._cacheAdd("all",t)),t},r.prototype.between=function(e,t,n,i){if(n===void 0&&(n=!1),!I.isValidDate(e)||!I.isValidDate(t))throw new Error("Invalid date passed in to RRule.between");var s={before:t,after:e,inc:n};if(i)return this._iter(new Fo("between",s,i));var a=this._cacheGet("between",s);return a===!1&&(a=this._iter(new sr("between",s)),this._cacheAdd("between",a,s)),a},r.prototype.before=function(e,t){if(t===void 0&&(t=!1),!I.isValidDate(e))throw new Error("Invalid date passed in to RRule.before");var n={dt:e,inc:t},i=this._cacheGet("before",n);return i===!1&&(i=this._iter(new sr("before",n)),this._cacheAdd("before",i,n)),i},r.prototype.after=function(e,t){if(t===void 0&&(t=!1),!I.isValidDate(e))throw new Error("Invalid date passed in to RRule.after");var n={dt:e,inc:t},i=this._cacheGet("after",n);return i===!1&&(i=this._iter(new sr("after",n)),this._cacheAdd("after",i,n)),i},r.prototype.count=function(){return this.all().length},r.prototype.toString=function(){return Di(this.origOptions)},r.prototype.toText=function(e,t,n){return ap(this,e,t,n)},r.prototype.isFullyConvertibleToText=function(){return op(this)},r.prototype.clone=function(){return new r(this.origOptions)},r.FREQUENCIES=["YEARLY","MONTHLY","WEEKLY","DAILY","HOURLY","MINUTELY","SECONDLY"],r.YEARLY=z.YEARLY,r.MONTHLY=z.MONTHLY,r.WEEKLY=z.WEEKLY,r.DAILY=z.DAILY,r.HOURLY=z.HOURLY,r.MINUTELY=z.MINUTELY,r.SECONDLY=z.SECONDLY,r.MO=wt.MO,r.TU=wt.TU,r.WE=wt.WE,r.TH=wt.TH,r.FR=wt.FR,r.SA=wt.SA,r.SU=wt.SU,r.parseString=Oi,r.optionsToString=Di,r}();function kp(r,e,t,n,i,s){var a={},o=r.accept;function u(f,h){t.forEach(function(y){y.between(f,h,!0).forEach(function(m){a[Number(m)]=!0})})}i.forEach(function(f){var h=new Gr(f,s).rezonedDate();a[Number(h)]=!0}),r.accept=function(f){var h=Number(f);return isNaN(h)?o.call(this,f):!a[h]&&(u(new Date(h-1),new Date(h+1)),!a[h])?(a[h]=!0,o.call(this,f)):!0},r.method==="between"&&(u(r.args.after,r.args.before),r.accept=function(f){var h=Number(f);return a[h]?!0:(a[h]=!0,o.call(this,f))});for(var l=0;l1||i.length||s.length||a.length){var c=new Wo(l);return c.dtstart(o),c.tzid(u||void 0),n.forEach(function(f){c.rrule(new k(qo(f,o,u),l))}),i.forEach(function(f){c.rdate(f)}),s.forEach(function(f){c.exrule(new k(qo(f,o,u),l))}),a.forEach(function(f){c.exdate(f)}),e.compatible&&e.dtstart&&c.rdate(o),c}var d=n[0]||{};return new k(qo(d,d.dtstart||e.dtstart||o,d.tzid||e.tzid||u),l)}function ra(r,e){return e===void 0&&(e={}),GT(r,HT(e))}function qo(r,e,t){return Qe(Qe({},r),{dtstart:e,tzid:t})}function HT(r){var e=[],t=Object.keys(r),n=Object.keys(Pp);if(t.forEach(function(i){Z(n,i)||e.push(i)}),e.length)throw new Error("Invalid options: "+e.join(", "));return Qe(Qe({},Pp),r)}function zT(r){if(r.indexOf(":")===-1)return{name:"RRULE",value:r};var e=Nf(r,":",1),t=e[0],n=e[1];return{name:t,value:n}}function KT(r){var e=zT(r),t=e.name,n=e.value,i=t.split(";");if(!i)throw new Error("empty property name");return{name:i[0].toUpperCase(),parms:i.slice(1),value:n}}function VT(r,e){if(e===void 0&&(e=!1),r=r&&r.trim(),!r)throw new Error("Invalid empty string");if(!e)return r.split(/\s/);for(var t=r.split(` +`),n=0;n0&&i[0]===" "?(t[n-1]+=i.slice(1),t.splice(n,1)):n+=1:t.splice(n,1)}return t}function XT(r){r.forEach(function(e){if(!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(e))throw new Error("unsupported RDATE/EXDATE parm: "+e)})}function Ap(r,e){return XT(e),r.split(",").map(function(t){return I.untilStringToDate(t)})}function xp(r){var e=this;return function(t){if(t!==void 0&&(e["_".concat(r)]=t),e["_".concat(r)]!==void 0)return e["_".concat(r)];for(var n=0;n1&&(t+=` (${this.description})`),t+=":";let n=e+" ";for(let i=0;ie(t,n)*-1}};function Ka(r){return r.replace(/([.*+?^${}()|[\]/\\])/g,"\\$1")}var Hn=class{constructor(e,t){this.property=e,this.grouper=t}};var oe=class{canCreateFilterForLine(e){return oe.lineMatchesFilter(this.filterRegExp(),e)}static lineMatchesFilter(e,t){return e?e.test(t):!1}static getMatch(e,t){return e?t.match(e):null}fieldNameSingular(){return this.fieldName()}fieldNameSingularEscaped(){return Ka(this.fieldNameSingular())}supportsSorting(){return!1}parseSortLine(e){return!this.supportsSorting()||!this.canCreateSorterForLine(e)?null:this.createSorterFromLine(e)}canCreateSorterForLine(e){return this.supportsSorting()?oe.lineMatchesFilter(this.sorterRegExp(),e):!1}createSorterFromLine(e){if(!this.supportsSorting())return null;let t=oe.getMatch(this.sorterRegExp(),e);if(t===null)return null;let n=!!t[1];return this.createSorter(n)}sorterRegExp(){if(!this.supportsSorting())throw Error(`sorterRegExp() unimplemented for ${this.fieldNameSingular()}`);return new RegExp(`^sort by ${this.fieldNameSingularEscaped()}( reverse)?`)}comparator(){throw Error(`comparator() unimplemented for ${this.fieldNameSingular()}`)}createSorter(e){return new gr(this.fieldNameSingular(),this.comparator(),e)}createNormalSorter(){return this.createSorter(!1)}createReverseSorter(){return this.createSorter(!0)}supportsGrouping(){return!1}grouper(){throw Error(`grouper() unimplemented for ${this.fieldNameSingular()}`)}createGrouper(){return new Hn(this.fieldNameSingular(),this.grouper())}};var Ve=class{constructor(e,t,n){this.instruction=e,this.explanation=n,this.filterFunction=t}explainFilterIndented(e){let t=this.explanation;return t.asString()===this.instruction?`${e}${this.instruction} +`:`${e}${this.instruction} => +${t.asString(" ")} +`}},le=class{constructor(e){this.instruction=e}get filter(){return this._filter}set filter(e){this._filter=e}get filterFunction(){if(this._filter)return this._filter.filterFunction}static fromFilter(e){let t=new le(e.instruction);return t.filter=e,t}static fromError(e,t){let n=new le(e);return n.error=t,n}};var Va=class{constructor(e,t){this._instruction=e,this._filter=t}canCreateFilterForLine(e){return e==this._instruction}createFilterOrErrorMessage(e){let t=new le(e);return e===this._instruction?(t.filter=new Ve(e,this._filter,new ge(e)),t):(t.error=`do not understand filter: ${e}`,t)}};var Lr=class{constructor(){this._filters=[]}add(e,t){this._filters.push(new Va(e,t))}canCreateFilterForLine(e){for(let t of this._filters)if(t.canCreateFilterForLine(e))return!0;return!1}createFilterOrErrorMessage(e){for(let n of this._filters){let i=n.createFilterOrErrorMessage(e);if(i.error===void 0)return i}let t=new le(e);return t.error=`do not understand filter: ${e}`,t}};var _e=class extends oe{constructor(){super();this.filterInstructions=new Lr,this.filterInstructions.add(`has ${this.fieldName()} date`,t=>this.date(t)!==null),this.filterInstructions.add(`no ${this.fieldName()} date`,t=>this.date(t)===null),this.filterInstructions.add(`${this.fieldName()} date is invalid`,t=>{let n=this.date(t);return n!==null&&!n.isValid()})}canCreateFilterForLine(t){return this.filterInstructions.canCreateFilterForLine(t)?!0:super.canCreateFilterForLine(t)}createFilterOrErrorMessage(t){let n=this.filterInstructions.createFilterOrErrorMessage(t);if(n.filter!==void 0)return n;let i=new le(t),s=oe.getMatch(this.filterRegExp(),t),a;if(s!==null){let o=yr.parseDate(s[2]);if(!o.isValid())i.error="do not understand "+this.fieldName()+" date";else{let u;s[1]==="before"?(a=c=>{let d=this.date(c);return d?d.isBefore(o):this.filterResultIfFieldMissing()},u=" "+s[1]):s[1]==="after"?(a=c=>{let d=this.date(c);return d?d.isAfter(o):this.filterResultIfFieldMissing()},u=" "+s[1]):(a=c=>{let d=this.date(c);return d?d.isSame(o):this.filterResultIfFieldMissing()},u=" on");let l=_e.getExplanationString(this.fieldName(),u,this.filterResultIfFieldMissing(),o);i.filter=new Ve(t,a,new ge(l))}}else i.error="do not understand query filter ("+this.fieldName()+" date)";return i}static getExplanationString(t,n,i,s){let a=s.format("YYYY-MM-DD (dddd Do MMMM YYYY)"),o=`${t} date is${n} ${a}`;return i&&(o+=` OR no ${t} date`),o}supportsSorting(){return!0}comparator(){return(t,n)=>_e.compareByDate(this.date(t),this.date(n))}static compareByDate(t,n){return t!==null&&n===null?-1:t===null&&n!==null?1:t!==null&&n!==null?t.isValid()&&!n.isValid()?-1:!t.isValid()&&n.isValid()||t.isAfter(n)?1:t.isBefore(n)?-1:0:0}};var We=class{constructor({rrule:e,baseOnToday:t,referenceDate:n,startDate:i,scheduledDate:s,dueDate:a}){this.rrule=e,this.baseOnToday=t,this.referenceDate=n,this.startDate=i,this.scheduledDate=s,this.dueDate=a}static fromText({recurrenceRuleText:e,startDate:t,scheduledDate:n,dueDate:i}){try{let s=e.match(/^([a-zA-Z0-9, !]+?)( when done)?$/i);if(s==null)return null;let a=s[1].trim(),o=s[2]!==void 0,u=k.parseText(a);if(u!==null){let l=null;i?l=window.moment(i):n?l=window.moment(n):t&&(l=window.moment(t)),!o&&l!==null?u.dtstart=window.moment(l).startOf("day").utc(!0).toDate():u.dtstart=window.moment().startOf("day").utc(!0).toDate();let c=new k(u);return new We({rrule:c,baseOnToday:o,referenceDate:l,startDate:t,scheduledDate:n,dueDate:i})}}catch(s){}return null}toText(){let e=this.rrule.toText();return this.baseOnToday&&(e+=" when done"),e}next(){var t;let e;if(this.baseOnToday){let n=window.moment(),i=new k(vt(we({},this.rrule.origOptions),{dtstart:n.startOf("day").utc(!0).toDate()}));e=this.nextAfter(n.endOf("day"),i)}else{let n=window.moment((t=this.referenceDate)!=null?t:void 0).endOf("day");e=this.nextAfter(n,this.rrule)}if(e!==null){let n=null,i=null,s=null;if(this.referenceDate){if(this.startDate){let a=window.moment.duration(this.startDate.diff(this.referenceDate));n=window.moment(e),n.add(Math.round(a.asDays()),"days")}if(this.scheduledDate){let a=window.moment.duration(this.scheduledDate.diff(this.referenceDate));i=window.moment(e),i.add(Math.round(a.asDays()),"days")}if(this.dueDate){let a=window.moment.duration(this.dueDate.diff(this.referenceDate));s=window.moment(e),s.add(Math.round(a.asDays()),"days")}}return{startDate:n,scheduledDate:i,dueDate:s}}return null}identicalTo(e){return this.baseOnToday!==e.baseOnToday||_e.compareByDate(this.startDate,e.startDate)!==0||_e.compareByDate(this.scheduledDate,e.scheduledDate)!==0||_e.compareByDate(this.dueDate,e.dueDate)!==0?!1:this.toText()===e.toText()}nextAfter(e,t){e.utc(!0);let n=window.moment(t.after(e.toDate())),i=this.toText(),s=i.match(/every( \d+)? month(s)?(.*)?/);s!==null&&(i.includes(" on ")||(n=We.nextAfterMonths(e,n,t,s[1])));let a=i.match(/every( \d+)? year(s)?(.*)?/);return a!==null&&(n=We.nextAfterYears(e,n,t,a[1])),We.addTimezone(n).toDate()}static nextAfterMonths(e,t,n,i){let s=1;for(i!==void 0&&(s=Number.parseInt(i.trim(),10));We.isSkippingTooManyMonths(e,t,s);)t=We.fromOneDayEarlier(e,n);return t}static isSkippingTooManyMonths(e,t,n){let i=t.month()-e.month();return i+=(t.year()-e.year())*12,i>n}static nextAfterYears(e,t,n,i){let s=1;for(i!==void 0&&(s=Number.parseInt(i.trim(),10));We.isSkippingTooManyYears(e,t,s);)t=We.fromOneDayEarlier(e,n);return t}static isSkippingTooManyYears(e,t,n){return t.year()-e.year()>n}static fromOneDayEarlier(e,t){e.subtract(1,"days").endOf("day");let n=t.origOptions;return n.dtstart=e.startOf("day").toDate(),t=new k(n),window.moment(t.after(e.toDate()))}static addTimezone(e){return window.moment.utc(e).local(!0).startOf("day")}};var tr=(a=>(a.TODO="TODO",a.DONE="DONE",a.IN_PROGRESS="IN_PROGRESS",a.CANCELLED="CANCELLED",a.NON_TASK="NON_TASK",a.EMPTY="EMPTY",a))(tr||{}),Ye=class{constructor(e,t,n,i,s="TODO"){this.symbol=e,this.name=t,this.nextStatusSymbol=n,this.availableAsCommand=i,this.type=s}};var at=class{get symbol(){return this.configuration.symbol}get name(){return this.configuration.name}get nextStatusSymbol(){return this.configuration.nextStatusSymbol}get availableAsCommand(){return this.configuration.availableAsCommand}get type(){return this.configuration.type}constructor(e){this.configuration=e}static makeDone(){return new at(new Ye("x","Done"," ",!0,"DONE"))}static makeEmpty(){return new at(new Ye("","EMPTY","",!0,"EMPTY"))}static makeTodo(){return new at(new Ye(" ","Todo","x",!0,"TODO"))}static makeCancelled(){return new at(new Ye("-","Cancelled"," ",!0,"CANCELLED"))}static makeInProgress(){return new at(new Ye("/","In Progress","x",!0,"IN_PROGRESS"))}static getTypeForUnknownSymbol(e){switch(e){case"x":case"X":return"DONE";case"/":return"IN_PROGRESS";case"-":return"CANCELLED";case"":return"EMPTY";case" ":default:return"TODO"}}static getTypeFromStatusTypeString(e){return tr[e]||"TODO"}static createUnknownStatus(e){return new at(new Ye(e,"Unknown","x",!1,"TODO"))}static createFromImportedValue(e){let t=e[0],n=at.getTypeFromStatusTypeString(e[3]);return new at(new Ye(t,e[1],e[2],!1,n))}isCompleted(){return this.type==="DONE"}previewText(){let e="";return at.tasksPluginCanCreateCommandsForStatuses()&&this.availableAsCommand&&(e=" Available as a command."),`- [${this.symbol}] => [${this.nextStatusSymbol}], name: '${this.name}', type: '${this.configuration.type}'.${e}`}static tasksPluginCanCreateCommandsForStatuses(){return!1}},j=at;j.DONE=at.makeDone(),j.EMPTY=at.makeEmpty(),j.TODO=at.makeTodo();var Pe=class{constructor(){this.coreStatuses=[j.makeTodo().configuration,j.makeDone().configuration],this.customStatuses=[j.makeInProgress().configuration,j.makeCancelled().configuration]}static addStatus(e,t){e.push(t)}static replaceStatus(e,t,n){let i=this.findStatusIndex(t,e);return i<=-1?!1:(e.splice(i,1,n),!0)}static findStatusIndex(e,t){let n=new j(e);return t.findIndex(i=>new j(i).previewText()==n.previewText())}static deleteStatus(e,t){let n=this.findStatusIndex(t,e);return n<=-1?!1:(e.splice(n,1),!0)}static deleteAllCustomStatuses(e){e.customStatuses.splice(0)}static resetAllCustomStatuses(e){Pe.deleteAllCustomStatuses(e),new Pe().customStatuses.forEach(n=>{Pe.addStatus(e.customStatuses,n)})}static bulkAddStatusCollection(e,t){let n=[];return t.forEach(i=>{e.customStatuses.find(a=>a.symbol==i[0]&&a.name==i[1]&&a.nextStatusSymbol==i[2])?n.push(`The status ${i[1]} (${i[0]}) is already added.`):Pe.addStatus(e.customStatuses,j.createFromImportedValue(i))}),n}static applyToStatusRegistry(e,t){t.clearStatuses(),e.coreStatuses.forEach(n=>{t.add(n)}),e.customStatuses.forEach(n=>{t.add(n)})}};var p_=[{index:9999,internalName:"INTERNAL_TESTING_ENABLED_BY_DEFAULT",displayName:"Test Item. Used to validate the Feature Framework.",description:"Description",enabledByDefault:!0,stable:!1}];var rr=class{constructor(e,t,n,i,s,a){this.internalName=e;this.index=t;this.description=n;this.displayName=i;this.enabledByDefault=s;this.stable=a}static get values(){let e=[];return p_.forEach(t=>{e=[...e,new rr(t.internalName,t.index,t.description,t.displayName,t.enabledByDefault,t.stable)]}),e}static get settingsFlags(){let e={};return rr.values.forEach(t=>{e[t.internalName]=t.enabledByDefault}),e}static fromString(e){for(let t of rr.values)if(e===t.internalName)return t;throw new RangeError(`Illegal argument passed to fromString(): ${e} does not correspond to any available Feature ${this.prototype.constructor.name}`)}};var mk={globalFilter:"",removeGlobalFilter:!1,setDoneDate:!0,autoSuggestInEditor:!0,autoSuggestMinMatch:0,autoSuggestMaxItems:6,provideAccessKeys:!0,useFilenameAsScheduledDate:!1,filenameAsDateFolders:[],statusSettings:new Pe,features:rr.settingsFlags,generalSettings:{},headingOpened:{}},qr=we({},mk),U=()=>{for(let r in rr.settingsFlags)qr.features[r]===void 0&&(qr.features[r]=rr.settingsFlags[r]);return qr.statusSettings.customStatuses.forEach((r,e,t)=>{var i,s;let n=j.getTypeFromStatusTypeString(r.type);t[e]=new Ye((i=r.symbol)!=null?i:" ",r.name,(s=r.nextStatusSymbol)!=null?s:"x",r.availableAsCommand,n)}),we({},qr)},ot=r=>(qr=we(we({},qr),r),U());var nn=(r,e)=>(qr.generalSettings[r]=e,U()),h_=r=>{var e;return(e=qr.features[r])!=null?e:!1};var he=class{constructor(){this._registeredStatuses=[];this.addDefaultStatusTypes()}get registeredStatuses(){return this._registeredStatuses.filter(({symbol:e})=>e!==j.EMPTY.symbol)}static getInstance(){return he.instance||(he.instance=new he),he.instance}add(e){this.hasSymbol(e.symbol)||(e instanceof j?this._registeredStatuses.push(e):this._registeredStatuses.push(new j(e)))}bySymbol(e){return this.hasSymbol(e)?this.getSymbol(e):j.EMPTY}bySymbolOrCreate(e){return this.hasSymbol(e)?this.getSymbol(e):j.createUnknownStatus(e)}byName(e){return this._registeredStatuses.filter(({name:t})=>t===e).length>0?this._registeredStatuses.filter(({name:t})=>t===e)[0]:j.EMPTY}resetToDefaultStatuses(){this.clearStatuses(),this.addDefaultStatusTypes()}clearStatuses(){this._registeredStatuses=[]}getNextStatus(e){if(e.nextStatusSymbol!==""){let t=this.bySymbol(e.nextStatusSymbol);if(t!==null)return t}return j.EMPTY}getNextStatusOrCreate(e){let t=this.getNextStatus(e);return t.type!=="EMPTY"?t:j.createUnknownStatus(e.nextStatusSymbol)}findUnknownStatuses(e){let n=e.map(a=>a.status).filter(a=>!this.hasSymbol(a.symbol)),i=new he,s=[];return n.forEach(a=>{if(i.hasSymbol(a.symbol))return;let o=he.copyStatusWithNewName(a,`Unknown (${a.symbol})`);s.push(o),i.add(o)}),s}static copyStatusWithNewName(e,t){let n=new Ye(e.symbol,t,e.nextStatusSymbol,e.availableAsCommand,e.type);return new j(n)}getSymbol(e){return this._registeredStatuses.filter(({symbol:t})=>t===e)[0]}hasSymbol(e){return this._registeredStatuses.find(t=>t.symbol===e)!==void 0}addDefaultStatusTypes(){[j.makeTodo(),j.makeInProgress(),j.makeDone(),j.makeCancelled()].forEach(t=>{this.add(t)})}};var Tr=class{static calculate(e){let t=0;if(e.dueDate!==null){let n=Math.round(window.moment().diff(e.dueDate)/Tr.milliSecondsPerDay),i;n>=7?i=1:n>=-14?i=(n+14)*.8/21+.2:i=.2,t+=i*Tr.dueCoefficient}switch(e.scheduledDate!==null&&window.moment().isSameOrAfter(e.scheduledDate)&&(t+=1*Tr.scheduledCoefficient),e.startDate!==null&&window.moment().isBefore(e.startDate)&&(t+=1*Tr.startedCoefficient),e.priority){case"1":t+=1*Tr.priorityCoefficient;break;case"2":t+=.65*Tr.priorityCoefficient;break;case"3":t+=.325*Tr.priorityCoefficient;break}return t}},_r=Tr;_r.dueCoefficient=12,_r.scheduledCoefficient=5,_r.startedCoefficient=-3,_r.priorityCoefficient=6,_r.milliSecondsPerDay=1e3*60*60*24;var __=require("obsidian");var m_=require("obsidian");var Pd,Ad,y_=({metadataCache:r,vault:e})=>{Pd=r,Ad=e},Xa=t=>x(void 0,[t],function*({originalTask:r,newTasks:e}){if(Ad===void 0||Pd===void 0){console.error("Tasks: cannot use File before initializing it.");return}Array.isArray(e)||(e=[e]),g_({originalTask:r,newTasks:e,vault:Ad,metadataCache:Pd,previousTries:0})}),g_=s=>x(void 0,[s],function*({originalTask:r,newTasks:e,vault:t,metadataCache:n,previousTries:i}){let a=()=>{if(i>10){console.error("Tasks: Too many retries. File update not possible ...");return}let g=Math.min(Math.pow(10,i),100);setTimeout(()=>{g_({originalTask:r,newTasks:e,vault:t,metadataCache:n,previousTries:i+1})},g)},o=t.getAbstractFileByPath(r.path);if(!(o instanceof m_.TFile))return console.warn(`Tasks: No file found for task ${r.description}. Retrying ...`),a();if(o.extension!=="md"){console.error("Tasks: Only supporting files with the .md file extension.");return}let u=n.getFileCache(o);if(u==null||u===null)return console.warn(`Tasks: No file cache found for file ${o.path}. Retrying ...`),a();let l=u.listItems;if(l===void 0||l.length===0)return console.warn(`Tasks: No list items found in file cache of ${o.path}. Retrying ...`),a();let d=(yield t.read(o)).split(` +`),{globalFilter:f}=U(),h,y=0;for(let g of l){if(g.position.start.lineg.toFileLineString()),...d.slice(h.position.start.line+1)];yield t.modify(o,m.join(` +`))});function yk(r,e,t){return x(this,null,function*(){yield __.MarkdownRenderer.renderMarkdown(r,e,t,null)})}function T_(r,e,t=null){return x(this,null,function*(){var a;t||(t=yk);let n=document.createElement("li");e.parentUlElement.appendChild(n),n.classList.add("task-list-item","plugin-tasks-list-item");let i=document.createElement("span");n.appendChild(i),i.classList.add("tasks-list-text"),yield gk(r,e,i,t);let s=document.createElement("input");return n.appendChild(s),s.classList.add("task-list-item-checkbox"),s.type="checkbox",r.status.symbol!==" "&&(s.checked=!0,n.classList.add("is-checked")),s.addEventListener("click",o=>{o.preventDefault(),o.stopPropagation(),s.disabled=!0;let u=r.toggle();Xa({originalTask:r,newTasks:u})}),n.prepend(s),n.setAttribute("data-task",r.status.symbol.trim()),n.setAttribute("data-line",e.listIndex.toString()),s.setAttribute("data-line",e.listIndex.toString()),(a=e.layoutOptions)!=null&&a.shortMode&&Tk({task:r,element:i,isFilenameUnique:e.isFilenameUnique}),n})}function gk(r,e,t,n){return x(this,null,function*(){let i="",s=new On(e.layoutOptions);for(let a of s.layoutComponents){let o=r.componentToString(s,a);o&&(a==="description"&&(o=bk(o)),i+=o)}yield _k(t,i,"description",r,n)})}function _k(r,e,t,n,i){return x(this,null,function*(){if(t==="description"){yield i(e,r,n.path);let s=r.querySelector("blockquote"),a=s!=null?s:r,o=a.querySelector("p");if(o!==null){for(;o.firstChild;)a.insertBefore(o.firstChild,o);o.remove()}r.querySelectorAll("p").forEach(u=>{u.hasChildNodes()||u.remove()}),r.querySelectorAll(".footnotes").forEach(u=>{u.remove()})}else r.innerHTML=e})}function Tk({task:r,element:e,isFilenameUnique:t}){e.addEventListener("mouseenter",()=>{let n=e.createDiv();n.addClasses(["tooltip","mod-right"]),r.recurrence&&n.createDiv().setText(`${Yt} ${r.recurrence.toText()}`),r.startDate&&n.createDiv().setText(Za({signifier:$t,date:r.startDate})),r.scheduledDate&&n.createDiv().setText(Za({signifier:jt,date:r.scheduledDate})),r.dueDate&&n.createDiv().setText(Za({signifier:Bt,date:r.dueDate})),r.doneDate&&n.createDiv().setText(Za({signifier:Qa,date:r.doneDate}));let i=r.getLinkText({isFilenameUnique:t});i&&n.createDiv().setText(`\u{1F517} ${i}`),e.addEventListener("mouseleave",()=>{n.remove()})})}function Za({signifier:r,date:e}){return`${r} ${e.format(S.dateFormat)} (${e.from(window.moment().startOf("day"))})`}function bk(r){let{globalFilter:e,removeGlobalFilter:t}=U();return t?r.replace(e,"").trim():r}var ut=class{static fromPath(e){let{useFilenameAsScheduledDate:t,filenameAsDateFolders:n}=U();return!t||!this.matchesAnyFolder(n,e)?null:this.extractDateFromPath(e)}static matchesAnyFolder(e,t){return e.length===0?!0:e.some(n=>t.startsWith(n+"/"))}static extractDateFromPath(e){let t=Math.max(0,e.lastIndexOf("/")+1),n=e.lastIndexOf("."),i=e.substring(t,n),s=/(\d{4})-(\d{2})-(\d{2})/.exec(i);if(s||(s=/(\d{4})(\d{2})(\d{2})/.exec(i)),s){let a=window.moment([parseInt(s[1]),parseInt(s[2])-1,parseInt(s[3])]);if(a.isValid())return a}return null}static canApplyFallback({startDate:e,scheduledDate:t,dueDate:n}){return e===null&&n===null&&t===null}static updateTaskPath(e,t,n){let i=e.scheduledDate,s=e.scheduledDateIsInferred;return n===null?s&&(s=!1,i=null):s?i=n:this.canApplyFallback(e)&&(i=n,s=!0),new me(vt(we({},e),{path:t,scheduledDate:i,scheduledDateIsInferred:s}))}static removeInferredStatusIfNeeded(e,t){let n=e.scheduledDateIsInferred?e.scheduledDate:null;return t.map(i=>(n!==null&&!n.isSame(i.scheduledDate,"day")&&(i=new me(vt(we({},i),{scheduledDateIsInferred:!1}))),i))}};var Ae={High:"\u23EB",Medium:"\u{1F53C}",Low:"\u{1F53D}",None:""},Yt="\u{1F501}",$t="\u{1F6EB}",jt="\u23F3",Bt="\u{1F4C5}",Qa="\u2705",yt=class{},S=yt;S.dateFormat="YYYY-MM-DD",S.indentationRegex=/^([\s\t>]*)/,S.listMarkerRegex=/([-*]|[0-9]+\.)/,S.checkboxRegex=/\[(.)\]/u,S.afterCheckboxRegex=/ *(.*)/u,S.taskRegex=new RegExp(yt.indentationRegex.source+yt.listMarkerRegex.source+" +"+yt.checkboxRegex.source+yt.afterCheckboxRegex.source,"u"),S.nonTaskRegex=new RegExp(yt.indentationRegex.source+yt.listMarkerRegex.source+"? *("+yt.checkboxRegex.source+")?"+yt.afterCheckboxRegex.source,"u"),S.listItemRegex=new RegExp(yt.indentationRegex.source+yt.listMarkerRegex.source),S.blockLinkRegex=/ \^[a-zA-Z0-9-]+$/u,S.priorityRegex=/([⏫🔼🔽])$/u,S.startDateRegex=/🛫 *(\d{4}-\d{2}-\d{2})$/u,S.scheduledDateRegex=/[⏳⌛] *(\d{4}-\d{2}-\d{2})$/u,S.dueDateRegex=/[📅📆🗓] *(\d{4}-\d{2}-\d{2})$/u,S.doneDateRegex=/✅ *(\d{4}-\d{2}-\d{2})$/u,S.recurrenceRegex=/🔁 ?([a-zA-Z0-9, !]+)$/iu,S.hashTags=/(^|\s)#[^ !@#$%^&*(),.?":{}|<>]*/g,S.hashTagsFromEnd=new RegExp(yt.hashTags.source+"$");var me=class{constructor({status:e,description:t,path:n,indentation:i,listMarker:s,sectionStart:a,sectionIndex:o,precedingHeader:u,priority:l,startDate:c,scheduledDate:d,dueDate:f,doneDate:h,recurrence:y,blockLink:m,tags:g,originalMarkdown:R,scheduledDateIsInferred:O}){this._urgency=null;this.status=e,this.description=t,this.path=n,this.indentation=i,this.listMarker=s,this.sectionStart=a,this.sectionIndex=o,this.precedingHeader=u,this.tags=g,this.priority=l,this.startDate=c,this.scheduledDate=d,this.dueDate=f,this.doneDate=h,this.recurrence=y,this.blockLink=m,this.originalMarkdown=R,this.scheduledDateIsInferred=O}static fromLine({line:e,path:t,sectionStart:n,sectionIndex:i,precedingHeader:s,fallbackDate:a}){let o=e.match(S.taskRegex);if(o===null)return null;let u=o[4].trim(),{globalFilter:l}=U();if(!u.includes(l))return null;let c=u,d=o[1],f=o[2],h=o[3],y=he.getInstance().bySymbolOrCreate(h),m=c.match(S.blockLinkRegex),g=m!==null?m[0]:"";g!==""&&(c=c.replace(S.blockLinkRegex,"").trim());let R,O="3",P=null,X=null,ye=!1,Te=null,se=null,H="",bt=null,lt=[],A="",E=20,b=0;do{R=!1;let v=c.match(S.priorityRegex);if(v!==null){switch(v[1]){case Ae.Low:O="4";break;case Ae.Medium:O="2";break;case Ae.High:O="1";break}c=c.replace(S.priorityRegex,"").trim(),R=!0}let q=c.match(S.doneDateRegex);q!==null&&(se=window.moment(q[1],S.dateFormat),c=c.replace(S.doneDateRegex,"").trim(),R=!0);let w=c.match(S.dueDateRegex);w!==null&&(Te=window.moment(w[1],S.dateFormat),c=c.replace(S.dueDateRegex,"").trim(),R=!0);let F=c.match(S.scheduledDateRegex);F!==null&&(X=window.moment(F[1],S.dateFormat),c=c.replace(S.scheduledDateRegex,"").trim(),R=!0);let B=c.match(S.startDateRegex);B!==null&&(P=window.moment(B[1],S.dateFormat),c=c.replace(S.startDateRegex,"").trim(),R=!0);let W=c.match(S.recurrenceRegex);W!==null&&(H=W[1].trim(),c=c.replace(S.recurrenceRegex,"").trim(),R=!0);let de=c.match(S.hashTagsFromEnd);if(de!=null){c=c.replace(S.hashTagsFromEnd,"").trim(),R=!0;let fe=de[0].trim();A=A.length>0?[fe,A].join(" "):fe}b++}while(R&&b<=E);H.length>0&&(bt=We.fromText({recurrenceRuleText:H,startDate:P,scheduledDate:X,dueDate:Te})),ut.canApplyFallback({startDate:P,scheduledDate:X,dueDate:Te})&&a!==null&&(X=a,ye=!0),A.length>0&&(c+=" "+A);let C=c.match(S.hashTags);return C!==null&&(lt=C.filter(v=>v!==l).map(v=>v.trim())),new me({status:y,description:c,path:t,indentation:d,listMarker:f,sectionStart:n,sectionIndex:i,precedingHeader:s,priority:O,startDate:P,scheduledDate:X,dueDate:Te,doneDate:se,recurrence:bt,blockLink:g,tags:lt,originalMarkdown:e,scheduledDateIsInferred:ye})}toLi(e){return x(this,null,function*(){return T_(this,e)})}toString(e){let t=new On(e),n="";for(let i of t.layoutComponents)n+=this.componentToString(t,i);return n}componentToString(e,t){var n;switch(t){case"description":return this.description;case"priority":{let i="";return this.priority==="1"?i=" "+Ae.High:this.priority==="2"?i=" "+Ae.Medium:this.priority==="4"&&(i=" "+Ae.Low),i}case"startDate":return this.startDate?e.options.shortMode?" "+$t:` ${$t} ${this.startDate.format(S.dateFormat)}`:"";case"scheduledDate":return!this.scheduledDate||this.scheduledDateIsInferred?"":e.options.shortMode?" "+jt:` ${jt} ${this.scheduledDate.format(S.dateFormat)}`;case"doneDate":return this.doneDate?e.options.shortMode?" "+Qa:` ${Qa} ${this.doneDate.format(S.dateFormat)}`:"";case"dueDate":return this.dueDate?e.options.shortMode?" "+Bt:` ${Bt} ${this.dueDate.format(S.dateFormat)}`:"";case"recurrenceRule":return this.recurrence?e.options.shortMode?" "+Yt:` ${Yt} ${this.recurrence.toText()}`:"";case"blockLink":return(n=this.blockLink)!=null?n:"";default:throw new Error(`Don't know how to render task component of type '${t}'`)}}toFileLineString(){return`${this.indentation}${this.listMarker} [${this.status.symbol}] ${this.toString()}`}toggle(){let e=he.getInstance().getNextStatusOrCreate(this.status),t=null,n=null;if(e.isCompleted()){let{setDoneDate:a}=U();a&&(t=window.moment()),this.recurrence!==null&&(n=this.recurrence.next())}let i=new me(vt(we({},this),{status:e,doneDate:t})),s=[];if(n!==null){let a=he.getInstance().getNextStatusOrCreate(e),o=new me(vt(we(we({},this),n),{status:a,blockLink:""}));s.push(o)}return s.push(i),s}get urgency(){return this._urgency===null&&(this._urgency=_r.calculate(this)),this._urgency}get filename(){let e=this.path.match(/([^/]+)\.md$/);return e!==null?e[1]:null}getLinkText({isFilenameUnique:e}){let t;return e?t=this.filename:t="/"+this.path,t===null?null:(this.precedingHeader!==null&&this.precedingHeader!==t&&(t=t+" > "+this.precedingHeader),t)}static tasksListsIdentical(e,t){return e.length!==t.length?!1:e.every((n,i)=>n.identicalTo(t[i]))}identicalTo(e){let t=["status","description","path","indentation","listMarker","sectionStart","sectionIndex","precedingHeader","priority","blockLink","scheduledDateIsInferred"];for(let s of t)if(this[s]!==e[s])return!1;if(this.tags.length!==e.tags.length||!this.tags.every(function(s,a){return s===e.tags[a]}))return!1;t=["startDate","scheduledDate","dueDate","doneDate"];for(let s of t){let a=this[s],o=e[s];if(_e.compareByDate(a,o)!==0)return!1}let n=this.recurrence,i=e.recurrence;return n===null&&i!==null||n!==null&&i===null?!1:!(n&&i&&!n.identicalTo(i))}getDescriptionWithoutGlobalFilter(){let{globalFilter:e}=U(),t=this.description;if(e.length===0)return t;let n=RegExp("(^|\\s)"+Ka(e)+"($|\\s)","ug");return this.description.search(n)>-1&&(t=t.replace(n,"$1$2").replace(" "," ").trim()),t}};var Ms=class{constructor(e){this.fetch=e;this._value=void 0}get value(){return this._value===void 0&&(this._value=this.fetch()),this._value}};var sn=class{constructor({metadataCache:e,vault:t,events:n}){this.metadataCache=e,this.metadataCacheEventReferences=[],this.vault=t,this.vaultEventReferences=[],this.events=n,this.eventsEventReferences=[],this.tasksMutex=new Vs,this.state="Cold",this.tasks=[],this.loadedAfterFirstResolve=!1,this.subscribeToCache(),this.subscribeToVault(),this.subscribeToEvents(),this.loadVault()}unload(){for(let e of this.metadataCacheEventReferences)this.metadataCache.offref(e);for(let e of this.vaultEventReferences)this.vault.offref(e);for(let e of this.eventsEventReferences)this.events.off(e)}getTasks(){return this.tasks}getState(){return this.state}notifySubscribers(){this.events.triggerCacheUpdate({tasks:this.tasks,state:this.state})}subscribeToCache(){let e=this.metadataCache.on("resolved",()=>x(this,null,function*(){this.loadedAfterFirstResolve||(this.loadedAfterFirstResolve=!0,this.loadVault())}));this.metadataCacheEventReferences.push(e);let t=this.metadataCache.on("changed",n=>{this.tasksMutex.runExclusive(()=>{this.indexFile(n)})});this.metadataCacheEventReferences.push(t)}subscribeToVault(){let{useFilenameAsScheduledDate:e}=U(),t=this.vault.on("create",s=>{s instanceof zn.TFile&&this.tasksMutex.runExclusive(()=>{this.indexFile(s)})});this.vaultEventReferences.push(t);let n=this.vault.on("delete",s=>{s instanceof zn.TFile&&this.tasksMutex.runExclusive(()=>{this.tasks=this.tasks.filter(a=>a.path!==s.path),this.notifySubscribers()})});this.vaultEventReferences.push(n);let i=this.vault.on("rename",(s,a)=>{s instanceof zn.TFile&&this.tasksMutex.runExclusive(()=>{let o=new Ms(()=>ut.fromPath(s.path));this.tasks=this.tasks.map(u=>u.path===a?e?ut.updateTaskPath(u,s.path,o.value):new me(vt(we({},u),{path:s.path})):u),this.notifySubscribers()})});this.vaultEventReferences.push(i)}subscribeToEvents(){let e=this.events.onRequestCacheUpdate(t=>{t({tasks:this.tasks,state:this.state})});this.eventsEventReferences.push(e)}loadVault(){return this.tasksMutex.runExclusive(()=>x(this,null,function*(){this.state="Initializing",yield Promise.all(this.vault.getMarkdownFiles().map(e=>this.indexFile(e))),this.state="Warm",this.notifySubscribers()}))}indexFile(e){return x(this,null,function*(){let t=this.metadataCache.getFileCache(e);if(t==null)return;let n=this.tasks.filter(a=>a.path===e.path),i=t.listItems,s=[];if(i!==void 0){let a=yield this.vault.cachedRead(e);s=this.getTasksFromFileContent(a,i,t,e)}me.tasksListsIdentical(n,s)||(this.getState()=="Warm"&&console.debug(`At least one task, its line number or its heading has changed in ${e.path}: triggering a refresh of all active Tasks blocks in Live Preview and Reading mode views.`),this.tasks=this.tasks.filter(a=>a.path!==e.path),this.tasks.push(...s),this.notifySubscribers())})}getTasksFromFileContent(e,t,n,i){let s=[],a=e.split(` +`),o=a.length,u=new Ms(()=>ut.fromPath(i.path)),l=null,c=0;for(let d of t)if(d.task!==void 0){let f=d.position.start.line;if(f>=o)return console.log(`${i.path} Obsidian gave us a line number ${f} past the end of the file. ${o}.`),s;if((l===null||l.position.end.line= lineNumberTask) { - return section; - } - } - return null; - } - static getPrecedingHeader(lineNumberTask, headings) { - if (headings === void 0) { - return null; - } - let precedingHeader = null; - for (const heading of headings) { - if (heading.position.start.line > lineNumberTask) { - return precedingHeader; - } - precedingHeader = heading.heading; - } - return precedingHeader; - } -}; - -// src/Commands/CreateOrEdit.ts -var import_obsidian5 = require("obsidian"); - -// src/TaskModal.ts -var import_obsidian4 = require("obsidian"); - -// node_modules/svelte/internal/index.mjs -function noop() { -} -function run(fn) { - return fn(); -} -function blank_object() { - return /* @__PURE__ */ Object.create(null); -} -function run_all(fns) { - fns.forEach(run); -} -function is_function(thing) { - return typeof thing === "function"; -} -function safe_not_equal(a, b) { - return a != a ? b == b : a !== b || (a && typeof a === "object" || typeof a === "function"); -} -function is_empty(obj) { - return Object.keys(obj).length === 0; -} -var is_hydrating = false; -function start_hydrating() { - is_hydrating = true; -} -function end_hydrating() { - is_hydrating = false; -} -function append(target, node) { - target.appendChild(node); -} -function insert(target, node, anchor) { - target.insertBefore(node, anchor || null); -} -function detach(node) { - node.parentNode.removeChild(node); -} -function destroy_each(iterations, detaching) { - for (let i = 0; i < iterations.length; i += 1) { - if (iterations[i]) - iterations[i].d(detaching); - } -} -function element(name) { - return document.createElement(name); -} -function svg_element(name) { - return document.createElementNS("http://www.w3.org/2000/svg", name); -} -function text(data) { - return document.createTextNode(data); -} -function space() { - return text(" "); -} -function listen(node, event, handler, options) { - node.addEventListener(event, handler, options); - return () => node.removeEventListener(event, handler, options); -} -function prevent_default(fn) { - return function(event) { - event.preventDefault(); - return fn.call(this, event); - }; -} -function attr(node, attribute, value) { - if (value == null) - node.removeAttribute(attribute); - else if (node.getAttribute(attribute) !== value) - node.setAttribute(attribute, value); -} -function children(element2) { - return Array.from(element2.childNodes); -} -function set_data(text2, data) { - data = "" + data; - if (text2.wholeText !== data) - text2.data = data; -} -function set_input_value(input, value) { - input.value = value == null ? "" : value; -} -function select_option(select, value) { - for (let i = 0; i < select.options.length; i += 1) { - const option = select.options[i]; - if (option.__value === value) { - option.selected = true; - return; - } - } - select.selectedIndex = -1; -} -function select_value(select) { - const selected_option = select.querySelector(":checked") || select.options[0]; - return selected_option && selected_option.__value; -} -function toggle_class(element2, name, toggle) { - element2.classList[toggle ? "add" : "remove"](name); -} -var HtmlTag = class { - constructor(is_svg = false) { - this.is_svg = false; - this.is_svg = is_svg; - this.e = this.n = null; - } - c(html) { - this.h(html); - } - m(html, target, anchor = null) { - if (!this.e) { - if (this.is_svg) - this.e = svg_element(target.nodeName); - else - this.e = element(target.nodeName); - this.t = target; - this.c(html); - } - this.i(anchor); - } - h(html) { - this.e.innerHTML = html; - this.n = Array.from(this.e.childNodes); - } - i(anchor) { - for (let i = 0; i < this.n.length; i += 1) { - insert(this.t, this.n[i], anchor); - } - } - p(html) { - this.d(); - this.h(html); - this.i(this.a); - } - d() { - this.n.forEach(detach); - } -}; -var current_component; -function set_current_component(component) { - current_component = component; -} -function get_current_component() { - if (!current_component) - throw new Error("Function called outside component initialization"); - return current_component; -} -function onMount(fn) { - get_current_component().$$.on_mount.push(fn); -} -var dirty_components = []; -var binding_callbacks = []; -var render_callbacks = []; -var flush_callbacks = []; -var resolved_promise = Promise.resolve(); -var update_scheduled = false; -function schedule_update() { - if (!update_scheduled) { - update_scheduled = true; - resolved_promise.then(flush); - } -} -function add_render_callback(fn) { - render_callbacks.push(fn); -} -var seen_callbacks = /* @__PURE__ */ new Set(); -var flushidx = 0; -function flush() { - const saved_component = current_component; - do { - while (flushidx < dirty_components.length) { - const component = dirty_components[flushidx]; - flushidx++; - set_current_component(component); - update(component.$$); - } - set_current_component(null); - dirty_components.length = 0; - flushidx = 0; - while (binding_callbacks.length) - binding_callbacks.pop()(); - for (let i = 0; i < render_callbacks.length; i += 1) { - const callback = render_callbacks[i]; - if (!seen_callbacks.has(callback)) { - seen_callbacks.add(callback); - callback(); - } - } - render_callbacks.length = 0; - } while (dirty_components.length); - while (flush_callbacks.length) { - flush_callbacks.pop()(); - } - update_scheduled = false; - seen_callbacks.clear(); - set_current_component(saved_component); -} -function update($$) { - if ($$.fragment !== null) { - $$.update(); - run_all($$.before_update); - const dirty = $$.dirty; - $$.dirty = [-1]; - $$.fragment && $$.fragment.p($$.ctx, dirty); - $$.after_update.forEach(add_render_callback); - } -} -var outroing = /* @__PURE__ */ new Set(); -function transition_in(block, local) { - if (block && block.i) { - outroing.delete(block); - block.i(local); - } -} -var globals = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : global; -function mount_component(component, target, anchor, customElement) { - const { fragment, on_mount, on_destroy, after_update } = component.$$; - fragment && fragment.m(target, anchor); - if (!customElement) { - add_render_callback(() => { - const new_on_destroy = on_mount.map(run).filter(is_function); - if (on_destroy) { - on_destroy.push(...new_on_destroy); - } else { - run_all(new_on_destroy); - } - component.$$.on_mount = []; - }); - } - after_update.forEach(add_render_callback); -} -function destroy_component(component, detaching) { - const $$ = component.$$; - if ($$.fragment !== null) { - run_all($$.on_destroy); - $$.fragment && $$.fragment.d(detaching); - $$.on_destroy = $$.fragment = null; - $$.ctx = []; - } -} -function make_dirty(component, i) { - if (component.$$.dirty[0] === -1) { - dirty_components.push(component); - schedule_update(); - component.$$.dirty.fill(0); - } - component.$$.dirty[i / 31 | 0] |= 1 << i % 31; -} -function init(component, options, instance2, create_fragment2, not_equal, props, append_styles, dirty = [-1]) { - const parent_component = current_component; - set_current_component(component); - const $$ = component.$$ = { - fragment: null, - ctx: null, - props, - update: noop, - not_equal, - bound: blank_object(), - on_mount: [], - on_destroy: [], - on_disconnect: [], - before_update: [], - after_update: [], - context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), - callbacks: blank_object(), - dirty, - skip_bound: false, - root: options.target || parent_component.$$.root - }; - append_styles && append_styles($$.root); - let ready = false; - $$.ctx = instance2 ? instance2(component, options.props || {}, (i, ret, ...rest) => { - const value = rest.length ? rest[0] : ret; - if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { - if (!$$.skip_bound && $$.bound[i]) - $$.bound[i](value); - if (ready) - make_dirty(component, i); - } - return ret; - }) : []; - $$.update(); - ready = true; - run_all($$.before_update); - $$.fragment = create_fragment2 ? create_fragment2($$.ctx) : false; - if (options.target) { - if (options.hydrate) { - start_hydrating(); - const nodes = children(options.target); - $$.fragment && $$.fragment.l(nodes); - nodes.forEach(detach); - } else { - $$.fragment && $$.fragment.c(); - } - if (options.intro) - transition_in(component.$$.fragment); - mount_component(component, options.target, options.anchor, options.customElement); - end_hydrating(); - flush(); - } - set_current_component(parent_component); -} -var SvelteElement; -if (typeof HTMLElement === "function") { - SvelteElement = class extends HTMLElement { - constructor() { - super(); - this.attachShadow({ mode: "open" }); - } - connectedCallback() { - const { on_mount } = this.$$; - this.$$.on_disconnect = on_mount.map(run).filter(is_function); - for (const key in this.$$.slotted) { - this.appendChild(this.$$.slotted[key]); - } - } - attributeChangedCallback(attr2, _oldValue, newValue) { - this[attr2] = newValue; - } - disconnectedCallback() { - run_all(this.$$.on_disconnect); - } - $destroy() { - destroy_component(this, 1); - this.$destroy = noop; - } - $on(type, callback) { - const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []); - callbacks.push(callback); - return () => { - const index = callbacks.indexOf(callback); - if (index !== -1) - callbacks.splice(index, 1); - }; - } - $set($$props) { - if (this.$$set && !is_empty($$props)) { - this.$$.skip_bound = true; - this.$$set($$props); - this.$$.skip_bound = false; - } - } - }; -} -var SvelteComponent = class { - $destroy() { - destroy_component(this, 1); - this.$destroy = noop; - } - $on(type, callback) { - const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []); - callbacks.push(callback); - return () => { - const index = callbacks.indexOf(callback); - if (index !== -1) - callbacks.splice(index, 1); - }; - } - $set($$props) { - if (this.$$set && !is_empty($$props)) { - this.$$.skip_bound = true; - this.$$set($$props); - this.$$.skip_bound = false; - } - } -}; - -// src/ui/EditTask.svelte -var chrono = __toESM(require_dist()); - -// src/DateAbbreviations.ts -var abbreviations = { - td: "today", - tm: "tomorrow", - yd: "yesterday", - tw: "this week", - nw: "next week", - weekend: "sat", - we: "sat" -}; -function doAutocomplete(date) { - for (const [key, val] of Object.entries(abbreviations)) { - date = date.replace(RegExp(`\\b${key}\\s`, "i"), val); - } - return date; -} - -// src/ui/EditTask.svelte -function get_each_context(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[32] = list[i]; - return child_ctx; -} -function get_each_context_1(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[35] = list[i].value; - child_ctx[36] = list[i].label; - child_ctx[37] = list[i].symbol; - return child_ctx; -} -function create_if_block(ctx) { - let span; - let t_value = ctx[37] + ""; - let t; - return { - c() { - span = element("span"); - t = text(t_value); - }, - m(target, anchor) { - insert(target, span, anchor); - append(span, t); - }, - p: noop, - d(detaching) { - if (detaching) - detach(span); - } - }; -} -function create_each_block_1(ctx) { - let span1; - let input; - let input_id_value; - let input_value_value; - let input_accesskey_value; - let t0; - let label; - let span0; - let t1_value = ctx[36] + ""; - let t1; - let t2; - let show_if = ctx[37] && ctx[37].charCodeAt(0) >= 256; - let label_for_value; - let t3; - let mounted; - let dispose; - let if_block = show_if && create_if_block(ctx); - return { - c() { - span1 = element("span"); - input = element("input"); - t0 = space(); - label = element("label"); - span0 = element("span"); - t1 = text(t1_value); - t2 = space(); - if (if_block) - if_block.c(); - t3 = space(); - attr(input, "type", "radio"); - attr(input, "id", input_id_value = "priority-" + ctx[35]); - input.__value = input_value_value = ctx[35]; - input.value = input.__value; - attr(input, "accesskey", input_accesskey_value = ctx[9](ctx[36].charAt(0).toLowerCase())); - ctx[21][0].push(input); - attr(span0, "class", "accesskey-first"); - attr(label, "for", label_for_value = "priority-" + ctx[35]); - }, - m(target, anchor) { - insert(target, span1, anchor); - append(span1, input); - input.checked = input.__value === ctx[1].priority; - append(span1, t0); - append(span1, label); - append(label, span0); - append(span0, t1); - append(label, t2); - if (if_block) - if_block.m(label, null); - append(span1, t3); - if (!mounted) { - dispose = listen(input, "change", ctx[20]); - mounted = true; - } - }, - p(ctx2, dirty) { - if (dirty[0] & 512 && input_accesskey_value !== (input_accesskey_value = ctx2[9](ctx2[36].charAt(0).toLowerCase()))) { - attr(input, "accesskey", input_accesskey_value); - } - if (dirty[0] & 3) { - input.checked = input.__value === ctx2[1].priority; - } - if (show_if) - if_block.p(ctx2, dirty); - }, - d(detaching) { - if (detaching) - detach(span1); - ctx[21][0].splice(ctx[21][0].indexOf(input), 1); - if (if_block) - if_block.d(); - mounted = false; - dispose(); - } - }; -} -function create_each_block(ctx) { - let option; - let t0_value = ctx[32].name + ""; - let t0; - let t1; - let t2_value = ctx[32].symbol + ""; - let t2; - let t3; - let option_value_value; - return { - c() { - option = element("option"); - t0 = text(t0_value); - t1 = text(" ["); - t2 = text(t2_value); - t3 = text("]"); - option.__value = option_value_value = ctx[32]; - option.value = option.__value; - }, - m(target, anchor) { - insert(target, option, anchor); - append(option, t0); - append(option, t1); - append(option, t2); - append(option, t3); - }, - p(ctx2, dirty) { - if (dirty[0] & 1 && t0_value !== (t0_value = ctx2[32].name + "")) - set_data(t0, t0_value); - if (dirty[0] & 1 && t2_value !== (t2_value = ctx2[32].symbol + "")) - set_data(t2, t2_value); - if (dirty[0] & 1 && option_value_value !== (option_value_value = ctx2[32])) { - option.__value = option_value_value; - option.value = option.__value; - } - }, - d(detaching) { - if (detaching) - detach(option); - } - }; -} -function create_fragment(ctx) { - let div9; - let form; - let div0; - let label0; - let t3; - let input0; - let input0_accesskey_value; - let t4; - let div1; - let label1; - let t5; - let label1_for_value; - let t6; - let t7; - let div3; - let label2; - let t9; - let input1; - let input1_accesskey_value; - let t10; - let code0; - let t11; - let t12; - let html_tag; - let t13; - let label3; - let t15; - let input2; - let input2_accesskey_value; - let t16; - let code1; - let t17; - let t18; - let html_tag_1; - let t19; - let label4; - let t21; - let input3; - let input3_accesskey_value; - let t22; - let code2; - let t23; - let t24; - let html_tag_2; - let t25; - let label5; - let t29; - let input4; - let input4_accesskey_value; - let t30; - let code3; - let t31; - let t32; - let html_tag_3; - let t33; - let div2; - let label6; - let t37; - let input5; - let input5_accesskey_value; - let t38; - let div4; - let label7; - let t40; - let select; - let t41; - let div7; - let div5; - let label8; - let t43; - let input6; - let input6_checked_value; - let t44; - let div6; - let span3; - let t46; - let code4; - let t47; - let div8; - let button0; - let t49; - let button1; - let mounted; - let dispose; - let each_value_1 = ctx[10]; - let each_blocks_1 = []; - for (let i = 0; i < each_value_1.length; i += 1) { - each_blocks_1[i] = create_each_block_1(get_each_context_1(ctx, each_value_1, i)); - } - let each_value = ctx[0]; - let each_blocks = []; - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i)); - } - return { - c() { - div9 = element("div"); - form = element("form"); - div0 = element("div"); - label0 = element("label"); - label0.innerHTML = `Description`; - t3 = space(); - input0 = element("input"); - t4 = space(); - div1 = element("div"); - label1 = element("label"); - t5 = text("Priority"); - t6 = space(); - for (let i = 0; i < each_blocks_1.length; i += 1) { - each_blocks_1[i].c(); - } - t7 = space(); - div3 = element("div"); - label2 = element("label"); - label2.textContent = "Recurs"; - t9 = space(); - input1 = element("input"); - t10 = space(); - code0 = element("code"); - t11 = text(recurrenceSymbol); - t12 = space(); - html_tag = new HtmlTag(false); - t13 = space(); - label3 = element("label"); - label3.textContent = "Due"; - t15 = space(); - input2 = element("input"); - t16 = space(); - code1 = element("code"); - t17 = text(dueDateSymbol); - t18 = space(); - html_tag_1 = new HtmlTag(false); - t19 = space(); - label4 = element("label"); - label4.textContent = "Scheduled"; - t21 = space(); - input3 = element("input"); - t22 = space(); - code2 = element("code"); - t23 = text(scheduledDateSymbol); - t24 = space(); - html_tag_2 = new HtmlTag(false); - t25 = space(); - label5 = element("label"); - label5.innerHTML = `Start`; - t29 = space(); - input4 = element("input"); - t30 = space(); - code3 = element("code"); - t31 = text(startDateSymbol); - t32 = space(); - html_tag_3 = new HtmlTag(false); - t33 = space(); - div2 = element("div"); - label6 = element("label"); - label6.innerHTML = `Only - future dates:`; - t37 = space(); - input5 = element("input"); - t38 = space(); - div4 = element("div"); - label7 = element("label"); - label7.textContent = "Status"; - t40 = space(); - select = element("select"); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - t41 = space(); - div7 = element("div"); - div5 = element("div"); - label8 = element("label"); - label8.textContent = "Completed:"; - t43 = space(); - input6 = element("input"); - t44 = space(); - div6 = element("div"); - span3 = element("span"); - span3.textContent = "Done on:"; - t46 = space(); - code4 = element("code"); - t47 = space(); - div8 = element("div"); - button0 = element("button"); - button0.textContent = "Apply"; - t49 = space(); - button1 = element("button"); - button1.textContent = "Cancel"; - attr(label0, "for", "description"); - attr(input0, "id", "description"); - attr(input0, "type", "text"); - attr(input0, "class", "tasks-modal-description"); - attr(input0, "placeholder", "Take out the trash"); - attr(input0, "accesskey", input0_accesskey_value = ctx[9]("t")); - attr(div0, "class", "tasks-modal-section"); - attr(label1, "for", label1_for_value = "priority-" + ctx[1].priority); - attr(div1, "class", "tasks-modal-section tasks-modal-priorities"); - attr(label2, "for", "recurrence"); - attr(label2, "class", "accesskey-first"); - attr(input1, "id", "recurrence"); - attr(input1, "type", "text"); - attr(input1, "placeholder", "Try 'every 2 weeks on Thursday'."); - attr(input1, "accesskey", input1_accesskey_value = ctx[9]("r")); - html_tag.a = null; - attr(label3, "for", "due"); - attr(label3, "class", "accesskey-first"); - attr(input2, "id", "due"); - attr(input2, "type", "text"); - attr(input2, "placeholder", datePlaceholder); - attr(input2, "accesskey", input2_accesskey_value = ctx[9]("d")); - html_tag_1.a = null; - attr(label4, "for", "scheduled"); - attr(label4, "class", "accesskey-first"); - attr(input3, "id", "scheduled"); - attr(input3, "type", "text"); - attr(input3, "placeholder", datePlaceholder); - attr(input3, "accesskey", input3_accesskey_value = ctx[9]("s")); - html_tag_2.a = null; - attr(label5, "for", "start"); - attr(input4, "id", "start"); - attr(input4, "type", "text"); - attr(input4, "placeholder", datePlaceholder); - attr(input4, "accesskey", input4_accesskey_value = ctx[9]("a")); - html_tag_3.a = null; - attr(label6, "for", "forwardOnly"); - attr(input5, "id", "forwardOnly"); - attr(input5, "type", "checkbox"); - attr(input5, "class", "task-list-item-checkbox tasks-modal-checkbox"); - attr(input5, "accesskey", input5_accesskey_value = ctx[9]("f")); - attr(div3, "class", "tasks-modal-section tasks-modal-dates"); - attr(label7, "for", "status"); - attr(select, "id", "status-type"); - attr(select, "class", "dropdown"); - if (ctx[1].status === void 0) - add_render_callback(() => ctx[27].call(select)); - attr(div4, "class", "tasks-modal-section"); - attr(label8, "for", "status"); - attr(input6, "id", "status"); - attr(input6, "type", "checkbox"); - attr(input6, "class", "task-list-item-checkbox tasks-modal-checkbox"); - input6.checked = input6_checked_value = ctx[1].status.isCompleted(); - input6.disabled = true; - attr(div7, "class", "tasks-modal-section tasks-modal-status"); - attr(button0, "type", "submit"); - attr(button0, "class", "mod-cta"); - attr(button1, "type", "button"); - attr(div8, "class", "tasks-modal-section tasks-modal-buttons"); - toggle_class(form, "with-accesskeys", ctx[2]); - attr(div9, "class", "tasks-modal"); - }, - m(target, anchor) { - insert(target, div9, anchor); - append(div9, form); - append(form, div0); - append(div0, label0); - append(div0, t3); - append(div0, input0); - set_input_value(input0, ctx[1].description); - ctx[19](input0); - append(form, t4); - append(form, div1); - append(div1, label1); - append(label1, t5); - append(div1, t6); - for (let i = 0; i < each_blocks_1.length; i += 1) { - each_blocks_1[i].m(div1, null); - } - append(form, t7); - append(form, div3); - append(div3, label2); - append(div3, t9); - append(div3, input1); - set_input_value(input1, ctx[1].recurrenceRule); - append(div3, t10); - append(div3, code0); - append(code0, t11); - append(code0, t12); - html_tag.m(ctx[7], code0); - append(div3, t13); - append(div3, label3); - append(div3, t15); - append(div3, input2); - set_input_value(input2, ctx[1].dueDate); - append(div3, t16); - append(div3, code1); - append(code1, t17); - append(code1, t18); - html_tag_1.m(ctx[6], code1); - append(div3, t19); - append(div3, label4); - append(div3, t21); - append(div3, input3); - set_input_value(input3, ctx[1].scheduledDate); - append(div3, t22); - append(div3, code2); - append(code2, t23); - append(code2, t24); - html_tag_2.m(ctx[5], code2); - append(div3, t25); - append(div3, label5); - append(div3, t29); - append(div3, input4); - set_input_value(input4, ctx[1].startDate); - append(div3, t30); - append(div3, code3); - append(code3, t31); - append(code3, t32); - html_tag_3.m(ctx[4], code3); - append(div3, t33); - append(div3, div2); - append(div2, label6); - append(div2, t37); - append(div2, input5); - input5.checked = ctx[1].forwardOnly; - append(form, t38); - append(form, div4); - append(div4, label7); - append(div4, t40); - append(div4, select); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(select, null); - } - select_option(select, ctx[1].status); - append(form, t41); - append(form, div7); - append(div7, div5); - append(div5, label8); - append(div5, t43); - append(div5, input6); - append(div7, t44); - append(div7, div6); - append(div6, span3); - append(div6, t46); - append(div6, code4); - code4.innerHTML = ctx[8]; - append(form, t47); - append(form, div8); - append(div8, button0); - append(div8, t49); - append(div8, button1); - if (!mounted) { - dispose = [ - listen(input0, "input", ctx[18]), - listen(div1, "keyup", ctx[11]), - listen(input1, "input", ctx[22]), - listen(input2, "input", ctx[23]), - listen(input3, "input", ctx[24]), - listen(input4, "input", ctx[25]), - listen(input5, "change", ctx[26]), - listen(select, "change", ctx[27]), - listen(button1, "click", ctx[12]), - listen(form, "submit", prevent_default(ctx[13])) - ]; - mounted = true; - } - }, - p(ctx2, dirty) { - if (dirty[0] & 512 && input0_accesskey_value !== (input0_accesskey_value = ctx2[9]("t"))) { - attr(input0, "accesskey", input0_accesskey_value); - } - if (dirty[0] & 3 && input0.value !== ctx2[1].description) { - set_input_value(input0, ctx2[1].description); - } - if (dirty[0] & 3 && label1_for_value !== (label1_for_value = "priority-" + ctx2[1].priority)) { - attr(label1, "for", label1_for_value); - } - if (dirty[0] & 1538) { - each_value_1 = ctx2[10]; - let i; - for (i = 0; i < each_value_1.length; i += 1) { - const child_ctx = get_each_context_1(ctx2, each_value_1, i); - if (each_blocks_1[i]) { - each_blocks_1[i].p(child_ctx, dirty); - } else { - each_blocks_1[i] = create_each_block_1(child_ctx); - each_blocks_1[i].c(); - each_blocks_1[i].m(div1, null); - } - } - for (; i < each_blocks_1.length; i += 1) { - each_blocks_1[i].d(1); - } - each_blocks_1.length = each_value_1.length; - } - if (dirty[0] & 512 && input1_accesskey_value !== (input1_accesskey_value = ctx2[9]("r"))) { - attr(input1, "accesskey", input1_accesskey_value); - } - if (dirty[0] & 3 && input1.value !== ctx2[1].recurrenceRule) { - set_input_value(input1, ctx2[1].recurrenceRule); - } - if (dirty[0] & 128) - html_tag.p(ctx2[7]); - if (dirty[0] & 512 && input2_accesskey_value !== (input2_accesskey_value = ctx2[9]("d"))) { - attr(input2, "accesskey", input2_accesskey_value); - } - if (dirty[0] & 3 && input2.value !== ctx2[1].dueDate) { - set_input_value(input2, ctx2[1].dueDate); - } - if (dirty[0] & 64) - html_tag_1.p(ctx2[6]); - if (dirty[0] & 512 && input3_accesskey_value !== (input3_accesskey_value = ctx2[9]("s"))) { - attr(input3, "accesskey", input3_accesskey_value); - } - if (dirty[0] & 3 && input3.value !== ctx2[1].scheduledDate) { - set_input_value(input3, ctx2[1].scheduledDate); - } - if (dirty[0] & 32) - html_tag_2.p(ctx2[5]); - if (dirty[0] & 512 && input4_accesskey_value !== (input4_accesskey_value = ctx2[9]("a"))) { - attr(input4, "accesskey", input4_accesskey_value); - } - if (dirty[0] & 3 && input4.value !== ctx2[1].startDate) { - set_input_value(input4, ctx2[1].startDate); - } - if (dirty[0] & 16) - html_tag_3.p(ctx2[4]); - if (dirty[0] & 512 && input5_accesskey_value !== (input5_accesskey_value = ctx2[9]("f"))) { - attr(input5, "accesskey", input5_accesskey_value); - } - if (dirty[0] & 3) { - input5.checked = ctx2[1].forwardOnly; - } - if (dirty[0] & 1) { - each_value = ctx2[0]; - let i; - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context(ctx2, each_value, i); - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(select, null); - } - } - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - each_blocks.length = each_value.length; - } - if (dirty[0] & 3) { - select_option(select, ctx2[1].status); - } - if (dirty[0] & 3 && input6_checked_value !== (input6_checked_value = ctx2[1].status.isCompleted())) { - input6.checked = input6_checked_value; - } - if (dirty[0] & 256) - code4.innerHTML = ctx2[8]; - ; - if (dirty[0] & 4) { - toggle_class(form, "with-accesskeys", ctx2[2]); - } - }, - i: noop, - o: noop, - d(detaching) { - if (detaching) - detach(div9); - ctx[19](null); - destroy_each(each_blocks_1, detaching); - destroy_each(each_blocks, detaching); - mounted = false; - run_all(dispose); - } - }; -} -var datePlaceholder = "Try 'Monday' or 'tomorrow', or [td|tm|yd|tw|nw|we] then space."; -function instance($$self, $$props, $$invalidate) { - let accesskey; - var _a, _b; - let { task } = $$props; - let { onSubmit } = $$props; - let { statusOptions } = $$props; - let descriptionInput; - let editableTask = { - description: "", - status: Status.TODO, - priority: "none", - recurrenceRule: "", - startDate: "", - scheduledDate: "", - dueDate: "", - doneDate: "", - forwardOnly: true - }; - let parsedStartDate = ""; - let parsedScheduledDate = ""; - let parsedDueDate = ""; - let parsedRecurrence = ""; - let parsedDone = ""; - let addGlobalFilterOnSave = false; - let withAccessKeys = true; - const priorityOptions = [ - { - value: "low", - label: "Low", - symbol: prioritySymbols.Low - }, - { - value: "none", - label: "Normal", - symbol: prioritySymbols.None - }, - { - value: "medium", - label: "Medium", - symbol: prioritySymbols.Medium - }, - { - value: "high", - label: "High", - symbol: prioritySymbols.High - } - ]; - function parseTypedDateForDisplay(fieldName, typedDate, forwardDate = void 0) { - if (!typedDate) { - return `no ${fieldName} date`; - } - const parsed = chrono.parseDate(typedDate, forwardDate, { forwardDate: forwardDate != void 0 }); - if (parsed !== null) { - return window.moment(parsed).format("YYYY-MM-DD"); - } - return `invalid ${fieldName} date`; - } - function parseTypedDateForDisplayUsingFutureDate(fieldName, typedDate) { - return parseTypedDateForDisplay(fieldName, typedDate, editableTask.forwardOnly ? new Date() : void 0); - } - function parseTypedDateForSaving(typedDate) { - let date = null; - const parsedDate = chrono.parseDate(typedDate, new Date(), { forwardDate: editableTask.forwardOnly }); - if (parsedDate !== null) { - date = window.moment(parsedDate); - } - return date; - } - onMount(() => { - const { globalFilter, provideAccessKeys } = getSettings(); - $$invalidate(2, withAccessKeys = provideAccessKeys); - const description = task.getDescriptionWithoutGlobalFilter(); - if (description != task.description || description.indexOf(globalFilter) == -1) - addGlobalFilterOnSave = true; - let priority = "none"; - if (task.priority === "4" /* Low */) { - priority = "low"; - } else if (task.priority === "2" /* Medium */) { - priority = "medium"; - } else if (task.priority === "1" /* High */) { - priority = "high"; - } - $$invalidate(1, editableTask = { - description, - status: task.status, - priority, - recurrenceRule: task.recurrence ? task.recurrence.toText() : "", - startDate: task.startDate ? task.startDate.format("YYYY-MM-DD") : "", - scheduledDate: task.scheduledDate ? task.scheduledDate.format("YYYY-MM-DD") : "", - dueDate: task.dueDate ? task.dueDate.format("YYYY-MM-DD") : "", - doneDate: task.doneDate ? task.doneDate.format("YYYY-MM-DD") : "", - forwardOnly: true - }); - setTimeout( - () => { - descriptionInput.focus(); - }, - 10 - ); - }); - const _onPriorityKeyup = (event) => { - if (event.key && !event.altKey && !event.ctrlKey) { - const priorityOption = priorityOptions.find((option) => option.label.charAt(0).toLowerCase() == event.key); - if (priorityOption) { - $$invalidate(1, editableTask.priority = priorityOption.value, editableTask); - } - } - }; - const _onClose = () => { - onSubmit([]); - }; - const _onSubmit = () => { - const { globalFilter } = getSettings(); - let description = editableTask.description.trim(); - if (addGlobalFilterOnSave) { - description = globalFilter + " " + description; - } - const startDate = parseTypedDateForSaving(editableTask.startDate); - const scheduledDate = parseTypedDateForSaving(editableTask.scheduledDate); - const dueDate = parseTypedDateForSaving(editableTask.dueDate); - let recurrence = null; - if (editableTask.recurrenceRule) { - recurrence = Recurrence.fromText({ - recurrenceRuleText: editableTask.recurrenceRule, - startDate, - scheduledDate, - dueDate - }); - } - let parsedPriority; - switch (editableTask.priority) { - case "low": - parsedPriority = "4" /* Low */; - break; - case "medium": - parsedPriority = "2" /* Medium */; - break; - case "high": - parsedPriority = "1" /* High */; - break; - default: - parsedPriority = "3" /* None */; - } - const updatedTask = new Task(Object.assign(Object.assign({}, task), { - description, - status: editableTask.status, - priority: parsedPriority, - recurrence, - startDate, - scheduledDate, - dueDate, - doneDate: window.moment(editableTask.doneDate, "YYYY-MM-DD").isValid() ? window.moment(editableTask.doneDate, "YYYY-MM-DD") : null - })); - onSubmit([updatedTask]); - }; - const $$binding_groups = [[]]; - function input0_input_handler() { - editableTask.description = this.value; - $$invalidate(1, editableTask); - $$invalidate(0, statusOptions); - } - function input0_binding($$value) { - binding_callbacks[$$value ? "unshift" : "push"](() => { - descriptionInput = $$value; - $$invalidate(3, descriptionInput); - }); - } - function input_change_handler() { - editableTask.priority = this.__value; - $$invalidate(1, editableTask); - $$invalidate(0, statusOptions); - } - function input1_input_handler() { - editableTask.recurrenceRule = this.value; - $$invalidate(1, editableTask); - $$invalidate(0, statusOptions); - } - function input2_input_handler() { - editableTask.dueDate = this.value; - $$invalidate(1, editableTask); - $$invalidate(0, statusOptions); - } - function input3_input_handler() { - editableTask.scheduledDate = this.value; - $$invalidate(1, editableTask); - $$invalidate(0, statusOptions); - } - function input4_input_handler() { - editableTask.startDate = this.value; - $$invalidate(1, editableTask); - $$invalidate(0, statusOptions); - } - function input5_change_handler() { - editableTask.forwardOnly = this.checked; - $$invalidate(1, editableTask); - $$invalidate(0, statusOptions); - } - function select_change_handler() { - editableTask.status = select_value(this); - $$invalidate(1, editableTask); - $$invalidate(0, statusOptions); - } - $$self.$$set = ($$props2) => { - if ("task" in $$props2) - $$invalidate(14, task = $$props2.task); - if ("onSubmit" in $$props2) - $$invalidate(15, onSubmit = $$props2.onSubmit); - if ("statusOptions" in $$props2) - $$invalidate(0, statusOptions = $$props2.statusOptions); - }; - $$self.$$.update = () => { - if ($$self.$$.dirty[0] & 4) { - $: - $$invalidate(9, accesskey = (key) => withAccessKeys ? key : null); - } - if ($$self.$$.dirty[0] & 2) { - $: { - $$invalidate(1, editableTask.startDate = doAutocomplete(editableTask.startDate), editableTask); - $$invalidate(4, parsedStartDate = parseTypedDateForDisplayUsingFutureDate("start", editableTask.startDate)); - } - } - if ($$self.$$.dirty[0] & 2) { - $: { - $$invalidate(1, editableTask.scheduledDate = doAutocomplete(editableTask.scheduledDate), editableTask); - $$invalidate(5, parsedScheduledDate = parseTypedDateForDisplayUsingFutureDate("scheduled", editableTask.scheduledDate)); - } - } - if ($$self.$$.dirty[0] & 2) { - $: { - $$invalidate(1, editableTask.dueDate = doAutocomplete(editableTask.dueDate), editableTask); - $$invalidate(6, parsedDueDate = parseTypedDateForDisplayUsingFutureDate("due", editableTask.dueDate)); - } - } - if ($$self.$$.dirty[0] & 196610) { - $: { - if (!editableTask.recurrenceRule) { - $$invalidate(7, parsedRecurrence = "not recurring"); - } else { - $$invalidate(7, parsedRecurrence = $$invalidate(17, _b = $$invalidate(16, _a = Recurrence.fromText({ - recurrenceRuleText: editableTask.recurrenceRule, - startDate: null, - scheduledDate: null, - dueDate: null - })) === null || _a === void 0 ? void 0 : _a.toText()) !== null && _b !== void 0 ? _b : "invalid recurrence rule"); - } - } - } - if ($$self.$$.dirty[0] & 2) { - $: { - $$invalidate(8, parsedDone = parseTypedDateForDisplay("done", editableTask.doneDate)); - } - } - }; - return [ - statusOptions, - editableTask, - withAccessKeys, - descriptionInput, - parsedStartDate, - parsedScheduledDate, - parsedDueDate, - parsedRecurrence, - parsedDone, - accesskey, - priorityOptions, - _onPriorityKeyup, - _onClose, - _onSubmit, - task, - onSubmit, - _a, - _b, - input0_input_handler, - input0_binding, - input_change_handler, - $$binding_groups, - input1_input_handler, - input2_input_handler, - input3_input_handler, - input4_input_handler, - input5_change_handler, - select_change_handler - ]; -} -var EditTask = class extends SvelteComponent { - constructor(options) { - super(); - init(this, options, instance, create_fragment, safe_not_equal, { task: 14, onSubmit: 15, statusOptions: 0 }, null, [-1, -1]); - } -}; -var EditTask_default = EditTask; - -// src/TaskModal.ts -var TaskModal = class extends import_obsidian4.Modal { - constructor({ app, task, onSubmit }) { - super(app); - this.task = task; - this.onSubmit = (updatedTasks) => { - updatedTasks.length && onSubmit(updatedTasks); - this.close(); - }; - } - onOpen() { - this.titleEl.setText("Create or edit Task"); - const { contentEl } = this; - const statusOptions = this.getKnownStatusesAndCurrentTaskStatusIfNotKnown(); - new EditTask_default({ - target: contentEl, - props: { task: this.task, statusOptions, onSubmit: this.onSubmit } - }); - } - getKnownStatusesAndCurrentTaskStatusIfNotKnown() { - const statusOptions = StatusRegistry.getInstance().registeredStatuses; - if (StatusRegistry.getInstance().bySymbol(this.task.status.symbol) === Status.EMPTY) { - statusOptions.push(this.task.status); - } - return statusOptions; - } - onClose() { - const { contentEl } = this; - contentEl.empty(); - } -}; - -// src/Commands/CreateOrEditTaskParser.ts -var taskFromLine = ({ line, path }) => { - var _a, _b; - const fallbackDate = DateFallback.fromPath(path); - const task = Task.fromLine({ - line, - path, - sectionStart: 0, - sectionIndex: 0, - precedingHeader: null, - fallbackDate - }); - if (task !== null) { - return task; - } - const nonTaskMatch = line.match(TaskRegularExpressions.nonTaskRegex); - if (nonTaskMatch === null) { - console.error("Tasks: Cannot create task on line:", line); - return new Task({ - status: Status.TODO, - description: "", - path, - indentation: "", - listMarker: "-", - priority: "3" /* None */, - startDate: null, - scheduledDate: null, - dueDate: null, - doneDate: null, - recurrence: null, - sectionStart: 0, - sectionIndex: 0, - precedingHeader: null, - blockLink: "", - tags: [], - originalMarkdown: "", - scheduledDateIsInferred: false - }); - } - const indentation = nonTaskMatch[1]; - const listMarker = (_a = nonTaskMatch[2]) != null ? _a : "-"; - const statusString = (_b = nonTaskMatch[4]) != null ? _b : " "; - const status = StatusRegistry.getInstance().bySymbolOrCreate(statusString); - let description = nonTaskMatch[5]; - const blockLinkMatch = line.match(TaskRegularExpressions.blockLinkRegex); - const blockLink = blockLinkMatch !== null ? blockLinkMatch[0] : ""; - if (blockLink !== "") { - description = description.replace(TaskRegularExpressions.blockLinkRegex, ""); - } - return new Task({ - status, - description, - path, - indentation, - listMarker, - blockLink, - priority: "3" /* None */, - startDate: null, - scheduledDate: null, - dueDate: null, - doneDate: null, - recurrence: null, - sectionStart: 0, - sectionIndex: 0, - precedingHeader: null, - tags: [], - originalMarkdown: "", - scheduledDateIsInferred: false - }); -}; - -// src/Commands/CreateOrEdit.ts -var createOrEdit = (checking, editor, view, app) => { - var _a; - if (checking) { - return view instanceof import_obsidian5.MarkdownView; - } - if (!(view instanceof import_obsidian5.MarkdownView)) { - return; - } - const path = (_a = view.file) == null ? void 0 : _a.path; - if (path === void 0) { - return; - } - const cursorPosition = editor.getCursor(); - const lineNumber = cursorPosition.line; - const line = editor.getLine(lineNumber); - const task = taskFromLine({ line, path }); - const onSubmit = (updatedTasks) => { - const serialized = DateFallback.removeInferredStatusIfNeeded(task, updatedTasks).map((task2) => task2.toFileLineString()).join("\n"); - editor.setLine(lineNumber, serialized); - }; - const taskModal = new TaskModal({ - app, - task, - onSubmit - }); - taskModal.open(); -}; - -// src/Commands/ToggleDone.ts -var import_obsidian6 = require("obsidian"); -var toggleDone = (checking, editor, view) => { - var _a; - if (checking) { - if (!(view instanceof import_obsidian6.MarkdownView)) { - return false; - } - return true; - } - if (!(view instanceof import_obsidian6.MarkdownView)) { - return; - } - const path = (_a = view.file) == null ? void 0 : _a.path; - if (path === void 0) { - return; - } - const origCursorPos = editor.getCursor(); - const lineNumber = origCursorPos.line; - const line = editor.getLine(lineNumber); - const toggledLine = toggleLine(line, path); - editor.setLine(lineNumber, toggledLine); - editor.setCursor({ - line: origCursorPos.line, - ch: calculateCursorOffset(origCursorPos.ch, line, toggledLine) - }); -}; -var toggleLine = (line, path) => { - let toggledLine = line; - const task = Task.fromLine({ - line, - path, - sectionStart: 0, - sectionIndex: 0, - precedingHeader: null, - fallbackDate: null - }); - if (task !== null) { - toggledLine = toggleTask(task); - } else { - const regexMatch = line.match(TaskRegularExpressions.taskRegex); - if (regexMatch !== null) { - const statusString = regexMatch[3]; - const status = StatusRegistry.getInstance().bySymbol(statusString); - const newStatusString = status.nextStatusSymbol; - toggledLine = line.replace(TaskRegularExpressions.taskRegex, `$1- [${newStatusString}] $4`); - } else if (TaskRegularExpressions.listItemRegex.test(line)) { - toggledLine = line.replace(TaskRegularExpressions.listItemRegex, "$1$2 [ ]"); - } else { - toggledLine = line.replace(TaskRegularExpressions.indentationRegex, "$1- "); - } - } - return toggledLine; -}; -var toggleTask = (task) => { - const toggledTasks = task.toggle(); - return toggledTasks.map((task2) => task2.toFileLineString()).join("\n"); -}; -var calculateCursorOffset = (origCursorCh, line, toggledLine) => { - let newLineLen = toggledLine.length; - if (newLineLen <= line.length) { - return origCursorCh >= toggledLine.length ? newLineLen : origCursorCh; - } - const doneDateLength = " \u2705 YYYY-MM-DD".length; - if (toggledLine.match(TaskRegularExpressions.doneDateRegex) && newLineLen - line.length >= doneDateLength) { - newLineLen -= doneDateLength; - } - if (newLineLen >= 2 * line.length && toggledLine.search(".+\n.+") !== -1) { - return origCursorCh + newLineLen - line.length; - } - const firstListItemChar = toggledLine.search(/[-*]/); - if (origCursorCh < firstListItemChar) { - return origCursorCh; - } - return origCursorCh + newLineLen - line.length; -}; - -// src/Commands/index.ts -var Commands = class { - get app() { - return this.plugin.app; - } - constructor({ plugin }) { - this.plugin = plugin; - plugin.addCommand({ - id: "edit-task", - name: "Create or edit task", - icon: "pencil", - editorCheckCallback: (checking, editor, view) => { - return createOrEdit(checking, editor, view, this.app); - } - }); - plugin.addCommand({ - id: "toggle-done", - name: "Toggle task done", - icon: "check-in-circle", - editorCheckCallback: toggleDone - }); - } -}; - -// src/TasksEvents.ts -var TasksEvents = class { - constructor({ obsidianEvents }) { - this.obsidianEvents = obsidianEvents; - } - onCacheUpdate(handler) { - return this.obsidianEvents.on("obsidian-tasks-plugin:cache-update" /* CacheUpdate */, handler); - } - triggerCacheUpdate(cacheData) { - this.obsidianEvents.trigger("obsidian-tasks-plugin:cache-update" /* CacheUpdate */, cacheData); - } - onRequestCacheUpdate(handler) { - return this.obsidianEvents.on("obsidian-tasks-plugin:request-cache-update" /* RequestCacheUpdate */, handler); - } - triggerRequestCacheUpdate(fn) { - this.obsidianEvents.trigger("obsidian-tasks-plugin:request-cache-update" /* RequestCacheUpdate */, fn); - } - off(eventRef) { - this.obsidianEvents.offref(eventRef); - } -}; - -// src/InlineRenderer.ts -var InlineRenderer = class { - constructor({ plugin }) { - this.markdownPostProcessor = this._markdownPostProcessor.bind(this); - plugin.registerMarkdownPostProcessor(this._markdownPostProcessor.bind(this)); - } - _markdownPostProcessor(element2, context) { - return __async(this, null, function* () { - var _a; - const { globalFilter } = getSettings(); - const renderedElements = element2.findAll(".task-list-item").filter((taskItem) => { - var _a2; - const linesText = (_a2 = taskItem.textContent) == null ? void 0 : _a2.split("\n"); - if (linesText === void 0) { - return false; - } - let firstLineText = null; - for (let i = 0; i < linesText.length; i = i + 1) { - if (linesText[i] !== "") { - firstLineText = linesText[i]; - break; - } - } - if (firstLineText === null) { - return false; - } - return firstLineText.includes(globalFilter); - }); - if (renderedElements.length === 0) { - return; - } - const path = context.sourcePath; - const section = context.getSectionInfo(element2); - if (section === null) { - return; - } - const fileLines = section.text.split("\n"); - let sectionIndex = 0; - const fileTasks = []; - for (let lineNumber = section.lineStart; lineNumber <= section.lineEnd; lineNumber++) { - const line = fileLines[lineNumber]; - if (line === void 0) { - continue; - } - const task = Task.fromLine({ - line, - path, - sectionStart: section.lineStart, - sectionIndex, - precedingHeader: null, - fallbackDate: null - }); - if (task !== null) { - fileTasks.push(task); - sectionIndex++; - } - } - for (let sectionIndex2 = 0; sectionIndex2 < renderedElements.length; sectionIndex2++) { - const task = fileTasks[sectionIndex2]; - const renderedElement = renderedElements[sectionIndex2]; - if (task === void 0 || renderedElement === void 0) { - continue; - } - const dataLine = (_a = renderedElement.getAttr("data-line")) != null ? _a : "0"; - const listIndex = Number.parseInt(dataLine, 10); - const taskElement = yield task.toLi({ - parentUlElement: element2, - listIndex - }); - const renderedChildren = renderedElement.childNodes; - for (let i = 0; i < renderedChildren.length; i = i + 1) { - const renderedChild = renderedChildren[i]; - if (renderedChild.nodeName.toLowerCase() === "div") { - taskElement.prepend(renderedChild); - } else if (renderedChild.nodeName.toLowerCase() === "ul") { - taskElement.append(renderedChild); - } - } - const originalFootnotes = renderedElement.querySelectorAll("[data-footnote-id]"); - const newFootnotes = taskElement.querySelectorAll("[data-footnote-id]"); - if (originalFootnotes.length === newFootnotes.length) { - for (let i = 0; i < originalFootnotes.length; i++) { - newFootnotes[i].replaceWith(originalFootnotes[i]); - } - } - renderedElement.replaceWith(taskElement); - } - }); - } -}; - -// src/LivePreviewExtension.ts -var import_view = require("@codemirror/view"); -var import_obsidian7 = require("obsidian"); -var newLivePreviewExtension = () => { - return import_view.ViewPlugin.fromClass(LivePreviewExtension); -}; -var LivePreviewExtension = class { - constructor(view) { - this.view = view; - this.handleClickEvent = this.handleClickEvent.bind(this); - this.view.dom.addEventListener("click", this.handleClickEvent); - } - destroy() { - this.view.dom.removeEventListener("click", this.handleClickEvent); - } - handleClickEvent(event) { - const { target } = event; - if (!target || !(target instanceof HTMLInputElement) || target.type !== "checkbox") { - return false; - } - const ancestor = target.closest("ul.plugin-tasks-query-result, div.callout-content"); - if (ancestor) { - if (ancestor.matches("div.callout-content")) { - const msg = 'obsidian-tasks-plugin warning: Tasks cannot add or remove completion dates or make the next copy of a recurring task for tasks written inside a callout when you click their checkboxes in Live Preview. \nIf you wanted Tasks to do these things, please undo your change, then either click the line of the task and use the "Toggle Task Done" command, or switch to Reading View to click the checkbox.'; - console.warn(msg); - new import_obsidian7.Notice(msg, 45e3); - } - return false; - } - const { state } = this.view; - const position = this.view.posAtDOM(target); - const line = state.doc.lineAt(position); - const task = Task.fromLine({ - line: line.text, - path: "", - sectionStart: 0, - sectionIndex: 0, - precedingHeader: null, - fallbackDate: null - }); - console.debug(`Live Preview Extension: toggle called. Position: ${position} Line: ${line.text}`); - if (task === null) { - return false; - } - event.preventDefault(); - const toggled = task.toggle(); - const toggledString = toggled.map((t) => t.toFileLineString()).join(state.lineBreak); - const transaction = state.update({ - changes: { - from: line.from, - to: line.to, - insert: toggledString - } - }); - this.view.dispatch(transaction); - const desiredCheckedStatus = target.checked; - setTimeout(() => { - target.checked = desiredCheckedStatus; - }, 1); - return true; - } -}; - -// src/QueryRenderer.ts -var import_obsidian8 = require("obsidian"); - -// src/Query/Sorter.ts -var Sorter = class { - constructor(property, comparator, reverse) { - this.property = property; - this.comparator = Sorter.maybeReverse(reverse, comparator); - } - static maybeReverse(reverse, comparator) { - return reverse ? Sorter.makeReversedComparator(comparator) : comparator; - } - static makeReversedComparator(comparator) { - return (a, b) => comparator(a, b) * -1; - } -}; - -// src/Query/Grouper.ts -var Grouper = class { - constructor(property, grouper) { - this.property = property; - this.grouper = grouper; - } -}; - -// src/Query/Filter/Field.ts -var Field = class { - canCreateFilterForLine(line) { - return Field.lineMatchesFilter(this.filterRegExp(), line); - } - static lineMatchesFilter(filter, line) { - if (filter) { - return filter.test(line); - } else { - return false; - } - } - static getMatch(filterRegExp, line) { - if (filterRegExp) { - return line.match(filterRegExp); - } else { - return null; - } - } - fieldNameSingular() { - return this.fieldName(); - } - fieldNameSingularEscaped() { - return escapeRegExp(this.fieldNameSingular()); - } - supportsSorting() { - return false; - } - parseSortLine(line) { - if (!this.supportsSorting()) { - return null; - } - if (!this.canCreateSorterForLine(line)) { - return null; - } - return this.createSorterFromLine(line); - } - canCreateSorterForLine(line) { - if (!this.supportsSorting()) { - return false; - } - return Field.lineMatchesFilter(this.sorterRegExp(), line); - } - createSorterFromLine(line) { - if (!this.supportsSorting()) { - return null; - } - const match = Field.getMatch(this.sorterRegExp(), line); - if (match === null) { - return null; - } - const reverse = !!match[1]; - return this.createSorter(reverse); - } - sorterRegExp() { - if (!this.supportsSorting()) { - throw Error(`sorterRegExp() unimplemented for ${this.fieldNameSingular()}`); - } - return new RegExp(`^sort by ${this.fieldNameSingularEscaped()}( reverse)?`); - } - comparator() { - throw Error(`comparator() unimplemented for ${this.fieldNameSingular()}`); - } - createSorter(reverse) { - return new Sorter(this.fieldNameSingular(), this.comparator(), reverse); - } - createNormalSorter() { - return this.createSorter(false); - } - createReverseSorter() { - return this.createSorter(true); - } - supportsGrouping() { - return false; - } - grouper() { - throw Error(`grouper() unimplemented for ${this.fieldNameSingular()}`); - } - createGrouper() { - return new Grouper(this.fieldNameSingular(), this.grouper()); - } -}; - -// src/Query/Explain/Explanation.ts -var Explanation = class { - constructor(description, children2 = [], symbol = "") { - this.description = description; - this.symbol = symbol; - this.children = children2; - } - static booleanAnd(children2) { - return this.combineOrCreateExplanation("All of", children2, "AND"); - } - static booleanOr(children2) { - return this.combineOrCreateExplanation("At least one of", children2, "OR"); - } - static booleanNot(children2) { - return new Explanation("None of", children2, "NOT"); - } - static booleanXor(children2) { - return new Explanation("Exactly one of", children2, "XOR"); - } - asString(currentIndentation = "") { - if (this.children.length == 0) { - return currentIndentation + this.description; - } - let result = currentIndentation + `${this.symbol}`; - if (this.children.length > 1) { - result += ` (${this.description})`; - } - result += ":"; - const newIndentation = currentIndentation + " "; - for (let i = 0; i < this.children.length; i++) { - result += ` -${this.children[i].asString(newIndentation)}`; - } - return result; - } - static combineOrCreateExplanation(description, children2, symbol) { - if (children2.length === 2) { - const child0 = children2[0]; - const child1 = children2[1]; - if (child0.symbol === symbol && child1.symbol === "") { - child0.children.push(child1); - return child0; - } - } - return new Explanation(description, children2, symbol); - } -}; - -// src/Query/Filter/Filter.ts -var Filter = class { - constructor(instruction, filterFunction, explanation) { - this.instruction = instruction; - this.explanation = explanation; - this.filterFunction = filterFunction; - } - explainFilterIndented(indent) { - const explanation = this.explanation; - const unindentedExplanation = explanation.asString(); - if (unindentedExplanation === this.instruction) { - return `${indent}${this.instruction} -`; - } else { - return `${indent}${this.instruction} => -${explanation.asString(" ")} -`; - } - } -}; -var FilterOrErrorMessage = class { - constructor(instruction) { - this.instruction = instruction; - } - get filter() { - return this._filter; - } - set filter(value) { - this._filter = value; - } - get filterFunction() { - if (this._filter) { - return this._filter.filterFunction; - } else { - return void 0; - } - } - static fromFilter(filter) { - const result = new FilterOrErrorMessage(filter.instruction); - result.filter = filter; - return result; - } - static fromError(instruction, errorMessage) { - const result = new FilterOrErrorMessage(instruction); - result.error = errorMessage; - return result; - } -}; - -// src/Query/Filter/FilterInstruction.ts -var FilterInstruction = class { - constructor(instruction, filter) { - this._instruction = instruction; - this._filter = filter; - } - canCreateFilterForLine(line) { - return line == this._instruction; - } - createFilterOrErrorMessage(line) { - const result = new FilterOrErrorMessage(line); - if (line === this._instruction) { - result.filter = new Filter(line, this._filter, new Explanation(line)); - return result; - } - result.error = `do not understand filter: ${line}`; - return result; - } -}; - -// src/Query/Filter/FilterInstructions.ts -var FilterInstructions = class { - constructor() { - this._filters = []; - } - add(instruction, filter) { - this._filters.push(new FilterInstruction(instruction, filter)); - } - canCreateFilterForLine(line) { - for (const filter of this._filters) { - if (filter.canCreateFilterForLine(line)) { - return true; - } - } - return false; - } - createFilterOrErrorMessage(line) { - for (const filter of this._filters) { - const x = filter.createFilterOrErrorMessage(line); - if (x.error === void 0) { - return x; - } - } - const result = new FilterOrErrorMessage(line); - result.error = `do not understand filter: ${line}`; - return result; - } -}; - -// src/Query/Filter/FilterInstructionsBasedField.ts -var FilterInstructionsBasedField = class extends Field { - constructor() { - super(...arguments); - this._filters = new FilterInstructions(); - } - canCreateFilterForLine(line) { - return this._filters.canCreateFilterForLine(line); - } - createFilterOrErrorMessage(line) { - return this._filters.createFilterOrErrorMessage(line); - } - filterRegExp() { - return null; - } -}; - -// src/Query/Filter/StatusField.ts -var StatusField = class extends FilterInstructionsBasedField { - constructor() { - super(); - this._filters.add( - "done", - (task) => task.status.type === "DONE" /* DONE */ || task.status.type === "CANCELLED" /* CANCELLED */ || task.status.type === "NON_TASK" /* NON_TASK */ - ); - this._filters.add( - "not done", - (task) => task.status.type === "TODO" /* TODO */ || task.status.type === "IN_PROGRESS" /* IN_PROGRESS */ - ); - } - fieldName() { - return "status"; - } - supportsSorting() { - return true; - } - comparator() { - return (a, b) => { - const oldStatusNameA = StatusField.oldStatusName(a); - const oldStatusNameB = StatusField.oldStatusName(b); - if (oldStatusNameA < oldStatusNameB) { - return 1; - } else if (oldStatusNameA > oldStatusNameB) { - return -1; - } else { - return 0; - } - }; - } - static oldStatusName(a) { - if (a.status.symbol === " ") { - return "Todo"; - } else { - return "Done"; - } - } -}; - -// src/Query/DateParser.ts -var chrono2 = __toESM(require_dist()); -var DateParser = class { - static parseDate(input, forwardDate = false) { - return window.moment( - chrono2.parseDate(input, void 0, { - forwardDate - }) - ).startOf("day"); - } -}; - -// src/Query/Filter/DateField.ts -var DateField = class extends Field { - constructor() { - super(); - this.filterInstructions = new FilterInstructions(); - this.filterInstructions.add(`has ${this.fieldName()} date`, (task) => this.date(task) !== null); - this.filterInstructions.add(`no ${this.fieldName()} date`, (task) => this.date(task) === null); - this.filterInstructions.add(`${this.fieldName()} date is invalid`, (task) => { - const date = this.date(task); - return date !== null && !date.isValid(); - }); - } - canCreateFilterForLine(line) { - if (this.filterInstructions.canCreateFilterForLine(line)) { - return true; - } - return super.canCreateFilterForLine(line); - } - createFilterOrErrorMessage(line) { - const filterResult = this.filterInstructions.createFilterOrErrorMessage(line); - if (filterResult.filter !== void 0) { - return filterResult; - } - const result = new FilterOrErrorMessage(line); - const match = Field.getMatch(this.filterRegExp(), line); - let filterFunction; - if (match !== null) { - const filterDate = DateParser.parseDate(match[2]); - if (!filterDate.isValid()) { - result.error = "do not understand " + this.fieldName() + " date"; - } else { - let relative; - if (match[1] === "before") { - filterFunction = (task) => { - const date = this.date(task); - return date ? date.isBefore(filterDate) : this.filterResultIfFieldMissing(); - }; - relative = " " + match[1]; - } else if (match[1] === "after") { - filterFunction = (task) => { - const date = this.date(task); - return date ? date.isAfter(filterDate) : this.filterResultIfFieldMissing(); - }; - relative = " " + match[1]; - } else { - filterFunction = (task) => { - const date = this.date(task); - return date ? date.isSame(filterDate) : this.filterResultIfFieldMissing(); - }; - relative = " on"; - } - const explanation = DateField.getExplanationString( - this.fieldName(), - relative, - this.filterResultIfFieldMissing(), - filterDate - ); - result.filter = new Filter(line, filterFunction, new Explanation(explanation)); - } - } else { - result.error = "do not understand query filter (" + this.fieldName() + " date)"; - } - return result; - } - static getExplanationString(fieldName, relationshipPrefixedWithSpace, filterResultIfFieldMissing, filterDate) { - const actualDate = filterDate.format("YYYY-MM-DD (dddd Do MMMM YYYY)"); - let result = `${fieldName} date is${relationshipPrefixedWithSpace} ${actualDate}`; - if (filterResultIfFieldMissing) { - result += ` OR no ${fieldName} date`; - } - return result; - } - supportsSorting() { - return true; - } - comparator() { - return (a, b) => { - return compareByDate(this.date(a), this.date(b)); - }; - } -}; - -// src/Query/Filter/DueDateField.ts -var _DueDateField = class extends DateField { - filterRegExp() { - return _DueDateField.dueRegexp; - } - fieldName() { - return "due"; - } - date(task) { - return task.dueDate; - } - filterResultIfFieldMissing() { - return false; - } -}; -var DueDateField = _DueDateField; -DueDateField.dueRegexp = /^due (before|after|on)? ?(.*)/; - -// src/Query/Filter/PriorityField.ts -var _PriorityField = class extends Field { - createFilterOrErrorMessage(line) { - const result = new FilterOrErrorMessage(line); - const priorityMatch = Field.getMatch(this.filterRegExp(), line); - if (priorityMatch !== null) { - const filterPriorityString = priorityMatch[5]; - let filterPriority = null; - switch (filterPriorityString) { - case "low": - filterPriority = "4" /* Low */; - break; - case "none": - filterPriority = "3" /* None */; - break; - case "medium": - filterPriority = "2" /* Medium */; - break; - case "high": - filterPriority = "1" /* High */; - break; - } - if (filterPriority === null) { - result.error = "do not understand priority"; - return result; - } - let explanation = line; - let filter; - switch (priorityMatch[3]) { - case "above": - filter = (task) => task.priority.localeCompare(filterPriority) < 0; - break; - case "below": - filter = (task) => task.priority.localeCompare(filterPriority) > 0; - break; - case "not": - filter = (task) => task.priority !== filterPriority; - break; - default: - filter = (task) => task.priority === filterPriority; - explanation = `${this.fieldName()} is ${filterPriorityString}`; - } - result.filter = new Filter(line, filter, new Explanation(explanation)); - } else { - result.error = "do not understand query filter (priority)"; - } - return result; - } - fieldName() { - return "priority"; - } - filterRegExp() { - return _PriorityField.priorityRegexp; - } - supportsSorting() { - return true; - } - comparator() { - return (a, b) => { - return a.priority.localeCompare(b.priority); - }; - } -}; -var PriorityField = _PriorityField; -PriorityField.priorityRegexp = /^priority(\s+is)?(\s+(above|below|not))?(\s+(low|none|medium|high))$/; - -// src/Query/Matchers/IStringMatcher.ts -var IStringMatcher = class { - matchesAnyOf(stringsToSearch) { - return stringsToSearch.some((s) => this.matches(s)); - } -}; - -// src/Query/Matchers/SubstringMatcher.ts -var SubstringMatcher = class extends IStringMatcher { - constructor(stringToFind) { - super(); - this.stringToFind = stringToFind; - } - matches(stringToSearch) { - return SubstringMatcher.stringIncludesCaseInsensitive(stringToSearch, this.stringToFind); - } - static stringIncludesCaseInsensitive(haystack, needle) { - return haystack.toLocaleLowerCase().includes(needle.toLocaleLowerCase()); - } -}; - -// src/Query/Matchers/RegexMatcher.ts -var RegexMatcher = class extends IStringMatcher { - constructor(regex) { - super(); - this.regex = regex; - } - static validateAndConstruct(regexInput) { - const regexPattern = /\/((?![*+?])(?:[^\r\n[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*])+)\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/; - const query = regexInput.match(regexPattern); - if (query !== null) { - const regExp = new RegExp(query[1], query[2]); - return new RegexMatcher(regExp); - } else { - return null; - } - } - matches(stringToSearch) { - return stringToSearch.match(this.regex) !== null; - } -}; - -// src/Query/Filter/TextField.ts -var TextField = class extends Field { - createFilterOrErrorMessage(line) { - const match = Field.getMatch(this.filterRegExp(), line); - if (match === null) { - return FilterOrErrorMessage.fromError(line, `do not understand query filter (${this.fieldName()})`); - } - const [_, filterOperator, filterValue] = match; - let matcher = null; - if (filterOperator.includes("include")) { - matcher = new SubstringMatcher(filterValue); - } else if (filterOperator.includes("regex")) { - matcher = RegexMatcher.validateAndConstruct(filterValue); - if (matcher === null) { - return FilterOrErrorMessage.fromError( - line, - `cannot parse regex (${this.fieldName()}); check your leading and trailing slashes for your query` - ); - } - } - if (matcher === null) { - return FilterOrErrorMessage.fromError(line, `do not understand query filter (${this.fieldName()})`); - } - const negate = filterOperator.match(/not/) !== null; - const filter = new Filter(line, this.getFilter(matcher, negate), new Explanation(line)); - return FilterOrErrorMessage.fromFilter(filter); - } - fieldPattern() { - return this.fieldNameSingularEscaped(); - } - filterOperatorPattern() { - return "includes|does not include|regex matches|regex does not match"; - } - filterRegExp() { - return new RegExp(`^(?:${this.fieldPattern()}) (${this.filterOperatorPattern()}) (.*)`); - } - getFilter(matcher, negate) { - return (task) => { - const match = matcher.matches(this.value(task)); - return negate ? !match : match; - }; - } - comparator() { - return (a, b) => { - return this.value(a).localeCompare(this.value(b), void 0, { numeric: true }); - }; - } - grouper() { - return (task) => { - return [this.value(task)]; - }; - } -}; - -// src/Query/Filter/PathField.ts -var PathField = class extends TextField { - fieldName() { - return "path"; - } - value(task) { - return task.path; - } - supportsSorting() { - return true; - } -}; - -// src/Query/Filter/UrgencyField.ts -var UrgencyField = class extends Field { - canCreateFilterForLine(_line) { - return false; - } - createFilterOrErrorMessage(line) { - return FilterOrErrorMessage.fromError(line, "Filtering by urgency is not yet supported"); - } - fieldName() { - return "urgency"; - } - filterRegExp() { - throw Error(`filterRegExp() unimplemented for ${this.fieldName()}`); - } - supportsSorting() { - return true; - } - comparator() { - return (a, b) => { - return b.urgency - a.urgency; - }; - } -}; - -// src/Query/Sort.ts -var Sort = class { - static by(sorters, tasks) { - const defaultComparators = [ - new UrgencyField().comparator(), - new StatusField().comparator(), - new DueDateField().comparator(), - new PriorityField().comparator(), - new PathField().comparator() - ]; - const userComparators = []; - for (const sorter of sorters) { - userComparators.push(sorter.comparator); - } - return tasks.sort(Sort.makeCompositeComparator([...userComparators, ...defaultComparators])); - } - static makeCompositeComparator(comparators) { - return (a, b) => { - for (const comparator of comparators) { - const result = comparator(a, b); - if (result !== 0) { - return result; - } - } - return 0; - }; - } -}; - -// src/Query/Filter/DescriptionField.ts -var DescriptionField = class extends TextField { - fieldName() { - return "description"; - } - value(task) { - const globalFilter = getSettings().globalFilter; - return task.description.replace(globalFilter, "").trim(); - } - supportsSorting() { - return true; - } - comparator() { - return (a, b) => { - const descriptionA = DescriptionField.cleanDescription(a.description); - const descriptionB = DescriptionField.cleanDescription(b.description); - return descriptionA.localeCompare(descriptionB, void 0, { numeric: true }); - }; - } - static cleanDescription(description) { - const globalFilter = getSettings().globalFilter; - description = description.replace(globalFilter, "").trim(); - const startsWithLinkRegex = /^\[\[?([^\]]*)]]?/; - const linkRegexMatch = description.match(startsWithLinkRegex); - if (linkRegexMatch !== null) { - const innerLinkText = linkRegexMatch[1]; - description = innerLinkText.substring(innerLinkText.indexOf("|") + 1) + description.replace(startsWithLinkRegex, ""); - } - description = this.replaceFormatting(description, /^\*\*([^*]+)\*\*/); - description = this.replaceFormatting(description, /^\*([^*]+)\*/); - description = this.replaceFormatting(description, /^==([^=]+)==/); - description = this.replaceFormatting(description, /^__([^_]+)__/); - description = this.replaceFormatting(description, /^_([^_]+)_/); - return description; - } - static replaceFormatting(description, regExp) { - const italicBoldRegexMatch = description.match(regExp); - if (italicBoldRegexMatch !== null) { - const innerItalicBoldText = italicBoldRegexMatch[1]; - description = innerItalicBoldText + description.replace(regExp, ""); - } - return description; - } -}; - -// src/Query/Filter/DoneDateField.ts -var _DoneDateField = class extends DateField { - filterRegExp() { - return _DoneDateField.doneRegexp; - } - fieldName() { - return "done"; - } - date(task) { - return task.doneDate; - } - filterResultIfFieldMissing() { - return false; - } -}; -var DoneDateField = _DoneDateField; -DoneDateField.doneRegexp = /^done (before|after|on)? ?(.*)/; - -// src/Query/Filter/ExcludeSubItemsField.ts -var ExcludeSubItemsField = class extends FilterInstructionsBasedField { - constructor() { - super(); - this._filters.add("exclude sub-items", (task) => { - if (task.indentation === "") - return true; - const lastBlockquoteMark = task.indentation.lastIndexOf(">"); - if (lastBlockquoteMark === -1) - return false; - return /^ ?$/.test(task.indentation.slice(lastBlockquoteMark + 1)); - }); - } - fieldName() { - return "exclude"; - } -}; - -// src/Query/Filter/HeadingField.ts -var HeadingField = class extends TextField { - fieldName() { - return "heading"; - } - value(task) { - if (task.precedingHeader) { - return task.precedingHeader; - } else { - return ""; - } - } - supportsSorting() { - return true; - } -}; - -// src/Query/Filter/ScheduledDateField.ts -var _ScheduledDateField = class extends DateField { - filterRegExp() { - return _ScheduledDateField.scheduledRegexp; - } - fieldName() { - return "scheduled"; - } - date(task) { - return task.scheduledDate; - } - filterResultIfFieldMissing() { - return false; - } -}; -var ScheduledDateField = _ScheduledDateField; -ScheduledDateField.scheduledRegexp = /^scheduled (before|after|on)? ?(.*)/; - -// src/Query/Filter/StartDateField.ts -var _StartDateField = class extends DateField { - filterRegExp() { - return _StartDateField.startRegexp; - } - fieldName() { - return "start"; - } - date(task) { - return task.startDate; - } - filterResultIfFieldMissing() { - return true; - } -}; -var StartDateField = _StartDateField; -StartDateField.startRegexp = /^starts (before|after|on)? ?(.*)/; - -// src/Query/Filter/HappensDateField.ts -var _HappensDateField = class extends Field { - constructor() { - super(); - this.filterInstructions = new FilterInstructions(); - this.filterInstructions.add( - _HappensDateField.instructionForFieldPresence, - (task) => this.dates(task).some((date) => date !== null) - ); - this.filterInstructions.add( - _HappensDateField.instructionForFieldAbsence, - (task) => !this.dates(task).some((date) => date !== null) - ); - } - canCreateFilterForLine(line) { - if (this.filterInstructions.canCreateFilterForLine(line)) { - return true; - } - return super.canCreateFilterForLine(line); - } - createFilterOrErrorMessage(line) { - const filterResult = this.filterInstructions.createFilterOrErrorMessage(line); - if (filterResult.filter !== void 0) { - return filterResult; - } - const result = new FilterOrErrorMessage(line); - const happensMatch = Field.getMatch(this.filterRegExp(), line); - if (happensMatch !== null) { - const filterDate = DateParser.parseDate(happensMatch[2]); - if (!filterDate.isValid()) { - result.error = "do not understand happens date"; - } else { - let filterFunction; - let relative; - if (happensMatch[1] === "before") { - filterFunction = (task) => { - return this.dates(task).some((date) => date && date.isBefore(filterDate)); - }; - relative = " " + happensMatch[1]; - } else if (happensMatch[1] === "after") { - filterFunction = (task) => { - return this.dates(task).some((date) => date && date.isAfter(filterDate)); - }; - relative = " " + happensMatch[1]; - } else { - filterFunction = (task) => { - return this.dates(task).some((date) => date && date.isSame(filterDate)); - }; - relative = " on"; - } - const explanation = DateField.getExplanationString( - "due, start or scheduled", - relative, - false, - filterDate - ); - result.filter = new Filter(line, filterFunction, new Explanation(explanation)); - } - } else { - result.error = "do not understand query filter (happens date)"; - } - return result; - } - earliestDate(task) { - const happensDates = new _HappensDateField().dates(task); - const sortedHappensDates = happensDates.sort(compareByDate); - return sortedHappensDates[0]; - } - filterRegExp() { - return _HappensDateField.happensRegexp; - } - dates(task) { - return Array.of(task.startDate, task.scheduledDate, task.dueDate); - } - fieldName() { - return "happens"; - } - supportsSorting() { - return true; - } - comparator() { - return (a, b) => { - return compareByDate(this.earliestDate(a), this.earliestDate(b)); - }; - } -}; -var HappensDateField = _HappensDateField; -HappensDateField.happensRegexp = /^happens (before|after|on)? ?(.*)/; -HappensDateField.instructionForFieldPresence = "has happens date"; -HappensDateField.instructionForFieldAbsence = "no happens date"; - -// src/Query/Filter/RecurringField.ts -var RecurringField = class extends FilterInstructionsBasedField { - constructor() { - super(); - this._filters.add("is recurring", (task) => task.recurrence !== null); - this._filters.add("is not recurring", (task) => task.recurrence === null); - } - fieldName() { - return "recurring"; - } -}; - -// src/Query/Filter/MultiTextField.ts -var MultiTextField = class extends TextField { - fieldNamePlural() { - return this.fieldNameSingular() + "s"; - } - fieldName() { - return `${this.fieldNameSingular()}/${this.fieldNamePlural()}`; - } - fieldPattern() { - return `${this.fieldNameSingular()}|${this.fieldNamePlural()}`; - } - filterOperatorPattern() { - return `${super.filterOperatorPattern()}|include|do not include`; - } - value(task) { - return this.values(task).join(", "); - } - getFilter(matcher, negate) { - return (task) => { - const match = matcher.matchesAnyOf(this.values(task)); - return negate ? !match : match; - }; - } -}; - -// src/Query/Filter/TagsField.ts -var TagsField = class extends MultiTextField { - fieldNameSingular() { - return "tag"; - } - values(task) { - return task.tags; - } - supportsSorting() { - return true; - } - createSorterFromLine(line) { - const match = line.match(this.sorterRegExp()); - if (match === null) { - return null; - } - const reverse = !!match[1]; - const propertyInstance = isNaN(+match[2]) ? 1 : +match[2]; - const comparator = TagsField.makeCompareByTagComparator(propertyInstance); - return new Sorter(this.fieldNameSingular(), comparator, reverse); - } - sorterRegExp() { - return /^sort by tag( reverse)?[\s]*(\d+)?/; - } - comparator() { - return TagsField.makeCompareByTagComparator(1); - } - static makeCompareByTagComparator(propertyInstance) { - return (a, b) => { - if (a.tags.length === 0 && b.tags.length === 0) { - return 0; - } else if (a.tags.length === 0) { - return 1; - } else if (b.tags.length === 0) { - return -1; - } - const tagInstanceToSortBy = propertyInstance - 1; - if (a.tags.length < propertyInstance && b.tags.length >= propertyInstance) { - return 1; - } else if (b.tags.length < propertyInstance && a.tags.length >= propertyInstance) { - return -1; - } else if (a.tags.length < propertyInstance && b.tags.length < propertyInstance) { - return 0; - } - const tagA = a.tags[tagInstanceToSortBy]; - const tagB = b.tags[tagInstanceToSortBy]; - return tagA.localeCompare(tagB, void 0, { numeric: true }); - }; - } -}; - -// src/Query/Filter/BooleanField.ts -var import_boon_js = __toESM(require_lib()); -var BooleanField = class extends Field { - constructor() { - super(...arguments); - this.basicBooleanRegexp = /(.*(AND|OR|XOR|NOT)\s*[("].*|\(.+\))/g; - this.supportedOperators = ["AND", "OR", "XOR", "NOT"]; - this.subFields = {}; - } - filterRegExp() { - return this.basicBooleanRegexp; - } - createFilterOrErrorMessage(line) { - return this.parseLine(line); - } - fieldName() { - return "boolean query"; - } - parseLine(line) { - const result = new FilterOrErrorMessage(line); - if (line.length === 0) { - result.error = "empty line"; - return result; - } - const preprocessed = this.preprocessExpression(line); - try { - const postfixExpression = (0, import_boon_js.parse)(preprocessed); - for (const token of postfixExpression) { - if (token.name === "IDENTIFIER" && token.value) { - const identifier = token.value.trim(); - if (!(identifier in this.subFields)) { - const parsedField = parseFilter(identifier); - if (parsedField === null) { - result.error = `couldn't parse sub-expression '${identifier}'`; - return result; - } - if (parsedField.error) { - result.error = `couldn't parse sub-expression '${identifier}': ${parsedField.error}`; - return result; - } else if (parsedField.filter) { - this.subFields[identifier] = parsedField.filter; - } - } - } else if (token.name === "OPERATOR") { - if (token.value == void 0) { - result.error = "empty operator in boolean query"; - return result; - } - if (!this.supportedOperators.includes(token.value)) { - result.error = `unknown boolean operator '${token.value}'`; - return result; - } - } - } - const filterFunction = (task) => { - return this.filterTaskWithParsedQuery(task, postfixExpression); - }; - const explanation = this.constructExplanation(postfixExpression); - result.filter = new Filter(line, filterFunction, explanation); - return result; - } catch (error) { - const message = error instanceof Error ? error.message : "unknown error type"; - result.error = `malformed boolean query -- ${message} (check the documentation for guidelines)`; - return result; - } - return result; - } - preprocessExpression(line) { - return line.replace(/\(([^()]+)\)/g, '("$1")'); - } - filterTaskWithParsedQuery(task, postfixExpression) { - const toBool = (s) => { - return s === "true"; - }; - const toString = (b) => { - return b ? "true" : "false"; - }; - const booleanStack = []; - for (const token of postfixExpression) { - if (token.name === "IDENTIFIER") { - if (token.value == null) - throw Error("null token value"); - const filter = this.subFields[token.value.trim()]; - const result = filter.filterFunction(task); - booleanStack.push(toString(result)); - } else if (token.name === "OPERATOR") { - if (token.value === "NOT") { - const arg1 = toBool(booleanStack.pop()); - booleanStack.push(toString(!arg1)); - } else if (token.value === "OR") { - const arg1 = toBool(booleanStack.pop()); - const arg2 = toBool(booleanStack.pop()); - booleanStack.push(toString(arg1 || arg2)); - } else if (token.value === "AND") { - const arg1 = toBool(booleanStack.pop()); - const arg2 = toBool(booleanStack.pop()); - booleanStack.push(toString(arg1 && arg2)); - } else if (token.value === "XOR") { - const arg1 = toBool(booleanStack.pop()); - const arg2 = toBool(booleanStack.pop()); - booleanStack.push(toString(arg1 && !arg2 || !arg1 && arg2)); - } else { - throw Error("Unsupported operator: " + token.value); - } - } else { - throw Error("Unsupported token type: " + token); - } - } - return toBool(booleanStack[0]); - } - constructExplanation(postfixExpression) { - const explanationStack = []; - for (const token of postfixExpression) { - if (token.name === "IDENTIFIER") { - if (token.value == null) - throw Error("null token value"); - const filter = this.subFields[token.value.trim()]; - explanationStack.push(filter.explanation); - } else if (token.name === "OPERATOR") { - if (token.value === "NOT") { - const arg1 = explanationStack.pop(); - explanationStack.push(Explanation.booleanNot([arg1])); - } else if (token.value === "OR") { - const arg2 = explanationStack.pop(); - const arg1 = explanationStack.pop(); - explanationStack.push(Explanation.booleanOr([arg1, arg2])); - } else if (token.value === "AND") { - const arg2 = explanationStack.pop(); - const arg1 = explanationStack.pop(); - explanationStack.push(Explanation.booleanAnd([arg1, arg2])); - } else if (token.value === "XOR") { - const arg2 = explanationStack.pop(); - const arg1 = explanationStack.pop(); - explanationStack.push(Explanation.booleanXor([arg1, arg2])); - } else { - throw Error("Unsupported operator: " + token.value); - } - } else { - throw Error("Unsupported token type: " + token); - } - } - return explanationStack[0]; - } -}; - -// src/Query/Filter/FilenameField.ts -var FilenameField = class extends TextField { - fieldName() { - return "filename"; - } - value(task) { - const filename = task.filename; - if (filename === null) { - return ""; - } - return filename + ".md"; - } - supportsSorting() { - return true; - } -}; - -// src/Query/Filter/StatusNameField.ts -var StatusNameField = class extends TextField { - constructor() { - super(); - } - fieldName() { - return "status.name"; - } - value(task) { - return task.status.name; - } - supportsSorting() { - return true; - } - supportsGrouping() { - return true; - } -}; - -// src/Query/Filter/StatusTypeField.ts -var StatusTypeField = class extends Field { - canCreateFilterForLine(line) { - const relaxedRegExp = new RegExp(`^(?:${this.fieldNameSingularEscaped()})`); - return Field.lineMatchesFilter(relaxedRegExp, line); - } - createFilterOrErrorMessage(line) { - const match = Field.getMatch(this.filterRegExp(), line); - if (match === null) { - return this.helpMessage(line); - } - const [_, filterOperator, statusTypeAsString] = match; - const statusTypeElement = StatusType[statusTypeAsString.toUpperCase()]; - if (!statusTypeElement) { - return this.helpMessage(line); - } - let filterFunction; - switch (filterOperator) { - case "is": - filterFunction = (task) => { - return task.status.type === statusTypeElement; - }; - break; - case "is not": - filterFunction = (task) => { - return task.status.type !== statusTypeElement; - }; - break; - default: - return this.helpMessage(line); - } - return FilterOrErrorMessage.fromFilter(new Filter(line, filterFunction, new Explanation(line))); - } - filterRegExp() { - return new RegExp(`^(?:${this.fieldNameSingularEscaped()}) (is|is not) ([^ ]+)$`); - } - helpMessage(line) { - const allowedTypes = Object.values(StatusType).filter((t) => t !== "EMPTY" /* EMPTY */).join(" "); - const message = `Invalid ${this.fieldNameSingular()} instruction: '${line}'. +`;console.error(s),e instanceof Error&&console.error(e.stack),this.state==="Initializing"&&new zn.Notice(s,1e4)}static getSection(e,t){if(t===void 0)return null;for(let n of t)if(n.position.start.line<=e&&n.position.end.line>=e)return n;return null}static getPrecedingHeader(e,t){if(t===void 0)return null;let n=null;for(let i of t){if(i.position.start.line>e)return n;n=i.heading}return n}};var Bd=require("obsidian");var F_=require("obsidian");function on(){}function Id(r){return r()}function b_(){return Object.create(null)}function un(r){r.forEach(Id)}function E_(r){return typeof r=="function"}function w_(r,e){return r!=r?e==e:r!==e||r&&typeof r=="object"||typeof r=="function"}function R_(r){return Object.keys(r).length===0}var O_=!1;function vk(){O_=!0}function Ek(){O_=!1}function _(r,e){r.appendChild(e)}function Kn(r,e,t){r.insertBefore(e,t||null)}function ln(r){r.parentNode.removeChild(r)}function Fd(r,e){for(let t=0;tr.removeEventListener(e,t,n)}function D_(r){return function(e){return e.preventDefault(),r.call(this,e)}}function D(r,e,t){t==null?r.removeAttribute(e):r.getAttribute(e)!==t&&r.setAttribute(e,t)}function Rk(r){return Array.from(r.childNodes)}function Ud(r,e){e=""+e,r.wholeText!==e&&(r.data=e)}function Gt(r,e){r.value=e==null?"":e}function Ld(r,e){for(let t=0;t{let u=s.map(Id).filter(E_);a?a.push(...u):un(u),r.$$.on_mount=[]}),o.forEach(As)}function k_(r,e){let t=r.$$;t.fragment!==null&&(un(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroy=t.fragment=null,t.ctx=[])}function xk(r,e){r.$$.dirty[0]===-1&&(Ss.push(r),Mk(),r.$$.dirty.fill(0)),r.$$.dirty[e/31|0]|=1<{let y=h.length?h[0]:f;return l.ctx&&i(l.ctx[d],l.ctx[d]=y)&&(!l.skip_bound&&l.bound[d]&&l.bound[d](y),c&&xk(r,d)),f}):[],l.update(),c=!0,un(l.before_update),l.fragment=n?n(l.ctx):!1,e.target){if(e.hydrate){vk();let d=Rk(e.target);l.fragment&&l.fragment.l(d),d.forEach(ln)}else l.fragment&&l.fragment.c();e.intro&&Pk(r.$$.fragment),Ak(r,e.target,e.anchor,e.customElement),Ek(),S_()}ks(u)}var Ck;typeof HTMLElement=="function"&&(Ck=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}connectedCallback(){let{on_mount:r}=this.$$;this.$$.on_disconnect=r.map(Id).filter(E_);for(let e in this.$$.slotted)this.appendChild(this.$$.slotted[e])}attributeChangedCallback(r,e,t){this[r]=t}disconnectedCallback(){un(this.$$.on_disconnect)}$destroy(){k_(this,1),this.$destroy=on}$on(r,e){let t=this.$$.callbacks[r]||(this.$$.callbacks[r]=[]);return t.push(e),()=>{let n=t.indexOf(e);n!==-1&&t.splice(n,1)}}$set(r){this.$$set&&!R_(r)&&(this.$$.skip_bound=!0,this.$$set(r),this.$$.skip_bound=!1)}});var ro=class{$destroy(){k_(this,1),this.$destroy=on}$on(e,t){let n=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return n.push(t),()=>{let i=n.indexOf(t);i!==-1&&n.splice(i,1)}}$set(e){this.$$set&&!R_(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}};var xs=Ks(ke());var Nk={td:"today",tm:"tomorrow",yd:"yesterday",tw:"this week",nw:"next week",weekend:"sat",we:"sat"};function Vn(r){for(let[e,t]of Object.entries(Nk))r=r.replace(RegExp(`\\b${e}\\s`,"i"),t);return r}function A_(r,e,t){let n=r.slice();return n[30]=e[t],n}function x_(r,e,t){let n=r.slice();return n[33]=e[t].value,n[34]=e[t].label,n[35]=e[t].symbol,n}function Ik(r){let e,t=r[35]+"",n;return{c(){e=L("span"),n=gt(t)},m(i,s){Kn(i,e,s),_(e,n)},p:on,d(i){i&&ln(e)}}}function C_(r){let e,t,n,i,s,a,o,u,l=r[34]+"",c,d,f=r[35]&&r[35].charCodeAt(0)>=256,h,y,m,g,R=f&&Ik(r);return{c(){e=L("span"),t=L("input"),a=J(),o=L("label"),u=L("span"),c=gt(l),d=J(),R&&R.c(),y=J(),D(t,"type","radio"),D(t,"id",n="priority-"+r[33]),t.__value=i=r[33],t.value=t.__value,D(t,"accesskey",s=r[9](r[34].charAt(0).toLowerCase())),r[21][0].push(t),D(u,"class","accesskey-first"),D(o,"for",h="priority-"+r[33])},m(O,P){Kn(O,e,P),_(e,t),t.checked=t.__value===r[1].priority,_(e,a),_(e,o),_(o,u),_(u,c),_(o,d),R&&R.m(o,null),_(e,y),m||(g=At(t,"change",r[20]),m=!0)},p(O,P){P[0]&512&&s!==(s=O[9](O[34].charAt(0).toLowerCase()))&&D(t,"accesskey",s),P[0]&3&&(t.checked=t.__value===O[1].priority),f&&R.p(O,P)},d(O){O&&ln(e),r[21][0].splice(r[21][0].indexOf(t),1),R&&R.d(),m=!1,g()}}}function N_(r){let e,t=r[30].name+"",n,i,s=r[30].symbol+"",a,o,u;return{c(){e=L("option"),n=gt(t),i=gt(" ["),a=gt(s),o=gt("]"),e.__value=u=r[30],e.value=e.__value},m(l,c){Kn(l,e,c),_(e,n),_(e,i),_(e,a),_(e,o)},p(l,c){c[0]&1&&t!==(t=l[30].name+"")&&Ud(n,t),c[0]&1&&s!==(s=l[30].symbol+"")&&Ud(a,s),c[0]&1&&u!==(u=l[30])&&(e.__value=u,e.value=e.__value)},d(l){l&&ln(e)}}}function Fk(r){let e,t,n,i,s,a,o,u,l,c,d,f,h,y,m,g,R,O,P,X,ye,Te,se,H,bt,lt,A,E,b,C,v,q,w,F,B,W,de,fe,xe,xt,et,Ze,Se,ct,Tn,ir,pf,Ct,Ws,hf,fi,mf,yf,Ys,gf,pi,$s,_f,zt,js,Tf,bn,Bs,bf,Kt,vf,vn,hi,Gs,Ef,Mr,Hs,wf,mi,Ao,Rf,zs,Of,En,yi,Df,gi,xo,Mf,wn=r[10],tt=[];for(let N=0;Ntion',s=J(),a=L("input"),u=J(),l=L("div"),c=L("label"),d=gt("Priority"),h=J();for(let N=0;Nart',pf=J(),Ct=L("input"),hf=J(),fi=L("code"),mf=gt($t),yf=J(),Ys=new an(!1),gf=J(),pi=L("div"),$s=L("label"),$s.innerHTML=`Only + future dates:`,_f=J(),zt=L("input"),Tf=J(),bn=L("div"),Bs=L("label"),Bs.textContent="Status",bf=J(),Kt=L("select");for(let N=0;Nr[27].call(Kt)),D(bn,"class","tasks-modal-section"),D(Gs,"for","status"),D(Mr,"id","status"),D(Mr,"type","checkbox"),D(Mr,"class","task-list-item-checkbox tasks-modal-checkbox"),Mr.checked=Hs=r[1].status.isCompleted(),Mr.disabled=!0,D(vn,"class","tasks-modal-section tasks-modal-status"),D(yi,"type","submit"),D(yi,"class","mod-cta"),D(gi,"type","button"),D(En,"class","tasks-modal-section tasks-modal-buttons"),qd(t,"with-accesskeys",r[2]),D(e,"class","tasks-modal")},m(N,ue){Kn(N,e,ue),_(e,t),_(t,n),_(n,i),_(n,s),_(n,a),Gt(a,r[1].description),r[19](a),_(t,u),_(t,l),_(l,c),_(c,d),_(l,h);for(let Q=0;Qno ${w} date`;let W=xs.parseDate(F,B,{forwardDate:B!=null});return W!==null?window.moment(W).format("YYYY-MM-DD"):`invalid ${w} date`}Wd(()=>{let{globalFilter:w,provideAccessKeys:F}=U();t(2,R=F);let B=a.getDescriptionWithoutGlobalFilter();(B!=a.description||B.indexOf(w)==-1)&&(g=!0);let W="none";a.priority==="4"?W="low":a.priority==="2"?W="medium":a.priority==="1"&&(W="high"),t(1,c={description:B,status:a.status,priority:W,recurrenceRule:a.recurrence?a.recurrence.toText():"",startDate:a.startDate?a.startDate.format("YYYY-MM-DD"):"",scheduledDate:a.scheduledDate?a.scheduledDate.format("YYYY-MM-DD"):"",dueDate:a.dueDate?a.dueDate.format("YYYY-MM-DD"):"",doneDate:a.doneDate?a.doneDate.format("YYYY-MM-DD"):"",forwardOnly:!0}),setTimeout(()=>{l.focus()},10)});let X=w=>{if(w.key&&!w.altKey&&!w.ctrlKey){let F=O.find(B=>B.label.charAt(0).toLowerCase()==w.key);F&&t(1,c.priority=F.value,c)}},ye=()=>{o([])},Te=()=>{let{globalFilter:w}=U(),F=c.description.trim();g&&(F=w+" "+F);let B=null,W=xs.parseDate(c.startDate,new Date,{forwardDate:c.forwardOnly});W!==null&&(B=window.moment(W));let de=null,fe=xs.parseDate(c.scheduledDate,new Date,{forwardDate:c.forwardOnly});fe!==null&&(de=window.moment(fe));let xe=null,xt=xs.parseDate(c.dueDate,new Date,{forwardDate:c.forwardOnly});xt!==null&&(xe=window.moment(xt));let et=null;c.recurrenceRule&&(et=We.fromText({recurrenceRuleText:c.recurrenceRule,startDate:B,scheduledDate:de,dueDate:xe}));let Ze;switch(c.priority){case"low":Ze="4";break;case"medium":Ze="2";break;case"high":Ze="1";break;default:Ze="3"}let Se=new me(Object.assign(Object.assign({},a),{description:F,status:c.status,priority:Ze,recurrence:et,startDate:B,scheduledDate:de,dueDate:xe,doneDate:window.moment(c.doneDate,"YYYY-MM-DD").isValid()?window.moment(c.doneDate,"YYYY-MM-DD"):null}));o([Se])},se=[[]];function H(){c.description=this.value,t(1,c),t(0,u)}function bt(w){to[w?"unshift":"push"](()=>{l=w,t(3,l)})}function lt(){c.priority=this.__value,t(1,c),t(0,u)}function A(){c.recurrenceRule=this.value,t(1,c),t(0,u)}function E(){c.dueDate=this.value,t(1,c),t(0,u)}function b(){c.scheduledDate=this.value,t(1,c),t(0,u)}function C(){c.startDate=this.value,t(1,c),t(0,u)}function v(){c.forwardOnly=this.checked,t(1,c),t(0,u)}function q(){c.status=M_(this),t(1,c),t(0,u)}return r.$$set=w=>{"task"in w&&t(14,a=w.task),"onSubmit"in w&&t(15,o=w.onSubmit),"statusOptions"in w&&t(0,u=w.statusOptions)},r.$$.update=()=>{if(r.$$.dirty[0]&4){e:t(9,n=w=>R?w:null)}if(r.$$.dirty[0]&2){e:t(1,c.startDate=Vn(c.startDate),c),t(4,d=P("start",c.startDate,c.forwardOnly?new Date:void 0))}if(r.$$.dirty[0]&2){e:t(1,c.scheduledDate=Vn(c.scheduledDate),c),t(5,f=P("scheduled",c.scheduledDate,c.forwardOnly?new Date:void 0))}if(r.$$.dirty[0]&2){e:t(1,c.dueDate=Vn(c.dueDate),c),t(6,h=P("due",c.dueDate,c.forwardOnly?new Date:void 0))}if(r.$$.dirty[0]&196610){e:c.recurrenceRule?t(7,y=t(17,s=t(16,i=We.fromText({recurrenceRuleText:c.recurrenceRule,startDate:null,scheduledDate:null,dueDate:null}))===null||i===void 0?void 0:i.toText())!==null&&s!==void 0?s:"invalid recurrence rule"):t(7,y="not recurring")}if(r.$$.dirty[0]&2){e:t(8,m=P("done",c.doneDate))}},[u,c,R,l,d,f,h,y,m,n,O,X,ye,Te,a,o,i,s,H,bt,lt,se,A,E,b,C,v,q]}var $d=class extends ro{constructor(e){super(),P_(this,e,Uk,Fk,w_,{task:14,onSubmit:15,statusOptions:0},null,[-1,-1])}},I_=$d;var Xn=class extends F_.Modal{constructor({app:t,task:n,onSubmit:i}){super(t);this.task=n,this.onSubmit=s=>{s.length&&i(s),this.close()}}onOpen(){this.titleEl.setText("Create or edit Task");let{contentEl:t}=this,n=this.getKnownStatusesAndCurrentTaskStatusIfNotKnown();new I_({target:t,props:{task:this.task,statusOptions:n,onSubmit:this.onSubmit}})}getKnownStatusesAndCurrentTaskStatusIfNotKnown(){let t=he.getInstance().registeredStatuses;return he.getInstance().bySymbol(this.task.status.symbol)===j.EMPTY&&t.push(this.task.status),t}onClose(){let{contentEl:t}=this;t.empty()}};var U_=({line:r,path:e})=>{var f,h;let t=ut.fromPath(e),n=me.fromLine({line:r,path:e,sectionStart:0,sectionIndex:0,precedingHeader:null,fallbackDate:t});if(n!==null)return n;let i=r.match(S.nonTaskRegex);if(i===null)return console.error("Tasks: Cannot create task on line:",r),new me({status:j.TODO,description:"",path:e,indentation:"",listMarker:"-",priority:"3",startDate:null,scheduledDate:null,dueDate:null,doneDate:null,recurrence:null,sectionStart:0,sectionIndex:0,precedingHeader:null,blockLink:"",tags:[],originalMarkdown:"",scheduledDateIsInferred:!1});let s=i[1],a=(f=i[2])!=null?f:"-",o=(h=i[4])!=null?h:" ",u=he.getInstance().bySymbolOrCreate(o),l=i[5],c=r.match(S.blockLinkRegex),d=c!==null?c[0]:"";return d!==""&&(l=l.replace(S.blockLinkRegex,"")),new me({status:u,description:l,path:e,indentation:s,listMarker:a,blockLink:d,priority:"3",startDate:null,scheduledDate:null,dueDate:null,doneDate:null,recurrence:null,sectionStart:0,sectionIndex:0,precedingHeader:null,tags:[],originalMarkdown:"",scheduledDateIsInferred:!1})};var L_=(r,e,t,n)=>{var d;if(r)return t instanceof Bd.MarkdownView;if(!(t instanceof Bd.MarkdownView))return;let i=(d=t.file)==null?void 0:d.path;if(i===void 0)return;let a=e.getCursor().line,o=e.getLine(a),u=U_({line:o,path:i}),l=f=>{let h=ut.removeInferredStatusIfNeeded(u,f).map(y=>y.toFileLineString()).join(` +`);e.setLine(a,h)};new Xn({app:n,task:u,onSubmit:l}).open()};var Gd=require("obsidian");var q_=(r,e,t)=>{var u;if(r)return t instanceof Gd.MarkdownView;if(!(t instanceof Gd.MarkdownView))return;let n=(u=t.file)==null?void 0:u.path;if(n===void 0)return;let i=e.getCursor(),s=i.line,a=e.getLine(s),o=Lk(a,n);e.setLine(s,o),e.setCursor({line:i.line,ch:Wk(i.ch,a,o)})},Lk=(r,e)=>{let t=r,n=me.fromLine({line:r,path:e,sectionStart:0,sectionIndex:0,precedingHeader:null,fallbackDate:null});if(n!==null)t=qk(n);else{let i=r.match(S.taskRegex);if(i!==null){let s=i[3],o=he.getInstance().bySymbol(s).nextStatusSymbol;t=r.replace(S.taskRegex,`$1- [${o}] $4`)}else S.listItemRegex.test(r)?t=r.replace(S.listItemRegex,"$1$2 [ ]"):t=r.replace(S.indentationRegex,"$1- ")}return t},qk=r=>r.toggle().map(t=>t.toFileLineString()).join(` +`),Wk=(r,e,t)=>{let n=t.length;if(n<=e.length)return r>=t.length?n:r;let i=13;if(t.match(S.doneDateRegex)&&n-e.length>=i&&(n-=i),n>=2*e.length&&t.search(`.+ +.+`)!==-1)return r+n-e.length;let s=t.search(/[-*]/);return rL_(t,n,i,this.app)}),e.addCommand({id:"toggle-done",name:"Toggle task done",icon:"check-in-circle",editorCheckCallback:q_})}};var io=class{constructor({obsidianEvents:e}){this.obsidianEvents=e}onCacheUpdate(e){return this.obsidianEvents.on("obsidian-tasks-plugin:cache-update",e)}triggerCacheUpdate(e){this.obsidianEvents.trigger("obsidian-tasks-plugin:cache-update",e)}onRequestCacheUpdate(e){return this.obsidianEvents.on("obsidian-tasks-plugin:request-cache-update",e)}triggerRequestCacheUpdate(e){this.obsidianEvents.trigger("obsidian-tasks-plugin:request-cache-update",e)}off(e){this.obsidianEvents.offref(e)}};var so=class{constructor({plugin:e}){this.markdownPostProcessor=this._markdownPostProcessor.bind(this);e.registerMarkdownPostProcessor(this._markdownPostProcessor.bind(this))}_markdownPostProcessor(e,t){return x(this,null,function*(){var c;let{globalFilter:n}=U(),i=e.findAll(".task-list-item").filter(d=>{var y;let f=(y=d.textContent)==null?void 0:y.split(` +`);if(f===void 0)return!1;let h=null;for(let m=0;mW_.ViewPlugin.fromClass(Hd),Hd=class{constructor(e){this.view=e,this.handleClickEvent=this.handleClickEvent.bind(this),this.view.dom.addEventListener("click",this.handleClickEvent)}destroy(){this.view.dom.removeEventListener("click",this.handleClickEvent)}handleClickEvent(e){let{target:t}=e;if(!t||!(t instanceof HTMLInputElement)||t.type!=="checkbox")return!1;let n=t.closest("ul.plugin-tasks-query-result, div.callout-content");if(n){if(n.matches("div.callout-content")){let f=`obsidian-tasks-plugin warning: Tasks cannot add or remove completion dates or make the next copy of a recurring task for tasks written inside a callout when you click their checkboxes in Live Preview. +If you wanted Tasks to do these things, please undo your change, then either click the line of the task and use the "Toggle Task Done" command, or switch to Reading View to click the checkbox.`;console.warn(f),new Y_.Notice(f,45e3)}return!1}let{state:i}=this.view,s=this.view.posAtDOM(t),a=i.doc.lineAt(s),o=me.fromLine({line:a.text,path:"",sectionStart:0,sectionIndex:0,precedingHeader:null,fallbackDate:null});if(console.debug(`Live Preview Extension: toggle called. Position: ${s} Line: ${a.text}`),o===null)return!1;e.preventDefault();let l=o.toggle().map(f=>f.toFileLineString()).join(i.lineBreak),c=i.update({changes:{from:a.from,to:a.to,insert:l}});this.view.dispatch(c);let d=t.checked;return setTimeout(()=>{t.checked=d},1),!0}};var So=require("obsidian");var Wr=class extends oe{constructor(){super(...arguments);this._filters=new Lr}canCreateFilterForLine(t){return this._filters.canCreateFilterForLine(t)}createFilterOrErrorMessage(t){return this._filters.createFilterOrErrorMessage(t)}filterRegExp(){return null}};var br=class extends Wr{constructor(){super(),this._filters.add("done",e=>e.status.type==="DONE"||e.status.type==="CANCELLED"||e.status.type==="NON_TASK"),this._filters.add("not done",e=>e.status.type==="TODO"||e.status.type==="IN_PROGRESS")}fieldName(){return"status"}supportsSorting(){return!0}comparator(){return(e,t)=>{let n=br.oldStatusName(e),i=br.oldStatusName(t);return ni?-1:0}}static oldStatusName(e){return e.status.symbol===" "?"Todo":"Done"}};var zd=class extends _e{filterRegExp(){return zd.dueRegexp}fieldName(){return"due"}date(e){return e.dueDate}filterResultIfFieldMissing(){return!1}},cn=zd;cn.dueRegexp=/^due (before|after|on)? ?(.*)/;var Kd=class extends oe{createFilterOrErrorMessage(e){let t=new le(e),n=oe.getMatch(this.filterRegExp(),e);if(n!==null){let i=n[5],s=null;switch(i){case"low":s="4";break;case"none":s="3";break;case"medium":s="2";break;case"high":s="1";break}if(s===null)return t.error="do not understand priority",t;let a=e,o;switch(n[3]){case"above":o=u=>u.priority.localeCompare(s)<0;break;case"below":o=u=>u.priority.localeCompare(s)>0;break;case"not":o=u=>u.priority!==s;break;default:o=u=>u.priority===s,a=`${this.fieldName()} is ${i}`}t.filter=new Ve(e,o,new ge(a))}else t.error="do not understand query filter (priority)";return t}fieldName(){return"priority"}filterRegExp(){return Kd.priorityRegexp}supportsSorting(){return!0}comparator(){return(e,t)=>e.priority.localeCompare(t.priority)}},dn=Kd;dn.priorityRegexp=/^priority(\s+is)?(\s+(above|below|not))?(\s+(low|none|medium|high))$/;var Zn=class{matchesAnyOf(e){return e.some(t=>this.matches(t))}};var Qn=class extends Zn{constructor(t){super();this.stringToFind=t}matches(t){return Qn.stringIncludesCaseInsensitive(t,this.stringToFind)}static stringIncludesCaseInsensitive(t,n){return t.toLocaleLowerCase().includes(n.toLocaleLowerCase())}};var Jn=class extends Zn{constructor(t){super();this.regex=t}static validateAndConstruct(t){let n=/\/((?![*+?])(?:[^\r\n[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*])+)\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/,i=t.match(n);if(i!==null){let s=new RegExp(i[1],i[2]);return new Jn(s)}else return null}matches(t){return t.match(this.regex)!==null}};var Xe=class extends oe{createFilterOrErrorMessage(e){let t=oe.getMatch(this.filterRegExp(),e);if(t===null)return le.fromError(e,`do not understand query filter (${this.fieldName()})`);let[n,i,s]=t,a=null;if(i.includes("include"))a=new Qn(s);else if(i.includes("regex")&&(a=Jn.validateAndConstruct(s),a===null))return le.fromError(e,`cannot parse regex (${this.fieldName()}); check your leading and trailing slashes for your query`);if(a===null)return le.fromError(e,`do not understand query filter (${this.fieldName()})`);let o=i.match(/not/)!==null,u=new Ve(e,this.getFilter(a,o),new ge(e));return le.fromFilter(u)}fieldPattern(){return this.fieldNameSingularEscaped()}filterOperatorPattern(){return"includes|does not include|regex matches|regex does not match"}filterRegExp(){return new RegExp(`^(?:${this.fieldPattern()}) (${this.filterOperatorPattern()}) (.*)`)}getFilter(e,t){return n=>{let i=e.matches(this.value(n));return t?!i:i}}comparator(){return(e,t)=>this.value(e).localeCompare(this.value(t),void 0,{numeric:!0})}grouper(){return e=>[this.value(e)]}};var ei=class extends Xe{fieldName(){return"path"}value(e){return e.path}supportsSorting(){return!0}};var ti=class extends oe{canCreateFilterForLine(e){return!1}createFilterOrErrorMessage(e){return le.fromError(e,"Filtering by urgency is not yet supported")}fieldName(){return"urgency"}filterRegExp(){throw Error(`filterRegExp() unimplemented for ${this.fieldName()}`)}supportsSorting(){return!0}comparator(){return(e,t)=>t.urgency-e.urgency}};var ri=class{static by(e,t){let n=[new ti().comparator(),new br().comparator(),new cn().comparator(),new dn().comparator(),new ei().comparator()],i=[];for(let s of e)i.push(s.comparator);return t.sort(ri.makeCompositeComparator([...i,...n]))}static makeCompositeComparator(e){return(t,n)=>{for(let i of e){let s=i(t,n);if(s!==0)return s}return 0}}};var fn=class extends Xe{fieldName(){return"description"}value(e){let t=U().globalFilter;return e.description.replace(t,"").trim()}supportsSorting(){return!0}comparator(){return(e,t)=>{let n=fn.cleanDescription(e.description),i=fn.cleanDescription(t.description);return n.localeCompare(i,void 0,{numeric:!0})}}static cleanDescription(e){let t=U().globalFilter;e=e.replace(t,"").trim();let n=/^\[\[?([^\]]*)]]?/,i=e.match(n);if(i!==null){let s=i[1];e=s.substring(s.indexOf("|")+1)+e.replace(n,"")}return e=this.replaceFormatting(e,/^\*\*([^*]+)\*\*/),e=this.replaceFormatting(e,/^\*([^*]+)\*/),e=this.replaceFormatting(e,/^==([^=]+)==/),e=this.replaceFormatting(e,/^__([^_]+)__/),e=this.replaceFormatting(e,/^_([^_]+)_/),e}static replaceFormatting(e,t){let n=e.match(t);return n!==null&&(e=n[1]+e.replace(t,"")),e}};var Vd=class extends _e{filterRegExp(){return Vd.doneRegexp}fieldName(){return"done"}date(e){return e.doneDate}filterResultIfFieldMissing(){return!1}},Cs=Vd;Cs.doneRegexp=/^done (before|after|on)? ?(.*)/;var ao=class extends Wr{constructor(){super(),this._filters.add("exclude sub-items",e=>{if(e.indentation==="")return!0;let t=e.indentation.lastIndexOf(">");return t===-1?!1:/^ ?$/.test(e.indentation.slice(t+1))})}fieldName(){return"exclude"}};var oo=class extends Xe{fieldName(){return"heading"}value(e){return e.precedingHeader?e.precedingHeader:""}supportsSorting(){return!0}};var Xd=class extends _e{filterRegExp(){return Xd.scheduledRegexp}fieldName(){return"scheduled"}date(e){return e.scheduledDate}filterResultIfFieldMissing(){return!1}},Ns=Xd;Ns.scheduledRegexp=/^scheduled (before|after|on)? ?(.*)/;var Zd=class extends _e{filterRegExp(){return Zd.startRegexp}fieldName(){return"start"}date(e){return e.startDate}filterResultIfFieldMissing(){return!0}},Is=Zd;Is.startRegexp=/^starts (before|after|on)? ?(.*)/;var ni=class extends oe{constructor(){super();this.filterInstructions=new Lr,this.filterInstructions.add(ni.instructionForFieldPresence,t=>this.dates(t).some(n=>n!==null)),this.filterInstructions.add(ni.instructionForFieldAbsence,t=>!this.dates(t).some(n=>n!==null))}canCreateFilterForLine(t){return this.filterInstructions.canCreateFilterForLine(t)?!0:super.canCreateFilterForLine(t)}createFilterOrErrorMessage(t){let n=this.filterInstructions.createFilterOrErrorMessage(t);if(n.filter!==void 0)return n;let i=new le(t),s=oe.getMatch(this.filterRegExp(),t);if(s!==null){let a=yr.parseDate(s[2]);if(!a.isValid())i.error="do not understand happens date";else{let o,u;s[1]==="before"?(o=c=>this.dates(c).some(d=>d&&d.isBefore(a)),u=" "+s[1]):s[1]==="after"?(o=c=>this.dates(c).some(d=>d&&d.isAfter(a)),u=" "+s[1]):(o=c=>this.dates(c).some(d=>d&&d.isSame(a)),u=" on");let l=_e.getExplanationString("due, start or scheduled",u,!1,a);i.filter=new Ve(t,o,new ge(l))}}else i.error="do not understand query filter (happens date)";return i}earliestDate(t){return new ni().dates(t).sort(_e.compareByDate)[0]}filterRegExp(){return ni.happensRegexp}dates(t){return Array.of(t.startDate,t.scheduledDate,t.dueDate)}fieldName(){return"happens"}supportsSorting(){return!0}comparator(){return(t,n)=>_e.compareByDate(this.earliestDate(t),this.earliestDate(n))}},vr=ni;vr.happensRegexp=/^happens (before|after|on)? ?(.*)/,vr.instructionForFieldPresence="has happens date",vr.instructionForFieldAbsence="no happens date";var uo=class extends Wr{constructor(){super(),this._filters.add("is recurring",e=>e.recurrence!==null),this._filters.add("is not recurring",e=>e.recurrence===null)}fieldName(){return"recurring"}};var lo=class extends Xe{fieldNamePlural(){return this.fieldNameSingular()+"s"}fieldName(){return`${this.fieldNameSingular()}/${this.fieldNamePlural()}`}fieldPattern(){return`${this.fieldNameSingular()}|${this.fieldNamePlural()}`}filterOperatorPattern(){return`${super.filterOperatorPattern()}|include|do not include`}value(e){return this.values(e).join(", ")}getFilter(e,t){return n=>{let i=e.matchesAnyOf(this.values(n));return t?!i:i}}};var pn=class extends lo{fieldNameSingular(){return"tag"}values(e){return e.tags}supportsSorting(){return!0}createSorterFromLine(e){let t=e.match(this.sorterRegExp());if(t===null)return null;let n=!!t[1],i=isNaN(+t[2])?1:+t[2],s=pn.makeCompareByTagComparator(i);return new gr(this.fieldNameSingular(),s,n)}sorterRegExp(){return/^sort by tag( reverse)?[\s]*(\d+)?/}comparator(){return pn.makeCompareByTagComparator(1)}static makeCompareByTagComparator(e){return(t,n)=>{if(t.tags.length===0&&n.tags.length===0)return 0;if(t.tags.length===0)return 1;if(n.tags.length===0)return-1;let i=e-1;if(t.tags.length=e)return 1;if(n.tags.length=e)return-1;if(t.tags.lengththis.filterTaskWithParsedQuery(u,s),o=this.constructExplanation(s);return n.filter=new Ve(t,a,o),n}catch(s){let a=s instanceof Error?s.message:"unknown error type";return n.error=`malformed boolean query -- ${a} (check the documentation for guidelines)`,n}return n}preprocessExpression(t){return t.replace(/\(([^()]+)\)/g,'("$1")')}filterTaskWithParsedQuery(t,n){let i=o=>o==="true",s=o=>o?"true":"false",a=[];for(let o of n)if(o.name==="IDENTIFIER"){if(o.value==null)throw Error("null token value");let l=this.subFields[o.value.trim()].filterFunction(t);a.push(s(l))}else if(o.name==="OPERATOR")if(o.value==="NOT"){let u=i(a.pop());a.push(s(!u))}else if(o.value==="OR"){let u=i(a.pop()),l=i(a.pop());a.push(s(u||l))}else if(o.value==="AND"){let u=i(a.pop()),l=i(a.pop());a.push(s(u&&l))}else if(o.value==="XOR"){let u=i(a.pop()),l=i(a.pop());a.push(s(u&&!l||!u&&l))}else throw Error("Unsupported operator: "+o.value);else throw Error("Unsupported token type: "+o);return i(a[0])}constructExplanation(t){let n=[];for(let i of t)if(i.name==="IDENTIFIER"){if(i.value==null)throw Error("null token value");let s=this.subFields[i.value.trim()];n.push(s.explanation)}else if(i.name==="OPERATOR")if(i.value==="NOT"){let s=n.pop();n.push(ge.booleanNot([s]))}else if(i.value==="OR"){let s=n.pop(),a=n.pop();n.push(ge.booleanOr([a,s]))}else if(i.value==="AND"){let s=n.pop(),a=n.pop();n.push(ge.booleanAnd([a,s]))}else if(i.value==="XOR"){let s=n.pop(),a=n.pop();n.push(ge.booleanXor([a,s]))}else throw Error("Unsupported operator: "+i.value);else throw Error("Unsupported token type: "+i);return n[0]}};var yo=class extends Xe{fieldName(){return"filename"}value(e){let t=e.filename;return t===null?"":t+".md"}supportsSorting(){return!0}};var go=class extends Xe{constructor(){super()}fieldName(){return"status.name"}value(e){return e.status.name}supportsSorting(){return!0}supportsGrouping(){return!0}};var $r=class extends oe{canCreateFilterForLine(e){let t=new RegExp(`^(?:${this.fieldNameSingularEscaped()})`);return oe.lineMatchesFilter(t,e)}createFilterOrErrorMessage(e){let t=oe.getMatch(this.filterRegExp(),e);if(t===null)return this.helpMessage(e);let[n,i,s]=t,a=tr[s.toUpperCase()];if(!a)return this.helpMessage(e);let o;switch(i){case"is":o=u=>u.status.type===a;break;case"is not":o=u=>u.status.type!==a;break;default:return this.helpMessage(e)}return le.fromFilter(new Ve(e,o,new ge(e)))}filterRegExp(){return new RegExp(`^(?:${this.fieldNameSingularEscaped()}) (is|is not) ([^ ]+)$`)}helpMessage(e){let t=Object.values(tr).filter(i=>i!=="EMPTY").join(" "),n=`Invalid ${this.fieldNameSingular()} instruction: '${e}'. Allowed options: 'is' and 'is not' (without quotes). - Allowed values: ${allowedTypes} + Allowed values: ${t} Note: values are case-insensitive, so 'in_progress' works too, for example. - Example: ${this.fieldNameSingular()} is not NON_TASK`; - return FilterOrErrorMessage.fromError(line, message); - } - fieldName() { - return "status.type"; - } - value(task) { - return task.status.type; - } - supportsSorting() { - return true; - } - comparator() { - return (a, b) => { - const keyA = StatusTypeField.groupName(a); - const keyB = StatusTypeField.groupName(b); - return keyA.localeCompare(keyB, void 0, { numeric: true }); - }; - } - supportsGrouping() { - return true; - } - grouper() { - return (task) => { - return [StatusTypeField.groupName(task)]; - }; - } - static groupName(task) { - let prefix; - switch (task.status.type) { - case "IN_PROGRESS" /* IN_PROGRESS */: - prefix = "1"; - break; - case "TODO" /* TODO */: - prefix = "2"; - break; - case "DONE" /* DONE */: - prefix = "3"; - break; - case "CANCELLED" /* CANCELLED */: - prefix = "4"; - break; - case "NON_TASK" /* NON_TASK */: - prefix = "5"; - break; - case "EMPTY" /* EMPTY */: - prefix = "6"; - break; - } - return prefix + " " + task.status.type; - } -}; - -// src/Query/Filter/RecurrenceField.ts -var RecurrenceField = class extends TextField { - fieldName() { - return "recurrence"; - } - value(task) { - if (task.recurrence !== null) { - return task.recurrence.toText(); - } else { - return ""; - } - } -}; - -// src/Query/FilterParser.ts -var fieldCreators = [ - () => new StatusNameField(), - () => new StatusTypeField(), - () => new StatusField(), - () => new RecurringField(), - () => new PriorityField(), - () => new HappensDateField(), - () => new StartDateField(), - () => new ScheduledDateField(), - () => new DueDateField(), - () => new DoneDateField(), - () => new PathField(), - () => new DescriptionField(), - () => new TagsField(), - () => new HeadingField(), - () => new ExcludeSubItemsField(), - () => new BooleanField(), - () => new FilenameField(), - () => new UrgencyField(), - () => new RecurrenceField() -]; -function parseFilter(filterString) { - for (const creator of fieldCreators) { - const field = creator(); - if (field.canCreateFilterForLine(filterString)) - return field.createFilterOrErrorMessage(filterString); - } - return null; -} -function parseSorter(sorterString) { - const sortByRegexp = /^sort by /; - if (sorterString.match(sortByRegexp) === null) { - return null; - } - for (const creator of fieldCreators) { - const field = creator(); - const sorter = field.parseSortLine(sorterString); - if (sorter) { - return sorter; - } - } - return null; -} -function parseGrouper(line) { - const groupByRegexp = /^group by /; - if (line.match(groupByRegexp) === null) { - return null; - } - for (const creator of fieldCreators) { - const field = creator(); - const fieldName = field.fieldNameSingular(); - if (line === `group by ${fieldName}`) { - if (field.supportsGrouping()) { - return field.createGrouper(); - } - } - } - return null; -} - -// src/Query/GroupHeading.ts -var GroupHeading = class { - constructor(nestingLevel, name) { - this.nestingLevel = nestingLevel; - this.name = name; - } -}; - -// src/Query/GroupHeadings.ts -var GroupHeadings = class { - constructor(groupedTasks) { - this.lastHeadingAtLevel = new Array(); - const firstGroup = groupedTasks.keys().next().value; - const groupCount = firstGroup.length; - for (let i = 0; i < groupCount; i++) { - this.lastHeadingAtLevel.push(""); - } - } - getHeadingsForTaskGroup(groupNames) { - const headingsForGroup = new Array(); - for (let level = 0; level < groupNames.length; level++) { - const group = groupNames[level]; - if (group != this.lastHeadingAtLevel[level]) { - headingsForGroup.push(new GroupHeading(level, group)); - for (let j = level; j < groupNames.length; j++) { - this.lastHeadingAtLevel[j] = ""; - } - this.lastHeadingAtLevel[level] = group; - } - } - return headingsForGroup; - } -}; - -// src/Query/GroupingTreeNode.ts -var GroupingTreeNode = class { - constructor(values) { - this.children = /* @__PURE__ */ new Map(); - this.values = []; - this.values = values; - } - generateAllPaths(pathSoFar = []) { - const resultMap = /* @__PURE__ */ new Map(); - if (this.children.size == 0) { - resultMap.set([...pathSoFar], this.values); - return resultMap; - } - for (const [property, child] of this.children) { - pathSoFar.push(property); - const childResult = child.generateAllPaths(pathSoFar); - childResult.forEach((value, key) => resultMap.set(key, value)); - pathSoFar.pop(); - } - return resultMap; - } -}; - -// src/Query/IntermediateTaskGroups.ts -var IntermediateTaskGroupsStorage = class extends Map { -}; -var TaskGroupingTreeNode = class extends GroupingTreeNode { -}; -var IntermediateTaskGroups = class { - constructor(groupings, tasks) { - this.groups = new IntermediateTaskGroupsStorage(); - const tree = this.buildGroupingTree(groupings, tasks); - this.groups = tree.generateAllPaths(); - this.groups = this.getSortedGroups(); - } - buildGroupingTree(groupings, tasks) { - const root = new TaskGroupingTreeNode(tasks); - let currentTreeLevel = [root]; - for (const grouping of groupings) { - const nextTreeLevel = []; - for (const currentTreeNode of currentTreeLevel) { - for (const task of currentTreeNode.values) { - const groupNames = Group.getGroupNamesForTask(grouping, task); - for (const groupName of groupNames) { - let child = currentTreeNode.children.get(groupName); - if (child === void 0) { - child = new TaskGroupingTreeNode([]); - currentTreeNode.children.set(groupName, child); - nextTreeLevel.push(child); - } - child.values.push(task); - } - } - } - currentTreeLevel = nextTreeLevel; - } - return root; - } - getSortedGroups() { - return new IntermediateTaskGroupsStorage([...this.groups.entries()].sort()); - } -}; - -// src/Query/TaskGroup.ts -var TaskGroup = class { - constructor(groups, groupHeadings, tasks) { - this.groups = groups; - this.groupHeadings = groupHeadings; - this.tasks = tasks; - } - tasksAsStringOfLines() { - let output = ""; - for (const task of this.tasks) { - output += task.toFileLineString() + "\n"; - } - return output; - } - toString() { - let output = "\n"; - output += `Group names: [${this.groups}] -`; - for (const heading of this.groupHeadings) { - const headingPrefix = "#".repeat(4 + heading.nestingLevel); - output += `${headingPrefix} ${heading.name} -`; - } - output += this.tasksAsStringOfLines(); - return output; - } -}; - -// src/Query/TaskGroups.ts -var TaskGroups = class { - constructor(groups, tasks) { - this._groups = new Array(); - this._totalTaskCount = 0; - this._totalTaskCount = tasks.length; - const initialGroups = new IntermediateTaskGroups(groups, tasks); - this.addTasks(initialGroups); - } - get groups() { - return this._groups; - } - totalTasksCount() { - return this._totalTaskCount; - } - toString() { - let output = ""; - for (const taskGroup of this.groups) { - output += taskGroup.toString(); - output += "\n---\n"; - } - const totalTasksCount = this.totalTasksCount(); - output += ` -${totalTasksCount} tasks -`; - return output; - } - addTasks(initialGroups) { - const grouper = new GroupHeadings(initialGroups.groups); - for (const [groups, tasks] of initialGroups.groups) { - const groupHeadings = grouper.getHeadingsForTaskGroup(groups); - const taskGroup = new TaskGroup(groups, groupHeadings, tasks); - this.add(taskGroup); - } - } - add(taskGroup) { - this._groups.push(taskGroup); - } -}; - -// src/Query/Group.ts -var _Group = class { - static fromGroupingProperty(property) { - return new Grouper(property, _Group.grouperForProperty(property)); - } - static by(grouping, tasks) { - return new TaskGroups(grouping, tasks); - } - static getGroupNamesForTask(grouping, task) { - return grouping.grouper(task); - } - static grouperForProperty(property) { - return _Group.groupers[property]; - } - static escapeMarkdownCharacters(filename) { - return filename.replace(/\\/g, "\\\\").replace(/_/g, "\\_"); - } - static groupByPriority(task) { - let priorityName = "ERROR"; - switch (task.priority) { - case "1" /* High */: - priorityName = "High"; - break; - case "2" /* Medium */: - priorityName = "Medium"; - break; - case "3" /* None */: - priorityName = "None"; - break; - case "4" /* Low */: - priorityName = "Low"; - break; - } - return [`Priority ${task.priority}: ${priorityName}`]; - } - static groupByRecurrence(task) { - if (task.recurrence !== null) { - return [task.recurrence.toText()]; - } else { - return ["None"]; - } - } - static groupByRecurring(task) { - if (task.recurrence !== null) { - return ["Recurring"]; - } else { - return ["Not Recurring"]; - } - } - static groupByStartDate(task) { - return [_Group.stringFromDate(task.startDate, "start")]; - } - static groupByScheduledDate(task) { - return [_Group.stringFromDate(task.scheduledDate, "scheduled")]; - } - static groupByDueDate(task) { - return [_Group.stringFromDate(task.dueDate, "due")]; - } - static groupByDoneDate(task) { - return [_Group.stringFromDate(task.doneDate, "done")]; - } - static groupByHappensDate(task) { - const earliestDateIfAny = new HappensDateField().earliestDate(task); - return [_Group.stringFromDate(earliestDateIfAny, "happens")]; - } - static stringFromDate(date, field) { - if (date === null) { - return "No " + field + " date"; - } - return date.format(_Group.groupDateFormat); - } - static groupByPath(task) { - return [_Group.escapeMarkdownCharacters(task.path.replace(".md", ""))]; - } - static groupByFolder(task) { - const path = task.path; - const fileNameWithExtension = task.filename + ".md"; - const folder = path.substring(0, path.lastIndexOf(fileNameWithExtension)); - if (folder === "") { - return ["/"]; - } - return [_Group.escapeMarkdownCharacters(folder)]; - } - static groupByFileName(task) { - const filename = task.filename; - if (filename === null) { - return ["Unknown Location"]; - } - return ["[[" + _Group.escapeMarkdownCharacters(filename) + "]]"]; - } - static groupByRoot(task) { - const path = task.path.replace(/\\/g, "/"); - const separatorIndex = path.indexOf("/"); - if (separatorIndex == -1) { - return ["/"]; - } - return [_Group.escapeMarkdownCharacters(path.substring(0, separatorIndex + 1))]; - } - static groupByBacklink(task) { - const linkText = task.getLinkText({ isFilenameUnique: true }); - if (linkText === null) { - return ["Unknown Location"]; - } - let filenameComponent = "Unknown Location"; - if (task.filename !== null) { - filenameComponent = _Group.escapeMarkdownCharacters(task.filename); - } - if (task.precedingHeader === null || task.precedingHeader.length === 0) { - return [filenameComponent]; - } - const headingComponent = _Group.groupByHeading(task)[0]; - if (filenameComponent === headingComponent) { - return [filenameComponent]; - } else { - return [`${filenameComponent} > ${headingComponent}`]; - } - } - static groupByStatus(task) { - if (task.status.symbol === " ") { - return ["Todo"]; - } else { - return ["Done"]; - } - } - static groupByHeading(task) { - if (task.precedingHeader === null || task.precedingHeader.length === 0) { - return ["(No heading)"]; - } - return [task.precedingHeader]; - } - static groupByTags(task) { - if (task.tags.length == 0) { - return ["(No tags)"]; - } - return task.tags; - } -}; -var Group = _Group; -Group.groupDateFormat = "YYYY-MM-DD dddd"; -Group.groupers = { - backlink: _Group.groupByBacklink, - done: _Group.groupByDoneDate, - due: _Group.groupByDueDate, - filename: _Group.groupByFileName, - folder: _Group.groupByFolder, - happens: _Group.groupByHappensDate, - heading: _Group.groupByHeading, - path: _Group.groupByPath, - priority: _Group.groupByPriority, - recurrence: _Group.groupByRecurrence, - recurring: _Group.groupByRecurring, - root: _Group.groupByRoot, - scheduled: _Group.groupByScheduledDate, - start: _Group.groupByStartDate, - status: _Group.groupByStatus, - tags: _Group.groupByTags -}; - -// src/Query/Query.ts -var Query = class { - constructor({ source }) { - this._limit = void 0; - this._layoutOptions = new LayoutOptions(); - this._filters = []; - this._error = void 0; - this._sorting = []; - this._grouping = []; - this.groupByRegexp = /^group by (backlink|done|due|filename|folder|happens|heading|path|priority|recurrence|recurring|root|scheduled|start|status|tags)/; - this.hideOptionsRegexp = /^(hide|show) (task count|backlink|priority|start date|scheduled date|done date|due date|recurrence rule|edit button|urgency)/; - this.shortModeRegexp = /^short/; - this.explainQueryRegexp = /^explain/; - this.limitRegexp = /^limit (to )?(\d+)( tasks?)?/; - this.commentRegexp = /^#.*/; - this.source = source; - source.split("\n").map((line) => line.trim()).forEach((line) => { - switch (true) { - case line === "": - break; - case this.shortModeRegexp.test(line): - this._layoutOptions.shortMode = true; - break; - case this.explainQueryRegexp.test(line): - this._layoutOptions.explainQuery = true; - break; - case this.limitRegexp.test(line): - this.parseLimit({ line }); - break; - case this.parseSortBy({ line }): - break; - case this.parseGroupBy2({ line }): - break; - case this.groupByRegexp.test(line): - this.parseGroupBy({ line }); - break; - case this.hideOptionsRegexp.test(line): - this.parseHideOptions({ line }); - break; - case this.commentRegexp.test(line): - break; - case this.parseFilter(line): - break; - default: - this._error = `do not understand query: ${line}`; - } - }); - } - explainQuery() { - return "Explanation of this Tasks code block query:\n\n" + this.explainQueryWithoutIntroduction(); - } - explainQueryWithoutIntroduction() { - let result = ""; - const { globalFilter } = getSettings(); - if (globalFilter.length !== 0) { - result += `Only tasks containing the global filter '${globalFilter}'. - -`; - } - const numberOfFilters = this.filters.length; - if (numberOfFilters === 0) { - result += "No filters supplied. All tasks will match the query."; - } else { - for (let i = 0; i < numberOfFilters; i++) { - if (i > 0) - result += "\n"; - result += this.filters[i].explainFilterIndented(""); - } - } - if (this._limit !== void 0) { - result += ` - -At most ${this._limit} task`; - if (this._limit !== 1) { - result += "s"; - } - result += ".\n"; - } - return result; - } - get limit() { - return this._limit; - } - get layoutOptions() { - return this._layoutOptions; - } - get filters() { - return this._filters; - } - get sorting() { - return this._sorting; - } - get grouping() { - return this._grouping; - } - get error() { - return this._error; - } - applyQueryToTasks(tasks) { - this.filters.forEach((filter) => { - tasks = tasks.filter(filter.filterFunction); - }); - const tasksSortedLimited = Sort.by(this.sorting, tasks).slice(0, this.limit); - return Group.by(this.grouping, tasksSortedLimited); - } - parseHideOptions({ line }) { - const hideOptionsMatch = line.match(this.hideOptionsRegexp); - if (hideOptionsMatch !== null) { - const hide = hideOptionsMatch[1] === "hide"; - const option = hideOptionsMatch[2]; - switch (option) { - case "task count": - this._layoutOptions.hideTaskCount = hide; - break; - case "backlink": - this._layoutOptions.hideBacklinks = hide; - break; - case "priority": - this._layoutOptions.hidePriority = hide; - break; - case "start date": - this._layoutOptions.hideStartDate = hide; - break; - case "scheduled date": - this._layoutOptions.hideScheduledDate = hide; - break; - case "due date": - this._layoutOptions.hideDueDate = hide; - break; - case "done date": - this._layoutOptions.hideDoneDate = hide; - break; - case "recurrence rule": - this._layoutOptions.hideRecurrenceRule = hide; - break; - case "edit button": - this._layoutOptions.hideEditButton = hide; - break; - case "urgency": - this._layoutOptions.hideUrgency = hide; - break; - default: - this._error = "do not understand hide/show option"; - } - } - } - parseFilter(line) { - const filterOrError = parseFilter(line); - if (filterOrError != null) { - if (filterOrError.filter) - this._filters.push(filterOrError.filter); - else - this._error = filterOrError.error; - return true; - } - return false; - } - parseLimit({ line }) { - const limitMatch = line.match(this.limitRegexp); - if (limitMatch !== null) { - this._limit = Number.parseInt(limitMatch[2], 10); - } else { - this._error = "do not understand query limit"; - } - } - parseSortBy({ line }) { - const sortingMaybe = parseSorter(line); - if (sortingMaybe) { - this._sorting.push(sortingMaybe); - return true; - } - return false; - } - parseGroupBy({ line }) { - const fieldMatch = line.match(this.groupByRegexp); - if (fieldMatch !== null) { - this._grouping.push(Group.fromGroupingProperty(fieldMatch[1])); - } else { - this._error = "do not understand query grouping"; - } - } - parseGroupBy2({ line }) { - const groupingMaybe = parseGrouper(line); - if (groupingMaybe) { - this._grouping.push(groupingMaybe); - return true; - } - return false; - } -}; - -// src/QueryRenderer.ts -var QueryRenderer = class { - constructor({ plugin, events }) { - this.addQueryRenderChild = this._addQueryRenderChild.bind(this); - this.app = plugin.app; - this.events = events; - plugin.registerMarkdownCodeBlockProcessor("tasks", this._addQueryRenderChild.bind(this)); - } - _addQueryRenderChild(source, element2, context) { - return __async(this, null, function* () { - context.addChild( - new QueryRenderChild({ - app: this.app, - events: this.events, - container: element2, - source, - filePath: context.sourcePath - }) - ); - }); - } -}; -var QueryRenderChild = class extends import_obsidian8.MarkdownRenderChild { - constructor({ - app, - events, - container, - source, - filePath - }) { - super(container); - this.app = app; - this.events = events; - this.source = source; - this.filePath = filePath; - switch (this.containerEl.className) { - case "block-language-tasks": - this.query = new Query({ source }); - this.queryType = "tasks"; - break; - default: - this.query = new Query({ source }); - this.queryType = "tasks"; - break; - } - } - onload() { - this.events.triggerRequestCacheUpdate(this.render.bind(this)); - this.renderEventRef = this.events.onCacheUpdate(this.render.bind(this)); - this.reloadQueryAtMidnight(); - } - onunload() { - if (this.renderEventRef !== void 0) { - this.events.off(this.renderEventRef); - } - if (this.queryReloadTimeout !== void 0) { - clearTimeout(this.queryReloadTimeout); - } - } - reloadQueryAtMidnight() { - const midnight = new Date(); - midnight.setHours(24, 0, 0, 0); - const now = new Date(); - const millisecondsToMidnight = midnight.getTime() - now.getTime(); - this.queryReloadTimeout = setTimeout(() => { - this.query = new Query({ source: this.source }); - this.events.triggerRequestCacheUpdate(this.render.bind(this)); - this.reloadQueryAtMidnight(); - }, millisecondsToMidnight + 1e3); - } - render(_0) { - return __async(this, arguments, function* ({ tasks, state }) { - var _a; - const content = this.containerEl.createEl("div"); - if (state === "Warm" /* Warm */ && this.query.error === void 0) { - console.debug( - `Render ${this.queryType} called for a block in active file "${this.filePath}", to select from ${tasks.length} tasks: plugin state: ${state}` - ); - if (this.query.layoutOptions.explainQuery) { - this.createExplanation(content); - } - const tasksSortedLimitedGrouped = this.query.applyQueryToTasks(tasks); - for (const group of tasksSortedLimitedGrouped.groups) { - this.addGroupHeadings(content, group.groupHeadings); - const { taskList } = yield this.createTasksList({ - tasks: group.tasks, - content - }); - content.appendChild(taskList); - } - const totalTasksCount = tasksSortedLimitedGrouped.totalTasksCount(); - console.debug(`${totalTasksCount} of ${tasks.length} tasks displayed in a block in "${this.filePath}"`); - this.addTaskCount(content, totalTasksCount); - } else if (this.query.error !== void 0) { - content.createDiv().innerHTML = `
Tasks query: ${this.query.error.replace(/\n/g, "
")}
`; - } else { - content.setText("Loading Tasks ..."); - } - (_a = this.containerEl.firstChild) == null ? void 0 : _a.replaceWith(content); - }); - } - createExplanation(content) { - const explanationAsString = this.query.explainQuery(); - const explanationsBlock = content.createEl("pre"); - explanationsBlock.addClasses(["plugin-tasks-query-explanation"]); - explanationsBlock.setText(explanationAsString); - content.appendChild(explanationsBlock); - } - createTasksList(_0) { - return __async(this, arguments, function* ({ - tasks, - content - }) { - const tasksCount = tasks.length; - const layout = new TaskLayout(this.query.layoutOptions); - const taskList = content.createEl("ul"); - taskList.addClasses(["contains-task-list", "plugin-tasks-query-result"]); - taskList.addClasses(layout.specificClasses); - const groupingAttribute = this.getGroupingAttribute(); - if (groupingAttribute && groupingAttribute.length > 0) - taskList.dataset.taskGroupBy = groupingAttribute; - for (let i = 0; i < tasksCount; i++) { - const task = tasks[i]; - const isFilenameUnique = this.isFilenameUnique({ task }); - const listItem = yield task.toLi({ - parentUlElement: taskList, - listIndex: i, - layoutOptions: this.query.layoutOptions, - isFilenameUnique, - taskLayout: layout - }); - const footnotes = listItem.querySelectorAll("[data-footnote-id]"); - footnotes.forEach((footnote) => footnote.remove()); - const shortMode = this.query.layoutOptions.shortMode; - const extrasSpan = listItem.createSpan("task-extras"); - if (!this.query.layoutOptions.hideUrgency) { - this.addUrgency(extrasSpan, task); - } - if (!this.query.layoutOptions.hideBacklinks) { - this.addBacklinks(extrasSpan, task, shortMode, isFilenameUnique); - } - if (!this.query.layoutOptions.hideEditButton) { - this.addEditButton(extrasSpan, task); - } - taskList.appendChild(listItem); - } - return { taskList, tasksCount }; - }); - } - addEditButton(listItem, task) { - const editTaskPencil = listItem.createEl("a", { - cls: "tasks-edit" - }); - editTaskPencil.onClickEvent((event) => { - event.preventDefault(); - const onSubmit = (updatedTasks) => { - replaceTaskWithTasks({ - originalTask: task, - newTasks: DateFallback.removeInferredStatusIfNeeded(task, updatedTasks) - }); - }; - const taskModal = new TaskModal({ - app: this.app, - task, - onSubmit - }); - taskModal.open(); - }); - } - addUrgency(listItem, task) { - const text2 = new Intl.NumberFormat().format(task.urgency); - listItem.createSpan({ text: text2, cls: "tasks-urgency" }); - } - addGroupHeadings(content, groupHeadings) { - for (const heading of groupHeadings) { - this.addGroupHeading(content, heading); - } - } - addGroupHeading(content, group) { - return __async(this, null, function* () { - let header; - if (group.nestingLevel === 0) { - header = content.createEl("h4", { - cls: "tasks-group-heading" - }); - } else if (group.nestingLevel === 1) { - header = content.createEl("h5", { - cls: "tasks-group-heading" - }); - } else { - header = content.createEl("h6", { - cls: "tasks-group-heading" - }); - } - yield import_obsidian8.MarkdownRenderer.renderMarkdown(group.name, header, this.filePath, this); - }); - } - addBacklinks(listItem, task, shortMode, isFilenameUnique) { - var _a; - const backLink = listItem.createSpan({ cls: "tasks-backlink" }); - if (!shortMode) { - backLink.append(" ("); - } - const link = backLink.createEl("a"); - link.href = task.path; - link.setAttribute("data-href", task.path); - link.rel = "noopener"; - link.target = "_blank"; - link.addClass("internal-link"); - if (shortMode) { - link.addClass("internal-link-short-mode"); - } - if (task.precedingHeader !== null) { - const sanitisedHeading = task.precedingHeader.replace(/#/g, ""); - link.href = link.href + "#" + sanitisedHeading; - link.setAttribute("data-href", link.getAttribute("data-href") + "#" + sanitisedHeading); - } - let linkText; - if (shortMode) { - linkText = " \u{1F517}"; - } else { - linkText = (_a = task.getLinkText({ isFilenameUnique })) != null ? _a : ""; - } - link.setText(linkText); - if (!shortMode) { - backLink.append(")"); - } - } - addTaskCount(content, tasksCount) { - if (!this.query.layoutOptions.hideTaskCount) { - content.createDiv({ - text: `${tasksCount} task${tasksCount !== 1 ? "s" : ""}`, - cls: "tasks-count" - }); - } - } - isFilenameUnique({ task }) { - const filenameMatch = task.path.match(/([^/]*)\..+$/i); - if (filenameMatch === null) { - return void 0; - } - const filename = filenameMatch[1]; - const allFilesWithSameName = this.app.vault.getMarkdownFiles().filter((file) => { - if (file.basename === filename) { - return true; - } - }); - return allFilesWithSameName.length < 2; - } - getGroupingAttribute() { - const groupingRules = []; - for (const group of this.query.grouping) { - groupingRules.push(group.property); - } - return groupingRules.join(","); - } -}; - -// src/Config/SettingsTab.ts -var import_obsidian10 = require("obsidian"); - -// src/Config/Themes/AnuPpuccinThemeCollection.ts -function anuppuccinSupportedStatuses() { - const zzz = [ - [" ", "Unchecked", "x", "TODO"], - ["x", "Checked", " ", "DONE"], - [">", "Rescheduled", "x", "TODO"], - ["<", "Scheduled", "x", "TODO"], - ["!", "Important", "x", "TODO"], - ["-", "Cancelled", " ", "CANCELLED"], - ["/", "In Progress", "x", "IN_PROGRESS"], - ["?", "Question", "x", "TODO"], - ["*", "Star", "x", "TODO"], - ["n", "Note", "x", "TODO"], - ["l", "Location", "x", "TODO"], - ["i", "Information", "x", "TODO"], - ["I", "Idea", "x", "TODO"], - ["S", "Amount", "x", "TODO"], - ["p", "Pro", "x", "TODO"], - ["c", "Con", "x", "TODO"], - ["b", "Bookmark", "x", "TODO"], - ['"', "Quote", "x", "TODO"], - ["0", "Speech bubble 0", "0", "NON_TASK"], - ["1", "Speech bubble 1", "1", "NON_TASK"], - ["2", "Speech bubble 2", "2", "NON_TASK"], - ["3", "Speech bubble 3", "3", "NON_TASK"], - ["4", "Speech bubble 4", "4", "NON_TASK"], - ["5", "Speech bubble 5", "5", "NON_TASK"], - ["6", "Speech bubble 6", "6", "NON_TASK"], - ["7", "Speech bubble 7", "7", "NON_TASK"], - ["8", "Speech bubble 8", "8", "NON_TASK"], - ["9", "Speech bubble 9", "9", "NON_TASK"] - ]; - return zzz; -} - -// src/Config/Themes/AuraThemeCollection.ts -function auraSupportedStatuses() { - const zzz = [ - [" ", "incomplete", "x", "TODO"], - ["x", "complete / done", " ", "DONE"], - ["-", "cancelled", " ", "CANCELLED"], - [">", "deferred", "x", "TODO"], - ["/", "in progress, or half-done", "x", "IN_PROGRESS"], - ["!", "Important", "x", "TODO"], - ["?", "question", "x", "TODO"], - ["R", "review", "x", "TODO"], - ["+", "Inbox / task that should be processed later", "x", "TODO"], - ["b", "bookmark", "x", "TODO"], - ["B", "brainstorm", "x", "TODO"], - ["D", "deferred or scheduled", "x", "TODO"], - ["I", "Info", "x", "TODO"], - ["i", "idea", "x", "TODO"], - ["N", "note", "x", "TODO"], - ["Q", "quote", "x", "TODO"], - ["W", "win / success / reward", "x", "TODO"], - ["P", "pro", "x", "TODO"], - ["C", "con", "x", "TODO"] - ]; - return zzz; -} - -// src/Config/Themes/EbullientworksThemeCollection.ts -function ebullientworksSupportedStatuses() { - const zzz = [ - [" ", "Unchecked", "x", "TODO"], - ["x", "Checked", " ", "DONE"], - ["-", "Cancelled", " ", "CANCELLED"], - ["/", "In Progress", "x", "IN_PROGRESS"], - [">", "Deferred", "x", "TODO"], - ["!", "Important", "x", "TODO"], - ["?", "Question", "x", "TODO"], - ["r", "Review", "x", "TODO"] - ]; - return zzz; -} - -// src/Config/Themes/ITSThemeCollection.ts -function itsSupportedStatuses() { - const zzz = [ - [" ", "Unchecked", "x", "TODO"], - ["x", "Regular", " ", "DONE"], - ["X", "Checked", " ", "DONE"], - ["-", "Dropped", " ", "CANCELLED"], - [">", "Forward", "x", "TODO"], - ["D", "Date", "x", "TODO"], - ["?", "Question", "x", "TODO"], - ["/", "Half Done", "x", "IN_PROGRESS"], - ["+", "Add", "x", "TODO"], - ["R", "Research", "x", "TODO"], - ["!", "Important", "x", "TODO"], - ["i", "Idea", "x", "TODO"], - ["B", "Brainstorm", "x", "TODO"], - ["P", "Pro", "x", "TODO"], - ["C", "Con", "x", "TODO"], - ["Q", "Quote", "x", "TODO"], - ["N", "Note", "x", "TODO"], - ["b", "Bookmark", "x", "TODO"], - ["I", "Information", "x", "TODO"], - ["p", "Paraphrase", "x", "TODO"], - ["L", "Location", "x", "TODO"], - ["E", "Example", "x", "TODO"], - ["A", "Answer", "x", "TODO"], - ["r", "Reward", "x", "TODO"], - ["c", "Choice", "x", "TODO"], - ["d", "Doing", "x", "IN_PROGRESS"], - ["T", "Time", "x", "TODO"], - ["@", "Character / Person", "x", "TODO"], - ["t", "Talk", "x", "TODO"], - ["O", "Outline / Plot", "x", "TODO"], - ["~", "Conflict", "x", "TODO"], - ["W", "World", "x", "TODO"], - ["f", "Clue / Find", "x", "TODO"], - ["F", "Foreshadow", "x", "TODO"], - ["H", "Favorite / Health", "x", "TODO"], - ["&", "Symbolism", "x", "TODO"], - ["s", "Secret", "x", "TODO"] - ]; - return zzz; -} - -// src/Config/Themes/MinimalThemeCollection.ts -function minimalSupportedStatuses() { - const zzz = [ - [" ", "to-do", "x", "TODO"], - ["/", "incomplete", "x", "IN_PROGRESS"], - ["x", "done", " ", "DONE"], - ["-", "canceled", " ", "CANCELLED"], - [">", "forwarded", "x", "TODO"], - ["<", "scheduling", "x", "TODO"], - ["?", "question", "x", "TODO"], - ["!", "important", "x", "TODO"], - ["*", "star", "x", "TODO"], - ['"', "quote", "x", "TODO"], - ["l", "location", "x", "TODO"], - ["b", "bookmark", "x", "TODO"], - ["i", "information", "x", "TODO"], - ["S", "savings", "x", "TODO"], - ["I", "idea", "x", "TODO"], - ["p", "pros", "x", "TODO"], - ["c", "cons", "x", "TODO"], - ["f", "fire", "x", "TODO"], - ["k", "key", "x", "TODO"], - ["w", "win", "x", "TODO"], - ["u", "up", "x", "TODO"], - ["d", "down", "x", "TODO"] - ]; - return zzz; -} - -// src/Config/Themes/ThingsThemeCollection.ts -function thingsSupportedStatuses() { - const zzz = [ - [" ", "to-do", "x", "TODO"], - ["/", "incomplete", "x", "IN_PROGRESS"], - ["x", "done", " ", "DONE"], - ["-", "canceled", " ", "CANCELLED"], - [">", "forwarded", "x", "TODO"], - ["<", "scheduling", "x", "TODO"], - ["?", "question", "x", "TODO"], - ["!", "important", "x", "TODO"], - ["*", "star", "x", "TODO"], - ['"', "quote", "x", "TODO"], - ["l", "location", "x", "TODO"], - ["b", "bookmark", "x", "TODO"], - ["i", "information", "x", "TODO"], - ["S", "savings", "x", "TODO"], - ["I", "idea", "x", "TODO"], - ["p", "pros", "x", "TODO"], - ["c", "cons", "x", "TODO"], - ["f", "fire", "x", "TODO"], - ["k", "key", "x", "TODO"], - ["w", "win", "x", "TODO"], - ["u", "up", "x", "TODO"], - ["d", "down", "x", "TODO"] - ]; - return zzz; -} - -// src/Config/settingsConfiguration.json -var settingsConfiguration_default = [ - { - text: "Core Statuses", - level: "h3", - class: "", - open: true, - notice: { - class: "setting-item-description", - text: null, - html: "

These are the core statuses that Tasks supports natively, with no need for custom CSS styling or theming.

You can add edit and add your own custom statuses in the section below.

" - }, - settings: [ - { - name: "", - description: "", - type: "function", - initialValue: "", - placeholder: "", - settingName: "insertTaskCoreStatusSettings", - featureFlag: "", - notice: null - } - ] - }, - { - text: "Custom Statuses", - level: "h3", - class: "", - open: true, - notice: { - class: "setting-item-description", - text: null, - html: `

You should first select and install a CSS Snippet or Theme to style custom checkboxes.

Then, use the buttons below to set up your custom statuses, to match your chosen CSS checkboxes.

Note Any statuses with the same symbol as any earlier statuses will be ignored. You can confirm the actually loaded statuses by running the 'Create or edit task' command and looking at the Status drop-down.

See the documentation to get started!

` - }, - settings: [ - { - name: "", - description: "", - type: "function", - initialValue: "", - placeholder: "", - settingName: "insertCustomTaskStatusSettings", - featureFlag: "", - notice: null - } - ] - } -]; - -// src/Config/CustomStatusModal.ts -var import_obsidian9 = require("obsidian"); - -// src/StatusValidator.ts -var StatusValidator = class { - validate(statusConfiguration) { - const errors = []; - errors.push(...this.validateSymbol(statusConfiguration)); - errors.push(...this.validateName(statusConfiguration)); - errors.push(...this.validateNextSymbol(statusConfiguration)); - return errors; - } - validateStatusCollectionEntry(entry) { - const [symbol, _name, nextStatusSymbol, typeAsString] = entry; - const errors = []; - errors.push(...this.validateType(typeAsString)); - if (symbol === nextStatusSymbol && typeAsString !== "NON_TASK") { - errors.push(`Status symbol '${symbol}' toggles to itself`); - } - if (errors.length > 0) { - return errors; - } - const configuration = Status.createFromImportedValue(entry).configuration; - errors.push(...this.validateSymbolTypeConventions(configuration)); - errors.push(...this.validate(configuration)); - return errors; - } - validateSymbol(statusConfiguration) { - return StatusValidator.validateOneSymbol(statusConfiguration.symbol, "Task Status Symbol"); - } - validateNextSymbol(statusConfiguration) { - return StatusValidator.validateOneSymbol(statusConfiguration.nextStatusSymbol, "Task Next Status Symbol"); - } - validateName(statusConfiguration) { - const errors = []; - if (statusConfiguration.name.length === 0) { - errors.push("Task Status Name cannot be empty."); - } - return errors; - } - validateType(symbolName) { - const statusTypeElement = StatusType[symbolName]; - const errors = []; - if (!statusTypeElement) { - errors.push(`Status Type "${symbolName}" is not a valid type`); - } - if (statusTypeElement == "EMPTY" /* EMPTY */) { - errors.push('Status Type "EMPTY" is not permitted in user data'); - } - return errors; - } - validateSymbolTypeConventions(configuration) { - const errors = []; - const symbol = configuration.symbol; - const registry = new StatusRegistry(); - const symbolToSearchFor = symbol === "X" ? "x" : symbol; - const defaultStatusFromRegistry = registry.bySymbol(symbolToSearchFor); - if (defaultStatusFromRegistry.type !== "EMPTY" /* EMPTY */) { - if (configuration.nextStatusSymbol !== defaultStatusFromRegistry.nextStatusSymbol) { - errors.push( - `Next Status Symbol for symbol '${symbol}': '${configuration.nextStatusSymbol}' is inconsistent with convention '${defaultStatusFromRegistry.nextStatusSymbol}'` - ); - } - if (configuration.type !== defaultStatusFromRegistry.type) { - errors.push( - `Status Type for symbol '${symbol}': '${configuration.type}' is inconsistent with convention '${defaultStatusFromRegistry.type}'` - ); - } - } - return errors; - } - static validateOneSymbol(symbol, symbolName) { - const errors = []; - if (symbol.length === 0) { - errors.push(`${symbolName} cannot be empty.`); - } - if (symbol.length > 1) { - errors.push(`${symbolName} ("${symbol}") must be a single character.`); - } - return errors; - } -}; - -// src/Config/CustomStatusModal.ts -var validator = new StatusValidator(); -var CustomStatusModal = class extends import_obsidian9.Modal { - constructor(plugin, statusType, isCoreStatus) { - super(plugin.app); - this.plugin = plugin; - this.saved = false; - this.error = false; - this.statusSymbol = statusType.symbol; - this.statusName = statusType.name; - this.statusNextSymbol = statusType.nextStatusSymbol; - this.statusAvailableAsCommand = statusType.availableAsCommand; - this.type = statusType.type; - this.isCoreStatus = isCoreStatus; - } - statusConfiguration() { - return new StatusConfiguration( - this.statusSymbol, - this.statusName, - this.statusNextSymbol, - this.statusAvailableAsCommand, - this.type - ); - } - display() { - return __async(this, null, function* () { - const { contentEl } = this; - contentEl.empty(); - const settingDiv = contentEl.createDiv(); - let statusSymbolText; - new import_obsidian9.Setting(settingDiv).setName("Task Status Symbol").setDesc( - "This is the character between the square braces. (It can only be edited for Custom statuses, and not Core statuses.)" - ).addText((text2) => { - statusSymbolText = text2; - text2.setValue(this.statusSymbol).onChange((v) => { - this.statusSymbol = v; - CustomStatusModal.setValid(text2, validator.validateSymbol(this.statusConfiguration())); - }); - }).setDisabled(this.isCoreStatus).then((_setting) => { - CustomStatusModal.setValid(statusSymbolText, validator.validateSymbol(this.statusConfiguration())); - }); - let statusNameText; - new import_obsidian9.Setting(settingDiv).setName("Task Status Name").setDesc("This is the friendly name of the task status.").addText((text2) => { - statusNameText = text2; - text2.setValue(this.statusName).onChange((v) => { - this.statusName = v; - CustomStatusModal.setValid(text2, validator.validateName(this.statusConfiguration())); - }); - }).then((_setting) => { - CustomStatusModal.setValid(statusNameText, validator.validateName(this.statusConfiguration())); - }); - let statusNextSymbolText; - new import_obsidian9.Setting(settingDiv).setName("Task Next Status Symbol").setDesc("When clicked on this is the symbol that should be used next.").addText((text2) => { - statusNextSymbolText = text2; - text2.setValue(this.statusNextSymbol).onChange((v) => { - this.statusNextSymbol = v; - CustomStatusModal.setValid(text2, validator.validateNextSymbol(this.statusConfiguration())); - }); - }).then((_setting) => { - CustomStatusModal.setValid( - statusNextSymbolText, - validator.validateNextSymbol(this.statusConfiguration()) - ); - }); - new import_obsidian9.Setting(settingDiv).setName("Task Status Type").setDesc("Control how the status behaves for searching and toggling.").addDropdown((dropdown) => { - const types = [ - "TODO" /* TODO */, - "IN_PROGRESS" /* IN_PROGRESS */, - "DONE" /* DONE */, - "CANCELLED" /* CANCELLED */, - "NON_TASK" /* NON_TASK */ - ]; - types.forEach((s) => { - dropdown.addOption(s, s); - }); - dropdown.setValue(this.type).onChange((v) => { - this.type = Status.getTypeFromStatusTypeString(v); - }); - }); - if (Status.tasksPluginCanCreateCommandsForStatuses()) { - new import_obsidian9.Setting(settingDiv).setName("Available as command").setDesc( - "If enabled this status will be available as a command so you can assign a hotkey and toggle the status using it." - ).addToggle((toggle) => { - toggle.setValue(this.statusAvailableAsCommand).onChange((value) => __async(this, null, function* () { - this.statusAvailableAsCommand = value; - })); - }); - } - const footerEl = contentEl.createDiv(); - const footerButtons = new import_obsidian9.Setting(footerEl); - footerButtons.addButton((b) => { - b.setTooltip("Save").setIcon("checkmark").onClick(() => __async(this, null, function* () { - const errors = validator.validate(this.statusConfiguration()); - if (errors.length > 0) { - const message = errors.join("\n") + "\n\nFix errors before saving."; - new import_obsidian9.Notice(message); - return; - } - this.saved = true; - this.close(); - })); - return b; - }); - footerButtons.addExtraButton((b) => { - b.setIcon("cross").setTooltip("Cancel").onClick(() => { - this.saved = false; - this.close(); - }); - return b; - }); - }); - } - onOpen() { - this.display(); - } - static setValidationError(textInput) { - textInput.inputEl.addClass("tasks-settings-is-invalid"); - } - static removeValidationError(textInput) { - textInput.inputEl.removeClass("tasks-settings-is-invalid"); - } - static setValid(text2, messages) { - const valid = messages.length === 0; - if (valid) { - CustomStatusModal.removeValidationError(text2); - } else { - CustomStatusModal.setValidationError(text2); - } - } -}; - -// src/Config/SettingsTab.ts -var _SettingsTab = class extends import_obsidian10.PluginSettingTab { - constructor({ plugin }) { - super(plugin.app, plugin); - this.customFunctions = { - insertTaskCoreStatusSettings: this.insertTaskCoreStatusSettings.bind(this), - insertCustomTaskStatusSettings: this.insertCustomTaskStatusSettings.bind(this) - }; - this.plugin = plugin; - } - saveSettings(update2) { - return __async(this, null, function* () { - yield this.plugin.saveSettings(); - if (update2) { - this.display(); - } - }); - } - display() { - const { containerEl } = this; - containerEl.empty(); - this.containerEl.addClass("tasks-settings"); - containerEl.createEl("h3", { text: "Tasks Settings" }); - containerEl.createEl("p", { - cls: "tasks-setting-important", - text: "Changing any settings requires a restart of obsidian." - }); - containerEl.createEl("h4", { text: "Global filter Settings" }); - new import_obsidian10.Setting(containerEl).setName("Global task filter").setDesc( - _SettingsTab.createFragmentWithHTML( - '

Recommended: Leave empty if you want all checklist items in your vault to be tasks managed by this plugin.

Use a global filter if you want Tasks to only act on a subset of your "- [ ]" checklist items, so that a checklist item must include the specified string in its description in order to be considered a task.

For example, if you set the global filter to #task, the Tasks plugin will only handle checklist items tagged with #task.
Other checklist items will remain normal checklist items and not appear in queries or get a done date set.

See the documentation.

' - ) - ).addText((text2) => { - const settings2 = getSettings(); - text2.setPlaceholder("e.g. #task or TODO").setValue(settings2.globalFilter).onChange((value) => __async(this, null, function* () { - updateSettings({ globalFilter: value }); - yield this.plugin.saveSettings(); - })); - }); - new import_obsidian10.Setting(containerEl).setName("Remove global filter from description").setDesc( - "Enabling this removes the string that you set as global filter from the task description when displaying a task." - ).addToggle((toggle) => { - const settings2 = getSettings(); - toggle.setValue(settings2.removeGlobalFilter).onChange((value) => __async(this, null, function* () { - updateSettings({ removeGlobalFilter: value }); - yield this.plugin.saveSettings(); - })); - }); - containerEl.createEl("h4", { text: "Task Statuses" }); - const { headingOpened } = getSettings(); - settingsConfiguration_default.forEach((heading) => { - this.addOneSettingsBlock(containerEl, heading, headingOpened); - }); - containerEl.createEl("h4", { text: "Date Settings" }); - new import_obsidian10.Setting(containerEl).setName("Set done date on every completed task").setDesc("Enabling this will add a timestamp \u2705 YYYY-MM-DD at the end when a task is toggled to done").addToggle((toggle) => { - const settings2 = getSettings(); - toggle.setValue(settings2.setDoneDate).onChange((value) => __async(this, null, function* () { - updateSettings({ setDoneDate: value }); - yield this.plugin.saveSettings(); - })); - }); - new import_obsidian10.Setting(containerEl).setName("Use filename as Scheduled date for undated tasks").setDesc( - _SettingsTab.createFragmentWithHTML( - 'Save time entering Scheduled (\u23F3) dates.
If this option is enabled, any undated tasks will be given a default Scheduled date extracted from their file name.
The date in the file name must be in one of YYYY-MM-DD or YYYYMMDD formats.
Undated tasks have none of Due (\u{1F4C5} ), Scheduled (\u23F3) and Start (\u{1F6EB}) dates.

See the documentation.

' - ) - ).addToggle((toggle) => { - const settings2 = getSettings(); - toggle.setValue(settings2.useFilenameAsScheduledDate).onChange((value) => __async(this, null, function* () { - updateSettings({ useFilenameAsScheduledDate: value }); - yield this.plugin.saveSettings(); - })); - }); - new import_obsidian10.Setting(containerEl).setName("Folders with default Scheduled dates").setDesc( - "Leave empty if you want to use default Scheduled dates everywhere, or enter a comma-separated list of folders." - ).addText((input) => __async(this, null, function* () { - const settings2 = getSettings(); - yield this.plugin.saveSettings(); - input.setValue(_SettingsTab.renderFolderArray(settings2.filenameAsDateFolders)).onChange((value) => __async(this, null, function* () { - const folders = _SettingsTab.parseCommaSeparatedFolders(value); - updateSettings({ filenameAsDateFolders: folders }); - yield this.plugin.saveSettings(); - })); - })); - containerEl.createEl("h4", { text: "Auto-suggest Settings" }); - new import_obsidian10.Setting(containerEl).setName("Auto-suggest task content").setDesc("Enabling this will open an intelligent suggest menu while typing inside a recognized task line.").addToggle((toggle) => { - const settings2 = getSettings(); - toggle.setValue(settings2.autoSuggestInEditor).onChange((value) => __async(this, null, function* () { - updateSettings({ autoSuggestInEditor: value }); - yield this.plugin.saveSettings(); - })); - }); - new import_obsidian10.Setting(containerEl).setName("Minimum match length for auto-suggest").setDesc( - "If higher than 0, auto-suggest will be triggered only when the beginning of any supported keywords is recognized." - ).addSlider((slider) => { - const settings2 = getSettings(); - slider.setLimits(0, 3, 1).setValue(settings2.autoSuggestMinMatch).setDynamicTooltip().onChange((value) => __async(this, null, function* () { - updateSettings({ autoSuggestMinMatch: value }); - yield this.plugin.saveSettings(); - })); - }); - new import_obsidian10.Setting(containerEl).setName("Maximum number of auto-suggestions to show").setDesc( - 'How many suggestions should be shown when an auto-suggest menu pops up (including the "\u23CE" option).' - ).addSlider((slider) => { - const settings2 = getSettings(); - slider.setLimits(3, 12, 1).setValue(settings2.autoSuggestMaxItems).setDynamicTooltip().onChange((value) => __async(this, null, function* () { - updateSettings({ autoSuggestMaxItems: value }); - yield this.plugin.saveSettings(); - })); - }); - containerEl.createEl("h4", { text: "Dialog Settings" }); - new import_obsidian10.Setting(containerEl).setName("Provide access keys in dialogs").setDesc( - "If the access keys (keyboard shortcuts) for various controls in dialog boxes conflict with system keyboard shortcuts or assistive technology functionality that is important for you, you may want to deactivate them here." - ).addToggle((toggle) => { - const settings2 = getSettings(); - toggle.setValue(settings2.provideAccessKeys).onChange((value) => __async(this, null, function* () { - updateSettings({ provideAccessKeys: value }); - yield this.plugin.saveSettings(); - })); - }); - } - addOneSettingsBlock(containerEl, heading, headingOpened) { - const detailsContainer = containerEl.createEl("details", { - cls: "tasks-nested-settings", - attr: __spreadValues({}, heading.open || headingOpened[heading.text] ? { open: true } : {}) - }); - detailsContainer.empty(); - detailsContainer.ontoggle = () => { - headingOpened[heading.text] = detailsContainer.open; - updateSettings({ headingOpened }); - this.plugin.saveSettings(); - }; - const summary = detailsContainer.createEl("summary"); - new import_obsidian10.Setting(summary).setHeading().setName(heading.text); - summary.createDiv("collapser").createDiv("handle"); - if (heading.notice !== null) { - const notice = detailsContainer.createEl("div", { - cls: heading.notice.class, - text: heading.notice.text - }); - if (heading.notice.html !== null) { - notice.insertAdjacentHTML("beforeend", heading.notice.html); - } - } - heading.settings.forEach((setting) => { - if (setting.featureFlag !== "" && !isFeatureEnabled(setting.featureFlag)) { - return; - } - if (setting.type === "checkbox") { - new import_obsidian10.Setting(detailsContainer).setName(setting.name).setDesc(setting.description).addToggle((toggle) => { - const settings2 = getSettings(); - if (!settings2.generalSettings[setting.settingName]) { - updateGeneralSetting(setting.settingName, setting.initialValue); - } - toggle.setValue(settings2.generalSettings[setting.settingName]).onChange((value) => __async(this, null, function* () { - updateGeneralSetting(setting.settingName, value); - yield this.plugin.saveSettings(); - })); - }); - } else if (setting.type === "text") { - new import_obsidian10.Setting(detailsContainer).setName(setting.name).setDesc(setting.description).addText((text2) => { - const settings2 = getSettings(); - if (!settings2.generalSettings[setting.settingName]) { - updateGeneralSetting(setting.settingName, setting.initialValue); - } - const onChange = (value) => __async(this, null, function* () { - updateGeneralSetting(setting.settingName, value); - yield this.plugin.saveSettings(); - }); - text2.setPlaceholder(setting.placeholder.toString()).setValue(settings2.generalSettings[setting.settingName].toString()).onChange((0, import_obsidian10.debounce)(onChange, 500, true)); - }); - } else if (setting.type === "textarea") { - new import_obsidian10.Setting(detailsContainer).setName(setting.name).setDesc(setting.description).addTextArea((text2) => { - const settings2 = getSettings(); - if (!settings2.generalSettings[setting.settingName]) { - updateGeneralSetting(setting.settingName, setting.initialValue); - } - const onChange = (value) => __async(this, null, function* () { - updateGeneralSetting(setting.settingName, value); - yield this.plugin.saveSettings(); - }); - text2.setPlaceholder(setting.placeholder.toString()).setValue(settings2.generalSettings[setting.settingName].toString()).onChange((0, import_obsidian10.debounce)(onChange, 500, true)); - text2.inputEl.rows = 8; - text2.inputEl.cols = 40; - }); - } else if (setting.type === "function") { - this.customFunctions[setting.settingName](detailsContainer, this); - } - if (setting.notice !== null) { - const notice = detailsContainer.createEl("p", { - cls: setting.notice.class, - text: setting.notice.text - }); - if (setting.notice.html !== null) { - notice.insertAdjacentHTML("beforeend", setting.notice.html); - } - } - }); - } - static parseCommaSeparatedFolders(input) { - return input.split(",").map((folder) => folder.trim()).map((folder) => folder.replace(/^\/|\/$/g, "")).filter((folder) => folder !== ""); - } - static renderFolderArray(folders) { - return folders.join(","); - } - insertTaskCoreStatusSettings(containerEl, settings2) { - const { statusSettings } = getSettings(); - statusSettings.coreStatuses.forEach((status_type) => { - createRowForTaskStatus( - containerEl, - status_type, - statusSettings.coreStatuses, - statusSettings, - settings2, - settings2.plugin, - true - ); - }); - } - insertCustomTaskStatusSettings(containerEl, settings2) { - const { statusSettings } = getSettings(); - statusSettings.customStatuses.forEach((status_type) => { - createRowForTaskStatus( - containerEl, - status_type, - statusSettings.customStatuses, - statusSettings, - settings2, - settings2.plugin, - false - ); - }); - containerEl.createEl("div"); - const setting = new import_obsidian10.Setting(containerEl).addButton((button) => { - button.setButtonText("Add New Task Status").setCta().onClick(() => __async(this, null, function* () { - StatusSettings.addStatus( - statusSettings.customStatuses, - new StatusConfiguration("", "", "", false, "TODO" /* TODO */) - ); - yield updateAndSaveStatusSettings(statusSettings, settings2); - })); - }); - setting.infoEl.remove(); - const themes = [ - ["AnuPpuccin Theme", anuppuccinSupportedStatuses()], - ["Ebullientworks Theme", ebullientworksSupportedStatuses()], - ["ITS Theme & SlRvb Checkboxes", itsSupportedStatuses()], - ["Minimal Theme", minimalSupportedStatuses()], - ["Things Theme", thingsSupportedStatuses()], - ["Aura Theme (Dark mode only)", auraSupportedStatuses()] - ]; - for (const [name, collection] of themes) { - const addStatusesSupportedByThisTheme = new import_obsidian10.Setting(containerEl).addButton((button) => { - const label = `${name}: Add ${collection.length} supported Statuses`; - button.setButtonText(label).onClick(() => __async(this, null, function* () { - yield addCustomStatesToSettings(collection, statusSettings, settings2); - })); - }); - addStatusesSupportedByThisTheme.infoEl.remove(); - } - const addAllUnknownStatuses = new import_obsidian10.Setting(containerEl).addButton((button) => { - button.setButtonText("Add All Unknown Status Types").setCta().onClick(() => __async(this, null, function* () { - const tasks = this.plugin.getTasks(); - const allStatuses = tasks.map((task) => { - return task.status; - }); - const unknownStatuses = StatusRegistry.getInstance().findUnknownStatuses(allStatuses); - if (unknownStatuses.length === 0) { - return; - } - unknownStatuses.forEach((s) => { - StatusSettings.addStatus(statusSettings.customStatuses, s); - }); - yield updateAndSaveStatusSettings(statusSettings, settings2); - })); - }); - addAllUnknownStatuses.infoEl.remove(); - const clearCustomStatuses = new import_obsidian10.Setting(containerEl).addButton((button) => { - button.setButtonText("Reset Custom Status Types to Defaults").setWarning().onClick(() => __async(this, null, function* () { - StatusSettings.resetAllCustomStatuses(statusSettings); - yield updateAndSaveStatusSettings(statusSettings, settings2); - })); - }); - clearCustomStatuses.infoEl.remove(); - } -}; -var SettingsTab = _SettingsTab; -SettingsTab.createFragmentWithHTML = (html) => createFragment((documentFragment) => documentFragment.createDiv().innerHTML = html); -function createRowForTaskStatus(containerEl, statusType, statuses, statusSettings, settings2, plugin, isCoreStatus) { - const taskStatusPreview = containerEl.createEl("pre"); - taskStatusPreview.addClass("row-for-status"); - taskStatusPreview.textContent = new Status(statusType).previewText(); - const setting = new import_obsidian10.Setting(containerEl); - setting.infoEl.replaceWith(taskStatusPreview); - if (!isCoreStatus) { - setting.addExtraButton((extra) => { - extra.setIcon("cross").setTooltip("Delete").onClick(() => __async(this, null, function* () { - if (StatusSettings.deleteStatus(statuses, statusType)) { - yield updateAndSaveStatusSettings(statusSettings, settings2); - } - })); - }); - } - setting.addExtraButton((extra) => { - extra.setIcon("pencil").setTooltip("Edit").onClick(() => __async(this, null, function* () { - const modal = new CustomStatusModal(plugin, statusType, isCoreStatus); - modal.onClose = () => __async(this, null, function* () { - if (modal.saved) { - if (StatusSettings.replaceStatus(statuses, statusType, modal.statusConfiguration())) { - yield updateAndSaveStatusSettings(statusSettings, settings2); - } - } - }); - modal.open(); - })); - }); - setting.infoEl.remove(); -} -function addCustomStatesToSettings(supportedStatuses, statusSettings, settings2) { - return __async(this, null, function* () { - const notices = StatusSettings.bulkAddStatusCollection(statusSettings, supportedStatuses); - notices.forEach((notice) => { - new import_obsidian10.Notice(notice); - }); - yield updateAndSaveStatusSettings(statusSettings, settings2); - }); -} -function updateAndSaveStatusSettings(statusTypes, settings2) { - return __async(this, null, function* () { - updateSettings({ - statusSettings: statusTypes - }); - StatusSettings.applyToStatusRegistry(statusTypes, StatusRegistry.getInstance()); - yield settings2.saveSettings(true); - }); -} - -// src/Suggestor/EditorSuggestorPopup.ts -var import_obsidian11 = require("obsidian"); - -// src/Suggestor/Suggestor.ts -var datePrefixCharacters = `${startDateSymbol}${scheduledDateSymbol}${dueDateSymbol}`; -function buildSuggestions(line, cursorPos, settings2) { - let suggestions = []; - suggestions = suggestions.concat(addDatesSuggestions(line, cursorPos, settings2)); - suggestions = suggestions.concat(addRecurrenceSuggestions(line, cursorPos, settings2)); - const morePossibleSuggestions = getPossibleComponentSuggestions(line, settings2); - const wordMatch = matchByPosition(line, /([a-zA-Z'_-]*)/g, cursorPos); - let addedSuggestions = false; - if (wordMatch && wordMatch.length > 0) { - const wordUnderCursor = wordMatch[0]; - if (wordUnderCursor.length >= Math.max(1, settings2.autoSuggestMinMatch)) { - const filteredSuggestions = morePossibleSuggestions.filter( - (suggestInfo) => suggestInfo.displayText.toLowerCase().includes(wordUnderCursor.toLowerCase()) - ); - for (const filtered of filteredSuggestions) { - suggestions.push({ - suggestionType: "match", - displayText: filtered.displayText, - appendText: filtered.appendText, - insertAt: wordMatch.index, - insertSkip: wordUnderCursor.length - }); - addedSuggestions = true; - } - } - } - if (!addedSuggestions && settings2.autoSuggestMinMatch === 0) - suggestions = suggestions.concat(morePossibleSuggestions); - if (suggestions.length > 0 && !suggestions.some((value) => value.suggestionType === "match")) { - suggestions.unshift({ - suggestionType: "empty", - displayText: "\u23CE", - appendText: "\n" - }); - } - suggestions = suggestions.slice(0, settings2.autoSuggestMaxItems); - return suggestions; -} -function hasPriority(line) { - if (Object.values(prioritySymbols).some((value) => value.length > 0 && line.includes(value))) - return true; -} -function getPossibleComponentSuggestions(line, _settings) { - const suggestions = []; - if (!line.includes(dueDateSymbol)) - suggestions.push({ - displayText: `${dueDateSymbol} due date`, - appendText: `${dueDateSymbol} ` - }); - if (!line.includes(startDateSymbol)) - suggestions.push({ - displayText: `${startDateSymbol} start date`, - appendText: `${startDateSymbol} ` - }); - if (!line.includes(scheduledDateSymbol)) - suggestions.push({ - displayText: `${scheduledDateSymbol} scheduled date`, - appendText: `${scheduledDateSymbol} ` - }); - if (!hasPriority(line)) { - suggestions.push({ - displayText: `${prioritySymbols.High} high priority`, - appendText: `${prioritySymbols.High} ` - }); - suggestions.push({ - displayText: `${prioritySymbols.Medium} medium priority`, - appendText: `${prioritySymbols.Medium} ` - }); - suggestions.push({ - displayText: `${prioritySymbols.Low} low priority`, - appendText: `${prioritySymbols.Low} ` - }); - } - if (!line.includes(recurrenceSymbol)) - suggestions.push({ - displayText: `${recurrenceSymbol} recurring (repeat)`, - appendText: `${recurrenceSymbol} ` - }); - return suggestions; -} -function addDatesSuggestions(line, cursorPos, settings2) { - const genericSuggestions = [ - "today", - "tomorrow", - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "next week", - "next month", - "next year" - ]; - const results = []; - const dateRegex = new RegExp(`([${datePrefixCharacters}])\\s*([0-9a-zA-Z ]*)`, "ug"); - const dateMatch = matchByPosition(line, dateRegex, cursorPos); - if (dateMatch && dateMatch.length >= 2) { - const datePrefix = dateMatch[1]; - const dateString = dateMatch[2]; - if (dateString.length < settings2.autoSuggestMinMatch) { - return []; - } - const possibleDate = dateString && dateString.length > 1 ? DateParser.parseDate(doAutocomplete(dateString), true) : null; - if (possibleDate && possibleDate.isValid()) { - results.push({ - displayText: `${possibleDate.format(TaskRegularExpressions.dateFormat)}`, - appendText: `${datePrefix} ${possibleDate.format(TaskRegularExpressions.dateFormat)} `, - insertAt: dateMatch.index, - insertSkip: dateMatch[0].length - }); - } - const minMatch = 1; - const maxGenericSuggestions = 5; - let genericMatches = genericSuggestions.filter( - (value) => dateString && dateString.length >= minMatch && value.toLowerCase().includes(dateString.toLowerCase()) - ).slice(0, maxGenericSuggestions); - if (genericMatches.length === 0) { - genericMatches = genericSuggestions.slice(0, maxGenericSuggestions); - } - for (const match of genericMatches) { - const parsedDate = DateParser.parseDate(match, true); - const formattedDate = `${parsedDate.format(TaskRegularExpressions.dateFormat)}`; - results.push({ - suggestionType: "match", - displayText: `${match} (${formattedDate})`, - appendText: `${datePrefix} ${formattedDate} `, - insertAt: dateMatch.index, - insertSkip: dateMatch[0].length - }); - } - } - return results; -} -function addRecurrenceSuggestions(line, cursorPos, settings2) { - var _a; - const genericSuggestions = [ - "every", - "every day", - "every week", - "every month", - "every month on the", - "every year", - "every week on Sunday", - "every week on Monday", - "every week on Tuesday", - "every week on Wednesday", - "every week on Thursday", - "every week on Friday", - "every week on Saturday" - ]; - const results = []; - const recurrenceRegex = new RegExp(`(${recurrenceSymbol})\\s*([0-9a-zA-Z ]*)`, "ug"); - const recurrenceMatch = matchByPosition(line, recurrenceRegex, cursorPos); - if (recurrenceMatch && recurrenceMatch.length >= 2) { - const recurrencePrefix = recurrenceMatch[1]; - const recurrenceString = recurrenceMatch[2]; - if (recurrenceString.length < settings2.autoSuggestMinMatch) - return []; - if (recurrenceString.length > 0) { - const parsedRecurrence = (_a = Recurrence.fromText({ - recurrenceRuleText: recurrenceString, - startDate: null, - scheduledDate: null, - dueDate: null - })) == null ? void 0 : _a.toText(); - if (parsedRecurrence) { - const appendedText = `${recurrencePrefix} ${parsedRecurrence} `; - results.push({ - suggestionType: "match", - displayText: `\u2705 ${parsedRecurrence}`, - appendText: appendedText, - insertAt: recurrenceMatch.index, - insertSkip: recurrenceMatch[0].length - }); - if (recurrenceMatch[0] == appendedText) - return []; - } - } - const minMatch = 1; - const maxGenericDateSuggestions = settings2.autoSuggestMaxItems / 2; - let genericMatches = genericSuggestions.filter( - (value) => recurrenceString && recurrenceString.length >= minMatch && value.toLowerCase().includes(recurrenceString.toLowerCase()) - ).slice(0, maxGenericDateSuggestions); - if (genericMatches.length === 0 && recurrenceString.trim().length === 0) { - genericMatches = genericSuggestions.slice(0, maxGenericDateSuggestions); - } - for (const match of genericMatches) { - results.push({ - suggestionType: "match", - displayText: `${match}`, - appendText: `${recurrencePrefix} ${match} `, - insertAt: recurrenceMatch.index, - insertSkip: recurrenceMatch[0].length - }); - } - } - return results; -} -function matchByPosition(s, r, position) { - const matches = s.matchAll(r); - for (const match of matches) { - if ((match == null ? void 0 : match.index) && match.index <= position && position <= match.index + match[0].length) - return match; - } - return []; -} - -// src/Suggestor/EditorSuggestorPopup.ts -var EditorSuggestor = class extends import_obsidian11.EditorSuggest { - constructor(app, settings2) { - super(app); - this.settings = settings2; - } - onTrigger(cursor, editor, _file) { - if (!this.settings.autoSuggestInEditor) - return null; - const line = editor.getLine(cursor.line); - if (line.contains(this.settings.globalFilter) && line.match(TaskRegularExpressions.taskRegex)) { - return { - start: { line: cursor.line, ch: 0 }, - end: { - line: cursor.line, - ch: line.length - }, - query: line - }; - } - return null; - } - getSuggestions(context) { - const line = context.query; - const currentCursor = context.editor.getCursor(); - const suggestions = buildSuggestions(line, currentCursor.ch, this.settings); - const suggestionsWithContext = []; - for (const suggestion of suggestions) - suggestionsWithContext.push(__spreadProps(__spreadValues({}, suggestion), { context })); - return suggestionsWithContext; - } - renderSuggestion(value, el) { - el.setText(value.displayText); - } - selectSuggestion(value, _evt) { - var _a, _b, _c; - const editor = value.context.editor; - if (value.suggestionType === "empty") { - this.close(); - const eventClone = new KeyboardEvent("keydown", { - code: "Enter", - key: "Enter" - }); - (_b = (_a = editor == null ? void 0 : editor.cm) == null ? void 0 : _a.contentDOM) == null ? void 0 : _b.dispatchEvent(eventClone); - return; - } - const currentCursor = value.context.editor.getCursor(); - const replaceFrom = { - line: currentCursor.line, - ch: (_c = value.insertAt) != null ? _c : currentCursor.ch - }; - const replaceTo = value.insertSkip ? { - line: currentCursor.line, - ch: replaceFrom.ch + value.insertSkip - } : void 0; - value.context.editor.replaceRange(value.appendText, replaceFrom, replaceTo); - value.context.editor.setCursor({ - line: currentCursor.line, - ch: replaceFrom.ch + value.appendText.length - }); - } -}; - -// src/main.ts -var TasksPlugin = class extends import_obsidian12.Plugin { - onload() { - return __async(this, null, function* () { - console.log('loading plugin "tasks"'); - yield this.loadSettings(); - this.addSettingTab(new SettingsTab({ plugin: this })); - initializeFile({ - metadataCache: this.app.metadataCache, - vault: this.app.vault - }); - yield this.loadTaskStatuses(); - const events = new TasksEvents({ obsidianEvents: this.app.workspace }); - this.cache = new Cache2({ - metadataCache: this.app.metadataCache, - vault: this.app.vault, - events - }); - this.inlineRenderer = new InlineRenderer({ plugin: this }); - this.queryRenderer = new QueryRenderer({ plugin: this, events }); - this.registerEditorExtension(newLivePreviewExtension()); - this.registerEditorSuggest(new EditorSuggestor(this.app, getSettings())); - new Commands({ plugin: this }); - }); - } - loadTaskStatuses() { - return __async(this, null, function* () { - const { statusSettings } = getSettings(); - StatusSettings.applyToStatusRegistry(statusSettings, StatusRegistry.getInstance()); - }); - } - onunload() { - var _a; - console.log('unloading plugin "tasks"'); - (_a = this.cache) == null ? void 0 : _a.unload(); - } - loadSettings() { - return __async(this, null, function* () { - const newSettings = yield this.loadData(); - updateSettings(newSettings); - yield this.loadTaskStatuses(); - }); - } - saveSettings() { - return __async(this, null, function* () { - yield this.saveData(getSettings()); - }); - } - getTasks() { - var _a; - return (_a = this.cache) == null ? void 0 : _a.getTasks(); - } -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmpzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvdXRpbHMvcGF0dGVybi50cyIsICJub2RlX21vZHVsZXMvZGF5anMvZGF5anMubWluLmpzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY2FsY3VsYXRpb24veWVhcnMudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2VuL2NvbnN0YW50cy50cyIsICJub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3F1YXJ0ZXJPZlllYXIuanMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy91dGlscy9kYXlqcy50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL3RpbWV6b25lLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvcmVzdWx0cy50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeS50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZW4vcGFyc2Vycy9FTlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOTW9udGhOYW1lUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOU2xhc2hNb250aEZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2VuL3BhcnNlcnMvRU5UaW1lRXhwcmVzc2lvblBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL3V0aWxzL3RpbWV1bml0cy50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZW4vcGFyc2Vycy9FTlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOVGltZVVuaXRMYXRlckZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9hYnN0cmFjdFJlZmluZXJzLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY29tbW9uL3JlZmluZXJzL0Fic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9yZWZpbmVycy9FTk1lcmdlRGF0ZVJhbmdlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NhbGN1bGF0aW9uL21lcmdpbmdDYWxjdWxhdGlvbi50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9yZWZpbmVycy9FTk1lcmdlRGF0ZVRpbWVSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY29tbW9uL3JlZmluZXJzL0V4dHJhY3RUaW1lem9uZUFiYnJSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY29tbW9uL3JlZmluZXJzL0V4dHJhY3RUaW1lem9uZU9mZnNldFJlZmluZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9jb21tb24vcmVmaW5lcnMvT3ZlcmxhcFJlbW92YWxSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY29tbW9uL3JlZmluZXJzL0ZvcndhcmREYXRlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9yZWZpbmVycy9Vbmxpa2VseUZvcm1hdEZpbHRlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9wYXJzZXJzL0lTT0Zvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2NvbW1vbi9yZWZpbmVycy9NZXJnZVdlZWtkYXlDb21wb25lbnRSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY29uZmlndXJhdGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9jb21tb24vY2FzdWFsUmVmZXJlbmNlcy50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZW4vcGFyc2Vycy9FTkNhc3VhbERhdGVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2VuL3BhcnNlcnMvRU5DYXN1YWxUaW1lUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY2FsY3VsYXRpb24vd2Vla3MudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2VuL3BhcnNlcnMvRU5XZWVrZGF5UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOUmVsYXRpdmVEYXRlRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY2hyb25vLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvY29tbW9uL3BhcnNlcnMvU2xhc2hEYXRlRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9lbi9wYXJzZXJzL0VOVGltZVVuaXRDYXN1YWxSZWxhdGl2ZUZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZW4vcmVmaW5lcnMvRU5NZXJnZVJlbGF0aXZlRGF0ZVJlZmluZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2VuL2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9kZS9wYXJzZXJzL0RFVGltZUV4cHJlc3Npb25QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2RlL2NvbnN0YW50cy50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZGUvcGFyc2Vycy9ERVdlZWtkYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2RlL3BhcnNlcnMvREVTcGVjaWZpY1RpbWVFeHByZXNzaW9uUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9kZS9yZWZpbmVycy9ERU1lcmdlRGF0ZVJhbmdlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZGUvcmVmaW5lcnMvREVNZXJnZURhdGVUaW1lUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZGUvcGFyc2Vycy9ERUNhc3VhbFRpbWVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2RlL3BhcnNlcnMvREVDYXN1YWxEYXRlUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9kZS9wYXJzZXJzL0RFTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9kZS9wYXJzZXJzL0RFVGltZVVuaXRSZWxhdGl2ZUZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZGUvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2ZyL3BhcnNlcnMvRlJDYXN1YWxEYXRlUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9mci9wYXJzZXJzL0ZSQ2FzdWFsVGltZVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZnIvcGFyc2Vycy9GUlRpbWVFeHByZXNzaW9uUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9mci9yZWZpbmVycy9GUk1lcmdlRGF0ZVRpbWVSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9mci9yZWZpbmVycy9GUk1lcmdlRGF0ZVJhbmdlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZnIvY29uc3RhbnRzLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9mci9wYXJzZXJzL0ZSV2Vla2RheVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZnIvcGFyc2Vycy9GUlNwZWNpZmljVGltZUV4cHJlc3Npb25QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2ZyL3BhcnNlcnMvRlJNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2ZyL3BhcnNlcnMvRlJUaW1lVW5pdEFnb0Zvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZnIvcGFyc2Vycy9GUlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9mci9wYXJzZXJzL0ZSVGltZVVuaXRSZWxhdGl2ZUZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvZnIvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2phL2NvbnN0YW50cy50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvamEvcGFyc2Vycy9KUFN0YW5kYXJkUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9qYS9yZWZpbmVycy9KUE1lcmdlRGF0ZVJhbmdlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvamEvcGFyc2Vycy9KUENhc3VhbERhdGVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL2phL2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9wdC9jb25zdGFudHMudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3B0L3BhcnNlcnMvUFRXZWVrZGF5UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9wdC9wYXJzZXJzL1BUVGltZUV4cHJlc3Npb25QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3B0L3JlZmluZXJzL1BUTWVyZ2VEYXRlVGltZVJlZmluZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3B0L3JlZmluZXJzL1BUTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9wdC9wYXJzZXJzL1BUTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9wdC9wYXJzZXJzL1BUQ2FzdWFsRGF0ZVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcHQvcGFyc2Vycy9QVENhc3VhbFRpbWVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3B0L2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9ubC9yZWZpbmVycy9OTE1lcmdlRGF0ZVJhbmdlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvbmwvcmVmaW5lcnMvTkxNZXJnZURhdGVUaW1lUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvbmwvcGFyc2Vycy9OTENhc3VhbERhdGVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxDYXN1YWxUaW1lUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9ubC9jb25zdGFudHMudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxUaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvbmwvcGFyc2Vycy9OTFdlZWtkYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxNb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxNb250aE5hbWVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxTbGFzaE1vbnRoRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9ubC9wYXJzZXJzL05MVGltZUV4cHJlc3Npb25QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxDYXN1YWxZZWFyTW9udGhEYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxDYXN1YWxEYXRlVGltZVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvbmwvcGFyc2Vycy9OTFRpbWVVbml0Q2FzdWFsUmVsYXRpdmVGb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxSZWxhdGl2ZURhdGVGb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL3BhcnNlcnMvTkxUaW1lVW5pdEFnb0Zvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvbmwvcGFyc2Vycy9OTFRpbWVVbml0TGF0ZXJGb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL25sL2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW50L3BhcnNlcnMvWkhIYW50Q2FzdWFsRGF0ZVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvemgvaGFudC9jb25zdGFudHMudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnQvcGFyc2Vycy9aSEhhbnREYXRlUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW50L3BhcnNlcnMvWkhIYW50RGVhZGxpbmVGb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnQvcGFyc2Vycy9aSEhhbnRSZWxhdGlvbldlZWtkYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnQvcGFyc2Vycy9aSEhhbnRUaW1lRXhwcmVzc2lvblBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvemgvaGFudC9wYXJzZXJzL1pISGFudFdlZWtkYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnQvcmVmaW5lcnMvWkhIYW50TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW50L3JlZmluZXJzL1pISGFudE1lcmdlRGF0ZVRpbWVSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW50L2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW5zL3BhcnNlcnMvWkhIYW5zQ2FzdWFsRGF0ZVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvemgvaGFucy9jb25zdGFudHMudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnMvcGFyc2Vycy9aSEhhbnNEYXRlUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW5zL3BhcnNlcnMvWkhIYW5zRGVhZGxpbmVGb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnMvcGFyc2Vycy9aSEhhbnNSZWxhdGlvbldlZWtkYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnMvcGFyc2Vycy9aSEhhbnNUaW1lRXhwcmVzc2lvblBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvemgvaGFucy9wYXJzZXJzL1pISGFuc1dlZWtkYXlQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3poL2hhbnMvcmVmaW5lcnMvWkhIYW5zTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW5zL3JlZmluZXJzL1pISGFuc01lcmdlRGF0ZVRpbWVSZWZpbmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9oYW5zL2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy96aC9pbmRleC50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcnUvY29uc3RhbnRzLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9ydS9wYXJzZXJzL1JVVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3J1L3BhcnNlcnMvUlVNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3J1L3BhcnNlcnMvUlVNb250aE5hbWVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3J1L3BhcnNlcnMvUlVUaW1lRXhwcmVzc2lvblBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcnUvcGFyc2Vycy9SVVRpbWVVbml0QWdvRm9ybWF0UGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9ydS9yZWZpbmVycy9SVU1lcmdlRGF0ZVJhbmdlUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcnUvcmVmaW5lcnMvUlVNZXJnZURhdGVUaW1lUmVmaW5lci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcnUvcGFyc2Vycy9SVUNhc3VhbERhdGVQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3J1L3BhcnNlcnMvUlVDYXN1YWxUaW1lUGFyc2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvbG9jYWxlcy9ydS9wYXJzZXJzL1JVV2Vla2RheVBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcnUvcGFyc2Vycy9SVVJlbGF0aXZlRGF0ZUZvcm1hdFBhcnNlci50cyIsICJub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvc3JjL2xvY2FsZXMvcnUvcGFyc2Vycy9SVVRpbWVVbml0Q2FzdWFsUmVsYXRpdmVGb3JtYXRQYXJzZXIudHMiLCAibm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL3NyYy9sb2NhbGVzL3J1L2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9zcmMvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL2Jvb24tanMvbGliL3R5cGVzLmpzIiwgIm5vZGVfbW9kdWxlcy9ib29uLWpzL2xpYi9wYXJzZS9jb25zdC5qcyIsICJub2RlX21vZHVsZXMvYm9vbi1qcy9saWIvbGV4L2NvbnN0LmpzIiwgIm5vZGVfbW9kdWxlcy9ib29uLWpzL2xpYi9sZXgvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL2Jvb24tanMvbGliL2xleC9sZXguanMiLCAibm9kZV9tb2R1bGVzL2Jvb24tanMvbGliL3BhcnNlL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9ib29uLWpzL2xpYi9wYXJzZS9wYXJzZS5qcyIsICJub2RlX21vZHVsZXMvYm9vbi1qcy9saWIvZXZhbHVhdGUvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL2Jvb24tanMvbGliL2V2YWx1YXRlL2NvbnN0LmpzIiwgIm5vZGVfbW9kdWxlcy9ib29uLWpzL2xpYi9ldmFsdWF0ZS9ldmFsdWF0ZS5qcyIsICJub2RlX21vZHVsZXMvYm9vbi1qcy9saWIvaW5kZXguanMiLCAic3JjL21haW4udHMiLCAic3JjL0NhY2hlLnRzIiwgIm5vZGVfbW9kdWxlcy9hc3luYy1tdXRleC9pbmRleC5tanMiLCAic3JjL1Rhc2tMYXlvdXQudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy93ZWVrZGF5LnRzIiwgIm5vZGVfbW9kdWxlcy9ycnVsZS9zcmMvaGVscGVycy50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL2RhdGV1dGlsLnRzIiwgIm5vZGVfbW9kdWxlcy9ycnVsZS9zcmMvaXRlcnJlc3VsdC50cyIsICJub2RlX21vZHVsZXMvdHNsaWIvbW9kdWxlcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL2NhbGxiYWNraXRlcnJlc3VsdC50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL25scC9pMThuLnRzIiwgIm5vZGVfbW9kdWxlcy9ycnVsZS9zcmMvbmxwL3RvdGV4dC50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL25scC9wYXJzZXRleHQudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy90eXBlcy50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL25scC9pbmRleC50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL2RhdGV0aW1lLnRzIiwgIm5vZGVfbW9kdWxlcy9ycnVsZS9zcmMvcGFyc2VvcHRpb25zLnRzIiwgIm5vZGVfbW9kdWxlcy9ycnVsZS9zcmMvcGFyc2VzdHJpbmcudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9kYXRld2l0aHpvbmUudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9vcHRpb25zdG9zdHJpbmcudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9jYWNoZS50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL21hc2tzLnRzIiwgIm5vZGVfbW9kdWxlcy9ycnVsZS9zcmMvaXRlcmluZm8veWVhcmluZm8udHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9pdGVyaW5mby9tb250aGluZm8udHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9pdGVyaW5mby9lYXN0ZXIudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9pdGVyaW5mby9pbmRleC50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL2l0ZXIvcG9zbGlzdC50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL2l0ZXIvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9ycnVsZS50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL2l0ZXJzZXQudHMiLCAibm9kZV9tb2R1bGVzL3JydWxlL3NyYy9ycnVsZXN0ci50cyIsICJub2RlX21vZHVsZXMvcnJ1bGUvc3JjL3JydWxlc2V0LnRzIiwgInNyYy9saWIvRGF0ZVRvb2xzLnRzIiwgInNyYy9SZWN1cnJlbmNlLnRzIiwgInNyYy9TdGF0dXNDb25maWd1cmF0aW9uLnRzIiwgInNyYy9TdGF0dXMudHMiLCAic3JjL0NvbmZpZy9TdGF0dXNTZXR0aW5ncy50cyIsICJzcmMvQ29uZmlnL0ZlYXR1cmUudHMiLCAic3JjL0NvbmZpZy9TZXR0aW5ncy50cyIsICJzcmMvU3RhdHVzUmVnaXN0cnkudHMiLCAic3JjL1VyZ2VuY3kudHMiLCAic3JjL1Rhc2tMaW5lUmVuZGVyZXIudHMiLCAic3JjL0ZpbGUudHMiLCAic3JjL0RhdGVGYWxsYmFjay50cyIsICJzcmMvbGliL1JlZ0V4cFRvb2xzLnRzIiwgInNyYy9UYXNrLnRzIiwgInNyYy9saWIvTGF6eS50cyIsICJzcmMvQ29tbWFuZHMvQ3JlYXRlT3JFZGl0LnRzIiwgInNyYy9UYXNrTW9kYWwudHMiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS9pbnRlcm5hbC9pbmRleC5tanMiLCAic3JjL3VpL0VkaXRUYXNrLnN2ZWx0ZSIsICJzcmMvRGF0ZUFiYnJldmlhdGlvbnMudHMiLCAic3JjL0NvbW1hbmRzL0NyZWF0ZU9yRWRpdFRhc2tQYXJzZXIudHMiLCAic3JjL0NvbW1hbmRzL1RvZ2dsZURvbmUudHMiLCAic3JjL0NvbW1hbmRzL2luZGV4LnRzIiwgInNyYy9UYXNrc0V2ZW50cy50cyIsICJzcmMvSW5saW5lUmVuZGVyZXIudHMiLCAic3JjL0xpdmVQcmV2aWV3RXh0ZW5zaW9uLnRzIiwgInNyYy9RdWVyeVJlbmRlcmVyLnRzIiwgInNyYy9RdWVyeS9Tb3J0ZXIudHMiLCAic3JjL1F1ZXJ5L0dyb3VwZXIudHMiLCAic3JjL1F1ZXJ5L0ZpbHRlci9GaWVsZC50cyIsICJzcmMvUXVlcnkvRXhwbGFpbi9FeHBsYW5hdGlvbi50cyIsICJzcmMvUXVlcnkvRmlsdGVyL0ZpbHRlci50cyIsICJzcmMvUXVlcnkvRmlsdGVyL0ZpbHRlckluc3RydWN0aW9uLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvRmlsdGVySW5zdHJ1Y3Rpb25zLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvRmlsdGVySW5zdHJ1Y3Rpb25zQmFzZWRGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1N0YXR1c0ZpZWxkLnRzIiwgInNyYy9RdWVyeS9EYXRlUGFyc2VyLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvRGF0ZUZpZWxkLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvRHVlRGF0ZUZpZWxkLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvUHJpb3JpdHlGaWVsZC50cyIsICJzcmMvUXVlcnkvTWF0Y2hlcnMvSVN0cmluZ01hdGNoZXIudHMiLCAic3JjL1F1ZXJ5L01hdGNoZXJzL1N1YnN0cmluZ01hdGNoZXIudHMiLCAic3JjL1F1ZXJ5L01hdGNoZXJzL1JlZ2V4TWF0Y2hlci50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1RleHRGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1BhdGhGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1VyZ2VuY3lGaWVsZC50cyIsICJzcmMvUXVlcnkvU29ydC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL0Rlc2NyaXB0aW9uRmllbGQudHMiLCAic3JjL1F1ZXJ5L0ZpbHRlci9Eb25lRGF0ZUZpZWxkLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvRXhjbHVkZVN1Ykl0ZW1zRmllbGQudHMiLCAic3JjL1F1ZXJ5L0ZpbHRlci9IZWFkaW5nRmllbGQudHMiLCAic3JjL1F1ZXJ5L0ZpbHRlci9TY2hlZHVsZWREYXRlRmllbGQudHMiLCAic3JjL1F1ZXJ5L0ZpbHRlci9TdGFydERhdGVGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL0hhcHBlbnNEYXRlRmllbGQudHMiLCAic3JjL1F1ZXJ5L0ZpbHRlci9SZWN1cnJpbmdGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL011bHRpVGV4dEZpZWxkLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvVGFnc0ZpZWxkLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvQm9vbGVhbkZpZWxkLnRzIiwgInNyYy9RdWVyeS9GaWx0ZXIvRmlsZW5hbWVGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1N0YXR1c05hbWVGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1N0YXR1c1R5cGVGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyL1JlY3VycmVuY2VGaWVsZC50cyIsICJzcmMvUXVlcnkvRmlsdGVyUGFyc2VyLnRzIiwgInNyYy9RdWVyeS9Hcm91cEhlYWRpbmcudHMiLCAic3JjL1F1ZXJ5L0dyb3VwSGVhZGluZ3MudHMiLCAic3JjL1F1ZXJ5L0dyb3VwaW5nVHJlZU5vZGUudHMiLCAic3JjL1F1ZXJ5L0ludGVybWVkaWF0ZVRhc2tHcm91cHMudHMiLCAic3JjL1F1ZXJ5L1Rhc2tHcm91cC50cyIsICJzcmMvUXVlcnkvVGFza0dyb3Vwcy50cyIsICJzcmMvUXVlcnkvR3JvdXAudHMiLCAic3JjL1F1ZXJ5L1F1ZXJ5LnRzIiwgInNyYy9Db25maWcvU2V0dGluZ3NUYWIudHMiLCAic3JjL0NvbmZpZy9UaGVtZXMvQW51UHB1Y2NpblRoZW1lQ29sbGVjdGlvbi50cyIsICJzcmMvQ29uZmlnL1RoZW1lcy9BdXJhVGhlbWVDb2xsZWN0aW9uLnRzIiwgInNyYy9Db25maWcvVGhlbWVzL0VidWxsaWVudHdvcmtzVGhlbWVDb2xsZWN0aW9uLnRzIiwgInNyYy9Db25maWcvVGhlbWVzL0lUU1RoZW1lQ29sbGVjdGlvbi50cyIsICJzcmMvQ29uZmlnL1RoZW1lcy9NaW5pbWFsVGhlbWVDb2xsZWN0aW9uLnRzIiwgInNyYy9Db25maWcvVGhlbWVzL1RoaW5nc1RoZW1lQ29sbGVjdGlvbi50cyIsICJzcmMvQ29uZmlnL0N1c3RvbVN0YXR1c01vZGFsLnRzIiwgInNyYy9TdGF0dXNWYWxpZGF0b3IudHMiLCAic3JjL1N1Z2dlc3Rvci9FZGl0b3JTdWdnZXN0b3JQb3B1cC50cyIsICJzcmMvU3VnZ2VzdG9yL1N1Z2dlc3Rvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBnbG9iYWwsIGRlZmluZSwgU3lzdGVtLCBSZWZsZWN0LCBQcm9taXNlICovXHJcbnZhciBfX2V4dGVuZHM7XHJcbnZhciBfX2Fzc2lnbjtcclxudmFyIF9fcmVzdDtcclxudmFyIF9fZGVjb3JhdGU7XHJcbnZhciBfX3BhcmFtO1xyXG52YXIgX19tZXRhZGF0YTtcclxudmFyIF9fYXdhaXRlcjtcclxudmFyIF9fZ2VuZXJhdG9yO1xyXG52YXIgX19leHBvcnRTdGFyO1xyXG52YXIgX192YWx1ZXM7XHJcbnZhciBfX3JlYWQ7XHJcbnZhciBfX3NwcmVhZDtcclxudmFyIF9fc3ByZWFkQXJyYXlzO1xyXG52YXIgX19zcHJlYWRBcnJheTtcclxudmFyIF9fYXdhaXQ7XHJcbnZhciBfX2FzeW5jR2VuZXJhdG9yO1xyXG52YXIgX19hc3luY0RlbGVnYXRvcjtcclxudmFyIF9fYXN5bmNWYWx1ZXM7XHJcbnZhciBfX21ha2VUZW1wbGF0ZU9iamVjdDtcclxudmFyIF9faW1wb3J0U3RhcjtcclxudmFyIF9faW1wb3J0RGVmYXVsdDtcclxudmFyIF9fY2xhc3NQcml2YXRlRmllbGRHZXQ7XHJcbnZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0O1xyXG52YXIgX19jbGFzc1ByaXZhdGVGaWVsZEluO1xyXG52YXIgX19jcmVhdGVCaW5kaW5nO1xyXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcclxuICAgIHZhciByb290ID0gdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6IHR5cGVvZiB0aGlzID09PSBcIm9iamVjdFwiID8gdGhpcyA6IHt9O1xyXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAgICAgZGVmaW5lKFwidHNsaWJcIiwgW1wiZXhwb3J0c1wiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsgZmFjdG9yeShjcmVhdGVFeHBvcnRlcihyb290LCBjcmVhdGVFeHBvcnRlcihleHBvcnRzKSkpOyB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgZmFjdG9yeShjcmVhdGVFeHBvcnRlcihyb290LCBjcmVhdGVFeHBvcnRlcihtb2R1bGUuZXhwb3J0cykpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGZhY3RvcnkoY3JlYXRlRXhwb3J0ZXIocm9vdCkpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gY3JlYXRlRXhwb3J0ZXIoZXhwb3J0cywgcHJldmlvdXMpIHtcclxuICAgICAgICBpZiAoZXhwb3J0cyAhPT0gcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGlkLCB2KSB7IHJldHVybiBleHBvcnRzW2lkXSA9IHByZXZpb3VzID8gcHJldmlvdXMoaWQsIHYpIDogdjsgfTtcclxuICAgIH1cclxufSlcclxuKGZ1bmN0aW9uIChleHBvcnRlcikge1xyXG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuXHJcbiAgICBfX2V4dGVuZHMgPSBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxuICAgIH07XHJcblxyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3Jlc3QgPSBmdW5jdGlvbiAocywgZSkge1xyXG4gICAgICAgIHZhciB0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fZGVjb3JhdGUgPSBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgICAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICAgICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgICAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3BhcmFtID0gZnVuY3Rpb24gKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX21ldGFkYXRhID0gZnVuY3Rpb24gKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxuICAgIH07XHJcblxyXG4gICAgX19hd2FpdGVyID0gZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fZ2VuZXJhdG9yID0gZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgICAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgX19leHBvcnRTdGFyID0gZnVuY3Rpb24obSwgbykge1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxuICAgIH07XHJcblxyXG4gICAgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbiAgICB9KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICAgICAgb1trMl0gPSBtW2tdO1xyXG4gICAgfSk7XHJcblxyXG4gICAgX192YWx1ZXMgPSBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICAgICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICAgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fcmVhZCA9IGZ1bmN0aW9uIChvLCBuKSB7XHJcbiAgICAgICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICAgICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkICovXHJcbiAgICBfX3NwcmVhZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkICovXHJcbiAgICBfX3NwcmVhZEFycmF5cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgICAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICAgICAgcmV0dXJuIHI7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fc3ByZWFkQXJyYXkgPSBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcclxuICAgICAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2F3YWl0ID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxuICAgIH07XHJcblxyXG4gICAgX19hc3luY0dlbmVyYXRvciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICAgICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7ICB9XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgICAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXN5bmNEZWxlZ2F0b3IgPSBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBpLCBwO1xyXG4gICAgICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICAgICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX2FzeW5jVmFsdWVzID0gZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICAgICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgICAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0ID0gZnVuY3Rpb24gKGNvb2tlZCwgcmF3KSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgICAgICByZXR1cm4gY29va2VkO1xyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG4gICAgfSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICAgICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2ltcG9ydFN0YXIgPSBmdW5jdGlvbiAobW9kKSB7XHJcbiAgICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgICAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICAgICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcblxyXG4gICAgX19pbXBvcnREZWZhdWx0ID0gZnVuY3Rpb24gKG1vZCkge1xyXG4gICAgICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0ID0gZnVuY3Rpb24gKHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgICAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgICAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0ID0gZnVuY3Rpb24gKHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICAgICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRJbiA9IGZ1bmN0aW9uIChzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgICAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBleHBvcnRlcihcIl9fZXh0ZW5kc1wiLCBfX2V4dGVuZHMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2Fzc2lnblwiLCBfX2Fzc2lnbik7XHJcbiAgICBleHBvcnRlcihcIl9fcmVzdFwiLCBfX3Jlc3QpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2RlY29yYXRlXCIsIF9fZGVjb3JhdGUpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3BhcmFtXCIsIF9fcGFyYW0pO1xyXG4gICAgZXhwb3J0ZXIoXCJfX21ldGFkYXRhXCIsIF9fbWV0YWRhdGEpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2F3YWl0ZXJcIiwgX19hd2FpdGVyKTtcclxuICAgIGV4cG9ydGVyKFwiX19nZW5lcmF0b3JcIiwgX19nZW5lcmF0b3IpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2V4cG9ydFN0YXJcIiwgX19leHBvcnRTdGFyKTtcclxuICAgIGV4cG9ydGVyKFwiX19jcmVhdGVCaW5kaW5nXCIsIF9fY3JlYXRlQmluZGluZyk7XHJcbiAgICBleHBvcnRlcihcIl9fdmFsdWVzXCIsIF9fdmFsdWVzKTtcclxuICAgIGV4cG9ydGVyKFwiX19yZWFkXCIsIF9fcmVhZCk7XHJcbiAgICBleHBvcnRlcihcIl9fc3ByZWFkXCIsIF9fc3ByZWFkKTtcclxuICAgIGV4cG9ydGVyKFwiX19zcHJlYWRBcnJheXNcIiwgX19zcHJlYWRBcnJheXMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3NwcmVhZEFycmF5XCIsIF9fc3ByZWFkQXJyYXkpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2F3YWl0XCIsIF9fYXdhaXQpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2FzeW5jR2VuZXJhdG9yXCIsIF9fYXN5bmNHZW5lcmF0b3IpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2FzeW5jRGVsZWdhdG9yXCIsIF9fYXN5bmNEZWxlZ2F0b3IpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2FzeW5jVmFsdWVzXCIsIF9fYXN5bmNWYWx1ZXMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX21ha2VUZW1wbGF0ZU9iamVjdFwiLCBfX21ha2VUZW1wbGF0ZU9iamVjdCk7XHJcbiAgICBleHBvcnRlcihcIl9faW1wb3J0U3RhclwiLCBfX2ltcG9ydFN0YXIpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2ltcG9ydERlZmF1bHRcIiwgX19pbXBvcnREZWZhdWx0KTtcclxuICAgIGV4cG9ydGVyKFwiX19jbGFzc1ByaXZhdGVGaWVsZEdldFwiLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KTtcclxuICAgIGV4cG9ydGVyKFwiX19jbGFzc1ByaXZhdGVGaWVsZFNldFwiLCBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KTtcclxuICAgIGV4cG9ydGVyKFwiX19jbGFzc1ByaXZhdGVGaWVsZEluXCIsIF9fY2xhc3NQcml2YXRlRmllbGRJbik7XHJcbn0pO1xyXG4iLCBudWxsLCAiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KHQ9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczp0fHxzZWxmKS5kYXlqcz1lKCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9MWUzLGU9NmU0LG49MzZlNSxyPVwibWlsbGlzZWNvbmRcIixpPVwic2Vjb25kXCIscz1cIm1pbnV0ZVwiLHU9XCJob3VyXCIsYT1cImRheVwiLG89XCJ3ZWVrXCIsZj1cIm1vbnRoXCIsaD1cInF1YXJ0ZXJcIixjPVwieWVhclwiLGQ9XCJkYXRlXCIsJD1cIkludmFsaWQgRGF0ZVwiLGw9L14oXFxkezR9KVstL10/KFxcZHsxLDJ9KT9bLS9dPyhcXGR7MCwyfSlbVHRcXHNdKihcXGR7MSwyfSk/Oj8oXFxkezEsMn0pPzo/KFxcZHsxLDJ9KT9bLjpdPyhcXGQrKT8kLyx5PS9cXFsoW15cXF1dKyldfFl7MSw0fXxNezEsNH18RHsxLDJ9fGR7MSw0fXxIezEsMn18aHsxLDJ9fGF8QXxtezEsMn18c3sxLDJ9fFp7MSwyfXxTU1MvZyxNPXtuYW1lOlwiZW5cIix3ZWVrZGF5czpcIlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5XCIuc3BsaXQoXCJfXCIpLG1vbnRoczpcIkphbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXJcIi5zcGxpdChcIl9cIil9LG09ZnVuY3Rpb24odCxlLG4pe3ZhciByPVN0cmluZyh0KTtyZXR1cm4hcnx8ci5sZW5ndGg+PWU/dDpcIlwiK0FycmF5KGUrMS1yLmxlbmd0aCkuam9pbihuKSt0fSxnPXtzOm0sejpmdW5jdGlvbih0KXt2YXIgZT0tdC51dGNPZmZzZXQoKSxuPU1hdGguYWJzKGUpLHI9TWF0aC5mbG9vcihuLzYwKSxpPW4lNjA7cmV0dXJuKGU8PTA/XCIrXCI6XCItXCIpK20ociwyLFwiMFwiKStcIjpcIittKGksMixcIjBcIil9LG06ZnVuY3Rpb24gdChlLG4pe2lmKGUuZGF0ZSgpPG4uZGF0ZSgpKXJldHVybi10KG4sZSk7dmFyIHI9MTIqKG4ueWVhcigpLWUueWVhcigpKSsobi5tb250aCgpLWUubW9udGgoKSksaT1lLmNsb25lKCkuYWRkKHIsZikscz1uLWk8MCx1PWUuY2xvbmUoKS5hZGQocisocz8tMToxKSxmKTtyZXR1cm4rKC0ocisobi1pKS8ocz9pLXU6dS1pKSl8fDApfSxhOmZ1bmN0aW9uKHQpe3JldHVybiB0PDA/TWF0aC5jZWlsKHQpfHwwOk1hdGguZmxvb3IodCl9LHA6ZnVuY3Rpb24odCl7cmV0dXJue006Zix5OmMsdzpvLGQ6YSxEOmQsaDp1LG06cyxzOmksbXM6cixROmh9W3RdfHxTdHJpbmcodHx8XCJcIikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9zJC8sXCJcIil9LHU6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR9fSxEPVwiZW5cIix2PXt9O3ZbRF09TTt2YXIgcD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIF99LFM9ZnVuY3Rpb24odCxlLG4pe3ZhciByO2lmKCF0KXJldHVybiBEO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXZbdF0mJihyPXQpLGUmJih2W3RdPWUscj10KTtlbHNle3ZhciBpPXQubmFtZTt2W2ldPXQscj1pfXJldHVybiFuJiZyJiYoRD1yKSxyfHwhbiYmRH0sdz1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHQuY2xvbmUoKTt2YXIgbj1cIm9iamVjdFwiPT10eXBlb2YgZT9lOnt9O3JldHVybiBuLmRhdGU9dCxuLmFyZ3M9YXJndW1lbnRzLG5ldyBfKG4pfSxPPWc7Ty5sPVMsTy5pPXAsTy53PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHcodCx7bG9jYWxlOmUuJEwsdXRjOmUuJHUseDplLiR4LCRvZmZzZXQ6ZS4kb2Zmc2V0fSl9O3ZhciBfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gTSh0KXt0aGlzLiRMPVModC5sb2NhbGUsbnVsbCwhMCksdGhpcy5wYXJzZSh0KX12YXIgbT1NLnByb3RvdHlwZTtyZXR1cm4gbS5wYXJzZT1mdW5jdGlvbih0KXt0aGlzLiRkPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZGF0ZSxuPXQudXRjO2lmKG51bGw9PT1lKXJldHVybiBuZXcgRGF0ZShOYU4pO2lmKE8udShlKSlyZXR1cm4gbmV3IERhdGU7aWYoZSBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIG5ldyBEYXRlKGUpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlJiYhL1okL2kudGVzdChlKSl7dmFyIHI9ZS5tYXRjaChsKTtpZihyKXt2YXIgaT1yWzJdLTF8fDAscz0ocls3XXx8XCIwXCIpLnN1YnN0cmluZygwLDMpO3JldHVybiBuP25ldyBEYXRlKERhdGUuVVRDKHJbMV0saSxyWzNdfHwxLHJbNF18fDAscls1XXx8MCxyWzZdfHwwLHMpKTpuZXcgRGF0ZShyWzFdLGksclszXXx8MSxyWzRdfHwwLHJbNV18fDAscls2XXx8MCxzKX19cmV0dXJuIG5ldyBEYXRlKGUpfSh0KSx0aGlzLiR4PXQueHx8e30sdGhpcy5pbml0KCl9LG0uaW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuJGQ7dGhpcy4keT10LmdldEZ1bGxZZWFyKCksdGhpcy4kTT10LmdldE1vbnRoKCksdGhpcy4kRD10LmdldERhdGUoKSx0aGlzLiRXPXQuZ2V0RGF5KCksdGhpcy4kSD10LmdldEhvdXJzKCksdGhpcy4kbT10LmdldE1pbnV0ZXMoKSx0aGlzLiRzPXQuZ2V0U2Vjb25kcygpLHRoaXMuJG1zPXQuZ2V0TWlsbGlzZWNvbmRzKCl9LG0uJHV0aWxzPWZ1bmN0aW9uKCl7cmV0dXJuIE99LG0uaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiEodGhpcy4kZC50b1N0cmluZygpPT09JCl9LG0uaXNTYW1lPWZ1bmN0aW9uKHQsZSl7dmFyIG49dyh0KTtyZXR1cm4gdGhpcy5zdGFydE9mKGUpPD1uJiZuPD10aGlzLmVuZE9mKGUpfSxtLmlzQWZ0ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdyh0KTx0aGlzLnN0YXJ0T2YoZSl9LG0uaXNCZWZvcmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lbmRPZihlKTx3KHQpfSxtLiRnPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTy51KHQpP3RoaXNbZV06dGhpcy5zZXQobix0KX0sbS51bml4PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZmxvb3IodGhpcy52YWx1ZU9mKCkvMWUzKX0sbS52YWx1ZU9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQuZ2V0VGltZSgpfSxtLnN0YXJ0T2Y9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ISFPLnUoZSl8fGUsaD1PLnAodCksJD1mdW5jdGlvbih0LGUpe3ZhciBpPU8udyhuLiR1P0RhdGUuVVRDKG4uJHksZSx0KTpuZXcgRGF0ZShuLiR5LGUsdCksbik7cmV0dXJuIHI/aTppLmVuZE9mKGEpfSxsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE8udyhuLnRvRGF0ZSgpW3RdLmFwcGx5KG4udG9EYXRlKFwic1wiKSwocj9bMCwwLDAsMF06WzIzLDU5LDU5LDk5OV0pLnNsaWNlKGUpKSxuKX0seT10aGlzLiRXLE09dGhpcy4kTSxtPXRoaXMuJEQsZz1cInNldFwiKyh0aGlzLiR1P1wiVVRDXCI6XCJcIik7c3dpdGNoKGgpe2Nhc2UgYzpyZXR1cm4gcj8kKDEsMCk6JCgzMSwxMSk7Y2FzZSBmOnJldHVybiByPyQoMSxNKTokKDAsTSsxKTtjYXNlIG86dmFyIEQ9dGhpcy4kbG9jYWxlKCkud2Vla1N0YXJ0fHwwLHY9KHk8RD95Kzc6eSktRDtyZXR1cm4gJChyP20tdjptKyg2LXYpLE0pO2Nhc2UgYTpjYXNlIGQ6cmV0dXJuIGwoZytcIkhvdXJzXCIsMCk7Y2FzZSB1OnJldHVybiBsKGcrXCJNaW51dGVzXCIsMSk7Y2FzZSBzOnJldHVybiBsKGcrXCJTZWNvbmRzXCIsMik7Y2FzZSBpOnJldHVybiBsKGcrXCJNaWxsaXNlY29uZHNcIiwzKTtkZWZhdWx0OnJldHVybiB0aGlzLmNsb25lKCl9fSxtLmVuZE9mPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0YXJ0T2YodCwhMSl9LG0uJHNldD1mdW5jdGlvbih0LGUpe3ZhciBuLG89Ty5wKHQpLGg9XCJzZXRcIisodGhpcy4kdT9cIlVUQ1wiOlwiXCIpLCQ9KG49e30sblthXT1oK1wiRGF0ZVwiLG5bZF09aCtcIkRhdGVcIixuW2ZdPWgrXCJNb250aFwiLG5bY109aCtcIkZ1bGxZZWFyXCIsblt1XT1oK1wiSG91cnNcIixuW3NdPWgrXCJNaW51dGVzXCIsbltpXT1oK1wiU2Vjb25kc1wiLG5bcl09aCtcIk1pbGxpc2Vjb25kc1wiLG4pW29dLGw9bz09PWE/dGhpcy4kRCsoZS10aGlzLiRXKTplO2lmKG89PT1mfHxvPT09Yyl7dmFyIHk9dGhpcy5jbG9uZSgpLnNldChkLDEpO3kuJGRbJF0obCkseS5pbml0KCksdGhpcy4kZD15LnNldChkLE1hdGgubWluKHRoaXMuJEQseS5kYXlzSW5Nb250aCgpKSkuJGR9ZWxzZSAkJiZ0aGlzLiRkWyRdKGwpO3JldHVybiB0aGlzLmluaXQoKSx0aGlzfSxtLnNldD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNsb25lKCkuJHNldCh0LGUpfSxtLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpc1tPLnAodCldKCl9LG0uYWRkPWZ1bmN0aW9uKHIsaCl7dmFyIGQsJD10aGlzO3I9TnVtYmVyKHIpO3ZhciBsPU8ucChoKSx5PWZ1bmN0aW9uKHQpe3ZhciBlPXcoJCk7cmV0dXJuIE8udyhlLmRhdGUoZS5kYXRlKCkrTWF0aC5yb3VuZCh0KnIpKSwkKX07aWYobD09PWYpcmV0dXJuIHRoaXMuc2V0KGYsdGhpcy4kTStyKTtpZihsPT09YylyZXR1cm4gdGhpcy5zZXQoYyx0aGlzLiR5K3IpO2lmKGw9PT1hKXJldHVybiB5KDEpO2lmKGw9PT1vKXJldHVybiB5KDcpO3ZhciBNPShkPXt9LGRbc109ZSxkW3VdPW4sZFtpXT10LGQpW2xdfHwxLG09dGhpcy4kZC5nZXRUaW1lKCkrcipNO3JldHVybiBPLncobSx0aGlzKX0sbS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFkZCgtMSp0LGUpfSxtLmZvcm1hdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy4kbG9jYWxlKCk7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBuLmludmFsaWREYXRlfHwkO3ZhciByPXR8fFwiWVlZWS1NTS1ERFRISDptbTpzc1pcIixpPU8ueih0aGlzKSxzPXRoaXMuJEgsdT10aGlzLiRtLGE9dGhpcy4kTSxvPW4ud2Vla2RheXMsZj1uLm1vbnRocyxoPWZ1bmN0aW9uKHQsbixpLHMpe3JldHVybiB0JiYodFtuXXx8dChlLHIpKXx8aVtuXS5zdWJzdHIoMCxzKX0sYz1mdW5jdGlvbih0KXtyZXR1cm4gTy5zKHMlMTJ8fDEyLHQsXCIwXCIpfSxkPW4ubWVyaWRpZW18fGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10PDEyP1wiQU1cIjpcIlBNXCI7cmV0dXJuIG4/ci50b0xvd2VyQ2FzZSgpOnJ9LGw9e1lZOlN0cmluZyh0aGlzLiR5KS5zbGljZSgtMiksWVlZWTp0aGlzLiR5LE06YSsxLE1NOk8ucyhhKzEsMixcIjBcIiksTU1NOmgobi5tb250aHNTaG9ydCxhLGYsMyksTU1NTTpoKGYsYSksRDp0aGlzLiRELEREOk8ucyh0aGlzLiRELDIsXCIwXCIpLGQ6U3RyaW5nKHRoaXMuJFcpLGRkOmgobi53ZWVrZGF5c01pbix0aGlzLiRXLG8sMiksZGRkOmgobi53ZWVrZGF5c1Nob3J0LHRoaXMuJFcsbywzKSxkZGRkOm9bdGhpcy4kV10sSDpTdHJpbmcocyksSEg6Ty5zKHMsMixcIjBcIiksaDpjKDEpLGhoOmMoMiksYTpkKHMsdSwhMCksQTpkKHMsdSwhMSksbTpTdHJpbmcodSksbW06Ty5zKHUsMixcIjBcIiksczpTdHJpbmcodGhpcy4kcyksc3M6Ty5zKHRoaXMuJHMsMixcIjBcIiksU1NTOk8ucyh0aGlzLiRtcywzLFwiMFwiKSxaOml9O3JldHVybiByLnJlcGxhY2UoeSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8bFt0XXx8aS5yZXBsYWNlKFwiOlwiLFwiXCIpfSkpfSxtLnV0Y09mZnNldD1mdW5jdGlvbigpe3JldHVybiAxNSotTWF0aC5yb3VuZCh0aGlzLiRkLmdldFRpbWV6b25lT2Zmc2V0KCkvMTUpfSxtLmRpZmY9ZnVuY3Rpb24ocixkLCQpe3ZhciBsLHk9Ty5wKGQpLE09dyhyKSxtPShNLnV0Y09mZnNldCgpLXRoaXMudXRjT2Zmc2V0KCkpKmUsZz10aGlzLU0sRD1PLm0odGhpcyxNKTtyZXR1cm4gRD0obD17fSxsW2NdPUQvMTIsbFtmXT1ELGxbaF09RC8zLGxbb109KGctbSkvNjA0OGU1LGxbYV09KGctbSkvODY0ZTUsbFt1XT1nL24sbFtzXT1nL2UsbFtpXT1nL3QsbClbeV18fGcsJD9EOk8uYShEKX0sbS5kYXlzSW5Nb250aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVuZE9mKGYpLiREfSxtLiRsb2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdlt0aGlzLiRMXX0sbS5sb2NhbGU9ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gdGhpcy4kTDt2YXIgbj10aGlzLmNsb25lKCkscj1TKHQsZSwhMCk7cmV0dXJuIHImJihuLiRMPXIpLG59LG0uY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gTy53KHRoaXMuJGQsdGhpcyl9LG0udG9EYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKX0sbS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/dGhpcy50b0lTT1N0cmluZygpOm51bGx9LG0udG9JU09TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZC50b0lTT1N0cmluZygpfSxtLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQudG9VVENTdHJpbmcoKX0sTX0oKSxiPV8ucHJvdG90eXBlO3JldHVybiB3LnByb3RvdHlwZT1iLFtbXCIkbXNcIixyXSxbXCIkc1wiLGldLFtcIiRtXCIsc10sW1wiJEhcIix1XSxbXCIkV1wiLGFdLFtcIiRNXCIsZl0sW1wiJHlcIixjXSxbXCIkRFwiLGRdXS5mb3JFYWNoKChmdW5jdGlvbih0KXtiW3RbMV1dPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiRnKGUsdFswXSx0WzFdKX19KSksdy5leHRlbmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC4kaXx8KHQoZSxfLHcpLHQuJGk9ITApLHd9LHcubG9jYWxlPVMsdy5pc0RheWpzPXAsdy51bml4PWZ1bmN0aW9uKHQpe3JldHVybiB3KDFlMyp0KX0sdy5lbj12W0RdLHcuTHM9dix3LnA9e30sd30pKTsiLCBudWxsLCBudWxsLCAiIWZ1bmN0aW9uKHQsbil7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9bigpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUobik6KHQ9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczp0fHxzZWxmKS5kYXlqc19wbHVnaW5fcXVhcnRlck9mWWVhcj1uKCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9XCJtb250aFwiLG49XCJxdWFydGVyXCI7cmV0dXJuIGZ1bmN0aW9uKGUsaSl7dmFyIHI9aS5wcm90b3R5cGU7ci5xdWFydGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLiR1dGlscygpLnUodCk/TWF0aC5jZWlsKCh0aGlzLm1vbnRoKCkrMSkvMyk6dGhpcy5tb250aCh0aGlzLm1vbnRoKCklMyszKih0LTEpKX07dmFyIHM9ci5hZGQ7ci5hZGQ9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gZT1OdW1iZXIoZSksdGhpcy4kdXRpbHMoKS5wKGkpPT09bj90aGlzLmFkZCgzKmUsdCk6cy5iaW5kKHRoaXMpKGUsaSl9O3ZhciB1PXIuc3RhcnRPZjtyLnN0YXJ0T2Y9ZnVuY3Rpb24oZSxpKXt2YXIgcj10aGlzLiR1dGlscygpLHM9ISFyLnUoaSl8fGk7aWYoci5wKGUpPT09bil7dmFyIG89dGhpcy5xdWFydGVyKCktMTtyZXR1cm4gcz90aGlzLm1vbnRoKDMqbykuc3RhcnRPZih0KS5zdGFydE9mKFwiZGF5XCIpOnRoaXMubW9udGgoMypvKzIpLmVuZE9mKHQpLmVuZE9mKFwiZGF5XCIpfXJldHVybiB1LmJpbmQodGhpcykoZSxpKX19fSkpOyIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgT3BlcmF0b3JzO1xuKGZ1bmN0aW9uIChPcGVyYXRvcnMpIHtcbiAgICBPcGVyYXRvcnNbXCJBTkRcIl0gPSBcIkFORFwiO1xuICAgIE9wZXJhdG9yc1tcIk9SXCJdID0gXCJPUlwiO1xuICAgIE9wZXJhdG9yc1tcIlhPUlwiXSA9IFwiWE9SXCI7XG4gICAgT3BlcmF0b3JzW1wiTk9UXCJdID0gXCJOT1RcIjtcbn0pKE9wZXJhdG9ycyA9IGV4cG9ydHMuT3BlcmF0b3JzIHx8IChleHBvcnRzLk9wZXJhdG9ycyA9IHt9KSk7XG52YXIgU3RydWN0dXJhbENoYXJhY3RlcnM7XG4oZnVuY3Rpb24gKFN0cnVjdHVyYWxDaGFyYWN0ZXJzKSB7XG4gICAgU3RydWN0dXJhbENoYXJhY3RlcnNbXCJPUEVOX1BBUkVOVEhFU0lTXCJdID0gXCIoXCI7XG4gICAgU3RydWN0dXJhbENoYXJhY3RlcnNbXCJDTE9TRV9QQVJFTlRIRVNJU1wiXSA9IFwiKVwiO1xufSkoU3RydWN0dXJhbENoYXJhY3RlcnMgPSBleHBvcnRzLlN0cnVjdHVyYWxDaGFyYWN0ZXJzIHx8IChleHBvcnRzLlN0cnVjdHVyYWxDaGFyYWN0ZXJzID0ge30pKTtcbnZhciBUb2tlbnM7XG4oZnVuY3Rpb24gKFRva2Vucykge1xuICAgIFRva2Vuc1tcIklERU5USUZJRVJcIl0gPSBcIklERU5USUZJRVJcIjtcbiAgICBUb2tlbnNbXCJPUEVSQVRPUlwiXSA9IFwiT1BFUkFUT1JcIjtcbiAgICBUb2tlbnNbXCJTVFJVQ1RVUkFMX0NIQVJBQ1RFUlwiXSA9IFwiU1RSVUNUVVJBTF9DSEFSQUNURVJcIjtcbiAgICBUb2tlbnNbXCJFT0ZcIl0gPSBcIkVPRlwiO1xuICAgIFRva2Vuc1tcIkNPTU1FTlRcIl0gPSBcIkNPTU1FTlRcIjtcbn0pKFRva2VucyA9IGV4cG9ydHMuVG9rZW5zIHx8IChleHBvcnRzLlRva2VucyA9IHt9KSk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIHR5cGVzXzEgPSByZXF1aXJlKFwiLi4vdHlwZXNcIik7XG5leHBvcnRzLk9QRVJBVE9SX1BSRUNFREVOQ0UgPSB7XG4gICAgTk9UOiAwLFxuICAgIFhPUjogMSxcbiAgICBBTkQ6IDIsXG4gICAgT1I6IDNcbn07XG5leHBvcnRzLlZBTElEX1RPS0VOUyA9IHtcbiAgICBpZGVudGlmaWVyT25seTogW1xuICAgICAgICB7IG5hbWU6IHR5cGVzXzEuVG9rZW5zLklERU5USUZJRVIgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogdHlwZXNfMS5Ub2tlbnMuU1RSVUNUVVJBTF9DSEFSQUNURVIsXG4gICAgICAgICAgICB2YWx1ZTogdHlwZXNfMS5TdHJ1Y3R1cmFsQ2hhcmFjdGVycy5PUEVOX1BBUkVOVEhFU0lTXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBpZGVudGlmaWVyT3JOb3Q6IFtcbiAgICAgICAgeyBuYW1lOiB0eXBlc18xLlRva2Vucy5JREVOVElGSUVSIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHR5cGVzXzEuVG9rZW5zLlNUUlVDVFVSQUxfQ0hBUkFDVEVSLFxuICAgICAgICAgICAgdmFsdWU6IHR5cGVzXzEuU3RydWN0dXJhbENoYXJhY3RlcnMuT1BFTl9QQVJFTlRIRVNJU1xuICAgICAgICB9LFxuICAgICAgICB7IG5hbWU6IHR5cGVzXzEuVG9rZW5zLk9QRVJBVE9SLCB2YWx1ZTogdHlwZXNfMS5PcGVyYXRvcnMuTk9UIH0sXG4gICAgXSxcbiAgICBiaW5hcnlPcGVyYXRvcjogW1xuICAgICAgICB7IG5hbWU6IHR5cGVzXzEuVG9rZW5zLk9QRVJBVE9SLCB2YWx1ZTogdHlwZXNfMS5PcGVyYXRvcnMuQU5EIH0sXG4gICAgICAgIHsgbmFtZTogdHlwZXNfMS5Ub2tlbnMuT1BFUkFUT1IsIHZhbHVlOiB0eXBlc18xLk9wZXJhdG9ycy5PUiB9LFxuICAgICAgICB7IG5hbWU6IHR5cGVzXzEuVG9rZW5zLk9QRVJBVE9SLCB2YWx1ZTogdHlwZXNfMS5PcGVyYXRvcnMuWE9SIH0sXG4gICAgXSxcbiAgICBiaW5hcnlPcGVyYXRvck9yQ2xvc2U6IFtcbiAgICAgICAgeyBuYW1lOiB0eXBlc18xLlRva2Vucy5PUEVSQVRPUiwgdmFsdWU6IHR5cGVzXzEuT3BlcmF0b3JzLkFORCB9LFxuICAgICAgICB7IG5hbWU6IHR5cGVzXzEuVG9rZW5zLk9QRVJBVE9SLCB2YWx1ZTogdHlwZXNfMS5PcGVyYXRvcnMuT1IgfSxcbiAgICAgICAgeyBuYW1lOiB0eXBlc18xLlRva2Vucy5PUEVSQVRPUiwgdmFsdWU6IHR5cGVzXzEuT3BlcmF0b3JzLlhPUiB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiB0eXBlc18xLlRva2Vucy5TVFJVQ1RVUkFMX0NIQVJBQ1RFUixcbiAgICAgICAgICAgIHZhbHVlOiB0eXBlc18xLlN0cnVjdHVyYWxDaGFyYWN0ZXJzLkNMT1NFX1BBUkVOVEhFU0lTXG4gICAgICAgIH0sXG4gICAgXVxufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgdHlwZXNfMSA9IHJlcXVpcmUoXCIuLi90eXBlc1wiKTtcbmV4cG9ydHMuU1RSVUNUVVJBTF9DSEFSQUNURVJTID0ge1xuICAgICcoJzogdHlwZXNfMS5TdHJ1Y3R1cmFsQ2hhcmFjdGVycy5PUEVOX1BBUkVOVEhFU0lTLFxuICAgICcpJzogdHlwZXNfMS5TdHJ1Y3R1cmFsQ2hhcmFjdGVycy5DTE9TRV9QQVJFTlRIRVNJU1xufTtcbmV4cG9ydHMuT1BFUkFUT1JTID0ge1xuICAgIEFORDogdHlwZXNfMS5PcGVyYXRvcnMuQU5ELFxuICAgIE9SOiB0eXBlc18xLk9wZXJhdG9ycy5PUixcbiAgICBYT1I6IHR5cGVzXzEuT3BlcmF0b3JzLlhPUixcbiAgICBOT1Q6IHR5cGVzXzEuT3BlcmF0b3JzLk5PVFxufTtcbmV4cG9ydHMuU0VQQVJBVE9SUyA9IG5ldyBTZXQoW1xuICAgIDB4MDAyMCxcbiAgICAweDAwMDksXG4gICAgMHgwMDBhLFxuICAgIDB4MDAwZCxcbl0ubWFwKGZ1bmN0aW9uIChzZXBhcmF0b3IpIHsgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KHNlcGFyYXRvcik7IH0pKTtcbmV4cG9ydHMuUVVPVEVEX0lERU5USUZJRVJfREVMSU1JVEVSID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoMHgwMDIyKTtcbmV4cG9ydHMuQ09NTUVOVF9ERUxJTUlURVIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludCgweDAwMjMpO1xuZXhwb3J0cy5FT0wgPSBTdHJpbmcuZnJvbUNvZGVQb2ludCgweDAwMGEpO1xuZXhwb3J0cy5FU0NBUEVfQ0hBUkFDVEVSID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoMHgwMDVjKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIHR5cGVzXzEgPSByZXF1aXJlKFwiLi4vdHlwZXNcIik7XG52YXIgY29uc3RfMSA9IHJlcXVpcmUoXCIuL2NvbnN0XCIpO1xuZXhwb3J0cy5jcmVhdGVSZXN1bHQgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIHJlbWFpbmluZ1N0cmluZykgeyByZXR1cm4gKHtcbiAgICB0b2tlbjogX19hc3NpZ24oeyBuYW1lOiBuYW1lIH0sICh2YWx1ZSAhPT0gbnVsbCA/IHsgdmFsdWU6IHZhbHVlIH0gOiB7fSkpLFxuICAgIHJlbWFpbmluZ1N0cmluZzogcmVtYWluaW5nU3RyaW5nXG59KTsgfTtcbmV4cG9ydHMuZ2V0Q29tbWVudCA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG4gICAgdmFyIHRva2VuRW5kID0gZXhwcmVzc2lvbi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9uLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBsZXR0ZXIgPSBleHByZXNzaW9uW2ldO1xuICAgICAgICBpZiAobGV0dGVyID09PSBjb25zdF8xLkVPTCkge1xuICAgICAgICAgICAgdG9rZW5FbmQgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4cG9ydHMuY3JlYXRlUmVzdWx0KHR5cGVzXzEuVG9rZW5zLkNPTU1FTlQsIGV4cHJlc3Npb24uc2xpY2UoMCwgdG9rZW5FbmQpLCBleHByZXNzaW9uLnNsaWNlKHRva2VuRW5kICsgMSkpO1xufTtcbmV4cG9ydHMuZ2V0UXVvdGVkSWRlbnRpZmllciA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG4gICAgdmFyIGVzY2FwZVF1b3RhdGlvbiA9IGZhbHNlO1xuICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgIHZhciB0b2tlbkVuZCA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9uLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjaGFyID0gZXhwcmVzc2lvbltpXTtcbiAgICAgICAgaWYgKHRva2VuRW5kID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY2hhciA9PT0gY29uc3RfMS5RVU9URURfSURFTlRJRklFUl9ERUxJTUlURVIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXNjYXBlUXVvdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoLTEpICsgY29uc3RfMS5RVU9URURfSURFTlRJRklFUl9ERUxJTUlURVI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbkVuZCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09IGNvbnN0XzEuRVNDQVBFX0NIQVJBQ1RFUikge1xuICAgICAgICAgICAgICAgICAgICBlc2NhcGVRdW90YXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlUXVvdGF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKz0gY2hhcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghY29uc3RfMS5TRVBBUkFUT1JTLmhhcyhjaGFyKSAmJiAhY29uc3RfMS5TVFJVQ1RVUkFMX0NIQVJBQ1RFUlNbY2hhcl0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogXCIgKyBjaGFyICsgXCIgRXhwZWN0ZWQgKSBjaGFyYWN0ZXIgb3Igc2VwYXJhdG9yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRva2VuRW5kID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgZW5kIG9mIGV4cHJlc3Npb246IGV4cGVjdGVkIFwiICsgY29uc3RfMS5RVU9URURfSURFTlRJRklFUl9ERUxJTUlURVIgKyBcIiBjaGFyYWN0ZXJcIik7XG4gICAgfVxuICAgIHJldHVybiBleHBvcnRzLmNyZWF0ZVJlc3VsdCh0eXBlc18xLlRva2Vucy5JREVOVElGSUVSLCB2YWx1ZSwgZXhwcmVzc2lvbi5zbGljZSh0b2tlbkVuZCArIDEpKTtcbn07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIHR5cGVzXzEgPSByZXF1aXJlKFwiLi4vdHlwZXNcIik7XG52YXIgY29uc3RfMSA9IHJlcXVpcmUoXCIuL2NvbnN0XCIpO1xudmFyIHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmV4cG9ydHMubGV4ID0gZnVuY3Rpb24gKGV4cHJlc3Npb24pIHtcbiAgICB2YXIgdG9rZW5TdGFydCA9IG51bGw7XG4gICAgdmFyIHRva2VuRW5kID0gbnVsbDtcbiAgICB2YXIgZGVsaW1pdGluZ0NoYXJhY3RlciA9IG51bGw7XG4gICAgLy8gTG9vcHMgdGhyb3VnaCBjaGFyYWN0ZXJzIGluIHRoZSBleHByZXNzaW9uIHVudGlsIHRoZSBuZXh0IHRva2VuIGlzIGZvdW5kXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9uLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjaGFyID0gZXhwcmVzc2lvbltpXTtcbiAgICAgICAgLy8gRmluZHMgdG9rZW0gc3RhcnQgYW5kIHJldHVybnMgaW1tZWRpYXRlbHkgcmV0dXJucyBhbnkgaWRlbnRpZmlhYmxlIHRva2Vuc1xuICAgICAgICBpZiAodG9rZW5TdGFydCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCFjb25zdF8xLlNFUEFSQVRPUlMuaGFzKGNoYXIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0cnVjdHVyYWxDaGFyID0gY29uc3RfMS5TVFJVQ1RVUkFMX0NIQVJBQ1RFUlNbY2hhcl07XG4gICAgICAgICAgICAgICAgaWYgKHN0cnVjdHVyYWxDaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0Q2hhciA9IGV4cHJlc3Npb25baSArIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RydWN0dXJhbENoYXIgPT09IHR5cGVzXzEuU3RydWN0dXJhbENoYXJhY3RlcnMuQ0xPU0VfUEFSRU5USEVTSVMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDaGFyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhY29uc3RfMS5TRVBBUkFUT1JTLmhhcyhuZXh0Q2hhcikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDaGFyICE9PSB0eXBlc18xLlN0cnVjdHVyYWxDaGFyYWN0ZXJzLkNMT1NFX1BBUkVOVEhFU0lTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogXCIgKyBuZXh0Q2hhciArIFwiLiBBIGNsb3NpbmcgcGFyZW50aGVzaXMgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgY2xvc2luZyBwYXJlbnRoZXNpcyBvciB3aGl0ZXNwYWNlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1dGlsc18xLmNyZWF0ZVJlc3VsdCh0eXBlc18xLlRva2Vucy5TVFJVQ1RVUkFMX0NIQVJBQ1RFUiwgY29uc3RfMS5TVFJVQ1RVUkFMX0NIQVJBQ1RFUlNbY2hhcl0sIGV4cHJlc3Npb24uc2xpY2UoaSArIDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gT25jZSBhIHF1b3RlZCBpZGVudGlmaWVyIGhhcyBiZWVuIGlkZW50aWZpZWQgaXQgaXMgcmV0cmlldmVkIGluIGEgc2VwYXJhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICBpZiAoY2hhciA9PT0gY29uc3RfMS5RVU9URURfSURFTlRJRklFUl9ERUxJTUlURVIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzXzEuZ2V0UXVvdGVkSWRlbnRpZmllcihleHByZXNzaW9uLnNsaWNlKGkgKyAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE9uY2UgYSBjb21tZW50IGhhcyBiZWVuIGlkZW50aWZpZWQgaXQgaXMgcmV0cmlldmVkIGluIGEgc2VwYXJhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICBpZiAoY2hhciA9PT0gY29uc3RfMS5DT01NRU5UX0RFTElNSVRFUikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXRpbHNfMS5nZXRDb21tZW50KGV4cHJlc3Npb24uc2xpY2UoaSArIDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdG9rZW5TdGFydCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBCcmVha3Mgb24gdGhlIGVuZCBvZiB0aGUgdG9rZW4gYW5kIHRocm93cyBvbiBpbnZhbGlkIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGlmIChjb25zdF8xLlNFUEFSQVRPUlMuaGFzKGNoYXIpIHx8IGNvbnN0XzEuU1RSVUNUVVJBTF9DSEFSQUNURVJTW2NoYXJdKSB7XG4gICAgICAgICAgICAgICAgdG9rZW5FbmQgPSBpO1xuICAgICAgICAgICAgICAgIGRlbGltaXRpbmdDaGFyYWN0ZXIgPSBjaGFyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09IGNvbnN0XzEuUVVPVEVEX0lERU5USUZJRVJfREVMSU1JVEVSIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYXIgPT09IGNvbnN0XzEuQ09NTUVOVF9ERUxJTUlURVIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBjaGFyYWN0ZXI6IFwiICsgY2hhcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNlcGFyYXRlcyBvcGVyYXRvcnMgZnJvbSBpZGVudGlmaWVycyBhbmQgcmV0dXJucyB0aGUgY29ycmVjdCB0b2tlblxuICAgIGlmICh0b2tlblN0YXJ0ICE9PSBudWxsKSB7XG4gICAgICAgIHRva2VuRW5kID0gKHRva2VuRW5kICE9PSBudWxsICYmIHRva2VuRW5kICE9PSB2b2lkIDAgPyB0b2tlbkVuZCA6IGV4cHJlc3Npb24ubGVuZ3RoKTtcbiAgICAgICAgdmFyIHZhbHVlID0gZXhwcmVzc2lvbi5zbGljZSh0b2tlblN0YXJ0LCB0b2tlbkVuZCk7XG4gICAgICAgIHZhciByZW1haW5pbmdTdHJpbmcgPSBleHByZXNzaW9uLnNsaWNlKHRva2VuRW5kKTtcbiAgICAgICAgaWYgKGNvbnN0XzEuT1BFUkFUT1JTW3ZhbHVlXSkge1xuICAgICAgICAgICAgaWYgKGRlbGltaXRpbmdDaGFyYWN0ZXIgJiYgIWNvbnN0XzEuU0VQQVJBVE9SUy5oYXMoZGVsaW1pdGluZ0NoYXJhY3RlcikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogXCIgKyBkZWxpbWl0aW5nQ2hhcmFjdGVyICsgXCIuIE9wZXJhdG9ycyBzaG91bGQgYmUgc2VwYXJhdGVkIHVzaW5nIHdoaXRlc3BhY2VcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXRpbHNfMS5jcmVhdGVSZXN1bHQodHlwZXNfMS5Ub2tlbnMuT1BFUkFUT1IsIGNvbnN0XzEuT1BFUkFUT1JTW3ZhbHVlXSwgcmVtYWluaW5nU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlsc18xLmNyZWF0ZVJlc3VsdCh0eXBlc18xLlRva2Vucy5JREVOVElGSUVSLCB2YWx1ZSwgcmVtYWluaW5nU3RyaW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0aGlzIGlzIHJlYWNoZWQgbm8gdG9rZW5zIHdlcmUgZm91bmQgc28gRU9GIGlzIHJldHVybmVkXG4gICAgcmV0dXJuIHV0aWxzXzEuY3JlYXRlUmVzdWx0KHR5cGVzXzEuVG9rZW5zLkVPRiwgbnVsbCwgJycpO1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX3NwcmVhZEFycmF5cyA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheXMpIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgICAgcltrXSA9IGFbal07XG4gICAgcmV0dXJuIHI7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBsZXhfMSA9IHJlcXVpcmUoXCIuLi9sZXgvbGV4XCIpO1xudmFyIHR5cGVzXzEgPSByZXF1aXJlKFwiLi4vdHlwZXNcIik7XG52YXIgY29uc3RfMSA9IHJlcXVpcmUoXCIuL2NvbnN0XCIpO1xuZXhwb3J0cy5uZXdUb2tlbkdlbmVyYXRvciA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG4gICAgdmFyIHJlbWFpbmluZ0V4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIHJldHVybiBmdW5jdGlvbiAodmFsaWRUb2tlbnMsIGVuZElzVmFsaWQpIHtcbiAgICAgICAgaWYgKGVuZElzVmFsaWQgPT09IHZvaWQgMCkgeyBlbmRJc1ZhbGlkID0gZmFsc2U7IH1cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGxleF8xLmxleChyZW1haW5pbmdFeHByZXNzaW9uKSwgdG9rZW4gPSBfYS50b2tlbiwgcmVtYWluaW5nU3RyaW5nID0gX2EucmVtYWluaW5nU3RyaW5nO1xuICAgICAgICAgICAgcmVtYWluaW5nRXhwcmVzc2lvbiA9IHJlbWFpbmluZ1N0cmluZztcbiAgICAgICAgICAgIGlmICh0b2tlbi5uYW1lICE9PSB0eXBlc18xLlRva2Vucy5DT01NRU5UKSB7XG4gICAgICAgICAgICAgICAgZXhwb3J0cy52YWxpZGF0ZVRva2VuKHRva2VuLCB2YWxpZFRva2VucywgZW5kSXNWYWxpZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn07XG5leHBvcnRzLmdldFZhbHVlID0gZnVuY3Rpb24gKGdldE5leHRUb2tlbiwgcGFyc2VyKSB7XG4gICAgdmFyIG5leHRUb2tlbiA9IGdldE5leHRUb2tlbihjb25zdF8xLlZBTElEX1RPS0VOUy5pZGVudGlmaWVyT3JOb3QpO1xuICAgIHZhciBuZWdhdGVkVmFsdWUgPSBuZXh0VG9rZW4udmFsdWUgPT09IHR5cGVzXzEuT3BlcmF0b3JzLk5PVDtcbiAgICBpZiAobmVnYXRlZFZhbHVlKSB7XG4gICAgICAgIG5leHRUb2tlbiA9IGdldE5leHRUb2tlbihjb25zdF8xLlZBTElEX1RPS0VOUy5pZGVudGlmaWVyT25seSk7XG4gICAgfVxuICAgIHZhciB2YWx1ZSA9IG5leHRUb2tlbi5uYW1lID09PSB0eXBlc18xLlRva2Vucy5TVFJVQ1RVUkFMX0NIQVJBQ1RFUlxuICAgICAgICA/IHBhcnNlcihnZXROZXh0VG9rZW4sIHRydWUpXG4gICAgICAgIDogW25leHRUb2tlbl07XG4gICAgcmV0dXJuIG5lZ2F0ZWRWYWx1ZVxuICAgICAgICA/IF9fc3ByZWFkQXJyYXlzKHZhbHVlLCBbeyBuYW1lOiB0eXBlc18xLlRva2Vucy5PUEVSQVRPUiwgdmFsdWU6IHR5cGVzXzEuT3BlcmF0b3JzLk5PVCB9XSkgOiB2YWx1ZTtcbn07XG5leHBvcnRzLnByZXZpb3VzT3BlcmF0b3JUYWtlc1ByZWNlZGVudCA9IGZ1bmN0aW9uIChwcmV2aW91c09wZXJhdG9yLCBuZXh0T3BlcmF0b3IpIHtcbiAgICByZXR1cm4gY29uc3RfMS5PUEVSQVRPUl9QUkVDRURFTkNFW3ByZXZpb3VzT3BlcmF0b3JdIDw9IGNvbnN0XzEuT1BFUkFUT1JfUFJFQ0VERU5DRVtuZXh0T3BlcmF0b3JdO1xufTtcbmV4cG9ydHMudmFsaWRhdGVUb2tlbiA9IGZ1bmN0aW9uICh0b2tlbiwgdmFsaWRUb2tlbnMsIGVuZElzVmFsaWQpIHtcbiAgICBpZiAoZW5kSXNWYWxpZCA9PT0gdm9pZCAwKSB7IGVuZElzVmFsaWQgPSBmYWxzZTsgfVxuICAgIGlmICh0b2tlbi5uYW1lID09PSB0eXBlc18xLlRva2Vucy5FT0YpIHtcbiAgICAgICAgaWYgKGVuZElzVmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIGV4cHJlc3Npb24nKTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2kgPSAwLCB2YWxpZFRva2Vuc18xID0gdmFsaWRUb2tlbnM7IF9pIDwgdmFsaWRUb2tlbnNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHZhbGlkVG9rZW4gPSB2YWxpZFRva2Vuc18xW19pXTtcbiAgICAgICAgaWYgKHZhbGlkVG9rZW4ubmFtZSA9PT0gdG9rZW4ubmFtZSkge1xuICAgICAgICAgICAgaWYgKCF2YWxpZFRva2VuLnZhbHVlIHx8IHZhbGlkVG9rZW4udmFsdWUgPT09IHRva2VuLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdG9rZW4nKTtcbn07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19zcHJlYWRBcnJheXMgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXlzKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xuICAgIHJldHVybiByO1xufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgdHlwZXNfMSA9IHJlcXVpcmUoXCIuLi90eXBlc1wiKTtcbnZhciBjb25zdF8xID0gcmVxdWlyZShcIi4vY29uc3RcIik7XG52YXIgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuLy8gUmV0dXJucyB0aGUgdG9rZW5zIHVzaW5nIHBvc3RmaXggbm90YXRpb25cbmV4cG9ydHMucGFyc2UgPSBmdW5jdGlvbiAoZXhwcmVzc2lvbikge1xuICAgIGlmICh0eXBlb2YgZXhwcmVzc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgc3RyaW5nIGJ1dCByZWNlaXZlZCBcIiArIHR5cGVvZiBleHByZXNzaW9uKTtcbiAgICB9XG4gICAgLy8gZ2V0TmV4dFRva2VuIGtlZXBzIHRyYWNrIG9mIHRoZSByZW1haW5pbmcgZXhwcmVzc2lvblxuICAgIC8vIGFuZCByZXR1cm4gdGhlIG5leHQgdG9rZW4gZWFjaCB0aW1lIGl0IGlzIGNhbGxlZFxuICAgIHZhciBnZXROZXh0VG9rZW4gPSB1dGlsc18xLm5ld1Rva2VuR2VuZXJhdG9yKGV4cHJlc3Npb24pO1xuICAgIHJldHVybiBwYXJzZUludGVybmFsKGdldE5leHRUb2tlbik7XG59O1xuLy8gcGFyc2VJbnRlcm5hbCB3aWxsIHJlY3Vyc2Ugb3ZlciBicmFja2V0ZWQgZXhwcmVzc2lvbnNcbnZhciBwYXJzZUludGVybmFsID0gZnVuY3Rpb24gKGdldE5leHRUb2tlbiwgbmVzdGVkKSB7XG4gICAgaWYgKG5lc3RlZCA9PT0gdm9pZCAwKSB7IG5lc3RlZCA9IGZhbHNlOyB9XG4gICAgLy8gVGhpcyBpbml0aWFsaXNlcyB0aGUgb3V0cHV0IHdpdGggZXZlcnl0aGluZyB1cCB0aGUgZmlyc3QgdW5uZXN0ZWQgb3BlcmF0b3JcbiAgICB2YXIgb3V0cHV0ID0gX19zcHJlYWRBcnJheXModXRpbHNfMS5nZXRWYWx1ZShnZXROZXh0VG9rZW4sIHBhcnNlSW50ZXJuYWwpKTtcbiAgICB2YXIgb3BlcmF0b3JzID0gW107XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIHZhbGlkVG9rZW5zID0gbmVzdGVkXG4gICAgICAgICAgICA/IGNvbnN0XzEuVkFMSURfVE9LRU5TLmJpbmFyeU9wZXJhdG9yT3JDbG9zZVxuICAgICAgICAgICAgOiBjb25zdF8xLlZBTElEX1RPS0VOUy5iaW5hcnlPcGVyYXRvcjtcbiAgICAgICAgLy8gUmV0cmlldmVzIHRoZSBuZXh0IFRva2VuXG4gICAgICAgIHZhciBuZXh0VG9rZW4gPSBnZXROZXh0VG9rZW4odmFsaWRUb2tlbnMsICFuZXN0ZWQpO1xuICAgICAgICBpZiAobmV4dFRva2VuLm5hbWUgPT09IHR5cGVzXzEuVG9rZW5zLkVPRiB8fCAvLyBJZiB0aGUgZW5kIG9mIGZpbGUgaXMgZm91bmQgaGVyZSB0aGVuIHJldHVybiB3aGF0IHdlIGhhdmVcbiAgICAgICAgICAgIG5leHRUb2tlbi5uYW1lID09PSB0eXBlc18xLlRva2Vucy5TVFJVQ1RVUkFMX0NIQVJBQ1RFUiAvLyBUaGUgZXhwcmVzc2lvbiB3aWxsIGJlIHJldHVybmVkIGFuZCBpbmNvcnBvcmF0ZWQgaW50byB0aGUgZmluYWwgZXhwcmVzc2lvblxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhvdXRwdXQsIF9fc3ByZWFkQXJyYXlzKG9wZXJhdG9ycykucmV2ZXJzZSgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbiBwb3N0Zml4IG5vdGF0aW9uIG9wZXJhdG9yIG9yZGVyIGlzIGRldGVybWluZWQgYnkgcHJlY2VkZW5jZVxuICAgICAgICB3aGlsZSAob3BlcmF0b3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHByZXZpb3VzT3BlcmF0b3IgPSBvcGVyYXRvcnNbb3BlcmF0b3JzLmxlbmd0aCAtIDFdIHx8IG51bGw7XG4gICAgICAgICAgICBpZiAocHJldmlvdXNPcGVyYXRvciAmJlxuICAgICAgICAgICAgICAgIHV0aWxzXzEucHJldmlvdXNPcGVyYXRvclRha2VzUHJlY2VkZW50KHByZXZpb3VzT3BlcmF0b3IudmFsdWUsIG5leHRUb2tlbi52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBfX3NwcmVhZEFycmF5cyhvdXRwdXQsIFtwcmV2aW91c09wZXJhdG9yXSk7XG4gICAgICAgICAgICAgICAgb3BlcmF0b3JzID0gb3BlcmF0b3JzLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBuZXcgb3BlcmF0b3IgaXMgbm93IGFkZGVkIHRvIHRoZSBzdGFja1xuICAgICAgICBvcGVyYXRvcnMgPSBfX3NwcmVhZEFycmF5cyhvcGVyYXRvcnMsIFtuZXh0VG9rZW5dKTtcbiAgICAgICAgLy8gT25jZSB0aGlzIGlzIGRvbmUgd2UgY2FuIGdldCBldmVyeXRoaW5nIHVudGlsIHRoZSBuZXh0IHVubmVzdGVkXG4gICAgICAgIC8vIG9wZXJhdG9yIGFuZCBhZGQgaXQgdG8gdGhlIG91dHB1dFxuICAgICAgICBvdXRwdXQgPSBfX3NwcmVhZEFycmF5cyhvdXRwdXQsIHV0aWxzXzEuZ2V0VmFsdWUoZ2V0TmV4dFRva2VuLCBwYXJzZUludGVybmFsKSk7XG4gICAgfVxufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgdHlwZXNfMSA9IHJlcXVpcmUoXCIuLi90eXBlc1wiKTtcbmV4cG9ydHMuYW5kVXRpbCA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkgeyByZXR1cm4gbGVmdCAmJiByaWdodDsgfTtcbmV4cG9ydHMub3JVdGlsID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IHJldHVybiBsZWZ0IHx8IHJpZ2h0OyB9O1xuZXhwb3J0cy54b3JVdGlsID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IHJldHVybiAhKGxlZnQgPT09IHJpZ2h0KTsgfTtcbmV4cG9ydHMubm90VXRpbCA9IGZ1bmN0aW9uIChpZGVudGlmaWVyKSB7IHJldHVybiAhaWRlbnRpZmllcjsgfTtcbmV4cG9ydHMuaXNJZGVudGlmaWVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIG5hbWUgPSBfYS5uYW1lLCB2YWx1ZSA9IF9hLnZhbHVlO1xuICAgIHJldHVybiBuYW1lID09PSB0eXBlc18xLlRva2Vucy5JREVOVElGSUVSICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59O1xuZXhwb3J0cy5pc09wZXJhdG9yID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIG5hbWUgPSBfYS5uYW1lLCB2YWx1ZSA9IF9hLnZhbHVlO1xuICAgIHJldHVybiBuYW1lID09PSB0eXBlc18xLlRva2Vucy5PUEVSQVRPUiAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xufTtcbmV4cG9ydHMudGhyb3dJbnZhbGlkRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgcG9zdGZpeCBleHByZXNzaW9uOiBcIiArIG1lc3NhZ2UpO1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBfYTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgdHlwZXNfMSA9IHJlcXVpcmUoXCIuLi90eXBlc1wiKTtcbnZhciB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5leHBvcnRzLk9QRVJBVE9SX01BUCA9IChfYSA9IHt9LFxuICAgIF9hW3R5cGVzXzEuT3BlcmF0b3JzLkFORF0gPSB1dGlsc18xLmFuZFV0aWwsXG4gICAgX2FbdHlwZXNfMS5PcGVyYXRvcnMuT1JdID0gdXRpbHNfMS5vclV0aWwsXG4gICAgX2FbdHlwZXNfMS5PcGVyYXRvcnMuWE9SXSA9IHV0aWxzXzEueG9yVXRpbCxcbiAgICBfYSk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19zcHJlYWRBcnJheXMgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXlzKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xuICAgIHJldHVybiByO1xufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgcGFyc2VfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZS9wYXJzZVwiKTtcbnZhciB0eXBlc18xID0gcmVxdWlyZShcIi4uL3R5cGVzXCIpO1xudmFyIGNvbnN0XzEgPSByZXF1aXJlKFwiLi9jb25zdFwiKTtcbnZhciB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5leHBvcnRzLmdldEV2YWx1YXRvciA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG4gICAgdmFyIHBhcnNlZEV4cHJlc3Npb24gPSBwYXJzZV8xLnBhcnNlKGV4cHJlc3Npb24pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoYm9vbGVhbk1hcCkgeyByZXR1cm4gZXhwb3J0cy5ldmFsdWF0ZShwYXJzZWRFeHByZXNzaW9uLCBib29sZWFuTWFwKTsgfTtcbn07XG5leHBvcnRzLmV2YWx1YXRlID0gZnVuY3Rpb24gKGV4cHJlc3Npb24sIGJvb2xlYW5NYXApIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGV4cHJlc3Npb24gKyBcIiBzaG91bGQgYmUgYW4gYXJyYXkuIGV2YWx1YXRlIHRha2VzIGluIGEgcGFyc2VkIGV4cHJlc3Npb24uIFVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIHBhcnNlIG9yIHVzZSBnZXRFdmFsdWF0b3JcIik7XG4gICAgfVxuICAgIC8vIFJlc29sdmVzIGVhY2ggaWRlbnRpZmllciBhbmQgYWRkcyBpdCB0byBhIHN0YWNrXG4gICAgLy8gV2hlbiBvcGVyYXRvciBpcyBmb3VuZCBpdCBvcGVyYXRlcyBvbiB0aGUgdG9wIHZhbHVlKHMpXG4gICAgLy8gb24gdGhlIHN0YWNrLCByZW1vdmVzIHRoZW0gYW5kIHJlcGxhY2VzIHRoZW0gd2l0aCB0aGVcbiAgICAvLyByZXN1bHRcbiAgICB2YXIgZXZhbHVhdGVkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVkdWNlKGZ1bmN0aW9uIChzdGFjaywgdG9rZW4sIGkpIHtcbiAgICAgICAgaWYgKCEodG9rZW4gJiYgKHV0aWxzXzEuaXNJZGVudGlmaWVyKHRva2VuKSB8fCB1dGlsc18xLmlzT3BlcmF0b3IodG9rZW4pKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdG9rZW46IFwiICsgdG9rZW4gKyBcIi4gRm91bmQgaW4gcGFyc2VkIGV4cHJlc3Npb24gYXQgaW5kZXggXCIgKyBpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4ubmFtZSA9PT0gdHlwZXNfMS5Ub2tlbnMuSURFTlRJRklFUikge1xuICAgICAgICAgICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKHN0YWNrLCBbQm9vbGVhbihib29sZWFuTWFwW3Rva2VuLnZhbHVlXSldKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2Vjb25kTGFzdEl0ZW0gPSBzdGFja1tzdGFjay5sZW5ndGggLSAyXTtcbiAgICAgICAgdmFyIGxhc3RJdGVtID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PT0gdHlwZXNfMS5PcGVyYXRvcnMuTk9UKSB7XG4gICAgICAgICAgICBpZiAobGFzdEl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHV0aWxzXzEudGhyb3dJbnZhbGlkRXhwcmVzc2lvbignbWlzc2luZyBpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoc3RhY2suc2xpY2UoMCwgLTEpLCBbdXRpbHNfMS5ub3RVdGlsKGxhc3RJdGVtKV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0SXRlbSA9PT0gdW5kZWZpbmVkIHx8IHNlY29uZExhc3RJdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHV0aWxzXzEudGhyb3dJbnZhbGlkRXhwcmVzc2lvbignbWlzc2luZyBpZGVudGlmaWVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9wZXJhdG9yVXRpbCA9IGNvbnN0XzEuT1BFUkFUT1JfTUFQW3Rva2VuLnZhbHVlXTtcbiAgICAgICAgaWYgKCFvcGVyYXRvclV0aWwpIHtcbiAgICAgICAgICAgIHV0aWxzXzEudGhyb3dJbnZhbGlkRXhwcmVzc2lvbigndW5rbm93biBvcGVyYXRvcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhzdGFjay5zbGljZSgwLCAtMiksIFtvcGVyYXRvclV0aWwoc2Vjb25kTGFzdEl0ZW0sIGxhc3RJdGVtKV0pO1xuICAgIH0sIFtdKTtcbiAgICBpZiAoZXZhbHVhdGVkRXhwcmVzc2lvbi5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdXRpbHNfMS50aHJvd0ludmFsaWRFeHByZXNzaW9uKCd0b28gbWFueSBpZGVudGlmaWVycyBhZnRlciBldmFsdWF0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiBldmFsdWF0ZWRFeHByZXNzaW9uWzBdO1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgZXZhbHVhdGVfMSA9IHJlcXVpcmUoXCIuL2V2YWx1YXRlL2V2YWx1YXRlXCIpO1xuZXhwb3J0cy5nZXRFdmFsdWF0b3IgPSBldmFsdWF0ZV8xLmdldEV2YWx1YXRvcjtcbmV4cG9ydHMuZXZhbHVhdGUgPSBldmFsdWF0ZV8xLmV2YWx1YXRlO1xudmFyIHBhcnNlXzEgPSByZXF1aXJlKFwiLi9wYXJzZS9wYXJzZVwiKTtcbmV4cG9ydHMucGFyc2UgPSBwYXJzZV8xLnBhcnNlO1xuIiwgImltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQ2FjaGUgfSBmcm9tICcuL0NhY2hlJztcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSAnLi9Db21tYW5kcyc7XG5pbXBvcnQgeyBUYXNrc0V2ZW50cyB9IGZyb20gJy4vVGFza3NFdmVudHMnO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZUZpbGUgfSBmcm9tICcuL0ZpbGUnO1xuaW1wb3J0IHsgSW5saW5lUmVuZGVyZXIgfSBmcm9tICcuL0lubGluZVJlbmRlcmVyJztcbmltcG9ydCB7IG5ld0xpdmVQcmV2aWV3RXh0ZW5zaW9uIH0gZnJvbSAnLi9MaXZlUHJldmlld0V4dGVuc2lvbic7XG5pbXBvcnQgeyBRdWVyeVJlbmRlcmVyIH0gZnJvbSAnLi9RdWVyeVJlbmRlcmVyJztcbmltcG9ydCB7IGdldFNldHRpbmdzLCB1cGRhdGVTZXR0aW5ncyB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdzJztcbmltcG9ydCB7IFNldHRpbmdzVGFiIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ3NUYWInO1xuaW1wb3J0IHsgU3RhdHVzUmVnaXN0cnkgfSBmcm9tICcuL1N0YXR1c1JlZ2lzdHJ5JztcbmltcG9ydCB7IEVkaXRvclN1Z2dlc3RvciB9IGZyb20gJy4vU3VnZ2VzdG9yL0VkaXRvclN1Z2dlc3RvclBvcHVwJztcbmltcG9ydCB7IFN0YXR1c1NldHRpbmdzIH0gZnJvbSAnLi9Db25maWcvU3RhdHVzU2V0dGluZ3MnO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi9UYXNrJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFza3NQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICAgIHByaXZhdGUgY2FjaGU6IENhY2hlIHwgdW5kZWZpbmVkO1xuICAgIHB1YmxpYyBpbmxpbmVSZW5kZXJlcjogSW5saW5lUmVuZGVyZXIgfCB1bmRlZmluZWQ7XG4gICAgcHVibGljIHF1ZXJ5UmVuZGVyZXI6IFF1ZXJ5UmVuZGVyZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBhc3luYyBvbmxvYWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdsb2FkaW5nIHBsdWdpbiBcInRhc2tzXCInKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuICAgICAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IFNldHRpbmdzVGFiKHsgcGx1Z2luOiB0aGlzIH0pKTtcblxuICAgICAgICBpbml0aWFsaXplRmlsZSh7XG4gICAgICAgICAgICBtZXRhZGF0YUNhY2hlOiB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLFxuICAgICAgICAgICAgdmF1bHQ6IHRoaXMuYXBwLnZhdWx0LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBMb2FkIGNvbmZpZ3VyZWQgc3RhdHVzIHR5cGVzLlxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRUYXNrU3RhdHVzZXMoKTtcblxuICAgICAgICBjb25zdCBldmVudHMgPSBuZXcgVGFza3NFdmVudHMoeyBvYnNpZGlhbkV2ZW50czogdGhpcy5hcHAud29ya3NwYWNlIH0pO1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IENhY2hlKHtcbiAgICAgICAgICAgIG1ldGFkYXRhQ2FjaGU6IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUsXG4gICAgICAgICAgICB2YXVsdDogdGhpcy5hcHAudmF1bHQsXG4gICAgICAgICAgICBldmVudHMsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlubGluZVJlbmRlcmVyID0gbmV3IElubGluZVJlbmRlcmVyKHsgcGx1Z2luOiB0aGlzIH0pO1xuICAgICAgICB0aGlzLnF1ZXJ5UmVuZGVyZXIgPSBuZXcgUXVlcnlSZW5kZXJlcih7IHBsdWdpbjogdGhpcywgZXZlbnRzIH0pO1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24obmV3TGl2ZVByZXZpZXdFeHRlbnNpb24oKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJFZGl0b3JTdWdnZXN0KG5ldyBFZGl0b3JTdWdnZXN0b3IodGhpcy5hcHAsIGdldFNldHRpbmdzKCkpKTtcbiAgICAgICAgbmV3IENvbW1hbmRzKHsgcGx1Z2luOiB0aGlzIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGxvYWRUYXNrU3RhdHVzZXMoKSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzU2V0dGluZ3MgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgIFN0YXR1c1NldHRpbmdzLmFwcGx5VG9TdGF0dXNSZWdpc3RyeShzdGF0dXNTZXR0aW5ncywgU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKSk7XG4gICAgfVxuXG4gICAgb251bmxvYWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd1bmxvYWRpbmcgcGx1Z2luIFwidGFza3NcIicpO1xuICAgICAgICB0aGlzLmNhY2hlPy51bmxvYWQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG4gICAgICAgIGNvbnN0IG5ld1NldHRpbmdzID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgICB1cGRhdGVTZXR0aW5ncyhuZXdTZXR0aW5ncyk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFRhc2tTdGF0dXNlcygpO1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGF0YShnZXRTZXR0aW5ncygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGFza3MoKTogVGFza1tdIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGU/LmdldFRhc2tzKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IE1ldGFkYXRhQ2FjaGUsIE5vdGljZSwgVEFic3RyYWN0RmlsZSwgVEZpbGUsIFZhdWx0IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBDYWNoZWRNZXRhZGF0YSwgRXZlbnRSZWYgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IEhlYWRpbmdDYWNoZSwgTGlzdEl0ZW1DYWNoZSwgU2VjdGlvbkNhY2hlIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgTXV0ZXggfSBmcm9tICdhc3luYy1tdXRleCc7XG5cbmltcG9ydCB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuaW1wb3J0IHR5cGUgeyBUYXNrc0V2ZW50cyB9IGZyb20gJy4vVGFza3NFdmVudHMnO1xuaW1wb3J0IHsgRGF0ZUZhbGxiYWNrIH0gZnJvbSAnLi9EYXRlRmFsbGJhY2snO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0NvbmZpZy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBMYXp5IH0gZnJvbSAnLi9saWIvTGF6eSc7XG5cbmV4cG9ydCBlbnVtIFN0YXRlIHtcbiAgICBDb2xkID0gJ0NvbGQnLFxuICAgIEluaXRpYWxpemluZyA9ICdJbml0aWFsaXppbmcnLFxuICAgIFdhcm0gPSAnV2FybScsXG59XG5cbmV4cG9ydCBjbGFzcyBDYWNoZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YUNhY2hlOiBNZXRhZGF0YUNhY2hlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YWRhdGFDYWNoZUV2ZW50UmVmZXJlbmNlczogRXZlbnRSZWZbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhdWx0OiBWYXVsdDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhdWx0RXZlbnRSZWZlcmVuY2VzOiBFdmVudFJlZltdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRzOiBUYXNrc0V2ZW50cztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50c0V2ZW50UmVmZXJlbmNlczogRXZlbnRSZWZbXTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFza3NNdXRleDogTXV0ZXg7XG4gICAgcHJpdmF0ZSBzdGF0ZTogU3RhdGU7XG4gICAgcHJpdmF0ZSB0YXNrczogVGFza1tdO1xuXG4gICAgLyoqXG4gICAgICogV2UgY2Fubm90IGtub3cgaWYgdGhpcyBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCBiZWNhdXNlIG9ic2lkaWFuIHN0YXJ0ZWRcbiAgICAgKiBvciBiZWNhdXNlIHRoZSBwbHVnaW4gd2FzIGFjdGl2YXRlZCBsYXRlci4gVGhpcyBtZWFucyB3ZSBoYXZlIHRvIGxvYWQgdGhlXG4gICAgICogd2hvbGUgdmF1bHQgb25jZSBhZnRlciB0aGUgZmlyc3QgbWV0YWRhdGEgY2FjaGUgcmVzb2x2ZSB0byBlbnN1cmUgdGhhdCB3ZVxuICAgICAqIGxvYWQgdGhlIGVudGlyZSB2YXVsdCBpbiBjYXNlIG9ic2lkaWFuIGlzIHN0YXJ0aW5nIHVwLiBJbiB0aGUgY2FzZSBvZlxuICAgICAqIG9ic2lkaWFuIHN0YXJ0aW5nLCB0aGUgdGFzayBjYWNoZSdzIGluaXRpYWwgbG9hZCB3b3VsZCBlbmQgdXAgd2l0aCAwIHRhc2tzLFxuICAgICAqIGFzIHRoZSBtZXRhZGF0YSBjYWNoZSB3b3VsZCBzdGlsbCBiZSBlbXB0eS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRlZEFmdGVyRmlyc3RSZXNvbHZlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoeyBtZXRhZGF0YUNhY2hlLCB2YXVsdCwgZXZlbnRzIH06IHsgbWV0YWRhdGFDYWNoZTogTWV0YWRhdGFDYWNoZTsgdmF1bHQ6IFZhdWx0OyBldmVudHM6IFRhc2tzRXZlbnRzIH0pIHtcbiAgICAgICAgdGhpcy5tZXRhZGF0YUNhY2hlID0gbWV0YWRhdGFDYWNoZTtcbiAgICAgICAgdGhpcy5tZXRhZGF0YUNhY2hlRXZlbnRSZWZlcmVuY2VzID0gW107XG4gICAgICAgIHRoaXMudmF1bHQgPSB2YXVsdDtcbiAgICAgICAgdGhpcy52YXVsdEV2ZW50UmVmZXJlbmNlcyA9IFtdO1xuICAgICAgICB0aGlzLmV2ZW50cyA9IGV2ZW50cztcbiAgICAgICAgdGhpcy5ldmVudHNFdmVudFJlZmVyZW5jZXMgPSBbXTtcblxuICAgICAgICB0aGlzLnRhc2tzTXV0ZXggPSBuZXcgTXV0ZXgoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNvbGQ7XG4gICAgICAgIHRoaXMudGFza3MgPSBbXTtcblxuICAgICAgICB0aGlzLmxvYWRlZEFmdGVyRmlyc3RSZXNvbHZlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0NhY2hlKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG9WYXVsdCgpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvRXZlbnRzKCk7XG5cbiAgICAgICAgdGhpcy5sb2FkVmF1bHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5sb2FkKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50UmVmZXJlbmNlIG9mIHRoaXMubWV0YWRhdGFDYWNoZUV2ZW50UmVmZXJlbmNlcykge1xuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YUNhY2hlLm9mZnJlZihldmVudFJlZmVyZW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50UmVmZXJlbmNlIG9mIHRoaXMudmF1bHRFdmVudFJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIHRoaXMudmF1bHQub2ZmcmVmKGV2ZW50UmVmZXJlbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZXZlbnRSZWZlcmVuY2Ugb2YgdGhpcy5ldmVudHNFdmVudFJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLm9mZihldmVudFJlZmVyZW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGFza3MoKTogVGFza1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFza3M7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0YXRlKCk6IFN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlTdWJzY3JpYmVycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ldmVudHMudHJpZ2dlckNhY2hlVXBkYXRlKHtcbiAgICAgICAgICAgIHRhc2tzOiB0aGlzLnRhc2tzLFxuICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3Vic2NyaWJlVG9DYWNoZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRFdmVudGVSZWZlcmVuY2UgPSB0aGlzLm1ldGFkYXRhQ2FjaGUub24oJ3Jlc29sdmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZWQgZmlyZXMgb24gZXZlcnkgY2hhbmdlLlxuICAgICAgICAgICAgLy8gV2Ugb25seSB3YW50IHRvIGluaXRpYWxpemUgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LlxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvYWRlZEFmdGVyRmlyc3RSZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWRBZnRlckZpcnN0UmVzb2x2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkVmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWV0YWRhdGFDYWNoZUV2ZW50UmVmZXJlbmNlcy5wdXNoKHJlc29sdmVkRXZlbnRlUmVmZXJlbmNlKTtcblxuICAgICAgICAvLyBEb2VzIG5vdCBmaXJlIHdoZW4gc3RhcnRpbmcgdXAgb2JzaWRpYW4gYW5kIG9ubHkgd29ya3MgZm9yIGNoYW5nZXMuXG4gICAgICAgIGNvbnN0IGNoYW5nZWRFdmVudFJlZmVyZW5jZSA9IHRoaXMubWV0YWRhdGFDYWNoZS5vbignY2hhbmdlZCcsIChmaWxlOiBURmlsZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy50YXNrc011dGV4LnJ1bkV4Y2x1c2l2ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleEZpbGUoZmlsZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWV0YWRhdGFDYWNoZUV2ZW50UmVmZXJlbmNlcy5wdXNoKGNoYW5nZWRFdmVudFJlZmVyZW5jZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb1ZhdWx0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IHVzZUZpbGVuYW1lQXNTY2hlZHVsZWREYXRlIH0gPSBnZXRTZXR0aW5ncygpO1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRFdmVudFJlZmVyZW5jZSA9IHRoaXMudmF1bHQub24oJ2NyZWF0ZScsIChmaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRhc2tzTXV0ZXgucnVuRXhjbHVzaXZlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4RmlsZShmaWxlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy52YXVsdEV2ZW50UmVmZXJlbmNlcy5wdXNoKGNyZWF0ZWRFdmVudFJlZmVyZW5jZSk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlZEV2ZW50UmVmZXJlbmNlID0gdGhpcy52YXVsdC5vbignZGVsZXRlJywgKGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGFza3NNdXRleC5ydW5FeGNsdXNpdmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGFza3MgPSB0aGlzLnRhc2tzLmZpbHRlcigodGFzazogVGFzaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5wYXRoICE9PSBmaWxlLnBhdGg7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeVN1YnNjcmliZXJzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmF1bHRFdmVudFJlZmVyZW5jZXMucHVzaChkZWxldGVkRXZlbnRSZWZlcmVuY2UpO1xuXG4gICAgICAgIGNvbnN0IHJlbmFtZWRFdmVudFJlZmVyZW5jZSA9IHRoaXMudmF1bHQub24oJ3JlbmFtZScsIChmaWxlOiBUQWJzdHJhY3RGaWxlLCBvbGRQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGFza3NNdXRleC5ydW5FeGNsdXNpdmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrRGF0ZSA9IG5ldyBMYXp5KCgpID0+IERhdGVGYWxsYmFjay5mcm9tUGF0aChmaWxlLnBhdGgpKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudGFza3MgPSB0aGlzLnRhc2tzLm1hcCgodGFzazogVGFzayk6IFRhc2sgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5wYXRoID09PSBvbGRQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZUZpbGVuYW1lQXNTY2hlZHVsZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYXNrKHsgLi4udGFzaywgcGF0aDogZmlsZS5wYXRoIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZUZhbGxiYWNrLnVwZGF0ZVRhc2tQYXRoKHRhc2ssIGZpbGUucGF0aCwgZmFsbGJhY2tEYXRlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeVN1YnNjcmliZXJzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmF1bHRFdmVudFJlZmVyZW5jZXMucHVzaChyZW5hbWVkRXZlbnRSZWZlcmVuY2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3Vic2NyaWJlVG9FdmVudHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RSZWZlcmVuY2UgPSB0aGlzLmV2ZW50cy5vblJlcXVlc3RDYWNoZVVwZGF0ZSgoaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgaGFuZGxlcih7IHRhc2tzOiB0aGlzLnRhc2tzLCBzdGF0ZTogdGhpcy5zdGF0ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzRXZlbnRSZWZlcmVuY2VzLnB1c2gocmVxdWVzdFJlZmVyZW5jZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkVmF1bHQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tzTXV0ZXgucnVuRXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5Jbml0aWFsaXppbmc7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICB0aGlzLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKS5tYXAoKGZpbGU6IFRGaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGV4RmlsZShmaWxlKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuV2FybTtcbiAgICAgICAgICAgIC8vIE5vdGlmeSB0aGF0IHRoZSBjYWNoZSBpcyBub3cgd2FybTpcbiAgICAgICAgICAgIHRoaXMubm90aWZ5U3Vic2NyaWJlcnMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbmRleEZpbGUoZmlsZTogVEZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZmlsZUNhY2hlID0gdGhpcy5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICAgICAgaWYgKGZpbGVDYWNoZSA9PT0gbnVsbCB8fCBmaWxlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2xkVGFza3MgPSB0aGlzLnRhc2tzLmZpbHRlcigodGFzazogVGFzaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhc2sucGF0aCA9PT0gZmlsZS5wYXRoO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBsaXN0SXRlbXMgPSBmaWxlQ2FjaGUubGlzdEl0ZW1zO1xuICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGxpc3QgaXRlbXMgY2FjaGUsIHRoZXJlIGFyZSBubyB0YXNrcy5cbiAgICAgICAgLy8gU3RpbGwgY29udGludWUgdG8gbm90aWZ5IHdhdGNoZXJzIG9mIHJlbW92YWwuXG5cbiAgICAgICAgbGV0IG5ld1Rhc2tzOiBUYXNrW10gPSBbXTtcbiAgICAgICAgaWYgKGxpc3RJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHJlYWQgdGhlIGZpbGUgYW5kIHByb2Nlc3MgZm9yIHRhc2tzIGlmIHRoZXJlIGFyZSBsaXN0IGl0ZW1zLlxuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCB0aGlzLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XG4gICAgICAgICAgICBuZXdUYXNrcyA9IHRoaXMuZ2V0VGFza3NGcm9tRmlsZUNvbnRlbnQoZmlsZUNvbnRlbnQsIGxpc3RJdGVtcywgZmlsZUNhY2hlLCBmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBjaGFuZ2VzIGluIGFueSBvZiB0aGUgdGFza3MsIHRoZXJlJ3NcbiAgICAgICAgLy8gbm90aGluZyB0byBkbywgc28ganVzdCByZXR1cm4uXG4gICAgICAgIGlmIChUYXNrLnRhc2tzTGlzdHNJZGVudGljYWwob2xkVGFza3MsIG5ld1Rhc2tzKSkge1xuICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGtlcHQgZm9yIG5vdywgdG8gYWxsb3cgZm9yIGRlYnVnZ2luZyBkdXJpbmcgZGV2ZWxvcG1lbnQuXG4gICAgICAgICAgICAvLyBJdCBpcyB0b28gdmVyYm9zZSB0byByZWxlYXNlIHRvIHVzZXJzLlxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuZ2V0U3RhdGUoKSA9PSBTdGF0ZS5XYXJtKSB7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5kZWJ1ZyhgVGFza3MgdW5jaGFuZ2VkIGluICR7ZmlsZS5wYXRofWApO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2V0U3RhdGUoKSA9PSBTdGF0ZS5XYXJtKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBBdCBsZWFzdCBvbmUgdGFzaywgaXRzIGxpbmUgbnVtYmVyIG9yIGl0cyBoZWFkaW5nIGhhcyBjaGFuZ2VkIGluICR7ZmlsZS5wYXRofTogdHJpZ2dlcmluZyBhIHJlZnJlc2ggb2YgYWxsIGFjdGl2ZSBUYXNrcyBibG9ja3MgaW4gTGl2ZSBQcmV2aWV3IGFuZCBSZWFkaW5nIG1vZGUgdmlld3MuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgYWxsIHRhc2tzIGZyb20gdGhpcyBmaWxlIGZyb20gdGhlIGNhY2hlIGJlZm9yZVxuICAgICAgICAvLyBhZGRpbmcgdGhlIG9uZXMgdGhhdCBhcmUgY3VycmVudGx5IGluIHRoZSBmaWxlLlxuICAgICAgICB0aGlzLnRhc2tzID0gdGhpcy50YXNrcy5maWx0ZXIoKHRhc2s6IFRhc2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLnBhdGggIT09IGZpbGUucGF0aDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50YXNrcy5wdXNoKC4uLm5ld1Rhc2tzKTtcblxuICAgICAgICAvLyBBbGwgdXBkYXRlZCwgaW5mb3JtIG91ciBzdWJzY3JpYmVycy5cbiAgICAgICAgdGhpcy5ub3RpZnlTdWJzY3JpYmVycygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VGFza3NGcm9tRmlsZUNvbnRlbnQoXG4gICAgICAgIGZpbGVDb250ZW50OiBzdHJpbmcsXG4gICAgICAgIGxpc3RJdGVtczogTGlzdEl0ZW1DYWNoZVtdLFxuICAgICAgICBmaWxlQ2FjaGU6IENhY2hlZE1ldGFkYXRhLFxuICAgICAgICBmaWxlOiBURmlsZSxcbiAgICApOiBUYXNrW10ge1xuICAgICAgICBjb25zdCB0YXNrczogVGFza1tdID0gW107XG4gICAgICAgIGNvbnN0IGZpbGVMaW5lcyA9IGZpbGVDb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgY29uc3QgbGluZXNJbkZpbGUgPSBmaWxlTGluZXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIExhemlseSBzdG9yZSBkYXRlIGV4dHJhY3RlZCBmcm9tIGZpbGVuYW1lIHRvIGF2b2lkIHBhcnNpbmcgbW9yZSB0aGFuIG5lZWRlZFxuICAgICAgICAvLyBjb25zb2xlLmRlYnVnKGBnZXRUYXNrc0Zyb21GaWxlQ29udGVudCgpIHJlYWRpbmcgJHtmaWxlLnBhdGh9YCk7XG4gICAgICAgIGNvbnN0IGRhdGVGcm9tRmlsZU5hbWUgPSBuZXcgTGF6eSgoKSA9PiBEYXRlRmFsbGJhY2suZnJvbVBhdGgoZmlsZS5wYXRoKSk7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0byBzdG9yZSBzZWN0aW9uIGluZm9ybWF0aW9uIHdpdGggZXZlcnkgdGFzayBzb1xuICAgICAgICAvLyB0aGF0IHdlIGNhbiB1c2UgdGhhdCB3aGVuIHdlIHBvc3QgcHJvY2VzcyB0aGUgbWFya2Rvd25cbiAgICAgICAgLy8gcmVuZGVyZWQgbGlzdHMuXG4gICAgICAgIGxldCBjdXJyZW50U2VjdGlvbjogU2VjdGlvbkNhY2hlIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBzZWN0aW9uSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RJdGVtIG9mIGxpc3RJdGVtcykge1xuICAgICAgICAgICAgaWYgKGxpc3RJdGVtLnRhc2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBsaXN0SXRlbS5wb3NpdGlvbi5zdGFydC5saW5lO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyID49IGxpbmVzSW5GaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICBPYnNpZGlhbiBDYWNoZWRNZXRhZGF0YSBoYXMgdG9sZCB1cyB0aGF0IHRoZXJlIGlzIGEgdGFzayBvbiBsaW5lTnVtYmVyLCBidXQgdGhlcmUgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBub3QgdGhhdCBtYW55IGxpbmVzIGluIHRoZSBmaWxlLlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHdhcyB0aGUgdW5kZXJseWluZyBjYXVzZSBvZiBhbGwgdGhlICdTdHVjayBvbiBcIkxvYWRpbmcgVGFza3MuLi5cIicgbWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcyBpdCByZXN1bHRlZCBpbiB0aGUgbGluZSAndW5kZWZpbmVkJyBiZWluZyBwYXJzZWQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFNvbWVob3cgdGhlIGZpbGUgaGFkIGJlZW4gc2hvcnRlbmVkIHdoaWxzdCBPYnNpZGlhbiB3YXMgY2xvc2VkLCBtZWFuaW5nIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gT2JzaWRpYW4gc3RhcnRlZCB1cCwgaXQgZ290IHRoZSBuZXcgZmlsZSBjb250ZW50LCBidXQgc3RpbGwgaGFkIHRoZSBvbGQgY2FjaGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGFib3V0IGxvY2F0aW9ucyBvZiBsaXN0IGl0ZW1zIGluIHRoZSBmaWxlLlxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtmaWxlLnBhdGh9IE9ic2lkaWFuIGdhdmUgdXMgYSBsaW5lIG51bWJlciAke2xpbmVOdW1iZXJ9IHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZS4gJHtsaW5lc0luRmlsZX0uYCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2tzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNlY3Rpb24gPT09IG51bGwgfHwgY3VycmVudFNlY3Rpb24ucG9zaXRpb24uZW5kLmxpbmUgPCBsaW5lTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIHdlbnQgcGFzdCB0aGUgY3VycmVudCBzZWN0aW9uIChvciB0aGlzIGlzIHRoZSBmaXJzdCB0YXNrKS5cbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgc2VjdGlvbiB0aGF0IGlzIHJlbGV2YW50IGZvciB0aGlzIHRhc2sgYW5kIHRoZSBmb2xsb3dpbmcgb2YgdGhlIHNhbWUgc2VjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlY3Rpb24gPSBDYWNoZS5nZXRTZWN0aW9uKGxpbmVOdW1iZXIsIGZpbGVDYWNoZS5zZWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25JbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWN0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbm5vdCBwcm9jZXNzIGEgdGFzayB3aXRob3V0IGEgc2VjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IGZpbGVMaW5lc1tsaW5lTnVtYmVyXTtcbiAgICAgICAgICAgICAgICBpZiAobGluZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2ZpbGUucGF0aH06IGxpbmUgJHtsaW5lTnVtYmVyfSAtIGlnbm9yaW5nICd1bmRlZmluZWQnIGxpbmUuYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB0YXNrO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2sgPSBUYXNrLmZyb21MaW5lKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBmaWxlLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uU3RhcnQ6IGN1cnJlbnRTZWN0aW9uLnBvc2l0aW9uLnN0YXJ0LmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjZWRpbmdIZWFkZXI6IENhY2hlLmdldFByZWNlZGluZ0hlYWRlcihsaW5lTnVtYmVyLCBmaWxlQ2FjaGUuaGVhZGluZ3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tEYXRlOiBkYXRlRnJvbUZpbGVOYW1lLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0VGFza1BhcnNpbmdFcnJvclRvVXNlcihlLCBmaWxlLCBsaXN0SXRlbSwgbGluZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0YXNrICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25JbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB0YXNrcy5wdXNoKHRhc2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXNrcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlcG9ydFRhc2tQYXJzaW5nRXJyb3JUb1VzZXIoZTogYW55LCBmaWxlOiBURmlsZSwgbGlzdEl0ZW06IExpc3RJdGVtQ2FjaGUsIGxpbmU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBtc2cgPSBgVGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgb25lIG9mIHRoZSB0YXNrcyBpbiB0aGlzIHZhdWx0LlxuVGhlIGZvbGxvd2luZyB0YXNrIGhhcyBiZWVuIGlnbm9yZWQsIHRvIHByZXZlbnQgVGFza3MgcXVlcmllcyBnZXR0aW5nIHN0dWNrIHdpdGggJ0xvYWRpbmcgVGFza3MgLi4uJ1xuRXJyb3I6ICR7ZX1cbkZpbGU6ICR7ZmlsZS5wYXRofVxuTGluZSBudW1iZXI6ICR7bGlzdEl0ZW0ucG9zaXRpb24uc3RhcnQubGluZX1cblRhc2sgbGluZTogJHtsaW5lfVxuXG5QbGVhc2UgY3JlYXRlIGEgYnVnIHJlcG9ydCBmb3IgdGhpcyBtZXNzYWdlIGF0XG5odHRwczovL2dpdGh1Yi5jb20vb2JzaWRpYW4tdGFza3MtZ3JvdXAvb2JzaWRpYW4tdGFza3MvaXNzdWVzL25ldy9jaG9vc2VcbnRvIGhlbHAgdXMgZmluZCBhbmQgZml4IHRoZSB1bmRlcmx5aW5nIGlzc3VlLlxuXG5JbmNsdWRlOlxuLSBlaXRoZXIgYSBzY3JlZW5zaG90IG9mIHRoZSBlcnJvciBwb3B1cCwgb3IgY29weSB0aGUgdGV4dCBmcm9tIHRoZSBjb25zb2xlLCBpZiBvbiBhIGRlc2t0b3AgbWFjaGluZS5cbi0gdGhlIG91dHB1dCBmcm9tIHJ1bm5pbmcgdGhlIE9ic2lkaWFuIGNvbW1hbmQgJ1Nob3cgZGVidWcgaW5mbydcblxuVGhlIGVycm9yIHBvcHVwIHdpbGwgb25seSBiZSBzaG93biB3aGVuIFRhc2tzIGlzIHN0YXJ0aW5nIHVwLCBidXQgaWYgdGhlIGVycm9yIHBlcnNpc3RzLFxuaXQgd2lsbCBiZSBzaG93biBpbiB0aGUgY29uc29sZSBldmVyeSB0aW1lIHRoaXMgZmlsZSBpcyBlZGl0ZWQgZHVyaW5nIHRoZSBPYnNpZGlhblxuc2Vzc2lvbi5cbmA7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gU3RhdGUuSW5pdGlhbGl6aW5nKSB7XG4gICAgICAgICAgICBuZXcgTm90aWNlKG1zZywgMTAwMDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0U2VjdGlvbihsaW5lTnVtYmVyVGFzazogbnVtYmVyLCBzZWN0aW9uczogU2VjdGlvbkNhY2hlW10gfCB1bmRlZmluZWQpOiBTZWN0aW9uQ2FjaGUgfCBudWxsIHtcbiAgICAgICAgaWYgKHNlY3Rpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5wb3NpdGlvbi5zdGFydC5saW5lIDw9IGxpbmVOdW1iZXJUYXNrICYmIHNlY3Rpb24ucG9zaXRpb24uZW5kLmxpbmUgPj0gbGluZU51bWJlclRhc2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldFByZWNlZGluZ0hlYWRlcihsaW5lTnVtYmVyVGFzazogbnVtYmVyLCBoZWFkaW5nczogSGVhZGluZ0NhY2hlW10gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKGhlYWRpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByZWNlZGluZ0hlYWRlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgZm9yIChjb25zdCBoZWFkaW5nIG9mIGhlYWRpbmdzKSB7XG4gICAgICAgICAgICBpZiAoaGVhZGluZy5wb3NpdGlvbi5zdGFydC5saW5lID4gbGluZU51bWJlclRhc2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlY2VkaW5nSGVhZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJlY2VkaW5nSGVhZGVyID0gaGVhZGluZy5oZWFkaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVjZWRpbmdIZWFkZXI7XG4gICAgfVxufVxuIiwgImNvbnN0IEVfVElNRU9VVCA9IG5ldyBFcnJvcigndGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBtdXRleCB0byBiZWNvbWUgYXZhaWxhYmxlJyk7XG5jb25zdCBFX0FMUkVBRFlfTE9DS0VEID0gbmV3IEVycm9yKCdtdXRleCBhbHJlYWR5IGxvY2tlZCcpO1xuY29uc3QgRV9DQU5DRUxFRCA9IG5ldyBFcnJvcigncmVxdWVzdCBmb3IgbG9jayBjYW5jZWxlZCcpO1xuXG52YXIgX19hd2FpdGVyJDIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmNsYXNzIFNlbWFwaG9yZSB7XG4gICAgY29uc3RydWN0b3IoX21heENvbmN1cnJlbmN5LCBfY2FuY2VsRXJyb3IgPSBFX0NBTkNFTEVEKSB7XG4gICAgICAgIHRoaXMuX21heENvbmN1cnJlbmN5ID0gX21heENvbmN1cnJlbmN5O1xuICAgICAgICB0aGlzLl9jYW5jZWxFcnJvciA9IF9jYW5jZWxFcnJvcjtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5fd2FpdGVycyA9IFtdO1xuICAgICAgICBpZiAoX21heENvbmN1cnJlbmN5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2VtYXBob3JlIG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gYSBwb3NpdGl2ZSB2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gX21heENvbmN1cnJlbmN5O1xuICAgIH1cbiAgICBhY3F1aXJlKCkge1xuICAgICAgICBjb25zdCBsb2NrZWQgPSB0aGlzLmlzTG9ja2VkKCk7XG4gICAgICAgIGNvbnN0IHRpY2tldFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB0aGlzLl9xdWV1ZS5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pKTtcbiAgICAgICAgaWYgKCFsb2NrZWQpXG4gICAgICAgICAgICB0aGlzLl9kaXNwYXRjaCgpO1xuICAgICAgICByZXR1cm4gdGlja2V0UHJvbWlzZTtcbiAgICB9XG4gICAgcnVuRXhjbHVzaXZlKGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIkMih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgcmVsZWFzZV0gPSB5aWVsZCB0aGlzLmFjcXVpcmUoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkIGNhbGxiYWNrKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdhaXRGb3JVbmxvY2soKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIkMih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xvY2tlZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgd2FpdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gdGhpcy5fd2FpdGVycy5wdXNoKHsgcmVzb2x2ZSB9KSk7XG4gICAgICAgICAgICByZXR1cm4gd2FpdFByb21pc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpc0xvY2tlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlIDw9IDA7XG4gICAgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGluIDAuMy4wLCB3aWxsIGJlIHJlbW92ZWQgaW4gMC40LjAuIFVzZSBydW5FeGNsdXNpdmUgaW5zdGVhZC4gKi9cbiAgICByZWxlYXNlKCkge1xuICAgICAgICBpZiAodGhpcy5fbWF4Q29uY3VycmVuY3kgPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgbWV0aG9kIGlzIHVuYXZhaWxhYmxlIG9uIHNlbWFwaG9yZXMgd2l0aCBjb25jdXJyZW5jeSA+IDE7IHVzZSB0aGUgc2NvcGVkIHJlbGVhc2UgcmV0dXJuZWQgYnkgYWNxdWlyZSBpbnN0ZWFkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRSZWxlYXNlcikge1xuICAgICAgICAgICAgY29uc3QgcmVsZWFzZXIgPSB0aGlzLl9jdXJyZW50UmVsZWFzZXI7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50UmVsZWFzZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZWxlYXNlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5fcXVldWUuZm9yRWFjaCgodGlja2V0KSA9PiB0aWNrZXQucmVqZWN0KHRoaXMuX2NhbmNlbEVycm9yKSk7XG4gICAgICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgfVxuICAgIF9kaXNwYXRjaCgpIHtcbiAgICAgICAgY29uc3QgbmV4dFRpY2tldCA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGlmICghbmV4dFRpY2tldClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHJlbGVhc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRSZWxlYXNlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWxlYXNlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICByZWxlYXNlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZSsrO1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZVdhaXRlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoKCk7XG4gICAgICAgIH07XG4gICAgICAgIG5leHRUaWNrZXQucmVzb2x2ZShbdGhpcy5fdmFsdWUtLSwgdGhpcy5fY3VycmVudFJlbGVhc2VyXSk7XG4gICAgfVxuICAgIF9yZXNvbHZlV2FpdGVycygpIHtcbiAgICAgICAgdGhpcy5fd2FpdGVycy5mb3JFYWNoKCh3YWl0ZXIpID0+IHdhaXRlci5yZXNvbHZlKCkpO1xuICAgICAgICB0aGlzLl93YWl0ZXJzID0gW107XG4gICAgfVxufVxuXG52YXIgX19hd2FpdGVyJDEgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmNsYXNzIE11dGV4IHtcbiAgICBjb25zdHJ1Y3RvcihjYW5jZWxFcnJvcikge1xuICAgICAgICB0aGlzLl9zZW1hcGhvcmUgPSBuZXcgU2VtYXBob3JlKDEsIGNhbmNlbEVycm9yKTtcbiAgICB9XG4gICAgYWNxdWlyZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlciQxKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgWywgcmVsZWFzZXJdID0geWllbGQgdGhpcy5fc2VtYXBob3JlLmFjcXVpcmUoKTtcbiAgICAgICAgICAgIHJldHVybiByZWxlYXNlcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJ1bkV4Y2x1c2l2ZShjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLnJ1bkV4Y2x1c2l2ZSgoKSA9PiBjYWxsYmFjaygpKTtcbiAgICB9XG4gICAgaXNMb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZW1hcGhvcmUuaXNMb2NrZWQoKTtcbiAgICB9XG4gICAgd2FpdEZvclVubG9jaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbWFwaG9yZS53YWl0Rm9yVW5sb2NrKCk7XG4gICAgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGluIDAuMy4wLCB3aWxsIGJlIHJlbW92ZWQgaW4gMC40LjAuIFVzZSBydW5FeGNsdXNpdmUgaW5zdGVhZC4gKi9cbiAgICByZWxlYXNlKCkge1xuICAgICAgICB0aGlzLl9zZW1hcGhvcmUucmVsZWFzZSgpO1xuICAgIH1cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZW1hcGhvcmUuY2FuY2VsKCk7XG4gICAgfVxufVxuXG52YXIgX19hd2FpdGVyID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZnVuY3Rpb24gd2l0aFRpbWVvdXQoc3luYywgdGltZW91dCwgdGltZW91dEVycm9yID0gRV9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWNxdWlyZTogKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IGlzVGltZW91dCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXNUaW1lb3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZWplY3QodGltZW91dEVycm9yKTtcbiAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWNrZXQgPSB5aWVsZCBzeW5jLmFjcXVpcmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGVhc2UgPSBBcnJheS5pc0FycmF5KHRpY2tldCkgPyB0aWNrZXRbMV0gOiB0aWNrZXQ7XG4gICAgICAgICAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRpY2tldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpLFxuICAgICAgICBydW5FeGNsdXNpdmUoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlbGVhc2UgPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlja2V0ID0geWllbGQgdGhpcy5hY3F1aXJlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRpY2tldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPSB0aWNrZXRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgY2FsbGJhY2sodGlja2V0WzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPSB0aWNrZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCBpbiAwLjMuMCwgd2lsbCBiZSByZW1vdmVkIGluIDAuNC4wLiBVc2UgcnVuRXhjbHVzaXZlIGluc3RlYWQuICovXG4gICAgICAgIHJlbGVhc2UoKSB7XG4gICAgICAgICAgICBzeW5jLnJlbGVhc2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2FuY2VsKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN5bmMuY2FuY2VsKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHdhaXRGb3JVbmxvY2s6ICgpID0+IHN5bmMud2FpdEZvclVubG9jaygpLFxuICAgICAgICBpc0xvY2tlZDogKCkgPT4gc3luYy5pc0xvY2tlZCgpLFxuICAgIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGlzbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZnVuY3Rpb24gdHJ5QWNxdWlyZShzeW5jLCBhbHJlYWR5QWNxdWlyZWRFcnJvciA9IEVfQUxSRUFEWV9MT0NLRUQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJldHVybiB3aXRoVGltZW91dChzeW5jLCAwLCBhbHJlYWR5QWNxdWlyZWRFcnJvcik7XG59XG5cbmV4cG9ydCB7IEVfQUxSRUFEWV9MT0NLRUQsIEVfQ0FOQ0VMRUQsIEVfVElNRU9VVCwgTXV0ZXgsIFNlbWFwaG9yZSwgdHJ5QWNxdWlyZSwgd2l0aFRpbWVvdXQgfTtcbiIsICIvKipcbiAqIFZhcmlvdXMgcmVuZGVyaW5nIG9wdGlvbnMgZm9yIGEgcXVlcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXlvdXRPcHRpb25zIHtcbiAgICBoaWRlVGFza0NvdW50OiBib29sZWFuID0gZmFsc2U7XG4gICAgaGlkZUJhY2tsaW5rczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGhpZGVQcmlvcml0eTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGhpZGVTdGFydERhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBoaWRlU2NoZWR1bGVkRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGhpZGVEb25lRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGhpZGVEdWVEYXRlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaGlkZVJlY3VycmVuY2VSdWxlOiBib29sZWFuID0gZmFsc2U7XG4gICAgaGlkZUVkaXRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBoaWRlVXJnZW5jeTogYm9vbGVhbiA9IHRydWU7XG4gICAgc2hvcnRNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gICAgZXhwbGFpblF1ZXJ5OiBib29sZWFuID0gZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIFRhc2tMYXlvdXRDb21wb25lbnQgPVxuICAgIHwgJ2Rlc2NyaXB0aW9uJ1xuICAgIHwgJ3ByaW9yaXR5J1xuICAgIHwgJ3JlY3VycmVuY2VSdWxlJ1xuICAgIHwgJ3N0YXJ0RGF0ZSdcbiAgICB8ICdzY2hlZHVsZWREYXRlJ1xuICAgIHwgJ2R1ZURhdGUnXG4gICAgfCAnZG9uZURhdGUnXG4gICAgfCAnYmxvY2tMaW5rJztcblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgdGhlIGRlc2lyZWQgbGF5b3V0IG9mIHRhc2tzIHdoZW4gdGhleSBhcmUgcmVuZGVyZWQgaW4gYSBnaXZlbiBjb25maWd1cmF0aW9uLlxuICogVGhlIGxheW91dCBpcyB1c2VkIHdoZW4gZmxhdHRlbmluZyB0aGUgdGFzayB0byBhIHN0cmluZyBhbmQgd2hlbiByZW5kZXJpbmcgcXVlcmllcywgYW5kIGNhbiBiZVxuICogbW9kaWZpZWQgYnkgYXBwbHlpbmcge0BsaW5rIExheW91dE9wdGlvbnN9IG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXNrTGF5b3V0IHtcbiAgICBwdWJsaWMgZGVmYXVsdExheW91dDogVGFza0xheW91dENvbXBvbmVudFtdID0gW1xuICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAncHJpb3JpdHknLFxuICAgICAgICAncmVjdXJyZW5jZVJ1bGUnLFxuICAgICAgICAnc3RhcnREYXRlJyxcbiAgICAgICAgJ3NjaGVkdWxlZERhdGUnLFxuICAgICAgICAnZHVlRGF0ZScsXG4gICAgICAgICdkb25lRGF0ZScsXG4gICAgICAgICdibG9ja0xpbmsnLFxuICAgIF07XG4gICAgcHVibGljIGxheW91dENvbXBvbmVudHM6IFRhc2tMYXlvdXRDb21wb25lbnRbXTtcbiAgICBwdWJsaWMgaGlkZGVuQ29tcG9uZW50czogVGFza0xheW91dENvbXBvbmVudFtdID0gW107XG4gICAgcHVibGljIG9wdGlvbnM6IExheW91dE9wdGlvbnM7XG4gICAgcHVibGljIHNwZWNpZmljQ2xhc3Nlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBMYXlvdXRPcHRpb25zLCBjb21wb25lbnRzPzogVGFza0xheW91dENvbXBvbmVudFtdKSB7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gbmV3IExheW91dE9wdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9uZW50cykge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRDb21wb25lbnRzID0gY29tcG9uZW50cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Q29tcG9uZW50cyA9IHRoaXMuZGVmYXVsdExheW91dDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxheW91dENvbXBvbmVudHMgPSB0aGlzLmFwcGx5T3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIG5ldyBsaXN0IG9mIGNvbXBvbmVudHMgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucyBhcHBsaWVkLlxuICAgICAqL1xuICAgIGFwcGx5T3B0aW9ucyhsYXlvdXRPcHRpb25zOiBMYXlvdXRPcHRpb25zKTogVGFza0xheW91dENvbXBvbmVudFtdIHtcbiAgICAgICAgLy8gUmVtb3ZlIGEgY29tcG9uZW50IGZyb20gdGhlIHRhc2tDb21wb25lbnRzIGFycmF5IGlmIHRoZSBnaXZlbiBsYXlvdXRPcHRpb24gY3JpdGVyaWEgaXMgbWV0LFxuICAgICAgICAvLyBhbmQgYWRkIHRvIHRoZSBsYXlvdXQncyBzcGVjaWZpYyBjbGFzc2VzIGxpc3QgdGhlIGNsYXNzIHRoYXQgZGVub3RlcyB0aGF0IHRoaXMgY29tcG9uZW50XG4gICAgICAgIC8vIGlzbid0IGluIHRoZSBsYXlvdXRcbiAgICAgICAgY29uc3QgcmVtb3ZlSWYgPSAoXG4gICAgICAgICAgICB0YXNrQ29tcG9uZW50czogVGFza0xheW91dENvbXBvbmVudFtdLFxuICAgICAgICAgICAgc2hvdWxkUmVtb3ZlOiBib29sZWFuLFxuICAgICAgICAgICAgY29tcG9uZW50VG9SZW1vdmU6IFRhc2tMYXlvdXRDb21wb25lbnQsXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgICAgaWYgKHNob3VsZFJlbW92ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lmaWNDbGFzc2VzLnB1c2goYHRhc2tzLWxheW91dC1oaWRlLSR7Y29tcG9uZW50VG9SZW1vdmV9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRkZW5Db21wb25lbnRzLnB1c2goY29tcG9uZW50VG9SZW1vdmUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXNrQ29tcG9uZW50cy5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQgIT0gY29tcG9uZW50VG9SZW1vdmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFza0NvbXBvbmVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFJlbW92ZSBjb21wb25lbnRzIGZyb20gdGhlIGxheW91dCBhY2NvcmRpbmcgdG8gdGhlIHRhc2sgb3B0aW9ucy4gVGhlc2UgcmVwcmVzZW50IHRoZSBleGlzdGluZyB0YXNrIG9wdGlvbnMsXG4gICAgICAgIC8vIHNvIHNvbWUgY29tcG9uZW50cyAoZS5nLiB0aGUgZGVzY3JpcHRpb24pIGFyZSBub3QgaGVyZSBiZWNhdXNlIHRoZXJlIGFyZSBubyBsYXlvdXQgb3B0aW9ucyB0byByZW1vdmUgdGhlbS5cbiAgICAgICAgbGV0IG5ld0NvbXBvbmVudHMgPSB0aGlzLmxheW91dENvbXBvbmVudHM7XG4gICAgICAgIG5ld0NvbXBvbmVudHMgPSByZW1vdmVJZihuZXdDb21wb25lbnRzLCBsYXlvdXRPcHRpb25zLmhpZGVQcmlvcml0eSwgJ3ByaW9yaXR5Jyk7XG4gICAgICAgIG5ld0NvbXBvbmVudHMgPSByZW1vdmVJZihuZXdDb21wb25lbnRzLCBsYXlvdXRPcHRpb25zLmhpZGVSZWN1cnJlbmNlUnVsZSwgJ3JlY3VycmVuY2VSdWxlJyk7XG4gICAgICAgIG5ld0NvbXBvbmVudHMgPSByZW1vdmVJZihuZXdDb21wb25lbnRzLCBsYXlvdXRPcHRpb25zLmhpZGVTdGFydERhdGUsICdzdGFydERhdGUnKTtcbiAgICAgICAgbmV3Q29tcG9uZW50cyA9IHJlbW92ZUlmKG5ld0NvbXBvbmVudHMsIGxheW91dE9wdGlvbnMuaGlkZVNjaGVkdWxlZERhdGUsICdzY2hlZHVsZWREYXRlJyk7XG4gICAgICAgIG5ld0NvbXBvbmVudHMgPSByZW1vdmVJZihuZXdDb21wb25lbnRzLCBsYXlvdXRPcHRpb25zLmhpZGVEdWVEYXRlLCAnZHVlRGF0ZScpO1xuICAgICAgICBuZXdDb21wb25lbnRzID0gcmVtb3ZlSWYobmV3Q29tcG9uZW50cywgbGF5b3V0T3B0aW9ucy5oaWRlRG9uZURhdGUsICdkb25lRGF0ZScpO1xuICAgICAgICBpZiAobGF5b3V0T3B0aW9ucy5zaG9ydE1vZGUpIHRoaXMuc3BlY2lmaWNDbGFzc2VzLnB1c2goJ3Rhc2tzLWxheW91dC1zaG9ydC1tb2RlJyk7XG4gICAgICAgIHJldHVybiBuZXdDb21wb25lbnRzO1xuICAgIH1cbn1cbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJpbXBvcnQgdHNsaWIgZnJvbSAnLi4vdHNsaWIuanMnO1xyXG5jb25zdCB7XHJcbiAgICBfX2V4dGVuZHMsXHJcbiAgICBfX2Fzc2lnbixcclxuICAgIF9fcmVzdCxcclxuICAgIF9fZGVjb3JhdGUsXHJcbiAgICBfX3BhcmFtLFxyXG4gICAgX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcixcclxuICAgIF9fZ2VuZXJhdG9yLFxyXG4gICAgX19leHBvcnRTdGFyLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nLFxyXG4gICAgX192YWx1ZXMsXHJcbiAgICBfX3JlYWQsXHJcbiAgICBfX3NwcmVhZCxcclxuICAgIF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcclxuICAgIF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxyXG59ID0gdHNsaWI7XHJcbmV4cG9ydCB7XHJcbiAgICBfX2V4dGVuZHMsXHJcbiAgICBfX2Fzc2lnbixcclxuICAgIF9fcmVzdCxcclxuICAgIF9fZGVjb3JhdGUsXHJcbiAgICBfX3BhcmFtLFxyXG4gICAgX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcixcclxuICAgIF9fZ2VuZXJhdG9yLFxyXG4gICAgX19leHBvcnRTdGFyLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nLFxyXG4gICAgX192YWx1ZXMsXHJcbiAgICBfX3JlYWQsXHJcbiAgICBfX3NwcmVhZCxcclxuICAgIF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcclxuICAgIF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxyXG59O1xyXG4iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVCeURhdGUoYTogbW9tZW50Lk1vbWVudCB8IG51bGwsIGI6IG1vbWVudC5Nb21lbnQgfCBudWxsKTogLTEgfCAwIHwgMSB7XG4gICAgaWYgKGEgIT09IG51bGwgJiYgYiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChhID09PSBudWxsICYmIGIgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChhICE9PSBudWxsICYmIGIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGEuaXNWYWxpZCgpICYmICFiLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2UgaWYgKCFhLmlzVmFsaWQoKSAmJiBiLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYS5pc0FmdGVyKGIpKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIGlmIChhLmlzQmVmb3JlKGIpKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBSUnVsZSB9IGZyb20gJ3JydWxlJztcbmltcG9ydCB7IGNvbXBhcmVCeURhdGUgfSBmcm9tICcuL2xpYi9EYXRlVG9vbHMnO1xuXG5leHBvcnQgY2xhc3MgUmVjdXJyZW5jZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBycnVsZTogUlJ1bGU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBiYXNlT25Ub2RheTogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjaGVkdWxlZERhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkdWVEYXRlOiBNb21lbnQgfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJlZmVyZW5jZSBkYXRlIGlzIHVzZWQgdG8gY2FsY3VsYXRlIGZ1dHVyZSBvY2N1cnJlbmNlcy5cbiAgICAgKlxuICAgICAqIEZ1dHVyZSBvY2N1cnJlbmNlcyB3aWxsIHJlY3VyIGJhc2VkIG9uIHRoZSByZWZlcmVuY2UgZGF0ZS5cbiAgICAgKiBUaGUgcmVmZXJlbmNlIGRhdGUgaXMgdGhlIGR1ZSBkYXRlLCBpZiBpdCBpcyBnaXZlbi5cbiAgICAgKiBPdGhlcndpc2UgdGhlIHNjaGVkdWxlZCBkYXRlLCBpZiBpdCBpcyBnaXZlbi4gQW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogUmVjdXJyZW5jZSBvZiBhbGwgZGF0ZXMgd2lsbCBiZSBrZXB0IHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2UgZGF0ZS5cbiAgICAgKiBGb3IgZXhhbXBsZTogaWYgdGhlIGR1ZSBkYXRlIGFuZCB0aGUgc3RhcnQgZGF0ZSBhcmUgZ2l2ZW4sIHRoZSBkdWUgZGF0ZVxuICAgICAqIGlzIHRoZSByZWZlcmVuY2UgZGF0ZS4gRnV0dXJlIG9jY3VycmVuY2VzIHdpbGwgaGF2ZSBhIHN0YXJ0IGRhdGUgd2l0aCB0aGVcbiAgICAgKiBzYW1lIHJlbGF0aXZlIGRpc3RhbmNlIHRvIHRoZSBkdWUgZGF0ZSBhcyB0aGUgb3JpZ2luYWwgdGFzay4gRm9yIGV4YW1wbGVcbiAgICAgKiBcInN0YXJ0cyBvbmUgd2VlayBiZWZvcmUgaXQgaXMgZHVlXCIuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWZlcmVuY2VEYXRlOiBNb21lbnQgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBycnVsZSxcbiAgICAgICAgYmFzZU9uVG9kYXksXG4gICAgICAgIHJlZmVyZW5jZURhdGUsXG4gICAgICAgIHN0YXJ0RGF0ZSxcbiAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgZHVlRGF0ZSxcbiAgICB9OiB7XG4gICAgICAgIHJydWxlOiBSUnVsZTtcbiAgICAgICAgYmFzZU9uVG9kYXk6IGJvb2xlYW47XG4gICAgICAgIHJlZmVyZW5jZURhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgICAgIHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgc2NoZWR1bGVkRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgZHVlRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMucnJ1bGUgPSBycnVsZTtcbiAgICAgICAgdGhpcy5iYXNlT25Ub2RheSA9IGJhc2VPblRvZGF5O1xuICAgICAgICB0aGlzLnJlZmVyZW5jZURhdGUgPSByZWZlcmVuY2VEYXRlO1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZWREYXRlID0gc2NoZWR1bGVkRGF0ZTtcbiAgICAgICAgdGhpcy5kdWVEYXRlID0gZHVlRGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21UZXh0KHtcbiAgICAgICAgcmVjdXJyZW5jZVJ1bGVUZXh0LFxuICAgICAgICBzdGFydERhdGUsXG4gICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgIGR1ZURhdGUsXG4gICAgfToge1xuICAgICAgICByZWN1cnJlbmNlUnVsZVRleHQ6IHN0cmluZztcbiAgICAgICAgc3RhcnREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgICAgICBzY2hlZHVsZWREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgICAgICBkdWVEYXRlOiBNb21lbnQgfCBudWxsO1xuICAgIH0pOiBSZWN1cnJlbmNlIHwgbnVsbCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHJlY3VycmVuY2VSdWxlVGV4dC5tYXRjaCgvXihbYS16QS1aMC05LCAhXSs/KSggd2hlbiBkb25lKT8kL2kpO1xuICAgICAgICAgICAgaWYgKG1hdGNoID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaXNvbGF0ZWRSdWxlVGV4dCA9IG1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VPblRvZGF5ID0gbWF0Y2hbMl0gIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IFJSdWxlLnBhcnNlVGV4dChpc29sYXRlZFJ1bGVUZXh0KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gUGljayB0aGUgcmVmZXJlbmNlIGRhdGUgZm9yIHJlY3VycmVuY2UgYmFzZWQgb24gaW1wb3J0YW5jZS5cbiAgICAgICAgICAgICAgICAvLyBBc3N1bWluZyBkdWUgZGF0ZSBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuXG4gICAgICAgICAgICAgICAgbGV0IHJlZmVyZW5jZURhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBtb21lbnQgb2JqZWN0cy5cbiAgICAgICAgICAgICAgICBpZiAoZHVlRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VEYXRlID0gd2luZG93Lm1vbWVudChkdWVEYXRlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVkdWxlZERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlRGF0ZSA9IHdpbmRvdy5tb21lbnQoc2NoZWR1bGVkRGF0ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlRGF0ZSA9IHdpbmRvdy5tb21lbnQoc3RhcnREYXRlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWJhc2VPblRvZGF5ICYmIHJlZmVyZW5jZURhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kdHN0YXJ0ID0gd2luZG93Lm1vbWVudChyZWZlcmVuY2VEYXRlKS5zdGFydE9mKCdkYXknKS51dGModHJ1ZSkudG9EYXRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kdHN0YXJ0ID0gd2luZG93Lm1vbWVudCgpLnN0YXJ0T2YoJ2RheScpLnV0Yyh0cnVlKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBycnVsZSA9IG5ldyBSUnVsZShvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3VycmVuY2Uoe1xuICAgICAgICAgICAgICAgICAgICBycnVsZSxcbiAgICAgICAgICAgICAgICAgICAgYmFzZU9uVG9kYXksXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZURhdGUsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgZHVlRGF0ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIENvdWxkIG5vdCByZWFkIHJlY3VycmVuY2UgcnVsZS4gVXNlciBwb3NzaWJseSBub3QgZG9uZSB0eXBpbmcuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9UZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB0ZXh0ID0gdGhpcy5ycnVsZS50b1RleHQoKTtcbiAgICAgICAgaWYgKHRoaXMuYmFzZU9uVG9kYXkpIHtcbiAgICAgICAgICAgIHRleHQgKz0gJyB3aGVuIGRvbmUnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0ZXMgb2YgdGhlIG5leHQgb2NjdXJyZW5jZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG5leHQgb2NjdXJyZW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dCgpOiB7XG4gICAgICAgIHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgc2NoZWR1bGVkRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgZHVlRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICB9IHwgbnVsbCB7XG4gICAgICAgIGxldCBuZXh0OiBEYXRlO1xuICAgICAgICBpZiAodGhpcy5iYXNlT25Ub2RheSkge1xuICAgICAgICAgICAgLy8gVGhlIG5leHQgb2NjdXJyZW5jZSBzaG91bGQgaGFwcGVuIGJhc2VkIG9mZiB0aGUgY3VycmVudCBkYXRlLlxuICAgICAgICAgICAgY29uc3QgdG9kYXkgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBydWxlQmFzZWRPblRvZGF5ID0gbmV3IFJSdWxlKHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLnJydWxlLm9yaWdPcHRpb25zLFxuICAgICAgICAgICAgICAgIGR0c3RhcnQ6IHRvZGF5LnN0YXJ0T2YoJ2RheScpLnV0Yyh0cnVlKS50b0RhdGUoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbmV4dCA9IHRoaXMubmV4dEFmdGVyKHRvZGF5LmVuZE9mKCdkYXknKSwgcnVsZUJhc2VkT25Ub2RheSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV4dCBvY2N1cnJlbmNlIHNob3VsZCBoYXBwZW4gYmFzZWQgb24gdGhlIG9yaWdpbmFsIHJlZmVyZW5jZVxuICAgICAgICAgICAgLy8gZGF0ZSBpZiBwb3NzaWJsZS4gT3RoZXJ3aXNlLCBiYXNlIGl0IG9uIHRvZGF5IGlmIHdlIGRvIG5vdCBoYXZlIGFcbiAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBkYXRlLlxuICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSB3aW5kb3dcbiAgICAgICAgICAgICAgICAvLyBSZWZlcmVuY2UgZGF0ZSBjYW4gYmUgYHVuZGVmaW5lZGAgdG8gbWVhbiBcInRvZGF5XCIuXG4gICAgICAgICAgICAgICAgLy8gTW9tZW50IG9ubHkgYWNjZXB0cyBgdW5kZWZpbmVkYCwgbm90IGBudWxsYC5cbiAgICAgICAgICAgICAgICAubW9tZW50KHRoaXMucmVmZXJlbmNlRGF0ZSA/PyB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgLmVuZE9mKCdkYXknKTtcblxuICAgICAgICAgICAgbmV4dCA9IHRoaXMubmV4dEFmdGVyKGFmdGVyLCB0aGlzLnJydWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBLZWVwIHRoZSByZWxhdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlZmVyZW5jZSBkYXRlIGFuZFxuICAgICAgICAgICAgLy8gc3RhcnQvc2NoZWR1bGVkL2R1ZS5cbiAgICAgICAgICAgIGxldCBzdGFydERhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHNjaGVkdWxlZERhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGR1ZURhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBPbmx5IGlmIGEgcmVmZXJlbmNlIGRhdGUgaXMgZ2l2ZW4uIEEgcmVmZXJlbmNlIGRhdGUgd2lsbCBleGlzdCBpZiBhdFxuICAgICAgICAgICAgLy8gbGVhc3Qgb25lIG9mIHRoZSBvdGhlciBkYXRlcyBpcyBzZXQuXG4gICAgICAgICAgICBpZiAodGhpcy5yZWZlcmVuY2VEYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhcnREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGlmZmVyZW5jZSA9IHdpbmRvdy5tb21lbnQuZHVyYXRpb24odGhpcy5zdGFydERhdGUuZGlmZih0aGlzLnJlZmVyZW5jZURhdGUpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9uaW5nIHNvIHRoYXQgb3JpZ2luYWwgd29uJ3QgYmUgbWFuaXB1bGF0ZWQ6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSA9IHdpbmRvdy5tb21lbnQobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJvdW5kaW5nIGRheXMgdG8gaGFuZGxlIGNyb3NzIGRheWxpZ2h0LXNhdmluZ3MtdGltZSByZWN1cnJlbmNlcy5cbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlLmFkZChNYXRoLnJvdW5kKG9yaWdpbmFsRGlmZmVyZW5jZS5hc0RheXMoKSksICdkYXlzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVkdWxlZERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEaWZmZXJlbmNlID0gd2luZG93Lm1vbWVudC5kdXJhdGlvbih0aGlzLnNjaGVkdWxlZERhdGUuZGlmZih0aGlzLnJlZmVyZW5jZURhdGUpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9uaW5nIHNvIHRoYXQgb3JpZ2luYWwgd29uJ3QgYmUgbWFuaXB1bGF0ZWQ6XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGUgPSB3aW5kb3cubW9tZW50KG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBSb3VuZGluZyBkYXlzIHRvIGhhbmRsZSBjcm9zcyBkYXlsaWdodC1zYXZpbmdzLXRpbWUgcmVjdXJyZW5jZXMuXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGUuYWRkKE1hdGgucm91bmQob3JpZ2luYWxEaWZmZXJlbmNlLmFzRGF5cygpKSwgJ2RheXMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHVlRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbERpZmZlcmVuY2UgPSB3aW5kb3cubW9tZW50LmR1cmF0aW9uKHRoaXMuZHVlRGF0ZS5kaWZmKHRoaXMucmVmZXJlbmNlRGF0ZSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsb25pbmcgc28gdGhhdCBvcmlnaW5hbCB3b24ndCBiZSBtYW5pcHVsYXRlZDpcbiAgICAgICAgICAgICAgICAgICAgZHVlRGF0ZSA9IHdpbmRvdy5tb21lbnQobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJvdW5kaW5nIGRheXMgdG8gaGFuZGxlIGNyb3NzIGRheWxpZ2h0LXNhdmluZ3MtdGltZSByZWN1cnJlbmNlcy5cbiAgICAgICAgICAgICAgICAgICAgZHVlRGF0ZS5hZGQoTWF0aC5yb3VuZChvcmlnaW5hbERpZmZlcmVuY2UuYXNEYXlzKCkpLCAnZGF5cycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGFydERhdGUsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgICAgICAgICBkdWVEYXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBpZGVudGljYWxUbyhvdGhlcjogUmVjdXJyZW5jZSkge1xuICAgICAgICBpZiAodGhpcy5iYXNlT25Ub2RheSAhPT0gb3RoZXIuYmFzZU9uVG9kYXkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXBhcmUgRGF0ZSBmaWVsZHNcbiAgICAgICAgaWYgKGNvbXBhcmVCeURhdGUodGhpcy5zdGFydERhdGUsIG90aGVyLnN0YXJ0RGF0ZSkgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcGFyZUJ5RGF0ZSh0aGlzLnNjaGVkdWxlZERhdGUsIG90aGVyLnNjaGVkdWxlZERhdGUpICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBhcmVCeURhdGUodGhpcy5kdWVEYXRlLCBvdGhlci5kdWVEYXRlKSAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudG9UZXh0KCkgPT09IG90aGVyLnRvVGV4dCgpOyAvLyB0aGlzIGFsc28gY2hlY2tzIGJhc2VPblRvZGF5XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbmV4dEFmdGVyIHJldHVybnMgdGhlIG5leHQgb2NjdXJyZW5jZSdzIGRhdGUgYWZ0ZXIgYGFmdGVyYCwgYmFzZWQgb24gdGhlIGdpdmVuIHJydWxlLlxuICAgICAqXG4gICAgICogVGhlIGNvbW1vbiBjYXNlIGlzIHRoYXQgYHJydWxlLmFmdGVyYCBjYWxjdWxhdGVzIHRoZSBuZXh0IGRhdGUgYW5kIGl0XG4gICAgICogY2FuIGJlIHVzZWQgYXMgaXMuXG4gICAgICpcbiAgICAgKiBJbiB0aGUgc3BlY2lhbCBjYXNlcyBvZiBtb250aGx5IGFuZCB5ZWFybHkgcmVjdXJyZW5jZXMsIHRoZXJlIGV4aXN0cyBhblxuICAgICAqIGVkZ2UgY2FzZSB3aGVyZSBhbiBvY2N1cnJlbmNlIGFmdGVyIHRoZSBnaXZlbiBudW1iZXIgb2YgbW9udGhzIG9yIHllYXJzXG4gICAgICogaXMgbm90IHBvc3NpYmxlLiBGb3IgZXhhbXBsZTogQSB0YXNrIGlzIGR1ZSBvbiAyMDIyLTAxLTMxIGFuZCBoYXMgYVxuICAgICAqIHJlY3VycmVuY2Ugb2YgYGV2ZXJ5IG1vbnRoYC4gV2hlbiBtYXJraW5nIHRoZSB0YXNrIGFzIGRvbmUsIHRoZSBuZXh0XG4gICAgICogb2NjdXJyZW5jZSB3aWxsIGhhcHBlbiBvbiAyMDIyLTAzLTMxLiBUaGUgcmVhc29uIGJlaW5nIHRoYXQgRmVicnVhcnlcbiAgICAgKiBkb2VzIG5vdCBoYXZlIDMxIGRheXMsIHlldCBSUnVsZSBzZXRzIGBieW1vbnRoZGF5YCB0byBgMzFgIGZvciBsYWNrIG9mXG4gICAgICogaGF2aW5nIGEgYmV0dGVyIGFsdGVybmF0aXZlLlxuICAgICAqXG4gICAgICogSW4gb3JkZXIgdG8gZml4IHRoaXMsIGBhZnRlcmAgd2lsbCBtb3ZlIGludG8gdGhlIHBhc3QgZGF5IGJ5IGRheS4gRWFjaFxuICAgICAqIGRheSwgdGhlIG5leHQgb2NjdXJyZW5jZSBpcyBjaGVja2VkIHRvIGJlIGFmdGVyIHRoZSBnaXZlbiBudW1iZXIgb2ZcbiAgICAgKiBtb250aHMgb3IgeWVhcnMuIEJ5IG1vdmluZyBgYWZ0ZXJgIGludG8gdGhlIHBhc3QgZGF5IGJ5IGRheSwgaXQgd2lsbFxuICAgICAqIGV2ZW50dWFsbHkgY2FsY3VsYXRlIHRoZSBuZXh0IG9jY3VycmVuY2UgYmFzZWQgb24gYDIwMjItMDEtMjhgLCBlbmRpbmcgdXBcbiAgICAgKiBpbiBGZWJydWFyeSBhcyB0aGUgdXNlciB3b3VsZCBleHBlY3QuXG4gICAgICovXG4gICAgcHJpdmF0ZSBuZXh0QWZ0ZXIoYWZ0ZXI6IE1vbWVudCwgcnJ1bGU6IFJSdWxlKTogRGF0ZSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSB0aW1lem9uZSwgYXMgcnJ1bGUgZG9lcyBub3QgcmVnYXJkIHRpbWV6b25lcyBhbmQgYWx3YXlzXG4gICAgICAgIC8vIGNhbGN1bGF0ZXMgaW4gVVRDLlxuICAgICAgICAvLyBUaGUgdGltZXpvbmUgaXMgYWRkZWQgYWdhaW4gYmVmb3JlIHJldHVybmluZyB0aGUgbmV4dCBkYXRlLlxuICAgICAgICBhZnRlci51dGModHJ1ZSk7XG4gICAgICAgIGxldCBuZXh0ID0gd2luZG93Lm1vbWVudChycnVsZS5hZnRlcihhZnRlci50b0RhdGUoKSkpO1xuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBtb250aGx5IHJlY3VycmVuY2UsIHRyZWF0IGl0IHNwZWNpYWwuXG4gICAgICAgIGNvbnN0IGFzVGV4dCA9IHRoaXMudG9UZXh0KCk7XG4gICAgICAgIGNvbnN0IG1vbnRoTWF0Y2ggPSBhc1RleHQubWF0Y2goL2V2ZXJ5KCBcXGQrKT8gbW9udGgocyk/KC4qKT8vKTtcbiAgICAgICAgaWYgKG1vbnRoTWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIC4uLiB1bmxlc3MgdGhlIHJ1bGUgZml4ZXMgdGhlIGRhdGUsIHN1Y2ggYXMgJ2V2ZXJ5IG1vbnRoIG9uIHRoZSAzMXN0J1xuICAgICAgICAgICAgaWYgKCFhc1RleHQuaW5jbHVkZXMoJyBvbiAnKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBSZWN1cnJlbmNlLm5leHRBZnRlck1vbnRocyhhZnRlciwgbmV4dCwgcnJ1bGUsIG1vbnRoTWF0Y2hbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHllYXJseSByZWN1cnJlbmNlLCB0cmVhdCBpdCBzcGVjaWFsLlxuICAgICAgICBjb25zdCB5ZWFyTWF0Y2ggPSBhc1RleHQubWF0Y2goL2V2ZXJ5KCBcXGQrKT8geWVhcihzKT8oLiopPy8pO1xuICAgICAgICBpZiAoeWVhck1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBuZXh0ID0gUmVjdXJyZW5jZS5uZXh0QWZ0ZXJZZWFycyhhZnRlciwgbmV4dCwgcnJ1bGUsIHllYXJNYXRjaFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIZXJlIHdlIGFkZCB0aGUgdGltZXpvbmUgYWdhaW4gdGhhdCB3ZSByZW1vdmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBtZXRob2QuXG4gICAgICAgIHJldHVybiBSZWN1cnJlbmNlLmFkZFRpbWV6b25lKG5leHQpLnRvRGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIG5leHRBZnRlck1vbnRocyBjYWxjdWxhdGVzIHRoZSBuZXh0IGRhdGUgYWZ0ZXIgYHNraXBwaW5nTW9udGhzYCBtb250aHMuXG4gICAgICpcbiAgICAgKiBgc2tpcHBpbmdNb250aHNgIGRlZmF1bHRzIHRvIGAxYCBpZiB1bmRlZmluZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmV4dEFmdGVyTW9udGhzKFxuICAgICAgICBhZnRlcjogTW9tZW50LFxuICAgICAgICBuZXh0OiBNb21lbnQsXG4gICAgICAgIHJydWxlOiBSUnVsZSxcbiAgICAgICAgc2tpcHBpbmdNb250aHM6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICApOiBNb21lbnQge1xuICAgICAgICAvLyBQYXJzZSBgc2tpcHBpbmdNb250aHNgLCBpZiBpdCBleGlzdHMuXG4gICAgICAgIGxldCBwYXJzZWRTa2lwcGluZ01vbnRoczogTnVtYmVyID0gMTtcbiAgICAgICAgaWYgKHNraXBwaW5nTW9udGhzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBhcnNlZFNraXBwaW5nTW9udGhzID0gTnVtYmVyLnBhcnNlSW50KHNraXBwaW5nTW9udGhzLnRyaW0oKSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hpbGUgd2Ugc2tpcCB0aGUgd3JvbmcgbnVtYmVyIG9mIG1vbnRocywgbW92ZSBgYWZ0ZXJgIG9uZSBkYXkgaW50byB0aGUgcGFzdC5cbiAgICAgICAgd2hpbGUgKFJlY3VycmVuY2UuaXNTa2lwcGluZ1Rvb01hbnlNb250aHMoYWZ0ZXIsIG5leHQsIHBhcnNlZFNraXBwaW5nTW9udGhzKSkge1xuICAgICAgICAgICAgLy8gVGhlIG5leHQgbGluZSBhbHRlcnMgYGFmdGVyYCB0byBiZSBvbmUgZGF5IGVhcmxpZXIuXG4gICAgICAgICAgICAvLyBUaGVuIHJldHVybnMgYG5leHRgIGJhc2VkIG9uIHRoYXQuXG4gICAgICAgICAgICBuZXh0ID0gUmVjdXJyZW5jZS5mcm9tT25lRGF5RWFybGllcihhZnRlciwgcnJ1bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaXNTa2lwcGluZ1Rvb01hbnlNb250aHMgcmV0dXJucyB0cnVlIGlmIGBuZXh0YCBpcyBtb3JlIHRoYW4gYHNraXBwaW5nTW9udGhzYCBtb250aHMgYWZ0ZXIgYGFmdGVyYC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBpc1NraXBwaW5nVG9vTWFueU1vbnRocyhhZnRlcjogTW9tZW50LCBuZXh0OiBNb21lbnQsIHNraXBwaW5nTW9udGhzOiBOdW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGRpZmZNb250aHMgPSBuZXh0Lm1vbnRoKCkgLSBhZnRlci5tb250aCgpO1xuXG4gICAgICAgIC8vIE1heWJlIHNvbWUgeWVhcnMgaGF2ZSBwYXNzZWQ/XG4gICAgICAgIGNvbnN0IGRpZmZZZWFycyA9IG5leHQueWVhcigpIC0gYWZ0ZXIueWVhcigpO1xuICAgICAgICBkaWZmTW9udGhzICs9IGRpZmZZZWFycyAqIDEyO1xuXG4gICAgICAgIHJldHVybiBkaWZmTW9udGhzID4gc2tpcHBpbmdNb250aHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbmV4dEFmdGVyWWVhcnMgY2FsY3VsYXRlcyB0aGUgbmV4dCBkYXRlIGFmdGVyIGBza2lwcGluZ1llYXJzYCB5ZWFycy5cbiAgICAgKlxuICAgICAqIGBza2lwcGluZ1llYXJzYCBkZWZhdWx0cyB0byBgMWAgaWYgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIG5leHRBZnRlclllYXJzKFxuICAgICAgICBhZnRlcjogTW9tZW50LFxuICAgICAgICBuZXh0OiBNb21lbnQsXG4gICAgICAgIHJydWxlOiBSUnVsZSxcbiAgICAgICAgc2tpcHBpbmdZZWFyczogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICk6IE1vbWVudCB7XG4gICAgICAgIC8vIFBhcnNlIGBza2lwcGluZ1llYXJzYCwgaWYgaXQgZXhpc3RzLlxuICAgICAgICBsZXQgcGFyc2VkU2tpcHBpbmdZZWFyczogTnVtYmVyID0gMTtcbiAgICAgICAgaWYgKHNraXBwaW5nWWVhcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGFyc2VkU2tpcHBpbmdZZWFycyA9IE51bWJlci5wYXJzZUludChza2lwcGluZ1llYXJzLnRyaW0oKSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hpbGUgd2Ugc2tpcCB0aGUgd3JvbmcgbnVtYmVyIG9mIHllYXJzLCBtb3ZlIGBhZnRlcmAgb25lIGRheSBpbnRvIHRoZSBwYXN0LlxuICAgICAgICB3aGlsZSAoUmVjdXJyZW5jZS5pc1NraXBwaW5nVG9vTWFueVllYXJzKGFmdGVyLCBuZXh0LCBwYXJzZWRTa2lwcGluZ1llYXJzKSkge1xuICAgICAgICAgICAgLy8gVGhlIG5leHQgbGluZSBhbHRlcnMgYGFmdGVyYCB0byBiZSBvbmUgZGF5IGVhcmxpZXIuXG4gICAgICAgICAgICAvLyBUaGVuIHJldHVybnMgYG5leHRgIGJhc2VkIG9uIHRoYXQuXG4gICAgICAgICAgICBuZXh0ID0gUmVjdXJyZW5jZS5mcm9tT25lRGF5RWFybGllcihhZnRlciwgcnJ1bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaXNTa2lwcGluZ1Rvb01hbnlZZWFycyByZXR1cm5zIHRydWUgaWYgYG5leHRgIGlzIG1vcmUgdGhhbiBgc2tpcHBpbmdZZWFyc2AgeWVhcnMgYWZ0ZXIgYGFmdGVyYC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBpc1NraXBwaW5nVG9vTWFueVllYXJzKGFmdGVyOiBNb21lbnQsIG5leHQ6IE1vbWVudCwgc2tpcHBpbmdZZWFyczogTnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBuZXh0LnllYXIoKSAtIGFmdGVyLnllYXIoKTtcblxuICAgICAgICByZXR1cm4gZGlmZiA+IHNraXBwaW5nWWVhcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZnJvbU9uZURheUVhcmxpZXIgcmV0dXJucyB0aGUgbmV4dCBvY2N1cnJlbmNlIGFmdGVyIG1vdmluZyBgYWZ0ZXJgIG9uZSBkYXkgaW50byB0aGUgcGFzdC5cbiAgICAgKlxuICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIG1hbmlwdWxhdGVzIHRoZSBnaXZlbiBpbnN0YW5jZSBvZiBgYWZ0ZXJgLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGZyb21PbmVEYXlFYXJsaWVyKGFmdGVyOiBNb21lbnQsIHJydWxlOiBSUnVsZSk6IE1vbWVudCB7XG4gICAgICAgIGFmdGVyLnN1YnRyYWN0KDEsICdkYXlzJykuZW5kT2YoJ2RheScpO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBycnVsZS5vcmlnT3B0aW9ucztcbiAgICAgICAgb3B0aW9ucy5kdHN0YXJ0ID0gYWZ0ZXIuc3RhcnRPZignZGF5JykudG9EYXRlKCk7XG4gICAgICAgIHJydWxlID0gbmV3IFJSdWxlKG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiB3aW5kb3cubW9tZW50KHJydWxlLmFmdGVyKGFmdGVyLnRvRGF0ZSgpKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYWRkVGltZXpvbmUoZGF0ZTogTW9tZW50KTogTW9tZW50IHtcbiAgICAgICAgY29uc3QgbG9jYWxUaW1lWm9uZSA9IHdpbmRvdy5tb21lbnQudXRjKGRhdGUpLmxvY2FsKHRydWUpO1xuXG4gICAgICAgIHJldHVybiBsb2NhbFRpbWVab25lLnN0YXJ0T2YoJ2RheScpO1xuICAgIH1cbn1cbiIsICIvKipcbiAqIENvbGxlY3Rpb24gb2Ygc3RhdHVzIHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgcGx1Z2luLlxuICovXG5leHBvcnQgZW51bSBTdGF0dXNUeXBlIHtcbiAgICBUT0RPID0gJ1RPRE8nLFxuICAgIERPTkUgPSAnRE9ORScsXG4gICAgSU5fUFJPR1JFU1MgPSAnSU5fUFJPR1JFU1MnLFxuICAgIENBTkNFTExFRCA9ICdDQU5DRUxMRUQnLFxuICAgIE5PTl9UQVNLID0gJ05PTl9UQVNLJyxcbiAgICBFTVBUWSA9ICdFTVBUWScsXG59XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgb2JqZWN0IHN0b3JlZCBieSB0aGUgT2JzaWRpYW4gY29uZmlndXJhdGlvbiBhbmQgdXNlZCB0byBjcmVhdGUgdGhlIHN0YXR1c1xuICogb2JqZWN0cyBmb3IgdGhlIHNlc3Npb25cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgU3RhdHVzQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgY2xhc3MgU3RhdHVzQ29uZmlndXJhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGNoYXJhY3RlciB1c2VkIGJldHdlZW4gdGhlIHR3byBzcXVhcmUgYnJhY2tldHMgaW4gdGhlIG1hcmtkb3duIHRhc2suXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3ltYm9sOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzdGF0dXMgZm9yIGRpc3BsYXkgcHVycG9zZXMuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmV4dCBzdGF0dXMgZm9yIGEgdGFzayB3aGVuIHRvZ2dsZWQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbmV4dFN0YXR1c1N5bWJvbDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSB0aGVuIGl0IGlzIHJlZ2lzdGVyZWQgYXMgYSBjb21tYW5kIHRoYXQgdGhlIHVzZXIgY2FuIG1hcCB0by5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgYXZhaWxhYmxlQXNDb21tYW5kOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdHVzIHR5cGUuIFNlZSB7QGxpbmsgU3RhdHVzVHlwZX0gZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFN0YXR1c1R5cGU7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0YXR1cy4gVGhlIHJlZ2lzdHJ5IHdpbGwgYmUgYWRkZWQgbGF0ZXIgaW4gdGhlIGNhc2VcbiAgICAgKiBvZiB0aGUgZGVmYXVsdCBzdGF0dXNlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzeW1ib2xcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7U3RhdHVzfSBuZXh0U3RhdHVzU3ltYm9sXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhdmFpbGFibGVBc0NvbW1hbmRcbiAgICAgKiBAcGFyYW0ge1N0YXR1c1R5cGV9IHR5cGVcbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHN5bWJvbDogc3RyaW5nLFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIG5leHRTdGF0dXNTeW1ib2w6IHN0cmluZyxcbiAgICAgICAgYXZhaWxhYmxlQXNDb21tYW5kOiBib29sZWFuLFxuICAgICAgICB0eXBlOiBTdGF0dXNUeXBlID0gU3RhdHVzVHlwZS5UT0RPLCAvLyBUT0RPIFJlbW92ZSBkZWZhdWx0IHZhbHVlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuc3ltYm9sID0gc3ltYm9sO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLm5leHRTdGF0dXNTeW1ib2wgPSBuZXh0U3RhdHVzU3ltYm9sO1xuICAgICAgICB0aGlzLmF2YWlsYWJsZUFzQ29tbWFuZCA9IGF2YWlsYWJsZUFzQ29tbWFuZDtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgU3RhdHVzQ29uZmlndXJhdGlvbiwgU3RhdHVzVHlwZSB9IGZyb20gJy4vU3RhdHVzQ29uZmlndXJhdGlvbic7XG5pbXBvcnQgdHlwZSB7IFN0YXR1c0NvbGxlY3Rpb25FbnRyeSB9IGZyb20gJy4vU3RhdHVzQ29sbGVjdGlvbic7XG5cbi8qKlxuICogVHJhY2tzIHRoZSBwb3NzaWJsZSBzdGF0ZXMgdGhhdCBhIHRhc2sgY2FuIGJlIGluLlxuICpcbiAqIFJlbGF0ZWQgY2xhc3NlczpcbiAqIEBzZWUgU3RhdHVzQ29uZmlndXJhdGlvblxuICogQHNlZSBTdGF0dXNSZWdpc3RyeVxuICogQHNlZSBTdGF0dXNTZXR0aW5nc1xuICogQHNlZSBTdGF0dXNTZXR0aW5nc0hlbHBlcnMudHNcbiAqIEBzZWUgQ3VzdG9tU3RhdHVzTW9kYWxcbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgU3RhdHVzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IERvbmUgc3RhdHVzLiBHb2VzIHRvIFRvZG8gd2hlbiB0b2dnbGVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEB0eXBlIHtTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgRE9ORTogU3RhdHVzID0gU3RhdHVzLm1ha2VEb25lKCk7XG5cbiAgICAvKipcbiAgICAgKiBBIGRlZmF1bHQgc3RhdHVzIG9mIGVtcHR5LCB1c2VkIHdoZW4gdGhpbmdzIGdvIHdyb25nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIEVNUFRZOiBTdGF0dXMgPSBTdGF0dXMubWFrZUVtcHR5KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBUb2RvIHN0YXR1cy4gR29lcyB0byBEb25lIHdoZW4gdG9nZ2xlZC5cbiAgICAgKiBVc2VyIG1heSBsYXRlciBiZSBhYmxlIHRvIG92ZXJyaWRlIHRoaXMgdG8gZ28gdG8gSW4gUHJvZ3Jlc3MgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAdHlwZSB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIFRPRE86IFN0YXR1cyA9IFN0YXR1cy5tYWtlVG9kbygpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmZpZ3VyYXRpb24gc3RvcmVkIGluIHRoZSBkYXRhLmpzb24gZmlsZS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtTdGF0dXNDb25maWd1cmF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgY29uZmlndXJhdGlvbjogU3RhdHVzQ29uZmlndXJhdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzeW1ib2wgdXNlZCBiZXR3ZWVuIHRoZSB0d28gc3F1YXJlIGJyYWNrZXRzIGluIHRoZSBtYXJrZG93biB0YXNrLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzXG4gICAgICovXG4gICAgcHVibGljIGdldCBzeW1ib2woKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5zeW1ib2w7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc3RhdHVzIGZvciBkaXNwbGF5IHB1cnBvc2VzLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzXG4gICAgICovXG4gICAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24ubmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHN0YXR1cyBmb3IgYSB0YXNrIHdoZW4gdG9nZ2xlZC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmV4dFN0YXR1c1N5bWJvbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLm5leHRTdGF0dXNTeW1ib2w7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSB0aGVuIGl0IGlzIHJlZ2lzdGVyZWQgYXMgYSBjb21tYW5kIHRoYXQgdGhlIHVzZXIgY2FuIG1hcCB0by5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGF2YWlsYWJsZUFzQ29tbWFuZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5hdmFpbGFibGVBc0NvbW1hbmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdHVzIHR5cGUuIFNlZSB7QGxpbmsgU3RhdHVzVHlwZX0gZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0eXBlKCk6IFN0YXR1c1R5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLnR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTdGF0dXMuIFRoZSByZWdpc3RyeSB3aWxsIGJlIGFkZGVkIGxhdGVyIGluIHRoZSBjYXNlXG4gICAgICogb2YgdGhlIGRlZmF1bHQgc3RhdHVzZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0YXR1c0NvbmZpZ3VyYXRpb259IGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbjogU3RhdHVzQ29uZmlndXJhdGlvbikge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IERvbmUgc3RhdHVzLiBHb2VzIHRvIFRvZG8gd2hlbiB0b2dnbGVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBtYWtlRG9uZSgpOiBTdGF0dXMge1xuICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhuZXcgU3RhdHVzQ29uZmlndXJhdGlvbigneCcsICdEb25lJywgJyAnLCB0cnVlLCBTdGF0dXNUeXBlLkRPTkUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGRlZmF1bHQgc3RhdHVzIG9mIGVtcHR5LCB1c2VkIHdoZW4gdGhpbmdzIGdvIHdyb25nLlxuICAgICAqL1xuICAgIHN0YXRpYyBtYWtlRW1wdHkoKTogU3RhdHVzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMobmV3IFN0YXR1c0NvbmZpZ3VyYXRpb24oJycsICdFTVBUWScsICcnLCB0cnVlLCBTdGF0dXNUeXBlLkVNUFRZKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgVG9kbyBzdGF0dXMuIEdvZXMgdG8gRG9uZSB3aGVuIHRvZ2dsZWQuXG4gICAgICogVXNlciBtYXkgbGF0ZXIgYmUgYWJsZSB0byBvdmVycmlkZSB0aGlzIHRvIGdvIHRvIEluIFByb2dyZXNzIGluc3RlYWQuXG4gICAgICovXG4gICAgc3RhdGljIG1ha2VUb2RvKCk6IFN0YXR1cyB7XG4gICAgICAgIHJldHVybiBuZXcgU3RhdHVzKG5ldyBTdGF0dXNDb25maWd1cmF0aW9uKCcgJywgJ1RvZG8nLCAneCcsIHRydWUsIFN0YXR1c1R5cGUuVE9ETykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IENhbmNlbGxlZCBzdGF0dXMuIEdvZXMgdG8gVG9kbyB3aGVuIHRvZ2dsZWQuXG4gICAgICovXG4gICAgc3RhdGljIG1ha2VDYW5jZWxsZWQoKTogU3RhdHVzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMobmV3IFN0YXR1c0NvbmZpZ3VyYXRpb24oJy0nLCAnQ2FuY2VsbGVkJywgJyAnLCB0cnVlLCBTdGF0dXNUeXBlLkNBTkNFTExFRCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IEluIFByb2dyZXNzIHN0YXR1cy4gR29lcyB0byBEb25lIHdoZW4gdG9nZ2xlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgbWFrZUluUHJvZ3Jlc3MoKTogU3RhdHVzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMobmV3IFN0YXR1c0NvbmZpZ3VyYXRpb24oJy8nLCAnSW4gUHJvZ3Jlc3MnLCAneCcsIHRydWUsIFN0YXR1c1R5cGUuSU5fUFJPR1JFU1MpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIFN0YXR1c1R5cGUgdG8gdXNlIGZvciBhIHN5bWJvbCwgaWYgaXQgaXMgbm90IGluIHRoZSBTdGF0dXNSZWdpc3RyeS5cbiAgICAgKiBUaGUgY29yZSBzeW1ib2xzIGFyZSByZWNvZ25pc2VkLlxuICAgICAqIE90aGVyIHN5bWJvbHMgYXJlIHRyZWF0ZWQgYXMgU3RhdHVzVHlwZS5UT0RPXG4gICAgICogQHBhcmFtIHN5bWJvbFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUeXBlRm9yVW5rbm93blN5bWJvbChzeW1ib2w6IHN0cmluZyk6IFN0YXR1c1R5cGUge1xuICAgICAgICBzd2l0Y2ggKHN5bWJvbCkge1xuICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICBjYXNlICdYJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzVHlwZS5ET05FO1xuICAgICAgICAgICAgY2FzZSAnLyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1c1R5cGUuSU5fUFJPR1JFU1M7XG4gICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzVHlwZS5DQU5DRUxMRUQ7XG4gICAgICAgICAgICBjYXNlICcnOlxuICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXNUeXBlLkVNUFRZO1xuICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXNUeXBlLlRPRE87XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRleHQgdGhhdCB3YXMgc2F2ZWQgZnJvbSBhIFN0YXR1c1R5cGUgdmFsdWUgYmFjayB0byBhIFN0YXR1c1R5cGUuXG4gICAgICogUmV0dXJucyBTdGF0dXNUeXBlLlRPRE8gaWYgdGhlIHN0cmluZyBpcyBub3QgdmFsaWQuXG4gICAgICogQHBhcmFtIHN0YXR1c1R5cGVBc1N0cmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUeXBlRnJvbVN0YXR1c1R5cGVTdHJpbmcoc3RhdHVzVHlwZUFzU3RyaW5nOiBzdHJpbmcpOiBTdGF0dXNUeXBlIHtcbiAgICAgICAgcmV0dXJuIFN0YXR1c1R5cGVbc3RhdHVzVHlwZUFzU3RyaW5nIGFzIGtleW9mIHR5cGVvZiBTdGF0dXNUeXBlXSB8fCBTdGF0dXNUeXBlLlRPRE87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgU3RhdHVzIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4sIHVua25vd24gc3ltYm9sLlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gU3RhdHVzUmVnaXN0cnkgZG9lcyBub3QgcmVjb2duaXNlIGEgc3ltYm9sLFxuICAgICAqIGFuZCB3ZSBkbyBub3Qgd2FudCB0byBleHBvc2UgdGhlIHVzZXIncyBkYXRhIHRvIHRoZSBTdGF0dXMuRU1QVFkgc3RhdHVzLlxuICAgICAqXG4gICAgICogVGhlIHR5cGUgaXMgc2V0IHRvIFRPRE8uXG4gICAgICogQHBhcmFtIHVua25vd25TeW1ib2xcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlVW5rbm93blN0YXR1cyh1bmtub3duU3ltYm9sOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMobmV3IFN0YXR1c0NvbmZpZ3VyYXRpb24odW5rbm93blN5bWJvbCwgJ1Vua25vd24nLCAneCcsIGZhbHNlLCBTdGF0dXNUeXBlLlRPRE8pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGJ1bGstaW1wb3J0aW5nIHNldHRpbmdzIGZyb20gYXJyYXlzIG9mIHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW1wb3J0ZWQgQW4gYXJyYXkgb2Ygc3ltYm9sLCBuYW1lLCBuZXh0IHN5bWJvbCwgc3RhdHVzIHR5cGVcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlRnJvbUltcG9ydGVkVmFsdWUoaW1wb3J0ZWQ6IFN0YXR1c0NvbGxlY3Rpb25FbnRyeSkge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBpbXBvcnRlZFswXTtcbiAgICAgICAgY29uc3QgdHlwZSA9IFN0YXR1cy5nZXRUeXBlRnJvbVN0YXR1c1R5cGVTdHJpbmcoaW1wb3J0ZWRbM10pO1xuICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhuZXcgU3RhdHVzQ29uZmlndXJhdGlvbihzeW1ib2wsIGltcG9ydGVkWzFdLCBpbXBvcnRlZFsyXSwgZmFsc2UsIHR5cGUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb21wbGV0aW9uIHN0YXR1cyBmb3IgYSB0YXNrLCB0aGlzIGlzIG9ubHkgc3VwcG9ydGVkXG4gICAgICogd2hlbiB0aGUgdGFzayBpcyBkb25lL3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsqfSAge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c1xuICAgICAqL1xuICAgIHB1YmxpYyBpc0NvbXBsZXRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gU3RhdHVzVHlwZS5ET05FO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIG9uZS1saW5lIHN1bW1hcnkgb2YgdGhlIHN0YXR1cywgZm9yIHByZXNlbnRhdGlvbiB0byB1c2Vycy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmlld1RleHQoKSB7XG4gICAgICAgIGxldCBjb21tYW5kTm90aWNlID0gJyc7XG4gICAgICAgIGlmIChTdGF0dXMudGFza3NQbHVnaW5DYW5DcmVhdGVDb21tYW5kc0ZvclN0YXR1c2VzKCkgJiYgdGhpcy5hdmFpbGFibGVBc0NvbW1hbmQpIHtcbiAgICAgICAgICAgIGNvbW1hbmROb3RpY2UgPSAnIEF2YWlsYWJsZSBhcyBhIGNvbW1hbmQuJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgYC0gWyR7dGhpcy5zeW1ib2x9XWAgKyAvLyBjb21tZW50IHRvIGJyZWFrIGxpbmVcbiAgICAgICAgICAgIGAgPT4gWyR7dGhpcy5uZXh0U3RhdHVzU3ltYm9sfV0sYCArXG4gICAgICAgICAgICBgIG5hbWU6ICcke3RoaXMubmFtZX0nLGAgK1xuICAgICAgICAgICAgYCB0eXBlOiAnJHt0aGlzLmNvbmZpZ3VyYXRpb24udHlwZX0nLmAgK1xuICAgICAgICAgICAgYCR7Y29tbWFuZE5vdGljZX1gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBUYXNrcyBjYW4geWV0IGNyZWF0ZSAnVG9nZ2xlIFN0YXR1cycgY29tbWFuZHMgZm9yIHN0YXR1c2VzXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG5vdCB5ZXQgcG9zc2libGUsIGFuZCBzbyBzb21lIFVJIGZlYXR1cmVzIGFyZSB0ZW1wb3JhcmlseSBoaWRkZW4uXG4gICAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbi10YXNrcy1ncm91cC9vYnNpZGlhbi10YXNrcy9pc3N1ZXMvMTQ4NlxuICAgICAqIE9uY2UgdGhhdCBpc3N1ZSBpcyBhZGRyZXNzZWQsIHRoaXMgbWV0aG9kIGNhbiBiZSByZW1vdmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgdGFza3NQbHVnaW5DYW5DcmVhdGVDb21tYW5kc0ZvclN0YXR1c2VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU3RhdHVzQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL1N0YXR1c0NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBTdGF0dXNSZWdpc3RyeSB9IGZyb20gJy4uL1N0YXR1c1JlZ2lzdHJ5JztcbmltcG9ydCB7IFN0YXR1cyB9IGZyb20gJy4uL1N0YXR1cyc7XG5pbXBvcnQgdHlwZSB7IFN0YXR1c0NvbGxlY3Rpb24gfSBmcm9tICcuLi9TdGF0dXNDb2xsZWN0aW9uJztcblxuLyoqXG4gKiBDbGFzcyBmb3IgZW5jYXBzdWxhdGluZyB0aGUgc2V0dGluZ3MgdGhhdCBjb250cm9sIGN1c3RvbSBzdGF0dXNlcy5cbiAqXG4gKiBNb3N0IG1ldGhvZHMgYXJlIHN0YXRpYyB0byBhbGxvdyB0aGVtIHRvIGJlIGNhbGxlZCBmcm9tIGNhbGwtYmFja3MuXG4gKlxuICogQHNlZSBTdGF0dXNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXR1c1NldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jb3JlU3RhdHVzZXMgPSBbXG4gICAgICAgICAgICAvLyBUaGUgdHdvIHN0YXR1c2VzIHRoYXQgZG8gbm90IG5lZWQgQ1NTIHN0eWxpbmdcbiAgICAgICAgICAgIFN0YXR1cy5tYWtlVG9kbygpLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBTdGF0dXMubWFrZURvbmUoKS5jb25maWd1cmF0aW9uLFxuICAgICAgICBdOyAvLyBEbyBub3QgbW9kaWZ5IGRpcmVjdGx5OiB1c2UgdGhlIHN0YXRpYyBtdXRhdGlvbiBtZXRob2RzIGluIHRoaXMgY2xhc3MuXG4gICAgICAgIHRoaXMuY3VzdG9tU3RhdHVzZXMgPSBbXG4gICAgICAgICAgICAvLyBBbnkgc3RhdHVzZXMgdGhhdCBhcmUgYWx3YXlzIHN1cHBvcnRlZCwgYnV0IG5lZWQgY3VzdG9tIENTUyBzdHlsaW5nXG4gICAgICAgICAgICBTdGF0dXMubWFrZUluUHJvZ3Jlc3MoKS5jb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgU3RhdHVzLm1ha2VDYW5jZWxsZWQoKS5jb25maWd1cmF0aW9uLFxuICAgICAgICBdOyAvLyBEbyBub3QgbW9kaWZ5IGRpcmVjdGx5OiB1c2UgdGhlIHN0YXRpYyBtdXRhdGlvbiBtZXRob2RzIGluIHRoaXMgY2xhc3MuXG4gICAgfVxuICAgIHJlYWRvbmx5IGNvcmVTdGF0dXNlczogU3RhdHVzQ29uZmlndXJhdGlvbltdO1xuICAgIHJlYWRvbmx5IGN1c3RvbVN0YXR1c2VzOiBTdGF0dXNDb25maWd1cmF0aW9uW107XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBuZXcgY3VzdG9tIHN0YXR1cy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgc3RhdGljIHNvIHRoYXQgaXQgY2FuIGJlIGNhbGxlZCBmcm9tIG1vZGFsIG9uQ2xpY2soKSBjYWxsLWJhY2tzLlxuICAgICAqXG4gICAgICogLSBDdXJyZW50bHksIGR1cGxpY2F0ZXMgYXJlIGFsbG93ZWQuXG4gICAgICogLSBBbGxvd3MgZW1wdHkgU3RhdHVzQ29uZmlndXJhdGlvbiBvYmplY3RzIC0gd2hlcmUgZXZlcnkgc3RyaW5nIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHN0YXR1c2VzXG4gICAgICogQHBhcmFtIG5ld1N0YXR1c1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYWRkU3RhdHVzKHN0YXR1c2VzOiBTdGF0dXNDb25maWd1cmF0aW9uW10sIG5ld1N0YXR1czogU3RhdHVzQ29uZmlndXJhdGlvbikge1xuICAgICAgICBzdGF0dXNlcy5wdXNoKG5ld1N0YXR1cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZSB0aGUgZ2l2ZW4gc3RhdHVzLCB0byBlZmZlY3RpdmVseSBlZGl0IGl0LlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2V0dGluZ3Mgd2VyZSBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBzdGF0aWMgc28gdGhhdCBpdCBjYW4gYmUgY2FsbGVkIGZyb20gbW9kYWwgb25DbGljaygpIGNhbGwtYmFja3MuXG4gICAgICpcbiAgICAgKiAtIERvZXMgbm90IGN1cnJlbnRseSBjaGVjayB3aGV0aGVyIHRoZSBzdGF0dXMgY2hhcmFjdGVyIGlzIHRoZSBzYW1lXG4gICAgICogLSBJZiB0aGUgc3RhdHVzIGNoYXJhY3RlciBpcyBkaWZmZXJlbnQsIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgdGhlIG5ldyBvbmUgaXMgYWxyZWFkeSB1c2VkIGluIGFub3RoZXIgc3RhdHVzXG4gICAgICogQHBhcmFtIHN0YXR1c2VzXG4gICAgICogQHBhcmFtIG9yaWdpbmFsU3RhdHVzXG4gICAgICogQHBhcmFtIG5ld1N0YXR1c1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVwbGFjZVN0YXR1cyhcbiAgICAgICAgc3RhdHVzZXM6IFN0YXR1c0NvbmZpZ3VyYXRpb25bXSxcbiAgICAgICAgb3JpZ2luYWxTdGF0dXM6IFN0YXR1c0NvbmZpZ3VyYXRpb24sXG4gICAgICAgIG5ld1N0YXR1czogU3RhdHVzQ29uZmlndXJhdGlvbixcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbmRTdGF0dXNJbmRleChvcmlnaW5hbFN0YXR1cywgc3RhdHVzZXMpO1xuICAgICAgICBpZiAoaW5kZXggPD0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0dXNlcy5zcGxpY2UoaW5kZXgsIDEsIG5ld1N0YXR1cyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgZmFjdCB0aGF0IHN0YXR1c1NldHRpbmdzLmN1c3RvbVN0YXR1c1R5cGVzLmluZGV4T2Yoc3RhdHVzQ29uZmlndXJhdGlvbilcbiAgICAgKiBzdG9wcGVkIGZpbmRpbmcgaWRlbnRpY2FsIHN0YXR1c2VzIHNpbmNlIHRoZSBhZGRpdGlvbiBvZiBTdGF0dXNDb25maWd1cmF0aW9uLnR5cGUuXG4gICAgICogQHBhcmFtIHN0YXR1c0NvbmZpZ3VyYXRpb25cbiAgICAgKiBAcGFyYW0gc3RhdHVzZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGZpbmRTdGF0dXNJbmRleChzdGF0dXNDb25maWd1cmF0aW9uOiBTdGF0dXNDb25maWd1cmF0aW9uLCBzdGF0dXNlczogU3RhdHVzQ29uZmlndXJhdGlvbltdKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU3RhdHVzQXNTdGF0dXMgPSBuZXcgU3RhdHVzKHN0YXR1c0NvbmZpZ3VyYXRpb24pO1xuICAgICAgICByZXR1cm4gc3RhdHVzZXMuZmluZEluZGV4KChzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhzKS5wcmV2aWV3VGV4dCgpID09IG9yaWdpbmFsU3RhdHVzQXNTdGF0dXMucHJldmlld1RleHQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHRoZSBnaXZlbiBzdGF0dXMuXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGRlbGV0ZWQsIGFuZCBmYWxzZSBpZiBub3QuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHN0YXRpYyBzbyB0aGF0IGl0IGNhbiBiZSBjYWxsZWQgZnJvbSBtb2RhbCBvbkNsaWNrKCkgY2FsbC1iYWNrcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0dXNlc1xuICAgICAqIEBwYXJhbSBzdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlbGV0ZVN0YXR1cyhzdGF0dXNlczogU3RhdHVzQ29uZmlndXJhdGlvbltdLCBzdGF0dXM6IFN0YXR1c0NvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbmRTdGF0dXNJbmRleChzdGF0dXMsIHN0YXR1c2VzKTtcbiAgICAgICAgaWYgKGluZGV4IDw9IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdHVzZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGFsbCBjdXN0b20gc3RhdHVzZXMuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHN0YXRpYyBzbyB0aGF0IGl0IGNhbiBiZSBjYWxsZWQgZnJvbSBtb2RhbCBvbkNsaWNrKCkgY2FsbC1iYWNrcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0dXNTZXR0aW5nc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGVsZXRlQWxsQ3VzdG9tU3RhdHVzZXMoc3RhdHVzU2V0dGluZ3M6IFN0YXR1c1NldHRpbmdzKSB7XG4gICAgICAgIHN0YXR1c1NldHRpbmdzLmN1c3RvbVN0YXR1c2VzLnNwbGljZSgwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlIHRoZSBkZWZhdWx0IGN1c3RvbSBzdGF0dXNlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0dXNTZXR0aW5nc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVzZXRBbGxDdXN0b21TdGF0dXNlcyhzdGF0dXNTZXR0aW5nczogU3RhdHVzU2V0dGluZ3MpIHtcbiAgICAgICAgU3RhdHVzU2V0dGluZ3MuZGVsZXRlQWxsQ3VzdG9tU3RhdHVzZXMoc3RhdHVzU2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBkZWZhdWx0U2V0dGluZ3MgPSBuZXcgU3RhdHVzU2V0dGluZ3MoKTtcbiAgICAgICAgZGVmYXVsdFNldHRpbmdzLmN1c3RvbVN0YXR1c2VzLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgICAgIFN0YXR1c1NldHRpbmdzLmFkZFN0YXR1cyhzdGF0dXNTZXR0aW5ncy5jdXN0b21TdGF0dXNlcywgcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNvbGxlY3Rpb24gb2YgY3VzdG9tIHN1cHBvcnRlZCBzdGF0dXNlcyB0byBhIFN0YXR1c1NldHRpbmdzLlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBwb3B1bGF0ZSB0aGUgdXNlcidzIHNldHRpbmdzLlxuICAgICAqIElmIHRoZXJlIGFyZSBhbnkgZXhhY3QgZHVwbGljYXRlcyBhbHJlYWR5IHByZXNlbnQsIHRoZXkgYXJlIHNraXBwZWQsIGFuZCBub3RlZCBpbiB0aGUgcmV0dXJuZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHN0YXRpYyBzbyB0aGF0IGl0IGNhbiBiZSBjYWxsZWQgZnJvbSBtb2RhbCBvbkNsaWNrKCkgY2FsbC1iYWNrcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0dXNTZXR0aW5ncyBhIFN0YXR1c1NldHRpbmdzXG4gICAgICogQHBhcmFtIHN1cHBvcnRlZFN0YXR1c2VzIC0gYW4gYXJyYXkgb2Ygc3RhdHVzIHNwZWNpZmljYXRpb25zLCBmb3IgZXhhbXBsZSBgWydiJywgJ0Jvb2ttYXJrJywgJ3gnXWBcbiAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHdhcm5pbmcgbWVzc2FnZXMgdG8gc2hvdyB0aGUgdXNlciwgb25lIGZvciBlYWNoIHJlamVjdGVkIGV4YWN0IGR1cGxpY2F0ZSBzdGF0dXMuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBtaW5pbWFsU3VwcG9ydGVkU3RhdHVzZXN9LCB7QGxpbmsgaXRzU3VwcG9ydGVkU3RhdHVzZXN9XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBidWxrQWRkU3RhdHVzQ29sbGVjdGlvbihcbiAgICAgICAgc3RhdHVzU2V0dGluZ3M6IFN0YXR1c1NldHRpbmdzLFxuICAgICAgICBzdXBwb3J0ZWRTdGF0dXNlczogU3RhdHVzQ29sbGVjdGlvbixcbiAgICApOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IG5vdGljZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHN1cHBvcnRlZFN0YXR1c2VzLmZvckVhY2goKGltcG9ydGVkU3RhdHVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYXNTdGF0dXMgPSBzdGF0dXNTZXR0aW5ncy5jdXN0b21TdGF0dXNlcy5maW5kKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zeW1ib2wgPT0gaW1wb3J0ZWRTdGF0dXNbMF0gJiZcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5uYW1lID09IGltcG9ydGVkU3RhdHVzWzFdICYmXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubmV4dFN0YXR1c1N5bWJvbCA9PSBpbXBvcnRlZFN0YXR1c1syXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghaGFzU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgU3RhdHVzU2V0dGluZ3MuYWRkU3RhdHVzKHN0YXR1c1NldHRpbmdzLmN1c3RvbVN0YXR1c2VzLCBTdGF0dXMuY3JlYXRlRnJvbUltcG9ydGVkVmFsdWUoaW1wb3J0ZWRTdGF0dXMpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm90aWNlcy5wdXNoKGBUaGUgc3RhdHVzICR7aW1wb3J0ZWRTdGF0dXNbMV19ICgke2ltcG9ydGVkU3RhdHVzWzBdfSkgaXMgYWxyZWFkeSBhZGRlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBub3RpY2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGx5IHRoZSBjdXN0b20gc3RhdHVzZXMgaW4gdGhlIHN0YXR1c1NldHRpbmdzIG9iamVjdCB0byB0aGUgc3RhdHVzUmVnaXN0cnkuXG4gICAgICogQHBhcmFtIHN0YXR1c1NldHRpbmdzXG4gICAgICogQHBhcmFtIHN0YXR1c1JlZ2lzdHJ5XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBhcHBseVRvU3RhdHVzUmVnaXN0cnkoc3RhdHVzU2V0dGluZ3M6IFN0YXR1c1NldHRpbmdzLCBzdGF0dXNSZWdpc3RyeTogU3RhdHVzUmVnaXN0cnkpIHtcbiAgICAgICAgc3RhdHVzUmVnaXN0cnkuY2xlYXJTdGF0dXNlcygpO1xuICAgICAgICBzdGF0dXNTZXR0aW5ncy5jb3JlU3RhdHVzZXMuZm9yRWFjaCgoc3RhdHVzVHlwZSkgPT4ge1xuICAgICAgICAgICAgc3RhdHVzUmVnaXN0cnkuYWRkKHN0YXR1c1R5cGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RhdHVzU2V0dGluZ3MuY3VzdG9tU3RhdHVzZXMuZm9yRWFjaCgoc3RhdHVzVHlwZSkgPT4ge1xuICAgICAgICAgICAgc3RhdHVzUmVnaXN0cnkuYWRkKHN0YXR1c1R5cGUpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IGZlYXR1cmVzSnNvbiBmcm9tICcuL2ZlYXR1cmVDb25maWd1cmF0aW9uLmpzb24nO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlRmxhZyA9IHtcbiAgICBbaW50ZXJuYWxOYW1lOiBzdHJpbmddOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBUaGUgRmVhdHVyZSBjbGFzcyB0cmFja3MgYWxsIHRoZSBwb3NzaWJsZSBmZWF0dXJlcyB0aGF0IHVzZXJzIGNhbiBlbmFibGVkIHRoYXQgYXJlIGluIGRldmVsb3BtZW50LiBUaGlzIGFsbG93c1xuICogbmV3IGZlYXR1cmVzIHRvIGJlIGFkZGVkIHRvIHRoZSBwbGF0Zm9ybSBidXQgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4gVGhpcyByZWR1Y2VzIHRoZSBjb21wbGljYXRpb25zIHdoZW4gaXRcbiAqIGNvbWVzIHRvIGFkZGluZyBuZXcgZmVhdHVyZXMgYW5kIGEgbGFyZ2UgY2FzY2FkZSBvZiBkZXBlbmRlbnQgYnJhbmNoZXMuXG4gKlxuICogV2hlbiB5b3UgYWRkIGEgbmV3IGZlYXR1cmUgeW91IG5lZWQgdG8gYWRkIGl0IHRvIHRoZSBmZWF0dXJlQ29uZmlndXJhdGlvbi5qc29uIGZpbGUuIEl0IHRoZW4gbmVlZHMgdG8gYmUgYWRkZWQgdG9cbiAqIHNldHRpbmdzIHNvIGEgdXNlciBjYW4gZW5hYmxlIGl0LiBJZiB5b3Ugd2FudCBpdCBoaWRkZW4geW91IHdpbGwgbmVlZCB0byBtYW51YWxseSB1cGRhdGUgdGhlIGRhdGEuanNvbiBmaWxlLiBJbiB0aGVcbiAqIHBsdWdpbiBmb2xkZXIuXG4gKlxuICogQHNpbmNlIDIwMjItMDUtMjlcbiAqL1xuZXhwb3J0IGNsYXNzIEZlYXR1cmUge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpbnRlcm5hbE5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGluZGV4OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZGlzcGxheU5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVuYWJsZWRCeURlZmF1bHQ6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGFibGU6IGJvb2xlYW4sXG4gICAgKSB7fVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGZlYXR1cmVzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHN0YXRpY1xuICAgICAqIEB0eXBlIHtGZWF0dXJlW119XG4gICAgICogQG1lbWJlcm9mIEZlYXR1cmVcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IHZhbHVlcygpOiBGZWF0dXJlW10ge1xuICAgICAgICBsZXQgYXZhaWxhYmxlRmVhdHVyZXM6IEZlYXR1cmVbXSA9IFtdO1xuXG4gICAgICAgIGZlYXR1cmVzSnNvbi5mb3JFYWNoKChmZWF0dXJlKSA9PiB7XG4gICAgICAgICAgICBhdmFpbGFibGVGZWF0dXJlcyA9IFtcbiAgICAgICAgICAgICAgICAuLi5hdmFpbGFibGVGZWF0dXJlcyxcbiAgICAgICAgICAgICAgICBuZXcgRmVhdHVyZShcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5pbnRlcm5hbE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZGlzcGxheU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZW5hYmxlZEJ5RGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5zdGFibGUsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXZhaWxhYmxlRmVhdHVyZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgZmVhdHVyZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAdHlwZSB7RmVhdHVyZUZsYWd9XG4gICAgICogQG1lbWJlcm9mIEZlYXR1cmVcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IHNldHRpbmdzRmxhZ3MoKTogRmVhdHVyZUZsYWcge1xuICAgICAgICBjb25zdCBmZWF0dXJlRmxhZ3M6IHsgW2ludGVybmFsTmFtZTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG5cbiAgICAgICAgRmVhdHVyZS52YWx1ZXMuZm9yRWFjaCgoZmVhdHVyZSkgPT4ge1xuICAgICAgICAgICAgZmVhdHVyZUZsYWdzW2ZlYXR1cmUuaW50ZXJuYWxOYW1lXSA9IGZlYXR1cmUuZW5hYmxlZEJ5RGVmYXVsdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmZWF0dXJlRmxhZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSBuYW1lIHRvIGl0cyBjb3JyZXNwb25kaW5nIGRlZmF1bHQgRmVhdHVyZSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGNvbnZlcnQgdG8gRmVhdHVyZVxuICAgICAqIEB0aHJvd3MgUmFuZ2VFcnJvciwgaWYgYSBzdHJpbmcgdGhhdCBoYXMgbm8gY29ycmVzcG9uZGluZyBGZWF0dXJlIHZhbHVlIHdhcyBwYXNzZWQuXG4gICAgICogQHJldHVybnMgdGhlIG1hdGNoaW5nIEZlYXR1cmVcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVN0cmluZyhuYW1lOiBzdHJpbmcpOiBGZWF0dXJlIHtcbiAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIEZlYXR1cmUudmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gZmVhdHVyZS5pbnRlcm5hbE5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgICAgYElsbGVnYWwgYXJndW1lbnQgcGFzc2VkIHRvIGZyb21TdHJpbmcoKTogJHtuYW1lfSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFueSBhdmFpbGFibGUgRmVhdHVyZSAke1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSkucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgICAgIH1gLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTdGF0dXNDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vU3RhdHVzQ29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBTdGF0dXMgfSBmcm9tICcuLi9TdGF0dXMnO1xuaW1wb3J0IHsgU3RhdHVzU2V0dGluZ3MgfSBmcm9tICcuL1N0YXR1c1NldHRpbmdzJztcbmltcG9ydCB7IEZlYXR1cmUgfSBmcm9tICcuL0ZlYXR1cmUnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRmxhZyB9IGZyb20gJy4vRmVhdHVyZSc7XG5cbmludGVyZmFjZSBTZXR0aW5nc01hcCB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgSGVhZGluZ1N0YXRlID0ge1xuICAgIFtpZDogc3RyaW5nXTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3Mge1xuICAgIGdsb2JhbEZpbHRlcjogc3RyaW5nO1xuICAgIHJlbW92ZUdsb2JhbEZpbHRlcjogYm9vbGVhbjtcbiAgICBzZXREb25lRGF0ZTogYm9vbGVhbjtcbiAgICBhdXRvU3VnZ2VzdEluRWRpdG9yOiBib29sZWFuO1xuICAgIGF1dG9TdWdnZXN0TWluTWF0Y2g6IG51bWJlcjtcbiAgICBhdXRvU3VnZ2VzdE1heEl0ZW1zOiBudW1iZXI7XG4gICAgcHJvdmlkZUFjY2Vzc0tleXM6IGJvb2xlYW47XG4gICAgdXNlRmlsZW5hbWVBc1NjaGVkdWxlZERhdGU6IGJvb2xlYW47XG4gICAgZmlsZW5hbWVBc0RhdGVGb2xkZXJzOiBzdHJpbmdbXTtcblxuICAgIC8vIFRoZSBjdXN0b20gc3RhdHVzIHN0YXRlcy5cbiAgICBzdGF0dXNTZXR0aW5nczogU3RhdHVzU2V0dGluZ3M7XG5cbiAgICAvLyBDb2xsZWN0aW9uIG9mIGZlYXR1cmUgZmxhZyBJRHMgYW5kIHRoZWlyIHN0YXRlLlxuICAgIGZlYXR1cmVzOiBGZWF0dXJlRmxhZztcblxuICAgIC8vIFNldHRpbmdzIGFyZSBtb3ZlZCB0byBhIG1vcmUgZ2VuZXJhbCBtYXAgdG8gYWxsb3cgdGhlIHNldHRpbmdzIFVJIHRvIGJlXG4gICAgLy8gZHluYW1pY2FsbHkgZ2VuZXJhdGVkLlxuICAgIGdlbmVyYWxTZXR0aW5nczogU2V0dGluZ3NNYXA7XG5cbiAgICAvLyBUcmFja3MgdGhlIHN0YWdlIG9mIHRoZSBoZWFkaW5ncyBpbiB0aGUgc2V0dGluZ3MgVUkuXG4gICAgaGVhZGluZ09wZW5lZDogSGVhZGluZ1N0YXRlO1xufVxuXG5jb25zdCBkZWZhdWx0U2V0dGluZ3M6IFNldHRpbmdzID0ge1xuICAgIGdsb2JhbEZpbHRlcjogJycsXG4gICAgcmVtb3ZlR2xvYmFsRmlsdGVyOiBmYWxzZSxcbiAgICBzZXREb25lRGF0ZTogdHJ1ZSxcbiAgICBhdXRvU3VnZ2VzdEluRWRpdG9yOiB0cnVlLFxuICAgIGF1dG9TdWdnZXN0TWluTWF0Y2g6IDAsXG4gICAgYXV0b1N1Z2dlc3RNYXhJdGVtczogNixcbiAgICBwcm92aWRlQWNjZXNzS2V5czogdHJ1ZSxcbiAgICB1c2VGaWxlbmFtZUFzU2NoZWR1bGVkRGF0ZTogZmFsc2UsXG4gICAgZmlsZW5hbWVBc0RhdGVGb2xkZXJzOiBbXSxcbiAgICBzdGF0dXNTZXR0aW5nczogbmV3IFN0YXR1c1NldHRpbmdzKCksXG4gICAgZmVhdHVyZXM6IEZlYXR1cmUuc2V0dGluZ3NGbGFncyxcbiAgICBnZW5lcmFsU2V0dGluZ3M6IHtcbiAgICAgICAgLyogUHJldmVudCBkdXBsaWNhdGUgdmFsdWVzIGluIHVzZXIgc2V0dGluZ3MgZm9yIG5vdyxcbiAgICAgICAgICAgYXQgbGVhc3QgdW50aWwgSSBzdGFydCBwb3J0aW5nIHRoZSBwcmUtMS4yMy4wIHNldHRpbmdzXG4gICAgICAgICAgIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIGZyb20gc2V0dGluZ3NDb25maWd1cmF0aW9uLmpzb24uXG4gICAgICAgICAqL1xuICAgICAgICAvLyBnbG9iYWxGaWx0ZXI6ICcnLFxuICAgICAgICAvLyByZW1vdmVHbG9iYWxGaWx0ZXI6IGZhbHNlLFxuICAgICAgICAvLyBzZXREb25lRGF0ZTogdHJ1ZSxcbiAgICB9LFxuICAgIGhlYWRpbmdPcGVuZWQ6IHt9LFxufTtcblxubGV0IHNldHRpbmdzOiBTZXR0aW5ncyA9IHsgLi4uZGVmYXVsdFNldHRpbmdzIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5ncyBhcyBhIG9iamVjdCwgaXQgd2lsbCBhbHNvIGNoZWNrIGFuZFxuICogdXBkYXRlIHRoZSBmbGFncyB0byBtYWtlIHN1cmUgdGhleSBhcmUgYWxsIHNob3duIGluIHRoZSBkYXRhLmpzb25cbiAqIGZpbGUuIEV4cG9zdXJlIHZpYSB0aGUgc2V0dGluZ3MgVUkgaXMgb3B0aW9uYWwuXG4gKlxuICogQGV4cG9ydFxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkLlxuICovXG5leHBvcnQgY29uc3QgZ2V0U2V0dGluZ3MgPSAoKTogU2V0dGluZ3MgPT4ge1xuICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG5ldyBmbGFnIGFuZCBpZiBzbyBhZGQgaXQgdG8gdGhlIHVzZXJzIHNldHRpbmdzLlxuICAgIGZvciAoY29uc3QgZmxhZyBpbiBGZWF0dXJlLnNldHRpbmdzRmxhZ3MpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmZlYXR1cmVzW2ZsYWddID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLmZlYXR1cmVzW2ZsYWddID0gRmVhdHVyZS5zZXR0aW5nc0ZsYWdzW2ZsYWddO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW4gY2FzZSBzYXZlcyBwcmUtZGF0ZWQgU3RhdHVzQ29uZmlndXJhdGlvbi50eXBlXG4gICAgLy8gVE9ETyBTcGVjaWFsIGNhc2UgZm9yIHN5bWJvbCAnWCcgb3IgJ3gnIChqdXN0IGluIGNhc2UpXG4gICAgc2V0dGluZ3Muc3RhdHVzU2V0dGluZ3MuY3VzdG9tU3RhdHVzZXMuZm9yRWFjaCgocywgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1R5cGUgPSBTdGF0dXMuZ2V0VHlwZUZyb21TdGF0dXNUeXBlU3RyaW5nKHMudHlwZSk7XG4gICAgICAgIGFycmF5W2luZGV4XSA9IG5ldyBTdGF0dXNDb25maWd1cmF0aW9uKFxuICAgICAgICAgICAgcy5zeW1ib2wgPz8gJyAnLFxuICAgICAgICAgICAgcy5uYW1lLFxuICAgICAgICAgICAgcy5uZXh0U3RhdHVzU3ltYm9sID8/ICd4JyxcbiAgICAgICAgICAgIHMuYXZhaWxhYmxlQXNDb21tYW5kLFxuICAgICAgICAgICAgbmV3VHlwZSxcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IC4uLnNldHRpbmdzIH07XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlU2V0dGluZ3MgPSAobmV3U2V0dGluZ3M6IFBhcnRpYWw8U2V0dGluZ3M+KTogU2V0dGluZ3MgPT4ge1xuICAgIHNldHRpbmdzID0geyAuLi5zZXR0aW5ncywgLi4ubmV3U2V0dGluZ3MgfTtcblxuICAgIHJldHVybiBnZXRTZXR0aW5ncygpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0U2V0dGluZ3MgPSAoKTogU2V0dGluZ3MgPT4ge1xuICAgIHJldHVybiB1cGRhdGVTZXR0aW5ncyhkZWZhdWx0U2V0dGluZ3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUdlbmVyYWxTZXR0aW5nID0gKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IGJvb2xlYW4pOiBTZXR0aW5ncyA9PiB7XG4gICAgc2V0dGluZ3MuZ2VuZXJhbFNldHRpbmdzW25hbWVdID0gdmFsdWU7XG5cbiAgICAvKiBQcmV2ZW50IGR1cGxpY2F0ZSB2YWx1ZXMgaW4gdXNlciBzZXR0aW5ncyBmb3Igbm93LFxuICAgICAgIGF0IGxlYXN0IHVudGlsIEkgc3RhcnQgcG9ydGluZyB0aGUgcHJlLTEuMjMuMCBzZXR0aW5nc1xuICAgICAgIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIGZyb20gc2V0dGluZ3NDb25maWd1cmF0aW9uLmpzb24uXG4gICAgICovXG4gICAgLy8gc3luYyB0aGUgb2xkIHNldHRpbmdzIGZvciB0aGUgbW9tZW50IHNvIGEgbGFyZ2VyIGNoYW5nZSBpcyBub3QgbmVlZGVkLlxuICAgIC8vIHVwZGF0ZVNldHRpbmdzKHtcbiAgICAvLyAgICAgZ2xvYmFsRmlsdGVyOiA8c3RyaW5nPnNldHRpbmdzLmdlbmVyYWxTZXR0aW5nc1snZ2xvYmFsRmlsdGVyJ10sXG4gICAgLy8gICAgIHJlbW92ZUdsb2JhbEZpbHRlcjogPGJvb2xlYW4+c2V0dGluZ3MuZ2VuZXJhbFNldHRpbmdzWydyZW1vdmVHbG9iYWxGaWx0ZXInXSxcbiAgICAvLyAgICAgc2V0RG9uZURhdGU6IDxib29sZWFuPnNldHRpbmdzLmdlbmVyYWxTZXR0aW5nc1snc2V0RG9uZURhdGUnXSxcbiAgICAvLyB9KTtcblxuICAgIHJldHVybiBnZXRTZXR0aW5ncygpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBmZWF0dXJlIGZyb20gc2V0dGluZ3MuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIGludGVybmFsTmFtZSB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgZmVhdHVyZS5cbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGZlYXR1cmUgaXMgZW5hYmxlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzRmVhdHVyZUVuYWJsZWQgPSAoaW50ZXJuYWxOYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gc2V0dGluZ3MuZmVhdHVyZXNbaW50ZXJuYWxOYW1lXSA/PyBmYWxzZTtcbn07XG5cbi8qKlxuICogZW5hYmxlcyB0b2dnbGluZyB0aGUgZmVhdHVyZSBhbmQgcmV0dXJuaW5nIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gd2l0aCBzdGF0ZS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0gaW50ZXJuYWxOYW1lIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmZWF0dXJlLlxuICogQHBhcmFtIGVuYWJsZWQgdGhlIGV4cGVjdGVkIHN0YXRlIG9mIHRoZSBmZWF0dXJlLlxuICogQHJldHVybnMgdGhlIGZlYXR1cmVzIHdpdGggdGhlIHNwZWNpZmllZCBmZWF0dXJlIHRvZ2dsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVGZWF0dXJlID0gKGludGVybmFsTmFtZTogc3RyaW5nLCBlbmFibGVkOiBib29sZWFuKTogRmVhdHVyZUZsYWcgPT4ge1xuICAgIHNldHRpbmdzLmZlYXR1cmVzW2ludGVybmFsTmFtZV0gPSBlbmFibGVkO1xuICAgIHJldHVybiBzZXR0aW5ncy5mZWF0dXJlcztcbn07XG4iLCAiaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi9TdGF0dXMnO1xuaW1wb3J0IHsgU3RhdHVzQ29uZmlndXJhdGlvbiwgU3RhdHVzVHlwZSB9IGZyb20gJy4vU3RhdHVzQ29uZmlndXJhdGlvbic7XG5cbi8qKlxuICogVHJhY2tzIGFsbCB0aGUgcmVnaXN0ZXJlZCBzdGF0dXNlcyBhIHRhc2sgY2FuIGhhdmUuXG4gKlxuICogVGhlcmUgYXJlIHR3byB3YXlzIG9mIHVzaW5nIHRoaXMgY2xhc3MuXG4gKiAtIEluICdwcm9kdWN0aW9uJyBjb2RlLCB0aGF0IGlzIGluIHRoZSBhY3R1YWwgcGx1Z2luIGNvZGUgdGhhdCBpcyByZWxlYXNlZCxcbiAqICAgY2FsbCBgU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKWAgdG8gb2J0YWluIHRoZSBzaW5nbGUgZ2xvYmFsIGluc3RhbmNlLlxuICogICBBbnkgY2hhbmdlcyB0byB0aGUgc3RhdHVzZXMgaW4gdGhhdCBpbnN0YW5jZSBhcmUgcmVmbGVjdGVkIGV2ZXJ5d2hlcmUgdGhyb3VnaG91dFxuICogICB0aGUgcGx1Z2luLlxuICogICBGb3IgZXhhbXBsZSwgdGhlIGNvZGUgdG8gdG9nZ2xlIHRhc2sgc3RhdHVzZXMgdXNlIHRoZSBnbG9iYWwgaW5zdGFuY2UuXG4gKiAtIFRlc3RzIG9mIFN0YXR1c1JlZ2lzdHJ5IGNhcGFiaWxpdGllcyBkbyBub3QgbmVlZCB0byBtb2RpZnkgdGhlIGdsb2JhbCBpbnN0YW5jZTpcbiAqICAgVGhleSBzaG91bGQgdXNlIGBuZXcgU3RhdHVzUmVnaXN0cnkoKWAsIHdoaWNoIG1ha2VzIGZvciBzaW1wbGVyLCBtb3JlIHJlYWRhYmxlXG4gKiAgIHRlc3RzIHRoYXQgY2FuIGJlIHJ1biBpbiBwYXJhbGxlbC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgU3RhdHVzUmVnaXN0cnlcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXR1c1JlZ2lzdHJ5IHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogU3RhdHVzUmVnaXN0cnk7XG5cbiAgICBwcml2YXRlIF9yZWdpc3RlcmVkU3RhdHVzZXM6IFN0YXR1c1tdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0YXR1cyBhbmQgcmVnaXN0ZXJzIGl0IGZvciB1c2UuIEl0IHdpbGwgYWxzbyBjaGVjayB0byBzZWVcbiAgICAgKiBpZiB0aGUgZGVmYXVsdCB0b2RvIGFuZCBkb25lIGFyZSByZWdpc3RlcmVkIGFuZCBpZiBub3QgaGFuZGxlIGl0IGludGVybmFsbHkuXG4gICAgICpcbiAgICAgKiBDb2RlIGluIHRoZSBwbHVnaW4gc2hvdWxkIHVzZSB7QGxpbmsgZ2V0SW5zdGFuY2V9IHRvIHVzZSBhbmQgbW9kaWZ5IHRoZSBnbG9iYWxcbiAgICAgKiBTdGF0dXNSZWdpc3RyeS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hZGREZWZhdWx0U3RhdHVzVHlwZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCB0aGUgcmVnaXN0ZXJlZCBzdGF0dXNlcyBtaW51cyB0aGUgZW1wdHkgc3RhdHVzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHR5cGUge1N0YXR1c1tdfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVnaXN0ZXJlZFN0YXR1c2VzKCk6IFN0YXR1c1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRTdGF0dXNlcy5maWx0ZXIoKHsgc3ltYm9sIH0pID0+IHN5bWJvbCAhPT0gU3RhdHVzLkVNUFRZLnN5bWJvbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRpYyBtZXRob2QgdGhhdCBjb250cm9scyB0aGUgYWNjZXNzIHRvIHRoZSBTdGF0dXNSZWdpc3RyeSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcmV0dXJuIHsqfSAge1N0YXR1c1JlZ2lzdHJ5fVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogU3RhdHVzUmVnaXN0cnkge1xuICAgICAgICBpZiAoIVN0YXR1c1JlZ2lzdHJ5Lmluc3RhbmNlKSB7XG4gICAgICAgICAgICBTdGF0dXNSZWdpc3RyeS5pbnN0YW5jZSA9IG5ldyBTdGF0dXNSZWdpc3RyeSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFN0YXR1c1JlZ2lzdHJ5Lmluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgU3RhdHVzIHRvIHRoZSByZWdpc3RyeSBpZiBub3QgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdGF0dXNDb25maWd1cmF0aW9uIHwgU3RhdHVzfSBzdGF0dXNcbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzUmVnaXN0cnlcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkKHN0YXR1czogU3RhdHVzQ29uZmlndXJhdGlvbiB8IFN0YXR1cyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaGFzU3ltYm9sKHN0YXR1cy5zeW1ib2wpKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzIGluc3RhbmNlb2YgU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZFN0YXR1c2VzLnB1c2goc3RhdHVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZFN0YXR1c2VzLnB1c2gobmV3IFN0YXR1cyhzdGF0dXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJlZ2lzdGVyZWQgc3RhdHVzIGJ5IHRoZSBzeW1ib2wgYmV0d2VlbiB0aGVcbiAgICAgKiBzcXVhcmUgYnJhY2VzIGluIHRoZSBtYXJrZG93biB0YXNrLlxuICAgICAqIFJldHVybnMgYW4gRU1QVFkgc3RhdHVzIGlmIHN5bWJvbCBpcyB1bmtub3duLlxuICAgICAqXG4gICAgICogQHNlZSBieVN5bWJvbE9yQ3JlYXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ltYm9sXG4gICAgICogQHJldHVybiB7Kn0gIHtTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c1JlZ2lzdHJ5XG4gICAgICovXG4gICAgcHVibGljIGJ5U3ltYm9sKHN5bWJvbDogc3RyaW5nKTogU3RhdHVzIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzU3ltYm9sKHN5bWJvbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFN5bWJvbChzeW1ib2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFN0YXR1cy5FTVBUWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIHN0YXR1cyBieSB0aGUgc3ltYm9sIGJldHdlZW4gdGhlXG4gICAgICogc3F1YXJlIGJyYWNlcyBpbiB0aGUgbWFya2Rvd24gdGFzay5cbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYSB1c2FibGUgbmV3IFN0YXR1cyB3aXRoIHRoaXMgZ2l2ZW4gc3ltYm9sIGlmIHN5bWJvbCBpcyB1bmtub3duLlxuICAgICAqIE5vdGU6IEFuIHVua25vd24gc3ltYm9sIGlzIG5vdCBhZGRlZCB0byB0aGUgcmVnaXN0cnkuXG4gICAgICpcbiAgICAgKiBAc2VlIGhhc1N5bWJvbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN5bWJvbFxuICAgICAqIEByZXR1cm4geyp9ICB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyBieVN5bWJvbE9yQ3JlYXRlKHN5bWJvbDogc3RyaW5nKTogU3RhdHVzIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzU3ltYm9sKHN5bWJvbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFN5bWJvbChzeW1ib2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFN0YXR1cy5jcmVhdGVVbmtub3duU3RhdHVzKHN5bWJvbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBzdGF0dXMgYnkgdGhlIG5hbWUgYXNzaWduZWQgYnkgdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVRvRmluZFxuICAgICAqIEByZXR1cm4geyp9ICB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyBieU5hbWUobmFtZVRvRmluZDogc3RyaW5nKTogU3RhdHVzIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlZ2lzdGVyZWRTdGF0dXNlcy5maWx0ZXIoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBuYW1lVG9GaW5kKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFN0YXR1c2VzLmZpbHRlcigoeyBuYW1lIH0pID0+IG5hbWUgPT09IG5hbWVUb0ZpbmQpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFN0YXR1cy5FTVBUWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGFycmF5IG9mIFN0YXR1cyB0eXBlcyB0byB0aGUgZGVmYXVsdCBzdGF0dXNlcy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldFRvRGVmYXVsdFN0YXR1c2VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyU3RhdHVzZXMoKTtcbiAgICAgICAgdGhpcy5hZGREZWZhdWx0U3RhdHVzVHlwZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGFycmF5IG9mIFN0YXR1cyB0eXBlcyB0byBiZSBlbXB0eS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJTdGF0dXNlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZFN0YXR1c2VzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG8gYWxsb3cgY3VzdG9tIHByb2dyZXNzaW9uIG9mIHRhc2sgc3RhdHVzIGVhY2ggc3RhdHVzIGtub3dzXG4gICAgICogd2hpY2ggc3RhdHVzIGNhbiBjb21lIGFmdGVyIGl0IGFzIGEgc3RhdGUgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyp9ICB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqIEBzZWUgZ2V0TmV4dFN0YXR1c09yQ3JlYXRlXG4gICAgICovXG4gICAgcHVibGljIGdldE5leHRTdGF0dXMoc3RhdHVzOiBTdGF0dXMpOiBTdGF0dXMge1xuICAgICAgICBpZiAoc3RhdHVzLm5leHRTdGF0dXNTeW1ib2wgIT09ICcnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U3RhdHVzID0gdGhpcy5ieVN5bWJvbChzdGF0dXMubmV4dFN0YXR1c1N5bWJvbCk7XG4gICAgICAgICAgICBpZiAobmV4dFN0YXR1cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0U3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdGF0dXMuRU1QVFk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBuZXh0IHN0YXR1cyBpZiBpdCBleGlzdHMsIGFuZCBpZiBub3QsIGNyZWF0ZSBhIG5ld1xuICAgICAqIFRPRE8gc3RhdHVzIHVzaW5nIHRoZSByZXF1ZXN0ZWQgbmV4dCBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsqfSAge1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzUmVnaXN0cnlcbiAgICAgKiBAc2VlIGdldE5leHRTdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmV4dFN0YXR1c09yQ3JlYXRlKHN0YXR1czogU3RhdHVzKTogU3RhdHVzIHtcbiAgICAgICAgY29uc3QgbmV4dFN0YXR1cyA9IHRoaXMuZ2V0TmV4dFN0YXR1cyhzdGF0dXMpO1xuICAgICAgICBpZiAobmV4dFN0YXR1cy50eXBlICE9PSBTdGF0dXNUeXBlLkVNUFRZKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dFN0YXR1cztcbiAgICAgICAgfVxuICAgICAgICAvLyBzdGF0dXMgaXMgY29uZmlndXJlZCB0byBhZHZhbmNlIHRvIGEgc3ltYm9sIHRoYXQgaXMgbm90IHJlZ2lzdGVyZWQuXG4gICAgICAgIC8vIFNvIHdlIGdvIGFoZWFkIGFuZCBjcmVhdGUgaXQgYW55d2F5IC0gd2UganVzdCBjYW5ub3QgZ2l2ZSBpdCBhIG1lYW5pbmdmdWwgbmFtZS5cbiAgICAgICAgcmV0dXJuIFN0YXR1cy5jcmVhdGVVbmtub3duU3RhdHVzKHN0YXR1cy5uZXh0U3RhdHVzU3ltYm9sKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGFueSBzdGF0dXNlcyBpbiB0aGUgZ2l2ZW4gbGlzdCB0aGF0IGFyZSBub3Qga25vd24gdG8gdGhpcyByZWdpc3RyeS5cbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbGwgdW5rbm93biBzdGF0dXMgdHlwZXMgdG8gdGhlIHNldHRpbmdzLFxuICAgICAqIHRvIHNhdmUgdXNlcnMgZnJvbSBoYXZpbmcgdG8gZG8gdGhhdCBtYW51YWxseS5cbiAgICAgKlxuICAgICAqIFN0YXR1c2VzIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSBmaXJzdCBmb3VuZCBpbiB0aGVcbiAgICAgKiBzdXBwbGllZCBsaXN0LlxuICAgICAqIEBwYXJhbSBhbGxTdGF0dXNlc1xuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kVW5rbm93blN0YXR1c2VzKGFsbFN0YXR1c2VzOiBTdGF0dXNbXSk6IFN0YXR1c1tdIHtcbiAgICAgICAgY29uc3QgdW5rbm93blN0YXR1c2VzID0gYWxsU3RhdHVzZXMuZmlsdGVyKChzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuaGFzU3ltYm9sKHMuc3ltYm9sKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXNlIGEgc2VwYXJhdGUgU3RhdHVzUmVnaXN0cnkgdG8ga2VlcCB0cmFjayBvZiBkdXBsaWNhdGVzLFxuICAgICAgICAvLyBiZWNhdXNlIFNldCBpcyBubyB1c2UgdG8gdXM6XG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI5NzU5NDgwL2hvdy10by1jdXN0b21pemUtb2JqZWN0LWVxdWFsaXR5LWZvci1qYXZhc2NyaXB0LXNldFxuICAgICAgICBjb25zdCBuZXdTdGF0dXNSZWdpc3RyeSA9IG5ldyBTdGF0dXNSZWdpc3RyeSgpO1xuXG4gICAgICAgIGNvbnN0IG5hbWVkVW5pcXVlU3RhdHVzZXM6IFN0YXR1c1tdID0gW107XG4gICAgICAgIHVua25vd25TdGF0dXNlcy5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHNlZW4gdGhpcyBzeW1ib2wgYWxyZWFkeTpcbiAgICAgICAgICAgIGlmIChuZXdTdGF0dXNSZWdpc3RyeS5oYXNTeW1ib2wocy5zeW1ib2wpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHbyBhaGVhZCBhbmQgY3JlYXRlIGEgc3VpdGFibHktbmFtZWQgY29weSxcbiAgICAgICAgICAgIC8vIGluY2x1ZGluZyB0aGUgc3ltYm9sIGluIHRoZSBuYW1lLlxuICAgICAgICAgICAgY29uc3QgbmV3U3RhdHVzID0gU3RhdHVzUmVnaXN0cnkuY29weVN0YXR1c1dpdGhOZXdOYW1lKHMsIGBVbmtub3duICgke3Muc3ltYm9sfSlgKTtcbiAgICAgICAgICAgIG5hbWVkVW5pcXVlU3RhdHVzZXMucHVzaChuZXdTdGF0dXMpO1xuICAgICAgICAgICAgLy8gQW5kIGFkZCBpdCB0byBvdXIgbG9jYWwgcmVnaXN0cnksIHRvIHByZXZlbnQgZHVwbGljYXRlcy5cbiAgICAgICAgICAgIG5ld1N0YXR1c1JlZ2lzdHJ5LmFkZChuZXdTdGF0dXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5hbWVkVW5pcXVlU3RhdHVzZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY29weVN0YXR1c1dpdGhOZXdOYW1lKHM6IFN0YXR1cywgbmV3TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHN0YXR1c0NvbmZpZ3VyYXRpb24gPSBuZXcgU3RhdHVzQ29uZmlndXJhdGlvbihcbiAgICAgICAgICAgIHMuc3ltYm9sLFxuICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIHMubmV4dFN0YXR1c1N5bWJvbCxcbiAgICAgICAgICAgIHMuYXZhaWxhYmxlQXNDb21tYW5kLFxuICAgICAgICAgICAgcy50eXBlLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhzdGF0dXNDb25maWd1cmF0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIHRoZSBTdGF0dXMgdHlwZXMgYnkgdGhlIHN5bWJvbCBhbmQgcmV0dXJucyB0aGUgZmlyc3Qgb25lIGZvdW5kLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ltYm9sVG9GaW5kXG4gICAgICogQHJldHVybiB7Kn0gIHtTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0YXR1c1JlZ2lzdHJ5XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRTeW1ib2woc3ltYm9sVG9GaW5kOiBzdHJpbmcpOiBTdGF0dXMge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFN0YXR1c2VzLmZpbHRlcigoeyBzeW1ib2wgfSkgPT4gc3ltYm9sID09PSBzeW1ib2xUb0ZpbmQpWzBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgYWxsIHRoZSBTdGF0dXMgdHlwZXMgYnkgdGhlIHN5bWJvbCBhbmQgcmV0dXJucyB0cnVlIGlmIGZvdW5kLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ltYm9sVG9GaW5kXG4gICAgICogQHJldHVybiB7Kn0gIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNSZWdpc3RyeVxuICAgICAqL1xuICAgIHByaXZhdGUgaGFzU3ltYm9sKHN5bWJvbFRvRmluZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3RhdHVzZXMuZmluZCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnN5bWJvbCA9PT0gc3ltYm9sVG9GaW5kO1xuICAgICAgICAgICAgfSkgIT09IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0aGUgcmVnaXN0cnkgYW5kIGFkZHMgdGhlIGRlZmF1bHQgc3RhdHVzIHR5cGVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzUmVnaXN0cnlcbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZERlZmF1bHRTdGF0dXNUeXBlcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFN0YXR1c2VzID0gW1N0YXR1cy5tYWtlVG9kbygpLCBTdGF0dXMubWFrZUluUHJvZ3Jlc3MoKSwgU3RhdHVzLm1ha2VEb25lKCksIFN0YXR1cy5tYWtlQ2FuY2VsbGVkKCldO1xuXG4gICAgICAgIGRlZmF1bHRTdGF0dXNlcy5mb3JFYWNoKChzdGF0dXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkKHN0YXR1cyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuXG5leHBvcnQgY2xhc3MgVXJnZW5jeSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZHVlQ29lZmZpY2llbnQgPSAxMi4wO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNjaGVkdWxlZENvZWZmaWNpZW50ID0gNS4wO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0YXJ0ZWRDb2VmZmljaWVudCA9IC0zLjA7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcHJpb3JpdHlDb2VmZmljaWVudCA9IDYuMDtcblxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IG1pbGxpU2Vjb25kc1BlckRheSA9IDEwMDAgKiA2MCAqIDYwICogMjQ7XG5cbiAgICBwdWJsaWMgc3RhdGljIGNhbGN1bGF0ZSh0YXNrOiBUYXNrKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHVyZ2VuY3kgPSAwLjA7XG5cbiAgICAgICAgaWYgKHRhc2suZHVlRGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gTWFwIGEgcmFuZ2Ugb2YgMjEgZGF5cyB0byB0aGUgdmFsdWUgMC4yIC0gMS4wXG4gICAgICAgICAgICBjb25zdCBkYXlzT3ZlcmR1ZSA9IE1hdGgucm91bmQod2luZG93Lm1vbWVudCgpLmRpZmYodGFzay5kdWVEYXRlKSAvIFVyZ2VuY3kubWlsbGlTZWNvbmRzUGVyRGF5KTtcblxuICAgICAgICAgICAgbGV0IGR1ZU11bHRpcGxpZXI6IG51bWJlcjtcbiAgICAgICAgICAgIGlmIChkYXlzT3ZlcmR1ZSA+PSA3LjApIHtcbiAgICAgICAgICAgICAgICBkdWVNdWx0aXBsaWVyID0gMS4wOyAvLyA8IDEgd2sgYWdvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRheXNPdmVyZHVlID49IC0xNC4wKSB7XG4gICAgICAgICAgICAgICAgLy8gRHVlIGJldHdlZW4gNyBkYXlzICgrNykgYWdvIGFuZCBpbiAxNCBkYXlzICgtMTQpXG4gICAgICAgICAgICAgICAgZHVlTXVsdGlwbGllciA9ICgoZGF5c092ZXJkdWUgKyAxNC4wKSAqIDAuOCkgLyAyMS4wICsgMC4yO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdWVNdWx0aXBsaWVyID0gMC4yOyAvLyA+IDIgd2tzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVyZ2VuY3kgKz0gZHVlTXVsdGlwbGllciAqIFVyZ2VuY3kuZHVlQ29lZmZpY2llbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzay5zY2hlZHVsZWREYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAod2luZG93Lm1vbWVudCgpLmlzU2FtZU9yQWZ0ZXIodGFzay5zY2hlZHVsZWREYXRlKSkge1xuICAgICAgICAgICAgICAgIHVyZ2VuY3kgKz0gMSAqIFVyZ2VuY3kuc2NoZWR1bGVkQ29lZmZpY2llbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzay5zdGFydERhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh3aW5kb3cubW9tZW50KCkuaXNCZWZvcmUodGFzay5zdGFydERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdXJnZW5jeSArPSAxICogVXJnZW5jeS5zdGFydGVkQ29lZmZpY2llbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHRhc2sucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIC8vIEhpZ2hcbiAgICAgICAgICAgIGNhc2UgJzEnOlxuICAgICAgICAgICAgICAgIHVyZ2VuY3kgKz0gMS4wICogVXJnZW5jeS5wcmlvcml0eUNvZWZmaWNpZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gTWVkaXVtXG4gICAgICAgICAgICBjYXNlICcyJzpcbiAgICAgICAgICAgICAgICB1cmdlbmN5ICs9IDAuNjUgKiBVcmdlbmN5LnByaW9yaXR5Q29lZmZpY2llbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBOb25lXG4gICAgICAgICAgICBjYXNlICczJzpcbiAgICAgICAgICAgICAgICB1cmdlbmN5ICs9IDAuMzI1ICogVXJnZW5jeS5wcmlvcml0eUNvZWZmaWNpZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVyZ2VuY3k7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IENvbXBvbmVudCwgTWFya2Rvd25SZW5kZXJlciB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQgKiBhcyB0YXNrTW9kdWxlIGZyb20gJy4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IExheW91dE9wdGlvbnMsIFRhc2tMYXlvdXRDb21wb25lbnQgfSBmcm9tICcuL1Rhc2tMYXlvdXQnO1xuaW1wb3J0IHsgVGFza0xheW91dCB9IGZyb20gJy4vVGFza0xheW91dCc7XG5pbXBvcnQgeyByZXBsYWNlVGFza1dpdGhUYXNrcyB9IGZyb20gJy4vRmlsZSc7XG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdzJztcblxuZXhwb3J0IHR5cGUgVGFza0xpbmVSZW5kZXJEZXRhaWxzID0ge1xuICAgIHBhcmVudFVsRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgLyoqIFRoZSBudGggaXRlbSBpbiB0aGlzIGxpc3QgKGluY2x1ZGluZyBub24tdGFza3MpLiAqL1xuICAgIGxpc3RJbmRleDogbnVtYmVyO1xuICAgIGxheW91dE9wdGlvbnM/OiBMYXlvdXRPcHRpb25zO1xuICAgIGlzRmlsZW5hbWVVbmlxdWU/OiBib29sZWFuO1xuICAgIHRhc2tMYXlvdXQ/OiBUYXNrTGF5b3V0O1xufTtcblxuZXhwb3J0IGNvbnN0IExheW91dENsYXNzZXM6IHsgW2MgaW4gVGFza0xheW91dENvbXBvbmVudF06IHN0cmluZyB9ID0ge1xuICAgIGRlc2NyaXB0aW9uOiAndGFzay1kZXNjcmlwdGlvbicsXG4gICAgcHJpb3JpdHk6ICd0YXNrLXByaW9yaXR5JyxcbiAgICBkdWVEYXRlOiAndGFzay1kdWUnLFxuICAgIHN0YXJ0RGF0ZTogJ3Rhc2stc3RhcnQnLFxuICAgIHNjaGVkdWxlZERhdGU6ICd0YXNrLXNjaGVkdWxlZCcsXG4gICAgZG9uZURhdGU6ICd0YXNrLWRvbmUnLFxuICAgIHJlY3VycmVuY2VSdWxlOiAndGFzay1yZWN1cnJpbmcnLFxuICAgIGJsb2NrTGluazogJycsXG59O1xuXG5jb25zdCBNQVhfREFZX1ZBTFVFX1JBTkdFID0gNztcbmNvbnN0IERBWV9WQUxVRV9PVkVSX1JBTkdFX1BPU1RGSVggPSAnZmFyJztcblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gdXNlZCB0byByZW5kZXIgYSBNYXJrZG93biB0YXNrIGxpbmUgaW50byBhbiBleGlzdGluZyBIVE1MIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFRleHRSZW5kZXJlciA9ICh0ZXh0OiBzdHJpbmcsIGVsZW1lbnQ6IEhUTUxTcGFuRWxlbWVudCwgcGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5hc3luYyBmdW5jdGlvbiBvYnNpZGlhbk1hcmtkb3duUmVuZGVyZXIodGV4dDogc3RyaW5nLCBlbGVtZW50OiBIVE1MU3BhbkVsZW1lbnQsIHBhdGg6IHN0cmluZykge1xuICAgIGF3YWl0IE1hcmtkb3duUmVuZGVyZXIucmVuZGVyTWFya2Rvd24odGV4dCwgZWxlbWVudCwgcGF0aCwgbnVsbCBhcyB1bmtub3duIGFzIENvbXBvbmVudCk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIGdpdmVuIFRhc2sgb2JqZWN0IGludG8gYW4gSFRNTCBMaXN0IEl0ZW0gKExJKSBlbGVtZW50LCB1c2luZyB0aGUgZ2l2ZW4gcmVuZGVyRGV0YWlsc1xuICogY29uZmlndXJhdGlvbiBhbmQgYSBzdXBwbGllZCBUZXh0UmVuZGVyZXIgKHR5cGljYWxseSB0aGUgT2JzaWRpYW4gTWFya2Rvd24gcmVuZGVyZXIsIGJ1dCBmb3IgdGVzdGluZ1xuICogcHVycG9zZXMgaXQgY2FuIGJlIGEgc2ltcGxlciBvbmUpLlxuICogVGhlIGVsZW1lbnQgaW5jbHVkZXMgdGhlIHRhc2sgYW5kIGl0cyB2YXJpb3VzIGNvbXBvbmVudHMgKGRlc2NyaXB0aW9uLCBwcmlvcml0eSwgYmxvY2sgbGluayBldGMpLCB0aGVcbiAqIGNoZWNrYm94IG9uIHRoZSBsZWZ0IHdpdGggaXRzIGV2ZW50IGhhbmRsaW5nIG9mIGNvbXBsZXRpbmcgdGhlIHRhc2ssIGFuZCB0aGUgYnV0dG9uIGZvciBlZGl0aW5nIHRoZSB0YXNrLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyVGFza0xpbmUoXG4gICAgdGFzazogVGFzayxcbiAgICByZW5kZXJEZXRhaWxzOiBUYXNrTGluZVJlbmRlckRldGFpbHMsXG4gICAgdGV4dFJlbmRlcmVyOiBUZXh0UmVuZGVyZXIgfCBudWxsID0gbnVsbCxcbik6IFByb21pc2U8SFRNTExJRWxlbWVudD4ge1xuICAgIGlmICghdGV4dFJlbmRlcmVyKSB0ZXh0UmVuZGVyZXIgPSBvYnNpZGlhbk1hcmtkb3duUmVuZGVyZXI7XG4gICAgY29uc3QgbGk6IEhUTUxMSUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIHJlbmRlckRldGFpbHMucGFyZW50VWxFbGVtZW50LmFwcGVuZENoaWxkKGxpKTtcblxuICAgIGxpLmNsYXNzTGlzdC5hZGQoJ3Rhc2stbGlzdC1pdGVtJywgJ3BsdWdpbi10YXNrcy1saXN0LWl0ZW0nKTtcblxuICAgIC8vIE1haW50ZW5hbmNlIG5vdGU6XG4gICAgLy8gIFdlIGRvbid0IHVzZSB0aGUgT2JzaWRpYW4gY29udmVuaWVuY2UgZnVuY3Rpb24gbGkuY3JlYXRlRWwoKSBoZXJlLCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgaXQgYXZhaWxhYmxlXG4gICAgLy8gIHdoZW4gcnVubmluZyB0ZXN0cywgYW5kIHdlIHdhbnQgdGhlIHRlc3RzIHRvIGJlIGFibGUgdG8gY3JlYXRlIHRoZSBmdWxsIGRpdiBhbmQgc3BhbiBzdHJ1Y3R1cmUsXG4gICAgLy8gIHNvIGhhZCB0byBjb252ZXJ0IGFsbCBvZiB0aGVzZSB0byB0aGUgZXF1aXZhbGVudCBidXQgbW9yZSBlbGFib3JhdGUgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgpIGFuZFxuICAgIC8vICBhcHBlbmRDaGlsZCgpIGNhbGxzLlxuICAgIGNvbnN0IHRleHRTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGxpLmFwcGVuZENoaWxkKHRleHRTcGFuKTtcbiAgICB0ZXh0U3Bhbi5jbGFzc0xpc3QuYWRkKCd0YXNrcy1saXN0LXRleHQnKTtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gYXdhaXQgdGFza1RvSHRtbCh0YXNrLCByZW5kZXJEZXRhaWxzLCB0ZXh0U3BhbiwgdGV4dFJlbmRlcmVyKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSBsaS5kYXRhc2V0W2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG5cbiAgICAvLyBOT1RFOiB0aGlzIGFyZWEgaXMgbWVudGlvbmVkIGluIGBDT05UUklCVVRJTkcubWRgIHVuZGVyIFwiSG93IGRvZXMgVGFza3MgaGFuZGxlIHN0YXR1cyBjaGFuZ2VzXCIuIFdoZW5cbiAgICAvLyBtb3ZpbmcgdGhlIGNvZGUsIHJlbWVtYmVyIHRvIHVwZGF0ZSB0aGF0IHJlZmVyZW5jZSB0b28uXG4gICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGxpLmFwcGVuZENoaWxkKGNoZWNrYm94KTtcbiAgICBjaGVja2JveC5jbGFzc0xpc3QuYWRkKCd0YXNrLWxpc3QtaXRlbS1jaGVja2JveCcpO1xuICAgIGNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgIGlmICh0YXNrLnN0YXR1cy5zeW1ib2wgIT09ICcgJykge1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgbGkuY2xhc3NMaXN0LmFkZCgnaXMtY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIGNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIEl0IGlzIHJlcXVpcmVkIHRvIHN0b3AgcHJvcGFnYXRpb24gc28gdGhhdCBvYnNpZGlhbiB3b24ndCB3cml0ZSB0aGUgZmlsZSB3aXRoIHRoZVxuICAgICAgICAvLyBjaGVja2JveCAodW4pY2hlY2tlZC4gT2JzaWRpYW4gd291bGQgd3JpdGUgYWZ0ZXIgdXMgYW5kIG92ZXJ3cml0ZSBvdXIgY2hhbmdlLlxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAvLyBTaG91bGQgYmUgcmUtcmVuZGVyZWQgYXMgZW5hYmxlZCBhZnRlciB1cGRhdGUgaW4gZmlsZS5cbiAgICAgICAgY2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCB0b2dnbGVkVGFza3MgPSB0YXNrLnRvZ2dsZSgpO1xuICAgICAgICByZXBsYWNlVGFza1dpdGhUYXNrcyh7XG4gICAgICAgICAgICBvcmlnaW5hbFRhc2s6IHRhc2ssXG4gICAgICAgICAgICBuZXdUYXNrczogdG9nZ2xlZFRhc2tzLFxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGxpLnByZXBlbmQoY2hlY2tib3gpO1xuXG4gICAgLy8gU2V0IHRoZXNlIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdG9jayBvYnNpZGlhbiBsaXN0czpcbiAgICBsaS5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFzaycsIHRhc2suc3RhdHVzLnN5bWJvbC50cmltKCkpOyAvLyBUcmltIHRvIGVuc3VyZSBlbXB0eSBhdHRyaWJ1dGUgZm9yIHNwYWNlLiBTYW1lIHdheSBhcyBvYnNpZGlhbi5cbiAgICBsaS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbGluZScsIHJlbmRlckRldGFpbHMubGlzdEluZGV4LnRvU3RyaW5nKCkpO1xuICAgIGNoZWNrYm94LnNldEF0dHJpYnV0ZSgnZGF0YS1saW5lJywgcmVuZGVyRGV0YWlscy5saXN0SW5kZXgudG9TdHJpbmcoKSk7XG5cbiAgICBpZiAocmVuZGVyRGV0YWlscy5sYXlvdXRPcHRpb25zPy5zaG9ydE1vZGUpIHtcbiAgICAgICAgYWRkVG9vbHRpcCh7IHRhc2ssIGVsZW1lbnQ6IHRleHRTcGFuLCBpc0ZpbGVuYW1lVW5pcXVlOiByZW5kZXJEZXRhaWxzLmlzRmlsZW5hbWVVbmlxdWUgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0YXNrVG9IdG1sKFxuICAgIHRhc2s6IFRhc2ssXG4gICAgcmVuZGVyRGV0YWlsczogVGFza0xpbmVSZW5kZXJEZXRhaWxzLFxuICAgIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHRleHRSZW5kZXJlcjogVGV4dFJlbmRlcmVyLFxuKTogUHJvbWlzZTxBdHRyaWJ1dGVzRGljdGlvbmFyeT4ge1xuICAgIGxldCBhbGxBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVzRGljdGlvbmFyeSA9IHt9O1xuICAgIGNvbnN0IHRhc2tMYXlvdXQgPSByZW5kZXJEZXRhaWxzLnRhc2tMYXlvdXQgPz8gbmV3IFRhc2tMYXlvdXQocmVuZGVyRGV0YWlscy5sYXlvdXRPcHRpb25zKTtcbiAgICAvLyBSZW5kZXIgYW5kIGJ1aWxkIGNsYXNzZXMgZm9yIGFsbCB0aGUgdGFzaydzIHZpc2libGUgY29tcG9uZW50c1xuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRhc2tMYXlvdXQubGF5b3V0Q29tcG9uZW50cykge1xuICAgICAgICBsZXQgY29tcG9uZW50U3RyaW5nID0gdGFzay5jb21wb25lbnRUb1N0cmluZyh0YXNrTGF5b3V0LCBjb21wb25lbnQpO1xuICAgICAgICBpZiAoY29tcG9uZW50U3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50ID09PSAnZGVzY3JpcHRpb24nKSBjb21wb25lbnRTdHJpbmcgPSByZW1vdmVHbG9iYWxGaWx0ZXJJZk5lZWRlZChjb21wb25lbnRTdHJpbmcpO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSB0ZXh0IHNwYW4gdGhhdCB3aWxsIGhvbGQgdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgICAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICAgICAgICBpZiAoc3Bhbikge1xuICAgICAgICAgICAgICAgIC8vIEluc2lkZSB0aGF0IHRleHQgc3Bhbiwgd2UgYXJlIGNyZWF0aW5nIGFub3RoZXIgaW50ZXJuYWwgc3BhbiwgdGhhdCB3aWxsIGhvbGQgdGhlIHRleHQgaXRzZWxmLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IHNlZW0gcmVkdW5kYW50LCBhbmQgYnkgZGVmYXVsdCBpdCBpbmRlZWQgZG9lcyBub3RoaW5nLCBidXQgd2UgZG8gaXQgdG8gYWxsb3cgdGhlIENTU1xuICAgICAgICAgICAgICAgIC8vIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgY29udGFpbmVyIG9mIHRoZSB0ZXh0IGFuZCB0aGUgdGV4dCBpdHNlbGYsIHNvIGl0IHdpbGwgYmUgcG9zc2libGVcbiAgICAgICAgICAgICAgICAvLyB0byBkbyB0aGluZ3MgbGlrZSBzdXJyb3VkaW5nIG9ubHkgdGhlIHRleHQgKHJhdGhlciB0aGFuIGl0cyB3aG9sZSBwbGFjZWhvbGRlcikgd2l0aCBhIGhpZ2hsaWdodFxuICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgICAgICBzcGFuLmFwcGVuZENoaWxkKGludGVybmFsU3Bhbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVuZGVyQ29tcG9uZW50VGV4dChpbnRlcm5hbFNwYW4sIGNvbXBvbmVudFN0cmluZywgY29tcG9uZW50LCB0YXNrLCB0ZXh0UmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtnZW5lcmljQ2xhc3NlcywgZGF0YUF0dHJpYnV0ZXNdID0gZ2V0Q29tcG9uZW50Q2xhc3Nlc0FuZERhdGEoY29tcG9uZW50LCB0YXNrKTtcbiAgICAgICAgICAgICAgICBhZGRJbnRlcm5hbENsYXNzZXMoY29tcG9uZW50LCBpbnRlcm5hbFNwYW4pO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZ2VuZXJpYyBjbGFzc2VzIHRoYXQgYXBwbHkgdG8gd2hhdCB0aGlzIGNvbXBvbmVudCBpcyAocHJpb3JpdHksIGR1ZSBkYXRlIGV0YylcbiAgICAgICAgICAgICAgICBzcGFuLmNsYXNzTGlzdC5hZGQoLi4uZ2VuZXJpY0NsYXNzZXMpO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlcyB0byB0aGUgY29tcG9uZW50ICgncHJpb3JpdHktbWVkaXVtJywgJ2R1ZS1wYXN0LTFkJyBldGMpXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YUF0dHJpYnV0ZXMpIHNwYW4uZGF0YXNldFtrZXldID0gZGF0YUF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgICAgICAgICBhbGxBdHRyaWJ1dGVzID0geyAuLi5hbGxBdHRyaWJ1dGVzLCAuLi5kYXRhQXR0cmlidXRlcyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm93IGJ1aWxkIGNsYXNzZXMgZm9yIHRoZSBoaWRkZW4gdGFzayBjb21wb25lbnRzIHdpdGhvdXQgcmVuZGVyaW5nIHRoZW1cbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0YXNrTGF5b3V0LmhpZGRlbkNvbXBvbmVudHMpIHtcbiAgICAgICAgY29uc3QgW18sIGRhdGFBdHRyaWJ1dGVzXSA9IGdldENvbXBvbmVudENsYXNzZXNBbmREYXRhKGNvbXBvbmVudCwgdGFzayk7XG4gICAgICAgIGFsbEF0dHJpYnV0ZXMgPSB7IC4uLmFsbEF0dHJpYnV0ZXMsIC4uLmRhdGFBdHRyaWJ1dGVzIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbEF0dHJpYnV0ZXM7XG59XG5cbi8qXG4gKiBSZW5kZXJzIHRoZSBnaXZlbiBjb21wb25lbnQgaW50byB0aGUgZ2l2ZW4gSFRNTCBzcGFuIGVsZW1lbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbmRlckNvbXBvbmVudFRleHQoXG4gICAgc3BhbjogSFRNTFNwYW5FbGVtZW50LFxuICAgIGNvbXBvbmVudFN0cmluZzogc3RyaW5nLFxuICAgIGNvbXBvbmVudDogVGFza0xheW91dENvbXBvbmVudCxcbiAgICB0YXNrOiBUYXNrLFxuICAgIHRleHRSZW5kZXJlcjogVGV4dFJlbmRlcmVyLFxuKSB7XG4gICAgaWYgKGNvbXBvbmVudCA9PT0gJ2Rlc2NyaXB0aW9uJykge1xuICAgICAgICBhd2FpdCB0ZXh0UmVuZGVyZXIoY29tcG9uZW50U3RyaW5nLCBzcGFuLCB0YXNrLnBhdGgpO1xuXG4gICAgICAgIC8vIElmIHRoZSB0YXNrIGlzIGEgYmxvY2sgcXVvdGUsIHRoZSBibG9jayBxdW90ZSB3cmFwcyB0aGUgcC10YWcgdGhhdCBjb250YWlucyB0aGUgY29udGVudC5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHVud3JhcCB0aGUgcC10YWcgKmluc2lkZSogdGhlIHN1cnJvdW5kaW5nIGJsb2NrIHF1b3RlLlxuICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHVud3JhcCB0aGUgcC10YWcgYXMgYSBkaXJlY3QgZGVzY2VuZGFudCBvZiB0aGUgc3Bhbi5cbiAgICAgICAgY29uc3QgYmxvY2tRdW90ZSA9IHNwYW4ucXVlcnlTZWxlY3RvcignYmxvY2txdW90ZScpO1xuICAgICAgICBjb25zdCBkaXJlY3RQYXJlbnRPZlBUYWcgPSBibG9ja1F1b3RlID8/IHNwYW47XG5cbiAgICAgICAgLy8gVW53cmFwIHRoZSBwLXRhZyB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSBNYXJrZG93blJlbmRlcmVyOlxuICAgICAgICBjb25zdCBwRWxlbWVudCA9IGRpcmVjdFBhcmVudE9mUFRhZy5xdWVyeVNlbGVjdG9yKCdwJyk7XG4gICAgICAgIGlmIChwRWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd2hpbGUgKHBFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICBkaXJlY3RQYXJlbnRPZlBUYWcuaW5zZXJ0QmVmb3JlKHBFbGVtZW50LmZpcnN0Q2hpbGQsIHBFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGFuIGVtcHR5IHRyYWlsaW5nIHAtdGFnIHRoYXQgdGhlIE1hcmtkb3duUmVuZGVyZXIgYXBwZW5kcyB3aGVuIHRoZXJlIGlzIGEgYmxvY2sgbGluazpcbiAgICAgICAgc3Bhbi5xdWVyeVNlbGVjdG9yQWxsKCdwJykuZm9yRWFjaCgocEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmICghcEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgcEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgZm9vdG5vdGUgdGhhdCB0aGUgTWFya2Rvd25SZW5kZXJlciBhcHBlbmRzIHdoZW4gdGhlcmUgaXMgYSBmb290bm90ZSBpbiB0aGUgdGFzazpcbiAgICAgICAgc3Bhbi5xdWVyeVNlbGVjdG9yQWxsKCcuZm9vdG5vdGVzJykuZm9yRWFjaCgoZm9vdG5vdGVFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBmb290bm90ZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNwYW4uaW5uZXJIVE1MID0gY29tcG9uZW50U3RyaW5nO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgQXR0cmlidXRlc0RpY3Rpb25hcnkgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0d28gbGlzdHMgLS0gZ2VuZXJpY0NsYXNzZXMgYW5kIGRhdGFBdHRyaWJ1dGVzIC0tIHRoYXQgZGVzY3JpYmUgdGhlXG4gKiBnaXZlbiBjb21wb25lbnQuXG4gKiBUaGUgZ2VuZXJpY0NsYXNzZXMgZGVzY3JpYmUgd2hhdCB0aGUgY29tcG9uZW50IGlzLCBlLmcuIGEgZHVlIGRhdGUgb3IgYSBwcmlvcml0eSwgYW5kIGFyZSBvbmUgb2YgdGhlXG4gKiBvcHRpb25zIGluIExheW91dENsYXNzZXMuXG4gKiBUaGUgc3BlY2lmaWNDbGFzc2VzIGRlc2NyaWJlIHRoZSBjb250ZW50IG9mIHRoZSBjb21wb25lbnQgdHJhbnNsYXRlZCB0byBhIENTUyBjbGFzcyxcbiAqIGUuZy4gdGFzay1wcmlvcml0eS1tZWRpdW0sIHRhc2stZHVlLXBhc3QtMWQgZXRjLlxuICogVE9ETyBVUERBVEVcbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50Q2xhc3Nlc0FuZERhdGEoY29tcG9uZW50OiBUYXNrTGF5b3V0Q29tcG9uZW50LCB0YXNrOiBUYXNrKTogW3N0cmluZ1tdLCBBdHRyaWJ1dGVzRGljdGlvbmFyeV0ge1xuICAgIGNvbnN0IGdlbmVyaWNDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGRhdGFBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVzRGljdGlvbmFyeSA9IHt9O1xuICAgIGNvbnN0IHNldERhdGVBdHRyaWJ1dGUgPSAoZGF0ZTogTW9tZW50LCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgZGF0ZVZhbHVlID0gZGF0ZVRvQXR0cmlidXRlKGRhdGUpO1xuICAgICAgICBpZiAoZGF0ZVZhbHVlKSBkYXRhQXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IGRhdGVWYWx1ZTtcbiAgICB9O1xuICAgIHN3aXRjaCAoY29tcG9uZW50KSB7XG4gICAgICAgIGNhc2UgJ2Rlc2NyaXB0aW9uJzpcbiAgICAgICAgICAgIGdlbmVyaWNDbGFzc2VzLnB1c2goTGF5b3V0Q2xhc3Nlcy5kZXNjcmlwdGlvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncHJpb3JpdHknOiB7XG4gICAgICAgICAgICBsZXQgcHJpb3JpdHlWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGFzay5wcmlvcml0eSA9PT0gdGFza01vZHVsZS5Qcmlvcml0eS5IaWdoKSBwcmlvcml0eVZhbHVlID0gJ2hpZ2gnO1xuICAgICAgICAgICAgZWxzZSBpZiAodGFzay5wcmlvcml0eSA9PT0gdGFza01vZHVsZS5Qcmlvcml0eS5NZWRpdW0pIHByaW9yaXR5VmFsdWUgPSAnbWVkaXVtJztcbiAgICAgICAgICAgIGVsc2UgaWYgKHRhc2sucHJpb3JpdHkgPT09IHRhc2tNb2R1bGUuUHJpb3JpdHkuTG93KSBwcmlvcml0eVZhbHVlID0gJ2xvdyc7XG4gICAgICAgICAgICBlbHNlIHByaW9yaXR5VmFsdWUgPSAnbm9uZSc7XG4gICAgICAgICAgICBkYXRhQXR0cmlidXRlc1sndGFza1ByaW9yaXR5J10gPSBwcmlvcml0eVZhbHVlO1xuICAgICAgICAgICAgZ2VuZXJpY0NsYXNzZXMucHVzaChMYXlvdXRDbGFzc2VzLnByaW9yaXR5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2R1ZURhdGUnOiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGFzay5kdWVEYXRlO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBnZW5lcmljQ2xhc3Nlcy5wdXNoKExheW91dENsYXNzZXMuZHVlRGF0ZSk7XG4gICAgICAgICAgICAgICAgc2V0RGF0ZUF0dHJpYnV0ZShkYXRlLCAndGFza0R1ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhcnREYXRlJzoge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRhc2suc3RhcnREYXRlO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBnZW5lcmljQ2xhc3Nlcy5wdXNoKExheW91dENsYXNzZXMuc3RhcnREYXRlKTtcbiAgICAgICAgICAgICAgICBzZXREYXRlQXR0cmlidXRlKGRhdGUsICd0YXNrU3RhcnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NjaGVkdWxlZERhdGUnOiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGFzay5zY2hlZHVsZWREYXRlO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBnZW5lcmljQ2xhc3Nlcy5wdXNoKExheW91dENsYXNzZXMuc2NoZWR1bGVkRGF0ZSk7XG4gICAgICAgICAgICAgICAgc2V0RGF0ZUF0dHJpYnV0ZShkYXRlLCAndGFza1NjaGVkdWxlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9uZURhdGUnOiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGFzay5kb25lRGF0ZTtcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJpY0NsYXNzZXMucHVzaChMYXlvdXRDbGFzc2VzLmRvbmVEYXRlKTtcbiAgICAgICAgICAgICAgICBzZXREYXRlQXR0cmlidXRlKGRhdGUsICd0YXNrRG9uZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncmVjdXJyZW5jZVJ1bGUnOiB7XG4gICAgICAgICAgICBnZW5lcmljQ2xhc3Nlcy5wdXNoKExheW91dENsYXNzZXMucmVjdXJyZW5jZVJ1bGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtnZW5lcmljQ2xhc3NlcywgZGF0YUF0dHJpYnV0ZXNdO1xufVxuXG4vKlxuICogQWRkcyBpbnRlcm5hbCBjbGFzc2VzIGZvciB2YXJpb3VzIGNvbXBvbmVudHMgKHJpZ2h0IG5vdyBqdXN0IHRhZ3MgYWN0dWFsbHkpLCBtZWFuaW5nIHRoYXQgd2UgbW9kaWZ5IHRoZSBleGlzdGluZ1xuICogcmVuZGVyZWQgZWxlbWVudCB0byBhZGQgY2xhc3NlcyBpbnNpZGUgaXQuXG4gKiBJbiB0aGUgY2FzZSBvZiB0YWdzLCBPYnNpZGlhbiByZW5kZXJzIGEgTWFya2Rvd24gZGVzY3JpcHRpb24gd2l0aCA8YSBjbGFzcz1cInRhZ1wiPiBlbGVtZW50cyBmb3IgdGFncy4gV2Ugd2FudCB0b1xuICogZW5hYmxlIHVzZXJzIHRvIHN0eWxlIHRoZXNlLCBzbyB3ZSBtb2RpZnkgdGhlIHJlbmRlcmVkIE1hcmtkb3duIGJ5IGFkZGluZyB0aGUgc3BlY2lmaWMgdGFnIGNsYXNzZXMgZm9yIHRoZXNlIDxhPlxuICogZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGFkZEludGVybmFsQ2xhc3Nlcyhjb21wb25lbnQ6IFRhc2tMYXlvdXRDb21wb25lbnQsIHJlbmRlcmVkQ29tcG9uZW50OiBIVE1MU3BhbkVsZW1lbnQpIHtcbiAgICBpZiAoY29tcG9uZW50ID09PSAnZGVzY3JpcHRpb24nKSB7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSByZW5kZXJlZENvbXBvbmVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWcnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdOYW1lID0gdGFnc1tpXS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIGlmICh0YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gdGFnVG9BdHRyaWJ1dGVWYWx1ZSh0YWdOYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGFnc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lKSBlbGVtZW50LmRhdGFzZXQudGFnTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBUcmFuc2xhdGUgYSByZWxhdGl2ZSBkYXRlIHRvIGEgQ1NTIGNsYXNzOiAndG9kYXknLCAnZnV0dXJlLTFkJyAoZm9yIHRvbW9ycm93KSwgJ3Bhc3QtMWQnIChmb3IgeWVzdGVyZGF5KVxuICogZXRjLlxuICogQSBjdXRvZmYgKGluIGRheXMpIGlzIGRlZmluZWQgaW4gTUFYX0RBWV9WQUxVRV9SQU5HRSwgZnJvbSBiZXlvbmQgdGhhdCBhIGdlbmVyaWMgJ2ZhcicgcG9zdGZpeCB3aWxsIGJlIGFkZGVkLlxuICogKHRoZSBjdXRvZmYgZXhpc3RzIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBmbG9vZCB0aGUgRE9NIHdpdGggcG90ZW50aWFsbHkgaHVuZHJlZHMgb2YgdW5pcXVlIGNsYXNzZXMuKVxuICovXG5mdW5jdGlvbiBkYXRlVG9BdHRyaWJ1dGUoZGF0ZTogTW9tZW50KSB7XG4gICAgY29uc3QgdG9kYXkgPSB3aW5kb3cubW9tZW50KCkuc3RhcnRPZignZGF5Jyk7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIGNvbnN0IGRpZmZEYXlzID0gdG9kYXkuZGlmZihkYXRlLCAnZGF5cycpO1xuICAgIGlmIChpc05hTihkaWZmRGF5cykpIHJldHVybiBudWxsO1xuICAgIGlmIChkaWZmRGF5cyA9PT0gMCkgcmV0dXJuICd0b2RheSc7XG4gICAgZWxzZSBpZiAoZGlmZkRheXMgPiAwKSByZXN1bHQgKz0gJ3Bhc3QtJztcbiAgICBlbHNlIGlmIChkaWZmRGF5cyA8IDApIHJlc3VsdCArPSAnZnV0dXJlLSc7XG4gICAgaWYgKE1hdGguYWJzKGRpZmZEYXlzKSA8PSBNQVhfREFZX1ZBTFVFX1JBTkdFKSB7XG4gICAgICAgIHJlc3VsdCArPSBNYXRoLmFicyhkaWZmRGF5cykudG9TdHJpbmcoKSArICdkJztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gREFZX1ZBTFVFX09WRVJfUkFOR0VfUE9TVEZJWDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIFNhbml0aXplIHRhZyBuYW1lcyBzbyB0aGV5IHdpbGwgYmUgdmFsaWQgYXR0cmlidXRlIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIEhUTUwgc3BlYzpcbiAqIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3BhcnNpbmcuaHRtbCNhdHRyaWJ1dGUtdmFsdWUtKGRvdWJsZS1xdW90ZWQpLXN0YXRlXG4gKi9cbmZ1bmN0aW9uIHRhZ1RvQXR0cmlidXRlVmFsdWUodGFnOiBzdHJpbmcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuICAgIGNvbnN0IGlsbGVnYWxDaGFycyA9IC9bXCImXFx4MDBcXHJcXG5dL2c7XG4gICAgbGV0IHNhbml0aXplZFRhZyA9IHRhZy5yZXBsYWNlKGlsbGVnYWxDaGFycywgJy0nKTtcbiAgICAvLyBBbmQgaWYgYWZ0ZXIgc2FuaXRhemF0aW9uIHRoZSBuYW1lIHN0YXJ0cyB3aXRoIGRhc2hlcyBvciB1bmRlcnNjb3JlcywgcmVtb3ZlIHRoZW0uXG4gICAgc2FuaXRpemVkVGFnID0gc2FuaXRpemVkVGFnLnJlcGxhY2UoL15bLV9dKy8sICcnKTtcbiAgICBpZiAoc2FuaXRpemVkVGFnLmxlbmd0aCA+IDApIHJldHVybiBzYW5pdGl6ZWRUYWc7XG4gICAgZWxzZSByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWRkVG9vbHRpcCh7XG4gICAgdGFzayxcbiAgICBlbGVtZW50LFxuICAgIGlzRmlsZW5hbWVVbmlxdWUsXG59OiB7XG4gICAgdGFzazogVGFzaztcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICBpc0ZpbGVuYW1lVW5pcXVlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xufSk6IHZvaWQge1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsICgpID0+IHtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IGVsZW1lbnQuY3JlYXRlRGl2KCk7XG4gICAgICAgIHRvb2x0aXAuYWRkQ2xhc3NlcyhbJ3Rvb2x0aXAnLCAnbW9kLXJpZ2h0J10pO1xuXG4gICAgICAgIGlmICh0YXNrLnJlY3VycmVuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY3VycmVuY2VEaXYgPSB0b29sdGlwLmNyZWF0ZURpdigpO1xuICAgICAgICAgICAgcmVjdXJyZW5jZURpdi5zZXRUZXh0KGAke3Rhc2tNb2R1bGUucmVjdXJyZW5jZVN5bWJvbH0gJHt0YXNrLnJlY3VycmVuY2UudG9UZXh0KCl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzay5zdGFydERhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZURpdiA9IHRvb2x0aXAuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICBzdGFydERhdGVEaXYuc2V0VGV4dChcbiAgICAgICAgICAgICAgICB0b1Rvb2x0aXBEYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWVyOiB0YXNrTW9kdWxlLnN0YXJ0RGF0ZVN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZTogdGFzay5zdGFydERhdGUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhc2suc2NoZWR1bGVkRGF0ZSkge1xuICAgICAgICAgICAgY29uc3Qgc2NoZWR1bGVkRGF0ZURpdiA9IHRvb2x0aXAuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlRGl2LnNldFRleHQoXG4gICAgICAgICAgICAgICAgdG9Ub29sdGlwRGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25pZmllcjogdGFza01vZHVsZS5zY2hlZHVsZWREYXRlU3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICBkYXRlOiB0YXNrLnNjaGVkdWxlZERhdGUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhc2suZHVlRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgZHVlRGF0ZURpdiA9IHRvb2x0aXAuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICBkdWVEYXRlRGl2LnNldFRleHQoXG4gICAgICAgICAgICAgICAgdG9Ub29sdGlwRGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25pZmllcjogdGFza01vZHVsZS5kdWVEYXRlU3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICBkYXRlOiB0YXNrLmR1ZURhdGUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhc2suZG9uZURhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRvbmVEYXRlRGl2ID0gdG9vbHRpcC5jcmVhdGVEaXYoKTtcbiAgICAgICAgICAgIGRvbmVEYXRlRGl2LnNldFRleHQoXG4gICAgICAgICAgICAgICAgdG9Ub29sdGlwRGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25pZmllcjogdGFza01vZHVsZS5kb25lRGF0ZVN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZTogdGFzay5kb25lRGF0ZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5rVGV4dCA9IHRhc2suZ2V0TGlua1RleHQoeyBpc0ZpbGVuYW1lVW5pcXVlIH0pO1xuICAgICAgICBpZiAobGlua1RleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhY2tsaW5rRGl2ID0gdG9vbHRpcC5jcmVhdGVEaXYoKTtcbiAgICAgICAgICAgIGJhY2tsaW5rRGl2LnNldFRleHQoYFx1RDgzRFx1REQxNyAke2xpbmtUZXh0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAgICAgdG9vbHRpcC5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvVG9vbHRpcERhdGUoeyBzaWduaWZpZXIsIGRhdGUgfTogeyBzaWduaWZpZXI6IHN0cmluZzsgZGF0ZTogTW9tZW50IH0pOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtzaWduaWZpZXJ9ICR7ZGF0ZS5mb3JtYXQodGFza01vZHVsZS5UYXNrUmVndWxhckV4cHJlc3Npb25zLmRhdGVGb3JtYXQpfSAoJHtkYXRlLmZyb20oXG4gICAgICAgIHdpbmRvdy5tb21lbnQoKS5zdGFydE9mKCdkYXknKSxcbiAgICApfSlgO1xufVxuXG5mdW5jdGlvbiByZW1vdmVHbG9iYWxGaWx0ZXJJZk5lZWRlZChkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBnbG9iYWxGaWx0ZXIsIHJlbW92ZUdsb2JhbEZpbHRlciB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICBpZiAocmVtb3ZlR2xvYmFsRmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbi5yZXBsYWNlKGdsb2JhbEZpbHRlciwgJycpLnRyaW0oKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xufVxuIiwgImltcG9ydCB7IE1ldGFkYXRhQ2FjaGUsIFRGaWxlLCBWYXVsdCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgTGlzdEl0ZW1DYWNoZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0NvbmZpZy9TZXR0aW5ncyc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuXG5sZXQgbWV0YWRhdGFDYWNoZTogTWV0YWRhdGFDYWNoZSB8IHVuZGVmaW5lZDtcbmxldCB2YXVsdDogVmF1bHQgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBpbml0aWFsaXplRmlsZSA9ICh7XG4gICAgbWV0YWRhdGFDYWNoZTogbmV3TWV0YWRhdGFDYWNoZSxcbiAgICB2YXVsdDogbmV3VmF1bHQsXG59OiB7XG4gICAgbWV0YWRhdGFDYWNoZTogTWV0YWRhdGFDYWNoZTtcbiAgICB2YXVsdDogVmF1bHQ7XG59KSA9PiB7XG4gICAgbWV0YWRhdGFDYWNoZSA9IG5ld01ldGFkYXRhQ2FjaGU7XG4gICAgdmF1bHQgPSBuZXdWYXVsdDtcbn07XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIG9yaWdpbmFsIHRhc2sgd2l0aCBvbmUgb3IgbW9yZSBuZXcgdGFza3MuXG4gKlxuICogSWYgeW91IHBhc3MgbW9yZSB0aGFuIG9uZSByZXBsYWNlbWVudCB0YXNrLCBhbGwgc3Vic2VxdWVudCB0YXNrcyBpbiB0aGUgc2FtZVxuICogc2VjdGlvbiBtdXN0IGJlIHJlLXJlbmRlcmVkLCBhcyB0aGVpciBzZWN0aW9uIGluZGV4ZXMgY2hhbmdlLiBBc3N1bWluZyB0aGF0XG4gKiB0aGlzIGlzIGRvbmUgZmFzdGVyIHRoYW4gdXNlciBpbnRlcmFjdGlvbiBpbiBwcmFjdGljZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGxhY2VUYXNrV2l0aFRhc2tzID0gYXN5bmMgKHtcbiAgICBvcmlnaW5hbFRhc2ssXG4gICAgbmV3VGFza3MsXG59OiB7XG4gICAgb3JpZ2luYWxUYXNrOiBUYXNrO1xuICAgIG5ld1Rhc2tzOiBUYXNrIHwgVGFza1tdO1xufSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICh2YXVsdCA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdUYXNrczogY2Fubm90IHVzZSBGaWxlIGJlZm9yZSBpbml0aWFsaXppbmcgaXQuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobmV3VGFza3MpKSB7XG4gICAgICAgIG5ld1Rhc2tzID0gW25ld1Rhc2tzXTtcbiAgICB9XG5cbiAgICB0cnlSZXBldGl0aXZlKHtcbiAgICAgICAgb3JpZ2luYWxUYXNrLFxuICAgICAgICBuZXdUYXNrcyxcbiAgICAgICAgdmF1bHQsXG4gICAgICAgIG1ldGFkYXRhQ2FjaGUsXG4gICAgICAgIHByZXZpb3VzVHJpZXM6IDAsXG4gICAgfSk7XG59O1xuXG4vKipcbiAqIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIHJlLXRyeSB3aGVuIHRoZSByZXR1cm5lZCBmaWxlIGNhY2hlIGlzIGB1bmRlZmluZWRgLlxuICogUmV0cnlpbmcgYWZ0ZXIgYSB3aGlsZSBtYXkgcmV0dXJuIGEgdmFsaWQgZmlsZSBjYWNoZS5cbiAqIFJlcG9ydGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbi10YXNrcy1ncm91cC9vYnNpZGlhbi10YXNrcy9pc3N1ZXMvODdcbiAqL1xuY29uc3QgdHJ5UmVwZXRpdGl2ZSA9IGFzeW5jICh7XG4gICAgb3JpZ2luYWxUYXNrLFxuICAgIG5ld1Rhc2tzLFxuICAgIHZhdWx0LFxuICAgIG1ldGFkYXRhQ2FjaGUsXG4gICAgcHJldmlvdXNUcmllcyxcbn06IHtcbiAgICBvcmlnaW5hbFRhc2s6IFRhc2s7XG4gICAgbmV3VGFza3M6IFRhc2tbXTtcbiAgICB2YXVsdDogVmF1bHQ7XG4gICAgbWV0YWRhdGFDYWNoZTogTWV0YWRhdGFDYWNoZTtcbiAgICBwcmV2aW91c1RyaWVzOiBudW1iZXI7XG59KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcmV0cnkgPSAoKSA9PiB7XG4gICAgICAgIGlmIChwcmV2aW91c1RyaWVzID4gMTApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Rhc2tzOiBUb28gbWFueSByZXRyaWVzLiBGaWxlIHVwZGF0ZSBub3QgcG9zc2libGUgLi4uJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gTWF0aC5taW4oTWF0aC5wb3coMTAsIHByZXZpb3VzVHJpZXMpLCAxMDApOyAvLyAxLCAxMCwgMTAwLCAxMDAsIDEwMCwgLi4uXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5UmVwZXRpdGl2ZSh7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxUYXNrLFxuICAgICAgICAgICAgICAgIG5ld1Rhc2tzLFxuICAgICAgICAgICAgICAgIHZhdWx0LFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhQ2FjaGUsXG4gICAgICAgICAgICAgICAgcHJldmlvdXNUcmllczogcHJldmlvdXNUcmllcyArIDEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGZpbGUgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgob3JpZ2luYWxUYXNrLnBhdGgpO1xuICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBUYXNrczogTm8gZmlsZSBmb3VuZCBmb3IgdGFzayAke29yaWdpbmFsVGFzay5kZXNjcmlwdGlvbn0uIFJldHJ5aW5nIC4uLmApO1xuICAgICAgICByZXR1cm4gcmV0cnkoKTtcbiAgICB9XG5cbiAgICBpZiAoZmlsZS5leHRlbnNpb24gIT09ICdtZCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVGFza3M6IE9ubHkgc3VwcG9ydGluZyBmaWxlcyB3aXRoIHRoZSAubWQgZmlsZSBleHRlbnNpb24uJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ2FjaGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICBpZiAoZmlsZUNhY2hlID09IHVuZGVmaW5lZCB8fCBmaWxlQ2FjaGUgPT09IG51bGwpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBUYXNrczogTm8gZmlsZSBjYWNoZSBmb3VuZCBmb3IgZmlsZSAke2ZpbGUucGF0aH0uIFJldHJ5aW5nIC4uLmApO1xuICAgICAgICByZXR1cm4gcmV0cnkoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0SXRlbXNDYWNoZSA9IGZpbGVDYWNoZS5saXN0SXRlbXM7XG4gICAgaWYgKGxpc3RJdGVtc0NhY2hlID09PSB1bmRlZmluZWQgfHwgbGlzdEl0ZW1zQ2FjaGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVGFza3M6IE5vIGxpc3QgaXRlbXMgZm91bmQgaW4gZmlsZSBjYWNoZSBvZiAke2ZpbGUucGF0aH0uIFJldHJ5aW5nIC4uLmApO1xuICAgICAgICByZXR1cm4gcmV0cnkoKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IHZhdWx0LnJlYWQoZmlsZSk7XG4gICAgY29uc3QgZmlsZUxpbmVzID0gZmlsZUNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuXG4gICAgY29uc3QgeyBnbG9iYWxGaWx0ZXIgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgbGV0IGxpc3RJdGVtOiBMaXN0SXRlbUNhY2hlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzZWN0aW9uSW5kZXggPSAwO1xuICAgIGZvciAoY29uc3QgbGlzdEl0ZW1DYWNoZSBvZiBsaXN0SXRlbXNDYWNoZSkge1xuICAgICAgICBpZiAobGlzdEl0ZW1DYWNoZS5wb3NpdGlvbi5zdGFydC5saW5lIDwgb3JpZ2luYWxUYXNrLnNlY3Rpb25TdGFydCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdEl0ZW1DYWNoZS50YXNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGluZSA9IGZpbGVMaW5lc1tsaXN0SXRlbUNhY2hlLnBvc2l0aW9uLnN0YXJ0LmxpbmVdO1xuXG4gICAgICAgIGlmIChsaW5lLmluY2x1ZGVzKGdsb2JhbEZpbHRlcikpIHtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uSW5kZXggPT09IG9yaWdpbmFsVGFzay5zZWN0aW9uSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBsaXN0SXRlbSA9IGxpc3RJdGVtQ2FjaGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlY3Rpb25JbmRleCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChsaXN0SXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Rhc2tzOiBjb3VsZCBub3QgZmluZCB0YXNrIHRvIHRvZ2dsZSBpbiB0aGUgZmlsZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRGaWxlTGluZXMgPSBbXG4gICAgICAgIC4uLmZpbGVMaW5lcy5zbGljZSgwLCBsaXN0SXRlbS5wb3NpdGlvbi5zdGFydC5saW5lKSxcbiAgICAgICAgLi4ubmV3VGFza3MubWFwKCh0YXNrOiBUYXNrKSA9PiB0YXNrLnRvRmlsZUxpbmVTdHJpbmcoKSksXG4gICAgICAgIC4uLmZpbGVMaW5lcy5zbGljZShsaXN0SXRlbS5wb3NpdGlvbi5zdGFydC5saW5lICsgMSksIC8vIE9ubHkgc3VwcG9ydHMgc2luZ2xlLWxpbmUgdGFza3MuXG4gICAgXTtcblxuICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCB1cGRhdGVkRmlsZUxpbmVzLmpvaW4oJ1xcbicpKTtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBNb21lbnQgfSBmcm9tICdtb21lbnQvbW9tZW50JztcbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ3MnO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5cbi8qKlxuICogSW1wbGVtZW50IGRhdGUgZnJvbSBwYXRoIGRldGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRGF0ZUZhbGxiYWNrIHtcbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIHBhcnNlIHRoZSBmaWxlbmFtZSB0byBleHRyYWN0IGEgZGF0ZSB0YWtpbmcgdXNlciBzZXR0aW5ncyBpbnRvIGFjY291bnQuIElmIGRhdGUgaW5mZXJlbmNlIGlzIG5vdFxuICAgICAqIGVuYWJsZWQgcGFyc2luZyBpcyBieXBhc3NlZCBhbmQgbnVsbCBpcyByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0gcGF0aCB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaWxlXG4gICAgICogQHJldHVybiBhIE1vbWVudCBvciBudWxsIGlmIG5vIGRhdGUgd2FzIGZvdW5kLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVBhdGgocGF0aDogc3RyaW5nKTogTW9tZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHsgdXNlRmlsZW5hbWVBc1NjaGVkdWxlZERhdGUsIGZpbGVuYW1lQXNEYXRlRm9sZGVycyB9ID0gZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgICBpZiAoIXVzZUZpbGVuYW1lQXNTY2hlZHVsZWREYXRlKSB7XG4gICAgICAgICAgICAvLyBmZWF0dXJlIGlzIGRpc2FibGVkXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5tYXRjaGVzQW55Rm9sZGVyKGZpbGVuYW1lQXNEYXRlRm9sZGVycywgcGF0aCkpIHtcbiAgICAgICAgICAgIC8vIGZpbGUgaXMgbm90IGluIGFueSBmb2xkZXIgb3Igc3ViZm9sZGVyIHRoYXQgd2FzIHNlbGVjdGVkIGZvciBkYXRlIGluZmVyZW5jZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0ZUZyb21QYXRoKHBhdGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG1hdGNoZXNBbnlGb2xkZXIoZm9sZGVyczogc3RyaW5nW10sIHBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoZm9sZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIG5vIGNvbnN0cmFpbnRzIG9uIG1hdGNoaW5nIGZvbGRlcnNcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZm9sZGVycyBuZXZlciBlbmQgd2l0aCBhICcvJywgYW5kIHBhdGhzIGNvbnRhaW4gYXQgbGVhc3Qgb24gc2xhc2ggKHNlcGFyYXRpbmcgdGhlIGZvbGRlciBmcm9tIHRoZVxuICAgICAgICAvLyBmaWxlbmFtZSlcbiAgICAgICAgcmV0dXJuIGZvbGRlcnMuc29tZSgoZm9sZGVyKSA9PiBwYXRoLnN0YXJ0c1dpdGgoZm9sZGVyICsgJy8nKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdERhdGVGcm9tUGF0aChwYXRoOiBzdHJpbmcpOiBNb21lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZmlyc3RQb3MgPSBNYXRoLm1heCgwLCBwYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbiAgICAgICAgY29uc3QgbGFzdFBvcyA9IHBhdGgubGFzdEluZGV4T2YoJy4nKTtcblxuICAgICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguc3Vic3RyaW5nKGZpcnN0UG9zLCBsYXN0UG9zKTtcblxuICAgICAgICBsZXQgZGF0ZU1hdGNoID0gLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pLy5leGVjKGJhc2VuYW1lKTtcbiAgICAgICAgaWYgKCFkYXRlTWF0Y2gpIGRhdGVNYXRjaCA9IC8oXFxkezR9KShcXGR7Mn0pKFxcZHsyfSkvLmV4ZWMoYmFzZW5hbWUpO1xuXG4gICAgICAgIGlmIChkYXRlTWF0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSB3aW5kb3cubW9tZW50KFtwYXJzZUludChkYXRlTWF0Y2hbMV0pLCBwYXJzZUludChkYXRlTWF0Y2hbMl0pIC0gMSwgcGFyc2VJbnQoZGF0ZU1hdGNoWzNdKV0pO1xuICAgICAgICAgICAgaWYgKGRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZmYgYSBmYWxsYmFjayBjYW4gYmUgc2V0XG4gICAgICoqL1xuICAgIHB1YmxpYyBzdGF0aWMgY2FuQXBwbHlGYWxsYmFjayh7XG4gICAgICAgIHN0YXJ0RGF0ZSxcbiAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgZHVlRGF0ZSxcbiAgICB9OiB7XG4gICAgICAgIHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgc2NoZWR1bGVkRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgZHVlRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICB9KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzdGFydERhdGUgPT09IG51bGwgJiYgZHVlRGF0ZSA9PT0gbnVsbCAmJiBzY2hlZHVsZWREYXRlID09PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudCB0aGUgbG9naWMgdG8gdXBkYXRlIHRoZSBmaWVsZHMgcmVsYXRlZCB0byBkYXRlIGZhbGxiYWNrIG9mIGEgdGFzayB3aGVuIGl0cyBmaWxlIGhhcyBtb3ZlZFxuICAgICAqIEBwYXJhbSB0YXNrICAgICAgICAgLSB0YXNrIHRvIHVwZGF0ZVxuICAgICAqIEBwYXJhbSBuZXdQYXRoICAgICAgLSBuZXcgbG9jYXRpb25cbiAgICAgKiBAcGFyYW0gZmFsbGJhY2tEYXRlIC0gZmFsbGJhY2sgZGF0ZSBmcm9tIG5ldyBsb2NhdGlvbiwgZm9yIGVmZmljaWVuY3kuIENhbiBiZSBudWxsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyB1cGRhdGVUYXNrUGF0aCh0YXNrOiBUYXNrLCBuZXdQYXRoOiBzdHJpbmcsIGZhbGxiYWNrRGF0ZTogTW9tZW50IHwgbnVsbCk6IFRhc2sge1xuICAgICAgICAvLyBpbml0aWFsaXplIHdpdGggdmFsdWVzIGZyb20gYmVmb3JlIHRoZSBwYXRoIHdhcyBjaGFuZ2VkXG4gICAgICAgIGxldCBzY2hlZHVsZWREYXRlID0gdGFzay5zY2hlZHVsZWREYXRlO1xuICAgICAgICBsZXQgc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQgPSB0YXNrLnNjaGVkdWxlZERhdGVJc0luZmVycmVkO1xuXG4gICAgICAgIGlmIChmYWxsYmFja0RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgcGF0aCBkb2Vzbid0IGNvbnRhaW4gYSBkYXRlLi4uXG5cbiAgICAgICAgICAgIGlmIChzY2hlZHVsZWREYXRlSXNJbmZlcnJlZCkge1xuICAgICAgICAgICAgICAgIC8vIC4uLmJ1dCB0aGUgcHJldmlvdXMgcGF0aCBoYWQgb25lIDogcmVtb3ZlIGluZmVycmVkIGRhdGUgZnJvbSBUYXNrXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZWREYXRlID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gLi4uYW5kIHRoZSBvbGQgcGF0aCBkaWRuJ3QgY29udGFpbiBhbnkgZWl0aGVyIDpcbiAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLCBhbmQga2VlcCBhbnkgZXhwbGljaXRseSBzZXQgc2NoZWR1bGVkIGRhdGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgcGF0aCBjb250YWlucyBhIGRhdGUuLi5cblxuICAgICAgICAgICAgaWYgKHNjaGVkdWxlZERhdGVJc0luZmVycmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gLi4uYW5kIHdlIHVzZWQgdGhlIGZhbGxiYWNrIGRhdGUgZnJvbSB0aGUgcHJldmlvdXMgcGF0aCA6XG4gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBzY2hlZHVsZWQgZGF0ZSBmcm9tIHRoZSBuZXcgcGF0aFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGUgPSBmYWxsYmFja0RhdGU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2FuQXBwbHlGYWxsYmFjayh0YXNrKSkge1xuICAgICAgICAgICAgICAgIC8vIC4uLmFuZCB0aGUgdGFzayBpcyBjYW5kaWRhdGUgdG8gZGF0ZSBmYWxsYmFja1xuICAgICAgICAgICAgICAgIC8vIHNlc3QgdGhlIHNjaGVkdWxlZCBkYXRlIGZyb20gdGhlIG5ldyBwYXRoXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSA9IGZhbGxiYWNrRGF0ZTtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZWREYXRlSXNJbmZlcnJlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHByZXNlcnZlIGV4aXN0aW5nIGRhdGVzLCBpbmNsdWRpbmcgZXhwbGljaXQgc2NoZWR1bGVkRGF0ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBUYXNrKHtcbiAgICAgICAgICAgIC4uLnRhc2ssXG4gICAgICAgICAgICBwYXRoOiBuZXdQYXRoLFxuICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlZERhdGVJc0luZmVycmVkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gYXJyYXkgb2YgdXBkYXRlZCB0YXNrcyB0byByZW1vdmUgdGhlIGluZmVycmVkIHNjaGVkdWxlZCBkYXRlIHN0YXR1cyBpZiB0aGUgc2NoZWR1bGVkIGRhdGUgaGFzIGJlZW5cbiAgICAgKiBtb2RpZmllZCBhcyBjb21wYXJlZCB0byB0aGUgb3JpZ2luYWwgZGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlSW5mZXJyZWRTdGF0dXNJZk5lZWRlZChvcmlnaW5hbFRhc2s6IFRhc2ssIHVwZGF0ZWRUYXNrczogVGFza1tdKTogVGFza1tdIHtcbiAgICAgICAgY29uc3QgaW5mZXJyZWRTY2hlZHVsZWREYXRlID0gb3JpZ2luYWxUYXNrLnNjaGVkdWxlZERhdGVJc0luZmVycmVkID8gb3JpZ2luYWxUYXNrLnNjaGVkdWxlZERhdGUgOiBudWxsO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVkVGFza3MubWFwKCh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5mZXJyZWRTY2hlZHVsZWREYXRlICE9PSBudWxsICYmICFpbmZlcnJlZFNjaGVkdWxlZERhdGUuaXNTYW1lKHRhc2suc2NoZWR1bGVkRGF0ZSwgJ2RheScpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgYSBmYWxsYmFjayBkYXRlIHdhcyB1c2VkIGJlZm9yZSBtb2RpZmljYXRpb24sIGFuZCB0aGUgc2NoZWR1bGVkIGRhdGUgd2FzIG1vZGlmaWVkLCB3ZSBoYXZlIHRvIG1hcmtcbiAgICAgICAgICAgICAgICAvLyB0aGUgc2NoZWR1bGVkIGRhdGUgYXMgbm90IGluZmVycmVkIGFueW1vcmUuXG4gICAgICAgICAgICAgICAgdGFzayA9IG5ldyBUYXNrKHsgLi4udGFzaywgc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwgIi8qKlxuICogRXNjYXBlIGEgc3RyaW5nIHNvIGl0IGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgYSBSZWdFeHAgbGl0ZXJhbGx5LlxuICogVGFrZW4gZnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L0d1aWRlL1JlZ3VsYXJfRXhwcmVzc2lvbnMjZXNjYXBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzOiBzdHJpbmcpIHtcbiAgICAvLyBOT1RFOiA9IGlzIG5vdCBlc2NhcGVkLCBhcyBkb2luZyBzbyBnaXZlcyBlcnJvcjpcbiAgICAvLyAgICAgICAgIEludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAvKF58XFxzKWhlbGxvXFw9d29ybGQoJHxcXHMpLzogSW52YWxpZCBlc2NhcGVcbiAgICAvLyBOT1RFOiAhIGlzIG5vdCBlc2NhcGVkLCBhcyBkb2luZyBzbyBnaXZlcyBlcnJvcjpcbiAgICAvLyAgICAgICAgIEludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAvKF58XFxzKWhlbGxvXFwhd29ybGQoJHxcXHMpLzogSW52YWxpZCBlc2NhcGVcbiAgICAvLyBOT1RFOiA6IGlzIG5vdCBlc2NhcGVkLCBhcyBkb2luZyBzbyBnaXZlcyBlcnJvcjpcbiAgICAvLyAgICAgICAgIEludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAvKF58XFxzKWhlbGxvXFw6d29ybGQoJHxcXHMpLzogSW52YWxpZCBlc2NhcGVcbiAgICAvL1xuICAgIC8vIEV4cGxhbmF0aW9uIGZyb20gQEFubmFLb3JuZmVsZFNpbXBzb24gaW46XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbTcvb2JzaWRpYW4tdGFza3MvcHVsbC8xOCNpc3N1ZWNvbW1lbnQtMTE5NjExNTQwN1xuICAgIC8vIEZyb20gd2hhdCBJIGNhbiB0ZWxsLCB0aGUgdGhyZWUgbWlzc2luZyBjaGFyYWN0ZXJzIGZyb20gdGhlIG9yaWdpbmFsIHJlZ2V4IC0gOiAhID1cbiAgICAvLyBhcmUgYWxsIG9ubHkgY29uc2lkZXJlZCB0byBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgaWYgdGhleSBkaXJlY3RseSBmb2xsb3dcbiAgICAvLyBhID8gKGFsbCAzKSBvciBhID88ICghIGFuZCA9KS5cbiAgICAvLyBTbyB0aGVvcmV0aWNhbGx5IGlmIHRoZSA/IGFyZSBhbGwgZXNjYXBlZCwgdGhvc2UgdGhyZWUgY2hhcmFjdGVycyBkbyBub3QgaGF2ZSB0byBiZS5cbiAgICByZXR1cm4gcy5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xcXS9cXFxcXSkvZywgJ1xcXFwkMScpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IExheW91dE9wdGlvbnMsIFRhc2tMYXlvdXQgfSBmcm9tICcuL1Rhc2tMYXlvdXQnO1xuaW1wb3J0IHR5cGUgeyBUYXNrTGF5b3V0Q29tcG9uZW50IH0gZnJvbSAnLi9UYXNrTGF5b3V0JztcbmltcG9ydCB7IFJlY3VycmVuY2UgfSBmcm9tICcuL1JlY3VycmVuY2UnO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL0NvbmZpZy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBTdGF0dXNSZWdpc3RyeSB9IGZyb20gJy4vU3RhdHVzUmVnaXN0cnknO1xuaW1wb3J0IHR5cGUgeyBTdGF0dXMgfSBmcm9tICcuL1N0YXR1cyc7XG5pbXBvcnQgeyBVcmdlbmN5IH0gZnJvbSAnLi9VcmdlbmN5JztcbmltcG9ydCB7IHJlbmRlclRhc2tMaW5lIH0gZnJvbSAnLi9UYXNrTGluZVJlbmRlcmVyJztcbmltcG9ydCB0eXBlIHsgVGFza0xpbmVSZW5kZXJEZXRhaWxzIH0gZnJvbSAnLi9UYXNrTGluZVJlbmRlcmVyJztcbmltcG9ydCB7IERhdGVGYWxsYmFjayB9IGZyb20gJy4vRGF0ZUZhbGxiYWNrJztcbmltcG9ydCAqIGFzIFJlZ0V4cFRvb2xzIGZyb20gJy4vbGliL1JlZ0V4cFRvb2xzJztcbmltcG9ydCB7IGNvbXBhcmVCeURhdGUgfSBmcm9tICcuL2xpYi9EYXRlVG9vbHMnO1xuXG4vKipcbiAqIFdoZW4gc29ydGluZywgbWFrZSBzdXJlIGxvdyBhbHdheXMgY29tZXMgYWZ0ZXIgbm9uZS4gVGhpcyB3YXkgYW55IHRhc2tzIHdpdGggbG93IHdpbGwgYmUgYmVsb3cgYW55IGV4aXRpbmdcbiAqIHRhc2tzIHRoYXQgaGF2ZSBubyBwcmlvcml0eSB3aGljaCB3b3VsZCBiZSB0aGUgZGVmYXVsdC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG5leHBvcnQgZW51bSBQcmlvcml0eSB7XG4gICAgSGlnaCA9ICcxJyxcbiAgICBNZWRpdW0gPSAnMicsXG4gICAgTm9uZSA9ICczJyxcbiAgICBMb3cgPSAnNCcsXG59XG5cbmV4cG9ydCBjb25zdCBwcmlvcml0eVN5bWJvbHMgPSB7XG4gICAgSGlnaDogJ1x1MjNFQicsXG4gICAgTWVkaXVtOiAnXHVEODNEXHVERDNDJyxcbiAgICBMb3c6ICdcdUQ4M0RcdUREM0QnLFxuICAgIE5vbmU6ICcnLFxufTtcblxuZXhwb3J0IGNvbnN0IHJlY3VycmVuY2VTeW1ib2wgPSAnXHVEODNEXHVERDAxJztcbmV4cG9ydCBjb25zdCBzdGFydERhdGVTeW1ib2wgPSAnXHVEODNEXHVERUVCJztcbmV4cG9ydCBjb25zdCBzY2hlZHVsZWREYXRlU3ltYm9sID0gJ1x1MjNGMyc7XG5leHBvcnQgY29uc3QgZHVlRGF0ZVN5bWJvbCA9ICdcdUQ4M0RcdURDQzUnO1xuZXhwb3J0IGNvbnN0IGRvbmVEYXRlU3ltYm9sID0gJ1x1MjcwNSc7XG5cbmV4cG9ydCBjbGFzcyBUYXNrUmVndWxhckV4cHJlc3Npb25zIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRhdGVGb3JtYXQgPSAnWVlZWS1NTS1ERCc7XG5cbiAgICAvLyBNYXRjaGVzIGluZGVudGF0aW9uIGJlZm9yZSBhIGxpc3QgbWFya2VyIChpbmNsdWRpbmcgPiBmb3IgcG90ZW50aWFsbHkgbmVzdGVkIGJsb2NrcXVvdGVzIG9yIE9ic2lkaWFuIGNhbGxvdXRzKVxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW5kZW50YXRpb25SZWdleCA9IC9eKFtcXHNcXHQ+XSopLztcblxuICAgIC8vIE1hdGNoZXMgLSBvciAqIGxpc3QgbWFya2Vycywgb3IgbnVtYmVyZWQgbGlzdCBtYXJrZXJzIChlZyAxLilcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGxpc3RNYXJrZXJSZWdleCA9IC8oWy0qXXxbMC05XStcXC4pLztcblxuICAgIC8vIE1hdGNoZXMgYSBjaGVja2JveCBhbmQgc2F2ZXMgdGhlIHN0YXR1cyBjaGFyYWN0ZXIgaW5zaWRlXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjaGVja2JveFJlZ2V4ID0gL1xcWyguKVxcXS91O1xuXG4gICAgLy8gTWF0Y2hlcyB0aGUgcmVzdCBvZiB0aGUgdGFzayBhZnRlciB0aGUgY2hlY2tib3guXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBhZnRlckNoZWNrYm94UmVnZXggPSAvICooLiopL3U7XG5cbiAgICAvLyBNYWluIHJlZ2V4IGZvciBwYXJzaW5nIGEgbGluZS4gSXQgbWF0Y2hlcyB0aGUgZm9sbG93aW5nOlxuICAgIC8vIC0gSW5kZW50YXRpb25cbiAgICAvLyAtIExpc3QgbWFya2VyXG4gICAgLy8gLSBTdGF0dXMgY2hhcmFjdGVyXG4gICAgLy8gLSBSZXN0IG9mIHRhc2sgYWZ0ZXIgY2hlY2tib3ggbWFya2Rvd25cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRhc2tSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuaW5kZW50YXRpb25SZWdleC5zb3VyY2UgK1xuICAgICAgICAgICAgVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5saXN0TWFya2VyUmVnZXguc291cmNlICtcbiAgICAgICAgICAgICcgKycgK1xuICAgICAgICAgICAgVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5jaGVja2JveFJlZ2V4LnNvdXJjZSArXG4gICAgICAgICAgICBUYXNrUmVndWxhckV4cHJlc3Npb25zLmFmdGVyQ2hlY2tib3hSZWdleC5zb3VyY2UsXG4gICAgICAgICd1JyxcbiAgICApO1xuXG4gICAgLy8gVXNlZCB3aXRoIHRoZSBcIkNyZWF0ZSBvciBFZGl0IFRhc2tcIiBjb21tYW5kIHRvIHBhcnNlIGluZGVudGF0aW9uIGFuZCBzdGF0dXMgaWYgcHJlc2VudFxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbm9uVGFza1JlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5pbmRlbnRhdGlvblJlZ2V4LnNvdXJjZSArXG4gICAgICAgICAgICBUYXNrUmVndWxhckV4cHJlc3Npb25zLmxpc3RNYXJrZXJSZWdleC5zb3VyY2UgK1xuICAgICAgICAgICAgJz8gKignICtcbiAgICAgICAgICAgIFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuY2hlY2tib3hSZWdleC5zb3VyY2UgK1xuICAgICAgICAgICAgJyk/JyArXG4gICAgICAgICAgICBUYXNrUmVndWxhckV4cHJlc3Npb25zLmFmdGVyQ2hlY2tib3hSZWdleC5zb3VyY2UsXG4gICAgICAgICd1JyxcbiAgICApO1xuXG4gICAgLy8gVXNlZCB3aXRoIFwiVG9nZ2xlIERvbmVcIiBjb21tYW5kIHRvIGRldGVjdCBhIGxpc3QgaXRlbSB0aGF0IGNhbiBnZXQgYSBjaGVja2JveCBhZGRlZCB0byBpdC5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGxpc3RJdGVtUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICBUYXNrUmVndWxhckV4cHJlc3Npb25zLmluZGVudGF0aW9uUmVnZXguc291cmNlICsgVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5saXN0TWFya2VyUmVnZXguc291cmNlLFxuICAgICk7XG5cbiAgICAvLyBNYXRjaCBvbiBibG9jayBsaW5rIGF0IGVuZC5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJsb2NrTGlua1JlZ2V4ID0gLyBcXF5bYS16QS1aMC05LV0rJC91O1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyByZWdleCdzIGVuZCB3aXRoIGAkYCBiZWNhdXNlIHRoZXkgd2lsbCBiZSBtYXRjaGVkIGFuZFxuICAgIC8vIHJlbW92ZWQgZnJvbSB0aGUgZW5kIHVudGlsIG5vbmUgYXJlIGxlZnQuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBwcmlvcml0eVJlZ2V4ID0gLyhbXHUyM0VCXHVEODNEXHVERDNDXHVEODNEXHVERDNEXSkkL3U7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzdGFydERhdGVSZWdleCA9IC9cdUQ4M0RcdURFRUIgKihcXGR7NH0tXFxkezJ9LVxcZHsyfSkkL3U7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBzY2hlZHVsZWREYXRlUmVnZXggPSAvW1x1MjNGM1x1MjMxQl0gKihcXGR7NH0tXFxkezJ9LVxcZHsyfSkkL3U7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBkdWVEYXRlUmVnZXggPSAvW1x1RDgzRFx1RENDNVx1RDgzRFx1RENDNlx1RDgzRFx1REREM10gKihcXGR7NH0tXFxkezJ9LVxcZHsyfSkkL3U7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBkb25lRGF0ZVJlZ2V4ID0gL1x1MjcwNSAqKFxcZHs0fS1cXGR7Mn0tXFxkezJ9KSQvdTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHJlY3VycmVuY2VSZWdleCA9IC9cdUQ4M0RcdUREMDEgPyhbYS16QS1aMC05LCAhXSspJC9pdTtcblxuICAgIC8vIFJlZ2V4IHRvIG1hdGNoIGFsbCBoYXNoIHRhZ3MsIGJhc2ljYWxseSBoYXNoIGZvbGxvd2VkIGJ5IGFueXRoaW5nIGJ1dCB0aGUgY2hhcmFjdGVycyBpbiB0aGUgbmVnYXRpb24uXG4gICAgLy8gVG8gZW5zdXJlIFVSTHMgYXJlIG5vdCBjYXVnaHQgaXQgaXMgbG9va2luZyBvZiBiZWdpbm5pbmcgb2Ygc3RyaW5nIHRhZyBhbmQgYW55XG4gICAgLy8gdGFnIHRoYXQgaGFzIGEgc3BhY2UgaW4gZnJvbnQgb2YgaXQuIEFueSAjIHRoYXQgaGFzIGEgY2hhcmFjdGVyIGluIGZyb250XG4gICAgLy8gb2YgaXQgd2lsbCBiZSBpZ25vcmVkLlxuICAgIC8vIEVYQU1QTEU6XG4gICAgLy8gZGVzY3JpcHRpb246ICcjZG9nICNjYXIgaHR0cDovL3d3dy9kZGQjZXJlICNob3VzZSdcbiAgICAvLyBtYXRjaGVzOiAjZG9nLCAjY2FyLCAjaG91c2VcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGhhc2hUYWdzID0gLyhefFxccykjW14gIUAjJCVeJiooKSwuP1wiOnt9fDw+XSovZztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGhhc2hUYWdzRnJvbUVuZCA9IG5ldyBSZWdFeHAodGhpcy5oYXNoVGFncy5zb3VyY2UgKyAnJCcpO1xufVxuXG4vKipcbiAqIFRhc2sgZW5jYXBzdWxhdGVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBNYXJrRG93biB0YXNrIGFsb25nIHdpdGhcbiAqIHRoZSBleHRlbnNpb25zIHByb3ZpZGVkIGJ5IHRoaXMgcGx1Z2luLiBUaGlzIGlzIHVzZWQgdG8gcGFyc2UgYW5kXG4gKiBnZW5lcmF0ZSB0aGUgbWFya2Rvd24gdGFzayBmb3IgYWxsIHVwZGF0ZXMgYW5kIHJlcGxhY2VtZW50cy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVGFza1xuICovXG5leHBvcnQgY2xhc3MgVGFzayB7XG4gICAgcHVibGljIHJlYWRvbmx5IHN0YXR1czogU3RhdHVzO1xuICAgIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGluZGVudGF0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGxpc3RNYXJrZXI6IHN0cmluZztcbiAgICAvKiogTGluZSBudW1iZXIgd2hlcmUgdGhlIHNlY3Rpb24gc3RhcnRzIHRoYXQgY29udGFpbnMgdGhpcyB0YXNrLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzZWN0aW9uU3RhcnQ6IG51bWJlcjtcbiAgICAvKiogVGhlIGluZGV4IG9mIHRoZSBudGggdGFzayBpbiBpdHMgc2VjdGlvbi4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VjdGlvbkluZGV4OiBudW1iZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHByZWNlZGluZ0hlYWRlcjogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyByZWFkb25seSB0YWdzOiBzdHJpbmdbXTtcblxuICAgIHB1YmxpYyByZWFkb25seSBwcmlvcml0eTogUHJpb3JpdHk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhcnREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBzY2hlZHVsZWREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBkdWVEYXRlOiBNb21lbnQgfCBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBkb25lRGF0ZTogTW9tZW50IHwgbnVsbDtcblxuICAgIHB1YmxpYyByZWFkb25seSByZWN1cnJlbmNlOiBSZWN1cnJlbmNlIHwgbnVsbDtcbiAgICAvKiogVGhlIGJsb2NrTGluayBpcyBhIFwiXlwiIGFubm90YXRpb24gYWZ0ZXIgdGhlIGRhdGVzL3JlY3VycmVuY2UgcnVsZXMuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGJsb2NrTGluazogc3RyaW5nO1xuXG4gICAgLyoqIFRoZSBvcmlnaW5hbCBsaW5lIHJlYWQgZnJvbSBmaWxlLlxuICAgICAqXG4gICAgICogV2lsbCBiZSBlbXB0eSBpZiBUYXNrIHdhcyBjcmVhdGVkIHByb2dyYW1tYXRpY2FsbHlcbiAgICAgKiAoZm9yIGV4YW1wbGUsIGJ5IENyZWF0ZSBvciBFZGl0IFRhc2ssIG9yIGluIHRlc3RzLCBpbmNsdWRpbmcgdmlhIHtAbGluayBUYXNrQnVpbGRlcn0pLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBvcmlnaW5hbE1hcmtkb3duOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQ6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIF91cmdlbmN5OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgIGxpc3RNYXJrZXIsXG4gICAgICAgIHNlY3Rpb25TdGFydCxcbiAgICAgICAgc2VjdGlvbkluZGV4LFxuICAgICAgICBwcmVjZWRpbmdIZWFkZXIsXG4gICAgICAgIHByaW9yaXR5LFxuICAgICAgICBzdGFydERhdGUsXG4gICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgIGR1ZURhdGUsXG4gICAgICAgIGRvbmVEYXRlLFxuICAgICAgICByZWN1cnJlbmNlLFxuICAgICAgICBibG9ja0xpbmssXG4gICAgICAgIHRhZ3MsXG4gICAgICAgIG9yaWdpbmFsTWFya2Rvd24sXG4gICAgICAgIHNjaGVkdWxlZERhdGVJc0luZmVycmVkLFxuICAgIH06IHtcbiAgICAgICAgc3RhdHVzOiBTdGF0dXM7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgaW5kZW50YXRpb246IHN0cmluZztcbiAgICAgICAgbGlzdE1hcmtlcjogc3RyaW5nO1xuICAgICAgICBzZWN0aW9uU3RhcnQ6IG51bWJlcjtcbiAgICAgICAgc2VjdGlvbkluZGV4OiBudW1iZXI7XG4gICAgICAgIHByZWNlZGluZ0hlYWRlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgcHJpb3JpdHk6IFByaW9yaXR5O1xuICAgICAgICBzdGFydERhdGU6IG1vbWVudC5Nb21lbnQgfCBudWxsO1xuICAgICAgICBzY2hlZHVsZWREYXRlOiBtb21lbnQuTW9tZW50IHwgbnVsbDtcbiAgICAgICAgZHVlRGF0ZTogbW9tZW50Lk1vbWVudCB8IG51bGw7XG4gICAgICAgIGRvbmVEYXRlOiBtb21lbnQuTW9tZW50IHwgbnVsbDtcbiAgICAgICAgcmVjdXJyZW5jZTogUmVjdXJyZW5jZSB8IG51bGw7XG4gICAgICAgIGJsb2NrTGluazogc3RyaW5nO1xuICAgICAgICB0YWdzOiBzdHJpbmdbXSB8IFtdO1xuICAgICAgICBvcmlnaW5hbE1hcmtkb3duOiBzdHJpbmc7XG4gICAgICAgIHNjaGVkdWxlZERhdGVJc0luZmVycmVkOiBib29sZWFuO1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5pbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uO1xuICAgICAgICB0aGlzLmxpc3RNYXJrZXIgPSBsaXN0TWFya2VyO1xuICAgICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHNlY3Rpb25TdGFydDtcbiAgICAgICAgdGhpcy5zZWN0aW9uSW5kZXggPSBzZWN0aW9uSW5kZXg7XG4gICAgICAgIHRoaXMucHJlY2VkaW5nSGVhZGVyID0gcHJlY2VkaW5nSGVhZGVyO1xuXG4gICAgICAgIHRoaXMudGFncyA9IHRhZ3M7XG5cbiAgICAgICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5O1xuXG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gc3RhcnREYXRlO1xuICAgICAgICB0aGlzLnNjaGVkdWxlZERhdGUgPSBzY2hlZHVsZWREYXRlO1xuICAgICAgICB0aGlzLmR1ZURhdGUgPSBkdWVEYXRlO1xuICAgICAgICB0aGlzLmRvbmVEYXRlID0gZG9uZURhdGU7XG5cbiAgICAgICAgdGhpcy5yZWN1cnJlbmNlID0gcmVjdXJyZW5jZTtcbiAgICAgICAgdGhpcy5ibG9ja0xpbmsgPSBibG9ja0xpbms7XG4gICAgICAgIHRoaXMub3JpZ2luYWxNYXJrZG93biA9IG9yaWdpbmFsTWFya2Rvd247XG5cbiAgICAgICAgdGhpcy5zY2hlZHVsZWREYXRlSXNJbmZlcnJlZCA9IHNjaGVkdWxlZERhdGVJc0luZmVycmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRha2VzIHRoZSBnaXZlbiBsaW5lIGZyb20gYSBvYnNpZGlhbiBub3RlIGFuZCByZXR1cm5zIGEgVGFzayBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmUgLSBUaGUgZnVsbCBsaW5lIGluIHRoZSBub3RlIHRvIHBhcnNlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aCB0byB0aGUgbm90ZSBpbiBvYnNpZGlhbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2VjdGlvblN0YXJ0IC0gTGluZSBudW1iZXIgd2hlcmUgdGhlIHNlY3Rpb24gc3RhcnRzIHRoYXQgY29udGFpbnMgdGhpcyB0YXNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzZWN0aW9uSW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIG50aCB0YXNrIGluIGl0cyBzZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7KHN0cmluZyB8IG51bGwpfSBwcmVjZWRpbmdIZWFkZXIgLSBUaGUgaGVhZGVyIGJlZm9yZSB0aGlzIHRhc2suXG4gICAgICogQHBhcmFtIHsoTW9tZW50IHwgbnVsbCl9IGZhbGxiYWNrRGF0ZSAtIFRoZSBkYXRlIHRvIHVzZSBhcyB0aGUgc2NoZWR1bGVkIGRhdGUgaWYgbm8gb3RoZXIgZGF0ZSBpcyBzZXRcbiAgICAgKiBAcmV0dXJuIHsqfSAgeyhUYXNrIHwgbnVsbCl9XG4gICAgICogQG1lbWJlcm9mIFRhc2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21MaW5lKHtcbiAgICAgICAgbGluZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgc2VjdGlvblN0YXJ0LFxuICAgICAgICBzZWN0aW9uSW5kZXgsXG4gICAgICAgIHByZWNlZGluZ0hlYWRlcixcbiAgICAgICAgZmFsbGJhY2tEYXRlLFxuICAgIH06IHtcbiAgICAgICAgbGluZTogc3RyaW5nO1xuICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgIHNlY3Rpb25TdGFydDogbnVtYmVyO1xuICAgICAgICBzZWN0aW9uSW5kZXg6IG51bWJlcjtcbiAgICAgICAgcHJlY2VkaW5nSGVhZGVyOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBmYWxsYmFja0RhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgfSk6IFRhc2sgfCBudWxsIHtcbiAgICAgICAgLy8gQ2hlY2sgdGhlIGxpbmUgdG8gc2VlIGlmIGl0IGlzIGEgbWFya2Rvd24gdGFzay5cbiAgICAgICAgY29uc3QgcmVnZXhNYXRjaCA9IGxpbmUubWF0Y2goVGFza1JlZ3VsYXJFeHByZXNzaW9ucy50YXNrUmVnZXgpO1xuICAgICAgICBpZiAocmVnZXhNYXRjaCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXRjaFs0XSBpbmNsdWRlcyB0aGUgd2hvbGUgYm9keSBvZiB0aGUgdGFzayBhZnRlciB0aGUgYnJhY2tldHMuXG4gICAgICAgIGNvbnN0IGJvZHkgPSByZWdleE1hdGNoWzRdLnRyaW0oKTtcblxuICAgICAgICAvLyByZXR1cm4gaWYgdGFzayBkb2VzIG5vdCBoYXZlIHRoZSBnbG9iYWwgZmlsdGVyLiBEbyB0aGlzIGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgICAgIC8vIHJlc3Qgb2YgbWF0Y2ggdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAgICAgICAgY29uc3QgeyBnbG9iYWxGaWx0ZXIgfSA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgIGlmICghYm9keS5pbmNsdWRlcyhnbG9iYWxGaWx0ZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZXNjcmlwdGlvbiA9IGJvZHk7XG4gICAgICAgIGNvbnN0IGluZGVudGF0aW9uID0gcmVnZXhNYXRjaFsxXTtcbiAgICAgICAgY29uc3QgbGlzdE1hcmtlciA9IHJlZ2V4TWF0Y2hbMl07XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzdGF0dXMgb2YgdGhlIHRhc2suXG4gICAgICAgIGNvbnN0IHN0YXR1c1N0cmluZyA9IHJlZ2V4TWF0Y2hbM107XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IFN0YXR1c1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuYnlTeW1ib2xPckNyZWF0ZShzdGF0dXNTdHJpbmcpO1xuXG4gICAgICAgIC8vIE1hdGNoIGZvciBibG9jayBsaW5rIGFuZCByZW1vdmUgaWYgZm91bmQuIEFsd2F5cyBleHBlY3RlZCB0byBiZVxuICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLlxuICAgICAgICBjb25zdCBibG9ja0xpbmtNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuYmxvY2tMaW5rUmVnZXgpO1xuICAgICAgICBjb25zdCBibG9ja0xpbmsgPSBibG9ja0xpbmtNYXRjaCAhPT0gbnVsbCA/IGJsb2NrTGlua01hdGNoWzBdIDogJyc7XG5cbiAgICAgICAgaWYgKGJsb2NrTGluayAhPT0gJycpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZShUYXNrUmVndWxhckV4cHJlc3Npb25zLmJsb2NrTGlua1JlZ2V4LCAnJykudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2VlcCBtYXRjaGluZyBhbmQgcmVtb3Zpbmcgc3BlY2lhbCBzdHJpbmdzIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAgICAgICAgLy8gZGVzY3JpcHRpb24gaW4gYW55IG9yZGVyLiBUaGUgbG9vcCBzaG91bGQgb25seSBydW4gb25jZSBpZiB0aGVcbiAgICAgICAgLy8gc3RyaW5ncyBhcmUgaW4gdGhlIGV4cGVjdGVkIG9yZGVyIGFmdGVyIHRoZSBkZXNjcmlwdGlvbi5cbiAgICAgICAgbGV0IG1hdGNoZWQ6IGJvb2xlYW47XG4gICAgICAgIGxldCBwcmlvcml0eTogUHJpb3JpdHkgPSBQcmlvcml0eS5Ob25lO1xuICAgICAgICBsZXQgc3RhcnREYXRlOiBNb21lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHNjaGVkdWxlZERhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGR1ZURhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgZG9uZURhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgcmVjdXJyZW5jZVJ1bGU6IHN0cmluZyA9ICcnO1xuICAgICAgICBsZXQgcmVjdXJyZW5jZTogUmVjdXJyZW5jZSB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgdGFnczogYW55ID0gW107XG4gICAgICAgIC8vIFRhZ3MgdGhhdCBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBlbmQgd2hpbGUgcGFyc2luZywgYnV0IHdlIHdhbnQgdG8gYWRkIHRoZW0gYmFjayBmb3IgYmVpbmcgcGFydCBvZiB0aGUgZGVzY3JpcHRpb24uXG4gICAgICAgIC8vIEluIHRoZSBvcmlnaW5hbCB0YXNrIGRlc2NyaXB0aW9uIHRoZXkgYXJlIHBvc3NpYmx5IG1peGVkIHdpdGggb3RoZXIgY29tcG9uZW50c1xuICAgICAgICAvLyAoZS5nLiAjdGFnMSA8ZHVlIGRhdGU+ICN0YWcyKSwgdGhleSBkbyBub3QgaGF2ZSB0byBhbGwgdHJhaWwgYWxsIHRhc2sgY29tcG9uZW50cyxcbiAgICAgICAgLy8gYnV0IGV2ZW50dWFsbHkgd2Ugd2FudCB0byBwYXN0ZSB0aGVtIGJhY2sgdG8gdGhlIHRhc2sgZGVzY3JpcHRpb24gYXQgdGhlIGVuZFxuICAgICAgICBsZXQgdHJhaWxpbmdUYWdzID0gJyc7XG4gICAgICAgIC8vIEFkZCBhIFwibWF4IHJ1bnNcIiBmYWlsc2FmZSB0byBuZXZlciBlbmQgaW4gYW4gZW5kbGVzcyBsb29wOlxuICAgICAgICBjb25zdCBtYXhSdW5zID0gMjA7XG4gICAgICAgIGxldCBydW5zID0gMDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgbWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcHJpb3JpdHlNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMucHJpb3JpdHlSZWdleCk7XG4gICAgICAgICAgICBpZiAocHJpb3JpdHlNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAocHJpb3JpdHlNYXRjaFsxXSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHByaW9yaXR5U3ltYm9scy5Mb3c6XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IFByaW9yaXR5LkxvdztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHByaW9yaXR5U3ltYm9scy5NZWRpdW06XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IFByaW9yaXR5Lk1lZGl1bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHByaW9yaXR5U3ltYm9scy5IaWdoOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBQcmlvcml0eS5IaWdoO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMucHJpb3JpdHlSZWdleCwgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZG9uZURhdGVNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuZG9uZURhdGVSZWdleCk7XG4gICAgICAgICAgICBpZiAoZG9uZURhdGVNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRvbmVEYXRlID0gd2luZG93Lm1vbWVudChkb25lRGF0ZU1hdGNoWzFdLCBUYXNrUmVndWxhckV4cHJlc3Npb25zLmRhdGVGb3JtYXQpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZShUYXNrUmVndWxhckV4cHJlc3Npb25zLmRvbmVEYXRlUmVnZXgsICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGR1ZURhdGVNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuZHVlRGF0ZVJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChkdWVEYXRlTWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkdWVEYXRlID0gd2luZG93Lm1vbWVudChkdWVEYXRlTWF0Y2hbMV0sIFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuZGF0ZUZvcm1hdCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuZHVlRGF0ZVJlZ2V4LCAnJykudHJpbSgpO1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzY2hlZHVsZWREYXRlTWF0Y2ggPSBkZXNjcmlwdGlvbi5tYXRjaChUYXNrUmVndWxhckV4cHJlc3Npb25zLnNjaGVkdWxlZERhdGVSZWdleCk7XG4gICAgICAgICAgICBpZiAoc2NoZWR1bGVkRGF0ZU1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSA9IHdpbmRvdy5tb21lbnQoc2NoZWR1bGVkRGF0ZU1hdGNoWzFdLCBUYXNrUmVndWxhckV4cHJlc3Npb25zLmRhdGVGb3JtYXQpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZShUYXNrUmVndWxhckV4cHJlc3Npb25zLnNjaGVkdWxlZERhdGVSZWdleCwgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlTWF0Y2ggPSBkZXNjcmlwdGlvbi5tYXRjaChUYXNrUmVndWxhckV4cHJlc3Npb25zLnN0YXJ0RGF0ZVJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChzdGFydERhdGVNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSA9IHdpbmRvdy5tb21lbnQoc3RhcnREYXRlTWF0Y2hbMV0sIFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuZGF0ZUZvcm1hdCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuc3RhcnREYXRlUmVnZXgsICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlY3VycmVuY2VNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMucmVjdXJyZW5jZVJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChyZWN1cnJlbmNlTWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSByZWN1cnJlbmNlIHJ1bGUsIGJ1dCAqZG8gbm90IHBhcnNlIGl0IHlldCouXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRpbmcgdGhlIFJlY3VycmVuY2Ugb2JqZWN0IHJlcXVpcmVzIGEgcmVmZXJlbmNlIGRhdGUgKGUuZy4gYSBkdWUgZGF0ZSksXG4gICAgICAgICAgICAgICAgLy8gYW5kIGl0IG1pZ2h0IGFwcGVhciBpbiB0aGUgbmV4dCAoZWFybGllciBpbiB0aGUgbGluZSkgdG9rZW5zIHRvIHBhcnNlXG4gICAgICAgICAgICAgICAgcmVjdXJyZW5jZVJ1bGUgPSByZWN1cnJlbmNlTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZShUYXNrUmVndWxhckV4cHJlc3Npb25zLnJlY3VycmVuY2VSZWdleCwgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTWF0Y2ggdGFncyBmcm9tIHRoZSBlbmQgdG8gYWxsb3cgdXNlcnMgdG8gbWl4IHRoZSB2YXJpb3VzIHRhc2sgY29tcG9uZW50cyB3aXRoXG4gICAgICAgICAgICAvLyB0YWdzLiBUaGVzZSB0YWdzIHdpbGwgYmUgYWRkZWQgYmFjayB0byB0aGUgZGVzY3JpcHRpb24gYmVsb3dcbiAgICAgICAgICAgIGNvbnN0IHRhZ3NNYXRjaCA9IGRlc2NyaXB0aW9uLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuaGFzaFRhZ3NGcm9tRW5kKTtcbiAgICAgICAgICAgIGlmICh0YWdzTWF0Y2ggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZShUYXNrUmVndWxhckV4cHJlc3Npb25zLmhhc2hUYWdzRnJvbUVuZCwgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdOYW1lID0gdGFnc01hdGNoWzBdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAvLyBBZGRpbmcgdG8gdGhlIGxlZnQgYmVjYXVzZSB0aGUgbWF0Y2hpbmcgaXMgZG9uZSByaWdodC10by1sZWZ0XG4gICAgICAgICAgICAgICAgdHJhaWxpbmdUYWdzID0gdHJhaWxpbmdUYWdzLmxlbmd0aCA+IDAgPyBbdGFnTmFtZSwgdHJhaWxpbmdUYWdzXS5qb2luKCcgJykgOiB0YWdOYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydW5zKys7XG4gICAgICAgIH0gd2hpbGUgKG1hdGNoZWQgJiYgcnVucyA8PSBtYXhSdW5zKTtcblxuICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgdGFzayBkZXRhaWxzLCBwYXJzZSB0aGUgcmVjdXJyZW5jZSBydWxlIGlmIHdlIGZvdW5kIGFueVxuICAgICAgICBpZiAocmVjdXJyZW5jZVJ1bGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVjdXJyZW5jZSA9IFJlY3VycmVuY2UuZnJvbVRleHQoe1xuICAgICAgICAgICAgICAgIHJlY3VycmVuY2VSdWxlVGV4dDogcmVjdXJyZW5jZVJ1bGUsXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlLFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgICAgICAgICAgZHVlRGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5mZXIgdGhlIHNjaGVkdWxlZCBkYXRlIGZyb20gdGhlIGZpbGUgbmFtZSBpZiBub3Qgc2V0IGV4cGxpY2l0bHlcbiAgICAgICAgaWYgKERhdGVGYWxsYmFjay5jYW5BcHBseUZhbGxiYWNrKHsgc3RhcnREYXRlLCBzY2hlZHVsZWREYXRlLCBkdWVEYXRlIH0pICYmIGZhbGxiYWNrRGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZSA9IGZhbGxiYWNrRGF0ZTtcbiAgICAgICAgICAgIHNjaGVkdWxlZERhdGVJc0luZmVycmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBiYWNrIGFueSB0cmFpbGluZyB0YWdzIHRvIHRoZSBkZXNjcmlwdGlvbi4gV2UgcmVtb3ZlZCB0aGVtIHNvIHdlIGNhbiBwYXJzZSB0aGUgcmVzdCBvZiB0aGVcbiAgICAgICAgLy8gY29tcG9uZW50cyBidXQgbm93IHdlIHdhbnQgdGhlbSBiYWNrLlxuICAgICAgICAvLyBUaGUgZ29hbCBpcyBmb3IgYSB0YXNrIG9mIHRoZW0gZm9ybSAnRG8gc29tZXRoaW5nICN0YWcxIChkdWUpIHRvbW9ycm93ICN0YWcyIChzdGFydCkgdG9kYXknXG4gICAgICAgIC8vIHRvIGFjdHVhbGx5IGhhdmUgdGhlIGRlc2NyaXB0aW9uICdEbyBzb21ldGhpbmcgI3RhZzEgI3RhZzInXG4gICAgICAgIGlmICh0cmFpbGluZ1RhZ3MubGVuZ3RoID4gMCkgZGVzY3JpcHRpb24gKz0gJyAnICsgdHJhaWxpbmdUYWdzO1xuXG4gICAgICAgIC8vIFRhZ3MgYXJlIGZvdW5kIGluIHRoZSBzdHJpbmcgYW5kIHB1bGxlZCBvdXQgYnV0IG5vdCByZW1vdmVkLFxuICAgICAgICAvLyBzbyB3aGVuIHJldHVybmluZyB0aGUgZW50aXJlIHRhc2sgaXQgd2lsbCBtYXRjaCB3aGF0IHRoZSB1c2VyXG4gICAgICAgIC8vIGVudGVyZWQuXG4gICAgICAgIC8vIFRoZSBnbG9iYWwgZmlsdGVyIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAgICBjb25zdCBoYXNoVGFnTWF0Y2ggPSBkZXNjcmlwdGlvbi5tYXRjaChUYXNrUmVndWxhckV4cHJlc3Npb25zLmhhc2hUYWdzKTtcbiAgICAgICAgaWYgKGhhc2hUYWdNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGFncyA9IGhhc2hUYWdNYXRjaC5maWx0ZXIoKHRhZykgPT4gdGFnICE9PSBnbG9iYWxGaWx0ZXIpLm1hcCgodGFnKSA9PiB0YWcudHJpbSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgVGFzayh7XG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGxpc3RNYXJrZXIsXG4gICAgICAgICAgICBzZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICBzZWN0aW9uSW5kZXgsXG4gICAgICAgICAgICBwcmVjZWRpbmdIZWFkZXIsXG4gICAgICAgICAgICBwcmlvcml0eSxcbiAgICAgICAgICAgIHN0YXJ0RGF0ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgICAgICBkdWVEYXRlLFxuICAgICAgICAgICAgZG9uZURhdGUsXG4gICAgICAgICAgICByZWN1cnJlbmNlLFxuICAgICAgICAgICAgYmxvY2tMaW5rLFxuICAgICAgICAgICAgdGFncyxcbiAgICAgICAgICAgIG9yaWdpbmFsTWFya2Rvd246IGxpbmUsXG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlSXNJbmZlcnJlZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIEhUTUwgcmVuZGVyZWQgTGlzdCBJdGVtIGVsZW1lbnQgKExJKSBmb3IgdGhlIGN1cnJlbnQgdGFzay5cbiAgICAgKiBAcGFyYW0ge3JlbmRlclRhaWxzfVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB0b0xpKHJlbmRlckRldGFpbHM6IFRhc2tMaW5lUmVuZGVyRGV0YWlscyk6IFByb21pc2U8SFRNTExJRWxlbWVudD4ge1xuICAgICAgICByZXR1cm4gcmVuZGVyVGFza0xpbmUodGhpcywgcmVuZGVyRGV0YWlscyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmxhdHRlbiB0aGUgdGFzayBhcyBhIHN0cmluZyB0aGF0IGluY2x1ZGVzIGFsbCBpdHMgY29tcG9uZW50cy5cbiAgICAgKiBAcGFyYW0ge0xheW91dE9wdGlvbnN9IFtsYXlvdXRPcHRpb25zXVxuICAgICAqIEByZXR1cm4geyp9ICB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXNrXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKGxheW91dE9wdGlvbnM/OiBMYXlvdXRPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdGFza0xheW91dCA9IG5ldyBUYXNrTGF5b3V0KGxheW91dE9wdGlvbnMpO1xuICAgICAgICBsZXQgdGFza1N0cmluZyA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0YXNrTGF5b3V0LmxheW91dENvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIHRhc2tTdHJpbmcgKz0gdGhpcy5jb21wb25lbnRUb1N0cmluZyh0YXNrTGF5b3V0LCBjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXNrU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBzcGVjaWZpYyBUYXNrTGF5b3V0Q29tcG9uZW50IG9mIHRoZSB0YXNrIChpdHMgZGVzY3JpcHRpb24sIHByaW9yaXR5LCBldGMpIGFzIGEgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb21wb25lbnRUb1N0cmluZyhsYXlvdXQ6IFRhc2tMYXlvdXQsIGNvbXBvbmVudDogVGFza0xheW91dENvbXBvbmVudCkge1xuICAgICAgICBzd2l0Y2ggKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgY2FzZSAnZGVzY3JpcHRpb24nOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgY2FzZSAncHJpb3JpdHknOiB7XG4gICAgICAgICAgICAgICAgbGV0IHByaW9yaXR5OiBzdHJpbmcgPSAnJztcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByaW9yaXR5ID09PSBQcmlvcml0eS5IaWdoKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gJyAnICsgcHJpb3JpdHlTeW1ib2xzLkhpZ2g7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByaW9yaXR5ID09PSBQcmlvcml0eS5NZWRpdW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSAnICcgKyBwcmlvcml0eVN5bWJvbHMuTWVkaXVtO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmlvcml0eSA9PT0gUHJpb3JpdHkuTG93KSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gJyAnICsgcHJpb3JpdHlTeW1ib2xzLkxvdztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByaW9yaXR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnc3RhcnREYXRlJzpcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3RhcnREYXRlKSByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxheW91dC5vcHRpb25zLnNob3J0TW9kZVxuICAgICAgICAgICAgICAgICAgICA/ICcgJyArIHN0YXJ0RGF0ZVN5bWJvbFxuICAgICAgICAgICAgICAgICAgICA6IGAgJHtzdGFydERhdGVTeW1ib2x9ICR7dGhpcy5zdGFydERhdGUuZm9ybWF0KFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuZGF0ZUZvcm1hdCl9YDtcbiAgICAgICAgICAgIGNhc2UgJ3NjaGVkdWxlZERhdGUnOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2hlZHVsZWREYXRlIHx8IHRoaXMuc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQpIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICByZXR1cm4gbGF5b3V0Lm9wdGlvbnMuc2hvcnRNb2RlXG4gICAgICAgICAgICAgICAgICAgID8gJyAnICsgc2NoZWR1bGVkRGF0ZVN5bWJvbFxuICAgICAgICAgICAgICAgICAgICA6IGAgJHtzY2hlZHVsZWREYXRlU3ltYm9sfSAke3RoaXMuc2NoZWR1bGVkRGF0ZS5mb3JtYXQoVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5kYXRlRm9ybWF0KX1gO1xuICAgICAgICAgICAgY2FzZSAnZG9uZURhdGUnOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb25lRGF0ZSkgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXlvdXQub3B0aW9ucy5zaG9ydE1vZGVcbiAgICAgICAgICAgICAgICAgICAgPyAnICcgKyBkb25lRGF0ZVN5bWJvbFxuICAgICAgICAgICAgICAgICAgICA6IGAgJHtkb25lRGF0ZVN5bWJvbH0gJHt0aGlzLmRvbmVEYXRlLmZvcm1hdChUYXNrUmVndWxhckV4cHJlc3Npb25zLmRhdGVGb3JtYXQpfWA7XG4gICAgICAgICAgICBjYXNlICdkdWVEYXRlJzpcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZHVlRGF0ZSkgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXlvdXQub3B0aW9ucy5zaG9ydE1vZGVcbiAgICAgICAgICAgICAgICAgICAgPyAnICcgKyBkdWVEYXRlU3ltYm9sXG4gICAgICAgICAgICAgICAgICAgIDogYCAke2R1ZURhdGVTeW1ib2x9ICR7dGhpcy5kdWVEYXRlLmZvcm1hdChUYXNrUmVndWxhckV4cHJlc3Npb25zLmRhdGVGb3JtYXQpfWA7XG4gICAgICAgICAgICBjYXNlICdyZWN1cnJlbmNlUnVsZSc6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlY3VycmVuY2UpIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICByZXR1cm4gbGF5b3V0Lm9wdGlvbnMuc2hvcnRNb2RlXG4gICAgICAgICAgICAgICAgICAgID8gJyAnICsgcmVjdXJyZW5jZVN5bWJvbFxuICAgICAgICAgICAgICAgICAgICA6IGAgJHtyZWN1cnJlbmNlU3ltYm9sfSAke3RoaXMucmVjdXJyZW5jZS50b1RleHQoKX1gO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2tMaW5rJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ibG9ja0xpbmsgPz8gJyc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gcmVuZGVyIHRhc2sgY29tcG9uZW50IG9mIHR5cGUgJyR7Y29tcG9uZW50fSdgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIFRhc2sgYXMgYSBsaXN0IGl0ZW0gd2l0aCBhIGNoZWNrYm94LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Kn0gIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRhc2tcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9GaWxlTGluZVN0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5pbmRlbnRhdGlvbn0ke3RoaXMubGlzdE1hcmtlcn0gWyR7dGhpcy5zdGF0dXMuc3ltYm9sfV0gJHt0aGlzLnRvU3RyaW5nKCl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoaXMgdGFzayBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIHRhc2tzLlxuICAgICAqXG4gICAgICogVG9nZ2xpbmcgY2FuIHJlc3VsdCBpbiBtb3JlIHRoYW4gb25lIHJldHVybmVkIHRhc2sgaW4gdGhlIGNhc2Ugb2ZcbiAgICAgKiByZWN1cnJlbmNlLiBJZiBpdCBpcyBhIHJlY3VycmluZyB0YXNrLCB0aGUgdG9nZ2xlZCB0YXNrIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAgKiB0b2dldGhlciB3aXRoIHRoZSBuZXh0IG9jY3VycmVuY2UgaW4gdGhlIG9yZGVyIGBbbmV4dCwgdG9nZ2xlZF1gLiBJZiB0aGVcbiAgICAgKiB0YXNrIGlzIG5vdCByZWN1cnJpbmcsIGl0IHdpbGwgcmV0dXJuIGBbdG9nZ2xlZF1gLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUoKTogVGFza1tdIHtcbiAgICAgICAgY29uc3QgbmV3U3RhdHVzID0gU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXROZXh0U3RhdHVzT3JDcmVhdGUodGhpcy5zdGF0dXMpO1xuXG4gICAgICAgIGxldCBuZXdEb25lRGF0ZSA9IG51bGw7XG5cbiAgICAgICAgbGV0IG5leHRPY2N1cnJlbmNlOiB7XG4gICAgICAgICAgICBzdGFydERhdGU6IE1vbWVudCB8IG51bGw7XG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlOiBNb21lbnQgfCBudWxsO1xuICAgICAgICAgICAgZHVlRGF0ZTogTW9tZW50IHwgbnVsbDtcbiAgICAgICAgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChuZXdTdGF0dXMuaXNDb21wbGV0ZWQoKSkge1xuICAgICAgICAgICAgLy8gU2V0IGRvbmUgZGF0ZSBvbmx5IGlmIHNldHRpbmcgdmFsdWUgaXMgdHJ1ZVxuICAgICAgICAgICAgY29uc3QgeyBzZXREb25lRGF0ZSB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgICAgIGlmIChzZXREb25lRGF0ZSkge1xuICAgICAgICAgICAgICAgIG5ld0RvbmVEYXRlID0gd2luZG93Lm1vbWVudCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIHRhc2sgaXMgbm8gbG9uZ2VyIHRvZG8sIHdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgcmVjdXJyaW5nOlxuICAgICAgICAgICAgaWYgKHRoaXMucmVjdXJyZW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5leHRPY2N1cnJlbmNlID0gdGhpcy5yZWN1cnJlbmNlLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvZ2dsZWRUYXNrID0gbmV3IFRhc2soe1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIHN0YXR1czogbmV3U3RhdHVzLFxuICAgICAgICAgICAgZG9uZURhdGU6IG5ld0RvbmVEYXRlLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBuZXdUYXNrczogVGFza1tdID0gW107XG5cbiAgICAgICAgaWYgKG5leHRPY2N1cnJlbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U3RhdHVzID0gU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXROZXh0U3RhdHVzT3JDcmVhdGUobmV3U3RhdHVzKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRUYXNrID0gbmV3IFRhc2soe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICAgICAgLi4ubmV4dE9jY3VycmVuY2UsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBuZXh0U3RhdHVzLFxuICAgICAgICAgICAgICAgIC8vIE5ldyBvY2N1cnJlbmNlcyBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBibG9jayBsaW5rLlxuICAgICAgICAgICAgICAgIC8vIEFuZCByYW5kb20gYmxvY2sgbGlua3MgZG9uJ3QgaGVscC5cbiAgICAgICAgICAgICAgICBibG9ja0xpbms6ICcnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXdUYXNrcy5wdXNoKG5leHRUYXNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIG5leHQgb2NjdXJyZW5jZSBiZWZvcmUgcHJldmlvdXMgb2NjdXJyZW5jZS5cbiAgICAgICAgbmV3VGFza3MucHVzaCh0b2dnbGVkVGFzayk7XG5cbiAgICAgICAgcmV0dXJuIG5ld1Rhc2tzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXJnZW5jeSgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5fdXJnZW5jeSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fdXJnZW5jeSA9IFVyZ2VuY3kuY2FsY3VsYXRlKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3VyZ2VuY3k7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHRhc2ssIHdpdGggdGhlIC5tZCBleHRlbnNpb24gcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbGVuYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gdGhpcy5wYXRoLm1hdGNoKC8oW14vXSspXFwubWQkLyk7XG4gICAgICAgIGlmIChmaWxlTmFtZU1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsZU5hbWVNYXRjaFsxXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgd2hlbiBsaW5raW5nIHRvIHRoZSBvcmlnaW4gb2YgdGhlIHRhc2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpc0ZpbGVuYW1lVW5pcXVlIHtib29sZWFufG51bGx9IFdoZXRoZXIgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgdGFzayBpcyB1bmlxdWUgaW4gdGhlIHZhdWx0LlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGl0IGlzIHVuZGVmaW5lZCwgdGhlIG91dGNvbWUgd2lsbCBiZSB0aGUgc2FtZSBhcyB3aXRoIGEgdW5pcXVlIGZpbGUgbmFtZTogdGhlIGZpbGUgbmFtZSBvbmx5LlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBmdWxsIHBhdGggd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TGlua1RleHQoeyBpc0ZpbGVuYW1lVW5pcXVlIH06IHsgaXNGaWxlbmFtZVVuaXF1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCB9KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGxldCBsaW5rVGV4dDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgaWYgKGlzRmlsZW5hbWVVbmlxdWUpIHtcbiAgICAgICAgICAgIGxpbmtUZXh0ID0gdGhpcy5maWxlbmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEEgc2xhc2ggYXQgdGhlIGJlZ2lubmluZyBpbmRpY2F0ZXMgdGhpcyBpcyBhIHBhdGgsIG5vdCBhIGZpbGVuYW1lLlxuICAgICAgICAgICAgbGlua1RleHQgPSAnLycgKyB0aGlzLnBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1RleHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIHdvdWxkbid0IHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhbmQgb25seSB0YWtlIHVwIHNwYWNlLlxuICAgICAgICBpZiAodGhpcy5wcmVjZWRpbmdIZWFkZXIgIT09IG51bGwgJiYgdGhpcy5wcmVjZWRpbmdIZWFkZXIgIT09IGxpbmtUZXh0KSB7XG4gICAgICAgICAgICBsaW5rVGV4dCA9IGxpbmtUZXh0ICsgJyA+ICcgKyB0aGlzLnByZWNlZGluZ0hlYWRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaW5rVGV4dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlIHR3byBsaXN0cyBvZiBUYXNrIG9iamVjdHMsIGFuZCByZXBvcnQgd2hldGhlciB0aGVpclxuICAgICAqIHRhc2tzIGFyZSBpZGVudGljYWwgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIG9wdGltaXNpbmcgY29kZSBpZiBpdCBpcyBndWFyYW50ZWVkIHRoYXRcbiAgICAgKiB0aGVyZSBhcmUgbm8gcG9zc2libGUgZGlmZmVyZW5jZXMgaW4gdGhlIHRhc2tzIGluIGEgZmlsZVxuICAgICAqIGFmdGVyIGFuIGVkaXQsIGZvciBleGFtcGxlLlxuICAgICAqXG4gICAgICogSWYgYW55IGZpZWxkIGlzIGRpZmZlcmVudCBpbiBhbnkgdGFzaywgaXQgd2lsbCByZXR1cm4gZmFsc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2xkVGFza3NcbiAgICAgKiBAcGFyYW0gbmV3VGFza3NcbiAgICAgKi9cbiAgICBzdGF0aWMgdGFza3NMaXN0c0lkZW50aWNhbChvbGRUYXNrczogVGFza1tdLCBuZXdUYXNrczogVGFza1tdKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChvbGRUYXNrcy5sZW5ndGggIT09IG5ld1Rhc2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvbGRUYXNrcy5ldmVyeSgob2xkVGFzaywgaW5kZXgpID0+IG9sZFRhc2suaWRlbnRpY2FsVG8obmV3VGFza3NbaW5kZXhdKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZSBhbGwgdGhlIGZpZWxkcyBpbiBhbm90aGVyIFRhc2ssIHRvIGRldGVjdCBhbnkgZGlmZmVyZW5jZXMgZnJvbSB0aGlzIG9uZS5cbiAgICAgKlxuICAgICAqIElmIGFueSBmaWVsZCBpcyBkaWZmZXJlbnQgaW4gYW55IHdheSwgaXQgd2lsbCByZXR1cm4gZmFsc2UuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHVzZWQgaW4gc29tZSBvcHRpbWlzYXRpb25zLCB0byBhdm9pZCB3b3JrIGlmIGFuIGVkaXQgdG8gZmlsZVxuICAgICAqIGRvZXMgbm90IGNoYW5nZSBhbnkgdGFza3MsIHNvIGl0IGlzIHZpdGFsIHRoYXQgaXRzIGRlZmluaXRpb25cbiAgICAgKiBvZiBpZGVudGljYWwgaXMgdmVyeSBzdHJpY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3RoZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpY2FsVG8ob3RoZXI6IFRhc2spIHtcbiAgICAgICAgLy8gQmFzZWQgb24gaWRlYXMgZnJvbSBrb2FsYS4gQXF1YUNhdCBhbmQgamF2YWxlbnQgaW4gRGlzY29yZDpcbiAgICAgICAgLy8gaHR0cHM6Ly9kaXNjb3JkLmNvbS9jaGFubmVscy82ODYwNTM3MDgyNjEyMjg1NzcvODQwMjg2MjY0OTY0MDIyMzAyLzk5NjczNTIwMDM4ODE4NjE4MlxuICAgICAgICAvLyBhbmQgbGF0ZXIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vdGU6IHNlY3Rpb25TdGFydCBjaGFuZ2VzIGV2ZXJ5IHRpbWUgYSBsaW5lIGlzIGFkZGVkIG9yIGRlbGV0ZWQgYmVmb3JlXG4gICAgICAgIC8vICAgICAgIGFueSBvZiB0aGUgdGFza3MgaW4gYSBmaWxlLiBUaGlzIGRvZXMgbWVhbiB0aGF0IHJlZHJhd2luZyBvZiB0YXNrcyBibG9ja3NcbiAgICAgICAgLy8gICAgICAgaGFwcGVucyBtb3JlIG9mdGVuIHRoYW4gaXMgaWRlYWwuXG4gICAgICAgIGxldCBhcmdzOiBBcnJheTxrZXlvZiBUYXNrPiA9IFtcbiAgICAgICAgICAgICdzdGF0dXMnLFxuICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICdwYXRoJyxcbiAgICAgICAgICAgICdpbmRlbnRhdGlvbicsXG4gICAgICAgICAgICAnbGlzdE1hcmtlcicsXG4gICAgICAgICAgICAnc2VjdGlvblN0YXJ0JyxcbiAgICAgICAgICAgICdzZWN0aW9uSW5kZXgnLFxuICAgICAgICAgICAgJ3ByZWNlZGluZ0hlYWRlcicsXG4gICAgICAgICAgICAncHJpb3JpdHknLFxuICAgICAgICAgICAgJ2Jsb2NrTGluaycsXG4gICAgICAgICAgICAnc2NoZWR1bGVkRGF0ZUlzSW5mZXJyZWQnLFxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW2VsXSAhPT0gb3RoZXJbZWxdKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wYXJlIHRhZ3NcbiAgICAgICAgaWYgKHRoaXMudGFncy5sZW5ndGggIT09IG90aGVyLnRhZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGFncyBhcmUgdGhlIHNhbWUgb25seSBpZiB0aGUgdmFsdWVzIGFyZSBpbiB0aGUgc2FtZSBvcmRlclxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy50YWdzLmV2ZXJ5KGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50ID09PSBvdGhlci50YWdzW2luZGV4XTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcGFyZSBEYXRlIGZpZWxkc1xuICAgICAgICBhcmdzID0gWydzdGFydERhdGUnLCAnc2NoZWR1bGVkRGF0ZScsICdkdWVEYXRlJywgJ2RvbmVEYXRlJ107XG4gICAgICAgIGZvciAoY29uc3QgZWwgb2YgYXJncykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZTEgPSB0aGlzW2VsXSBhcyBNb21lbnQgfCBudWxsO1xuICAgICAgICAgICAgY29uc3QgZGF0ZTIgPSBvdGhlcltlbF0gYXMgTW9tZW50IHwgbnVsbDtcbiAgICAgICAgICAgIGlmIChjb21wYXJlQnlEYXRlKGRhdGUxLCBkYXRlMikgIT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWN1cnJlbmNlMSA9IHRoaXMucmVjdXJyZW5jZTtcbiAgICAgICAgY29uc3QgcmVjdXJyZW5jZTIgPSBvdGhlci5yZWN1cnJlbmNlO1xuICAgICAgICBpZiAocmVjdXJyZW5jZTEgPT09IG51bGwgJiYgcmVjdXJyZW5jZTIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChyZWN1cnJlbmNlMSAhPT0gbnVsbCAmJiByZWN1cnJlbmNlMiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHJlY3VycmVuY2UxICYmIHJlY3VycmVuY2UyICYmICFyZWN1cnJlbmNlMS5pZGVudGljYWxUbyhyZWN1cnJlbmNlMikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCBmb3IgdGhlIGdsb2JhbCBmaWx0ZXIgZm9yIHRoZSBwdXJwb3NlIG9mIHJlbW92aW5nIGl0IGZyb20gdGhlIGRlc2NyaXB0aW9uLCBidXQgZG8gc28gb25seVxuICAgICAqIGlmIGl0IGlzIGEgc2VwYXJhdGUgd29yZCAocHJlY2VkaW5nIHRoZSBiZWdpbm5pbmcgb2YgbGluZSBvciBhIHNwYWNlIGFuZCBmb2xsb3dlZCBieSB0aGUgZW5kIG9mIGxpbmVcbiAgICAgKiBvciBhIHNwYWNlKSwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGN1dC1vZmYgbmVzdGVkIHRhZ3MgbGlrZSAjdGFzay9zdWJ0YWcuXG4gICAgICogSWYgdGhlIGdsb2JhbCBmaWx0ZXIgZXhpc3RzIGFzIHBhcnQgb2YgYSBuZXN0ZWQgdGFnLCB3ZSBrZWVwIGl0IHVudG91Y2hlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGVzY3JpcHRpb25XaXRob3V0R2xvYmFsRmlsdGVyKCkge1xuICAgICAgICBjb25zdCB7IGdsb2JhbEZpbHRlciB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgbGV0IGRlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjtcbiAgICAgICAgaWYgKGdsb2JhbEZpbHRlci5sZW5ndGggPT09IDApIHJldHVybiBkZXNjcmlwdGlvbjtcbiAgICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBnbG9iYWwgZmlsdGVyIChhZnRlciBlc2NhcGluZyBpdCkgb25seSB3aGVuIGl0J3MgYSBjb21wbGV0ZSB3b3JkXG4gICAgICAgIGNvbnN0IGdsb2JhbEZpbHRlclJlZ2V4ID0gUmVnRXhwKCcoXnxcXFxccyknICsgUmVnRXhwVG9vbHMuZXNjYXBlUmVnRXhwKGdsb2JhbEZpbHRlcikgKyAnKCR8XFxcXHMpJywgJ3VnJyk7XG4gICAgICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uLnNlYXJjaChnbG9iYWxGaWx0ZXJSZWdleCkgPiAtMSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKGdsb2JhbEZpbHRlclJlZ2V4LCAnJDEkMicpLnJlcGxhY2UoJyAgJywgJyAnKS50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cbn1cbiIsICIvKipcbiAqIExhenkgbG9hZGVkIHZhcmlhYmxlIDogZmV0Y2hpbmcgdGhlIHZhbHVlIGlzIHBvc3Rwb25lZCB1bnRpbCB0aGUgZmlyc3QgZ2V0KClcbiAqL1xuZXhwb3J0IGNsYXNzIExhenk8VD4ge1xuICAgIHByaXZhdGUgX3ZhbHVlOiBUIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgbGF6eSBvYmplY3RcbiAgICAgKiBAcGFyYW0gZmV0Y2ggYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGEgdmFsdWVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZldGNoOiAoKSA9PiBUKSB7fVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgdGhlIGxhenkgdmFsdWUsIGNhbGxpbmcgdGhlIGZldGNoIGZ1bmN0aW9uIHRoZSBmaXJzdCB0aW1lLlxuICAgICAqL1xuICAgIGdldCB2YWx1ZSgpOiBUIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5mZXRjaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBcHAsIEVkaXRvciwgTWFya2Rvd25WaWV3LCBWaWV3IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgVGFza01vZGFsIH0gZnJvbSAnLi4vVGFza01vZGFsJztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uL1Rhc2snO1xuaW1wb3J0IHsgRGF0ZUZhbGxiYWNrIH0gZnJvbSAnLi4vRGF0ZUZhbGxiYWNrJztcbmltcG9ydCB7IHRhc2tGcm9tTGluZSB9IGZyb20gJy4vQ3JlYXRlT3JFZGl0VGFza1BhcnNlcic7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVPckVkaXQgPSAoY2hlY2tpbmc6IGJvb2xlYW4sIGVkaXRvcjogRWRpdG9yLCB2aWV3OiBWaWV3LCBhcHA6IEFwcCkgPT4ge1xuICAgIGlmIChjaGVja2luZykge1xuICAgICAgICByZXR1cm4gdmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldztcbiAgICB9XG5cbiAgICBpZiAoISh2aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3KSkge1xuICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIGR1ZSB0byBjaGVjayBhYm92ZS5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XG4gICAgY29uc3QgbGluZU51bWJlciA9IGN1cnNvclBvc2l0aW9uLmxpbmU7XG4gICAgY29uc3QgbGluZSA9IGVkaXRvci5nZXRMaW5lKGxpbmVOdW1iZXIpO1xuICAgIGNvbnN0IHRhc2sgPSB0YXNrRnJvbUxpbmUoeyBsaW5lLCBwYXRoIH0pO1xuXG4gICAgY29uc3Qgb25TdWJtaXQgPSAodXBkYXRlZFRhc2tzOiBUYXNrW10pOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IERhdGVGYWxsYmFjay5yZW1vdmVJbmZlcnJlZFN0YXR1c0lmTmVlZGVkKHRhc2ssIHVwZGF0ZWRUYXNrcylcbiAgICAgICAgICAgIC5tYXAoKHRhc2s6IFRhc2spID0+IHRhc2sudG9GaWxlTGluZVN0cmluZygpKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICBlZGl0b3Iuc2V0TGluZShsaW5lTnVtYmVyLCBzZXJpYWxpemVkKTtcbiAgICB9O1xuXG4gICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgZXZlcnkgdGltZSwgYXMgY3Vyc29yL3Rhc2sgY2FuIGNoYW5nZS5cbiAgICBjb25zdCB0YXNrTW9kYWwgPSBuZXcgVGFza01vZGFsKHtcbiAgICAgICAgYXBwLFxuICAgICAgICB0YXNrLFxuICAgICAgICBvblN1Ym1pdCxcbiAgICB9KTtcbiAgICB0YXNrTW9kYWwub3BlbigpO1xufTtcbiIsICJpbXBvcnQgeyBBcHAsIE1vZGFsIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IEVkaXRUYXNrIGZyb20gJy4vdWkvRWRpdFRhc2suc3ZlbHRlJztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQgeyBTdGF0dXNSZWdpc3RyeSB9IGZyb20gJy4vU3RhdHVzUmVnaXN0cnknO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi9TdGF0dXMnO1xuXG5leHBvcnQgY2xhc3MgVGFza01vZGFsIGV4dGVuZHMgTW9kYWwge1xuICAgIHB1YmxpYyByZWFkb25seSB0YXNrOiBUYXNrO1xuICAgIHB1YmxpYyByZWFkb25seSBvblN1Ym1pdDogKHVwZGF0ZWRUYXNrczogVGFza1tdKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IoeyBhcHAsIHRhc2ssIG9uU3VibWl0IH06IHsgYXBwOiBBcHA7IHRhc2s6IFRhc2s7IG9uU3VibWl0OiAodXBkYXRlZFRhc2tzOiBUYXNrW10pID0+IHZvaWQgfSkge1xuICAgICAgICBzdXBlcihhcHApO1xuXG4gICAgICAgIHRoaXMudGFzayA9IHRhc2s7XG4gICAgICAgIHRoaXMub25TdWJtaXQgPSAodXBkYXRlZFRhc2tzOiBUYXNrW10pID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZWRUYXNrcy5sZW5ndGggJiYgb25TdWJtaXQodXBkYXRlZFRhc2tzKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25PcGVuKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRpdGxlRWwuc2V0VGV4dCgnQ3JlYXRlIG9yIGVkaXQgVGFzaycpO1xuICAgICAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblxuICAgICAgICBjb25zdCBzdGF0dXNPcHRpb25zID0gdGhpcy5nZXRLbm93blN0YXR1c2VzQW5kQ3VycmVudFRhc2tTdGF0dXNJZk5vdEtub3duKCk7XG5cbiAgICAgICAgbmV3IEVkaXRUYXNrKHtcbiAgICAgICAgICAgIHRhcmdldDogY29udGVudEVsLFxuICAgICAgICAgICAgcHJvcHM6IHsgdGFzazogdGhpcy50YXNrLCBzdGF0dXNPcHRpb25zOiBzdGF0dXNPcHRpb25zLCBvblN1Ym1pdDogdGhpcy5vblN1Ym1pdCB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgdGFzayBiZWluZyBlZGl0ZWQgaGFzIGFuIHVua25vd24gc3RhdHVzLCBtYWtlIHN1cmUgaXQgaXMgYWRkZWRcbiAgICAgKiB0byB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICAgKiBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgc3RhdHVzIGFuZCB0aGVuIGNoYW5nZSB0aGVpclxuICAgICAqIG1pbmQgYW5kIHJldHVybiB0byB0aGUgaW5pdGlhbCBzdGF0dXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRLbm93blN0YXR1c2VzQW5kQ3VycmVudFRhc2tTdGF0dXNJZk5vdEtub3duKCkge1xuICAgICAgICBjb25zdCBzdGF0dXNPcHRpb25zOiBTdGF0dXNbXSA9IFN0YXR1c1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVnaXN0ZXJlZFN0YXR1c2VzO1xuICAgICAgICBpZiAoU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5ieVN5bWJvbCh0aGlzLnRhc2suc3RhdHVzLnN5bWJvbCkgPT09IFN0YXR1cy5FTVBUWSkge1xuICAgICAgICAgICAgc3RhdHVzT3B0aW9ucy5wdXNoKHRoaXMudGFzay5zdGF0dXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0dXNPcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICAgICAgY29udGVudEVsLmVtcHR5KCk7XG4gICAgfVxufVxuIiwgImZ1bmN0aW9uIG5vb3AoKSB7IH1cbmNvbnN0IGlkZW50aXR5ID0geCA9PiB4O1xuZnVuY3Rpb24gYXNzaWduKHRhciwgc3JjKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGZvciAoY29uc3QgayBpbiBzcmMpXG4gICAgICAgIHRhcltrXSA9IHNyY1trXTtcbiAgICByZXR1cm4gdGFyO1xufVxuZnVuY3Rpb24gaXNfcHJvbWlzZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gYWRkX2xvY2F0aW9uKGVsZW1lbnQsIGZpbGUsIGxpbmUsIGNvbHVtbiwgY2hhcikge1xuICAgIGVsZW1lbnQuX19zdmVsdGVfbWV0YSA9IHtcbiAgICAgICAgbG9jOiB7IGZpbGUsIGxpbmUsIGNvbHVtbiwgY2hhciB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJ1bihmbikge1xuICAgIHJldHVybiBmbigpO1xufVxuZnVuY3Rpb24gYmxhbmtfb2JqZWN0KCkge1xuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuZnVuY3Rpb24gcnVuX2FsbChmbnMpIHtcbiAgICBmbnMuZm9yRWFjaChydW4pO1xufVxuZnVuY3Rpb24gaXNfZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gc2FmZV9ub3RfZXF1YWwoYSwgYikge1xuICAgIHJldHVybiBhICE9IGEgPyBiID09IGIgOiBhICE9PSBiIHx8ICgoYSAmJiB0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHx8IHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKTtcbn1cbmxldCBzcmNfdXJsX2VxdWFsX2FuY2hvcjtcbmZ1bmN0aW9uIHNyY191cmxfZXF1YWwoZWxlbWVudF9zcmMsIHVybCkge1xuICAgIGlmICghc3JjX3VybF9lcXVhbF9hbmNob3IpIHtcbiAgICAgICAgc3JjX3VybF9lcXVhbF9hbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgfVxuICAgIHNyY191cmxfZXF1YWxfYW5jaG9yLmhyZWYgPSB1cmw7XG4gICAgcmV0dXJuIGVsZW1lbnRfc3JjID09PSBzcmNfdXJsX2VxdWFsX2FuY2hvci5ocmVmO1xufVxuZnVuY3Rpb24gbm90X2VxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYjtcbn1cbmZ1bmN0aW9uIGlzX2VtcHR5KG9iaikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX3N0b3JlKHN0b3JlLCBuYW1lKSB7XG4gICAgaWYgKHN0b3JlICE9IG51bGwgJiYgdHlwZW9mIHN0b3JlLnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke25hbWV9JyBpcyBub3QgYSBzdG9yZSB3aXRoIGEgJ3N1YnNjcmliZScgbWV0aG9kYCk7XG4gICAgfVxufVxuZnVuY3Rpb24gc3Vic2NyaWJlKHN0b3JlLCAuLi5jYWxsYmFja3MpIHtcbiAgICBpZiAoc3RvcmUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICB9XG4gICAgY29uc3QgdW5zdWIgPSBzdG9yZS5zdWJzY3JpYmUoLi4uY2FsbGJhY2tzKTtcbiAgICByZXR1cm4gdW5zdWIudW5zdWJzY3JpYmUgPyAoKSA9PiB1bnN1Yi51bnN1YnNjcmliZSgpIDogdW5zdWI7XG59XG5mdW5jdGlvbiBnZXRfc3RvcmVfdmFsdWUoc3RvcmUpIHtcbiAgICBsZXQgdmFsdWU7XG4gICAgc3Vic2NyaWJlKHN0b3JlLCBfID0+IHZhbHVlID0gXykoKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBjb21wb25lbnRfc3Vic2NyaWJlKGNvbXBvbmVudCwgc3RvcmUsIGNhbGxiYWNrKSB7XG4gICAgY29tcG9uZW50LiQkLm9uX2Rlc3Ryb3kucHVzaChzdWJzY3JpYmUoc3RvcmUsIGNhbGxiYWNrKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVfc2xvdChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKSB7XG4gICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jdHggPSBnZXRfc2xvdF9jb250ZXh0KGRlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZm4pO1xuICAgICAgICByZXR1cm4gZGVmaW5pdGlvblswXShzbG90X2N0eCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKSB7XG4gICAgcmV0dXJuIGRlZmluaXRpb25bMV0gJiYgZm5cbiAgICAgICAgPyBhc3NpZ24oJCRzY29wZS5jdHguc2xpY2UoKSwgZGVmaW5pdGlvblsxXShmbihjdHgpKSlcbiAgICAgICAgOiAkJHNjb3BlLmN0eDtcbn1cbmZ1bmN0aW9uIGdldF9zbG90X2NoYW5nZXMoZGVmaW5pdGlvbiwgJCRzY29wZSwgZGlydHksIGZuKSB7XG4gICAgaWYgKGRlZmluaXRpb25bMl0gJiYgZm4pIHtcbiAgICAgICAgY29uc3QgbGV0cyA9IGRlZmluaXRpb25bMl0oZm4oZGlydHkpKTtcbiAgICAgICAgaWYgKCQkc2NvcGUuZGlydHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGxldHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsZXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gW107XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1heCgkJHNjb3BlLmRpcnR5Lmxlbmd0aCwgbGV0cy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIG1lcmdlZFtpXSA9ICQkc2NvcGUuZGlydHlbaV0gfCBsZXRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJCRzY29wZS5kaXJ0eSB8IGxldHM7XG4gICAgfVxuICAgIHJldHVybiAkJHNjb3BlLmRpcnR5O1xufVxuZnVuY3Rpb24gdXBkYXRlX3Nsb3RfYmFzZShzbG90LCBzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgc2xvdF9jaGFuZ2VzLCBnZXRfc2xvdF9jb250ZXh0X2ZuKSB7XG4gICAgaWYgKHNsb3RfY2hhbmdlcykge1xuICAgICAgICBjb25zdCBzbG90X2NvbnRleHQgPSBnZXRfc2xvdF9jb250ZXh0KHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBnZXRfc2xvdF9jb250ZXh0X2ZuKTtcbiAgICAgICAgc2xvdC5wKHNsb3RfY29udGV4dCwgc2xvdF9jaGFuZ2VzKTtcbiAgICB9XG59XG5mdW5jdGlvbiB1cGRhdGVfc2xvdChzbG90LCBzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZGlydHksIGdldF9zbG90X2NoYW5nZXNfZm4sIGdldF9zbG90X2NvbnRleHRfZm4pIHtcbiAgICBjb25zdCBzbG90X2NoYW5nZXMgPSBnZXRfc2xvdF9jaGFuZ2VzKHNsb3RfZGVmaW5pdGlvbiwgJCRzY29wZSwgZGlydHksIGdldF9zbG90X2NoYW5nZXNfZm4pO1xuICAgIHVwZGF0ZV9zbG90X2Jhc2Uoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIHNsb3RfY2hhbmdlcywgZ2V0X3Nsb3RfY29udGV4dF9mbik7XG59XG5mdW5jdGlvbiBnZXRfYWxsX2RpcnR5X2Zyb21fc2NvcGUoJCRzY29wZSkge1xuICAgIGlmICgkJHNjb3BlLmN0eC5sZW5ndGggPiAzMikge1xuICAgICAgICBjb25zdCBkaXJ0eSA9IFtdO1xuICAgICAgICBjb25zdCBsZW5ndGggPSAkJHNjb3BlLmN0eC5sZW5ndGggLyAzMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZGlydHlbaV0gPSAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlydHk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbmZ1bmN0aW9uIGV4Y2x1ZGVfaW50ZXJuYWxfcHJvcHMocHJvcHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gcHJvcHMpXG4gICAgICAgIGlmIChrWzBdICE9PSAnJCcpXG4gICAgICAgICAgICByZXN1bHRba10gPSBwcm9wc1trXTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY29tcHV0ZV9yZXN0X3Byb3BzKHByb3BzLCBrZXlzKSB7XG4gICAgY29uc3QgcmVzdCA9IHt9O1xuICAgIGtleXMgPSBuZXcgU2V0KGtleXMpO1xuICAgIGZvciAoY29uc3QgayBpbiBwcm9wcylcbiAgICAgICAgaWYgKCFrZXlzLmhhcyhrKSAmJiBrWzBdICE9PSAnJCcpXG4gICAgICAgICAgICByZXN0W2tdID0gcHJvcHNba107XG4gICAgcmV0dXJuIHJlc3Q7XG59XG5mdW5jdGlvbiBjb21wdXRlX3Nsb3RzKHNsb3RzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2xvdHMpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gb25jZShmbikge1xuICAgIGxldCByYW4gPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKHJhbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgcmFuID0gdHJ1ZTtcbiAgICAgICAgZm4uY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbnVsbF90b19lbXB0eSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldF9zdG9yZV92YWx1ZShzdG9yZSwgcmV0LCB2YWx1ZSkge1xuICAgIHN0b3JlLnNldCh2YWx1ZSk7XG4gICAgcmV0dXJuIHJldDtcbn1cbmNvbnN0IGhhc19wcm9wID0gKG9iaiwgcHJvcCkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG5mdW5jdGlvbiBhY3Rpb25fZGVzdHJveWVyKGFjdGlvbl9yZXN1bHQpIHtcbiAgICByZXR1cm4gYWN0aW9uX3Jlc3VsdCAmJiBpc19mdW5jdGlvbihhY3Rpb25fcmVzdWx0LmRlc3Ryb3kpID8gYWN0aW9uX3Jlc3VsdC5kZXN0cm95IDogbm9vcDtcbn1cblxuY29uc3QgaXNfY2xpZW50ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG5sZXQgbm93ID0gaXNfY2xpZW50XG4gICAgPyAoKSA9PiB3aW5kb3cucGVyZm9ybWFuY2Uubm93KClcbiAgICA6ICgpID0+IERhdGUubm93KCk7XG5sZXQgcmFmID0gaXNfY2xpZW50ID8gY2IgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNiKSA6IG5vb3A7XG4vLyB1c2VkIGludGVybmFsbHkgZm9yIHRlc3RpbmdcbmZ1bmN0aW9uIHNldF9ub3coZm4pIHtcbiAgICBub3cgPSBmbjtcbn1cbmZ1bmN0aW9uIHNldF9yYWYoZm4pIHtcbiAgICByYWYgPSBmbjtcbn1cblxuY29uc3QgdGFza3MgPSBuZXcgU2V0KCk7XG5mdW5jdGlvbiBydW5fdGFza3Mobm93KSB7XG4gICAgdGFza3MuZm9yRWFjaCh0YXNrID0+IHtcbiAgICAgICAgaWYgKCF0YXNrLmMobm93KSkge1xuICAgICAgICAgICAgdGFza3MuZGVsZXRlKHRhc2spO1xuICAgICAgICAgICAgdGFzay5mKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGFza3Muc2l6ZSAhPT0gMClcbiAgICAgICAgcmFmKHJ1bl90YXNrcyk7XG59XG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkhXG4gKi9cbmZ1bmN0aW9uIGNsZWFyX2xvb3BzKCkge1xuICAgIHRhc2tzLmNsZWFyKCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdGFzayB0aGF0IHJ1bnMgb24gZWFjaCByYWYgZnJhbWVcbiAqIHVudGlsIGl0IHJldHVybnMgYSBmYWxzeSB2YWx1ZSBvciBpcyBhYm9ydGVkXG4gKi9cbmZ1bmN0aW9uIGxvb3AoY2FsbGJhY2spIHtcbiAgICBsZXQgdGFzaztcbiAgICBpZiAodGFza3Muc2l6ZSA9PT0gMClcbiAgICAgICAgcmFmKHJ1bl90YXNrcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVsZmlsbCA9PiB7XG4gICAgICAgICAgICB0YXNrcy5hZGQodGFzayA9IHsgYzogY2FsbGJhY2ssIGY6IGZ1bGZpbGwgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBhYm9ydCgpIHtcbiAgICAgICAgICAgIHRhc2tzLmRlbGV0ZSh0YXNrKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIFRyYWNrIHdoaWNoIG5vZGVzIGFyZSBjbGFpbWVkIGR1cmluZyBoeWRyYXRpb24uIFVuY2xhaW1lZCBub2RlcyBjYW4gdGhlbiBiZSByZW1vdmVkIGZyb20gdGhlIERPTVxuLy8gYXQgdGhlIGVuZCBvZiBoeWRyYXRpb24gd2l0aG91dCB0b3VjaGluZyB0aGUgcmVtYWluaW5nIG5vZGVzLlxubGV0IGlzX2h5ZHJhdGluZyA9IGZhbHNlO1xuZnVuY3Rpb24gc3RhcnRfaHlkcmF0aW5nKCkge1xuICAgIGlzX2h5ZHJhdGluZyA9IHRydWU7XG59XG5mdW5jdGlvbiBlbmRfaHlkcmF0aW5nKCkge1xuICAgIGlzX2h5ZHJhdGluZyA9IGZhbHNlO1xufVxuZnVuY3Rpb24gdXBwZXJfYm91bmQobG93LCBoaWdoLCBrZXksIHZhbHVlKSB7XG4gICAgLy8gUmV0dXJuIGZpcnN0IGluZGV4IG9mIHZhbHVlIGxhcmdlciB0aGFuIGlucHV0IHZhbHVlIGluIHRoZSByYW5nZSBbbG93LCBoaWdoKVxuICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IGxvdyArICgoaGlnaCAtIGxvdykgPj4gMSk7XG4gICAgICAgIGlmIChrZXkobWlkKSA8PSB2YWx1ZSkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvdztcbn1cbmZ1bmN0aW9uIGluaXRfaHlkcmF0ZSh0YXJnZXQpIHtcbiAgICBpZiAodGFyZ2V0Lmh5ZHJhdGVfaW5pdClcbiAgICAgICAgcmV0dXJuO1xuICAgIHRhcmdldC5oeWRyYXRlX2luaXQgPSB0cnVlO1xuICAgIC8vIFdlIGtub3cgdGhhdCBhbGwgY2hpbGRyZW4gaGF2ZSBjbGFpbV9vcmRlciB2YWx1ZXMgc2luY2UgdGhlIHVuY2xhaW1lZCBoYXZlIGJlZW4gZGV0YWNoZWQgaWYgdGFyZ2V0IGlzIG5vdCA8aGVhZD5cbiAgICBsZXQgY2hpbGRyZW4gPSB0YXJnZXQuY2hpbGROb2RlcztcbiAgICAvLyBJZiB0YXJnZXQgaXMgPGhlYWQ+LCB0aGVyZSBtYXkgYmUgY2hpbGRyZW4gd2l0aG91dCBjbGFpbV9vcmRlclxuICAgIGlmICh0YXJnZXQubm9kZU5hbWUgPT09ICdIRUFEJykge1xuICAgICAgICBjb25zdCBteUNoaWxkcmVuID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChub2RlLmNsYWltX29yZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBteUNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4gPSBteUNoaWxkcmVuO1xuICAgIH1cbiAgICAvKlxuICAgICogUmVvcmRlciBjbGFpbWVkIGNoaWxkcmVuIG9wdGltYWxseS5cbiAgICAqIFdlIGNhbiByZW9yZGVyIGNsYWltZWQgY2hpbGRyZW4gb3B0aW1hbGx5IGJ5IGZpbmRpbmcgdGhlIGxvbmdlc3Qgc3Vic2VxdWVuY2Ugb2ZcbiAgICAqIG5vZGVzIHRoYXQgYXJlIGFscmVhZHkgY2xhaW1lZCBpbiBvcmRlciBhbmQgb25seSBtb3ZpbmcgdGhlIHJlc3QuIFRoZSBsb25nZXN0XG4gICAgKiBzdWJzZXF1ZW5jZSBzdWJzZXF1ZW5jZSBvZiBub2RlcyB0aGF0IGFyZSBjbGFpbWVkIGluIG9yZGVyIGNhbiBiZSBmb3VuZCBieVxuICAgICogY29tcHV0aW5nIHRoZSBsb25nZXN0IGluY3JlYXNpbmcgc3Vic2VxdWVuY2Ugb2YgLmNsYWltX29yZGVyIHZhbHVlcy5cbiAgICAqXG4gICAgKiBUaGlzIGFsZ29yaXRobSBpcyBvcHRpbWFsIGluIGdlbmVyYXRpbmcgdGhlIGxlYXN0IGFtb3VudCBvZiByZW9yZGVyIG9wZXJhdGlvbnNcbiAgICAqIHBvc3NpYmxlLlxuICAgICpcbiAgICAqIFByb29mOlxuICAgICogV2Uga25vdyB0aGF0LCBnaXZlbiBhIHNldCBvZiByZW9yZGVyaW5nIG9wZXJhdGlvbnMsIHRoZSBub2RlcyB0aGF0IGRvIG5vdCBtb3ZlXG4gICAgKiBhbHdheXMgZm9ybSBhbiBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlLCBzaW5jZSB0aGV5IGRvIG5vdCBtb3ZlIGFtb25nIGVhY2ggb3RoZXJcbiAgICAqIG1lYW5pbmcgdGhhdCB0aGV5IG11c3QgYmUgYWxyZWFkeSBvcmRlcmVkIGFtb25nIGVhY2ggb3RoZXIuIFRodXMsIHRoZSBtYXhpbWFsXG4gICAgKiBzZXQgb2Ygbm9kZXMgdGhhdCBkbyBub3QgbW92ZSBmb3JtIGEgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlLlxuICAgICovXG4gICAgLy8gQ29tcHV0ZSBsb25nZXN0IGluY3JlYXNpbmcgc3Vic2VxdWVuY2VcbiAgICAvLyBtOiBzdWJzZXF1ZW5jZSBsZW5ndGggaiA9PiBpbmRleCBrIG9mIHNtYWxsZXN0IHZhbHVlIHRoYXQgZW5kcyBhbiBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9mIGxlbmd0aCBqXG4gICAgY29uc3QgbSA9IG5ldyBJbnQzMkFycmF5KGNoaWxkcmVuLmxlbmd0aCArIDEpO1xuICAgIC8vIFByZWRlY2Vzc29yIGluZGljZXMgKyAxXG4gICAgY29uc3QgcCA9IG5ldyBJbnQzMkFycmF5KGNoaWxkcmVuLmxlbmd0aCk7XG4gICAgbVswXSA9IC0xO1xuICAgIGxldCBsb25nZXN0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBjaGlsZHJlbltpXS5jbGFpbV9vcmRlcjtcbiAgICAgICAgLy8gRmluZCB0aGUgbGFyZ2VzdCBzdWJzZXF1ZW5jZSBsZW5ndGggc3VjaCB0aGF0IGl0IGVuZHMgaW4gYSB2YWx1ZSBsZXNzIHRoYW4gb3VyIGN1cnJlbnQgdmFsdWVcbiAgICAgICAgLy8gdXBwZXJfYm91bmQgcmV0dXJucyBmaXJzdCBncmVhdGVyIHZhbHVlLCBzbyB3ZSBzdWJ0cmFjdCBvbmVcbiAgICAgICAgLy8gd2l0aCBmYXN0IHBhdGggZm9yIHdoZW4gd2UgYXJlIG9uIHRoZSBjdXJyZW50IGxvbmdlc3Qgc3Vic2VxdWVuY2VcbiAgICAgICAgY29uc3Qgc2VxTGVuID0gKChsb25nZXN0ID4gMCAmJiBjaGlsZHJlblttW2xvbmdlc3RdXS5jbGFpbV9vcmRlciA8PSBjdXJyZW50KSA/IGxvbmdlc3QgKyAxIDogdXBwZXJfYm91bmQoMSwgbG9uZ2VzdCwgaWR4ID0+IGNoaWxkcmVuW21baWR4XV0uY2xhaW1fb3JkZXIsIGN1cnJlbnQpKSAtIDE7XG4gICAgICAgIHBbaV0gPSBtW3NlcUxlbl0gKyAxO1xuICAgICAgICBjb25zdCBuZXdMZW4gPSBzZXFMZW4gKyAxO1xuICAgICAgICAvLyBXZSBjYW4gZ3VhcmFudGVlIHRoYXQgY3VycmVudCBpcyB0aGUgc21hbGxlc3QgdmFsdWUuIE90aGVyd2lzZSwgd2Ugd291bGQgaGF2ZSBnZW5lcmF0ZWQgYSBsb25nZXIgc2VxdWVuY2UuXG4gICAgICAgIG1bbmV3TGVuXSA9IGk7XG4gICAgICAgIGxvbmdlc3QgPSBNYXRoLm1heChuZXdMZW4sIGxvbmdlc3QpO1xuICAgIH1cbiAgICAvLyBUaGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9mIG5vZGVzIChpbml0aWFsbHkgcmV2ZXJzZWQpXG4gICAgY29uc3QgbGlzID0gW107XG4gICAgLy8gVGhlIHJlc3Qgb2YgdGhlIG5vZGVzLCBub2RlcyB0aGF0IHdpbGwgYmUgbW92ZWRcbiAgICBjb25zdCB0b01vdmUgPSBbXTtcbiAgICBsZXQgbGFzdCA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gICAgZm9yIChsZXQgY3VyID0gbVtsb25nZXN0XSArIDE7IGN1ciAhPSAwOyBjdXIgPSBwW2N1ciAtIDFdKSB7XG4gICAgICAgIGxpcy5wdXNoKGNoaWxkcmVuW2N1ciAtIDFdKTtcbiAgICAgICAgZm9yICg7IGxhc3QgPj0gY3VyOyBsYXN0LS0pIHtcbiAgICAgICAgICAgIHRvTW92ZS5wdXNoKGNoaWxkcmVuW2xhc3RdKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0LS07XG4gICAgfVxuICAgIGZvciAoOyBsYXN0ID49IDA7IGxhc3QtLSkge1xuICAgICAgICB0b01vdmUucHVzaChjaGlsZHJlbltsYXN0XSk7XG4gICAgfVxuICAgIGxpcy5yZXZlcnNlKCk7XG4gICAgLy8gV2Ugc29ydCB0aGUgbm9kZXMgYmVpbmcgbW92ZWQgdG8gZ3VhcmFudGVlIHRoYXQgdGhlaXIgaW5zZXJ0aW9uIG9yZGVyIG1hdGNoZXMgdGhlIGNsYWltIG9yZGVyXG4gICAgdG9Nb3ZlLnNvcnQoKGEsIGIpID0+IGEuY2xhaW1fb3JkZXIgLSBiLmNsYWltX29yZGVyKTtcbiAgICAvLyBGaW5hbGx5LCB3ZSBtb3ZlIHRoZSBub2Rlc1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IHRvTW92ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB3aGlsZSAoaiA8IGxpcy5sZW5ndGggJiYgdG9Nb3ZlW2ldLmNsYWltX29yZGVyID49IGxpc1tqXS5jbGFpbV9vcmRlcikge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IGogPCBsaXMubGVuZ3RoID8gbGlzW2pdIDogbnVsbDtcbiAgICAgICAgdGFyZ2V0Lmluc2VydEJlZm9yZSh0b01vdmVbaV0sIGFuY2hvcik7XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwZW5kKHRhcmdldCwgbm9kZSkge1xuICAgIHRhcmdldC5hcHBlbmRDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9zdHlsZXModGFyZ2V0LCBzdHlsZV9zaGVldF9pZCwgc3R5bGVzKSB7XG4gICAgY29uc3QgYXBwZW5kX3N0eWxlc190byA9IGdldF9yb290X2Zvcl9zdHlsZSh0YXJnZXQpO1xuICAgIGlmICghYXBwZW5kX3N0eWxlc190by5nZXRFbGVtZW50QnlJZChzdHlsZV9zaGVldF9pZCkpIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBlbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZS5pZCA9IHN0eWxlX3NoZWV0X2lkO1xuICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IHN0eWxlcztcbiAgICAgICAgYXBwZW5kX3N0eWxlc2hlZXQoYXBwZW5kX3N0eWxlc190bywgc3R5bGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldF9yb290X2Zvcl9zdHlsZShub2RlKSB7XG4gICAgaWYgKCFub2RlKVxuICAgICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgY29uc3Qgcm9vdCA9IG5vZGUuZ2V0Um9vdE5vZGUgPyBub2RlLmdldFJvb3ROb2RlKCkgOiBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgaWYgKHJvb3QgJiYgcm9vdC5ob3N0KSB7XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50O1xufVxuZnVuY3Rpb24gYXBwZW5kX2VtcHR5X3N0eWxlc2hlZXQobm9kZSkge1xuICAgIGNvbnN0IHN0eWxlX2VsZW1lbnQgPSBlbGVtZW50KCdzdHlsZScpO1xuICAgIGFwcGVuZF9zdHlsZXNoZWV0KGdldF9yb290X2Zvcl9zdHlsZShub2RlKSwgc3R5bGVfZWxlbWVudCk7XG4gICAgcmV0dXJuIHN0eWxlX2VsZW1lbnQuc2hlZXQ7XG59XG5mdW5jdGlvbiBhcHBlbmRfc3R5bGVzaGVldChub2RlLCBzdHlsZSkge1xuICAgIGFwcGVuZChub2RlLmhlYWQgfHwgbm9kZSwgc3R5bGUpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2h5ZHJhdGlvbih0YXJnZXQsIG5vZGUpIHtcbiAgICBpZiAoaXNfaHlkcmF0aW5nKSB7XG4gICAgICAgIGluaXRfaHlkcmF0ZSh0YXJnZXQpO1xuICAgICAgICBpZiAoKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID09PSB1bmRlZmluZWQpIHx8ICgodGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgIT09IG51bGwpICYmICh0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZC5wYXJlbnRFbGVtZW50ICE9PSB0YXJnZXQpKSkge1xuICAgICAgICAgICAgdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTa2lwIG5vZGVzIG9mIHVuZGVmaW5lZCBvcmRlcmluZ1xuICAgICAgICB3aGlsZSAoKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkICE9PSBudWxsKSAmJiAodGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQuY2xhaW1fb3JkZXIgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID0gdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUgIT09IHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkKSB7XG4gICAgICAgICAgICAvLyBXZSBvbmx5IGluc2VydCBpZiB0aGUgb3JkZXJpbmcgb2YgdGhpcyBub2RlIHNob3VsZCBiZSBtb2RpZmllZCBvciB0aGUgcGFyZW50IG5vZGUgaXMgbm90IHRhcmdldFxuICAgICAgICAgICAgaWYgKG5vZGUuY2xhaW1fb3JkZXIgIT09IHVuZGVmaW5lZCB8fCBub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vZGUucGFyZW50Tm9kZSAhPT0gdGFyZ2V0IHx8IG5vZGUubmV4dFNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgYW5jaG9yIHx8IG51bGwpO1xufVxuZnVuY3Rpb24gaW5zZXJ0X2h5ZHJhdGlvbih0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIGlmIChpc19oeWRyYXRpbmcgJiYgIWFuY2hvcikge1xuICAgICAgICBhcHBlbmRfaHlkcmF0aW9uKHRhcmdldCwgbm9kZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vZGUucGFyZW50Tm9kZSAhPT0gdGFyZ2V0IHx8IG5vZGUubmV4dFNpYmxpbmcgIT0gYW5jaG9yKSB7XG4gICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUobm9kZSwgYW5jaG9yIHx8IG51bGwpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaChub2RlKSB7XG4gICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xufVxuZnVuY3Rpb24gZGVzdHJveV9lYWNoKGl0ZXJhdGlvbnMsIGRldGFjaGluZykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoaXRlcmF0aW9uc1tpXSlcbiAgICAgICAgICAgIGl0ZXJhdGlvbnNbaV0uZChkZXRhY2hpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVsZW1lbnQobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpO1xufVxuZnVuY3Rpb24gZWxlbWVudF9pcyhuYW1lLCBpcykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUsIHsgaXMgfSk7XG59XG5mdW5jdGlvbiBvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzKG9iaiwgZXhjbHVkZSkge1xuICAgIGNvbnN0IHRhcmdldCA9IHt9O1xuICAgIGZvciAoY29uc3QgayBpbiBvYmopIHtcbiAgICAgICAgaWYgKGhhc19wcm9wKG9iaiwgaylcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICYmIGV4Y2x1ZGUuaW5kZXhPZihrKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRhcmdldFtrXSA9IG9ialtrXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gc3ZnX2VsZW1lbnQobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgbmFtZSk7XG59XG5mdW5jdGlvbiB0ZXh0KGRhdGEpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YSk7XG59XG5mdW5jdGlvbiBzcGFjZSgpIHtcbiAgICByZXR1cm4gdGV4dCgnICcpO1xufVxuZnVuY3Rpb24gZW1wdHkoKSB7XG4gICAgcmV0dXJuIHRleHQoJycpO1xufVxuZnVuY3Rpb24gbGlzdGVuKG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICByZXR1cm4gKCkgPT4gbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHByZXZlbnRfZGVmYXVsdChmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHN0b3BfcHJvcGFnYXRpb24oZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gc2VsZihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzKVxuICAgICAgICAgICAgZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRydXN0ZWQoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGV2ZW50LmlzVHJ1c3RlZClcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICBlbHNlIGlmIChub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpICE9PSB2YWx1ZSlcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG59XG5mdW5jdGlvbiBzZXRfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobm9kZS5fX3Byb3RvX18pO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS5jc3NUZXh0ID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ19fdmFsdWUnKSB7XG4gICAgICAgICAgICBub2RlLnZhbHVlID0gbm9kZVtrZXldID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlc2NyaXB0b3JzW2tleV0gJiYgZGVzY3JpcHRvcnNba2V5XS5zZXQpIHtcbiAgICAgICAgICAgIG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF0dHIobm9kZSwga2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0X3N2Z19hdHRyaWJ1dGVzKG5vZGUsIGF0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGF0dHIobm9kZSwga2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9jdXN0b21fZWxlbWVudF9kYXRhKG5vZGUsIHByb3AsIHZhbHVlKSB7XG4gICAgaWYgKHByb3AgaW4gbm9kZSkge1xuICAgICAgICBub2RlW3Byb3BdID0gdHlwZW9mIG5vZGVbcHJvcF0gPT09ICdib29sZWFuJyAmJiB2YWx1ZSA9PT0gJycgPyB0cnVlIDogdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhdHRyKG5vZGUsIHByb3AsIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiB4bGlua19hdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBub2RlLnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgYXR0cmlidXRlLCB2YWx1ZSk7XG59XG5mdW5jdGlvbiBnZXRfYmluZGluZ19ncm91cF92YWx1ZShncm91cCwgX192YWx1ZSwgY2hlY2tlZCkge1xuICAgIGNvbnN0IHZhbHVlID0gbmV3IFNldCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGdyb3VwW2ldLmNoZWNrZWQpXG4gICAgICAgICAgICB2YWx1ZS5hZGQoZ3JvdXBbaV0uX192YWx1ZSk7XG4gICAgfVxuICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgICB2YWx1ZS5kZWxldGUoX192YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHRvX251bWJlcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJycgPyBudWxsIDogK3ZhbHVlO1xufVxuZnVuY3Rpb24gdGltZV9yYW5nZXNfdG9fYXJyYXkocmFuZ2VzKSB7XG4gICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBhcnJheS5wdXNoKHsgc3RhcnQ6IHJhbmdlcy5zdGFydChpKSwgZW5kOiByYW5nZXMuZW5kKGkpIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5mdW5jdGlvbiBjaGlsZHJlbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5jaGlsZE5vZGVzKTtcbn1cbmZ1bmN0aW9uIGluaXRfY2xhaW1faW5mbyhub2Rlcykge1xuICAgIGlmIChub2Rlcy5jbGFpbV9pbmZvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm9kZXMuY2xhaW1faW5mbyA9IHsgbGFzdF9pbmRleDogMCwgdG90YWxfY2xhaW1lZDogMCB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsYWltX25vZGUobm9kZXMsIHByZWRpY2F0ZSwgcHJvY2Vzc05vZGUsIGNyZWF0ZU5vZGUsIGRvbnRVcGRhdGVMYXN0SW5kZXggPSBmYWxzZSkge1xuICAgIC8vIFRyeSB0byBmaW5kIG5vZGVzIGluIGFuIG9yZGVyIHN1Y2ggdGhhdCB3ZSBsZW5ndGhlbiB0aGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlXG4gICAgaW5pdF9jbGFpbV9pbmZvKG5vZGVzKTtcbiAgICBjb25zdCByZXN1bHROb2RlID0gKCgpID0+IHtcbiAgICAgICAgLy8gV2UgZmlyc3QgdHJ5IHRvIGZpbmQgYW4gZWxlbWVudCBhZnRlciB0aGUgcHJldmlvdXMgb25lXG4gICAgICAgIGZvciAobGV0IGkgPSBub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXg7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gcHJvY2Vzc05vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNbaV0gPSByZXBsYWNlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkb250VXBkYXRlTGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgd2UgdHJ5IHRvIGZpbmQgb25lIGJlZm9yZVxuICAgICAgICAvLyBXZSBpdGVyYXRlIGluIHJldmVyc2Ugc28gdGhhdCB3ZSBkb24ndCBnbyB0b28gZmFyIGJhY2tcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSBwcm9jZXNzTm9kZShub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBub2Rlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2Rlc1tpXSA9IHJlcGxhY2VtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRvbnRVcGRhdGVMYXN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuY2xhaW1faW5mby5sYXN0X2luZGV4ID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVwbGFjZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBzcGxpY2VkIGJlZm9yZSB0aGUgbGFzdF9pbmRleCwgd2UgZGVjcmVhc2UgaXRcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuY2xhaW1faW5mby5sYXN0X2luZGV4LS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIGNhbid0IGZpbmQgYW55IG1hdGNoaW5nIG5vZGUsIHdlIGNyZWF0ZSBhIG5ldyBvbmVcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUoKTtcbiAgICB9KSgpO1xuICAgIHJlc3VsdE5vZGUuY2xhaW1fb3JkZXIgPSBub2Rlcy5jbGFpbV9pbmZvLnRvdGFsX2NsYWltZWQ7XG4gICAgbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkICs9IDE7XG4gICAgcmV0dXJuIHJlc3VsdE5vZGU7XG59XG5mdW5jdGlvbiBjbGFpbV9lbGVtZW50X2Jhc2Uobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMsIGNyZWF0ZV9lbGVtZW50KSB7XG4gICAgcmV0dXJuIGNsYWltX25vZGUobm9kZXMsIChub2RlKSA9PiBub2RlLm5vZGVOYW1lID09PSBuYW1lLCAobm9kZSkgPT4ge1xuICAgICAgICBjb25zdCByZW1vdmUgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG5vZGUuYXR0cmlidXRlc1tqXTtcbiAgICAgICAgICAgIGlmICghYXR0cmlidXRlc1thdHRyaWJ1dGUubmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZW1vdmUucHVzaChhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlLmZvckVhY2godiA9PiBub2RlLnJlbW92ZUF0dHJpYnV0ZSh2KSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSwgKCkgPT4gY3JlYXRlX2VsZW1lbnQobmFtZSkpO1xufVxuZnVuY3Rpb24gY2xhaW1fZWxlbWVudChub2RlcywgbmFtZSwgYXR0cmlidXRlcykge1xuICAgIHJldHVybiBjbGFpbV9lbGVtZW50X2Jhc2Uobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMsIGVsZW1lbnQpO1xufVxuZnVuY3Rpb24gY2xhaW1fc3ZnX2VsZW1lbnQobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICByZXR1cm4gY2xhaW1fZWxlbWVudF9iYXNlKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBzdmdfZWxlbWVudCk7XG59XG5mdW5jdGlvbiBjbGFpbV90ZXh0KG5vZGVzLCBkYXRhKSB7XG4gICAgcmV0dXJuIGNsYWltX25vZGUobm9kZXMsIChub2RlKSA9PiBub2RlLm5vZGVUeXBlID09PSAzLCAobm9kZSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhU3RyID0gJycgKyBkYXRhO1xuICAgICAgICBpZiAobm9kZS5kYXRhLnN0YXJ0c1dpdGgoZGF0YVN0cikpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmRhdGEubGVuZ3RoICE9PSBkYXRhU3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnNwbGl0VGV4dChkYXRhU3RyLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSBkYXRhU3RyO1xuICAgICAgICB9XG4gICAgfSwgKCkgPT4gdGV4dChkYXRhKSwgdHJ1ZSAvLyBUZXh0IG5vZGVzIHNob3VsZCBub3QgdXBkYXRlIGxhc3QgaW5kZXggc2luY2UgaXQgaXMgbGlrZWx5IG5vdCB3b3J0aCBpdCB0byBlbGltaW5hdGUgYW4gaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSBvZiBhY3R1YWwgZWxlbWVudHNcbiAgICApO1xufVxuZnVuY3Rpb24gY2xhaW1fc3BhY2Uobm9kZXMpIHtcbiAgICByZXR1cm4gY2xhaW1fdGV4dChub2RlcywgJyAnKTtcbn1cbmZ1bmN0aW9uIGZpbmRfY29tbWVudChub2RlcywgdGV4dCwgc3RhcnQpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBub2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSA4IC8qIGNvbW1lbnQgbm9kZSAqLyAmJiBub2RlLnRleHRDb250ZW50LnRyaW0oKSA9PT0gdGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGNsYWltX2h0bWxfdGFnKG5vZGVzLCBpc19zdmcpIHtcbiAgICAvLyBmaW5kIGh0bWwgb3BlbmluZyB0YWdcbiAgICBjb25zdCBzdGFydF9pbmRleCA9IGZpbmRfY29tbWVudChub2RlcywgJ0hUTUxfVEFHX1NUQVJUJywgMCk7XG4gICAgY29uc3QgZW5kX2luZGV4ID0gZmluZF9jb21tZW50KG5vZGVzLCAnSFRNTF9UQUdfRU5EJywgc3RhcnRfaW5kZXgpO1xuICAgIGlmIChzdGFydF9pbmRleCA9PT0gZW5kX2luZGV4KSB7XG4gICAgICAgIHJldHVybiBuZXcgSHRtbFRhZ0h5ZHJhdGlvbih1bmRlZmluZWQsIGlzX3N2Zyk7XG4gICAgfVxuICAgIGluaXRfY2xhaW1faW5mbyhub2Rlcyk7XG4gICAgY29uc3QgaHRtbF90YWdfbm9kZXMgPSBub2Rlcy5zcGxpY2Uoc3RhcnRfaW5kZXgsIGVuZF9pbmRleCAtIHN0YXJ0X2luZGV4ICsgMSk7XG4gICAgZGV0YWNoKGh0bWxfdGFnX25vZGVzWzBdKTtcbiAgICBkZXRhY2goaHRtbF90YWdfbm9kZXNbaHRtbF90YWdfbm9kZXMubGVuZ3RoIC0gMV0pO1xuICAgIGNvbnN0IGNsYWltZWRfbm9kZXMgPSBodG1sX3RhZ19ub2Rlcy5zbGljZSgxLCBodG1sX3RhZ19ub2Rlcy5sZW5ndGggLSAxKTtcbiAgICBmb3IgKGNvbnN0IG4gb2YgY2xhaW1lZF9ub2Rlcykge1xuICAgICAgICBuLmNsYWltX29yZGVyID0gbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkO1xuICAgICAgICBub2Rlcy5jbGFpbV9pbmZvLnRvdGFsX2NsYWltZWQgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBIdG1sVGFnSHlkcmF0aW9uKGNsYWltZWRfbm9kZXMsIGlzX3N2Zyk7XG59XG5mdW5jdGlvbiBzZXRfZGF0YSh0ZXh0LCBkYXRhKSB7XG4gICAgZGF0YSA9ICcnICsgZGF0YTtcbiAgICBpZiAodGV4dC53aG9sZVRleHQgIT09IGRhdGEpXG4gICAgICAgIHRleHQuZGF0YSA9IGRhdGE7XG59XG5mdW5jdGlvbiBzZXRfaW5wdXRfdmFsdWUoaW5wdXQsIHZhbHVlKSB7XG4gICAgaW5wdXQudmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF90eXBlKGlucHV0LCB0eXBlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaW5wdXQudHlwZSA9IHR5cGU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfc3R5bGUobm9kZSwga2V5LCB2YWx1ZSwgaW1wb3J0YW50KSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIG5vZGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoa2V5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSwgaW1wb3J0YW50ID8gJ2ltcG9ydGFudCcgOiAnJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2VsZWN0X29wdGlvbihzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgaWYgKG9wdGlvbi5fX3ZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IC0xOyAvLyBubyBvcHRpb24gc2hvdWxkIGJlIHNlbGVjdGVkXG59XG5mdW5jdGlvbiBzZWxlY3Rfb3B0aW9ucyhzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gfnZhbHVlLmluZGV4T2Yob3B0aW9uLl9fdmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNlbGVjdF92YWx1ZShzZWxlY3QpIHtcbiAgICBjb25zdCBzZWxlY3RlZF9vcHRpb24gPSBzZWxlY3QucXVlcnlTZWxlY3RvcignOmNoZWNrZWQnKSB8fCBzZWxlY3Qub3B0aW9uc1swXTtcbiAgICByZXR1cm4gc2VsZWN0ZWRfb3B0aW9uICYmIHNlbGVjdGVkX29wdGlvbi5fX3ZhbHVlO1xufVxuZnVuY3Rpb24gc2VsZWN0X211bHRpcGxlX3ZhbHVlKHNlbGVjdCkge1xuICAgIHJldHVybiBbXS5tYXAuY2FsbChzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnOmNoZWNrZWQnKSwgb3B0aW9uID0+IG9wdGlvbi5fX3ZhbHVlKTtcbn1cbi8vIHVuZm9ydHVuYXRlbHkgdGhpcyBjYW4ndCBiZSBhIGNvbnN0YW50IGFzIHRoYXQgd291bGRuJ3QgYmUgdHJlZS1zaGFrZWFibGVcbi8vIHNvIHdlIGNhY2hlIHRoZSByZXN1bHQgaW5zdGVhZFxubGV0IGNyb3Nzb3JpZ2luO1xuZnVuY3Rpb24gaXNfY3Jvc3NvcmlnaW4oKSB7XG4gICAgaWYgKGNyb3Nzb3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY3Jvc3NvcmlnaW4gPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgdm9pZCB3aW5kb3cucGFyZW50LmRvY3VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY3Jvc3NvcmlnaW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcm9zc29yaWdpbjtcbn1cbmZ1bmN0aW9uIGFkZF9yZXNpemVfbGlzdGVuZXIobm9kZSwgZm4pIHtcbiAgICBjb25zdCBjb21wdXRlZF9zdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgaWYgKGNvbXB1dGVkX3N0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gICAgY29uc3QgaWZyYW1lID0gZWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyAnICtcbiAgICAgICAgJ292ZXJmbG93OiBoaWRkZW47IGJvcmRlcjogMDsgb3BhY2l0eTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IC0xOycpO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBpZnJhbWUudGFiSW5kZXggPSAtMTtcbiAgICBjb25zdCBjcm9zc29yaWdpbiA9IGlzX2Nyb3Nzb3JpZ2luKCk7XG4gICAgbGV0IHVuc3Vic2NyaWJlO1xuICAgIGlmIChjcm9zc29yaWdpbikge1xuICAgICAgICBpZnJhbWUuc3JjID0gXCJkYXRhOnRleHQvaHRtbCw8c2NyaXB0Pm9ucmVzaXplPWZ1bmN0aW9uKCl7cGFyZW50LnBvc3RNZXNzYWdlKDAsJyonKX08L3NjcmlwdD5cIjtcbiAgICAgICAgdW5zdWJzY3JpYmUgPSBsaXN0ZW4od2luZG93LCAnbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gaWZyYW1lLmNvbnRlbnRXaW5kb3cpXG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZnJhbWUuc3JjID0gJ2Fib3V0OmJsYW5rJztcbiAgICAgICAgaWZyYW1lLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gbGlzdGVuKGlmcmFtZS5jb250ZW50V2luZG93LCAncmVzaXplJywgZm4pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBhcHBlbmQobm9kZSwgaWZyYW1lKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoY3Jvc3NvcmlnaW4pIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodW5zdWJzY3JpYmUgJiYgaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGV0YWNoKGlmcmFtZSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZV9jbGFzcyhlbGVtZW50LCBuYW1lLCB0b2dnbGUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdFt0b2dnbGUgPyAnYWRkJyA6ICdyZW1vdmUnXShuYW1lKTtcbn1cbmZ1bmN0aW9uIGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwsIHsgYnViYmxlcyA9IGZhbHNlLCBjYW5jZWxhYmxlID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgIGUuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIGJ1YmJsZXMsIGNhbmNlbGFibGUsIGRldGFpbCk7XG4gICAgcmV0dXJuIGU7XG59XG5mdW5jdGlvbiBxdWVyeV9zZWxlY3Rvcl9hbGwoc2VsZWN0b3IsIHBhcmVudCA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShwYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xufVxuY2xhc3MgSHRtbFRhZyB7XG4gICAgY29uc3RydWN0b3IoaXNfc3ZnID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5pc19zdmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc19zdmcgPSBpc19zdmc7XG4gICAgICAgIHRoaXMuZSA9IHRoaXMubiA9IG51bGw7XG4gICAgfVxuICAgIGMoaHRtbCkge1xuICAgICAgICB0aGlzLmgoaHRtbCk7XG4gICAgfVxuICAgIG0oaHRtbCwgdGFyZ2V0LCBhbmNob3IgPSBudWxsKSB7XG4gICAgICAgIGlmICghdGhpcy5lKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc19zdmcpXG4gICAgICAgICAgICAgICAgdGhpcy5lID0gc3ZnX2VsZW1lbnQodGFyZ2V0Lm5vZGVOYW1lKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmUgPSBlbGVtZW50KHRhcmdldC5ub2RlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLnQgPSB0YXJnZXQ7XG4gICAgICAgICAgICB0aGlzLmMoaHRtbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pKGFuY2hvcik7XG4gICAgfVxuICAgIGgoaHRtbCkge1xuICAgICAgICB0aGlzLmUuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgdGhpcy5uID0gQXJyYXkuZnJvbSh0aGlzLmUuY2hpbGROb2Rlcyk7XG4gICAgfVxuICAgIGkoYW5jaG9yKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpbnNlcnQodGhpcy50LCB0aGlzLm5baV0sIGFuY2hvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcChodG1sKSB7XG4gICAgICAgIHRoaXMuZCgpO1xuICAgICAgICB0aGlzLmgoaHRtbCk7XG4gICAgICAgIHRoaXMuaSh0aGlzLmEpO1xuICAgIH1cbiAgICBkKCkge1xuICAgICAgICB0aGlzLm4uZm9yRWFjaChkZXRhY2gpO1xuICAgIH1cbn1cbmNsYXNzIEh0bWxUYWdIeWRyYXRpb24gZXh0ZW5kcyBIdG1sVGFnIHtcbiAgICBjb25zdHJ1Y3RvcihjbGFpbWVkX25vZGVzLCBpc19zdmcgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihpc19zdmcpO1xuICAgICAgICB0aGlzLmUgPSB0aGlzLm4gPSBudWxsO1xuICAgICAgICB0aGlzLmwgPSBjbGFpbWVkX25vZGVzO1xuICAgIH1cbiAgICBjKGh0bWwpIHtcbiAgICAgICAgaWYgKHRoaXMubCkge1xuICAgICAgICAgICAgdGhpcy5uID0gdGhpcy5sO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3VwZXIuYyhodG1sKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpKGFuY2hvcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaW5zZXJ0X2h5ZHJhdGlvbih0aGlzLnQsIHRoaXMubltpXSwgYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGF0dHJpYnV0ZV90b19vYmplY3QoYXR0cmlidXRlcykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmVzdWx0W2F0dHJpYnV0ZS5uYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldF9jdXN0b21fZWxlbWVudHNfc2xvdHMoZWxlbWVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGVsZW1lbnQuY2hpbGROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIHJlc3VsdFtub2RlLnNsb3QgfHwgJ2RlZmF1bHQnXSA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gd2UgbmVlZCB0byBzdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIG11bHRpcGxlIGRvY3VtZW50cyBiZWNhdXNlIGEgU3ZlbHRlIGFwcGxpY2F0aW9uIGNvdWxkIGFsc28gY29udGFpbiBpZnJhbWVzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vc3ZlbHRlanMvc3ZlbHRlL2lzc3Vlcy8zNjI0XG5jb25zdCBtYW5hZ2VkX3N0eWxlcyA9IG5ldyBNYXAoKTtcbmxldCBhY3RpdmUgPSAwO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Rhcmtza3lhcHAvc3RyaW5nLWhhc2gvYmxvYi9tYXN0ZXIvaW5kZXguanNcbmZ1bmN0aW9uIGhhc2goc3RyKSB7XG4gICAgbGV0IGhhc2ggPSA1MzgxO1xuICAgIGxldCBpID0gc3RyLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKVxuICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgXiBzdHIuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gaGFzaCA+Pj4gMDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZV9zdHlsZV9pbmZvcm1hdGlvbihkb2MsIG5vZGUpIHtcbiAgICBjb25zdCBpbmZvID0geyBzdHlsZXNoZWV0OiBhcHBlbmRfZW1wdHlfc3R5bGVzaGVldChub2RlKSwgcnVsZXM6IHt9IH07XG4gICAgbWFuYWdlZF9zdHlsZXMuc2V0KGRvYywgaW5mbyk7XG4gICAgcmV0dXJuIGluZm87XG59XG5mdW5jdGlvbiBjcmVhdGVfcnVsZShub2RlLCBhLCBiLCBkdXJhdGlvbiwgZGVsYXksIGVhc2UsIGZuLCB1aWQgPSAwKSB7XG4gICAgY29uc3Qgc3RlcCA9IDE2LjY2NiAvIGR1cmF0aW9uO1xuICAgIGxldCBrZXlmcmFtZXMgPSAne1xcbic7XG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPD0gMTsgcCArPSBzdGVwKSB7XG4gICAgICAgIGNvbnN0IHQgPSBhICsgKGIgLSBhKSAqIGVhc2UocCk7XG4gICAgICAgIGtleWZyYW1lcyArPSBwICogMTAwICsgYCV7JHtmbih0LCAxIC0gdCl9fVxcbmA7XG4gICAgfVxuICAgIGNvbnN0IHJ1bGUgPSBrZXlmcmFtZXMgKyBgMTAwJSB7JHtmbihiLCAxIC0gYil9fVxcbn1gO1xuICAgIGNvbnN0IG5hbWUgPSBgX19zdmVsdGVfJHtoYXNoKHJ1bGUpfV8ke3VpZH1gO1xuICAgIGNvbnN0IGRvYyA9IGdldF9yb290X2Zvcl9zdHlsZShub2RlKTtcbiAgICBjb25zdCB7IHN0eWxlc2hlZXQsIHJ1bGVzIH0gPSBtYW5hZ2VkX3N0eWxlcy5nZXQoZG9jKSB8fCBjcmVhdGVfc3R5bGVfaW5mb3JtYXRpb24oZG9jLCBub2RlKTtcbiAgICBpZiAoIXJ1bGVzW25hbWVdKSB7XG4gICAgICAgIHJ1bGVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgc3R5bGVzaGVldC5pbnNlcnRSdWxlKGBAa2V5ZnJhbWVzICR7bmFtZX0gJHtydWxlfWAsIHN0eWxlc2hlZXQuY3NzUnVsZXMubGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgYW5pbWF0aW9uID0gbm9kZS5zdHlsZS5hbmltYXRpb24gfHwgJyc7XG4gICAgbm9kZS5zdHlsZS5hbmltYXRpb24gPSBgJHthbmltYXRpb24gPyBgJHthbmltYXRpb259LCBgIDogJyd9JHtuYW1lfSAke2R1cmF0aW9ufW1zIGxpbmVhciAke2RlbGF5fW1zIDEgYm90aGA7XG4gICAgYWN0aXZlICs9IDE7XG4gICAgcmV0dXJuIG5hbWU7XG59XG5mdW5jdGlvbiBkZWxldGVfcnVsZShub2RlLCBuYW1lKSB7XG4gICAgY29uc3QgcHJldmlvdXMgPSAobm9kZS5zdHlsZS5hbmltYXRpb24gfHwgJycpLnNwbGl0KCcsICcpO1xuICAgIGNvbnN0IG5leHQgPSBwcmV2aW91cy5maWx0ZXIobmFtZVxuICAgICAgICA/IGFuaW0gPT4gYW5pbS5pbmRleE9mKG5hbWUpIDwgMCAvLyByZW1vdmUgc3BlY2lmaWMgYW5pbWF0aW9uXG4gICAgICAgIDogYW5pbSA9PiBhbmltLmluZGV4T2YoJ19fc3ZlbHRlJykgPT09IC0xIC8vIHJlbW92ZSBhbGwgU3ZlbHRlIGFuaW1hdGlvbnNcbiAgICApO1xuICAgIGNvbnN0IGRlbGV0ZWQgPSBwcmV2aW91cy5sZW5ndGggLSBuZXh0Lmxlbmd0aDtcbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgICBub2RlLnN0eWxlLmFuaW1hdGlvbiA9IG5leHQuam9pbignLCAnKTtcbiAgICAgICAgYWN0aXZlIC09IGRlbGV0ZWQ7XG4gICAgICAgIGlmICghYWN0aXZlKVxuICAgICAgICAgICAgY2xlYXJfcnVsZXMoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbGVhcl9ydWxlcygpIHtcbiAgICByYWYoKCkgPT4ge1xuICAgICAgICBpZiAoYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBtYW5hZ2VkX3N0eWxlcy5mb3JFYWNoKGluZm8gPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBzdHlsZXNoZWV0IH0gPSBpbmZvO1xuICAgICAgICAgICAgbGV0IGkgPSBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChpLS0pXG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldC5kZWxldGVSdWxlKGkpO1xuICAgICAgICAgICAgaW5mby5ydWxlcyA9IHt9O1xuICAgICAgICB9KTtcbiAgICAgICAgbWFuYWdlZF9zdHlsZXMuY2xlYXIoKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlX2FuaW1hdGlvbihub2RlLCBmcm9tLCBmbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFmcm9tKVxuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICBjb25zdCB0byA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGZyb20ubGVmdCA9PT0gdG8ubGVmdCAmJiBmcm9tLnJpZ2h0ID09PSB0by5yaWdodCAmJiBmcm9tLnRvcCA9PT0gdG8udG9wICYmIGZyb20uYm90dG9tID09PSB0by5ib3R0b20pXG4gICAgICAgIHJldHVybiBub29wO1xuICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIFxuICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogc2hvdWxkIHRoaXMgYmUgc2VwYXJhdGVkIGZyb20gZGVzdHJ1Y3R1cmluZz8gT3Igc3RhcnQvZW5kIGFkZGVkIHRvIHB1YmxpYyBhcGkgYW5kIGRvY3VtZW50YXRpb24/XG4gICAgc3RhcnQ6IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5LCBcbiAgICAvLyBAdHMtaWdub3JlIHRvZG86XG4gICAgZW5kID0gc3RhcnRfdGltZSArIGR1cmF0aW9uLCB0aWNrID0gbm9vcCwgY3NzIH0gPSBmbihub2RlLCB7IGZyb20sIHRvIH0sIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IG5hbWU7XG4gICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgIG5hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlbGF5KSB7XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgbmFtZSk7XG4gICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgbG9vcChub3cgPT4ge1xuICAgICAgICBpZiAoIXN0YXJ0ZWQgJiYgbm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGVkICYmIG5vdyA+PSBlbmQpIHtcbiAgICAgICAgICAgIHRpY2soMSwgMCk7XG4gICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBub3cgLSBzdGFydF90aW1lO1xuICAgICAgICAgICAgY29uc3QgdCA9IDAgKyAxICogZWFzaW5nKHAgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBzdGFydCgpO1xuICAgIHRpY2soMCwgMSk7XG4gICAgcmV0dXJuIHN0b3A7XG59XG5mdW5jdGlvbiBmaXhfcG9zaXRpb24obm9kZSkge1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICBpZiAoc3R5bGUucG9zaXRpb24gIT09ICdhYnNvbHV0ZScgJiYgc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZTtcbiAgICAgICAgY29uc3QgYSA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBub2RlLnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBhZGRfdHJhbnNmb3JtKG5vZGUsIGEpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZF90cmFuc2Zvcm0obm9kZSwgYSkge1xuICAgIGNvbnN0IGIgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChhLmxlZnQgIT09IGIubGVmdCB8fCBhLnRvcCAhPT0gYi50b3ApIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBzdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogc3R5bGUudHJhbnNmb3JtO1xuICAgICAgICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RyYW5zZm9ybX0gdHJhbnNsYXRlKCR7YS5sZWZ0IC0gYi5sZWZ0fXB4LCAke2EudG9wIC0gYi50b3B9cHgpYDtcbiAgICB9XG59XG5cbmxldCBjdXJyZW50X2NvbXBvbmVudDtcbmZ1bmN0aW9uIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICBjdXJyZW50X2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGdldF9jdXJyZW50X2NvbXBvbmVudCgpIHtcbiAgICBpZiAoIWN1cnJlbnRfY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNhbGxlZCBvdXRzaWRlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbicpO1xuICAgIHJldHVybiBjdXJyZW50X2NvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGJlZm9yZVVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmJlZm9yZV91cGRhdGUucHVzaChmbik7XG59XG5mdW5jdGlvbiBvbk1vdW50KGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQub25fbW91bnQucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZnRlclVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmFmdGVyX3VwZGF0ZS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIG9uRGVzdHJveShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLm9uX2Rlc3Ryb3kucHVzaChmbik7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudERpc3BhdGNoZXIoKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgcmV0dXJuICh0eXBlLCBkZXRhaWwsIHsgY2FuY2VsYWJsZSA9IGZhbHNlIH0gPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSBjb21wb25lbnQuJCQuY2FsbGJhY2tzW3R5cGVdO1xuICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAvLyBUT0RPIGFyZSB0aGVyZSBzaXR1YXRpb25zIHdoZXJlIGV2ZW50cyBjb3VsZCBiZSBkaXNwYXRjaGVkXG4gICAgICAgICAgICAvLyBpbiBhIHNlcnZlciAobm9uLURPTSkgZW52aXJvbm1lbnQ/XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwsIHsgY2FuY2VsYWJsZSB9KTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4ge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoY29tcG9uZW50LCBldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuZnVuY3Rpb24gc2V0Q29udGV4dChrZXksIGNvbnRleHQpIHtcbiAgICBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LnNldChrZXksIGNvbnRleHQpO1xuICAgIHJldHVybiBjb250ZXh0O1xufVxuZnVuY3Rpb24gZ2V0Q29udGV4dChrZXkpIHtcbiAgICByZXR1cm4gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dC5nZXQoa2V5KTtcbn1cbmZ1bmN0aW9uIGdldEFsbENvbnRleHRzKCkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0O1xufVxuZnVuY3Rpb24gaGFzQ29udGV4dChrZXkpIHtcbiAgICByZXR1cm4gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQuY29udGV4dC5oYXMoa2V5KTtcbn1cbi8vIFRPRE8gZmlndXJlIG91dCBpZiB3ZSBzdGlsbCB3YW50IHRvIHN1cHBvcnRcbi8vIHNob3J0aGFuZCBldmVudHMsIG9yIGlmIHdlIHdhbnQgdG8gaW1wbGVtZW50XG4vLyBhIHJlYWwgYnViYmxpbmcgbWVjaGFuaXNtXG5mdW5jdGlvbiBidWJibGUoY29tcG9uZW50LCBldmVudCkge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IGNvbXBvbmVudC4kJC5jYWxsYmFja3NbZXZlbnQudHlwZV07XG4gICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4gZm4uY2FsbCh0aGlzLCBldmVudCkpO1xuICAgIH1cbn1cblxuY29uc3QgZGlydHlfY29tcG9uZW50cyA9IFtdO1xuY29uc3QgaW50cm9zID0geyBlbmFibGVkOiBmYWxzZSB9O1xuY29uc3QgYmluZGluZ19jYWxsYmFja3MgPSBbXTtcbmNvbnN0IHJlbmRlcl9jYWxsYmFja3MgPSBbXTtcbmNvbnN0IGZsdXNoX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgcmVzb2x2ZWRfcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xubGV0IHVwZGF0ZV9zY2hlZHVsZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIHNjaGVkdWxlX3VwZGF0ZSgpIHtcbiAgICBpZiAoIXVwZGF0ZV9zY2hlZHVsZWQpIHtcbiAgICAgICAgdXBkYXRlX3NjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgIHJlc29sdmVkX3Byb21pc2UudGhlbihmbHVzaCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdGljaygpIHtcbiAgICBzY2hlZHVsZV91cGRhdGUoKTtcbiAgICByZXR1cm4gcmVzb2x2ZWRfcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGFkZF9yZW5kZXJfY2FsbGJhY2soZm4pIHtcbiAgICByZW5kZXJfY2FsbGJhY2tzLnB1c2goZm4pO1xufVxuZnVuY3Rpb24gYWRkX2ZsdXNoX2NhbGxiYWNrKGZuKSB7XG4gICAgZmx1c2hfY2FsbGJhY2tzLnB1c2goZm4pO1xufVxuLy8gZmx1c2goKSBjYWxscyBjYWxsYmFja3MgaW4gdGhpcyBvcmRlcjpcbi8vIDEuIEFsbCBiZWZvcmVVcGRhdGUgY2FsbGJhY2tzLCBpbiBvcmRlcjogcGFyZW50cyBiZWZvcmUgY2hpbGRyZW5cbi8vIDIuIEFsbCBiaW5kOnRoaXMgY2FsbGJhY2tzLCBpbiByZXZlcnNlIG9yZGVyOiBjaGlsZHJlbiBiZWZvcmUgcGFyZW50cy5cbi8vIDMuIEFsbCBhZnRlclVwZGF0ZSBjYWxsYmFja3MsIGluIG9yZGVyOiBwYXJlbnRzIGJlZm9yZSBjaGlsZHJlbi4gRVhDRVBUXG4vLyAgICBmb3IgYWZ0ZXJVcGRhdGVzIGNhbGxlZCBkdXJpbmcgdGhlIGluaXRpYWwgb25Nb3VudCwgd2hpY2ggYXJlIGNhbGxlZCBpblxuLy8gICAgcmV2ZXJzZSBvcmRlcjogY2hpbGRyZW4gYmVmb3JlIHBhcmVudHMuXG4vLyBTaW5jZSBjYWxsYmFja3MgbWlnaHQgdXBkYXRlIGNvbXBvbmVudCB2YWx1ZXMsIHdoaWNoIGNvdWxkIHRyaWdnZXIgYW5vdGhlclxuLy8gY2FsbCB0byBmbHVzaCgpLCB0aGUgZm9sbG93aW5nIHN0ZXBzIGd1YXJkIGFnYWluc3QgdGhpczpcbi8vIDEuIER1cmluZyBiZWZvcmVVcGRhdGUsIGFueSB1cGRhdGVkIGNvbXBvbmVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGVcbi8vICAgIGRpcnR5X2NvbXBvbmVudHMgYXJyYXkgYW5kIHdpbGwgY2F1c2UgYSByZWVudHJhbnQgY2FsbCB0byBmbHVzaCgpLiBCZWNhdXNlXG4vLyAgICB0aGUgZmx1c2ggaW5kZXggaXMga2VwdCBvdXRzaWRlIHRoZSBmdW5jdGlvbiwgdGhlIHJlZW50cmFudCBjYWxsIHdpbGwgcGlja1xuLy8gICAgdXAgd2hlcmUgdGhlIGVhcmxpZXIgY2FsbCBsZWZ0IG9mZiBhbmQgZ28gdGhyb3VnaCBhbGwgZGlydHkgY29tcG9uZW50cy4gVGhlXG4vLyAgICBjdXJyZW50X2NvbXBvbmVudCB2YWx1ZSBpcyBzYXZlZCBhbmQgcmVzdG9yZWQgc28gdGhhdCB0aGUgcmVlbnRyYW50IGNhbGwgd2lsbFxuLy8gICAgbm90IGludGVyZmVyZSB3aXRoIHRoZSBcInBhcmVudFwiIGZsdXNoKCkgY2FsbC5cbi8vIDIuIGJpbmQ6dGhpcyBjYWxsYmFja3MgY2Fubm90IHRyaWdnZXIgbmV3IGZsdXNoKCkgY2FsbHMuXG4vLyAzLiBEdXJpbmcgYWZ0ZXJVcGRhdGUsIGFueSB1cGRhdGVkIGNvbXBvbmVudHMgd2lsbCBOT1QgaGF2ZSB0aGVpciBhZnRlclVwZGF0ZVxuLy8gICAgY2FsbGJhY2sgY2FsbGVkIGEgc2Vjb25kIHRpbWU7IHRoZSBzZWVuX2NhbGxiYWNrcyBzZXQsIG91dHNpZGUgdGhlIGZsdXNoKClcbi8vICAgIGZ1bmN0aW9uLCBndWFyYW50ZWVzIHRoaXMgYmVoYXZpb3IuXG5jb25zdCBzZWVuX2NhbGxiYWNrcyA9IG5ldyBTZXQoKTtcbmxldCBmbHVzaGlkeCA9IDA7IC8vIERvICpub3QqIG1vdmUgdGhpcyBpbnNpZGUgdGhlIGZsdXNoKCkgZnVuY3Rpb25cbmZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIGNvbnN0IHNhdmVkX2NvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuICAgIGRvIHtcbiAgICAgICAgLy8gZmlyc3QsIGNhbGwgYmVmb3JlVXBkYXRlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBhbmQgdXBkYXRlIGNvbXBvbmVudHNcbiAgICAgICAgd2hpbGUgKGZsdXNoaWR4IDwgZGlydHlfY29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGRpcnR5X2NvbXBvbmVudHNbZmx1c2hpZHhdO1xuICAgICAgICAgICAgZmx1c2hpZHgrKztcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpO1xuICAgICAgICAgICAgdXBkYXRlKGNvbXBvbmVudC4kJCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuICAgICAgICBkaXJ0eV9jb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgICAgIGZsdXNoaWR4ID0gMDtcbiAgICAgICAgd2hpbGUgKGJpbmRpbmdfY2FsbGJhY2tzLmxlbmd0aClcbiAgICAgICAgICAgIGJpbmRpbmdfY2FsbGJhY2tzLnBvcCgpKCk7XG4gICAgICAgIC8vIHRoZW4sIG9uY2UgY29tcG9uZW50cyBhcmUgdXBkYXRlZCwgY2FsbFxuICAgICAgICAvLyBhZnRlclVwZGF0ZSBmdW5jdGlvbnMuIFRoaXMgbWF5IGNhdXNlXG4gICAgICAgIC8vIHN1YnNlcXVlbnQgdXBkYXRlcy4uLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcl9jYWxsYmFja3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcmVuZGVyX2NhbGxiYWNrc1tpXTtcbiAgICAgICAgICAgIGlmICghc2Vlbl9jYWxsYmFja3MuaGFzKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgICAgIC8vIC4uLnNvIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgbG9vcHNcbiAgICAgICAgICAgICAgICBzZWVuX2NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgIH0gd2hpbGUgKGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoKTtcbiAgICB3aGlsZSAoZmx1c2hfY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBmbHVzaF9jYWxsYmFja3MucG9wKCkoKTtcbiAgICB9XG4gICAgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIHNlZW5fY2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHNhdmVkX2NvbXBvbmVudCk7XG59XG5mdW5jdGlvbiB1cGRhdGUoJCQpIHtcbiAgICBpZiAoJCQuZnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgJCQudXBkYXRlKCk7XG4gICAgICAgIHJ1bl9hbGwoJCQuYmVmb3JlX3VwZGF0ZSk7XG4gICAgICAgIGNvbnN0IGRpcnR5ID0gJCQuZGlydHk7XG4gICAgICAgICQkLmRpcnR5ID0gWy0xXTtcbiAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQucCgkJC5jdHgsIGRpcnR5KTtcbiAgICAgICAgJCQuYWZ0ZXJfdXBkYXRlLmZvckVhY2goYWRkX3JlbmRlcl9jYWxsYmFjayk7XG4gICAgfVxufVxuXG5sZXQgcHJvbWlzZTtcbmZ1bmN0aW9uIHdhaXQoKSB7XG4gICAgaWYgKCFwcm9taXNlKSB7XG4gICAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHByb21pc2UgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5mdW5jdGlvbiBkaXNwYXRjaChub2RlLCBkaXJlY3Rpb24sIGtpbmQpIHtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQoY3VzdG9tX2V2ZW50KGAke2RpcmVjdGlvbiA/ICdpbnRybycgOiAnb3V0cm8nfSR7a2luZH1gKSk7XG59XG5jb25zdCBvdXRyb2luZyA9IG5ldyBTZXQoKTtcbmxldCBvdXRyb3M7XG5mdW5jdGlvbiBncm91cF9vdXRyb3MoKSB7XG4gICAgb3V0cm9zID0ge1xuICAgICAgICByOiAwLFxuICAgICAgICBjOiBbXSxcbiAgICAgICAgcDogb3V0cm9zIC8vIHBhcmVudCBncm91cFxuICAgIH07XG59XG5mdW5jdGlvbiBjaGVja19vdXRyb3MoKSB7XG4gICAgaWYgKCFvdXRyb3Mucikge1xuICAgICAgICBydW5fYWxsKG91dHJvcy5jKTtcbiAgICB9XG4gICAgb3V0cm9zID0gb3V0cm9zLnA7XG59XG5mdW5jdGlvbiB0cmFuc2l0aW9uX2luKGJsb2NrLCBsb2NhbCkge1xuICAgIGlmIChibG9jayAmJiBibG9jay5pKSB7XG4gICAgICAgIG91dHJvaW5nLmRlbGV0ZShibG9jayk7XG4gICAgICAgIGJsb2NrLmkobG9jYWwpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyYW5zaXRpb25fb3V0KGJsb2NrLCBsb2NhbCwgZGV0YWNoLCBjYWxsYmFjaykge1xuICAgIGlmIChibG9jayAmJiBibG9jay5vKSB7XG4gICAgICAgIGlmIChvdXRyb2luZy5oYXMoYmxvY2spKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBvdXRyb2luZy5hZGQoYmxvY2spO1xuICAgICAgICBvdXRyb3MuYy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgIG91dHJvaW5nLmRlbGV0ZShibG9jayk7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWNoKVxuICAgICAgICAgICAgICAgICAgICBibG9jay5kKDEpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBibG9jay5vKGxvY2FsKTtcbiAgICB9XG59XG5jb25zdCBudWxsX3RyYW5zaXRpb24gPSB7IGR1cmF0aW9uOiAwIH07XG5mdW5jdGlvbiBjcmVhdGVfaW5fdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSBmYWxzZTtcbiAgICBsZXQgYW5pbWF0aW9uX25hbWU7XG4gICAgbGV0IHRhc2s7XG4gICAgbGV0IHVpZCA9IDA7XG4gICAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICAgICAgaWYgKGFuaW1hdGlvbl9uYW1lKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnbygpIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgdGljayA9IG5vb3AsIGNzcyB9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcbiAgICAgICAgaWYgKGNzcylcbiAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgMCwgMSwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcywgdWlkKyspO1xuICAgICAgICB0aWNrKDAsIDEpO1xuICAgICAgICBjb25zdCBzdGFydF90aW1lID0gbm93KCkgKyBkZWxheTtcbiAgICAgICAgY29uc3QgZW5kX3RpbWUgPSBzdGFydF90aW1lICsgZHVyYXRpb247XG4gICAgICAgIGlmICh0YXNrKVxuICAgICAgICAgICAgdGFzay5hYm9ydCgpO1xuICAgICAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCB0cnVlLCAnc3RhcnQnKSk7XG4gICAgICAgIHRhc2sgPSBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChub3cgPj0gZW5kX3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGljaygxLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgdHJ1ZSwgJ2VuZCcpO1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub3cgPj0gc3RhcnRfdGltZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZWFzaW5nKChub3cgLSBzdGFydF90aW1lKSAvIGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgdGljayh0LCAxIC0gdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJ1bm5pbmc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgc3RhcnRlZCA9IGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0KCkge1xuICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlKTtcbiAgICAgICAgICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICAgICAgd2FpdCgpLnRoZW4oZ28pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ28oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW5kKCkge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBjb25zdCBncm91cCA9IG91dHJvcztcbiAgICBncm91cC5yICs9IDE7XG4gICAgZnVuY3Rpb24gZ28oKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGlmIChjc3MpXG4gICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDEsIDAsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICBjb25zdCBzdGFydF90aW1lID0gbm93KCkgKyBkZWxheTtcbiAgICAgICAgY29uc3QgZW5kX3RpbWUgPSBzdGFydF90aW1lICsgZHVyYXRpb247XG4gICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdzdGFydCcpKTtcbiAgICAgICAgbG9vcChub3cgPT4ge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93ID49IGVuZF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIGZhbHNlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghLS1ncm91cC5yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgcmVzdWx0IGluIGBlbmQoKWAgYmVpbmcgY2FsbGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBjbGVhbiB1cCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5fYWxsKGdyb3VwLmMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEgLSB0LCB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgIHdhaXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZygpO1xuICAgICAgICAgICAgZ28oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnbygpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBlbmQocmVzZXQpIHtcbiAgICAgICAgICAgIGlmIChyZXNldCAmJiBjb25maWcudGljaykge1xuICAgICAgICAgICAgICAgIGNvbmZpZy50aWNrKDEsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUsIGFuaW1hdGlvbl9uYW1lKTtcbiAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbihub2RlLCBmbiwgcGFyYW1zLCBpbnRybykge1xuICAgIGxldCBjb25maWcgPSBmbihub2RlLCBwYXJhbXMpO1xuICAgIGxldCB0ID0gaW50cm8gPyAwIDogMTtcbiAgICBsZXQgcnVubmluZ19wcm9ncmFtID0gbnVsbDtcbiAgICBsZXQgcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICBsZXQgYW5pbWF0aW9uX25hbWUgPSBudWxsO1xuICAgIGZ1bmN0aW9uIGNsZWFyX2FuaW1hdGlvbigpIHtcbiAgICAgICAgaWYgKGFuaW1hdGlvbl9uYW1lKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbml0KHByb2dyYW0sIGR1cmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGQgPSAocHJvZ3JhbS5iIC0gdCk7XG4gICAgICAgIGR1cmF0aW9uICo9IE1hdGguYWJzKGQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYTogdCxcbiAgICAgICAgICAgIGI6IHByb2dyYW0uYixcbiAgICAgICAgICAgIGQsXG4gICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgIHN0YXJ0OiBwcm9ncmFtLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBwcm9ncmFtLnN0YXJ0ICsgZHVyYXRpb24sXG4gICAgICAgICAgICBncm91cDogcHJvZ3JhbS5ncm91cFxuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnbyhiKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB7XG4gICAgICAgICAgICBzdGFydDogbm93KCkgKyBkZWxheSxcbiAgICAgICAgICAgIGJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFiKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHRvZG86IGltcHJvdmUgdHlwaW5nc1xuICAgICAgICAgICAgcHJvZ3JhbS5ncm91cCA9IG91dHJvcztcbiAgICAgICAgICAgIG91dHJvcy5yICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bm5pbmdfcHJvZ3JhbSB8fCBwZW5kaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgIHBlbmRpbmdfcHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGludHJvLCBhbmQgdGhlcmUncyBhIGRlbGF5LCB3ZSBuZWVkIHRvIGRvXG4gICAgICAgICAgICAvLyBhbiBpbml0aWFsIHRpY2sgYW5kL29yIGFwcGx5IENTUyBhbmltYXRpb24gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIHQsIGIsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGIpXG4gICAgICAgICAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IGluaXQocHJvZ3JhbSwgZHVyYXRpb24pO1xuICAgICAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCBiLCAnc3RhcnQnKSk7XG4gICAgICAgICAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdfcHJvZ3JhbSAmJiBub3cgPiBwZW5kaW5nX3Byb2dyYW0uc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gaW5pdChwZW5kaW5nX3Byb2dyYW0sIGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgcnVubmluZ19wcm9ncmFtLmIsICdzdGFydCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3NzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgdCwgcnVubmluZ19wcm9ncmFtLmIsIHJ1bm5pbmdfcHJvZ3JhbS5kdXJhdGlvbiwgMCwgZWFzaW5nLCBjb25maWcuY3NzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub3cgPj0gcnVubmluZ19wcm9ncmFtLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGljayh0ID0gcnVubmluZ19wcm9ncmFtLmIsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIHJ1bm5pbmdfcHJvZ3JhbS5iLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGRvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtLmIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cm8gXHUyMDE0IHdlIGNhbiB0aWR5IHVwIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cm8gXHUyMDE0IG5lZWRzIHRvIGJlIGNvb3JkaW5hdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghLS1ydW5uaW5nX3Byb2dyYW0uZ3JvdXAucilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hbGwocnVubmluZ19wcm9ncmFtLmdyb3VwLmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm93ID49IHJ1bm5pbmdfcHJvZ3JhbS5zdGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IG5vdyAtIHJ1bm5pbmdfcHJvZ3JhbS5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBydW5uaW5nX3Byb2dyYW0uYSArIHJ1bm5pbmdfcHJvZ3JhbS5kICogZWFzaW5nKHAgLyBydW5uaW5nX3Byb2dyYW0uZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGljayh0LCAxIC0gdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhKHJ1bm5pbmdfcHJvZ3JhbSB8fCBwZW5kaW5nX3Byb2dyYW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcnVuKGIpIHtcbiAgICAgICAgICAgIGlmIChpc19mdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgd2FpdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZygpO1xuICAgICAgICAgICAgICAgICAgICBnbyhiKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGdvKGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbmQoKSB7XG4gICAgICAgICAgICBjbGVhcl9hbmltYXRpb24oKTtcbiAgICAgICAgICAgIHJ1bm5pbmdfcHJvZ3JhbSA9IHBlbmRpbmdfcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBoYW5kbGVfcHJvbWlzZShwcm9taXNlLCBpbmZvKSB7XG4gICAgY29uc3QgdG9rZW4gPSBpbmZvLnRva2VuID0ge307XG4gICAgZnVuY3Rpb24gdXBkYXRlKHR5cGUsIGluZGV4LCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChpbmZvLnRva2VuICE9PSB0b2tlbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaW5mby5yZXNvbHZlZCA9IHZhbHVlO1xuICAgICAgICBsZXQgY2hpbGRfY3R4ID0gaW5mby5jdHg7XG4gICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2hpbGRfY3R4ID0gY2hpbGRfY3R4LnNsaWNlKCk7XG4gICAgICAgICAgICBjaGlsZF9jdHhba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJsb2NrID0gdHlwZSAmJiAoaW5mby5jdXJyZW50ID0gdHlwZSkoY2hpbGRfY3R4KTtcbiAgICAgICAgbGV0IG5lZWRzX2ZsdXNoID0gZmFsc2U7XG4gICAgICAgIGlmIChpbmZvLmJsb2NrKSB7XG4gICAgICAgICAgICBpZiAoaW5mby5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICBpbmZvLmJsb2Nrcy5mb3JFYWNoKChibG9jaywgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gaW5kZXggJiYgYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX291dHJvcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbl9vdXQoYmxvY2ssIDEsIDEsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5ibG9ja3NbaV0gPT09IGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYmxvY2tzW2ldID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX291dHJvcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmZvLmJsb2NrLmQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBibG9jay5jKCk7XG4gICAgICAgICAgICB0cmFuc2l0aW9uX2luKGJsb2NrLCAxKTtcbiAgICAgICAgICAgIGJsb2NrLm0oaW5mby5tb3VudCgpLCBpbmZvLmFuY2hvcik7XG4gICAgICAgICAgICBuZWVkc19mbHVzaCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5ibG9jayA9IGJsb2NrO1xuICAgICAgICBpZiAoaW5mby5ibG9ja3MpXG4gICAgICAgICAgICBpbmZvLmJsb2Nrc1tpbmRleF0gPSBibG9jaztcbiAgICAgICAgaWYgKG5lZWRzX2ZsdXNoKSB7XG4gICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc19wcm9taXNlKHByb21pc2UpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRfY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgICAgIHByb21pc2UudGhlbih2YWx1ZSA9PiB7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY3VycmVudF9jb21wb25lbnQpO1xuICAgICAgICAgICAgdXBkYXRlKGluZm8udGhlbiwgMSwgaW5mby52YWx1ZSwgdmFsdWUpO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY3VycmVudF9jb21wb25lbnQpO1xuICAgICAgICAgICAgdXBkYXRlKGluZm8uY2F0Y2gsIDIsIGluZm8uZXJyb3IsIGVycm9yKTtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChudWxsKTtcbiAgICAgICAgICAgIGlmICghaW5mby5oYXNDYXRjaCkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYgd2UgcHJldmlvdXNseSBoYWQgYSB0aGVuL2NhdGNoIGJsb2NrLCBkZXN0cm95IGl0XG4gICAgICAgIGlmIChpbmZvLmN1cnJlbnQgIT09IGluZm8ucGVuZGluZykge1xuICAgICAgICAgICAgdXBkYXRlKGluZm8ucGVuZGluZywgMCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGluZm8uY3VycmVudCAhPT0gaW5mby50aGVuKSB7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby50aGVuLCAxLCBpbmZvLnZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGluZm8ucmVzb2x2ZWQgPSBwcm9taXNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZV9hd2FpdF9ibG9ja19icmFuY2goaW5mbywgY3R4LCBkaXJ0eSkge1xuICAgIGNvbnN0IGNoaWxkX2N0eCA9IGN0eC5zbGljZSgpO1xuICAgIGNvbnN0IHsgcmVzb2x2ZWQgfSA9IGluZm87XG4gICAgaWYgKGluZm8uY3VycmVudCA9PT0gaW5mby50aGVuKSB7XG4gICAgICAgIGNoaWxkX2N0eFtpbmZvLnZhbHVlXSA9IHJlc29sdmVkO1xuICAgIH1cbiAgICBpZiAoaW5mby5jdXJyZW50ID09PSBpbmZvLmNhdGNoKSB7XG4gICAgICAgIGNoaWxkX2N0eFtpbmZvLmVycm9yXSA9IHJlc29sdmVkO1xuICAgIH1cbiAgICBpbmZvLmJsb2NrLnAoY2hpbGRfY3R4LCBkaXJ0eSk7XG59XG5cbmNvbnN0IGdsb2JhbHMgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IHdpbmRvd1xuICAgIDogdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gZ2xvYmFsVGhpc1xuICAgICAgICA6IGdsb2JhbCk7XG5cbmZ1bmN0aW9uIGRlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmQoMSk7XG4gICAgbG9va3VwLmRlbGV0ZShibG9jay5rZXkpO1xufVxuZnVuY3Rpb24gb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIHRyYW5zaXRpb25fb3V0KGJsb2NrLCAxLCAxLCAoKSA9PiB7XG4gICAgICAgIGxvb2t1cC5kZWxldGUoYmxvY2sua2V5KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGZpeF9hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZigpO1xuICAgIGRlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCk7XG59XG5mdW5jdGlvbiBmaXhfYW5kX291dHJvX2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5mKCk7XG4gICAgb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCk7XG59XG5mdW5jdGlvbiB1cGRhdGVfa2V5ZWRfZWFjaChvbGRfYmxvY2tzLCBkaXJ0eSwgZ2V0X2tleSwgZHluYW1pYywgY3R4LCBsaXN0LCBsb29rdXAsIG5vZGUsIGRlc3Ryb3ksIGNyZWF0ZV9lYWNoX2Jsb2NrLCBuZXh0LCBnZXRfY29udGV4dCkge1xuICAgIGxldCBvID0gb2xkX2Jsb2Nrcy5sZW5ndGg7XG4gICAgbGV0IG4gPSBsaXN0Lmxlbmd0aDtcbiAgICBsZXQgaSA9IG87XG4gICAgY29uc3Qgb2xkX2luZGV4ZXMgPSB7fTtcbiAgICB3aGlsZSAoaS0tKVxuICAgICAgICBvbGRfaW5kZXhlc1tvbGRfYmxvY2tzW2ldLmtleV0gPSBpO1xuICAgIGNvbnN0IG5ld19ibG9ja3MgPSBbXTtcbiAgICBjb25zdCBuZXdfbG9va3VwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGRlbHRhcyA9IG5ldyBNYXAoKTtcbiAgICBpID0gbjtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkX2N0eCA9IGdldF9jb250ZXh0KGN0eCwgbGlzdCwgaSk7XG4gICAgICAgIGNvbnN0IGtleSA9IGdldF9rZXkoY2hpbGRfY3R4KTtcbiAgICAgICAgbGV0IGJsb2NrID0gbG9va3VwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWJsb2NrKSB7XG4gICAgICAgICAgICBibG9jayA9IGNyZWF0ZV9lYWNoX2Jsb2NrKGtleSwgY2hpbGRfY3R4KTtcbiAgICAgICAgICAgIGJsb2NrLmMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkeW5hbWljKSB7XG4gICAgICAgICAgICBibG9jay5wKGNoaWxkX2N0eCwgZGlydHkpO1xuICAgICAgICB9XG4gICAgICAgIG5ld19sb29rdXAuc2V0KGtleSwgbmV3X2Jsb2Nrc1tpXSA9IGJsb2NrKTtcbiAgICAgICAgaWYgKGtleSBpbiBvbGRfaW5kZXhlcylcbiAgICAgICAgICAgIGRlbHRhcy5zZXQoa2V5LCBNYXRoLmFicyhpIC0gb2xkX2luZGV4ZXNba2V5XSkpO1xuICAgIH1cbiAgICBjb25zdCB3aWxsX21vdmUgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgZGlkX21vdmUgPSBuZXcgU2V0KCk7XG4gICAgZnVuY3Rpb24gaW5zZXJ0KGJsb2NrKSB7XG4gICAgICAgIHRyYW5zaXRpb25faW4oYmxvY2ssIDEpO1xuICAgICAgICBibG9jay5tKG5vZGUsIG5leHQpO1xuICAgICAgICBsb29rdXAuc2V0KGJsb2NrLmtleSwgYmxvY2spO1xuICAgICAgICBuZXh0ID0gYmxvY2suZmlyc3Q7XG4gICAgICAgIG4tLTtcbiAgICB9XG4gICAgd2hpbGUgKG8gJiYgbikge1xuICAgICAgICBjb25zdCBuZXdfYmxvY2sgPSBuZXdfYmxvY2tzW24gLSAxXTtcbiAgICAgICAgY29uc3Qgb2xkX2Jsb2NrID0gb2xkX2Jsb2Nrc1tvIC0gMV07XG4gICAgICAgIGNvbnN0IG5ld19rZXkgPSBuZXdfYmxvY2sua2V5O1xuICAgICAgICBjb25zdCBvbGRfa2V5ID0gb2xkX2Jsb2NrLmtleTtcbiAgICAgICAgaWYgKG5ld19ibG9jayA9PT0gb2xkX2Jsb2NrKSB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgICBuZXh0ID0gbmV3X2Jsb2NrLmZpcnN0O1xuICAgICAgICAgICAgby0tO1xuICAgICAgICAgICAgbi0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFuZXdfbG9va3VwLmhhcyhvbGRfa2V5KSkge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCBibG9ja1xuICAgICAgICAgICAgZGVzdHJveShvbGRfYmxvY2ssIGxvb2t1cCk7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWxvb2t1cC5oYXMobmV3X2tleSkgfHwgd2lsbF9tb3ZlLmhhcyhuZXdfa2V5KSkge1xuICAgICAgICAgICAgaW5zZXJ0KG5ld19ibG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlkX21vdmUuaGFzKG9sZF9rZXkpKSB7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGVsdGFzLmdldChuZXdfa2V5KSA+IGRlbHRhcy5nZXQob2xkX2tleSkpIHtcbiAgICAgICAgICAgIGRpZF9tb3ZlLmFkZChuZXdfa2V5KTtcbiAgICAgICAgICAgIGluc2VydChuZXdfYmxvY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2lsbF9tb3ZlLmFkZChvbGRfa2V5KTtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoby0tKSB7XG4gICAgICAgIGNvbnN0IG9sZF9ibG9jayA9IG9sZF9ibG9ja3Nbb107XG4gICAgICAgIGlmICghbmV3X2xvb2t1cC5oYXMob2xkX2Jsb2NrLmtleSkpXG4gICAgICAgICAgICBkZXN0cm95KG9sZF9ibG9jaywgbG9va3VwKTtcbiAgICB9XG4gICAgd2hpbGUgKG4pXG4gICAgICAgIGluc2VydChuZXdfYmxvY2tzW24gLSAxXSk7XG4gICAgcmV0dXJuIG5ld19ibG9ja3M7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9lYWNoX2tleXMoY3R4LCBsaXN0LCBnZXRfY29udGV4dCwgZ2V0X2tleSkge1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGdldF9rZXkoZ2V0X2NvbnRleHQoY3R4LCBsaXN0LCBpKSk7XG4gICAgICAgIGlmIChrZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBoYXZlIGR1cGxpY2F0ZSBrZXlzIGluIGEga2V5ZWQgZWFjaCcpO1xuICAgICAgICB9XG4gICAgICAgIGtleXMuYWRkKGtleSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRfc3ByZWFkX3VwZGF0ZShsZXZlbHMsIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB1cGRhdGUgPSB7fTtcbiAgICBjb25zdCB0b19udWxsX291dCA9IHt9O1xuICAgIGNvbnN0IGFjY291bnRlZF9mb3IgPSB7ICQkc2NvcGU6IDEgfTtcbiAgICBsZXQgaSA9IGxldmVscy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBjb25zdCBvID0gbGV2ZWxzW2ldO1xuICAgICAgICBjb25zdCBuID0gdXBkYXRlc1tpXTtcbiAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG8pIHtcbiAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gbikpXG4gICAgICAgICAgICAgICAgICAgIHRvX251bGxfb3V0W2tleV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbikge1xuICAgICAgICAgICAgICAgIGlmICghYWNjb3VudGVkX2ZvcltrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVtrZXldID0gbltrZXldO1xuICAgICAgICAgICAgICAgICAgICBhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldmVsc1tpXSA9IG47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvKSB7XG4gICAgICAgICAgICAgICAgYWNjb3VudGVkX2ZvcltrZXldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0b19udWxsX291dCkge1xuICAgICAgICBpZiAoIShrZXkgaW4gdXBkYXRlKSlcbiAgICAgICAgICAgIHVwZGF0ZVtrZXldID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdXBkYXRlO1xufVxuZnVuY3Rpb24gZ2V0X3NwcmVhZF9vYmplY3Qoc3ByZWFkX3Byb3BzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzcHJlYWRfcHJvcHMgPT09ICdvYmplY3QnICYmIHNwcmVhZF9wcm9wcyAhPT0gbnVsbCA/IHNwcmVhZF9wcm9wcyA6IHt9O1xufVxuXG4vLyBzb3VyY2U6IGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZGljZXMuaHRtbFxuY29uc3QgYm9vbGVhbl9hdHRyaWJ1dGVzID0gbmV3IFNldChbXG4gICAgJ2FsbG93ZnVsbHNjcmVlbicsXG4gICAgJ2FsbG93cGF5bWVudHJlcXVlc3QnLFxuICAgICdhc3luYycsXG4gICAgJ2F1dG9mb2N1cycsXG4gICAgJ2F1dG9wbGF5JyxcbiAgICAnY2hlY2tlZCcsXG4gICAgJ2NvbnRyb2xzJyxcbiAgICAnZGVmYXVsdCcsXG4gICAgJ2RlZmVyJyxcbiAgICAnZGlzYWJsZWQnLFxuICAgICdmb3Jtbm92YWxpZGF0ZScsXG4gICAgJ2hpZGRlbicsXG4gICAgJ2lzbWFwJyxcbiAgICAnbG9vcCcsXG4gICAgJ211bHRpcGxlJyxcbiAgICAnbXV0ZWQnLFxuICAgICdub21vZHVsZScsXG4gICAgJ25vdmFsaWRhdGUnLFxuICAgICdvcGVuJyxcbiAgICAncGxheXNpbmxpbmUnLFxuICAgICdyZWFkb25seScsXG4gICAgJ3JlcXVpcmVkJyxcbiAgICAncmV2ZXJzZWQnLFxuICAgICdzZWxlY3RlZCdcbl0pO1xuXG5jb25zdCB2b2lkX2VsZW1lbnRfbmFtZXMgPSAvXig/OmFyZWF8YmFzZXxicnxjb2x8Y29tbWFuZHxlbWJlZHxocnxpbWd8aW5wdXR8a2V5Z2VufGxpbmt8bWV0YXxwYXJhbXxzb3VyY2V8dHJhY2t8d2JyKSQvO1xuZnVuY3Rpb24gaXNfdm9pZChuYW1lKSB7XG4gICAgcmV0dXJuIHZvaWRfZWxlbWVudF9uYW1lcy50ZXN0KG5hbWUpIHx8IG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJyFkb2N0eXBlJztcbn1cblxuY29uc3QgaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIgPSAvW1xccydcIj4vPVxcdXtGREQwfS1cXHV7RkRFRn1cXHV7RkZGRX1cXHV7RkZGRn1cXHV7MUZGRkV9XFx1ezFGRkZGfVxcdXsyRkZGRX1cXHV7MkZGRkZ9XFx1ezNGRkZFfVxcdXszRkZGRn1cXHV7NEZGRkV9XFx1ezRGRkZGfVxcdXs1RkZGRX1cXHV7NUZGRkZ9XFx1ezZGRkZFfVxcdXs2RkZGRn1cXHV7N0ZGRkV9XFx1ezdGRkZGfVxcdXs4RkZGRX1cXHV7OEZGRkZ9XFx1ezlGRkZFfVxcdXs5RkZGRn1cXHV7QUZGRkV9XFx1e0FGRkZGfVxcdXtCRkZGRX1cXHV7QkZGRkZ9XFx1e0NGRkZFfVxcdXtDRkZGRn1cXHV7REZGRkV9XFx1e0RGRkZGfVxcdXtFRkZGRX1cXHV7RUZGRkZ9XFx1e0ZGRkZFfVxcdXtGRkZGRn1cXHV7MTBGRkZFfVxcdXsxMEZGRkZ9XS91O1xuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yXG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jbm9uY2hhcmFjdGVyXG5mdW5jdGlvbiBzcHJlYWQoYXJncywgYXR0cnNfdG9fYWRkKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpO1xuICAgIGlmIChhdHRyc190b19hZGQpIHtcbiAgICAgICAgY29uc3QgY2xhc3Nlc190b19hZGQgPSBhdHRyc190b19hZGQuY2xhc3NlcztcbiAgICAgICAgY29uc3Qgc3R5bGVzX3RvX2FkZCA9IGF0dHJzX3RvX2FkZC5zdHlsZXM7XG4gICAgICAgIGlmIChjbGFzc2VzX3RvX2FkZCkge1xuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY2xhc3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuY2xhc3MgPSBjbGFzc2VzX3RvX2FkZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuY2xhc3MgKz0gJyAnICsgY2xhc3Nlc190b19hZGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0eWxlc190b19hZGQpIHtcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLnN0eWxlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnN0eWxlID0gc3R5bGVfb2JqZWN0X3RvX3N0cmluZyhzdHlsZXNfdG9fYWRkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuc3R5bGUgPSBzdHlsZV9vYmplY3RfdG9fc3RyaW5nKG1lcmdlX3Nzcl9zdHlsZXMoYXR0cmlidXRlcy5zdHlsZSwgc3R5bGVzX3RvX2FkZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzdHIgPSAnJztcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBpZiAoaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIudGVzdChuYW1lKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICBzdHIgKz0gJyAnICsgbmFtZTtcbiAgICAgICAgZWxzZSBpZiAoYm9vbGVhbl9hdHRyaWJ1dGVzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgc3RyICs9ICcgJyArIG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3RyICs9IGAgJHtuYW1lfT1cIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbn1cbmZ1bmN0aW9uIG1lcmdlX3Nzcl9zdHlsZXMoc3R5bGVfYXR0cmlidXRlLCBzdHlsZV9kaXJlY3RpdmUpIHtcbiAgICBjb25zdCBzdHlsZV9vYmplY3QgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGluZGl2aWR1YWxfc3R5bGUgb2Ygc3R5bGVfYXR0cmlidXRlLnNwbGl0KCc7JykpIHtcbiAgICAgICAgY29uc3QgY29sb25faW5kZXggPSBpbmRpdmlkdWFsX3N0eWxlLmluZGV4T2YoJzonKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IGluZGl2aWR1YWxfc3R5bGUuc2xpY2UoMCwgY29sb25faW5kZXgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpbmRpdmlkdWFsX3N0eWxlLnNsaWNlKGNvbG9uX2luZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICBpZiAoIW5hbWUpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgc3R5bGVfb2JqZWN0W25hbWVdID0gdmFsdWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbmFtZSBpbiBzdHlsZV9kaXJlY3RpdmUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzdHlsZV9kaXJlY3RpdmVbbmFtZV07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgc3R5bGVfb2JqZWN0W25hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgc3R5bGVfb2JqZWN0W25hbWVdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHlsZV9vYmplY3Q7XG59XG5jb25zdCBlc2NhcGVkID0ge1xuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnLFxuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7J1xufTtcbmZ1bmN0aW9uIGVzY2FwZShodG1sKSB7XG4gICAgcmV0dXJuIFN0cmluZyhodG1sKS5yZXBsYWNlKC9bXCInJjw+XS9nLCBtYXRjaCA9PiBlc2NhcGVkW21hdGNoXSk7XG59XG5mdW5jdGlvbiBlc2NhcGVfYXR0cmlidXRlX3ZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBlc2NhcGUodmFsdWUpIDogdmFsdWU7XG59XG5mdW5jdGlvbiBlc2NhcGVfb2JqZWN0KG9iaikge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICByZXN1bHRba2V5XSA9IGVzY2FwZV9hdHRyaWJ1dGVfdmFsdWUob2JqW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZWFjaChpdGVtcywgZm4pIHtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBzdHIgKz0gZm4oaXRlbXNbaV0sIGkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuY29uc3QgbWlzc2luZ19jb21wb25lbnQgPSB7XG4gICAgJCRyZW5kZXI6ICgpID0+ICcnXG59O1xuZnVuY3Rpb24gdmFsaWRhdGVfY29tcG9uZW50KGNvbXBvbmVudCwgbmFtZSkge1xuICAgIGlmICghY29tcG9uZW50IHx8ICFjb21wb25lbnQuJCRyZW5kZXIpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdzdmVsdGU6Y29tcG9uZW50JylcbiAgICAgICAgICAgIG5hbWUgKz0gJyB0aGlzPXsuLi59JztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGA8JHtuYW1lfT4gaXMgbm90IGEgdmFsaWQgU1NSIGNvbXBvbmVudC4gWW91IG1heSBuZWVkIHRvIHJldmlldyB5b3VyIGJ1aWxkIGNvbmZpZyB0byBlbnN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGNvbXBpbGVkLCByYXRoZXIgdGhhbiBpbXBvcnRlZCBhcyBwcmUtY29tcGlsZWQgbW9kdWxlc2ApO1xuICAgIH1cbiAgICByZXR1cm4gY29tcG9uZW50O1xufVxuZnVuY3Rpb24gZGVidWcoZmlsZSwgbGluZSwgY29sdW1uLCB2YWx1ZXMpIHtcbiAgICBjb25zb2xlLmxvZyhge0BkZWJ1Z30gJHtmaWxlID8gZmlsZSArICcgJyA6ICcnfSgke2xpbmV9OiR7Y29sdW1ufSlgKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2codmFsdWVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgcmV0dXJuICcnO1xufVxubGV0IG9uX2Rlc3Ryb3k7XG5mdW5jdGlvbiBjcmVhdGVfc3NyX2NvbXBvbmVudChmbikge1xuICAgIGZ1bmN0aW9uICQkcmVuZGVyKHJlc3VsdCwgcHJvcHMsIGJpbmRpbmdzLCBzbG90cywgY29udGV4dCkge1xuICAgICAgICBjb25zdCBwYXJlbnRfY29tcG9uZW50ID0gY3VycmVudF9jb21wb25lbnQ7XG4gICAgICAgIGNvbnN0ICQkID0ge1xuICAgICAgICAgICAgb25fZGVzdHJveSxcbiAgICAgICAgICAgIGNvbnRleHQ6IG5ldyBNYXAoY29udGV4dCB8fCAocGFyZW50X2NvbXBvbmVudCA/IHBhcmVudF9jb21wb25lbnQuJCQuY29udGV4dCA6IFtdKSksXG4gICAgICAgICAgICAvLyB0aGVzZSB3aWxsIGJlIGltbWVkaWF0ZWx5IGRpc2NhcmRlZFxuICAgICAgICAgICAgb25fbW91bnQ6IFtdLFxuICAgICAgICAgICAgYmVmb3JlX3VwZGF0ZTogW10sXG4gICAgICAgICAgICBhZnRlcl91cGRhdGU6IFtdLFxuICAgICAgICAgICAgY2FsbGJhY2tzOiBibGFua19vYmplY3QoKVxuICAgICAgICB9O1xuICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoeyAkJCB9KTtcbiAgICAgICAgY29uc3QgaHRtbCA9IGZuKHJlc3VsdCwgcHJvcHMsIGJpbmRpbmdzLCBzbG90cyk7XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChwYXJlbnRfY29tcG9uZW50KTtcbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJlbmRlcjogKHByb3BzID0ge30sIHsgJCRzbG90cyA9IHt9LCBjb250ZXh0ID0gbmV3IE1hcCgpIH0gPSB7fSkgPT4ge1xuICAgICAgICAgICAgb25fZGVzdHJveSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB0aXRsZTogJycsIGhlYWQ6ICcnLCBjc3M6IG5ldyBTZXQoKSB9O1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9ICQkcmVuZGVyKHJlc3VsdCwgcHJvcHMsIHt9LCAkJHNsb3RzLCBjb250ZXh0KTtcbiAgICAgICAgICAgIHJ1bl9hbGwob25fZGVzdHJveSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGh0bWwsXG4gICAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IEFycmF5LmZyb20ocmVzdWx0LmNzcykubWFwKGNzcyA9PiBjc3MuY29kZSkuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgICAgIG1hcDogbnVsbCAvLyBUT0RPXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoZWFkOiByZXN1bHQudGl0bGUgKyByZXN1bHQuaGVhZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgJCRyZW5kZXJcbiAgICB9O1xufVxuZnVuY3Rpb24gYWRkX2F0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgYm9vbGVhbikge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IChib29sZWFuICYmICF2YWx1ZSkpXG4gICAgICAgIHJldHVybiAnJztcbiAgICBjb25zdCBhc3NpZ25tZW50ID0gKGJvb2xlYW4gJiYgdmFsdWUgPT09IHRydWUpID8gJycgOiBgPVwiJHtlc2NhcGVfYXR0cmlidXRlX3ZhbHVlKHZhbHVlLnRvU3RyaW5nKCkpfVwiYDtcbiAgICByZXR1cm4gYCAke25hbWV9JHthc3NpZ25tZW50fWA7XG59XG5mdW5jdGlvbiBhZGRfY2xhc3NlcyhjbGFzc2VzKSB7XG4gICAgcmV0dXJuIGNsYXNzZXMgPyBgIGNsYXNzPVwiJHtjbGFzc2VzfVwiYCA6ICcnO1xufVxuZnVuY3Rpb24gc3R5bGVfb2JqZWN0X3RvX3N0cmluZyhzdHlsZV9vYmplY3QpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc3R5bGVfb2JqZWN0KVxuICAgICAgICAuZmlsdGVyKGtleSA9PiBzdHlsZV9vYmplY3Rba2V5XSlcbiAgICAgICAgLm1hcChrZXkgPT4gYCR7a2V5fTogJHtzdHlsZV9vYmplY3Rba2V5XX07YClcbiAgICAgICAgLmpvaW4oJyAnKTtcbn1cbmZ1bmN0aW9uIGFkZF9zdHlsZXMoc3R5bGVfb2JqZWN0KSB7XG4gICAgY29uc3Qgc3R5bGVzID0gc3R5bGVfb2JqZWN0X3RvX3N0cmluZyhzdHlsZV9vYmplY3QpO1xuICAgIHJldHVybiBzdHlsZXMgPyBgIHN0eWxlPVwiJHtzdHlsZXN9XCJgIDogJyc7XG59XG5cbmZ1bmN0aW9uIGJpbmQoY29tcG9uZW50LCBuYW1lLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGluZGV4ID0gY29tcG9uZW50LiQkLnByb3BzW25hbWVdO1xuICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbXBvbmVudC4kJC5ib3VuZFtpbmRleF0gPSBjYWxsYmFjaztcbiAgICAgICAgY2FsbGJhY2soY29tcG9uZW50LiQkLmN0eFtpbmRleF0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZV9jb21wb25lbnQoYmxvY2spIHtcbiAgICBibG9jayAmJiBibG9jay5jKCk7XG59XG5mdW5jdGlvbiBjbGFpbV9jb21wb25lbnQoYmxvY2ssIHBhcmVudF9ub2Rlcykge1xuICAgIGJsb2NrICYmIGJsb2NrLmwocGFyZW50X25vZGVzKTtcbn1cbmZ1bmN0aW9uIG1vdW50X2NvbXBvbmVudChjb21wb25lbnQsIHRhcmdldCwgYW5jaG9yLCBjdXN0b21FbGVtZW50KSB7XG4gICAgY29uc3QgeyBmcmFnbWVudCwgb25fbW91bnQsIG9uX2Rlc3Ryb3ksIGFmdGVyX3VwZGF0ZSB9ID0gY29tcG9uZW50LiQkO1xuICAgIGZyYWdtZW50ICYmIGZyYWdtZW50Lm0odGFyZ2V0LCBhbmNob3IpO1xuICAgIGlmICghY3VzdG9tRWxlbWVudCkge1xuICAgICAgICAvLyBvbk1vdW50IGhhcHBlbnMgYmVmb3JlIHRoZSBpbml0aWFsIGFmdGVyVXBkYXRlXG4gICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3X29uX2Rlc3Ryb3kgPSBvbl9tb3VudC5tYXAocnVuKS5maWx0ZXIoaXNfZnVuY3Rpb24pO1xuICAgICAgICAgICAgaWYgKG9uX2Rlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgICBvbl9kZXN0cm95LnB1c2goLi4ubmV3X29uX2Rlc3Ryb3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRWRnZSBjYXNlIC0gY29tcG9uZW50IHdhcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHksXG4gICAgICAgICAgICAgICAgLy8gbW9zdCBsaWtlbHkgYXMgYSByZXN1bHQgb2YgYSBiaW5kaW5nIGluaXRpYWxpc2luZ1xuICAgICAgICAgICAgICAgIHJ1bl9hbGwobmV3X29uX2Rlc3Ryb3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9uZW50LiQkLm9uX21vdW50ID0gW107XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lfY29tcG9uZW50KGNvbXBvbmVudCwgZGV0YWNoaW5nKSB7XG4gICAgY29uc3QgJCQgPSBjb21wb25lbnQuJCQ7XG4gICAgaWYgKCQkLmZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHJ1bl9hbGwoJCQub25fZGVzdHJveSk7XG4gICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LmQoZGV0YWNoaW5nKTtcbiAgICAgICAgLy8gVE9ETyBudWxsIG91dCBvdGhlciByZWZzLCBpbmNsdWRpbmcgY29tcG9uZW50LiQkIChidXQgbmVlZCB0b1xuICAgICAgICAvLyBwcmVzZXJ2ZSBmaW5hbCBzdGF0ZT8pXG4gICAgICAgICQkLm9uX2Rlc3Ryb3kgPSAkJC5mcmFnbWVudCA9IG51bGw7XG4gICAgICAgICQkLmN0eCA9IFtdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1ha2VfZGlydHkoY29tcG9uZW50LCBpKSB7XG4gICAgaWYgKGNvbXBvbmVudC4kJC5kaXJ0eVswXSA9PT0gLTEpIHtcbiAgICAgICAgZGlydHlfY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgICAgICBjb21wb25lbnQuJCQuZGlydHkuZmlsbCgwKTtcbiAgICB9XG4gICAgY29tcG9uZW50LiQkLmRpcnR5WyhpIC8gMzEpIHwgMF0gfD0gKDEgPDwgKGkgJSAzMSkpO1xufVxuZnVuY3Rpb24gaW5pdChjb21wb25lbnQsIG9wdGlvbnMsIGluc3RhbmNlLCBjcmVhdGVfZnJhZ21lbnQsIG5vdF9lcXVhbCwgcHJvcHMsIGFwcGVuZF9zdHlsZXMsIGRpcnR5ID0gWy0xXSkge1xuICAgIGNvbnN0IHBhcmVudF9jb21wb25lbnQgPSBjdXJyZW50X2NvbXBvbmVudDtcbiAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTtcbiAgICBjb25zdCAkJCA9IGNvbXBvbmVudC4kJCA9IHtcbiAgICAgICAgZnJhZ21lbnQ6IG51bGwsXG4gICAgICAgIGN0eDogbnVsbCxcbiAgICAgICAgLy8gc3RhdGVcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIHVwZGF0ZTogbm9vcCxcbiAgICAgICAgbm90X2VxdWFsLFxuICAgICAgICBib3VuZDogYmxhbmtfb2JqZWN0KCksXG4gICAgICAgIC8vIGxpZmVjeWNsZVxuICAgICAgICBvbl9tb3VudDogW10sXG4gICAgICAgIG9uX2Rlc3Ryb3k6IFtdLFxuICAgICAgICBvbl9kaXNjb25uZWN0OiBbXSxcbiAgICAgICAgYmVmb3JlX3VwZGF0ZTogW10sXG4gICAgICAgIGFmdGVyX3VwZGF0ZTogW10sXG4gICAgICAgIGNvbnRleHQ6IG5ldyBNYXAob3B0aW9ucy5jb250ZXh0IHx8IChwYXJlbnRfY29tcG9uZW50ID8gcGFyZW50X2NvbXBvbmVudC4kJC5jb250ZXh0IDogW10pKSxcbiAgICAgICAgLy8gZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIGNhbGxiYWNrczogYmxhbmtfb2JqZWN0KCksXG4gICAgICAgIGRpcnR5LFxuICAgICAgICBza2lwX2JvdW5kOiBmYWxzZSxcbiAgICAgICAgcm9vdDogb3B0aW9ucy50YXJnZXQgfHwgcGFyZW50X2NvbXBvbmVudC4kJC5yb290XG4gICAgfTtcbiAgICBhcHBlbmRfc3R5bGVzICYmIGFwcGVuZF9zdHlsZXMoJCQucm9vdCk7XG4gICAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gICAgJCQuY3R4ID0gaW5zdGFuY2VcbiAgICAgICAgPyBpbnN0YW5jZShjb21wb25lbnQsIG9wdGlvbnMucHJvcHMgfHwge30sIChpLCByZXQsIC4uLnJlc3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVzdC5sZW5ndGggPyByZXN0WzBdIDogcmV0O1xuICAgICAgICAgICAgaWYgKCQkLmN0eCAmJiBub3RfZXF1YWwoJCQuY3R4W2ldLCAkJC5jdHhbaV0gPSB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoISQkLnNraXBfYm91bmQgJiYgJCQuYm91bmRbaV0pXG4gICAgICAgICAgICAgICAgICAgICQkLmJvdW5kW2ldKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVhZHkpXG4gICAgICAgICAgICAgICAgICAgIG1ha2VfZGlydHkoY29tcG9uZW50LCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pXG4gICAgICAgIDogW107XG4gICAgJCQudXBkYXRlKCk7XG4gICAgcmVhZHkgPSB0cnVlO1xuICAgIHJ1bl9hbGwoJCQuYmVmb3JlX3VwZGF0ZSk7XG4gICAgLy8gYGZhbHNlYCBhcyBhIHNwZWNpYWwgY2FzZSBvZiBubyBET00gY29tcG9uZW50XG4gICAgJCQuZnJhZ21lbnQgPSBjcmVhdGVfZnJhZ21lbnQgPyBjcmVhdGVfZnJhZ21lbnQoJCQuY3R4KSA6IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLnRhcmdldCkge1xuICAgICAgICBpZiAob3B0aW9ucy5oeWRyYXRlKSB7XG4gICAgICAgICAgICBzdGFydF9oeWRyYXRpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gY2hpbGRyZW4ob3B0aW9ucy50YXJnZXQpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50Lmwobm9kZXMpO1xuICAgICAgICAgICAgbm9kZXMuZm9yRWFjaChkZXRhY2gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICQkLmZyYWdtZW50ICYmICQkLmZyYWdtZW50LmMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbnRybylcbiAgICAgICAgICAgIHRyYW5zaXRpb25faW4oY29tcG9uZW50LiQkLmZyYWdtZW50KTtcbiAgICAgICAgbW91bnRfY29tcG9uZW50KGNvbXBvbmVudCwgb3B0aW9ucy50YXJnZXQsIG9wdGlvbnMuYW5jaG9yLCBvcHRpb25zLmN1c3RvbUVsZW1lbnQpO1xuICAgICAgICBlbmRfaHlkcmF0aW5nKCk7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgfVxuICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChwYXJlbnRfY29tcG9uZW50KTtcbn1cbmxldCBTdmVsdGVFbGVtZW50O1xuaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFN2ZWx0ZUVsZW1lbnQgPSBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBjb25zdCB7IG9uX21vdW50IH0gPSB0aGlzLiQkO1xuICAgICAgICAgICAgdGhpcy4kJC5vbl9kaXNjb25uZWN0ID0gb25fbW91bnQubWFwKHJ1bikuZmlsdGVyKGlzX2Z1bmN0aW9uKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLiQkLnNsb3R0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIHRvZG86IGltcHJvdmUgdHlwaW5nc1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy4kJC5zbG90dGVkW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhhdHRyLCBfb2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzW2F0dHJdID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBydW5fYWxsKHRoaXMuJCQub25fZGlzY29ubmVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgJGRlc3Ryb3koKSB7XG4gICAgICAgICAgICBkZXN0cm95X2NvbXBvbmVudCh0aGlzLCAxKTtcbiAgICAgICAgICAgIHRoaXMuJGRlc3Ryb3kgPSBub29wO1xuICAgICAgICB9XG4gICAgICAgICRvbih0eXBlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgdGhpcyBkZWxlZ2F0ZSB0byBhZGRFdmVudExpc3RlbmVyP1xuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdIHx8ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSA9IFtdKSk7XG4gICAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAkc2V0KCQkcHJvcHMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiQkc2V0ICYmICFpc19lbXB0eSgkJHByb3BzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy4kJHNldCgkJHByb3BzKTtcbiAgICAgICAgICAgICAgICB0aGlzLiQkLnNraXBfYm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIFN2ZWx0ZSBjb21wb25lbnRzLiBVc2VkIHdoZW4gZGV2PWZhbHNlLlxuICovXG5jbGFzcyBTdmVsdGVDb21wb25lbnQge1xuICAgICRkZXN0cm95KCkge1xuICAgICAgICBkZXN0cm95X2NvbXBvbmVudCh0aGlzLCAxKTtcbiAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7XG4gICAgfVxuICAgICRvbih0eXBlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTtcbiAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAkc2V0KCQkcHJvcHMpIHtcbiAgICAgICAgaWYgKHRoaXMuJCRzZXQgJiYgIWlzX2VtcHR5KCQkcHJvcHMpKSB7XG4gICAgICAgICAgICB0aGlzLiQkLnNraXBfYm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy4kJHNldCgkJHByb3BzKTtcbiAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaF9kZXYodHlwZSwgZGV0YWlsKSB7XG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21fZXZlbnQodHlwZSwgT2JqZWN0LmFzc2lnbih7IHZlcnNpb246ICczLjQ4LjAnIH0sIGRldGFpbCksIHsgYnViYmxlczogdHJ1ZSB9KSk7XG59XG5mdW5jdGlvbiBhcHBlbmRfZGV2KHRhcmdldCwgbm9kZSkge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NSW5zZXJ0JywgeyB0YXJnZXQsIG5vZGUgfSk7XG4gICAgYXBwZW5kKHRhcmdldCwgbm9kZSk7XG59XG5mdW5jdGlvbiBhcHBlbmRfaHlkcmF0aW9uX2Rldih0YXJnZXQsIG5vZGUpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlIH0pO1xuICAgIGFwcGVuZF9oeWRyYXRpb24odGFyZ2V0LCBub2RlKTtcbn1cbmZ1bmN0aW9uIGluc2VydF9kZXYodGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlLCBhbmNob3IgfSk7XG4gICAgaW5zZXJ0KHRhcmdldCwgbm9kZSwgYW5jaG9yKTtcbn1cbmZ1bmN0aW9uIGluc2VydF9oeWRyYXRpb25fZGV2KHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSwgYW5jaG9yIH0pO1xuICAgIGluc2VydF9oeWRyYXRpb24odGFyZ2V0LCBub2RlLCBhbmNob3IpO1xufVxuZnVuY3Rpb24gZGV0YWNoX2Rldihub2RlKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmUnLCB7IG5vZGUgfSk7XG4gICAgZGV0YWNoKG5vZGUpO1xufVxuZnVuY3Rpb24gZGV0YWNoX2JldHdlZW5fZGV2KGJlZm9yZSwgYWZ0ZXIpIHtcbiAgICB3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nICYmIGJlZm9yZS5uZXh0U2libGluZyAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgZGV0YWNoX2RldihiZWZvcmUubmV4dFNpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaF9iZWZvcmVfZGV2KGFmdGVyKSB7XG4gICAgd2hpbGUgKGFmdGVyLnByZXZpb3VzU2libGluZykge1xuICAgICAgICBkZXRhY2hfZGV2KGFmdGVyLnByZXZpb3VzU2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZGV0YWNoX2FmdGVyX2RldihiZWZvcmUpIHtcbiAgICB3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5fZGV2KG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zLCBoYXNfcHJldmVudF9kZWZhdWx0LCBoYXNfc3RvcF9wcm9wYWdhdGlvbikge1xuICAgIGNvbnN0IG1vZGlmaWVycyA9IG9wdGlvbnMgPT09IHRydWUgPyBbJ2NhcHR1cmUnXSA6IG9wdGlvbnMgPyBBcnJheS5mcm9tKE9iamVjdC5rZXlzKG9wdGlvbnMpKSA6IFtdO1xuICAgIGlmIChoYXNfcHJldmVudF9kZWZhdWx0KVxuICAgICAgICBtb2RpZmllcnMucHVzaCgncHJldmVudERlZmF1bHQnKTtcbiAgICBpZiAoaGFzX3N0b3BfcHJvcGFnYXRpb24pXG4gICAgICAgIG1vZGlmaWVycy5wdXNoKCdzdG9wUHJvcGFnYXRpb24nKTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUFkZEV2ZW50TGlzdGVuZXInLCB7IG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBtb2RpZmllcnMgfSk7XG4gICAgY29uc3QgZGlzcG9zZSA9IGxpc3Rlbihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmVFdmVudExpc3RlbmVyJywgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pO1xuICAgICAgICBkaXNwb3NlKCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGF0dHJfZGV2KG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBhdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxuICAgICAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVJlbW92ZUF0dHJpYnV0ZScsIHsgbm9kZSwgYXR0cmlidXRlIH0pO1xuICAgIGVsc2VcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXRBdHRyaWJ1dGUnLCB7IG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBwcm9wX2Rldihub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICBub2RlW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0UHJvcGVydHknLCB7IG5vZGUsIHByb3BlcnR5LCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIGRhdGFzZXRfZGV2KG5vZGUsIHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIG5vZGUuZGF0YXNldFtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldERhdGFzZXQnLCB7IG5vZGUsIHByb3BlcnR5LCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIHNldF9kYXRhX2Rldih0ZXh0LCBkYXRhKSB7XG4gICAgZGF0YSA9ICcnICsgZGF0YTtcbiAgICBpZiAodGV4dC53aG9sZVRleHQgPT09IGRhdGEpXG4gICAgICAgIHJldHVybjtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldERhdGEnLCB7IG5vZGU6IHRleHQsIGRhdGEgfSk7XG4gICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX2VhY2hfYXJndW1lbnQoYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdzdHJpbmcnICYmICEoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmICdsZW5ndGgnIGluIGFyZykpIHtcbiAgICAgICAgbGV0IG1zZyA9ICd7I2VhY2h9IG9ubHkgaXRlcmF0ZXMgb3ZlciBhcnJheS1saWtlIG9iamVjdHMuJztcbiAgICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgYXJnICYmIFN5bWJvbC5pdGVyYXRvciBpbiBhcmcpIHtcbiAgICAgICAgICAgIG1zZyArPSAnIFlvdSBjYW4gdXNlIGEgc3ByZWFkIHRvIGNvbnZlcnQgdGhpcyBpdGVyYWJsZSBpbnRvIGFuIGFycmF5Lic7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVfc2xvdHMobmFtZSwgc2xvdCwga2V5cykge1xuICAgIGZvciAoY29uc3Qgc2xvdF9rZXkgb2YgT2JqZWN0LmtleXMoc2xvdCkpIHtcbiAgICAgICAgaWYgKCF+a2V5cy5pbmRleE9mKHNsb3Rfa2V5KSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGA8JHtuYW1lfT4gcmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBzbG90IFwiJHtzbG90X2tleX1cIi5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX2R5bmFtaWNfZWxlbWVudCh0YWcpIHtcbiAgICBjb25zdCBpc19zdHJpbmcgPSB0eXBlb2YgdGFnID09PSAnc3RyaW5nJztcbiAgICBpZiAodGFnICYmICFpc19zdHJpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCc8c3ZlbHRlOmVsZW1lbnQ+IGV4cGVjdHMgXCJ0aGlzXCIgYXR0cmlidXRlIHRvIGJlIGEgc3RyaW5nLicpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX3ZvaWRfZHluYW1pY19lbGVtZW50KHRhZykge1xuICAgIGlmICh0YWcgJiYgaXNfdm9pZCh0YWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgPHN2ZWx0ZTplbGVtZW50IHRoaXM9XCIke3RhZ31cIj4gaXMgc2VsZi1jbG9zaW5nIGFuZCBjYW5ub3QgaGF2ZSBjb250ZW50LmApO1xuICAgIH1cbn1cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgU3ZlbHRlIGNvbXBvbmVudHMgd2l0aCBzb21lIG1pbm9yIGRldi1lbmhhbmNlbWVudHMuIFVzZWQgd2hlbiBkZXY9dHJ1ZS5cbiAqL1xuY2xhc3MgU3ZlbHRlQ29tcG9uZW50RGV2IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCAoIW9wdGlvbnMudGFyZ2V0ICYmICFvcHRpb25zLiQkaW5saW5lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ3RhcmdldCcgaXMgYSByZXF1aXJlZCBvcHRpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgJGRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLiRkZXN0cm95KCk7XG4gICAgICAgIHRoaXMuJGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvbXBvbmVudCB3YXMgYWxyZWFkeSBkZXN0cm95ZWQnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIH07XG4gICAgfVxuICAgICRjYXB0dXJlX3N0YXRlKCkgeyB9XG4gICAgJGluamVjdF9zdGF0ZSgpIHsgfVxufVxuLyoqXG4gKiBCYXNlIGNsYXNzIHRvIGNyZWF0ZSBzdHJvbmdseSB0eXBlZCBTdmVsdGUgY29tcG9uZW50cy5cbiAqIFRoaXMgb25seSBleGlzdHMgZm9yIHR5cGluZyBwdXJwb3NlcyBhbmQgc2hvdWxkIGJlIHVzZWQgaW4gYC5kLnRzYCBmaWxlcy5cbiAqXG4gKiAjIyMgRXhhbXBsZTpcbiAqXG4gKiBZb3UgaGF2ZSBjb21wb25lbnQgbGlicmFyeSBvbiBucG0gY2FsbGVkIGBjb21wb25lbnQtbGlicmFyeWAsIGZyb20gd2hpY2hcbiAqIHlvdSBleHBvcnQgYSBjb21wb25lbnQgY2FsbGVkIGBNeUNvbXBvbmVudGAuIEZvciBTdmVsdGUrVHlwZVNjcmlwdCB1c2VycyxcbiAqIHlvdSB3YW50IHRvIHByb3ZpZGUgdHlwaW5ncy4gVGhlcmVmb3JlIHlvdSBjcmVhdGUgYSBgaW5kZXguZC50c2A6XG4gKiBgYGB0c1xuICogaW1wb3J0IHsgU3ZlbHRlQ29tcG9uZW50VHlwZWQgfSBmcm9tIFwic3ZlbHRlXCI7XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnRUeXBlZDx7Zm9vOiBzdHJpbmd9PiB7fVxuICogYGBgXG4gKiBUeXBpbmcgdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgSURFcyBsaWtlIFZTIENvZGUgd2l0aCB0aGUgU3ZlbHRlIGV4dGVuc2lvblxuICogdG8gcHJvdmlkZSBpbnRlbGxpc2Vuc2UgYW5kIHRvIHVzZSB0aGUgY29tcG9uZW50IGxpa2UgdGhpcyBpbiBhIFN2ZWx0ZSBmaWxlXG4gKiB3aXRoIFR5cGVTY3JpcHQ6XG4gKiBgYGBzdmVsdGVcbiAqIDxzY3JpcHQgbGFuZz1cInRzXCI+XG4gKiBcdGltcG9ydCB7IE15Q29tcG9uZW50IH0gZnJvbSBcImNvbXBvbmVudC1saWJyYXJ5XCI7XG4gKiA8L3NjcmlwdD5cbiAqIDxNeUNvbXBvbmVudCBmb289eydiYXInfSAvPlxuICogYGBgXG4gKlxuICogIyMjIyBXaHkgbm90IG1ha2UgdGhpcyBwYXJ0IG9mIGBTdmVsdGVDb21wb25lbnQoRGV2KWA/XG4gKiBCZWNhdXNlXG4gKiBgYGB0c1xuICogY2xhc3MgQVN1YmNsYXNzT2ZTdmVsdGVDb21wb25lbnQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnQ8e2Zvbzogc3RyaW5nfT4ge31cbiAqIGNvbnN0IGNvbXBvbmVudDogdHlwZW9mIFN2ZWx0ZUNvbXBvbmVudCA9IEFTdWJjbGFzc09mU3ZlbHRlQ29tcG9uZW50O1xuICogYGBgXG4gKiB3aWxsIHRocm93IGEgdHlwZSBlcnJvciwgc28gd2UgbmVlZCB0byBzZXBhcmF0ZSB0aGUgbW9yZSBzdHJpY3RseSB0eXBlZCBjbGFzcy5cbiAqL1xuY2xhc3MgU3ZlbHRlQ29tcG9uZW50VHlwZWQgZXh0ZW5kcyBTdmVsdGVDb21wb25lbnREZXYge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbG9vcF9ndWFyZCh0aW1lb3V0KSB7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPiB0aW1lb3V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luZmluaXRlIGxvb3AgZGV0ZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmV4cG9ydCB7IEh0bWxUYWcsIEh0bWxUYWdIeWRyYXRpb24sIFN2ZWx0ZUNvbXBvbmVudCwgU3ZlbHRlQ29tcG9uZW50RGV2LCBTdmVsdGVDb21wb25lbnRUeXBlZCwgU3ZlbHRlRWxlbWVudCwgYWN0aW9uX2Rlc3Ryb3llciwgYWRkX2F0dHJpYnV0ZSwgYWRkX2NsYXNzZXMsIGFkZF9mbHVzaF9jYWxsYmFjaywgYWRkX2xvY2F0aW9uLCBhZGRfcmVuZGVyX2NhbGxiYWNrLCBhZGRfcmVzaXplX2xpc3RlbmVyLCBhZGRfc3R5bGVzLCBhZGRfdHJhbnNmb3JtLCBhZnRlclVwZGF0ZSwgYXBwZW5kLCBhcHBlbmRfZGV2LCBhcHBlbmRfZW1wdHlfc3R5bGVzaGVldCwgYXBwZW5kX2h5ZHJhdGlvbiwgYXBwZW5kX2h5ZHJhdGlvbl9kZXYsIGFwcGVuZF9zdHlsZXMsIGFzc2lnbiwgYXR0ciwgYXR0cl9kZXYsIGF0dHJpYnV0ZV90b19vYmplY3QsIGJlZm9yZVVwZGF0ZSwgYmluZCwgYmluZGluZ19jYWxsYmFja3MsIGJsYW5rX29iamVjdCwgYnViYmxlLCBjaGVja19vdXRyb3MsIGNoaWxkcmVuLCBjbGFpbV9jb21wb25lbnQsIGNsYWltX2VsZW1lbnQsIGNsYWltX2h0bWxfdGFnLCBjbGFpbV9zcGFjZSwgY2xhaW1fc3ZnX2VsZW1lbnQsIGNsYWltX3RleHQsIGNsZWFyX2xvb3BzLCBjb21wb25lbnRfc3Vic2NyaWJlLCBjb21wdXRlX3Jlc3RfcHJvcHMsIGNvbXB1dGVfc2xvdHMsIGNyZWF0ZUV2ZW50RGlzcGF0Y2hlciwgY3JlYXRlX2FuaW1hdGlvbiwgY3JlYXRlX2JpZGlyZWN0aW9uYWxfdHJhbnNpdGlvbiwgY3JlYXRlX2NvbXBvbmVudCwgY3JlYXRlX2luX3RyYW5zaXRpb24sIGNyZWF0ZV9vdXRfdHJhbnNpdGlvbiwgY3JlYXRlX3Nsb3QsIGNyZWF0ZV9zc3JfY29tcG9uZW50LCBjdXJyZW50X2NvbXBvbmVudCwgY3VzdG9tX2V2ZW50LCBkYXRhc2V0X2RldiwgZGVidWcsIGRlc3Ryb3lfYmxvY2ssIGRlc3Ryb3lfY29tcG9uZW50LCBkZXN0cm95X2VhY2gsIGRldGFjaCwgZGV0YWNoX2FmdGVyX2RldiwgZGV0YWNoX2JlZm9yZV9kZXYsIGRldGFjaF9iZXR3ZWVuX2RldiwgZGV0YWNoX2RldiwgZGlydHlfY29tcG9uZW50cywgZGlzcGF0Y2hfZGV2LCBlYWNoLCBlbGVtZW50LCBlbGVtZW50X2lzLCBlbXB0eSwgZW5kX2h5ZHJhdGluZywgZXNjYXBlLCBlc2NhcGVfYXR0cmlidXRlX3ZhbHVlLCBlc2NhcGVfb2JqZWN0LCBlc2NhcGVkLCBleGNsdWRlX2ludGVybmFsX3Byb3BzLCBmaXhfYW5kX2Rlc3Ryb3lfYmxvY2ssIGZpeF9hbmRfb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2ssIGZpeF9wb3NpdGlvbiwgZmx1c2gsIGdldEFsbENvbnRleHRzLCBnZXRDb250ZXh0LCBnZXRfYWxsX2RpcnR5X2Zyb21fc2NvcGUsIGdldF9iaW5kaW5nX2dyb3VwX3ZhbHVlLCBnZXRfY3VycmVudF9jb21wb25lbnQsIGdldF9jdXN0b21fZWxlbWVudHNfc2xvdHMsIGdldF9yb290X2Zvcl9zdHlsZSwgZ2V0X3Nsb3RfY2hhbmdlcywgZ2V0X3NwcmVhZF9vYmplY3QsIGdldF9zcHJlYWRfdXBkYXRlLCBnZXRfc3RvcmVfdmFsdWUsIGdsb2JhbHMsIGdyb3VwX291dHJvcywgaGFuZGxlX3Byb21pc2UsIGhhc0NvbnRleHQsIGhhc19wcm9wLCBpZGVudGl0eSwgaW5pdCwgaW5zZXJ0LCBpbnNlcnRfZGV2LCBpbnNlcnRfaHlkcmF0aW9uLCBpbnNlcnRfaHlkcmF0aW9uX2RldiwgaW50cm9zLCBpbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX2NoYXJhY3RlciwgaXNfY2xpZW50LCBpc19jcm9zc29yaWdpbiwgaXNfZW1wdHksIGlzX2Z1bmN0aW9uLCBpc19wcm9taXNlLCBpc192b2lkLCBsaXN0ZW4sIGxpc3Rlbl9kZXYsIGxvb3AsIGxvb3BfZ3VhcmQsIG1lcmdlX3Nzcl9zdHlsZXMsIG1pc3NpbmdfY29tcG9uZW50LCBtb3VudF9jb21wb25lbnQsIG5vb3AsIG5vdF9lcXVhbCwgbm93LCBudWxsX3RvX2VtcHR5LCBvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzLCBvbkRlc3Ryb3ksIG9uTW91bnQsIG9uY2UsIG91dHJvX2FuZF9kZXN0cm95X2Jsb2NrLCBwcmV2ZW50X2RlZmF1bHQsIHByb3BfZGV2LCBxdWVyeV9zZWxlY3Rvcl9hbGwsIHJhZiwgcnVuLCBydW5fYWxsLCBzYWZlX25vdF9lcXVhbCwgc2NoZWR1bGVfdXBkYXRlLCBzZWxlY3RfbXVsdGlwbGVfdmFsdWUsIHNlbGVjdF9vcHRpb24sIHNlbGVjdF9vcHRpb25zLCBzZWxlY3RfdmFsdWUsIHNlbGYsIHNldENvbnRleHQsIHNldF9hdHRyaWJ1dGVzLCBzZXRfY3VycmVudF9jb21wb25lbnQsIHNldF9jdXN0b21fZWxlbWVudF9kYXRhLCBzZXRfZGF0YSwgc2V0X2RhdGFfZGV2LCBzZXRfaW5wdXRfdHlwZSwgc2V0X2lucHV0X3ZhbHVlLCBzZXRfbm93LCBzZXRfcmFmLCBzZXRfc3RvcmVfdmFsdWUsIHNldF9zdHlsZSwgc2V0X3N2Z19hdHRyaWJ1dGVzLCBzcGFjZSwgc3ByZWFkLCBzcmNfdXJsX2VxdWFsLCBzdGFydF9oeWRyYXRpbmcsIHN0b3BfcHJvcGFnYXRpb24sIHN1YnNjcmliZSwgc3ZnX2VsZW1lbnQsIHRleHQsIHRpY2ssIHRpbWVfcmFuZ2VzX3RvX2FycmF5LCB0b19udW1iZXIsIHRvZ2dsZV9jbGFzcywgdHJhbnNpdGlvbl9pbiwgdHJhbnNpdGlvbl9vdXQsIHRydXN0ZWQsIHVwZGF0ZV9hd2FpdF9ibG9ja19icmFuY2gsIHVwZGF0ZV9rZXllZF9lYWNoLCB1cGRhdGVfc2xvdCwgdXBkYXRlX3Nsb3RfYmFzZSwgdmFsaWRhdGVfY29tcG9uZW50LCB2YWxpZGF0ZV9keW5hbWljX2VsZW1lbnQsIHZhbGlkYXRlX2VhY2hfYXJndW1lbnQsIHZhbGlkYXRlX2VhY2hfa2V5cywgdmFsaWRhdGVfc2xvdHMsIHZhbGlkYXRlX3N0b3JlLCB2YWxpZGF0ZV92b2lkX2R5bmFtaWNfZWxlbWVudCwgeGxpbmtfYXR0ciB9O1xuIiwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XG4gICAgaW1wb3J0ICogYXMgY2hyb25vIGZyb20gJ2Nocm9uby1ub2RlJztcbiAgICBpbXBvcnQgeyBvbk1vdW50IH0gZnJvbSAnc3ZlbHRlJztcbiAgICBpbXBvcnQgeyBSZWN1cnJlbmNlIH0gZnJvbSAnLi4vUmVjdXJyZW5jZSc7XG4gICAgaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuLi9Db25maWcvU2V0dGluZ3MnO1xuICAgIGltcG9ydCB7IFN0YXR1cyB9IGZyb20gJy4uL1N0YXR1cyc7XG4gICAgaW1wb3J0IHsgUHJpb3JpdHksIFRhc2sgfSBmcm9tICcuLi9UYXNrJztcbiAgICBpbXBvcnQge1xuICAgICAgICBwcmlvcml0eVN5bWJvbHMsXG4gICAgICAgIHJlY3VycmVuY2VTeW1ib2wsXG4gICAgICAgIHN0YXJ0RGF0ZVN5bWJvbCxcbiAgICAgICAgc2NoZWR1bGVkRGF0ZVN5bWJvbCxcbiAgICAgICAgZHVlRGF0ZVN5bWJvbCxcbiAgICB9IGZyb20gJy4uL1Rhc2snO1xuICAgIGltcG9ydCB7IGRvQXV0b2NvbXBsZXRlIH0gZnJvbSAnLi4vRGF0ZUFiYnJldmlhdGlvbnMnO1xuXG4gICAgLy8gVGhlc2UgZXhwb3J0ZWQgdmFyaWFibGVzIGFyZSBwYXNzZWQgaW4gYXMgcHJvcHMgYnkgVGFza01vZGFsLm9uT3BlbigpOlxuICAgIGV4cG9ydCBsZXQgdGFzazogVGFzaztcbiAgICBleHBvcnQgbGV0IG9uU3VibWl0OiAodXBkYXRlZFRhc2tzOiBUYXNrW10pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIGV4cG9ydCBsZXQgc3RhdHVzT3B0aW9uczogU3RhdHVzW107XG5cbiAgICBsZXQgZGVzY3JpcHRpb25JbnB1dDogSFRNTElucHV0RWxlbWVudDtcbiAgICBsZXQgZWRpdGFibGVUYXNrOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogU3RhdHVzO1xuICAgICAgICBwcmlvcml0eTogJ25vbmUnIHwgJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJztcbiAgICAgICAgcmVjdXJyZW5jZVJ1bGU6IHN0cmluZztcbiAgICAgICAgc3RhcnREYXRlOiBzdHJpbmc7XG4gICAgICAgIHNjaGVkdWxlZERhdGU6IHN0cmluZztcbiAgICAgICAgZHVlRGF0ZTogc3RyaW5nO1xuICAgICAgICBkb25lRGF0ZTogc3RyaW5nO1xuICAgICAgICBmb3J3YXJkT25seTogYm9vbGVhbjtcbiAgICB9ID0ge1xuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIHN0YXR1czogU3RhdHVzLlRPRE8sXG4gICAgICAgIHByaW9yaXR5OiAnbm9uZScsXG4gICAgICAgIHJlY3VycmVuY2VSdWxlOiAnJyxcbiAgICAgICAgc3RhcnREYXRlOiAnJyxcbiAgICAgICAgc2NoZWR1bGVkRGF0ZTogJycsXG4gICAgICAgIGR1ZURhdGU6ICcnLFxuICAgICAgICBkb25lRGF0ZTogJycsXG4gICAgICAgIGZvcndhcmRPbmx5OiB0cnVlXG4gICAgfTtcblxuICAgIGxldCBwYXJzZWRTdGFydERhdGU6IHN0cmluZyA9ICcnO1xuICAgIGxldCBwYXJzZWRTY2hlZHVsZWREYXRlOiBzdHJpbmcgPSAnJztcbiAgICBsZXQgcGFyc2VkRHVlRGF0ZTogc3RyaW5nID0gJyc7XG4gICAgbGV0IHBhcnNlZFJlY3VycmVuY2U6IHN0cmluZyA9ICcnO1xuICAgIGxldCBwYXJzZWREb25lOiBzdHJpbmcgPSAnJztcbiAgICBsZXQgYWRkR2xvYmFsRmlsdGVyT25TYXZlOiBib29sZWFuID0gZmFsc2U7XG4gICAgbGV0IHdpdGhBY2Nlc3NLZXlzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8vICd3ZWVrZW5kJyBhYmJyZXZpYXRpb24gb21taXR0ZWQgZHVlIHRvIGxhY2sgb2Ygc3BhY2UuXG4gICAgbGV0IGRhdGVQbGFjZWhvbGRlciA9XG4gICAgICAgIFwiVHJ5ICdNb25kYXknIG9yICd0b21vcnJvdycsIG9yIFt0ZHx0bXx5ZHx0d3xud3x3ZV0gdGhlbiBzcGFjZS5cIjtcblxuICAgIGNvbnN0IHByaW9yaXR5T3B0aW9uczoge1xuICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBlZGl0YWJsZVRhc2sucHJpb3JpdHksXG4gICAgICAgICAgICBsYWJlbDogc3RyaW5nLFxuICAgICAgICAgICAgc3ltYm9sOiBzdHJpbmcgfVtdID1cbiAgICAgICAgW3tcbiAgICAgICAgICAgIHZhbHVlOiAnbG93JyxcbiAgICAgICAgICAgIGxhYmVsOiAnTG93JyxcbiAgICAgICAgICAgIHN5bWJvbDogcHJpb3JpdHlTeW1ib2xzLkxvd1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICB2YWx1ZTogJ25vbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdOb3JtYWwnLFxuICAgICAgICAgICAgc3ltYm9sOiBwcmlvcml0eVN5bWJvbHMuTm9uZVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICB2YWx1ZTogJ21lZGl1bScsXG4gICAgICAgICAgICBsYWJlbDogJ01lZGl1bScsXG4gICAgICAgICAgICBzeW1ib2w6IHByaW9yaXR5U3ltYm9scy5NZWRpdW1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgdmFsdWU6ICdoaWdoJyxcbiAgICAgICAgICAgIGxhYmVsOiAnSGlnaCcsXG4gICAgICAgICAgICBzeW1ib2w6IHByaW9yaXR5U3ltYm9scy5IaWdoXG4gICAgICAgIH1dXG5cbiAgICAvKlxuICAgICAgICBNQUlOVEVOQU5DRSBOT1RFIG9uIHRoZXNlIERhdGUgZnVuY3Rpb25zOlxuICAgICAgICAgICAgUmVwZXRpdGlvdXMgZGF0ZS1yZWxhdGVkIGNvZGUgaW4gdGhpcyBmaWxlIGhhcyBiZWVuIGV4dHJhY3RlZFxuICAgICAgICAgICAgb3V0IGluIHRvIHNldmVyYWwgcGFyc2VUeXBlZERhdGVGb3IuLi4uKCkgZnVuY3Rpb25zIG92ZXIgdGltZS5cblxuICAgICAgICAgICAgVGhlcmUgaXMgc29tZSBzaW1pbGFyaXR5IGJldHdlZW4gdGhlc2UgZnVuY3Rpb25zLCBhbmQgYWxzb1xuICAgICAgICAgICAgc29tZSBzdWJ0bGUgZGlmZmVyZW5jZXMuXG5cbiAgICAgICAgICAgIEZ1dHVyZSByZWZhY3RvcmluZyB0byBzaW1wbGlmeSB0aGVtIHdvdWxkIGJlIHdlbGNvbWVkLlxuXG4gICAgICAgICAgICBXaGVuIGVkaXRpbmcgb2YgRG9uZSBkYXRlIGlzIGludHJvZHVjZWQsIHRoZSBmdW5jdGlvbnNcbiAgICAgICAgICAgIHBhcnNlVHlwZWREYXRlRm9yRGlzcGxheVVzaW5nRnV0dXJlRGF0ZSgpIGFuZCBwYXJzZVR5cGVkRGF0ZUZvckRpc3BsYXkoKVxuICAgICAgICAgICAgbWF5IGNvbGxhcHNlIGluIHRvIGEgc2luZ2xlIGNhc2UuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbnRlcmVkIHZhbHVlIGZvciBhIGRhdGUgZmllbGQsIGFuZCByZXR1cm4gdGhlIHRleHQgdG8gYmUgZGlzcGxheWVkLFxuICAgICAqIHRvIGV4cGxhaW4gaG93IHRoZSBkYXRlIHN0cmluZyB3YXMgaW50ZXJwcmV0ZWQuXG4gICAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgICAqIEBwYXJhbSB0eXBlZERhdGUgLSB3aGF0IHRoZSB1c2VyIGhhcyBlbnRlcmVkLCBzdWNoIGFzICcyMDIzLTAxLTIzJyBvciAndG9tb3Jyb3cnXG4gICAgICogQHBhcmFtIGZvcndhcmREYXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VUeXBlZERhdGVGb3JEaXNwbGF5KFxuICAgICAgICBmaWVsZE5hbWU6ICdzdGFydCcgfCAnc2NoZWR1bGVkJyB8ICdkdWUnIHwgJ2RvbmUnLFxuICAgICAgICB0eXBlZERhdGU6IHN0cmluZyxcbiAgICAgICAgZm9yd2FyZERhdGU6IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0eXBlZERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBgPGk+bm8gJHtmaWVsZE5hbWV9IGRhdGU8L2k+YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWQgPSBjaHJvbm8ucGFyc2VEYXRlKHR5cGVkRGF0ZSwgZm9yd2FyZERhdGUsIHtcbiAgICAgICAgICAgIGZvcndhcmREYXRlOiBmb3J3YXJkRGF0ZSAhPSB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocGFyc2VkICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93Lm1vbWVudChwYXJzZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgPGk+aW52YWxpZCAke2ZpZWxkTmFtZX0gZGF0ZTwvaT5gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpa2Uge0BsaW5rIHBhcnNlVHlwZWREYXRlRm9yRGlzcGxheX0gYnV0IGFsc28gYWNjb3VudHMgZm9yIHRoZSAnT25seSBmdXR1cmUgZGF0ZXMnIHNldHRpbmcuXG4gICAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgICAqIEBwYXJhbSB0eXBlZERhdGUgLSB3aGF0IHRoZSB1c2VyIGhhcyBlbnRlcmVkLCBzdWNoIGFzICcyMDIzLTAxLTIzJyBvciAndG9tb3Jyb3cnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VUeXBlZERhdGVGb3JEaXNwbGF5VXNpbmdGdXR1cmVEYXRlKGZpZWxkTmFtZTogJ3N0YXJ0JyB8ICdzY2hlZHVsZWQnIHwgJ2R1ZScgfCAnZG9uZScsIHR5cGVkRGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlVHlwZWREYXRlRm9yRGlzcGxheShcbiAgICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICAgIHR5cGVkRGF0ZSxcbiAgICAgICAgICAgIGVkaXRhYmxlVGFzay5mb3J3YXJkT25seSA/IG5ldyBEYXRlKCkgOiB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW50ZXJlZCB2YWx1ZSBmb3IgYSBkYXRlIGZpZWxkLCBhbmQgcmV0dXJuIHRoZSB2YWx1ZSB0byBiZSBzYXZlZCBpbiB0aGUgZWRpdGVkIHRhc2suXG4gICAgICogQHBhcmFtIHR5cGVkRGF0ZSAtIHdoYXQgdGhlIHVzZXIgaGFzIGVudGVyZWQsIHN1Y2ggYXMgJzIwMjMtMDEtMjMnIG9yICd0b21vcnJvdydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZVR5cGVkRGF0ZUZvclNhdmluZyh0eXBlZERhdGU6IHN0cmluZyk6IG1vbWVudC5Nb21lbnQgfCBudWxsIHtcbiAgICAgICAgbGV0IGRhdGU6IG1vbWVudC5Nb21lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IGNocm9uby5wYXJzZURhdGUoXG4gICAgICAgICAgICB0eXBlZERhdGUsXG4gICAgICAgICAgICBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgeyBmb3J3YXJkRGF0ZTogZWRpdGFibGVUYXNrLmZvcndhcmRPbmx5IH0sXG4gICAgICAgICk7XG4gICAgICAgIGlmIChwYXJzZWREYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBkYXRlID0gd2luZG93Lm1vbWVudChwYXJzZWREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICAkOiBhY2Nlc3NrZXkgPSAoa2V5OiBzdHJpbmcpID0+IHdpdGhBY2Nlc3NLZXlzID8ga2V5IDogbnVsbDtcblxuICAgICQ6IHtcbiAgICAgICAgZWRpdGFibGVUYXNrLnN0YXJ0RGF0ZSA9IGRvQXV0b2NvbXBsZXRlKGVkaXRhYmxlVGFzay5zdGFydERhdGUpO1xuICAgICAgICBwYXJzZWRTdGFydERhdGUgPSBwYXJzZVR5cGVkRGF0ZUZvckRpc3BsYXlVc2luZ0Z1dHVyZURhdGUoJ3N0YXJ0JywgZWRpdGFibGVUYXNrLnN0YXJ0RGF0ZSk7XG4gICAgfVxuXG4gICAgJDoge1xuICAgICAgICBlZGl0YWJsZVRhc2suc2NoZWR1bGVkRGF0ZSA9IGRvQXV0b2NvbXBsZXRlKGVkaXRhYmxlVGFzay5zY2hlZHVsZWREYXRlKTtcbiAgICAgICAgcGFyc2VkU2NoZWR1bGVkRGF0ZSA9IHBhcnNlVHlwZWREYXRlRm9yRGlzcGxheVVzaW5nRnV0dXJlRGF0ZSgnc2NoZWR1bGVkJywgZWRpdGFibGVUYXNrLnNjaGVkdWxlZERhdGUpO1xuICAgIH1cblxuICAgICQ6IHtcbiAgICAgICAgZWRpdGFibGVUYXNrLmR1ZURhdGUgPSBkb0F1dG9jb21wbGV0ZShlZGl0YWJsZVRhc2suZHVlRGF0ZSk7XG4gICAgICAgIHBhcnNlZER1ZURhdGUgPSBwYXJzZVR5cGVkRGF0ZUZvckRpc3BsYXlVc2luZ0Z1dHVyZURhdGUoJ2R1ZScsIGVkaXRhYmxlVGFzay5kdWVEYXRlKTtcbiAgICB9XG5cbiAgICAkOiB7XG4gICAgICAgIGlmICghZWRpdGFibGVUYXNrLnJlY3VycmVuY2VSdWxlKSB7XG4gICAgICAgICAgICBwYXJzZWRSZWN1cnJlbmNlID0gJzxpPm5vdCByZWN1cnJpbmc8Lz4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VkUmVjdXJyZW5jZSA9XG4gICAgICAgICAgICAgICAgUmVjdXJyZW5jZS5mcm9tVGV4dCh7XG4gICAgICAgICAgICAgICAgICAgIHJlY3VycmVuY2VSdWxlVGV4dDogZWRpdGFibGVUYXNrLnJlY3VycmVuY2VSdWxlLFxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGZvciByZXByZXNlbnRhdGlvbiBpbiB0aGUgbW9kYWwsIG5vIGRhdGVzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGR1ZURhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgfSk/LnRvVGV4dCgpID8/ICc8aT5pbnZhbGlkIHJlY3VycmVuY2UgcnVsZTwvaT4nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgJDoge1xuICAgICAgICBwYXJzZWREb25lID0gcGFyc2VUeXBlZERhdGVGb3JEaXNwbGF5KCdkb25lJywgZWRpdGFibGVUYXNrLmRvbmVEYXRlKTtcbiAgICB9XG5cbiAgICBvbk1vdW50KCgpID0+IHtcbiAgICAgICAgY29uc3QgeyBnbG9iYWxGaWx0ZXIsIHByb3ZpZGVBY2Nlc3NLZXlzIH0gPSBnZXRTZXR0aW5ncygpO1xuICAgICAgICB3aXRoQWNjZXNzS2V5cyA9IHByb3ZpZGVBY2Nlc3NLZXlzO1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRhc2suZ2V0RGVzY3JpcHRpb25XaXRob3V0R2xvYmFsRmlsdGVyKCk7XG4gICAgICAgIC8vIElmIHdlJ3JlIGRpc3BsYXlpbmcgdG8gdGhlIHVzZXIgdGhlIGRlc2NyaXB0aW9uIHdpdGhvdXQgdGhlIGdsb2JhbCBmaWx0ZXIgKGkuZS4gaXQgd2FzIHJlbW92ZWQgaW4gdGhlIG1ldGhvZFxuICAgICAgICAvLyBhYm92ZSksIG9yIGlmIHRoZSBkZXNjcmlwdGlvbiBkaWQgbm90IGluY2x1ZGUgYSBnbG9iYWwgZmlsdGVyIGluIHRoZSBmaXJzdCBwbGFjZSwgd2UnbGwgYWRkIHRoZSBnbG9iYWwgZmlsdGVyXG4gICAgICAgIC8vIHdoZW4gc2F2aW5nIHRoZSB0YXNrLlxuICAgICAgICAvLyBBbm90aGVyIHNwZWNpYWwgY2FzZSBpcyB3aGVuIHRoZSBnbG9iYWwgZmlsdGVyIGlzIGVtcHR5OiBpbiB0aGlzIGNhc2UgdGhlcmUncyBhbiBcImVtcHR5XCIgbWF0Y2ggaW4gdGhlIGBpbmRleE9mYFxuICAgICAgICAvLyAoaXQgcmV0dXJucyAwKSwgYW5kIHRodXMgd2UgKmRvbid0KiBzZXQgYWRkR2xvYmFsRmlsdGVyT25TYXZlLlxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gdGFzay5kZXNjcmlwdGlvbiB8fCBkZXNjcmlwdGlvbi5pbmRleE9mKGdsb2JhbEZpbHRlcikgPT0gLTEpXG4gICAgICAgICAgICBhZGRHbG9iYWxGaWx0ZXJPblNhdmUgPSB0cnVlO1xuICAgICAgICBsZXQgcHJpb3JpdHk6IHR5cGVvZiBlZGl0YWJsZVRhc2sucHJpb3JpdHkgPSAnbm9uZSc7XG4gICAgICAgIGlmICh0YXNrLnByaW9yaXR5ID09PSBQcmlvcml0eS5Mb3cpIHtcbiAgICAgICAgICAgIHByaW9yaXR5ID0gJ2xvdyc7XG4gICAgICAgIH0gZWxzZSBpZiAodGFzay5wcmlvcml0eSA9PT0gUHJpb3JpdHkuTWVkaXVtKSB7XG4gICAgICAgICAgICBwcmlvcml0eSA9ICdtZWRpdW0nO1xuICAgICAgICB9IGVsc2UgaWYgKHRhc2sucHJpb3JpdHkgPT09IFByaW9yaXR5LkhpZ2gpIHtcbiAgICAgICAgICAgIHByaW9yaXR5ID0gJ2hpZ2gnO1xuICAgICAgICB9XG5cbiAgICAgICAgZWRpdGFibGVUYXNrID0ge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBzdGF0dXM6IHRhc2suc3RhdHVzLFxuICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICByZWN1cnJlbmNlUnVsZTogdGFzay5yZWN1cnJlbmNlID8gdGFzay5yZWN1cnJlbmNlLnRvVGV4dCgpIDogJycsXG4gICAgICAgICAgICBzdGFydERhdGU6IHRhc2suc3RhcnREYXRlXG4gICAgICAgICAgICAgICAgPyB0YXNrLnN0YXJ0RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlOiB0YXNrLnNjaGVkdWxlZERhdGVcbiAgICAgICAgICAgICAgICA/IHRhc2suc2NoZWR1bGVkRGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICBkdWVEYXRlOiB0YXNrLmR1ZURhdGUgPyB0YXNrLmR1ZURhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgOiAnJyxcbiAgICAgICAgICAgIGRvbmVEYXRlOiB0YXNrLmRvbmVEYXRlID8gdGFzay5kb25lRGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6ICcnLFxuICAgICAgICAgICAgZm9yd2FyZE9ubHk6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZGVzY3JpcHRpb25JbnB1dC5mb2N1cygpO1xuICAgICAgICB9LCAxMCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBfb25Qcmlvcml0eUtleXVwID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5rZXkgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuY3RybEtleSkge1xuICAgICAgICAgICAgY29uc3QgcHJpb3JpdHlPcHRpb24gPSBwcmlvcml0eU9wdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICBvcHRpb24gPT4gb3B0aW9uLmxhYmVsLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpID09IGV2ZW50LmtleSk7XG4gICAgICAgICAgICBpZiAocHJpb3JpdHlPcHRpb24pIHtcbiAgICAgICAgICAgICAgICBlZGl0YWJsZVRhc2sucHJpb3JpdHkgPSBwcmlvcml0eU9wdGlvbi52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IF9vbkNsb3NlID0gKCkgPT4ge1xuICAgICAgICBvblN1Ym1pdChbXSk7XG4gICAgfVxuXG4gICAgY29uc3QgX29uU3VibWl0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGdsb2JhbEZpbHRlciB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgbGV0IGRlc2NyaXB0aW9uID0gZWRpdGFibGVUYXNrLmRlc2NyaXB0aW9uLnRyaW0oKTtcbiAgICAgICAgaWYgKGFkZEdsb2JhbEZpbHRlck9uU2F2ZSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBnbG9iYWxGaWx0ZXIgKyAnICcgKyBkZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHBhcnNlVHlwZWREYXRlRm9yU2F2aW5nKGVkaXRhYmxlVGFzay5zdGFydERhdGUpO1xuXG4gICAgICAgIGNvbnN0IHNjaGVkdWxlZERhdGUgPSBwYXJzZVR5cGVkRGF0ZUZvclNhdmluZyhlZGl0YWJsZVRhc2suc2NoZWR1bGVkRGF0ZSk7XG5cbiAgICAgICAgY29uc3QgZHVlRGF0ZSA9IHBhcnNlVHlwZWREYXRlRm9yU2F2aW5nKGVkaXRhYmxlVGFzay5kdWVEYXRlKTtcblxuICAgICAgICBsZXQgcmVjdXJyZW5jZTogUmVjdXJyZW5jZSB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAoZWRpdGFibGVUYXNrLnJlY3VycmVuY2VSdWxlKSB7XG4gICAgICAgICAgICByZWN1cnJlbmNlID0gUmVjdXJyZW5jZS5mcm9tVGV4dCh7XG4gICAgICAgICAgICAgICAgcmVjdXJyZW5jZVJ1bGVUZXh0OiBlZGl0YWJsZVRhc2sucmVjdXJyZW5jZVJ1bGUsXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlLFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZERhdGUsXG4gICAgICAgICAgICAgICAgZHVlRGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnNlZFByaW9yaXR5OiBQcmlvcml0eTtcbiAgICAgICAgc3dpdGNoIChlZGl0YWJsZVRhc2sucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2xvdyc6XG4gICAgICAgICAgICAgICAgcGFyc2VkUHJpb3JpdHkgPSBQcmlvcml0eS5Mb3c7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZWRpdW0nOlxuICAgICAgICAgICAgICAgIHBhcnNlZFByaW9yaXR5ID0gUHJpb3JpdHkuTWVkaXVtO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaGlnaCc6XG4gICAgICAgICAgICAgICAgcGFyc2VkUHJpb3JpdHkgPSBQcmlvcml0eS5IaWdoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBwYXJzZWRQcmlvcml0eSA9IFByaW9yaXR5Lk5vbmU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cGRhdGVkVGFzayA9IG5ldyBUYXNrKHtcbiAgICAgICAgICAgIC4uLnRhc2ssXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHN0YXR1czogZWRpdGFibGVUYXNrLnN0YXR1cyxcbiAgICAgICAgICAgIHByaW9yaXR5OiBwYXJzZWRQcmlvcml0eSxcbiAgICAgICAgICAgIHJlY3VycmVuY2UsXG4gICAgICAgICAgICBzdGFydERhdGUsXG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlLFxuICAgICAgICAgICAgZHVlRGF0ZSxcbiAgICAgICAgICAgIGRvbmVEYXRlOiB3aW5kb3dcbiAgICAgICAgICAgICAgICAubW9tZW50KGVkaXRhYmxlVGFzay5kb25lRGF0ZSwgJ1lZWVktTU0tREQnKVxuICAgICAgICAgICAgICAgIC5pc1ZhbGlkKClcbiAgICAgICAgICAgICAgICA/IHdpbmRvdy5tb21lbnQoZWRpdGFibGVUYXNrLmRvbmVEYXRlLCAnWVlZWS1NTS1ERCcpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9KTtcblxuICAgICAgICBvblN1Ym1pdChbdXBkYXRlZFRhc2tdKTtcbiAgICB9O1xuPC9zY3JpcHQ+XG5cbjxkaXYgY2xhc3M9XCJ0YXNrcy1tb2RhbFwiPlxuICAgIDxmb3JtIG9uOnN1Ym1pdHxwcmV2ZW50RGVmYXVsdD17X29uU3VibWl0fSBjbGFzczp3aXRoLWFjY2Vzc2tleXM9XCJ7d2l0aEFjY2Vzc0tleXN9XCI+XG4gICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICA8IS0tICBEZXNjcmlwdGlvbiAgLS0+XG4gICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFza3MtbW9kYWwtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlc2NyaXB0aW9uXCI+RGVzY3JpcDxzcGFuIGNsYXNzPVwiYWNjZXNza2V5XCI+dDwvc3Bhbj5pb248L2xhYmVsPlxuICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktYWNjZXNza2V5IC0tPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgYmluZDp2YWx1ZT17ZWRpdGFibGVUYXNrLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgIGJpbmQ6dGhpcz17ZGVzY3JpcHRpb25JbnB1dH1cbiAgICAgICAgICAgICAgICBpZD1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0YXNrcy1tb2RhbC1kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUYWtlIG91dCB0aGUgdHJhc2hcIlxuICAgICAgICAgICAgICAgIGFjY2Vzc2tleT17YWNjZXNza2V5KFwidFwiKX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICA8IS0tICBQcmlvcml0eSAgLS0+XG4gICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFza3MtbW9kYWwtc2VjdGlvbiB0YXNrcy1tb2RhbC1wcmlvcml0aWVzXCIgb246a2V5dXA9e19vblByaW9yaXR5S2V5dXB9PlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByaW9yaXR5LXtlZGl0YWJsZVRhc2sucHJpb3JpdHl9XCI+UHJpb3JpdHk8L2xhYmVsPlxuICAgICAgICAgICAgeyNlYWNoIHByaW9yaXR5T3B0aW9ucyBhcyB7dmFsdWUsIGxhYmVsLCBzeW1ib2x9fVxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1hY2Nlc3NrZXkgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicHJpb3JpdHkte3ZhbHVlfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kOmdyb3VwPXtlZGl0YWJsZVRhc2sucHJpb3JpdHl9XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NrZXk9e2FjY2Vzc2tleShsYWJlbC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwcmlvcml0eS17dmFsdWV9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFjY2Vzc2tleS1maXJzdFwiPntsYWJlbH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB7I2lmIHN5bWJvbCAmJiBzeW1ib2wuY2hhckNvZGVBdCgwKSA+PSAweDEwMH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57c3ltYm9sfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsvaWZ9XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgey9lYWNofVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgPCEtLSAgUmVjdXJyZW5jZSBhbmQgRGF0ZXMgIC0tPlxuICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhc2tzLW1vZGFsLXNlY3Rpb24gdGFza3MtbW9kYWwtZGF0ZXNcIj5cbiAgICAgICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICAgICAgPCEtLSAgUmVjdXJyZW5jZSAgLS0+XG4gICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJyZWN1cnJlbmNlXCIgY2xhc3M9XCJhY2Nlc3NrZXktZmlyc3RcIj5SZWN1cnM8L2xhYmVsPlxuICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktYWNjZXNza2V5IC0tPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgYmluZDp2YWx1ZT17ZWRpdGFibGVUYXNrLnJlY3VycmVuY2VSdWxlfVxuICAgICAgICAgICAgICAgIGlkPVwicmVjdXJyZW5jZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHJ5ICdldmVyeSAyIHdlZWtzIG9uIFRodXJzZGF5Jy5cIlxuICAgICAgICAgICAgICAgIGFjY2Vzc2tleT17YWNjZXNza2V5KFwiclwiKX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8Y29kZT57cmVjdXJyZW5jZVN5bWJvbH0ge0BodG1sIHBhcnNlZFJlY3VycmVuY2V9PC9jb2RlPlxuXG4gICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgICAgIDwhLS0gIER1ZSBEYXRlICAtLT5cbiAgICAgICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImR1ZVwiIGNsYXNzPVwiYWNjZXNza2V5LWZpcnN0XCI+RHVlPC9sYWJlbD5cbiAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LWFjY2Vzc2tleSAtLT5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGJpbmQ6dmFsdWU9e2VkaXRhYmxlVGFzay5kdWVEYXRlfVxuICAgICAgICAgICAgICAgIGlkPVwiZHVlXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2RhdGVQbGFjZWhvbGRlcn1cbiAgICAgICAgICAgICAgICBhY2Nlc3NrZXk9e2FjY2Vzc2tleShcImRcIil9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGNvZGU+e2R1ZURhdGVTeW1ib2x9IHtAaHRtbCBwYXJzZWREdWVEYXRlfTwvY29kZT5cblxuICAgICAgICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG4gICAgICAgICAgICA8IS0tICBTY2hlZHVsZWQgRGF0ZSAgLS0+XG4gICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzY2hlZHVsZWRcIiBjbGFzcz1cImFjY2Vzc2tleS1maXJzdFwiPlNjaGVkdWxlZDwvbGFiZWw+XG4gICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1hY2Nlc3NrZXkgLS0+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBiaW5kOnZhbHVlPXtlZGl0YWJsZVRhc2suc2NoZWR1bGVkRGF0ZX1cbiAgICAgICAgICAgICAgICBpZD1cInNjaGVkdWxlZFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtkYXRlUGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICAgICAgYWNjZXNza2V5PXthY2Nlc3NrZXkoXCJzXCIpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxjb2RlPntzY2hlZHVsZWREYXRlU3ltYm9sfSB7QGh0bWwgcGFyc2VkU2NoZWR1bGVkRGF0ZX08L2NvZGU+XG5cbiAgICAgICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICAgICAgPCEtLSAgU3RhcnQgRGF0ZSAgLS0+XG4gICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGFydFwiPlN0PHNwYW4gY2xhc3M9XCJhY2Nlc3NrZXlcIj5hPC9zcGFuPnJ0PC9sYWJlbD5cbiAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LWFjY2Vzc2tleSAtLT5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGJpbmQ6dmFsdWU9e2VkaXRhYmxlVGFzay5zdGFydERhdGV9XG4gICAgICAgICAgICAgICAgaWQ9XCJzdGFydFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtkYXRlUGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICAgICAgYWNjZXNza2V5PXthY2Nlc3NrZXkoXCJhXCIpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxjb2RlPntzdGFydERhdGVTeW1ib2x9IHtAaHRtbCBwYXJzZWRTdGFydERhdGV9PC9jb2RlPlxuXG4gICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgICAgICAgIDwhLS0gIE9ubHkgZnV0dXJlIGRhdGVzICAtLT5cbiAgICAgICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZm9yd2FyZE9ubHlcIj5Pbmx5XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWNjZXNza2V5LWZpcnN0XCI+ZnV0dXJlPC9zcGFuPiBkYXRlczo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LWFjY2Vzc2tleSAtLT5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgYmluZDpjaGVja2VkPXtlZGl0YWJsZVRhc2suZm9yd2FyZE9ubHl9XG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZm9yd2FyZE9ubHlcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhc2stbGlzdC1pdGVtLWNoZWNrYm94IHRhc2tzLW1vZGFsLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNza2V5PXthY2Nlc3NrZXkoXCJmXCIpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG4gICAgICAgIDwhLS0gIFN0YXR1cyAgLS0+XG4gICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFza3MtbW9kYWwtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0YXR1c1wiPlN0YXR1cyA8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBiaW5kOnZhbHVlPXtlZGl0YWJsZVRhc2suc3RhdHVzfSBpZD1cInN0YXR1cy10eXBlXCIgY2xhc3M9XCJkcm9wZG93blwiPlxuICAgICAgICAgICAgICAgIHsjZWFjaCBzdGF0dXNPcHRpb25zIGFzIHN0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT17c3RhdHVzfT57c3RhdHVzLm5hbWV9IFt7c3RhdHVzLnN5bWJvbH1dPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgey9lYWNofVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YXNrcy1tb2RhbC1zZWN0aW9uIHRhc2tzLW1vZGFsLXN0YXR1c1wiPlxuICAgICAgICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG4gICAgICAgICAgICA8IS0tICBDb21wbGV0ZWQgIC0tPlxuICAgICAgICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGF0dXNcIj5Db21wbGV0ZWQ6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhc2stbGlzdC1pdGVtLWNoZWNrYm94IHRhc2tzLW1vZGFsLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17ZWRpdGFibGVUYXNrLnN0YXR1cy5pc0NvbXBsZXRlZCgpfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG4gICAgICAgICAgICA8IS0tICBEb25lIG9uICAtLT5cbiAgICAgICAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5Eb25lIG9uOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8Y29kZT57QGh0bWwgcGFyc2VkRG9uZX08L2NvZGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YXNrcy1tb2RhbC1zZWN0aW9uIHRhc2tzLW1vZGFsLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwibW9kLWN0YVwiPkFwcGx5PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbjpjbGljaz17X29uQ2xvc2V9PkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+XG48L2Rpdj5cbiIsICIvLyBBYmJyZXZpYXRpb25zIGZvciBlbnRlcmluZyBkYXRlcyB3aXRoIGNocm9ub1xuLy8gTUFJTlRFTkFOQ0UgTk9URTpcbi8vICAgICAgSWYgYWRkaW5nIG1vcmUgYWJicmV2aWF0aW9ucywgcGxlYXNlIHJldmlldyBkYXRlUGxhY2Vob2xkZXIgaW4gc3JjL3VpL0VkaXRUYXNrLnN2ZWx0ZVxuY29uc3QgYWJicmV2aWF0aW9ucyA9IHtcbiAgICB0ZDogJ3RvZGF5JyxcbiAgICB0bTogJ3RvbW9ycm93JyxcbiAgICB5ZDogJ3llc3RlcmRheScsXG4gICAgdHc6ICd0aGlzIHdlZWsnLFxuICAgIG53OiAnbmV4dCB3ZWVrJyxcbiAgICB3ZWVrZW5kOiAnc2F0JyxcbiAgICB3ZTogJ3NhdCcsXG59O1xuXG4vKipcbiAqIEV4cGFuZCBhbnkgcmVjb2duaXNlZCBhYmJyZXZpYXRpb25zIGZvciBkYXRlcy5cbiAqXG4gKiBJbXBvcnRhbnQ6IHRoZSBhYmJyZXZpYXRpb24gaXMgb25seSBleHBhbmRlZCBpZiBpdCBpcyBmb29sb3dlZCBieSBhIHNwYWNlLlxuICpcbiAqIEZvciBleGFtcGxlLCAndGQgJyBpcyBleHBhbmRlZCB0byAndG9kYXknXG4gKiBAcGFyYW0gZGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZG9BdXRvY29tcGxldGUoZGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMoYWJicmV2aWF0aW9ucykpIHtcbiAgICAgICAgZGF0ZSA9IGRhdGUucmVwbGFjZShSZWdFeHAoYFxcXFxiJHtrZXl9XFxcXHNgLCAnaScpLCB2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbn1cbiIsICJpbXBvcnQgeyBTdGF0dXMgfSBmcm9tICcuLi9TdGF0dXMnO1xuaW1wb3J0IHsgUHJpb3JpdHksIFRhc2ssIFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMgfSBmcm9tICcuLi9UYXNrJztcbmltcG9ydCB7IERhdGVGYWxsYmFjayB9IGZyb20gJy4uL0RhdGVGYWxsYmFjayc7XG5pbXBvcnQgeyBTdGF0dXNSZWdpc3RyeSB9IGZyb20gJy4uL1N0YXR1c1JlZ2lzdHJ5JztcblxuLyoqXG4gKiBSZWFkIGFueSBtYXJrZG93biBsaW5lIGFuZCB0cmVhdCBpdCBhcyBhIHRhc2ssIGZvciB0aGUgcHVycG9zZXMgb2ZcbiAqIHRoZSAnQ3JlYXRlIG9yIGVkaXQgdGFzaycgbW9kYWwuXG4gKlxuICogVW5saWtlIHtAbGluayBUYXNrLmZyb21MaW5lfSwgd2hpY2ggb25seSBwcm9jZXNzZXMgdGFza3NcbiAqIGFscmVhZHkgcmVjb2duaXNlZCBieSB0aGUgVGFza3MgcGx1Z2luLCB0aGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbnkgbGluZS5cbiAqXG4gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiB0aGF0IGNvbW1hbmQsIHdoaWNoIGhhcyBiZWVuIHNlcGFyYXRlZFxuICogb3V0IHRvIGEgZGlmZmVyZW50IHNvdXJjZSBmaWxlIGluIG9yZGVyIHRvIGFsbG93IGl0cyBsb2dpYyB0byBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGxpbmUgLSBUaGUgbGluZSB0aGUgdXNlciBoYWQgY2xpY2tlZCBvbiB3aGVuIHJ1bm5pbmcgJ0NyZWF0ZSBvciBlZGl0IHRhc2snIGNvbW1hbmRcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgbGluZVxuICovXG5leHBvcnQgY29uc3QgdGFza0Zyb21MaW5lID0gKHsgbGluZSwgcGF0aCB9OiB7IGxpbmU6IHN0cmluZzsgcGF0aDogc3RyaW5nIH0pOiBUYXNrID0+IHtcbiAgICBjb25zdCBmYWxsYmFja0RhdGUgPSBEYXRlRmFsbGJhY2suZnJvbVBhdGgocGF0aCk7XG5cbiAgICBjb25zdCB0YXNrID0gVGFzay5mcm9tTGluZSh7XG4gICAgICAgIGxpbmUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHNlY3Rpb25TdGFydDogMCwgLy8gV2UgZG9uJ3QgbmVlZCB0aGlzIHRvIHRvZ2dsZSBpdCBoZXJlIGluIHRoZSBlZGl0b3IuXG4gICAgICAgIHNlY3Rpb25JbmRleDogMCwgLy8gV2UgZG9uJ3QgbmVlZCB0aGlzIHRvIHRvZ2dsZSBpdCBoZXJlIGluIHRoZSBlZGl0b3IuXG4gICAgICAgIHByZWNlZGluZ0hlYWRlcjogbnVsbCwgLy8gV2UgZG9uJ3QgbmVlZCB0aGlzIHRvIHRvZ2dsZSBpdCBoZXJlIGluIHRoZSBlZGl0b3IuXG4gICAgICAgIGZhbGxiYWNrRGF0ZSwgLy8gc2V0IHRoZSBzY2hlZHVsZWQgZGF0ZSBmcm9tIHRoZSBmaWxlbmFtZSwgc28gaXQgY2FuIGJlIGRpc3BsYXllZCBpbiB0aGUgZGlhbG9nXG4gICAgfSk7XG5cbiAgICBpZiAodGFzayAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGFzaztcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBhcmUgbm90IG9uIGEgbGluZSBvZiBhIHRhc2ssIHdlIHRha2Ugd2hhdCB3ZSBoYXZlLlxuICAgIC8vIFRoZSBub24tdGFzayBsaW5lIGNhbiBzdGlsbCBiZSBhIGNoZWNrbGlzdCwgZm9yIGV4YW1wbGUgaWYgaXQgaXMgbGFja2luZyB0aGUgZ2xvYmFsIGZpbHRlci5cbiAgICBjb25zdCBub25UYXNrTWF0Y2ggPSBsaW5lLm1hdGNoKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMubm9uVGFza1JlZ2V4KTtcbiAgICBpZiAobm9uVGFza01hdGNoID09PSBudWxsKSB7XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW47IGV2ZXJ5dGhpbmcgaW4gdGhlIHJlZ2V4IGlzIG9wdGlvbmFsLlxuICAgICAgICBjb25zb2xlLmVycm9yKCdUYXNrczogQ2Fubm90IGNyZWF0ZSB0YXNrIG9uIGxpbmU6JywgbGluZSk7XG4gICAgICAgIHJldHVybiBuZXcgVGFzayh7XG4gICAgICAgICAgICBzdGF0dXM6IFN0YXR1cy5UT0RPLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGluZGVudGF0aW9uOiAnJyxcbiAgICAgICAgICAgIGxpc3RNYXJrZXI6ICctJyxcbiAgICAgICAgICAgIHByaW9yaXR5OiBQcmlvcml0eS5Ob25lLFxuICAgICAgICAgICAgc3RhcnREYXRlOiBudWxsLFxuICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZTogbnVsbCxcbiAgICAgICAgICAgIGR1ZURhdGU6IG51bGwsXG4gICAgICAgICAgICBkb25lRGF0ZTogbnVsbCxcbiAgICAgICAgICAgIHJlY3VycmVuY2U6IG51bGwsXG4gICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSBmb2xsb3dpbmcgZmllbGRzIHRvIGVkaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICAgICAgc2VjdGlvblN0YXJ0OiAwLFxuICAgICAgICAgICAgc2VjdGlvbkluZGV4OiAwLFxuICAgICAgICAgICAgcHJlY2VkaW5nSGVhZGVyOiBudWxsLFxuICAgICAgICAgICAgYmxvY2tMaW5rOiAnJyxcbiAgICAgICAgICAgIHRhZ3M6IFtdLFxuICAgICAgICAgICAgb3JpZ2luYWxNYXJrZG93bjogJycsXG4gICAgICAgICAgICBzY2hlZHVsZWREYXRlSXNJbmZlcnJlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGVudGF0aW9uOiBzdHJpbmcgPSBub25UYXNrTWF0Y2hbMV07XG4gICAgY29uc3QgbGlzdE1hcmtlciA9IG5vblRhc2tNYXRjaFsyXSA/PyAnLSc7XG4gICAgY29uc3Qgc3RhdHVzU3RyaW5nOiBzdHJpbmcgPSBub25UYXNrTWF0Y2hbNF0gPz8gJyAnO1xuICAgIGNvbnN0IHN0YXR1cyA9IFN0YXR1c1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuYnlTeW1ib2xPckNyZWF0ZShzdGF0dXNTdHJpbmcpO1xuXG4gICAgbGV0IGRlc2NyaXB0aW9uOiBzdHJpbmcgPSBub25UYXNrTWF0Y2hbNV07XG5cbiAgICBjb25zdCBibG9ja0xpbmtNYXRjaCA9IGxpbmUubWF0Y2goVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5ibG9ja0xpbmtSZWdleCk7XG4gICAgY29uc3QgYmxvY2tMaW5rID0gYmxvY2tMaW5rTWF0Y2ggIT09IG51bGwgPyBibG9ja0xpbmtNYXRjaFswXSA6ICcnO1xuXG4gICAgaWYgKGJsb2NrTGluayAhPT0gJycpIHtcbiAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMuYmxvY2tMaW5rUmVnZXgsICcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRhc2soe1xuICAgICAgICBzdGF0dXMsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBwYXRoLFxuICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgbGlzdE1hcmtlcixcbiAgICAgICAgYmxvY2tMaW5rLFxuICAgICAgICBwcmlvcml0eTogUHJpb3JpdHkuTm9uZSxcbiAgICAgICAgc3RhcnREYXRlOiBudWxsLFxuICAgICAgICBzY2hlZHVsZWREYXRlOiBudWxsLFxuICAgICAgICBkdWVEYXRlOiBudWxsLFxuICAgICAgICBkb25lRGF0ZTogbnVsbCxcbiAgICAgICAgcmVjdXJyZW5jZTogbnVsbCxcbiAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgZm9sbG93aW5nIGZpZWxkcyB0byBlZGl0IGhlcmUgaW4gdGhlIGVkaXRvci5cbiAgICAgICAgc2VjdGlvblN0YXJ0OiAwLFxuICAgICAgICBzZWN0aW9uSW5kZXg6IDAsXG4gICAgICAgIHByZWNlZGluZ0hlYWRlcjogbnVsbCxcbiAgICAgICAgdGFnczogW10sXG4gICAgICAgIG9yaWdpbmFsTWFya2Rvd246ICcnLFxuICAgICAgICAvLyBOb3QgbmVlZGVkIHNpbmNlIHRoZSBpbmZlcnJlZCBzdGF0dXMgaXMgYWx3YXlzIHJlLWNvbXB1dGVkIGFmdGVyIHN1Ym1pdHRpbmcuXG4gICAgICAgIHNjaGVkdWxlZERhdGVJc0luZmVycmVkOiBmYWxzZSxcbiAgICB9KTtcbn07XG4iLCAiaW1wb3J0IHsgRWRpdG9yLCBNYXJrZG93blZpZXcsIFZpZXcgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBTdGF0dXNSZWdpc3RyeSB9IGZyb20gJy4uL1N0YXR1c1JlZ2lzdHJ5JztcblxuaW1wb3J0IHsgVGFzaywgVGFza1JlZ3VsYXJFeHByZXNzaW9ucyB9IGZyb20gJy4uL1Rhc2snO1xuXG5leHBvcnQgY29uc3QgdG9nZ2xlRG9uZSA9IChjaGVja2luZzogYm9vbGVhbiwgZWRpdG9yOiBFZGl0b3IsIHZpZXc6IFZpZXcpID0+IHtcbiAgICBpZiAoY2hlY2tpbmcpIHtcbiAgICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBub3QgaW4gYSBtYXJrZG93biB2aWV3LCB0aGUgY29tbWFuZCBzaG91bGRuJ3QgYmUgc2hvd24uXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgY29tbWFuZCBzaG91bGQgYWx3YXlzIHRyaWdnZXIgaW4gYSBtYXJrZG93biB2aWV3OlxuICAgICAgICAvLyAtIENvbnZlcnQgbGluZXMgdG8gbGlzdCBpdGVtcy5cbiAgICAgICAgLy8gLSBDb252ZXJ0IGxpc3QgaXRlbXMgdG8gdGFza3MuXG4gICAgICAgIC8vIC0gVG9nZ2xlIHRhc2tzJyBzdGF0dXMuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghKHZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gZHVlIHRvIGNoZWNrIGFib3ZlLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2UgYXJlIGNlcnRhaW4gd2UgYXJlIGluIHRoZSBlZGl0b3IgZHVlIHRvIHRoZSBjaGVjayBhYm92ZS5cbiAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdDdXJzb3JQb3MgPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XG4gICAgY29uc3QgbGluZU51bWJlciA9IG9yaWdDdXJzb3JQb3MubGluZTtcbiAgICBjb25zdCBsaW5lID0gZWRpdG9yLmdldExpbmUobGluZU51bWJlcik7XG5cbiAgICBjb25zdCB0b2dnbGVkTGluZSA9IHRvZ2dsZUxpbmUobGluZSwgcGF0aCk7XG4gICAgZWRpdG9yLnNldExpbmUobGluZU51bWJlciwgdG9nZ2xlZExpbmUpO1xuXG4gICAgLyogQ3Vyc29yIHBvc2l0aW9ucyBhcmUgMC1iYXNlZCBmb3IgYm90aCBcImxpbmVcIiBhbmQgXCJjaFwiIG9mZnNldHMuXG4gICAgICogSWYgXCJjaFwiIG9mZnNldCBiaWdnZXIgdGhhbiB0aGUgbGluZSBsZW5ndGgsIHdpbGwganVzdCBjb250aW51ZSB0byBuZXh0IGxpbmUocykuXG4gICAgICogQnkgZGVmYXVsdCBcImVkaXRvci5zZXRMaW5lKClcIiBhcHBlYXJzIHRvIGVpdGhlciBrZWVwIHRoZSBjdXJzb3IgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBpZiBpdCBpcyBhbHJlYWR5IHRoZXJlLFxuICAgICAqIC4uLm9yIG1vdmUgaXQgdG8gdGhlIGJlZ2lubmluZyBpZiBpdCBpcyBhbnl3aGVyZSBlbHNlLiBMaWNhdCBleHBsYWluZWQgdGhpcyBvbiBEaXNjb3JkIGFzIFwic3RpY2tpbmdcIiB0byBvbmUgc2lkZSBvciBhbm90aGVyLlxuICAgICAqIFByZXZpb3VzbHksIFRhc2tzIHdvdWxkIHJlc2V0K21vdmUtcmlnaHQgdGhlIGN1cnNvciBpZiB0aGVyZSB3YXMgYW55IHRleHQgaW4gdGhlIGxpbmUsIGluY2x1ZGluZyBzb21ldGhpbmcgaW5zaWRlIHRoZSBjaGVja2JveCxcbiAgICAgKiBtb3ZpbmcgcmlnaHQgYnkgKHRvZ2dsZWRMaW5lLmxlbmd0aCAtIGxpbmUubGVuZ3RoKS4gKFN1cHBvc2VkbHksIGJ1dCBpdCBzdGlsbCBtb3ZlcyByaWdodCwganVzdCBieSBsZXNzLCBpZiB0aGUgdG9nZ2xlZExpbmUgaXMgc2hvcnRlciB0aGFuIHRoZSBvbGQpLlxuICAgICAqIFRoaXMgbWlzc2VkIHRoZSBuZWVkIHRvIG1vdmUgcmlnaHQgb24gdGhlIGJsYW5rIGxpbmUgdG8gXCItIFwiIGNhc2UgKGlzc3VlICM0NjApLlxuICAgICAqIFRoaXMgYWxzbyBtZWFudCB0aGUgY3Vyc29yIG1vdmVkIG5vbnNlbnNpY2FsbHkgaWYgaXQgd2FzIGJlZm9yZSBhbnkgbmV3bHkgaW5zZXJ0ZWQgdGV4dCxcbiAgICAgKiBzdWNoIGFzIGEgZG9uZSBkYXRlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUsIG9yIGFmdGVyIHRoZSBcIj5cIiB3aGVuIFwiPiAtXCIgY2hhbmdlZCB0byBcIj4gLSBbIF1cIi5cbiAgICAgKi9cbiAgICAvLyBSZXNldCB0aGUgY3Vyc29yLiBVc2UgdGhlIGRpZmZlcmVuY2UgaW4gbGluZSBsZW5ndGhzIGFuZCBvcmlnaW5hbCBjdXJzb3IgcG9zaXRpb24gdG8gZGV0ZXJtaW5lIGJlaGF2aW9yXG4gICAgZWRpdG9yLnNldEN1cnNvcih7XG4gICAgICAgIGxpbmU6IG9yaWdDdXJzb3JQb3MubGluZSxcbiAgICAgICAgY2g6IGNhbGN1bGF0ZUN1cnNvck9mZnNldChvcmlnQ3Vyc29yUG9zLmNoLCBsaW5lLCB0b2dnbGVkTGluZSksXG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdG9nZ2xlTGluZSA9IChsaW5lOiBzdHJpbmcsIHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGxldCB0b2dnbGVkTGluZSA9IGxpbmU7XG5cbiAgICBjb25zdCB0YXNrID0gVGFzay5mcm9tTGluZSh7XG4gICAgICAgIC8vIFdoeSBhcmUgd2UgdXNpbmcgVGFzay5mcm9tTGluZSBpbnN0ZWFkIG9mIHRoZSBDYWNoZSBoZXJlP1xuICAgICAgICBsaW5lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBzZWN0aW9uU3RhcnQ6IDAsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICBzZWN0aW9uSW5kZXg6IDAsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICBwcmVjZWRpbmdIZWFkZXI6IG51bGwsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgICAgICBmYWxsYmFja0RhdGU6IG51bGwsIC8vIFdlIGRvbid0IG5lZWQgdGhpcyB0byB0b2dnbGUgaXQgaGVyZSBpbiB0aGUgZWRpdG9yLlxuICAgIH0pO1xuICAgIGlmICh0YXNrICE9PSBudWxsKSB7XG4gICAgICAgIHRvZ2dsZWRMaW5lID0gdG9nZ2xlVGFzayh0YXNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgdGFzayBpcyBudWxsIHRoaXMgbWVhbnMgdGhhdCB3ZSBoYXZlIG9uZSBvZjpcbiAgICAgICAgLy8gMS4gYSByZWd1bGFyIGNoZWNrbGlzdCBpdGVtXG4gICAgICAgIC8vIDIuIGEgbGlzdCBpdGVtXG4gICAgICAgIC8vIDMuIGEgc2ltcGxlIHRleHQgbGluZVxuICAgICAgICAvLyA0LiBhIHN0YW5kYXJkIHRhc2ssIGJ1dCB3aGljaCBkb2VzIG5vdCBjb250YWluIHRoZSBnbG9iYWwgZmlsdGVyLCB0byBiZSB0b2dnbGVkLCBidXQgbm8gZG9uZSBkYXRlIGFkZGVkLlxuXG4gICAgICAgIC8vIFRoZSB0YXNrIHJlZ2V4IHdpbGwgbWF0Y2ggY2hlY2tsaXN0IGl0ZW1zLlxuICAgICAgICBjb25zdCByZWdleE1hdGNoID0gbGluZS5tYXRjaChUYXNrUmVndWxhckV4cHJlc3Npb25zLnRhc2tSZWdleCk7XG4gICAgICAgIGlmIChyZWdleE1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUb2dnbGUgdGhlIHN0YXR1cyBvZiB0aGUgY2hlY2tsaXN0IGl0ZW0uXG4gICAgICAgICAgICBjb25zdCBzdGF0dXNTdHJpbmcgPSByZWdleE1hdGNoWzNdO1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5ieVN5bWJvbChzdGF0dXNTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgbmV3U3RhdHVzU3RyaW5nID0gc3RhdHVzLm5leHRTdGF0dXNTeW1ib2w7XG4gICAgICAgICAgICB0b2dnbGVkTGluZSA9IGxpbmUucmVwbGFjZShUYXNrUmVndWxhckV4cHJlc3Npb25zLnRhc2tSZWdleCwgYCQxLSBbJHtuZXdTdGF0dXNTdHJpbmd9XSAkNGApO1xuICAgICAgICB9IGVsc2UgaWYgKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMubGlzdEl0ZW1SZWdleC50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBsaXN0IGl0ZW0gdG8gYSBjaGVja2xpc3QgaXRlbS5cbiAgICAgICAgICAgIHRvZ2dsZWRMaW5lID0gbGluZS5yZXBsYWNlKFRhc2tSZWd1bGFyRXhwcmVzc2lvbnMubGlzdEl0ZW1SZWdleCwgJyQxJDIgWyBdJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBsaW5lIHRvIGEgbGlzdCBpdGVtLlxuICAgICAgICAgICAgdG9nZ2xlZExpbmUgPSBsaW5lLnJlcGxhY2UoVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5pbmRlbnRhdGlvblJlZ2V4LCAnJDEtICcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvZ2dsZWRMaW5lO1xufTtcblxuY29uc3QgdG9nZ2xlVGFzayA9ICh0YXNrOiBUYXNrKTogc3RyaW5nID0+IHtcbiAgICAvLyBUb2dnbGluZyBhIHJlY3VycmluZyB0YXNrIHdpbGwgcHJvZHVjZSB0d28gVGFza3NcbiAgICBjb25zdCB0b2dnbGVkVGFza3MgPSB0YXNrLnRvZ2dsZSgpO1xuICAgIHJldHVybiB0b2dnbGVkVGFza3MubWFwKCh0YXNrOiBUYXNrKSA9PiB0YXNrLnRvRmlsZUxpbmVTdHJpbmcoKSkuam9pbignXFxuJyk7XG59O1xuXG4vKiBDYXNlcyAoYW5vdGhlciB3YXkpOlxuMCkgTGluZSBnb3Qgc2hvcnRlcjogZG9uZSBkYXRlIHJlbW92ZWQgZnJvbSBlbmQgb2YgdGFzaywgY3Vyc29yIHNob3VsZCByZXNldCBvciBiZSBtb3ZlZCB0byBuZXcgZW5kIGlmIHJlc2V0IHBvc2l0aW9uIGlzIHRvbyBsb25nLlxuMSkgTGluZSBzdGF5ZWQgdGhlIHNhbWUgbGVuZ3RoOiBDaGVja2luZyAmIHVuY2hlY2tpbmcgdGV4dGJveCB0aGF0IGlzIG5vdCBhIHRhc2sgLSBjdXJzb3Igc2hvdWxkIHJlc2V0LlxuMikgTGluZSBnb3QgbG9uZ2VyOlxuICAgIGEpIExpc3QgbWFya2VyIGNvdWxkIGhhdmUgYmVlbiBhZGRlZC4gRmluZCBpdCBpbiBuZXcgdGV4dDogaWYgY3Vyc29yIHdhcyBhdCBvciByaWdodCBvZiB3aGVyZSBpdCB3YXMgYWRkZWQsIG1vdmUgdGhlIGN1cnNvciByaWdodC5cbiAgICBiKSBFbXB0eSBjaGVja2JveCBjb3VsZCBoYXZlIGJlZW4gYWRkZWQuIElmIGN1cnNvciB3YXMgYWZ0ZXIgdGhlIGxpc3QgbWFya2VyIChpbiBvbGQgb3IgbmV3KSwgaXQgc2hvdWxkIG1vdmUgcmlnaHQuXG4gICAgYykgRG9uZSBlbW9qaSBhbmQgZGF0ZSBjb3VsZCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGVuZC4gQ3Vyc29yIHNob3VsZCByZXNldCBpZiAwLCBhbmQgc3RheSBlbmQgb2YgbGluZSBvdGhlcndpc2UuXG4gICAgZCkgUmVjdXJyaW5nIHRhc2sgY291bGQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgYW5kIGRvbmUgZW1vamkgYW5kIGRhdGUgYWRkZWQgdG8gdGhlIGVuZC4gQ3VycmVudCBiZWhhdmlvciBhZGRzIHNvIG11Y2ggdG8gdGhlIG9mZnNldCB0byBtYWtlIHRoaXMgcmlnaHQuXG5cblNvIGN1cnNvciBzaG91bGQgYmUgcmVzZXQgaWYgMCwgd2hpY2ggaW5jbHVkZXMgYmVpbmcgbW92ZWQgdG8gbmV3IGVuZCBpZiBnb3Qgc2hvcnRlci4gVGhlbiBtaWdodCBuZWVkIHRvIG1vdmUgcmlnaHQgMiBvciAzLlxuKi9cbmV4cG9ydCBjb25zdCBjYWxjdWxhdGVDdXJzb3JPZmZzZXQgPSAob3JpZ0N1cnNvckNoOiBudW1iZXIsIGxpbmU6IHN0cmluZywgdG9nZ2xlZExpbmU6IHN0cmluZykgPT4ge1xuICAgIGxldCBuZXdMaW5lTGVuID0gdG9nZ2xlZExpbmUubGVuZ3RoO1xuICAgIGlmIChuZXdMaW5lTGVuIDw9IGxpbmUubGVuZ3RoKSB7XG4gICAgICAgIC8vIExpbmUgZ290IHNob3J0ZXIgb3Igc3RheWVkIHNhbWUgbGVuZ3RoLiBSZXNldCBjdXJzb3IgdG8gb3JpZ2luYWwgcG9zaXRpb24sIGNhcHBlZCBhdCBlbmQgb2YgbGluZS5cbiAgICAgICAgcmV0dXJuIG9yaWdDdXJzb3JDaCA+PSB0b2dnbGVkTGluZS5sZW5ndGggPyBuZXdMaW5lTGVuIDogb3JpZ0N1cnNvckNoO1xuICAgIH1cblxuICAgIC8vIFNwZWNpYWwtY2FzZSBmb3IgZG9uZS1kYXRlIGFwcGVuZCwgZml4ZXMgIzQ0OVxuICAgIGNvbnN0IGRvbmVEYXRlTGVuZ3RoID0gJyBcdTI3MDUgWVlZWS1NTS1ERCcubGVuZ3RoO1xuICAgIGlmICh0b2dnbGVkTGluZS5tYXRjaChUYXNrUmVndWxhckV4cHJlc3Npb25zLmRvbmVEYXRlUmVnZXgpICYmIG5ld0xpbmVMZW4gLSBsaW5lLmxlbmd0aCA+PSBkb25lRGF0ZUxlbmd0aCkge1xuICAgICAgICBuZXdMaW5lTGVuIC09IGRvbmVEYXRlTGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSByZWN1cnJpbmcgdGFza3M6IGVudGlyZSBsaW5lIHBsdXMgbmV3bGluZSBwcmVwZW5kZWQuIEZpeCBmb3IgIzQ0OSBhYm92ZSBtZWFucyBhcHBlbmRlZCBkb25lIGRhdGUgdHJlYXRlZCBjb3JyZWN0bHkuXG4gICAgaWYgKG5ld0xpbmVMZW4gPj0gMiAqIGxpbmUubGVuZ3RoICYmIHRvZ2dsZWRMaW5lLnNlYXJjaCgnLitcXG4uKycpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gb3JpZ0N1cnNvckNoICsgbmV3TGluZUxlbiAtIGxpbmUubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qIExpbmUgZ290IGxvbmdlciwgbm90IGEgcmVjdXJyaW5nIHRhc2suIFdlcmUgdGhlIGFkZGVkIGNoYXJhY3RlcnMgYmVmb3JlIG9yIGFmdGVyIHRoZSBjdXJzb3I/XG4gICAgICogQXQgdGhpcyBwb2ludCB0aGUgbGluZSBpcyBhdCBsZWFzdCBhIGxpc3QgaXRlbS4gRmluZCB0aGUgZmlyc3QgbGlzdCBtYXJrZXIuICovXG4gICAgY29uc3QgZmlyc3RMaXN0SXRlbUNoYXIgPSB0b2dnbGVkTGluZS5zZWFyY2goL1stKl0vKTtcbiAgICBpZiAob3JpZ0N1cnNvckNoIDwgZmlyc3RMaXN0SXRlbUNoYXIpIHtcbiAgICAgICAgLy8gQ3Vyc29yIHdhcyBpbiBpbmRlbnRhdGlvbi4gUmVzZXQgdG8gd2hlcmUgaXQgd2FzLlxuICAgICAgICByZXR1cm4gb3JpZ0N1cnNvckNoO1xuICAgIH1cblxuICAgIHJldHVybiBvcmlnQ3Vyc29yQ2ggKyBuZXdMaW5lTGVuIC0gbGluZS5sZW5ndGg7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgQXBwLCBFZGl0b3IsIFBsdWdpbiwgVmlldyB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IGNyZWF0ZU9yRWRpdCB9IGZyb20gJy4vQ3JlYXRlT3JFZGl0JztcblxuaW1wb3J0IHsgdG9nZ2xlRG9uZSB9IGZyb20gJy4vVG9nZ2xlRG9uZSc7XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kcyB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcblxuICAgIHByaXZhdGUgZ2V0IGFwcCgpOiBBcHAge1xuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW4uYXBwO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHsgcGx1Z2luIH06IHsgcGx1Z2luOiBQbHVnaW4gfSkge1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblxuICAgICAgICBwbHVnaW4uYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogJ2VkaXQtdGFzaycsXG4gICAgICAgICAgICBuYW1lOiAnQ3JlYXRlIG9yIGVkaXQgdGFzaycsXG4gICAgICAgICAgICBpY29uOiAncGVuY2lsJyxcbiAgICAgICAgICAgIGVkaXRvckNoZWNrQ2FsbGJhY2s6IChjaGVja2luZzogYm9vbGVhbiwgZWRpdG9yOiBFZGl0b3IsIHZpZXc6IFZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlT3JFZGl0KGNoZWNraW5nLCBlZGl0b3IsIHZpZXcsIHRoaXMuYXBwKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBsdWdpbi5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiAndG9nZ2xlLWRvbmUnLFxuICAgICAgICAgICAgbmFtZTogJ1RvZ2dsZSB0YXNrIGRvbmUnLFxuICAgICAgICAgICAgaWNvbjogJ2NoZWNrLWluLWNpcmNsZScsXG4gICAgICAgICAgICBlZGl0b3JDaGVja0NhbGxiYWNrOiB0b2dnbGVEb25lLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFdmVudFJlZiwgRXZlbnRzIGFzIE9ic2lkaWFuRXZlbnRzIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFN0YXRlIH0gZnJvbSAnLi9DYWNoZSc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuXG5lbnVtIEV2ZW50IHtcbiAgICBDYWNoZVVwZGF0ZSA9ICdvYnNpZGlhbi10YXNrcy1wbHVnaW46Y2FjaGUtdXBkYXRlJyxcbiAgICBSZXF1ZXN0Q2FjaGVVcGRhdGUgPSAnb2JzaWRpYW4tdGFza3MtcGx1Z2luOnJlcXVlc3QtY2FjaGUtdXBkYXRlJyxcbn1cblxuaW50ZXJmYWNlIENhY2hlVXBkYXRlRGF0YSB7XG4gICAgdGFza3M6IFRhc2tbXTtcbiAgICBzdGF0ZTogU3RhdGU7XG59XG5cbmV4cG9ydCBjbGFzcyBUYXNrc0V2ZW50cyB7XG4gICAgcHJpdmF0ZSBvYnNpZGlhbkV2ZW50czogT2JzaWRpYW5FdmVudHM7XG5cbiAgICBjb25zdHJ1Y3Rvcih7IG9ic2lkaWFuRXZlbnRzIH06IHsgb2JzaWRpYW5FdmVudHM6IE9ic2lkaWFuRXZlbnRzIH0pIHtcbiAgICAgICAgdGhpcy5vYnNpZGlhbkV2ZW50cyA9IG9ic2lkaWFuRXZlbnRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNhY2hlVXBkYXRlKGhhbmRsZXI6IChjYWNoZURhdGE6IENhY2hlVXBkYXRlRGF0YSkgPT4gdm9pZCk6IEV2ZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5FdmVudHMub24oRXZlbnQuQ2FjaGVVcGRhdGUsIGhhbmRsZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyQ2FjaGVVcGRhdGUoY2FjaGVEYXRhOiBDYWNoZVVwZGF0ZURhdGEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vYnNpZGlhbkV2ZW50cy50cmlnZ2VyKEV2ZW50LkNhY2hlVXBkYXRlLCBjYWNoZURhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblJlcXVlc3RDYWNoZVVwZGF0ZShoYW5kbGVyOiAoZm46IChjYWNoZURhdGE6IENhY2hlVXBkYXRlRGF0YSkgPT4gdm9pZCkgPT4gdm9pZCk6IEV2ZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5FdmVudHMub24oRXZlbnQuUmVxdWVzdENhY2hlVXBkYXRlLCBoYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlclJlcXVlc3RDYWNoZVVwZGF0ZShmbjogKGNhY2hlRGF0YTogQ2FjaGVVcGRhdGVEYXRhKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub2JzaWRpYW5FdmVudHMudHJpZ2dlcihFdmVudC5SZXF1ZXN0Q2FjaGVVcGRhdGUsIGZuKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmKGV2ZW50UmVmOiBFdmVudFJlZik6IHZvaWQge1xuICAgICAgICB0aGlzLm9ic2lkaWFuRXZlbnRzLm9mZnJlZihldmVudFJlZik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnQ29uZmlnL1NldHRpbmdzJztcblxuaW1wb3J0IHR5cGUgeyBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi9UYXNrJztcblxuZXhwb3J0IGNsYXNzIElubGluZVJlbmRlcmVyIHtcbiAgICBjb25zdHJ1Y3Rvcih7IHBsdWdpbiB9OiB7IHBsdWdpbjogUGx1Z2luIH0pIHtcbiAgICAgICAgcGx1Z2luLnJlZ2lzdGVyTWFya2Rvd25Qb3N0UHJvY2Vzc29yKHRoaXMuX21hcmtkb3duUG9zdFByb2Nlc3Nvci5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFya2Rvd25Qb3N0UHJvY2Vzc29yID0gdGhpcy5fbWFya2Rvd25Qb3N0UHJvY2Vzc29yLmJpbmQodGhpcyk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHJlbmRlcnMgYSBmaWxlJ3MgdGFzayBsaXN0IHdoZW4gcmVuZGVyZWQgaW4gUmVhZGluZyBWaWV3LCB1c2luZyByb3VnaGx5IHRoZSBzYW1lIHBpcGVsaW5lXG4gICAgICogb2YgUXVlcnlSZW5kZXJlciAoZS5nLiBpdCByZW1vdmVzIHRoZSBnbG9iYWwgZmlsdGVyIGFuZCBoYW5kbGVzIG90aGVyIGZvcm1hdHRpbmcpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgX21hcmtkb3duUG9zdFByb2Nlc3NvcihlbGVtZW50OiBIVE1MRWxlbWVudCwgY29udGV4dDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IGdsb2JhbEZpbHRlciB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgY29uc3QgcmVuZGVyZWRFbGVtZW50cyA9IGVsZW1lbnQuZmluZEFsbCgnLnRhc2stbGlzdC1pdGVtJykuZmlsdGVyKCh0YXNrSXRlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGluZXNUZXh0ID0gdGFza0l0ZW0udGV4dENvbnRlbnQ/LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIGlmIChsaW5lc1RleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT25seSB0aGUgZmlyc3QgbGluZS4gQ2FuIGJlIG11bHRpcGxlIGxpbmVzIGlmIGFuIExJIGVsZW1lbnQgY29udGFpbnMgYW4gVUwuXG4gICAgICAgICAgICAvLyBXYW50IHRvIG1hdGNoIHRoZSB0b3AgbGV2ZWwgTEkgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBjaGlsZHJlbi5cbiAgICAgICAgICAgIC8vIFRoZXJlIHdhcyBhIGZhbHNlIHBvc2l0aXZlLCB3aGVuIHRoZSBMSSB3YXNuJ3QgYSB0YXNrIGl0c2VsZiwgYnV0IGNvbnRhaW5lZCB0aGVcbiAgICAgICAgICAgIC8vIGdsb2JhbCBmaWx0ZXIgaW4gY2hpbGQgTElzLlxuICAgICAgICAgICAgbGV0IGZpcnN0TGluZVRleHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBUaGUgZmlyc3QgbGluZSBpcyB0aGUgZmlyc3QgbGluZSB0aGF0IGlzIG5vdCBlbXB0eS4gRW1wdHkgbGluZXMgY2FuIGV4aXN0IHdoZW5cbiAgICAgICAgICAgIC8vIHRoZSBjaGVja2xpc3QgaW4gbWFya2Rvd24gaW5jbHVkZXMgYmxhbmsgbGluZXMgKHNlZSAjMzEzKS5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNUZXh0Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVzVGV4dFtpXSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RMaW5lVGV4dCA9IGxpbmVzVGV4dFtpXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmlyc3RMaW5lVGV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZpcnN0TGluZVRleHQuaW5jbHVkZXMoZ2xvYmFsRmlsdGVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZW5kZXJlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gTm8gdGFza3MgbWVhbnMgbm90aGluZyB0byBkby5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdGggPSBjb250ZXh0LnNvdXJjZVBhdGg7XG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBjb250ZXh0LmdldFNlY3Rpb25JbmZvKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChzZWN0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBXZSBjYW5ub3QgcHJvY2VzcyB0aGUgcmVuZGVyIHdpdGhvdXQgdGhlIHNlY3Rpb24gaW5mby5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVMaW5lcyA9IHNlY3Rpb24udGV4dC5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgbGV0IHNlY3Rpb25JbmRleCA9IDA7XG4gICAgICAgIGNvbnN0IGZpbGVUYXNrczogVGFza1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGxpbmVOdW1iZXIgPSBzZWN0aW9uLmxpbmVTdGFydDsgbGluZU51bWJlciA8PSBzZWN0aW9uLmxpbmVFbmQ7IGxpbmVOdW1iZXIrKykge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IGZpbGVMaW5lc1tsaW5lTnVtYmVyXTtcbiAgICAgICAgICAgIGlmIChsaW5lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBlbmQgdXAgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIGZpbGUsXG4gICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IHByb2Nlc3MgdGhpcyB0YXNrLlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YXNrID0gVGFzay5mcm9tTGluZSh7XG4gICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIHNlY3Rpb25TdGFydDogc2VjdGlvbi5saW5lU3RhcnQsXG4gICAgICAgICAgICAgICAgc2VjdGlvbkluZGV4LFxuICAgICAgICAgICAgICAgIHByZWNlZGluZ0hlYWRlcjogbnVsbCwgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgcHJlY2VkaW5nIGhlYWRlciBmb3IgaW4tbGluZSByZW5kZXJpbmcuXG4gICAgICAgICAgICAgICAgZmFsbGJhY2tEYXRlOiBudWxsLCAvLyBXZSBkb24ndCBuZWVkIHRoZSBmYWxsYmFjayBkYXRlIGZvciBpbi1saW5lIHJlbmRlcmluZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZpbGVUYXNrcy5wdXNoKHRhc2spO1xuICAgICAgICAgICAgICAgIHNlY3Rpb25JbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlY3Rpb24gaW5kZXggaXMgdGhlIG50aCB0YXNrIHdpdGhpbiB0aGlzIHNlY3Rpb24uXG4gICAgICAgIGZvciAobGV0IHNlY3Rpb25JbmRleCA9IDA7IHNlY3Rpb25JbmRleCA8IHJlbmRlcmVkRWxlbWVudHMubGVuZ3RoOyBzZWN0aW9uSW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgdGFzayA9IGZpbGVUYXNrc1tzZWN0aW9uSW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRFbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50c1tzZWN0aW9uSW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAodGFzayA9PT0gdW5kZWZpbmVkIHx8IHJlbmRlcmVkRWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gQXNzdW1pbmcgbWF0Y2ggb2YgdGFza3MgaW4gZmlsZSBhbmQgcmVuZGVyIHByZXZpZXcuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBtaXMtbWF0Y2ggaW4gdGhlIG51bWJlcnMsIHdlIHN0aWxsIHByb2Nlc3NcbiAgICAgICAgICAgICAgICAvLyB3aGF0IHdlIGNhbi5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGF0YUxpbmU6IHN0cmluZyA9IHJlbmRlcmVkRWxlbWVudC5nZXRBdHRyKCdkYXRhLWxpbmUnKSA/PyAnMCc7XG4gICAgICAgICAgICBjb25zdCBsaXN0SW5kZXg6IG51bWJlciA9IE51bWJlci5wYXJzZUludChkYXRhTGluZSwgMTApO1xuICAgICAgICAgICAgY29uc3QgdGFza0VsZW1lbnQgPSBhd2FpdCB0YXNrLnRvTGkoe1xuICAgICAgICAgICAgICAgIHBhcmVudFVsRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgICAgICBsaXN0SW5kZXgsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHJlbmRlcmVkIGVsZW1lbnQgY29udGFpbnMgYSBzdWItbGlzdCBvciBzdWItZGl2IChlLmcuIHRoZVxuICAgICAgICAgICAgLy8gZm9sZGluZyBhcnJvdyksIHdlIG5lZWQgdG8ga2VlcCBpdC5cbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGRyZW4gPSByZW5kZXJlZEVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyZWRDaGlsZHJlbi5sZW5ndGg7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGQgPSByZW5kZXJlZENoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlZENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkaXYnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2tFbGVtZW50LnByZXBlbmQocmVuZGVyZWRDaGlsZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJlZENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd1bCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFza0VsZW1lbnQuYXBwZW5kKHJlbmRlcmVkQ2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmUtc2V0IHRoZSBvcmlnaW5hbCBmb290bm90ZXMuXG4gICAgICAgICAgICAvLyBUaGUgbmV3bHkgcmVuZGVyZWQgSFRNTCB3b24ndCBoYXZlIHRoZSBjb3JyZWN0IGluZGV4ZXMgYW5kIGxpbmtzXG4gICAgICAgICAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBkb2N1bWVudC5cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRm9vdG5vdGVzID0gcmVuZGVyZWRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWZvb3Rub3RlLWlkXScpO1xuICAgICAgICAgICAgY29uc3QgbmV3Rm9vdG5vdGVzID0gdGFza0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZm9vdG5vdGUtaWRdJyk7XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxGb290bm90ZXMubGVuZ3RoID09PSBuZXdGb290bm90ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlnaW5hbEZvb3Rub3Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBuZXdGb290bm90ZXNbaV0ucmVwbGFjZVdpdGgob3JpZ2luYWxGb290bm90ZXNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50LnJlcGxhY2VXaXRoKHRhc2tFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBFZGl0b3JWaWV3LCBWaWV3UGx1Z2luIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblZhbHVlIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuXG5leHBvcnQgY29uc3QgbmV3TGl2ZVByZXZpZXdFeHRlbnNpb24gPSAoKSA9PiB7XG4gICAgcmV0dXJuIFZpZXdQbHVnaW4uZnJvbUNsYXNzKExpdmVQcmV2aWV3RXh0ZW5zaW9uKTtcbn07XG5cbmNsYXNzIExpdmVQcmV2aWV3RXh0ZW5zaW9uIGltcGxlbWVudHMgUGx1Z2luVmFsdWUge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlldzogRWRpdG9yVmlldztcblxuICAgIGNvbnN0cnVjdG9yKHZpZXc6IEVkaXRvclZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcblxuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrRXZlbnQgPSB0aGlzLmhhbmRsZUNsaWNrRXZlbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy52aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrRXZlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ2xpY2tFdmVudChldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7IHRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgICAgLy8gT25seSBoYW5kbGUgY2hlY2tib3ggY2xpY2tzLlxuICAgICAgICBpZiAoIXRhcmdldCB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHx8IHRhcmdldC50eXBlICE9PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBSaWdodCBub3cgT2JzaWRpYW4gQVBJIGRvZXMgbm90IGdpdmUgdXMgYSB3YXkgdG8gaGFuZGxlIGNoZWNrYm94IGNsaWNrcyBpbnNpZGUgcmVuZGVyZWQtd2lkZ2V0cy1pbi1MUCBzdWNoIGFzXG4gICAgICAgICAqIGNhbGxvdXRzLCB0YWJsZXMsIGFuZCB0cmFuc2NsdXNpb25zIGJlY2F1c2UgYHRoaXMudmlldy5wb3NBdERPTWAgd2lsbCByZXR1cm4gdGhlIGJlZ2lubmluZyBvZiB0aGUgd2lkZ2V0XG4gICAgICAgICAqIGFzIHRoZSBwb3NpdGlvbiBmb3IgYW55IGNsaWNrIGluc2lkZSB0aGUgd2lkZ2V0LlxuICAgICAgICAgKiBGb3IgY2FsbG91dHMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgdGFzayB3aWxsIG5ldmVyIGJlIGZvdW5kLCBzaW5jZSB0aGUgYGxpbmVBdGAgd2lsbCBiZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjYWxsb3V0LlxuICAgICAgICAgKiBUaGVyZWZvcmUsIHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZSBwb3AtdXAgdXNpbmcgT2JzaWRpYW4ncyBcIk5vdGljZVwiIGZlYXR1cmUsIGxvZyBhIGNvbnNvbGUgd2FybmluZywgdGhlbiByZXR1cm4uXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8vIFRhc2tzIGZyb20gXCJ0YXNrXCIgcXVlcnkgY29kZWJsb2NrcyBoYW5kbGUgdGhlbXNlbHZlcyB0aGFua3MgdG8gYHRvTGlgLCBzbyBiZSBzcGVjaWZpYyBhYm91dCBlcnJvciBtZXNzYWdpbmcsIGJ1dCBzdGlsbCByZXR1cm4uXG4gICAgICAgIGNvbnN0IGFuY2VzdG9yID0gdGFyZ2V0LmNsb3Nlc3QoJ3VsLnBsdWdpbi10YXNrcy1xdWVyeS1yZXN1bHQsIGRpdi5jYWxsb3V0LWNvbnRlbnQnKTtcbiAgICAgICAgaWYgKGFuY2VzdG9yKSB7XG4gICAgICAgICAgICBpZiAoYW5jZXN0b3IubWF0Y2hlcygnZGl2LmNhbGxvdXQtY29udGVudCcpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXJyb3IgbWVzc2FnZSBmb3Igbm93LlxuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgICAgICAgICAgICdvYnNpZGlhbi10YXNrcy1wbHVnaW4gd2FybmluZzogVGFza3MgY2Fubm90IGFkZCBvciByZW1vdmUgY29tcGxldGlvbiBkYXRlcyBvciBtYWtlIHRoZSBuZXh0IGNvcHkgb2YgYSByZWN1cnJpbmcgdGFzayBmb3IgdGFza3Mgd3JpdHRlbiBpbnNpZGUgYSBjYWxsb3V0IHdoZW4geW91IGNsaWNrIHRoZWlyIGNoZWNrYm94ZXMgaW4gTGl2ZSBQcmV2aWV3LiBcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ0lmIHlvdSB3YW50ZWQgVGFza3MgdG8gZG8gdGhlc2UgdGhpbmdzLCBwbGVhc2UgdW5kbyB5b3VyIGNoYW5nZSwgdGhlbiBlaXRoZXIgY2xpY2sgdGhlIGxpbmUgb2YgdGhlIHRhc2sgYW5kIHVzZSB0aGUgXCJUb2dnbGUgVGFzayBEb25lXCIgY29tbWFuZCwgb3Igc3dpdGNoIHRvIFJlYWRpbmcgVmlldyB0byBjbGljayB0aGUgY2hlY2tib3guJztcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgICAgICAgICAgICBuZXcgTm90aWNlKG1zZywgNDUwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcy52aWV3O1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMudmlldy5wb3NBdERPTSh0YXJnZXQpO1xuICAgICAgICBjb25zdCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHRhc2sgPSBUYXNrLmZyb21MaW5lKHtcbiAgICAgICAgICAgIGxpbmU6IGxpbmUudGV4dCxcbiAgICAgICAgICAgIC8vIE5vbmUgb2YgdGhpcyBkYXRhIGlzIHJlbGV2YW50IGhlcmUuXG4gICAgICAgICAgICAvLyBUaGUgdGFzayBpcyBjcmVhdGVkLCB0b2dnbGVkLCBhbmQgd3JpdHRlbiBiYWNrIHRvIHRoZSBDTTYgZG9jdW1lbnQsXG4gICAgICAgICAgICAvLyByZXBsYWNpbmcgdGhlIG9sZCB0YXNrIGluLXBsYWNlLlxuICAgICAgICAgICAgcGF0aDogJycsXG4gICAgICAgICAgICBzZWN0aW9uU3RhcnQ6IDAsXG4gICAgICAgICAgICBzZWN0aW9uSW5kZXg6IDAsXG4gICAgICAgICAgICBwcmVjZWRpbmdIZWFkZXI6IG51bGwsXG4gICAgICAgICAgICBmYWxsYmFja0RhdGU6IG51bGwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnNvbGUuZGVidWcoYExpdmUgUHJldmlldyBFeHRlbnNpb246IHRvZ2dsZSBjYWxsZWQuIFBvc2l0aW9uOiAke3Bvc2l0aW9ufSBMaW5lOiAke2xpbmUudGV4dH1gKTtcblxuICAgICAgICAvLyBPbmx5IGhhbmRsZSBjaGVja2JveGVzIG9mIHRhc2tzLlxuICAgICAgICBpZiAodGFzayA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBwcmV2ZW50IGRlZmF1bHQgc28gdGhhdCB0aGUgY2hlY2tib3ggaXMgb25seSBoYW5kbGVkIGJ5IHVzIGFuZCBub3Qgb2JzaWRpYW4uXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgLy8gQ2xpY2tlZCBvbiBhIHRhc2sncyBjaGVja2JveC4gVG9nZ2xlIHRoZSB0YXNrIGFuZCBzZXQgaXQuXG4gICAgICAgIGNvbnN0IHRvZ2dsZWQgPSB0YXNrLnRvZ2dsZSgpO1xuICAgICAgICBjb25zdCB0b2dnbGVkU3RyaW5nID0gdG9nZ2xlZC5tYXAoKHQpID0+IHQudG9GaWxlTGluZVN0cmluZygpKS5qb2luKHN0YXRlLmxpbmVCcmVhayk7XG5cbiAgICAgICAgLy8gQ3JlYXRlcyBhIENvZGVNaXJyb3IgdHJhbnNhY3Rpb24gaW4gb3JkZXIgdG8gdXBkYXRlIHRoZSBkb2N1bWVudC5cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBzdGF0ZS51cGRhdGUoe1xuICAgICAgICAgICAgY2hhbmdlczoge1xuICAgICAgICAgICAgICAgIGZyb206IGxpbmUuZnJvbSxcbiAgICAgICAgICAgICAgICB0bzogbGluZS50byxcbiAgICAgICAgICAgICAgICBpbnNlcnQ6IHRvZ2dsZWRTdHJpbmcsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHRyYW5zYWN0aW9uKTtcblxuICAgICAgICAvLyBEaXJ0eSB3b3JrYXJvdW5kLlxuICAgICAgICAvLyBXaGlsZSB0aGUgY29kZSBpbiB0aGlzIG1ldGhvZCBwcm9wZXJseSB1cGRhdGVzIHRoZSBgY2hlY2tlZGAgc3RhdGVcbiAgICAgICAgLy8gb2YgdGhlIHRhcmdldCBjaGVja2JveCwgc29tZSBPYnNpZGlhbiBpbnRlcm5hbHMgcmV2ZXJ0IHRoZSBzdGF0ZS5cbiAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBjaGVja2JveCB3b3VsZCByZW1haW4gaW4gaXRzIG9yaWdpbmFsIGBjaGVja2VkYFxuICAgICAgICAvLyBzdGF0ZSAoYHRydWVgIG9yIGBmYWxzZWApLCBldmVuIHRob3VnaCB0aGUgdW5kZXJseWluZyBkb2N1bWVudFxuICAgICAgICAvLyB1cGRhdGVzIGNvcnJlY3RseS5cbiAgICAgICAgLy8gQXMgYSBcImZpeFwiLCB3ZSBzZXQgdGhlIGNoZWNrYm94J3MgYGNoZWNrZWRgIHN0YXRlICphZ2FpbiogYWZ0ZXIgYVxuICAgICAgICAvLyB0aW1lb3V0IHRvIHJldmVydCBPYnNpZGlhbidzIHdyb25nZnVsIHJldmVyc2FsLlxuICAgICAgICBjb25zdCBkZXNpcmVkQ2hlY2tlZFN0YXR1cyA9IHRhcmdldC5jaGVja2VkO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRhcmdldC5jaGVja2VkID0gZGVzaXJlZENoZWNrZWRTdGF0dXM7XG4gICAgICAgIH0sIDEpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBcHAsIE1hcmtkb3duUmVuZGVyQ2hpbGQsIE1hcmtkb3duUmVuZGVyZXIsIFBsdWdpbiwgVEZpbGUgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IEV2ZW50UmVmLCBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IElRdWVyeSB9IGZyb20gJy4vSVF1ZXJ5JztcbmltcG9ydCB7IFN0YXRlIH0gZnJvbSAnLi9DYWNoZSc7XG5pbXBvcnQgeyByZXBsYWNlVGFza1dpdGhUYXNrcyB9IGZyb20gJy4vRmlsZSc7XG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gJy4vUXVlcnkvUXVlcnknO1xuaW1wb3J0IHR5cGUgeyBHcm91cEhlYWRpbmcgfSBmcm9tICcuL1F1ZXJ5L0dyb3VwSGVhZGluZyc7XG5pbXBvcnQgeyBUYXNrTW9kYWwgfSBmcm9tICcuL1Rhc2tNb2RhbCc7XG5pbXBvcnQgdHlwZSB7IFRhc2tzRXZlbnRzIH0gZnJvbSAnLi9UYXNrc0V2ZW50cyc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuaW1wb3J0IHsgRGF0ZUZhbGxiYWNrIH0gZnJvbSAnLi9EYXRlRmFsbGJhY2snO1xuaW1wb3J0IHsgVGFza0xheW91dCB9IGZyb20gJy4vVGFza0xheW91dCc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeVJlbmRlcmVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRzOiBUYXNrc0V2ZW50cztcblxuICAgIGNvbnN0cnVjdG9yKHsgcGx1Z2luLCBldmVudHMgfTogeyBwbHVnaW46IFBsdWdpbjsgZXZlbnRzOiBUYXNrc0V2ZW50cyB9KSB7XG4gICAgICAgIHRoaXMuYXBwID0gcGx1Z2luLmFwcDtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBldmVudHM7XG5cbiAgICAgICAgcGx1Z2luLnJlZ2lzdGVyTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3IoJ3Rhc2tzJywgdGhpcy5fYWRkUXVlcnlSZW5kZXJDaGlsZC5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUXVlcnlSZW5kZXJDaGlsZCA9IHRoaXMuX2FkZFF1ZXJ5UmVuZGVyQ2hpbGQuYmluZCh0aGlzKTtcblxuICAgIHByaXZhdGUgYXN5bmMgX2FkZFF1ZXJ5UmVuZGVyQ2hpbGQoc291cmNlOiBzdHJpbmcsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb250ZXh0OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQuYWRkQ2hpbGQoXG4gICAgICAgICAgICBuZXcgUXVlcnlSZW5kZXJDaGlsZCh7XG4gICAgICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgICAgICBldmVudHM6IHRoaXMuZXZlbnRzLFxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogZWxlbWVudCxcbiAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgZmlsZVBhdGg6IGNvbnRleHQuc291cmNlUGF0aCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cbn1cblxuY2xhc3MgUXVlcnlSZW5kZXJDaGlsZCBleHRlbmRzIE1hcmtkb3duUmVuZGVyQ2hpbGQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudHM6IFRhc2tzRXZlbnRzO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc291cmNlOiBzdHJpbmc7IC8vIFRoZSBjb21wbGV0ZSB0ZXh0IGluIHRoZSBpbnN0cnVjdGlvbiBibG9jaywgc3VjaCBhcyAnbm90IGRvbmVcXG5zaG9ydCBtb2RlJ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZzsgLy8gVGhlIHBhdGggb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb24gYmxvY2tcbiAgICBwcml2YXRlIHF1ZXJ5OiBJUXVlcnk7XG4gICAgcHJpdmF0ZSBxdWVyeVR5cGU6IHN0cmluZztcblxuICAgIHByaXZhdGUgcmVuZGVyRXZlbnRSZWY6IEV2ZW50UmVmIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcXVlcnlSZWxvYWRUaW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBldmVudHMsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgc291cmNlLFxuICAgICAgICBmaWxlUGF0aCxcbiAgICB9OiB7XG4gICAgICAgIGFwcDogQXBwO1xuICAgICAgICBldmVudHM6IFRhc2tzRXZlbnRzO1xuICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgICAgICBzb3VyY2U6IHN0cmluZztcbiAgICAgICAgZmlsZVBhdGg6IHN0cmluZztcbiAgICB9KSB7XG4gICAgICAgIHN1cGVyKGNvbnRhaW5lcik7XG5cbiAgICAgICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoO1xuXG4gICAgICAgIC8vIFRoZSBlbmdpbmUgaXMgY2hvc2VuIG9uIHRoZSBiYXNpcyBvZiB0aGUgY29kZSBibG9jayBsYW5ndWFnZS4gQ3VycmVudGx5XG4gICAgICAgIC8vIHRoZXJlIGlzIG9ubHkgdGhlIG1haW4gZW5naW5lIGZvciB0aGUgcGx1Z2luLCB0aGlzIGFsbG93cyBvdGhlcnMgdG8gYmVcbiAgICAgICAgLy8gYWRkZWQgbGF0ZXIuXG4gICAgICAgIHN3aXRjaCAodGhpcy5jb250YWluZXJFbC5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLWxhbmd1YWdlLXRhc2tzJzpcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gbmV3IFF1ZXJ5KHsgc291cmNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlUeXBlID0gJ3Rhc2tzJztcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gbmV3IFF1ZXJ5KHsgc291cmNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlUeXBlID0gJ3Rhc2tzJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9ubG9hZCgpIHtcbiAgICAgICAgLy8gUHJvY2VzcyB0aGUgY3VycmVudCBjYWNoZSBzdGF0ZTpcbiAgICAgICAgdGhpcy5ldmVudHMudHJpZ2dlclJlcXVlc3RDYWNoZVVwZGF0ZSh0aGlzLnJlbmRlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgLy8gTGlzdGVuIHRvIGZ1dHVyZSBjYWNoZSBjaGFuZ2VzOlxuICAgICAgICB0aGlzLnJlbmRlckV2ZW50UmVmID0gdGhpcy5ldmVudHMub25DYWNoZVVwZGF0ZSh0aGlzLnJlbmRlci5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLnJlbG9hZFF1ZXJ5QXRNaWRuaWdodCgpO1xuICAgIH1cblxuICAgIG9udW5sb2FkKCkge1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJFdmVudFJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5vZmYodGhpcy5yZW5kZXJFdmVudFJlZik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWVyeVJlbG9hZFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucXVlcnlSZWxvYWRUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbG9hZHMgdGhlIHF1ZXJ5IGFmdGVyIG1pZG5pZ2h0IHRvIHVwZGF0ZSByZXN1bHRzIGZyb20gcmVsYXRpdmUgZGF0ZSBxdWVyaWVzLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIHRoZSBxdWVyeSBgZHVlIHRvZGF5YCBjaGFuZ2VzIGV2ZXJ5IGRheS4gVGhpcyBtYWtlcyBzdXJlIHRoYXQgYWxsIHF1ZXJ5IHJlc3VsdHNcbiAgICAgKiBhcmUgcmUtcmVuZGVyZWQgYWZ0ZXIgbWlkbmlnaHQgZXZlcnkgZGF5IHRvIGVuc3VyZSB1cC10by1kYXRlIHJlc3VsdHMgd2l0aG91dCBoYXZpbmcgdG9cbiAgICAgKiByZWxvYWQgb2JzaWRpYW4uIENyZWF0aW5nIGEgbmV3IHF1ZXJ5IG9iamVjdCBmcm9tIHRoZSBzb3VyY2UgcmUtYXBwbGllcyB0aGUgcmVsYXRpdmUgZGF0ZXNcbiAgICAgKiB0byBcIm5vd1wiLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVsb2FkUXVlcnlBdE1pZG5pZ2h0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtaWRuaWdodCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIG1pZG5pZ2h0LnNldEhvdXJzKDI0LCAwLCAwLCAwKTtcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAgICAgICBjb25zdCBtaWxsaXNlY29uZHNUb01pZG5pZ2h0ID0gbWlkbmlnaHQuZ2V0VGltZSgpIC0gbm93LmdldFRpbWUoKTtcblxuICAgICAgICB0aGlzLnF1ZXJ5UmVsb2FkVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWVyeSA9IG5ldyBRdWVyeSh7IHNvdXJjZTogdGhpcy5zb3VyY2UgfSk7XG4gICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBjdXJyZW50IGNhY2hlIHN0YXRlOlxuICAgICAgICAgICAgdGhpcy5ldmVudHMudHJpZ2dlclJlcXVlc3RDYWNoZVVwZGF0ZSh0aGlzLnJlbmRlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkUXVlcnlBdE1pZG5pZ2h0KCk7XG4gICAgICAgIH0sIG1pbGxpc2Vjb25kc1RvTWlkbmlnaHQgKyAxMDAwKTsgLy8gQWRkIGJ1ZmZlciB0byBiZSBzdXJlIHRvIHJ1biBhZnRlciBtaWRuaWdodC5cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlbmRlcih7IHRhc2tzLCBzdGF0ZSB9OiB7IHRhc2tzOiBUYXNrW107IHN0YXRlOiBTdGF0ZSB9KSB7XG4gICAgICAgIC8vIERvbid0IGxvZyBhbnl0aGluZyBoZXJlLCBmb3IgYW55IHN0YXRlLCBhcyBpdCBnZW5lcmF0ZXMgaHVnZSBhbW91bnRzIG9mXG4gICAgICAgIC8vIGNvbnNvbGUgbWVzc2FnZXMgaW4gbGFyZ2UgdmF1bHRzLCBpZiBPYnNpZGlhbiB3YXMgb3BlbmVkIHdpdGggYW55XG4gICAgICAgIC8vIG5vdGVzIHdpdGggdGFza3MgY29kZSBibG9ja3MgaW4gUmVhZGluZyBvciBMaXZlIFByZXZpZXcgbW9kZS5cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbCgnZGl2Jyk7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gU3RhdGUuV2FybSAmJiB0aGlzLnF1ZXJ5LmVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgICAgICAgICAgYFJlbmRlciAke3RoaXMucXVlcnlUeXBlfSBjYWxsZWQgZm9yIGEgYmxvY2sgaW4gYWN0aXZlIGZpbGUgXCIke3RoaXMuZmlsZVBhdGh9XCIsIHRvIHNlbGVjdCBmcm9tICR7dGFza3MubGVuZ3RofSB0YXNrczogcGx1Z2luIHN0YXRlOiAke3N0YXRlfWAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5xdWVyeS5sYXlvdXRPcHRpb25zLmV4cGxhaW5RdWVyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRXhwbGFuYXRpb24oY29udGVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRhc2tzU29ydGVkTGltaXRlZEdyb3VwZWQgPSB0aGlzLnF1ZXJ5LmFwcGx5UXVlcnlUb1Rhc2tzKHRhc2tzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGFza3NTb3J0ZWRMaW1pdGVkR3JvdXBlZC5ncm91cHMpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIG5vICdncm91cCBieScgaW5zdHJ1Y3Rpb25zLCBncm91cC5ncm91cEhlYWRpbmdzXG4gICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBlbXB0eSwgYW5kIG5vIGhlYWRpbmdzIHdpbGwgYmUgYWRkZWQuXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRHcm91cEhlYWRpbmdzKGNvbnRlbnQsIGdyb3VwLmdyb3VwSGVhZGluZ3MpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0YXNrTGlzdCB9ID0gYXdhaXQgdGhpcy5jcmVhdGVUYXNrc0xpc3Qoe1xuICAgICAgICAgICAgICAgICAgICB0YXNrczogZ3JvdXAudGFza3MsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZCh0YXNrTGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0b3RhbFRhc2tzQ291bnQgPSB0YXNrc1NvcnRlZExpbWl0ZWRHcm91cGVkLnRvdGFsVGFza3NDb3VudCgpO1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhgJHt0b3RhbFRhc2tzQ291bnR9IG9mICR7dGFza3MubGVuZ3RofSB0YXNrcyBkaXNwbGF5ZWQgaW4gYSBibG9jayBpbiBcIiR7dGhpcy5maWxlUGF0aH1cImApO1xuICAgICAgICAgICAgdGhpcy5hZGRUYXNrQ291bnQoY29udGVudCwgdG90YWxUYXNrc0NvdW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnF1ZXJ5LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRlbnQuY3JlYXRlRGl2KCkuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICAgICAnPHByZT4nICsgYFRhc2tzIHF1ZXJ5OiAke3RoaXMucXVlcnkuZXJyb3IucmVwbGFjZSgvXFxuL2csICc8YnI+Jyl9YCArICc8L3ByZT4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudC5zZXRUZXh0KCdMb2FkaW5nIFRhc2tzIC4uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5maXJzdENoaWxkPy5yZXBsYWNlV2l0aChjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlICdleHBsYWluJyBpbnN0cnVjdGlvbiB0byBlbmFibGUgdGhpc1xuICAgIHByaXZhdGUgY3JlYXRlRXhwbGFuYXRpb24oY29udGVudDogSFRNTERpdkVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZXhwbGFuYXRpb25Bc1N0cmluZyA9IHRoaXMucXVlcnkuZXhwbGFpblF1ZXJ5KCk7XG5cbiAgICAgICAgY29uc3QgZXhwbGFuYXRpb25zQmxvY2sgPSBjb250ZW50LmNyZWF0ZUVsKCdwcmUnKTtcbiAgICAgICAgZXhwbGFuYXRpb25zQmxvY2suYWRkQ2xhc3NlcyhbJ3BsdWdpbi10YXNrcy1xdWVyeS1leHBsYW5hdGlvbiddKTtcbiAgICAgICAgZXhwbGFuYXRpb25zQmxvY2suc2V0VGV4dChleHBsYW5hdGlvbkFzU3RyaW5nKTtcbiAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZChleHBsYW5hdGlvbnNCbG9jayk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVUYXNrc0xpc3Qoe1xuICAgICAgICB0YXNrcyxcbiAgICAgICAgY29udGVudCxcbiAgICB9OiB7XG4gICAgICAgIHRhc2tzOiBUYXNrW107XG4gICAgICAgIGNvbnRlbnQ6IEhUTUxEaXZFbGVtZW50O1xuICAgIH0pOiBQcm9taXNlPHsgdGFza0xpc3Q6IEhUTUxVTGlzdEVsZW1lbnQ7IHRhc2tzQ291bnQ6IG51bWJlciB9PiB7XG4gICAgICAgIGNvbnN0IHRhc2tzQ291bnQgPSB0YXNrcy5sZW5ndGg7XG5cbiAgICAgICAgY29uc3QgbGF5b3V0ID0gbmV3IFRhc2tMYXlvdXQodGhpcy5xdWVyeS5sYXlvdXRPcHRpb25zKTtcbiAgICAgICAgY29uc3QgdGFza0xpc3QgPSBjb250ZW50LmNyZWF0ZUVsKCd1bCcpO1xuICAgICAgICB0YXNrTGlzdC5hZGRDbGFzc2VzKFsnY29udGFpbnMtdGFzay1saXN0JywgJ3BsdWdpbi10YXNrcy1xdWVyeS1yZXN1bHQnXSk7XG4gICAgICAgIHRhc2tMaXN0LmFkZENsYXNzZXMobGF5b3V0LnNwZWNpZmljQ2xhc3Nlcyk7XG4gICAgICAgIGNvbnN0IGdyb3VwaW5nQXR0cmlidXRlID0gdGhpcy5nZXRHcm91cGluZ0F0dHJpYnV0ZSgpO1xuICAgICAgICBpZiAoZ3JvdXBpbmdBdHRyaWJ1dGUgJiYgZ3JvdXBpbmdBdHRyaWJ1dGUubGVuZ3RoID4gMCkgdGFza0xpc3QuZGF0YXNldC50YXNrR3JvdXBCeSA9IGdyb3VwaW5nQXR0cmlidXRlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdGFzayA9IHRhc2tzW2ldO1xuICAgICAgICAgICAgY29uc3QgaXNGaWxlbmFtZVVuaXF1ZSA9IHRoaXMuaXNGaWxlbmFtZVVuaXF1ZSh7IHRhc2sgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtID0gYXdhaXQgdGFzay50b0xpKHtcbiAgICAgICAgICAgICAgICBwYXJlbnRVbEVsZW1lbnQ6IHRhc2tMaXN0LFxuICAgICAgICAgICAgICAgIGxpc3RJbmRleDogaSxcbiAgICAgICAgICAgICAgICBsYXlvdXRPcHRpb25zOiB0aGlzLnF1ZXJ5LmxheW91dE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgaXNGaWxlbmFtZVVuaXF1ZSxcbiAgICAgICAgICAgICAgICB0YXNrTGF5b3V0OiBsYXlvdXQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBmb290bm90ZXMuIFRoZXkgZG9uJ3QgcmUtYXBwZWFyIGluIGFub3RoZXIgZG9jdW1lbnQuXG4gICAgICAgICAgICBjb25zdCBmb290bm90ZXMgPSBsaXN0SXRlbS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1mb290bm90ZS1pZF0nKTtcbiAgICAgICAgICAgIGZvb3Rub3Rlcy5mb3JFYWNoKChmb290bm90ZSkgPT4gZm9vdG5vdGUucmVtb3ZlKCkpO1xuXG4gICAgICAgICAgICBjb25zdCBzaG9ydE1vZGUgPSB0aGlzLnF1ZXJ5LmxheW91dE9wdGlvbnMuc2hvcnRNb2RlO1xuXG4gICAgICAgICAgICBjb25zdCBleHRyYXNTcGFuID0gbGlzdEl0ZW0uY3JlYXRlU3BhbigndGFzay1leHRyYXMnKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnF1ZXJ5LmxheW91dE9wdGlvbnMuaGlkZVVyZ2VuY3kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFVyZ2VuY3koZXh0cmFzU3BhbiwgdGFzayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5xdWVyeS5sYXlvdXRPcHRpb25zLmhpZGVCYWNrbGlua3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEJhY2tsaW5rcyhleHRyYXNTcGFuLCB0YXNrLCBzaG9ydE1vZGUsIGlzRmlsZW5hbWVVbmlxdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMucXVlcnkubGF5b3V0T3B0aW9ucy5oaWRlRWRpdEJ1dHRvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRWRpdEJ1dHRvbihleHRyYXNTcGFuLCB0YXNrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFza0xpc3QuYXBwZW5kQ2hpbGQobGlzdEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgdGFza0xpc3QsIHRhc2tzQ291bnQgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEVkaXRCdXR0b24obGlzdEl0ZW06IEhUTUxFbGVtZW50LCB0YXNrOiBUYXNrKSB7XG4gICAgICAgIGNvbnN0IGVkaXRUYXNrUGVuY2lsID0gbGlzdEl0ZW0uY3JlYXRlRWwoJ2EnLCB7XG4gICAgICAgICAgICBjbHM6ICd0YXNrcy1lZGl0JyxcbiAgICAgICAgfSk7XG4gICAgICAgIGVkaXRUYXNrUGVuY2lsLm9uQ2xpY2tFdmVudCgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9uU3VibWl0ID0gKHVwZGF0ZWRUYXNrczogVGFza1tdKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgcmVwbGFjZVRhc2tXaXRoVGFza3Moe1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFRhc2s6IHRhc2ssXG4gICAgICAgICAgICAgICAgICAgIG5ld1Rhc2tzOiBEYXRlRmFsbGJhY2sucmVtb3ZlSW5mZXJyZWRTdGF0dXNJZk5lZWRlZCh0YXNrLCB1cGRhdGVkVGFza3MpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgZXZlcnkgdGltZSwgYXMgY3Vyc29yL3Rhc2sgY2FuIGNoYW5nZS5cbiAgICAgICAgICAgIGNvbnN0IHRhc2tNb2RhbCA9IG5ldyBUYXNrTW9kYWwoe1xuICAgICAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICAgICAgdGFzayxcbiAgICAgICAgICAgICAgICBvblN1Ym1pdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGFza01vZGFsLm9wZW4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRVcmdlbmN5KGxpc3RJdGVtOiBIVE1MRWxlbWVudCwgdGFzazogVGFzaykge1xuICAgICAgICBjb25zdCB0ZXh0ID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0KHRhc2sudXJnZW5jeSk7XG4gICAgICAgIGxpc3RJdGVtLmNyZWF0ZVNwYW4oeyB0ZXh0LCBjbHM6ICd0YXNrcy11cmdlbmN5JyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5IGhlYWRpbmdzIGZvciBhIGdyb3VwIG9mIHRhc2tzLlxuICAgICAqIEBwYXJhbSBjb250ZW50XG4gICAgICogQHBhcmFtIGdyb3VwSGVhZGluZ3MgLSBUaGUgaGVhZGluZ3MgdG8gZGlzcGxheS4gVGhpcyBjYW4gYmUgYW4gZW1wdHkgYXJyYXksXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIG5vIGhlYWRpbmdzIHdpbGwgYmUgYWRkZWQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZEdyb3VwSGVhZGluZ3MoY29udGVudDogSFRNTERpdkVsZW1lbnQsIGdyb3VwSGVhZGluZ3M6IEdyb3VwSGVhZGluZ1tdKSB7XG4gICAgICAgIGZvciAoY29uc3QgaGVhZGluZyBvZiBncm91cEhlYWRpbmdzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEdyb3VwSGVhZGluZyhjb250ZW50LCBoZWFkaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYWRkR3JvdXBIZWFkaW5nKGNvbnRlbnQ6IEhUTUxEaXZFbGVtZW50LCBncm91cDogR3JvdXBIZWFkaW5nKSB7XG4gICAgICAgIGxldCBoZWFkZXI6IGFueTtcbiAgICAgICAgLy8gSXMgaXQgcG9zc2libGUgdG8gcmVtb3ZlIHRoZSByZXBldGl0aW9uIGhlcmU/XG4gICAgICAgIC8vIElkZWFsbHksIGJ5IGNyZWF0aW5nIGEgdmFyaWFibGUgdGhhdCBjb250YWlucyBoNCwgaDUgb3IgaDZcbiAgICAgICAgLy8gYW5kIHRoZW4gb25seSBoYXZpbmcgb25lIGNhbGwgdG8gY29udGVudC5jcmVhdGVFbCgpLlxuICAgICAgICBpZiAoZ3JvdXAubmVzdGluZ0xldmVsID09PSAwKSB7XG4gICAgICAgICAgICBoZWFkZXIgPSBjb250ZW50LmNyZWF0ZUVsKCdoNCcsIHtcbiAgICAgICAgICAgICAgICBjbHM6ICd0YXNrcy1ncm91cC1oZWFkaW5nJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGdyb3VwLm5lc3RpbmdMZXZlbCA9PT0gMSkge1xuICAgICAgICAgICAgaGVhZGVyID0gY29udGVudC5jcmVhdGVFbCgnaDUnLCB7XG4gICAgICAgICAgICAgICAgY2xzOiAndGFza3MtZ3JvdXAtaGVhZGluZycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEhlYWRpbmdzIG5lc3RlZCB0byAyIG9yIG1vcmUgbGV2ZWxzIGFyZSBhbGwgZGlzcGxheWVkIHdpdGggJ2g2OlxuICAgICAgICAgICAgaGVhZGVyID0gY29udGVudC5jcmVhdGVFbCgnaDYnLCB7XG4gICAgICAgICAgICAgICAgY2xzOiAndGFza3MtZ3JvdXAtaGVhZGluZycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBNYXJrZG93blJlbmRlcmVyLnJlbmRlck1hcmtkb3duKGdyb3VwLm5hbWUsIGhlYWRlciwgdGhpcy5maWxlUGF0aCwgdGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRCYWNrbGlua3MobGlzdEl0ZW06IEhUTUxFbGVtZW50LCB0YXNrOiBUYXNrLCBzaG9ydE1vZGU6IGJvb2xlYW4sIGlzRmlsZW5hbWVVbmlxdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgYmFja0xpbmsgPSBsaXN0SXRlbS5jcmVhdGVTcGFuKHsgY2xzOiAndGFza3MtYmFja2xpbmsnIH0pO1xuXG4gICAgICAgIGlmICghc2hvcnRNb2RlKSB7XG4gICAgICAgICAgICBiYWNrTGluay5hcHBlbmQoJyAoJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5rID0gYmFja0xpbmsuY3JlYXRlRWwoJ2EnKTtcblxuICAgICAgICBsaW5rLmhyZWYgPSB0YXNrLnBhdGg7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkYXRhLWhyZWYnLCB0YXNrLnBhdGgpO1xuICAgICAgICBsaW5rLnJlbCA9ICdub29wZW5lcic7XG4gICAgICAgIGxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgIGxpbmsuYWRkQ2xhc3MoJ2ludGVybmFsLWxpbmsnKTtcbiAgICAgICAgaWYgKHNob3J0TW9kZSkge1xuICAgICAgICAgICAgbGluay5hZGRDbGFzcygnaW50ZXJuYWwtbGluay1zaG9ydC1tb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzay5wcmVjZWRpbmdIZWFkZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNhbml0aXNlZEhlYWRpbmcgPSB0YXNrLnByZWNlZGluZ0hlYWRlci5yZXBsYWNlKC8jL2csICcnKTtcbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IGxpbmsuaHJlZiArICcjJyArIHNhbml0aXNlZEhlYWRpbmc7XG4gICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZGF0YS1ocmVmJywgbGluay5nZXRBdHRyaWJ1dGUoJ2RhdGEtaHJlZicpICsgJyMnICsgc2FuaXRpc2VkSGVhZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGlua1RleHQ6IHN0cmluZztcbiAgICAgICAgaWYgKHNob3J0TW9kZSkge1xuICAgICAgICAgICAgbGlua1RleHQgPSAnIFx1RDgzRFx1REQxNyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaW5rVGV4dCA9IHRhc2suZ2V0TGlua1RleHQoeyBpc0ZpbGVuYW1lVW5pcXVlIH0pID8/ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluay5zZXRUZXh0KGxpbmtUZXh0KTtcblxuICAgICAgICBpZiAoIXNob3J0TW9kZSkge1xuICAgICAgICAgICAgYmFja0xpbmsuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRhc2tDb3VudChjb250ZW50OiBIVE1MRGl2RWxlbWVudCwgdGFza3NDb3VudDogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWVyeS5sYXlvdXRPcHRpb25zLmhpZGVUYXNrQ291bnQpIHtcbiAgICAgICAgICAgIGNvbnRlbnQuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBgJHt0YXNrc0NvdW50fSB0YXNrJHt0YXNrc0NvdW50ICE9PSAxID8gJ3MnIDogJyd9YCxcbiAgICAgICAgICAgICAgICBjbHM6ICd0YXNrcy1jb3VudCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNGaWxlbmFtZVVuaXF1ZSh7IHRhc2sgfTogeyB0YXNrOiBUYXNrIH0pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgLy8gV2lsbCBtYXRjaCB0aGUgZmlsZW5hbWUgd2l0aG91dCBleHRlbnNpb24gKHRoZSBmaWxlJ3MgXCJiYXNlbmFtZVwiKS5cbiAgICAgICAgY29uc3QgZmlsZW5hbWVNYXRjaCA9IHRhc2sucGF0aC5tYXRjaCgvKFteL10qKVxcLi4rJC9pKTtcbiAgICAgICAgaWYgKGZpbGVuYW1lTWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGZpbGVuYW1lTWF0Y2hbMV07XG4gICAgICAgIGNvbnN0IGFsbEZpbGVzV2l0aFNhbWVOYW1lID0gdGhpcy5hcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLmZpbHRlcigoZmlsZTogVEZpbGUpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWxlLmJhc2VuYW1lID09PSBmaWxlbmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIEZvdW5kIGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgKGl0IG1pZ2h0IGFjdHVhbGx5IGJlIHRoZSBzYW1lIGZpbGUsIGJ1dCB3ZSdsbCB0YWtlIHRoYXQgaW50byBhY2NvdW50IGxhdGVyLilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFsbEZpbGVzV2l0aFNhbWVOYW1lLmxlbmd0aCA8IDI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRHcm91cGluZ0F0dHJpYnV0ZSgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBpbmdSdWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLnF1ZXJ5Lmdyb3VwaW5nKSB7XG4gICAgICAgICAgICBncm91cGluZ1J1bGVzLnB1c2goZ3JvdXAucHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBncm91cGluZ1J1bGVzLmpvaW4oJywnKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vVGFzayc7XG5cbi8qKlxuICogQSBzb3J0aW5nIGZ1bmN0aW9uLCB0aGF0IHRha2VzIHR3byBUYXNrIG9iamVjdHMgYW5kIHJldHVybnNcbiAqIGFuZCByZXR1cm5zIG9uZSBvZjpcbiAqIC0gYC0xYCBvciBzb21lIG90aGVyIG5lZ2F0aXZlIG51bWJlciwgaWYgYSBpcyBsZXNzIHRoYW4gYiBieSBzb21lIG9yZGVyaW5nIGNyaXRlcmlvbi5cbiAqIC0gYCsxYCBvciBzb21lIG90aGVyIHBvc2l0aXZlIG51bWJlciwgaWYgYSBpcyBncmVhdGVyIHRoYW4gYiBieSB0aGUgb3JkZXJpbmcgY3JpdGVyaW9uLlxuICogLSBgMGAgb3Igc29tZXRpbWVzIGAtMGAsIGlmIGEgZXF1YWxzIGIgYnkgdGhlIG9yZGVyaW5nIGNyaXRlcmlvbi5cbiAqXG4gKiBUeXBpY2FsbHkgQ29tcGFyYXRvciBmdW5jdGlvbnMgYXJlIHN0b3JlZCBpbiBhIHtAbGluayBTb3J0ZXJ9IG9iamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGFyYXRvciA9IChhOiBUYXNrLCBiOiBUYXNrKSA9PiBudW1iZXI7XG5cbi8qKlxuICogU29ydGVyIHJlcHJlc2VudHMgYSBzaW5nbGUgJ3NvcnQgYnknIGluc3RydWN0aW9uLlxuICogSXQgc3RvcmVzIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIGFzIGEge0BsaW5rIENvbXBhcmF0b3J9LlxuICovXG5leHBvcnQgY2xhc3MgU29ydGVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJvcGVydHk6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29tcGFyYXRvcjogQ29tcGFyYXRvcjtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IC0gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIC0ge0BsaW5rIENvbXBhcmF0b3J9IGZ1bmN0aW9uLCBmb3Igc29ydGluZyBpbiB0aGUgc3RhbmRhcmQgZGlyZWN0aW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgSWYgYHJldmVyc2VgIGlzIHRydWUsIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBjb252ZXJ0ZWQgdG8gcmV2ZXJzZSB0aGUgc29ydCBkaXJlY3Rpb24uXG4gICAgICogQHBhcmFtIHJldmVyc2UgLSB3aGV0aGVyIHRoZSBzb3J0IG9yZGVyIHNob3VsZCBiZSByZXZlcnNlZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogc3RyaW5nLCBjb21wYXJhdG9yOiBDb21wYXJhdG9yLCByZXZlcnNlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gU29ydGVyLm1heWJlUmV2ZXJzZShyZXZlcnNlLCBjb21wYXJhdG9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYXliZVJldmVyc2UocmV2ZXJzZTogYm9vbGVhbiwgY29tcGFyYXRvcjogQ29tcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gcmV2ZXJzZSA/IFNvcnRlci5tYWtlUmV2ZXJzZWRDb21wYXJhdG9yKGNvbXBhcmF0b3IpIDogY29tcGFyYXRvcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYWtlUmV2ZXJzZWRDb21wYXJhdG9yKGNvbXBhcmF0b3I6IENvbXBhcmF0b3IpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgLy8gTm90ZTogVGhpcyBjYW4gcmV0dXJuIC0wLlxuICAgICAgICByZXR1cm4gKGEsIGIpID0+IChjb21wYXJhdG9yKGEsIGIpICogLTEpIGFzIC0xIHwgMCB8IDE7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uL1Rhc2snO1xuXG4vKipcbiAqIEEgbmFtaW5nIGZ1bmN0aW9uLCB0aGF0IHRha2VzIGEgVGFzayBvYmplY3QgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgZ3JvdXAgcHJvcGVydHkgbmFtZVxuICovXG5leHBvcnQgdHlwZSBHcm91cGVyRnVuY3Rpb24gPSAodGFzazogVGFzaykgPT4gc3RyaW5nW107XG5cbmV4cG9ydCB0eXBlIEdyb3VwaW5nUHJvcGVydHkgPVxuICAgIHwgJ2JhY2tsaW5rJ1xuICAgIHwgJ2RvbmUnXG4gICAgfCAnZHVlJ1xuICAgIHwgJ2ZpbGVuYW1lJ1xuICAgIHwgJ2ZvbGRlcidcbiAgICB8ICdoYXBwZW5zJ1xuICAgIHwgJ2hlYWRpbmcnXG4gICAgfCAncGF0aCdcbiAgICB8ICdwcmlvcml0eSdcbiAgICB8ICdyZWN1cnJlbmNlJ1xuICAgIHwgJ3JlY3VycmluZydcbiAgICB8ICdyb290J1xuICAgIHwgJ3NjaGVkdWxlZCdcbiAgICB8ICdzdGFydCdcbiAgICB8ICdzdGF0dXMnXG4gICAgfCAndGFncyc7XG5cbmV4cG9ydCBjbGFzcyBHcm91cGVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJvcGVydHk6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgZ3JvdXBlcjogR3JvdXBlckZ1bmN0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydHk6IHN0cmluZywgZ3JvdXBlcjogR3JvdXBlckZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5ncm91cGVyID0gZ3JvdXBlcjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgU29ydGVyIH0gZnJvbSAnLi4vU29ydGVyJztcbmltcG9ydCB0eXBlIHsgQ29tcGFyYXRvciB9IGZyb20gJy4uL1NvcnRlcic7XG5pbXBvcnQgKiBhcyBSZWdFeHBUb29scyBmcm9tICcuLi8uLi9saWIvUmVnRXhwVG9vbHMnO1xuaW1wb3J0IHsgR3JvdXBlciB9IGZyb20gJy4uL0dyb3VwZXInO1xuaW1wb3J0IHR5cGUgeyBHcm91cGVyRnVuY3Rpb24gfSBmcm9tICcuLi9Hcm91cGVyJztcbmltcG9ydCB0eXBlIHsgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlcic7XG5cbi8qKlxuICogRmllbGQgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgZWFjaCB0eXBlIG9mIGZpbHRlciBpbnN0cnVjdGlvbi5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgZGVyaXZlZCBjbGFzcyBTdGFydERhdGVGaWVsZCBpbXBsZW1lbnRzIHRoZSBwYXJzaW5nXG4gKiBvZiAnc3RhcnRzJyBpbnN0cnVjdGlvbnMuXG4gKlxuICogVGhlIG5hbWUgJ0ZpZWxkJyBtYXkgc2VlbSBjb25mdXNpbmcsIGFzIGl0IG1pZ2h0IGN1cnJlbnRseSBiZVxuICogZXhwZWN0ZWQgdG8gaGF2ZSB0aGUgd29yZCAnRmlsdGVyJyBpbiB0aGUgY2xhc3MgbmFtZS5cbiAqXG4gKiBDdXJyZW50IHRoaW5raW5nIGlzIHRoYXQgaXQgbWF5IHdlbGwgZXZvbHZlIGxhdGVyIHRvIGFsc28gaW1wbGVtZW50XG4gKiB0aGUgcHJlc2VuY2UgYW5kIGFic2VuY2Ugc2VhcmNoZXMgYXMgd2VsbFxuICogKHN1Y2ggJ25vIHN0YXJ0IGRhdGUnIGFuZCAnaGFzIHN0YXJ0IGRhdGUnKS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZpZWxkIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEZpbHRlcmluZ1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsYXNzIGNhbiBwYXJzZSB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gbGluZS5cbiAgICAgKlxuICAgICAqIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNoZWNrcyB3aGV0aGVyIHRoZSBsaW5lIG1hdGNoZXNcbiAgICAgKiB0aGlzLmZpbHRlclJlZ0V4cCgpLlxuICAgICAqIEBwYXJhbSBsaW5lIC0gQSBsaW5lIGZyb20gYSBgYGB0YXNrc2BgYCBibG9jay5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuQ3JlYXRlRmlsdGVyRm9yTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEZpZWxkLmxpbmVNYXRjaGVzRmlsdGVyKHRoaXMuZmlsdGVyUmVnRXhwKCksIGxpbmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBsaW5lLCBhbmQgcmV0dXJuIGVpdGhlciBhIEZpbHRlciBmdW5jdGlvbiBvciBhbiBlcnJvciBzdHJpbmcsXG4gICAgICogd2hpY2ggYXJlIGJvdGggd3JhcHBlZCBpbiBhIEZpbHRlck9yRXJyb3JNZXNzYWdlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gbGluZSAtIEEgbGluZSBmcm9tIGEgYGBgdGFza3NgYGAgYmxvY2suXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGNyZWF0ZUZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlO1xuXG4gICAgLyoqXG4gICAgICogRG9lcyB0aGUgZ2l2ZW4gbGluZSBtYXRjaCB0aGUgZ2l2ZW4gZmlsdGVyP1xuICAgICAqIEBwYXJhbSBmaWx0ZXIgLSBBIFJlZ0V4cCByZWd1bGFyIGV4cHJlc3Npb24sIHRoYXQgc3BlY2lmaWVzIG9uZSBxdWVyeSBpbnN0cnVjdGlvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgT3IgbnVsbCwgaWYgdGhlIGZpZWxkIGRvZXMgbm90IHN1cHBvcnQgcmVnZXhwLWJhc2VkIGZpbHRlcmluZy5cbiAgICAgKiBAcGFyYW0gbGluZSAtIEEgbGluZSBmcm9tIGEgdGFza3MgY29kZSBibG9jayBxdWVyeS5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBsaW5lTWF0Y2hlc0ZpbHRlcihmaWx0ZXI6IFJlZ0V4cCB8IG51bGwsIGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyLnRlc3QobGluZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG1hdGNoIGZvciB0aGUgZ2l2ZW4gZmlsdGVyLCBvciBudWxsIGlmIGl0IGRvZXMgbm90IG1hdGNoXG4gICAgICogQHBhcmFtIGZpbHRlclJlZ0V4cCAtIEEgUmVnRXhwIHJlZ3VsYXIgZXhwcmVzc2lvbiwgdGhhdCBzcGVjaWZpZXMgb25lIHF1ZXJ5IGluc3RydWN0aW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICBPciBudWxsLCBpZiB0aGUgZmllbGQgZG9lcyBub3Qgc3VwcG9ydCByZWdleHAtYmFzZWQgZmlsdGVyaW5nLlxuICAgICAqIEBwYXJhbSBsaW5lIC0gQSBsaW5lIGZyb20gYSB0YXNrcyBjb2RlIGJsb2NrIHF1ZXJ5LlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3RhdGljIGdldE1hdGNoKGZpbHRlclJlZ0V4cDogUmVnRXhwIHwgbnVsbCwgbGluZTogc3RyaW5nKTogUmVnRXhwTWF0Y2hBcnJheSB8IG51bGwge1xuICAgICAgICBpZiAoZmlsdGVyUmVnRXhwKSB7XG4gICAgICAgICAgICByZXR1cm4gbGluZS5tYXRjaChmaWx0ZXJSZWdFeHApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCB3aWxsIG1hdGNoIGEgY29ycmVjdGx5LWZvcm1lZFxuICAgICAqIGluc3RydWN0aW9uIGxpbmUgZm9yIGZpbHRlcmluZyBUYXNrcyBieSBpbnNwZWN0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLlxuICAgICAqIE9yIG51bGwsIGlmIHRoaXMgZmllbGQgZG9lcyBub3QgaGF2ZSBhIHJlZ2V4LWJhc2VkIGluc3RydWN0aW9uLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBmaWVsZCwgdG8gYmUgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy5cbiAgICAgKiBUaGlzIHVzdWFsbHkgbWF0Y2hlcyB0aGUgaW5zdHJ1Y3Rpb24gbmFtZSwgYnV0IGRvZXMgbm90IGFsd2F5c1xuICAgICAqIChzZWUgc3RhcnQgYW5kIHN0YXJ0cykuXG4gICAgICpcbiAgICAgKiBBbHNvLCBzb21lIGZpZWxkcyBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZSwgc2VwYXJhdGVkIGJ5ICcvJy5cbiAgICAgKiBTZWUge0BsaW5rIFRhZ3NGaWVsZH0sIGZvciBleGFtcGxlLlxuICAgICAqIEBwdWJsaWNcbiAgICAgKlxuICAgICAqIEBzZWUgZmllbGROYW1lU2luZ3VsYXJcbiAgICAgKiBAc2VlIGZpZWxkTmFtZVNpbmd1bGFyRXNjYXBlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBmaWVsZE5hbWUoKTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2luZ3VsYXIgZm9ybSBvZiB0aGUgZmllbGQncyBuYW1lLlxuICAgICAqIEBwdWJsaWNcbiAgICAgKlxuICAgICAqIEBzZWUgZmllbGROYW1lXG4gICAgICogQHNlZSBmaWVsZE5hbWVTaW5ndWxhckVzY2FwZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZmllbGROYW1lU2luZ3VsYXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGROYW1lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2luZ3VsYXIgZm9ybSBvZiB0aGUgZmllbGQncyBuYW1lLCBlc2NhcGVkIGZvciB1c2UgaW4gcmVndWxhciBleHByZXNzaW9ucy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgbmVlZGVkIGZvciBmaWVsZCBuYW1lcyB0aGF0IGNvbnRhaW4gYC5gIGluLCBmb3IgZXhhbXBsZS5cbiAgICAgKiBAcHVibGljXG4gICAgICpcbiAgICAgKiBAc2VlIGZpZWxkTmFtZVxuICAgICAqIEBzZWUgZmllbGROYW1lU2luZ3VsYXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZmllbGROYW1lU2luZ3VsYXJFc2NhcGVkKCkge1xuICAgICAgICByZXR1cm4gUmVnRXhwVG9vbHMuZXNjYXBlUmVnRXhwKHRoaXMuZmllbGROYW1lU2luZ3VsYXIoKSk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTb3J0aW5nXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2RlIGZvciB0aGlzIGZpZWxkIGltcGxlbWVudHMgc29ydGluZyBvZiB0YXNrcy5cbiAgICAgKlxuICAgICAqIElmIG92ZXJyaWRpbmcgdGhpcyB0byByZXR1cm4gdHJ1ZSwgaW4gb3JkZXIgdG8gZW5hYmxlIHNvcnRpbmcsXG4gICAgICogdGhlIG1ldGhvZCB7QGxpbmsgY29tcGFyYXRvcn0gbXVzdCBhbHNvIGJlIG92ZXJyaWRkZW4uXG4gICAgICovXG4gICAgcHVibGljIHN1cHBvcnRzU29ydGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGEgJ3NvcnQgYnknIGxpbmUgYW5kIHJldHVybiBhIHtAbGluayBTb3J0ZXJ9IG9iamVjdC5cbiAgICAgKlxuICAgICAqIFJldHVybnMgbnVsbCBsaW5lIGRvZXMgbm90IG1hdGNoIHRoaXMgZmllbGQgb3IgaXMgaW52YWxpZCxcbiAgICAgKiBvciB0aGlzIGZpZWxkIGRvZXMgbm90IHN1cHBvcnQgc29ydGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyc2VTb3J0TGluZShsaW5lOiBzdHJpbmcpOiBTb3J0ZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRzU29ydGluZygpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jYW5DcmVhdGVTb3J0ZXJGb3JMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNvcnRlckZyb21MaW5lKGxpbmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xhc3MgY2FuIHBhcnNlIHRoZSBnaXZlbiAnc29ydCBieScgaW5zdHJ1Y3Rpb24gbGluZS5cbiAgICAgKlxuICAgICAqIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNoZWNrcyB3aGV0aGVyIHRoZSBjbGFzcyBkb2VzIHN1cHBvcnQgc29ydGluZyxcbiAgICAgKiBhbmQgd2hldGhlciB0aGUgbGluZSBtYXRjaGVzIHRoaXMuc29ydGVyUmVnRXhwKCkuXG4gICAgICogQHBhcmFtIGxpbmUgLSBBIGxpbmUgZnJvbSBhIGBgYHRhc2tzYGBgIGJsb2NrLlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgY3JlYXRlU29ydGVyRnJvbUxpbmV9XG4gICAgICovXG4gICAgcHVibGljIGNhbkNyZWF0ZVNvcnRlckZvckxpbmUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5zdXBwb3J0c1NvcnRpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEZpZWxkLmxpbmVNYXRjaGVzRmlsdGVyKHRoaXMuc29ydGVyUmVnRXhwKCksIGxpbmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBsaW5lLCBhbmQgcmV0dXJuIGVpdGhlciBhIHtAbGluayBTb3J0ZXJ9IG9iamVjdCBvciBudWxsLlxuICAgICAqXG4gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdvcmtzIGZvciBhbGwgZmllbGRzIHRoYXQgc3VwcG9ydFxuICAgICAqIHRoZSBkZWZhdWx0IHNvcnRpbmcgcGF0dGVybiBvZiBgc29ydCBieSA8ZmllbGROYW1lPiAocmV2ZXJzZSk/YC5cbiAgICAgKlxuICAgICAqIEZpZWxkcyB0aGF0IG9mZmVyIG1vcmUgY29tcGxpY2F0ZWQgJ3NvcnQgYnknIG9wdGlvbnMgY2FuIG92ZXJyaWRlXG4gICAgICogdGhpcyBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGluZSAtIEEgJ3NvcnQgYnknIGxpbmUgZnJvbSBhIGBgYHRhc2tzYGBgIGJsb2NrLlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgY2FuQ3JlYXRlU29ydGVyRm9yTGluZX1cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU29ydGVyRnJvbUxpbmUobGluZTogc3RyaW5nKTogU29ydGVyIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5zdXBwb3J0c1NvcnRpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXRjaCA9IEZpZWxkLmdldE1hdGNoKHRoaXMuc29ydGVyUmVnRXhwKCksIGxpbmUpO1xuICAgICAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV2ZXJzZSA9ICEhbWF0Y2hbMV07XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNvcnRlcihyZXZlcnNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCB3aWxsIG1hdGNoIGEgY29ycmVjdGx5LWZvcm1lZFxuICAgICAqIGluc3RydWN0aW9uIGxpbmUgZm9yIHNvcnRpbmcgVGFza3MgYnkgdGhpcyBmaWVsZC5cbiAgICAgKlxuICAgICAqIFRocm93cyBpZiB0aGlzIGZpZWxkIGRvZXMgbm90IHN1cHBvcnQgc29ydGluZy5cbiAgICAgKlxuICAgICAqIGBtYXRjaFsxXWAgd2lsbCBiZSBlaXRoZXIgYHJldmVyc2VgIG9yIHVuZGVmaW5lZC5cbiAgICAgKlxuICAgICAqIEZpZWxkcyB0aGF0IG9mZmVyIG1vcmUgY29tcGxpY2F0ZWQgJ3NvcnQgYnknIG9wdGlvbnMgY2FuIG92ZXJyaWRlXG4gICAgICogdGhpcyBtZXRob2QuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNvcnRlclJlZ0V4cCgpOiBSZWdFeHAge1xuICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHNTb3J0aW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBzb3J0ZXJSZWdFeHAoKSB1bmltcGxlbWVudGVkIGZvciAke3RoaXMuZmllbGROYW1lU2luZ3VsYXIoKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBec29ydCBieSAke3RoaXMuZmllbGROYW1lU2luZ3VsYXJFc2NhcGVkKCl9KCByZXZlcnNlKT9gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBmdW5jdGlvbiB0byBjb21wYXJlIHR3byBUYXNrIG9iamVjdHMsIGZvciB1c2UgaW4gc29ydGluZyBieSB0aGlzIGZpZWxkJ3MgdmFsdWUuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIHN1cHBvcnRzU29ydGluZ30gZm9yIHdoYXQgdG8gZG8sIHRvIGVuYWJsZSBzdXBwb3J0IG9mIHNvcnRpbmcgaW4gYVxuICAgICAqIHBhcnRpY3VsYXIge0BsaW5rIEZpZWxkfSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29tcGFyYXRvcigpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYGNvbXBhcmF0b3IoKSB1bmltcGxlbWVudGVkIGZvciAke3RoaXMuZmllbGROYW1lU2luZ3VsYXIoKX1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB7QGxpbmsgU29ydGVyfSBvYmplY3QgZm9yIHNvcnRpbmcgdGFza3MgYnkgdGhpcyBmaWVsZCdzIHZhbHVlLlxuICAgICAqIEBwYXJhbSByZXZlcnNlIC0gZmFsc2UgZm9yIG5vcm1hbCBzb3J0IG9yZGVyLCB0cnVlIGZvciByZXZlcnNlIHNvcnQgb3JkZXIuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVNvcnRlcihyZXZlcnNlOiBib29sZWFuKTogU29ydGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTb3J0ZXIodGhpcy5maWVsZE5hbWVTaW5ndWxhcigpLCB0aGlzLmNvbXBhcmF0b3IoKSwgcmV2ZXJzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEge0BsaW5rIFNvcnRlcn0gb2JqZWN0IGZvciBzb3J0aW5nIHRhc2tzIGJ5IHRoaXMgZmllbGQncyB2YWx1ZSxcbiAgICAgKiBpbiB0aGUgc3RhbmRhcmQvbm9ybWFsIHNvcnQgb3JkZXIgZm9yIHRoaXMgZmllbGQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBjcmVhdGVSZXZlcnNlU29ydGVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVOb3JtYWxTb3J0ZXIoKTogU29ydGVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU29ydGVyKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB7QGxpbmsgU29ydGVyfSBvYmplY3QgZm9yIHNvcnRpbmcgdGFza3MgYnkgdGhpcyBmaWVsZCdzIHZhbHVlLFxuICAgICAqIGluIHRoZSByZXZlcnNlIG9mIHRoZSBzdGFuZGFyZC9ub3JtYWwgc29ydCBvcmRlciBmb3IgdGhpcyBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGNyZWF0ZU5vcm1hbFNvcnRlcn1cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUmV2ZXJzZVNvcnRlcigpOiBTb3J0ZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTb3J0ZXIodHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBHcm91cGluZ1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgY29kZSBmb3IgdGhpcyBmaWVsZCBpbXBsZW1lbnRzIGdyb3VwaW5nIG9mIHRhc2tzLlxuICAgICAqXG4gICAgICogSWYgb3ZlcnJpZGluZyB0aGlzIHRvIHJldHVybiB0cnVlLCBpbiBvcmRlciB0byBlbmFibGUgZ3JvdXBpbmcsXG4gICAgICogdGhlIG1ldGhvZCB7QGxpbmsgZ3JvdXBlcn0gbXVzdCBhbHNvIGJlIG92ZXJyaWRkZW4uXG4gICAgICovXG4gICAgcHVibGljIHN1cHBvcnRzR3JvdXBpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBmdW5jdGlvbiB0byBnZXQgYSBsaXN0IG9mIGEgdGFzaydzIGdyb3VwIG5hbWVzLCBmb3IgdXNlIGluIGdyb3VwaW5nIGJ5IHRoaXMgZmllbGQncyB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgc3VwcG9ydHNHcm91cGluZ30gZm9yIHdoYXQgdG8gZG8sIHRvIGVuYWJsZSBzdXBwb3J0IG9mIGdyb3VwaW5nIGluIGFcbiAgICAgKiBwYXJ0aWN1bGFyIHtAbGluayBGaWVsZH0gaW1wbGVtZW50YXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGdyb3VwZXIoKTogR3JvdXBlckZ1bmN0aW9uIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYGdyb3VwZXIoKSB1bmltcGxlbWVudGVkIGZvciAke3RoaXMuZmllbGROYW1lU2luZ3VsYXIoKX1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB7QGxpbmsgR3JvdXBlcn0gb2JqZWN0IGZvciBncm91cGluZyB0YXNrcyBieSB0aGlzIGZpZWxkJ3MgdmFsdWUuXG4gICAgICpcbiAgICAgKiBGb3Igbm93LCBwYXJzaW5nIG9mIGBncm91cCBieWAgbGluZXMgaXMgY3VycmVudGx5IGRvbmUgaW4ge0BsaW5rIEZpbHRlclBhcnNlci5wYXJzZUdyb3VwZXIoKX0uXG4gICAgICogTGF0ZXIsIHRoaXMgd2lsbCBwcm9iYWJseSBiZSBtb3ZlZCB0byB0aGUge0BsaW5rIEZpZWxkfSBjbGFzc2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVHcm91cGVyKCk6IEdyb3VwZXIge1xuICAgICAgICByZXR1cm4gbmV3IEdyb3VwZXIodGhpcy5maWVsZE5hbWVTaW5ndWxhcigpLCB0aGlzLmdyb3VwZXIoKSk7XG4gICAgfVxufVxuIiwgIi8qKlxuICogQW4gRXhwbGFuYXRpb24gb2JqZWN0IHN0b3JlcyBhIHRleHQgZGVzY3JpcHRpb24gb2YgYSBRdWVyeSBpbnN0cnVjdGlvbiwgb3IgYSBjb21wb25lbnQgb2Ygb25lLlxuICpcbiAqIEl0IHN1cHBvcnRzIEJvb2xlYW4gY29tYmluYXRpb25zIHZpYSB0aGUge0BsaW5rIGNoaWxkcmVufSBmaWVsZC5cbiAqXG4gKiBJbml0aWFsbHksIHRoZSB7QGxpbmsgZGVzY3JpcHRpb259IHdpbGwgc2ltcGx5IHJlc3RhdGUgdGhlIGluc3RydWN0aW9uIGZpbHRlci5cbiAqIExhdGVyLCBtb3JlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4cGxhbmF0aW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3ltYm9sOiBzdHJpbmc7IC8vIEFORCwgT1IsIE5PVCwgWE9SXG4gICAgcHVibGljIHJlYWRvbmx5IGNoaWxkcmVuOiBFeHBsYW5hdGlvbltdO1xuXG4gICAgY29uc3RydWN0b3IoZGVzY3JpcHRpb246IHN0cmluZywgY2hpbGRyZW46IEV4cGxhbmF0aW9uW10gPSBbXSwgc3ltYm9sOiBzdHJpbmcgPSAnJykge1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICAgIHRoaXMuc3ltYm9sID0gc3ltYm9sO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIEV4cGxhbmF0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgQm9vbGVhbiBBTkRcbiAgICAgKiBAcGFyYW0gY2hpbGRyZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW5BbmQoY2hpbGRyZW46IEV4cGxhbmF0aW9uW10pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tYmluZU9yQ3JlYXRlRXhwbGFuYXRpb24oJ0FsbCBvZicsIGNoaWxkcmVuLCAnQU5EJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIEV4cGxhbmF0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgQm9vbGVhbiBPUlxuICAgICAqIEBwYXJhbSBjaGlsZHJlblxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbk9yKGNoaWxkcmVuOiBFeHBsYW5hdGlvbltdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbWJpbmVPckNyZWF0ZUV4cGxhbmF0aW9uKCdBdCBsZWFzdCBvbmUgb2YnLCBjaGlsZHJlbiwgJ09SJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIEV4cGxhbmF0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgQm9vbGVhbiBOT1RcbiAgICAgKiBAcGFyYW0gY2hpbGRyZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW5Ob3QoY2hpbGRyZW46IEV4cGxhbmF0aW9uW10pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHBsYW5hdGlvbignTm9uZSBvZicsIGNoaWxkcmVuLCAnTk9UJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIEV4cGxhbmF0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgQm9vbGVhbiBYT1JcbiAgICAgKiBAcGFyYW0gY2hpbGRyZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW5Yb3IoY2hpbGRyZW46IEV4cGxhbmF0aW9uW10pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHBsYW5hdGlvbignRXhhY3RseSBvbmUgb2YnLCBjaGlsZHJlbiwgJ1hPUicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgRXhwbGFuYXRpb24uXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgaXQgd2lsbCBub3QgaGF2ZSBhIGZpbmFsIGVuZC1vZi1saW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGN1cnJlbnRJbmRlbnRhdGlvbiAtIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiBVc2VycyBjYW4gaWdub3JlIGl0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc1N0cmluZyhjdXJyZW50SW5kZW50YXRpb246IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudEluZGVudGF0aW9uICsgdGhpcy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGhhdmUgY2hpbGRyZW4sIHNvIGNvbmNhdGVuYXRlIHRoZW0gdG9nZXRoZXJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGN1cnJlbnRJbmRlbnRhdGlvbiArIGAke3RoaXMuc3ltYm9sfWA7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIFRoZSBkZXNjcmlwdGlvbnMgbGlrZSAnQWxsIG9mJywgJ05vbmUgb2YnIGFyZSBvbmUgcmVhbGx5IG1lYW5pbmdmdWxcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZmlsdGVyLiBPdGhlcndpc2UsIHRoZXkgYXJlIGp1c3QgY29uZnVzaW5nLlxuICAgICAgICAgICAgcmVzdWx0ICs9IGAgKCR7dGhpcy5kZXNjcmlwdGlvbn0pYDtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgKz0gJzonO1xuICAgICAgICBjb25zdCBuZXdJbmRlbnRhdGlvbiA9IGN1cnJlbnRJbmRlbnRhdGlvbiArICcgICc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGBcXG4ke3RoaXMuY2hpbGRyZW5baV0uYXNTdHJpbmcobmV3SW5kZW50YXRpb24pfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21iaW5lT3JDcmVhdGVFeHBsYW5hdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nLCBjaGlsZHJlbjogRXhwbGFuYXRpb25bXSwgc3ltYm9sOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgY29uc3QgY2hpbGQwID0gY2hpbGRyZW5bMF07XG4gICAgICAgICAgICBjb25zdCBjaGlsZDEgPSBjaGlsZHJlblsxXTtcbiAgICAgICAgICAgIGlmIChjaGlsZDAuc3ltYm9sID09PSBzeW1ib2wgJiYgY2hpbGQxLnN5bWJvbCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBjaGlsZDAuY2hpbGRyZW4ucHVzaChjaGlsZDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFeHBsYW5hdGlvbihkZXNjcmlwdGlvbiwgY2hpbGRyZW4sIHN5bWJvbCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uLy4uL1Rhc2snO1xuaW1wb3J0IHR5cGUgeyBFeHBsYW5hdGlvbiB9IGZyb20gJy4uL0V4cGxhaW4vRXhwbGFuYXRpb24nO1xuXG4vKipcbiAqIEEgZmlsdGVyaW5nIGZ1bmN0aW9uLCB0aGF0IHRha2VzIGEgVGFzayBvYmplY3QgYW5kIHJldHVybnNcbiAqIHdoZXRoZXIgaXQgbWF0Y2hlcyBhIHBhcnRpY3VsYXIgZmlsdGVyaW5nIGluc3RydWN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBGaWx0ZXJGdW5jdGlvbiA9ICh0YXNrOiBUYXNrKSA9PiBib29sZWFuO1xuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgcGFyc2VkIGZpbHRlcmluZyBpbnN0cnVjdGlvbiBmcm9tIGEgdGFza3MgY29kZSBibG9jay5cbiAqXG4gKiBDdXJyZW50bHkgaXQgcHJvdmlkZXMgYWNjZXNzIHRvOlxuICpcbiAqIC0gVGhlIG9yaWdpbmFsIHtAbGluayBpbnN0cnVjdGlvbn1cbiAqIC0gVGhlIHtAbGluayBmaWx0ZXJGdW5jdGlvbn0gLSBhIHtAbGluayBGaWx0ZXJGdW5jdGlvbn0gd2hpY2ggdGVzdHMgd2hldGhlciBhIHRhc2sgbWF0Y2hlcyB0aGUgZmlsdGVyXG4gKlxuICogTGF0ZXIsIHRoZSBwbGFuIGlzIHRvIGFkZCBhIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIG9mIHRoZSBmaWx0ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWx0ZXIge1xuICAgIHJlYWRvbmx5IGluc3RydWN0aW9uOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZXhwbGFuYXRpb246IEV4cGxhbmF0aW9uO1xuICAgIHB1YmxpYyBmaWx0ZXJGdW5jdGlvbjogRmlsdGVyRnVuY3Rpb247XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoaW5zdHJ1Y3Rpb246IHN0cmluZywgZmlsdGVyRnVuY3Rpb246IEZpbHRlckZ1bmN0aW9uLCBleHBsYW5hdGlvbjogRXhwbGFuYXRpb24pIHtcbiAgICAgICAgdGhpcy5pbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uO1xuICAgICAgICB0aGlzLmV4cGxhbmF0aW9uID0gZXhwbGFuYXRpb247XG4gICAgICAgIHRoaXMuZmlsdGVyRnVuY3Rpb24gPSBmaWx0ZXJGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwbGFpbkZpbHRlckluZGVudGVkKGluZGVudDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdGhpcy5leHBsYW5hdGlvbjtcbiAgICAgICAgY29uc3QgdW5pbmRlbnRlZEV4cGxhbmF0aW9uID0gZXhwbGFuYXRpb24uYXNTdHJpbmcoKTtcbiAgICAgICAgaWYgKHVuaW5kZW50ZWRFeHBsYW5hdGlvbiA9PT0gdGhpcy5pbnN0cnVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2luZGVudH0ke3RoaXMuaW5zdHJ1Y3Rpb259XFxuYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtpbmRlbnR9JHt0aGlzLmluc3RydWN0aW9ufSA9PlxcbiR7ZXhwbGFuYXRpb24uYXNTdHJpbmcoJyAgJyl9XFxuYDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHdoaWNoIHN0b3JlcyBvbmUgb2Y6XG4gKiAtIFRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiBzdHJpbmcgLSBhIGxpbmUgZnJvbSBhIHRhc2tzIGNvZGUgYmxvY2tcbiAqIC0gQW4gb3B0aW9uYWwge0BsaW5rIEZpbHRlcn1cbiAqIC0gQW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICpcbiAqIFRoaXMgaXMgcmVhbGx5IGN1cnJlbnRseSBhIGNvbnZlbmllbmNlIGZvciByZXR1cm5pbmcgZGF0YSBmcm9tXG4gKiB7QGxpbmsgRmllbGQuY3JlYXRlRmlsdGVyT3JFcnJvck1lc3NhZ2UoKX0gYW5kIGRlcml2ZWQgY2xhc3Nlcy5cbiAqXG4gKiBCeSB0aGUgdGltZSB0aGUgY29kZSBoYXMgZmluaXNoZWQgd2l0aCBwYXJzaW5nIHRoZSBsaW5lLCB0eXBpY2FsbHkgdGhlXG4gKiBjb250YWluZWQge0BsaW5rIEZpbHRlcn0gd2lsbCBiZSBzYXZlZCwgZm9yIGxhdGVyIHVzZSBpbiBzZWFyY2hpbmcgZm9yIFRhc2tzXG4gKiB0aGF0IG1hdGNoIHRoZSB1c2VyJ3MgZmlsdGVyIGluc3RydWN0aW9uLlxuICpcbiAqIExhdGVyLCBpdCBtYXkgZ2FpbiBoZWxwZXIgZnVuY3Rpb25zIGZvciBjb25zdHJ1Y3RpbmcgcGFyc2VyIGVycm9yIG1lc3NhZ2VzLFxuICogYXMgY3VycmVudGx5IHRoZXNlIGFyZSBjcmVhdGVkIGJ5IHNvbWUgcmF0aGVyIHJlcGV0aXRpb3VzIGNvZGUsIGFuZCBhbHNvXG4gKiB0aGVyZSBpcyBzY29wZSBmb3IgbWFraW5nIHRoZXNlIG1lc3NhZ2VzIG1vcmUgaW5mb3JtYXRpdmUgKGluY2x1ZGluZyB0aGVcbiAqIHByb2JsZW0gbGluZSwgYW5kIHBlcmhhcHMgbGlzdGluZyBhbGxvd2VkIG9wdGlvbnMpLlxuICovXG5leHBvcnQgY2xhc3MgRmlsdGVyT3JFcnJvck1lc3NhZ2Uge1xuICAgIHJlYWRvbmx5IGluc3RydWN0aW9uOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZmlsdGVyOiBGaWx0ZXIgfCB1bmRlZmluZWQ7XG4gICAgZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGluc3RydWN0aW9uOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5pbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVyKCk6IEZpbHRlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXI7XG4gICAgfVxuXG4gICAgc2V0IGZpbHRlcih2YWx1ZTogRmlsdGVyIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlciA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCBmaWx0ZXJGdW5jdGlvbigpOiBGaWx0ZXJGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLl9maWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXIuZmlsdGVyRnVuY3Rpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgRmlsdGVyT3JFcnJvck1lc3NhZ2Ugd2l0aCB0aGUgZmlsdGVyLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSBtZWFuaW5nZnVsIHtAbGluayBFeHBsYW5hdGlvbn0gdG8gYmUgc3VwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsdGVyIC0gYSB7QGxpbmsgRmlsdGVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUZpbHRlcihmaWx0ZXI6IEZpbHRlcik6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEZpbHRlck9yRXJyb3JNZXNzYWdlKGZpbHRlci5pbnN0cnVjdGlvbik7XG4gICAgICAgIHJlc3VsdC5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgRmlsdGVyT3JFcnJvck1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gaW5zdHJ1Y3Rpb25cbiAgICAgKiBAcGFyYW0gZXJyb3JNZXNzYWdlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoaW5zdHJ1Y3Rpb246IHN0cmluZywgZXJyb3JNZXNzYWdlOiBzdHJpbmcpOiBGaWx0ZXJPckVycm9yTWVzc2FnZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGaWx0ZXJPckVycm9yTWVzc2FnZShpbnN0cnVjdGlvbik7XG4gICAgICAgIHJlc3VsdC5lcnJvciA9IGVycm9yTWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRXhwbGFuYXRpb24gfSBmcm9tICcuLi9FeHBsYWluL0V4cGxhbmF0aW9uJztcbmltcG9ydCB7IEZpbHRlciwgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlcic7XG5pbXBvcnQgdHlwZSB7IEZpbHRlckZ1bmN0aW9uIH0gZnJvbSAnLi9GaWx0ZXInO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGEgc2luZ2xlIGluc3RydWN0aW9uIGZvciBmaWx0ZXJpbmcgdGFza3MsIGFuZCBpdHMgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUuXG4gKlxuICogVGhpcyBpcyByZWFsbHkgYSBoZWxwZXIgdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIGluZGl2aWR1YWwgZmlsdGVyXG4gKiBpbnN0cnVjdGlvbnMsIGhpZGluZyBhd2F5IHRoZSBkZXRhaWxzIG9mIHBhcnNpbmcgaW5kaXZpZHVhbCBpbnN0cnVjdGlvbiBsaW5lcy5cbiAqXG4gKiBUaGlzIHdpbGwgdXN1YWxseSBiZSBhY2Nlc3NlZCB2aWEge0BsaW5rIEZpbHRlckluc3RydWN0aW9ucy5hZGR9XG4gKlxuICogQHNlZSBGaWx0ZXJJbnN0cnVjdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbHRlckluc3RydWN0aW9uIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbnN0cnVjdGlvbjogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlcjogRmlsdGVyRnVuY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvcjpcbiAgICAgKiBAcGFyYW0gaW5zdHJ1Y3Rpb24gLSBGdWxsIHRleHQgb2YgdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZmlsdGVyOiBtdXN0IGJlIG1hdGNoZWQgZXhhY3RseVxuICAgICAqIEBwYXJhbSBmaWx0ZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpbnN0cnVjdGlvbjogc3RyaW5nLCBmaWx0ZXI6IEZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuX2luc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb247XG4gICAgICAgIHRoaXMuX2ZpbHRlciA9IGZpbHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQ3JlYXRlRmlsdGVyRm9yTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGxpbmUgPT0gdGhpcy5faW5zdHJ1Y3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmUpO1xuXG4gICAgICAgIGlmIChsaW5lID09PSB0aGlzLl9pbnN0cnVjdGlvbikge1xuICAgICAgICAgICAgcmVzdWx0LmZpbHRlciA9IG5ldyBGaWx0ZXIobGluZSwgdGhpcy5fZmlsdGVyLCBuZXcgRXhwbGFuYXRpb24obGluZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5lcnJvciA9IGBkbyBub3QgdW5kZXJzdGFuZCBmaWx0ZXI6ICR7bGluZX1gO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBGaWx0ZXJJbnN0cnVjdGlvbiB9IGZyb20gJy4vRmlsdGVySW5zdHJ1Y3Rpb24nO1xuaW1wb3J0IHsgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlcic7XG5pbXBvcnQgdHlwZSB7IEZpbHRlckZ1bmN0aW9uIH0gZnJvbSAnLi9GaWx0ZXInO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGEgY29sbGVjdGlvbiBvZiBpbnN0cnVjdGlvbnMgZm9yIGZpbHRlcmluZyB0YXNrcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlcnMgPSBuZXcgRmlsdGVySW5zdHJ1Y3Rpb25zKCk7XG4gKiAgICAgdGhpcy5fZmlsdGVycy5hZGQoJ2lzIHJlY3VycmluZycsICh0YXNrKSA9PiB0YXNrLnJlY3VycmVuY2UgIT09IG51bGwpO1xuICpcbiAqIEBzZWUgRmlsdGVySW5zdHJ1Y3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIEZpbHRlckluc3RydWN0aW9ucyB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyczogRmlsdGVySW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gICAgcHVibGljIGFkZChpbnN0cnVjdGlvbjogc3RyaW5nLCBmaWx0ZXI6IEZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaChuZXcgRmlsdGVySW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIGZpbHRlcikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5DcmVhdGVGaWx0ZXJGb3JMaW5lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiB0aGlzLl9maWx0ZXJzKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyLmNhbkNyZWF0ZUZpbHRlckZvckxpbmUobGluZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdGhpcy5fZmlsdGVycykge1xuICAgICAgICAgICAgY29uc3QgeCA9IGZpbHRlci5jcmVhdGVGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcbiAgICAgICAgICAgIGlmICh4LmVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcbiAgICAgICAgcmVzdWx0LmVycm9yID0gYGRvIG5vdCB1bmRlcnN0YW5kIGZpbHRlcjogJHtsaW5lfWA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9GaWVsZCc7XG5pbXBvcnQgeyBGaWx0ZXJJbnN0cnVjdGlvbnMgfSBmcm9tICcuL0ZpbHRlckluc3RydWN0aW9ucyc7XG5pbXBvcnQgdHlwZSB7IEZpbHRlck9yRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9GaWx0ZXInO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgYW4gaW1wbGVtZW50YXRpb24gZm9yIGltcGxlbWVudHMgb2Yge0BsaW5rIEZpZWxkfVxuICpcbiAqIFRoZSBuYW1lZCBvZiB0aGUgY2xhc3MgaXMgd2Vhay4gSXQgaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBmYWN0IHRoYXQgdGhlXG4gKiBjbGFzcyBpcyBlbnRpcmVseSBpbXBsZW1lbnRlZCB2aWEgdGhlIHtAbGluayBGaWx0ZXJJbnN0cnVjdGlvbnN9IGNsYXNzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmlsdGVySW5zdHJ1Y3Rpb25zQmFzZWRGaWVsZCBleHRlbmRzIEZpZWxkIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2ZpbHRlcnMgPSBuZXcgRmlsdGVySW5zdHJ1Y3Rpb25zKCk7XG5cbiAgICBwdWJsaWMgY2FuQ3JlYXRlRmlsdGVyRm9yTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnMuY2FuQ3JlYXRlRmlsdGVyRm9yTGluZShsaW5lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRmlsdGVyT3JFcnJvck1lc3NhZ2UobGluZTogc3RyaW5nKTogRmlsdGVyT3JFcnJvck1lc3NhZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVycy5jcmVhdGVGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB8IG51bGwge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IENvbXBhcmF0b3IgfSBmcm9tICcuLi9Tb3J0ZXInO1xuaW1wb3J0IHsgU3RhdHVzVHlwZSB9IGZyb20gJy4uLy4uL1N0YXR1c0NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgRmlsdGVySW5zdHJ1Y3Rpb25zQmFzZWRGaWVsZCB9IGZyb20gJy4vRmlsdGVySW5zdHJ1Y3Rpb25zQmFzZWRGaWVsZCc7XG5cbmV4cG9ydCBjbGFzcyBTdGF0dXNGaWVsZCBleHRlbmRzIEZpbHRlckluc3RydWN0aW9uc0Jhc2VkRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIC8vIEJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGNoYW5nZTogSW4gVGFza3MgMS4yMi4wIGFuZCBlYXJsaWVyLCBhbGwgdGFza3NcbiAgICAgICAgLy8gd2l0aCBhbnkgc3RhdHVzIGNoYXJhY3RlciBleGNlcHQgc3BhY2Ugd2VyZSBjb25zaWRlcmVkIGJ5IHRoZSBzdGF0dXMgZmlsdGVyXG4gICAgICAgIC8vIGluc3RydWN0aW9ucyB0byBiZSBkb25lLlxuICAgICAgICAvLyBJbiBsYXRlciB2ZXJzaW9uczpcbiAgICAgICAgLy8gICBTdGF0dXNUeXBlLkRPTkUgY291bnRzIGFzIGRvbmVcbiAgICAgICAgLy8gICBTdGF0dXNUeXBlLkNBTkNFTExFRCBjb3VudHMgYXMgZG9uZVxuICAgICAgICAvLyAgIFN0YXR1c1R5cGUuVE9ETyBjb3VudHMgYXMgbm90IGRvbmVcbiAgICAgICAgLy8gICBTdGF0dXNUeXBlLklOX1BST0dSRVNTIGNvdW50cyBhcyBub3QgZG9uZVxuICAgICAgICAvLyAgIFN0YXR1c1R5cGUuTk9OX1RBU0sgY291bnRzIGFzIGRvbmVcbiAgICAgICAgdGhpcy5fZmlsdGVycy5hZGQoXG4gICAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgICAodGFzazogVGFzaykgPT5cbiAgICAgICAgICAgICAgICB0YXNrLnN0YXR1cy50eXBlID09PSBTdGF0dXNUeXBlLkRPTkUgfHxcbiAgICAgICAgICAgICAgICB0YXNrLnN0YXR1cy50eXBlID09PSBTdGF0dXNUeXBlLkNBTkNFTExFRCB8fFxuICAgICAgICAgICAgICAgIHRhc2suc3RhdHVzLnR5cGUgPT09IFN0YXR1c1R5cGUuTk9OX1RBU0ssXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMuYWRkKFxuICAgICAgICAgICAgJ25vdCBkb25lJyxcbiAgICAgICAgICAgICh0YXNrOiBUYXNrKSA9PiB0YXNrLnN0YXR1cy50eXBlID09PSBTdGF0dXNUeXBlLlRPRE8gfHwgdGFzay5zdGF0dXMudHlwZSA9PT0gU3RhdHVzVHlwZS5JTl9QUk9HUkVTUyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnc3RhdHVzJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3VwcG9ydHNTb3J0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBmdW5jdGlvbiB0byBjb21wYXJlIHR3byBUYXNrIG9iamVjdHMsIGZvciB1c2UgaW4gc29ydGluZyBieSBzdGF0dXMuXG4gICAgICovXG4gICAgcHVibGljIGNvbXBhcmF0b3IoKTogQ29tcGFyYXRvciB7XG4gICAgICAgIC8vIEJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IG5vdGU6IEluIFRhc2tzIDEuMjIuMCBhbmQgZWFybGllciwgdGhlXG4gICAgICAgIC8vIG9ubHkgYXZhaWxhYmxlIHN0YXR1cyBuYW1lcyB3ZXJlICdUb2RvJyBhbmQgJ0RvbmUnLlxuICAgICAgICAvLyBBbmQgJ1RvZG8nIHNvcnRlZCBiZWZvcmUgJ0RvbmUnLlxuICAgICAgICByZXR1cm4gKGE6IFRhc2ssIGI6IFRhc2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFN0YXR1c05hbWVBID0gU3RhdHVzRmllbGQub2xkU3RhdHVzTmFtZShhKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZFN0YXR1c05hbWVCID0gU3RhdHVzRmllbGQub2xkU3RhdHVzTmFtZShiKTtcbiAgICAgICAgICAgIGlmIChvbGRTdGF0dXNOYW1lQSA8IG9sZFN0YXR1c05hbWVCKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9sZFN0YXR1c05hbWVBID4gb2xkU3RhdHVzTmFtZUIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG9sZFN0YXR1c05hbWUoYTogVGFzayk6IHN0cmluZyB7XG4gICAgICAgIGlmIChhLnN0YXR1cy5zeW1ib2wgPT09ICcgJykge1xuICAgICAgICAgICAgcmV0dXJuICdUb2RvJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnRG9uZSc7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0ICogYXMgY2hyb25vIGZyb20gJ2Nocm9uby1ub2RlJztcblxuZXhwb3J0IGNsYXNzIERhdGVQYXJzZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgcGFyc2VEYXRlKGlucHV0OiBzdHJpbmcsIGZvcndhcmREYXRlOiBib29sZWFuID0gZmFsc2UpOiBtb21lbnQuTW9tZW50IHtcbiAgICAgICAgLy8gVXNpbmcgc3RhcnQgb2YgZGF5IHRvIGNvcnJlY3RseSBtYXRjaCBvbiBjb21wYXJpc29uIHdpdGggb3RoZXIgZGF0ZXMgKGxpa2UgZXF1YWxpdHkpLlxuICAgICAgICByZXR1cm4gd2luZG93XG4gICAgICAgICAgICAubW9tZW50KFxuICAgICAgICAgICAgICAgIGNocm9uby5wYXJzZURhdGUoaW5wdXQsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICBmb3J3YXJkRGF0ZTogZm9yd2FyZERhdGUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3RhcnRPZignZGF5Jyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uLy4uL1Rhc2snO1xuaW1wb3J0IHsgRGF0ZVBhcnNlciB9IGZyb20gJy4uL0RhdGVQYXJzZXInO1xuaW1wb3J0IHsgRXhwbGFuYXRpb24gfSBmcm9tICcuLi9FeHBsYWluL0V4cGxhbmF0aW9uJztcbmltcG9ydCB0eXBlIHsgQ29tcGFyYXRvciB9IGZyb20gJy4uL1NvcnRlcic7XG5pbXBvcnQgeyBjb21wYXJlQnlEYXRlIH0gZnJvbSAnLi4vLi4vbGliL0RhdGVUb29scyc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vRmllbGQnO1xuaW1wb3J0IHsgRmlsdGVyLCBGaWx0ZXJPckVycm9yTWVzc2FnZSB9IGZyb20gJy4vRmlsdGVyJztcbmltcG9ydCB7IEZpbHRlckluc3RydWN0aW9ucyB9IGZyb20gJy4vRmlsdGVySW5zdHJ1Y3Rpb25zJztcblxuLyoqXG4gKiBEYXRlRmllbGQgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB0byBoZWxwIGltcGxlbWVudFxuICogYWxsIHRoZSBmaWx0ZXIgaW5zdHJ1Y3Rpb25zIHRoYXQgYWN0IG9uIGEgc2luZ2xlIHR5cGUgb2YgZGF0ZVxuICogdmFsdWUsIHN1Y2ggYXMgdGhlIGRvbmUgZGF0ZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERhdGVGaWVsZCBleHRlbmRzIEZpZWxkIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZpbHRlckluc3RydWN0aW9uczogRmlsdGVySW5zdHJ1Y3Rpb25zO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZmlsdGVySW5zdHJ1Y3Rpb25zID0gbmV3IEZpbHRlckluc3RydWN0aW9ucygpO1xuICAgICAgICB0aGlzLmZpbHRlckluc3RydWN0aW9ucy5hZGQoYGhhcyAke3RoaXMuZmllbGROYW1lKCl9IGRhdGVgLCAodGFzazogVGFzaykgPT4gdGhpcy5kYXRlKHRhc2spICE9PSBudWxsKTtcbiAgICAgICAgdGhpcy5maWx0ZXJJbnN0cnVjdGlvbnMuYWRkKGBubyAke3RoaXMuZmllbGROYW1lKCl9IGRhdGVgLCAodGFzazogVGFzaykgPT4gdGhpcy5kYXRlKHRhc2spID09PSBudWxsKTtcbiAgICAgICAgdGhpcy5maWx0ZXJJbnN0cnVjdGlvbnMuYWRkKGAke3RoaXMuZmllbGROYW1lKCl9IGRhdGUgaXMgaW52YWxpZGAsICh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlKHRhc2spO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGUgIT09IG51bGwgJiYgIWRhdGUuaXNWYWxpZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQ3JlYXRlRmlsdGVyRm9yTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVySW5zdHJ1Y3Rpb25zLmNhbkNyZWF0ZUZpbHRlckZvckxpbmUobGluZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLmNhbkNyZWF0ZUZpbHRlckZvckxpbmUobGluZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgY29uc3QgZmlsdGVyUmVzdWx0ID0gdGhpcy5maWx0ZXJJbnN0cnVjdGlvbnMuY3JlYXRlRmlsdGVyT3JFcnJvck1lc3NhZ2UobGluZSk7XG4gICAgICAgIGlmIChmaWx0ZXJSZXN1bHQuZmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgRmlsdGVyT3JFcnJvck1lc3NhZ2UobGluZSk7XG5cbiAgICAgICAgY29uc3QgbWF0Y2ggPSBGaWVsZC5nZXRNYXRjaCh0aGlzLmZpbHRlclJlZ0V4cCgpLCBsaW5lKTtcbiAgICAgICAgbGV0IGZpbHRlckZ1bmN0aW9uO1xuICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckRhdGUgPSBEYXRlUGFyc2VyLnBhcnNlRGF0ZShtYXRjaFsyXSk7XG4gICAgICAgICAgICBpZiAoIWZpbHRlckRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kICcgKyB0aGlzLmZpZWxkTmFtZSgpICsgJyBkYXRlJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlbGF0aXZlO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRnVuY3Rpb24gPSAodGFzazogVGFzaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZSh0YXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRlID8gZGF0ZS5pc0JlZm9yZShmaWx0ZXJEYXRlKSA6IHRoaXMuZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSAnICcgKyBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoWzFdID09PSAnYWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckZ1bmN0aW9uID0gKHRhc2s6IFRhc2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGUodGFzayk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZSA/IGRhdGUuaXNBZnRlcihmaWx0ZXJEYXRlKSA6IHRoaXMuZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSAnICcgKyBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGdW5jdGlvbiA9ICh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlKHRhc2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUgPyBkYXRlLmlzU2FtZShmaWx0ZXJEYXRlKSA6IHRoaXMuZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSAnIG9uJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBEYXRlRmllbGQuZ2V0RXhwbGFuYXRpb25TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGROYW1lKCksXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclJlc3VsdElmRmllbGRNaXNzaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckRhdGUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXN1bHQuZmlsdGVyID0gbmV3IEZpbHRlcihsaW5lLCBmaWx0ZXJGdW5jdGlvbiwgbmV3IEV4cGxhbmF0aW9uKGV4cGxhbmF0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSAnZG8gbm90IHVuZGVyc3RhbmQgcXVlcnkgZmlsdGVyICgnICsgdGhpcy5maWVsZE5hbWUoKSArICcgZGF0ZSknO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSB0YXNrJ3MgdmFsdWUgZm9yIHRoaXMgZGF0ZSBmaWVsZCwgaWYgYW55LlxuICAgICAqIEBwYXJhbSB0YXNrIC0gYSBUYXNrIG9iamVjdFxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGF0ZSh0YXNrOiBUYXNrKTogTW9tZW50IHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIHN0cmluZyB1c2VkIHRvIGV4cGxhaW4gYSBkYXRlLWJhc2VkIGZpbHRlclxuICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBmb3IgZXhhbXBsZSwgJ2R1ZSdcbiAgICAgKiBAcGFyYW0gcmVsYXRpb25zaGlwUHJlZml4ZWRXaXRoU3BhY2UgLSBmb3IgZXhhbXBsZSAnIGJlZm9yZScgb3IgJydcbiAgICAgKiBAcGFyYW0gZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcgLSB3aGV0aGVyIHRoZSBzZWFyY2ggbWF0Y2hlcyB0YXNrcyB3aXRob3V0IHRoZSByZXF1ZXN0ZWQgZGF0ZSB2YWx1ZVxuICAgICAqIEBwYXJhbSBmaWx0ZXJEYXRlIC0gdGhlIGRhdGUgdXNlZCBpbiB0aGUgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFeHBsYW5hdGlvblN0cmluZyhcbiAgICAgICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgICAgIHJlbGF0aW9uc2hpcFByZWZpeGVkV2l0aFNwYWNlOiBzdHJpbmcsXG4gICAgICAgIGZpbHRlclJlc3VsdElmRmllbGRNaXNzaW5nOiBib29sZWFuLFxuICAgICAgICBmaWx0ZXJEYXRlOiBtb21lbnQuTW9tZW50LFxuICAgICkge1xuICAgICAgICAvLyBFeGFtcGxlIG9mIGZvcm1hdHRlZCBkYXRlOiAnMjAyNC0wMS0wMiAoVHVlc2RheSAybmQgSmFudWFyeSAyMDI0KSdcbiAgICAgICAgY29uc3QgYWN0dWFsRGF0ZSA9IGZpbHRlckRhdGUuZm9ybWF0KCdZWVlZLU1NLUREIChkZGRkIERvIE1NTU0gWVlZWSknKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGAke2ZpZWxkTmFtZX0gZGF0ZSBpcyR7cmVsYXRpb25zaGlwUHJlZml4ZWRXaXRoU3BhY2V9ICR7YWN0dWFsRGF0ZX1gO1xuICAgICAgICBpZiAoZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgIE9SIG5vICR7ZmllbGROYW1lfSBkYXRlYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgdGFzayB0aGF0IGRvZXMgbm90IGhhdmUgdGhlIHBhcnRpY3VsYXIgZGF0ZSB2YWx1ZVxuICAgICAqIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgbWF0Y2guIEZvciBleGFtcGxlLCAnc3RhcnRzJyBzZWFyY2hlcyBtYXRjaCBhbGwgdGFza3NcbiAgICAgKiB0aGF0IGhhdmUgbm8gc3RhcnQgZGF0ZSwgd2hpY2ggYmVoYXZlcyBkaWZmZXJlbnRseSBmcm9tICdkdWUnLCAnZG9uZScgYW5kXG4gICAgICogJ3NjaGVkdWxlZCcgc2VhcmNoZXMuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBmaWx0ZXJSZXN1bHRJZkZpZWxkTWlzc2luZygpOiBib29sZWFuO1xuXG4gICAgcHVibGljIHN1cHBvcnRzU29ydGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBhcmF0b3IoKTogQ29tcGFyYXRvciB7XG4gICAgICAgIHJldHVybiAoYTogVGFzaywgYjogVGFzaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVCeURhdGUodGhpcy5kYXRlKGEpLCB0aGlzLmRhdGUoYikpO1xuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IERhdGVGaWVsZCB9IGZyb20gJy4vRGF0ZUZpZWxkJztcblxuLyoqXG4gKiBTdXBwb3J0IHRoZSAnZHVlJyBzZWFyY2ggaW5zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBEdWVEYXRlRmllbGQgZXh0ZW5kcyBEYXRlRmllbGQge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGR1ZVJlZ2V4cCA9IC9eZHVlIChiZWZvcmV8YWZ0ZXJ8b24pPyA/KC4qKS87XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB7XG4gICAgICAgIHJldHVybiBEdWVEYXRlRmllbGQuZHVlUmVnZXhwO1xuICAgIH1cbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnZHVlJztcbiAgICB9XG4gICAgcHVibGljIGRhdGUodGFzazogVGFzayk6IE1vbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGFzay5kdWVEYXRlO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUHJpb3JpdHksIFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IEV4cGxhbmF0aW9uIH0gZnJvbSAnLi4vRXhwbGFpbi9FeHBsYW5hdGlvbic7XG5pbXBvcnQgdHlwZSB7IENvbXBhcmF0b3IgfSBmcm9tICcuLi9Tb3J0ZXInO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuL0ZpZWxkJztcbmltcG9ydCB7IEZpbHRlciwgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlcic7XG5cbmV4cG9ydCBjbGFzcyBQcmlvcml0eUZpZWxkIGV4dGVuZHMgRmllbGQge1xuICAgIC8vIFRoZSB0cmljayBpbiB0aGUgZm9sbG93aW5nIHRvIG1hbmFnZSB3aGl0ZXNwYWNlIHdpdGggb3B0aW9uYWwgdmFsdWVzXG4gICAgLy8gaXMgdG8gY2FwdHVyZSB0aGVtIGluIE5lc3RlZCBDYXB0dXJlIEdyb3VwcywgbGlrZSB0aGlzOlxuICAgIC8vICAobGVhZGluZy13aGl0ZS1zcGFjZS1pbi1vdXRlci1jYXB0dXJlLWdyb3VwKHZhbHVlcy10by11c2UtYXJlLWluLWlubmVyLWNhcHR1cmUtZ3JvdXApKVxuICAgIC8vIFRoZSBjYXB0dXJlIGdyb3VwcyBhcmUgbnVtYmVyZWQgaW4gdGhlIG9yZGVyIG9mIHRoZWlyIG9wZW5pbmcgYnJhY2tldHMsIGZyb20gbGVmdCB0byByaWdodC5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwcmlvcml0eVJlZ2V4cCA9IC9ecHJpb3JpdHkoXFxzK2lzKT8oXFxzKyhhYm92ZXxiZWxvd3xub3QpKT8oXFxzKyhsb3d8bm9uZXxtZWRpdW18aGlnaCkpJC87XG5cbiAgICBjcmVhdGVGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lOiBzdHJpbmcpOiBGaWx0ZXJPckVycm9yTWVzc2FnZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlNYXRjaCA9IEZpZWxkLmdldE1hdGNoKHRoaXMuZmlsdGVyUmVnRXhwKCksIGxpbmUpO1xuICAgICAgICBpZiAocHJpb3JpdHlNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyUHJpb3JpdHlTdHJpbmcgPSBwcmlvcml0eU1hdGNoWzVdO1xuICAgICAgICAgICAgbGV0IGZpbHRlclByaW9yaXR5OiBQcmlvcml0eSB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGZpbHRlclByaW9yaXR5U3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbG93JzpcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUHJpb3JpdHkgPSBQcmlvcml0eS5Mb3c7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJQcmlvcml0eSA9IFByaW9yaXR5Lk5vbmU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21lZGl1bSc6XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclByaW9yaXR5ID0gUHJpb3JpdHkuTWVkaXVtO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdoaWdoJzpcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUHJpb3JpdHkgPSBQcmlvcml0eS5IaWdoO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpbHRlclByaW9yaXR5ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIHByaW9yaXR5JztcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZXhwbGFuYXRpb24gPSBsaW5lO1xuICAgICAgICAgICAgbGV0IGZpbHRlcjtcbiAgICAgICAgICAgIHN3aXRjaCAocHJpb3JpdHlNYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Fib3ZlJzpcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gKHRhc2s6IFRhc2spID0+IHRhc2sucHJpb3JpdHkubG9jYWxlQ29tcGFyZShmaWx0ZXJQcmlvcml0eSEpIDwgMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYmVsb3cnOlxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAodGFzazogVGFzaykgPT4gdGFzay5wcmlvcml0eS5sb2NhbGVDb21wYXJlKGZpbHRlclByaW9yaXR5ISkgPiAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdub3QnOlxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAodGFzazogVGFzaykgPT4gdGFzay5wcmlvcml0eSAhPT0gZmlsdGVyUHJpb3JpdHk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlciA9ICh0YXNrOiBUYXNrKSA9PiB0YXNrLnByaW9yaXR5ID09PSBmaWx0ZXJQcmlvcml0eTtcbiAgICAgICAgICAgICAgICAgICAgZXhwbGFuYXRpb24gPSBgJHt0aGlzLmZpZWxkTmFtZSgpfSBpcyAke2ZpbHRlclByaW9yaXR5U3RyaW5nfWA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5maWx0ZXIgPSBuZXcgRmlsdGVyKGxpbmUsIGZpbHRlciwgbmV3IEV4cGxhbmF0aW9uKGV4cGxhbmF0aW9uKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSAnZG8gbm90IHVuZGVyc3RhbmQgcXVlcnkgZmlsdGVyIChwcmlvcml0eSknO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3ByaW9yaXR5JztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB7XG4gICAgICAgIHJldHVybiBQcmlvcml0eUZpZWxkLnByaW9yaXR5UmVnZXhwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wYXJhdG9yKCk6IENvbXBhcmF0b3Ige1xuICAgICAgICByZXR1cm4gKGE6IFRhc2ssIGI6IFRhc2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhLnByaW9yaXR5LmxvY2FsZUNvbXBhcmUoYi5wcmlvcml0eSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIGEgc3RyaW5nIHZhbHVlIG1hdGNoZXMgYSBwYXJ0aWN1bGFyIGNvbmRpdGlvbi5cbiAqXG4gKiBUaGlzIGlzIHVzZWQgdG8gaGlkZSBhd2F5IHRoZSBkZXRhaWxzIG9mIHZhcmlvdXMgdGV4dCBzZWFyY2hlcywgc3VjaCBhcyB0aGVcbiAqIHNpbXBsZSBpbmNsdXNpb24gb2YgYSBzdWItc3RyaW5nLCBvciB0aGUgbW9yZSBjb21wbGV4IHJlZ3VsYXIgZXhwcmVzc2lvbiBzZWFyY2hlcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElTdHJpbmdNYXRjaGVyIHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gc3RyaW5nIG1hdGNoZXMgdGhpcyBjb25kaXRpb24uXG4gICAgICogQHBhcmFtIHN0cmluZ1RvU2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IG1hdGNoZXMoc3RyaW5nVG9TZWFyY2g6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gd2hldGhlciBhbnkgb2YgdGhlIGdpdmVuIHN0cmluZ3MgbWF0Y2hlcyB0aGlzIGNvbmRpdGlvbi5cbiAgICAgKiBAcGFyYW0gc3RyaW5nc1RvU2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIG1hdGNoZXNBbnlPZihzdHJpbmdzVG9TZWFyY2g6IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdzVG9TZWFyY2guc29tZSgocykgPT4gdGhpcy5tYXRjaGVzKHMpKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgSVN0cmluZ01hdGNoZXIgfSBmcm9tICcuL0lTdHJpbmdNYXRjaGVyJztcblxuLyoqXG4gKiBTdWJzdHJpbmctYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgSVN0cmluZ01hdGNoZXIuXG4gKlxuICogVGhpcyBkb2VzIGEgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2ggZm9yIHRoZSBnaXZlbiBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdWJzdHJpbmdNYXRjaGVyIGV4dGVuZHMgSVN0cmluZ01hdGNoZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nVG9GaW5kOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBTdWJzdHJpbmdNYXRjaGVyIG9iamVjdFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1RvRmluZCAtIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoZXMgd2lsbCBiZSBjYXNlLWluc2Vuc2l0aXZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzdHJpbmdUb0ZpbmQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnN0cmluZ1RvRmluZCA9IHN0cmluZ1RvRmluZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hlcyhzdHJpbmdUb1NlYXJjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBTdWJzdHJpbmdNYXRjaGVyLnN0cmluZ0luY2x1ZGVzQ2FzZUluc2Vuc2l0aXZlKHN0cmluZ1RvU2VhcmNoLCB0aGlzLnN0cmluZ1RvRmluZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzdHJpbmdJbmNsdWRlc0Nhc2VJbnNlbnNpdGl2ZShoYXlzdGFjazogc3RyaW5nLCBuZWVkbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaGF5c3RhY2sudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyhuZWVkbGUudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IElTdHJpbmdNYXRjaGVyIH0gZnJvbSAnLi9JU3RyaW5nTWF0Y2hlcic7XG5cbi8qKlxuICogUmVndWxhci1leHByZXNzaW9uLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIElTdHJpbmdNYXRjaGVyLlxuICovXG5leHBvcnQgY2xhc3MgUmVnZXhNYXRjaGVyIGV4dGVuZHMgSVN0cmluZ01hdGNoZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnZXg6IFJlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIFJlZ2V4TWF0Y2hlciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVnZXgge1JlZ0V4cH0gLSBBIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihyZWdleDogUmVnRXhwKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucmVnZXggPSByZWdleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBSZWdleE1hdGNoZXIgb2JqZWN0IGlmIHRoZSBzdXBwbGllZCBzdHJpbmcgaXMgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAgICogYW5kIG51bGwgaWYgbm90LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2V4SW5wdXQgLSBBIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlZ2luIHdpdGggYSAvLCBhbmQgZW5kIGVpdGhlciB3aXRoIC8gYW5kIG9wdGlvbmFsbHkgYW55XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBmbGFncy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHZhbGlkYXRlQW5kQ29uc3RydWN0KHJlZ2V4SW5wdXQ6IHN0cmluZyk6IFJlZ2V4TWF0Y2hlciB8IG51bGwge1xuICAgICAgICAvLyBDb3VydGVzeSBvZiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNzg0MzY5MS9qYXZhc2NyaXB0LXJlZ2V4LXRvLW1hdGNoLWEtcmVnZXhcbiAgICAgICAgY29uc3QgcmVnZXhQYXR0ZXJuID1cbiAgICAgICAgICAgIC9cXC8oKD8hWyorP10pKD86W15cXHJcXG5bL1xcXFxdfFxcXFwufFxcWyg/OlteXFxyXFxuXFxdXFxcXF18XFxcXC4pKl0pKylcXC8oKD86Zyg/OmltP3xtaT8pP3xpKD86Z20/fG1nPyk/fG0oPzpnaT98aWc/KT8pPykvO1xuICAgICAgICBjb25zdCBxdWVyeSA9IHJlZ2V4SW5wdXQubWF0Y2gocmVnZXhQYXR0ZXJuKTtcblxuICAgICAgICBpZiAocXVlcnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZ0V4cCA9IG5ldyBSZWdFeHAocXVlcnlbMV0sIHF1ZXJ5WzJdKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnZXhNYXRjaGVyKHJlZ0V4cCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBtYXRjaGVzKHN0cmluZ1RvU2VhcmNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1RvU2VhcmNoLm1hdGNoKHRoaXMucmVnZXgpICE9PSBudWxsO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IFN1YnN0cmluZ01hdGNoZXIgfSBmcm9tICcuLi9NYXRjaGVycy9TdWJzdHJpbmdNYXRjaGVyJztcbmltcG9ydCB7IFJlZ2V4TWF0Y2hlciB9IGZyb20gJy4uL01hdGNoZXJzL1JlZ2V4TWF0Y2hlcic7XG5pbXBvcnQgdHlwZSB7IElTdHJpbmdNYXRjaGVyIH0gZnJvbSAnLi4vTWF0Y2hlcnMvSVN0cmluZ01hdGNoZXInO1xuaW1wb3J0IHsgRXhwbGFuYXRpb24gfSBmcm9tICcuLi9FeHBsYWluL0V4cGxhbmF0aW9uJztcbmltcG9ydCB0eXBlIHsgQ29tcGFyYXRvciB9IGZyb20gJy4uL1NvcnRlcic7XG5pbXBvcnQgdHlwZSB7IEdyb3VwZXJGdW5jdGlvbiB9IGZyb20gJy4uL0dyb3VwZXInO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuL0ZpZWxkJztcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb24gfSBmcm9tICcuL0ZpbHRlcic7XG5pbXBvcnQgeyBGaWx0ZXIsIEZpbHRlck9yRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9GaWx0ZXInO1xuXG4vKipcbiAqIFRleHRGaWVsZCBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHRvIGhlbHAgaW1wbGVtZW50XG4gKiBhbGwgdGhlIGZpbHRlciBpbnN0cnVjdGlvbnMgdGhhdCBhY3Qgb24gYSBzaW5nbGUgdHlwZSBvZiBzdHJpbmdcbiAqIHZhbHVlLCBzdWNoIGFzIHRoZSBkZXNjcmlwdGlvbiBvciBmaWxlIHBhdGguXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUZXh0RmllbGQgZXh0ZW5kcyBGaWVsZCB7XG4gICAgcHVibGljIGNyZWF0ZUZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBGaWVsZC5nZXRNYXRjaCh0aGlzLmZpbHRlclJlZ0V4cCgpLCBsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBJZiBGaWVsZC5jYW5DcmVhdGVGaWx0ZXJGb3JMaW5lKCkgaGFzIGJlZW4gY2hlY2tlZCwgd2Ugc2hvdWxkIG5ldmVyIGdldFxuICAgICAgICAgICAgLy8gaW4gdG8gdGhpcyBibG9jay5cbiAgICAgICAgICAgIHJldHVybiBGaWx0ZXJPckVycm9yTWVzc2FnZS5mcm9tRXJyb3IobGluZSwgYGRvIG5vdCB1bmRlcnN0YW5kIHF1ZXJ5IGZpbHRlciAoJHt0aGlzLmZpZWxkTmFtZSgpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhbiBJU3RyaW5nTWF0Y2hlciBmb3IgdGhpcyBmaWx0ZXIsIG9yIHJldHVyblxuICAgICAgICAvLyBpZiB0aGUgaW5wdXRzIGFyZSBpbnZhbGlkLlxuICAgICAgICBjb25zdCBbXywgZmlsdGVyT3BlcmF0b3IsIGZpbHRlclZhbHVlXSA9IG1hdGNoO1xuICAgICAgICBsZXQgbWF0Y2hlcjogSVN0cmluZ01hdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgICAgICAgaWYgKGZpbHRlck9wZXJhdG9yLmluY2x1ZGVzKCdpbmNsdWRlJykpIHtcbiAgICAgICAgICAgIG1hdGNoZXIgPSBuZXcgU3Vic3RyaW5nTWF0Y2hlcihmaWx0ZXJWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyT3BlcmF0b3IuaW5jbHVkZXMoJ3JlZ2V4JykpIHtcbiAgICAgICAgICAgIG1hdGNoZXIgPSBSZWdleE1hdGNoZXIudmFsaWRhdGVBbmRDb25zdHJ1Y3QoZmlsdGVyVmFsdWUpO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRmlsdGVyT3JFcnJvck1lc3NhZ2UuZnJvbUVycm9yKFxuICAgICAgICAgICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgICAgICAgICBgY2Fubm90IHBhcnNlIHJlZ2V4ICgke3RoaXMuZmllbGROYW1lKCl9KTsgY2hlY2sgeW91ciBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIGZvciB5b3VyIHF1ZXJ5YCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hdGNoZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEl0J3MgbGlrZWx5IHRoaXMgY2FuIG5vdyBuZXZlciBiZSByZWFjaGVkLlxuICAgICAgICAgICAgLy8gUmV0YWluZWQgZm9yIHNhZmV0eSwgZm9yIG5vdy5cbiAgICAgICAgICAgIHJldHVybiBGaWx0ZXJPckVycm9yTWVzc2FnZS5mcm9tRXJyb3IobGluZSwgYGRvIG5vdCB1bmRlcnN0YW5kIHF1ZXJ5IGZpbHRlciAoJHt0aGlzLmZpZWxkTmFtZSgpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmFsbHksIHdlIGNhbiBjcmVhdGUgdGhlIEZpbHRlciwgdGhhdCB0YWtlcyBhIHRhc2tcbiAgICAgICAgLy8gYW5kIHRlc3RzIGlmIGl0IG1hdGNoZXMgdGhlIHN0cmluZyBmaWx0ZXJpbmcgcnVsZVxuICAgICAgICAvLyByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdC5cbiAgICAgICAgY29uc3QgbmVnYXRlID0gZmlsdGVyT3BlcmF0b3IubWF0Y2goL25vdC8pICE9PSBudWxsO1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBuZXcgRmlsdGVyKGxpbmUsIHRoaXMuZ2V0RmlsdGVyKG1hdGNoZXIsIG5lZ2F0ZSksIG5ldyBFeHBsYW5hdGlvbihsaW5lKSk7XG4gICAgICAgIHJldHVybiBGaWx0ZXJPckVycm9yTWVzc2FnZS5mcm9tRmlsdGVyKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZ2V4cCBwYXR0ZXJuIG1hdGNoaW5nIHRoZSBmaWVsZCdzIG5hbWUgYW5kIHBvc3NpYmxlIGFsaWFzZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZmllbGRQYXR0ZXJuKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkTmFtZVNpbmd1bGFyRXNjYXBlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWdleHAgcGF0dGVybiBtYXRjaGluZyBhbGwgcG9zc2libGUgZmlsdGVyIG9wZXJhdG9ycyBmb3IgdGhpcyBmaWVsZCxcbiAgICAgKiBzdWNoIGFzIFwiaW5jbHVkZXNcIiBvciBcImRvZXMgbm90IGluY2x1ZGVcIi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZmlsdGVyT3BlcmF0b3JQYXR0ZXJuKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnaW5jbHVkZXN8ZG9lcyBub3QgaW5jbHVkZXxyZWdleCBtYXRjaGVzfHJlZ2V4IGRvZXMgbm90IG1hdGNoJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeKD86JHt0aGlzLmZpZWxkUGF0dGVybigpfSkgKCR7dGhpcy5maWx0ZXJPcGVyYXRvclBhdHRlcm4oKX0pICguKilgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgZmllbGROYW1lKCk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZpZWxkJ3MgdmFsdWUsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgdmFsdWUgaXMgbnVsbFxuICAgICAqIEBwYXJhbSB0YXNrXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCB2YWx1ZSh0YXNrOiBUYXNrKTogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIGdldEZpbHRlcihtYXRjaGVyOiBJU3RyaW5nTWF0Y2hlciwgbmVnYXRlOiBib29sZWFuKTogRmlsdGVyRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gKHRhc2s6IFRhc2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlciEubWF0Y2hlcyh0aGlzLnZhbHVlKHRhc2spKTtcbiAgICAgICAgICAgIHJldHVybiBuZWdhdGUgPyAhbWF0Y2ggOiBtYXRjaDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Ygc29ydGluZywgZm9yIHRleHQgZmllbGRzIHdoZXJlIHNpbXBsZSBsb2NhbGUtYXdhcmUgc29ydGluZyBpcyB0aGVcbiAgICAgKiBkZXNpcmVkIGJlaGF2aW91ci5cbiAgICAgKlxuICAgICAqIEVhY2ggY2xhc3MgdGhhdCB3YW50cyB0byB1c2UgdGhpcyB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgc3VwcG9ydHNTb3J0aW5nKCkgdG8gcmV0dXJuIHRydWUsXG4gICAgICogdG8gdHVybiBvbiBzb3J0aW5nLlxuICAgICAqL1xuICAgIGNvbXBhcmF0b3IoKTogQ29tcGFyYXRvciB7XG4gICAgICAgIHJldHVybiAoYTogVGFzaywgYjogVGFzaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUoYSkubG9jYWxlQ29tcGFyZSh0aGlzLnZhbHVlKGIpLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZ3JvdXBpbmcsIGZvciB0ZXh0IGZpZWxkcyB3aGVyZSBzaW1wbGUgZ3JvdXBpbmcgYnkgZmllbGQgdmFsdWUgaXMgdGhlXG4gICAgICogZGVzaXJlZCBiZWhhdmlvdXIuXG4gICAgICpcbiAgICAgKiBFYWNoIGNsYXNzIHRoYXQgd2FudHMgdG8gdXNlIHRoaXMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHN1cHBvcnRzR3JvdXBpbmcoKSB0byByZXR1cm4gdHJ1ZSxcbiAgICAgKiB0byB0dXJuIG9uIGdyb3VwaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBncm91cGVyKCk6IEdyb3VwZXJGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiAodGFzazogVGFzaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLnZhbHVlKHRhc2spXTtcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgeyBUZXh0RmllbGQgfSBmcm9tICcuL1RleHRGaWVsZCc7XG5cbi8qKiBTdXBwb3J0IHRoZSAncGF0aCcgc2VhcmNoIGluc3RydWN0aW9uLlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhbHNvIHNlYXJjaGVzIHRoZSBmaWxlIGV4dGVuc2lvbixcbiAqIHNvICdwYXRoIGluY2x1ZGVzIC5tZCcgd2lsbCB0eXBpY2FsbHkgbWF0Y2ggYWxsIHRhc2tzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhGaWVsZCBleHRlbmRzIFRleHRGaWVsZCB7XG4gICAgcHVibGljIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3BhdGgnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZpbGUgcGF0aCBpbmNsdWRpbmcgZmlsZSBleHRlbnNpb24sIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgcGF0aCBpcyBudWxsXG4gICAgICogQHBhcmFtIHRhc2tcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgcHVibGljIHZhbHVlKHRhc2s6IFRhc2spOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGFzay5wYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbXBhcmF0b3IgfSBmcm9tICcuLi9Tb3J0ZXInO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vRmllbGQnO1xuaW1wb3J0IHsgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlcic7XG5cbi8qKlxuICogU3VwcG9ydCAndXJnZW5jeScgc29ydGluZy5cbiAqXG4gKiBOb3RlOiBTZWFyY2hpbmcgYnkgdXJnZW5jeSBpcyBub3QgeWV0IGltcGxlbWVudGVkLlxuICovXG5leHBvcnQgY2xhc3MgVXJnZW5jeUZpZWxkIGV4dGVuZHMgRmllbGQge1xuICAgIGNhbkNyZWF0ZUZpbHRlckZvckxpbmUoX2xpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY3JlYXRlRmlsdGVyT3JFcnJvck1lc3NhZ2UobGluZTogc3RyaW5nKTogRmlsdGVyT3JFcnJvck1lc3NhZ2Uge1xuICAgICAgICByZXR1cm4gRmlsdGVyT3JFcnJvck1lc3NhZ2UuZnJvbUVycm9yKGxpbmUsICdGaWx0ZXJpbmcgYnkgdXJnZW5jeSBpcyBub3QgeWV0IHN1cHBvcnRlZCcpO1xuICAgIH1cblxuICAgIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3VyZ2VuY3knO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBmaWx0ZXJSZWdFeHAoKTogUmVnRXhwIHwgbnVsbCB7XG4gICAgICAgIHRocm93IEVycm9yKGBmaWx0ZXJSZWdFeHAoKSB1bmltcGxlbWVudGVkIGZvciAke3RoaXMuZmllbGROYW1lKCl9YCk7XG4gICAgfVxuXG4gICAgc3VwcG9ydHNTb3J0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcGFyYXRvcigpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgcmV0dXJuIChhOiBUYXNrLCBiOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAvLyBIaWdoZXIgdXJnZW5jeSBzaG91bGQgYmUgc29ydGVkIGVhcmxpZXIuXG4gICAgICAgICAgICByZXR1cm4gYi51cmdlbmN5IC0gYS51cmdlbmN5O1xuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi9UYXNrJztcbmltcG9ydCB0eXBlIHsgQ29tcGFyYXRvciB9IGZyb20gJy4vU29ydGVyJztcbmltcG9ydCB0eXBlIHsgU29ydGVyIH0gZnJvbSAnLi9Tb3J0ZXInO1xuaW1wb3J0IHsgU3RhdHVzRmllbGQgfSBmcm9tICcuL0ZpbHRlci9TdGF0dXNGaWVsZCc7XG5pbXBvcnQgeyBEdWVEYXRlRmllbGQgfSBmcm9tICcuL0ZpbHRlci9EdWVEYXRlRmllbGQnO1xuaW1wb3J0IHsgUHJpb3JpdHlGaWVsZCB9IGZyb20gJy4vRmlsdGVyL1ByaW9yaXR5RmllbGQnO1xuaW1wb3J0IHsgUGF0aEZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvUGF0aEZpZWxkJztcbmltcG9ydCB7IFVyZ2VuY3lGaWVsZCB9IGZyb20gJy4vRmlsdGVyL1VyZ2VuY3lGaWVsZCc7XG5cbmV4cG9ydCBjbGFzcyBTb3J0IHtcbiAgICBwdWJsaWMgc3RhdGljIGJ5KHNvcnRlcnM6IFNvcnRlcltdLCB0YXNrczogVGFza1tdKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRDb21wYXJhdG9yczogQ29tcGFyYXRvcltdID0gW1xuICAgICAgICAgICAgbmV3IFVyZ2VuY3lGaWVsZCgpLmNvbXBhcmF0b3IoKSxcbiAgICAgICAgICAgIG5ldyBTdGF0dXNGaWVsZCgpLmNvbXBhcmF0b3IoKSxcbiAgICAgICAgICAgIG5ldyBEdWVEYXRlRmllbGQoKS5jb21wYXJhdG9yKCksXG4gICAgICAgICAgICBuZXcgUHJpb3JpdHlGaWVsZCgpLmNvbXBhcmF0b3IoKSxcbiAgICAgICAgICAgIG5ldyBQYXRoRmllbGQoKS5jb21wYXJhdG9yKCksXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgdXNlckNvbXBhcmF0b3JzOiBDb21wYXJhdG9yW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNvcnRlciBvZiBzb3J0ZXJzKSB7XG4gICAgICAgICAgICB1c2VyQ29tcGFyYXRvcnMucHVzaChzb3J0ZXIuY29tcGFyYXRvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFza3Muc29ydChTb3J0Lm1ha2VDb21wb3NpdGVDb21wYXJhdG9yKFsuLi51c2VyQ29tcGFyYXRvcnMsIC4uLmRlZmF1bHRDb21wYXJhdG9yc10pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYWtlQ29tcG9zaXRlQ29tcGFyYXRvcihjb21wYXJhdG9yczogQ29tcGFyYXRvcltdKTogQ29tcGFyYXRvciB7XG4gICAgICAgIHJldHVybiAoYSwgYikgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb21wYXJhdG9yIG9mIGNvbXBhcmF0b3JzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyYXRvcihhLCBiKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi4vLi4vQ29uZmlnL1NldHRpbmdzJztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uLy4uL1Rhc2snO1xuaW1wb3J0IHR5cGUgeyBDb21wYXJhdG9yIH0gZnJvbSAnLi4vU29ydGVyJztcbmltcG9ydCB7IFRleHRGaWVsZCB9IGZyb20gJy4vVGV4dEZpZWxkJztcblxuLyoqXG4gKiBTdXBwb3J0IHRoZSAnZGVzY3JpcHRpb24nIHNlYXJjaCBpbnN0cnVjdGlvbi5cbiAqXG4gKiBOb3RlIHRoYXQgRGVzY3JpcHRpb25GaWVsZC52YWx1ZSgpIHJldHVybnMgdGhlIGRlc2NyaXB0aW9uXG4gKiB3aXRoIHRoZSBnbG9iYWwgZmlsdGVyIChpZiBhbnkpIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXNjcmlwdGlvbkZpZWxkIGV4dGVuZHMgVGV4dEZpZWxkIHtcbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnZGVzY3JpcHRpb24nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgdGFzaydzIGRlc2NyaXB0aW9uLCB3aXRoIGFueSBnbG9iYWwgdGFnIHJlbW92ZWRcbiAgICAgKlxuICAgICAqIFByb21vdGVkIHRvIHB1YmxpYywgdG8gZW5hYmxlIHRlc3RpbmcuXG4gICAgICogQHBhcmFtIHRhc2tcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgcHVibGljIHZhbHVlKHRhc2s6IFRhc2spOiBzdHJpbmcge1xuICAgICAgICAvLyBSZW1vdmUgZ2xvYmFsIGZpbHRlciBmcm9tIGRlc2NyaXB0aW9uIG1hdGNoIGlmIHByZXNlbnQuXG4gICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIG1hdGNoIG9ubHkgb24gdGhlIGNvbnRlbnQgb2YgdGhlIHRhc2ssIG5vdFxuICAgICAgICAvLyB0aGUgZ2xvYmFsIGZpbHRlci5cbiAgICAgICAgY29uc3QgZ2xvYmFsRmlsdGVyID0gZ2V0U2V0dGluZ3MoKS5nbG9iYWxGaWx0ZXI7XG4gICAgICAgIHJldHVybiB0YXNrLmRlc2NyaXB0aW9uLnJlcGxhY2UoZ2xvYmFsRmlsdGVyLCAnJykudHJpbSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGZ1bmN0aW9uIHRvIGNvbXBhcmUgdGhlIGRlc2NyaXB0aW9uIGJ5IGhvdyBpdCBpcyByZW5kZXJlZCBpbiBtYXJrZG93bi5cbiAgICAgKlxuICAgICAqIERvZXMgbm90IHVzZSB0aGUgTWFya2Rvd25SZW5kZXJlciwgYnV0IHRyaWVzIHRvIG1hdGNoIHJlZ2V4ZXMgaW5zdGVhZFxuICAgICAqIGluIG9yZGVyIHRvIGJlIHNpbXBsZXIsIGZhc3RlciwgYW5kIG5vdCBhc3luYy5cbiAgICAgKlxuICAgICAqIE9ubHkgc2VhcmNoZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkZXNjcmlwdGlvbi4gTWFya2Rvd24gbGF0ZXIgaW4gdGhlIHRhayBpcyB1bmNoYW5nZWQuXG4gICAgICovXG4gICAgcHVibGljIGNvbXBhcmF0b3IoKTogQ29tcGFyYXRvciB7XG4gICAgICAgIHJldHVybiAoYTogVGFzaywgYjogVGFzaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb25BID0gRGVzY3JpcHRpb25GaWVsZC5jbGVhbkRlc2NyaXB0aW9uKGEuZGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb25CID0gRGVzY3JpcHRpb25GaWVsZC5jbGVhbkRlc2NyaXB0aW9uKGIuZGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uQS5sb2NhbGVDb21wYXJlKGRlc2NyaXB0aW9uQiwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBgKmAsIGA9YCwgYW5kIGBbYCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlc2NyaXB0aW9uLlxuICAgICAqXG4gICAgICogV2lsbCByZW1vdmUgdGhlbSBvbmx5IGlmIHRoZXkgYXJlIGNsb3NpbmcuXG4gICAgICogUHJvcGVybHkgcmVhZHMgbGlua3MgW1tsaWtlIHRoaXN8b25lXV0gKG5vdGUgcGlwZSkuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjbGVhbkRlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBnbG9iYWxGaWx0ZXIgPSBnZXRTZXR0aW5ncygpLmdsb2JhbEZpbHRlcjtcbiAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yZXBsYWNlKGdsb2JhbEZpbHRlciwgJycpLnRyaW0oKTtcblxuICAgICAgICBjb25zdCBzdGFydHNXaXRoTGlua1JlZ2V4ID0gL15cXFtcXFs/KFteXFxdXSopXV0/LztcbiAgICAgICAgY29uc3QgbGlua1JlZ2V4TWF0Y2ggPSBkZXNjcmlwdGlvbi5tYXRjaChzdGFydHNXaXRoTGlua1JlZ2V4KTtcbiAgICAgICAgaWYgKGxpbmtSZWdleE1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBpbm5lckxpbmtUZXh0ID0gbGlua1JlZ2V4TWF0Y2hbMV07XG4gICAgICAgICAgICAvLyBGb3IgYSBsaW5rLCB3ZSBoYXZlIHRvIGNoZWNrIHdoZXRoZXIgaXQgaGFzIGFub3RoZXIgdmlzaWJsZSBuYW1lIHNldC5cbiAgICAgICAgICAgIC8vIEZvciBleGFtcGxlIGBbW3RoaXMgaXMgdGhlIGxpbmt8YnV0IHRoaXMgaXMgYWN0dWFsbHkgc2hvd25dXWAuXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9XG4gICAgICAgICAgICAgICAgaW5uZXJMaW5rVGV4dC5zdWJzdHJpbmcoaW5uZXJMaW5rVGV4dC5pbmRleE9mKCd8JykgKyAxKSArIGRlc2NyaXB0aW9uLnJlcGxhY2Uoc3RhcnRzV2l0aExpbmtSZWdleCwgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzY3JpcHRpb24gPSB0aGlzLnJlcGxhY2VGb3JtYXR0aW5nKGRlc2NyaXB0aW9uLCAvXlxcKlxcKihbXipdKylcXCpcXCovKTtcbiAgICAgICAgZGVzY3JpcHRpb24gPSB0aGlzLnJlcGxhY2VGb3JtYXR0aW5nKGRlc2NyaXB0aW9uLCAvXlxcKihbXipdKylcXCovKTtcbiAgICAgICAgZGVzY3JpcHRpb24gPSB0aGlzLnJlcGxhY2VGb3JtYXR0aW5nKGRlc2NyaXB0aW9uLCAvXj09KFtePV0rKT09Lyk7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gdGhpcy5yZXBsYWNlRm9ybWF0dGluZyhkZXNjcmlwdGlvbiwgL15fXyhbXl9dKylfXy8pO1xuICAgICAgICBkZXNjcmlwdGlvbiA9IHRoaXMucmVwbGFjZUZvcm1hdHRpbmcoZGVzY3JpcHRpb24sIC9eXyhbXl9dKylfLyk7XG5cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBzb21lIGZvcm1hdHRpbmcgZnJvbSB0ZXh0XG4gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uXG4gICAgICogQHBhcmFtIHJlZ0V4cCBBIHJlZ3VsYXIgZXhwcmVzc2lvbiAtIGFsbCBtYXRjaGluZyB0ZXh0IGlzIGRpc2NhcmRlZCBleGNlcHQgdGhlIGZpcnN0IGdyb3VwXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVwbGFjZUZvcm1hdHRpbmcoZGVzY3JpcHRpb246IHN0cmluZywgcmVnRXhwOiBSZWdFeHApIHtcbiAgICAgICAgY29uc3QgaXRhbGljQm9sZFJlZ2V4TWF0Y2ggPSBkZXNjcmlwdGlvbi5tYXRjaChyZWdFeHApO1xuICAgICAgICBpZiAoaXRhbGljQm9sZFJlZ2V4TWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVySXRhbGljQm9sZFRleHQgPSBpdGFsaWNCb2xkUmVnZXhNYXRjaFsxXTtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gaW5uZXJJdGFsaWNCb2xkVGV4dCArIGRlc2NyaXB0aW9uLnJlcGxhY2UocmVnRXhwLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IERhdGVGaWVsZCB9IGZyb20gJy4vRGF0ZUZpZWxkJztcblxuLyoqXG4gKiBTdXBwb3J0IHRoZSAnZG9uZScgc2VhcmNoIGluc3RydWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRG9uZURhdGVGaWVsZCBleHRlbmRzIERhdGVGaWVsZCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZG9uZVJlZ2V4cCA9IC9eZG9uZSAoYmVmb3JlfGFmdGVyfG9uKT8gPyguKikvO1xuXG4gICAgcHJvdGVjdGVkIGZpbHRlclJlZ0V4cCgpOiBSZWdFeHAge1xuICAgICAgICByZXR1cm4gRG9uZURhdGVGaWVsZC5kb25lUmVnZXhwO1xuICAgIH1cbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnZG9uZSc7XG4gICAgfVxuICAgIHB1YmxpYyBkYXRlKHRhc2s6IFRhc2spOiBNb21lbnQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRhc2suZG9uZURhdGU7XG4gICAgfVxuICAgIHByb3RlY3RlZCBmaWx0ZXJSZXN1bHRJZkZpZWxkTWlzc2luZygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBGaWx0ZXJJbnN0cnVjdGlvbnNCYXNlZEZpZWxkIH0gZnJvbSAnLi9GaWx0ZXJJbnN0cnVjdGlvbnNCYXNlZEZpZWxkJztcblxuLyoqXG4gKiBJbXBsZW1lbnRzICdleGNsdWRlIHN1Yi1pdGVtcycgZmlsdGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBFeGNsdWRlU3ViSXRlbXNGaWVsZCBleHRlbmRzIEZpbHRlckluc3RydWN0aW9uc0Jhc2VkRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuX2ZpbHRlcnMuYWRkKCdleGNsdWRlIHN1Yi1pdGVtcycsICh0YXNrKSA9PiB7XG4gICAgICAgICAgICBpZiAodGFzay5pbmRlbnRhdGlvbiA9PT0gJycpIHJldHVybiB0cnVlOyAvLyBubyBpbmRlbnRhdGlvbiwgbm90IGEgc3ViaXRlbVxuXG4gICAgICAgICAgICBjb25zdCBsYXN0QmxvY2txdW90ZU1hcmsgPSB0YXNrLmluZGVudGF0aW9uLmxhc3RJbmRleE9mKCc+Jyk7XG4gICAgICAgICAgICBpZiAobGFzdEJsb2NrcXVvdGVNYXJrID09PSAtMSkgcmV0dXJuIGZhbHNlOyAvLyBpbmRlbnRhdGlvbiBwcmVzZW50LCBub3QgaW4gYSBibG9ja3F1b3RlLCBzdWJpdGVtXG5cbiAgICAgICAgICAgIC8vIFVwIHRvIG9uZSBzcGFjZSBhbGxvd2VkIGFmdGVyIGxhc3QgPiBpbiBibG9ja3F1b3RlL2NhbGxvdXQsIG90aGVyd2lzZSBzdWJpdGVtXG4gICAgICAgICAgICByZXR1cm4gL14gPyQvLnRlc3QodGFzay5pbmRlbnRhdGlvbi5zbGljZShsYXN0QmxvY2txdW90ZU1hcmsgKyAxKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdleGNsdWRlJztcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgeyBUZXh0RmllbGQgfSBmcm9tICcuL1RleHRGaWVsZCc7XG5cbi8qKiBTdXBwb3J0IHRoZSAnaGVhZGluZycgc2VhcmNoIGluc3RydWN0aW9uLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEhlYWRpbmdGaWVsZCBleHRlbmRzIFRleHRGaWVsZCB7XG4gICAgcHVibGljIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2hlYWRpbmcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHByZWNlZGluZyBoZWFkaW5nLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGhlYWRpbmcgaXMgbnVsbFxuICAgICAqIEBwYXJhbSB0YXNrXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHB1YmxpYyB2YWx1ZSh0YXNrOiBUYXNrKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRhc2sucHJlY2VkaW5nSGVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFzay5wcmVjZWRpbmdIZWFkZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IERhdGVGaWVsZCB9IGZyb20gJy4vRGF0ZUZpZWxkJztcblxuLyoqXG4gKiBTdXBwb3J0IHRoZSAnc2NoZWR1bGVkJyBzZWFyY2ggaW5zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlZHVsZWREYXRlRmllbGQgZXh0ZW5kcyBEYXRlRmllbGQge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNjaGVkdWxlZFJlZ2V4cCA9IC9ec2NoZWR1bGVkIChiZWZvcmV8YWZ0ZXJ8b24pPyA/KC4qKS87XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB7XG4gICAgICAgIHJldHVybiBTY2hlZHVsZWREYXRlRmllbGQuc2NoZWR1bGVkUmVnZXhwO1xuICAgIH1cbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnc2NoZWR1bGVkJztcbiAgICB9XG4gICAgcHVibGljIGRhdGUodGFzazogVGFzayk6IE1vbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGFzay5zY2hlZHVsZWREYXRlO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVzdWx0SWZGaWVsZE1pc3NpbmcoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgeyBEYXRlRmllbGQgfSBmcm9tICcuL0RhdGVGaWVsZCc7XG5cbi8qKlxuICogU3VwcG9ydCB0aGUgJ3N0YXJ0cycgc2VhcmNoIGluc3RydWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU3RhcnREYXRlRmllbGQgZXh0ZW5kcyBEYXRlRmllbGQge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0YXJ0UmVnZXhwID0gL15zdGFydHMgKGJlZm9yZXxhZnRlcnxvbik/ID8oLiopLztcblxuICAgIHByb3RlY3RlZCBmaWx0ZXJSZWdFeHAoKTogUmVnRXhwIHtcbiAgICAgICAgcmV0dXJuIFN0YXJ0RGF0ZUZpZWxkLnN0YXJ0UmVnZXhwO1xuICAgIH1cbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnc3RhcnQnO1xuICAgIH1cbiAgICBwdWJsaWMgZGF0ZSh0YXNrOiBUYXNrKTogTW9tZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0YXNrLnN0YXJ0RGF0ZTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGZpbHRlclJlc3VsdElmRmllbGRNaXNzaW5nKCkge1xuICAgICAgICAvLyByZWZlcmVuY2U6IGh0dHBzOi8vb2JzaWRpYW4tdGFza3MtZ3JvdXAuZ2l0aHViLmlvL29ic2lkaWFuLXRhc2tzL3F1ZXJpZXMvZmlsdGVycy8jc3RhcnQtZGF0ZVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgeyBEYXRlUGFyc2VyIH0gZnJvbSAnLi4vRGF0ZVBhcnNlcic7XG5pbXBvcnQgeyBFeHBsYW5hdGlvbiB9IGZyb20gJy4uL0V4cGxhaW4vRXhwbGFuYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBDb21wYXJhdG9yIH0gZnJvbSAnLi4vU29ydGVyJztcbmltcG9ydCB7IGNvbXBhcmVCeURhdGUgfSBmcm9tICcuLi8uLi9saWIvRGF0ZVRvb2xzJztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9GaWVsZCc7XG5pbXBvcnQgeyBGaWx0ZXIsIEZpbHRlck9yRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9GaWx0ZXInO1xuaW1wb3J0IHsgRmlsdGVySW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9GaWx0ZXJJbnN0cnVjdGlvbnMnO1xuaW1wb3J0IHsgRGF0ZUZpZWxkIH0gZnJvbSAnLi9EYXRlRmllbGQnO1xuXG4vKipcbiAqIFN1cHBvcnQgdGhlICdoYXBwZW5zJyBzZWFyY2ggaW5zdHJ1Y3Rpb24sIHdoaWNoIHNlYXJjaGVzIGFsbCBvZlxuICogc3RhcnQsIHNjaGVkdWxlZCBhbmQgZHVlIGRhdGVzLlxuICovXG5leHBvcnQgY2xhc3MgSGFwcGVuc0RhdGVGaWVsZCBleHRlbmRzIEZpZWxkIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBoYXBwZW5zUmVnZXhwID0gL15oYXBwZW5zIChiZWZvcmV8YWZ0ZXJ8b24pPyA/KC4qKS87XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW5zdHJ1Y3Rpb25Gb3JGaWVsZFByZXNlbmNlID0gJ2hhcyBoYXBwZW5zIGRhdGUnO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGluc3RydWN0aW9uRm9yRmllbGRBYnNlbmNlID0gJ25vIGhhcHBlbnMgZGF0ZSc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWx0ZXJJbnN0cnVjdGlvbnM6IEZpbHRlckluc3RydWN0aW9ucztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZpbHRlckluc3RydWN0aW9ucyA9IG5ldyBGaWx0ZXJJbnN0cnVjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJJbnN0cnVjdGlvbnMuYWRkKEhhcHBlbnNEYXRlRmllbGQuaW5zdHJ1Y3Rpb25Gb3JGaWVsZFByZXNlbmNlLCAodGFzazogVGFzaykgPT5cbiAgICAgICAgICAgIHRoaXMuZGF0ZXModGFzaykuc29tZSgoZGF0ZSkgPT4gZGF0ZSAhPT0gbnVsbCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlsdGVySW5zdHJ1Y3Rpb25zLmFkZChcbiAgICAgICAgICAgIEhhcHBlbnNEYXRlRmllbGQuaW5zdHJ1Y3Rpb25Gb3JGaWVsZEFic2VuY2UsXG4gICAgICAgICAgICAodGFzazogVGFzaykgPT4gIXRoaXMuZGF0ZXModGFzaykuc29tZSgoZGF0ZSkgPT4gZGF0ZSAhPT0gbnVsbCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkNyZWF0ZUZpbHRlckZvckxpbmUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlckluc3RydWN0aW9ucy5jYW5DcmVhdGVGaWx0ZXJGb3JMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuY2FuQ3JlYXRlRmlsdGVyRm9yTGluZShsaW5lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRmlsdGVyT3JFcnJvck1lc3NhZ2UobGluZTogc3RyaW5nKTogRmlsdGVyT3JFcnJvck1lc3NhZ2Uge1xuICAgICAgICBjb25zdCBmaWx0ZXJSZXN1bHQgPSB0aGlzLmZpbHRlckluc3RydWN0aW9ucy5jcmVhdGVGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcbiAgICAgICAgaWYgKGZpbHRlclJlc3VsdC5maWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlclJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcblxuICAgICAgICBjb25zdCBoYXBwZW5zTWF0Y2ggPSBGaWVsZC5nZXRNYXRjaCh0aGlzLmZpbHRlclJlZ0V4cCgpLCBsaW5lKTtcbiAgICAgICAgaWYgKGhhcHBlbnNNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRGF0ZSA9IERhdGVQYXJzZXIucGFyc2VEYXRlKGhhcHBlbnNNYXRjaFsyXSk7XG4gICAgICAgICAgICBpZiAoIWZpbHRlckRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIGhhcHBlbnMgZGF0ZSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJGdW5jdGlvbjtcbiAgICAgICAgICAgICAgICBsZXQgcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgaWYgKGhhcHBlbnNNYXRjaFsxXSA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRnVuY3Rpb24gPSAodGFzazogVGFzaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZXModGFzaykuc29tZSgoZGF0ZSkgPT4gZGF0ZSAmJiBkYXRlLmlzQmVmb3JlKGZpbHRlckRhdGUpKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSAnICcgKyBoYXBwZW5zTWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYXBwZW5zTWF0Y2hbMV0gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRnVuY3Rpb24gPSAodGFzazogVGFzaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZXModGFzaykuc29tZSgoZGF0ZSkgPT4gZGF0ZSAmJiBkYXRlLmlzQWZ0ZXIoZmlsdGVyRGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSA9ICcgJyArIGhhcHBlbnNNYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGdW5jdGlvbiA9ICh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlcyh0YXNrKS5zb21lKChkYXRlKSA9PiBkYXRlICYmIGRhdGUuaXNTYW1lKGZpbHRlckRhdGUpKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSAnIG9uJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBEYXRlRmllbGQuZ2V0RXhwbGFuYXRpb25TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICdkdWUsIHN0YXJ0IG9yIHNjaGVkdWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRGF0ZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5maWx0ZXIgPSBuZXcgRmlsdGVyKGxpbmUsIGZpbHRlckZ1bmN0aW9uLCBuZXcgRXhwbGFuYXRpb24oZXhwbGFuYXRpb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvciA9ICdkbyBub3QgdW5kZXJzdGFuZCBxdWVyeSBmaWx0ZXIgKGhhcHBlbnMgZGF0ZSknO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBlYXJsaWVzdCBvZiB0aGUgZGF0ZXMgdXNlZCBieSAnaGFwcGVucycgaW4gdGhlIGdpdmVuIHRhc2ssIG9yIG51bGwgaWYgbm9uZSBzZXQuXG4gICAgICpcbiAgICAgKiBHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZSBlYXJsaWVzdCBkYXRlIGlzIGNvbnNpZGVyZWQgdG8gYmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHksXG4gICAgICogYXMgaXQgaXMgdGhlIGZpcnN0IHBvaW50IGF0IHdoaWNoIHRoZSB1c2VyIG1pZ2h0IHdpc2ggdG8gYWN0IG9uIHRoZSB0YXNrLlxuICAgICAqIEBwYXJhbSB0YXNrXG4gICAgICovXG4gICAgcHVibGljIGVhcmxpZXN0RGF0ZSh0YXNrOiBUYXNrKTogTW9tZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGhhcHBlbnNEYXRlcyA9IG5ldyBIYXBwZW5zRGF0ZUZpZWxkKCkuZGF0ZXModGFzayk7XG4gICAgICAgIGNvbnN0IHNvcnRlZEhhcHBlbnNEYXRlcyA9IGhhcHBlbnNEYXRlcy5zb3J0KGNvbXBhcmVCeURhdGUpO1xuICAgICAgICByZXR1cm4gc29ydGVkSGFwcGVuc0RhdGVzWzBdO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBmaWx0ZXJSZWdFeHAoKTogUmVnRXhwIHtcbiAgICAgICAgcmV0dXJuIEhhcHBlbnNEYXRlRmllbGQuaGFwcGVuc1JlZ2V4cDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHRhc2sncyBzdGFydCwgc2NoZWR1bGVkIGFuZCBkdWUgZGF0ZXMsIGFueSBvciBhbGwgb2Ygd2hpY2ggbWF5IGJlIG51bGwuXG4gICAgICovXG4gICAgcHVibGljIGRhdGVzKHRhc2s6IFRhc2spOiAoTW9tZW50IHwgbnVsbClbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5vZih0YXNrLnN0YXJ0RGF0ZSwgdGFzay5zY2hlZHVsZWREYXRlLCB0YXNrLmR1ZURhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdoYXBwZW5zJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3VwcG9ydHNTb3J0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHNvcnRzIG9uIHRoZSBlYXJsaWVzdCBvZiBzdGFydCwgc2NoZWR1bGVkIGFuZCBkdWUgZGF0ZXMuXG4gICAgICovXG4gICAgcHVibGljIGNvbXBhcmF0b3IoKTogQ29tcGFyYXRvciB7XG4gICAgICAgIHJldHVybiAoYTogVGFzaywgYjogVGFzaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVCeURhdGUodGhpcy5lYXJsaWVzdERhdGUoYSksIHRoaXMuZWFybGllc3REYXRlKGIpKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmlsdGVySW5zdHJ1Y3Rpb25zQmFzZWRGaWVsZCB9IGZyb20gJy4vRmlsdGVySW5zdHJ1Y3Rpb25zQmFzZWRGaWVsZCc7XG5cbmV4cG9ydCBjbGFzcyBSZWN1cnJpbmdGaWVsZCBleHRlbmRzIEZpbHRlckluc3RydWN0aW9uc0Jhc2VkRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9maWx0ZXJzLmFkZCgnaXMgcmVjdXJyaW5nJywgKHRhc2spID0+IHRhc2sucmVjdXJyZW5jZSAhPT0gbnVsbCk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMuYWRkKCdpcyBub3QgcmVjdXJyaW5nJywgKHRhc2spID0+IHRhc2sucmVjdXJyZW5jZSA9PT0gbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3JlY3VycmluZyc7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uLy4uL1Rhc2snO1xuaW1wb3J0IHR5cGUgeyBJU3RyaW5nTWF0Y2hlciB9IGZyb20gJy4uL01hdGNoZXJzL0lTdHJpbmdNYXRjaGVyJztcbmltcG9ydCB7IFRleHRGaWVsZCB9IGZyb20gJy4vVGV4dEZpZWxkJztcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb24gfSBmcm9tICcuL0ZpbHRlcic7XG5cbi8qKlxuICogTXVsdGlUZXh0RmllbGQgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB0byBoZWxwIGltcGxlbWVudFxuICogYWxsIHRoZSBmaWx0ZXIgaW5zdHJ1Y3Rpb25zIHRoYXQgYWN0IG9uIG11bHRpcGxlIHN0cmluZyB2YWx1ZXNcbiAqIHN1Y2ggYXMgdGhlIHRhZ3MuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNdWx0aVRleHRGaWVsZCBleHRlbmRzIFRleHRGaWVsZCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2luZ3VsYXIgZm9ybSBvZiB0aGUgZmllbGQncyBuYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBmaWVsZE5hbWVTaW5ndWxhcigpOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwbHVyYWwgZm9ybSBvZiB0aGUgZmllbGQncyBuYW1lLlxuICAgICAqIElmIG5vdCBvdmVycmlkZGVuLCByZXR1cm5zIHRoZSBzaW5ndWxhciBmb3JtIGFwcGVuZGVkIHdpdGggYW4gXCJzXCIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGZpZWxkTmFtZVBsdXJhbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZE5hbWVTaW5ndWxhcigpICsgJ3MnO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZmllbGROYW1lU2luZ3VsYXIoKX0vJHt0aGlzLmZpZWxkTmFtZVBsdXJhbCgpfWA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGZpZWxkUGF0dGVybigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5maWVsZE5hbWVTaW5ndWxhcigpfXwke3RoaXMuZmllbGROYW1lUGx1cmFsKCl9YDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyT3BlcmF0b3JQYXR0ZXJuKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtzdXBlci5maWx0ZXJPcGVyYXRvclBhdHRlcm4oKX18aW5jbHVkZXxkbyBub3QgaW5jbHVkZWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgbm90IG92ZXJyaWRkZW4sIHJldHVybnMgYSBjb21tYS1zZXBhcmF0ZWQgY29uY2F0ZW5hdGlvbiBvZiBhbGxcbiAgICAgKiB0aGUgdmFsdWVzIG9mIHRoaXMgZmllbGQgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGFyZSBub3QgdmFsdWVzXG4gICAgICogQHBhcmFtIHRhc2tcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgcHVibGljIHZhbHVlKHRhc2s6IFRhc2spOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXModGFzaykuam9pbignLCAnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiB2YWx1ZXMgb2YgdGhpcyBmaWVsZCwgb3IgYW4gZW1wdHkgYXJyYXlcbiAgICAgKiBpZiB0aGUgZmllbGQgaGFzIG5vIHZhbHVlc1xuICAgICAqIEBwYXJhbSB0YXNrXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCB2YWx1ZXModGFzazogVGFzayk6IHN0cmluZ1tdO1xuXG4gICAgcHJvdGVjdGVkIGdldEZpbHRlcihtYXRjaGVyOiBJU3RyaW5nTWF0Y2hlciwgbmVnYXRlOiBib29sZWFuKTogRmlsdGVyRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gKHRhc2s6IFRhc2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlciEubWF0Y2hlc0FueU9mKHRoaXMudmFsdWVzKHRhc2spKTtcbiAgICAgICAgICAgIHJldHVybiBuZWdhdGUgPyAhbWF0Y2ggOiBtYXRjaDtcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IENvbXBhcmF0b3IgfSBmcm9tICcuLi9Tb3J0ZXInO1xuaW1wb3J0IHsgU29ydGVyIH0gZnJvbSAnLi4vU29ydGVyJztcbmltcG9ydCB7IE11bHRpVGV4dEZpZWxkIH0gZnJvbSAnLi9NdWx0aVRleHRGaWVsZCc7XG5cbi8qKlxuICogU3VwcG9ydCB0aGUgJ3RhZycgYW5kICd0YWdzJyBzZWFyY2ggaW5zdHJ1Y3Rpb25zLlxuICpcbiAqIFRhZ3MgY2FuIGJlIHNlYXJjaGVkIGZvciB3aXRoIGFuZCB3aXRob3V0IHRoZSBoYXNoIHRhZyBhdCB0aGUgc3RhcnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWdzRmllbGQgZXh0ZW5kcyBNdWx0aVRleHRGaWVsZCB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBGaWx0ZXJpbmdcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgcHVibGljIGZpZWxkTmFtZVNpbmd1bGFyKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAndGFnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0YXNrLnRhZ3M7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTb3J0aW5nXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIHB1YmxpYyBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBPdmVycmlkZGVuIHRvIGFkZCBzdXBwb3J0IGZvciB0YWcgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxpbmVcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU29ydGVyRnJvbUxpbmUobGluZTogc3RyaW5nKTogU29ydGVyIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCh0aGlzLnNvcnRlclJlZ0V4cCgpKTtcbiAgICAgICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldmVyc2UgPSAhIW1hdGNoWzFdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUluc3RhbmNlID0gaXNOYU4oK21hdGNoWzJdKSA/IDEgOiArbWF0Y2hbMl07XG4gICAgICAgIGNvbnN0IGNvbXBhcmF0b3IgPSBUYWdzRmllbGQubWFrZUNvbXBhcmVCeVRhZ0NvbXBhcmF0b3IocHJvcGVydHlJbnN0YW5jZSk7XG4gICAgICAgIHJldHVybiBuZXcgU29ydGVyKHRoaXMuZmllbGROYW1lU2luZ3VsYXIoKSwgY29tcGFyYXRvciwgcmV2ZXJzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgd2lsbCBtYXRjaCBhIGNvcnJlY3RseS1mb3JtZWRcbiAgICAgKiBpbnN0cnVjdGlvbiBsaW5lIGZvciBzb3J0aW5nIFRhc2tzIGJ5IHRhZy5cbiAgICAgKlxuICAgICAqIGBtYXRjaFsxXWAgd2lsbCBiZSBlaXRoZXIgYHJldmVyc2VgIG9yIHVuZGVmaW5lZC5cbiAgICAgKiBgbWF0Y2hbMl1gIHdpbGwgYmUgZWl0aGVyIHRoZSB0YWcgbnVtYmVyIG9yIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc29ydGVyUmVnRXhwKCk6IFJlZ0V4cCB7XG4gICAgICAgIHJldHVybiAvXnNvcnQgYnkgdGFnKCByZXZlcnNlKT9bXFxzXSooXFxkKyk/LztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSAke0BsaW5rIENvbXBhcmF0b3J9IHRoYXQgc29ydHMgYnkgdGhlIGZpcnN0IHRhZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29tcGFyYXRvcigpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgcmV0dXJuIFRhZ3NGaWVsZC5tYWtlQ29tcGFyZUJ5VGFnQ29tcGFyYXRvcigxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYWtlQ29tcGFyZUJ5VGFnQ29tcGFyYXRvcihwcm9wZXJ0eUluc3RhbmNlOiBudW1iZXIpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgcmV0dXJuIChhOiBUYXNrLCBiOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAvLyBJZiBubyB0YWdzIHRoZW4gYXNzdW1lIHRoZXkgYXJlIGVxdWFsLlxuICAgICAgICAgICAgaWYgKGEudGFncy5sZW5ndGggPT09IDAgJiYgYi50YWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhLnRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gYSBpcyBsZXNzIHRoYW4gYlxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChiLnRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gYiBpcyBsZXNzIHRoYW4gYVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQXJyYXlzIHN0YXJ0IGF0IDAgYnV0IHRoZSB1c2VycyBzcGVjaWZ5IGEgdGFnIHN0YXJ0aW5nIGF0IDEuXG4gICAgICAgICAgICBjb25zdCB0YWdJbnN0YW5jZVRvU29ydEJ5ID0gcHJvcGVydHlJbnN0YW5jZSAtIDE7XG5cbiAgICAgICAgICAgIGlmIChhLnRhZ3MubGVuZ3RoIDwgcHJvcGVydHlJbnN0YW5jZSAmJiBiLnRhZ3MubGVuZ3RoID49IHByb3BlcnR5SW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYi50YWdzLmxlbmd0aCA8IHByb3BlcnR5SW5zdGFuY2UgJiYgYS50YWdzLmxlbmd0aCA+PSBwcm9wZXJ0eUluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhLnRhZ3MubGVuZ3RoIDwgcHJvcGVydHlJbnN0YW5jZSAmJiBiLnRhZ3MubGVuZ3RoIDwgcHJvcGVydHlJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWdBID0gYS50YWdzW3RhZ0luc3RhbmNlVG9Tb3J0QnldO1xuICAgICAgICAgICAgY29uc3QgdGFnQiA9IGIudGFnc1t0YWdJbnN0YW5jZVRvU29ydEJ5XTtcbiAgICAgICAgICAgIHJldHVybiB0YWdBLmxvY2FsZUNvbXBhcmUodGFnQiwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUgfSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB7IHBhcnNlIGFzIGJvb25QYXJzZSB9IGZyb20gJ2Jvb24tanMnO1xuaW1wb3J0IHR5cGUgeyBQb3N0Zml4RXhwcmVzc2lvbiB9IGZyb20gJ2Jvb24tanMnO1xuXG5pbXBvcnQgeyBwYXJzZUZpbHRlciB9IGZyb20gJy4uL0ZpbHRlclBhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IEV4cGxhbmF0aW9uIH0gZnJvbSAnLi4vRXhwbGFpbi9FeHBsYW5hdGlvbic7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vRmllbGQnO1xuaW1wb3J0IHsgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlcic7XG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuL0ZpbHRlcic7XG5cbi8qKlxuICogQm9vbGVhbkZpZWxkIGlzIGEgJ2NvbnRhaW5lcicgZmllbGQgdHlwZSB0aGF0IHBhcnNlcyBhIGhpZ2gtbGV2ZWwgZmlsdGVyaW5nIHF1ZXJ5IG9mXG4gKiB0aGUgZm9ybWF0IC0tXG4gKiAgICAoZmlsdGVyMSkgQU5EICgoZmlsdGVyMikgT1IgKGZpbHRlcjMpKVxuICogVGhlIGZpbHRlcnMgY2FuIGJlIG1peGVkIGFuZCBtYXRjaGVkIHdpdGggYW55IGJvb2xlYW4gb3BlcmF0b3JzIGFzIGxvbmcgYXMgdGhlIGluZGl2aWR1YWwgZmlsdGVycyBhcmVcbiAqIHdyYXBwZWQgaW4gZWl0aGVyIHBhcmFudGhlc2lzIG9yIHF1b3RlcyAtLSAoZmlsdGVyMSkgb3IgXCJmaWx0ZXIxXCIuXG4gKiBXaGF0IGhhcHBlbnMgaW50ZXJuYWxseSBpcyB0aGF0IHdoZW4gdGhlIGJvb2xlYW4gZmllbGQgaXMgYXNrZWQgdG8gY3JlYXRlIGEgZmlsdGVyLCBpdCBwYXJzZXMgdGhlIGJvb2xlYW5cbiAqIHF1ZXJ5IGludG8gYSBsb2dpY2FsIHBvc3RmaXggZXhwcmVzc2lvbiAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmV2ZXJzZV9Qb2xpc2hfbm90YXRpb24pLFxuICogd2l0aCB0aGUgaW5kaXZpZHVhbCBmaWx0ZXIgY29tcG9uZW50cyBhcyBcImlkZW50aWZpZXJcIiB0b2tlbnMuXG4gKiBUaGVzZSBpZGVudGlmaWVycyBoYXZlIGFuIGFzc29jaWF0ZWQgYWN0dWFsIEZpbHRlciAod2hpY2ggaXMgY2FjaGVkIGR1cmluZyB0aGUgcXVlcnkgcGFyc2luZykuXG4gKiBUaGUgcmV0dXJuZWQgRmlsdGVyIG9mIHRoZSB3aG9sZSBib29sZWFuIHF1ZXJ5IGlzIGV2ZW50dWFsbHkgYSBmdW5jdGlvbiB0aGF0IGZvciBlYWNoIFRhc2sgb2JqZWN0LFxuICogZXZhbHVhdGVzIHRoZSBjb21wbGV0ZSBwb3N0Zml4IGV4cHJlc3Npb24gYnkgZ29pbmcgdGhyb3VnaCB0aGUgaW5kaXZpZHVhbCBmaWx0ZXJzIGFuZCB0aGVuIHJlc29sdmluZ1xuICogdGhlIGV4cHJlc3Npb24gaW50byBhIHNpbmdsZSBib29sZWFuIGVudGl0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJvb2xlYW5GaWVsZCBleHRlbmRzIEZpZWxkIHtcbiAgICAvLyBGaXJzdCBwYXR0ZXJuIGluIHRoaXMgbWF0Y2hlcyBjb252ZW50aW9uYWwgKGZpbHRlcjEpIE9SIChmaWx0ZXIyKSBhbmQgc2ltaWxhclxuICAgIC8vIFNlY29uZCBwYXR0ZXJuIG1hdGNoZXMgKGZpbHRlcjEpIC0gdGhhdCBpcywgZW5zdXJlcyB0aGF0IGEgc2luZ2xlIGZpbHRlciBpcyB0cmVhdGVkIGFzIHZhbGlkXG4gICAgcHJpdmF0ZSByZWFkb25seSBiYXNpY0Jvb2xlYW5SZWdleHAgPSAvKC4qKEFORHxPUnxYT1J8Tk9UKVxccypbKFwiXS4qfFxcKC4rXFwpKS9nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3VwcG9ydGVkT3BlcmF0b3JzID0gWydBTkQnLCAnT1InLCAnWE9SJywgJ05PVCddO1xuICAgIHByaXZhdGUgc3ViRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXI+ID0ge307XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVnRXhwKCk6IFJlZ0V4cCB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2ljQm9vbGVhblJlZ2V4cDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRmlsdGVyT3JFcnJvck1lc3NhZ2UobGluZTogc3RyaW5nKTogRmlsdGVyT3JFcnJvck1lc3NhZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpbmUobGluZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4gcXVlcnknO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgYnVpbGRzIGEgRmlsdGVyIGZvciBhIGNvbXBsZXRlIGJvb2xlYW4gcXVlcnkgYnk6XG4gICAgICogMS4gUHJlcHJvY2Vzc2luZyB0aGUgZXhwcmVzc2lvbiBpbnRvIHNvbWV0aGluZyBvdXIgaGVscGVyIHBhY2thZ2UsIGJvb24tanMsIGtub3dzIGhvdyB0byBidWlsZCBhbiBleHByZXNzaW9uIGZvci5cbiAgICAgKiAyLiBDcmVhdGluZyBhIHBvc3RmaXggbG9naWNhbCBleHByZXNzaW9uIHVzaW5nIGJvb24tanMsIHdoaWNoIGhhcyAtXG4gICAgICogICAgYS4gSWRlbnRpZmllcnMgKGxlYXZlcyksIHdoaWNoIGFyZSByZWd1bGFyIEZpZWxkIGZpbHRlcnMgcmVwcmVzZW50ZWQgYXMgdGhlaXIgc3RyaW5nLlxuICAgICAqICAgIGIuIE9wZXJhdG9ycywgd2hpY2ggYXJlIGxvZ2ljYWwgb3BlcmF0b3JzIGJldHdlZW4gaWRlbnRpZmllcnMgb3IgYmV0d2VlbiBwYXJlbnRoZXNpcy5cbiAgICAgKiAzLiBDcmVhdGluZyB0aGUgZmlsdGVyIGZ1bmN0aW9ucyBmb3IgYWxsIHRoZSBJZGVudGlmaWVycyBpbiB0aGUgZXhwcmVzc2lvbiBhbmQgY2FjaGluZyB0aGVtIGluIHRoaXMuc3ViRmllbGRzLlxuICAgICAqIDQuIFJldHVybmluZyBhIGZpbmFsIGZ1bmN0aW9uIGZpbHRlciwgd2hpY2ggZm9yIGVhY2ggVGFzayBjYW4gcnVuIHRoZSBjb21wbGV0ZSBxdWVyeS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlTGluZShsaW5lOiBzdHJpbmcpOiBGaWx0ZXJPckVycm9yTWVzc2FnZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBGaWx0ZXJPckVycm9yTWVzc2FnZShsaW5lKTtcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSAnZW1wdHkgbGluZSc7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXByb2Nlc3NlZCA9IHRoaXMucHJlcHJvY2Vzc0V4cHJlc3Npb24obGluZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSAocHJlcHJvY2Vzc2VkKSBsaW5lIGludG8gYSBwb3N0Zml4IGxvZ2ljYWwgZXhwcmVzc2lvblxuICAgICAgICAgICAgY29uc3QgcG9zdGZpeEV4cHJlc3Npb24gPSBib29uUGFyc2UocHJlcHJvY2Vzc2VkKTtcbiAgICAgICAgICAgIC8vIENvbnN0cnVjdCBzdWItZmllbGQgbWFwLCBpLmUuIGhhdmUgc3ViRmllbGRzIGluY2x1ZGUgYSBmaWx0ZXIgZnVuY3Rpb24gZm9yIGV2ZXJ5XG4gICAgICAgICAgICAvLyBmaW5hbCB0b2tlbiBpbiB0aGUgZXhwcmVzc2lvblxuICAgICAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBwb3N0Zml4RXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi5uYW1lID09PSAnSURFTlRJRklFUicgJiYgdG9rZW4udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRva2VuLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWRlbnRpZmllciBpbiB0aGlzLnN1YkZpZWxkcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEZpZWxkID0gcGFyc2VGaWx0ZXIoaWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkRmllbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXJyb3IgPSBgY291bGRuJ3QgcGFyc2Ugc3ViLWV4cHJlc3Npb24gJyR7aWRlbnRpZmllcn0nYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZEZpZWxkLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gYGNvdWxkbid0IHBhcnNlIHN1Yi1leHByZXNzaW9uICcke2lkZW50aWZpZXJ9JzogJHtwYXJzZWRGaWVsZC5lcnJvcn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlZEZpZWxkLmZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3ViRmllbGRzW2lkZW50aWZpZXJdID0gcGFyc2VkRmllbGQuZmlsdGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbi5uYW1lID09PSAnT1BFUkFUT1InKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoaWxlIHdlJ3JlIGFscmVhZHkgaXRlcmF0aW5nIG92ZXIgdGhlIGV4cHJlc3Npb24sIGFsdGhvdWdoIHdlIGRvbid0IG5lZWQgdGhlIG9wZXJhdG9ycyBhdFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHN0YWdlIGJ1dCBvbmx5IGluIGZpbHRlclRhc2tXaXRoUGFyc2VkUXVlcnkgYmVsb3csIHdlJ3JlIHVzaW5nIHRoZSBvcHBvcnR1bml0eSB0byB2ZXJpZnlcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhleSBhcmUgdmFsaWQuIElmIHdlIHdvbid0LCB0aGVuIGFuIGludmFsaWQgb3BlcmF0b3Igd2lsbCBvbmx5IGJlIGRldGVjdGVkIHdoZW4gdGhlIHF1ZXJ5IGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIHJ1biBvbiBhIHRhc2tcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gJ2VtcHR5IG9wZXJhdG9yIGluIGJvb2xlYW4gcXVlcnknO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydGVkT3BlcmF0b3JzLmluY2x1ZGVzKHRva2VuLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gYHVua25vd24gYm9vbGVhbiBvcGVyYXRvciAnJHt0b2tlbi52YWx1ZX0nYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGZpbHRlciB3aXRoIGZpbHRlciBmdW5jdGlvbiB0aGF0IGNhbiBydW4gdGhlIGNvbXBsZXRlIHF1ZXJ5XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJGdW5jdGlvbiA9ICh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyVGFza1dpdGhQYXJzZWRRdWVyeSh0YXNrLCBwb3N0Zml4RXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0aGlzLmNvbnN0cnVjdEV4cGxhbmF0aW9uKHBvc3RmaXhFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIHJlc3VsdC5maWx0ZXIgPSBuZXcgRmlsdGVyKGxpbmUsIGZpbHRlckZ1bmN0aW9uLCBleHBsYW5hdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3IgdHlwZSc7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSBgbWFsZm9ybWVkIGJvb2xlYW4gcXVlcnkgLS0gJHttZXNzYWdlfSAoY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIGd1aWRlbGluZXMpYDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXByb2Nlc3NFeHByZXNzaW9uKGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8vIFByZXBhcmUgdGhlIHF1ZXJ5IHRvIGJlIHByb2Nlc3NlZCBieSBib29uLWpzLlxuICAgICAgICAvLyBCb29uIGRvZXNuJ3QgcHJvY2VzcyBleHByZXNzaW9uIHdpdGggc3BhY2VzIHVubGVzcyB0aGV5IGFyZSBzdXJyb3VuZGVkIGJ5IHF1b3Rlcywgc28gcmVwbGFjZVxuICAgICAgICAvLyAoZHVlIHRvZGF5KSBieSAoXCJkdWUgdG9kYXlcIikuXG4gICAgICAgIHJldHVybiBsaW5lLnJlcGxhY2UoL1xcKChbXigpXSspXFwpL2csICcoXCIkMVwiKScpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVGhpcyBydW4gYSBUYXNrIG9iamVjdCB0aHJvdWdoIGEgY29tcGxldGUgYm9vbGVhbiBleHByZXNzaW9uLlxuICAgICAqIEl0IGJhc2ljYWxseSByZXNvbHZlcyB0aGUgcG9zdGZpeCBleHByZXNzaW9uIHVudGlsIGl0IGlzIHJlZHVjZWQgaW50byBhIHNpbmdsZSBib29sZWFuIHZhbHVlLFxuICAgICAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBsZXRlIGV4cHJlc3Npb24uXG4gICAgICogU2VlIGhlcmUgaG93IGl0IHdvcmtzOiBodHRwOi8vd3d3LmJ0ZWNoc21hcnRjbGFzcy5jb20vZGF0YV9zdHJ1Y3R1cmVzL3Bvc3RmaXgtZXZhbHVhdGlvbi5odG1sXG4gICAgICogQW5vdGhlciByZWZlcmVuY2U6IGh0dHBzOi8vd3d3LnR1dG9yaWFsc3BvaW50LmNvbS9FdmFsdWF0ZS1Qb3N0Zml4LUV4cHJlc3Npb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbHRlclRhc2tXaXRoUGFyc2VkUXVlcnkodGFzazogVGFzaywgcG9zdGZpeEV4cHJlc3Npb246IFBvc3RmaXhFeHByZXNzaW9uKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRvQm9vbCA9IChzOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzID09PSAndHJ1ZSc7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRvU3RyaW5nID0gKGI6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBiID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYm9vbGVhblN0YWNrOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHBvc3RmaXhFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4ubmFtZSA9PT0gJ0lERU5USUZJRVInKSB7XG4gICAgICAgICAgICAgICAgLy8gSWRlbnRpZmllcnMgYXJlIHRoZSBzdWItZmllbGRzIG9mIHRoZSBleHByZXNzaW9uLCB0aGUgYWN0dWFsIGZpbHRlcnMsIGUuZy4gJ2Rlc2NyaXB0aW9uIGluY2x1ZGVzIGZvbycuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggaWRlbnRpZmllciB3ZSBjcmVhdGVkIGVhcmxpZXIgdGhlIGNvcnJlc3BvbmRpbmcgRmlsdGVyLCBzbyBub3cgd2UgY2FuIGp1c3QgZXZhbHVhdGUgdGhlIGdpdmVuXG4gICAgICAgICAgICAgICAgLy8gdGFzayBmb3IgZWFjaCBpZGVudGlmaWVyIHRoYXQgd2UgZmluZCBpbiB0aGUgcG9zdGZpeCBleHByZXNzaW9uLlxuICAgICAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PSBudWxsKSB0aHJvdyBFcnJvcignbnVsbCB0b2tlbiB2YWx1ZScpOyAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5zdWJGaWVsZHNbdG9rZW4udmFsdWUudHJpbSgpXTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmaWx0ZXIuZmlsdGVyRnVuY3Rpb24odGFzayk7XG4gICAgICAgICAgICAgICAgYm9vbGVhblN0YWNrLnB1c2godG9TdHJpbmcocmVzdWx0KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuLm5hbWUgPT09ICdPUEVSQVRPUicpIHtcbiAgICAgICAgICAgICAgICAvLyBUbyBldmFsdWF0ZSBhbiBvcGVyYXRvciB3ZSBuZWVkIHRvIHBvcCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGl0ZW1zIGZyb20gdGhlIGJvb2xlYW4gc3RhY2ssXG4gICAgICAgICAgICAgICAgLy8gZG8gdGhlIGxvZ2ljYWwgZXZhbHVhdGlvbiBhbmQgcHVzaCBiYWNrIHRoZSByZXN1bHRcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4udmFsdWUgPT09ICdOT1QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZzEgPSB0b0Jvb2woYm9vbGVhblN0YWNrLnBvcCgpKTtcbiAgICAgICAgICAgICAgICAgICAgYm9vbGVhblN0YWNrLnB1c2godG9TdHJpbmcoIWFyZzEpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnT1InKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZzEgPSB0b0Jvb2woYm9vbGVhblN0YWNrLnBvcCgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJnMiA9IHRvQm9vbChib29sZWFuU3RhY2sucG9wKCkpO1xuICAgICAgICAgICAgICAgICAgICBib29sZWFuU3RhY2sucHVzaCh0b1N0cmluZyhhcmcxIHx8IGFyZzIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnQU5EJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmcxID0gdG9Cb29sKGJvb2xlYW5TdGFjay5wb3AoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZzIgPSB0b0Jvb2woYm9vbGVhblN0YWNrLnBvcCgpKTtcbiAgICAgICAgICAgICAgICAgICAgYm9vbGVhblN0YWNrLnB1c2godG9TdHJpbmcoYXJnMSAmJiBhcmcyKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ1hPUicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJnMSA9IHRvQm9vbChib29sZWFuU3RhY2sucG9wKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmcyID0gdG9Cb29sKGJvb2xlYW5TdGFjay5wb3AoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJvb2xlYW5TdGFjay5wdXNoKHRvU3RyaW5nKChhcmcxICYmICFhcmcyKSB8fCAoIWFyZzEgJiYgYXJnMikpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVW5zdXBwb3J0ZWQgb3BlcmF0b3I6ICcgKyB0b2tlbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVW5zdXBwb3J0ZWQgdG9rZW4gdHlwZTogJyArIHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFdmVudHVhbGx5IHRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gZm9yIHRoaXMgVGFzayBpcyB0aGUgb25seSBpdGVtIGxlZnQgaW4gdGhlIGJvb2xlYW4gc3RhY2tcbiAgICAgICAgcmV0dXJuIHRvQm9vbChib29sZWFuU3RhY2tbMF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhbiB7QGxpbmsgRXhwbGFuYXRpb259IHJlcHJlc2VudGluZyB0aGUgY29tcGxldGUgQm9vbGVhbiBpbnN0cnVjdGlvbiBjdXJyZW50bHkgYmVpbmcgYW5hbHlzZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zdGZpeEV4cHJlc3Npb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnN0cnVjdEV4cGxhbmF0aW9uKHBvc3RmaXhFeHByZXNzaW9uOiBQb3N0Zml4RXhwcmVzc2lvbik6IEV4cGxhbmF0aW9uIHtcbiAgICAgICAgLy8gRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBjb2RlLCBzZWUgdGhlIEpTZG9jIGFuZCBjb21tZW50cyBvZiBmaWx0ZXJUYXNrV2l0aFBhcnNlZFF1ZXJ5KClcbiAgICAgICAgY29uc3QgZXhwbGFuYXRpb25TdGFjazogRXhwbGFuYXRpb25bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHBvc3RmaXhFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4ubmFtZSA9PT0gJ0lERU5USUZJRVInKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlID09IG51bGwpIHRocm93IEVycm9yKCdudWxsIHRva2VuIHZhbHVlJyk7IC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLnN1YkZpZWxkc1t0b2tlbi52YWx1ZS50cmltKCldO1xuICAgICAgICAgICAgICAgIGV4cGxhbmF0aW9uU3RhY2sucHVzaChmaWx0ZXIuZXhwbGFuYXRpb24pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbi5uYW1lID09PSAnT1BFUkFUT1InKSB7XG4gICAgICAgICAgICAgICAgLy8gVG8gZXZhbHVhdGUgYW4gb3BlcmF0b3Igd2UgbmVlZCB0byBwb3AgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBpdGVtcyBmcm9tIHRoZSBib29sZWFuIHN0YWNrLFxuICAgICAgICAgICAgICAgIC8vIGRvIHRoZSBsb2dpY2FsIGV2YWx1YXRpb24gYW5kIHB1c2ggYmFjayB0aGUgcmVzdWx0XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlID09PSAnTk9UJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmcxID0gZXhwbGFuYXRpb25TdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwbGFuYXRpb25TdGFjay5wdXNoKEV4cGxhbmF0aW9uLmJvb2xlYW5Ob3QoW2FyZzEhXSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4udmFsdWUgPT09ICdPUicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJnMiA9IGV4cGxhbmF0aW9uU3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZzEgPSBleHBsYW5hdGlvblN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBleHBsYW5hdGlvblN0YWNrLnB1c2goRXhwbGFuYXRpb24uYm9vbGVhbk9yKFthcmcxISwgYXJnMiFdKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ0FORCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJnMiA9IGV4cGxhbmF0aW9uU3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZzEgPSBleHBsYW5hdGlvblN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBleHBsYW5hdGlvblN0YWNrLnB1c2goRXhwbGFuYXRpb24uYm9vbGVhbkFuZChbYXJnMSEsIGFyZzIhXSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4udmFsdWUgPT09ICdYT1InKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZzIgPSBleHBsYW5hdGlvblN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmcxID0gZXhwbGFuYXRpb25TdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwbGFuYXRpb25TdGFjay5wdXNoKEV4cGxhbmF0aW9uLmJvb2xlYW5Yb3IoW2FyZzEhLCBhcmcyIV0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVW5zdXBwb3J0ZWQgb3BlcmF0b3I6ICcgKyB0b2tlbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVW5zdXBwb3J0ZWQgdG9rZW4gdHlwZTogJyArIHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFdmVudHVhbGx5IHRoZSBFeHBsYW5hdGlvbiBpcyB0aGUgb25seSBpdGVtIGxlZnQgaW4gdGhlIGJvb2xlYW4gc3RhY2tcbiAgICAgICAgcmV0dXJuIGV4cGxhbmF0aW9uU3RhY2tbMF07XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uLy4uL1Rhc2snO1xuaW1wb3J0IHsgVGV4dEZpZWxkIH0gZnJvbSAnLi9UZXh0RmllbGQnO1xuXG4vKiogU3VwcG9ydCB0aGUgJ2ZpbGVuYW1lJyBzZWFyY2ggaW5zdHJ1Y3Rpb24uXG4gKlxuICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFsc28gc2VhcmNoZXMgdGhlIGZpbGUgZXh0ZW5zaW9uLFxuICogc28gJ2ZpbGVuYW1lIGluY2x1ZGVzIC5tZCcgd2lsbCB0eXBpY2FsbHkgbWF0Y2ggYWxsIHRhc2tzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVuYW1lRmllbGQgZXh0ZW5kcyBUZXh0RmllbGQge1xuICAgIHB1YmxpYyBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdmaWxlbmFtZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIGluY2x1ZGluZyBmaWxlIGV4dGVuc2lvbiwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSB0YXNrIGRvZXMgbm90IGhhdmUgYSBmaWxlbmFtZVxuICAgICAqIEBwYXJhbSB0YXNrXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHB1YmxpYyB2YWx1ZSh0YXNrOiBUYXNrKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSB0YXNrLmZpbGVuYW1lO1xuICAgICAgICBpZiAoZmlsZW5hbWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZW5hbWUgKyAnLm1kJztcbiAgICB9XG5cbiAgICBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tICcuLi8uLi9UYXNrJztcbmltcG9ydCB7IFRleHRGaWVsZCB9IGZyb20gJy4vVGV4dEZpZWxkJztcblxuLyoqXG4gKiBBIHtAbGluayBGaWVsZH0gaW1wbGVtZW50YXRpb24gZm9yIHNlYXJjaGluZyBzdGF0dXMubmFtZVxuICovXG5leHBvcnQgY2xhc3MgU3RhdHVzTmFtZUZpZWxkIGV4dGVuZHMgVGV4dEZpZWxkIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnc3RhdHVzLm5hbWUnO1xuICAgIH1cblxuICAgIHZhbHVlKHRhc2s6IFRhc2spOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGFzay5zdGF0dXMubmFtZTtcbiAgICB9XG5cbiAgICBzdXBwb3J0c1NvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0c0dyb3VwaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IEdyb3VwZXJGdW5jdGlvbiB9IGZyb20gJy4uL0dyb3VwZXInO1xuaW1wb3J0IHsgU3RhdHVzVHlwZSB9IGZyb20gJy4uLy4uL1N0YXR1c0NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBDb21wYXJhdG9yIH0gZnJvbSAnLi4vU29ydGVyJztcbmltcG9ydCB7IEV4cGxhbmF0aW9uIH0gZnJvbSAnLi4vRXhwbGFpbi9FeHBsYW5hdGlvbic7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vRmllbGQnO1xuaW1wb3J0IHsgRmlsdGVyLCBGaWx0ZXJPckVycm9yTWVzc2FnZSB9IGZyb20gJy4vRmlsdGVyJztcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb24gfSBmcm9tICcuL0ZpbHRlcic7XG5cbi8qKlxuICogQSAke0BsaW5rIEZpZWxkfSBpbXBsZW1lbnRhdGlvbiBmb3Igc2VhcmNoaW5nIHN0YXR1cy50eXBlXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGF0dXNUeXBlRmllbGQgZXh0ZW5kcyBGaWVsZCB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBGaWx0ZXJpbmdcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHB1YmxpYyBjYW5DcmVhdGVGaWx0ZXJGb3JMaW5lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBVc2UgYSByZWxheGVkIHJlZ2V4cCwganVzdCBjaGVja2luZyBmaWVsZCBuYW1lIGFuZCBub3QgdGhlIGNvbnRlbnRzLFxuICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBwYXJzZSB0aGUgbGluZSBsYXRlciBhbmQgZ2l2ZSBtZWFuaW5nZnVsIGVycm9ycyBpZiB1c2VyIHVzZXMgaW52YWxpZCB2YWx1ZXMuXG4gICAgICAgIGNvbnN0IHJlbGF4ZWRSZWdFeHAgPSBuZXcgUmVnRXhwKGBeKD86JHt0aGlzLmZpZWxkTmFtZVNpbmd1bGFyRXNjYXBlZCgpfSlgKTtcbiAgICAgICAgcmV0dXJuIEZpZWxkLmxpbmVNYXRjaGVzRmlsdGVyKHJlbGF4ZWRSZWdFeHAsIGxpbmUpO1xuICAgIH1cblxuICAgIGNyZWF0ZUZpbHRlck9yRXJyb3JNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBGaWVsZC5nZXRNYXRjaCh0aGlzLmZpbHRlclJlZ0V4cCgpLCBsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGdldCBoZXJlLCBiZWNhdXNlIGNhbkNyZWF0ZUZpbHRlckZvckxpbmUoKSB1c2VzIGEgbW9yZSByZWxheGVkIHJlZ2V4cC5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhlbHBNZXNzYWdlKGxpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW18sIGZpbHRlck9wZXJhdG9yLCBzdGF0dXNUeXBlQXNTdHJpbmddID0gbWF0Y2g7XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzVHlwZUVsZW1lbnQgPSBTdGF0dXNUeXBlW3N0YXR1c1R5cGVBc1N0cmluZy50b1VwcGVyQ2FzZSgpIGFzIGtleW9mIHR5cGVvZiBTdGF0dXNUeXBlXTtcbiAgICAgICAgaWYgKCFzdGF0dXNUeXBlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVscE1lc3NhZ2UobGluZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmlsdGVyRnVuY3Rpb246IEZpbHRlckZ1bmN0aW9uO1xuXG4gICAgICAgIHN3aXRjaCAoZmlsdGVyT3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgJ2lzJzpcbiAgICAgICAgICAgICAgICBmaWx0ZXJGdW5jdGlvbiA9ICh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLnN0YXR1cy50eXBlID09PSBzdGF0dXNUeXBlRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaXMgbm90JzpcbiAgICAgICAgICAgICAgICBmaWx0ZXJGdW5jdGlvbiA9ICh0YXNrOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLnN0YXR1cy50eXBlICE9PSBzdGF0dXNUeXBlRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oZWxwTWVzc2FnZShsaW5lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBGaWx0ZXJPckVycm9yTWVzc2FnZS5mcm9tRmlsdGVyKG5ldyBGaWx0ZXIobGluZSwgZmlsdGVyRnVuY3Rpb24sIG5ldyBFeHBsYW5hdGlvbihsaW5lKSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBmaWx0ZXJSZWdFeHAoKTogUmVnRXhwIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeKD86JHt0aGlzLmZpZWxkTmFtZVNpbmd1bGFyRXNjYXBlZCgpfSkgKGlzfGlzIG5vdCkgKFteIF0rKSRgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhlbHBNZXNzYWdlKGxpbmU6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHtcbiAgICAgICAgY29uc3QgYWxsb3dlZFR5cGVzID0gT2JqZWN0LnZhbHVlcyhTdGF0dXNUeXBlKVxuICAgICAgICAgICAgLmZpbHRlcigodCkgPT4gdCAhPT0gU3RhdHVzVHlwZS5FTVBUWSlcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBJbnZhbGlkICR7dGhpcy5maWVsZE5hbWVTaW5ndWxhcigpfSBpbnN0cnVjdGlvbjogJyR7bGluZX0nLlxuICAgIEFsbG93ZWQgb3B0aW9uczogJ2lzJyBhbmQgJ2lzIG5vdCcgKHdpdGhvdXQgcXVvdGVzKS5cbiAgICBBbGxvd2VkIHZhbHVlczogICR7YWxsb3dlZFR5cGVzfVxuICAgICAgICAgICAgICAgICAgICAgTm90ZTogdmFsdWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gJ2luX3Byb2dyZXNzJyB3b3JrcyB0b28sIGZvciBleGFtcGxlLlxuICAgIEV4YW1wbGU6ICAgICAgICAgJHt0aGlzLmZpZWxkTmFtZVNpbmd1bGFyKCl9IGlzIG5vdCBOT05fVEFTS2A7XG4gICAgICAgIHJldHVybiBGaWx0ZXJPckVycm9yTWVzc2FnZS5mcm9tRXJyb3IobGluZSwgbWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3N0YXR1cy50eXBlJztcbiAgICB9XG5cbiAgICB2YWx1ZSh0YXNrOiBUYXNrKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRhc2suc3RhdHVzLnR5cGU7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTb3J0aW5nXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIHN1cHBvcnRzU29ydGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29tcGFyYXRvcigpOiBDb21wYXJhdG9yIHtcbiAgICAgICAgcmV0dXJuIChhOiBUYXNrLCBiOiBUYXNrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXlBID0gU3RhdHVzVHlwZUZpZWxkLmdyb3VwTmFtZShhKTtcbiAgICAgICAgICAgIGNvbnN0IGtleUIgPSBTdGF0dXNUeXBlRmllbGQuZ3JvdXBOYW1lKGIpO1xuICAgICAgICAgICAgcmV0dXJuIGtleUEubG9jYWxlQ29tcGFyZShrZXlCLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEdyb3VwaW5nXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIHB1YmxpYyBzdXBwb3J0c0dyb3VwaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ3JvdXBlcigpOiBHcm91cGVyRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gKHRhc2s6IFRhc2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbU3RhdHVzVHlwZUZpZWxkLmdyb3VwTmFtZSh0YXNrKV07XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBOYW1lKHRhc2s6IFRhc2spIHtcbiAgICAgICAgbGV0IHByZWZpeDogc3RyaW5nO1xuICAgICAgICAvLyBBZGQgYSBudW1lcmljIHByZWZpeCB0byBzb3J0IGluIHRvIGEgbWVhbmluZ2Z1bCBvcmRlciBmb3IgdXNlcnNcbiAgICAgICAgc3dpdGNoICh0YXNrLnN0YXR1cy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFN0YXR1c1R5cGUuSU5fUFJPR1JFU1M6XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gJzEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdGF0dXNUeXBlLlRPRE86XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gJzInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdGF0dXNUeXBlLkRPTkU6XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gJzMnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdGF0dXNUeXBlLkNBTkNFTExFRDpcbiAgICAgICAgICAgICAgICBwcmVmaXggPSAnNCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN0YXR1c1R5cGUuTk9OX1RBU0s6XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gJzUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdGF0dXNUeXBlLkVNUFRZOlxuICAgICAgICAgICAgICAgIHByZWZpeCA9ICc2JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlZml4ICsgJyAnICsgdGFzay5zdGF0dXMudHlwZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vLi4vVGFzayc7XG5pbXBvcnQgeyBUZXh0RmllbGQgfSBmcm9tICcuL1RleHRGaWVsZCc7XG5cbmV4cG9ydCBjbGFzcyBSZWN1cnJlbmNlRmllbGQgZXh0ZW5kcyBUZXh0RmllbGQge1xuICAgIGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3JlY3VycmVuY2UnO1xuICAgIH1cblxuICAgIHZhbHVlKHRhc2s6IFRhc2spOiBzdHJpbmcge1xuICAgICAgICBpZiAodGFzay5yZWN1cnJlbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFzay5yZWN1cnJlbmNlIS50b1RleHQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBEZXNjcmlwdGlvbkZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvRGVzY3JpcHRpb25GaWVsZCc7XG5pbXBvcnQgeyBEb25lRGF0ZUZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvRG9uZURhdGVGaWVsZCc7XG5pbXBvcnQgeyBEdWVEYXRlRmllbGQgfSBmcm9tICcuL0ZpbHRlci9EdWVEYXRlRmllbGQnO1xuaW1wb3J0IHsgRXhjbHVkZVN1Ykl0ZW1zRmllbGQgfSBmcm9tICcuL0ZpbHRlci9FeGNsdWRlU3ViSXRlbXNGaWVsZCc7XG5pbXBvcnQgeyBIZWFkaW5nRmllbGQgfSBmcm9tICcuL0ZpbHRlci9IZWFkaW5nRmllbGQnO1xuaW1wb3J0IHsgUGF0aEZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvUGF0aEZpZWxkJztcbmltcG9ydCB7IFByaW9yaXR5RmllbGQgfSBmcm9tICcuL0ZpbHRlci9Qcmlvcml0eUZpZWxkJztcbmltcG9ydCB7IFNjaGVkdWxlZERhdGVGaWVsZCB9IGZyb20gJy4vRmlsdGVyL1NjaGVkdWxlZERhdGVGaWVsZCc7XG5pbXBvcnQgeyBTdGFydERhdGVGaWVsZCB9IGZyb20gJy4vRmlsdGVyL1N0YXJ0RGF0ZUZpZWxkJztcbmltcG9ydCB7IEhhcHBlbnNEYXRlRmllbGQgfSBmcm9tICcuL0ZpbHRlci9IYXBwZW5zRGF0ZUZpZWxkJztcbmltcG9ydCB7IFJlY3VycmluZ0ZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvUmVjdXJyaW5nRmllbGQnO1xuaW1wb3J0IHsgU3RhdHVzRmllbGQgfSBmcm9tICcuL0ZpbHRlci9TdGF0dXNGaWVsZCc7XG5pbXBvcnQgeyBUYWdzRmllbGQgfSBmcm9tICcuL0ZpbHRlci9UYWdzRmllbGQnO1xuaW1wb3J0IHsgQm9vbGVhbkZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvQm9vbGVhbkZpZWxkJztcbmltcG9ydCB7IEZpbGVuYW1lRmllbGQgfSBmcm9tICcuL0ZpbHRlci9GaWxlbmFtZUZpZWxkJztcbmltcG9ydCB7IFVyZ2VuY3lGaWVsZCB9IGZyb20gJy4vRmlsdGVyL1VyZ2VuY3lGaWVsZCc7XG5pbXBvcnQgeyBTdGF0dXNOYW1lRmllbGQgfSBmcm9tICcuL0ZpbHRlci9TdGF0dXNOYW1lRmllbGQnO1xuaW1wb3J0IHsgU3RhdHVzVHlwZUZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvU3RhdHVzVHlwZUZpZWxkJztcblxuaW1wb3J0IHsgUmVjdXJyZW5jZUZpZWxkIH0gZnJvbSAnLi9GaWx0ZXIvUmVjdXJyZW5jZUZpZWxkJztcbmltcG9ydCB0eXBlIHsgRmlsdGVyT3JFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0ZpbHRlci9GaWx0ZXInO1xuaW1wb3J0IHR5cGUgeyBTb3J0ZXIgfSBmcm9tICcuL1NvcnRlcic7XG5pbXBvcnQgdHlwZSB7IEdyb3VwZXIgfSBmcm9tICcuL0dyb3VwZXInO1xuXG5jb25zdCBmaWVsZENyZWF0b3JzID0gW1xuICAgICgpID0+IG5ldyBTdGF0dXNOYW1lRmllbGQoKSwgLy8gc3RhdHVzLm5hbWUgaXMgYmVmb3JlIHN0YXR1cywgdG8gYXZvaWQgYW1iaWd1aXR5XG4gICAgKCkgPT4gbmV3IFN0YXR1c1R5cGVGaWVsZCgpLCAvLyBzdGF0dXMudHlwZSBpcyBiZWZvcmUgc3RhdHVzLCB0byBhdm9pZCBhbWJpZ3VpdHlcbiAgICAoKSA9PiBuZXcgU3RhdHVzRmllbGQoKSxcbiAgICAoKSA9PiBuZXcgUmVjdXJyaW5nRmllbGQoKSxcbiAgICAoKSA9PiBuZXcgUHJpb3JpdHlGaWVsZCgpLFxuICAgICgpID0+IG5ldyBIYXBwZW5zRGF0ZUZpZWxkKCksXG4gICAgKCkgPT4gbmV3IFN0YXJ0RGF0ZUZpZWxkKCksXG4gICAgKCkgPT4gbmV3IFNjaGVkdWxlZERhdGVGaWVsZCgpLFxuICAgICgpID0+IG5ldyBEdWVEYXRlRmllbGQoKSxcbiAgICAoKSA9PiBuZXcgRG9uZURhdGVGaWVsZCgpLFxuICAgICgpID0+IG5ldyBQYXRoRmllbGQoKSxcbiAgICAoKSA9PiBuZXcgRGVzY3JpcHRpb25GaWVsZCgpLFxuICAgICgpID0+IG5ldyBUYWdzRmllbGQoKSxcbiAgICAoKSA9PiBuZXcgSGVhZGluZ0ZpZWxkKCksXG4gICAgKCkgPT4gbmV3IEV4Y2x1ZGVTdWJJdGVtc0ZpZWxkKCksXG4gICAgKCkgPT4gbmV3IEJvb2xlYW5GaWVsZCgpLFxuICAgICgpID0+IG5ldyBGaWxlbmFtZUZpZWxkKCksXG4gICAgKCkgPT4gbmV3IFVyZ2VuY3lGaWVsZCgpLFxuICAgICgpID0+IG5ldyBSZWN1cnJlbmNlRmllbGQoKSxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZpbHRlcihmaWx0ZXJTdHJpbmc6IHN0cmluZyk6IEZpbHRlck9yRXJyb3JNZXNzYWdlIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBjcmVhdG9yIG9mIGZpZWxkQ3JlYXRvcnMpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjcmVhdG9yKCk7XG4gICAgICAgIGlmIChmaWVsZC5jYW5DcmVhdGVGaWx0ZXJGb3JMaW5lKGZpbHRlclN0cmluZykpIHJldHVybiBmaWVsZC5jcmVhdGVGaWx0ZXJPckVycm9yTWVzc2FnZShmaWx0ZXJTdHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU29ydGVyKHNvcnRlclN0cmluZzogc3RyaW5nKTogU29ydGVyIHwgbnVsbCB7XG4gICAgLy8gTmV3IHN0eWxlIHBhcnNpbmcsIHVzaW5nIHNvcnRpbmcgd2hpY2ggaXMgZG9uZSBieSB0aGUgRmllbGQgY2xhc3Nlcy5cblxuICAgIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgd2hldGhlciBsaW5lIGJlZ2lucyB3aXRoICdzb3J0IGJ5J1xuICAgIGNvbnN0IHNvcnRCeVJlZ2V4cCA9IC9ec29ydCBieSAvO1xuICAgIGlmIChzb3J0ZXJTdHJpbmcubWF0Y2goc29ydEJ5UmVnZXhwKSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTZWUgaWYgYW55IG9mIHRoZSBmaWVsZHMgY2FuIHBhcnNlIHRoZSBsaW5lLlxuICAgIGZvciAoY29uc3QgY3JlYXRvciBvZiBmaWVsZENyZWF0b3JzKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY3JlYXRvcigpO1xuICAgICAgICBjb25zdCBzb3J0ZXIgPSBmaWVsZC5wYXJzZVNvcnRMaW5lKHNvcnRlclN0cmluZyk7XG4gICAgICAgIGlmIChzb3J0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3J0ZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUdyb3VwZXIobGluZTogc3RyaW5nKTogR3JvdXBlciB8IG51bGwge1xuICAgIC8vIE5ldyBzdHlsZSBwYXJzaW5nLCB1c2luZyBncm91cGluZyB3aGljaCBpcyBkb25lIGJ5IHRoZSBGaWVsZCBjbGFzc2VzLlxuXG4gICAgLy8gT3B0aW1pc2F0aW9uOiBDaGVjayB3aGV0aGVyIGxpbmUgYmVnaW5zIHdpdGggJ2dyb3VwIGJ5J1xuICAgIGNvbnN0IGdyb3VwQnlSZWdleHAgPSAvXmdyb3VwIGJ5IC87XG4gICAgaWYgKGxpbmUubWF0Y2goZ3JvdXBCeVJlZ2V4cCkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gU2VlIGlmIGFueSBvZiB0aGUgZmllbGRzIGNhbiBwYXJzZSB0aGUgbGluZS5cbiAgICBmb3IgKGNvbnN0IGNyZWF0b3Igb2YgZmllbGRDcmVhdG9ycykge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNyZWF0b3IoKTtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gZmllbGQuZmllbGROYW1lU2luZ3VsYXIoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IGBncm91cCBieSAke2ZpZWxkTmFtZX1gKSB7XG4gICAgICAgICAgICBpZiAoZmllbGQuc3VwcG9ydHNHcm91cGluZygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmNyZWF0ZUdyb3VwZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbiIsICIvKipcbiAqIEdyb3VwSGVhZGluZyBjb250YWlucyB0aGUgZGF0YSBuZWVkZWQgdG8gcmVuZGVyIG9uZSBoZWFkaW5nIGZvciBhIGdyb3VwIG9mIHRhc2tzXG4gKi9cbmV4cG9ydCBjbGFzcyBHcm91cEhlYWRpbmcge1xuICAgIC8qKlxuICAgICAqIEhvdyBuZXN0ZWQgdGhlIGhlYWRpbmcgaXMuXG4gICAgICogMCBpcyB0aGUgZmlyc3QgZ3JvdXAsIG1lYW5pbmcgdGhpcyBoZWFkaW5nIHdhcyBnZW5lcmF0ZWQgYnlcbiAgICAgKiB0aGUgZmlyc3QgJ2dyb3VwIGJ5JyBpbnN0cnVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbmVzdGluZ0xldmVsOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCB0byBiZSBkaXNwbGF5ZWQgZm9yIHRoZSBncm91cC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgR3JvdXBIZWFkaW5nIG9iamVjdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZXN0aW5nTGV2ZWwgLSBTZWUgdGhpcy5uZXN0aW5nTGV2ZWwgZm9yIGRldGFpbHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBmb3IgdGhlIGdyb3VwXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmVzdGluZ0xldmVsOiBudW1iZXIsIG5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLm5lc3RpbmdMZXZlbCA9IG5lc3RpbmdMZXZlbDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgR3JvdXBIZWFkaW5nIH0gZnJvbSAnLi9Hcm91cEhlYWRpbmcnO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzU3RvcmFnZSB9IGZyb20gJy4vSW50ZXJtZWRpYXRlVGFza0dyb3Vwcyc7XG5cbi8qXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBHcm91cC50c1xuICovXG5cbi8qKlxuICogRXhwbGFuYXRpb24gb2YgdGhlIGFsZ29yaXRobXMgdXNlZCBoZXJlLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgdGV4dCBpcyB0YWtlbiBmcm9tXG4gKiBodHRwczovL2Rpc2NvcmQuY29tL2NoYW5uZWxzLzY4NjA1MzcwODI2MTIyODU3Ny84NDAyODYyNjQ5NjQwMjIzMDIvOTU1MjQwODEyOTczODA5Njc0XG4gKlxuICogVGhlIFByb2JsZW1cbiAqID09PT09PT09PT09XG4gKlxuICogSW1hZ2luZSB0aGF0IHRoZSB1c2VyIGhhcyBzdXBwbGllZCAzICdncm91cCBieScgaW5zdHJ1Y3Rpb25zLCBhbmQgaW4gb3JkZXJcbiAqIHRvIHByZXNlbnQgdGhlIHJlc3VsdHMsIHdlIHNpbXBseSBjb25jYXRlbmF0ZSB0aGUgZ3JvdXAgbmFtZXMgdG9nZXRoZXJcbiAqIHdpdGggJz4nLlxuICpcbiAqIFNvIHRoZSBkaXNwbGF5IG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2U6XG4gKiAgICAgICMjIyMgMTAuMCA+IDIwMjItMDMtMjAgPiBTb21lIGhlYWRpbmcgbmFtZVxuICogICAgICAtIHRhc2sgMVxuICogICAgICAtIHRhc2sgMlxuICogICAgICAjIyMjIDEwLjAgPiAyMDIyLTAzLTIyID4gU29tZSBoZWFkaW5nIG5hbWVcbiAqICAgICAgLSB0YXNrIDdcbiAqICAgICAgLSB0YXNrIDlcbiAqXG4gKiBUaGUgaGVhZGluZ3MgZ2V0IHZlcnkgaGFyZCB0byByZWFkLCB2ZXJ5IHF1aWNrbHkuXG4gKlxuICogV2hhdCB3ZSB3YW50IGluc3RlYWQgaXM6XG4gKiAgICAgICMjIyMgMTAuMFxuICogICAgICAjIyMjIyAyMDIyLTAzLTIwXG4gKiAgICAgICMjIyMjIyBTb21lIGhlYWRpbmcgbmFtZVxuICogICAgICAtIHRhc2sgMVxuICogICAgICAtIHRhc2sgMlxuICogICAgICAjIyMjIyAyMDIyLTAzLTIyXG4gKiAgICAgICMjIyMjIyBTb21lIGhlYWRpbmcgbmFtZVxuICogICAgICAtIHRhc2sgN1xuICogICAgICAtIHRhc2sgOVxuICpcbiAqIEknbSBzdHJ1Z2dsaW5nIHRvIGdldCBteSBoZWFkIGFyb3VuZCBob3csIGluIFRTLCBJIGNhbiBzdG9yZSBzb21ldGhpbmcgbGlrZSBhIHRyZWUgc3RydWN0dXJlLFxuICogb2YgYXJiaXRyYXJ5IGRlcHRoIC0gdG8gcmVwcmVzZW50IHRoZSBncm91cGVkIHRhc2tzLlxuICpcbiAqIHBqZWJ5J3MgYW5zd2VyXG4gKiA9PT09PT09PT09PT09PVxuICpcbiAqIFVzZXIgcGplYnkgcmVwbGllZDpcbiAqIGh0dHBzOi8vZGlzY29yZC5jb20vY2hhbm5lbHMvNjg2MDUzNzA4MjYxMjI4NTc3Lzg0MDI4NjI2NDk2NDAyMjMwMi85NTU1Nzk1NjAwMzQ5ODM5NDZcbiAqXG4gKiBJZiBhbGwgeW91J3JlIGRvaW5nIGlzIGdlbmVyYXRpbmcgaGVhZGluZ3MsIHRoZSBzaW1wbGUgYWxnb3JpdGhtIHdvdWxkIGJlIHRvIHNvcnQgZXZlcnl0aGluZyBieSBhIG11bHRpLXZhbHVlIGtleSAtXG4gKiBpLmUuLCBbbGV2ZWwgMSwgbGV2ZWwgMiwgLi4uLCBpdGVtIHNvcnQga2V5XSAtLSB0aGVuIGl0ZXJhdGUgdGhlIHdob2xlIGxpc3QgYW5kIG91dHB1dCBhIGhlYWRpbmcgZm9yIGVhY2ggbGV2ZWxcbiAqIHdoZXJlIHRoZSB2YWx1ZSBjaGFuZ2VkLlxuICpcbiAqIGkuZS4sIHlvdSBzdGFydCB3aXRoIGEgW251bGwsIG51bGwsIG51bGwsIG51bGwuLi4uXSBcImxhc3Qgc2VlblwiIGFycmF5IGFuZCBjb21wYXJlIGl0IGl0ZW0gYnkgaXRlbSB0byB0aGUgY3VycmVudFxuICogaXRlbSdzIGRhdGEsIGFuZCBvdXRwdXQgYSBoZWFkaW5nIG9mIHRoZSBjb3JyZWN0IGxldmVsIGlmIHRoZXJlJ3MgYSBjaGFuZ2UsIHVwZGF0aW5nIHRoZSBpdGVtIGluIHlvdXJcbiAqIFwibGFzdCBzZWVuXCIgYXJyYXkuXG4gKlxuICogaS5lLiBpZiB0aGUgZmlyc3QgaXRlbSBpcyBkaWZmZXJlbnQsIG91dHB1dCBhbiBIMSBmb3IgdGhlIG5ldyB2YWx1ZSBhbmQgc2V0IHRoZSByZXN0IG9mIHRoZSBhcnJheSB0byBudWxsLlxuICogSWYgdGhlIHNlY29uZCBpdGVtIGlzIGFsc28gZGlmZmVyZW50LCBvdXRwdXQgYW4gSDIsIHNhdmUgdGhlIHZhbHVlLCBzZXQgdGhlIHJlc3QgdG8gbnVsbCwgYW5kIHNvIG9uLlxuICogQWZ0ZXIgYWxsIHRoZSBsZXZlbHMgYXJlIGNoZWNrZWQsIG91dHB1dCB0aGUgYWN0dWFsIGl0ZW0uXG4gKiBJZiB0aGVyZSBhcmUgbm8gY2hhbmdlcywgdGhlbiBiYXNpY2FsbHkgeW91J2xsIGp1c3QgYmUgb3V0cHV0dGluZyB0aGUgaXRlbS5cbiAqIE5vIHRyZWVzIG9yIGdyYXBocyBvciB3aGF0bm90IG5lZWRlZC5cbiAqXG4gKiBZb3UgY291bGQgYWxzbyBqdXN0IGtlZXAgdGhlIGxhc3QgaXRlbSBhbmQgc2V0IGEgZmxhZyBhcyBzb29uIGFzIHNvbWV0aGluZyBkb2Vzbid0IG1hdGNoLCBhbmQga2VlcCBvdXRwdXR0aW5nXG4gKiBoZWFkaW5ncyBhcyBzb29uIGFzIHRoZSBmbGFnIGlzIHNldC5cbiAqXG4gKiBXaGF0IHRoZSBjb2RlIGRvZXNcbiAqID09PT09PT09PT09PT09PT09PVxuICpcbiAqIFRoZSBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzIGNsYXNzIGJlbG93IGRvZXMgdGhlIGluaXRpYWwgZ3JvdXBpbmcgYW5kIHNvcnRpbmcuXG4gKlxuICogVGhlIEdyb3VwSGVhZGluZ3MgY2xhc3MgYmVsb3cgaW1wbGVtZW50cyBwamVieSdzIGhlYWRpbmcgZGV0ZWN0aW9uIGFsZ29yaXRobSwgYnV0IGluc3RlYWQgb2YgZG9pbmcgdGhlIHByaW50aW5nIGRpcmVjdGx5LFxuICogaXQgcmV0dXJucyB0aGUgY2FsY3VsYXRlZCBoZWFkaW5nIGxldmVscyBpbiBhbiBhcnJheSBvZiBHcm91cEhlYWRpbmcgb2JqZWN0cywgZm9yIGxhdGVyIHVzZSBpbiBRdWVyeVJlbmRlcmVyLnRzLlxuICovXG5cbi8qKlxuICogR3JvdXBIZWFkaW5ncyBjYWxjdWxhdGVzIHdoaWNoIGhlYWRpbmdzIG5lZWQgdG8gYmUgZGlzcGxheWVkLCBmb3JcbiAqIGEgZ2l2ZW4gZ3JvdXAgb2YgdGFza3MuXG4gKlxuICogU2VlIHRoZSBleHBsYW5hdGlvbiBpbiBHcm91cEhlYWRpbmdzLnRzIGZvciBob3cgaXQgd29ya3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBHcm91cEhlYWRpbmdzIHtcbiAgICBwcml2YXRlIGxhc3RIZWFkaW5nQXRMZXZlbCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihncm91cGVkVGFza3M6IEludGVybWVkaWF0ZVRhc2tHcm91cHNTdG9yYWdlKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0R3JvdXAgPSBncm91cGVkVGFza3Mua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgY29uc3QgZ3JvdXBDb3VudCA9IGZpcnN0R3JvdXAubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5sYXN0SGVhZGluZ0F0TGV2ZWwucHVzaCgnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIG1pbmltYWwgc2V0IG9mIGhlYWRpbmdzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZFxuICAgICAqIGJlZm9yZSB0aGUgdGFza3Mgd2l0aCB0aGUgZ2l2ZW4gZ3JvdXAgbmFtZXMuXG4gICAgICpcbiAgICAgKiBEYXRhIGZvciBlYWNoIHJlcXVpcmVkIGhlYWRpbmcgaXMgc3RvcmVkIGluIGEgR3JvdXBIZWFkaW5nIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lcyAwIG9yIG1vcmUgZ3JvdXAgbmFtZXMsIG9uZSBwZXIgJ2dyb3VwIGJ5JyBsaW5lXG4gICAgICovXG4gICAgZ2V0SGVhZGluZ3NGb3JUYXNrR3JvdXAoZ3JvdXBOYW1lczogc3RyaW5nW10pOiBHcm91cEhlYWRpbmdbXSB7XG4gICAgICAgIC8vIFNlZSAncGplYnkncyBhbnN3ZXInIGFib3ZlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzIGFsZ29yaXRobS5cbiAgICAgICAgY29uc3QgaGVhZGluZ3NGb3JHcm91cCA9IG5ldyBBcnJheTxHcm91cEhlYWRpbmc+KCk7XG4gICAgICAgIGZvciAobGV0IGxldmVsID0gMDsgbGV2ZWwgPCBncm91cE5hbWVzLmxlbmd0aDsgbGV2ZWwrKykge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBncm91cE5hbWVzW2xldmVsXTtcbiAgICAgICAgICAgIGlmIChncm91cCAhPSB0aGlzLmxhc3RIZWFkaW5nQXRMZXZlbFtsZXZlbF0pIHtcbiAgICAgICAgICAgICAgICBoZWFkaW5nc0Zvckdyb3VwLnB1c2gobmV3IEdyb3VwSGVhZGluZyhsZXZlbCwgZ3JvdXApKTtcbiAgICAgICAgICAgICAgICAvLyBSZXNldCBhbGwgdGhlIGxvd2VyIGhlYWRpbmcgbGV2ZWxzIHRvIHVuLXNlZW5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gbGV2ZWw7IGogPCBncm91cE5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEhlYWRpbmdBdExldmVsW2pdID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEhlYWRpbmdBdExldmVsW2xldmVsXSA9IGdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFkaW5nc0Zvckdyb3VwO1xuICAgIH1cbn1cbiIsICIvKipcbiAqIEEgbm9kZSBpbiB0aGUgZ3JvdXBpbmcgdHJlZS4gVGhlIG5vZGUgY29udGFpbnMgdGhlXG4gKiBsaXN0IG9mIHZhbHVlcyBtYXRjaGluZyB0aGUgcGF0aCBmcm9tIHRoZSByb290IHNvIGZhciwgYW5kIGl0cyBjaGlsZHJlblxuICogYXJlIHRoZSBmdXJ0aGVyIGdyb3VwaW5nIG9mIHRob3NlIHZhbHVlcy5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBHcm91cGluZ1RyZWVOb2RlPFQ+IHtcbiAgICBjaGlsZHJlbjogTWFwPHN0cmluZywgR3JvdXBpbmdUcmVlTm9kZTxUPj4gPSBuZXcgTWFwKCk7XG4gICAgdmFsdWVzOiBUW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHZhbHVlczogVFtdKSB7XG4gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZSB0cmVlIHRvIGdlbmVyYXRlIGFsbCB0aGUgcGF0aHMgdG8gdGhlIGxlYXZlcy5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBtYXAgZnJvbSBldmVyeSBsZWFmIHBhdGgsIHRvIHRoZSBsaXN0IG9mIHZhbHVlc1xuICAgICAqIG1hdGNoaW5nIHRoaXMgcGF0aC5cbiAgICAgKiBOT1RFOiBUaGUgbm9kZSBpdHNlbGYgZG9lc24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBwYXRocy5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZUFsbFBhdGhzKHBhdGhTb0Zhcjogc3RyaW5nW10gPSBbXSk6IE1hcDxzdHJpbmdbXSwgVFtdPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4uc2l6ZSA9PSAwKSB7XG4gICAgICAgICAgICAvLyBCYXNlIGNhc2U6IExlYWYgbm9kZS4gUG9wdWxhdGUgdGhlIHJlc3VsdHMgbWFwIHdpdGggdGhlIHBhdGggdG9cbiAgICAgICAgICAgIC8vIHRoaXMgbm9kZSwgYW5kIHRoZSB2YWx1ZXMgdGhhdCBtYXRjaCB0aGlzIHBhdGguXG4gICAgICAgICAgICByZXN1bHRNYXAuc2V0KFsuLi5wYXRoU29GYXJdLCB0aGlzLnZhbHVlcyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0TWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBbcHJvcGVydHksIGNoaWxkXSBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBwYXRoU29GYXIucHVzaChwcm9wZXJ0eSk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZFJlc3VsdCA9IGNoaWxkLmdlbmVyYXRlQWxsUGF0aHMocGF0aFNvRmFyKTtcbiAgICAgICAgICAgIGNoaWxkUmVzdWx0LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHJlc3VsdE1hcC5zZXQoa2V5LCB2YWx1ZSkpO1xuICAgICAgICAgICAgcGF0aFNvRmFyLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRNYXA7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uL1Rhc2snO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICcuL0dyb3VwJztcbmltcG9ydCB0eXBlIHsgR3JvdXBlciB9IGZyb20gJy4vR3JvdXBlcic7XG5pbXBvcnQgeyBHcm91cGluZ1RyZWVOb2RlIH0gZnJvbSAnLi9Hcm91cGluZ1RyZWVOb2RlJztcblxuLyoqXG4gKiBTdG9yYWdlIHVzZWQgZm9yIHRoZSBpbml0aWFsIGdyb3VwaW5nIHRvZ2V0aGVyIG9mIHRhc2tzLlxuICpcbiAqIFRoZSBrZXlzIG9mIHRoZSBtYXAgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZ3JvdXBzLlxuICogRm9yIGV4YW1wbGUsIG9uZSBzZXQgb2Yga2V5cyBtaWdodCBiZSBbJ0ZvbGRlciBOYW1lLycsICdGaWxlIE5hbWUnXVxuICogYW5kIHRoZSB2YWx1ZXMgd291bGQgYmUgYWxsIHRoZSBtYXRjaGluZyBUYXNrcyBmcm9tIHRoYXQgZmlsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEludGVybWVkaWF0ZVRhc2tHcm91cHNTdG9yYWdlIGV4dGVuZHMgTWFwPHN0cmluZ1tdLCBUYXNrW10+IHt9XG5cbi8qXG4gKiBBIHRyZWUgb2YgdGFza3Mgd2hlcmUgZXZlcnkgbGV2ZWwgaW4gdGhlIHRyZWUgY29ycmVzcG9uZHMgdG8gYSBncm91cGluZyBwcm9wZXJ0eS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZTpcbiAqICMgSGVhZGluZyAxXG4gKiAtIFsgXSBUYXNrIDFcbiAqICMgSGVhZGluZyAyXG4gKiAtIFsgXSBUYXNrIDJcbiAqIC0gW1hdIFRhc2sgM1xuICpcbiAqIEFuZCB3ZSBncm91cCBieSBoZWFkaW5nIHRoZW4gc3RhdHVzLCB0aGUgdHJlZSB3aWxsIGxvb2sgbGlrZTpcbiAqXG4gKiAgICAgICAgICAgICAgICAgICBSb290IFtUMSwgVDIsIFQzXVxuICogICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICBcXFxuICogICAgICAgICAgICAgIEhlYWRpbmcgMSBbVDFdICAgICBIZWFkaW5nIFtUMiwgVDNdXG4gKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgLyAgICAgICAgXFxcbiAqICAgICAgICAgICAgICAgVE9ETyBbVDFdICAgICBUT0RPIFtUMl0gICAgRG9uZSBbVDNdXG4gKlxuICogVGhlIG5pY2UgcHJvcGVydHkgb2YgdGhpcyB0cmVlIGlzIHRoYXQgZXZlcnkgcGF0aCBmcm9tIHRoZSByb290IHRvIGEgbGVhZiwgbWFwc1xuICogdG8gaG93IHRoZSB0YXNrcyB3aWxsIGJlIHJlbmRlcmVkLlxuICpcbiAqIE5PVEU6IFRoZSBzYW1lIHRhc2sgY2FuIGFwcGVhciBpbiBtdWx0aXBsZSBsZWFmIG5vZGVzLCBpZiBpdCBtYXRjaGVzIG11bHRpcGxlIHBhdGhzLlxuICovXG5jbGFzcyBUYXNrR3JvdXBpbmdUcmVlTm9kZSBleHRlbmRzIEdyb3VwaW5nVHJlZU5vZGU8VGFzaz4ge31cblxuLyoqXG4gKiBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzIGRvZXMgdGhlIGluaXRpYWwgZ3JvdXBpbmcgdG9nZXRoZXIgb2YgdGFza3MsXG4gKiBpbiBhbHBoYWJldGljYWwgb3JkZXIgYnkgZ3JvdXAgbmFtZXMuXG4gKlxuICogSXQgaXMgZXNzZW50aWFsbHkgYSB0aGluIHdyYXBwZXIgYXJvdW5kIE1hcCAtIHNlZSBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzU3RvcmFnZS5cbiAqXG4gKiBJdCBpcyBuYW1lZCBcIkludGVybWVkaWF0ZVwiIGJlY2F1c2UgaXRzIHJlc3VsdHMgYXJlIG9ubHkgdGVtcG9yYXJ5LlxuICogVGhleSB3aWxsIGJlIGRpc2NhcmRlZCBvbmNlIHRoZSBmaW5hbCBUYXNrR3JvdXBzIG9iamVjdCBpcyBjcmVhdGVkLlxuICpcbiAqIElkZWFsbHksIHRoaXMgY29kZSB3b3VsZCBiZSBzaW1wbGlmaWVkIGFuZCBtb3ZlZCBpbiB0byBUYXNrR3JvdXBzLlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJtZWRpYXRlVGFza0dyb3VwcyB7XG4gICAgcHVibGljIGdyb3VwcyA9IG5ldyBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzU3RvcmFnZSgpO1xuXG4gICAgLyoqXG4gICAgICogR3JvdXAgYSBsaXN0IG9mIHRhc2tzLCBhY2NvcmRpbmcgdG8gb25lIG9yIG1vcmUgdGFzayBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIGdyb3VwaW5ncyAwIG9yIG1vcmUgR3JvdXBpbmcgdmFsdWVzLCBvbmUgcGVyICdncm91cCBieScgbGluZVxuICAgICAqIEBwYXJhbSB0YXNrcyBUaGUgdGFza3MgdGhhdCBtYXRjaCB0aGUgdGFzayBibG9jaydzIFF1ZXJ5XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZ3JvdXBpbmdzOiBHcm91cGVyW10sIHRhc2tzOiBUYXNrW10pIHtcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMuYnVpbGRHcm91cGluZ1RyZWUoZ3JvdXBpbmdzLCB0YXNrcyk7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gdHJlZS5nZW5lcmF0ZUFsbFBhdGhzKCk7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gdGhpcy5nZXRTb3J0ZWRHcm91cHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgZ3JvdXBpbmcgdHJlZSB0aGF0IGdyb3VwcyB0aGUgcGFzc2VkIEB0YXNrcyBieSB0aGUgcGFzc2VkIEBncm91cGluZ3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZEdyb3VwaW5nVHJlZShncm91cGluZ3M6IEdyb3VwZXJbXSwgdGFza3M6IFRhc2tbXSk6IFRhc2tHcm91cGluZ1RyZWVOb2RlIHtcbiAgICAgICAgLy8gVGhlIHRyZWUgaXMgYnVpbGQgbGF5ZXIgYnkgbGF5ZXIsIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QuXG4gICAgICAgIC8vIEF0IGV2ZXJ5IGxldmVsLCB3ZSBpdGVyYXRlIG9uIHRoZSBub2RlcyBvZiB0aGF0IGxldmVsIHRvIGdlbmVyYXRlXG4gICAgICAgIC8vIHRoZSBuZXh0IG9uZSB1c2luZyB0aGUgbmV4dCBncm91cGluZy5cblxuICAgICAgICAvLyBUaGUgcm9vdCBvZiB0aGUgdHJlZSBjb250YWlucyBhbGwgdGhlIHRhc2tzLlxuICAgICAgICBjb25zdCByb290ID0gbmV3IFRhc2tHcm91cGluZ1RyZWVOb2RlKHRhc2tzKTtcblxuICAgICAgICBsZXQgY3VycmVudFRyZWVMZXZlbCA9IFtyb290XTtcbiAgICAgICAgZm9yIChjb25zdCBncm91cGluZyBvZiBncm91cGluZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRUcmVlTGV2ZWwgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudFRyZWVOb2RlIG9mIGN1cnJlbnRUcmVlTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgY3VycmVudFRyZWVOb2RlLnZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cE5hbWVzID0gR3JvdXAuZ2V0R3JvdXBOYW1lc0ZvclRhc2soZ3JvdXBpbmcsIHRhc2spO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwTmFtZSBvZiBncm91cE5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSBjdXJyZW50VHJlZU5vZGUuY2hpbGRyZW4uZ2V0KGdyb3VwTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gbmV3IFRhc2tHcm91cGluZ1RyZWVOb2RlKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJlZU5vZGUuY2hpbGRyZW4uc2V0KGdyb3VwTmFtZSwgY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUcmVlTGV2ZWwucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC52YWx1ZXMucHVzaCh0YXNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRUcmVlTGV2ZWwgPSBuZXh0VHJlZUxldmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTb3J0ZWRHcm91cHMoKSB7XG4gICAgICAgIC8vIGdyb3Vwcy5rZXlzKCkgd2lsbCBpbml0aWFsbHkgYmUgaW4gdGhlIG9yZGVyIHRoZSBlbnRyaWVzIHdlcmUgYWRkZWQsXG4gICAgICAgIC8vIHNvIGVmZmVjdGl2ZWx5IHJhbmRvbS5cbiAgICAgICAgLy8gUmV0dXJuIGEgZHVwbGljYXRlIG1hcCwgd2l0aCB0aGUga2V5cyAodGhhdCBpcywgZ3JvdXAgbmFtZXMpIHNvcnRlZCBpbiBhbHBoYWJldGljYWwgb3JkZXI6XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJtZWRpYXRlVGFza0dyb3Vwc1N0b3JhZ2UoWy4uLnRoaXMuZ3JvdXBzLmVudHJpZXMoKV0uc29ydCgpKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IEdyb3VwSGVhZGluZyB9IGZyb20gJy4vR3JvdXBIZWFkaW5nJztcblxuLyoqXG4gKiBUYXNrR3JvdXAgc3RvcmVzIGEgc2luZ2xlIGdyb3VwIG9mIHRhc2tzLCB0aGF0IGFsbCBzaGFyZSB0aGUgc2FtZSBncm91cCBuYW1lcy5cbiAqIFRhc2tHcm91cCBvYmplY3RzIGFyZSBzdG9yZWQgaW4gYSBUYXNrR3JvdXBzIG9iamVjdC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIHVzZXIgc3VwcGxpZWQgdGhlc2UgJ2dyb3VwIGJ5JyBsaW5lczpcbiAqICAgZ3JvdXAgYnkgZm9sZGVyXG4gKiAgIGdyb3VwIGJ5IGZpbGVuYW1lXG4gKiAgIGdyb3VwIGJ5IGhlYWRpbmdcbiAqIFRoZW4gdGhlIG5hbWVzIG9mIG9uZSBUYXNrR3JvdXAgbWlnaHQgYmUgdGhpczpcbiAqICAgU29tZS9Gb2xkZXIvSW4vVGhlL1ZhdWx0XG4gKiAgIEEgUGFydGljdWxhciBGaWxlIE5hbWVcbiAqICAgTXkgbG92ZWx5IGhlYWRpbmdcbiAqIEFuZCB0aGUgVGFza0dyb3VwIHdvdWxkIHN0b3JlIGFsbCB0aGUgdGFza3MgZnJvbSB0aGF0IGxvY2F0aW9uXG4gKiB0aGF0IG1hdGNoIHRoZSB0YXNrIGJsb2NrJ3MgZmlsdGVycywgaW4gdGhlIHRhc2sgYmxvY2sncyBzb3J0IG9yZGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXNrR3JvdXAge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lcyBvZiB0aGUgZ3JvdXAgcHJvcGVydGllcyBmb3IgdGhpcyBzZXQgb2YgdGFza3MsXG4gICAgICogaW4gdGhlIG9yZGVyIG9mIHRoZSAnZ3JvdXAgYnknIGxpbmVzIHRoZSB1c2VyIHNwZWNpZmllZFxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBncm91cHM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGhlYWRpbmdzIHRvIGJlIGRpc3BsYXllZCBpbiBmcm9udCBvZiB0aGlzIHNldCBvZiB0YXNrcyxcbiAgICAgKiB3aGVuIHJlbmRlcmluZyB0aGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEl0IG9ubHkgY29udGFpbnMgdGhlIG1pbmltYWwgc2V0IG9mIGhlYWRpbmdzIHJlcXVpcmVkIHRvIHNlcGFyYXRlXG4gICAgICogdGhpcyBncm91cCBvZiB0YXNrcyBmcm9tIHRoZSBwcmV2aW91cyBncm91cCBvZiB0YXNrcy5cbiAgICAgKlxuICAgICAqIElmIHRoZXJlIHdlcmUgbm8gJ2dyb3VwIGJ5JyBpbnN0cnVjdGlvbnMgaW4gdGhlIHRhc2tzIGNvZGUgYmxvY2ssXG4gICAgICogdGhpcyB3aWxsIGJlIGVtcHR5LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBncm91cEhlYWRpbmdzOiBHcm91cEhlYWRpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFsbCB0aGUgdGFza3MgdGhhdCBtYXRjaCB0aGUgdXNlcidzIGZpbHRlcnMgYW5kIHRoYXQgaGF2ZSB0aGVcbiAgICAgKiBncm91cCBuYW1lcyBleGFjdGx5IG1hdGNoaW5nIGdyb3VwcygpLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB0YXNrczogVGFza1tdO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IgZm9yIFRhc2tHcm91cFxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGdyb3VwcyAtIFNlZSB0aGlzLmdyb3VwcyBmb3IgZGV0YWlsc1xuICAgICAqIEBwYXJhbSB7R3JvdXBIZWFkaW5nW119IGdyb3VwSGVhZGluZ3MgLSBTZWUgdGhpcy5ncm91cEhlYWRpbmdzIGZvciBkZXRhaWxzXG4gICAgICogQHBhcmFtIHRhc2tzIHtUYXNrW119IC0gU2VlIHRoaXMudGFza3MgZm9yIGRldGFpbHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihncm91cHM6IHN0cmluZ1tdLCBncm91cEhlYWRpbmdzOiBHcm91cEhlYWRpbmdbXSwgdGFza3M6IFRhc2tbXSkge1xuICAgICAgICB0aGlzLmdyb3VwcyA9IGdyb3VwcztcbiAgICAgICAgdGhpcy5ncm91cEhlYWRpbmdzID0gZ3JvdXBIZWFkaW5ncztcbiAgICAgICAgdGhpcy50YXNrcyA9IHRhc2tzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbWFya2Rvd24tZm9ybWF0IHJlcHJlc2VudGF0aW9uIG9mIGFsbCB0aGUgdGFza3MgaW4gdGhpcyBncm91cC5cbiAgICAgKlxuICAgICAqIFVzZWZ1bCBmb3IgdGVzdGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdGFza3NBc1N0cmluZ09mTGluZXMoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG91dHB1dCA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy50YXNrcykge1xuICAgICAgICAgICAgb3V0cHV0ICs9IHRhc2sudG9GaWxlTGluZVN0cmluZygpICsgJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdGFzayBncm91cCwgaW5jbHVkaW5nIG5hbWVzXG4gICAgICogYW5kIGhlYWRpbmdzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIHVzZWQgaW4gc25hcHNob3QgdGVzdGluZywgc28gaWYgdGhlIGZvcm1hdCBpc1xuICAgICAqIGNoYW5nZWQsIHRoZSBzbmFwc2hvdHMgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQuXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBvdXRwdXQgPSAnXFxuJztcbiAgICAgICAgb3V0cHV0ICs9IGBHcm91cCBuYW1lczogWyR7dGhpcy5ncm91cHN9XVxcbmA7XG5cbiAgICAgICAgZm9yIChjb25zdCBoZWFkaW5nIG9mIHRoaXMuZ3JvdXBIZWFkaW5ncykge1xuICAgICAgICAgICAgLy8gVGhlc2UgaGVhZGluZ3MgbWltaWMgdGhlIGJlaGF2aW91ciBvZiBRdWVyeVJlbmRlcmVyLFxuICAgICAgICAgICAgLy8gd2hpY2ggdXNlcyAnaDQnLCAnaDUnIGFuZCAnaDYnIGZvciBuZXN0ZWQgZ3JvdXBzLlxuICAgICAgICAgICAgY29uc3QgaGVhZGluZ1ByZWZpeCA9ICcjJy5yZXBlYXQoNCArIGhlYWRpbmcubmVzdGluZ0xldmVsKTtcbiAgICAgICAgICAgIG91dHB1dCArPSBgJHtoZWFkaW5nUHJlZml4fSAke2hlYWRpbmcubmFtZX1cXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0ICs9IHRoaXMudGFza3NBc1N0cmluZ09mTGluZXMoKTtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSAnLi4vVGFzayc7XG5pbXBvcnQgdHlwZSB7IEdyb3VwZXIgfSBmcm9tICcuL0dyb3VwZXInO1xuaW1wb3J0IHsgR3JvdXBIZWFkaW5ncyB9IGZyb20gJy4vR3JvdXBIZWFkaW5ncyc7XG5pbXBvcnQgeyBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzIH0gZnJvbSAnLi9JbnRlcm1lZGlhdGVUYXNrR3JvdXBzJztcbmltcG9ydCB7IFRhc2tHcm91cCB9IGZyb20gJy4vVGFza0dyb3VwJztcblxuLyoqXG4gKiBUYXNrR3JvdXAgc3RvcmVzIGFsbCB0aGUgZ3JvdXBzIG9mIHRhc2tzIGdlbmVyYXRlZCBieSBhbnkgJ2dyb3VwIGJ5J1xuICogaW5zdHJ1Y3Rpb25zIGluIHRoZSB0YXNrIGJsb2NrLlxuICovXG5leHBvcnQgY2xhc3MgVGFza0dyb3VwcyB7XG4gICAgcHJpdmF0ZSBfZ3JvdXBzOiBUYXNrR3JvdXBbXSA9IG5ldyBBcnJheTxUYXNrR3JvdXA+KCk7XG4gICAgcHJpdmF0ZSBfdG90YWxUYXNrQ291bnQgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IgZm9yIFRhc2tHcm91cHNcbiAgICAgKiBAcGFyYW0ge0dyb3VwZXJbXX0gZ3JvdXBzIC0gMCBvciBtb3JlIEdyb3VwaW5nIHZhbHVlcyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgcGVyICdncm91cCBieScgbGluZSBpbiB0aGUgdGFzayBxdWVyeSBibG9ja1xuICAgICAqIEBwYXJhbSB7VGFza1tdfSB0YXNrcyAtIDAgbW9yZSBtb3JlIFRhc2sgb2JqZWN0cywgd2l0aCBhbGwgdGhlIHRhc2tzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcgdGhlIHF1ZXJ5LCBhbHJlYWR5IGluIHNvcnQgb3JkZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihncm91cHM6IEdyb3VwZXJbXSwgdGFza3M6IFRhc2tbXSkge1xuICAgICAgICAvLyBHcm91cGluZyBkb2Vzbid0IGNoYW5nZSB0aGUgbnVtYmVyIG9mIHRhc2tzLCBhbmQgYWxsIHRoZSB0YXNrc1xuICAgICAgICAvLyB3aWxsIGJlIHNob3duIGluIGF0IGxlYXN0IG9uZSBncm91cC5cbiAgICAgICAgdGhpcy5fdG90YWxUYXNrQ291bnQgPSB0YXNrcy5sZW5ndGg7XG5cbiAgICAgICAgY29uc3QgaW5pdGlhbEdyb3VwcyA9IG5ldyBJbnRlcm1lZGlhdGVUYXNrR3JvdXBzKGdyb3VwcywgdGFza3MpO1xuICAgICAgICB0aGlzLmFkZFRhc2tzKGluaXRpYWxHcm91cHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsbCB0aGUgdGFza3MgbWF0Y2hpbmcgdGhlIHF1ZXJ5LCBncm91cGVkIHRvZ2V0aGVyLCBhbmQgaW4gdGhlIG9yZGVyXG4gICAgICogdGhhdCB0aGV5IHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBncm91cHMoKTogVGFza0dyb3VwW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdGFza3MgbWF0Y2hpbmcgdGhlIHF1ZXJ5LlxuICAgICAqL1xuICAgIHB1YmxpYyB0b3RhbFRhc2tzQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b3RhbFRhc2tDb3VudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGFsbCB0aGUgdGFzayBncm91cHMuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyB1c2VkIGluIHNuYXBzaG90IHRlc3RpbmcsIHNvIGlmIHRoZSBmb3JtYXQgaXNcbiAgICAgKiBjaGFuZ2VkLCB0aGUgc25hcHNob3RzIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgdGFza0dyb3VwIG9mIHRoaXMuZ3JvdXBzKSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gdGFza0dyb3VwLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBvdXRwdXQgKz0gJ1xcbi0tLVxcbic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWxUYXNrc0NvdW50ID0gdGhpcy50b3RhbFRhc2tzQ291bnQoKTtcbiAgICAgICAgb3V0cHV0ICs9IGBcXG4ke3RvdGFsVGFza3NDb3VudH0gdGFza3NcXG5gO1xuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVGFza3MoaW5pdGlhbEdyb3VwczogSW50ZXJtZWRpYXRlVGFza0dyb3Vwcykge1xuICAgICAgICAvLyBHZXQgdGhlIGhlYWRpbmdzXG4gICAgICAgIGNvbnN0IGdyb3VwZXIgPSBuZXcgR3JvdXBIZWFkaW5ncyhpbml0aWFsR3JvdXBzLmdyb3Vwcyk7XG5cbiAgICAgICAgLy8gQnVpbGQgYSBjb250YWluZXIgb2YgYWxsIHRoZSBncm91cHNcbiAgICAgICAgZm9yIChjb25zdCBbZ3JvdXBzLCB0YXNrc10gb2YgaW5pdGlhbEdyb3Vwcy5ncm91cHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwSGVhZGluZ3MgPSBncm91cGVyLmdldEhlYWRpbmdzRm9yVGFza0dyb3VwKGdyb3Vwcyk7XG4gICAgICAgICAgICBjb25zdCB0YXNrR3JvdXAgPSBuZXcgVGFza0dyb3VwKGdyb3VwcywgZ3JvdXBIZWFkaW5ncywgdGFza3MpO1xuICAgICAgICAgICAgdGhpcy5hZGQodGFza0dyb3VwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkKHRhc2tHcm91cDogVGFza0dyb3VwKSB7XG4gICAgICAgIHRoaXMuX2dyb3Vwcy5wdXNoKHRhc2tHcm91cCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uL1Rhc2snO1xuaW1wb3J0IHsgUHJpb3JpdHkgfSBmcm9tICcuLi9UYXNrJztcbmltcG9ydCB7IFRhc2tHcm91cHMgfSBmcm9tICcuL1Rhc2tHcm91cHMnO1xuaW1wb3J0IHsgSGFwcGVuc0RhdGVGaWVsZCB9IGZyb20gJy4vRmlsdGVyL0hhcHBlbnNEYXRlRmllbGQnO1xuaW1wb3J0IHsgR3JvdXBlciB9IGZyb20gJy4vR3JvdXBlcic7XG5pbXBvcnQgdHlwZSB7IEdyb3VwZXJGdW5jdGlvbiwgR3JvdXBpbmdQcm9wZXJ0eSB9IGZyb20gJy4vR3JvdXBlcic7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlICdncm91cCBieScgaW5zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBHcm91cCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZ3JvdXBEYXRlRm9ybWF0ID0gJ1lZWVktTU0tREQgZGRkZCc7XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21Hcm91cGluZ1Byb3BlcnR5KHByb3BlcnR5OiBHcm91cGluZ1Byb3BlcnR5KTogR3JvdXBlciB7XG4gICAgICAgIHJldHVybiBuZXcgR3JvdXBlcihwcm9wZXJ0eSwgR3JvdXAuZ3JvdXBlckZvclByb3BlcnR5KHByb3BlcnR5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR3JvdXAgYSBsaXN0IG9mIHRhc2tzLCBhY2NvcmRpbmcgdG8gb25lIG9yIG1vcmUgdGFzayBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIGdyb3VwaW5nIDAgb3IgbW9yZSBHcm91cGluZyB2YWx1ZXMsIG9uZSBwZXIgJ2dyb3VwIGJ5JyBsaW5lXG4gICAgICogQHBhcmFtIHRhc2tzIFRoZSB0YXNrcyB0aGF0IG1hdGNoIHRoZSB0YXNrIGJsb2NrJ3MgUXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGJ5KGdyb3VwaW5nOiBHcm91cGVyW10sIHRhc2tzOiBUYXNrW10pOiBUYXNrR3JvdXBzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYXNrR3JvdXBzKGdyb3VwaW5nLCB0YXNrcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9mIGEgc2luZ2xlIHRhc2sgZm9yIHRoZSBwYXNzZWQgZ3JvdXBpbmcgcHJvcGVydHlcbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCBzdHJpbmcgd2lsbCBiZSByZW5kZXJlZCwgc28gYW55IHNwZWNpYWwgTWFya2Rvd24gY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cGluZ1xuICAgICAqIEBwYXJhbSB0YXNrXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRHcm91cE5hbWVzRm9yVGFzayhncm91cGluZzogR3JvdXBlciwgdGFzazogVGFzayk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwaW5nLmdyb3VwZXIodGFzayk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBncm91cGVyRm9yUHJvcGVydHkocHJvcGVydHk6IEdyb3VwaW5nUHJvcGVydHkpOiBHcm91cGVyRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gR3JvdXAuZ3JvdXBlcnNbcHJvcGVydHldO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdyb3VwZXJzOiBSZWNvcmQ8R3JvdXBpbmdQcm9wZXJ0eSwgR3JvdXBlckZ1bmN0aW9uPiA9IHtcbiAgICAgICAgYmFja2xpbms6IEdyb3VwLmdyb3VwQnlCYWNrbGluayxcbiAgICAgICAgZG9uZTogR3JvdXAuZ3JvdXBCeURvbmVEYXRlLFxuICAgICAgICBkdWU6IEdyb3VwLmdyb3VwQnlEdWVEYXRlLFxuICAgICAgICBmaWxlbmFtZTogR3JvdXAuZ3JvdXBCeUZpbGVOYW1lLFxuICAgICAgICBmb2xkZXI6IEdyb3VwLmdyb3VwQnlGb2xkZXIsXG4gICAgICAgIGhhcHBlbnM6IEdyb3VwLmdyb3VwQnlIYXBwZW5zRGF0ZSxcbiAgICAgICAgaGVhZGluZzogR3JvdXAuZ3JvdXBCeUhlYWRpbmcsXG4gICAgICAgIHBhdGg6IEdyb3VwLmdyb3VwQnlQYXRoLFxuICAgICAgICBwcmlvcml0eTogR3JvdXAuZ3JvdXBCeVByaW9yaXR5LFxuICAgICAgICByZWN1cnJlbmNlOiBHcm91cC5ncm91cEJ5UmVjdXJyZW5jZSxcbiAgICAgICAgcmVjdXJyaW5nOiBHcm91cC5ncm91cEJ5UmVjdXJyaW5nLFxuICAgICAgICByb290OiBHcm91cC5ncm91cEJ5Um9vdCxcbiAgICAgICAgc2NoZWR1bGVkOiBHcm91cC5ncm91cEJ5U2NoZWR1bGVkRGF0ZSxcbiAgICAgICAgc3RhcnQ6IEdyb3VwLmdyb3VwQnlTdGFydERhdGUsXG4gICAgICAgIHN0YXR1czogR3JvdXAuZ3JvdXBCeVN0YXR1cyxcbiAgICAgICAgdGFnczogR3JvdXAuZ3JvdXBCeVRhZ3MsXG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhdGljIGVzY2FwZU1hcmtkb3duQ2hhcmFjdGVycyhmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vd2lsc29ubWFyLmdpdGh1Yi5pby9tYXJrZG93bi10ZXh0LWZvci1naXRodWItZnJvbS1odG1sLyNzcGVjaWFsLWNoYXJhY3RlcnNcbiAgICAgICAgcmV0dXJuIGZpbGVuYW1lLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvXy9nLCAnXFxcXF8nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBncm91cEJ5UHJpb3JpdHkodGFzazogVGFzayk6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHByaW9yaXR5TmFtZSA9ICdFUlJPUic7XG4gICAgICAgIHN3aXRjaCAodGFzay5wcmlvcml0eSkge1xuICAgICAgICAgICAgY2FzZSBQcmlvcml0eS5IaWdoOlxuICAgICAgICAgICAgICAgIHByaW9yaXR5TmFtZSA9ICdIaWdoJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUHJpb3JpdHkuTWVkaXVtOlxuICAgICAgICAgICAgICAgIHByaW9yaXR5TmFtZSA9ICdNZWRpdW0nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQcmlvcml0eS5Ob25lOlxuICAgICAgICAgICAgICAgIHByaW9yaXR5TmFtZSA9ICdOb25lJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUHJpb3JpdHkuTG93OlxuICAgICAgICAgICAgICAgIHByaW9yaXR5TmFtZSA9ICdMb3cnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbYFByaW9yaXR5ICR7dGFzay5wcmlvcml0eX06ICR7cHJpb3JpdHlOYW1lfWBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdyb3VwQnlSZWN1cnJlbmNlKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICh0YXNrLnJlY3VycmVuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGFzay5yZWN1cnJlbmNlIS50b1RleHQoKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gWydOb25lJ107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBncm91cEJ5UmVjdXJyaW5nKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICh0YXNrLnJlY3VycmVuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbJ1JlY3VycmluZyddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFsnTm90IFJlY3VycmluZyddO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeVN0YXJ0RGF0ZSh0YXNrOiBUYXNrKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gW0dyb3VwLnN0cmluZ0Zyb21EYXRlKHRhc2suc3RhcnREYXRlLCAnc3RhcnQnKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeVNjaGVkdWxlZERhdGUodGFzazogVGFzayk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFtHcm91cC5zdHJpbmdGcm9tRGF0ZSh0YXNrLnNjaGVkdWxlZERhdGUsICdzY2hlZHVsZWQnKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeUR1ZURhdGUodGFzazogVGFzayk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFtHcm91cC5zdHJpbmdGcm9tRGF0ZSh0YXNrLmR1ZURhdGUsICdkdWUnKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeURvbmVEYXRlKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBbR3JvdXAuc3RyaW5nRnJvbURhdGUodGFzay5kb25lRGF0ZSwgJ2RvbmUnKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeUhhcHBlbnNEYXRlKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGVhcmxpZXN0RGF0ZUlmQW55ID0gbmV3IEhhcHBlbnNEYXRlRmllbGQoKS5lYXJsaWVzdERhdGUodGFzayk7XG4gICAgICAgIHJldHVybiBbR3JvdXAuc3RyaW5nRnJvbURhdGUoZWFybGllc3REYXRlSWZBbnksICdoYXBwZW5zJyldO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHN0cmluZ0Zyb21EYXRlKGRhdGU6IG1vbWVudC5Nb21lbnQgfCBudWxsLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnTm8gJyArIGZpZWxkICsgJyBkYXRlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZS5mb3JtYXQoR3JvdXAuZ3JvdXBEYXRlRm9ybWF0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBncm91cEJ5UGF0aCh0YXNrOiBUYXNrKTogc3RyaW5nW10ge1xuICAgICAgICAvLyBEb2VzIHRoaXMgbmVlZCB0byBiZSBtYWRlIHN0cmljdGVyP1xuICAgICAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgb2YgZ2V0dGluZyB0aGUgZmlsZSBuYW1lP1xuICAgICAgICByZXR1cm4gW0dyb3VwLmVzY2FwZU1hcmtkb3duQ2hhcmFjdGVycyh0YXNrLnBhdGgucmVwbGFjZSgnLm1kJywgJycpKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeUZvbGRlcih0YXNrOiBUYXNrKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBwYXRoID0gdGFzay5wYXRoO1xuICAgICAgICBjb25zdCBmaWxlTmFtZVdpdGhFeHRlbnNpb24gPSB0YXNrLmZpbGVuYW1lICsgJy5tZCc7XG4gICAgICAgIGNvbnN0IGZvbGRlciA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoZmlsZU5hbWVXaXRoRXh0ZW5zaW9uKSk7XG4gICAgICAgIGlmIChmb2xkZXIgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gWycvJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtHcm91cC5lc2NhcGVNYXJrZG93bkNoYXJhY3RlcnMoZm9sZGVyKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeUZpbGVOYW1lKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIC8vIE5vdGUgY3VycmVudCBsaW1pdGF0aW9uOiBUYXNrcyBmcm9tIGRpZmZlcmVudCBub3RlcyB3aXRoIHRoZVxuICAgICAgICAvLyBzYW1lIG5hbWUgd2lsbCBiZSBncm91cGVkIHRvZ2V0aGVyLCBldmVuIHRob3VnaCB0aGV5IGFyZSBpblxuICAgICAgICAvLyBkaWZmZXJlbnQgZmlsZXMgYW5kIHRoZWlyIGxpbmtzIHdpbGwgbG9vayBkaWZmZXJlbnQuXG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGFzay5maWxlbmFtZTtcbiAgICAgICAgaWYgKGZpbGVuYW1lID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gWydVbmtub3duIExvY2F0aW9uJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFsnW1snICsgR3JvdXAuZXNjYXBlTWFya2Rvd25DaGFyYWN0ZXJzKGZpbGVuYW1lKSArICddXSddO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdyb3VwQnlSb290KHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSB0YXNrLnBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHBhdGguaW5kZXhPZignLycpO1xuICAgICAgICBpZiAoc2VwYXJhdG9ySW5kZXggPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBbJy8nXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW0dyb3VwLmVzY2FwZU1hcmtkb3duQ2hhcmFjdGVycyhwYXRoLnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCArIDEpKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JvdXBCeUJhY2tsaW5rKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGxpbmtUZXh0ID0gdGFzay5nZXRMaW5rVGV4dCh7IGlzRmlsZW5hbWVVbmlxdWU6IHRydWUgfSk7XG4gICAgICAgIGlmIChsaW5rVGV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFsnVW5rbm93biBMb2NhdGlvbiddO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZpbGVuYW1lQ29tcG9uZW50ID0gJ1Vua25vd24gTG9jYXRpb24nO1xuXG4gICAgICAgIGlmICh0YXNrLmZpbGVuYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBNYXJrZG93biBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlIG5hbWUgbXVzdCBiZSBlc2NhcGVkLlxuICAgICAgICAgICAgZmlsZW5hbWVDb21wb25lbnQgPSBHcm91cC5lc2NhcGVNYXJrZG93bkNoYXJhY3RlcnModGFzay5maWxlbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFzay5wcmVjZWRpbmdIZWFkZXIgPT09IG51bGwgfHwgdGFzay5wcmVjZWRpbmdIZWFkZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW2ZpbGVuYW1lQ29tcG9uZW50XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmtkb3duIGNoYXJhY3RlcnMgaW4gdGhlIGhlYWRpbmcgbXVzdCBOT1QgYmUgZXNjYXBlZC5cbiAgICAgICAgY29uc3QgaGVhZGluZ0NvbXBvbmVudCA9IEdyb3VwLmdyb3VwQnlIZWFkaW5nKHRhc2spWzBdO1xuXG4gICAgICAgIGlmIChmaWxlbmFtZUNvbXBvbmVudCA9PT0gaGVhZGluZ0NvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFtmaWxlbmFtZUNvbXBvbmVudF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW2Ake2ZpbGVuYW1lQ29tcG9uZW50fSA+ICR7aGVhZGluZ0NvbXBvbmVudH1gXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdyb3VwQnlTdGF0dXModGFzazogVGFzayk6IHN0cmluZ1tdIHtcbiAgICAgICAgLy8gQmFja3dhcmRzLWNvbXBhdGliaWxpdHkgbm90ZTogSW4gVGFza3MgMS4yMi4wIGFuZCBlYXJsaWVyLCB0aGUgb25seVxuICAgICAgICAvLyBuYW1lcyB1c2VkIGJ5ICdncm91cCBieSBzdGF0dXMnIHdlcmUgJ1RvZG8nIGFuZCAnRG9uZScgLSBhbmRcbiAgICAgICAgLy8gYW55IGNoYXJhY3RlciBvdGhlciB0aGFuIGEgc3BhY2Ugd2FzIGNvbnNpZGVyZWQgdG8gYmUgJ0RvbmUnLlxuICAgICAgICBpZiAodGFzay5zdGF0dXMuc3ltYm9sID09PSAnICcpIHtcbiAgICAgICAgICAgIHJldHVybiBbJ1RvZG8nXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbJ0RvbmUnXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdyb3VwQnlIZWFkaW5nKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICh0YXNrLnByZWNlZGluZ0hlYWRlciA9PT0gbnVsbCB8fCB0YXNrLnByZWNlZGluZ0hlYWRlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbJyhObyBoZWFkaW5nKSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGFzay5wcmVjZWRpbmdIZWFkZXJdO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdyb3VwQnlUYWdzKHRhc2s6IFRhc2spOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICh0YXNrLnRhZ3MubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbJyhObyB0YWdzKSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXNrLnRhZ3M7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IExheW91dE9wdGlvbnMgfSBmcm9tICcuLi9UYXNrTGF5b3V0JztcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gJy4uL1Rhc2snO1xuaW1wb3J0IHR5cGUgeyBJUXVlcnkgfSBmcm9tICcuLi9JUXVlcnknO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuLi9Db25maWcvU2V0dGluZ3MnO1xuaW1wb3J0IHsgU29ydCB9IGZyb20gJy4vU29ydCc7XG5pbXBvcnQgdHlwZSB7IFNvcnRlciB9IGZyb20gJy4vU29ydGVyJztcbmltcG9ydCB0eXBlIHsgVGFza0dyb3VwcyB9IGZyb20gJy4vVGFza0dyb3Vwcyc7XG5pbXBvcnQgKiBhcyBGaWx0ZXJQYXJzZXIgZnJvbSAnLi9GaWx0ZXJQYXJzZXInO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICcuL0dyb3VwJztcbmltcG9ydCB0eXBlIHsgR3JvdXBlciB9IGZyb20gJy4vR3JvdXBlcic7XG5pbXBvcnQgdHlwZSB7IEdyb3VwaW5nUHJvcGVydHkgfSBmcm9tICcuL0dyb3VwZXInO1xuaW1wb3J0IHR5cGUgeyBGaWx0ZXIgfSBmcm9tICcuL0ZpbHRlci9GaWx0ZXInO1xuXG5leHBvcnQgY2xhc3MgUXVlcnkgaW1wbGVtZW50cyBJUXVlcnkge1xuICAgIHB1YmxpYyBzb3VyY2U6IHN0cmluZztcblxuICAgIHByaXZhdGUgX2xpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBfbGF5b3V0T3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IG5ldyBMYXlvdXRPcHRpb25zKCk7XG4gICAgcHJpdmF0ZSBfZmlsdGVyczogRmlsdGVyW10gPSBbXTtcbiAgICBwcml2YXRlIF9lcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgX3NvcnRpbmc6IFNvcnRlcltdID0gW107XG4gICAgcHJpdmF0ZSBfZ3JvdXBpbmc6IEdyb3VwZXJbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBncm91cEJ5UmVnZXhwID1cbiAgICAgICAgL15ncm91cCBieSAoYmFja2xpbmt8ZG9uZXxkdWV8ZmlsZW5hbWV8Zm9sZGVyfGhhcHBlbnN8aGVhZGluZ3xwYXRofHByaW9yaXR5fHJlY3VycmVuY2V8cmVjdXJyaW5nfHJvb3R8c2NoZWR1bGVkfHN0YXJ0fHN0YXR1c3x0YWdzKS87XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhpZGVPcHRpb25zUmVnZXhwID1cbiAgICAgICAgL14oaGlkZXxzaG93KSAodGFzayBjb3VudHxiYWNrbGlua3xwcmlvcml0eXxzdGFydCBkYXRlfHNjaGVkdWxlZCBkYXRlfGRvbmUgZGF0ZXxkdWUgZGF0ZXxyZWN1cnJlbmNlIHJ1bGV8ZWRpdCBidXR0b258dXJnZW5jeSkvO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2hvcnRNb2RlUmVnZXhwID0gL15zaG9ydC87XG4gICAgcHJpdmF0ZSByZWFkb25seSBleHBsYWluUXVlcnlSZWdleHAgPSAvXmV4cGxhaW4vO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBsaW1pdFJlZ2V4cCA9IC9ebGltaXQgKHRvICk/KFxcZCspKCB0YXNrcz8pPy87XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1lbnRSZWdleHAgPSAvXiMuKi87XG5cbiAgICBjb25zdHJ1Y3Rvcih7IHNvdXJjZSB9OiB7IHNvdXJjZTogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgLm1hcCgobGluZTogc3RyaW5nKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAgICAgICAgIC5mb3JFYWNoKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBsaW5lID09PSAnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuc2hvcnRNb2RlUmVnZXhwLnRlc3QobGluZSk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRPcHRpb25zLnNob3J0TW9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLmV4cGxhaW5RdWVyeVJlZ2V4cC50ZXN0KGxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5leHBsYWluUXVlcnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5saW1pdFJlZ2V4cC50ZXN0KGxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUxpbWl0KHsgbGluZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMucGFyc2VTb3J0QnkoeyBsaW5lIH0pOlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5wYXJzZUdyb3VwQnkyKHsgbGluZSB9KTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuZ3JvdXBCeVJlZ2V4cC50ZXN0KGxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUdyb3VwQnkoeyBsaW5lIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5oaWRlT3B0aW9uc1JlZ2V4cC50ZXN0KGxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUhpZGVPcHRpb25zKHsgbGluZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuY29tbWVudFJlZ2V4cC50ZXN0KGxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tbWVudCBsaW5lcyBhcmUgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5wYXJzZUZpbHRlcihsaW5lKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSBgZG8gbm90IHVuZGVyc3RhbmQgcXVlcnk6ICR7bGluZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBleHBsYWluUXVlcnkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdFeHBsYW5hdGlvbiBvZiB0aGlzIFRhc2tzIGNvZGUgYmxvY2sgcXVlcnk6XFxuXFxuJyArIHRoaXMuZXhwbGFpblF1ZXJ5V2l0aG91dEludHJvZHVjdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBleHBsYWluUXVlcnlXaXRob3V0SW50cm9kdWN0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcblxuICAgICAgICBjb25zdCB7IGdsb2JhbEZpbHRlciB9ID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgaWYgKGdsb2JhbEZpbHRlci5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgT25seSB0YXNrcyBjb250YWluaW5nIHRoZSBnbG9iYWwgZmlsdGVyICcke2dsb2JhbEZpbHRlcn0nLlxcblxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBudW1iZXJPZkZpbHRlcnMgPSB0aGlzLmZpbHRlcnMubGVuZ3RoO1xuICAgICAgICBpZiAobnVtYmVyT2ZGaWx0ZXJzID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJ05vIGZpbHRlcnMgc3VwcGxpZWQuIEFsbCB0YXNrcyB3aWxsIG1hdGNoIHRoZSBxdWVyeS4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZkZpbHRlcnM7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpID4gMCkgcmVzdWx0ICs9ICdcXG4nO1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLmZpbHRlcnNbaV0uZXhwbGFpbkZpbHRlckluZGVudGVkKCcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gYFxcblxcbkF0IG1vc3QgJHt0aGlzLl9saW1pdH0gdGFza2A7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGltaXQgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3MnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ICs9ICcuXFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsaW1pdCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGltaXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsYXlvdXRPcHRpb25zKCk6IExheW91dE9wdGlvbnMge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5b3V0T3B0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcnMoKTogRmlsdGVyW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvcnRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0aW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ3JvdXBpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVycm9yKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXBwbHlRdWVyeVRvVGFza3ModGFza3M6IFRhc2tbXSk6IFRhc2tHcm91cHMge1xuICAgICAgICB0aGlzLmZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICAgICAgICB0YXNrcyA9IHRhc2tzLmZpbHRlcihmaWx0ZXIuZmlsdGVyRnVuY3Rpb24pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0YXNrc1NvcnRlZExpbWl0ZWQgPSBTb3J0LmJ5KHRoaXMuc29ydGluZywgdGFza3MpLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuICAgICAgICByZXR1cm4gR3JvdXAuYnkodGhpcy5ncm91cGluZywgdGFza3NTb3J0ZWRMaW1pdGVkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlSGlkZU9wdGlvbnMoeyBsaW5lIH06IHsgbGluZTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGlkZU9wdGlvbnNNYXRjaCA9IGxpbmUubWF0Y2godGhpcy5oaWRlT3B0aW9uc1JlZ2V4cCk7XG4gICAgICAgIGlmIChoaWRlT3B0aW9uc01hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBoaWRlID0gaGlkZU9wdGlvbnNNYXRjaFsxXSA9PT0gJ2hpZGUnO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gaGlkZU9wdGlvbnNNYXRjaFsyXTtcblxuICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICAgICAgICBjYXNlICd0YXNrIGNvdW50JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlVGFza0NvdW50ID0gaGlkZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYmFja2xpbmsnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRPcHRpb25zLmhpZGVCYWNrbGlua3MgPSBoaWRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdwcmlvcml0eSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE9wdGlvbnMuaGlkZVByaW9yaXR5ID0gaGlkZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RhcnQgZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE9wdGlvbnMuaGlkZVN0YXJ0RGF0ZSA9IGhpZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NjaGVkdWxlZCBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlU2NoZWR1bGVkRGF0ZSA9IGhpZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2R1ZSBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlRHVlRGF0ZSA9IGhpZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvbmUgZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE9wdGlvbnMuaGlkZURvbmVEYXRlID0gaGlkZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncmVjdXJyZW5jZSBydWxlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlUmVjdXJyZW5jZVJ1bGUgPSBoaWRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlZGl0IGJ1dHRvbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE9wdGlvbnMuaGlkZUVkaXRCdXR0b24gPSBoaWRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd1cmdlbmN5JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0T3B0aW9ucy5oaWRlVXJnZW5jeSA9IGhpZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIGhpZGUvc2hvdyBvcHRpb24nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZUZpbHRlcihsaW5lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyT3JFcnJvciA9IEZpbHRlclBhcnNlci5wYXJzZUZpbHRlcihsaW5lKTtcbiAgICAgICAgaWYgKGZpbHRlck9yRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGZpbHRlck9yRXJyb3IuZmlsdGVyKSB0aGlzLl9maWx0ZXJzLnB1c2goZmlsdGVyT3JFcnJvci5maWx0ZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLl9lcnJvciA9IGZpbHRlck9yRXJyb3IuZXJyb3I7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZUxpbWl0KHsgbGluZSB9OiB7IGxpbmU6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpbWl0TWF0Y2ggPSBsaW5lLm1hdGNoKHRoaXMubGltaXRSZWdleHApO1xuICAgICAgICBpZiAobGltaXRNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gbGltaXRNYXRjaFsyXSBpcyBwZXIgcmVnZXggYWx3YXlzIGRpZ2l0cyBhbmQgdGhlcmVmb3JlIHBhcnNhYmxlLlxuICAgICAgICAgICAgdGhpcy5fbGltaXQgPSBOdW1iZXIucGFyc2VJbnQobGltaXRNYXRjaFsyXSwgMTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSAnZG8gbm90IHVuZGVyc3RhbmQgcXVlcnkgbGltaXQnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZVNvcnRCeSh7IGxpbmUgfTogeyBsaW5lOiBzdHJpbmcgfSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzb3J0aW5nTWF5YmUgPSBGaWx0ZXJQYXJzZXIucGFyc2VTb3J0ZXIobGluZSk7XG4gICAgICAgIGlmIChzb3J0aW5nTWF5YmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvcnRpbmcucHVzaChzb3J0aW5nTWF5YmUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9sZC1zdHlsZSBwYXJzaW5nIG9mIGBncm91cCBieWAgbGluZXMsIGZvciBncm91cGluZyB0aGF0IGlzIGltcGxlbWVudGVkIHdpdGggc3RhdGljXG4gICAgICogbWV0aG9kcyBpbiB7QGxpbmsgR3JvdXB9LCB0aGF0IGFyZSBsb29rZWQgdXAgZnJvbSBhIHtAbGluayBHcm91cGluZ1Byb3BlcnR5fS5cbiAgICAgKlxuICAgICAqIFRoZXNlIHdpbGwgYmUgZ3JhZHVhbGx5IG1pZ3JhdGVkIHRvIHRoZSBncm91cGluZyBtZXRob2QgaW4ge0BsaW5rIEZpZWxkfVxuICAgICAqIGNsYXNzZXMsIGFmdGVyIHdoaWNoIHRoaXMgbWV0aG9kIHdpbGwgYmUgZGVsZXRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaW5lXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAc2VlIHBhcnNlR3JvdXBCeTJcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlR3JvdXBCeSh7IGxpbmUgfTogeyBsaW5lOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZE1hdGNoID0gbGluZS5tYXRjaCh0aGlzLmdyb3VwQnlSZWdleHApO1xuICAgICAgICBpZiAoZmllbGRNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fZ3JvdXBpbmcucHVzaChHcm91cC5mcm9tR3JvdXBpbmdQcm9wZXJ0eShmaWVsZE1hdGNoWzFdIGFzIEdyb3VwaW5nUHJvcGVydHkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ2RvIG5vdCB1bmRlcnN0YW5kIHF1ZXJ5IGdyb3VwaW5nJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5ldy1zdHlsZSBwYXJzaW5nIG9mIGBncm91cCBieWAgbGluZXMsIGZvciBncm91cGluZyB0aGF0IGlzIGltcGxlbWVudGVkIGluIHRoZSB7QGxpbmsgRmllbGR9XG4gICAgICogY2xhc3Nlcy5cbiAgICAgKlxuICAgICAqIE9uY2UgdGhlIG9yaWdpbmFsIHtAbGluayBwYXJzZUdyb3VwQnl9IGhhcyBiZWVuIHJlbW92ZWQsIHJlbmFtZSB0aGlzIHRvIHBhcnNlR3JvdXBCeSgpXG4gICAgICogQHBhcmFtIGxpbmVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBzZWUgcGFyc2VHcm91cEJ5XG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZUdyb3VwQnkyKHsgbGluZSB9OiB7IGxpbmU6IHN0cmluZyB9KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGdyb3VwaW5nTWF5YmUgPSBGaWx0ZXJQYXJzZXIucGFyc2VHcm91cGVyKGxpbmUpO1xuICAgICAgICBpZiAoZ3JvdXBpbmdNYXliZSkge1xuICAgICAgICAgICAgdGhpcy5fZ3JvdXBpbmcucHVzaChncm91cGluZ01heWJlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTm90aWNlLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBkZWJvdW5jZSB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IFN0YXR1c0NvbmZpZ3VyYXRpb24sIFN0YXR1c1R5cGUgfSBmcm9tICcuLi9TdGF0dXNDb25maWd1cmF0aW9uJztcbmltcG9ydCB0eXBlIFRhc2tzUGx1Z2luIGZyb20gJy4uL21haW4nO1xuaW1wb3J0IHsgU3RhdHVzUmVnaXN0cnkgfSBmcm9tICcuLi9TdGF0dXNSZWdpc3RyeSc7XG5pbXBvcnQgeyBTdGF0dXMgfSBmcm9tICcuLi9TdGF0dXMnO1xuaW1wb3J0IHR5cGUgeyBTdGF0dXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vU3RhdHVzQ29sbGVjdGlvbic7XG5pbXBvcnQgKiBhcyBUaGVtZXMgZnJvbSAnLi9UaGVtZXMnO1xuaW1wb3J0IHR5cGUgeyBIZWFkaW5nU3RhdGUgfSBmcm9tICcuL1NldHRpbmdzJztcbmltcG9ydCB7IGdldFNldHRpbmdzLCBpc0ZlYXR1cmVFbmFibGVkLCB1cGRhdGVHZW5lcmFsU2V0dGluZywgdXBkYXRlU2V0dGluZ3MgfSBmcm9tICcuL1NldHRpbmdzJztcbmltcG9ydCB7IFN0YXR1c1NldHRpbmdzIH0gZnJvbSAnLi9TdGF0dXNTZXR0aW5ncyc7XG5pbXBvcnQgc2V0dGluZ3NKc29uIGZyb20gJy4vc2V0dGluZ3NDb25maWd1cmF0aW9uLmpzb24nO1xuXG5pbXBvcnQgeyBDdXN0b21TdGF0dXNNb2RhbCB9IGZyb20gJy4vQ3VzdG9tU3RhdHVzTW9kYWwnO1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgICAvLyBJZiB0aGUgVUkgbmVlZHMgYSBtb3JlIGNvbXBsZXggc2V0dGluZyB5b3UgY2FuIGNyZWF0ZSBhXG4gICAgLy8gY3VzdG9tIGZ1bmN0aW9uIGFuZCBzcGVjaWZ5IGl0IGZyb20gdGhlIGpzb24gZmlsZS4gSXQgd2lsbFxuICAgIC8vIHRoZW4gYmUgcmVuZGVyZWQgaW5zdGVhZCBvZiBhIG5vcm1hbCBjaGVja2JveCBvciB0ZXh0IGJveC5cbiAgICBjdXN0b21GdW5jdGlvbnM6IHsgW0s6IHN0cmluZ106IEZ1bmN0aW9uIH0gPSB7XG4gICAgICAgIGluc2VydFRhc2tDb3JlU3RhdHVzU2V0dGluZ3M6IHRoaXMuaW5zZXJ0VGFza0NvcmVTdGF0dXNTZXR0aW5ncy5iaW5kKHRoaXMpLFxuICAgICAgICBpbnNlcnRDdXN0b21UYXNrU3RhdHVzU2V0dGluZ3M6IHRoaXMuaW5zZXJ0Q3VzdG9tVGFza1N0YXR1c1NldHRpbmdzLmJpbmQodGhpcyksXG4gICAgfTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luOiBUYXNrc1BsdWdpbjtcblxuICAgIGNvbnN0cnVjdG9yKHsgcGx1Z2luIH06IHsgcGx1Z2luOiBUYXNrc1BsdWdpbiB9KSB7XG4gICAgICAgIHN1cGVyKHBsdWdpbi5hcHAsIHBsdWdpbik7XG5cbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlRnJhZ21lbnRXaXRoSFRNTCA9IChodG1sOiBzdHJpbmcpID0+XG4gICAgICAgIGNyZWF0ZUZyYWdtZW50KChkb2N1bWVudEZyYWdtZW50KSA9PiAoZG9jdW1lbnRGcmFnbWVudC5jcmVhdGVEaXYoKS5pbm5lckhUTUwgPSBodG1sKSk7XG5cbiAgICBwdWJsaWMgYXN5bmMgc2F2ZVNldHRpbmdzKHVwZGF0ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cbiAgICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcGxheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuICAgICAgICBjb250YWluZXJFbC5lbXB0eSgpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmFkZENsYXNzKCd0YXNrcy1zZXR0aW5ncycpO1xuXG4gICAgICAgIC8vIEZvciByZWFzb25zIEkgZG9uJ3QgdW5kZXJzdGFuZCwgJ2gyJyBpcyB0aW55IGluIFNldHRpbmdzLFxuICAgICAgICAvLyBzbyBJIGhhdmUgdXNlZCAnaDMnIGFzIHRoZSBsYXJnZXN0IGhlYWRpbmcuXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMycsIHsgdGV4dDogJ1Rhc2tzIFNldHRpbmdzJyB9KTtcbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ3AnLCB7XG4gICAgICAgICAgICBjbHM6ICd0YXNrcy1zZXR0aW5nLWltcG9ydGFudCcsXG4gICAgICAgICAgICB0ZXh0OiAnQ2hhbmdpbmcgYW55IHNldHRpbmdzIHJlcXVpcmVzIGEgcmVzdGFydCBvZiBvYnNpZGlhbi4nLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2g0JywgeyB0ZXh0OiAnR2xvYmFsIGZpbHRlciBTZXR0aW5ncycgfSk7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0dsb2JhbCB0YXNrIGZpbHRlcicpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICBTZXR0aW5nc1RhYi5jcmVhdGVGcmFnbWVudFdpdGhIVE1MKFxuICAgICAgICAgICAgICAgICAgICAnPHA+PGI+UmVjb21tZW5kZWQ6IExlYXZlIGVtcHR5IGlmIHlvdSB3YW50IGFsbCBjaGVja2xpc3QgaXRlbXMgaW4geW91ciB2YXVsdCB0byBiZSB0YXNrcyBtYW5hZ2VkIGJ5IHRoaXMgcGx1Z2luLjwvYj48L3A+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHA+VXNlIGEgZ2xvYmFsIGZpbHRlciBpZiB5b3Ugd2FudCBUYXNrcyB0byBvbmx5IGFjdCBvbiBhIHN1YnNldCBvZiB5b3VyIFwiPGNvZGU+LSBbIF08L2NvZGU+XCIgY2hlY2tsaXN0IGl0ZW1zLCBzbyB0aGF0ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2EgY2hlY2tsaXN0IGl0ZW0gbXVzdCBpbmNsdWRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGluIGl0cyBkZXNjcmlwdGlvbiBpbiBvcmRlciB0byBiZSBjb25zaWRlcmVkIGEgdGFzay48cD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8cD5Gb3IgZXhhbXBsZSwgaWYgeW91IHNldCB0aGUgZ2xvYmFsIGZpbHRlciB0byA8Y29kZT4jdGFzazwvY29kZT4sIHRoZSBUYXNrcyBwbHVnaW4gd2lsbCBvbmx5IGhhbmRsZSBjaGVja2xpc3QgaXRlbXMgdGFnZ2VkIHdpdGggPGNvZGU+I3Rhc2s8L2NvZGU+LjwvYnI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnT3RoZXIgY2hlY2tsaXN0IGl0ZW1zIHdpbGwgcmVtYWluIG5vcm1hbCBjaGVja2xpc3QgaXRlbXMgYW5kIG5vdCBhcHBlYXIgaW4gcXVlcmllcyBvciBnZXQgYSBkb25lIGRhdGUgc2V0LjwvcD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8cD5TZWUgdGhlIDxhIGhyZWY9XCJodHRwczovL29ic2lkaWFuLXRhc2tzLWdyb3VwLmdpdGh1Yi5pby9vYnNpZGlhbi10YXNrcy9nZXR0aW5nLXN0YXJ0ZWQvZ2xvYmFsLWZpbHRlci9cIj5kb2N1bWVudGF0aW9uPC9hPi48L3A+JyxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJIHdhbnRlZCB0byBtYWtlIHRoaXMgc2F5ICdmb3IgZXhhbXBsZSwgI3Rhc2sgb3IgVE9ETydcbiAgICAgICAgICAgICAgICAvLyBidXQgd2Fzbid0IGFibGUgdG8gZmlndXJlIG91dCBob3cgdG8gbWFrZSB0aGUgdGV4dCBib3hcbiAgICAgICAgICAgICAgICAvLyB3aWRlIGVub3VnaCBmb3IgdGhlIHdob2xlIHN0cmluZyB0byBiZSB2aXNpYmxlLlxuICAgICAgICAgICAgICAgIHRleHQuc2V0UGxhY2Vob2xkZXIoJ2UuZy4gI3Rhc2sgb3IgVE9ETycpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5nbG9iYWxGaWx0ZXIpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldHRpbmdzKHsgZ2xvYmFsRmlsdGVyOiB2YWx1ZSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnUmVtb3ZlIGdsb2JhbCBmaWx0ZXIgZnJvbSBkZXNjcmlwdGlvbicpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAnRW5hYmxpbmcgdGhpcyByZW1vdmVzIHRoZSBzdHJpbmcgdGhhdCB5b3Ugc2V0IGFzIGdsb2JhbCBmaWx0ZXIgZnJvbSB0aGUgdGFzayBkZXNjcmlwdGlvbiB3aGVuIGRpc3BsYXlpbmcgYSB0YXNrLicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG5cbiAgICAgICAgICAgICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MucmVtb3ZlR2xvYmFsRmlsdGVyKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2V0dGluZ3MoeyByZW1vdmVHbG9iYWxGaWx0ZXI6IHZhbHVlIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoNCcsIHsgdGV4dDogJ1Rhc2sgU3RhdHVzZXMnIH0pO1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgICAgICBjb25zdCB7IGhlYWRpbmdPcGVuZWQgfSA9IGdldFNldHRpbmdzKCk7XG5cbiAgICAgICAgc2V0dGluZ3NKc29uLmZvckVhY2goKGhlYWRpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkT25lU2V0dGluZ3NCbG9jayhjb250YWluZXJFbCwgaGVhZGluZywgaGVhZGluZ09wZW5lZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDQnLCB7IHRleHQ6ICdEYXRlIFNldHRpbmdzJyB9KTtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnU2V0IGRvbmUgZGF0ZSBvbiBldmVyeSBjb21wbGV0ZWQgdGFzaycpXG4gICAgICAgICAgICAuc2V0RGVzYygnRW5hYmxpbmcgdGhpcyB3aWxsIGFkZCBhIHRpbWVzdGFtcCBcdTI3MDUgWVlZWS1NTS1ERCBhdCB0aGUgZW5kIHdoZW4gYSB0YXNrIGlzIHRvZ2dsZWQgdG8gZG9uZScpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnNldERvbmVEYXRlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2V0dGluZ3MoeyBzZXREb25lRGF0ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnVXNlIGZpbGVuYW1lIGFzIFNjaGVkdWxlZCBkYXRlIGZvciB1bmRhdGVkIHRhc2tzJylcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgIFNldHRpbmdzVGFiLmNyZWF0ZUZyYWdtZW50V2l0aEhUTUwoXG4gICAgICAgICAgICAgICAgICAgICdTYXZlIHRpbWUgZW50ZXJpbmcgU2NoZWR1bGVkIChcdTIzRjMpIGRhdGVzLjwvYnI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgYW55IHVuZGF0ZWQgdGFza3Mgd2lsbCBiZSBnaXZlbiBhIGRlZmF1bHQgU2NoZWR1bGVkIGRhdGUgZXh0cmFjdGVkIGZyb20gdGhlaXIgZmlsZSBuYW1lLjwvYnI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGRhdGUgaW4gdGhlIGZpbGUgbmFtZSBtdXN0IGJlIGluIG9uZSBvZiA8Y29kZT5ZWVlZLU1NLUREPC9jb2RlPiBvciA8Y29kZT5ZWVlZTU1ERDwvY29kZT4gZm9ybWF0cy48L2JyPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZGF0ZWQgdGFza3MgaGF2ZSBub25lIG9mIER1ZSAoXHVEODNEXHVEQ0M1ICksIFNjaGVkdWxlZCAoXHUyM0YzKSBhbmQgU3RhcnQgKFx1RDgzRFx1REVFQikgZGF0ZXMuPC9icj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8cD5TZWUgdGhlIDxhIGhyZWY9XCJodHRwczovL29ic2lkaWFuLXRhc2tzLWdyb3VwLmdpdGh1Yi5pby9vYnNpZGlhbi10YXNrcy9nZXR0aW5nLXN0YXJ0ZWQvdXNlLWZpbGVuYW1lLWFzLWRlZmF1bHQtZGF0ZS9cIj5kb2N1bWVudGF0aW9uPC9hPi48L3A+JyxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy51c2VGaWxlbmFtZUFzU2NoZWR1bGVkRGF0ZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldHRpbmdzKHsgdXNlRmlsZW5hbWVBc1NjaGVkdWxlZERhdGU6IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0ZvbGRlcnMgd2l0aCBkZWZhdWx0IFNjaGVkdWxlZCBkYXRlcycpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAnTGVhdmUgZW1wdHkgaWYgeW91IHdhbnQgdG8gdXNlIGRlZmF1bHQgU2NoZWR1bGVkIGRhdGVzIGV2ZXJ5d2hlcmUsIG9yIGVudGVyIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZm9sZGVycy4nLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZFRleHQoYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIGlucHV0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShTZXR0aW5nc1RhYi5yZW5kZXJGb2xkZXJBcnJheShzZXR0aW5ncy5maWxlbmFtZUFzRGF0ZUZvbGRlcnMpKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2xkZXJzID0gU2V0dGluZ3NUYWIucGFyc2VDb21tYVNlcGFyYXRlZEZvbGRlcnModmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2V0dGluZ3MoeyBmaWxlbmFtZUFzRGF0ZUZvbGRlcnM6IGZvbGRlcnMgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2g0JywgeyB0ZXh0OiAnQXV0by1zdWdnZXN0IFNldHRpbmdzJyB9KTtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnQXV0by1zdWdnZXN0IHRhc2sgY29udGVudCcpXG4gICAgICAgICAgICAuc2V0RGVzYygnRW5hYmxpbmcgdGhpcyB3aWxsIG9wZW4gYW4gaW50ZWxsaWdlbnQgc3VnZ2VzdCBtZW51IHdoaWxlIHR5cGluZyBpbnNpZGUgYSByZWNvZ25pemVkIHRhc2sgbGluZS4nKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5hdXRvU3VnZ2VzdEluRWRpdG9yKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2V0dGluZ3MoeyBhdXRvU3VnZ2VzdEluRWRpdG9yOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdNaW5pbXVtIG1hdGNoIGxlbmd0aCBmb3IgYXV0by1zdWdnZXN0JylcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICdJZiBoaWdoZXIgdGhhbiAwLCBhdXRvLXN1Z2dlc3Qgd2lsbCBiZSB0cmlnZ2VyZWQgb25seSB3aGVuIHRoZSBiZWdpbm5pbmcgb2YgYW55IHN1cHBvcnRlZCBrZXl3b3JkcyBpcyByZWNvZ25pemVkLicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkU2xpZGVyKChzbGlkZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgc2xpZGVyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRMaW1pdHMoMCwgMywgMSlcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmF1dG9TdWdnZXN0TWluTWF0Y2gpXG4gICAgICAgICAgICAgICAgICAgIC5zZXREeW5hbWljVG9vbHRpcCgpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldHRpbmdzKHsgYXV0b1N1Z2dlc3RNaW5NYXRjaDogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdNYXhpbXVtIG51bWJlciBvZiBhdXRvLXN1Z2dlc3Rpb25zIHRvIHNob3cnKVxuICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgJ0hvdyBtYW55IHN1Z2dlc3Rpb25zIHNob3VsZCBiZSBzaG93biB3aGVuIGFuIGF1dG8tc3VnZ2VzdCBtZW51IHBvcHMgdXAgKGluY2x1ZGluZyB0aGUgXCJcdTIzQ0VcIiBvcHRpb24pLicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkU2xpZGVyKChzbGlkZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgc2xpZGVyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRMaW1pdHMoMywgMTIsIDEpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5hdXRvU3VnZ2VzdE1heEl0ZW1zKVxuICAgICAgICAgICAgICAgICAgICAuc2V0RHluYW1pY1Rvb2x0aXAoKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZXR0aW5ncyh7IGF1dG9TdWdnZXN0TWF4SXRlbXM6IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoNCcsIHsgdGV4dDogJ0RpYWxvZyBTZXR0aW5ncycgfSk7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ1Byb3ZpZGUgYWNjZXNzIGtleXMgaW4gZGlhbG9ncycpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAnSWYgdGhlIGFjY2VzcyBrZXlzIChrZXlib2FyZCBzaG9ydGN1dHMpIGZvciB2YXJpb3VzIGNvbnRyb2xzJyArXG4gICAgICAgICAgICAgICAgICAgICcgaW4gZGlhbG9nIGJveGVzIGNvbmZsaWN0IHdpdGggc3lzdGVtIGtleWJvYXJkIHNob3J0Y3V0cycgK1xuICAgICAgICAgICAgICAgICAgICAnIG9yIGFzc2lzdGl2ZSB0ZWNobm9sb2d5IGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBpbXBvcnRhbnQgZm9yIHlvdSwnICtcbiAgICAgICAgICAgICAgICAgICAgJyB5b3UgbWF5IHdhbnQgdG8gZGVhY3RpdmF0ZSB0aGVtIGhlcmUuJyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MucHJvdmlkZUFjY2Vzc0tleXMpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZXR0aW5ncyh7IHByb3ZpZGVBY2Nlc3NLZXlzOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE9uZVNldHRpbmdzQmxvY2soY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LCBoZWFkaW5nOiBhbnksIGhlYWRpbmdPcGVuZWQ6IEhlYWRpbmdTdGF0ZSkge1xuICAgICAgICBjb25zdCBkZXRhaWxzQ29udGFpbmVyID0gY29udGFpbmVyRWwuY3JlYXRlRWwoJ2RldGFpbHMnLCB7XG4gICAgICAgICAgICBjbHM6ICd0YXNrcy1uZXN0ZWQtc2V0dGluZ3MnLFxuICAgICAgICAgICAgYXR0cjoge1xuICAgICAgICAgICAgICAgIC4uLihoZWFkaW5nLm9wZW4gfHwgaGVhZGluZ09wZW5lZFtoZWFkaW5nLnRleHRdID8geyBvcGVuOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgZGV0YWlsc0NvbnRhaW5lci5lbXB0eSgpO1xuICAgICAgICBkZXRhaWxzQ29udGFpbmVyLm9udG9nZ2xlID0gKCkgPT4ge1xuICAgICAgICAgICAgaGVhZGluZ09wZW5lZFtoZWFkaW5nLnRleHRdID0gZGV0YWlsc0NvbnRhaW5lci5vcGVuO1xuICAgICAgICAgICAgdXBkYXRlU2V0dGluZ3MoeyBoZWFkaW5nT3BlbmVkOiBoZWFkaW5nT3BlbmVkIH0pO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkZXRhaWxzQ29udGFpbmVyLmNyZWF0ZUVsKCdzdW1tYXJ5Jyk7XG4gICAgICAgIG5ldyBTZXR0aW5nKHN1bW1hcnkpLnNldEhlYWRpbmcoKS5zZXROYW1lKGhlYWRpbmcudGV4dCk7XG4gICAgICAgIHN1bW1hcnkuY3JlYXRlRGl2KCdjb2xsYXBzZXInKS5jcmVhdGVEaXYoJ2hhbmRsZScpO1xuXG4gICAgICAgIC8vIGRldGFpbHNDb250YWluZXIuY3JlYXRlRWwoaGVhZGluZy5sZXZlbCBhcyBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXAsIHsgdGV4dDogaGVhZGluZy50ZXh0IH0pO1xuXG4gICAgICAgIGlmIChoZWFkaW5nLm5vdGljZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgbm90aWNlID0gZGV0YWlsc0NvbnRhaW5lci5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgICAgICAgICAgIGNsczogaGVhZGluZy5ub3RpY2UuY2xhc3MsXG4gICAgICAgICAgICAgICAgdGV4dDogaGVhZGluZy5ub3RpY2UudGV4dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGhlYWRpbmcubm90aWNlLmh0bWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBub3RpY2UuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBoZWFkaW5nLm5vdGljZS5odG1sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBwcm9jZXNzIGFsbCB0aGUgc2V0dGluZ3MgZnJvbSBzZXR0aW5nc0NvbmZpZ3VyYXRpb24uanNvbiBhbmQgcmVuZGVyXG4gICAgICAgIC8vIHRoZW0gb3V0IHJlZHVjaW5nIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGUgY29kZSBpbiB0aGlzIGZpbGUuIFRoaXMgd2lsbCBiZWNvbWVcbiAgICAgICAgLy8gbW9yZSBpbXBvcnRhbnQgYXMgZmVhdHVyZXMgYXJlIGJlaW5nIGFkZGVkIG92ZXIgdGltZS5cbiAgICAgICAgaGVhZGluZy5zZXR0aW5ncy5mb3JFYWNoKChzZXR0aW5nOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmZlYXR1cmVGbGFnICE9PSAnJyAmJiAhaXNGZWF0dXJlRW5hYmxlZChzZXR0aW5nLmZlYXR1cmVGbGFnKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBzZXR0aW5ncyBjb25maWd1cmF0aW9uIGhhcyBhIGZlYXR1cmVGbGFnIHNldCBhbmQgdGhlIHVzZXIgaGFzIG5vdFxuICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQgaXQuIFNraXAgYWRkaW5nIHRoZSBzZXR0aW5ncyBvcHRpb24uXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNldHRpbmcudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICAgIG5ldyBTZXR0aW5nKGRldGFpbHNDb250YWluZXIpXG4gICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKHNldHRpbmcubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLnNldERlc2Moc2V0dGluZy5kZXNjcmlwdGlvbilcbiAgICAgICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmdlbmVyYWxTZXR0aW5nc1tzZXR0aW5nLnNldHRpbmdOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdlbmVyYWxTZXR0aW5nKHNldHRpbmcuc2V0dGluZ05hbWUsIHNldHRpbmcuaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSg8Ym9vbGVhbj5zZXR0aW5ncy5nZW5lcmFsU2V0dGluZ3Nbc2V0dGluZy5zZXR0aW5nTmFtZV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVHZW5lcmFsU2V0dGluZyhzZXR0aW5nLnNldHRpbmdOYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZy50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICBuZXcgU2V0dGluZyhkZXRhaWxzQ29udGFpbmVyKVxuICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShzZXR0aW5nLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgIC5zZXREZXNjKHNldHRpbmcuZGVzY3JpcHRpb24pXG4gICAgICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmdlbmVyYWxTZXR0aW5nc1tzZXR0aW5nLnNldHRpbmdOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdlbmVyYWxTZXR0aW5nKHNldHRpbmcuc2V0dGluZ05hbWUsIHNldHRpbmcuaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25DaGFuZ2UgPSBhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdlbmVyYWxTZXR0aW5nKHNldHRpbmcuc2V0dGluZ05hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuc2V0UGxhY2Vob2xkZXIoc2V0dGluZy5wbGFjZWhvbGRlci50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5nZW5lcmFsU2V0dGluZ3Nbc2V0dGluZy5zZXR0aW5nTmFtZV0udG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoZGVib3VuY2Uob25DaGFuZ2UsIDUwMCwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZy50eXBlID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgICAgICAgICAgbmV3IFNldHRpbmcoZGV0YWlsc0NvbnRhaW5lcilcbiAgICAgICAgICAgICAgICAgICAgLnNldE5hbWUoc2V0dGluZy5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAuc2V0RGVzYyhzZXR0aW5nLmRlc2NyaXB0aW9uKVxuICAgICAgICAgICAgICAgICAgICAuYWRkVGV4dEFyZWEoKHRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3MuZ2VuZXJhbFNldHRpbmdzW3NldHRpbmcuc2V0dGluZ05hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2VuZXJhbFNldHRpbmcoc2V0dGluZy5zZXR0aW5nTmFtZSwgc2V0dGluZy5pbml0aWFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbkNoYW5nZSA9IGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2VuZXJhbFNldHRpbmcoc2V0dGluZy5zZXR0aW5nTmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRQbGFjZWhvbGRlcihzZXR0aW5nLnBsYWNlaG9sZGVyLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmdlbmVyYWxTZXR0aW5nc1tzZXR0aW5nLnNldHRpbmdOYW1lXS50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShkZWJvdW5jZShvbkNoYW5nZSwgNTAwLCB0cnVlKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuaW5wdXRFbC5yb3dzID0gODtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuaW5wdXRFbC5jb2xzID0gNDA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5nLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUZ1bmN0aW9uc1tzZXR0aW5nLnNldHRpbmdOYW1lXShkZXRhaWxzQ29udGFpbmVyLCB0aGlzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNldHRpbmcubm90aWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm90aWNlID0gZGV0YWlsc0NvbnRhaW5lci5jcmVhdGVFbCgncCcsIHtcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBzZXR0aW5nLm5vdGljZS5jbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogc2V0dGluZy5ub3RpY2UudGV4dCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5ub3RpY2UuaHRtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBub3RpY2UuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBzZXR0aW5nLm5vdGljZS5odG1sKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHBhcnNlQ29tbWFTZXBhcmF0ZWRGb2xkZXJzKGlucHV0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICAgICAgICAgIC8vIGEgbGltaXRhdGlvbiBpcyB0aGF0IGZvbGRlciBuYW1lcyBtYXkgbm90IGNvbnRhaW4gY29tbWFzXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgICAubWFwKChmb2xkZXIpID0+IGZvbGRlci50cmltKCkpXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXNcbiAgICAgICAgICAgICAgICAubWFwKChmb2xkZXIpID0+IGZvbGRlci5yZXBsYWNlKC9eXFwvfFxcLyQvZywgJycpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGZvbGRlcikgPT4gZm9sZGVyICE9PSAnJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyByZW5kZXJGb2xkZXJBcnJheShmb2xkZXJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBmb2xkZXJzLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXR0aW5ncyBmb3IgQ29yZSBUYXNrIFN0YXR1c1xuICAgICAqIFRoZXNlIGFyZSBidWlsdC1pbiBzdGF0dXNlcyB0aGF0IGNhbiBoYXZlIG1pbmltYWwgZWRpdHMgbWFkZSxcbiAgICAgKiBidXQgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIGRlbGV0ZWQgb3IgYWRkZWQgdG8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXJFbFxuICAgICAqIEBwYXJhbSB7U2V0dGluZ3NUYWJ9IHNldHRpbmdzXG4gICAgICogQG1lbWJlcm9mIFNldHRpbmdzVGFiXG4gICAgICovXG4gICAgaW5zZXJ0VGFza0NvcmVTdGF0dXNTZXR0aW5ncyhjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIHNldHRpbmdzOiBTZXR0aW5nc1RhYikge1xuICAgICAgICBjb25zdCB7IHN0YXR1c1NldHRpbmdzIH0gPSBnZXRTZXR0aW5ncygpO1xuXG4gICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIE9uZSByb3cgcGVyIGNvcmUgc3RhdHVzIGluIHRoZSBzZXR0aW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICBzdGF0dXNTZXR0aW5ncy5jb3JlU3RhdHVzZXMuZm9yRWFjaCgoc3RhdHVzX3R5cGUpID0+IHtcbiAgICAgICAgICAgIGNyZWF0ZVJvd0ZvclRhc2tTdGF0dXMoXG4gICAgICAgICAgICAgICAgY29udGFpbmVyRWwsXG4gICAgICAgICAgICAgICAgc3RhdHVzX3R5cGUsXG4gICAgICAgICAgICAgICAgc3RhdHVzU2V0dGluZ3MuY29yZVN0YXR1c2VzLFxuICAgICAgICAgICAgICAgIHN0YXR1c1NldHRpbmdzLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzLnBsdWdpbixcbiAgICAgICAgICAgICAgICB0cnVlLCAvLyBpc0NvcmVTdGF0dXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHRpbmdzIGZvciBDdXN0b20gVGFzayBTdGF0dXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lckVsXG4gICAgICogQHBhcmFtIHtTZXR0aW5nc1RhYn0gc2V0dGluZ3NcbiAgICAgKiBAbWVtYmVyb2YgU2V0dGluZ3NUYWJcbiAgICAgKi9cbiAgICBpbnNlcnRDdXN0b21UYXNrU3RhdHVzU2V0dGluZ3MoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LCBzZXR0aW5nczogU2V0dGluZ3NUYWIpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXNTZXR0aW5ncyB9ID0gZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBPbmUgcm93IHBlciBjdXN0b20gc3RhdHVzIGluIHRoZSBzZXR0aW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICBzdGF0dXNTZXR0aW5ncy5jdXN0b21TdGF0dXNlcy5mb3JFYWNoKChzdGF0dXNfdHlwZSkgPT4ge1xuICAgICAgICAgICAgY3JlYXRlUm93Rm9yVGFza1N0YXR1cyhcbiAgICAgICAgICAgICAgICBjb250YWluZXJFbCxcbiAgICAgICAgICAgICAgICBzdGF0dXNfdHlwZSxcbiAgICAgICAgICAgICAgICBzdGF0dXNTZXR0aW5ncy5jdXN0b21TdGF0dXNlcyxcbiAgICAgICAgICAgICAgICBzdGF0dXNTZXR0aW5ncyxcbiAgICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5wbHVnaW4sXG4gICAgICAgICAgICAgICAgZmFsc2UsIC8vIGlzQ29yZVN0YXR1c1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2RpdicpO1xuXG4gICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tICdBZGQgTmV3IFRhc2sgU3RhdHVzJyBidXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgICAgY29uc3Qgc2V0dGluZyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKS5hZGRCdXR0b24oKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgLnNldEJ1dHRvblRleHQoJ0FkZCBOZXcgVGFzayBTdGF0dXMnKVxuICAgICAgICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgU3RhdHVzU2V0dGluZ3MuYWRkU3RhdHVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzU2V0dGluZ3MuY3VzdG9tU3RhdHVzZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzQ29uZmlndXJhdGlvbignJywgJycsICcnLCBmYWxzZSwgU3RhdHVzVHlwZS5UT0RPKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlQW5kU2F2ZVN0YXR1c1NldHRpbmdzKHN0YXR1c1NldHRpbmdzLCBzZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXR0aW5nLmluZm9FbC5yZW1vdmUoKTtcblxuICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBBZGQgYWxsIFN0YXR1cyB0eXBlcyBzdXBwb3J0ZWQgYnkgLi4uIGJ1dHRvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgICAgdHlwZSBOYW1lZFRoZW1lID0gW3N0cmluZywgU3RhdHVzQ29sbGVjdGlvbl07XG4gICAgICAgIGNvbnN0IHRoZW1lczogTmFtZWRUaGVtZVtdID0gW1xuICAgICAgICAgICAgLy8gTGlnaHQgYW5kIERhcmsgdGhlbWVzIC0gYWxwaGFiZXRpY2FsIG9yZGVyXG4gICAgICAgICAgICBbJ0FudVBwdWNjaW4gVGhlbWUnLCBUaGVtZXMuYW51cHB1Y2NpblN1cHBvcnRlZFN0YXR1c2VzKCldLFxuICAgICAgICAgICAgWydFYnVsbGllbnR3b3JrcyBUaGVtZScsIFRoZW1lcy5lYnVsbGllbnR3b3Jrc1N1cHBvcnRlZFN0YXR1c2VzKCldLFxuICAgICAgICAgICAgWydJVFMgVGhlbWUgJiBTbFJ2YiBDaGVja2JveGVzJywgVGhlbWVzLml0c1N1cHBvcnRlZFN0YXR1c2VzKCldLFxuICAgICAgICAgICAgWydNaW5pbWFsIFRoZW1lJywgVGhlbWVzLm1pbmltYWxTdXBwb3J0ZWRTdGF0dXNlcygpXSxcbiAgICAgICAgICAgIFsnVGhpbmdzIFRoZW1lJywgVGhlbWVzLnRoaW5nc1N1cHBvcnRlZFN0YXR1c2VzKCldLFxuICAgICAgICAgICAgLy8gRGFyayBvbmx5IHRoZW1lcyAtIGFscGhhYmV0aWNhbCBvcmRlclxuICAgICAgICAgICAgWydBdXJhIFRoZW1lIChEYXJrIG1vZGUgb25seSknLCBUaGVtZXMuYXVyYVN1cHBvcnRlZFN0YXR1c2VzKCldLFxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb2xsZWN0aW9uXSBvZiB0aGVtZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFkZFN0YXR1c2VzU3VwcG9ydGVkQnlUaGlzVGhlbWUgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbCkuYWRkQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGAke25hbWV9OiBBZGQgJHtjb2xsZWN0aW9uLmxlbmd0aH0gc3VwcG9ydGVkIFN0YXR1c2VzYDtcbiAgICAgICAgICAgICAgICBidXR0b24uc2V0QnV0dG9uVGV4dChsYWJlbCkub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFkZEN1c3RvbVN0YXRlc1RvU2V0dGluZ3MoY29sbGVjdGlvbiwgc3RhdHVzU2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYWRkU3RhdHVzZXNTdXBwb3J0ZWRCeVRoaXNUaGVtZS5pbmZvRWwucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAnQWRkIEFsbCBVbmtub3duIFN0YXR1cyBUeXBlcycgYnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4gICAgICAgIGNvbnN0IGFkZEFsbFVua25vd25TdGF0dXNlcyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKS5hZGRCdXR0b24oKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgLnNldEJ1dHRvblRleHQoJ0FkZCBBbGwgVW5rbm93biBTdGF0dXMgVHlwZXMnKVxuICAgICAgICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFza3MgPSB0aGlzLnBsdWdpbi5nZXRUYXNrcygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxTdGF0dXNlcyA9IHRhc2tzIS5tYXAoKHRhc2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLnN0YXR1cztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVua25vd25TdGF0dXNlcyA9IFN0YXR1c1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZmluZFVua25vd25TdGF0dXNlcyhhbGxTdGF0dXNlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bmtub3duU3RhdHVzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdW5rbm93blN0YXR1c2VzLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c1NldHRpbmdzLmFkZFN0YXR1cyhzdGF0dXNTZXR0aW5ncy5jdXN0b21TdGF0dXNlcywgcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB1cGRhdGVBbmRTYXZlU3RhdHVzU2V0dGluZ3Moc3RhdHVzU2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFkZEFsbFVua25vd25TdGF0dXNlcy5pbmZvRWwucmVtb3ZlKCk7XG5cbiAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gJ1Jlc2V0IEN1c3RvbSBTdGF0dXMgVHlwZXMgdG8gRGVmYXVsdHMnIGJ1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICBjb25zdCBjbGVhckN1c3RvbVN0YXR1c2VzID0gbmV3IFNldHRpbmcoY29udGFpbmVyRWwpLmFkZEJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAuc2V0QnV0dG9uVGV4dCgnUmVzZXQgQ3VzdG9tIFN0YXR1cyBUeXBlcyB0byBEZWZhdWx0cycpXG4gICAgICAgICAgICAgICAgLnNldFdhcm5pbmcoKVxuICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgU3RhdHVzU2V0dGluZ3MucmVzZXRBbGxDdXN0b21TdGF0dXNlcyhzdGF0dXNTZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZUFuZFNhdmVTdGF0dXNTZXR0aW5ncyhzdGF0dXNTZXR0aW5ncywgc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgY2xlYXJDdXN0b21TdGF0dXNlcy5pbmZvRWwucmVtb3ZlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgcm93IHRvIHNlZSBhbmQgbW9kaWZ5IHNldHRpbmdzIGZvciBhIHNpbmdsZSB0YXNrIHN0YXR1cyB0eXBlLlxuICogQHBhcmFtIGNvbnRhaW5lckVsXG4gKiBAcGFyYW0gc3RhdHVzVHlwZSAtIFRoZSBzdGF0dXMgdHlwZSB0byBiZSBlZGl0ZWQuXG4gKiBAcGFyYW0gc3RhdHVzZXMgLSBUaGUgbGlzdCBvZiBzdGF0dXNlcyB0aGF0IHN0YXR1c1R5cGUgaXMgc3RvcmVkIGluLlxuICogQHBhcmFtIHN0YXR1c1NldHRpbmdzIC0gQWxsIHRoZSBzdGF0dXMgdHlwZXMgYWxyZWFkeSBpbiB0aGUgdXNlcidzIHNldHRpbmdzLCBFWENFUFQgdGhlIHN0YW5kYXJkIG9uZXMuXG4gKiBAcGFyYW0gc2V0dGluZ3NcbiAqIEBwYXJhbSBwbHVnaW5cbiAqIEBwYXJhbSBpc0NvcmVTdGF0dXMgLSB3aGV0aGVyIHRoZSBzdGF0dXMgaXMgYSBjb3JlIHN0YXR1c1xuICovXG5mdW5jdGlvbiBjcmVhdGVSb3dGb3JUYXNrU3RhdHVzKFxuICAgIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCxcbiAgICBzdGF0dXNUeXBlOiBTdGF0dXNDb25maWd1cmF0aW9uLFxuICAgIHN0YXR1c2VzOiBTdGF0dXNDb25maWd1cmF0aW9uW10sXG4gICAgc3RhdHVzU2V0dGluZ3M6IFN0YXR1c1NldHRpbmdzLFxuICAgIHNldHRpbmdzOiBTZXR0aW5nc1RhYixcbiAgICBwbHVnaW46IFRhc2tzUGx1Z2luLFxuICAgIGlzQ29yZVN0YXR1czogYm9vbGVhbixcbikge1xuICAgIC8vY29uc3QgdGFza1N0YXR1c0RpdiA9IGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdkaXYnKTtcblxuICAgIGNvbnN0IHRhc2tTdGF0dXNQcmV2aWV3ID0gY29udGFpbmVyRWwuY3JlYXRlRWwoJ3ByZScpO1xuICAgIHRhc2tTdGF0dXNQcmV2aWV3LmFkZENsYXNzKCdyb3ctZm9yLXN0YXR1cycpO1xuICAgIHRhc2tTdGF0dXNQcmV2aWV3LnRleHRDb250ZW50ID0gbmV3IFN0YXR1cyhzdGF0dXNUeXBlKS5wcmV2aWV3VGV4dCgpO1xuXG4gICAgY29uc3Qgc2V0dGluZyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKTtcblxuICAgIHNldHRpbmcuaW5mb0VsLnJlcGxhY2VXaXRoKHRhc2tTdGF0dXNQcmV2aWV3KTtcblxuICAgIGlmICghaXNDb3JlU3RhdHVzKSB7XG4gICAgICAgIHNldHRpbmcuYWRkRXh0cmFCdXR0b24oKGV4dHJhKSA9PiB7XG4gICAgICAgICAgICBleHRyYVxuICAgICAgICAgICAgICAgIC5zZXRJY29uKCdjcm9zcycpXG4gICAgICAgICAgICAgICAgLnNldFRvb2x0aXAoJ0RlbGV0ZScpXG4gICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoU3RhdHVzU2V0dGluZ3MuZGVsZXRlU3RhdHVzKHN0YXR1c2VzLCBzdGF0dXNUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlQW5kU2F2ZVN0YXR1c1NldHRpbmdzKHN0YXR1c1NldHRpbmdzLCBzZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0dGluZy5hZGRFeHRyYUJ1dHRvbigoZXh0cmEpID0+IHtcbiAgICAgICAgZXh0cmFcbiAgICAgICAgICAgIC5zZXRJY29uKCdwZW5jaWwnKVxuICAgICAgICAgICAgLnNldFRvb2x0aXAoJ0VkaXQnKVxuICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGFsID0gbmV3IEN1c3RvbVN0YXR1c01vZGFsKHBsdWdpbiwgc3RhdHVzVHlwZSwgaXNDb3JlU3RhdHVzKTtcblxuICAgICAgICAgICAgICAgIG1vZGFsLm9uQ2xvc2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RhbC5zYXZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN0YXR1c1NldHRpbmdzLnJlcGxhY2VTdGF0dXMoc3RhdHVzZXMsIHN0YXR1c1R5cGUsIG1vZGFsLnN0YXR1c0NvbmZpZ3VyYXRpb24oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB1cGRhdGVBbmRTYXZlU3RhdHVzU2V0dGluZ3Moc3RhdHVzU2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBtb2RhbC5vcGVuKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNldHRpbmcuaW5mb0VsLnJlbW92ZSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhZGRDdXN0b21TdGF0ZXNUb1NldHRpbmdzKFxuICAgIHN1cHBvcnRlZFN0YXR1c2VzOiBTdGF0dXNDb2xsZWN0aW9uLFxuICAgIHN0YXR1c1NldHRpbmdzOiBTdGF0dXNTZXR0aW5ncyxcbiAgICBzZXR0aW5nczogU2V0dGluZ3NUYWIsXG4pIHtcbiAgICBjb25zdCBub3RpY2VzID0gU3RhdHVzU2V0dGluZ3MuYnVsa0FkZFN0YXR1c0NvbGxlY3Rpb24oc3RhdHVzU2V0dGluZ3MsIHN1cHBvcnRlZFN0YXR1c2VzKTtcblxuICAgIG5vdGljZXMuZm9yRWFjaCgobm90aWNlKSA9PiB7XG4gICAgICAgIG5ldyBOb3RpY2Uobm90aWNlKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHVwZGF0ZUFuZFNhdmVTdGF0dXNTZXR0aW5ncyhzdGF0dXNTZXR0aW5ncywgc2V0dGluZ3MpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVBbmRTYXZlU3RhdHVzU2V0dGluZ3Moc3RhdHVzVHlwZXM6IFN0YXR1c1NldHRpbmdzLCBzZXR0aW5nczogU2V0dGluZ3NUYWIpIHtcbiAgICB1cGRhdGVTZXR0aW5ncyh7XG4gICAgICAgIHN0YXR1c1NldHRpbmdzOiBzdGF0dXNUeXBlcyxcbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYWN0aXZlIHN0YXR1c2VzLlxuICAgIC8vIFRoaXMgc2F2ZXMgdGhlIHVzZXIgZnJvbSBoYXZpbmcgdG8gcmVzdGFydCBPYnNpZGlhbiBpbiBvcmRlciB0byBhcHBseSB0aGUgY2hhbmdlZCBzdGF0dXMoZXMpLlxuICAgIFN0YXR1c1NldHRpbmdzLmFwcGx5VG9TdGF0dXNSZWdpc3RyeShzdGF0dXNUeXBlcywgU3RhdHVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKSk7XG5cbiAgICBhd2FpdCBzZXR0aW5ncy5zYXZlU2V0dGluZ3ModHJ1ZSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGF0dXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vU3RhdHVzQ29sbGVjdGlvbic7XG5cbi8qKlxuICogU3RhdHVzIHN1cHBvcnRlZCBieSB0aGUgQW51UHB1Y2NpbiB0aGVtZS4ge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9BbnViaXNOZWtoZXQvQW51UHB1Y2Npbn1cbiAqIEBzZWUge0BsaW5rIFN0YXR1c1NldHRpbmdzLmJ1bGtBZGRTdGF0dXNDb2xsZWN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gYW51cHB1Y2NpblN1cHBvcnRlZFN0YXR1c2VzKCkge1xuICAgIGNvbnN0IHp6ejogU3RhdHVzQ29sbGVjdGlvbiA9IFtcbiAgICAgICAgWycgJywgJ1VuY2hlY2tlZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd4JywgJ0NoZWNrZWQnLCAnICcsICdET05FJ10sXG4gICAgICAgIFsnPicsICdSZXNjaGVkdWxlZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyc8JywgJ1NjaGVkdWxlZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWychJywgJ0ltcG9ydGFudCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyctJywgJ0NhbmNlbGxlZCcsICcgJywgJ0NBTkNFTExFRCddLFxuICAgICAgICBbJy8nLCAnSW4gUHJvZ3Jlc3MnLCAneCcsICdJTl9QUk9HUkVTUyddLFxuICAgICAgICBbJz8nLCAnUXVlc3Rpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnKicsICdTdGFyJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ24nLCAnTm90ZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydsJywgJ0xvY2F0aW9uJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2knLCAnSW5mb3JtYXRpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnSScsICdJZGVhJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ1MnLCAnQW1vdW50JywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ3AnLCAnUHJvJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2MnLCAnQ29uJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2InLCAnQm9va21hcmsnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnXCInLCAnUXVvdGUnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnMCcsICdTcGVlY2ggYnViYmxlIDAnLCAnMCcsICdOT05fVEFTSyddLFxuICAgICAgICBbJzEnLCAnU3BlZWNoIGJ1YmJsZSAxJywgJzEnLCAnTk9OX1RBU0snXSxcbiAgICAgICAgWycyJywgJ1NwZWVjaCBidWJibGUgMicsICcyJywgJ05PTl9UQVNLJ10sXG4gICAgICAgIFsnMycsICdTcGVlY2ggYnViYmxlIDMnLCAnMycsICdOT05fVEFTSyddLFxuICAgICAgICBbJzQnLCAnU3BlZWNoIGJ1YmJsZSA0JywgJzQnLCAnTk9OX1RBU0snXSxcbiAgICAgICAgWyc1JywgJ1NwZWVjaCBidWJibGUgNScsICc1JywgJ05PTl9UQVNLJ10sXG4gICAgICAgIFsnNicsICdTcGVlY2ggYnViYmxlIDYnLCAnNicsICdOT05fVEFTSyddLFxuICAgICAgICBbJzcnLCAnU3BlZWNoIGJ1YmJsZSA3JywgJzcnLCAnTk9OX1RBU0snXSxcbiAgICAgICAgWyc4JywgJ1NwZWVjaCBidWJibGUgOCcsICc4JywgJ05PTl9UQVNLJ10sXG4gICAgICAgIFsnOScsICdTcGVlY2ggYnViYmxlIDknLCAnOScsICdOT05fVEFTSyddLFxuICAgIF07XG4gICAgcmV0dXJuIHp6ejtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFN0YXR1c0NvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi9TdGF0dXNDb2xsZWN0aW9uJztcblxuLyoqXG4gKiBTdGF0dXMgc3VwcG9ydGVkIGJ5IHRoZSBBdXJhIHRoZW1lLiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzaHdpbmphZGhhdjgxOC9vYnNpZGlhbi1hdXJhfVxuICogQHNlZSB7QGxpbmsgU3RhdHVzU2V0dGluZ3MuYnVsa0FkZFN0YXR1c0NvbGxlY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXJhU3VwcG9ydGVkU3RhdHVzZXMoKSB7XG4gICAgY29uc3Qgenp6OiBTdGF0dXNDb2xsZWN0aW9uID0gW1xuICAgICAgICBbJyAnLCAnaW5jb21wbGV0ZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd4JywgJ2NvbXBsZXRlIC8gZG9uZScsICcgJywgJ0RPTkUnXSxcbiAgICAgICAgWyctJywgJ2NhbmNlbGxlZCcsICcgJywgJ0NBTkNFTExFRCddLFxuICAgICAgICBbJz4nLCAnZGVmZXJyZWQnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnLycsICdpbiBwcm9ncmVzcywgb3IgaGFsZi1kb25lJywgJ3gnLCAnSU5fUFJPR1JFU1MnXSxcbiAgICAgICAgWychJywgJ0ltcG9ydGFudCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyc/JywgJ3F1ZXN0aW9uJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ1InLCAncmV2aWV3JywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJysnLCAnSW5ib3ggLyB0YXNrIHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBsYXRlcicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydiJywgJ2Jvb2ttYXJrJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0InLCAnYnJhaW5zdG9ybScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydEJywgJ2RlZmVycmVkIG9yIHNjaGVkdWxlZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydJJywgJ0luZm8nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnaScsICdpZGVhJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ04nLCAnbm90ZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydRJywgJ3F1b3RlJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ1cnLCAnd2luIC8gc3VjY2VzcyAvIHJld2FyZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydQJywgJ3BybycsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydDJywgJ2NvbicsICd4JywgJ1RPRE8nXSxcbiAgICBdO1xuICAgIHJldHVybiB6eno7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGF0dXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vU3RhdHVzQ29sbGVjdGlvbic7XG5cbi8qKlxuICogU3RhdHVzIHN1cHBvcnRlZCBieSB0aGUgRWJ1bGxpZW50d29ya3MgdGhlbWUuIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZWJ1bGxpZW50L29ic2lkaWFuLXRoZW1lLWVidWxsaWVudHdvcmtzfVxuICogQHNlZSB7QGxpbmsgU3RhdHVzU2V0dGluZ3MuYnVsa0FkZFN0YXR1c0NvbGxlY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlYnVsbGllbnR3b3Jrc1N1cHBvcnRlZFN0YXR1c2VzKCkge1xuICAgIGNvbnN0IHp6ejogU3RhdHVzQ29sbGVjdGlvbiA9IFtcbiAgICAgICAgWycgJywgJ1VuY2hlY2tlZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd4JywgJ0NoZWNrZWQnLCAnICcsICdET05FJ10sXG4gICAgICAgIFsnLScsICdDYW5jZWxsZWQnLCAnICcsICdDQU5DRUxMRUQnXSxcbiAgICAgICAgWycvJywgJ0luIFByb2dyZXNzJywgJ3gnLCAnSU5fUFJPR1JFU1MnXSxcbiAgICAgICAgWyc+JywgJ0RlZmVycmVkJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJyEnLCAnSW1wb3J0YW50JywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJz8nLCAnUXVlc3Rpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsncicsICdSZXZpZXcnLCAneCcsICdUT0RPJ10sXG4gICAgXTtcbiAgICByZXR1cm4genp6O1xufVxuIiwgImltcG9ydCB0eXBlIHsgU3RhdHVzQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL1N0YXR1c0NvbGxlY3Rpb24nO1xuXG4vKipcbiAqIFN0YXR1cyBzdXBwb3J0ZWQgYnkgdGhlIElUUyB0aGVtZS4ge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9TbFJ2Yi9PYnNpZGlhbi0tSVRTLVRoZW1lfVxuICogVmFsdWVzIHJlY29nbmlzZWQgYnkgVGFza3MgYXJlIGV4Y2x1ZGVkLlxuICogQHNlZSB7QGxpbmsgU3RhdHVzU2V0dGluZ3MuYnVsa0FkZFN0YXR1c0NvbGxlY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdHNTdXBwb3J0ZWRTdGF0dXNlcygpIHtcbiAgICBjb25zdCB6eno6IFN0YXR1c0NvbGxlY3Rpb24gPSBbXG4gICAgICAgIFsnICcsICdVbmNoZWNrZWQnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsneCcsICdSZWd1bGFyJywgJyAnLCAnRE9ORSddLFxuICAgICAgICBbJ1gnLCAnQ2hlY2tlZCcsICcgJywgJ0RPTkUnXSxcbiAgICAgICAgWyctJywgJ0Ryb3BwZWQnLCAnICcsICdDQU5DRUxMRUQnXSxcbiAgICAgICAgWyc+JywgJ0ZvcndhcmQnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnRCcsICdEYXRlJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJz8nLCAnUXVlc3Rpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnLycsICdIYWxmIERvbmUnLCAneCcsICdJTl9QUk9HUkVTUyddLFxuICAgICAgICBbJysnLCAnQWRkJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ1InLCAnUmVzZWFyY2gnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnIScsICdJbXBvcnRhbnQnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnaScsICdJZGVhJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0InLCAnQnJhaW5zdG9ybScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydQJywgJ1BybycsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydDJywgJ0NvbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydRJywgJ1F1b3RlJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ04nLCAnTm90ZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydiJywgJ0Jvb2ttYXJrJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0knLCAnSW5mb3JtYXRpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsncCcsICdQYXJhcGhyYXNlJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0wnLCAnTG9jYXRpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnRScsICdFeGFtcGxlJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0EnLCAnQW5zd2VyJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ3InLCAnUmV3YXJkJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2MnLCAnQ2hvaWNlJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2QnLCAnRG9pbmcnLCAneCcsICdJTl9QUk9HUkVTUyddLFxuICAgICAgICBbJ1QnLCAnVGltZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydAJywgJ0NoYXJhY3RlciAvIFBlcnNvbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd0JywgJ1RhbGsnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnTycsICdPdXRsaW5lIC8gUGxvdCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd+JywgJ0NvbmZsaWN0JywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ1cnLCAnV29ybGQnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnZicsICdDbHVlIC8gRmluZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydGJywgJ0ZvcmVzaGFkb3cnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnSCcsICdGYXZvcml0ZSAvIEhlYWx0aCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWycmJywgJ1N5bWJvbGlzbScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydzJywgJ1NlY3JldCcsICd4JywgJ1RPRE8nXSxcbiAgICBdO1xuICAgIHJldHVybiB6eno7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGF0dXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vU3RhdHVzQ29sbGVjdGlvbic7XG5cbi8qKlxuICogU3RhdHVzIHN1cHBvcnRlZCBieSB0aGUgTWluaW1hbCB0aGVtZS4ge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9rZXBhbm8vb2JzaWRpYW4tbWluaW1hbH1cbiAqIFZhbHVlcyByZWNvZ25pc2VkIGJ5IFRhc2tzIGFyZSBleGNsdWRlZC5cbiAqIEBzZWUge0BsaW5rIFN0YXR1c1NldHRpbmdzLmJ1bGtBZGRTdGF0dXNDb2xsZWN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWluaW1hbFN1cHBvcnRlZFN0YXR1c2VzKCkge1xuICAgIGNvbnN0IHp6ejogU3RhdHVzQ29sbGVjdGlvbiA9IFtcbiAgICAgICAgWycgJywgJ3RvLWRvJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJy8nLCAnaW5jb21wbGV0ZScsICd4JywgJ0lOX1BST0dSRVNTJ10sXG4gICAgICAgIFsneCcsICdkb25lJywgJyAnLCAnRE9ORSddLFxuICAgICAgICBbJy0nLCAnY2FuY2VsZWQnLCAnICcsICdDQU5DRUxMRUQnXSxcbiAgICAgICAgWyc+JywgJ2ZvcndhcmRlZCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyc8JywgJ3NjaGVkdWxpbmcnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnPycsICdxdWVzdGlvbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWychJywgJ2ltcG9ydGFudCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWycqJywgJ3N0YXInLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnXCInLCAncXVvdGUnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnbCcsICdsb2NhdGlvbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydiJywgJ2Jvb2ttYXJrJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2knLCAnaW5mb3JtYXRpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnUycsICdzYXZpbmdzJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0knLCAnaWRlYScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydwJywgJ3Byb3MnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnYycsICdjb25zJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2YnLCAnZmlyZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydrJywgJ2tleScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd3JywgJ3dpbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd1JywgJ3VwJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2QnLCAnZG93bicsICd4JywgJ1RPRE8nXSxcbiAgICBdO1xuICAgIHJldHVybiB6eno7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGF0dXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vU3RhdHVzQ29sbGVjdGlvbic7XG5cbi8qKlxuICogU3RhdHVzIHN1cHBvcnRlZCBieSB0aGUgVGhpbmdzIHRoZW1lLiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2NvbGluZWNrZXJ0L29ic2lkaWFuLXRoaW5nc31cbiAqIEBzZWUge0BsaW5rIFN0YXR1c1NldHRpbmdzLmJ1bGtBZGRTdGF0dXNDb2xsZWN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGhpbmdzU3VwcG9ydGVkU3RhdHVzZXMoKSB7XG4gICAgY29uc3Qgenp6OiBTdGF0dXNDb2xsZWN0aW9uID0gW1xuICAgICAgICAvLyBCYXNpY1xuICAgICAgICBbJyAnLCAndG8tZG8nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnLycsICdpbmNvbXBsZXRlJywgJ3gnLCAnSU5fUFJPR1JFU1MnXSxcbiAgICAgICAgWyd4JywgJ2RvbmUnLCAnICcsICdET05FJ10sXG4gICAgICAgIFsnLScsICdjYW5jZWxlZCcsICcgJywgJ0NBTkNFTExFRCddLFxuICAgICAgICBbJz4nLCAnZm9yd2FyZGVkJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJzwnLCAnc2NoZWR1bGluZycsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgLy8gRXh0cmFzXG4gICAgICAgIFsnPycsICdxdWVzdGlvbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWychJywgJ2ltcG9ydGFudCcsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWycqJywgJ3N0YXInLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnXCInLCAncXVvdGUnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnbCcsICdsb2NhdGlvbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydiJywgJ2Jvb2ttYXJrJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2knLCAnaW5mb3JtYXRpb24nLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnUycsICdzYXZpbmdzJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ0knLCAnaWRlYScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydwJywgJ3Byb3MnLCAneCcsICdUT0RPJ10sXG4gICAgICAgIFsnYycsICdjb25zJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2YnLCAnZmlyZScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWydrJywgJ2tleScsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd3JywgJ3dpbicsICd4JywgJ1RPRE8nXSxcbiAgICAgICAgWyd1JywgJ3VwJywgJ3gnLCAnVE9ETyddLFxuICAgICAgICBbJ2QnLCAnZG93bicsICd4JywgJ1RPRE8nXSxcbiAgICBdO1xuICAgIHJldHVybiB6eno7XG59XG4iLCAiaW1wb3J0IHsgTW9kYWwsIE5vdGljZSwgU2V0dGluZywgVGV4dENvbXBvbmVudCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgU3RhdHVzQ29uZmlndXJhdGlvbiwgU3RhdHVzVHlwZSB9IGZyb20gJy4uL1N0YXR1c0NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgU3RhdHVzVmFsaWRhdG9yIH0gZnJvbSAnLi4vU3RhdHVzVmFsaWRhdG9yJztcbmltcG9ydCB7IFN0YXR1cyB9IGZyb20gJy4uL1N0YXR1cyc7XG5cbmNvbnN0IHZhbGlkYXRvciA9IG5ldyBTdGF0dXNWYWxpZGF0b3IoKTtcblxuZXhwb3J0IGNsYXNzIEN1c3RvbVN0YXR1c01vZGFsIGV4dGVuZHMgTW9kYWwge1xuICAgIHN0YXR1c1N5bWJvbDogc3RyaW5nO1xuICAgIHN0YXR1c05hbWU6IHN0cmluZztcbiAgICBzdGF0dXNOZXh0U3ltYm9sOiBzdHJpbmc7XG4gICAgc3RhdHVzQXZhaWxhYmxlQXNDb21tYW5kOiBib29sZWFuO1xuICAgIHR5cGU6IFN0YXR1c1R5cGU7XG5cbiAgICBzYXZlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc0NvcmVTdGF0dXM6IGJvb2xlYW47XG4gICAgY29uc3RydWN0b3IocHVibGljIHBsdWdpbjogUGx1Z2luLCBzdGF0dXNUeXBlOiBTdGF0dXNDb25maWd1cmF0aW9uLCBpc0NvcmVTdGF0dXM6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocGx1Z2luLmFwcCk7XG4gICAgICAgIHRoaXMuc3RhdHVzU3ltYm9sID0gc3RhdHVzVHlwZS5zeW1ib2w7XG4gICAgICAgIHRoaXMuc3RhdHVzTmFtZSA9IHN0YXR1c1R5cGUubmFtZTtcbiAgICAgICAgdGhpcy5zdGF0dXNOZXh0U3ltYm9sID0gc3RhdHVzVHlwZS5uZXh0U3RhdHVzU3ltYm9sO1xuICAgICAgICB0aGlzLnN0YXR1c0F2YWlsYWJsZUFzQ29tbWFuZCA9IHN0YXR1c1R5cGUuYXZhaWxhYmxlQXNDb21tYW5kO1xuICAgICAgICB0aGlzLnR5cGUgPSBzdGF0dXNUeXBlLnR5cGU7XG4gICAgICAgIHRoaXMuaXNDb3JlU3RhdHVzID0gaXNDb3JlU3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHtAbGluayBTdGF0dXNDb25maWd1cmF0aW9ufSBmcm9tIHRoZSBtb2RhbCdzIGNvbnRlbnRzXG4gICAgICovXG4gICAgcHVibGljIHN0YXR1c0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RhdHVzQ29uZmlndXJhdGlvbihcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzU3ltYm9sLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXNOYW1lLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXNOZXh0U3ltYm9sLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXNBdmFpbGFibGVBc0NvbW1hbmQsXG4gICAgICAgICAgICB0aGlzLnR5cGUsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYXN5bmMgZGlzcGxheSgpIHtcbiAgICAgICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cbiAgICAgICAgY29udGVudEVsLmVtcHR5KCk7XG5cbiAgICAgICAgY29uc3Qgc2V0dGluZ0RpdiA9IGNvbnRlbnRFbC5jcmVhdGVEaXYoKTtcbiAgICAgICAgLy9jb25zdCB0aXRsZSA9IHRoaXMudGl0bGUgPz8gJy4uLic7XG5cbiAgICAgICAgbGV0IHN0YXR1c1N5bWJvbFRleHQ6IFRleHRDb21wb25lbnQ7XG4gICAgICAgIG5ldyBTZXR0aW5nKHNldHRpbmdEaXYpXG4gICAgICAgICAgICAuc2V0TmFtZSgnVGFzayBTdGF0dXMgU3ltYm9sJylcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICdUaGlzIGlzIHRoZSBjaGFyYWN0ZXIgYmV0d2VlbiB0aGUgc3F1YXJlIGJyYWNlcy4gKEl0IGNhbiBvbmx5IGJlIGVkaXRlZCBmb3IgQ3VzdG9tIHN0YXR1c2VzLCBhbmQgbm90IENvcmUgc3RhdHVzZXMuKScsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgIHN0YXR1c1N5bWJvbFRleHQgPSB0ZXh0O1xuICAgICAgICAgICAgICAgIHRleHQuc2V0VmFsdWUodGhpcy5zdGF0dXNTeW1ib2wpLm9uQ2hhbmdlKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzU3ltYm9sID0gdjtcbiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tU3RhdHVzTW9kYWwuc2V0VmFsaWQodGV4dCwgdmFsaWRhdG9yLnZhbGlkYXRlU3ltYm9sKHRoaXMuc3RhdHVzQ29uZmlndXJhdGlvbigpKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnNldERpc2FibGVkKHRoaXMuaXNDb3JlU3RhdHVzKVxuICAgICAgICAgICAgLnRoZW4oKF9zZXR0aW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gU2hvdyBhbnkgZXJyb3IgaWYgdGhlIGluaXRpYWwgdmFsdWUgbG9hZGVkIGlzIGluY29ycmVjdC5cbiAgICAgICAgICAgICAgICBDdXN0b21TdGF0dXNNb2RhbC5zZXRWYWxpZChzdGF0dXNTeW1ib2xUZXh0LCB2YWxpZGF0b3IudmFsaWRhdGVTeW1ib2wodGhpcy5zdGF0dXNDb25maWd1cmF0aW9uKCkpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBzdGF0dXNOYW1lVGV4dDogVGV4dENvbXBvbmVudDtcbiAgICAgICAgbmV3IFNldHRpbmcoc2V0dGluZ0RpdilcbiAgICAgICAgICAgIC5zZXROYW1lKCdUYXNrIFN0YXR1cyBOYW1lJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdUaGlzIGlzIHRoZSBmcmllbmRseSBuYW1lIG9mIHRoZSB0YXNrIHN0YXR1cy4nKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+IHtcbiAgICAgICAgICAgICAgICBzdGF0dXNOYW1lVGV4dCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnN0YXR1c05hbWUpLm9uQ2hhbmdlKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTmFtZSA9IHY7XG4gICAgICAgICAgICAgICAgICAgIEN1c3RvbVN0YXR1c01vZGFsLnNldFZhbGlkKHRleHQsIHZhbGlkYXRvci52YWxpZGF0ZU5hbWUodGhpcy5zdGF0dXNDb25maWd1cmF0aW9uKCkpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoX3NldHRpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBDdXN0b21TdGF0dXNNb2RhbC5zZXRWYWxpZChzdGF0dXNOYW1lVGV4dCwgdmFsaWRhdG9yLnZhbGlkYXRlTmFtZSh0aGlzLnN0YXR1c0NvbmZpZ3VyYXRpb24oKSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHN0YXR1c05leHRTeW1ib2xUZXh0OiBUZXh0Q29tcG9uZW50O1xuICAgICAgICBuZXcgU2V0dGluZyhzZXR0aW5nRGl2KVxuICAgICAgICAgICAgLnNldE5hbWUoJ1Rhc2sgTmV4dCBTdGF0dXMgU3ltYm9sJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdXaGVuIGNsaWNrZWQgb24gdGhpcyBpcyB0aGUgc3ltYm9sIHRoYXQgc2hvdWxkIGJlIHVzZWQgbmV4dC4nKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+IHtcbiAgICAgICAgICAgICAgICBzdGF0dXNOZXh0U3ltYm9sVGV4dCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnN0YXR1c05leHRTeW1ib2wpLm9uQ2hhbmdlKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTmV4dFN5bWJvbCA9IHY7XG4gICAgICAgICAgICAgICAgICAgIEN1c3RvbVN0YXR1c01vZGFsLnNldFZhbGlkKHRleHQsIHZhbGlkYXRvci52YWxpZGF0ZU5leHRTeW1ib2wodGhpcy5zdGF0dXNDb25maWd1cmF0aW9uKCkpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoX3NldHRpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBDdXN0b21TdGF0dXNNb2RhbC5zZXRWYWxpZChcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzTmV4dFN5bWJvbFRleHQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZU5leHRTeW1ib2wodGhpcy5zdGF0dXNDb25maWd1cmF0aW9uKCkpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhzZXR0aW5nRGl2KVxuICAgICAgICAgICAgLnNldE5hbWUoJ1Rhc2sgU3RhdHVzIFR5cGUnKVxuICAgICAgICAgICAgLnNldERlc2MoJ0NvbnRyb2wgaG93IHRoZSBzdGF0dXMgYmVoYXZlcyBmb3Igc2VhcmNoaW5nIGFuZCB0b2dnbGluZy4nKVxuICAgICAgICAgICAgLmFkZERyb3Bkb3duKChkcm9wZG93bikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVzID0gW1xuICAgICAgICAgICAgICAgICAgICBTdGF0dXNUeXBlLlRPRE8sXG4gICAgICAgICAgICAgICAgICAgIFN0YXR1c1R5cGUuSU5fUFJPR1JFU1MsXG4gICAgICAgICAgICAgICAgICAgIFN0YXR1c1R5cGUuRE9ORSxcbiAgICAgICAgICAgICAgICAgICAgU3RhdHVzVHlwZS5DQU5DRUxMRUQsXG4gICAgICAgICAgICAgICAgICAgIFN0YXR1c1R5cGUuTk9OX1RBU0ssXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB0eXBlcy5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbihzLCBzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnR5cGUpLm9uQ2hhbmdlKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IFN0YXR1cy5nZXRUeXBlRnJvbVN0YXR1c1R5cGVTdHJpbmcodik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoU3RhdHVzLnRhc2tzUGx1Z2luQ2FuQ3JlYXRlQ29tbWFuZHNGb3JTdGF0dXNlcygpKSB7XG4gICAgICAgICAgICBuZXcgU2V0dGluZyhzZXR0aW5nRGl2KVxuICAgICAgICAgICAgICAgIC5zZXROYW1lKCdBdmFpbGFibGUgYXMgY29tbWFuZCcpXG4gICAgICAgICAgICAgICAgLnNldERlc2MoXG4gICAgICAgICAgICAgICAgICAgICdJZiBlbmFibGVkIHRoaXMgc3RhdHVzIHdpbGwgYmUgYXZhaWxhYmxlIGFzIGEgY29tbWFuZCBzbyB5b3UgY2FuIGFzc2lnbiBhIGhvdGtleSBhbmQgdG9nZ2xlIHRoZSBzdGF0dXMgdXNpbmcgaXQuJyxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnN0YXR1c0F2YWlsYWJsZUFzQ29tbWFuZCkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0F2YWlsYWJsZUFzQ29tbWFuZCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvb3RlckVsID0gY29udGVudEVsLmNyZWF0ZURpdigpO1xuICAgICAgICBjb25zdCBmb290ZXJCdXR0b25zID0gbmV3IFNldHRpbmcoZm9vdGVyRWwpO1xuICAgICAgICBmb290ZXJCdXR0b25zLmFkZEJ1dHRvbigoYikgPT4ge1xuICAgICAgICAgICAgYi5zZXRUb29sdGlwKCdTYXZlJylcbiAgICAgICAgICAgICAgICAuc2V0SWNvbignY2hlY2ttYXJrJylcbiAgICAgICAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRvci52YWxpZGF0ZSh0aGlzLnN0YXR1c0NvbmZpZ3VyYXRpb24oKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9ycy5qb2luKCdcXG4nKSArICdcXG5cXG4nICsgJ0ZpeCBlcnJvcnMgYmVmb3JlIHNhdmluZy4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5kZWJ1ZyhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9vdGVyQnV0dG9ucy5hZGRFeHRyYUJ1dHRvbigoYikgPT4ge1xuICAgICAgICAgICAgYi5zZXRJY29uKCdjcm9zcycpXG4gICAgICAgICAgICAgICAgLnNldFRvb2x0aXAoJ0NhbmNlbCcpXG4gICAgICAgICAgICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGVUaXRsZShhZG1vbml0aW9uUHJldmlldzogSFRNTEVsZW1lbnQsIHRpdGxlOiBzdHJpbmcpIHtcbiAgICAvLyAgICAgbGV0IHRpdGxlU3BhbiA9IGFkbW9uaXRpb25QcmV2aWV3LnF1ZXJ5U2VsZWN0b3IoJy5hZG1vbml0aW9uLXRpdGxlLWNvbnRlbnQnKTtcbiAgICAvLyAgICAgbGV0IGljb25FbCA9IGFkbW9uaXRpb25QcmV2aWV3LnF1ZXJ5U2VsZWN0b3IoJy5hZG1vbml0aW9uLXRpdGxlLWljb24nKTtcbiAgICAvLyAgICAgdGl0bGVTcGFuLnRleHRDb250ZW50ID0gdGl0bGU7XG4gICAgLy8gICAgIHRpdGxlU3Bhbi5wcmVwZW5kKGljb25FbCk7XG4gICAgLy8gfVxuICAgIG9uT3BlbigpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNldFZhbGlkYXRpb25FcnJvcih0ZXh0SW5wdXQ6IFRleHRDb21wb25lbnQpIHtcbiAgICAgICAgdGV4dElucHV0LmlucHV0RWwuYWRkQ2xhc3MoJ3Rhc2tzLXNldHRpbmdzLWlzLWludmFsaWQnKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVtb3ZlVmFsaWRhdGlvbkVycm9yKHRleHRJbnB1dDogVGV4dENvbXBvbmVudCkge1xuICAgICAgICB0ZXh0SW5wdXQuaW5wdXRFbC5yZW1vdmVDbGFzcygndGFza3Mtc2V0dGluZ3MtaXMtaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHNldFZhbGlkKHRleHQ6IFRleHRDb21wb25lbnQsIG1lc3NhZ2VzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCB2YWxpZCA9IG1lc3NhZ2VzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgICBDdXN0b21TdGF0dXNNb2RhbC5yZW1vdmVWYWxpZGF0aW9uRXJyb3IodGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBDdXN0b21TdGF0dXNNb2RhbC5zZXRWYWxpZGF0aW9uRXJyb3IodGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdGF0dXNDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9TdGF0dXNDb25maWd1cmF0aW9uJztcbmltcG9ydCB7IFN0YXR1c1R5cGUgfSBmcm9tICcuL1N0YXR1c0NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBTdGF0dXNDb2xsZWN0aW9uRW50cnkgfSBmcm9tICcuL1N0YXR1c0NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi9TdGF0dXMnO1xuaW1wb3J0IHsgU3RhdHVzUmVnaXN0cnkgfSBmcm9tICcuL1N0YXR1c1JlZ2lzdHJ5JztcblxuZXhwb3J0IGNsYXNzIFN0YXR1c1ZhbGlkYXRvciB7XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRhdGUgaW4gdGhpcyBvYmplY3QgaXMgdmFsaWQsIGFuZCByZXR1cm4gZXJyb3IgbWVzc2FnZShzKSBmb3IgZGlzcGxheSBpZiBub3QuXG4gICAgICovXG4gICAgcHVibGljIHZhbGlkYXRlKHN0YXR1c0NvbmZpZ3VyYXRpb246IFN0YXR1c0NvbmZpZ3VyYXRpb24pOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAvLyBNZXNzYWdlcyBhcmUgYWRkZWQgaW4gdGhlIG9yZGVyIGZpZWxkcyBhcmUgc2hvd24gd2hlbiBlZGl0aW5nIHN0YXR1c2VzLlxuICAgICAgICBlcnJvcnMucHVzaCguLi50aGlzLnZhbGlkYXRlU3ltYm9sKHN0YXR1c0NvbmZpZ3VyYXRpb24pKTtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4udGhpcy52YWxpZGF0ZU5hbWUoc3RhdHVzQ29uZmlndXJhdGlvbikpO1xuICAgICAgICBlcnJvcnMucHVzaCguLi50aGlzLnZhbGlkYXRlTmV4dFN5bWJvbChzdGF0dXNDb25maWd1cmF0aW9uKSk7XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBkYXRhIGluIFN0YXR1c0NvbGxlY3Rpb24gbGlzdHMuIFRoZXNlIGFyZSB0aGUgZGVzY3JpcHRpb25zIG9mIHN0YXR1c2VzIGluIHZhcmlvdXMgdGhlbWVzLFxuICAgICAqIHRoYXQgYXJlIGltcG9ydGVkIHZpYSBvbmUtY2xpY2sgYnV0dG9ucyBpbiB0aGUgQ3VzdG9tIFN0YXR1cyBzZXR0aW5ncy5cbiAgICAgKlxuICAgICAqIFRoaXMgZG9lcyBhIGZldyBjaGVja3MgdG8gZ3VhcmQgYWdhaW5zdCBodW1hbiBlcnJvciB3aGVuIGNyZWF0aW5nIHRoZSBsaXN0cywgYW5kIHRoZW5cbiAgICAgKiBhbHNvIGNhbGxzIHtAbGluayB2YWxpZGF0ZX0gdG9vLlxuICAgICAqIEBwYXJhbSBlbnRyeVxuICAgICAqL1xuICAgIHB1YmxpYyB2YWxpZGF0ZVN0YXR1c0NvbGxlY3Rpb25FbnRyeShlbnRyeTogU3RhdHVzQ29sbGVjdGlvbkVudHJ5KSB7XG4gICAgICAgIGNvbnN0IFtzeW1ib2wsIF9uYW1lLCBuZXh0U3RhdHVzU3ltYm9sLCB0eXBlQXNTdHJpbmddID0gZW50cnk7XG5cbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIC8vIENoZWNrcyB0aGF0IGNhbiBvbmx5IGJlIGRvbmUgb24gdGhlIHJhdyBkYXRhLlxuICAgICAgICAvLyBTdGF0dXMuY3JlYXRlRnJvbUltcG9ydGVkVmFsdWUoKSBmYWxscyBiYWNrIHRvIFN0YXR1c1R5cGUuVE9ETyBpZiB0aGVcbiAgICAgICAgLy8gdHlwZSBzdHJpbmcgaXMgbm90IHJlY29nbmlzZWQsIHNvIHdlIGhhdmUgdG8gdGVzdCB0aGF0IGZpcnN0LlxuICAgICAgICBlcnJvcnMucHVzaCguLi50aGlzLnZhbGlkYXRlVHlwZSh0eXBlQXNTdHJpbmcpKTtcblxuICAgICAgICAvLyBGb3IgdXNlcnMsIGl0IGlzIHZhbGlkIHRvIGhhdmUgYSBzdGF0dXMgdGhhdCB0b2dnbGVzIHRvIGl0c2VsZi5cbiAgICAgICAgLy8gRm9yIGltcG9ydGVkIGRhdGEgZm9yIHRoZW1lcywgaXQgc2VlbXMgd29ydGggcHJldmVudGluZyB0aGF0IHNpdHVhdGlvbixcbiAgICAgICAgLy8gdG8gZ3VhcmQgYWdhaW5zdCBodW1hbiBlcnJvciB3aGVuIHNldHRpbmcgdXAgdGhlIHN0YXR1cyBjb2xsZWN0aW9ucy5cbiAgICAgICAgLy8gQnV0IG1ha2UgYW4gZXhjZXB0aW9uIGZvciBhbnkgbm9uLXRhc2tzIGluIGltcG9ydGVkIGRhdGEuXG4gICAgICAgIGlmIChzeW1ib2wgPT09IG5leHRTdGF0dXNTeW1ib2wgJiYgdHlwZUFzU3RyaW5nICE9PSAnTk9OX1RBU0snKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChgU3RhdHVzIHN5bWJvbCAnJHtzeW1ib2x9JyB0b2dnbGVzIHRvIGl0c2VsZmApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHJhdyBkYXRhIHdhcyBub3QgdmFsaWQsIHJldHVybiBub3csIHRvIGF2b2lkIHBvdGVudGlhbGx5IG1pc2xlYWRpbmdcbiAgICAgICAgLy8gZXJyb3JzIGZyb20gbGF0ZXIgY2hlY2tzLlxuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gU3RhdHVzLmNyZWF0ZUZyb21JbXBvcnRlZFZhbHVlKGVudHJ5KS5jb25maWd1cmF0aW9uO1xuICAgICAgICBlcnJvcnMucHVzaCguLi50aGlzLnZhbGlkYXRlU3ltYm9sVHlwZUNvbnZlbnRpb25zKGNvbmZpZ3VyYXRpb24pKTtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4udGhpcy52YWxpZGF0ZShjb25maWd1cmF0aW9uKSk7XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGVTeW1ib2woc3RhdHVzQ29uZmlndXJhdGlvbjogU3RhdHVzQ29uZmlndXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFN0YXR1c1ZhbGlkYXRvci52YWxpZGF0ZU9uZVN5bWJvbChzdGF0dXNDb25maWd1cmF0aW9uLnN5bWJvbCwgJ1Rhc2sgU3RhdHVzIFN5bWJvbCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZU5leHRTeW1ib2woc3RhdHVzQ29uZmlndXJhdGlvbjogU3RhdHVzQ29uZmlndXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFN0YXR1c1ZhbGlkYXRvci52YWxpZGF0ZU9uZVN5bWJvbChzdGF0dXNDb25maWd1cmF0aW9uLm5leHRTdGF0dXNTeW1ib2wsICdUYXNrIE5leHQgU3RhdHVzIFN5bWJvbCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZU5hbWUoc3RhdHVzQ29uZmlndXJhdGlvbjogU3RhdHVzQ29uZmlndXJhdGlvbikge1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChzdGF0dXNDb25maWd1cmF0aW9uLm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaCgnVGFzayBTdGF0dXMgTmFtZSBjYW5ub3QgYmUgZW1wdHkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGVUeXBlKHN5bWJvbE5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzVHlwZUVsZW1lbnQgPSBTdGF0dXNUeXBlW3N5bWJvbE5hbWUgYXMga2V5b2YgdHlwZW9mIFN0YXR1c1R5cGVdO1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICghc3RhdHVzVHlwZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGBTdGF0dXMgVHlwZSBcIiR7c3ltYm9sTmFtZX1cIiBpcyBub3QgYSB2YWxpZCB0eXBlYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXR1c1R5cGVFbGVtZW50ID09IFN0YXR1c1R5cGUuRU1QVFkpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKCdTdGF0dXMgVHlwZSBcIkVNUFRZXCIgaXMgbm90IHBlcm1pdHRlZCBpbiB1c2VyIGRhdGEnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZVN5bWJvbFR5cGVDb252ZW50aW9ucyhjb25maWd1cmF0aW9uOiBTdGF0dXNDb25maWd1cmF0aW9uKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgY29uc3Qgc3ltYm9sID0gY29uZmlndXJhdGlvbi5zeW1ib2w7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IFN0YXR1c1JlZ2lzdHJ5KCk7XG4gICAgICAgIGNvbnN0IHN5bWJvbFRvU2VhcmNoRm9yID0gc3ltYm9sID09PSAnWCcgPyAneCcgOiBzeW1ib2w7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRTdGF0dXNGcm9tUmVnaXN0cnkgPSByZWdpc3RyeS5ieVN5bWJvbChzeW1ib2xUb1NlYXJjaEZvcik7XG4gICAgICAgIGlmIChkZWZhdWx0U3RhdHVzRnJvbVJlZ2lzdHJ5LnR5cGUgIT09IFN0YXR1c1R5cGUuRU1QVFkpIHtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLm5leHRTdGF0dXNTeW1ib2wgIT09IGRlZmF1bHRTdGF0dXNGcm9tUmVnaXN0cnkubmV4dFN0YXR1c1N5bWJvbCkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgTmV4dCBTdGF0dXMgU3ltYm9sIGZvciBzeW1ib2wgJyR7c3ltYm9sfSc6ICcke2NvbmZpZ3VyYXRpb24ubmV4dFN0YXR1c1N5bWJvbH0nIGlzIGluY29uc2lzdGVudCB3aXRoIGNvbnZlbnRpb24gJyR7ZGVmYXVsdFN0YXR1c0Zyb21SZWdpc3RyeS5uZXh0U3RhdHVzU3ltYm9sfSdgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi50eXBlICE9PSBkZWZhdWx0U3RhdHVzRnJvbVJlZ2lzdHJ5LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYFN0YXR1cyBUeXBlIGZvciBzeW1ib2wgJyR7c3ltYm9sfSc6ICcke2NvbmZpZ3VyYXRpb24udHlwZX0nIGlzIGluY29uc2lzdGVudCB3aXRoIGNvbnZlbnRpb24gJyR7ZGVmYXVsdFN0YXR1c0Zyb21SZWdpc3RyeS50eXBlfSdgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHZhbGlkYXRlT25lU3ltYm9sKHN5bWJvbDogc3RyaW5nLCBzeW1ib2xOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKHN5bWJvbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke3N5bWJvbE5hbWV9IGNhbm5vdCBiZSBlbXB0eS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzeW1ib2wubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7c3ltYm9sTmFtZX0gKFwiJHtzeW1ib2x9XCIpIG11c3QgYmUgYSBzaW5nbGUgY2hhcmFjdGVyLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEFwcCwgRWRpdG9yLCBFZGl0b3JTdWdnZXN0LCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgRWRpdG9yUG9zaXRpb24sIEVkaXRvclN1Z2dlc3RDb250ZXh0LCBFZGl0b3JTdWdnZXN0VHJpZ2dlckluZm8gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgU2V0dGluZ3MgfSBmcm9tICcuLi9Db25maWcvU2V0dGluZ3MnO1xuaW1wb3J0ICogYXMgdGFzayBmcm9tICcuLi9UYXNrJztcbmltcG9ydCB7IGJ1aWxkU3VnZ2VzdGlvbnMgfSBmcm9tICcuL1N1Z2dlc3Rvcic7XG5pbXBvcnQgdHlwZSB7IFN1Z2dlc3RJbmZvIH0gZnJvbSAnLi9TdWdnZXN0b3InO1xuXG5leHBvcnQgdHlwZSBTdWdnZXN0SW5mb1dpdGhDb250ZXh0ID0gU3VnZ2VzdEluZm8gJiB7XG4gICAgY29udGV4dDogRWRpdG9yU3VnZ2VzdENvbnRleHQ7XG59O1xuXG5leHBvcnQgY2xhc3MgRWRpdG9yU3VnZ2VzdG9yIGV4dGVuZHMgRWRpdG9yU3VnZ2VzdDxTdWdnZXN0SW5mb1dpdGhDb250ZXh0PiB7XG4gICAgcHJpdmF0ZSBzZXR0aW5nczogU2V0dGluZ3M7XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgc2V0dGluZ3M6IFNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKGFwcCk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB9XG5cbiAgICBvblRyaWdnZXIoY3Vyc29yOiBFZGl0b3JQb3NpdGlvbiwgZWRpdG9yOiBFZGl0b3IsIF9maWxlOiBURmlsZSk6IEVkaXRvclN1Z2dlc3RUcmlnZ2VySW5mbyB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuYXV0b1N1Z2dlc3RJbkVkaXRvcikgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBlZGl0b3IuZ2V0TGluZShjdXJzb3IubGluZSk7XG4gICAgICAgIGlmIChsaW5lLmNvbnRhaW5zKHRoaXMuc2V0dGluZ3MuZ2xvYmFsRmlsdGVyKSAmJiBsaW5lLm1hdGNoKHRhc2suVGFza1JlZ3VsYXJFeHByZXNzaW9ucy50YXNrUmVnZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiB7IGxpbmU6IGN1cnNvci5saW5lLCBjaDogMCB9LFxuICAgICAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAgICAgICBsaW5lOiBjdXJzb3IubGluZSxcbiAgICAgICAgICAgICAgICAgICAgY2g6IGxpbmUubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcXVlcnk6IGxpbmUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldFN1Z2dlc3Rpb25zKGNvbnRleHQ6IEVkaXRvclN1Z2dlc3RDb250ZXh0KTogU3VnZ2VzdEluZm9XaXRoQ29udGV4dFtdIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGNvbnRleHQucXVlcnk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDdXJzb3IgPSBjb250ZXh0LmVkaXRvci5nZXRDdXJzb3IoKTtcblxuICAgICAgICBjb25zdCBzdWdnZXN0aW9uczogU3VnZ2VzdEluZm9bXSA9IGJ1aWxkU3VnZ2VzdGlvbnMobGluZSwgY3VycmVudEN1cnNvci5jaCwgdGhpcy5zZXR0aW5ncyk7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBlZGl0b3IgY29udGV4dCB0byBhbGwgdGhlIHN1Z2dlc3Rpb25zXG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zV2l0aENvbnRleHQ6IFN1Z2dlc3RJbmZvV2l0aENvbnRleHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHN1Z2dlc3Rpb24gb2Ygc3VnZ2VzdGlvbnMpIHN1Z2dlc3Rpb25zV2l0aENvbnRleHQucHVzaCh7IC4uLnN1Z2dlc3Rpb24sIGNvbnRleHQ6IGNvbnRleHQgfSk7XG5cbiAgICAgICAgcmV0dXJuIHN1Z2dlc3Rpb25zV2l0aENvbnRleHQ7XG4gICAgfVxuXG4gICAgcmVuZGVyU3VnZ2VzdGlvbih2YWx1ZTogU3VnZ2VzdEluZm9XaXRoQ29udGV4dCwgZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGVsLnNldFRleHQodmFsdWUuZGlzcGxheVRleHQpO1xuICAgIH1cblxuICAgIHNlbGVjdFN1Z2dlc3Rpb24odmFsdWU6IFN1Z2dlc3RJbmZvV2l0aENvbnRleHQsIF9ldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHZhbHVlLmNvbnRleHQuZWRpdG9yO1xuICAgICAgICBpZiAodmFsdWUuc3VnZ2VzdGlvblR5cGUgPT09ICdlbXB0eScpIHtcbiAgICAgICAgICAgIC8vIENsb3NlIHRoZSBzdWdnZXN0aW9uIGRpYWxvZyBhbmQgc2ltdWxhdGUgYW4gRW50ZXIgcHJlc3MgdG8gdGhlIGVkaXRvclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRDbG9uZSA9IG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywge1xuICAgICAgICAgICAgICAgIGNvZGU6ICdFbnRlcicsXG4gICAgICAgICAgICAgICAga2V5OiAnRW50ZXInLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAoZWRpdG9yIGFzIGFueSk/LmNtPy5jb250ZW50RE9NPy5kaXNwYXRjaEV2ZW50KGV2ZW50Q2xvbmUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDdXJzb3IgPSB2YWx1ZS5jb250ZXh0LmVkaXRvci5nZXRDdXJzb3IoKTtcbiAgICAgICAgY29uc3QgcmVwbGFjZUZyb20gPSB7XG4gICAgICAgICAgICBsaW5lOiBjdXJyZW50Q3Vyc29yLmxpbmUsXG4gICAgICAgICAgICBjaDogdmFsdWUuaW5zZXJ0QXQgPz8gY3VycmVudEN1cnNvci5jaCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVwbGFjZVRvID0gdmFsdWUuaW5zZXJ0U2tpcFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBsaW5lOiBjdXJyZW50Q3Vyc29yLmxpbmUsXG4gICAgICAgICAgICAgICAgICBjaDogcmVwbGFjZUZyb20uY2ggKyB2YWx1ZS5pbnNlcnRTa2lwLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFsdWUuY29udGV4dC5lZGl0b3IucmVwbGFjZVJhbmdlKHZhbHVlLmFwcGVuZFRleHQsIHJlcGxhY2VGcm9tLCByZXBsYWNlVG8pO1xuICAgICAgICB2YWx1ZS5jb250ZXh0LmVkaXRvci5zZXRDdXJzb3Ioe1xuICAgICAgICAgICAgbGluZTogY3VycmVudEN1cnNvci5saW5lLFxuICAgICAgICAgICAgY2g6IHJlcGxhY2VGcm9tLmNoICsgdmFsdWUuYXBwZW5kVGV4dC5sZW5ndGgsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNldHRpbmdzIH0gZnJvbSAnLi4vQ29uZmlnL1NldHRpbmdzJztcbmltcG9ydCB7IERhdGVQYXJzZXIgfSBmcm9tICcuLi9RdWVyeS9EYXRlUGFyc2VyJztcbmltcG9ydCB7IGRvQXV0b2NvbXBsZXRlIH0gZnJvbSAnLi4vRGF0ZUFiYnJldmlhdGlvbnMnO1xuaW1wb3J0IHsgUmVjdXJyZW5jZSB9IGZyb20gJy4uL1JlY3VycmVuY2UnO1xuXG5pbXBvcnQgKiBhcyB0YXNrIGZyb20gJy4uL1Rhc2snO1xuXG5jb25zdCBkYXRlUHJlZml4Q2hhcmFjdGVycyA9IGAke3Rhc2suc3RhcnREYXRlU3ltYm9sfSR7dGFzay5zY2hlZHVsZWREYXRlU3ltYm9sfSR7dGFzay5kdWVEYXRlU3ltYm9sfWA7XG5cbi8qXG4gKiBBIHN1Z2dlc3Rpb24gcHJlc2VudGVkIHRvIHRoZSB1c2VyIGFuZCBzb21lIG1ldGFkYXRhIGFib3V0IGl0LlxuICovXG5leHBvcnQgdHlwZSBTdWdnZXN0SW5mbyA9IHtcbiAgICBzdWdnZXN0aW9uVHlwZT86ICdtYXRjaCcgfCAnZGVmYXVsdCcgfCAnZW1wdHknO1xuICAgIC8vIFdoYXQgdG8gZGlzcGxheSB0byB0aGUgdXNlclxuICAgIGRpc3BsYXlUZXh0OiBzdHJpbmc7XG4gICAgLy8gV2hhdCB0byBhcHBlbmQgdG8gdGhlIG5vdGVcbiAgICBhcHBlbmRUZXh0OiBzdHJpbmc7XG4gICAgLy8gQXQgd2hhdCBpbmRleCBpbiB0aGUgbGluZSB0byBkbyB0aGUgaW5zZXJ0aW9uIChpZiBub3Qgc3BlY2lmaWVkLCB0aGUgY3Vyc29yIGxvY2F0aW9uIGlzIHVzZWQpXG4gICAgaW5zZXJ0QXQ/OiBudW1iZXI7XG4gICAgLy8gSG93IG1hbnkgY2hhcmFjdGVycyB0byBza2lwIGZyb20gdGhlIG9yaWdpbmFsIGxpbmUgKGUuZy4gaWYgcmVwbGFjaW5nIGV4aXN0aW5nIHRleHQpXG4gICAgaW5zZXJ0U2tpcD86IG51bWJlcjtcbn07XG5cbi8qXG4gKiBSZXR1cm4gYSBsaXN0IG9mIHN1Z2dlc3Rpb25zLCBlaXRoZXIgZ2VuZXJpYyBvciBtb3JlIGZpbmUtZ3JhaW5lZCB0byB0aGUgd29yZHMgYXQgdGhlIGN1cnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3VnZ2VzdGlvbnMobGluZTogc3RyaW5nLCBjdXJzb3JQb3M6IG51bWJlciwgc2V0dGluZ3M6IFNldHRpbmdzKTogU3VnZ2VzdEluZm9bXSB7XG4gICAgbGV0IHN1Z2dlc3Rpb25zOiBTdWdnZXN0SW5mb1tdID0gW107XG5cbiAgICAvLyBTdGVwIDE6IGFkZCBkYXRlIHN1Z2dlc3Rpb25zIGlmIHJlbGV2YW50XG4gICAgc3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5jb25jYXQoYWRkRGF0ZXNTdWdnZXN0aW9ucyhsaW5lLCBjdXJzb3JQb3MsIHNldHRpbmdzKSk7XG5cbiAgICAvLyBTdGVwIDI6IGFkZCByZWN1cnJlbmNlIHN1Z2dlc3Rpb25zIGlmIHJlbGV2YW50XG4gICAgc3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5jb25jYXQoYWRkUmVjdXJyZW5jZVN1Z2dlc3Rpb25zKGxpbmUsIGN1cnNvclBvcywgc2V0dGluZ3MpKTtcblxuICAgIC8vIFN0ZXAgMzogYWRkIG1vcmUgZ2VuZXJhbCBzdWdnZXN0aW9ucyAoJ2R1ZScsICdyZWN1cnJlbmNlJyBldGMpXG4gICAgY29uc3QgbW9yZVBvc3NpYmxlU3VnZ2VzdGlvbnMgPSBnZXRQb3NzaWJsZUNvbXBvbmVudFN1Z2dlc3Rpb25zKGxpbmUsIHNldHRpbmdzKTtcbiAgICAvLyBXZSBub3cgZmlsdGVyIHRoZSBnZW5lcmFsIHN1Z2dlc3Rpb25zIGFjY29yZGluZyB0byB0aGUgd29yZCBhdCB0aGUgY3Vyc29yLiBJZiB0aGVyZSdzXG4gICAgLy8gc29tZXRoaW5nIHRvIG1hdGNoLCB3ZSBmaWx0ZXIgdGhlIHN1Z2dlc3Rpb25zIGFjY29yZGluZ2x5LCBzbyB0aGUgdXNlciBjYW4gZ2V0IG1vcmUgc3BlY2lmaWNcbiAgICAvLyByZXN1bHRzIGFjY29yZGluZyB0byB3aGF0IHNoZSdzIHR5cGluZy5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIGdvb2QgbWF0Y2gsIHByZXNlbnQgdGhlIHN1Z2dlc3Rpb25zIGFzIHRoZXkgYXJlXG4gICAgY29uc3Qgd29yZE1hdGNoID0gbWF0Y2hCeVBvc2l0aW9uKGxpbmUsIC8oW2EtekEtWidfLV0qKS9nLCBjdXJzb3JQb3MpO1xuICAgIGxldCBhZGRlZFN1Z2dlc3Rpb25zID0gZmFsc2U7XG4gICAgaWYgKHdvcmRNYXRjaCAmJiB3b3JkTWF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB3b3JkVW5kZXJDdXJzb3IgPSB3b3JkTWF0Y2hbMF07XG4gICAgICAgIGlmICh3b3JkVW5kZXJDdXJzb3IubGVuZ3RoID49IE1hdGgubWF4KDEsIHNldHRpbmdzLmF1dG9TdWdnZXN0TWluTWF0Y2gpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFN1Z2dlc3Rpb25zID0gbW9yZVBvc3NpYmxlU3VnZ2VzdGlvbnMuZmlsdGVyKChzdWdnZXN0SW5mbykgPT5cbiAgICAgICAgICAgICAgICBzdWdnZXN0SW5mby5kaXNwbGF5VGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHdvcmRVbmRlckN1cnNvci50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbHRlcmVkIG9mIGZpbHRlcmVkU3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvblR5cGU6ICdtYXRjaCcsXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlUZXh0OiBmaWx0ZXJlZC5kaXNwbGF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVGV4dDogZmlsdGVyZWQuYXBwZW5kVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QXQ6IHdvcmRNYXRjaC5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0U2tpcDogd29yZFVuZGVyQ3Vyc29yLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhZGRlZFN1Z2dlc3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUaGF0J3Mgd2hlcmUgd2UncmUgYWRkaW5nIGFsbCB0aGUgc3VnZ2VzdGlvbnMgaW4gY2FzZSB0aGVyZSdzIG5vdGhpbmcgc3BlY2lmaWMgdG8gbWF0Y2hcbiAgICAvLyAoYW5kIHdlJ3JlIGFsbG93ZWQgYnkgdGhlIHNldHRpbmdzIHRvIGJyaW5nIGJhY2sgYSB6ZXJvLXNpemVkIG1hdGNoKVxuICAgIGlmICghYWRkZWRTdWdnZXN0aW9ucyAmJiBzZXR0aW5ncy5hdXRvU3VnZ2VzdE1pbk1hdGNoID09PSAwKVxuICAgICAgICBzdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zLmNvbmNhdChtb3JlUG9zc2libGVTdWdnZXN0aW9ucyk7XG5cbiAgICAvLyBVbmxlc3Mgd2UgaGF2ZSBhIHN1Z2dlc3Rpb24gdGhhdCBpcyBhIG1hdGNoIGZvciBzb21ldGhpbmcgdGhlIHVzZXIgaXMgY3VycmVudGx5IHR5cGluZywgYWRkXG4gICAgLy8gYW4gJ0VudGVyJyBlbnRyeSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZW51LCBzbyBhbiBFbnRlciBwcmVzcyB3aWxsIG1vdmUgdG8gdGhlIG5leHQgbGluZVxuICAgIC8vIHJhdGhlciB0aGFuIGluc2VydCBhIHN1Z2dlc3Rpb25cbiAgICBpZiAoc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCAmJiAhc3VnZ2VzdGlvbnMuc29tZSgodmFsdWUpID0+IHZhbHVlLnN1Z2dlc3Rpb25UeXBlID09PSAnbWF0Y2gnKSkge1xuICAgICAgICAvLyBObyBhY3R1YWwgbWF0Y2gsIG9ubHkgZGVmYXVsdCBvbmVzXG4gICAgICAgIHN1Z2dlc3Rpb25zLnVuc2hpZnQoe1xuICAgICAgICAgICAgc3VnZ2VzdGlvblR5cGU6ICdlbXB0eScsXG4gICAgICAgICAgICBkaXNwbGF5VGV4dDogJ1x1MjNDRScsXG4gICAgICAgICAgICBhcHBlbmRUZXh0OiAnXFxuJyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRWl0aGVyIHdheSwgYWZ0ZXIgYWxsIHRoZSBhZ2dyZWdhdGlvbnMgYWJvdmUsIG5ldmVyIHN1Z2dlc3QgbW9yZSB0aGFuIHRoZSBtYXggaXRlbXNcbiAgICBzdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zLnNsaWNlKDAsIHNldHRpbmdzLmF1dG9TdWdnZXN0TWF4SXRlbXMpO1xuXG4gICAgcmV0dXJuIHN1Z2dlc3Rpb25zO1xufVxuXG5mdW5jdGlvbiBoYXNQcmlvcml0eShsaW5lOiBzdHJpbmcpIHtcbiAgICBpZiAoT2JqZWN0LnZhbHVlcyh0YXNrLnByaW9yaXR5U3ltYm9scykuc29tZSgodmFsdWUpID0+IHZhbHVlLmxlbmd0aCA+IDAgJiYgbGluZS5pbmNsdWRlcyh2YWx1ZSkpKSByZXR1cm4gdHJ1ZTtcbn1cblxuLypcbiAqIEdldCBzdWdnZXN0aW9ucyBmb3IgZ2VuZXJpYyB0YXNrIGNvbXBvbmVudHMsIGUuZy4gYSBwcmlvcml0eSBvciBhICdkdWUnIHN5bWJvbFxuICovXG5mdW5jdGlvbiBnZXRQb3NzaWJsZUNvbXBvbmVudFN1Z2dlc3Rpb25zKGxpbmU6IHN0cmluZywgX3NldHRpbmdzOiBTZXR0aW5ncyk6IFN1Z2dlc3RJbmZvW10ge1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBTdWdnZXN0SW5mb1tdID0gW107XG5cbiAgICBpZiAoIWxpbmUuaW5jbHVkZXModGFzay5kdWVEYXRlU3ltYm9sKSlcbiAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dDogYCR7dGFzay5kdWVEYXRlU3ltYm9sfSBkdWUgZGF0ZWAsXG4gICAgICAgICAgICBhcHBlbmRUZXh0OiBgJHt0YXNrLmR1ZURhdGVTeW1ib2x9IGAsXG4gICAgICAgIH0pO1xuICAgIGlmICghbGluZS5pbmNsdWRlcyh0YXNrLnN0YXJ0RGF0ZVN5bWJvbCkpXG4gICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgZGlzcGxheVRleHQ6IGAke3Rhc2suc3RhcnREYXRlU3ltYm9sfSBzdGFydCBkYXRlYCxcbiAgICAgICAgICAgIGFwcGVuZFRleHQ6IGAke3Rhc2suc3RhcnREYXRlU3ltYm9sfSBgLFxuICAgICAgICB9KTtcbiAgICBpZiAoIWxpbmUuaW5jbHVkZXModGFzay5zY2hlZHVsZWREYXRlU3ltYm9sKSlcbiAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dDogYCR7dGFzay5zY2hlZHVsZWREYXRlU3ltYm9sfSBzY2hlZHVsZWQgZGF0ZWAsXG4gICAgICAgICAgICBhcHBlbmRUZXh0OiBgJHt0YXNrLnNjaGVkdWxlZERhdGVTeW1ib2x9IGAsXG4gICAgICAgIH0pO1xuICAgIGlmICghaGFzUHJpb3JpdHkobGluZSkpIHtcbiAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dDogYCR7dGFzay5wcmlvcml0eVN5bWJvbHMuSGlnaH0gaGlnaCBwcmlvcml0eWAsXG4gICAgICAgICAgICBhcHBlbmRUZXh0OiBgJHt0YXNrLnByaW9yaXR5U3ltYm9scy5IaWdofSBgLFxuICAgICAgICB9KTtcbiAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dDogYCR7dGFzay5wcmlvcml0eVN5bWJvbHMuTWVkaXVtfSBtZWRpdW0gcHJpb3JpdHlgLFxuICAgICAgICAgICAgYXBwZW5kVGV4dDogYCR7dGFzay5wcmlvcml0eVN5bWJvbHMuTWVkaXVtfSBgLFxuICAgICAgICB9KTtcbiAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dDogYCR7dGFzay5wcmlvcml0eVN5bWJvbHMuTG93fSBsb3cgcHJpb3JpdHlgLFxuICAgICAgICAgICAgYXBwZW5kVGV4dDogYCR7dGFzay5wcmlvcml0eVN5bWJvbHMuTG93fSBgLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFsaW5lLmluY2x1ZGVzKHRhc2sucmVjdXJyZW5jZVN5bWJvbCkpXG4gICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgZGlzcGxheVRleHQ6IGAke3Rhc2sucmVjdXJyZW5jZVN5bWJvbH0gcmVjdXJyaW5nIChyZXBlYXQpYCxcbiAgICAgICAgICAgIGFwcGVuZFRleHQ6IGAke3Rhc2sucmVjdXJyZW5jZVN5bWJvbH0gYCxcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gc3VnZ2VzdGlvbnM7XG59XG5cbi8qXG4gKiBJZiB0aGUgY3Vyc29yIGlzIGxvY2F0ZWQgaW4gYSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgZGF0ZSAoZHVlLCBzdGFydCBkYXRlIG9yIHNjaGVkdWxlZCBkYXRlKSxcbiAqIHN1Z2dlc3Qgb3B0aW9ucyBmb3Igd2hhdCB0byBlbnRlciBhcyBhIGRhdGUuXG4gKiBUaGlzIGhhcyB0d28gcGFydHM6IGVpdGhlciBnZW5lcmljIHByZWRlZmluZWQgc3VnZ2VzdGlvbnMsIG9yIGEgc2luZ2xlIHN1Z2dlc3Rpb24gdGhhdCBpcyBhIHBhcnNlZCByZXN1bHRcbiAqIG9mIHdoYXQgdGhlIHVzZXIgaXMgdHlwaW5nLlxuICogR2VuZXJpYyBwcmVkZWZpbmVkIHN1Z2dlc3Rpb25zLCBpbiB0dXJuLCBhbHNvIGhhdmUgdHdvIG9wdGlvbnM6IGVpdGhlciBmaWx0ZXJlZCAoaWYgdGhlIHVzZXIgc3RhcnRlZCB0eXBpbmdcbiAqIHNvbWV0aGluZyB3aGVyZSBhIGRhdGUgaXMgZXhwZWN0ZWQpIG9yIHVuZmlsdGVyZWRcbiAqL1xuZnVuY3Rpb24gYWRkRGF0ZXNTdWdnZXN0aW9ucyhsaW5lOiBzdHJpbmcsIGN1cnNvclBvczogbnVtYmVyLCBzZXR0aW5nczogU2V0dGluZ3MpOiBTdWdnZXN0SW5mb1tdIHtcbiAgICBjb25zdCBnZW5lcmljU3VnZ2VzdGlvbnMgPSBbXG4gICAgICAgICd0b2RheScsXG4gICAgICAgICd0b21vcnJvdycsXG4gICAgICAgICdTdW5kYXknLFxuICAgICAgICAnTW9uZGF5JyxcbiAgICAgICAgJ1R1ZXNkYXknLFxuICAgICAgICAnV2VkbmVzZGF5JyxcbiAgICAgICAgJ1RodXJzZGF5JyxcbiAgICAgICAgJ0ZyaWRheScsXG4gICAgICAgICdTYXR1cmRheScsXG4gICAgICAgICduZXh0IHdlZWsnLFxuICAgICAgICAnbmV4dCBtb250aCcsXG4gICAgICAgICduZXh0IHllYXInLFxuICAgIF07XG5cbiAgICBjb25zdCByZXN1bHRzOiBTdWdnZXN0SW5mb1tdID0gW107XG4gICAgY29uc3QgZGF0ZVJlZ2V4ID0gbmV3IFJlZ0V4cChgKFske2RhdGVQcmVmaXhDaGFyYWN0ZXJzfV0pXFxcXHMqKFswLTlhLXpBLVogXSopYCwgJ3VnJyk7XG4gICAgY29uc3QgZGF0ZU1hdGNoID0gbWF0Y2hCeVBvc2l0aW9uKGxpbmUsIGRhdGVSZWdleCwgY3Vyc29yUG9zKTtcbiAgICBpZiAoZGF0ZU1hdGNoICYmIGRhdGVNYXRjaC5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBkYXRlUHJlZml4ID0gZGF0ZU1hdGNoWzFdO1xuICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZGF0ZU1hdGNoWzJdO1xuICAgICAgICBpZiAoZGF0ZVN0cmluZy5sZW5ndGggPCBzZXR0aW5ncy5hdXRvU3VnZ2VzdE1pbk1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSBlbnRlcmVkIHRleHQgYXMgYSB2YWxpZCBkYXRlLlxuICAgICAgICAvLyBXZSBwYXNzIGZvcndhcmREYXRlPXRydWUgdG8gcGFyc2VEYXRlIGJlY2F1c2Ugd2UgZXhwZWN0IGR1ZSwgc3RhcnQgYW5kIHNjaGVkdWxlZCBkYXRlcyB0b1xuICAgICAgICAvLyBiZSBpbiB0aGUgZnV0dXJlLCBpLmUuIGlmIHRvZGF5IGlzIFN1bmRheSBhbmQgdGhlIHVzZXIgdHlwZWQgXCJkdWUgPEVudGVyPiBTYXR1cmRheVwiLCBzaGVcbiAgICAgICAgLy8gbW9zdCBsaWtlbHkgbWVhbnMgU2F0dXJkYXkgKmluIHRoZSBmdXR1cmUqIGFuZCBub3QgeWVzdGVyZGF5LlxuICAgICAgICBjb25zdCBwb3NzaWJsZURhdGUgPVxuICAgICAgICAgICAgZGF0ZVN0cmluZyAmJiBkYXRlU3RyaW5nLmxlbmd0aCA+IDEgPyBEYXRlUGFyc2VyLnBhcnNlRGF0ZShkb0F1dG9jb21wbGV0ZShkYXRlU3RyaW5nKSwgdHJ1ZSkgOiBudWxsO1xuICAgICAgICBpZiAocG9zc2libGVEYXRlICYmIHBvc3NpYmxlRGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZW1zIGxpa2UgdGhlIHRleHQgdGhhdCB0aGUgdXNlciB0eXBlZCBjYW4gYmUgcGFyc2VkIGFzIGEgdmFsaWQgZGF0ZS5cbiAgICAgICAgICAgIC8vIFByZXNlbnQgaXRzIGNvbXBsZXRlZCBmb3JtIGFzIGEgMXN0IHN1Z2dlc3Rpb25cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGlzcGxheVRleHQ6IGAke3Bvc3NpYmxlRGF0ZS5mb3JtYXQodGFzay5UYXNrUmVndWxhckV4cHJlc3Npb25zLmRhdGVGb3JtYXQpfWAsXG4gICAgICAgICAgICAgICAgYXBwZW5kVGV4dDogYCR7ZGF0ZVByZWZpeH0gJHtwb3NzaWJsZURhdGUuZm9ybWF0KHRhc2suVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5kYXRlRm9ybWF0KX0gYCxcbiAgICAgICAgICAgICAgICBpbnNlcnRBdDogZGF0ZU1hdGNoLmluZGV4LFxuICAgICAgICAgICAgICAgIGluc2VydFNraXA6IGRhdGVNYXRjaFswXS5sZW5ndGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdyB0byBnZW5lcmljIHByZWRlZmluZWQgc3VnZ2VzdGlvbnMuXG4gICAgICAgIC8vIElmIHdlIGdldCBhIHBhcnRpYWwgbWF0Y2ggd2l0aCBzb21lIG9mIHRoZSBzdWdnZXN0aW9ucyAoZS5nLiB0aGUgdXNlciBzdGFydGVkIHR5cGluZyBcInRvXCIpLFxuICAgICAgICAvLyB3ZSB1c2UgdGhhdCBmb3IgbWF0Y2hlcyAoXCJ0b21vcnJvd1wiLCBcInRvZGF5XCIgZXRjKS5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBqdXN0IGRpc3BsYXkgdGhlIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMsIGFuZCBlaXRoZXIgd2F5LCB0cnVuY2F0ZSB0aGVtIGV2ZW50dWFsbHkgdG9cbiAgICAgICAgLy8gYSBtYXggbnVtYmVyLiBXZSB3YW50IHRoZSBtYXggbnVtYmVyIHRvIGJlIGFyb3VuZCBoYWxmIHRoZSB0b3RhbCBhbGxvd2VkIG1hdGNoZXMsIHRvIGFsc28gYWxsb3dcbiAgICAgICAgLy8gc29tZSBnbG9iYWwgZ2VuZXJpYyBtYXRjaGVzIChlLmcuIHRhc2sgY29tcG9uZW50cykgdG8gZmluZCB0aGVpciB3YXkgdG8gdGhlIG1lbnVcbiAgICAgICAgY29uc3QgbWluTWF0Y2ggPSAxO1xuICAgICAgICBjb25zdCBtYXhHZW5lcmljU3VnZ2VzdGlvbnMgPSA1O1xuICAgICAgICBsZXQgZ2VuZXJpY01hdGNoZXMgPSBnZW5lcmljU3VnZ2VzdGlvbnNcbiAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICBkYXRlU3RyaW5nICYmXG4gICAgICAgICAgICAgICAgICAgIGRhdGVTdHJpbmcubGVuZ3RoID49IG1pbk1hdGNoICYmXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZGF0ZVN0cmluZy50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zbGljZSgwLCBtYXhHZW5lcmljU3VnZ2VzdGlvbnMpO1xuICAgICAgICBpZiAoZ2VuZXJpY01hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBEbyBjb21wbGV0ZWx5IGdlbmVyaWMgZGF0ZSBzdWdnZXN0aW9uc1xuICAgICAgICAgICAgZ2VuZXJpY01hdGNoZXMgPSBnZW5lcmljU3VnZ2VzdGlvbnMuc2xpY2UoMCwgbWF4R2VuZXJpY1N1Z2dlc3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGdlbmVyaWNNYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWREYXRlID0gRGF0ZVBhcnNlci5wYXJzZURhdGUobWF0Y2gsIHRydWUpO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IGAke3BhcnNlZERhdGUuZm9ybWF0KHRhc2suVGFza1JlZ3VsYXJFeHByZXNzaW9ucy5kYXRlRm9ybWF0KX1gO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uVHlwZTogJ21hdGNoJyxcbiAgICAgICAgICAgICAgICBkaXNwbGF5VGV4dDogYCR7bWF0Y2h9ICgke2Zvcm1hdHRlZERhdGV9KWAsXG4gICAgICAgICAgICAgICAgYXBwZW5kVGV4dDogYCR7ZGF0ZVByZWZpeH0gJHtmb3JtYXR0ZWREYXRlfSBgLFxuICAgICAgICAgICAgICAgIGluc2VydEF0OiBkYXRlTWF0Y2guaW5kZXgsXG4gICAgICAgICAgICAgICAgaW5zZXJ0U2tpcDogZGF0ZU1hdGNoWzBdLmxlbmd0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG4vKlxuICogSWYgdGhlIGN1cnNvciBpcyBsb2NhdGVkIGluIGEgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIHJlY3VycmVuY2UgZGVzY3JpcHRpb24sIHN1Z2dlc3Qgb3B0aW9uc1xuICogZm9yIHdoYXQgdG8gZW50ZXIgYXMgYSByZWN1cnJlbmNlLlxuICogVGhpcyBoYXMgdHdvIHBhcnRzOiBlaXRoZXIgZ2VuZXJpYyBwcmVkZWZpbmVkIHN1Z2dlc3Rpb25zLCBvciBhIHNpbmdsZSBzdWdnZXN0aW9uIHRoYXQgaXMgYSBwYXJzZWQgcmVzdWx0XG4gKiBvZiB3aGF0IHRoZSB1c2VyIGlzIHR5cGluZy5cbiAqIEdlbmVyaWMgcHJlZGVmaW5lZCBzdWdnZXN0aW9ucywgaW4gdHVybiwgYWxzbyBoYXZlIHR3byBvcHRpb25zOiBlaXRoZXIgZmlsdGVyZWQgKGlmIHRoZSB1c2VyIHN0YXJ0ZWQgdHlwaW5nXG4gKiBzb21ldGhpbmcgd2hlcmUgYSByZWN1cnJlbmNlIGlzIGV4cGVjdGVkKSBvciB1bmZpbHRlcmVkXG4gKi9cbmZ1bmN0aW9uIGFkZFJlY3VycmVuY2VTdWdnZXN0aW9ucyhsaW5lOiBzdHJpbmcsIGN1cnNvclBvczogbnVtYmVyLCBzZXR0aW5nczogU2V0dGluZ3MpIHtcbiAgICBjb25zdCBnZW5lcmljU3VnZ2VzdGlvbnMgPSBbXG4gICAgICAgICdldmVyeScsXG4gICAgICAgICdldmVyeSBkYXknLFxuICAgICAgICAnZXZlcnkgd2VlaycsXG4gICAgICAgICdldmVyeSBtb250aCcsXG4gICAgICAgICdldmVyeSBtb250aCBvbiB0aGUnLFxuICAgICAgICAnZXZlcnkgeWVhcicsXG4gICAgICAgICdldmVyeSB3ZWVrIG9uIFN1bmRheScsXG4gICAgICAgICdldmVyeSB3ZWVrIG9uIE1vbmRheScsXG4gICAgICAgICdldmVyeSB3ZWVrIG9uIFR1ZXNkYXknLFxuICAgICAgICAnZXZlcnkgd2VlayBvbiBXZWRuZXNkYXknLFxuICAgICAgICAnZXZlcnkgd2VlayBvbiBUaHVyc2RheScsXG4gICAgICAgICdldmVyeSB3ZWVrIG9uIEZyaWRheScsXG4gICAgICAgICdldmVyeSB3ZWVrIG9uIFNhdHVyZGF5JyxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVzdWx0czogU3VnZ2VzdEluZm9bXSA9IFtdO1xuICAgIGNvbnN0IHJlY3VycmVuY2VSZWdleCA9IG5ldyBSZWdFeHAoYCgke3Rhc2sucmVjdXJyZW5jZVN5bWJvbH0pXFxcXHMqKFswLTlhLXpBLVogXSopYCwgJ3VnJyk7XG4gICAgY29uc3QgcmVjdXJyZW5jZU1hdGNoID0gbWF0Y2hCeVBvc2l0aW9uKGxpbmUsIHJlY3VycmVuY2VSZWdleCwgY3Vyc29yUG9zKTtcbiAgICBpZiAocmVjdXJyZW5jZU1hdGNoICYmIHJlY3VycmVuY2VNYXRjaC5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCByZWN1cnJlbmNlUHJlZml4ID0gcmVjdXJyZW5jZU1hdGNoWzFdO1xuICAgICAgICBjb25zdCByZWN1cnJlbmNlU3RyaW5nID0gcmVjdXJyZW5jZU1hdGNoWzJdO1xuICAgICAgICBpZiAocmVjdXJyZW5jZVN0cmluZy5sZW5ndGggPCBzZXR0aW5ncy5hdXRvU3VnZ2VzdE1pbk1hdGNoKSByZXR1cm4gW107XG4gICAgICAgIGlmIChyZWN1cnJlbmNlU3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSB0ZXh0IG1hdGNoZXMgYSB2YWxpZCByZWN1cmVuY2UgZGVzY3JpcHRpb24sIHByZXNlbnQgaXQgYXMgYSAxc3Qgc3VnZ2VzdGlvbi5cbiAgICAgICAgICAgIC8vIFdlIGFsc28gYWRkIGEgbmljZSBjaGVja21hcmsgaW4gdGhpcyBjYXNlIHRvIGRlbm90ZSBpdCdzIGEgY29tcGxldGUgdmFsaWQgcmVjdXJyZW5jZSBkZXNjcmlwdGlvblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkUmVjdXJyZW5jZSA9IFJlY3VycmVuY2UuZnJvbVRleHQoe1xuICAgICAgICAgICAgICAgIHJlY3VycmVuY2VSdWxlVGV4dDogcmVjdXJyZW5jZVN0cmluZyxcbiAgICAgICAgICAgICAgICBzdGFydERhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRGF0ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBkdWVEYXRlOiBudWxsLFxuICAgICAgICAgICAgfSk/LnRvVGV4dCgpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZFJlY3VycmVuY2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcHBlbmRlZFRleHQgPSBgJHtyZWN1cnJlbmNlUHJlZml4fSAke3BhcnNlZFJlY3VycmVuY2V9IGA7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvblR5cGU6ICdtYXRjaCcsXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlUZXh0OiBgXHUyNzA1ICR7cGFyc2VkUmVjdXJyZW5jZX1gLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUZXh0OiBhcHBlbmRlZFRleHQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydEF0OiByZWN1cnJlbmNlTWF0Y2guaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFNraXA6IHJlY3VycmVuY2VNYXRjaFswXS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZ1bGwgbWF0Y2ggaW5jbHVkZXMgYSBjb21wbGV0ZSB2YWxpZCBzdWdnZXN0aW9uICplbmRpbmcgd2l0aCBzcGFjZSosXG4gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc3VnZ2VzdCBhbnl0aGluZy4gVGhlIHVzZXIgaXMgdHJ5aW5nIHRvIGNvbnRpbnVlIHRvIHR5cGUgc29tZXRoaW5nIHRoYXQgaXMgbGlrZWx5XG4gICAgICAgICAgICAgICAgLy8gbm90IHJlbGF0ZWQgdG8gcmVjdXJyZW5jZS4gV2hlbiBzaGUgc3RhcnRzIGEgbmV3IHdvcmQsIG1heWJlIHRoZSByZWN1cnJlbmNlIG1hdGNoZXNcbiAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIHJlbGV2YW50IGFnYWluXG4gICAgICAgICAgICAgICAgaWYgKHJlY3VycmVuY2VNYXRjaFswXSA9PSBhcHBlbmRlZFRleHQpIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdyB0byBnZW5lcmljIHByZWRlZmluZWQgc3VnZ2VzdGlvbnMuXG4gICAgICAgIC8vIElmIHdlIGdldCBhIHBhcnRpYWwgbWF0Y2ggd2l0aCBzb21lIG9mIHRoZSBzdWdnZXN0aW9ucyAoZS5nLiB0aGUgdXNlciBzdGFydGVkIHR5cGluZyBcImV2ZXJ5IGRcIiksXG4gICAgICAgIC8vIHdlIHVzZSB0aGF0IGZvciBtYXRjaGVzIChcImV2ZXJ5IGRheVwiKS5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBqdXN0IGRpc3BsYXkgdGhlIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMsIGFuZCBlaXRoZXIgd2F5LCB0cnVuY2F0ZSB0aGVtIGV2ZW50dWFsbHkgdG9cbiAgICAgICAgLy8gYSBtYXggbnVtYmVyLlxuICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiByZWN1cnJlbmNlIHJ1bGVzLCB0aGUgbWF4IG51bWJlciBzaG91bGQgYmUgc21hbGwgZW5vdWdoIHRvIGFsbG93IHVzZXJzIHRvIFwiZXNjYXBlXCJcbiAgICAgICAgLy8gdGhlIG1vZGUgb2Ygd3JpdGluZyBhIHJlY3VycmVuY2UgcnVsZSwgaS5lLiB3ZSBzaG91bGQgbGVhdmUgZW5vdWdoIHNwYWNlIGZvciBjb21wb25lbnQgc3VnZ2VzdGlvbnNcbiAgICAgICAgY29uc3QgbWluTWF0Y2ggPSAxO1xuICAgICAgICBjb25zdCBtYXhHZW5lcmljRGF0ZVN1Z2dlc3Rpb25zID0gc2V0dGluZ3MuYXV0b1N1Z2dlc3RNYXhJdGVtcyAvIDI7XG4gICAgICAgIGxldCBnZW5lcmljTWF0Y2hlcyA9IGdlbmVyaWNTdWdnZXN0aW9uc1xuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgIHJlY3VycmVuY2VTdHJpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJyZW5jZVN0cmluZy5sZW5ndGggPj0gbWluTWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhyZWN1cnJlbmNlU3RyaW5nLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnNsaWNlKDAsIG1heEdlbmVyaWNEYXRlU3VnZ2VzdGlvbnMpO1xuICAgICAgICBpZiAoZ2VuZXJpY01hdGNoZXMubGVuZ3RoID09PSAwICYmIHJlY3VycmVuY2VTdHJpbmcudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBubyBhY3R1YWwgbWF0Y2ggc28gZG8gY29tcGxldGVseSBnZW5lcmljIHJlY3VycmVuY2Ugc3VnZ2VzdGlvbnMsIGJ1dCBub3QgaWZcbiAgICAgICAgICAgIC8vIHRoZXJlICp3YXMqIGEgdGV4dCB0byBtYXRjaCAoYmVjYXVzZSBpdCBtZWFucyB0aGUgdXNlciBpcyBhY3R1YWxseSB0eXBpbmcgc29tZXRoaW5nIGVsc2UpXG4gICAgICAgICAgICBnZW5lcmljTWF0Y2hlcyA9IGdlbmVyaWNTdWdnZXN0aW9ucy5zbGljZSgwLCBtYXhHZW5lcmljRGF0ZVN1Z2dlc3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGdlbmVyaWNNYXRjaGVzKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25UeXBlOiAnbWF0Y2gnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlUZXh0OiBgJHttYXRjaH1gLFxuICAgICAgICAgICAgICAgIGFwcGVuZFRleHQ6IGAke3JlY3VycmVuY2VQcmVmaXh9ICR7bWF0Y2h9IGAsXG4gICAgICAgICAgICAgICAgaW5zZXJ0QXQ6IHJlY3VycmVuY2VNYXRjaC5pbmRleCxcbiAgICAgICAgICAgICAgICBpbnNlcnRTa2lwOiByZWN1cnJlbmNlTWF0Y2hbMF0ubGVuZ3RoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBNYXRjaGVzIGEgc3RyaW5nIHdpdGggYSByZWdleCBhY2NvcmRpbmcgdG8gYSBwb3NpdGlvbiAodHlwaWNhbGx5IG9mIGEgY3Vyc29yKS5cbiAqIFdpbGwgcmV0dXJuIGEgcmVzdWx0IG9ubHkgaWYgYSBtYXRjaCBleGlzdHMgYW5kIHRoZSBnaXZlbiBwb3NpdGlvbiBpcyBwYXJ0IG9mIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hCeVBvc2l0aW9uKHM6IHN0cmluZywgcjogUmVnRXhwLCBwb3NpdGlvbjogbnVtYmVyKTogUmVnRXhwTWF0Y2hBcnJheSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHMubWF0Y2hBbGwocik7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgIGlmIChtYXRjaD8uaW5kZXggJiYgbWF0Y2guaW5kZXggPD0gcG9zaXRpb24gJiYgcG9zaXRpb24gPD0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpIHJldHVybiBtYXRjaDtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUEseUNBQUFBLFNBQUE7QUFlQSxRQUFJQztBQUNKLFFBQUlDO0FBQ0os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QUFFRSxLQUFFLEtBQUssSUFBSUQsRUFBQyxHQUFFRSxLQUFFLEtBQUssTUFBTUQsS0FBRSxFQUFFLEdBQUVFLEtBQUVGLEtBQUU7QUFBRyxnQkFBT0QsTUFBRyxJQUFFLE1BQUksT0FBSyxFQUFFRSxJQUFFLEdBQUUsR0FBRyxJQUFFLE1BQUksRUFBRUMsSUFBRSxHQUFFLEdBQUc7QUFBQSxNQUFDLEdBQUUsR0FBRSxTQUFTSixHQUFFQyxJQUFFQyxJQUFFO0FBQUMsWUFBR0QsR0FBRSxLQUFLLElBQUVDLEdBQUUsS0FBSztBQUFFLGlCQUFNLENBQUNGLEdBQUVFLElBQUVELEVBQUM7QUFBRSxZQUFJRSxLQUFFLE1BQUlELEdBQUUsS0FBSyxJQUFFRCxHQUFFLEtBQUssTUFBSUMsR0FBRSxNQUFNLElBQUVELEdBQUUsTUFBTSxJQUFHRyxLQUFFSCxHQUFFLE1BQU0sRUFBRSxJQUFJRSxJQUFFLENBQUMsR0FBRUUsS0FBRUgsS0FBRUUsS0FBRSxHQUFFRSxLQUFFTCxHQUFFLE1BQU0sRUFBRSxJQUFJRSxNQUFHRSxLQUFFLEtBQUcsSUFBRyxDQUFDO0FBQUUsZUFBTSxFQUFFLEVBQUVGLE1BQUdELEtBQUVFLE9BQUlDLEtBQUVELEtBQUVFLEtBQUVBLEtBQUVGLFFBQUs7QUFBQSxNQUFFLEdBQUUsR0FBRSxTQUFTSixJQUFFO0FBQUMsZUFBT0EsS0FBRSxJQUFFLEtBQUssS0FBS0EsRUFBQyxLQUFHLElBQUUsS0FBSyxNQUFNQSxFQUFDO0FBQUEsTUFBQyxHQUFFLEdBQUUsU0FBU0EsSUFBRTtBQUFDLGVBQU0sRUFBQyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLElBQUcsR0FBRSxHQUFFLEVBQUMsRUFBRUEsT0FBSSxPQUFPQSxNQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsUUFBUSxNQUFLLEVBQUU7QUFBQSxNQUFDLEdBQUUsR0FBRSxTQUFTQSxJQUFFO0FBQUMsZUFBTyxXQUFTQTtBQUFBLE1BQUMs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QUNMLE1BQU07TUFDTixNQUFNO01BQ04sT0FBTztNQUNQLE1BQU07TUFDTixNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLE9BQU87TUFDUCxPQUFPO01BQ1AsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixNQUFNO01BQ04sT0FBTztNQUNQLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLElBQUk7TUFDSixNQUFNO01BQ04sS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixPQUFPO01BQ1AsTUFBTTtNQUNOLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxPQUFPO01BQ1AsTUFBTTtNQUNOLEtBQUs7TUFDTCxNQUFNO01BQ04sTUFBTTtNQUNOLE1BQU07TUFDTixNQUFNO01BQ04sT0FBTztNQUNQLE1BQU07TUFDTixNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsT0FBTztNQUNQLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sTUFBTTtNQUNOLE9BQU87TUFDUCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxPQUFPO01BQ1AsTUFBTTtNQUNOLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sTUFBTTtNQUNOLE1BQU07TUFDTixLQUFLO01BQ0wsSUFBSTtNQUNKLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE9BQU87TUFDUCxNQUFNO01BQ04sS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsTUFBTTtNQUNOLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxJQUFJO01BQ0osT0FBTztNQUNQLE1BQU07TUFDTixNQUFNO01BQ04sT0FBTztNQUNQLE1BQU07O0FBR1YsYUFBZ0IsaUJBQWlCLGVBQStCOztBQUM1RCxVQUFJLGtCQUFrQixRQUFRLGtCQUFrQixRQUFXO0FBQ3ZELGVBQU87O0FBR1gsVUFBSSxPQUFPLGtCQUFrQixVQUFVO0FBQ25DLGVBQU87O0FBR1gsY0FBTyxLQUFBLFFBQUEsa0JBQWtCLG9CQUFjLFFBQUEsT0FBQSxTQUFBLEtBQUk7SUFDL0M7QUFWQSxZQUFBLG1CQUFBOzs7Ozs7Ozs7Ozs7O0FDaE1BLFFBQUEsa0JBQUFHLGlCQUFBLHVCQUFBO0FBQ0EsUUFBQSxVQUFBQSxpQkFBQSxtQkFBQTtBQUNBLFFBQUEsVUFBQTtBQUNBLFFBQUEsYUFBQTtBQUNBLFlBQUEsUUFBTSxPQUFPLGdCQUFBLE9BQWE7QUFFMUIsUUFBYSx3QkFBYixNQUFrQztNQUk5QixZQUFZLE9BQStCOztBQUN2QyxnQkFBUSxVQUFLLFFBQUwsVUFBSyxTQUFMLFFBQVMsSUFBSSxLQUFJO0FBQ3pCLFlBQUksaUJBQWlCLE1BQU07QUFDdkIsZUFBSyxVQUFVO2VBQ1o7QUFDSCxlQUFLLFdBQVUsS0FBQSxNQUFNLGFBQU8sUUFBQSxPQUFBLFNBQUEsS0FBSSxJQUFJLEtBQUk7QUFDeEMsZUFBSyxpQkFBaUIsV0FBQSxpQkFBaUIsTUFBTSxRQUFROztNQUU3RDs7QUFaSixZQUFBLHdCQUFBO0FBZUEsUUFBYSxvQkFBYixNQUE4QjtNQUsxQixZQUFZLFdBQWtDLGlCQUErQztBQUN6RixhQUFLLFlBQVk7QUFDakIsYUFBSyxjQUFjLENBQUE7QUFDbkIsYUFBSyxnQkFBZ0IsQ0FBQTtBQUNyQixZQUFJLGlCQUFpQjtBQUNqQixxQkFBVyxPQUFPLGlCQUFpQjtBQUMvQixpQkFBSyxZQUFZLE9BQW9CLGdCQUFnQjs7O0FBSTdELGNBQU0sV0FBVyxRQUFBLFFBQU0sVUFBVSxPQUFPO0FBQ3hDLGFBQUssTUFBTSxPQUFPLFNBQVMsS0FBSSxDQUFFO0FBQ2pDLGFBQUssTUFBTSxTQUFTLFNBQVMsTUFBSyxJQUFLLENBQUM7QUFDeEMsYUFBSyxNQUFNLFFBQVEsU0FBUyxLQUFJLENBQUU7QUFDbEMsYUFBSyxNQUFNLFFBQVEsRUFBRTtBQUNyQixhQUFLLE1BQU0sVUFBVSxDQUFDO0FBQ3RCLGFBQUssTUFBTSxVQUFVLENBQUM7QUFDdEIsYUFBSyxNQUFNLGVBQWUsQ0FBQztNQUMvQjtNQUVBLElBQUksV0FBb0I7QUFDcEIsWUFBSSxhQUFhLEtBQUssYUFBYTtBQUMvQixpQkFBTyxLQUFLLFlBQVk7O0FBRzVCLFlBQUksYUFBYSxLQUFLLGVBQWU7QUFDakMsaUJBQU8sS0FBSyxjQUFjOztBQUc5QixlQUFPO01BQ1g7TUFFQSxVQUFVLFdBQW9CO0FBQzFCLGVBQU8sYUFBYSxLQUFLO01BQzdCO01BRUEsdUJBQW9CO0FBQ2hCLGVBQU8sT0FBTyxLQUFLLEtBQUssV0FBVztNQUN2QztNQUVBLE1BQU0sV0FBc0IsT0FBYTtBQUNyQyxZQUFJLGFBQWEsS0FBSyxhQUFhO0FBQy9CLGlCQUFPOztBQUVYLGFBQUssY0FBYyxhQUFhO0FBQ2hDLGVBQU87TUFDWDtNQUVBLE9BQU8sV0FBc0IsT0FBYTtBQUN0QyxhQUFLLFlBQVksYUFBYTtBQUM5QixlQUFPLEtBQUssY0FBYztBQUMxQixlQUFPO01BQ1g7TUFFQSxPQUFPLFdBQW9CO0FBQ3ZCLGVBQU8sS0FBSyxZQUFZO0FBQ3hCLGVBQU8sS0FBSyxjQUFjO01BQzlCO01BRUEsUUFBSztBQUNELGNBQU0sWUFBWSxJQUFJLGtCQUFrQixLQUFLLFNBQVM7QUFDdEQsa0JBQVUsY0FBYyxDQUFBO0FBQ3hCLGtCQUFVLGdCQUFnQixDQUFBO0FBRTFCLG1CQUFXLE9BQU8sS0FBSyxhQUFhO0FBQ2hDLG9CQUFVLFlBQVksT0FBb0IsS0FBSyxZQUFZOztBQUcvRCxtQkFBVyxPQUFPLEtBQUssZUFBZTtBQUNsQyxvQkFBVSxjQUFjLE9BQW9CLEtBQUssY0FBYzs7QUFHbkUsZUFBTztNQUNYO01BRUEsYUFBVTtBQUNOLGVBQU8sQ0FBQyxLQUFLLFVBQVUsTUFBTSxLQUFLLENBQUMsS0FBSyxVQUFVLFFBQVEsS0FBSyxDQUFDLEtBQUssVUFBVSxRQUFRO01BQzNGO01BRUEsYUFBVTtBQUNOLGVBQU8sQ0FBQyxLQUFLLFVBQVUsU0FBUyxLQUFLLENBQUMsS0FBSyxVQUFVLEtBQUssS0FBSyxDQUFDLEtBQUssVUFBVSxPQUFPO01BQzFGO01BRUEseUJBQXNCO0FBQ2xCLGVBQU8sS0FBSyxVQUFVLFNBQVMsS0FBSyxDQUFDLEtBQUssVUFBVSxLQUFLLEtBQUssQ0FBQyxLQUFLLFVBQVUsT0FBTztNQUN6RjtNQUVBLDBCQUF1QjtBQUNuQixlQUFPLEtBQUssVUFBVSxLQUFLLEtBQUssS0FBSyxVQUFVLE9BQU8sS0FBSyxDQUFDLEtBQUssVUFBVSxNQUFNO01BQ3JGO01BRUEsY0FBVztBQUNQLGNBQU0sT0FBTyxLQUFLLDhCQUE2QjtBQUUvQyxZQUFJLEtBQUssWUFBVyxNQUFPLEtBQUssSUFBSSxNQUFNO0FBQUcsaUJBQU87QUFDcEQsWUFBSSxLQUFLLFNBQVEsTUFBTyxLQUFLLElBQUksT0FBTyxJQUFJO0FBQUcsaUJBQU87QUFDdEQsWUFBSSxLQUFLLFFBQU8sTUFBTyxLQUFLLElBQUksS0FBSztBQUFHLGlCQUFPO0FBQy9DLFlBQUksS0FBSyxJQUFJLE1BQU0sS0FBSyxRQUFRLEtBQUssU0FBUSxLQUFNLEtBQUssSUFBSSxNQUFNO0FBQUcsaUJBQU87QUFDNUUsWUFBSSxLQUFLLElBQUksUUFBUSxLQUFLLFFBQVEsS0FBSyxXQUFVLEtBQU0sS0FBSyxJQUFJLFFBQVE7QUFBRyxpQkFBTztBQUVsRixlQUFPO01BQ1g7TUFFQSxXQUFRO0FBQ0osZUFBTyxvQ0FBb0MsS0FBSyxVQUFVLEtBQUssV0FBVyxxQkFBcUIsS0FBSyxVQUNoRyxLQUFLLGFBQWEsa0JBQ0osS0FBSyxVQUFVLEtBQUssU0FBUztNQUNuRDtNQUVBLFFBQUs7QUFDRCxlQUFPLFFBQUEsUUFBTSxLQUFLLEtBQUksQ0FBRTtNQUM1QjtNQUVBLE9BQUk7QUFDQSxjQUFNLE9BQU8sS0FBSyw4QkFBNkI7QUFDL0MsZUFBTyxJQUFJLEtBQUssS0FBSyxRQUFPLElBQUssS0FBSyxrQ0FBa0MsSUFBSSxJQUFJLEdBQUs7TUFDekY7TUFFUSxnQ0FBNkI7QUFDakMsY0FBTSxPQUFPLElBQUksS0FDYixLQUFLLElBQUksTUFBTSxHQUNmLEtBQUssSUFBSSxPQUFPLElBQUksR0FDcEIsS0FBSyxJQUFJLEtBQUssR0FDZCxLQUFLLElBQUksTUFBTSxHQUNmLEtBQUssSUFBSSxRQUFRLEdBQ2pCLEtBQUssSUFBSSxRQUFRLEdBQ2pCLEtBQUssSUFBSSxhQUFhLENBQUM7QUFHM0IsYUFBSyxZQUFZLEtBQUssSUFBSSxNQUFNLENBQUM7QUFDakMsZUFBTztNQUNYO01BRVEsa0NBQWtDLE1BQVc7O0FBQ2pELFlBQUksQ0FBQyxRQUFRLEtBQUssUUFBTyxJQUFLLEdBQUc7QUFHN0IsaUJBQU8sSUFBSSxLQUFJOztBQUduQixjQUFNLHdCQUF3QixDQUFDLEtBQUssa0JBQWlCO0FBQ3JELGNBQU0sd0JBQ0YsTUFBQSxLQUFBLEtBQUssSUFBSSxnQkFBZ0IsT0FBQyxRQUFBLE9BQUEsU0FBQSxLQUFJLEtBQUssVUFBVSxvQkFBYyxRQUFBLE9BQUEsU0FBQSxLQUFJO0FBRW5FLGVBQU8sd0JBQXdCO01BQ25DO01BRUEsT0FBTyw0QkFDSCxXQUNBLFdBQXdDO0FBRXhDLFlBQUksT0FBTyxRQUFBLFFBQU0sVUFBVSxPQUFPO0FBQ2xDLG1CQUFXLE9BQU8sV0FBVztBQUN6QixpQkFBTyxLQUFLLElBQUksVUFBVSxNQUFtQixHQUFnQjs7QUFHakUsY0FBTSxhQUFhLElBQUksa0JBQWtCLFNBQVM7QUFDbEQsWUFBSSxVQUFVLFdBQVcsVUFBVSxhQUFhLFVBQVUsV0FBVztBQUNqRSxrQkFBQSxrQkFBa0IsWUFBWSxJQUFJO0FBQ2xDLGtCQUFBLGtCQUFrQixZQUFZLElBQUk7QUFDbEMsY0FBSSxVQUFVLG1CQUFtQixNQUFNO0FBQ25DLHVCQUFXLE9BQU8sa0JBQWtCLENBQUMsVUFBVSxRQUFRLGtCQUFpQixDQUFFOztlQUUzRTtBQUNILGtCQUFBLGlCQUFpQixZQUFZLElBQUk7QUFDakMsY0FBSSxVQUFVLG1CQUFtQixNQUFNO0FBQ25DLHVCQUFXLE1BQU0sa0JBQWtCLENBQUMsVUFBVSxRQUFRLGtCQUFpQixDQUFFOztBQUc3RSxjQUFJLFVBQVUsTUFBTTtBQUNoQix1QkFBVyxPQUFPLE9BQU8sS0FBSyxLQUFJLENBQUU7QUFDcEMsdUJBQVcsT0FBTyxTQUFTLEtBQUssTUFBSyxJQUFLLENBQUM7QUFDM0MsdUJBQVcsT0FBTyxRQUFRLEtBQUssS0FBSSxDQUFFO2lCQUNsQztBQUNILGdCQUFJLFVBQVUsU0FBUztBQUNuQix5QkFBVyxNQUFNLFdBQVcsS0FBSyxJQUFHLENBQUU7O0FBRzFDLHVCQUFXLE1BQU0sT0FBTyxLQUFLLEtBQUksQ0FBRTtBQUNuQyxnQkFBSSxVQUFVLFVBQVU7QUFDcEIseUJBQVcsT0FBTyxTQUFTLEtBQUssTUFBSyxJQUFLLENBQUM7QUFDM0MseUJBQVcsT0FBTyxRQUFRLEtBQUssS0FBSSxDQUFFO21CQUNsQztBQUNILHlCQUFXLE1BQU0sU0FBUyxLQUFLLE1BQUssSUFBSyxDQUFDO0FBQzFDLGtCQUFJLFVBQVUsU0FBUztBQUNuQiwyQkFBVyxPQUFPLFFBQVEsS0FBSyxLQUFJLENBQUU7cUJBQ2xDO0FBQ0gsMkJBQVcsTUFBTSxRQUFRLEtBQUssS0FBSSxDQUFFOzs7OztBQU1wRCxlQUFPO01BQ1g7O0FBdk1KLFlBQUEsb0JBQUE7QUEwTUEsUUFBYSxnQkFBYixNQUEwQjtNQVV0QixZQUNJLFdBQ0EsT0FDQUMsT0FDQSxPQUNBLEtBQXVCO0FBRXZCLGFBQUssWUFBWTtBQUNqQixhQUFLLFVBQVUsVUFBVTtBQUN6QixhQUFLLFFBQVE7QUFDYixhQUFLLE9BQU9BO0FBQ1osYUFBSyxRQUFRLFNBQVMsSUFBSSxrQkFBa0IsU0FBUztBQUNyRCxhQUFLLE1BQU07TUFDZjtNQUVBLFFBQUs7QUFDRCxjQUFNLFNBQVMsSUFBSSxjQUFjLEtBQUssV0FBVyxLQUFLLE9BQU8sS0FBSyxJQUFJO0FBQ3RFLGVBQU8sUUFBUSxLQUFLLFFBQVEsS0FBSyxNQUFNLE1BQUssSUFBSztBQUNqRCxlQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFLLElBQUs7QUFDM0MsZUFBTztNQUNYO01BRUEsT0FBSTtBQUNBLGVBQU8sS0FBSyxNQUFNLEtBQUk7TUFDMUI7TUFFQSxXQUFRO0FBQ0osZUFBTywwQkFBMEIsS0FBSyxpQkFBaUIsS0FBSztNQUNoRTs7QUF0Q0osWUFBQSxnQkFBQTs7Ozs7Ozs7OztBQzFOQSxRQUFzQix5Q0FBdEIsTUFBNEQ7TUFBNUQsY0FBQTtBQU9ZLGFBQUEscUJBQThCO0FBQzlCLGFBQUEsZ0JBQXlCO01BMkJyQztNQXpCSSxzQkFBbUI7QUFDZixlQUFPO01BQ1g7TUFFQSxRQUFRLFNBQXVCO0FBQzNCLGNBQU0sZUFBZSxLQUFLLGFBQWEsT0FBTztBQUM5QyxZQUFJLGdCQUFnQixLQUFLLG9CQUFvQjtBQUN6QyxpQkFBTyxLQUFLOztBQUdoQixhQUFLLGdCQUFnQixJQUFJLE9BQU8sR0FBRyxLQUFLLG9CQUFtQixJQUFLLGFBQWEsVUFBVSxhQUFhLEtBQUs7QUFDekcsYUFBSyxxQkFBcUI7QUFDMUIsZUFBTyxLQUFLO01BQ2hCO01BRUEsUUFBUSxTQUF5QixPQUF1Qjs7QUFDcEQsY0FBTSxVQUFTLEtBQUEsTUFBTSxRQUFFLFFBQUEsT0FBQSxTQUFBLEtBQUk7QUFDM0IsY0FBTSxRQUFRLE1BQU0sUUFBUSxPQUFPO0FBQ25DLGNBQU0sS0FBSyxNQUFNLEdBQUcsVUFBVSxPQUFPLE1BQU07QUFDM0MsaUJBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsZ0JBQU0sSUFBSSxLQUFLLE1BQU07O0FBR3pCLGVBQU8sS0FBSyxhQUFhLFNBQVMsS0FBSztNQUMzQzs7QUFsQ0osWUFBQSx5Q0FBQTs7Ozs7Ozs7O0FDUEEsUUFBQSxjQUFBO0FBRUEsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQU0sc0JBQXNCLElBQUksT0FDNUIsdUZBQ3NFLFlBQUEsZ0NBQ3RFLEdBQUc7QUFHUCxRQUFNLHlCQUF5QixJQUFJLE9BQy9CLGtFQUFrRSxZQUFBLGdDQUNsRSxHQUFHO0FBR1AsUUFBcUIsK0JBQXJCLGNBQTBELGlDQUFBLHVDQUFzQztNQUM1RixhQUFhLFNBQXVCO0FBQ2hDLGVBQU8sUUFBUSxPQUFPLGNBQWMseUJBQXlCO01BQ2pFO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFlBQVksWUFBQSxlQUFlLE1BQU0sRUFBRTtBQUN6QyxlQUFPLFVBQUEsa0JBQWtCLDRCQUE0QixRQUFRLFdBQVcsU0FBUztNQUNyRjs7QUFSSixZQUFBLFVBQUE7Ozs7Ozs7OztBQ2RBLFFBQUEsVUFBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFHQSxRQUFNLFVBQVUsSUFBSSxPQUNoQixtQkFDUSxZQUFBLHFGQUdJLFlBQUEsNERBR0osVUFBQSxnQkFBZ0IsWUFBQSxnQkFBZ0IsMkJBRzVCLFlBQUEseUNBR1osR0FBRztBQUdQLFFBQU0sYUFBYTtBQUNuQixRQUFNLGdCQUFnQjtBQUN0QixRQUFNLG1CQUFtQjtBQUN6QixRQUFNLGFBQWE7QUFFbkIsUUFBcUIsZ0NBQXJCLGNBQTJELGlDQUFBLHVDQUFzQztNQUM3RixlQUFZO0FBQ1IsZUFBTztNQUNYO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFNBQVMsUUFBUSxvQkFBb0IsTUFBTSxPQUFPLE1BQU0sRUFBRTtBQUVoRSxjQUFNLFFBQVEsWUFBQSxpQkFBaUIsTUFBTSxrQkFBa0IsWUFBVztBQUNsRSxjQUFNLE1BQU0sWUFBQSwwQkFBMEIsTUFBTSxXQUFXO0FBQ3ZELFlBQUksTUFBTSxJQUFJO0FBRVYsZ0JBQU0sUUFBUSxNQUFNLFFBQVEsTUFBTSxZQUFZO0FBQzlDLGlCQUFPOztBQUdYLGVBQU8sTUFBTSxPQUFPLFNBQVMsS0FBSztBQUNsQyxlQUFPLE1BQU0sT0FBTyxPQUFPLEdBQUc7QUFFOUIsWUFBSSxNQUFNLGFBQWE7QUFDbkIsZ0JBQU0sYUFBYSxZQUFBLFVBQVUsTUFBTSxXQUFXO0FBQzlDLGlCQUFPLE1BQU0sT0FBTyxRQUFRLFVBQVU7ZUFDbkM7QUFDSCxnQkFBTSxPQUFPLFFBQUEscUJBQXFCLFFBQVEsU0FBUyxLQUFLLEtBQUs7QUFDN0QsaUJBQU8sTUFBTSxNQUFNLFFBQVEsSUFBSTs7QUFHbkMsWUFBSSxNQUFNLGdCQUFnQjtBQUN0QixnQkFBTSxVQUFVLFlBQUEsMEJBQTBCLE1BQU0sY0FBYztBQUU5RCxpQkFBTyxNQUFNLE9BQU8sTUFBTSxNQUFLO0FBQy9CLGlCQUFPLElBQUksT0FBTyxPQUFPLE9BQU87O0FBR3BDLGVBQU87TUFDWDs7QUFuQ0osWUFBQSxVQUFBOzs7Ozs7Ozs7QUMvQkEsUUFBQSxVQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLElBQUksVUFBQSxnQkFBZ0IsWUFBQSxnQkFBZ0Isd0JBRTVCLFlBQUEsaUVBR0EsWUFBQSxzREFJQSxZQUFBLHNDQUdSLEdBQUc7QUFHUCxRQUFNLG1CQUFtQjtBQUN6QixRQUFNLGFBQWE7QUFDbkIsUUFBTSxnQkFBZ0I7QUFDdEIsUUFBTSxhQUFhO0FBWW5CLFFBQXFCLGdDQUFyQixjQUEyRCxpQ0FBQSx1Q0FBc0M7TUFDN0YsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxRQUFRLFlBQUEsaUJBQWlCLE1BQU0sa0JBQWtCLFlBQVc7QUFDbEUsY0FBTSxNQUFNLFlBQUEsMEJBQTBCLE1BQU0sV0FBVztBQUN2RCxZQUFJLE1BQU0sSUFBSTtBQUNWLGlCQUFPOztBQUdYLGNBQU0sYUFBYSxRQUFRLHdCQUF3QjtVQUMvQztVQUNBO1NBQ0g7QUFFRCxZQUFJLE1BQU0sYUFBYTtBQUNuQixnQkFBTSxPQUFPLFlBQUEsVUFBVSxNQUFNLFdBQVc7QUFDeEMscUJBQVcsT0FBTyxRQUFRLElBQUk7ZUFDM0I7QUFDSCxnQkFBTSxPQUFPLFFBQUEscUJBQXFCLFFBQVEsU0FBUyxLQUFLLEtBQUs7QUFDN0QscUJBQVcsTUFBTSxRQUFRLElBQUk7O0FBR2pDLFlBQUksQ0FBQyxNQUFNLGdCQUFnQjtBQUN2QixpQkFBTzs7QUFJWCxjQUFNLFVBQVUsWUFBQSwwQkFBMEIsTUFBTSxjQUFjO0FBQzlELGNBQU0sU0FBUyxRQUFRLG9CQUFvQixNQUFNLE9BQU8sTUFBTSxFQUFFO0FBQ2hFLGVBQU8sUUFBUTtBQUNmLGVBQU8sTUFBTSxXQUFXLE1BQUs7QUFDN0IsZUFBTyxJQUFJLE9BQU8sT0FBTyxPQUFPO0FBRWhDLGVBQU87TUFDWDs7QUFyQ0osWUFBQSxVQUFBOzs7Ozs7Ozs7QUN2Q0EsUUFBQSxjQUFBO0FBRUEsUUFBQSxVQUFBO0FBQ0EsUUFBQSxZQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLGlCQUNRLFVBQUEsZ0JBQWdCLFlBQUEsZ0JBQWdCLHNCQUd2QixZQUFBLG9EQUdqQixHQUFHO0FBR1AsUUFBTSxlQUFlO0FBQ3JCLFFBQU0sbUJBQW1CO0FBQ3pCLFFBQU0sYUFBYTtBQVNuQixRQUFxQixvQkFBckIsY0FBK0MsaUNBQUEsdUNBQXNDO01BQ2pGLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sWUFBWSxNQUFNLGtCQUFrQixZQUFXO0FBR3JELFlBQUksTUFBTSxHQUFHLFVBQVUsS0FBSyxDQUFDLFlBQUEsMkJBQTJCLFlBQVk7QUFDaEUsaUJBQU87O0FBR1gsY0FBTSxTQUFTLFFBQVEsb0JBQ25CLE1BQU0sU0FBUyxNQUFNLGlCQUFpQixJQUFJLFFBQzFDLE1BQU0sUUFBUSxNQUFNLEdBQUcsTUFBTTtBQUVqQyxlQUFPLE1BQU0sTUFBTSxPQUFPLENBQUM7QUFFM0IsY0FBTSxRQUFRLFlBQUEsaUJBQWlCO0FBQy9CLGVBQU8sTUFBTSxPQUFPLFNBQVMsS0FBSztBQUVsQyxZQUFJLE1BQU0sYUFBYTtBQUNuQixnQkFBTSxPQUFPLFlBQUEsVUFBVSxNQUFNLFdBQVc7QUFDeEMsaUJBQU8sTUFBTSxPQUFPLFFBQVEsSUFBSTtlQUM3QjtBQUNILGdCQUFNLE9BQU8sUUFBQSxxQkFBcUIsUUFBUSxTQUFTLEdBQUcsS0FBSztBQUMzRCxpQkFBTyxNQUFNLE1BQU0sUUFBUSxJQUFJOztBQUduQyxlQUFPO01BQ1g7O0FBL0JKLFlBQUEsVUFBQTs7Ozs7Ozs7O0FDNUJBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFTQSxRQUFNLFVBQVUsSUFBSSxPQUNoQiw0QkFDVyxVQUFBLGdCQUFnQixZQUFBLGdCQUFnQixvREFHM0MsR0FBRztBQUdQLFFBQU0sb0JBQW9CO0FBQzFCLFFBQU0sbUJBQW1CO0FBQ3pCLFFBQU0scUJBQXFCO0FBQzNCLFFBQU0sb0JBQW9CO0FBRTFCLFFBQXFCLDZCQUFyQixjQUF3RCxpQ0FBQSx1Q0FBc0M7TUFDMUYsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxRQUFRLE1BQU0sc0JBQ2QsU0FBUyxNQUFNLG1CQUFtQixJQUNsQyxZQUFBLGlCQUFpQixNQUFNLGtCQUFrQixZQUFXO0FBRTFELFlBQUksUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUN6QixpQkFBTzs7QUFHWCxjQUFNLE9BQU8sU0FBUyxNQUFNLGtCQUFrQjtBQUM5QyxjQUFNLE1BQU0sU0FBUyxNQUFNLGtCQUFrQjtBQUU3QyxlQUFPO1VBQ0g7VUFDQTtVQUNBOztNQUVSOztBQXRCSixZQUFBLFVBQUE7Ozs7Ozs7OztBQ3ZCQSxRQUFBLG1DQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FBTyxvQ0FBeUMsR0FBRztBQUV2RSxRQUFNLGNBQWM7QUFDcEIsUUFBTSxhQUFhO0FBT25CLFFBQXFCLDJCQUFyQixjQUFzRCxpQ0FBQSx1Q0FBc0M7TUFDeEYsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxPQUFPLFNBQVMsTUFBTSxXQUFXO0FBQ3ZDLGNBQU0sUUFBUSxTQUFTLE1BQU0sWUFBWTtBQUV6QyxlQUFPLFFBQVEsd0JBQXVCLEVBQUcsTUFBTSxPQUFPLENBQUMsRUFBRSxPQUFPLFNBQVMsS0FBSyxFQUFFLE9BQU8sUUFBUSxJQUFJO01BQ3ZHOztBQVZKLFlBQUEsVUFBQTs7Ozs7Ozs7OztBQ1pBLFFBQUEsVUFBQTtBQUdBLGFBQVMsbUJBQW1CLGNBQXNCLGVBQXVCLGVBQXVCLE9BQWE7QUFDekcsYUFBTyxJQUFJLE9BQ0gsR0FBRyxlQUNBLHdJQVlBLGlCQUNQLEtBQUs7SUFFYjtBQUdBLGFBQVMsb0JBQW9CLGdCQUF3QixpQkFBdUI7QUFDeEUsYUFBTyxJQUFJLE9BQ1AsS0FBSyx3SkFXRSxtQkFDUCxHQUFHO0lBRVg7QUFFQSxRQUFNLGFBQWE7QUFDbkIsUUFBTSxlQUFlO0FBQ3JCLFFBQU0sZUFBZTtBQUNyQixRQUFNLHFCQUFxQjtBQUMzQixRQUFNLG1CQUFtQjtBQUV6QixRQUFzQiwrQkFBdEIsTUFBa0Q7TUFLOUMsWUFBWSxhQUFhLE9BQUs7QUFpVnRCLGFBQUEsc0JBQXNCO0FBQ3RCLGFBQUEsc0JBQXNCO0FBQ3RCLGFBQUEsMkJBQTJCO0FBcUIzQixhQUFBLHVCQUF1QjtBQUN2QixhQUFBLHdCQUF3QjtBQUN4QixhQUFBLDRCQUE0QjtBQXpXaEMsYUFBSyxhQUFhO01BQ3RCO01BRUEsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLDZCQUEwQjtBQUN0QixlQUFPO01BQ1g7TUFFQSxnQkFBYTtBQUNULGVBQU87TUFDWDtNQUVBLGtCQUFlO0FBQ1gsZUFBTztNQUNYO01BRUEsUUFBUSxTQUF1QjtBQUMzQixlQUFPLEtBQUssa0NBQWlDO01BQ2pEO01BRUEsUUFBUSxTQUF5QixPQUF1QjtBQUNwRCxjQUFNLGtCQUFrQixLQUFLLDZCQUE2QixTQUFTLEtBQUs7QUFDeEUsWUFBSSxDQUFDLGlCQUFpQjtBQUNsQixnQkFBTSxTQUFTLE1BQU0sR0FBRztBQUN4QixpQkFBTzs7QUFHWCxjQUFNLFFBQVEsTUFBTSxRQUFRLE1BQU0sR0FBRztBQUNyQyxjQUFNQyxRQUFPLE1BQU0sR0FBRyxVQUFVLE1BQU0sR0FBRyxNQUFNO0FBQy9DLGNBQU0sU0FBUyxRQUFRLG9CQUFvQixPQUFPQSxPQUFNLGVBQWU7QUFDdkUsY0FBTSxTQUFTLE1BQU0sR0FBRztBQUV4QixjQUFNLGdCQUFnQixRQUFRLEtBQUssVUFBVSxNQUFNLEtBQUs7QUFDeEQsY0FBTSxtQkFBbUIsS0FBSyxvQ0FBbUM7QUFDakUsY0FBTSxpQkFBaUIsaUJBQWlCLEtBQUssYUFBYTtBQUcxRCxZQUFJQSxNQUFLLE1BQU0sVUFBVSxLQUFLLGtCQUFrQixlQUFlLEdBQUcsTUFBTSx1QkFBdUIsR0FBRztBQUM5RixpQkFBTzs7QUFHWCxZQUNJLENBQUMsa0JBRUQsZUFBZSxHQUFHLE1BQU0sdUJBQXVCLEdBQ2pEO0FBQ0UsaUJBQU8sS0FBSyxzQ0FBc0MsTUFBTTs7QUFHNUQsZUFBTyxNQUFNLEtBQUssK0JBQStCLFNBQVMsZ0JBQWdCLE1BQU07QUFDaEYsWUFBSSxPQUFPLEtBQUs7QUFDWixpQkFBTyxRQUFRLGVBQWU7O0FBR2xDLGVBQU8sS0FBSyxtQ0FBbUMsTUFBTTtNQUN6RDtNQUVBLDZCQUNJLFNBQ0EsT0FDQSxTQUFTLE9BQUs7QUFFZCxjQUFNLGFBQWEsUUFBUSx3QkFBdUI7QUFDbEQsWUFBSSxTQUFTO0FBQ2IsWUFBSSxXQUFXO0FBR2YsWUFBSSxPQUFPLFNBQVMsTUFBTSxXQUFXO0FBQ3JDLFlBQUksT0FBTyxLQUFLO0FBQ1osY0FBSSxLQUFLLGNBQWMsTUFBTSxpQkFBaUIsTUFBTTtBQUNoRCxtQkFBTzs7QUFHWCxtQkFBUyxPQUFPO0FBQ2hCLGlCQUFPLEtBQUssTUFBTSxPQUFPLEdBQUc7O0FBR2hDLFlBQUksT0FBTyxJQUFJO0FBQ1gsaUJBQU87O0FBSVgsWUFBSSxNQUFNLGlCQUFpQixNQUFNO0FBQzdCLGNBQUksTUFBTSxjQUFjLFVBQVUsS0FBSyxDQUFDLE1BQU0sbUJBQW1CO0FBRTdELG1CQUFPOztBQUdYLG1CQUFTLFNBQVMsTUFBTSxhQUFhOztBQUd6QyxZQUFJLFVBQVUsSUFBSTtBQUNkLGlCQUFPOztBQUdYLFlBQUksT0FBTyxJQUFJO0FBQ1gscUJBQVcsUUFBQSxTQUFTOztBQUl4QixZQUFJLE1BQU0scUJBQXFCLE1BQU07QUFDakMsY0FBSSxPQUFPO0FBQUksbUJBQU87QUFDdEIsZ0JBQU0sT0FBTyxNQUFNLGtCQUFrQixHQUFHLFlBQVc7QUFDbkQsY0FBSSxRQUFRLEtBQUs7QUFDYix1QkFBVyxRQUFBLFNBQVM7QUFDcEIsZ0JBQUksUUFBUSxJQUFJO0FBQ1oscUJBQU87OztBQUlmLGNBQUksUUFBUSxLQUFLO0FBQ2IsdUJBQVcsUUFBQSxTQUFTO0FBQ3BCLGdCQUFJLFFBQVEsSUFBSTtBQUNaLHNCQUFROzs7O0FBS3BCLG1CQUFXLE9BQU8sUUFBUSxJQUFJO0FBQzlCLG1CQUFXLE9BQU8sVUFBVSxNQUFNO0FBRWxDLFlBQUksYUFBYSxNQUFNO0FBQ25CLHFCQUFXLE9BQU8sWUFBWSxRQUFRO2VBQ25DO0FBQ0gsY0FBSSxPQUFPLElBQUk7QUFDWCx1QkFBVyxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7aUJBQ3JDO0FBQ0gsdUJBQVcsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFOzs7QUFLaEQsWUFBSSxNQUFNLHVCQUF1QixNQUFNO0FBQ25DLGdCQUFNLGNBQWMsU0FBUyxNQUFNLG9CQUFvQixVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQ3RFLGNBQUksZUFBZTtBQUFNLG1CQUFPO0FBRWhDLHFCQUFXLE9BQU8sZUFBZSxXQUFXOztBQUloRCxZQUFJLE1BQU0saUJBQWlCLE1BQU07QUFDN0IsZ0JBQU0sU0FBUyxTQUFTLE1BQU0sYUFBYTtBQUMzQyxjQUFJLFVBQVU7QUFBSSxtQkFBTztBQUV6QixxQkFBVyxPQUFPLFVBQVUsTUFBTTs7QUFHdEMsZUFBTztNQUNYO01BRUEsK0JBQ0ksU0FDQSxPQUNBLFFBQXFCO0FBRXJCLGNBQU0sYUFBYSxRQUFRLHdCQUF1QjtBQUdsRCxZQUFJLE1BQU0sdUJBQXVCLE1BQU07QUFDbkMsZ0JBQU0sY0FBYyxTQUFTLE1BQU0sb0JBQW9CLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDdEUsY0FBSSxlQUFlO0FBQU0sbUJBQU87QUFFaEMscUJBQVcsT0FBTyxlQUFlLFdBQVc7O0FBSWhELFlBQUksTUFBTSxpQkFBaUIsTUFBTTtBQUM3QixnQkFBTSxTQUFTLFNBQVMsTUFBTSxhQUFhO0FBQzNDLGNBQUksVUFBVTtBQUFJLG1CQUFPO0FBRXpCLHFCQUFXLE9BQU8sVUFBVSxNQUFNOztBQUd0QyxZQUFJLE9BQU8sU0FBUyxNQUFNLFdBQVc7QUFDckMsWUFBSSxTQUFTO0FBQ2IsWUFBSSxXQUFXO0FBR2YsWUFBSSxNQUFNLGlCQUFpQixNQUFNO0FBQzdCLG1CQUFTLFNBQVMsTUFBTSxhQUFhO21CQUM5QixPQUFPLEtBQUs7QUFDbkIsbUJBQVMsT0FBTztBQUNoQixpQkFBTyxLQUFLLE1BQU0sT0FBTyxHQUFHOztBQUdoQyxZQUFJLFVBQVUsTUFBTSxPQUFPLElBQUk7QUFDM0IsaUJBQU87O0FBR1gsWUFBSSxRQUFRLElBQUk7QUFDWixxQkFBVyxRQUFBLFNBQVM7O0FBSXhCLFlBQUksTUFBTSxxQkFBcUIsTUFBTTtBQUNqQyxjQUFJLE9BQU8sSUFBSTtBQUNYLG1CQUFPOztBQUdYLGdCQUFNLE9BQU8sTUFBTSxrQkFBa0IsR0FBRyxZQUFXO0FBQ25ELGNBQUksUUFBUSxLQUFLO0FBQ2IsdUJBQVcsUUFBQSxTQUFTO0FBQ3BCLGdCQUFJLFFBQVEsSUFBSTtBQUNaLHFCQUFPO0FBQ1Asa0JBQUksQ0FBQyxXQUFXLFVBQVUsS0FBSyxHQUFHO0FBQzlCLDJCQUFXLE1BQU0sT0FBTyxXQUFXLElBQUksS0FBSyxJQUFJLENBQUM7Ozs7QUFLN0QsY0FBSSxRQUFRLEtBQUs7QUFDYix1QkFBVyxRQUFBLFNBQVM7QUFDcEIsZ0JBQUksUUFBUTtBQUFJLHNCQUFROztBQUc1QixjQUFJLENBQUMsT0FBTyxNQUFNLFVBQVUsVUFBVSxHQUFHO0FBQ3JDLGdCQUFJLFlBQVksUUFBQSxTQUFTLElBQUk7QUFDekIscUJBQU8sTUFBTSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFFMUMsa0JBQUksT0FBTyxNQUFNLElBQUksTUFBTSxLQUFLLElBQUk7QUFDaEMsdUJBQU8sTUFBTSxPQUFPLFFBQVEsQ0FBQzs7bUJBRTlCO0FBQ0gscUJBQU8sTUFBTSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFFMUMsa0JBQUksT0FBTyxNQUFNLElBQUksTUFBTSxLQUFLLElBQUk7QUFDaEMsdUJBQU8sTUFBTSxPQUFPLFFBQVEsT0FBTyxNQUFNLElBQUksTUFBTSxJQUFJLEVBQUU7Ozs7O0FBTXpFLG1CQUFXLE9BQU8sUUFBUSxJQUFJO0FBQzlCLG1CQUFXLE9BQU8sVUFBVSxNQUFNO0FBRWxDLFlBQUksWUFBWSxHQUFHO0FBQ2YscUJBQVcsT0FBTyxZQUFZLFFBQVE7ZUFDbkM7QUFDSCxnQkFBTSxZQUFZLE9BQU8sTUFBTSxVQUFVLFVBQVUsS0FBSyxPQUFPLE1BQU0sSUFBSSxNQUFNLElBQUk7QUFDbkYsY0FBSSxXQUFXO0FBQ1gsZ0JBQUksT0FBTyxNQUFNLElBQUksTUFBTSxJQUFJLEtBQUssTUFBTTtBQUV0Qyx5QkFBVyxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7dUJBQ2pDLFFBQVEsSUFBSTtBQUNuQix5QkFBVyxPQUFPLFFBQVEsT0FBTyxFQUFFO0FBQ25DLHlCQUFXLE9BQU8sWUFBWSxRQUFBLFNBQVMsRUFBRTs7cUJBRXRDLE9BQU8sSUFBSTtBQUNsQix1QkFBVyxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7cUJBQ2pDLFFBQVEsSUFBSTtBQUNuQix1QkFBVyxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7OztBQUloRCxZQUFJLFdBQVcsS0FBSSxFQUFHLFFBQU8sSUFBSyxPQUFPLE1BQU0sS0FBSSxFQUFHLFFBQU8sR0FBSTtBQUM3RCxxQkFBVyxNQUFNLE9BQU8sV0FBVyxJQUFJLEtBQUssSUFBSSxDQUFDOztBQUdyRCxlQUFPO01BQ1g7TUFFUSxzQ0FBc0MsUUFBTTtBQUVoRCxZQUFJLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRztBQUMzQixpQkFBTzs7QUFJWCxZQUFJLE9BQU8sS0FBSyxNQUFNLFdBQVcsR0FBRztBQUNoQyxpQkFBTzs7QUFJWCxZQUFJLE9BQU8sS0FBSyxNQUFNLFdBQVcsR0FBRztBQUNoQyxpQkFBTzs7QUFJWCxjQUFNLG9CQUFvQixPQUFPLEtBQUssTUFBTSxvQkFBb0I7QUFDaEUsWUFBSSxtQkFBbUI7QUFDbkIsZ0JBQU0sZ0JBQXdCLGtCQUFrQjtBQUdoRCxjQUFJLEtBQUssWUFBWTtBQUNqQixtQkFBTzs7QUFJWCxjQUFJLGNBQWMsU0FBUyxHQUFHLEtBQUssQ0FBQyxjQUFjLE1BQU0sZUFBZSxHQUFHO0FBQ3RFLG1CQUFPOztBQUlYLGdCQUFNLGtCQUFrQixTQUFTLGFBQWE7QUFDOUMsY0FBSSxrQkFBa0IsSUFBSTtBQUN0QixtQkFBTzs7O0FBSWYsZUFBTztNQUNYO01BRVEsbUNBQW1DLFFBQU07QUFDN0MsWUFBSSxPQUFPLEtBQUssTUFBTSxXQUFXLEdBQUc7QUFDaEMsaUJBQU87O0FBSVgsY0FBTSxvQkFBb0IsT0FBTyxLQUFLLE1BQU0scUNBQXFDO0FBQ2pGLFlBQUksbUJBQW1CO0FBRW5CLGNBQUksS0FBSyxZQUFZO0FBQ2pCLG1CQUFPOztBQUdYLGdCQUFNLGtCQUEwQixrQkFBa0I7QUFDbEQsZ0JBQU0sZ0JBQXdCLGtCQUFrQjtBQUVoRCxjQUFJLGNBQWMsU0FBUyxHQUFHLEtBQUssQ0FBQyxjQUFjLE1BQU0sZUFBZSxHQUFHO0FBQ3RFLG1CQUFPOztBQUlYLGdCQUFNLGtCQUFrQixTQUFTLGFBQWE7QUFDOUMsZ0JBQU0sb0JBQW9CLFNBQVMsZUFBZTtBQUNsRCxjQUFJLGtCQUFrQixNQUFNLG9CQUFvQixJQUFJO0FBQ2hELG1CQUFPOzs7QUFJZixlQUFPO01BQ1g7TUFNQSxvQ0FBaUM7QUFDN0IsY0FBTSxnQkFBZ0IsS0FBSyxjQUFhO0FBQ3hDLGNBQU0sZ0JBQWdCLEtBQUssY0FBYTtBQUV4QyxZQUFJLEtBQUssd0JBQXdCLGlCQUFpQixLQUFLLHdCQUF3QixlQUFlO0FBQzFGLGlCQUFPLEtBQUs7O0FBR2hCLGFBQUssMkJBQTJCLG1CQUM1QixLQUFLLDJCQUEwQixHQUMvQixlQUNBLGVBQ0EsS0FBSyxhQUFZLENBQUU7QUFFdkIsYUFBSyxzQkFBc0I7QUFDM0IsYUFBSyxzQkFBc0I7QUFDM0IsZUFBTyxLQUFLO01BQ2hCO01BTUEsc0NBQW1DO0FBQy9CLGNBQU0saUJBQWlCLEtBQUssZUFBYztBQUMxQyxjQUFNLGtCQUFrQixLQUFLLGdCQUFlO0FBRTVDLFlBQUksS0FBSyx5QkFBeUIsa0JBQWtCLEtBQUssMEJBQTBCLGlCQUFpQjtBQUNoRyxpQkFBTyxLQUFLOztBQUdoQixhQUFLLDRCQUE0QixvQkFBb0IsZ0JBQWdCLGVBQWU7QUFDcEYsYUFBSyx1QkFBdUI7QUFDNUIsYUFBSyx3QkFBd0I7QUFDN0IsZUFBTyxLQUFLO01BQ2hCOztBQTdYSixZQUFBLCtCQUFBOzs7Ozs7Ozs7QUNoREEsUUFBQSxVQUFBO0FBQ0EsUUFBQSxpQ0FBQTtBQUVBLFFBQXFCLHlCQUFyQixjQUFvRCwrQkFBQSw2QkFBNEI7TUFDNUUsWUFBWSxZQUFVO0FBQ2xCLGNBQU0sVUFBVTtNQUNwQjtNQUVBLGlCQUFjO0FBQ1YsZUFBTztNQUNYO01BRUEsZ0JBQWE7QUFDVCxlQUFPO01BQ1g7TUFFQSxnQkFBYTtBQUNULGVBQU87TUFDWDtNQUVBLDZCQUE2QixTQUF5QixPQUF1QjtBQUN6RSxjQUFNLGFBQWEsTUFBTSw2QkFBNkIsU0FBUyxLQUFLO0FBQ3BFLFlBQUksWUFBWTtBQUNaLGNBQUksTUFBTSxHQUFHLFNBQVMsT0FBTyxHQUFHO0FBQzVCLGtCQUFNLE9BQU8sV0FBVyxJQUFJLE1BQU07QUFDbEMsZ0JBQUksUUFBUSxLQUFLLE9BQU8sSUFBSTtBQUN4Qix5QkFBVyxPQUFPLFFBQVEsV0FBVyxJQUFJLE1BQU0sSUFBSSxFQUFFO0FBQ3JELHlCQUFXLE9BQU8sWUFBWSxRQUFBLFNBQVMsRUFBRTt1QkFDbEMsT0FBTyxHQUFHO0FBQ2pCLHlCQUFXLE9BQU8sWUFBWSxRQUFBLFNBQVMsRUFBRTs7O0FBSWpELGNBQUksTUFBTSxHQUFHLFNBQVMsV0FBVyxHQUFHO0FBQ2hDLHVCQUFXLE9BQU8sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN6QyxrQkFBTSxPQUFPLFdBQVcsSUFBSSxNQUFNO0FBQ2xDLGdCQUFJLFFBQVEsS0FBSyxRQUFRLEdBQUc7QUFDeEIseUJBQVcsT0FBTyxRQUFRLFdBQVcsSUFBSSxNQUFNLElBQUksRUFBRTs7O0FBSTdELGNBQUksTUFBTSxHQUFHLFNBQVMsU0FBUyxHQUFHO0FBQzlCLHVCQUFXLE9BQU8sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN6QyxrQkFBTSxPQUFPLFdBQVcsSUFBSSxNQUFNO0FBQ2xDLGdCQUFJLE9BQU8sSUFBSTtBQUNYLHlCQUFXLE9BQU8sUUFBUSxXQUFXLElBQUksTUFBTSxDQUFDOzs7O0FBSzVELGVBQU87TUFDWDs7QUFoREosWUFBQSxVQUFBOzs7Ozs7Ozs7O0FDQUEsYUFBZ0IsaUJBQWlCLFdBQW9CO0FBQ2pELFlBQU0sV0FBVyxDQUFBO0FBQ2pCLGlCQUFXLE9BQU8sV0FBVztBQUV6QixpQkFBUyxPQUFPLENBQUMsVUFBVTs7QUFHL0IsYUFBTztJQUNYO0FBUkEsWUFBQSxtQkFBQTtBQVVBLGFBQWdCLG9CQUFvQixZQUErQixXQUFvQjtBQUNuRixZQUFNLFNBQVMsV0FBVyxNQUFLO0FBRS9CLFVBQUksT0FBTyxXQUFXLE1BQUs7QUFDM0IsaUJBQVcsT0FBTyxXQUFXO0FBRXpCLGVBQU8sS0FBSyxJQUFJLFVBQVUsTUFBTSxHQUFnQjs7QUFHcEQsVUFBSSxTQUFTLGFBQWEsT0FBTyxhQUFhLFVBQVUsYUFBYSxXQUFXLGFBQWEsVUFBVSxXQUFXO0FBQzlHLGVBQU8sTUFBTSxPQUFPLEtBQUssS0FBSSxDQUFFO0FBQy9CLGVBQU8sTUFBTSxTQUFTLEtBQUssTUFBSyxJQUFLLENBQUM7QUFDdEMsZUFBTyxNQUFNLFFBQVEsS0FBSyxLQUFJLENBQUU7O0FBR3BDLFVBQUksWUFBWSxhQUFhLFlBQVksYUFBYSxVQUFVLFdBQVc7QUFDdkUsZUFBTyxNQUFNLFVBQVUsS0FBSyxPQUFNLENBQUU7QUFDcEMsZUFBTyxNQUFNLFVBQVUsS0FBSyxPQUFNLENBQUU7QUFDcEMsZUFBTyxNQUFNLFFBQVEsS0FBSyxLQUFJLENBQUU7O0FBR3BDLGFBQU87SUFDWDtBQXRCQSxZQUFBLHNCQUFBOzs7Ozs7Ozs7QUNkQSxRQUFBLGNBQUE7QUFDQSxRQUFBLFlBQUE7QUFDQSxRQUFBLG1DQUFBO0FBQ0EsUUFBQSxjQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FBTyxJQUFJLFlBQUEsa0VBQWtFLEdBQUc7QUFDcEcsUUFBTSxpQkFBaUIsSUFBSSxPQUFPLElBQUksWUFBQSwrQ0FBK0MsR0FBRztBQUV4RixRQUFxQiw0QkFBckIsY0FBdUQsaUNBQUEsdUNBQXNDO01BQ3pGLFlBQW9CLFlBQW1CO0FBQ25DLGNBQUs7QUFEVyxhQUFBLGFBQUE7TUFFcEI7TUFFQSxlQUFZO0FBQ1IsZUFBTyxLQUFLLGFBQWEsaUJBQWlCO01BQzlDO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFlBQVksWUFBQSxlQUFlLE1BQU0sRUFBRTtBQUN6QyxjQUFNLGtCQUFrQixZQUFBLGlCQUFpQixTQUFTO0FBRWxELGVBQU8sVUFBQSxrQkFBa0IsNEJBQTRCLFFBQVEsV0FBVyxlQUFlO01BQzNGOztBQWRKLFlBQUEsVUFBQTs7Ozs7Ozs7O0FDUkEsUUFBQSxjQUFBO0FBQ0EsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLElBQUksWUFBQSwyRkFDSixHQUFHO0FBR1AsUUFBTSxpQkFBaUIsSUFBSSxPQUFPLE1BQVcsWUFBQSxxQkFBcUIsa0NBQTRDLEdBQUc7QUFDakgsUUFBTSxzQkFBc0I7QUFFNUIsUUFBcUIsOEJBQXJCLGNBQXlELGlDQUFBLHVDQUFzQztNQUMzRixZQUFvQixZQUFtQjtBQUNuQyxjQUFLO0FBRFcsYUFBQSxhQUFBO01BRXBCO01BRUEsZUFBWTtBQUNSLGVBQU8sS0FBSyxhQUFhLGlCQUFpQjtNQUM5QztNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxZQUFZLFlBQUEsZUFBZSxNQUFNLG9CQUFvQjtBQUMzRCxlQUFPLFVBQUEsa0JBQWtCLDRCQUE0QixRQUFRLFdBQVcsU0FBUztNQUNyRjs7QUFaSixZQUFBLFVBQUE7Ozs7Ozs7Ozs7QUNQQSxRQUFzQkMsVUFBdEIsTUFBNEI7TUFHeEIsT0FBTyxTQUF5QixTQUF3QjtBQUNwRCxlQUFPLFFBQVEsT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRLFNBQVMsQ0FBQyxDQUFDO01BQ3pEOztBQUxKLFlBQUEsU0FBQUE7QUFXQSxRQUFzQixpQkFBdEIsTUFBb0M7TUFlaEMsT0FBTyxTQUF5QixTQUF3QjtBQUNwRCxZQUFJLFFBQVEsU0FBUyxHQUFHO0FBQ3BCLGlCQUFPOztBQUdYLGNBQU0sZ0JBQWlDLENBQUE7QUFDdkMsWUFBSSxZQUFZLFFBQVE7QUFDeEIsWUFBSSxhQUFhO0FBRWpCLGlCQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxLQUFLO0FBQ3JDLHVCQUFhLFFBQVE7QUFFckIsZ0JBQU0sY0FBYyxRQUFRLEtBQUssVUFBVSxVQUFVLFFBQVEsVUFBVSxLQUFLLFFBQVEsV0FBVyxLQUFLO0FBQ3BHLGNBQUksQ0FBQyxLQUFLLG1CQUFtQixhQUFhLFdBQVcsWUFBWSxPQUFPLEdBQUc7QUFDdkUsMEJBQWMsS0FBSyxTQUFTO0FBQzVCLHdCQUFZO2lCQUNUO0FBQ0gsa0JBQU0sT0FBTztBQUNiLGtCQUFNLFFBQVE7QUFDZCxrQkFBTSxlQUFlLEtBQUssYUFBYSxhQUFhLE1BQU0sT0FBTyxPQUFPO0FBQ3hFLG9CQUFRLE1BQU0sTUFBSztBQUNmLHNCQUFRLElBQUksR0FBRyxLQUFLLFlBQVksZUFBZSxZQUFZLGNBQWMsY0FBYztZQUMzRixDQUFDO0FBRUQsd0JBQVk7OztBQUlwQixZQUFJLGFBQWEsTUFBTTtBQUNuQix3QkFBYyxLQUFLLFNBQVM7O0FBR2hDLGVBQU87TUFDWDs7QUFoREosWUFBQSxpQkFBQTs7Ozs7Ozs7O0FDWkEsUUFBQSxxQkFBQTtBQUVBLFFBQThCLGdDQUE5QixjQUFvRSxtQkFBQSxlQUFjO01BRzlFLG1CQUFtQixhQUFhLGVBQWUsWUFBVTtBQUNyRCxlQUFPLENBQUMsY0FBYyxPQUFPLENBQUMsV0FBVyxPQUFPLFlBQVksTUFBTSxLQUFLLGVBQWMsQ0FBRSxLQUFLO01BQ2hHO01BRUEsYUFBYSxhQUFhLFlBQVksVUFBUTtBQUMxQyxZQUFJLENBQUMsV0FBVyxNQUFNLHVCQUFzQixLQUFNLENBQUMsU0FBUyxNQUFNLHVCQUFzQixHQUFJO0FBQ3hGLG1CQUFTLE1BQU0scUJBQW9CLEVBQUcsUUFBUSxDQUFDLFFBQU87QUFDbEQsZ0JBQUksQ0FBQyxXQUFXLE1BQU0sVUFBVSxHQUFHLEdBQUc7QUFDbEMseUJBQVcsTUFBTSxPQUFPLEtBQUssU0FBUyxNQUFNLElBQUksR0FBRyxDQUFDOztVQUU1RCxDQUFDO0FBRUQscUJBQVcsTUFBTSxxQkFBb0IsRUFBRyxRQUFRLENBQUMsUUFBTztBQUNwRCxnQkFBSSxDQUFDLFNBQVMsTUFBTSxVQUFVLEdBQUcsR0FBRztBQUNoQyx1QkFBUyxNQUFNLE9BQU8sS0FBSyxXQUFXLE1BQU0sSUFBSSxHQUFHLENBQUM7O1VBRTVELENBQUM7O0FBR0wsWUFBSSxXQUFXLE1BQU0sS0FBSSxFQUFHLFFBQU8sSUFBSyxTQUFTLE1BQU0sS0FBSSxFQUFHLFFBQU8sR0FBSTtBQUNyRSxjQUFJLGFBQWEsV0FBVyxNQUFNLE1BQUs7QUFDdkMsY0FBSSxXQUFXLFNBQVMsTUFBTSxNQUFLO0FBRW5DLGNBQUksV0FBVyxNQUFNLHVCQUFzQixLQUFNLFdBQVcsSUFBSSxJQUFJLE1BQU0sRUFBRSxTQUFTLFFBQVEsR0FBRztBQUM1Rix5QkFBYSxXQUFXLElBQUksSUFBSSxNQUFNO0FBQ3RDLHVCQUFXLE1BQU0sTUFBTSxPQUFPLFdBQVcsS0FBSSxDQUFFO0FBQy9DLHVCQUFXLE1BQU0sTUFBTSxTQUFTLFdBQVcsTUFBSyxJQUFLLENBQUM7QUFDdEQsdUJBQVcsTUFBTSxNQUFNLFFBQVEsV0FBVyxLQUFJLENBQUU7cUJBQ3pDLFNBQVMsTUFBTSx1QkFBc0IsS0FBTSxTQUFTLElBQUksR0FBRyxNQUFNLEVBQUUsUUFBUSxVQUFVLEdBQUc7QUFDL0YsdUJBQVcsU0FBUyxJQUFJLEdBQUcsTUFBTTtBQUNqQyxxQkFBUyxNQUFNLE1BQU0sT0FBTyxTQUFTLEtBQUksQ0FBRTtBQUMzQyxxQkFBUyxNQUFNLE1BQU0sU0FBUyxTQUFTLE1BQUssSUFBSyxDQUFDO0FBQ2xELHFCQUFTLE1BQU0sTUFBTSxRQUFRLFNBQVMsS0FBSSxDQUFFO2lCQUN6QztBQUNILGFBQUMsVUFBVSxVQUFVLElBQUksQ0FBQyxZQUFZLFFBQVE7OztBQUl0RCxjQUFNLFNBQVMsV0FBVyxNQUFLO0FBQy9CLGVBQU8sUUFBUSxXQUFXO0FBQzFCLGVBQU8sTUFBTSxTQUFTO0FBQ3RCLGVBQU8sUUFBUSxLQUFLLElBQUksV0FBVyxPQUFPLFNBQVMsS0FBSztBQUN4RCxZQUFJLFdBQVcsUUFBUSxTQUFTLE9BQU87QUFDbkMsaUJBQU8sT0FBTyxXQUFXLE9BQU8sY0FBYyxTQUFTO2VBQ3BEO0FBQ0gsaUJBQU8sT0FBTyxTQUFTLE9BQU8sY0FBYyxXQUFXOztBQUczRCxlQUFPO01BQ1g7O0FBcERKLFlBQUEsVUFBQTs7Ozs7Ozs7Ozs7O0FDSEEsUUFBQSxrQ0FBQUMsaUJBQUEsdUNBQUE7QUFRQSxRQUFxQiwwQkFBckIsY0FBcUQsZ0NBQUEsUUFBNkI7TUFDOUUsaUJBQWM7QUFDVixlQUFPO01BQ1g7O0FBSEosWUFBQSxVQUFBOzs7Ozs7Ozs7O0FDWEEsUUFBQSxVQUFBO0FBRUEsYUFBZ0Isb0JBQW9CLFlBQTJCLFlBQXlCO0FBQ3BGLFlBQU0sU0FBUyxXQUFXLE1BQUs7QUFDL0IsWUFBTSxZQUFZLFdBQVc7QUFDN0IsWUFBTSxZQUFZLFdBQVc7QUFFN0IsYUFBTyxRQUFRLHVCQUF1QixXQUFXLFNBQVM7QUFDMUQsVUFBSSxXQUFXLE9BQU8sUUFBUSxXQUFXLE9BQU8sTUFBTTtBQUNsRCxjQUFNLFVBQVUsV0FBVyxPQUFPLE9BQU8sV0FBVyxRQUFRLFdBQVc7QUFDdkUsY0FBTSxVQUFVLFdBQVcsT0FBTyxPQUFPLFdBQVcsUUFBUSxXQUFXO0FBQ3ZFLGNBQU0sY0FBYyx1QkFBdUIsU0FBUyxPQUFPO0FBRTNELFlBQUksV0FBVyxPQUFPLFFBQVEsWUFBWSxLQUFJLEVBQUcsUUFBTyxJQUFLLE9BQU8sTUFBTSxLQUFJLEVBQUcsUUFBTyxHQUFJO0FBRXhGLGNBQUksWUFBWSxVQUFVLEtBQUssR0FBRztBQUM5Qix3QkFBWSxPQUFPLE9BQU8sWUFBWSxJQUFJLEtBQUssSUFBSSxDQUFDO2lCQUNqRDtBQUNILHdCQUFZLE1BQU0sT0FBTyxZQUFZLElBQUksS0FBSyxJQUFJLENBQUM7OztBQUkzRCxlQUFPLE1BQU07O0FBR2pCLGFBQU87SUFDWDtBQXhCQSxZQUFBLHNCQUFBO0FBMEJBLGFBQWdCLHVCQUNaLGVBQ0EsZUFBZ0M7QUFFaEMsWUFBTSxvQkFBb0IsY0FBYyxNQUFLO0FBRTdDLFVBQUksY0FBYyxVQUFVLE1BQU0sR0FBRztBQUNqQywwQkFBa0IsT0FBTyxRQUFRLGNBQWMsSUFBSSxNQUFNLENBQUM7QUFDMUQsMEJBQWtCLE9BQU8sVUFBVSxjQUFjLElBQUksUUFBUSxDQUFDO0FBRTlELFlBQUksY0FBYyxVQUFVLFFBQVEsR0FBRztBQUNuQyw0QkFBa0IsT0FBTyxVQUFVLGNBQWMsSUFBSSxRQUFRLENBQUM7QUFFOUQsY0FBSSxjQUFjLFVBQVUsYUFBYSxHQUFHO0FBQ3hDLDhCQUFrQixPQUFPLGVBQWUsY0FBYyxJQUFJLGFBQWEsQ0FBQztpQkFDckU7QUFDSCw4QkFBa0IsTUFBTSxlQUFlLGNBQWMsSUFBSSxhQUFhLENBQUM7O2VBRXhFO0FBQ0gsNEJBQWtCLE1BQU0sVUFBVSxjQUFjLElBQUksUUFBUSxDQUFDO0FBQzdELDRCQUFrQixNQUFNLGVBQWUsY0FBYyxJQUFJLGFBQWEsQ0FBQzs7YUFFeEU7QUFDSCwwQkFBa0IsTUFBTSxRQUFRLGNBQWMsSUFBSSxNQUFNLENBQUM7QUFDekQsMEJBQWtCLE1BQU0sVUFBVSxjQUFjLElBQUksUUFBUSxDQUFDO0FBQzdELDBCQUFrQixNQUFNLFVBQVUsY0FBYyxJQUFJLFFBQVEsQ0FBQztBQUM3RCwwQkFBa0IsTUFBTSxlQUFlLGNBQWMsSUFBSSxhQUFhLENBQUM7O0FBRzNFLFVBQUksY0FBYyxVQUFVLGdCQUFnQixHQUFHO0FBQzNDLDBCQUFrQixPQUFPLGtCQUFrQixjQUFjLElBQUksZ0JBQWdCLENBQUM7O0FBR2xGLFVBQUksY0FBYyxVQUFVLFVBQVUsR0FBRztBQUNyQywwQkFBa0IsT0FBTyxZQUFZLGNBQWMsSUFBSSxVQUFVLENBQUM7aUJBQzNELGNBQWMsSUFBSSxVQUFVLEtBQUssUUFBUSxrQkFBa0IsSUFBSSxVQUFVLEtBQUssTUFBTTtBQUMzRiwwQkFBa0IsTUFBTSxZQUFZLGNBQWMsSUFBSSxVQUFVLENBQUM7O0FBR3JFLFVBQUksa0JBQWtCLElBQUksVUFBVSxLQUFLLFFBQUEsU0FBUyxNQUFNLGtCQUFrQixJQUFJLE1BQU0sSUFBSSxJQUFJO0FBQ3hGLFlBQUksY0FBYyxVQUFVLE1BQU0sR0FBRztBQUNqQyw0QkFBa0IsT0FBTyxRQUFRLGtCQUFrQixJQUFJLE1BQU0sSUFBSSxFQUFFO2VBQ2hFO0FBQ0gsNEJBQWtCLE1BQU0sUUFBUSxrQkFBa0IsSUFBSSxNQUFNLElBQUksRUFBRTs7O0FBSTFFLGFBQU87SUFDWDtBQWhEQSxZQUFBLHlCQUFBOzs7Ozs7Ozs7QUN6QkEsUUFBQSxxQkFBQTtBQUVBLFFBQUEsdUJBQUE7QUFFQSxRQUE4Qix5QkFBOUIsY0FBNkQsbUJBQUEsZUFBYztNQUd2RSxtQkFBbUIsYUFBcUIsZUFBOEIsWUFBeUI7QUFDM0YsZ0JBQ00sY0FBYyxNQUFNLFdBQVUsS0FBTSxXQUFXLE1BQU0sV0FBVSxLQUM1RCxXQUFXLE1BQU0sV0FBVSxLQUFNLGNBQWMsTUFBTSxXQUFVLE1BQ3BFLFlBQVksTUFBTSxLQUFLLGVBQWMsQ0FBRSxLQUFLO01BRXBEO01BRUEsYUFBYSxhQUFxQixlQUE4QixZQUF5QjtBQUNyRixjQUFNLFNBQVMsY0FBYyxNQUFNLFdBQVUsSUFDdkMscUJBQUEsb0JBQW9CLGVBQWUsVUFBVSxJQUM3QyxxQkFBQSxvQkFBb0IsWUFBWSxhQUFhO0FBRW5ELGVBQU8sUUFBUSxjQUFjO0FBQzdCLGVBQU8sT0FBTyxjQUFjLE9BQU8sY0FBYyxXQUFXO0FBQzVELGVBQU87TUFDWDs7QUFuQkosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNSQSxRQUFBLGlDQUFBQyxpQkFBQSxzQ0FBQTtBQVFBLFFBQXFCLHlCQUFyQixjQUFvRCwrQkFBQSxRQUE0QjtNQUM1RSxpQkFBYztBQUNWLGVBQU8sSUFBSSxPQUFPLDBDQUEwQztNQUNoRTs7QUFISixZQUFBLFVBQUE7Ozs7Ozs7OztBQ0pBLFFBQU0sd0JBQXdCLElBQUksT0FBTyw0Q0FBNEMsR0FBRztBQUN4RixRQUFNLDRCQUE0QjtNQUM5QixNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxNQUFNO01BQ04sTUFBTTtNQUNOLE1BQU07TUFDTixNQUFNO01BQ04sS0FBSztNQUNMLE9BQU87TUFDUCxNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLE1BQU07TUFDTixPQUFPO01BQ1AsTUFBTTtNQUNOLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsT0FBTztNQUNQLE9BQU87TUFDUCxLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLE1BQU07TUFDTixPQUFPO01BQ1AsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsSUFBSTtNQUNKLE1BQU07TUFDTixLQUFLO01BQ0wsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsTUFBTTtNQUNOLE9BQU87TUFDUCxNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE9BQU87TUFDUCxNQUFNO01BQ04sS0FBSztNQUNMLE1BQU07TUFDTixNQUFNO01BQ04sTUFBTTtNQUNOLE1BQU07TUFDTixPQUFPO01BQ1AsTUFBTTtNQUNOLE1BQU07TUFDTixNQUFNO01BQ04sS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxPQUFPO01BQ1AsTUFBTTtNQUNOLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixNQUFNO01BQ04sT0FBTztNQUNQLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLE9BQU87TUFDUCxNQUFNO01BQ04sS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxJQUFJO01BQ0osS0FBSztNQUNMLE1BQU07TUFDTixLQUFLO01BQ0wsS0FBSztNQUNMLE1BQU07TUFDTixNQUFNO01BQ04sS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNM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LHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN2QztlQUVDO0FBQ0Qsc0JBQVUsTUFBTSxRQUFRLENBQUM7QUFDekIsc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3ZDO2VBRUM7ZUFDQTtBQUNELHNCQUFVLE1BQU0sUUFBUSxFQUFFO0FBQzFCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN2QztlQUVDO0FBQ0Qsc0JBQVUsTUFBTSxRQUFRLEVBQUU7QUFDMUIsc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3ZDO2VBRUM7QUFDRCxzQkFBVSxNQUFNLFFBQVEsRUFBRTtBQUMxQixzQkFBVSxNQUFNLFVBQVUsQ0FBQztBQUMzQixzQkFBVSxNQUFNLFVBQVUsQ0FBQztBQUMzQixzQkFBVSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFDdkM7ZUFFQztBQUNELHNCQUFVLE1BQU0sUUFBUSxFQUFFO0FBQzFCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN2QztlQUVDO0FBQ0QsZ0JBQUksVUFBVSxJQUFJLE1BQU0sSUFBSSxHQUFHO0FBQzNCLDBCQUFZLFlBQUEsb0JBQW9CLFdBQVcsRUFBRSxPQUFPLEVBQUMsQ0FBRTs7QUFHM0Qsc0JBQVUsTUFBTSxRQUFRLENBQUM7QUFDekIsc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3ZDOztBQUVSLGVBQU87TUFDWDs7QUF0RUosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTkEsUUFBQSxVQUFBQyxpQkFBQSxtQkFBQTtBQUNBLFFBQUEsbUNBQUE7QUFDQSxRQUFBLFVBQUE7QUFDQSxRQUFBLHVCQUFBQSxpQkFBQSw0QkFBQTtBQUNBLFFBQUEsYUFBQUMsY0FBQSwwQkFBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLHFLQUdBLEdBQUc7QUFHUCxRQUFNLGFBQWE7QUFDbkIsUUFBTSxhQUFhO0FBRW5CLFFBQXFCLHFCQUFyQixjQUFnRCxpQ0FBQSx1Q0FBc0M7TUFDbEYsYUFBYSxTQUF1QjtBQUNoQyxlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELFlBQUksYUFBYSxRQUFBLFFBQU0sUUFBUSxPQUFPO0FBQ3RDLGNBQU0sZUFBZSxNQUFNLGVBQWUsSUFBSSxZQUFXO0FBQ3pELGNBQU0sZUFBZSxNQUFNLGVBQWUsSUFBSSxZQUFXO0FBRXpELFlBQUksWUFBWSxRQUFRLHdCQUF1QjtBQUMvQyxnQkFBUTtlQUNDO0FBQ0Qsd0JBQVksV0FBVyxJQUFJLFFBQVEsU0FBUztBQUM1QztlQUVDO0FBQ0Qsd0JBQVksV0FBVyxNQUFNLFFBQVEsU0FBUztBQUM5QztlQUVDO0FBQ0Qsb0JBQUEsaUJBQWlCLFdBQVcsVUFBVTtBQUN0QztlQUVDO2VBQ0E7QUFDRCx5QkFBYSxXQUFXLElBQUksR0FBRyxLQUFLO0FBQ3BDLG9CQUFBLGlCQUFpQixXQUFXLFVBQVU7QUFDdEM7ZUFFQztBQUNELHlCQUFhLFdBQVcsSUFBSSxJQUFJLEtBQUs7QUFDckMsb0JBQUEsa0JBQWtCLFdBQVcsVUFBVTtBQUN2QyxvQkFBQSxpQkFBaUIsV0FBVyxVQUFVO0FBQ3RDO2VBRUM7QUFDRCx5QkFBYSxXQUFXLElBQUksSUFBSSxLQUFLO0FBQ3JDLG9CQUFBLGtCQUFrQixXQUFXLFVBQVU7QUFDdkMsb0JBQUEsaUJBQWlCLFdBQVcsVUFBVTtBQUN0Qzs7QUFHQSxnQkFBSSxZQUFZLE1BQU0sZ0JBQWdCLEdBQUc7QUFDckMsa0JBQUksV0FBVyxLQUFJLElBQUssR0FBRztBQUN2Qiw2QkFBYSxXQUFXLElBQUksSUFBSSxLQUFLOztBQUd6QyxzQkFBQSxrQkFBa0IsV0FBVyxVQUFVO0FBQ3ZDLHdCQUFVLE1BQU0sUUFBUSxDQUFDOztBQUc3Qjs7QUFHUixZQUFJLGFBQWE7QUFDYixzQkFBWSxxQkFBQSxRQUFtQixzQkFBc0IsV0FBVyxXQUFXOztBQUcvRSxlQUFPO01BQ1g7O0FBNURKLFlBQUEsVUFBQTs7Ozs7Ozs7O0FDaEJBLFFBQUEsVUFBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFFQSxRQUFNLFVBQVUsSUFBSSxPQUNoQix3SEFJUSxVQUFBLGdCQUFnQixZQUFBLGdCQUFnQix1QkFDZixZQUFBLHlDQUV6QixHQUFHO0FBR1AsUUFBTSxhQUFhO0FBQ25CLFFBQU0sZ0JBQWdCO0FBQ3RCLFFBQU0sbUJBQW1CO0FBQ3pCLFFBQU0sYUFBYTtBQUVuQixRQUFxQixnQ0FBckIsY0FBMkQsaUNBQUEsdUNBQXNDO01BQzdGLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sU0FBUyxRQUFRLG9CQUFvQixNQUFNLE9BQU8sTUFBTSxFQUFFO0FBRWhFLGNBQU0sUUFBUSxZQUFBLGlCQUFpQixNQUFNLGtCQUFrQixZQUFXO0FBQ2xFLGNBQU0sTUFBTSxTQUFTLE1BQU0sV0FBVztBQUN0QyxZQUFJLE1BQU0sSUFBSTtBQUVWLGdCQUFNLFFBQVEsTUFBTSxRQUFRLE1BQU0sWUFBWTtBQUM5QyxpQkFBTzs7QUFHWCxlQUFPLE1BQU0sT0FBTyxTQUFTLEtBQUs7QUFDbEMsZUFBTyxNQUFNLE9BQU8sT0FBTyxHQUFHO0FBRTlCLFlBQUksTUFBTSxhQUFhO0FBQ25CLGdCQUFNLGFBQWEsWUFBQSxVQUFVLE1BQU0sV0FBVztBQUM5QyxpQkFBTyxNQUFNLE9BQU8sUUFBUSxVQUFVO2VBQ25DO0FBQ0gsZ0JBQU0sT0FBTyxRQUFBLHFCQUFxQixRQUFRLFNBQVMsS0FBSyxLQUFLO0FBQzdELGlCQUFPLE1BQU0sTUFBTSxRQUFRLElBQUk7O0FBR25DLFlBQUksTUFBTSxnQkFBZ0I7QUFDdEIsZ0JBQU0sVUFBVSxTQUFTLE1BQU0sY0FBYztBQUU3QyxpQkFBTyxNQUFNLE9BQU8sTUFBTSxNQUFLO0FBQy9CLGlCQUFPLElBQUksT0FBTyxPQUFPLE9BQU87O0FBR3BDLGVBQU87TUFDWDs7QUFuQ0osWUFBQSxVQUFBOzs7Ozs7Ozs7QUN2QkEsUUFBQSxjQUFBO0FBQ0EsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUVBLFFBQXFCLDRCQUFyQixjQUF1RCxpQ0FBQSx1Q0FBc0M7TUFDekYsY0FBQTtBQUNJLGNBQUs7TUFDVDtNQUVBLGVBQVk7QUFDUixlQUFPLElBQUksT0FDUCxzSEFDUSxZQUFBLDJIQUVJLFVBQUEsZ0JBQWdCLFlBQUEsb0JBQW9CLE1BQ2hELEdBQUc7TUFFWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxNQUFNLE1BQU0sS0FBSyxZQUFBLG1CQUFtQixNQUFNLEVBQUUsSUFBSTtBQUN0RCxjQUFNLE9BQU8sWUFBQSxxQkFBcUIsTUFBTSxHQUFHLFlBQVc7QUFDdEQsWUFBSSxZQUFZLENBQUE7QUFDaEIsa0JBQVUsUUFBUTtBQUdsQixZQUFJLFdBQVcsTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUN2QyxtQkFBVyxTQUFTLFlBQVc7QUFDL0IsWUFBSSxDQUFDLFVBQVU7QUFDWDs7QUFHSixZQUFJLE1BQU0sS0FBSyxRQUFRLEtBQUssU0FBUyxLQUFLLFFBQVEsS0FBSyxZQUFZLEtBQUssUUFBUSxHQUFHO0FBQy9FLHNCQUFZLFlBQUEsaUJBQWlCLFNBQVM7O0FBRzFDLGVBQU8sVUFBQSxrQkFBa0IsNEJBQTRCLFFBQVEsV0FBVyxTQUFTO01BQ3JGOztBQWpDSixZQUFBLFVBQUE7Ozs7Ozs7Ozs7Ozs7QUNQQSxRQUFBLG1CQUFBO0FBRUEsUUFBQSxXQUFBO0FBQ0EsUUFBQSwwQkFBQUMsaUJBQUEsK0JBQUE7QUFDQSxRQUFBLG9CQUFBQSxpQkFBQSx5QkFBQTtBQUNBLFFBQUEsMkJBQUFBLGlCQUFBLGdDQUFBO0FBQ0EsUUFBQSxvQkFBQUEsaUJBQUEseUJBQUE7QUFDQSxRQUFBLG1DQUFBQSxpQkFBQSx3Q0FBQTtBQUNBLFFBQUEsNEJBQUFBLGlCQUFBLGlDQUFBO0FBQ0EsUUFBQSwyQkFBQUEsaUJBQUEsZ0NBQUE7QUFDQSxRQUFBLHVCQUFBQSxpQkFBQSw0QkFBQTtBQUNBLFFBQUEsdUJBQUFBLGlCQUFBLDRCQUFBO0FBQ0EsUUFBQSxrQ0FBQUEsaUJBQUEsdUNBQUE7QUFDQSxRQUFBLG1DQUFBQSxpQkFBQSx3Q0FBQTtBQUdhLFlBQUEsU0FBUyxJQUFJLFNBQUEsT0FBTywwQkFBeUIsQ0FBRTtBQUMvQyxZQUFBLFNBQVMsSUFBSSxTQUFBLE9BQU8sb0JBQW9CLElBQUksQ0FBQztBQUUxRCxhQUFnQixNQUFNQyxPQUFjLEtBQVksUUFBc0I7QUFDbEUsYUFBTyxRQUFBLE9BQU8sTUFBTUEsT0FBTSxLQUFLLE1BQU07SUFDekM7QUFGQSxZQUFBLFFBQUE7QUFJQSxhQUFnQkMsV0FBVUQsT0FBYyxLQUFZLFFBQXNCO0FBQ3RFLGFBQU8sUUFBQSxPQUFPLFVBQVVBLE9BQU0sS0FBSyxNQUFNO0lBQzdDO0FBRkEsWUFBQSxZQUFBQztBQUlBLGFBQWdCLDBCQUEwQixlQUFlLE1BQUk7QUFDekQsWUFBTSxTQUFTLG9CQUFvQixPQUFPLFlBQVk7QUFDdEQsYUFBTyxRQUFRLFFBQVEsSUFBSSxxQkFBQSxRQUFrQixDQUFFO0FBQy9DLGFBQU8sUUFBUSxRQUFRLElBQUkscUJBQUEsUUFBa0IsQ0FBRTtBQUMvQyxhQUFPLFFBQVEsUUFBUSxJQUFJLGlDQUFBLFFBQThCLENBQUU7QUFDM0QsYUFBTztJQUNYO0FBTkEsWUFBQSw0QkFBQTtBQVFBLGFBQWdCLG9CQUFvQixhQUFhLE1BQU0sZUFBZSxNQUFJO0FBQ3RFLGFBQU8saUJBQUEsMkJBQ0g7UUFDSSxTQUFTO1VBQ0wsSUFBSSxrQkFBQSxRQUFlO1VBQ25CLElBQUksd0JBQUEsUUFBc0IsWUFBWTtVQUN0QyxJQUFJLHlCQUFBLFFBQXNCO1VBQzFCLElBQUksaUNBQUEsUUFBOEI7VUFDbEMsSUFBSSxnQ0FBQSxRQUE2QjtVQUNqQyxJQUFJLGtCQUFBLFFBQWU7O1FBRXZCLFVBQVUsQ0FBQyxJQUFJLDBCQUFBLFFBQXVCLEdBQUksSUFBSSx5QkFBQSxRQUFzQixDQUFFO1NBRTFFLFVBQVU7SUFFbEI7QUFmQSxZQUFBLHNCQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakNBLFFBQUEsVUFBQUMsaUJBQUEsbUJBQUE7QUFDQSxRQUFBLFVBQUE7QUFDQSxRQUFBLG1DQUFBO0FBQ0EsUUFBQSxVQUFBO0FBQ0EsUUFBQSxhQUFBQyxjQUFBLDBCQUFBO0FBRUEsUUFBcUIscUJBQXJCLGNBQWdELGlDQUFBLHVDQUFzQztNQUNsRixhQUFhLFNBQXVCO0FBQ2hDLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsWUFBSSxhQUFhLFFBQUEsUUFBTSxRQUFRLE9BQU87QUFDdEMsY0FBTSxZQUFZLE1BQU0sR0FBRyxZQUFXO0FBQ3RDLGNBQU0sWUFBWSxRQUFRLHdCQUF1QjtBQUVqRCxnQkFBUTtlQUNDO0FBQ0QsbUJBQU8sV0FBVyxJQUFJLFFBQVEsU0FBUztlQUV0QztBQUNELG1CQUFPLFdBQVcsTUFBTSxRQUFRLFNBQVM7ZUFFeEM7QUFDRCxtQkFBTyxXQUFXLFVBQVUsUUFBUSxTQUFTO2VBRTVDO0FBQ0QsbUJBQU8sV0FBVyxTQUFTLFFBQVEsU0FBUzs7QUFHNUMsZ0JBQUksVUFBVSxNQUFNLGNBQWMsR0FBRztBQUNqQyxzQkFBQSxrQkFBa0IsV0FBVyxVQUFVO0FBQ3ZDLHdCQUFVLE1BQU0sUUFBUSxFQUFFO0FBQzFCLHdCQUFVLE1BQU0sWUFBWSxRQUFBLFNBQVMsRUFBRTt1QkFDaEMsVUFBVSxNQUFNLGFBQWEsR0FBRztBQUN2QywyQkFBYSxXQUFXLElBQUksSUFBSSxLQUFLO0FBQ3JDLHNCQUFBLGtCQUFrQixXQUFXLFVBQVU7QUFDdkMsd0JBQVUsTUFBTSxRQUFRLENBQUM7OztBQUlyQyxlQUFPO01BQ1g7O0FBcENKLFlBQUEsVUFBQTs7Ozs7Ozs7O0FDTkEsUUFBQSxVQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQXFCLHFCQUFyQixjQUFnRCxpQ0FBQSx1Q0FBc0M7TUFDbEYsYUFBYSxTQUF1QjtBQUNoQyxlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sY0FBYyxNQUFNLEdBQUcsWUFBVztBQUN4QyxjQUFNLFlBQVksUUFBUSx3QkFBdUI7QUFFakQsZ0JBQVE7ZUFDQztlQUNBO0FBQ0Qsc0JBQVUsTUFBTSxRQUFRLEVBQUU7QUFDMUIsc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3ZDO2VBRUM7QUFDRCxzQkFBVSxNQUFNLFFBQVEsRUFBRTtBQUMxQixzQkFBVSxNQUFNLFVBQVUsQ0FBQztBQUMzQixzQkFBVSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFDdkM7ZUFFQztBQUNELHNCQUFVLE1BQU0sUUFBUSxDQUFDO0FBQ3pCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN2QztlQUVDO0FBQ0Qsc0JBQVUsTUFBTSxRQUFRLEVBQUU7QUFDMUIsc0JBQVUsTUFBTSxVQUFVLENBQUM7QUFDM0Isc0JBQVUsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3ZDO2VBRUM7QUFDRCxzQkFBVSxNQUFNLFFBQVEsQ0FBQztBQUN6QixzQkFBVSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFDdkM7O0FBR1IsZUFBTztNQUNYOztBQTFDSixZQUFBLFVBQUE7Ozs7Ozs7OztBQ0xBLFFBQUEsaUNBQUE7QUFJQSxRQUFxQix5QkFBckIsY0FBb0QsK0JBQUEsNkJBQTRCO01BQzVFLGdCQUFhO0FBQ1QsZUFBTztNQUNYO01BRUEsaUJBQWM7QUFDVixlQUFPO01BQ1g7TUFFQSw2QkFBNkIsU0FBeUIsT0FBdUI7QUFFekUsWUFBSSxNQUFNLEdBQUcsTUFBTSxlQUFlLEdBQUc7QUFDakMsaUJBQU87O0FBR1gsZUFBTyxNQUFNLDZCQUE2QixTQUFTLEtBQUs7TUFDNUQ7O0FBaEJKLFlBQUEsVUFBQTs7Ozs7Ozs7Ozs7O0FDSkEsUUFBQSxpQ0FBQUMsaUJBQUEsc0NBQUE7QUFLQSxRQUFxQix5QkFBckIsY0FBb0QsK0JBQUEsUUFBNEI7TUFDNUUsaUJBQWM7QUFDVixlQUFPLElBQUksT0FBTyxtQ0FBZ0M7TUFDdEQ7O0FBSEosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNEQSxRQUFBLGtDQUFBQyxpQkFBQSx1Q0FBQTtBQU1BLFFBQXFCLDBCQUFyQixjQUFxRCxnQ0FBQSxRQUE2QjtNQUM5RSxpQkFBYztBQUNWLGVBQU87TUFDWDs7QUFISixZQUFBLFVBQUE7Ozs7Ozs7Ozs7QUNUQSxRQUFBLFlBQUE7QUFFYSxZQUFBLHFCQUFpRDtNQUMxRCxZQUFZO01BQ1osT0FBTztNQUNQLFNBQVM7TUFDVCxPQUFPO01BQ1AsU0FBUztNQUNULE9BQU87TUFDUCxZQUFZO01BQ1osT0FBTztNQUNQLFNBQVM7TUFDVCxPQUFPO01BQ1AsWUFBWTtNQUNaLE9BQU87TUFDUCxVQUFVO01BQ1YsT0FBTzs7QUFHRSxZQUFBLG1CQUErQztNQUN4RCxXQUFXO01BQ1gsT0FBTztNQUNQLFFBQVE7TUFDUixjQUFXO01BQ1gsVUFBTztNQUNQLFdBQVE7TUFDUixXQUFXO01BQ1gsT0FBTztNQUNQLFFBQVE7TUFDUixRQUFRO01BQ1IsT0FBTztNQUNQLFFBQVE7TUFDUixTQUFTO01BQ1QsT0FBTztNQUNQLFFBQVE7TUFDUixPQUFPO01BQ1AsUUFBUTtNQUNSLE9BQU87TUFDUCxXQUFXO01BQ1gsUUFBUTtNQUNSLE9BQU87TUFDUCxRQUFRO01BQ1IsV0FBUTtNQUNSLFFBQVE7TUFDUixhQUFhO01BQ2IsT0FBTztNQUNQLFFBQVE7TUFDUixRQUFRO01BQ1IsU0FBUztNQUNULFdBQVc7TUFDWCxPQUFPO01BQ1AsUUFBUTtNQUNSLFlBQVk7TUFDWixPQUFPO01BQ1AsUUFBUTtNQUNSLGVBQVk7TUFDWixZQUFZO01BQ1osT0FBTztNQUNQLFFBQVE7O0FBR0MsWUFBQSwwQkFBc0Q7TUFDL0QsTUFBTTtNQUNOLFFBQVE7TUFDUixTQUFTO01BQ1QsVUFBVTtNQUNWLFFBQVE7TUFDUixPQUFPO01BQ1AsUUFBUTtNQUNSLFFBQVE7TUFDUixRQUFRO01BQ1IsT0FBTztNQUNQLFFBQVE7TUFDUixTQUFTO01BQ1QsVUFBVTs7QUFHRCxZQUFBLHVCQUFtRTtNQUM1RSxPQUFPO01BQ1AsV0FBVztNQUNYLFlBQVk7TUFDWixPQUFPO01BQ1AsUUFBUTtNQUNSLFVBQVU7TUFDVixXQUFXO01BQ1gsS0FBSztNQUNMLE1BQU07TUFDTixPQUFPO01BQ1AsU0FBUztNQUNULFVBQVU7TUFDVixRQUFRO01BQ1IsU0FBUztNQUNULFdBQVc7TUFDWCxZQUFZO01BQ1osUUFBUTtNQUNSLGFBQWE7TUFDYixjQUFjO01BQ2QsT0FBTztNQUNQLFlBQVM7TUFDVCxhQUFVOztBQUtELFlBQUEsaUJBQWlCLE1BQU0sVUFBQSxnQkFDaEMsUUFBQSx1QkFBdUI7QUFHM0IsYUFBZ0IsbUJBQW1CLE9BQWE7QUFDNUMsWUFBTSxNQUFNLE1BQU0sWUFBVztBQUM3QixVQUFJLFFBQUEsd0JBQXdCLFNBQVMsUUFBVztBQUM1QyxlQUFPLFFBQUEsd0JBQXdCO2lCQUN4QixRQUFRLFNBQVMsUUFBUSxNQUFNO0FBQ3RDLGVBQU87aUJBQ0EsSUFBSSxNQUFNLFdBQVcsR0FBRztBQUMvQixlQUFPO2lCQUNBLElBQUksTUFBTSxRQUFRLEdBQUc7QUFDNUIsZUFBTzs7QUFHWCxhQUFPLFdBQVcsR0FBRztJQUN6QjtBQWJBLFlBQUEscUJBQUE7QUFpQmEsWUFBQSx5QkFBeUI7QUFDdEMsYUFBZ0IsMEJBQTBCLE9BQWE7QUFDbkQsVUFBSSxNQUFNLE1BQU0sWUFBVztBQUMzQixZQUFNLElBQUksUUFBUSxZQUFZLEVBQUU7QUFDaEMsYUFBTyxTQUFTLEdBQUc7SUFDdkI7QUFKQSxZQUFBLDRCQUFBO0FBU2EsWUFBQSxlQUFlO0FBQzVCLGFBQWdCLFVBQVUsT0FBYTtBQUNuQyxVQUFJLE1BQU0sS0FBSyxLQUFLLEdBQUc7QUFDbkIsZ0JBQVEsTUFBTSxRQUFRLE9BQU8sRUFBRTtBQUMvQixlQUFPLENBQUMsU0FBUyxLQUFLOztBQUcxQixVQUFJLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUN2QyxnQkFBUSxNQUFNLFFBQVEsV0FBVyxFQUFFO0FBQ25DLGVBQU8sU0FBUyxLQUFLOztBQUd6QixVQUFJLGFBQWEsU0FBUyxLQUFLO0FBQy9CLFVBQUksYUFBYSxLQUFLO0FBQ2xCLFlBQUksYUFBYSxJQUFJO0FBQ2pCLHVCQUFhLGFBQWE7ZUFDdkI7QUFDSCx1QkFBYSxhQUFhOzs7QUFJbEMsYUFBTztJQUNYO0FBckJBLFlBQUEsWUFBQTtBQXlCQSxRQUFNLDJCQUEyQixJQUFJLFFBQUEsMkJBQTJCLFVBQUEsZ0JBQWdCLFFBQUEsb0JBQW9CO0FBQ3BHLFFBQU0seUJBQXlCLElBQUksT0FBTywwQkFBMEIsR0FBRztBQUUxRCxZQUFBLHFCQUFxQixVQUFBLHdCQUF3QixJQUFJLHdCQUF3QjtBQUV0RixhQUFnQixlQUFlLGNBQVk7QUFDdkMsWUFBTSxZQUFZLENBQUE7QUFDbEIsVUFBSSxnQkFBZ0I7QUFDcEIsVUFBSSxRQUFRLHVCQUF1QixLQUFLLGFBQWE7QUFDckQsYUFBTyxPQUFPO0FBQ1YsZ0NBQXdCLFdBQVcsS0FBSztBQUN4Qyx3QkFBZ0IsY0FBYyxVQUFVLE1BQU0sR0FBRyxNQUFNO0FBQ3ZELGdCQUFRLHVCQUF1QixLQUFLLGFBQWE7O0FBRXJELGFBQU87SUFDWDtBQVZBLFlBQUEsaUJBQUE7QUFZQSxhQUFTLHdCQUF3QixXQUFXLE9BQUs7QUFDN0MsWUFBTSxNQUFNLG1CQUFtQixNQUFNLEVBQUU7QUFDdkMsWUFBTSxPQUFPLFFBQUEscUJBQXFCLE1BQU0sR0FBRyxZQUFXO0FBQ3RELGdCQUFVLFFBQVE7SUFDdEI7Ozs7Ozs7OztBQ3JMQSxRQUFBLGNBQUE7QUFDQSxRQUFBLFlBQUE7QUFDQSxRQUFBLG1DQUFBO0FBQ0EsUUFBQSxVQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FDaEIsZ0RBRVEsVUFBQSxnQkFBZ0IsWUFBQSxrQkFBa0IsK0VBSTFDLEdBQUc7QUFHUCxRQUFNLGdCQUFnQjtBQUN0QixRQUFNLGdCQUFnQjtBQUV0QixRQUFxQixrQkFBckIsY0FBNkMsaUNBQUEsdUNBQXNDO01BQy9FLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sWUFBWSxNQUFNLGVBQWUsWUFBVztBQUNsRCxjQUFNLFNBQVMsWUFBQSxtQkFBbUI7QUFDbEMsWUFBSSxXQUFXLFFBQVc7QUFDdEIsaUJBQU87O0FBR1gsWUFBSSxTQUFTLE1BQU07QUFDbkIsaUJBQVMsVUFBVTtBQUNuQixpQkFBUyxPQUFPLFlBQVc7QUFFM0IsWUFBSSxXQUFXO0FBQ2YsWUFBSSxVQUFVLFdBQVc7QUFDckIscUJBQVc7bUJBQ0osVUFBVSxZQUFZO0FBQzdCLHFCQUFXOztBQUdmLGNBQU0sT0FBTyxRQUFBLGVBQWUsUUFBUSxTQUFTLFFBQVEsUUFBUTtBQUM3RCxlQUFPLFFBQ0Ysd0JBQXVCLEVBQ3ZCLE9BQU8sV0FBVyxNQUFNLEVBQ3hCLE1BQU0sT0FBTyxLQUFLLEtBQUksQ0FBRSxFQUN4QixNQUFNLFNBQVMsS0FBSyxNQUFLLElBQUssQ0FBQyxFQUMvQixNQUFNLFFBQVEsS0FBSyxLQUFJLENBQUU7TUFDbEM7O0FBOUJKLFlBQUEsVUFBQTs7Ozs7Ozs7O0FDbEJBLFFBQUEsVUFBQTtBQU9BLFFBQU0sb0JBQW9CLElBQUksT0FDMUIsOElBT0EsR0FBRztBQUdQLFFBQU0scUJBQXFCLElBQUksT0FDM0IsaUtBTUEsR0FBRztBQUdQLFFBQU0sYUFBYTtBQUNuQixRQUFNLGVBQWU7QUFDckIsUUFBTSxlQUFlO0FBQ3JCLFFBQU0sbUJBQW1CO0FBRXpCLFFBQXFCLGlDQUFyQixNQUFtRDtNQUMvQyxRQUFRLFNBQU87QUFDWCxlQUFPO01BQ1g7TUFFQSxRQUFRLFNBQXlCLE9BQXVCO0FBQ3BELGNBQU0sU0FBUyxRQUFRLG9CQUFvQixNQUFNLFFBQVEsTUFBTSxHQUFHLFFBQVEsTUFBTSxHQUFHLFVBQVUsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUc3RyxZQUFJLE9BQU8sS0FBSyxNQUFNLFNBQVMsR0FBRztBQUM5QixnQkFBTSxTQUFTLE1BQU0sR0FBRztBQUN4QixpQkFBTzs7QUFHWCxlQUFPLFFBQVEsK0JBQStCLHFCQUFxQixPQUFPLE1BQU0sTUFBSyxHQUFJLEtBQUs7QUFDOUYsWUFBSSxDQUFDLE9BQU8sT0FBTztBQUNmLGdCQUFNLFNBQVMsTUFBTSxHQUFHO0FBQ3hCLGlCQUFPOztBQUdYLGNBQU0sZ0JBQWdCLFFBQVEsS0FBSyxVQUFVLE1BQU0sUUFBUSxNQUFNLEdBQUcsTUFBTTtBQUMxRSxjQUFNLGNBQWMsbUJBQW1CLEtBQUssYUFBYTtBQUN6RCxZQUFJLGFBQWE7QUFDYixpQkFBTyxNQUFNLCtCQUErQixxQkFBcUIsT0FBTyxNQUFNLE1BQUssR0FBSSxXQUFXO0FBQ2xHLGNBQUksT0FBTyxLQUFLO0FBQ1osbUJBQU8sUUFBUSxZQUFZOzs7QUFJbkMsZUFBTztNQUNYO01BRVEsT0FBTyxxQkFDWCxzQkFDQSxPQUF1QjtBQUV2QixZQUFJLE9BQU87QUFDWCxZQUFJLFNBQVM7QUFDYixZQUFJLFdBQVc7QUFHZixlQUFPLFNBQVMsTUFBTSxXQUFXO0FBR2pDLFlBQUksTUFBTSxpQkFBaUIsTUFBTTtBQUM3QixtQkFBUyxTQUFTLE1BQU0sYUFBYTs7QUFHekMsWUFBSSxVQUFVLE1BQU0sT0FBTyxJQUFJO0FBQzNCLGlCQUFPOztBQUdYLFlBQUksUUFBUSxJQUFJO0FBQ1oscUJBQVcsUUFBQSxTQUFTOztBQUl4QixZQUFJLE1BQU0scUJBQXFCLE1BQU07QUFDakMsY0FBSSxPQUFPO0FBQUksbUJBQU87QUFDdEIsZ0JBQU0sT0FBTyxNQUFNLGtCQUFrQixHQUFHLFlBQVc7QUFDbkQsY0FBSSxRQUFRLEtBQUs7QUFDYix1QkFBVyxRQUFBLFNBQVM7QUFDcEIsZ0JBQUksUUFBUSxJQUFJO0FBQ1oscUJBQU87OztBQUlmLGNBQUksUUFBUSxLQUFLO0FBQ2IsdUJBQVcsUUFBQSxTQUFTO0FBQ3BCLGdCQUFJLFFBQVEsSUFBSTtBQUNaLHNCQUFROzs7O0FBS3BCLDZCQUFxQixPQUFPLFFBQVEsSUFBSTtBQUN4Qyw2QkFBcUIsT0FBTyxVQUFVLE1BQU07QUFDNUMsWUFBSSxhQUFhLE1BQU07QUFDbkIsK0JBQXFCLE9BQU8sWUFBWSxRQUFRO2VBQzdDO0FBQ0gsY0FBSSxPQUFPLElBQUk7QUFDWCxpQ0FBcUIsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO2lCQUMvQztBQUNILGlDQUFxQixNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7OztBQUsxRCxZQUFJLE1BQU0saUJBQWlCLE1BQU07QUFDN0IsZ0JBQU0sU0FBUyxTQUFTLE1BQU0sYUFBYTtBQUMzQyxjQUFJLFVBQVU7QUFBSSxtQkFBTztBQUV6QiwrQkFBcUIsT0FBTyxVQUFVLE1BQU07O0FBR2hELGVBQU87TUFDWDs7QUFoR0osWUFBQSxVQUFBOzs7Ozs7Ozs7QUNqQ0EsUUFBQSxVQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLGdCQUNRLFlBQUEsdUVBQ3VDLFlBQUEsb0RBRXZDLFVBQUEsZ0JBQWdCLFlBQUEsZ0JBQWdCLHVCQUNmLFlBQUEseUNBRXpCLEdBQUc7QUFHUCxRQUFNLGFBQWE7QUFDbkIsUUFBTSxnQkFBZ0I7QUFDdEIsUUFBTSxtQkFBbUI7QUFDekIsUUFBTSxhQUFhO0FBRW5CLFFBQXFCLGdDQUFyQixjQUEyRCxpQ0FBQSx1Q0FBc0M7TUFDN0YsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFHekQsY0FBTSxTQUFTLFFBQVEsb0JBQW9CLE1BQU0sT0FBTyxNQUFNLEVBQUU7QUFFaEUsY0FBTSxRQUFRLFlBQUEsaUJBQWlCLE1BQU0sa0JBQWtCLFlBQVc7QUFDbEUsY0FBTSxNQUFNLFlBQUEsMEJBQTBCLE1BQU0sV0FBVztBQUN2RCxZQUFJLE1BQU0sSUFBSTtBQUVWLGdCQUFNLFFBQVEsTUFBTSxRQUFRLE1BQU0sWUFBWTtBQUM5QyxpQkFBTzs7QUFHWCxlQUFPLE1BQU0sT0FBTyxTQUFTLEtBQUs7QUFDbEMsZUFBTyxNQUFNLE9BQU8sT0FBTyxHQUFHO0FBRTlCLFlBQUksTUFBTSxhQUFhO0FBQ25CLGdCQUFNLGFBQWEsWUFBQSxVQUFVLE1BQU0sV0FBVztBQUM5QyxpQkFBTyxNQUFNLE9BQU8sUUFBUSxVQUFVO2VBQ25DO0FBQ0gsZ0JBQU0sT0FBTyxRQUFBLHFCQUFxQixRQUFRLFNBQVMsS0FBSyxLQUFLO0FBQzdELGlCQUFPLE1BQU0sTUFBTSxRQUFRLElBQUk7O0FBR25DLFlBQUksTUFBTSxnQkFBZ0I7QUFDdEIsZ0JBQU0sVUFBVSxZQUFBLDBCQUEwQixNQUFNLGNBQWM7QUFFOUQsaUJBQU8sTUFBTSxPQUFPLE1BQU0sTUFBSztBQUMvQixpQkFBTyxJQUFJLE9BQU8sT0FBTyxPQUFPOztBQUdwQyxlQUFPO01BQ1g7O0FBckNKLFlBQUEsVUFBQTs7Ozs7Ozs7O0FDeEJBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFDQSxRQUFBLGNBQUE7QUFFQSxRQUFxQiw0QkFBckIsY0FBdUQsaUNBQUEsdUNBQXNDO01BQ3pGLGNBQUE7QUFDSSxjQUFLO01BQ1Q7TUFFQSxlQUFZO0FBQ1IsZUFBTyxJQUFJLE9BQU8sY0FBYyxZQUFBLG9DQUFvQyxHQUFHO01BQzNFO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFlBQVksWUFBQSxlQUFlLE1BQU0sRUFBRTtBQUN6QyxjQUFNLGtCQUFrQixZQUFBLGlCQUFpQixTQUFTO0FBRWxELGVBQU8sVUFBQSxrQkFBa0IsNEJBQTRCLFFBQVEsV0FBVyxlQUFlO01BQzNGOztBQWRKLFlBQUEsVUFBQTs7Ozs7Ozs7O0FDTkEsUUFBQSxjQUFBO0FBRUEsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQXFCLCtCQUFyQixjQUEwRCxpQ0FBQSx1Q0FBc0M7TUFDNUYsZUFBWTtBQUNSLGVBQU8sSUFBSSxPQUFPLG1DQUFtQyxZQUFBLGdDQUFnQyxHQUFHO01BQzVGO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFlBQVksWUFBQSxlQUFlLE1BQU0sRUFBRTtBQUN6QyxlQUFPLFVBQUEsa0JBQWtCLDRCQUE0QixRQUFRLFdBQVcsU0FBUztNQUNyRjs7QUFSSixZQUFBLFVBQUE7Ozs7Ozs7OztBQ0pBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFDQSxRQUFBLGNBQUE7QUFDQSxRQUFBLFlBQUE7QUFFQSxRQUFxQiw0QkFBckIsY0FBdUQsaUNBQUEsdUNBQXNDO01BQ3pGLGNBQUE7QUFDSSxjQUFLO01BQ1Q7TUFFQSxlQUFZO0FBQ1IsZUFBTyxJQUFJLE9BQ1AsOEJBQ1EsWUFBQSxxSEFFSSxVQUFBLGdCQUFnQixZQUFBLG9CQUFvQixtR0FFaEQsR0FBRztNQUVYO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLE1BQU0sTUFBTSxLQUFLLFlBQUEsbUJBQW1CLE1BQU0sRUFBRSxJQUFJO0FBQ3RELGNBQU0sT0FBTyxZQUFBLHFCQUFxQixNQUFNLEdBQUcsWUFBVztBQUN0RCxZQUFJLFlBQVksQ0FBQTtBQUNoQixrQkFBVSxRQUFRO0FBR2xCLFlBQUksV0FBVyxNQUFNLE1BQU0sTUFBTSxNQUFNO0FBQ3ZDLG1CQUFXLFNBQVMsWUFBVztBQUMvQixZQUFJLENBQUMsVUFBVTtBQUNYOztBQUdKLFlBQUksaUJBQWlCLEtBQUssUUFBUSxLQUFLLGVBQWUsS0FBSyxRQUFRLEtBQUssb0JBQW9CLEtBQUssUUFBUSxHQUFHO0FBQ3hHLHNCQUFZLFlBQUEsaUJBQWlCLFNBQVM7O0FBRzFDLGVBQU8sVUFBQSxrQkFBa0IsNEJBQTRCLFFBQVEsV0FBVyxTQUFTO01BQ3JGOztBQWxDSixZQUFBLFVBQUE7Ozs7Ozs7Ozs7Ozs7QUNEQSxRQUFBLG1CQUFBO0FBRUEsUUFBQSxXQUFBO0FBQ0EsUUFBQSx1QkFBQUMsaUJBQUEsNEJBQUE7QUFDQSxRQUFBLHVCQUFBQSxpQkFBQSw0QkFBQTtBQUNBLFFBQUEsMEJBQUFBLGlCQUFBLCtCQUFBO0FBQ0EsUUFBQSwyQkFBQUEsaUJBQUEsZ0NBQUE7QUFDQSxRQUFBLDJCQUFBQSxpQkFBQSxnQ0FBQTtBQUNBLFFBQUEsNEJBQUFBLGlCQUFBLGlDQUFBO0FBQ0EsUUFBQSxvQkFBQUEsaUJBQUEseUJBQUE7QUFDQSxRQUFBLG1DQUFBQSxpQkFBQSx3Q0FBQTtBQUNBLFFBQUEsa0NBQUFBLGlCQUFBLHVDQUFBO0FBQ0EsUUFBQSw4QkFBQUEsaUJBQUEsbUNBQUE7QUFDQSxRQUFBLGlDQUFBQSxpQkFBQSxzQ0FBQTtBQUNBLFFBQUEsbUNBQUFBLGlCQUFBLHdDQUFBO0FBR2EsWUFBQSxTQUFTLElBQUksU0FBQSxPQUFPLDBCQUF5QixDQUFFO0FBQy9DLFlBQUEsU0FBUyxJQUFJLFNBQUEsT0FBTyxvQkFBb0IsSUFBSSxDQUFDO0FBRTFELGFBQWdCLE1BQU1DLE9BQWMsS0FBWSxRQUFzQjtBQUNsRSxhQUFPLFFBQUEsT0FBTyxNQUFNQSxPQUFNLEtBQUssTUFBTTtJQUN6QztBQUZBLFlBQUEsUUFBQTtBQUlBLGFBQWdCQyxXQUFVRCxPQUFjLEtBQVksUUFBc0I7QUFDdEUsYUFBTyxRQUFBLE9BQU8sVUFBVUEsT0FBTSxLQUFLLE1BQU07SUFDN0M7QUFGQSxZQUFBLFlBQUFDO0FBT0EsYUFBZ0IsMEJBQTBCLGVBQWUsTUFBSTtBQUN6RCxZQUFNLFNBQVMsb0JBQW9CLE9BQU8sWUFBWTtBQUN0RCxhQUFPLFFBQVEsUUFBUSxJQUFJLHFCQUFBLFFBQWtCLENBQUU7QUFDL0MsYUFBTyxRQUFRLFFBQVEsSUFBSSxxQkFBQSxRQUFrQixDQUFFO0FBQy9DLGFBQU8sUUFBUSxRQUFRLElBQUksaUNBQUEsUUFBOEIsQ0FBRTtBQUMzRCxhQUFPO0lBQ1g7QUFOQSxZQUFBLDRCQUFBO0FBV0EsYUFBZ0Isb0JBQW9CLGFBQWEsTUFBTSxlQUFlLE1BQUk7QUFDdEUsYUFBTyxpQkFBQSwyQkFDSDtRQUNJLFNBQVM7VUFDTCxJQUFJLHdCQUFBLFFBQXNCLFlBQVk7VUFDdEMsSUFBSSxnQ0FBQSxRQUE2QjtVQUNqQyxJQUFJLHlCQUFBLFFBQXNCO1VBQzFCLElBQUksaUNBQUEsUUFBOEI7VUFDbEMsSUFBSSw0QkFBQSxRQUF5QjtVQUM3QixJQUFJLCtCQUFBLFFBQTRCO1VBQ2hDLElBQUksa0JBQUEsUUFBZTs7UUFFdkIsVUFBVSxDQUFDLElBQUkseUJBQUEsUUFBc0IsR0FBSSxJQUFJLDBCQUFBLFFBQXVCLENBQUU7U0FFMUUsVUFBVTtJQUVsQjtBQWhCQSxZQUFBLHNCQUFBOzs7Ozs7Ozs7O0FDdkNBLGFBQWdCLFVBQVVDLE9BQUk7QUFDMUIsYUFBTyxPQUFPQSxLQUFJLEVBQ2IsUUFBUSxXQUFXLEdBQVEsRUFDM0IsUUFBUSxXQUFXLEdBQVEsRUFDM0IsUUFBUSxXQUFXLEdBQVEsRUFDM0IsUUFBUSxXQUFXLE1BQVEsRUFDM0IsUUFDRyxrSEFDQSxRQUFRO0lBRXBCO0FBVkEsWUFBQSxZQUFBO0FBWUEsYUFBUyxTQUFTLE9BQUs7QUFDbkIsYUFBTyxPQUFPLGFBQWEsTUFBTSxXQUFXLENBQUMsSUFBSSxLQUFLO0lBQzFEOzs7Ozs7Ozs7Ozs7QUN0QkEsUUFBQSxjQUFBO0FBQ0EsUUFBQSxVQUFBO0FBRUEsUUFBQSxVQUFBQyxpQkFBQSxtQkFBQTtBQUVBLFFBQU0sVUFDRjtBQUNKLFFBQU0scUJBQXFCO0FBQzNCLFFBQU0scUJBQXFCO0FBQzNCLFFBQU0sWUFBWTtBQUNsQixRQUFNLG9CQUFvQjtBQUMxQixRQUFNLGNBQWM7QUFDcEIsUUFBTSxZQUFZO0FBRWxCLFFBQXFCLG1CQUFyQixNQUFxQztNQUNqQyxVQUFPO0FBQ0gsZUFBTztNQUNYO01BRUEsUUFBUSxTQUF5QixPQUF1QjtBQUNwRCxjQUFNLFFBQVEsU0FBUyxZQUFBLFVBQVUsTUFBTSxZQUFZLENBQUM7QUFDcEQsY0FBTSxNQUFNLFNBQVMsWUFBQSxVQUFVLE1BQU0sVUFBVSxDQUFDO0FBQ2hELGNBQU0sYUFBYSxRQUFRLHdCQUF3QjtVQUMvQztVQUNBO1NBQ0g7QUFFRCxZQUFJLE1BQU0sdUJBQXVCLE1BQU0sb0JBQW9CLE1BQU0sc0JBQU8sR0FBRztBQUN2RSxnQkFBTSxTQUFTLFFBQUEsUUFBTSxRQUFRLE9BQU87QUFDcEMscUJBQVcsT0FBTyxRQUFRLE9BQU8sS0FBSSxDQUFFOztBQUczQyxZQUFJLE1BQU0scUJBQXFCO0FBQzNCLGdCQUFNLGNBQWMsTUFBTTtBQUUxQixjQUFJLE9BQU8sZUFBZSxXQUFNLElBQUksU0FBUyxZQUFBLFVBQVUsV0FBVyxDQUFDO0FBQ25FLGNBQUksTUFBTSxjQUFjLGdCQUFNO0FBQzFCLG9CQUFRO3FCQUNELE1BQU0sY0FBYyxnQkFBTTtBQUNqQyxvQkFBUTtxQkFDRCxNQUFNLGNBQWMsZ0JBQU07QUFDakMsb0JBQVE7O0FBR1oscUJBQVcsT0FBTyxRQUFRLElBQUk7ZUFDM0I7QUFDSCxnQkFBTSxPQUFPLFFBQUEscUJBQXFCLFFBQVEsU0FBUyxLQUFLLEtBQUs7QUFDN0QscUJBQVcsTUFBTSxRQUFRLElBQUk7O0FBR2pDLGVBQU87TUFDWDs7QUFyQ0osWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNmQSxRQUFBLGtDQUFBQyxpQkFBQSx1Q0FBQTtBQVFBLFFBQXFCLDBCQUFyQixjQUFxRCxnQ0FBQSxRQUE2QjtNQUM5RSxpQkFBYztBQUNWLGVBQU87TUFDWDs7QUFISixZQUFBLFVBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQQSxRQUFBLFVBQUFDLGlCQUFBLG1CQUFBO0FBQ0EsUUFBQSxVQUFBO0FBQ0EsUUFBQSxhQUFBQyxjQUFBLDBCQUFBO0FBRUEsUUFBTSxVQUFVO0FBRWhCLFFBQXFCLHFCQUFyQixNQUF1QztNQUNuQyxVQUFPO0FBQ0gsZUFBTztNQUNYO01BRUEsUUFBUSxTQUF5QixPQUF1QjtBQUNwRCxjQUFNQyxRQUFPLE1BQU07QUFFbkIsY0FBTSxPQUFPLFFBQUEsUUFBTSxRQUFRLE9BQU87QUFDbEMsY0FBTSxhQUFhLFFBQVEsd0JBQXVCO0FBRWxELGdCQUFRQTtlQUNDO0FBQ0QsbUJBQU8sV0FBVyxVQUFVLFFBQVEsU0FBUztlQUU1QztBQUNELG1CQUFPLFdBQVcsU0FBUyxRQUFRLFNBQVM7ZUFFM0M7ZUFDQTtBQUNELG1CQUFPLFdBQVcsTUFBTSxRQUFRLFNBQVM7O0FBR2pELFlBQUlBLFNBQVEsa0JBQVFBLFNBQVEsa0JBQVFBLFNBQVEsZ0JBQU07QUFDOUMscUJBQVcsTUFBTSxRQUFRLEVBQUU7QUFDM0IscUJBQVcsT0FBTyxZQUFZLFFBQUEsU0FBUyxFQUFFO21CQUNsQ0EsTUFBSyxNQUFNLGNBQUksR0FBRztBQUN6QixxQkFBVyxNQUFNLFFBQVEsQ0FBQztBQUMxQixxQkFBVyxPQUFPLFlBQVksUUFBQSxTQUFTLEVBQUU7O0FBRzdDLG1CQUFXLE9BQU8sT0FBTyxLQUFLLEtBQUksQ0FBRTtBQUNwQyxtQkFBVyxPQUFPLFNBQVMsS0FBSyxNQUFLLElBQUssQ0FBQztBQUMzQyxtQkFBVyxPQUFPLFFBQVEsS0FBSyxLQUFJLENBQUU7QUFDckMsZUFBTztNQUNYOztBQW5DSixZQUFBLFVBQUE7Ozs7Ozs7Ozs7Ozs7QUNEQSxRQUFBLHFCQUFBQyxpQkFBQSwwQkFBQTtBQUNBLFFBQUEsNEJBQUFBLGlCQUFBLGlDQUFBO0FBQ0EsUUFBQSx1QkFBQUEsaUJBQUEsNEJBQUE7QUFFQSxRQUFBLFdBQUE7QUFJYSxZQUFBLFNBQVMsSUFBSSxTQUFBLE9BQU8sMEJBQXlCLENBQUU7QUFDL0MsWUFBQSxTQUFTLElBQUksU0FBQSxPQUFPLG9CQUFtQixDQUFFO0FBRXRELGFBQWdCLE1BQU1DLE9BQWMsS0FBWSxRQUFzQjtBQUNsRSxhQUFPLFFBQUEsT0FBTyxNQUFNQSxPQUFNLEtBQUssTUFBTTtJQUN6QztBQUZBLFlBQUEsUUFBQTtBQUlBLGFBQWdCQyxXQUFVRCxPQUFjLEtBQVksUUFBc0I7QUFDdEUsYUFBTyxRQUFBLE9BQU8sVUFBVUEsT0FBTSxLQUFLLE1BQU07SUFDN0M7QUFGQSxZQUFBLFlBQUFDO0FBT0EsYUFBZ0IsNEJBQXlCO0FBQ3JDLFlBQU0sU0FBUyxvQkFBbUI7QUFDbEMsYUFBTyxRQUFRLFFBQVEsSUFBSSxxQkFBQSxRQUFrQixDQUFFO0FBQy9DLGFBQU87SUFDWDtBQUpBLFlBQUEsNEJBQUE7QUFTQSxhQUFnQixzQkFBbUI7QUFDL0IsYUFBTztRQUNILFNBQVMsQ0FBQyxJQUFJLG1CQUFBLFFBQWdCLENBQUU7UUFDaEMsVUFBVSxDQUFDLElBQUksMEJBQUEsUUFBdUIsQ0FBRTs7SUFFaEQ7QUFMQSxZQUFBLHNCQUFBOzs7Ozs7Ozs7O0FDckNhLFlBQUEscUJBQWlEO01BQzFELFdBQVc7TUFDWCxPQUFPO01BQ1AsV0FBVztNQUNYLGlCQUFpQjtNQUNqQixPQUFPO01BQ1AsWUFBUztNQUNULGtCQUFlO01BQ2YsT0FBTztNQUNQLFVBQVU7TUFDVixnQkFBZ0I7TUFDaEIsT0FBTztNQUNQLFVBQVU7TUFDVixnQkFBZ0I7TUFDaEIsT0FBTztNQUNQLFNBQVM7TUFDVCxlQUFlO01BQ2YsT0FBTztNQUNQLGFBQVU7TUFDVixVQUFVO01BQ1YsT0FBTzs7QUFHRSxZQUFBLG1CQUErQztNQUN4RCxXQUFXO01BQ1gsT0FBTztNQUNQLFFBQVE7TUFDUixhQUFhO01BQ2IsT0FBTztNQUNQLFFBQVE7TUFDUixZQUFTO01BQ1QsT0FBTztNQUNQLFFBQVE7TUFDUixTQUFTO01BQ1QsT0FBTztNQUNQLFFBQVE7TUFDUixRQUFRO01BQ1IsT0FBTztNQUNQLFFBQVE7TUFDUixTQUFTO01BQ1QsT0FBTztNQUNQLFFBQVE7TUFDUixTQUFTO01BQ1QsT0FBTztNQUNQLFFBQVE7TUFDUixVQUFVO01BQ1YsT0FBTztNQUNQLFFBQVE7TUFDUixZQUFZO01BQ1osT0FBTztNQUNQLFFBQVE7TUFDUixXQUFXO01BQ1gsT0FBTztNQUNQLFFBQVE7TUFDUixZQUFZO01BQ1osT0FBTztNQUNQLFFBQVE7TUFDUixZQUFZO01BQ1osT0FBTztNQUNQLFFBQVE7O0FBTUMsWUFBQSxlQUFlO0FBQzVCLGFBQWdCLFVBQVUsT0FBYTtBQUNuQyxVQUFJLE1BQU0sTUFBTSxjQUFjLEdBQUc7QUFDN0IsWUFBSSxhQUFhLFNBQVMsS0FBSztBQUMvQixZQUFJLGFBQWEsS0FBSztBQUNsQixjQUFJLGFBQWEsSUFBSTtBQUNqQix5QkFBYSxhQUFhO2lCQUN2QjtBQUNILHlCQUFhLGFBQWE7OztBQUdsQyxlQUFPOztBQUdYLFVBQUksTUFBTSxNQUFNLGNBQWMsR0FBRztBQUM3QixnQkFBUSxNQUFNLFFBQVEsZ0JBQWdCLEVBQUU7QUFDeEMsZUFBTyxDQUFDLFNBQVMsS0FBSzs7QUFHMUIsYUFBTyxTQUFTLEtBQUs7SUFDekI7QUFuQkEsWUFBQSxZQUFBOzs7Ozs7Ozs7QUNoRUEsUUFBQSxjQUFBO0FBQ0EsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUNBLFFBQUEsVUFBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLDJFQUVRLFVBQUEsZ0JBQWdCLFlBQUEsa0JBQWtCLG9HQUkxQyxHQUFHO0FBR1AsUUFBTSxlQUFlO0FBQ3JCLFFBQU0sZ0JBQWdCO0FBQ3RCLFFBQU0sZ0JBQWdCO0FBRXRCLFFBQXFCLGtCQUFyQixjQUE2QyxpQ0FBQSx1Q0FBc0M7TUFDL0UsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxZQUFZLE1BQU0sZUFBZSxZQUFXO0FBQ2xELGNBQU0sU0FBUyxZQUFBLG1CQUFtQjtBQUNsQyxZQUFJLFdBQVcsUUFBVztBQUN0QixpQkFBTzs7QUFHWCxjQUFNLFNBQVMsTUFBTTtBQUNyQixjQUFNLFVBQVUsTUFBTTtBQUN0QixZQUFJLE9BQU8sVUFBVSxXQUFXO0FBQ2hDLGVBQU8sS0FBSyxZQUFXO0FBRXZCLFlBQUksV0FBVztBQUNmLFlBQUksUUFBUSxXQUFXO0FBQ25CLHFCQUFXO21CQUNKLFFBQVEsZ0JBQWEsUUFBUSxXQUFXO0FBQy9DLHFCQUFXO21CQUNKLFFBQVEsUUFBUTtBQUN2QixxQkFBVzs7QUFHZixjQUFNLE9BQU8sUUFBQSxlQUFlLFFBQVEsU0FBUyxRQUFRLFFBQVE7QUFDN0QsZUFBTyxRQUNGLHdCQUF1QixFQUN2QixPQUFPLFdBQVcsTUFBTSxFQUN4QixNQUFNLE9BQU8sS0FBSyxLQUFJLENBQUUsRUFDeEIsTUFBTSxTQUFTLEtBQUssTUFBSyxJQUFLLENBQUMsRUFDL0IsTUFBTSxRQUFRLEtBQUssS0FBSSxDQUFFO01BQ2xDOztBQWpDSixZQUFBLFVBQUE7Ozs7Ozs7OztBQ3JCQSxRQUFBLGlDQUFBO0FBRUEsUUFBcUIseUJBQXJCLGNBQW9ELCtCQUFBLDZCQUE0QjtNQUM1RSxnQkFBYTtBQUNULGVBQU87TUFDWDtNQUVBLGlCQUFjO0FBQ1YsZUFBTztNQUNYOztBQVBKLFlBQUEsVUFBQTs7Ozs7Ozs7Ozs7O0FDRkEsUUFBQSxpQ0FBQUMsaUJBQUEsc0NBQUE7QUFLQSxRQUFxQix5QkFBckIsY0FBb0QsK0JBQUEsUUFBNEI7TUFDNUUsaUJBQWM7QUFDVixlQUFPLElBQUksT0FBTyx1QkFBb0I7TUFDMUM7O0FBSEosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNEQSxRQUFBLGtDQUFBQyxpQkFBQSx1Q0FBQTtBQU1BLFFBQXFCLDBCQUFyQixjQUFxRCxnQ0FBQSxRQUE2QjtNQUM5RSxpQkFBYztBQUNWLGVBQU87TUFDWDs7QUFISixZQUFBLFVBQUE7Ozs7Ozs7OztBQ1JBLFFBQUEsVUFBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFFQSxRQUFNLFVBQVUsSUFBSSxPQUNoQix3SkFHUSxVQUFBLGdCQUFnQixZQUFBLGdCQUFnQiwwQkFDWixZQUFBLDRCQUU1QixHQUFHO0FBR1AsUUFBTSxhQUFhO0FBQ25CLFFBQU0sZ0JBQWdCO0FBQ3RCLFFBQU0sbUJBQW1CO0FBQ3pCLFFBQU0sYUFBYTtBQUVuQixRQUFxQixnQ0FBckIsY0FBMkQsaUNBQUEsdUNBQXNDO01BQzdGLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sU0FBUyxRQUFRLG9CQUFvQixNQUFNLE9BQU8sTUFBTSxFQUFFO0FBRWhFLGNBQU0sUUFBUSxZQUFBLGlCQUFpQixNQUFNLGtCQUFrQixZQUFXO0FBQ2xFLGNBQU0sTUFBTSxTQUFTLE1BQU0sV0FBVztBQUN0QyxZQUFJLE1BQU0sSUFBSTtBQUVWLGdCQUFNLFFBQVEsTUFBTSxRQUFRLE1BQU0sWUFBWTtBQUM5QyxpQkFBTzs7QUFHWCxlQUFPLE1BQU0sT0FBTyxTQUFTLEtBQUs7QUFDbEMsZUFBTyxNQUFNLE9BQU8sT0FBTyxHQUFHO0FBRTlCLFlBQUksTUFBTSxhQUFhO0FBQ25CLGdCQUFNLGFBQWEsWUFBQSxVQUFVLE1BQU0sV0FBVztBQUM5QyxpQkFBTyxNQUFNLE9BQU8sUUFBUSxVQUFVO2VBQ25DO0FBQ0gsZ0JBQU0sT0FBTyxRQUFBLHFCQUFxQixRQUFRLFNBQVMsS0FBSyxLQUFLO0FBQzdELGlCQUFPLE1BQU0sTUFBTSxRQUFRLElBQUk7O0FBR25DLFlBQUksTUFBTSxnQkFBZ0I7QUFDdEIsZ0JBQU0sVUFBVSxTQUFTLE1BQU0sY0FBYztBQUU3QyxpQkFBTyxNQUFNLE9BQU8sTUFBTSxNQUFLO0FBQy9CLGlCQUFPLElBQUksT0FBTyxPQUFPLE9BQU87O0FBR3BDLGVBQU87TUFDWDs7QUFuQ0osWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckJBLFFBQUEsbUNBQUE7QUFDQSxRQUFBLGFBQUFDLGNBQUEsMEJBQUE7QUFFQSxRQUFxQixxQkFBckIsY0FBZ0QsaUNBQUEsdUNBQXNDO01BQ2xGLGFBQWEsU0FBdUI7QUFDaEMsZUFBTztNQUNYO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFlBQVksTUFBTSxHQUFHLFlBQVc7QUFDdEMsY0FBTSxZQUFZLFFBQVEsd0JBQXVCO0FBRWpELGdCQUFRO2VBQ0M7QUFDRCxtQkFBTyxXQUFXLElBQUksUUFBUSxTQUFTO2VBRXRDO0FBQ0QsbUJBQU8sV0FBVyxNQUFNLFFBQVEsU0FBUztlQUV4QztlQUNBO0FBQ0QsbUJBQU8sV0FBVyxTQUFTLFFBQVEsU0FBUztlQUUzQztBQUNELG1CQUFPLFdBQVcsVUFBVSxRQUFRLFNBQVM7O0FBR3JELGVBQU87TUFDWDs7QUF6QkosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNKQSxRQUFBLFVBQUE7QUFDQSxRQUFBLG1DQUFBO0FBQ0EsUUFBQSxVQUFBO0FBQ0EsUUFBQSxVQUFBQyxpQkFBQSxtQkFBQTtBQUVBLFFBQXFCLHFCQUFyQixjQUFnRCxpQ0FBQSx1Q0FBc0M7TUFDbEYsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxhQUFhLFFBQUEsUUFBTSxRQUFRLE9BQU87QUFDeEMsY0FBTSxZQUFZLFFBQVEsd0JBQXVCO0FBQ2pELGdCQUFRLE1BQU0sR0FBRyxZQUFXO2VBQ25CO0FBQ0Qsc0JBQVUsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3ZDLHNCQUFVLE1BQU0sUUFBUSxFQUFFO0FBQzFCO2VBRUM7QUFDRCxzQkFBVSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFDdkMsc0JBQVUsTUFBTSxRQUFRLEVBQUU7QUFDMUI7ZUFFQztlQUNBO0FBQ0Qsc0JBQVUsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3ZDLHNCQUFVLE1BQU0sUUFBUSxDQUFDO0FBQ3pCO2VBRUM7QUFDRCxvQkFBQSxpQkFBaUIsV0FBVyxVQUFVO0FBQ3RDLHNCQUFVLE1BQU0sUUFBUSxDQUFDO0FBQ3pCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCLHNCQUFVLE1BQU0sVUFBVSxDQUFDO0FBQzNCO2VBRUM7QUFDRCxzQkFBVSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFDdkMsc0JBQVUsTUFBTSxRQUFRLEVBQUU7QUFDMUI7O0FBR1IsZUFBTztNQUNYOztBQXZDSixZQUFBLFVBQUE7Ozs7Ozs7Ozs7Ozs7QUNBQSxRQUFBLG1CQUFBO0FBRUEsUUFBQSxXQUFBO0FBQ0EsUUFBQSwwQkFBQUMsaUJBQUEsK0JBQUE7QUFDQSxRQUFBLG9CQUFBQSxpQkFBQSx5QkFBQTtBQUNBLFFBQUEsMkJBQUFBLGlCQUFBLGdDQUFBO0FBQ0EsUUFBQSwyQkFBQUEsaUJBQUEsZ0NBQUE7QUFDQSxRQUFBLDRCQUFBQSxpQkFBQSxpQ0FBQTtBQUNBLFFBQUEsa0NBQUFBLGlCQUFBLHVDQUFBO0FBQ0EsUUFBQSx1QkFBQUEsaUJBQUEsNEJBQUE7QUFDQSxRQUFBLHVCQUFBQSxpQkFBQSw0QkFBQTtBQUdhLFlBQUEsU0FBUyxJQUFJLFNBQUEsT0FBTywwQkFBeUIsQ0FBRTtBQUMvQyxZQUFBLFNBQVMsSUFBSSxTQUFBLE9BQU8sb0JBQW9CLElBQUksQ0FBQztBQUUxRCxhQUFnQixNQUFNQyxPQUFjLEtBQVksUUFBc0I7QUFDbEUsYUFBTyxRQUFBLE9BQU8sTUFBTUEsT0FBTSxLQUFLLE1BQU07SUFDekM7QUFGQSxZQUFBLFFBQUE7QUFJQSxhQUFnQkMsV0FBVUQsT0FBYyxLQUFZLFFBQXNCO0FBQ3RFLGFBQU8sUUFBQSxPQUFPLFVBQVVBLE9BQU0sS0FBSyxNQUFNO0lBQzdDO0FBRkEsWUFBQSxZQUFBQztBQU9BLGFBQWdCLDBCQUEwQixlQUFlLE1BQUk7QUFDekQsWUFBTSxTQUFTLG9CQUFvQixPQUFPLFlBQVk7QUFDdEQsYUFBTyxRQUFRLEtBQUssSUFBSSxxQkFBQSxRQUFrQixDQUFFO0FBQzVDLGFBQU8sUUFBUSxLQUFLLElBQUkscUJBQUEsUUFBa0IsQ0FBRTtBQUM1QyxhQUFPO0lBQ1g7QUFMQSxZQUFBLDRCQUFBO0FBVUEsYUFBZ0Isb0JBQW9CLGFBQWEsTUFBTSxlQUFlLE1BQUk7QUFDdEUsYUFBTyxpQkFBQSwyQkFDSDtRQUNJLFNBQVM7VUFDTCxJQUFJLHdCQUFBLFFBQXNCLFlBQVk7VUFDdEMsSUFBSSxrQkFBQSxRQUFlO1VBQ25CLElBQUkseUJBQUEsUUFBc0I7VUFDMUIsSUFBSSxnQ0FBQSxRQUE2Qjs7UUFFckMsVUFBVSxDQUFDLElBQUkseUJBQUEsUUFBc0IsR0FBSSxJQUFJLDBCQUFBLFFBQXVCLENBQUU7U0FFMUUsVUFBVTtJQUVsQjtBQWJBLFlBQUEsc0JBQUE7Ozs7Ozs7Ozs7OztBQ3ZDQSxRQUFBLGtDQUFBQyxpQkFBQSx1Q0FBQTtBQVFBLFFBQXFCLDBCQUFyQixjQUFxRCxnQ0FBQSxRQUE2QjtNQUM5RSxpQkFBYztBQUNWLGVBQU87TUFDWDs7QUFISixZQUFBLFVBQUE7Ozs7Ozs7Ozs7OztBQ1pBLFFBQUEsaUNBQUFDLGlCQUFBLHNDQUFBO0FBUUEsUUFBcUIseUJBQXJCLGNBQW9ELCtCQUFBLFFBQTRCO01BQzVFLGlCQUFjO0FBQ1YsZUFBTyxJQUFJLE9BQU8sbUNBQW1DO01BQ3pEOztBQUhKLFlBQUEsVUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ05BLFFBQUEsbUNBQUE7QUFDQSxRQUFBLGFBQUFDLGNBQUEsMEJBQUE7QUFFQSxRQUFxQixxQkFBckIsY0FBZ0QsaUNBQUEsdUNBQXNDO01BQ2xGLGFBQWEsU0FBdUI7QUFDaEMsZUFBTztNQUNYO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFlBQVksTUFBTSxHQUFHLFlBQVc7QUFDdEMsY0FBTSxZQUFZLFFBQVEsd0JBQXVCO0FBRWpELGdCQUFRO2VBQ0M7QUFDRCxtQkFBTyxXQUFXLElBQUksUUFBUSxTQUFTO2VBRXRDO0FBQ0QsbUJBQU8sV0FBVyxNQUFNLFFBQVEsU0FBUztlQUV4QztlQUNBO0FBQ0QsbUJBQU8sV0FBVyxTQUFTLFFBQVEsU0FBUztlQUUzQztBQUNELG1CQUFPLFdBQVcsVUFBVSxRQUFRLFNBQVM7O0FBR3JELGVBQU87TUFDWDs7QUF6QkosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNKQSxRQUFBLFVBQUE7QUFDQSxRQUFBLG1DQUFBO0FBQ0EsUUFBQSxVQUFBQyxpQkFBQSxtQkFBQTtBQUNBLFFBQUEsVUFBQTtBQUVBLFFBQU0sWUFBWTtBQUNsQixRQUFNLGVBQWU7QUFFckIsUUFBcUIscUJBQXJCLGNBQWdELGlDQUFBLHVDQUFzQztNQUNsRixlQUFZO0FBQ1IsZUFBTztNQUNYO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLGFBQWEsUUFBQSxRQUFNLFFBQVEsT0FBTztBQUN4QyxjQUFNLFlBQVksUUFBUSx3QkFBdUI7QUFFakQsWUFBSSxNQUFNLGVBQWUsUUFBUTtBQUM3QixvQkFBVSxPQUFPLE9BQU8sUUFBUSxRQUFRLFFBQU8sQ0FBRTtBQUNqRCxvQkFBVSxPQUFPLFNBQVMsUUFBUSxRQUFRLFNBQVEsSUFBSyxDQUFDO0FBQ3hELG9CQUFVLE9BQU8sUUFBUSxRQUFRLFFBQVEsWUFBVyxDQUFFOztBQUcxRCxnQkFBUSxNQUFNLGNBQWMsWUFBVztlQUM5QjtlQUNBO0FBQ0Qsc0JBQVUsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3ZDLHNCQUFVLE1BQU0sUUFBUSxFQUFFO0FBQzFCO2VBRUM7ZUFDQTtBQUNELHNCQUFVLE1BQU0sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN2QyxzQkFBVSxNQUFNLFFBQVEsRUFBRTtBQUMxQjtlQUVDO0FBQ0Qsb0JBQUEsaUJBQWlCLFdBQVcsVUFBVTtBQUN0QyxzQkFBVSxNQUFNLFFBQVEsQ0FBQztBQUN6QixzQkFBVSxNQUFNLFVBQVUsQ0FBQztBQUMzQixzQkFBVSxNQUFNLFVBQVUsQ0FBQztBQUMzQjtlQUVDO2VBQ0E7QUFDRCxzQkFBVSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFDdkMsc0JBQVUsTUFBTSxRQUFRLENBQUM7QUFDekI7ZUFFQztlQUNBO0FBQ0Qsc0JBQVUsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3ZDLHNCQUFVLE1BQU0sUUFBUSxFQUFFO0FBQzFCOztBQUdSLGVBQU87TUFDWDs7QUFqREosWUFBQSxVQUFBOzs7Ozs7Ozs7O0FDUkEsUUFBQSxZQUFBO0FBQ0EsUUFBQSxVQUFBO0FBR2EsWUFBQSxxQkFBaUQ7TUFFMUQsUUFBUTtNQUNSLEtBQUs7TUFDTCxRQUFRO01BQ1IsSUFBSTtNQUNKLE9BQU87TUFFUCxTQUFTO01BQ1QsSUFBSTtNQUNKLE9BQU87TUFFUCxTQUFTO01BQ1QsS0FBSztNQUNMLFFBQVE7TUFDUixJQUFJO01BQ0osT0FBTztNQUVQLFVBQVU7TUFDVixLQUFLO01BQ0wsUUFBUTtNQUNSLElBQUk7TUFDSixPQUFPO01BRVAsV0FBVztNQUNYLE1BQU07TUFDTixTQUFTO01BQ1QsSUFBSTtNQUNKLE9BQU87TUFFUCxTQUFTO01BQ1QsTUFBTTtNQUNOLFNBQVM7TUFDVCxJQUFJO01BQ0osT0FBTztNQUVQLFVBQVU7TUFDVixLQUFLO01BQ0wsUUFBUTtNQUNSLE1BQU07TUFDTixPQUFPOztBQUdFLFlBQUEsbUJBQStDO01BQ3hELFNBQVM7TUFDVCxLQUFLO01BQ0wsUUFBUTtNQUNSLFVBQVU7TUFDVixLQUFLO01BQ0wsUUFBUTtNQUNSLE9BQU87TUFDUCxLQUFLO01BQ0wsUUFBUTtNQUNSLE9BQU87TUFDUCxLQUFLO01BQ0wsUUFBUTtNQUNSLEtBQUs7TUFDTCxNQUFNO01BQ04sS0FBSztNQUNMLFFBQVE7TUFDUixNQUFNO01BQ04sS0FBSztNQUNMLFFBQVE7TUFDUixVQUFVO01BQ1YsS0FBSztNQUNMLFFBQVE7TUFDUixXQUFXO01BQ1gsS0FBSztNQUNMLFFBQVE7TUFDUixNQUFNO01BQ04sU0FBUztNQUNULFNBQVM7TUFDVCxLQUFLO01BQ0wsUUFBUTtNQUNSLFVBQVU7TUFDVixLQUFLO01BQ0wsUUFBUTtNQUNSLFVBQVU7TUFDVixLQUFLO01BQ0wsUUFBUTs7QUFHQyxZQUFBLDBCQUFzRDtNQUMvRCxLQUFLO01BQ0wsTUFBTTtNQUNOLE1BQU07TUFDTixNQUFNO01BQ04sTUFBTTtNQUNOLEtBQUs7TUFDTCxPQUFPO01BQ1AsTUFBTTtNQUNOLE9BQU87TUFDUCxNQUFNO01BQ04sS0FBSztNQUNMLFFBQVE7O0FBR0MsWUFBQSwwQkFBc0Q7TUFDL0QsUUFBUTtNQUNSLFFBQVE7TUFDUixPQUFPO01BQ1AsUUFBUTtNQUNSLFFBQVE7TUFDUixPQUFPO01BQ1AsU0FBUztNQUNULFNBQVM7TUFDVCxTQUFTO01BQ1QsUUFBUTtNQUNSLE9BQU87TUFDUCxVQUFVO01BQ1YsV0FBVztNQUNYLFlBQVk7TUFDWixZQUFZO01BQ1osV0FBVztNQUNYLGFBQWE7TUFDYixZQUFZO01BQ1osYUFBYTtNQUNiLFlBQVk7TUFDWixtQkFBbUI7TUFDbkIsdUJBQW9CO01BQ3BCLG9CQUFvQjtNQUNwQixvQkFBb0I7TUFDcEIsb0JBQW9CO01BQ3BCLG1CQUFtQjtNQUNuQixxQkFBcUI7TUFDckIsaUJBQWlCO01BQ2pCLGtCQUFrQjtNQUNsQixhQUFhO01BQ2Isa0JBQWtCOztBQUdULFlBQUEsdUJBQXVEO01BQ2hFLEtBQUs7TUFDTCxRQUFRO01BQ1IsVUFBVTtNQUNWLEtBQUs7TUFDTCxNQUFNO01BQ04sUUFBUTtNQUNSLFFBQVE7TUFDUixTQUFTO01BQ1QsVUFBVTtNQUNWLEdBQUc7TUFDSCxJQUFJO01BQ0osS0FBSztNQUNMLEtBQUs7TUFDTCxHQUFHO01BQ0gsTUFBTTtNQUNOLEtBQUs7TUFDTCxPQUFPO01BQ1AsTUFBTTtNQUNOLE9BQU87TUFDUCxPQUFPO01BQ1AsU0FBUztNQUNULE1BQU07TUFDTixJQUFJO01BQ0osT0FBTzs7QUFLRSxZQUFBLGlCQUFpQixNQUFNLFVBQUEsZ0JBQ2hDLFFBQUEsdUJBQXVCO0FBRzNCLGFBQWdCLG1CQUFtQixPQUFhO0FBQzVDLFlBQU0sTUFBTSxNQUFNLFlBQVc7QUFDN0IsVUFBSSxRQUFBLHdCQUF3QixTQUFTLFFBQVc7QUFDNUMsZUFBTyxRQUFBLHdCQUF3QjtpQkFDeEIsUUFBUSxRQUFRO0FBQ3ZCLGVBQU87aUJBQ0EsUUFBUSxVQUFVLElBQUksTUFBTSxRQUFRLEdBQUc7QUFDOUMsZUFBTzs7QUFHWCxhQUFPLFdBQVcsSUFBSSxRQUFRLEtBQUssR0FBRyxDQUFDO0lBQzNDO0FBWEEsWUFBQSxxQkFBQTtBQWVhLFlBQUEseUJBQXlCLE1BQU0sVUFBQSxnQkFBZ0IsUUFBQSx1QkFBdUI7QUFDbkYsYUFBZ0IsMEJBQTBCLE9BQWE7QUFDbkQsVUFBSSxNQUFNLE1BQU0sWUFBVztBQUMzQixVQUFJLFFBQUEsd0JBQXdCLFNBQVMsUUFBVztBQUM1QyxlQUFPLFFBQUEsd0JBQXdCOztBQUVuQyxZQUFNLElBQUksUUFBUSxnQkFBZ0IsRUFBRTtBQUNwQyxhQUFPLFNBQVMsR0FBRztJQUN2QjtBQVBBLFlBQUEsNEJBQUE7QUFXYSxZQUFBLGVBQWU7QUFDNUIsYUFBZ0IsVUFBVSxPQUFhO0FBQ25DLFVBQUksaUJBQWlCLEtBQUssS0FBSyxHQUFHO0FBRTlCLGdCQUFRLE1BQU0sUUFBUSxrQkFBa0IsRUFBRTtBQUMxQyxlQUFPLENBQUMsU0FBUyxLQUFLOztBQUcxQixVQUFJLGVBQWUsS0FBSyxLQUFLLEdBQUc7QUFDNUIsZ0JBQVEsTUFBTSxRQUFRLGdCQUFnQixFQUFFO0FBQ3hDLGVBQU8sU0FBUyxLQUFLOztBQUd6QixZQUFNLGdCQUFnQixTQUFTLEtBQUs7QUFDcEMsYUFBTyxRQUFBLHFCQUFxQixhQUFhO0lBQzdDO0FBZEEsWUFBQSxZQUFBO0FBa0JBLFFBQU0sMkJBQTJCLElBQUksUUFBQSwyQkFBMkIsVUFBQSxnQkFBZ0IsUUFBQSxvQkFBb0I7QUFDcEcsUUFBTSx5QkFBeUIsSUFBSSxPQUFPLDBCQUEwQixHQUFHO0FBRTFELFlBQUEscUJBQXFCLFVBQUEsd0JBQXdCLDBCQUEwQix3QkFBd0I7QUFFNUcsYUFBZ0IsZUFBZSxjQUFZO0FBQ3ZDLFlBQU0sWUFBWSxDQUFBO0FBQ2xCLFVBQUksZ0JBQWdCO0FBQ3BCLFVBQUksUUFBUSx1QkFBdUIsS0FBSyxhQUFhO0FBQ3JELGFBQU8sT0FBTztBQUNWLGdDQUF3QixXQUFXLEtBQUs7QUFDeEMsd0JBQWdCLGNBQWMsVUFBVSxNQUFNLEdBQUcsTUFBTTtBQUN2RCxnQkFBUSx1QkFBdUIsS0FBSyxhQUFhOztBQUVyRCxhQUFPO0lBQ1g7QUFWQSxZQUFBLGlCQUFBO0FBWUEsYUFBUyx3QkFBd0IsV0FBVyxPQUFLO0FBQzdDLFlBQU0sTUFBTSxtQkFBbUIsTUFBTSxFQUFFO0FBQ3ZDLFlBQU0sT0FBTyxRQUFBLHFCQUFxQixNQUFNLEdBQUcsWUFBVztBQUN0RCxnQkFBVSxRQUFRO0lBQ3RCOzs7Ozs7Ozs7QUM1T0EsUUFBQSxjQUFBO0FBRUEsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQXFCLCtCQUFyQixjQUEwRCxpQ0FBQSx1Q0FBc0M7TUFDNUYsZUFBWTtBQUNSLGVBQU8sSUFBSSxPQUFPLHNDQUEyQyxZQUFBLHFCQUFxQixjQUFtQixHQUFHO01BQzVHO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFlBQVksWUFBQSxlQUFlLE1BQU0sRUFBRTtBQUN6QyxlQUFPLFVBQUEsa0JBQWtCLDRCQUE0QixRQUFRLFdBQVcsU0FBUztNQUNyRjs7QUFSSixZQUFBLFVBQUE7Ozs7Ozs7OztBQ0hBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFDQSxRQUFBLFVBQUE7QUFFQSxRQUFNLFVBQVUsSUFBSSxPQUNoQix5RkFHUSxVQUFBLGdCQUFnQixZQUFBLGtCQUFrQixlQUUxQyxHQUFHO0FBR1AsUUFBTSxlQUFlO0FBQ3JCLFFBQU0sZ0JBQWdCO0FBQ3RCLFFBQU0sZ0JBQWdCO0FBRXRCLFFBQXFCLGtCQUFyQixjQUE2QyxpQ0FBQSx1Q0FBc0M7TUFDL0UsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxZQUFZLE1BQU0sZUFBZSxZQUFXO0FBQ2xELGNBQU0sU0FBUyxZQUFBLG1CQUFtQjtBQUNsQyxjQUFNLFNBQVMsTUFBTTtBQUNyQixjQUFNLFVBQVUsTUFBTTtBQUN0QixZQUFJLGVBQWUsVUFBVTtBQUM3Qix1QkFBZSxnQkFBZ0I7QUFDL0IsdUJBQWUsYUFBYSxZQUFXO0FBRXZDLFlBQUksV0FBVztBQUNmLFlBQUksZ0JBQWdCLFVBQVU7QUFDMUIscUJBQVc7bUJBQ0osZ0JBQWdCLFlBQVk7QUFDbkMscUJBQVc7bUJBQ0osZ0JBQWdCLFFBQVE7QUFDL0IscUJBQVc7O0FBR2YsY0FBTSxPQUFPLFFBQUEsZUFBZSxRQUFRLFNBQVMsUUFBUSxRQUFRO0FBQzdELGVBQU8sUUFDRix3QkFBdUIsRUFDdkIsT0FBTyxXQUFXLE1BQU0sRUFDeEIsTUFBTSxPQUFPLEtBQUssS0FBSSxDQUFFLEVBQ3hCLE1BQU0sU0FBUyxLQUFLLE1BQUssSUFBSyxDQUFDLEVBQy9CLE1BQU0sUUFBUSxLQUFLLEtBQUksQ0FBRTtNQUNsQzs7QUE5QkosWUFBQSxVQUFBOzs7Ozs7Ozs7QUNuQkEsUUFBQSxVQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxjQUFBO0FBQ0EsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLGdCQUNRLFlBQUEsaUZBR0EsWUFBQSxzREFJSixVQUFBLGdCQUFnQixZQUFBLGdCQUFnQixJQUNoQyxzQkFHSSxZQUFBLHlDQUdSLEdBQUc7QUFHUCxRQUFNLG1CQUFtQjtBQUN6QixRQUFNLGFBQWE7QUFDbkIsUUFBTSxnQkFBZ0I7QUFDdEIsUUFBTSxhQUFhO0FBaUJuQixRQUFxQixnQ0FBckIsY0FBMkQsaUNBQUEsdUNBQXNDO01BQzdGLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sUUFBUSxZQUFBLGlCQUFpQixNQUFNLGtCQUFrQixZQUFXO0FBQ2xFLGNBQU0sTUFBTSxZQUFBLDBCQUEwQixNQUFNLFdBQVc7QUFDdkQsWUFBSSxNQUFNLElBQUk7QUFFVixnQkFBTSxRQUFRLE1BQU0sUUFBUSxNQUFNLFlBQVk7QUFDOUMsaUJBQU87O0FBR1gsY0FBTSxhQUFhLFFBQVEsd0JBQXdCO1VBQy9DO1VBQ0E7U0FDSDtBQUVELFlBQUksTUFBTSxhQUFhO0FBQ25CLGdCQUFNLE9BQU8sWUFBQSxVQUFVLE1BQU0sV0FBVztBQUN4QyxxQkFBVyxPQUFPLFFBQVEsSUFBSTtlQUMzQjtBQUNILGdCQUFNLE9BQU8sUUFBQSxxQkFBcUIsUUFBUSxTQUFTLEtBQUssS0FBSztBQUM3RCxxQkFBVyxNQUFNLFFBQVEsSUFBSTs7QUFHakMsWUFBSSxDQUFDLE1BQU0sZ0JBQWdCO0FBQ3ZCLGlCQUFPOztBQUlYLGNBQU0sVUFBVSxZQUFBLDBCQUEwQixNQUFNLGNBQWM7QUFDOUQsY0FBTSxTQUFTLFFBQVEsb0JBQW9CLE1BQU0sT0FBTyxNQUFNLEVBQUU7QUFDaEUsZUFBTyxRQUFRO0FBQ2YsZUFBTyxNQUFNLFdBQVcsTUFBSztBQUM3QixlQUFPLElBQUksT0FBTyxPQUFPLE9BQU87QUFFaEMsZUFBTztNQUNYOztBQXZDSixZQUFBLFVBQUE7Ozs7Ozs7OztBQy9DQSxRQUFBLGNBQUE7QUFFQSxRQUFBLFVBQUE7QUFDQSxRQUFBLFlBQUE7QUFDQSxRQUFBLGNBQUE7QUFDQSxRQUFBLG1DQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FDaEIsSUFBSSxVQUFBLGdCQUFnQixZQUFBLGdCQUFnQixzQkFHbkIsWUFBQSxvREFHakIsR0FBRztBQUdQLFFBQU0sbUJBQW1CO0FBQ3pCLFFBQU0sYUFBYTtBQVFuQixRQUFxQixvQkFBckIsY0FBK0MsaUNBQUEsdUNBQXNDO01BQ2pGLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sYUFBYSxRQUFRLHdCQUF1QjtBQUNsRCxtQkFBVyxNQUFNLE9BQU8sQ0FBQztBQUV6QixjQUFNLFlBQVksTUFBTTtBQUN4QixjQUFNLFFBQVEsWUFBQSxpQkFBaUIsVUFBVSxZQUFXO0FBQ3BELG1CQUFXLE9BQU8sU0FBUyxLQUFLO0FBRWhDLFlBQUksTUFBTSxhQUFhO0FBQ25CLGdCQUFNLE9BQU8sWUFBQSxVQUFVLE1BQU0sV0FBVztBQUN4QyxxQkFBVyxPQUFPLFFBQVEsSUFBSTtlQUMzQjtBQUNILGdCQUFNLE9BQU8sUUFBQSxxQkFBcUIsUUFBUSxTQUFTLEdBQUcsS0FBSztBQUMzRCxxQkFBVyxNQUFNLFFBQVEsSUFBSTs7QUFHakMsZUFBTztNQUNYOztBQXRCSixZQUFBLFVBQUE7Ozs7Ozs7OztBQ3hCQSxRQUFBLG1DQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FBTyxvQ0FBeUMsR0FBRztBQUV2RSxRQUFNLGNBQWM7QUFDcEIsUUFBTSxhQUFhO0FBT25CLFFBQXFCLDJCQUFyQixjQUFzRCxpQ0FBQSx1Q0FBc0M7TUFDeEYsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxPQUFPLFNBQVMsTUFBTSxXQUFXO0FBQ3ZDLGNBQU0sUUFBUSxTQUFTLE1BQU0sWUFBWTtBQUV6QyxlQUFPLFFBQVEsd0JBQXVCLEVBQUcsTUFBTSxPQUFPLENBQUMsRUFBRSxPQUFPLFNBQVMsS0FBSyxFQUFFLE9BQU8sUUFBUSxJQUFJO01BQ3ZHOztBQVZKLFlBQUEsVUFBQTs7Ozs7Ozs7O0FDZEEsUUFBQSxpQ0FBQTtBQUlBLFFBQXFCLHlCQUFyQixjQUFvRCwrQkFBQSw2QkFBNEI7TUFDNUUsZ0JBQWE7QUFDVCxlQUFPO01BQ1g7TUFFQSxpQkFBYztBQUNWLGVBQU87TUFDWDtNQUVBLGdCQUFhO0FBQ1QsZUFBTztNQUNYO01BRUEsNkJBQTZCLFNBQXlCLE9BQXVCO0FBRXpFLFlBQUksTUFBTSxHQUFHLE1BQU0sZUFBZSxHQUFHO0FBQ2pDLGlCQUFPOztBQUdYLGVBQU8sTUFBTSw2QkFBNkIsU0FBUyxLQUFLO01BQzVEOztBQXBCSixZQUFBLFVBQUE7Ozs7Ozs7OztBQ0hBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFTQSxRQUFNLFVBQVUsSUFBSSxPQUNoQiw0QkFDVyxVQUFBLGdCQUFnQixZQUFBLGdCQUFnQixvREFHM0MsR0FBRztBQUdQLFFBQU0sb0JBQW9CO0FBQzFCLFFBQU0sbUJBQW1CO0FBQ3pCLFFBQU0scUJBQXFCO0FBQzNCLFFBQU0sb0JBQW9CO0FBRTFCLFFBQXFCLDZCQUFyQixjQUF3RCxpQ0FBQSx1Q0FBc0M7TUFDMUYsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxRQUFRLE1BQU0sc0JBQ2QsU0FBUyxNQUFNLG1CQUFtQixJQUNsQyxZQUFBLGlCQUFpQixNQUFNLGtCQUFrQixZQUFXO0FBRTFELFlBQUksUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUN6QixpQkFBTzs7QUFHWCxjQUFNLE9BQU8sU0FBUyxNQUFNLGtCQUFrQjtBQUM5QyxjQUFNLE1BQU0sU0FBUyxNQUFNLGtCQUFrQjtBQUU3QyxlQUFPO1VBQ0g7VUFDQTtVQUNBOztNQUVSOztBQXRCSixZQUFBLFVBQUE7Ozs7Ozs7Ozs7OztBQ3ZCQSxRQUFBLG1DQUFBO0FBQ0EsUUFBQSxVQUFBO0FBQ0EsUUFBQSxVQUFBO0FBQ0EsUUFBQSxVQUFBQyxpQkFBQSxtQkFBQTtBQXFCQSxRQUFNLGFBQWE7QUFDbkIsUUFBTSxvQkFBb0I7QUFFMUIsUUFBcUIseUJBQXJCLGNBQW9ELGlDQUFBLHVDQUFzQztNQUN0RixhQUFhLFNBQXVCO0FBQ2hDLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxXQUFXLE1BQU0sWUFBWSxZQUFXO0FBQzlDLGNBQU0sV0FBVyxNQUFNLG1CQUFtQixZQUFXO0FBQ3JELGNBQU0sWUFBWSxRQUFRLHdCQUF1QjtBQUNqRCxjQUFNLGFBQWEsUUFBQSxRQUFNLFFBQVEsT0FBTztBQUV4QyxnQkFBUTtlQUNDO0FBQ0Qsb0JBQUEsa0JBQWtCLFdBQVcsV0FBVyxJQUFJLElBQUksS0FBSyxDQUFDO0FBQ3REO2VBQ0M7QUFDRCxvQkFBQSxrQkFBa0IsV0FBVyxVQUFVO0FBQ3ZDO2VBQ0M7QUFDRCxvQkFBQSxpQkFBaUIsV0FBVyxVQUFVO0FBQ3RDOztBQUdSLGdCQUFRO2VBQ0M7QUFDRCxzQkFBVSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFDdkMsc0JBQVUsTUFBTSxRQUFRLENBQUM7QUFDekI7ZUFDQztBQUNELHNCQUFVLE1BQU0sWUFBWSxRQUFBLFNBQVMsRUFBRTtBQUN2QyxzQkFBVSxNQUFNLFFBQVEsRUFBRTtBQUMxQjtlQUNDO0FBQ0Qsc0JBQVUsTUFBTSxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3ZDLHNCQUFVLE1BQU0sUUFBUSxFQUFFO0FBQzFCO2VBRUM7QUFDRCxzQkFBVSxNQUFNLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFDdkMsc0JBQVUsTUFBTSxRQUFRLEVBQUU7QUFDMUI7O0FBR1IsZUFBTztNQUNYOztBQTVDSixZQUFBLFVBQUE7Ozs7Ozs7OztBQzdCQSxRQUFBLGNBQUE7QUFFQSxRQUFBLFlBQUE7QUFDQSxRQUFBLG1DQUFBO0FBQ0EsUUFBQSxjQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FBTyxrREFBa0QsWUFBQSxnQ0FBZ0MsR0FBRztBQUVoSCxRQUFxQix1Q0FBckIsY0FBa0UsaUNBQUEsdUNBQXNDO01BQ3BHLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sU0FBUyxNQUFNLEdBQUcsWUFBVztBQUNuQyxZQUFJLFlBQVksWUFBQSxlQUFlLE1BQU0sRUFBRTtBQUN2QyxnQkFBUTtlQUNDO2VBQ0E7ZUFDQTtBQUNELHdCQUFZLFlBQUEsaUJBQWlCLFNBQVM7QUFDdEM7O0FBR1IsZUFBTyxVQUFBLGtCQUFrQiw0QkFBNEIsUUFBUSxXQUFXLFNBQVM7TUFDckY7O0FBakJKLFlBQUEsVUFBQTs7Ozs7Ozs7Ozs7O0FDUkEsUUFBQSxjQUFBO0FBRUEsUUFBQSxZQUFBO0FBQ0EsUUFBQSxVQUFBQyxpQkFBQSxtQkFBQTtBQUNBLFFBQUEsbUNBQUE7QUFDQSxRQUFBLFlBQUE7QUFFQSxRQUFNLFVBQVUsSUFBSSxPQUNoQiw0REFBNEQsVUFBQSxnQkFBZ0IsWUFBQSxvQkFBb0IsdUJBRWhHLEdBQUc7QUFHUCxRQUFNLHNCQUFzQjtBQUM1QixRQUFNLHNCQUFzQjtBQUU1QixRQUFxQiw2QkFBckIsY0FBd0QsaUNBQUEsdUNBQXNDO01BQzFGLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sV0FBVyxNQUFNLHFCQUFxQixZQUFXO0FBQ3ZELGNBQU0sV0FBVyxNQUFNLHFCQUFxQixZQUFXO0FBQ3ZELGNBQU0sV0FBVyxZQUFBLHFCQUFxQjtBQUV0QyxZQUFJLFlBQVksYUFBYSxZQUFZLGNBQWMsWUFBWSxXQUFXO0FBQzFFLGdCQUFNLFlBQVksQ0FBQTtBQUNsQixvQkFBVSxZQUFZO0FBQ3RCLGlCQUFPLFVBQUEsa0JBQWtCLDRCQUE0QixRQUFRLFdBQVcsU0FBUzs7QUFHckYsWUFBSSxZQUFZLGVBQWUsWUFBWSxVQUFVO0FBQ2pELGdCQUFNLFlBQVksQ0FBQTtBQUNsQixvQkFBVSxZQUFZO0FBQ3RCLGlCQUFPLFVBQUEsa0JBQWtCLDRCQUE0QixRQUFRLFdBQVcsU0FBUzs7QUFHckYsY0FBTSxhQUFhLFFBQVEsd0JBQXVCO0FBQ2xELFlBQUksT0FBTyxRQUFBLFFBQU0sUUFBUSxVQUFVLE9BQU87QUFHMUMsWUFBSSxTQUFTLE1BQU0sT0FBTyxHQUFHO0FBQ3pCLGlCQUFPLEtBQUssSUFBSSxDQUFDLEtBQUssSUFBSSxHQUFHLEdBQUcsR0FBRztBQUNuQyxxQkFBVyxNQUFNLE9BQU8sS0FBSyxLQUFJLENBQUU7QUFDbkMscUJBQVcsTUFBTSxTQUFTLEtBQUssTUFBSyxJQUFLLENBQUM7QUFDMUMscUJBQVcsTUFBTSxRQUFRLEtBQUssS0FBSSxDQUFFO21CQUkvQixTQUFTLE1BQU0sUUFBUSxHQUFHO0FBQy9CLGlCQUFPLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSSxJQUFLLEdBQUcsR0FBRztBQUNyQyxxQkFBVyxNQUFNLE9BQU8sS0FBSyxLQUFJLENBQUU7QUFDbkMscUJBQVcsT0FBTyxRQUFRLEtBQUssS0FBSSxDQUFFO0FBQ3JDLHFCQUFXLE9BQU8sU0FBUyxLQUFLLE1BQUssSUFBSyxDQUFDO21CQUl0QyxTQUFTLE1BQU0sT0FBTyxHQUFHO0FBQzlCLGlCQUFPLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSSxJQUFLLEdBQUcsR0FBRztBQUNyQyxpQkFBTyxLQUFLLElBQUksQ0FBQyxLQUFLLE1BQUssR0FBSSxPQUFPO0FBRXRDLHFCQUFXLE1BQU0sT0FBTyxLQUFLLEtBQUksQ0FBRTtBQUNuQyxxQkFBVyxNQUFNLFNBQVMsS0FBSyxNQUFLLElBQUssQ0FBQztBQUMxQyxxQkFBVyxPQUFPLFFBQVEsS0FBSyxLQUFJLENBQUU7O0FBR3pDLGVBQU87TUFDWDs7QUFwREosWUFBQSxVQUFBOzs7Ozs7Ozs7QUNmQSxRQUFBLGNBQUE7QUFDQSxRQUFBLFlBQUE7QUFDQSxRQUFBLG1DQUFBO0FBQ0EsUUFBQSxjQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FBTyxNQUFXLFlBQUEscUJBQXFCLHlDQUE4QyxHQUFHO0FBRTVHLFFBQU0saUJBQWlCLElBQUksT0FBTyxNQUFXLFlBQUEscUJBQXFCLHlCQUE4QixHQUFHO0FBRW5HLFFBQXFCLDRCQUFyQixjQUF1RCxpQ0FBQSx1Q0FBc0M7TUFDekYsWUFBb0IsWUFBbUI7QUFDbkMsY0FBSztBQURXLGFBQUEsYUFBQTtNQUVwQjtNQUVBLGVBQVk7QUFDUixlQUFPLEtBQUssYUFBYSxpQkFBaUI7TUFDOUM7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sWUFBWSxZQUFBLGVBQWUsTUFBTSxFQUFFO0FBQ3pDLGNBQU0sa0JBQWtCLFlBQUEsaUJBQWlCLFNBQVM7QUFFbEQsZUFBTyxVQUFBLGtCQUFrQiw0QkFBNEIsUUFBUSxXQUFXLGVBQWU7TUFDM0Y7O0FBZEosWUFBQSxVQUFBOzs7Ozs7Ozs7QUNUQSxRQUFBLGNBQUE7QUFDQSxRQUFBLFlBQUE7QUFDQSxRQUFBLG1DQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FDaEIsTUFBVyxZQUFBLHFCQUFxQiwwREFDaEMsR0FBRztBQUdQLFFBQU0saUJBQWlCLElBQUksT0FBTyxNQUFXLFlBQUEscUJBQXFCLGtDQUE0QyxHQUFHO0FBQ2pILFFBQU0sc0JBQXNCO0FBRTVCLFFBQXFCLDhCQUFyQixjQUF5RCxpQ0FBQSx1Q0FBc0M7TUFDM0YsWUFBb0IsWUFBbUI7QUFDbkMsY0FBSztBQURXLGFBQUEsYUFBQTtNQUVwQjtNQUVBLGVBQVk7QUFDUixlQUFPLEtBQUssYUFBYSxpQkFBaUI7TUFDOUM7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sWUFBWSxZQUFBLGVBQWUsTUFBTSxvQkFBb0I7QUFDM0QsZUFBTyxVQUFBLGtCQUFrQiw0QkFBNEIsUUFBUSxXQUFXLFNBQVM7TUFDckY7O0FBWkosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7O0FDUEEsUUFBQSxtQkFBQTtBQUVBLFFBQUEsV0FBQTtBQUNBLFFBQUEsNEJBQUFDLGlCQUFBLGlDQUFBO0FBQ0EsUUFBQSwyQkFBQUEsaUJBQUEsZ0NBQUE7QUFDQSxRQUFBLHVCQUFBQSxpQkFBQSw0QkFBQTtBQUNBLFFBQUEsdUJBQUFBLGlCQUFBLDRCQUFBO0FBQ0EsUUFBQSwwQkFBQUEsaUJBQUEsK0JBQUE7QUFDQSxRQUFBLGlDQUFBQSxpQkFBQSxzQ0FBQTtBQUNBLFFBQUEsb0JBQUFBLGlCQUFBLHlCQUFBO0FBQ0EsUUFBQSxrQ0FBQUEsaUJBQUEsdUNBQUE7QUFDQSxRQUFBLHNCQUFBQSxpQkFBQSwyQkFBQTtBQUNBLFFBQUEsNkJBQUFBLGlCQUFBLGtDQUFBO0FBQ0EsUUFBQSwyQkFBQUEsaUJBQUEsZ0NBQUE7QUFDQSxRQUFBLCtCQUFBQSxpQkFBQSxvQ0FBQTtBQUNBLFFBQUEsMkJBQUFBLGlCQUFBLGdDQUFBO0FBQ0EsUUFBQSx5Q0FBQUEsaUJBQUEsOENBQUE7QUFDQSxRQUFBLCtCQUFBQSxpQkFBQSxvQ0FBQTtBQUNBLFFBQUEsOEJBQUFBLGlCQUFBLG1DQUFBO0FBQ0EsUUFBQSxnQ0FBQUEsaUJBQUEscUNBQUE7QUFHYSxZQUFBLFNBQVMsSUFBSSxTQUFBLE9BQU8sMEJBQXlCLENBQUU7QUFDL0MsWUFBQSxTQUFTLElBQUksU0FBQSxPQUFPLG9CQUFvQixJQUFJLENBQUM7QUFFMUQsYUFBZ0IsTUFBTUMsT0FBYyxLQUFZLFFBQXNCO0FBQ2xFLGFBQU8sUUFBQSxPQUFPLE1BQU1BLE9BQU0sS0FBSyxNQUFNO0lBQ3pDO0FBRkEsWUFBQSxRQUFBO0FBSUEsYUFBZ0JDLFdBQVVELE9BQWMsS0FBWSxRQUFzQjtBQUN0RSxhQUFPLFFBQUEsT0FBTyxVQUFVQSxPQUFNLEtBQUssTUFBTTtJQUM3QztBQUZBLFlBQUEsWUFBQUM7QUFJQSxhQUFnQiwwQkFBMEIsZUFBZSxNQUFJO0FBQ3pELFlBQU0sU0FBUyxvQkFBb0IsT0FBTyxZQUFZO0FBQ3RELGFBQU8sUUFBUSxRQUFRLElBQUkscUJBQUEsUUFBa0IsQ0FBRTtBQUMvQyxhQUFPLFFBQVEsUUFBUSxJQUFJLHFCQUFBLFFBQWtCLENBQUU7QUFDL0MsYUFBTyxRQUFRLFFBQVEsSUFBSSx5QkFBQSxRQUFzQixDQUFFO0FBQ25ELGFBQU8sUUFBUSxRQUFRLElBQUksb0JBQUEsUUFBaUIsQ0FBRTtBQUM5QyxhQUFPLFFBQVEsUUFBUSxJQUFJLDZCQUFBLFFBQTBCLENBQUU7QUFDdkQsYUFBTyxRQUFRLFFBQVEsSUFBSSx1Q0FBQSxRQUFvQyxDQUFFO0FBQ2pFLGFBQU87SUFDWDtBQVRBLFlBQUEsNEJBQUE7QUFjQSxhQUFnQixvQkFBb0IsYUFBYSxNQUFNLGVBQWUsTUFBSTtBQUN0RSxhQUFPLGlCQUFBLDJCQUNIO1FBQ0ksU0FBUztVQUNMLElBQUksd0JBQUEsUUFBc0IsWUFBWTtVQUN0QyxJQUFJLCtCQUFBLFFBQTRCO1VBQ2hDLElBQUksZ0NBQUEsUUFBNkI7VUFDakMsSUFBSSxvQkFBQSxRQUFpQjtVQUNyQixJQUFJLGtCQUFBLFFBQWU7VUFDbkIsSUFBSSw2QkFBQSxRQUEwQjtVQUM5QixJQUFJLDJCQUFBLFFBQXdCO1VBQzVCLElBQUkseUJBQUEsUUFBdUIsVUFBVTtVQUNyQyxJQUFJLDRCQUFBLFFBQTBCLFVBQVU7VUFDeEMsSUFBSSw4QkFBQSxRQUE0QixVQUFVOztRQUU5QyxVQUFVLENBQUMsSUFBSSx5QkFBQSxRQUFzQixHQUFJLElBQUksMEJBQUEsUUFBdUIsQ0FBRTtTQUUxRSxVQUFVO0lBRWxCO0FBbkJBLFlBQUEsc0JBQUE7Ozs7Ozs7Ozs7OztBQ3JEQSxRQUFBLFVBQUFDLGlCQUFBLG1CQUFBO0FBRUEsUUFBQSxtQ0FBQTtBQUdBLFFBQU0sWUFBWTtBQUNsQixRQUFNLGNBQWM7QUFDcEIsUUFBTSxlQUFlO0FBQ3JCLFFBQU0sZUFBZTtBQUNyQixRQUFNLGNBQWM7QUFDcEIsUUFBTSxlQUFlO0FBRXJCLFFBQXFCLHlCQUFyQixjQUFvRCxpQ0FBQSx1Q0FBc0M7TUFDdEYsYUFBYSxTQUF1QjtBQUNoQyxlQUFPLElBQUksT0FDUCxpbkJBTUEsR0FBRztNQUVYO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFFBQVEsTUFBTTtBQUNwQixjQUFNLFNBQVMsUUFBUSxvQkFBb0IsT0FBTyxNQUFNLEVBQUU7QUFFMUQsY0FBTSxZQUFZLFFBQUEsUUFBTSxRQUFRLE9BQU87QUFDdkMsWUFBSSxjQUFjO0FBRWxCLFlBQUksTUFBTSxZQUFZO0FBQ2xCLGlCQUFPLE1BQU0sTUFBTSxRQUFRLFVBQVUsS0FBSSxDQUFFO0FBQzNDLGlCQUFPLE1BQU0sTUFBTSxVQUFVLFVBQVUsT0FBTSxDQUFFO0FBQy9DLGlCQUFPLE1BQU0sTUFBTSxVQUFVLFVBQVUsT0FBTSxDQUFFO0FBQy9DLGlCQUFPLE1BQU0sTUFBTSxlQUFlLFVBQVUsWUFBVyxDQUFFO21CQUNsRCxNQUFNLGNBQWM7QUFDM0IsZ0JBQU0sT0FBTyxNQUFNO0FBQ25CLGdCQUFNLFFBQVEsTUFBTTtBQUVwQixjQUFJLFFBQVEsWUFBTyxRQUFRLFVBQUs7QUFFNUIsZ0JBQUksVUFBVSxLQUFJLElBQUssR0FBRztBQUN0Qiw0QkFBYyxZQUFZLElBQUksR0FBRyxLQUFLOztxQkFFbkMsUUFBUSxZQUFPLFFBQVEsWUFBTyxRQUFRLFVBQUs7QUFDbEQsMEJBQWMsWUFBWSxJQUFJLElBQUksS0FBSztxQkFDaEMsUUFBUSxVQUFLO0FBQ3BCLDBCQUFjLFlBQVksSUFBSSxJQUFJLEtBQUs7cUJBQ2hDLFFBQVEsZ0JBQU07QUFDckIsMEJBQWMsWUFBWSxJQUFJLElBQUksS0FBSztxQkFDaEMsUUFBUSxVQUFLO0FBQ3BCLDBCQUFjLFlBQVksSUFBSSxHQUFHLEtBQUs7cUJBQy9CLFFBQVEsZ0JBQU07QUFDckIsMEJBQWMsWUFBWSxJQUFJLEdBQUcsS0FBSzs7QUFHMUMsY0FBSSxTQUFTLFlBQU8sU0FBUyxVQUFLO0FBQzlCLG1CQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7cUJBQ3JCLFNBQVMsVUFBSztBQUNyQixtQkFBTyxNQUFNLE1BQU0sUUFBUSxFQUFFO0FBQzdCLG1CQUFPLE1BQU0sTUFBTSxZQUFZLENBQUM7O21CQUU3QixNQUFNLGVBQWU7QUFDNUIsZ0JBQU0sY0FBYyxNQUFNO0FBQzFCLGdCQUFNLFFBQVEsWUFBWTtBQUMxQixjQUFJLFNBQVMsWUFBTyxTQUFTLFlBQU8sU0FBUyxVQUFLO0FBQzlDLG1CQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7cUJBQ3JCLFNBQVMsWUFBTyxTQUFTLFVBQUs7QUFDckMsbUJBQU8sTUFBTSxNQUFNLFFBQVEsRUFBRTtBQUM3QixtQkFBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO3FCQUN6QixTQUFTLFVBQUs7QUFDckIsbUJBQU8sTUFBTSxNQUFNLFFBQVEsRUFBRTtBQUM3QixtQkFBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO3FCQUN6QixTQUFTLFlBQU8sU0FBUyxVQUFLO0FBQ3JDLG1CQUFPLE1BQU0sTUFBTSxRQUFRLEVBQUU7QUFDN0IsbUJBQU8sTUFBTSxNQUFNLFlBQVksQ0FBQztxQkFDekIsU0FBUyxVQUFLO0FBQ3JCLG1CQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7O21CQUV6QixNQUFNLGNBQWM7QUFDM0IsZ0JBQU0sT0FBTyxNQUFNO0FBRW5CLGNBQUksUUFBUSxZQUFPLFFBQVEsVUFBSztBQUU1QixnQkFBSSxVQUFVLEtBQUksSUFBSyxHQUFHO0FBQ3RCLDRCQUFjLFlBQVksSUFBSSxHQUFHLEtBQUs7O3FCQUVuQyxRQUFRLFlBQU8sUUFBUSxZQUFPLFFBQVEsVUFBSztBQUNsRCwwQkFBYyxZQUFZLElBQUksSUFBSSxLQUFLO3FCQUNoQyxRQUFRLFVBQUs7QUFDcEIsMEJBQWMsWUFBWSxJQUFJLElBQUksS0FBSztxQkFDaEMsUUFBUSxnQkFBTTtBQUNyQiwwQkFBYyxZQUFZLElBQUksSUFBSSxLQUFLO3FCQUNoQyxRQUFRLFVBQUs7QUFDcEIsMEJBQWMsWUFBWSxJQUFJLEdBQUcsS0FBSztxQkFDL0IsUUFBUSxnQkFBTTtBQUNyQiwwQkFBYyxZQUFZLElBQUksR0FBRyxLQUFLOztBQUcxQyxnQkFBTSxjQUFjLE1BQU07QUFDMUIsY0FBSSxhQUFhO0FBQ2Isa0JBQU0sUUFBUSxZQUFZO0FBQzFCLGdCQUFJLFNBQVMsWUFBTyxTQUFTLFlBQU8sU0FBUyxVQUFLO0FBQzlDLHFCQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7dUJBQ3JCLFNBQVMsWUFBTyxTQUFTLFVBQUs7QUFDckMscUJBQU8sTUFBTSxNQUFNLFFBQVEsRUFBRTtBQUM3QixxQkFBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO3VCQUN6QixTQUFTLFVBQUs7QUFDckIscUJBQU8sTUFBTSxNQUFNLFFBQVEsRUFBRTtBQUM3QixxQkFBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO3VCQUN6QixTQUFTLFlBQU8sU0FBUyxVQUFLO0FBQ3JDLHFCQUFPLE1BQU0sTUFBTSxRQUFRLEVBQUU7QUFDN0IscUJBQU8sTUFBTSxNQUFNLFlBQVksQ0FBQzt1QkFDekIsU0FBUyxVQUFLO0FBQ3JCLHFCQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7QUFLeEMsZUFBTyxNQUFNLE9BQU8sT0FBTyxZQUFZLEtBQUksQ0FBRTtBQUM3QyxlQUFPLE1BQU0sT0FBTyxTQUFTLFlBQVksTUFBSyxJQUFLLENBQUM7QUFDcEQsZUFBTyxNQUFNLE9BQU8sUUFBUSxZQUFZLEtBQUksQ0FBRTtBQUU5QyxlQUFPO01BQ1g7O0FBbEhKLFlBQUEsVUFBQTs7Ozs7Ozs7OztBQ1phLFlBQUEsU0FBUztNQUNsQixVQUFLO01BQ0wsVUFBSztNQUNMLFVBQUs7TUFDTCxVQUFLO01BQ0wsVUFBSztNQUNMLFVBQUs7TUFDTCxVQUFLO01BQ0wsVUFBSztNQUNMLFVBQUs7TUFDTCxVQUFLO01BQ0wsVUFBSztNQUNMLFVBQUs7TUFDTCxVQUFLO01BQ0wsVUFBSzs7QUFHSSxZQUFBLGlCQUFpQjtNQUMxQixVQUFLO01BQ0wsVUFBSztNQUNMLFVBQUs7TUFDTCxVQUFLO01BQ0wsVUFBSztNQUNMLFVBQUs7TUFDTCxVQUFLO01BQ0wsVUFBSzs7QUFHVCxhQUFnQixpQkFBaUJDLE9BQVk7QUFDekMsVUFBSSxTQUFTO0FBRWIsZUFBUyxJQUFJLEdBQUcsSUFBSUEsTUFBSyxRQUFRLEtBQUs7QUFDbEMsY0FBTSxPQUFPQSxNQUFLO0FBQ2xCLFlBQUksU0FBUyxVQUFLO0FBQ2QsbUJBQVMsV0FBVyxJQUFJLFFBQUEsT0FBTyxRQUFRLFNBQVMsUUFBQSxPQUFPO2VBQ3BEO0FBQ0gsb0JBQVUsUUFBQSxPQUFPOzs7QUFJekIsYUFBTztJQUNYO0FBYkEsWUFBQSxtQkFBQTtBQWVBLGFBQWdCLGVBQWVBLE9BQVk7QUFDdkMsVUFBSSxTQUFTO0FBRWIsZUFBUyxJQUFJLEdBQUcsSUFBSUEsTUFBSyxRQUFRLEtBQUs7QUFDbEMsY0FBTSxPQUFPQSxNQUFLO0FBQ2xCLGlCQUFTLFNBQVMsUUFBQSxPQUFPOztBQUc3QixhQUFPLFNBQVMsTUFBTTtJQUMxQjtBQVRBLFlBQUEsaUJBQUE7Ozs7Ozs7Ozs7OztBQzNDQSxRQUFBLFVBQUFDLGlCQUFBLG1CQUFBO0FBRUEsUUFBQSxtQ0FBQTtBQUNBLFFBQUEsY0FBQTtBQUVBLFFBQU0sYUFBYTtBQUNuQixRQUFNLGNBQWM7QUFDcEIsUUFBTSxZQUFZO0FBRWxCLFFBQXFCLG1CQUFyQixjQUE4QyxpQ0FBQSx1Q0FBc0M7TUFDaEYsZUFBWTtBQUVSLGVBQU8sSUFBSSxPQUNQLGdCQUVVLE9BQU8sS0FBSyxZQUFBLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxXQUMvQixPQUFPLEtBQUssWUFBQSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksNERBUWhDLE9BQU8sS0FBSyxZQUFBLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBRyxpREFPN0IsT0FBTyxLQUFLLFlBQUEsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLG9DQUcvQjtNQUVsQjtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxjQUFjLFFBQUEsUUFBTSxRQUFRLE9BQU87QUFDekMsY0FBTSxTQUFTLFFBQVEsb0JBQW9CLE1BQU0sT0FBTyxNQUFNLEVBQUU7QUFHaEUsWUFBSSxRQUFRLFNBQVMsTUFBTSxZQUFZO0FBQ3ZDLFlBQUksTUFBTSxLQUFLO0FBQUcsa0JBQVEsWUFBQSxpQkFBaUIsTUFBTSxZQUFZO0FBQzdELGVBQU8sTUFBTSxPQUFPLFNBQVMsS0FBSztBQUdsQyxZQUFJLE1BQU0sWUFBWTtBQUNsQixjQUFJLE1BQU0sU0FBUyxNQUFNLFVBQVU7QUFDbkMsY0FBSSxNQUFNLEdBQUc7QUFBRyxrQkFBTSxZQUFBLGlCQUFpQixNQUFNLFVBQVU7QUFDdkQsaUJBQU8sTUFBTSxPQUFPLE9BQU8sR0FBRztlQUMzQjtBQUNILGlCQUFPLE1BQU0sTUFBTSxPQUFPLFlBQVksS0FBSSxDQUFFOztBQUloRCxZQUFJLE1BQU0sYUFBYTtBQUNuQixjQUFJLE9BQU8sU0FBUyxNQUFNLFdBQVc7QUFDckMsY0FBSSxNQUFNLElBQUk7QUFBRyxtQkFBTyxZQUFBLGVBQWUsTUFBTSxXQUFXO0FBQ3hELGlCQUFPLE1BQU0sT0FBTyxRQUFRLElBQUk7ZUFDN0I7QUFDSCxpQkFBTyxNQUFNLE1BQU0sUUFBUSxZQUFZLEtBQUksQ0FBRTs7QUFHakQsZUFBTztNQUNYOztBQXpESixZQUFBLFVBQUE7Ozs7Ozs7Ozs7OztBQ1RBLFFBQUEsVUFBQUMsaUJBQUEsbUJBQUE7QUFFQSxRQUFBLG1DQUFBO0FBQ0EsUUFBQSxjQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FDaEIsWUFDSSxPQUFPLEtBQUssWUFBQSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQzNCLGdNQUlKLEdBQUc7QUFHUCxRQUFNLGVBQWU7QUFDckIsUUFBTSxhQUFhO0FBRW5CLFFBQXFCLDZCQUFyQixjQUF3RCxpQ0FBQSx1Q0FBc0M7TUFDMUYsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxTQUFTLFFBQVEsb0JBQW9CLE1BQU0sT0FBTyxNQUFNLEVBQUU7QUFFaEUsWUFBSSxTQUFTLFNBQVMsTUFBTSxhQUFhO0FBQ3pDLFlBQUksTUFBTSxNQUFNLEdBQUc7QUFDZixtQkFBUyxZQUFBLGlCQUFpQixNQUFNLGFBQWE7O0FBR2pELFlBQUksTUFBTSxNQUFNLEdBQUc7QUFDZixnQkFBTSxTQUFTLE1BQU07QUFDckIsY0FBSSxXQUFXLFVBQUs7QUFDaEIscUJBQVM7cUJBQ0YsV0FBVyxVQUFLO0FBQ3ZCLHFCQUFTO2lCQUNOO0FBRUgsbUJBQU87OztBQUlmLFlBQUksT0FBTyxRQUFBLFFBQU0sUUFBUSxPQUFPO0FBQ2hDLGNBQU0sT0FBTyxNQUFNO0FBQ25CLGNBQU0sV0FBVyxLQUFLO0FBRXRCLFlBQUksU0FBUyxNQUFNLFVBQVUsR0FBRztBQUM1QixjQUFJLFlBQVksWUFBTyxZQUFZLFVBQUs7QUFDcEMsbUJBQU8sS0FBSyxJQUFJLFFBQVEsR0FBRztxQkFDcEIsWUFBWSxZQUFPLFlBQVksVUFBSztBQUMzQyxtQkFBTyxLQUFLLElBQUksU0FBUyxHQUFHLEdBQUc7cUJBQ3hCLFlBQVksVUFBSztBQUN4QixtQkFBTyxLQUFLLElBQUksUUFBUSxPQUFPO3FCQUN4QixZQUFZLFVBQUs7QUFDeEIsbUJBQU8sS0FBSyxJQUFJLFFBQVEsTUFBTTs7QUFHbEMsaUJBQU8sTUFBTSxPQUFPLFFBQVEsS0FBSyxLQUFJLENBQUU7QUFDdkMsaUJBQU8sTUFBTSxPQUFPLFNBQVMsS0FBSyxNQUFLLElBQUssQ0FBQztBQUM3QyxpQkFBTyxNQUFNLE9BQU8sT0FBTyxLQUFLLEtBQUksQ0FBRTtBQUN0QyxpQkFBTzs7QUFHWCxZQUFJLFlBQVksVUFBSztBQUNqQixpQkFBTyxLQUFLLElBQUksUUFBUSxRQUFRO21CQUN6QixZQUFZLFVBQUs7QUFDeEIsaUJBQU8sS0FBSyxJQUFJLFFBQVEsUUFBUTttQkFDekIsWUFBWSxZQUFPLFlBQVksVUFBSztBQUMzQyxpQkFBTyxLQUFLLElBQUksUUFBUSxNQUFNOztBQUdsQyxlQUFPLE1BQU0sTUFBTSxRQUFRLEtBQUssS0FBSSxDQUFFO0FBQ3RDLGVBQU8sTUFBTSxNQUFNLFNBQVMsS0FBSyxNQUFLLElBQUssQ0FBQztBQUM1QyxlQUFPLE1BQU0sTUFBTSxPQUFPLEtBQUssS0FBSSxDQUFFO0FBQ3JDLGVBQU8sTUFBTSxPQUFPLFFBQVEsS0FBSyxLQUFJLENBQUU7QUFDdkMsZUFBTyxNQUFNLE9BQU8sVUFBVSxLQUFLLE9BQU0sQ0FBRTtBQUMzQyxlQUFPLE1BQU0sT0FBTyxVQUFVLEtBQUssT0FBTSxDQUFFO0FBQzNDLGVBQU87TUFDWDs7QUE3REosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNsQkEsUUFBQSxVQUFBQyxpQkFBQSxtQkFBQTtBQUVBLFFBQUEsbUNBQUE7QUFFQSxRQUFBLGNBQUE7QUFFQSxRQUFNLFVBQVUsSUFBSSxPQUNoQiw0R0FBcUQsT0FBTyxLQUFLLFlBQUEsY0FBYyxFQUFFLEtBQUssR0FBRyxJQUFJLEdBQUc7QUFHcEcsUUFBcUIsOEJBQXJCLGNBQXlELGlDQUFBLHVDQUFzQztNQUMzRixlQUFZO0FBQ1IsZUFBTztNQUNYO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFNBQVMsUUFBUSxvQkFBb0IsTUFBTSxPQUFPLE1BQU0sRUFBRTtBQUVoRSxjQUFNLFlBQVksTUFBTSxPQUFPO0FBQy9CLGNBQU0sU0FBUyxZQUFBLGVBQWU7QUFDOUIsWUFBSSxXQUFXO0FBQVcsaUJBQU87QUFFakMsWUFBSSxXQUFXO0FBQ2YsY0FBTSxTQUFTLE1BQU0sT0FBTztBQUU1QixZQUFJLFVBQVUsVUFBSztBQUNmLHFCQUFXO21CQUNKLFVBQVUsVUFBSztBQUN0QixxQkFBVzttQkFDSixVQUFVLFlBQU8sVUFBVSxZQUFPLFVBQVUsVUFBSztBQUN4RCxxQkFBVzs7QUFHZixZQUFJLGNBQWMsUUFBQSxRQUFNLFFBQVEsT0FBTztBQUN2QyxZQUFJLG1CQUFtQjtBQUN2QixjQUFNLFlBQVksWUFBWSxJQUFHO0FBRWpDLFlBQUksWUFBWSxVQUFVLFlBQVksUUFBUTtBQUMxQyx3QkFBYyxZQUFZLElBQUksU0FBUyxDQUFDO0FBQ3hDLDZCQUFtQjttQkFDWixZQUFZLFFBQVE7QUFDM0Isd0JBQWMsWUFBWSxJQUFJLFNBQVMsQ0FBQztBQUN4Qyw2QkFBbUI7bUJBQ1osWUFBWSxRQUFRO0FBQzNCLHdCQUFjLFlBQVksSUFBSSxNQUFNO2VBQ2pDO0FBQ0gsY0FBSSxLQUFLLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxLQUFLLElBQUksU0FBUyxTQUFTLEdBQUc7QUFDakUsMEJBQWMsWUFBWSxJQUFJLFNBQVMsQ0FBQztxQkFDakMsS0FBSyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksS0FBSyxJQUFJLFNBQVMsU0FBUyxHQUFHO0FBQ3hFLDBCQUFjLFlBQVksSUFBSSxTQUFTLENBQUM7aUJBQ3JDO0FBQ0gsMEJBQWMsWUFBWSxJQUFJLE1BQU07OztBQUk1QyxlQUFPLE1BQU0sT0FBTyxXQUFXLE1BQU07QUFDckMsWUFBSSxrQkFBa0I7QUFDbEIsaUJBQU8sTUFBTSxPQUFPLE9BQU8sWUFBWSxLQUFJLENBQUU7QUFDN0MsaUJBQU8sTUFBTSxPQUFPLFNBQVMsWUFBWSxNQUFLLElBQUssQ0FBQztBQUNwRCxpQkFBTyxNQUFNLE9BQU8sUUFBUSxZQUFZLEtBQUksQ0FBRTtlQUMzQztBQUNILGlCQUFPLE1BQU0sTUFBTSxPQUFPLFlBQVksS0FBSSxDQUFFO0FBQzVDLGlCQUFPLE1BQU0sTUFBTSxTQUFTLFlBQVksTUFBSyxJQUFLLENBQUM7QUFDbkQsaUJBQU8sTUFBTSxNQUFNLFFBQVEsWUFBWSxLQUFJLENBQUU7O0FBR2pELGVBQU87TUFDWDs7QUF6REosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNWQSxRQUFBLFVBQUFDLGlCQUFBLG1CQUFBO0FBRUEsUUFBQSxtQ0FBQTtBQUNBLFFBQUEsY0FBQTtBQUVBLFFBQU0sb0JBQW9CLElBQUksT0FDMUIscW5CQVVJLE9BQU8sS0FBSyxZQUFBLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFDM0IsOEVBR0EsT0FBTyxLQUFLLFlBQUEsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUMzQixvREFHQSxPQUFPLEtBQUssWUFBQSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQzNCLHdEQUVKLEdBQUc7QUFHUCxRQUFNLHFCQUFxQixJQUFJLE9BQzNCLG9wQkFVSSxPQUFPLEtBQUssWUFBQSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQzNCLDhFQUdBLE9BQU8sS0FBSyxZQUFBLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFDM0Isb0RBR0EsT0FBTyxLQUFLLFlBQUEsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUMzQix3REFFSixHQUFHO0FBR1AsUUFBTSxjQUFjO0FBQ3BCLFFBQU0sd0JBQXdCO0FBQzlCLFFBQU0sd0JBQXdCO0FBQzlCLFFBQU0sY0FBYztBQUNwQixRQUFNLHdCQUF3QjtBQUM5QixRQUFNLGFBQWE7QUFDbkIsUUFBTSxlQUFlO0FBQ3JCLFFBQU0sZUFBZTtBQUNyQixRQUFNLG1CQUFtQjtBQUV6QixRQUFxQiw2QkFBckIsY0FBd0QsaUNBQUEsdUNBQXNDO01BQzFGLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBRXpELFlBQUksTUFBTSxRQUFRLEtBQUssUUFBUSxLQUFLLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxHQUFHO0FBQzlELGlCQUFPOztBQUdYLGNBQU0sWUFBWSxRQUFBLFFBQU0sUUFBUSxPQUFPO0FBQ3ZDLGNBQU0sU0FBUyxRQUFRLG9CQUFvQixNQUFNLE9BQU8sTUFBTSxFQUFFO0FBQ2hFLGNBQU0sY0FBYyxVQUFVLE1BQUs7QUFHbkMsWUFBSSxNQUFNLGNBQWM7QUFDcEIsY0FBSSxPQUFPLE1BQU07QUFDakIsY0FBSSxRQUFRLFlBQU8sUUFBUSxVQUFLO0FBRTVCLGdCQUFJLFVBQVUsS0FBSSxJQUFLLEdBQUc7QUFDdEIsMEJBQVksSUFBSSxHQUFHLEtBQUs7O3FCQUVyQixRQUFRLFlBQU8sUUFBUSxZQUFPLFFBQVEsVUFBSztBQUNsRCx3QkFBWSxJQUFJLElBQUksS0FBSztxQkFDbEIsUUFBUSxVQUFLO0FBQ3BCLHdCQUFZLElBQUksSUFBSSxLQUFLO3FCQUNsQixRQUFRLGdCQUFNO0FBQ3JCLHdCQUFZLElBQUksSUFBSSxLQUFLO3FCQUNsQixRQUFRLFVBQUs7QUFDcEIsd0JBQVksSUFBSSxHQUFHLEtBQUs7cUJBQ2pCLFFBQVEsZ0JBQU07QUFDckIsd0JBQVksSUFBSSxHQUFHLEtBQUs7O0FBRTVCLGlCQUFPLE1BQU0sT0FBTyxPQUFPLFlBQVksS0FBSSxDQUFFO0FBQzdDLGlCQUFPLE1BQU0sT0FBTyxTQUFTLFlBQVksTUFBSyxJQUFLLENBQUM7QUFDcEQsaUJBQU8sTUFBTSxPQUFPLFFBQVEsWUFBWSxLQUFJLENBQUU7bUJBQ3ZDLE1BQU0sY0FBYztBQUMzQixjQUFJLE9BQU8sTUFBTTtBQUNqQixjQUFJLFFBQVEsWUFBTyxRQUFRLFVBQUs7QUFDNUIsd0JBQVksSUFBSSxHQUFHLEtBQUs7cUJBQ2pCLFFBQVEsWUFBTyxRQUFRLFlBQU8sUUFBUSxVQUFLO0FBQ2xELHdCQUFZLElBQUksSUFBSSxLQUFLO3FCQUNsQixRQUFRLFVBQUs7QUFDcEIsd0JBQVksSUFBSSxJQUFJLEtBQUs7cUJBQ2xCLFFBQVEsZ0JBQU07QUFDckIsd0JBQVksSUFBSSxJQUFJLEtBQUs7cUJBQ2xCLFFBQVEsVUFBSztBQUNwQix3QkFBWSxJQUFJLEdBQUcsS0FBSztxQkFDakIsUUFBUSxnQkFBTTtBQUNyQix3QkFBWSxJQUFJLEdBQUcsS0FBSzs7QUFFNUIsaUJBQU8sTUFBTSxPQUFPLE9BQU8sWUFBWSxLQUFJLENBQUU7QUFDN0MsaUJBQU8sTUFBTSxPQUFPLFNBQVMsWUFBWSxNQUFLLElBQUssQ0FBQztBQUNwRCxpQkFBTyxNQUFNLE9BQU8sUUFBUSxZQUFZLEtBQUksQ0FBRTtlQUMzQztBQUNILGlCQUFPLE1BQU0sTUFBTSxPQUFPLFlBQVksS0FBSSxDQUFFO0FBQzVDLGlCQUFPLE1BQU0sTUFBTSxTQUFTLFlBQVksTUFBSyxJQUFLLENBQUM7QUFDbkQsaUJBQU8sTUFBTSxNQUFNLFFBQVEsWUFBWSxLQUFJLENBQUU7O0FBR2pELFlBQUksT0FBTztBQUNYLFlBQUksU0FBUztBQUNiLFlBQUksV0FBVztBQUdmLFlBQUksTUFBTSxlQUFlO0FBQ3JCLGNBQUksU0FBUyxTQUFTLE1BQU0sYUFBYTtBQUN6QyxjQUFJLE1BQU0sTUFBTSxHQUFHO0FBQ2YscUJBQVMsWUFBQSxpQkFBaUIsTUFBTSxhQUFhOztBQUVqRCxjQUFJLFVBQVU7QUFBSSxtQkFBTztBQUN6QixpQkFBTyxNQUFNLE9BQU8sVUFBVSxNQUFNOztBQUd4QyxlQUFPLFNBQVMsTUFBTSxXQUFXO0FBQ2pDLFlBQUksTUFBTSxJQUFJLEdBQUc7QUFDYixpQkFBTyxZQUFBLGlCQUFpQixNQUFNLFdBQVc7O0FBSTdDLFlBQUksTUFBTSxlQUFlO0FBQ3JCLGNBQUksTUFBTSxpQkFBaUIsVUFBSztBQUM1QixxQkFBUztxQkFDRixNQUFNLGlCQUFpQixZQUFPLE1BQU0saUJBQWlCLFVBQUs7QUFDakUscUJBQVM7aUJBQ047QUFDSCxxQkFBUyxTQUFTLE1BQU0sYUFBYTtBQUNyQyxnQkFBSSxNQUFNLE1BQU0sR0FBRztBQUNmLHVCQUFTLFlBQUEsaUJBQWlCLE1BQU0sYUFBYTs7O21CQUc5QyxPQUFPLEtBQUs7QUFDbkIsbUJBQVMsT0FBTztBQUNoQixpQkFBTyxLQUFLLE1BQU0sT0FBTyxHQUFHOztBQUdoQyxZQUFJLFVBQVUsSUFBSTtBQUNkLGlCQUFPOztBQUdYLFlBQUksT0FBTyxJQUFJO0FBQ1gsaUJBQU87O0FBRVgsWUFBSSxRQUFRLElBQUk7QUFDWixxQkFBVzs7QUFJZixZQUFJLE1BQU0sbUJBQW1CO0FBQ3pCLGNBQUksT0FBTztBQUFJLG1CQUFPO0FBQ3RCLGNBQUksT0FBTyxNQUFNLGtCQUFrQixHQUFHLFlBQVc7QUFDakQsY0FBSSxRQUFRLEtBQUs7QUFDYix1QkFBVztBQUNYLGdCQUFJLFFBQVE7QUFBSSxxQkFBTzs7QUFHM0IsY0FBSSxRQUFRLEtBQUs7QUFDYix1QkFBVztBQUNYLGdCQUFJLFFBQVE7QUFBSSxzQkFBUTs7bUJBRXJCLE1BQU0sd0JBQXdCO0FBQ3JDLGNBQUksZ0JBQWdCLE1BQU07QUFDMUIsY0FBSSxVQUFVLGNBQWM7QUFDNUIsY0FBSSxXQUFXLFlBQU8sV0FBVyxVQUFLO0FBQ2xDLHVCQUFXO0FBQ1gsZ0JBQUksUUFBUTtBQUFJLHFCQUFPO3FCQUNoQixXQUFXLFVBQUs7QUFDdkIsdUJBQVc7QUFDWCxnQkFBSSxRQUFRO0FBQUksc0JBQVE7O21CQUVyQixNQUFNLHdCQUF3QjtBQUNyQyxjQUFJLGdCQUFnQixNQUFNO0FBQzFCLGNBQUksVUFBVSxjQUFjO0FBQzVCLGNBQUksV0FBVyxZQUFPLFdBQVcsWUFBTyxXQUFXLFlBQU8sV0FBVyxVQUFLO0FBQ3RFLHVCQUFXO0FBQ1gsZ0JBQUksUUFBUTtBQUFJLHFCQUFPO3FCQUNoQixXQUFXLFlBQU8sV0FBVyxZQUFPLFdBQVcsVUFBSztBQUMzRCx1QkFBVztBQUNYLGdCQUFJLFFBQVE7QUFBSSxzQkFBUTs7bUJBRXJCLE1BQU0sd0JBQXdCO0FBQ3JDLGNBQUksZ0JBQWdCLE1BQU07QUFDMUIsY0FBSSxVQUFVLGNBQWM7QUFDNUIsY0FBSSxXQUFXLFlBQU8sV0FBVyxZQUFPLFdBQVcsWUFBTyxXQUFXLFVBQUs7QUFDdEUsdUJBQVc7QUFDWCxnQkFBSSxRQUFRO0FBQUkscUJBQU87cUJBQ2hCLFdBQVcsWUFBTyxXQUFXLFlBQU8sV0FBVyxVQUFLO0FBQzNELHVCQUFXO0FBQ1gsZ0JBQUksUUFBUTtBQUFJLHNCQUFROzs7QUFJaEMsZUFBTyxNQUFNLE9BQU8sUUFBUSxJQUFJO0FBQ2hDLGVBQU8sTUFBTSxPQUFPLFVBQVUsTUFBTTtBQUVwQyxZQUFJLFlBQVksR0FBRztBQUNmLGlCQUFPLE1BQU0sT0FBTyxZQUFZLFFBQVE7ZUFDckM7QUFDSCxjQUFJLE9BQU8sSUFBSTtBQUNYLG1CQUFPLE1BQU0sTUFBTSxZQUFZLENBQUM7aUJBQzdCO0FBQ0gsbUJBQU8sTUFBTSxNQUFNLFlBQVksQ0FBQzs7O0FBUXhDLGdCQUFRLG1CQUFtQixLQUFLLFFBQVEsS0FBSyxVQUFVLE9BQU8sUUFBUSxPQUFPLEtBQUssTUFBTSxDQUFDO0FBQ3pGLFlBQUksQ0FBQyxPQUFPO0FBRVIsY0FBSSxPQUFPLEtBQUssTUFBTSxPQUFPLEdBQUc7QUFDNUIsbUJBQU87O0FBRVgsaUJBQU87O0FBR1gsY0FBTSxZQUFZLFlBQVksTUFBSztBQUNuQyxlQUFPLE1BQU0sUUFBUSx3QkFBdUI7QUFHNUMsWUFBSSxNQUFNLGNBQWM7QUFDcEIsY0FBSSxPQUFPLE1BQU07QUFDakIsY0FBSSxRQUFRLFlBQU8sUUFBUSxVQUFLO0FBRTVCLGdCQUFJLFVBQVUsS0FBSSxJQUFLLEdBQUc7QUFDdEIsd0JBQVUsSUFBSSxHQUFHLEtBQUs7O3FCQUVuQixRQUFRLFlBQU8sUUFBUSxZQUFPLFFBQVEsVUFBSztBQUNsRCxzQkFBVSxJQUFJLElBQUksS0FBSztxQkFDaEIsUUFBUSxVQUFLO0FBQ3BCLHNCQUFVLElBQUksSUFBSSxLQUFLO3FCQUNoQixRQUFRLGdCQUFNO0FBQ3JCLHNCQUFVLElBQUksSUFBSSxLQUFLO3FCQUNoQixRQUFRLFVBQUs7QUFDcEIsc0JBQVUsSUFBSSxHQUFHLEtBQUs7cUJBQ2YsUUFBUSxnQkFBTTtBQUNyQixzQkFBVSxJQUFJLEdBQUcsS0FBSzs7QUFFMUIsaUJBQU8sSUFBSSxPQUFPLE9BQU8sVUFBVSxLQUFJLENBQUU7QUFDekMsaUJBQU8sSUFBSSxPQUFPLFNBQVMsVUFBVSxNQUFLLElBQUssQ0FBQztBQUNoRCxpQkFBTyxJQUFJLE9BQU8sUUFBUSxVQUFVLEtBQUksQ0FBRTttQkFDbkMsTUFBTSxjQUFjO0FBQzNCLGNBQUksT0FBTyxNQUFNO0FBQ2pCLGNBQUksUUFBUSxZQUFPLFFBQVEsVUFBSztBQUM1QixzQkFBVSxJQUFJLEdBQUcsS0FBSztxQkFDZixRQUFRLFlBQU8sUUFBUSxZQUFPLFFBQVEsVUFBSztBQUNsRCxzQkFBVSxJQUFJLElBQUksS0FBSztxQkFDaEIsUUFBUSxVQUFLO0FBQ3BCLHNCQUFVLElBQUksSUFBSSxLQUFLO3FCQUNoQixRQUFRLGdCQUFNO0FBQ3JCLHNCQUFVLElBQUksSUFBSSxLQUFLO3FCQUNoQixRQUFRLFVBQUs7QUFDcEIsc0JBQVUsSUFBSSxHQUFHLEtBQUs7cUJBQ2YsUUFBUSxnQkFBTTtBQUNyQixzQkFBVSxJQUFJLEdBQUcsS0FBSzs7QUFFMUIsaUJBQU8sSUFBSSxPQUFPLE9BQU8sVUFBVSxLQUFJLENBQUU7QUFDekMsaUJBQU8sSUFBSSxPQUFPLFNBQVMsVUFBVSxNQUFLLElBQUssQ0FBQztBQUNoRCxpQkFBTyxJQUFJLE9BQU8sUUFBUSxVQUFVLEtBQUksQ0FBRTtlQUN2QztBQUNILGlCQUFPLElBQUksTUFBTSxPQUFPLFVBQVUsS0FBSSxDQUFFO0FBQ3hDLGlCQUFPLElBQUksTUFBTSxTQUFTLFVBQVUsTUFBSyxJQUFLLENBQUM7QUFDL0MsaUJBQU8sSUFBSSxNQUFNLFFBQVEsVUFBVSxLQUFJLENBQUU7O0FBRzdDLGVBQU87QUFDUCxpQkFBUztBQUNULG1CQUFXO0FBR1gsWUFBSSxNQUFNLGVBQWU7QUFDckIsY0FBSSxTQUFTLFNBQVMsTUFBTSxhQUFhO0FBQ3pDLGNBQUksTUFBTSxNQUFNLEdBQUc7QUFDZixxQkFBUyxZQUFBLGlCQUFpQixNQUFNLGFBQWE7O0FBR2pELGNBQUksVUFBVTtBQUFJLG1CQUFPO0FBQ3pCLGlCQUFPLElBQUksT0FBTyxVQUFVLE1BQU07O0FBR3RDLGVBQU8sU0FBUyxNQUFNLFdBQVc7QUFDakMsWUFBSSxNQUFNLElBQUksR0FBRztBQUNiLGlCQUFPLFlBQUEsaUJBQWlCLE1BQU0sV0FBVzs7QUFJN0MsWUFBSSxNQUFNLGVBQWU7QUFDckIsY0FBSSxNQUFNLGlCQUFpQixVQUFLO0FBQzVCLHFCQUFTO3FCQUNGLE1BQU0saUJBQWlCLFlBQU8sTUFBTSxpQkFBaUIsVUFBSztBQUNqRSxxQkFBUztpQkFDTjtBQUNILHFCQUFTLFNBQVMsTUFBTSxhQUFhO0FBQ3JDLGdCQUFJLE1BQU0sTUFBTSxHQUFHO0FBQ2YsdUJBQVMsWUFBQSxpQkFBaUIsTUFBTSxhQUFhOzs7bUJBRzlDLE9BQU8sS0FBSztBQUNuQixtQkFBUyxPQUFPO0FBQ2hCLGlCQUFPLEtBQUssTUFBTSxPQUFPLEdBQUc7O0FBR2hDLFlBQUksVUFBVSxJQUFJO0FBQ2QsaUJBQU87O0FBR1gsWUFBSSxPQUFPLElBQUk7QUFDWCxpQkFBTzs7QUFFWCxZQUFJLFFBQVEsSUFBSTtBQUNaLHFCQUFXOztBQUlmLFlBQUksTUFBTSxtQkFBbUI7QUFDekIsY0FBSSxPQUFPO0FBQUksbUJBQU87QUFDdEIsY0FBSSxPQUFPLE1BQU0sa0JBQWtCLEdBQUcsWUFBVztBQUNqRCxjQUFJLFFBQVEsS0FBSztBQUNiLHVCQUFXO0FBQ1gsZ0JBQUksUUFBUTtBQUFJLHFCQUFPOztBQUczQixjQUFJLFFBQVEsS0FBSztBQUNiLHVCQUFXO0FBQ1gsZ0JBQUksUUFBUTtBQUFJLHNCQUFROztBQUc1QixjQUFJLENBQUMsT0FBTyxNQUFNLFVBQVUsVUFBVSxHQUFHO0FBQ3JDLGdCQUFJLFlBQVksR0FBRztBQUNmLHFCQUFPLE1BQU0sTUFBTSxZQUFZLENBQUM7QUFFaEMsa0JBQUksT0FBTyxNQUFNLElBQUksTUFBTSxLQUFLLElBQUk7QUFDaEMsdUJBQU8sTUFBTSxPQUFPLFFBQVEsQ0FBQzs7bUJBRTlCO0FBQ0gscUJBQU8sTUFBTSxNQUFNLFlBQVksQ0FBQztBQUVoQyxrQkFBSSxPQUFPLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSTtBQUNoQyx1QkFBTyxNQUFNLE9BQU8sUUFBUSxPQUFPLE1BQU0sSUFBSSxNQUFNLElBQUksRUFBRTs7OzttQkFJOUQsTUFBTSx3QkFBd0I7QUFDckMsY0FBSSxnQkFBZ0IsTUFBTTtBQUMxQixjQUFJLFVBQVUsY0FBYztBQUM1QixjQUFJLFdBQVcsWUFBTyxXQUFXLFVBQUs7QUFDbEMsdUJBQVc7QUFDWCxnQkFBSSxRQUFRO0FBQUkscUJBQU87cUJBQ2hCLFdBQVcsVUFBSztBQUN2Qix1QkFBVztBQUNYLGdCQUFJLFFBQVE7QUFBSSxzQkFBUTs7bUJBRXJCLE1BQU0sd0JBQXdCO0FBQ3JDLGNBQUksZ0JBQWdCLE1BQU07QUFDMUIsY0FBSSxVQUFVLGNBQWM7QUFDNUIsY0FBSSxXQUFXLFlBQU8sV0FBVyxZQUFPLFdBQVcsWUFBTyxXQUFXLFVBQUs7QUFDdEUsdUJBQVc7QUFDWCxnQkFBSSxRQUFRO0FBQUkscUJBQU87cUJBQ2hCLFdBQVcsWUFBTyxXQUFXLFlBQU8sV0FBVyxVQUFLO0FBQzNELHVCQUFXO0FBQ1gsZ0JBQUksUUFBUTtBQUFJLHNCQUFROzttQkFFckIsTUFBTSx3QkFBd0I7QUFDckMsY0FBSSxnQkFBZ0IsTUFBTTtBQUMxQixjQUFJLFVBQVUsY0FBYztBQUM1QixjQUFJLFdBQVcsWUFBTyxXQUFXLFlBQU8sV0FBVyxZQUFPLFdBQVcsVUFBSztBQUN0RSx1QkFBVztBQUNYLGdCQUFJLFFBQVE7QUFBSSxxQkFBTztxQkFDaEIsV0FBVyxZQUFPLFdBQVcsWUFBTyxXQUFXLFVBQUs7QUFDM0QsdUJBQVc7QUFDWCxnQkFBSSxRQUFRO0FBQUksc0JBQVE7OztBQUloQyxlQUFPLE9BQU8sT0FBTyxPQUFPLE1BQU07QUFDbEMsZUFBTyxJQUFJLE9BQU8sUUFBUSxJQUFJO0FBQzlCLGVBQU8sSUFBSSxPQUFPLFVBQVUsTUFBTTtBQUNsQyxZQUFJLFlBQVksR0FBRztBQUNmLGlCQUFPLElBQUksT0FBTyxZQUFZLFFBQVE7ZUFDbkM7QUFDSCxnQkFBTSxZQUFZLE9BQU8sTUFBTSxVQUFVLFVBQVUsS0FBSyxPQUFPLE1BQU0sSUFBSSxVQUFVLEtBQUs7QUFDeEYsY0FBSSxhQUFhLE9BQU8sTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNO0FBRTlDLG1CQUFPLElBQUksTUFBTSxZQUFZLENBQUM7cUJBQ3ZCLE9BQU8sSUFBSTtBQUNsQixtQkFBTyxJQUFJLE1BQU0sWUFBWSxDQUFDOzs7QUFJdEMsWUFBSSxPQUFPLElBQUksS0FBSSxFQUFHLFFBQU8sSUFBSyxPQUFPLE1BQU0sS0FBSSxFQUFHLFFBQU8sR0FBSTtBQUM3RCxpQkFBTyxJQUFJLE1BQU0sT0FBTyxPQUFPLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQzs7QUFHckQsZUFBTztNQUNYOztBQXJXSixZQUFBLFVBQUE7Ozs7Ozs7Ozs7OztBQ2pFQSxRQUFBLFVBQUFDLGlCQUFBLG1CQUFBO0FBRUEsUUFBQSxtQ0FBQTtBQUVBLFFBQUEsY0FBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQU8sb0RBQTJCLE9BQU8sS0FBSyxZQUFBLGNBQWMsRUFBRSxLQUFLLEdBQUcsSUFBSSxHQUFHO0FBRWpHLFFBQXFCLHNCQUFyQixjQUFpRCxpQ0FBQSx1Q0FBc0M7TUFDbkYsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxTQUFTLFFBQVEsb0JBQW9CLE1BQU0sT0FBTyxNQUFNLEVBQUU7QUFFaEUsY0FBTSxZQUFZLE1BQU0sT0FBTztBQUMvQixjQUFNLFNBQVMsWUFBQSxlQUFlO0FBQzlCLFlBQUksV0FBVztBQUFXLGlCQUFPO0FBRWpDLFlBQUksY0FBYyxRQUFBLFFBQU0sUUFBUSxPQUFPO0FBQ3ZDLGNBQU0sbUJBQW1CO0FBQ3pCLGNBQU0sWUFBWSxZQUFZLElBQUc7QUFFakMsWUFBSSxLQUFLLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxLQUFLLElBQUksU0FBUyxTQUFTLEdBQUc7QUFDakUsd0JBQWMsWUFBWSxJQUFJLFNBQVMsQ0FBQzttQkFDakMsS0FBSyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksS0FBSyxJQUFJLFNBQVMsU0FBUyxHQUFHO0FBQ3hFLHdCQUFjLFlBQVksSUFBSSxTQUFTLENBQUM7ZUFDckM7QUFDSCx3QkFBYyxZQUFZLElBQUksTUFBTTs7QUFHeEMsZUFBTyxNQUFNLE9BQU8sV0FBVyxNQUFNO0FBQ3JDLFlBQUksa0JBQWtCO0FBQ2xCLGlCQUFPLE1BQU0sT0FBTyxPQUFPLFlBQVksS0FBSSxDQUFFO0FBQzdDLGlCQUFPLE1BQU0sT0FBTyxTQUFTLFlBQVksTUFBSyxJQUFLLENBQUM7QUFDcEQsaUJBQU8sTUFBTSxPQUFPLFFBQVEsWUFBWSxLQUFJLENBQUU7ZUFDM0M7QUFDSCxpQkFBTyxNQUFNLE1BQU0sT0FBTyxZQUFZLEtBQUksQ0FBRTtBQUM1QyxpQkFBTyxNQUFNLE1BQU0sU0FBUyxZQUFZLE1BQUssSUFBSyxDQUFDO0FBQ25ELGlCQUFPLE1BQU0sTUFBTSxRQUFRLFlBQVksS0FBSSxDQUFFOztBQUdqRCxlQUFPO01BQ1g7O0FBcENKLFlBQUEsVUFBQTs7Ozs7Ozs7Ozs7O0FDUkEsUUFBQSxrQ0FBQUMsaUJBQUEsdUNBQUE7QUFFQSxRQUFxQiw4QkFBckIsY0FBeUQsZ0NBQUEsUUFBNkI7TUFDbEYsaUJBQWM7QUFDVixlQUFPO01BQ1g7O0FBSEosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNGQSxRQUFBLGlDQUFBQyxpQkFBQSxzQ0FBQTtBQUVBLFFBQXFCLDZCQUFyQixjQUF3RCwrQkFBQSxRQUE0QjtNQUNoRixpQkFBYztBQUNWLGVBQU87TUFDWDs7QUFISixZQUFBLFVBQUE7Ozs7Ozs7Ozs7Ozs7QUNHQSxRQUFBLFdBQUE7QUFDQSxRQUFBLGlDQUFBQyxpQkFBQSxzQ0FBQTtBQUNBLFFBQUEsbUJBQUE7QUFFQSxRQUFBLDJCQUFBQSxpQkFBQSxnQ0FBQTtBQUNBLFFBQUEscUJBQUFBLGlCQUFBLDBCQUFBO0FBQ0EsUUFBQSwrQkFBQUEsaUJBQUEsb0NBQUE7QUFDQSxRQUFBLGdDQUFBQSxpQkFBQSxxQ0FBQTtBQUNBLFFBQUEsK0JBQUFBLGlCQUFBLG9DQUFBO0FBQ0EsUUFBQSx3QkFBQUEsaUJBQUEsNkJBQUE7QUFDQSxRQUFBLGdDQUFBQSxpQkFBQSxxQ0FBQTtBQUNBLFFBQUEsK0JBQUFBLGlCQUFBLG9DQUFBO0FBR2EsWUFBQSxPQUFPLElBQUksU0FBQSxPQUFPLDBCQUF5QixDQUFFO0FBRTdDLFlBQUEsU0FBUyxJQUFJLFNBQUEsT0FBTywwQkFBeUIsQ0FBRTtBQUMvQyxZQUFBLFNBQVMsSUFBSSxTQUFBLE9BQU8sb0JBQW1CLENBQUU7QUFFdEQsYUFBZ0IsTUFBTUMsT0FBYyxLQUFZLFFBQXNCO0FBQ2xFLGFBQU8sUUFBQSxPQUFPLE1BQU1BLE9BQU0sS0FBSyxNQUFNO0lBQ3pDO0FBRkEsWUFBQSxRQUFBO0FBSUEsYUFBZ0JDLFdBQVVELE9BQWMsS0FBWSxRQUFzQjtBQUN0RSxhQUFPLFFBQUEsT0FBTyxVQUFVQSxPQUFNLEtBQUssTUFBTTtJQUM3QztBQUZBLFlBQUEsWUFBQUM7QUFPQSxhQUFnQiw0QkFBeUI7QUFDckMsWUFBTSxTQUFTLG9CQUFtQjtBQUNsQyxhQUFPLFFBQVEsUUFBUSxJQUFJLHlCQUFBLFFBQXNCLENBQUU7QUFDbkQsYUFBTztJQUNYO0FBSkEsWUFBQSw0QkFBQTtBQVNBLGFBQWdCLHNCQUFtQjtBQUMvQixZQUFNLGdCQUFnQixpQkFBQSwyQkFBMkI7UUFDN0MsU0FBUztVQUNMLElBQUksbUJBQUEsUUFBZ0I7VUFDcEIsSUFBSSw4QkFBQSxRQUEyQjtVQUMvQixJQUFJLHNCQUFBLFFBQW1CO1VBQ3ZCLElBQUksNkJBQUEsUUFBMEI7VUFDOUIsSUFBSSw2QkFBQSxRQUEwQjs7UUFFbEMsVUFBVSxDQUFDLElBQUksOEJBQUEsUUFBMkIsR0FBSSxJQUFJLDZCQUFBLFFBQTBCLENBQUU7T0FDakY7QUFHRCxvQkFBYyxXQUFXLGNBQWMsU0FBUyxPQUM1QyxDQUFDLFlBQVksRUFBRSxtQkFBbUIsK0JBQUEsUUFBNkI7QUFHbkUsYUFBTztJQUNYO0FBbEJBLFlBQUEsc0JBQUE7Ozs7Ozs7Ozs7OztBQzVDQSxRQUFBLFVBQUFDLGlCQUFBLG1CQUFBO0FBRUEsUUFBQSxtQ0FBQTtBQUdBLFFBQU0sWUFBWTtBQUNsQixRQUFNLGNBQWM7QUFDcEIsUUFBTSxlQUFlO0FBQ3JCLFFBQU0sZUFBZTtBQUNyQixRQUFNLGNBQWM7QUFDcEIsUUFBTSxlQUFlO0FBRXJCLFFBQXFCLHlCQUFyQixjQUFvRCxpQ0FBQSx1Q0FBc0M7TUFDdEYsYUFBYSxTQUF1QjtBQUNoQyxlQUFPLElBQUksT0FDUCxnZUFNQSxHQUFHO01BRVg7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sUUFBUSxNQUFNO0FBQ3BCLGNBQU0sU0FBUyxRQUFRLG9CQUFvQixPQUFPLE1BQU0sRUFBRTtBQUUxRCxjQUFNLFlBQVksUUFBQSxRQUFNLFFBQVEsT0FBTztBQUN2QyxZQUFJLGNBQWM7QUFFbEIsWUFBSSxNQUFNLFlBQVk7QUFDbEIsaUJBQU8sTUFBTSxNQUFNLFFBQVEsVUFBVSxLQUFJLENBQUU7QUFDM0MsaUJBQU8sTUFBTSxNQUFNLFVBQVUsVUFBVSxPQUFNLENBQUU7QUFDL0MsaUJBQU8sTUFBTSxNQUFNLFVBQVUsVUFBVSxPQUFNLENBQUU7QUFDL0MsaUJBQU8sTUFBTSxNQUFNLGVBQWUsVUFBVSxZQUFXLENBQUU7bUJBQ2xELE1BQU0sY0FBYztBQUMzQixnQkFBTSxPQUFPLE1BQU07QUFDbkIsZ0JBQU0sUUFBUSxNQUFNO0FBRXBCLGNBQUksUUFBUSxVQUFLO0FBRWIsZ0JBQUksVUFBVSxLQUFJLElBQUssR0FBRztBQUN0Qiw0QkFBYyxZQUFZLElBQUksR0FBRyxLQUFLOztxQkFFbkMsUUFBUSxVQUFLO0FBQ3BCLDBCQUFjLFlBQVksSUFBSSxJQUFJLEtBQUs7cUJBQ2hDLFFBQVEsVUFBSztBQUNwQiwwQkFBYyxZQUFZLElBQUksSUFBSSxLQUFLO3FCQUNoQyxRQUFRLGdCQUFNO0FBQ3JCLDBCQUFjLFlBQVksSUFBSSxJQUFJLEtBQUs7cUJBQ2hDLFFBQVEsVUFBSztBQUNwQiwwQkFBYyxZQUFZLElBQUksR0FBRyxLQUFLO3FCQUMvQixRQUFRLGdCQUFNO0FBQ3JCLDBCQUFjLFlBQVksSUFBSSxHQUFHLEtBQUs7O0FBRzFDLGNBQUksU0FBUyxVQUFLO0FBQ2QsbUJBQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztxQkFDckIsU0FBUyxVQUFLO0FBQ3JCLG1CQUFPLE1BQU0sTUFBTSxRQUFRLEVBQUU7QUFDN0IsbUJBQU8sTUFBTSxNQUFNLFlBQVksQ0FBQzs7bUJBRTdCLE1BQU0sZUFBZTtBQUM1QixnQkFBTSxjQUFjLE1BQU07QUFDMUIsZ0JBQU0sUUFBUSxZQUFZO0FBQzFCLGNBQUksU0FBUyxZQUFPLFNBQVMsVUFBSztBQUM5QixtQkFBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO3FCQUNyQixTQUFTLFVBQUs7QUFDckIsbUJBQU8sTUFBTSxNQUFNLFFBQVEsRUFBRTtBQUM3QixtQkFBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO3FCQUN6QixTQUFTLFVBQUs7QUFDckIsbUJBQU8sTUFBTSxNQUFNLFFBQVEsRUFBRTtBQUM3QixtQkFBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO3FCQUN6QixTQUFTLFlBQU8sU0FBUyxVQUFLO0FBQ3JDLG1CQUFPLE1BQU0sTUFBTSxRQUFRLEVBQUU7QUFDN0IsbUJBQU8sTUFBTSxNQUFNLFlBQVksQ0FBQztxQkFDekIsU0FBUyxVQUFLO0FBQ3JCLG1CQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7O21CQUV6QixNQUFNLGNBQWM7QUFDM0IsZ0JBQU0sT0FBTyxNQUFNO0FBRW5CLGNBQUksUUFBUSxVQUFLO0FBRWIsZ0JBQUksVUFBVSxLQUFJLElBQUssR0FBRztBQUN0Qiw0QkFBYyxZQUFZLElBQUksR0FBRyxLQUFLOztxQkFFbkMsUUFBUSxVQUFLO0FBQ3BCLDBCQUFjLFlBQVksSUFBSSxJQUFJLEtBQUs7cUJBQ2hDLFFBQVEsVUFBSztBQUNwQiwwQkFBYyxZQUFZLElBQUksSUFBSSxLQUFLO3FCQUNoQyxRQUFRLGdCQUFNO0FBQ3JCLDBCQUFjLFlBQVksSUFBSSxJQUFJLEtBQUs7cUJBQ2hDLFFBQVEsVUFBSztBQUNwQiwwQkFBYyxZQUFZLElBQUksR0FBRyxLQUFLO3FCQUMvQixRQUFRLGdCQUFNO0FBQ3JCLDBCQUFjLFlBQVksSUFBSSxHQUFHLEtBQUs7O0FBRzFDLGdCQUFNLGNBQWMsTUFBTTtBQUMxQixjQUFJLGFBQWE7QUFDYixrQkFBTSxRQUFRLFlBQVk7QUFDMUIsZ0JBQUksU0FBUyxZQUFPLFNBQVMsVUFBSztBQUM5QixxQkFBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO3VCQUNyQixTQUFTLFVBQUs7QUFDckIscUJBQU8sTUFBTSxNQUFNLFFBQVEsRUFBRTtBQUM3QixxQkFBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO3VCQUN6QixTQUFTLFVBQUs7QUFDckIscUJBQU8sTUFBTSxNQUFNLFFBQVEsRUFBRTtBQUM3QixxQkFBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO3VCQUN6QixTQUFTLFlBQU8sU0FBUyxVQUFLO0FBQ3JDLHFCQUFPLE1BQU0sTUFBTSxRQUFRLEVBQUU7QUFDN0IscUJBQU8sTUFBTSxNQUFNLFlBQVksQ0FBQzt1QkFDekIsU0FBUyxVQUFLO0FBQ3JCLHFCQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7QUFLeEMsZUFBTyxNQUFNLE9BQU8sT0FBTyxZQUFZLEtBQUksQ0FBRTtBQUM3QyxlQUFPLE1BQU0sT0FBTyxTQUFTLFlBQVksTUFBSyxJQUFLLENBQUM7QUFDcEQsZUFBTyxNQUFNLE9BQU8sUUFBUSxZQUFZLEtBQUksQ0FBRTtBQUU5QyxlQUFPO01BQ1g7O0FBbEhKLFlBQUEsVUFBQTs7Ozs7Ozs7OztBQ1phLFlBQUEsU0FBUztNQUNsQixVQUFLO01BQ0wsVUFBSztNQUNMLFVBQUs7TUFDTCxVQUFLO01BQ0wsVUFBSztNQUNMLFVBQUs7TUFDTCxVQUFLO01BQ0wsVUFBSztNQUNMLFVBQUs7TUFDTCxVQUFLO01BQ0wsVUFBSztNQUNMLFVBQUs7TUFDTCxVQUFLOztBQUdJLFlBQUEsaUJBQWlCO01BQzFCLFVBQUs7TUFDTCxVQUFLO01BQ0wsVUFBSztNQUNMLFVBQUs7TUFDTCxVQUFLO01BQ0wsVUFBSztNQUNMLFVBQUs7TUFDTCxVQUFLOztBQUdULGFBQWdCLGlCQUFpQkMsT0FBWTtBQUN6QyxVQUFJLFNBQVM7QUFFYixlQUFTLElBQUksR0FBRyxJQUFJQSxNQUFLLFFBQVEsS0FBSztBQUNsQyxjQUFNLE9BQU9BLE1BQUs7QUFDbEIsWUFBSSxTQUFTLFVBQUs7QUFDZCxtQkFBUyxXQUFXLElBQUksUUFBQSxPQUFPLFFBQVEsU0FBUyxRQUFBLE9BQU87ZUFDcEQ7QUFDSCxvQkFBVSxRQUFBLE9BQU87OztBQUl6QixhQUFPO0lBQ1g7QUFiQSxZQUFBLG1CQUFBO0FBZUEsYUFBZ0IsZUFBZUEsT0FBWTtBQUN2QyxVQUFJLFNBQVM7QUFFYixlQUFTLElBQUksR0FBRyxJQUFJQSxNQUFLLFFBQVEsS0FBSztBQUNsQyxjQUFNLE9BQU9BLE1BQUs7QUFDbEIsaUJBQVMsU0FBUyxRQUFBLE9BQU87O0FBRzdCLGFBQU8sU0FBUyxNQUFNO0lBQzFCO0FBVEEsWUFBQSxpQkFBQTs7Ozs7Ozs7Ozs7O0FDMUNBLFFBQUEsVUFBQUMsaUJBQUEsbUJBQUE7QUFFQSxRQUFBLG1DQUFBO0FBQ0EsUUFBQSxjQUFBO0FBRUEsUUFBTSxhQUFhO0FBQ25CLFFBQU0sY0FBYztBQUNwQixRQUFNLFlBQVk7QUFFbEIsUUFBcUIsbUJBQXJCLGNBQThDLGlDQUFBLHVDQUFzQztNQUNoRixlQUFZO0FBRVIsZUFBTyxJQUFJLE9BQ1AsZ0JBR0ksT0FBTyxLQUFLLFlBQUEsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUMzQixXQUVBLE9BQU8sS0FBSyxZQUFBLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFDM0IsNERBUUEsT0FBTyxLQUFLLFlBQUEsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUMzQixpREFRQSxPQUFPLEtBQUssWUFBQSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQzNCLG9DQUdVO01BRXRCO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLGNBQWMsUUFBQSxRQUFNLFFBQVEsT0FBTztBQUN6QyxjQUFNLFNBQVMsUUFBUSxvQkFBb0IsTUFBTSxPQUFPLE1BQU0sRUFBRTtBQUdoRSxZQUFJLFFBQVEsU0FBUyxNQUFNLFlBQVk7QUFDdkMsWUFBSSxNQUFNLEtBQUs7QUFBRyxrQkFBUSxZQUFBLGlCQUFpQixNQUFNLFlBQVk7QUFDN0QsZUFBTyxNQUFNLE9BQU8sU0FBUyxLQUFLO0FBR2xDLFlBQUksTUFBTSxZQUFZO0FBQ2xCLGNBQUksTUFBTSxTQUFTLE1BQU0sVUFBVTtBQUNuQyxjQUFJLE1BQU0sR0FBRztBQUFHLGtCQUFNLFlBQUEsaUJBQWlCLE1BQU0sVUFBVTtBQUN2RCxpQkFBTyxNQUFNLE9BQU8sT0FBTyxHQUFHO2VBQzNCO0FBQ0gsaUJBQU8sTUFBTSxNQUFNLE9BQU8sWUFBWSxLQUFJLENBQUU7O0FBSWhELFlBQUksTUFBTSxhQUFhO0FBQ25CLGNBQUksT0FBTyxTQUFTLE1BQU0sV0FBVztBQUNyQyxjQUFJLE1BQU0sSUFBSTtBQUFHLG1CQUFPLFlBQUEsZUFBZSxNQUFNLFdBQVc7QUFDeEQsaUJBQU8sTUFBTSxPQUFPLFFBQVEsSUFBSTtlQUM3QjtBQUNILGlCQUFPLE1BQU0sTUFBTSxRQUFRLFlBQVksS0FBSSxDQUFFOztBQUdqRCxlQUFPO01BQ1g7O0FBaEVKLFlBQUEsVUFBQTs7Ozs7Ozs7Ozs7O0FDVEEsUUFBQSxVQUFBQyxpQkFBQSxtQkFBQTtBQUVBLFFBQUEsbUNBQUE7QUFDQSxRQUFBLGNBQUE7QUFFQSxRQUFNLFVBQVUsSUFBSSxPQUNoQixZQUNJLE9BQU8sS0FBSyxZQUFBLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFDM0IsZ01BSUosR0FBRztBQUdQLFFBQU0sZUFBZTtBQUNyQixRQUFNLGFBQWE7QUFFbkIsUUFBcUIsNkJBQXJCLGNBQXdELGlDQUFBLHVDQUFzQztNQUMxRixlQUFZO0FBQ1IsZUFBTztNQUNYO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFNBQVMsUUFBUSxvQkFBb0IsTUFBTSxPQUFPLE1BQU0sRUFBRTtBQUVoRSxZQUFJLFNBQVMsU0FBUyxNQUFNLGFBQWE7QUFDekMsWUFBSSxNQUFNLE1BQU0sR0FBRztBQUNmLG1CQUFTLFlBQUEsaUJBQWlCLE1BQU0sYUFBYTs7QUFHakQsWUFBSSxNQUFNLE1BQU0sR0FBRztBQUNmLGdCQUFNLFNBQVMsTUFBTTtBQUNyQixjQUFJLFdBQVcsVUFBSztBQUNoQixxQkFBUztxQkFDRixXQUFXLFVBQUs7QUFDdkIscUJBQVM7aUJBQ047QUFFSCxtQkFBTzs7O0FBSWYsWUFBSSxPQUFPLFFBQUEsUUFBTSxRQUFRLE9BQU87QUFDaEMsY0FBTSxPQUFPLE1BQU07QUFDbkIsY0FBTSxXQUFXLEtBQUs7QUFFdEIsWUFBSSxTQUFTLE1BQU0sVUFBVSxHQUFHO0FBQzVCLGNBQUksWUFBWSxZQUFPLFlBQVksVUFBSztBQUNwQyxtQkFBTyxLQUFLLElBQUksUUFBUSxHQUFHO3FCQUNwQixZQUFZLFlBQU8sWUFBWSxVQUFLO0FBQzNDLG1CQUFPLEtBQUssSUFBSSxTQUFTLEdBQUcsR0FBRztxQkFDeEIsWUFBWSxVQUFLO0FBQ3hCLG1CQUFPLEtBQUssSUFBSSxRQUFRLE9BQU87cUJBQ3hCLFlBQVksVUFBSztBQUN4QixtQkFBTyxLQUFLLElBQUksUUFBUSxNQUFNOztBQUdsQyxpQkFBTyxNQUFNLE9BQU8sUUFBUSxLQUFLLEtBQUksQ0FBRTtBQUN2QyxpQkFBTyxNQUFNLE9BQU8sU0FBUyxLQUFLLE1BQUssSUFBSyxDQUFDO0FBQzdDLGlCQUFPLE1BQU0sT0FBTyxPQUFPLEtBQUssS0FBSSxDQUFFO0FBQ3RDLGlCQUFPOztBQUdYLFlBQUksWUFBWSxVQUFLO0FBQ2pCLGlCQUFPLEtBQUssSUFBSSxRQUFRLFFBQVE7bUJBQ3pCLFlBQVksVUFBSztBQUN4QixpQkFBTyxLQUFLLElBQUksUUFBUSxRQUFRO21CQUN6QixZQUFZLFlBQU8sWUFBWSxVQUFLO0FBQzNDLGlCQUFPLEtBQUssSUFBSSxRQUFRLE1BQU07O0FBR2xDLGVBQU8sTUFBTSxNQUFNLFFBQVEsS0FBSyxLQUFJLENBQUU7QUFDdEMsZUFBTyxNQUFNLE1BQU0sU0FBUyxLQUFLLE1BQUssSUFBSyxDQUFDO0FBQzVDLGVBQU8sTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFJLENBQUU7QUFDckMsZUFBTyxNQUFNLE9BQU8sUUFBUSxLQUFLLEtBQUksQ0FBRTtBQUN2QyxlQUFPLE1BQU0sT0FBTyxVQUFVLEtBQUssT0FBTSxDQUFFO0FBQzNDLGVBQU8sTUFBTSxPQUFPLFVBQVUsS0FBSyxPQUFNLENBQUU7QUFDM0MsZUFBTztNQUNYOztBQTdESixZQUFBLFVBQUE7Ozs7Ozs7Ozs7OztBQ2xCQSxRQUFBLFVBQUFDLGlCQUFBLG1CQUFBO0FBRUEsUUFBQSxtQ0FBQTtBQUVBLFFBQUEsY0FBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLDhGQUFpRCxPQUFPLEtBQUssWUFBQSxjQUFjLEVBQUUsS0FBSyxHQUFHLElBQUksR0FBRztBQUdoRyxRQUFxQiw4QkFBckIsY0FBeUQsaUNBQUEsdUNBQXNDO01BQzNGLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sU0FBUyxRQUFRLG9CQUFvQixNQUFNLE9BQU8sTUFBTSxFQUFFO0FBRWhFLGNBQU0sWUFBWSxNQUFNLE9BQU87QUFDL0IsY0FBTSxTQUFTLFlBQUEsZUFBZTtBQUM5QixZQUFJLFdBQVc7QUFBVyxpQkFBTztBQUVqQyxZQUFJLFdBQVc7QUFDZixjQUFNLFNBQVMsTUFBTSxPQUFPO0FBRTVCLFlBQUksVUFBVSxVQUFLO0FBQ2YscUJBQVc7bUJBQ0osVUFBVSxVQUFLO0FBQ3RCLHFCQUFXO21CQUNKLFVBQVUsVUFBSztBQUN0QixxQkFBVzs7QUFHZixZQUFJLGNBQWMsUUFBQSxRQUFNLFFBQVEsT0FBTztBQUN2QyxZQUFJLG1CQUFtQjtBQUN2QixjQUFNLFlBQVksWUFBWSxJQUFHO0FBRWpDLFlBQUksWUFBWSxVQUFVLFlBQVksUUFBUTtBQUMxQyx3QkFBYyxZQUFZLElBQUksU0FBUyxDQUFDO0FBQ3hDLDZCQUFtQjttQkFDWixZQUFZLFFBQVE7QUFDM0Isd0JBQWMsWUFBWSxJQUFJLFNBQVMsQ0FBQztBQUN4Qyw2QkFBbUI7bUJBQ1osWUFBWSxRQUFRO0FBQzNCLHdCQUFjLFlBQVksSUFBSSxNQUFNO2VBQ2pDO0FBQ0gsY0FBSSxLQUFLLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxLQUFLLElBQUksU0FBUyxTQUFTLEdBQUc7QUFDakUsMEJBQWMsWUFBWSxJQUFJLFNBQVMsQ0FBQztxQkFDakMsS0FBSyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksS0FBSyxJQUFJLFNBQVMsU0FBUyxHQUFHO0FBQ3hFLDBCQUFjLFlBQVksSUFBSSxTQUFTLENBQUM7aUJBQ3JDO0FBQ0gsMEJBQWMsWUFBWSxJQUFJLE1BQU07OztBQUk1QyxlQUFPLE1BQU0sT0FBTyxXQUFXLE1BQU07QUFDckMsWUFBSSxrQkFBa0I7QUFDbEIsaUJBQU8sTUFBTSxPQUFPLE9BQU8sWUFBWSxLQUFJLENBQUU7QUFDN0MsaUJBQU8sTUFBTSxPQUFPLFNBQVMsWUFBWSxNQUFLLElBQUssQ0FBQztBQUNwRCxpQkFBTyxNQUFNLE9BQU8sUUFBUSxZQUFZLEtBQUksQ0FBRTtlQUMzQztBQUNILGlCQUFPLE1BQU0sTUFBTSxPQUFPLFlBQVksS0FBSSxDQUFFO0FBQzVDLGlCQUFPLE1BQU0sTUFBTSxTQUFTLFlBQVksTUFBSyxJQUFLLENBQUM7QUFDbkQsaUJBQU8sTUFBTSxNQUFNLFFBQVEsWUFBWSxLQUFJLENBQUU7O0FBR2pELGVBQU87TUFDWDs7QUF6REosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNWQSxRQUFBLFVBQUFDLGlCQUFBLG1CQUFBO0FBRUEsUUFBQSxtQ0FBQTtBQUNBLFFBQUEsY0FBQTtBQUVBLFFBQU0sb0JBQW9CLElBQUksT0FDMUIsb2VBVUksT0FBTyxLQUFLLFlBQUEsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUMzQiw4RUFHQSxPQUFPLEtBQUssWUFBQSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQzNCLG9EQUdBLE9BQU8sS0FBSyxZQUFBLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFDM0Isd0RBRUosR0FBRztBQUdQLFFBQU0scUJBQXFCLElBQUksT0FDM0IsMGdCQVVJLE9BQU8sS0FBSyxZQUFBLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFDM0IsOEVBR0EsT0FBTyxLQUFLLFlBQUEsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUMzQixvREFHQSxPQUFPLEtBQUssWUFBQSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQzNCLHdEQUVKLEdBQUc7QUFHUCxRQUFNLGNBQWM7QUFDcEIsUUFBTSx3QkFBd0I7QUFDOUIsUUFBTSx3QkFBd0I7QUFDOUIsUUFBTSxjQUFjO0FBQ3BCLFFBQU0sd0JBQXdCO0FBQzlCLFFBQU0sYUFBYTtBQUNuQixRQUFNLGVBQWU7QUFDckIsUUFBTSxlQUFlO0FBQ3JCLFFBQU0sbUJBQW1CO0FBRXpCLFFBQXFCLDZCQUFyQixjQUF3RCxpQ0FBQSx1Q0FBc0M7TUFDMUYsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFFekQsWUFBSSxNQUFNLFFBQVEsS0FBSyxRQUFRLEtBQUssTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLEdBQUc7QUFDOUQsaUJBQU87O0FBR1gsY0FBTSxZQUFZLFFBQUEsUUFBTSxRQUFRLE9BQU87QUFDdkMsY0FBTSxTQUFTLFFBQVEsb0JBQW9CLE1BQU0sT0FBTyxNQUFNLEVBQUU7QUFDaEUsY0FBTSxjQUFjLFVBQVUsTUFBSztBQUduQyxZQUFJLE1BQU0sY0FBYztBQUNwQixnQkFBTSxPQUFPLE1BQU07QUFDbkIsY0FBSSxRQUFRLFVBQUs7QUFFYixnQkFBSSxVQUFVLEtBQUksSUFBSyxHQUFHO0FBQ3RCLDBCQUFZLElBQUksR0FBRyxLQUFLOztxQkFFckIsUUFBUSxVQUFLO0FBQ3BCLHdCQUFZLElBQUksSUFBSSxLQUFLO3FCQUNsQixRQUFRLFVBQUs7QUFDcEIsd0JBQVksSUFBSSxJQUFJLEtBQUs7cUJBQ2xCLFFBQVEsZ0JBQU07QUFDckIsd0JBQVksSUFBSSxJQUFJLEtBQUs7cUJBQ2xCLFFBQVEsVUFBSztBQUNwQix3QkFBWSxJQUFJLEdBQUcsS0FBSztxQkFDakIsUUFBUSxnQkFBTTtBQUNyQix3QkFBWSxJQUFJLEdBQUcsS0FBSzs7QUFFNUIsaUJBQU8sTUFBTSxPQUFPLE9BQU8sWUFBWSxLQUFJLENBQUU7QUFDN0MsaUJBQU8sTUFBTSxPQUFPLFNBQVMsWUFBWSxNQUFLLElBQUssQ0FBQztBQUNwRCxpQkFBTyxNQUFNLE9BQU8sUUFBUSxZQUFZLEtBQUksQ0FBRTttQkFDdkMsTUFBTSxjQUFjO0FBQzNCLGdCQUFNLE9BQU8sTUFBTTtBQUNuQixjQUFJLFFBQVEsVUFBSztBQUNiLHdCQUFZLElBQUksR0FBRyxLQUFLO3FCQUNqQixRQUFRLFVBQUs7QUFDcEIsd0JBQVksSUFBSSxJQUFJLEtBQUs7cUJBQ2xCLFFBQVEsVUFBSztBQUNwQix3QkFBWSxJQUFJLElBQUksS0FBSztxQkFDbEIsUUFBUSxnQkFBTTtBQUNyQix3QkFBWSxJQUFJLElBQUksS0FBSztxQkFDbEIsUUFBUSxVQUFLO0FBQ3BCLHdCQUFZLElBQUksR0FBRyxLQUFLO3FCQUNqQixRQUFRLGdCQUFNO0FBQ3JCLHdCQUFZLElBQUksR0FBRyxLQUFLOztBQUU1QixpQkFBTyxNQUFNLE9BQU8sT0FBTyxZQUFZLEtBQUksQ0FBRTtBQUM3QyxpQkFBTyxNQUFNLE9BQU8sU0FBUyxZQUFZLE1BQUssSUFBSyxDQUFDO0FBQ3BELGlCQUFPLE1BQU0sT0FBTyxRQUFRLFlBQVksS0FBSSxDQUFFO2VBQzNDO0FBQ0gsaUJBQU8sTUFBTSxNQUFNLE9BQU8sWUFBWSxLQUFJLENBQUU7QUFDNUMsaUJBQU8sTUFBTSxNQUFNLFNBQVMsWUFBWSxNQUFLLElBQUssQ0FBQztBQUNuRCxpQkFBTyxNQUFNLE1BQU0sUUFBUSxZQUFZLEtBQUksQ0FBRTs7QUFHakQsWUFBSSxPQUFPO0FBQ1gsWUFBSSxTQUFTO0FBQ2IsWUFBSSxXQUFXO0FBR2YsWUFBSSxNQUFNLGVBQWU7QUFDckIsY0FBSSxTQUFTLFNBQVMsTUFBTSxhQUFhO0FBQ3pDLGNBQUksTUFBTSxNQUFNLEdBQUc7QUFDZixxQkFBUyxZQUFBLGlCQUFpQixNQUFNLGFBQWE7O0FBRWpELGNBQUksVUFBVTtBQUFJLG1CQUFPO0FBQ3pCLGlCQUFPLE1BQU0sT0FBTyxVQUFVLE1BQU07O0FBR3hDLGVBQU8sU0FBUyxNQUFNLFdBQVc7QUFDakMsWUFBSSxNQUFNLElBQUksR0FBRztBQUNiLGlCQUFPLFlBQUEsaUJBQWlCLE1BQU0sV0FBVzs7QUFJN0MsWUFBSSxNQUFNLGVBQWU7QUFDckIsY0FBSSxNQUFNLGlCQUFpQixVQUFLO0FBQzVCLHFCQUFTO3FCQUNGLE1BQU0saUJBQWlCLFlBQU8sTUFBTSxpQkFBaUIsVUFBSztBQUNqRSxxQkFBUztpQkFDTjtBQUNILHFCQUFTLFNBQVMsTUFBTSxhQUFhO0FBQ3JDLGdCQUFJLE1BQU0sTUFBTSxHQUFHO0FBQ2YsdUJBQVMsWUFBQSxpQkFBaUIsTUFBTSxhQUFhOzs7bUJBRzlDLE9BQU8sS0FBSztBQUNuQixtQkFBUyxPQUFPO0FBQ2hCLGlCQUFPLEtBQUssTUFBTSxPQUFPLEdBQUc7O0FBR2hDLFlBQUksVUFBVSxJQUFJO0FBQ2QsaUJBQU87O0FBR1gsWUFBSSxPQUFPLElBQUk7QUFDWCxpQkFBTzs7QUFFWCxZQUFJLFFBQVEsSUFBSTtBQUNaLHFCQUFXOztBQUlmLFlBQUksTUFBTSxtQkFBbUI7QUFDekIsY0FBSSxPQUFPO0FBQUksbUJBQU87QUFDdEIsZ0JBQU0sT0FBTyxNQUFNLGtCQUFrQixHQUFHLFlBQVc7QUFDbkQsY0FBSSxRQUFRLEtBQUs7QUFDYix1QkFBVztBQUNYLGdCQUFJLFFBQVE7QUFBSSxxQkFBTzs7QUFHM0IsY0FBSSxRQUFRLEtBQUs7QUFDYix1QkFBVztBQUNYLGdCQUFJLFFBQVE7QUFBSSxzQkFBUTs7bUJBRXJCLE1BQU0sd0JBQXdCO0FBQ3JDLGdCQUFNLGdCQUFnQixNQUFNO0FBQzVCLGdCQUFNLFVBQVUsY0FBYztBQUM5QixjQUFJLFdBQVcsVUFBSztBQUNoQix1QkFBVztBQUNYLGdCQUFJLFFBQVE7QUFBSSxxQkFBTztxQkFDaEIsV0FBVyxVQUFLO0FBQ3ZCLHVCQUFXO0FBQ1gsZ0JBQUksUUFBUTtBQUFJLHNCQUFROzttQkFFckIsTUFBTSx3QkFBd0I7QUFDckMsZ0JBQU0sZ0JBQWdCLE1BQU07QUFDNUIsZ0JBQU0sVUFBVSxjQUFjO0FBQzlCLGNBQUksV0FBVyxZQUFPLFdBQVcsWUFBTyxXQUFXLFVBQUs7QUFDcEQsdUJBQVc7QUFDWCxnQkFBSSxRQUFRO0FBQUkscUJBQU87cUJBQ2hCLFdBQVcsWUFBTyxXQUFXLFVBQUs7QUFDekMsdUJBQVc7QUFDWCxnQkFBSSxRQUFRO0FBQUksc0JBQVE7O21CQUVyQixNQUFNLHdCQUF3QjtBQUNyQyxnQkFBTSxnQkFBZ0IsTUFBTTtBQUM1QixnQkFBTSxVQUFVLGNBQWM7QUFDOUIsY0FBSSxXQUFXLFlBQU8sV0FBVyxZQUFPLFdBQVcsVUFBSztBQUNwRCx1QkFBVztBQUNYLGdCQUFJLFFBQVE7QUFBSSxxQkFBTztxQkFDaEIsV0FBVyxZQUFPLFdBQVcsVUFBSztBQUN6Qyx1QkFBVztBQUNYLGdCQUFJLFFBQVE7QUFBSSxzQkFBUTs7O0FBSWhDLGVBQU8sTUFBTSxPQUFPLFFBQVEsSUFBSTtBQUNoQyxlQUFPLE1BQU0sT0FBTyxVQUFVLE1BQU07QUFFcEMsWUFBSSxZQUFZLEdBQUc7QUFDZixpQkFBTyxNQUFNLE9BQU8sWUFBWSxRQUFRO2VBQ3JDO0FBQ0gsY0FBSSxPQUFPLElBQUk7QUFDWCxtQkFBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO2lCQUM3QjtBQUNILG1CQUFPLE1BQU0sTUFBTSxZQUFZLENBQUM7OztBQVF4QyxnQkFBUSxtQkFBbUIsS0FBSyxRQUFRLEtBQUssVUFBVSxPQUFPLFFBQVEsT0FBTyxLQUFLLE1BQU0sQ0FBQztBQUN6RixZQUFJLENBQUMsT0FBTztBQUVSLGNBQUksT0FBTyxLQUFLLE1BQU0sT0FBTyxHQUFHO0FBQzVCLG1CQUFPOztBQUVYLGlCQUFPOztBQUdYLGNBQU0sWUFBWSxZQUFZLE1BQUs7QUFDbkMsZUFBTyxNQUFNLFFBQVEsd0JBQXVCO0FBRzVDLFlBQUksTUFBTSxjQUFjO0FBQ3BCLGdCQUFNLE9BQU8sTUFBTTtBQUNuQixjQUFJLFFBQVEsVUFBSztBQUViLGdCQUFJLFVBQVUsS0FBSSxJQUFLLEdBQUc7QUFDdEIsd0JBQVUsSUFBSSxHQUFHLEtBQUs7O3FCQUVuQixRQUFRLFVBQUs7QUFDcEIsc0JBQVUsSUFBSSxJQUFJLEtBQUs7cUJBQ2hCLFFBQVEsVUFBSztBQUNwQixzQkFBVSxJQUFJLElBQUksS0FBSztxQkFDaEIsUUFBUSxnQkFBTTtBQUNyQixzQkFBVSxJQUFJLElBQUksS0FBSztxQkFDaEIsUUFBUSxVQUFLO0FBQ3BCLHNCQUFVLElBQUksR0FBRyxLQUFLO3FCQUNmLFFBQVEsZ0JBQU07QUFDckIsc0JBQVUsSUFBSSxHQUFHLEtBQUs7O0FBRTFCLGlCQUFPLElBQUksT0FBTyxPQUFPLFVBQVUsS0FBSSxDQUFFO0FBQ3pDLGlCQUFPLElBQUksT0FBTyxTQUFTLFVBQVUsTUFBSyxJQUFLLENBQUM7QUFDaEQsaUJBQU8sSUFBSSxPQUFPLFFBQVEsVUFBVSxLQUFJLENBQUU7bUJBQ25DLE1BQU0sY0FBYztBQUMzQixnQkFBTSxPQUFPLE1BQU07QUFDbkIsY0FBSSxRQUFRLFVBQUs7QUFDYixzQkFBVSxJQUFJLEdBQUcsS0FBSztxQkFDZixRQUFRLFVBQUs7QUFDcEIsc0JBQVUsSUFBSSxJQUFJLEtBQUs7cUJBQ2hCLFFBQVEsVUFBSztBQUNwQixzQkFBVSxJQUFJLElBQUksS0FBSztxQkFDaEIsUUFBUSxnQkFBTTtBQUNyQixzQkFBVSxJQUFJLElBQUksS0FBSztxQkFDaEIsUUFBUSxVQUFLO0FBQ3BCLHNCQUFVLElBQUksR0FBRyxLQUFLO3FCQUNmLFFBQVEsZ0JBQU07QUFDckIsc0JBQVUsSUFBSSxHQUFHLEtBQUs7O0FBRTFCLGlCQUFPLElBQUksT0FBTyxPQUFPLFVBQVUsS0FBSSxDQUFFO0FBQ3pDLGlCQUFPLElBQUksT0FBTyxTQUFTLFVBQVUsTUFBSyxJQUFLLENBQUM7QUFDaEQsaUJBQU8sSUFBSSxPQUFPLFFBQVEsVUFBVSxLQUFJLENBQUU7ZUFDdkM7QUFDSCxpQkFBTyxJQUFJLE1BQU0sT0FBTyxVQUFVLEtBQUksQ0FBRTtBQUN4QyxpQkFBTyxJQUFJLE1BQU0sU0FBUyxVQUFVLE1BQUssSUFBSyxDQUFDO0FBQy9DLGlCQUFPLElBQUksTUFBTSxRQUFRLFVBQVUsS0FBSSxDQUFFOztBQUc3QyxlQUFPO0FBQ1AsaUJBQVM7QUFDVCxtQkFBVztBQUdYLFlBQUksTUFBTSxlQUFlO0FBQ3JCLGNBQUksU0FBUyxTQUFTLE1BQU0sYUFBYTtBQUN6QyxjQUFJLE1BQU0sTUFBTSxHQUFHO0FBQ2YscUJBQVMsWUFBQSxpQkFBaUIsTUFBTSxhQUFhOztBQUdqRCxjQUFJLFVBQVU7QUFBSSxtQkFBTztBQUN6QixpQkFBTyxJQUFJLE9BQU8sVUFBVSxNQUFNOztBQUd0QyxlQUFPLFNBQVMsTUFBTSxXQUFXO0FBQ2pDLFlBQUksTUFBTSxJQUFJLEdBQUc7QUFDYixpQkFBTyxZQUFBLGlCQUFpQixNQUFNLFdBQVc7O0FBSTdDLFlBQUksTUFBTSxlQUFlO0FBQ3JCLGNBQUksTUFBTSxpQkFBaUIsVUFBSztBQUM1QixxQkFBUztxQkFDRixNQUFNLGlCQUFpQixZQUFPLE1BQU0saUJBQWlCLFVBQUs7QUFDakUscUJBQVM7aUJBQ047QUFDSCxxQkFBUyxTQUFTLE1BQU0sYUFBYTtBQUNyQyxnQkFBSSxNQUFNLE1BQU0sR0FBRztBQUNmLHVCQUFTLFlBQUEsaUJBQWlCLE1BQU0sYUFBYTs7O21CQUc5QyxPQUFPLEtBQUs7QUFDbkIsbUJBQVMsT0FBTztBQUNoQixpQkFBTyxLQUFLLE1BQU0sT0FBTyxHQUFHOztBQUdoQyxZQUFJLFVBQVUsSUFBSTtBQUNkLGlCQUFPOztBQUdYLFlBQUksT0FBTyxJQUFJO0FBQ1gsaUJBQU87O0FBRVgsWUFBSSxRQUFRLElBQUk7QUFDWixxQkFBVzs7QUFJZixZQUFJLE1BQU0sbUJBQW1CO0FBQ3pCLGNBQUksT0FBTztBQUFJLG1CQUFPO0FBQ3RCLGdCQUFNLE9BQU8sTUFBTSxrQkFBa0IsR0FBRyxZQUFXO0FBQ25ELGNBQUksUUFBUSxLQUFLO0FBQ2IsdUJBQVc7QUFDWCxnQkFBSSxRQUFRO0FBQUkscUJBQU87O0FBRzNCLGNBQUksUUFBUSxLQUFLO0FBQ2IsdUJBQVc7QUFDWCxnQkFBSSxRQUFRO0FBQUksc0JBQVE7O0FBRzVCLGNBQUksQ0FBQyxPQUFPLE1BQU0sVUFBVSxVQUFVLEdBQUc7QUFDckMsZ0JBQUksWUFBWSxHQUFHO0FBQ2YscUJBQU8sTUFBTSxNQUFNLFlBQVksQ0FBQztBQUVoQyxrQkFBSSxPQUFPLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSTtBQUNoQyx1QkFBTyxNQUFNLE9BQU8sUUFBUSxDQUFDOzttQkFFOUI7QUFDSCxxQkFBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO0FBRWhDLGtCQUFJLE9BQU8sTUFBTSxJQUFJLE1BQU0sS0FBSyxJQUFJO0FBQ2hDLHVCQUFPLE1BQU0sT0FBTyxRQUFRLE9BQU8sTUFBTSxJQUFJLE1BQU0sSUFBSSxFQUFFOzs7O21CQUk5RCxNQUFNLHdCQUF3QjtBQUNyQyxnQkFBTSxnQkFBZ0IsTUFBTTtBQUM1QixnQkFBTSxVQUFVLGNBQWM7QUFDOUIsY0FBSSxXQUFXLFVBQUs7QUFDaEIsdUJBQVc7QUFDWCxnQkFBSSxRQUFRO0FBQUkscUJBQU87cUJBQ2hCLFdBQVcsVUFBSztBQUN2Qix1QkFBVztBQUNYLGdCQUFJLFFBQVE7QUFBSSxzQkFBUTs7bUJBRXJCLE1BQU0sd0JBQXdCO0FBQ3JDLGdCQUFNLGdCQUFnQixNQUFNO0FBQzVCLGdCQUFNLFVBQVUsY0FBYztBQUM5QixjQUFJLFdBQVcsWUFBTyxXQUFXLFlBQU8sV0FBVyxVQUFLO0FBQ3BELHVCQUFXO0FBQ1gsZ0JBQUksUUFBUTtBQUFJLHFCQUFPO3FCQUNoQixXQUFXLFlBQU8sV0FBVyxVQUFLO0FBQ3pDLHVCQUFXO0FBQ1gsZ0JBQUksUUFBUTtBQUFJLHNCQUFROzttQkFFckIsTUFBTSx3QkFBd0I7QUFDckMsZ0JBQU0sZ0JBQWdCLE1BQU07QUFDNUIsZ0JBQU0sVUFBVSxjQUFjO0FBQzlCLGNBQUksV0FBVyxZQUFPLFdBQVcsWUFBTyxXQUFXLFVBQUs7QUFDcEQsdUJBQVc7QUFDWCxnQkFBSSxRQUFRO0FBQUkscUJBQU87cUJBQ2hCLFdBQVcsWUFBTyxXQUFXLFVBQUs7QUFDekMsdUJBQVc7QUFDWCxnQkFBSSxRQUFRO0FBQUksc0JBQVE7OztBQUloQyxlQUFPLE9BQU8sT0FBTyxPQUFPLE1BQU07QUFDbEMsZUFBTyxJQUFJLE9BQU8sUUFBUSxJQUFJO0FBQzlCLGVBQU8sSUFBSSxPQUFPLFVBQVUsTUFBTTtBQUNsQyxZQUFJLFlBQVksR0FBRztBQUNmLGlCQUFPLElBQUksT0FBTyxZQUFZLFFBQVE7ZUFDbkM7QUFDSCxnQkFBTSxZQUFZLE9BQU8sTUFBTSxVQUFVLFVBQVUsS0FBSyxPQUFPLE1BQU0sSUFBSSxVQUFVLEtBQUs7QUFDeEYsY0FBSSxhQUFhLE9BQU8sTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNO0FBRTlDLG1CQUFPLElBQUksTUFBTSxZQUFZLENBQUM7cUJBQ3ZCLE9BQU8sSUFBSTtBQUNsQixtQkFBTyxJQUFJLE1BQU0sWUFBWSxDQUFDOzs7QUFJdEMsWUFBSSxPQUFPLElBQUksS0FBSSxFQUFHLFFBQU8sSUFBSyxPQUFPLE1BQU0sS0FBSSxFQUFHLFFBQU8sR0FBSTtBQUM3RCxpQkFBTyxJQUFJLE1BQU0sT0FBTyxPQUFPLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQzs7QUFHckQsZUFBTztNQUNYOztBQXJXSixZQUFBLFVBQUE7Ozs7Ozs7Ozs7OztBQ2pFQSxRQUFBLFVBQUFDLGlCQUFBLG1CQUFBO0FBRUEsUUFBQSxtQ0FBQTtBQUVBLFFBQUEsY0FBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQU8sb0RBQTJCLE9BQU8sS0FBSyxZQUFBLGNBQWMsRUFBRSxLQUFLLEdBQUcsSUFBSSxHQUFHO0FBRWpHLFFBQXFCLHNCQUFyQixjQUFpRCxpQ0FBQSx1Q0FBc0M7TUFDbkYsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxTQUFTLFFBQVEsb0JBQW9CLE1BQU0sT0FBTyxNQUFNLEVBQUU7QUFFaEUsY0FBTSxZQUFZLE1BQU0sT0FBTztBQUMvQixjQUFNLFNBQVMsWUFBQSxlQUFlO0FBQzlCLFlBQUksV0FBVztBQUFXLGlCQUFPO0FBRWpDLFlBQUksY0FBYyxRQUFBLFFBQU0sUUFBUSxPQUFPO0FBQ3ZDLGNBQU0sbUJBQW1CO0FBQ3pCLGNBQU0sWUFBWSxZQUFZLElBQUc7QUFFakMsWUFBSSxLQUFLLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxLQUFLLElBQUksU0FBUyxTQUFTLEdBQUc7QUFDakUsd0JBQWMsWUFBWSxJQUFJLFNBQVMsQ0FBQzttQkFDakMsS0FBSyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksS0FBSyxJQUFJLFNBQVMsU0FBUyxHQUFHO0FBQ3hFLHdCQUFjLFlBQVksSUFBSSxTQUFTLENBQUM7ZUFDckM7QUFDSCx3QkFBYyxZQUFZLElBQUksTUFBTTs7QUFHeEMsZUFBTyxNQUFNLE9BQU8sV0FBVyxNQUFNO0FBQ3JDLFlBQUksa0JBQWtCO0FBQ2xCLGlCQUFPLE1BQU0sT0FBTyxPQUFPLFlBQVksS0FBSSxDQUFFO0FBQzdDLGlCQUFPLE1BQU0sT0FBTyxTQUFTLFlBQVksTUFBSyxJQUFLLENBQUM7QUFDcEQsaUJBQU8sTUFBTSxPQUFPLFFBQVEsWUFBWSxLQUFJLENBQUU7ZUFDM0M7QUFDSCxpQkFBTyxNQUFNLE1BQU0sT0FBTyxZQUFZLEtBQUksQ0FBRTtBQUM1QyxpQkFBTyxNQUFNLE1BQU0sU0FBUyxZQUFZLE1BQUssSUFBSyxDQUFDO0FBQ25ELGlCQUFPLE1BQU0sTUFBTSxRQUFRLFlBQVksS0FBSSxDQUFFOztBQUdqRCxlQUFPO01BQ1g7O0FBcENKLFlBQUEsVUFBQTs7Ozs7Ozs7Ozs7O0FDUkEsUUFBQSxrQ0FBQUMsaUJBQUEsdUNBQUE7QUFFQSxRQUFxQiw4QkFBckIsY0FBeUQsZ0NBQUEsUUFBNkI7TUFDbEYsaUJBQWM7QUFDVixlQUFPO01BQ1g7O0FBSEosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNGQSxRQUFBLGlDQUFBQyxpQkFBQSxzQ0FBQTtBQUVBLFFBQXFCLDZCQUFyQixjQUF3RCwrQkFBQSxRQUE0QjtNQUNoRixpQkFBYztBQUNWLGVBQU87TUFDWDs7QUFISixZQUFBLFVBQUE7Ozs7Ozs7Ozs7Ozs7QUNFQSxRQUFBLFdBQUE7QUFDQSxRQUFBLGlDQUFBQyxpQkFBQSxzQ0FBQTtBQUNBLFFBQUEsbUJBQUE7QUFFQSxRQUFBLDJCQUFBQSxpQkFBQSxnQ0FBQTtBQUNBLFFBQUEscUJBQUFBLGlCQUFBLDBCQUFBO0FBQ0EsUUFBQSwrQkFBQUEsaUJBQUEsb0NBQUE7QUFDQSxRQUFBLGdDQUFBQSxpQkFBQSxxQ0FBQTtBQUNBLFFBQUEsK0JBQUFBLGlCQUFBLG9DQUFBO0FBQ0EsUUFBQSx3QkFBQUEsaUJBQUEsNkJBQUE7QUFDQSxRQUFBLGdDQUFBQSxpQkFBQSxxQ0FBQTtBQUNBLFFBQUEsK0JBQUFBLGlCQUFBLG9DQUFBO0FBR2EsWUFBQSxPQUFPLElBQUksU0FBQSxPQUFPLDBCQUF5QixDQUFFO0FBRTdDLFlBQUEsU0FBUyxJQUFJLFNBQUEsT0FBTywwQkFBeUIsQ0FBRTtBQUMvQyxZQUFBLFNBQVMsSUFBSSxTQUFBLE9BQU8sb0JBQW1CLENBQUU7QUFFdEQsYUFBZ0IsTUFBTUMsT0FBYyxLQUFZLFFBQXNCO0FBQ2xFLGFBQU8sUUFBQSxPQUFPLE1BQU1BLE9BQU0sS0FBSyxNQUFNO0lBQ3pDO0FBRkEsWUFBQSxRQUFBO0FBSUEsYUFBZ0JDLFdBQVVELE9BQWMsS0FBWSxRQUFzQjtBQUN0RSxhQUFPLFFBQUEsT0FBTyxVQUFVQSxPQUFNLEtBQUssTUFBTTtJQUM3QztBQUZBLFlBQUEsWUFBQUM7QUFPQSxhQUFnQiw0QkFBeUI7QUFDckMsWUFBTSxTQUFTLG9CQUFtQjtBQUNsQyxhQUFPLFFBQVEsUUFBUSxJQUFJLHlCQUFBLFFBQXNCLENBQUU7QUFDbkQsYUFBTztJQUNYO0FBSkEsWUFBQSw0QkFBQTtBQVNBLGFBQWdCLHNCQUFtQjtBQUMvQixZQUFNLGdCQUFnQixpQkFBQSwyQkFBMkI7UUFDN0MsU0FBUztVQUNMLElBQUksbUJBQUEsUUFBZ0I7VUFDcEIsSUFBSSw4QkFBQSxRQUEyQjtVQUMvQixJQUFJLHNCQUFBLFFBQW1CO1VBQ3ZCLElBQUksNkJBQUEsUUFBMEI7VUFDOUIsSUFBSSw2QkFBQSxRQUEwQjs7UUFFbEMsVUFBVSxDQUFDLElBQUksOEJBQUEsUUFBMkIsR0FBSSxJQUFJLDZCQUFBLFFBQTBCLENBQUU7T0FDakY7QUFHRCxvQkFBYyxXQUFXLGNBQWMsU0FBUyxPQUM1QyxDQUFDLFlBQVksRUFBRSxtQkFBbUIsK0JBQUEsUUFBNkI7QUFHbkUsYUFBTztJQUNYO0FBbEJBLFlBQUEsc0JBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzQ0EsSUFBQUMsY0FBQSxnQkFBQSxPQUFBO0FBQ0EsWUFBQSxPQUFBQyxjQUFBLGNBQUE7Ozs7Ozs7Ozs7QUNBQSxRQUFBLFlBQUE7QUFDQSxRQUFBLFVBQUE7QUFHYSxZQUFBLGNBQWM7TUFDdkIsY0FBYztNQUNkLGVBQWU7TUFDZixPQUFPOztBQUdFLFlBQUEscUJBQWlEO01BQzFELG9FQUFhO01BQ2Isb0VBQWE7TUFDYixvQkFBSztNQUNMLHVCQUFRO01BQ1Isb0VBQWE7TUFDYiwwRUFBYztNQUNkLGNBQUk7TUFDSixpQkFBTztNQUNQLDRDQUFTO01BQ1Qsa0RBQVU7TUFDVixjQUFJO01BQ0osaUJBQU87TUFDUCxnQ0FBTztNQUNQLGdDQUFPO01BQ1AsZ0NBQU87TUFDUCxjQUFJO01BQ0osaUJBQU87TUFDUCw0Q0FBUztNQUNULGtEQUFVO01BQ1YsY0FBSTtNQUNKLGlCQUFPO01BQ1AsNENBQVM7TUFDVCw0Q0FBUztNQUNULDRDQUFTO01BQ1QsY0FBSTtNQUNKLGlCQUFPO01BQ1AsNENBQVM7TUFDVCw0Q0FBUztNQUNULDRDQUFTO01BQ1QsY0FBSTtNQUNKLGlCQUFPOztBQUdFLFlBQUEsNkJBQXlEO01BQ2xFLHNDQUFRO01BQ1Isc0NBQVE7TUFDUixzQ0FBUTtNQUNSLDRDQUFTO01BQ1QsNENBQVM7TUFDVCw0Q0FBUztNQUNULDBCQUFNO01BQ04sZ0NBQU87TUFDUCxnQ0FBTztNQUNQLHNDQUFRO01BQ1Isc0NBQVE7TUFDUixzQ0FBUTtNQUNSLG9CQUFLO01BQ0wsb0JBQUs7TUFDTCxvQkFBSztNQUNMLDBCQUFNO01BQ04sMEJBQU07TUFDTiwwQkFBTTtNQUNOLDBCQUFNO01BQ04sMEJBQU07TUFDTiwwQkFBTTtNQUNOLHNDQUFRO01BQ1IsNENBQVM7TUFDVCw0Q0FBUztNQUNULGtEQUFVO01BQ1Ysa0RBQVU7TUFDVixrREFBVTtNQUNWLDRDQUFTO01BQ1QsNENBQVM7TUFDVCw0Q0FBUztNQUNULHNDQUFRO01BQ1Isc0NBQVE7TUFDUixzQ0FBUTtNQUNSLDRDQUFTO01BQ1QsNENBQVM7TUFDVCw0Q0FBUzs7QUFHQSxZQUFBLG1CQUFnQixPQUFBLE9BQUEsT0FBQSxPQUFBLENBQUEsR0FDdEIsUUFBQSwwQkFBMEIsR0FBQSxFQUM3QixvQkFBSyxHQUNMLHVCQUFRLEdBQ1Isb0JBQUssR0FDTCx1QkFBUSxHQUNSLG9CQUFLLEdBQ0wsdUJBQVEsR0FDUixvQkFBSyxHQUNMLHVCQUFRLEdBQ1Isb0JBQUssR0FDTCx1QkFBUSxHQUNSLG9CQUFLLEdBQ0wsdUJBQVEsR0FDUixvQkFBSyxJQUNMLHVCQUFRLElBQ1Isb0JBQUssSUFDTCx1QkFBUSxJQUNSLG9CQUFLLElBQ0wsdUJBQVEsR0FBRSxDQUFBO0FBR0QsWUFBQSwwQkFBc0Q7TUFDL0QsMEJBQU07TUFDTiwwQkFBTTtNQUNOLGdDQUFPO01BQ1AsMEJBQU07TUFDTixvQkFBSztNQUNMLG9CQUFLO01BQ0wsMEJBQU07TUFDTixvQkFBSztNQUNMLDBCQUFNO01BQ04sMEJBQU07TUFDTixzQ0FBUTtNQUNSLDRDQUFTO01BQ1QsNENBQVM7TUFDVCwwQkFBTTtNQUNOLDBCQUFNO01BQ04sZ0NBQU87TUFDUCxnQ0FBTztNQUNQLDBCQUFNO01BQ04sMEJBQU07TUFDTixzQ0FBUTtNQUNSLGtEQUFVO01BQ1Ysc0NBQVE7TUFDUixzQ0FBUTtNQUNSLHNDQUFRO01BQ1Isc0NBQVE7TUFDUixvRUFBYTtNQUNiLG9FQUFhO01BQ2IsOERBQVk7TUFDWiw4REFBWTs7QUFHSCxZQUFBLDBCQUFzRDtNQUMvRCxzQ0FBUTtNQUNSLDRDQUFTO01BQ1Qsc0NBQVE7TUFDUiw0Q0FBUztNQUNULHNDQUFRO01BQ1Isa0RBQVU7TUFDVix3REFBVztNQUNYLDhEQUFZO01BQ1osZ0NBQU87TUFDUCxzQ0FBUTtNQUNSLHNDQUFRO01BQ1IsNENBQVM7TUFDVCw0Q0FBUztNQUNULGtEQUFVO01BQ1YsNENBQVM7TUFDVCxrREFBVTtNQUNWLDRDQUFTO01BQ1Qsa0RBQVU7TUFDViw0Q0FBUztNQUNULGtEQUFVO01BQ1YsMEVBQWM7TUFDZCxnRkFBZTtNQUNmLG9FQUFhO01BQ2IsMEVBQWM7TUFDZCxvRUFBYTtNQUNiLDBFQUFjO01BQ2QsZ0ZBQWU7TUFDZixzRkFBZ0I7TUFDaEIsb0VBQWE7TUFDYiwwRUFBYztNQUNkLDBFQUFjO01BQ2QsZ0ZBQWU7TUFDZixvRUFBYTtNQUNiLDBFQUFjO01BQ2QsZ0ZBQWU7TUFDZixzRkFBZ0I7TUFDaEIsZ0ZBQWU7TUFDZixzRkFBZ0I7TUFDaEIsd0RBQVc7TUFDWCw4REFBWTtNQUNaLHlGQUFtQjtNQUNuQiwrRkFBb0I7TUFDcEIseUZBQW1CO01BQ25CLCtGQUFvQjtNQUNwQix5RkFBbUI7TUFDbkIscUdBQXFCO01BQ3JCLDJHQUFzQjtNQUN0QixpSEFBdUI7TUFDdkIsbUZBQWtCO01BQ2xCLHlGQUFtQjtNQUNuQix5RkFBbUI7TUFDbkIsK0ZBQW9CO01BQ3BCLCtGQUFvQjtNQUNwQixxR0FBcUI7TUFDckIsK0ZBQW9CO01BQ3BCLHFHQUFxQjtNQUNyQiwrRkFBb0I7TUFDcEIscUdBQXFCO01BQ3JCLDBEQUFhO01BQ2IsZ0VBQWM7TUFDZCx5RkFBbUI7TUFDbkIsK0ZBQW9COztBQUdYLFlBQUEsdUJBQW1FO01BQzVFLG9CQUFLO01BQ0wsNENBQVM7TUFDVCxzQ0FBUTtNQUNSLDRDQUFTO01BQ1QsNENBQVM7TUFDVCw4REFBWTtNQUNaLDhEQUFZO01BQ1osOERBQVk7TUFDWiw4REFBWTtNQUNaLG9CQUFLO01BQ0wsc0NBQVE7TUFDUixnQ0FBTztNQUNQLHNDQUFRO01BQ1Isc0NBQVE7TUFDUiw0Q0FBUztNQUNULDRDQUFTO01BQ1QsNENBQVM7TUFDVCxvQkFBSztNQUNMLGdDQUFPO01BQ1AsMEJBQU07TUFDTiwwQkFBTTtNQUNOLDRDQUFTO01BQ1Qsc0NBQVE7TUFDUixzQ0FBUTtNQUNSLGdDQUFPO01BQ1AsMEJBQU07TUFDTixvQkFBSztNQUNMLDBCQUFNO01BQ04sZ0NBQU87TUFDUCxnQ0FBTztNQUNQLHNDQUFRO01BQ1Isc0NBQVE7TUFDUixzQ0FBUTtNQUNSLHNDQUFRO01BQ1Isc0NBQVE7TUFDUixrREFBVTtNQUNWLGtEQUFVO01BQ1YsNENBQVM7TUFDVCxnQ0FBTztNQUNQLHNDQUFRO01BQ1IsNENBQVM7TUFDVCxzQ0FBUTtNQUNSLDRDQUFTO01BQ1Qsa0RBQVU7TUFDVix3REFBVztNQUNYLG9CQUFLO01BQ0wsMEJBQU07TUFDTiwwQkFBTTtNQUNOLGdDQUFPO01BQ1Asb0JBQUs7TUFDTCxnQ0FBTztNQUNQLHNDQUFRO01BQ1IsNENBQVM7O0FBS0EsWUFBQSxpQkFBaUIsTUFBTSxVQUFBLGdCQUNoQyxRQUFBLHVCQUF1QjtBQUczQixhQUFnQixtQkFBbUIsT0FBYTtBQUM1QyxZQUFNLE1BQU0sTUFBTSxZQUFXO0FBQzdCLFVBQUksUUFBQSx3QkFBd0IsU0FBUyxRQUFXO0FBQzVDLGVBQU8sUUFBQSx3QkFBd0I7O0FBRW5DLFVBQUksSUFBSSxNQUFNLFdBQVcsR0FBRztBQUN4QixlQUFPO2lCQUNBLElBQUksTUFBTSxLQUFLLEdBQUc7QUFDekIsZUFBTztpQkFDQSxJQUFJLE1BQU0sS0FBSyxHQUFHO0FBQ3pCLGVBQU87aUJBQ0EsUUFBUSxJQUFJO0FBQ25CLGVBQU87O0FBRVgsYUFBTyxXQUFXLEdBQUc7SUFDekI7QUFmQSxZQUFBLHFCQUFBO0FBbUJhLFlBQUEseUJBQXlCLE1BQU0sVUFBQSxnQkFBZ0IsUUFBQSx1QkFBdUI7QUFDbkYsYUFBZ0IsMEJBQTBCLE9BQWE7QUFDbkQsVUFBSSxNQUFNLE1BQU0sWUFBVztBQUMzQixVQUFJLFFBQUEsd0JBQXdCLFNBQVMsUUFBVztBQUM1QyxlQUFPLFFBQUEsd0JBQXdCOztBQUduQyxZQUFNLElBQUksUUFBUSxxQkFBcUIsRUFBRTtBQUN6QyxhQUFPLFNBQVMsR0FBRztJQUN2QjtBQVJBLFlBQUEsNEJBQUE7QUFZQSxRQUFNLE9BQU87QUFDQSxZQUFBLGVBQWUscUJBQXFCLG9IQUF3RCxrQkFBa0I7QUFDM0gsYUFBZ0IsVUFBVSxPQUFhO0FBQ25DLFVBQUksbUJBQW1CLEtBQUssS0FBSyxHQUFHO0FBQ2hDLGdCQUFRLE1BQU0sUUFBUSxvQkFBb0IsRUFBRTs7QUFHaEQsVUFBSSxzQkFBc0IsS0FBSyxLQUFLLEdBQUc7QUFFbkMsZ0JBQVEsTUFBTSxRQUFRLHVCQUF1QixFQUFFO0FBQy9DLGVBQU8sQ0FBQyxTQUFTLEtBQUs7O0FBRzFCLFVBQUksZ0JBQWdCLEtBQUssS0FBSyxHQUFHO0FBRTdCLGdCQUFRLE1BQU0sUUFBUSxpQkFBaUIsRUFBRTtBQUN6QyxlQUFPLFNBQVMsS0FBSzs7QUFHekIsWUFBTSxnQkFBZ0IsU0FBUyxLQUFLO0FBQ3BDLGFBQU8sUUFBQSxxQkFBcUIsYUFBYTtJQUM3QztBQW5CQSxZQUFBLFlBQUE7QUF1QkEsUUFBTSwyQkFBMkIsSUFBSSxRQUFBLDJCQUEyQixVQUFBLGdCQUFnQixRQUFBLG9CQUFvQjtBQUNwRyxRQUFNLHlCQUF5QixJQUFJLE9BQU8sMEJBQTBCLEdBQUc7QUFFMUQsWUFBQSxxQkFBcUIsVUFBQSx3QkFBd0Isb0dBQW1DLHdCQUF3QjtBQUVySCxhQUFnQixlQUFlLGNBQVk7QUFDdkMsWUFBTSxZQUFZLENBQUE7QUFDbEIsVUFBSSxnQkFBZ0I7QUFDcEIsVUFBSSxRQUFRLHVCQUF1QixLQUFLLGFBQWE7QUFDckQsYUFBTyxPQUFPO0FBQ1YsZ0NBQXdCLFdBQVcsS0FBSztBQUN4Qyx3QkFBZ0IsY0FBYyxVQUFVLE1BQU0sR0FBRyxNQUFNLEVBQUUsS0FBSTtBQUM3RCxnQkFBUSx1QkFBdUIsS0FBSyxhQUFhOztBQUVyRCxhQUFPO0lBQ1g7QUFWQSxZQUFBLGlCQUFBO0FBWUEsYUFBUyx3QkFBd0IsV0FBVyxPQUFLO0FBQzdDLFlBQU0sTUFBTSxtQkFBbUIsTUFBTSxFQUFFO0FBQ3ZDLFlBQU0sT0FBTyxRQUFBLHFCQUFxQixNQUFNLEdBQUcsWUFBVztBQUN0RCxnQkFBVSxRQUFRO0lBQ3RCOzs7Ozs7Ozs7QUN2VkEsUUFBQSxjQUFBO0FBRUEsUUFBQSxZQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUVBLFFBQU0sVUFBVSwwR0FBeUMsWUFBQSxzQkFBc0IsWUFBQSxZQUFZO0FBQzNGLFFBQU0sc0JBQXNCLElBQUksT0FBTyw4R0FBOEIsV0FBVyxZQUFBLFlBQVksS0FBSztBQUVqRyxRQUFNLHlCQUF5QixJQUFJLE9BQU8sU0FBUyxHQUFHO0FBRXRELFFBQXFCLCtCQUFyQixjQUEwRCxpQ0FBQSx1Q0FBc0M7TUFDNUYsc0JBQW1CO0FBQ2YsZUFBTyxZQUFBLFlBQVk7TUFDdkI7TUFFQSxhQUFhLFNBQXVCO0FBQ2hDLGVBQU8sUUFBUSxPQUFPLGNBQWMseUJBQXlCO01BQ2pFO01BRUEsYUFBYSxTQUF5QixPQUF1QjtBQUN6RCxjQUFNLFlBQVksWUFBQSxlQUFlLE1BQU0sRUFBRTtBQUN6QyxlQUFPLFVBQUEsa0JBQWtCLDRCQUE0QixRQUFRLFdBQVcsU0FBUztNQUNyRjs7QUFaSixZQUFBLFVBQUE7Ozs7Ozs7OztBQ1JBLFFBQUEsVUFBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFHQSxRQUFNLFVBQVUsSUFBSSxPQUNoQixtQkFBYyxZQUFBLHFGQUdGLFlBQUEsOERBR0osVUFBQSxnQkFBZ0IsWUFBQSxnQkFBZ0IsNkJBRzVCLFlBQUEsK0JBRVQsWUFBQSxZQUFZLGlCQUNmLFlBQUEsWUFBWSxLQUFLO0FBR3JCLFFBQU0sYUFBYTtBQUNuQixRQUFNLGdCQUFnQjtBQUN0QixRQUFNLG1CQUFtQjtBQUN6QixRQUFNLGFBQWE7QUFFbkIsUUFBcUIsZ0NBQXJCLGNBQTJELGlDQUFBLHVDQUFzQztNQUM3RixzQkFBbUI7QUFDZixlQUFPLFlBQUEsWUFBWTtNQUN2QjtNQUVBLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sU0FBUyxRQUFRLG9CQUFvQixNQUFNLE9BQU8sTUFBTSxFQUFFO0FBRWhFLGNBQU0sUUFBUSxZQUFBLGlCQUFpQixNQUFNLGtCQUFrQixZQUFXO0FBQ2xFLGNBQU0sTUFBTSxZQUFBLDBCQUEwQixNQUFNLFdBQVc7QUFDdkQsWUFBSSxNQUFNLElBQUk7QUFFVixnQkFBTSxRQUFRLE1BQU0sUUFBUSxNQUFNLFlBQVk7QUFDOUMsaUJBQU87O0FBR1gsZUFBTyxNQUFNLE9BQU8sU0FBUyxLQUFLO0FBQ2xDLGVBQU8sTUFBTSxPQUFPLE9BQU8sR0FBRztBQUU5QixZQUFJLE1BQU0sYUFBYTtBQUNuQixnQkFBTSxhQUFhLFlBQUEsVUFBVSxNQUFNLFdBQVc7QUFDOUMsaUJBQU8sTUFBTSxPQUFPLFFBQVEsVUFBVTtlQUNuQztBQUNILGdCQUFNLE9BQU8sUUFBQSxxQkFBcUIsUUFBUSxTQUFTLEtBQUssS0FBSztBQUM3RCxpQkFBTyxNQUFNLE1BQU0sUUFBUSxJQUFJOztBQUduQyxZQUFJLE1BQU0sZ0JBQWdCO0FBQ3RCLGdCQUFNLFVBQVUsWUFBQSwwQkFBMEIsTUFBTSxjQUFjO0FBRTlELGlCQUFPLE1BQU0sT0FBTyxNQUFNLE1BQUs7QUFDL0IsaUJBQU8sSUFBSSxPQUFPLE9BQU8sT0FBTzs7QUFHcEMsZUFBTztNQUNYOztBQXZDSixZQUFBLFVBQUE7Ozs7Ozs7OztBQy9CQSxRQUFBLGNBQUE7QUFFQSxRQUFBLFVBQUE7QUFDQSxRQUFBLFlBQUE7QUFDQSxRQUFBLGNBQUE7QUFDQSxRQUFBLG1DQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FDaEIscUJBQ1EsVUFBQSxnQkFBZ0IsWUFBQSxnQkFBZ0Isc0JBR3ZCLFlBQUEsb0RBR2pCLFlBQUEsWUFBWSxLQUFLO0FBR3JCLFFBQU0sbUJBQW1CO0FBQ3pCLFFBQU0sYUFBYTtBQVFuQixRQUFxQixvQkFBckIsY0FBK0MsaUNBQUEsdUNBQXNDO01BQ2pGLHNCQUFtQjtBQUNmLGVBQU8sWUFBQSxZQUFZO01BQ3ZCO01BRUEsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxZQUFZLE1BQU0sa0JBQWtCLFlBQVc7QUFHckQsWUFBSSxNQUFNLEdBQUcsVUFBVSxLQUFLLENBQUMsWUFBQSwyQkFBMkIsWUFBWTtBQUNoRSxpQkFBTzs7QUFHWCxjQUFNLFNBQVMsUUFBUSxvQkFBb0IsTUFBTSxPQUFPLE1BQU0sUUFBUSxNQUFNLEdBQUcsTUFBTTtBQUNyRixlQUFPLE1BQU0sTUFBTSxPQUFPLENBQUM7QUFFM0IsY0FBTSxRQUFRLFlBQUEsaUJBQWlCO0FBQy9CLGVBQU8sTUFBTSxPQUFPLFNBQVMsS0FBSztBQUVsQyxZQUFJLE1BQU0sYUFBYTtBQUNuQixnQkFBTSxPQUFPLFlBQUEsVUFBVSxNQUFNLFdBQVc7QUFDeEMsaUJBQU8sTUFBTSxPQUFPLFFBQVEsSUFBSTtlQUM3QjtBQUNILGdCQUFNLE9BQU8sUUFBQSxxQkFBcUIsUUFBUSxTQUFTLEdBQUcsS0FBSztBQUMzRCxpQkFBTyxNQUFNLE1BQU0sUUFBUSxJQUFJOztBQUduQyxlQUFPO01BQ1g7O0FBaENKLFlBQUEsVUFBQTs7Ozs7Ozs7O0FDekJBLFFBQUEsVUFBQTtBQUNBLFFBQUEsaUNBQUE7QUFDQSxRQUFBLGNBQUE7QUFFQSxRQUFxQix5QkFBckIsY0FBb0QsK0JBQUEsNkJBQTRCO01BQzVFLFlBQVksWUFBVTtBQUNsQixjQUFNLFVBQVU7TUFDcEI7TUFFQSxlQUFZO0FBQ1IsZUFBTyxZQUFBLFlBQVk7TUFDdkI7TUFFQSw2QkFBMEI7QUFDdEIsZUFBTztNQUNYO01BRUEsaUJBQWM7QUFDVixlQUFPO01BQ1g7TUFFQSxnQkFBYTtBQUNULGVBQU87TUFDWDtNQUVBLGdCQUFhO0FBQ1QsZUFBTyw4SkFBZ0QsWUFBQSxZQUFZO01BQ3ZFO01BRUEsNkJBQTZCLFNBQXlCLE9BQXVCO0FBQ3pFLGNBQU0sYUFBYSxNQUFNLDZCQUE2QixTQUFTLEtBQUs7QUFDcEUsWUFBSSxZQUFZO0FBQ1osY0FBSSxNQUFNLEdBQUcsU0FBUyxzQ0FBUSxHQUFHO0FBQzdCLGtCQUFNLE9BQU8sV0FBVyxJQUFJLE1BQU07QUFDbEMsZ0JBQUksUUFBUSxLQUFLLE9BQU8sSUFBSTtBQUN4Qix5QkFBVyxPQUFPLFFBQVEsV0FBVyxJQUFJLE1BQU0sSUFBSSxFQUFFO0FBQ3JELHlCQUFXLE9BQU8sWUFBWSxRQUFBLFNBQVMsRUFBRTt1QkFDbEMsT0FBTyxHQUFHO0FBQ2pCLHlCQUFXLE9BQU8sWUFBWSxRQUFBLFNBQVMsRUFBRTs7O0FBSWpELGNBQUksTUFBTSxHQUFHLFNBQVMsMkVBQWUsR0FBRztBQUNwQyx1QkFBVyxPQUFPLFlBQVksUUFBQSxTQUFTLEVBQUU7QUFDekMsa0JBQU0sT0FBTyxXQUFXLElBQUksTUFBTTtBQUNsQyxnQkFBSSxRQUFRLEtBQUssUUFBUSxHQUFHO0FBQ3hCLHlCQUFXLE9BQU8sUUFBUSxXQUFXLElBQUksTUFBTSxJQUFJLEVBQUU7OztBQUk3RCxjQUFJLE1BQU0sR0FBRyxTQUFTLDBCQUFNLEdBQUc7QUFDM0IsdUJBQVcsT0FBTyxZQUFZLFFBQUEsU0FBUyxFQUFFO0FBQ3pDLGtCQUFNLE9BQU8sV0FBVyxJQUFJLE1BQU07QUFDbEMsZ0JBQUksT0FBTyxJQUFJO0FBQ1gseUJBQVcsT0FBTyxRQUFRLFdBQVcsSUFBSSxNQUFNLENBQUM7Ozs7QUFLNUQsZUFBTztNQUNYOztBQXhESixZQUFBLFVBQUE7Ozs7Ozs7OztBQ0xBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFDQSxRQUFBLGNBQUE7QUFFQSxRQUFNLFVBQVUsSUFBSSxPQUFPLElBQUksWUFBQSwwRUFBaUQsWUFBQSxZQUFZLEtBQUs7QUFFakcsUUFBcUIsNEJBQXJCLGNBQXVELGlDQUFBLHVDQUFzQztNQUN6RixzQkFBbUI7QUFDZixlQUFPLFlBQUEsWUFBWTtNQUN2QjtNQUVBLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sWUFBWSxZQUFBLGVBQWUsTUFBTSxFQUFFO0FBQ3pDLGNBQU0sa0JBQWtCLFlBQUEsaUJBQWlCLFNBQVM7QUFFbEQsZUFBTyxVQUFBLGtCQUFrQiw0QkFBNEIsUUFBUSxXQUFXLGVBQWU7TUFDM0Y7O0FBZEosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7QUNSQSxRQUFBLGtDQUFBQyxpQkFBQSx1Q0FBQTtBQVFBLFFBQXFCLEtBQXJCLGNBQWdDLGdDQUFBLFFBQTZCO01BQ3pELGlCQUFjO0FBQ1YsZUFBTztNQUNYOztBQUhKLFlBQUEsVUFBQTs7Ozs7Ozs7Ozs7O0FDUkEsUUFBQSxpQ0FBQUMsaUJBQUEsc0NBQUE7QUFRQSxRQUFxQix5QkFBckIsY0FBb0QsK0JBQUEsUUFBNEI7TUFDNUUsaUJBQWM7QUFDVixlQUFPLElBQUksT0FBTywyQkFBc0I7TUFDNUM7O0FBSEosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTkEsUUFBQSxtQ0FBQTtBQUNBLFFBQUEsYUFBQUMsY0FBQSwwQkFBQTtBQUNBLFFBQUEsY0FBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLHlRQUE0RCxZQUFBLFlBQVksaUJBQ3hFLFlBQUEsWUFBWSxLQUFLO0FBR3JCLFFBQXFCLHFCQUFyQixjQUFnRCxpQ0FBQSx1Q0FBc0M7TUFDbEYsc0JBQW1CO0FBQ2YsZUFBTyxZQUFBLFlBQVk7TUFDdkI7TUFFQSxhQUFhLFNBQXVCO0FBQ2hDLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxZQUFZLE1BQU0sR0FBRyxZQUFXO0FBQ3RDLGNBQU0sWUFBWSxRQUFRLHdCQUF1QjtBQUVqRCxnQkFBUTtlQUNDO0FBQ0QsbUJBQU8sV0FBVyxNQUFNLFFBQVEsU0FBUztlQUV4QztBQUNELG1CQUFPLFdBQVcsVUFBVSxRQUFRLFNBQVM7ZUFFNUM7QUFDRCxtQkFBTyxXQUFXLFNBQVMsUUFBUSxTQUFTO2VBRTNDO0FBQ0QsbUJBQU8sV0FBVyxZQUFZLFFBQVEsV0FBVyxDQUFDO2VBRWpEO0FBQ0QsbUJBQU8sV0FBVyxhQUFhLFFBQVEsV0FBVyxDQUFDOztBQUczRCxlQUFPO01BQ1g7O0FBL0JKLFlBQUEsVUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1ZBLFFBQUEsbUNBQUE7QUFDQSxRQUFBLGFBQUFDLGNBQUEsMEJBQUE7QUFDQSxRQUFBLFVBQUE7QUFDQSxRQUFBLFVBQUFDLGlCQUFBLG1CQUFBO0FBQ0EsUUFBQSxjQUFBO0FBRUEsUUFBTSxVQUFVLElBQUksT0FDaEIseXZCQUNPLFlBQUEsWUFBWSxpQkFDbkIsWUFBQSxZQUFZLEtBQUs7QUFFckIsUUFBcUIscUJBQXJCLGNBQWdELGlDQUFBLHVDQUFzQztNQUNsRixzQkFBbUI7QUFDZixlQUFPLFlBQUEsWUFBWTtNQUN2QjtNQUVBLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELFlBQUksYUFBYSxRQUFBLFFBQU0sUUFBUSxPQUFPO0FBQ3RDLGNBQU0sWUFBWSxNQUFNLEdBQUcsWUFBVztBQUN0QyxjQUFNLFlBQVksUUFBUSx3QkFBdUI7QUFFakQsWUFBSSxjQUFjLHdDQUFVO0FBQ3hCLGlCQUFPLFdBQVcsSUFBSSxRQUFRLFNBQVM7O0FBRTNDLFlBQUksY0FBYyxnREFBYSxjQUFjLHdDQUFVO0FBQ25ELGlCQUFPLFdBQVcsUUFBUSxRQUFRLFNBQVM7O0FBRS9DLFlBQUksVUFBVSxTQUFTLGdDQUFPLEtBQUssVUFBVSxTQUFTLDBCQUFNLEdBQUc7QUFDM0QsaUJBQU8sV0FBVyxRQUFRLFFBQVEsU0FBUzs7QUFFL0MsWUFBSSxVQUFVLE1BQU0sYUFBYSxHQUFHO0FBQ2hDLGlCQUFPLFdBQVcsS0FBSyxRQUFRLFNBQVM7O0FBRTVDLFlBQUksVUFBVSxNQUFNLGlCQUFpQixHQUFHO0FBQ3BDLGlCQUFPLFdBQVcsVUFBVSxRQUFRLFNBQVM7O0FBRWpELFlBQUksVUFBVSxNQUFNLG1CQUFtQixHQUFHO0FBQ3RDLGlCQUFPLFdBQVcsaUJBQWlCLFFBQVEsU0FBUzs7QUFFeEQsWUFBSSxVQUFVLE1BQU0sbUJBQW1CLEdBQUc7QUFDdEMsZ0JBQU0sWUFBWSxXQUFXLEtBQUksSUFBSyxLQUFLLElBQUk7QUFDL0MsdUJBQWEsV0FBVyxJQUFJLFdBQVcsS0FBSztBQUM1QyxrQkFBQSxrQkFBa0IsV0FBVyxVQUFVO0FBQ3ZDLG9CQUFVLE1BQU0sUUFBUSxDQUFDOztBQUU3QixZQUFJLFVBQVUsTUFBTSxhQUFhLEtBQUssVUFBVSxTQUFTLGdDQUFPLEdBQUc7QUFDL0QsaUJBQU8sV0FBVyxTQUFTLFFBQVEsU0FBUzs7QUFFaEQsZUFBTztNQUNYOztBQTFDSixZQUFBLFVBQUE7Ozs7Ozs7OztBQ1ZBLFFBQUEsY0FBQTtBQUNBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFDQSxRQUFBLFVBQUE7QUFFQSxRQUFNLFVBQVUsSUFBSSxPQUNoQixvV0FHUSxVQUFBLGdCQUFnQixZQUFBLGtCQUFrQiwyTkFHbkMsWUFBQSxZQUFZLGlCQUNuQixZQUFBLFlBQVksS0FBSztBQUdyQixRQUFNLGVBQWU7QUFDckIsUUFBTSxnQkFBZ0I7QUFDdEIsUUFBTSxnQkFBZ0I7QUFFdEIsUUFBcUIsa0JBQXJCLGNBQTZDLGlDQUFBLHVDQUFzQztNQUMvRSxlQUFZO0FBQ1IsZUFBTztNQUNYO01BRUEsc0JBQW1CO0FBQ2YsZUFBTyxZQUFBLFlBQVk7TUFDdkI7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sWUFBWSxNQUFNLGVBQWUsWUFBVztBQUNsRCxjQUFNLFNBQVMsWUFBQSxtQkFBbUI7QUFDbEMsY0FBTSxTQUFTLE1BQU07QUFDckIsY0FBTSxVQUFVLE1BQU07QUFDdEIsWUFBSSxlQUFlLFVBQVU7QUFDN0IsdUJBQWUsZ0JBQWdCO0FBQy9CLHVCQUFlLGFBQWEsWUFBVztBQUV2QyxZQUFJLFdBQVc7QUFDZixZQUFJLGdCQUFnQixnREFBYSxnQkFBZ0IsZ0RBQWEsZ0JBQWdCLDhDQUFXO0FBQ3JGLHFCQUFXO21CQUVYLGdCQUFnQiw0REFDaEIsZ0JBQWdCLDREQUNoQixnQkFBZ0IsNERBQ2hCLGdCQUFnQixnRUFDbEI7QUFDRSxxQkFBVzttQkFDSixnQkFBZ0IsOEJBQVUsZ0JBQWdCLHdCQUFTLGdCQUFnQiw0QkFBUTtBQUNsRixxQkFBVzs7QUFHZixjQUFNLE9BQU8sUUFBQSxlQUFlLFFBQVEsU0FBUyxRQUFRLFFBQVE7QUFDN0QsZUFBTyxRQUNGLHdCQUF1QixFQUN2QixPQUFPLFdBQVcsTUFBTSxFQUN4QixNQUFNLE9BQU8sS0FBSyxLQUFJLENBQUUsRUFDeEIsTUFBTSxTQUFTLEtBQUssTUFBSyxJQUFLLENBQUMsRUFDL0IsTUFBTSxRQUFRLEtBQUssS0FBSSxDQUFFO01BQ2xDOztBQXZDSixZQUFBLFVBQUE7Ozs7Ozs7Ozs7OztBQ3RCQSxRQUFBLGNBQUE7QUFFQSxRQUFBLFlBQUE7QUFDQSxRQUFBLFVBQUFDLGlCQUFBLG1CQUFBO0FBQ0EsUUFBQSxtQ0FBQTtBQUNBLFFBQUEsWUFBQTtBQUVBLFFBQU0sVUFBVSxJQUFJLE9BQ2hCLDJUQUFzRSxVQUFBLGdCQUNsRSxZQUFBLG9CQUFvQixhQUNYLFlBQUEsWUFBWSxpQkFDekIsWUFBQSxZQUFZLEtBQUs7QUFHckIsUUFBTSxzQkFBc0I7QUFDNUIsUUFBTSxzQkFBc0I7QUFFNUIsUUFBcUIsNkJBQXJCLGNBQXdELGlDQUFBLHVDQUFzQztNQUMxRixzQkFBbUI7QUFDZixlQUFPLFlBQUEsWUFBWTtNQUN2QjtNQUVBLGVBQVk7QUFDUixlQUFPO01BQ1g7TUFFQSxhQUFhLFNBQXlCLE9BQXVCO0FBQ3pELGNBQU0sV0FBVyxNQUFNLHFCQUFxQixZQUFXO0FBQ3ZELGNBQU0sV0FBVyxNQUFNLHFCQUFxQixZQUFXO0FBQ3ZELGNBQU0sV0FBVyxZQUFBLHFCQUFxQjtBQUV0QyxZQUFJLFlBQVkseUVBQWtCLFlBQVksaUVBQWU7QUFDekQsZ0JBQU0sWUFBWSxDQUFBO0FBQ2xCLG9CQUFVLFlBQVk7QUFDdEIsaUJBQU8sVUFBQSxrQkFBa0IsNEJBQTRCLFFBQVEsV0FBVyxTQUFTOztBQUdyRixZQUFJLFlBQVksdURBQWUsWUFBWSwyREFBYztBQUNyRCxnQkFBTSxZQUFZLENBQUE7QUFDbEIsb0JBQVUsWUFBWTtBQUN0QixpQkFBTyxVQUFBLGtCQUFrQiw0QkFBNEIsUUFBUSxXQUFXLFNBQVM7O0FBR3JGLGNBQU0sYUFBYSxRQUFRLHdCQUF1QjtBQUNsRCxZQUFJLE9BQU8sUUFBQSxRQUFNLFFBQVEsVUFBVSxPQUFPO0FBRzFDLFlBQUksU0FBUyxNQUFNLE9BQU8sR0FBRztBQUN6QixpQkFBTyxLQUFLLElBQUksQ0FBQyxLQUFLLElBQUksR0FBRyxHQUFHLEdBQUc7QUFDbkMscUJBQVcsTUFBTSxPQUFPLEtBQUssS0FBSSxDQUFFO0FBQ25DLHFCQUFXLE1BQU0sU0FBUyxLQUFLLE1BQUssSUFBSyxDQUFDO0FBQzFDLHFCQUFXLE1BQU0sUUFBUSxLQUFLLEtBQUksQ0FBRTttQkFJL0IsU0FBUyxNQUFNLFFBQVEsR0FBRztBQUMvQixpQkFBTyxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUksSUFBSyxHQUFHLEdBQUc7QUFDckMscUJBQVcsTUFBTSxPQUFPLEtBQUssS0FBSSxDQUFFO0FBQ25DLHFCQUFXLE9BQU8sUUFBUSxLQUFLLEtBQUksQ0FBRTtBQUNyQyxxQkFBVyxPQUFPLFNBQVMsS0FBSyxNQUFLLElBQUssQ0FBQzttQkFJdEMsU0FBUyxNQUFNLE9BQU8sR0FBRztBQUM5QixpQkFBTyxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUksSUFBSyxHQUFHLEdBQUc7QUFDckMsaUJBQU8sS0FBSyxJQUFJLENBQUMsS0FBSyxNQUFLLEdBQUksT0FBTztBQUV0QyxxQkFBVyxNQUFNLE9BQU8sS0FBSyxLQUFJLENBQUU7QUFDbkMscUJBQVcsTUFBTSxTQUFTLEtBQUssTUFBSyxJQUFLLENBQUM7QUFDMUMscUJBQVcsT0FBTyxRQUFRLEtBQUssS0FBSSxDQUFFOztBQUd6QyxlQUFPO01BQ1g7O0FBeERKLFlBQUEsVUFBQTs7Ozs7Ozs7O0FDakJBLFFBQUEsY0FBQTtBQUVBLFFBQUEsWUFBQTtBQUNBLFFBQUEsbUNBQUE7QUFDQSxRQUFBLGNBQUE7QUFFQSxRQUFNLFVBQVUsSUFBSSxPQUNoQix5UEFBMkQsWUFBQSxzQkFBc0IsWUFBQSxZQUFZLGlCQUM3RixZQUFBLFlBQVksS0FBSztBQUdyQixRQUFxQix1Q0FBckIsY0FBa0UsaUNBQUEsdUNBQXNDO01BQ3BHLHNCQUFtQjtBQUNmLGVBQU8sWUFBQSxZQUFZO01BQ3ZCO01BRUEsZUFBWTtBQUNSLGVBQU87TUFDWDtNQUVBLGFBQWEsU0FBeUIsT0FBdUI7QUFDekQsY0FBTSxTQUFTLE1BQU0sR0FBRyxZQUFXO0FBQ25DLFlBQUksWUFBWSxZQUFBLGVBQWUsTUFBTSxFQUFFO0FBQ3ZDLGdCQUFRO2VBQ0M7ZUFDQTtlQUNBO0FBQ0Qsd0JBQVksWUFBQSxpQkFBaUIsU0FBUztBQUN0Qzs7QUFHUixlQUFPLFVBQUEsa0JBQWtCLDRCQUE0QixRQUFRLFdBQVcsU0FBUztNQUNyRjs7QUFyQkosWUFBQSxVQUFBOzs7Ozs7Ozs7Ozs7O0FDTEEsUUFBQSxpQ0FBQUMsaUJBQUEsc0NBQUE7QUFDQSxRQUFBLGtDQUFBQSxpQkFBQSx1Q0FBQTtBQUNBLFFBQUEsc0JBQUFBLGlCQUFBLDJCQUFBO0FBQ0EsUUFBQSwyQkFBQUEsaUJBQUEsZ0NBQUE7QUFDQSxRQUFBLDhCQUFBQSxpQkFBQSxtQ0FBQTtBQUNBLFFBQUEsNEJBQUFBLGlCQUFBLGlDQUFBO0FBQ0EsUUFBQSwyQkFBQUEsaUJBQUEsZ0NBQUE7QUFFQSxRQUFBLG1CQUFBO0FBQ0EsUUFBQSx1QkFBQUEsaUJBQUEsNEJBQUE7QUFDQSxRQUFBLHVCQUFBQSxpQkFBQSw0QkFBQTtBQUNBLFFBQUEsb0JBQUFBLGlCQUFBLHlCQUFBO0FBQ0EsUUFBQSwrQkFBQUEsaUJBQUEsb0NBQUE7QUFHQSxRQUFBLFdBQUE7QUFDQSxRQUFBLDBCQUFBQSxpQkFBQSwrQkFBQTtBQUNBLFFBQUEseUNBQUFBLGlCQUFBLDhDQUFBO0FBS2EsWUFBQSxTQUFTLElBQUksU0FBQSxPQUFPLDBCQUF5QixDQUFFO0FBSy9DLFlBQUEsU0FBUyxJQUFJLFNBQUEsT0FBTyxvQkFBb0IsSUFBSSxDQUFDO0FBSzFELGFBQWdCLE1BQU1DLE9BQWMsS0FBWSxRQUFzQjtBQUNsRSxhQUFPLFFBQUEsT0FBTyxNQUFNQSxPQUFNLEtBQUssTUFBTTtJQUN6QztBQUZBLFlBQUEsUUFBQTtBQU9BLGFBQWdCQyxXQUFVRCxPQUFjLEtBQVksUUFBc0I7QUFDdEUsYUFBTyxRQUFBLE9BQU8sVUFBVUEsT0FBTSxLQUFLLE1BQU07SUFDN0M7QUFGQSxZQUFBLFlBQUFDO0FBUUEsYUFBZ0IsNEJBQXlCO0FBQ3JDLFlBQU0sU0FBUyxvQkFBb0IsS0FBSztBQUN4QyxhQUFPLFFBQVEsUUFBUSxJQUFJLHFCQUFBLFFBQWtCLENBQUU7QUFDL0MsYUFBTyxRQUFRLFFBQVEsSUFBSSxxQkFBQSxRQUFrQixDQUFFO0FBQy9DLGFBQU8sUUFBUSxRQUFRLElBQUksb0JBQUEsUUFBaUIsQ0FBRTtBQUM5QyxhQUFPLFFBQVEsUUFBUSxJQUFJLDZCQUFBLFFBQTBCLENBQUU7QUFDdkQsYUFBTyxRQUFRLFFBQVEsSUFBSSx1Q0FBQSxRQUFvQyxDQUFFO0FBQ2pFLGFBQU87SUFDWDtBQVJBLFlBQUEsNEJBQUE7QUFlQSxhQUFnQixvQkFBb0IsYUFBYSxNQUFJO0FBQ2pELGFBQU8saUJBQUEsMkJBQ0g7UUFDSSxTQUFTO1VBQ0wsSUFBSSx3QkFBQSxRQUFzQixJQUFJO1VBQzlCLElBQUksK0JBQUEsUUFBNEI7VUFDaEMsSUFBSSxnQ0FBQSxRQUE2QjtVQUNqQyxJQUFJLGtCQUFBLFFBQWU7VUFDbkIsSUFBSSx5QkFBQSxRQUF1QixVQUFVO1VBQ3JDLElBQUksNEJBQUEsUUFBeUI7O1FBRWpDLFVBQVUsQ0FBQyxJQUFJLHlCQUFBLFFBQXNCLEdBQUksSUFBSSwwQkFBQSxRQUF1QixDQUFFO1NBRTFFLFVBQVU7SUFFbEI7QUFmQSxZQUFBLHNCQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25FQSxRQUFBLEtBQUFDLGNBQUEsWUFBQTtBQUdTLFlBQUEsS0FBQTtBQUZULFFBQUEsV0FBQTtBQUVhLFdBQUEsZUFBQSxTQUFBLFVBQUEsRUFBQSxZQUFBLE1BQUEsS0FBQSxXQUFBO0FBQUEsYUFGSixTQUFBO0lBQU0sRUFBQSxDQUFBO0FBOEZmLFFBQVk7QUFBWixLQUFBLFNBQVlDLFdBQVE7QUFDaEIsTUFBQUEsVUFBQUEsVUFBQSxRQUFBLEtBQUE7QUFDQSxNQUFBQSxVQUFBQSxVQUFBLFFBQUEsS0FBQTtJQUNKLEdBSFksV0FBQSxRQUFBLGFBQUEsUUFBQSxXQUFRLENBQUEsRUFBQTtBQU1wQixRQUFBLEtBQUFELGNBQUEsWUFBQTtBQU9TLFlBQUEsS0FBQTtBQU5ULFFBQUEsS0FBQUEsY0FBQSxZQUFBO0FBTWEsWUFBQSxLQUFBO0FBTGIsUUFBQSxLQUFBQSxjQUFBLFlBQUE7QUFLaUIsWUFBQSxLQUFBO0FBSmpCLFFBQUEsS0FBQUEsY0FBQSxZQUFBO0FBSXFCLFlBQUEsS0FBQTtBQUhyQixRQUFBLEtBQUFBLGNBQUEsWUFBQTtBQUd5QixZQUFBLEtBQUE7QUFGekIsUUFBQSxLQUFBQSxjQUFBLFlBQUE7QUFFNkIsWUFBQSxLQUFBO0FBRDdCLFFBQUEsS0FBQUEsY0FBQSxZQUFBO0FBQ2lDLFlBQUEsS0FBQTtBQUtwQixZQUFBLFNBQVMsR0FBRztBQUtaLFlBQUEsU0FBUyxHQUFHO0FBS3pCLGFBQWdCLE1BQU1FLE9BQWMsS0FBK0IsUUFBc0I7QUFDckYsYUFBTyxRQUFBLE9BQU8sTUFBTUEsT0FBTSxLQUFLLE1BQU07SUFDekM7QUFGQSxZQUFBLFFBQUE7QUFPQSxhQUFnQkMsV0FBVUQsT0FBYyxLQUErQixRQUFzQjtBQUN6RixhQUFPLFFBQUEsT0FBTyxVQUFVQSxPQUFNLEtBQUssTUFBTTtJQUM3QztBQUZBLFlBQUEsWUFBQUM7Ozs7O0FDbklBO0FBQUE7QUFBQTtBQUNBLFlBQVEsYUFBYTtBQUNyQixRQUFJO0FBQ0osS0FBQyxTQUFVQyxZQUFXO0FBQ2xCLE1BQUFBLFdBQVUsU0FBUztBQUNuQixNQUFBQSxXQUFVLFFBQVE7QUFDbEIsTUFBQUEsV0FBVSxTQUFTO0FBQ25CLE1BQUFBLFdBQVUsU0FBUztBQUFBLElBQ3ZCLEdBQUcsWUFBWSxRQUFRLGNBQWMsUUFBUSxZQUFZLENBQUMsRUFBRTtBQUM1RCxRQUFJO0FBQ0osS0FBQyxTQUFVQyx1QkFBc0I7QUFDN0IsTUFBQUEsc0JBQXFCLHNCQUFzQjtBQUMzQyxNQUFBQSxzQkFBcUIsdUJBQXVCO0FBQUEsSUFDaEQsR0FBRyx1QkFBdUIsUUFBUSx5QkFBeUIsUUFBUSx1QkFBdUIsQ0FBQyxFQUFFO0FBQzdGLFFBQUk7QUFDSixLQUFDLFNBQVVDLFNBQVE7QUFDZixNQUFBQSxRQUFPLGdCQUFnQjtBQUN2QixNQUFBQSxRQUFPLGNBQWM7QUFDckIsTUFBQUEsUUFBTywwQkFBMEI7QUFDakMsTUFBQUEsUUFBTyxTQUFTO0FBQ2hCLE1BQUFBLFFBQU8sYUFBYTtBQUFBLElBQ3hCLEdBQUcsU0FBUyxRQUFRLFdBQVcsUUFBUSxTQUFTLENBQUMsRUFBRTtBQUFBO0FBQUE7OztBQ3JCbkQ7QUFBQTtBQUFBO0FBQ0EsWUFBUSxhQUFhO0FBQ3JCLFFBQUksVUFBVTtBQUNkLFlBQVEsc0JBQXNCO0FBQUEsTUFDMUIsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsSUFBSTtBQUFBLElBQ1I7QUFDQSxZQUFRLGVBQWU7QUFBQSxNQUNuQixnQkFBZ0I7QUFBQSxRQUNaLEVBQUUsTUFBTSxRQUFRLE9BQU8sV0FBVztBQUFBLFFBQ2xDO0FBQUEsVUFDSSxNQUFNLFFBQVEsT0FBTztBQUFBLFVBQ3JCLE9BQU8sUUFBUSxxQkFBcUI7QUFBQSxRQUN4QztBQUFBLE1BQ0o7QUFBQSxNQUNBLGlCQUFpQjtBQUFBLFFBQ2IsRUFBRSxNQUFNLFFBQVEsT0FBTyxXQUFXO0FBQUEsUUFDbEM7QUFBQSxVQUNJLE1BQU0sUUFBUSxPQUFPO0FBQUEsVUFDckIsT0FBTyxRQUFRLHFCQUFxQjtBQUFBLFFBQ3hDO0FBQUEsUUFDQSxFQUFFLE1BQU0sUUFBUSxPQUFPLFVBQVUsT0FBTyxRQUFRLFVBQVUsSUFBSTtBQUFBLE1BQ2xFO0FBQUEsTUFDQSxnQkFBZ0I7QUFBQSxRQUNaLEVBQUUsTUFBTSxRQUFRLE9BQU8sVUFBVSxPQUFPLFFBQVEsVUFBVSxJQUFJO0FBQUEsUUFDOUQsRUFBRSxNQUFNLFFBQVEsT0FBTyxVQUFVLE9BQU8sUUFBUSxVQUFVLEdBQUc7QUFBQSxRQUM3RCxFQUFFLE1BQU0sUUFBUSxPQUFPLFVBQVUsT0FBTyxRQUFRLFVBQVUsSUFBSTtBQUFBLE1BQ2xFO0FBQUEsTUFDQSx1QkFBdUI7QUFBQSxRQUNuQixFQUFFLE1BQU0sUUFBUSxPQUFPLFVBQVUsT0FBTyxRQUFRLFVBQVUsSUFBSTtBQUFBLFFBQzlELEVBQUUsTUFBTSxRQUFRLE9BQU8sVUFBVSxPQUFPLFFBQVEsVUFBVSxHQUFHO0FBQUEsUUFDN0QsRUFBRSxNQUFNLFFBQVEsT0FBTyxVQUFVLE9BQU8sUUFBUSxVQUFVLElBQUk7QUFBQSxRQUM5RDtBQUFBLFVBQ0ksTUFBTSxRQUFRLE9BQU87QUFBQSxVQUNyQixPQUFPLFFBQVEscUJBQXFCO0FBQUEsUUFDeEM7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ3ZDQSxJQUFBQyxpQkFBQTtBQUFBO0FBQUE7QUFDQSxZQUFRLGFBQWE7QUFDckIsUUFBSSxVQUFVO0FBQ2QsWUFBUSx3QkFBd0I7QUFBQSxNQUM1QixLQUFLLFFBQVEscUJBQXFCO0FBQUEsTUFDbEMsS0FBSyxRQUFRLHFCQUFxQjtBQUFBLElBQ3RDO0FBQ0EsWUFBUSxZQUFZO0FBQUEsTUFDaEIsS0FBSyxRQUFRLFVBQVU7QUFBQSxNQUN2QixJQUFJLFFBQVEsVUFBVTtBQUFBLE1BQ3RCLEtBQUssUUFBUSxVQUFVO0FBQUEsTUFDdkIsS0FBSyxRQUFRLFVBQVU7QUFBQSxJQUMzQjtBQUNBLFlBQVEsYUFBYSxJQUFJLElBQUk7QUFBQSxNQUN6QjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0osRUFBRSxJQUFJLFNBQVUsV0FBVztBQUFFLGFBQU8sT0FBTyxjQUFjLFNBQVM7QUFBQSxJQUFHLENBQUMsQ0FBQztBQUN2RSxZQUFRLDhCQUE4QixPQUFPLGNBQWMsRUFBTTtBQUNqRSxZQUFRLG9CQUFvQixPQUFPLGNBQWMsRUFBTTtBQUN2RCxZQUFRLE1BQU0sT0FBTyxjQUFjLEVBQU07QUFDekMsWUFBUSxtQkFBbUIsT0FBTyxjQUFjLEVBQU07QUFBQTtBQUFBOzs7QUN0QnREO0FBQUE7QUFBQTtBQUNBLFFBQUlDLFlBQVksV0FBUSxRQUFLLFlBQWEsV0FBWTtBQUNsRCxNQUFBQSxZQUFXLE9BQU8sVUFBVSxTQUFTLEdBQUc7QUFDcEMsaUJBQVMsR0FBRyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVEsSUFBSSxHQUFHLEtBQUs7QUFDakQsY0FBSSxVQUFVO0FBQ2QsbUJBQVMsS0FBSztBQUFHLGdCQUFJLE9BQU8sVUFBVSxlQUFlLEtBQUssR0FBRyxDQUFDO0FBQzFELGdCQUFFLEtBQUssRUFBRTtBQUFBLFFBQ2pCO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFDQSxhQUFPQSxVQUFTLE1BQU0sTUFBTSxTQUFTO0FBQUEsSUFDekM7QUFDQSxZQUFRLGFBQWE7QUFDckIsUUFBSSxVQUFVO0FBQ2QsUUFBSSxVQUFVO0FBQ2QsWUFBUSxlQUFlLFNBQVUsTUFBTSxPQUFPLGlCQUFpQjtBQUFFLGFBQVE7QUFBQSxRQUNyRSxPQUFPQSxVQUFTLEVBQUUsS0FBVyxHQUFJLFVBQVUsT0FBTyxFQUFFLE1BQWEsSUFBSSxDQUFDLENBQUU7QUFBQSxRQUN4RTtBQUFBLE1BQ0o7QUFBQSxJQUFJO0FBQ0osWUFBUSxhQUFhLFNBQVUsWUFBWTtBQUN2QyxVQUFJLFdBQVcsV0FBVztBQUMxQixlQUFTLElBQUksR0FBRyxJQUFJLFdBQVcsUUFBUSxLQUFLLEdBQUc7QUFDM0MsWUFBSSxTQUFTLFdBQVc7QUFDeEIsWUFBSSxXQUFXLFFBQVEsS0FBSztBQUN4QixxQkFBVztBQUNYO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxhQUFPLFFBQVEsYUFBYSxRQUFRLE9BQU8sU0FBUyxXQUFXLE1BQU0sR0FBRyxRQUFRLEdBQUcsV0FBVyxNQUFNLFdBQVcsQ0FBQyxDQUFDO0FBQUEsSUFDckg7QUFDQSxZQUFRLHNCQUFzQixTQUFVLFlBQVk7QUFDaEQsVUFBSSxrQkFBa0I7QUFDdEIsVUFBSSxRQUFRO0FBQ1osVUFBSSxXQUFXO0FBQ2YsZUFBUyxJQUFJLEdBQUcsSUFBSSxXQUFXLFFBQVEsS0FBSyxHQUFHO0FBQzNDLFlBQUksT0FBTyxXQUFXO0FBQ3RCLFlBQUksYUFBYSxNQUFNO0FBQ25CLGNBQUksU0FBUyxRQUFRLDZCQUE2QjtBQUM5QyxnQkFBSSxpQkFBaUI7QUFDakIsc0JBQVEsTUFBTSxNQUFNLEVBQUUsSUFBSSxRQUFRO0FBQUEsWUFDdEMsT0FDSztBQUNELHlCQUFXO0FBQUEsWUFDZjtBQUFBLFVBQ0osT0FDSztBQUNELGdCQUFJLFNBQVMsUUFBUSxrQkFBa0I7QUFDbkMsZ0NBQWtCO0FBQUEsWUFDdEIsT0FDSztBQUNELGdDQUFrQjtBQUFBLFlBQ3RCO0FBQ0Esb0JBQVEsU0FBUztBQUFBLFVBQ3JCO0FBQUEsUUFDSixPQUNLO0FBQ0QsY0FBSSxDQUFDLFFBQVEsV0FBVyxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEsc0JBQXNCLE9BQU87QUFDdkUsa0JBQU0sSUFBSSxNQUFNLDJCQUEyQixPQUFPLG9DQUFvQztBQUFBLFVBQzFGO0FBQ0E7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLFVBQUksYUFBYSxNQUFNO0FBQ25CLGNBQU0sSUFBSSxNQUFNLDRDQUE0QyxRQUFRLDhCQUE4QixZQUFZO0FBQUEsTUFDbEg7QUFDQSxhQUFPLFFBQVEsYUFBYSxRQUFRLE9BQU8sWUFBWSxPQUFPLFdBQVcsTUFBTSxXQUFXLENBQUMsQ0FBQztBQUFBLElBQ2hHO0FBQUE7QUFBQTs7O0FDbEVBO0FBQUE7QUFBQTtBQUNBLFlBQVEsYUFBYTtBQUNyQixRQUFJLFVBQVU7QUFDZCxRQUFJLFVBQVU7QUFDZCxRQUFJLFVBQVU7QUFDZCxZQUFRLE1BQU0sU0FBVSxZQUFZO0FBQ2hDLFVBQUksYUFBYTtBQUNqQixVQUFJLFdBQVc7QUFDZixVQUFJLHNCQUFzQjtBQUUxQixlQUFTLElBQUksR0FBRyxJQUFJLFdBQVcsUUFBUSxLQUFLLEdBQUc7QUFDM0MsWUFBSSxPQUFPLFdBQVc7QUFFdEIsWUFBSSxlQUFlLE1BQU07QUFDckIsY0FBSSxDQUFDLFFBQVEsV0FBVyxJQUFJLElBQUksR0FBRztBQUMvQixnQkFBSSxpQkFBaUIsUUFBUSxzQkFBc0I7QUFDbkQsZ0JBQUksZ0JBQWdCO0FBQ2hCLGtCQUFJLFdBQVcsV0FBVyxJQUFJO0FBQzlCLGtCQUFJLG1CQUFtQixRQUFRLHFCQUFxQixxQkFDaEQsWUFDQSxDQUFDLFFBQVEsV0FBVyxJQUFJLFFBQVEsS0FDaEMsYUFBYSxRQUFRLHFCQUFxQixtQkFBbUI7QUFDN0Qsc0JBQU0sSUFBSSxNQUFNLDJCQUEyQixXQUFXLHlGQUF5RjtBQUFBLGNBQ25KO0FBQ0EscUJBQU8sUUFBUSxhQUFhLFFBQVEsT0FBTyxzQkFBc0IsUUFBUSxzQkFBc0IsT0FBTyxXQUFXLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFBQSxZQUNqSTtBQUVBLGdCQUFJLFNBQVMsUUFBUSw2QkFBNkI7QUFDOUMscUJBQU8sUUFBUSxvQkFBb0IsV0FBVyxNQUFNLElBQUksQ0FBQyxDQUFDO0FBQUEsWUFDOUQ7QUFFQSxnQkFBSSxTQUFTLFFBQVEsbUJBQW1CO0FBQ3BDLHFCQUFPLFFBQVEsV0FBVyxXQUFXLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFBQSxZQUNyRDtBQUNBLHlCQUFhO0FBQUEsVUFDakI7QUFBQSxRQUNKLE9BQ0s7QUFFRCxjQUFJLFFBQVEsV0FBVyxJQUFJLElBQUksS0FBSyxRQUFRLHNCQUFzQixPQUFPO0FBQ3JFLHVCQUFXO0FBQ1gsa0NBQXNCO0FBQ3RCO0FBQUEsVUFDSixPQUNLO0FBQ0QsZ0JBQUksU0FBUyxRQUFRLCtCQUNqQixTQUFTLFFBQVEsbUJBQW1CO0FBQ3BDLG9CQUFNLElBQUksTUFBTSwyQkFBMkIsSUFBSTtBQUFBLFlBQ25EO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUEsVUFBSSxlQUFlLE1BQU07QUFDckIsbUJBQVksYUFBYSxRQUFRLGFBQWEsU0FBUyxXQUFXLFdBQVc7QUFDN0UsWUFBSSxRQUFRLFdBQVcsTUFBTSxZQUFZLFFBQVE7QUFDakQsWUFBSSxrQkFBa0IsV0FBVyxNQUFNLFFBQVE7QUFDL0MsWUFBSSxRQUFRLFVBQVUsUUFBUTtBQUMxQixjQUFJLHVCQUF1QixDQUFDLFFBQVEsV0FBVyxJQUFJLG1CQUFtQixHQUFHO0FBQ3JFLGtCQUFNLElBQUksTUFBTSwyQkFBMkIsc0JBQXNCLGtEQUFrRDtBQUFBLFVBQ3ZIO0FBQ0EsaUJBQU8sUUFBUSxhQUFhLFFBQVEsT0FBTyxVQUFVLFFBQVEsVUFBVSxRQUFRLGVBQWU7QUFBQSxRQUNsRyxPQUNLO0FBQ0QsaUJBQU8sUUFBUSxhQUFhLFFBQVEsT0FBTyxZQUFZLE9BQU8sZUFBZTtBQUFBLFFBQ2pGO0FBQUEsTUFDSjtBQUVBLGFBQU8sUUFBUSxhQUFhLFFBQVEsT0FBTyxLQUFLLE1BQU0sRUFBRTtBQUFBLElBQzVEO0FBQUE7QUFBQTs7O0FDckVBLElBQUFDLGlCQUFBO0FBQUE7QUFBQTtBQUNBLFFBQUlDLGtCQUFrQixXQUFRLFFBQUssa0JBQW1CLFdBQVk7QUFDOUQsZUFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssVUFBVSxRQUFRLElBQUksSUFBSTtBQUFLLGFBQUssVUFBVSxHQUFHO0FBQzdFLGVBQVMsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSTtBQUN6QyxpQkFBUyxJQUFJLFVBQVUsSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLFFBQVEsSUFBSSxJQUFJLEtBQUs7QUFDMUQsWUFBRSxLQUFLLEVBQUU7QUFDakIsYUFBTztBQUFBLElBQ1g7QUFDQSxZQUFRLGFBQWE7QUFDckIsUUFBSSxRQUFRO0FBQ1osUUFBSSxVQUFVO0FBQ2QsUUFBSSxVQUFVO0FBQ2QsWUFBUSxvQkFBb0IsU0FBVSxZQUFZO0FBQzlDLFVBQUksc0JBQXNCO0FBQzFCLGFBQU8sU0FBVSxhQUFhLFlBQVk7QUFDdEMsWUFBSSxlQUFlLFFBQVE7QUFBRSx1QkFBYTtBQUFBLFFBQU87QUFDakQsZUFBTyxNQUFNO0FBQ1QsY0FBSSxLQUFLLE1BQU0sSUFBSSxtQkFBbUIsR0FBRyxRQUFRLEdBQUcsT0FBTyxrQkFBa0IsR0FBRztBQUNoRixnQ0FBc0I7QUFDdEIsY0FBSSxNQUFNLFNBQVMsUUFBUSxPQUFPLFNBQVM7QUFDdkMsb0JBQVEsY0FBYyxPQUFPLGFBQWEsVUFBVTtBQUNwRCxtQkFBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxZQUFRLFdBQVcsU0FBVSxjQUFjLFFBQVE7QUFDL0MsVUFBSSxZQUFZLGFBQWEsUUFBUSxhQUFhLGVBQWU7QUFDakUsVUFBSSxlQUFlLFVBQVUsVUFBVSxRQUFRLFVBQVU7QUFDekQsVUFBSSxjQUFjO0FBQ2Qsb0JBQVksYUFBYSxRQUFRLGFBQWEsY0FBYztBQUFBLE1BQ2hFO0FBQ0EsVUFBSSxRQUFRLFVBQVUsU0FBUyxRQUFRLE9BQU8sdUJBQ3hDLE9BQU8sY0FBYyxJQUFJLElBQ3pCLENBQUMsU0FBUztBQUNoQixhQUFPLGVBQ0RBLGdCQUFlLE9BQU8sQ0FBQyxFQUFFLE1BQU0sUUFBUSxPQUFPLFVBQVUsT0FBTyxRQUFRLFVBQVUsSUFBSSxDQUFDLENBQUMsSUFBSTtBQUFBLElBQ3JHO0FBQ0EsWUFBUSxpQ0FBaUMsU0FBVSxrQkFBa0IsY0FBYztBQUMvRSxhQUFPLFFBQVEsb0JBQW9CLHFCQUFxQixRQUFRLG9CQUFvQjtBQUFBLElBQ3hGO0FBQ0EsWUFBUSxnQkFBZ0IsU0FBVSxPQUFPLGFBQWEsWUFBWTtBQUM5RCxVQUFJLGVBQWUsUUFBUTtBQUFFLHFCQUFhO0FBQUEsTUFBTztBQUNqRCxVQUFJLE1BQU0sU0FBUyxRQUFRLE9BQU8sS0FBSztBQUNuQyxZQUFJLFlBQVk7QUFDWjtBQUFBLFFBQ0o7QUFDQSxjQUFNLElBQUksTUFBTSw4QkFBOEI7QUFBQSxNQUNsRDtBQUNBLGVBQVMsS0FBSyxHQUFHLGdCQUFnQixhQUFhLEtBQUssY0FBYyxRQUFRLE1BQU07QUFDM0UsWUFBSSxhQUFhLGNBQWM7QUFDL0IsWUFBSSxXQUFXLFNBQVMsTUFBTSxNQUFNO0FBQ2hDLGNBQUksQ0FBQyxXQUFXLFNBQVMsV0FBVyxVQUFVLE1BQU0sT0FBTztBQUN2RDtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLFlBQU0sSUFBSSxVQUFVLGVBQWU7QUFBQSxJQUN2QztBQUFBO0FBQUE7OztBQzFEQTtBQUFBO0FBQUE7QUFDQSxRQUFJQyxrQkFBa0IsV0FBUSxRQUFLLGtCQUFtQixXQUFZO0FBQzlELGVBQVMsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLFVBQVUsUUFBUSxJQUFJLElBQUk7QUFBSyxhQUFLLFVBQVUsR0FBRztBQUM3RSxlQUFTLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLElBQUk7QUFDekMsaUJBQVMsSUFBSSxVQUFVLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxRQUFRLElBQUksSUFBSSxLQUFLO0FBQzFELFlBQUUsS0FBSyxFQUFFO0FBQ2pCLGFBQU87QUFBQSxJQUNYO0FBQ0EsWUFBUSxhQUFhO0FBQ3JCLFFBQUksVUFBVTtBQUNkLFFBQUksVUFBVTtBQUNkLFFBQUksVUFBVTtBQUVkLFlBQVEsUUFBUSxTQUFVLFlBQVk7QUFDbEMsVUFBSSxPQUFPLGVBQWUsVUFBVTtBQUNoQyxjQUFNLElBQUksTUFBTSxrQ0FBa0MsT0FBTyxVQUFVO0FBQUEsTUFDdkU7QUFHQSxVQUFJLGVBQWUsUUFBUSxrQkFBa0IsVUFBVTtBQUN2RCxhQUFPLGNBQWMsWUFBWTtBQUFBLElBQ3JDO0FBRUEsUUFBSSxnQkFBZ0IsU0FBVSxjQUFjLFFBQVE7QUFDaEQsVUFBSSxXQUFXLFFBQVE7QUFBRSxpQkFBUztBQUFBLE1BQU87QUFFekMsVUFBSSxTQUFTQSxnQkFBZSxRQUFRLFNBQVMsY0FBYyxhQUFhLENBQUM7QUFDekUsVUFBSSxZQUFZLENBQUM7QUFDakIsYUFBTyxNQUFNO0FBQ1QsWUFBSSxjQUFjLFNBQ1osUUFBUSxhQUFhLHdCQUNyQixRQUFRLGFBQWE7QUFFM0IsWUFBSSxZQUFZLGFBQWEsYUFBYSxDQUFDLE1BQU07QUFDakQsWUFBSSxVQUFVLFNBQVMsUUFBUSxPQUFPLE9BQ2xDLFVBQVUsU0FBUyxRQUFRLE9BQU8sc0JBQ3BDO0FBQ0UsaUJBQU9BLGdCQUFlLFFBQVFBLGdCQUFlLFNBQVMsRUFBRSxRQUFRLENBQUM7QUFBQSxRQUNyRTtBQUVBLGVBQU8sVUFBVSxRQUFRO0FBQ3JCLGNBQUksbUJBQW1CLFVBQVUsVUFBVSxTQUFTLE1BQU07QUFDMUQsY0FBSSxvQkFDQSxRQUFRLCtCQUErQixpQkFBaUIsT0FBTyxVQUFVLEtBQUssR0FBRztBQUNqRixxQkFBU0EsZ0JBQWUsUUFBUSxDQUFDLGdCQUFnQixDQUFDO0FBQ2xELHdCQUFZLFVBQVUsTUFBTSxHQUFHLEVBQUU7QUFBQSxVQUNyQyxPQUNLO0FBQ0Q7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUVBLG9CQUFZQSxnQkFBZSxXQUFXLENBQUMsU0FBUyxDQUFDO0FBR2pELGlCQUFTQSxnQkFBZSxRQUFRLFFBQVEsU0FBUyxjQUFjLGFBQWEsQ0FBQztBQUFBLE1BQ2pGO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ3pEQSxJQUFBQyxpQkFBQTtBQUFBO0FBQUE7QUFDQSxZQUFRLGFBQWE7QUFDckIsUUFBSSxVQUFVO0FBQ2QsWUFBUSxVQUFVLFNBQVUsTUFBTSxPQUFPO0FBQUUsYUFBTyxRQUFRO0FBQUEsSUFBTztBQUNqRSxZQUFRLFNBQVMsU0FBVSxNQUFNLE9BQU87QUFBRSxhQUFPLFFBQVE7QUFBQSxJQUFPO0FBQ2hFLFlBQVEsVUFBVSxTQUFVLE1BQU0sT0FBTztBQUFFLGFBQU8sRUFBRSxTQUFTO0FBQUEsSUFBUTtBQUNyRSxZQUFRLFVBQVUsU0FBVSxZQUFZO0FBQUUsYUFBTyxDQUFDO0FBQUEsSUFBWTtBQUM5RCxZQUFRLGVBQWUsU0FBVSxJQUFJO0FBQ2pDLFVBQUksT0FBTyxHQUFHLE1BQU0sUUFBUSxHQUFHO0FBQy9CLGFBQU8sU0FBUyxRQUFRLE9BQU8sY0FBYyxPQUFPLFVBQVU7QUFBQSxJQUNsRTtBQUNBLFlBQVEsYUFBYSxTQUFVLElBQUk7QUFDL0IsVUFBSSxPQUFPLEdBQUcsTUFBTSxRQUFRLEdBQUc7QUFDL0IsYUFBTyxTQUFTLFFBQVEsT0FBTyxZQUFZLE9BQU8sVUFBVTtBQUFBLElBQ2hFO0FBQ0EsWUFBUSx5QkFBeUIsU0FBVSxTQUFTO0FBQ2hELFlBQU0sSUFBSSxVQUFVLGlDQUFpQyxPQUFPO0FBQUEsSUFDaEU7QUFBQTtBQUFBOzs7QUNqQkEsSUFBQUMsaUJBQUE7QUFBQTtBQUFBO0FBQ0EsUUFBSTtBQUNKLFlBQVEsYUFBYTtBQUNyQixRQUFJLFVBQVU7QUFDZCxRQUFJLFVBQVU7QUFDZCxZQUFRLGdCQUFnQixLQUFLLENBQUMsR0FDMUIsR0FBRyxRQUFRLFVBQVUsT0FBTyxRQUFRLFNBQ3BDLEdBQUcsUUFBUSxVQUFVLE1BQU0sUUFBUSxRQUNuQyxHQUFHLFFBQVEsVUFBVSxPQUFPLFFBQVEsU0FDcEM7QUFBQTtBQUFBOzs7QUNUSjtBQUFBO0FBQUE7QUFDQSxRQUFJQyxrQkFBa0IsV0FBUSxRQUFLLGtCQUFtQixXQUFZO0FBQzlELGVBQVMsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLFVBQVUsUUFBUSxJQUFJLElBQUk7QUFBSyxhQUFLLFVBQVUsR0FBRztBQUM3RSxlQUFTLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLElBQUk7QUFDekMsaUJBQVMsSUFBSSxVQUFVLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxRQUFRLElBQUksSUFBSSxLQUFLO0FBQzFELFlBQUUsS0FBSyxFQUFFO0FBQ2pCLGFBQU87QUFBQSxJQUNYO0FBQ0EsWUFBUSxhQUFhO0FBQ3JCLFFBQUksVUFBVTtBQUNkLFFBQUksVUFBVTtBQUNkLFFBQUksVUFBVTtBQUNkLFFBQUksVUFBVTtBQUNkLFlBQVEsZUFBZSxTQUFVLFlBQVk7QUFDekMsVUFBSSxtQkFBbUIsUUFBUSxNQUFNLFVBQVU7QUFDL0MsYUFBTyxTQUFVLFlBQVk7QUFBRSxlQUFPLFFBQVEsU0FBUyxrQkFBa0IsVUFBVTtBQUFBLE1BQUc7QUFBQSxJQUMxRjtBQUNBLFlBQVEsV0FBVyxTQUFVLFlBQVksWUFBWTtBQUNqRCxVQUFJLENBQUMsTUFBTSxRQUFRLFVBQVUsR0FBRztBQUM1QixjQUFNLElBQUksTUFBTSxhQUFhLCtHQUErRztBQUFBLE1BQ2hKO0FBS0EsVUFBSSxzQkFBc0IsV0FBVyxPQUFPLFNBQVUsT0FBTyxPQUFPLEdBQUc7QUFDbkUsWUFBSSxFQUFFLFVBQVUsUUFBUSxhQUFhLEtBQUssS0FBSyxRQUFRLFdBQVcsS0FBSyxLQUFLO0FBQ3hFLGdCQUFNLElBQUksTUFBTSxvQkFBb0IsUUFBUSwyQ0FBMkMsQ0FBQztBQUFBLFFBQzVGO0FBQ0EsWUFBSSxNQUFNLFNBQVMsUUFBUSxPQUFPLFlBQVk7QUFDMUMsaUJBQU9BLGdCQUFlLE9BQU8sQ0FBQyxRQUFRLFdBQVcsTUFBTSxNQUFNLENBQUMsQ0FBQztBQUFBLFFBQ25FO0FBQ0EsWUFBSSxpQkFBaUIsTUFBTSxNQUFNLFNBQVM7QUFDMUMsWUFBSSxXQUFXLE1BQU0sTUFBTSxTQUFTO0FBQ3BDLFlBQUksTUFBTSxVQUFVLFFBQVEsVUFBVSxLQUFLO0FBQ3ZDLGNBQUksYUFBYSxRQUFXO0FBQ3hCLG9CQUFRLHVCQUF1QixvQkFBb0I7QUFBQSxVQUN2RDtBQUNBLGlCQUFPQSxnQkFBZSxNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsQ0FBQyxRQUFRLFFBQVEsUUFBUSxDQUFDLENBQUM7QUFBQSxRQUN6RTtBQUNBLFlBQUksYUFBYSxVQUFhLG1CQUFtQixRQUFXO0FBQ3hELGtCQUFRLHVCQUF1QixvQkFBb0I7QUFBQSxRQUN2RDtBQUNBLFlBQUksZUFBZSxRQUFRLGFBQWEsTUFBTTtBQUM5QyxZQUFJLENBQUMsY0FBYztBQUNmLGtCQUFRLHVCQUF1QixrQkFBa0I7QUFBQSxRQUNyRDtBQUNBLGVBQU9BLGdCQUFlLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxDQUFDLGFBQWEsZ0JBQWdCLFFBQVEsQ0FBQyxDQUFDO0FBQUEsTUFDdEYsR0FBRyxDQUFDLENBQUM7QUFDTCxVQUFJLG9CQUFvQixXQUFXLEdBQUc7QUFDbEMsZ0JBQVEsdUJBQXVCLHVDQUF1QztBQUFBLE1BQzFFO0FBQ0EsYUFBTyxvQkFBb0I7QUFBQSxJQUMvQjtBQUFBO0FBQUE7OztBQ3JEQTtBQUFBO0FBQUE7QUFDQSxZQUFRLGFBQWE7QUFDckIsUUFBSSxhQUFhO0FBQ2pCLFlBQVEsZUFBZSxXQUFXO0FBQ2xDLFlBQVEsV0FBVyxXQUFXO0FBQzlCLFFBQUksVUFBVTtBQUNkLFlBQVEsUUFBUSxRQUFRO0FBQUE7QUFBQTs7O0FDTnhCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxvQkFBdUI7OztBQ0F2QixJQUFBQyxtQkFBbUU7OztBQ0FuRSxJQUFNLFlBQVksSUFBSSxNQUFNLHFEQUFxRDtBQUNqRixJQUFNLG1CQUFtQixJQUFJLE1BQU0sc0JBQXNCO0FBQ3pELElBQU0sYUFBYSxJQUFJLE1BQU0sMkJBQTJCO0FBRXhELElBQUksY0FBb0QsU0FBVSxTQUFTLFlBQVksR0FBRyxXQUFXO0FBQ2pHLFdBQVMsTUFBTSxPQUFPO0FBQUUsV0FBTyxpQkFBaUIsSUFBSSxRQUFRLElBQUksRUFBRSxTQUFVLFNBQVM7QUFBRSxjQUFRLEtBQUs7QUFBQSxJQUFHLENBQUM7QUFBQSxFQUFHO0FBQzNHLFNBQU8sS0FBSyxNQUFNLElBQUksVUFBVSxTQUFVLFNBQVMsUUFBUTtBQUN2RCxhQUFTLFVBQVUsT0FBTztBQUFFLFVBQUk7QUFBRSxhQUFLLFVBQVUsS0FBSyxLQUFLLENBQUM7QUFBQSxNQUFHLFNBQVMsR0FBUDtBQUFZLGVBQU8sQ0FBQztBQUFBLE1BQUc7QUFBQSxJQUFFO0FBQzFGLGFBQVMsU0FBUyxPQUFPO0FBQUUsVUFBSTtBQUFFLGFBQUssVUFBVSxTQUFTLEtBQUssQ0FBQztBQUFBLE1BQUcsU0FBUyxHQUFQO0FBQVksZUFBTyxDQUFDO0FBQUEsTUFBRztBQUFBLElBQUU7QUFDN0YsYUFBUyxLQUFLLFFBQVE7QUFBRSxhQUFPLE9BQU8sUUFBUSxPQUFPLEtBQUssSUFBSSxNQUFNLE9BQU8sS0FBSyxFQUFFLEtBQUssV0FBVyxRQUFRO0FBQUEsSUFBRztBQUM3RyxVQUFNLFlBQVksVUFBVSxNQUFNLFNBQVMsY0FBYyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFBQSxFQUN4RSxDQUFDO0FBQ0w7QUFDQSxJQUFNLFlBQU4sTUFBZ0I7QUFBQSxFQUNaLFlBQVksaUJBQWlCLGVBQWUsWUFBWTtBQUNwRCxTQUFLLGtCQUFrQjtBQUN2QixTQUFLLGVBQWU7QUFDcEIsU0FBSyxTQUFTLENBQUM7QUFDZixTQUFLLFdBQVcsQ0FBQztBQUNqQixRQUFJLG1CQUFtQixHQUFHO0FBQ3RCLFlBQU0sSUFBSSxNQUFNLG1EQUFtRDtBQUFBLElBQ3ZFO0FBQ0EsU0FBSyxTQUFTO0FBQUEsRUFDbEI7QUFBQSxFQUNBLFVBQVU7QUFDTixVQUFNLFNBQVMsS0FBSyxTQUFTO0FBQzdCLFVBQU0sZ0JBQWdCLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVyxLQUFLLE9BQU8sS0FBSyxFQUFFLFNBQVMsT0FBTyxDQUFDLENBQUM7QUFDNUYsUUFBSSxDQUFDO0FBQ0QsV0FBSyxVQUFVO0FBQ25CLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFDQSxhQUFhLFVBQVU7QUFDbkIsV0FBTyxZQUFZLE1BQU0sUUFBUSxRQUFRLGFBQWE7QUFDbEQsWUFBTSxDQUFDLE9BQU8sT0FBTyxJQUFJLE1BQU0sS0FBSyxRQUFRO0FBQzVDLFVBQUk7QUFDQSxlQUFPLE1BQU0sU0FBUyxLQUFLO0FBQUEsTUFDL0IsVUFDQTtBQUNJLGdCQUFRO0FBQUEsTUFDWjtBQUFBLElBQ0osQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUNBLGdCQUFnQjtBQUNaLFdBQU8sWUFBWSxNQUFNLFFBQVEsUUFBUSxhQUFhO0FBQ2xELFVBQUksQ0FBQyxLQUFLLFNBQVMsR0FBRztBQUNsQixlQUFPLFFBQVEsUUFBUTtBQUFBLE1BQzNCO0FBQ0EsWUFBTSxjQUFjLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxTQUFTLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM1RSxhQUFPO0FBQUEsSUFDWCxDQUFDO0FBQUEsRUFDTDtBQUFBLEVBQ0EsV0FBVztBQUNQLFdBQU8sS0FBSyxVQUFVO0FBQUEsRUFDMUI7QUFBQSxFQUVBLFVBQVU7QUFDTixRQUFJLEtBQUssa0JBQWtCLEdBQUc7QUFDMUIsWUFBTSxJQUFJLE1BQU0sbUhBQW1IO0FBQUEsSUFDdkk7QUFDQSxRQUFJLEtBQUssa0JBQWtCO0FBQ3ZCLFlBQU0sV0FBVyxLQUFLO0FBQ3RCLFdBQUssbUJBQW1CO0FBQ3hCLGVBQVM7QUFBQSxJQUNiO0FBQUEsRUFDSjtBQUFBLEVBQ0EsU0FBUztBQUNMLFNBQUssT0FBTyxRQUFRLENBQUMsV0FBVyxPQUFPLE9BQU8sS0FBSyxZQUFZLENBQUM7QUFDaEUsU0FBSyxTQUFTLENBQUM7QUFBQSxFQUNuQjtBQUFBLEVBQ0EsWUFBWTtBQUNSLFVBQU0sYUFBYSxLQUFLLE9BQU8sTUFBTTtBQUNyQyxRQUFJLENBQUM7QUFDRDtBQUNKLFFBQUksV0FBVztBQUNmLFNBQUssbUJBQW1CLE1BQU07QUFDMUIsVUFBSTtBQUNBO0FBQ0osaUJBQVc7QUFDWCxXQUFLO0FBQ0wsV0FBSyxnQkFBZ0I7QUFDckIsV0FBSyxVQUFVO0FBQUEsSUFDbkI7QUFDQSxlQUFXLFFBQVEsQ0FBQyxLQUFLLFVBQVUsS0FBSyxnQkFBZ0IsQ0FBQztBQUFBLEVBQzdEO0FBQUEsRUFDQSxrQkFBa0I7QUFDZCxTQUFLLFNBQVMsUUFBUSxDQUFDLFdBQVcsT0FBTyxRQUFRLENBQUM7QUFDbEQsU0FBSyxXQUFXLENBQUM7QUFBQSxFQUNyQjtBQUNKO0FBRUEsSUFBSSxjQUFvRCxTQUFVLFNBQVMsWUFBWSxHQUFHLFdBQVc7QUFDakcsV0FBUyxNQUFNLE9BQU87QUFBRSxXQUFPLGlCQUFpQixJQUFJLFFBQVEsSUFBSSxFQUFFLFNBQVUsU0FBUztBQUFFLGNBQVEsS0FBSztBQUFBLElBQUcsQ0FBQztBQUFBLEVBQUc7QUFDM0csU0FBTyxLQUFLLE1BQU0sSUFBSSxVQUFVLFNBQVUsU0FBUyxRQUFRO0FBQ3ZELGFBQVMsVUFBVSxPQUFPO0FBQUUsVUFBSTtBQUFFLGFBQUssVUFBVSxLQUFLLEtBQUssQ0FBQztBQUFBLE1BQUcsU0FBUyxHQUFQO0FBQVksZUFBTyxDQUFDO0FBQUEsTUFBRztBQUFBLElBQUU7QUFDMUYsYUFBUyxTQUFTLE9BQU87QUFBRSxVQUFJO0FBQUUsYUFBSyxVQUFVLFNBQVMsS0FBSyxDQUFDO0FBQUEsTUFBRyxTQUFTLEdBQVA7QUFBWSxlQUFPLENBQUM7QUFBQSxNQUFHO0FBQUEsSUFBRTtBQUM3RixhQUFTLEtBQUssUUFBUTtBQUFFLGFBQU8sT0FBTyxRQUFRLE9BQU8sS0FBSyxJQUFJLE1BQU0sT0FBTyxLQUFLLEVBQUUsS0FBSyxXQUFXLFFBQVE7QUFBQSxJQUFHO0FBQzdHLFVBQU0sWUFBWSxVQUFVLE1BQU0sU0FBUyxjQUFjLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUFBLEVBQ3hFLENBQUM7QUFDTDtBQUNBLElBQU0sUUFBTixNQUFZO0FBQUEsRUFDUixZQUFZLGFBQWE7QUFDckIsU0FBSyxhQUFhLElBQUksVUFBVSxHQUFHLFdBQVc7QUFBQSxFQUNsRDtBQUFBLEVBQ0EsVUFBVTtBQUNOLFdBQU8sWUFBWSxNQUFNLFFBQVEsUUFBUSxhQUFhO0FBQ2xELFlBQU0sQ0FBQyxFQUFFLFFBQVEsSUFBSSxNQUFNLEtBQUssV0FBVyxRQUFRO0FBQ25ELGFBQU87QUFBQSxJQUNYLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFDQSxhQUFhLFVBQVU7QUFDbkIsV0FBTyxLQUFLLFdBQVcsYUFBYSxNQUFNLFNBQVMsQ0FBQztBQUFBLEVBQ3hEO0FBQUEsRUFDQSxXQUFXO0FBQ1AsV0FBTyxLQUFLLFdBQVcsU0FBUztBQUFBLEVBQ3BDO0FBQUEsRUFDQSxnQkFBZ0I7QUFDWixXQUFPLEtBQUssV0FBVyxjQUFjO0FBQUEsRUFDekM7QUFBQSxFQUVBLFVBQVU7QUFDTixTQUFLLFdBQVcsUUFBUTtBQUFBLEVBQzVCO0FBQUEsRUFDQSxTQUFTO0FBQ0wsV0FBTyxLQUFLLFdBQVcsT0FBTztBQUFBLEVBQ2xDO0FBQ0o7OztBQzFITyxJQUFNLGdCQUFOLE1BQW9CO0FBQUEsRUFBcEI7QUFDSCx5QkFBeUI7QUFDekIseUJBQXlCO0FBQ3pCLHdCQUF3QjtBQUN4Qix5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLHdCQUF3QjtBQUN4Qix1QkFBdUI7QUFDdkIsOEJBQThCO0FBQzlCLDBCQUEwQjtBQUMxQix1QkFBdUI7QUFDdkIscUJBQXFCO0FBQ3JCLHdCQUF3QjtBQUFBO0FBQzVCO0FBaUJPLElBQU0sYUFBTixNQUFpQjtBQUFBLEVBZ0JwQixZQUFZLFNBQXlCLFlBQW9DO0FBZnpFLFNBQU8sZ0JBQXVDO0FBQUEsTUFDMUM7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDSjtBQUVBLFNBQU8sbUJBQTBDLENBQUM7QUFFbEQsU0FBTyxrQkFBNEIsQ0FBQztBQUdoQyxRQUFJLFNBQVM7QUFDVCxXQUFLLFVBQVU7QUFBQSxJQUNuQixPQUFPO0FBQ0gsV0FBSyxVQUFVLElBQUksY0FBYztBQUFBLElBQ3JDO0FBQ0EsUUFBSSxZQUFZO0FBQ1osV0FBSyxtQkFBbUI7QUFBQSxJQUM1QixPQUFPO0FBQ0gsV0FBSyxtQkFBbUIsS0FBSztBQUFBLElBQ2pDO0FBQ0EsU0FBSyxtQkFBbUIsS0FBSyxhQUFhLEtBQUssT0FBTztBQUFBLEVBQzFEO0FBQUEsRUFLQSxhQUFhLGVBQXFEO0FBSTlELFVBQU0sV0FBVyxDQUNiLGdCQUNBLGNBQ0Esc0JBQ0M7QUFDRCxVQUFJLGNBQWM7QUFDZCxhQUFLLGdCQUFnQixLQUFLLHFCQUFxQixtQkFBbUI7QUFDbEUsYUFBSyxpQkFBaUIsS0FBSyxpQkFBaUI7QUFDNUMsZUFBTyxlQUFlLE9BQU8sQ0FBQ0MsYUFBWUEsWUFBVyxpQkFBaUI7QUFBQSxNQUMxRSxPQUFPO0FBQ0gsZUFBTztBQUFBLE1BQ1g7QUFBQSxJQUNKO0FBR0EsUUFBSSxnQkFBZ0IsS0FBSztBQUN6QixvQkFBZ0IsU0FBUyxlQUFlLGNBQWMsY0FBYyxVQUFVO0FBQzlFLG9CQUFnQixTQUFTLGVBQWUsY0FBYyxvQkFBb0IsZ0JBQWdCO0FBQzFGLG9CQUFnQixTQUFTLGVBQWUsY0FBYyxlQUFlLFdBQVc7QUFDaEYsb0JBQWdCLFNBQVMsZUFBZSxjQUFjLG1CQUFtQixlQUFlO0FBQ3hGLG9CQUFnQixTQUFTLGVBQWUsY0FBYyxhQUFhLFNBQVM7QUFDNUUsb0JBQWdCLFNBQVMsZUFBZSxjQUFjLGNBQWMsVUFBVTtBQUM5RSxRQUFJLGNBQWM7QUFBVyxXQUFLLGdCQUFnQixLQUFLLHlCQUF5QjtBQUNoRixXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QUMxRk8sSUFBTSxlQUE2QjtFQUN4QztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFHRixJQUFBLFVBQUEsV0FBQTtBQUlFLFdBQUFDLFNBQVksU0FBaUIsR0FBVTtBQUNyQyxRQUFJLE1BQU07QUFBRyxZQUFNLElBQUksTUFBTSxrQ0FBa0M7QUFDL0QsU0FBSyxVQUFVO0FBQ2YsU0FBSyxJQUFJO0VBQ1g7QUFFTyxFQUFBQSxTQUFBLFVBQVAsU0FBZSxLQUFlO0FBQzVCLFdBQU8sSUFBSUEsU0FBUSxhQUFhLFFBQVEsR0FBRyxDQUFDO0VBQzlDO0FBSUEsRUFBQUEsU0FBQSxVQUFBLE1BQUEsU0FBSSxHQUFTO0FBQ1gsV0FBTyxLQUFLLE1BQU0sSUFBSSxPQUFPLElBQUlBLFNBQVEsS0FBSyxTQUFTLENBQUM7RUFDMUQ7QUFHQSxFQUFBQSxTQUFBLFVBQUEsU0FBQSxTQUFPLE9BQWM7QUFDbkIsV0FBTyxLQUFLLFlBQVksTUFBTSxXQUFXLEtBQUssTUFBTSxNQUFNO0VBQzVEO0FBR0EsRUFBQUEsU0FBQSxVQUFBLFdBQUEsV0FBQTtBQUNFLFFBQUksSUFBWSxhQUFhLEtBQUs7QUFDbEMsUUFBSSxLQUFLO0FBQUcsV0FBSyxLQUFLLElBQUksSUFBSSxNQUFNLE1BQU0sT0FBTyxLQUFLLENBQUMsSUFBSTtBQUMzRCxXQUFPO0VBQ1Q7QUFFQSxFQUFBQSxTQUFBLFVBQUEsZUFBQSxXQUFBO0FBQ0UsV0FBTyxLQUFLLFlBQVksSUFBSSxJQUFJLEtBQUssVUFBVTtFQUNqRDtBQUNGLFNBQUFBO0FBQUEsRUFuQ0E7OztBQ1RPLElBQU0sWUFBWSxTQUN2QixPQUE0QjtBQUU1QixTQUFPLFVBQVUsUUFBUSxVQUFVO0FBQ3JDO0FBRU8sSUFBTSxXQUFXLFNBQVUsT0FBYztBQUM5QyxTQUFPLE9BQU8sVUFBVTtBQUMxQjtBQUVPLElBQU0sZUFBZSxTQUFVLE9BQWM7QUFDbEQsU0FBTyxPQUFPLFVBQVUsWUFBWSxhQUFhLFNBQVMsS0FBbUI7QUFDL0U7QUFFTyxJQUFNLFVBQVUsTUFBTTtBQUt0QixJQUFNLFFBQVEsU0FBVSxPQUFlLEtBQW1CO0FBQW5CLE1BQUEsUUFBQSxRQUFBO0FBQUEsVUFBQTtFQUFtQjtBQUMvRCxNQUFJLFVBQVUsV0FBVyxHQUFHO0FBQzFCLFVBQU07QUFDTixZQUFROztBQUVWLE1BQU0sT0FBTyxDQUFBO0FBQ2IsV0FBUyxJQUFJLE9BQU8sSUFBSSxLQUFLO0FBQUssU0FBSyxLQUFLLENBQUM7QUFDN0MsU0FBTztBQUNUO0FBTU8sSUFBTSxTQUFTLFNBQWEsT0FBZ0IsT0FBYTtBQUM5RCxNQUFJLElBQUk7QUFDUixNQUFNLFFBQXFCLENBQUE7QUFFM0IsTUFBSSxRQUFRLEtBQUssR0FBRztBQUNsQixXQUFPLElBQUksT0FBTztBQUFLLFlBQU0sS0FBTSxDQUFBLEVBQVcsT0FBTyxLQUFLO1NBQ3JEO0FBQ0wsV0FBTyxJQUFJLE9BQU87QUFBSyxZQUFNLEtBQUs7O0FBRXBDLFNBQU87QUFDVDtBQUVPLElBQU0sVUFBVSxTQUFhLE1BQWE7QUFDL0MsTUFBSSxRQUFRLElBQUksR0FBRztBQUNqQixXQUFPOztBQUdULFNBQU8sQ0FBQyxJQUFJO0FBQ2Q7QUFFTSxTQUFVLFNBQ2QsTUFDQSxjQUNBLFdBQWU7QUFBZixNQUFBLGNBQUEsUUFBQTtBQUFBLGdCQUFBO0VBQWU7QUFFZixNQUFNLE1BQU0sT0FBTyxJQUFJO0FBQ3ZCLGlCQUFlLGdCQUFnQjtBQUMvQixNQUFJLElBQUksU0FBUyxjQUFjO0FBQzdCLFdBQU8sT0FBTyxHQUFHOztBQUduQixpQkFBZSxlQUFlLElBQUk7QUFDbEMsTUFBSSxlQUFlLFVBQVUsUUFBUTtBQUNuQyxpQkFBYSxPQUFPLFdBQVcsZUFBZSxVQUFVLE1BQU07O0FBR2hFLFNBQU8sVUFBVSxNQUFNLEdBQUcsWUFBWSxJQUFJLE9BQU8sR0FBRztBQUN0RDtBQUtPLElBQU0sUUFBUSxTQUFVLEtBQWEsS0FBYSxLQUFXO0FBQ2xFLE1BQU0sU0FBUyxJQUFJLE1BQU0sR0FBRztBQUM1QixTQUFPLE1BQ0gsT0FBTyxNQUFNLEdBQUcsR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLE1BQU0sR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsSUFDekQ7QUFDTjtBQWlCTyxJQUFNLFFBQVEsU0FBVSxHQUFXLEdBQVM7QUFDakQsTUFBTSxJQUFJLElBQUk7QUFFZCxTQUFPLElBQUksSUFBSSxJQUFJLElBQUksSUFBSTtBQUM3QjtBQUtPLElBQU0sU0FBUyxTQUFVLEdBQVcsR0FBUztBQUNsRCxTQUFPLEVBQUUsS0FBSyxLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsS0FBSyxNQUFNLEdBQUcsQ0FBQyxFQUFDO0FBQ25EO0FBRU8sSUFBTSxRQUFRLFNBQWEsS0FBMkI7QUFDM0QsU0FBTyxDQUFDLFVBQVUsR0FBRyxLQUFLLElBQUksV0FBVztBQUMzQztBQVNPLElBQU0sV0FBVyxTQUFhLEtBQTJCO0FBQzlELFNBQU8sQ0FBQyxNQUFNLEdBQUc7QUFDbkI7QUFLTyxJQUFNLFdBQVcsU0FBYSxLQUE2QixLQUFNO0FBQ3RFLFNBQU8sU0FBUyxHQUFHLEtBQUssSUFBSSxRQUFRLEdBQUcsTUFBTTtBQUMvQzs7O0FDN0hNLElBQVc7Q0FBakIsU0FBaUJDLFdBQVE7QUFDVixFQUFBQSxVQUFBLGFBQWEsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtBQUs1RCxFQUFBQSxVQUFBLFVBQVUsTUFBTyxLQUFLLEtBQUs7QUFLM0IsRUFBQUEsVUFBQSxVQUFVO0FBT1YsRUFBQUEsVUFBQSxlQUFlLElBQUksS0FBSyxLQUFLLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQU01QyxFQUFBQSxVQUFBLGNBQWMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBS2xDLEVBQUFBLFVBQUEsYUFBYSxTQUFVLE1BQVU7QUFDNUMsUUFBTSxhQUFhLElBQUksS0FDckIsS0FBSyxlQUFjLEdBQ25CLEtBQUssWUFBVyxHQUNoQixLQUFLLFdBQVUsQ0FBRTtBQUVuQixXQUNFLEtBQUssTUFDRixXQUFXLFFBQU8sSUFDakIsSUFBSSxLQUFLLEtBQUssZUFBYyxHQUFJLEdBQUcsQ0FBQyxFQUFFLFFBQU8sS0FDN0NBLFVBQUEsT0FBTyxJQUNQO0VBRVI7QUFFYSxFQUFBQSxVQUFBLGFBQWEsU0FBVSxNQUFZO0FBQzlDLFdBQVEsT0FBTyxNQUFNLEtBQUssT0FBTyxRQUFRLEtBQU0sT0FBTyxRQUFRO0VBQ2hFO0FBRWEsRUFBQUEsVUFBQSxTQUFTLFNBQVUsT0FBYztBQUM1QyxXQUFPLGlCQUFpQjtFQUMxQjtBQUVhLEVBQUFBLFVBQUEsY0FBYyxTQUFVLE9BQWM7QUFDakQsV0FBT0EsVUFBQSxPQUFPLEtBQUssS0FBSyxDQUFDLE1BQU0sTUFBTSxRQUFPLENBQUU7RUFDaEQ7QUFLYSxFQUFBQSxVQUFBLFdBQVcsU0FBVSxNQUFVO0FBQzFDLFdBQU8sS0FBSyxrQkFBaUIsSUFBSyxLQUFLO0VBQ3pDO0FBS2EsRUFBQUEsVUFBQSxjQUFjLFNBQVUsT0FBYSxPQUFXO0FBRzNELFFBQU0sVUFBVSxNQUFNLFFBQU8sSUFBS0EsVUFBQSxTQUFTLEtBQUs7QUFDaEQsUUFBTSxVQUFVLE1BQU0sUUFBTyxJQUFLQSxVQUFBLFNBQVMsS0FBSztBQUVoRCxRQUFNLGVBQWUsVUFBVTtBQUUvQixXQUFPLEtBQUssTUFBTSxlQUFlQSxVQUFBLE9BQU87RUFDMUM7QUFLYSxFQUFBQSxVQUFBLFlBQVksU0FBVSxNQUFVO0FBQzNDLFdBQU9BLFVBQUEsWUFBWSxNQUFNQSxVQUFBLFlBQVk7RUFDdkM7QUFLYSxFQUFBQSxVQUFBLGNBQWMsU0FBVSxTQUFlO0FBQ2xELFdBQU8sSUFBSSxLQUFLQSxVQUFBLGFBQWEsUUFBTyxJQUFLLFVBQVVBLFVBQUEsT0FBTztFQUM1RDtBQUVhLEVBQUFBLFVBQUEsZUFBZSxTQUFVLE1BQVU7QUFDOUMsUUFBTSxRQUFRLEtBQUssWUFBVztBQUM5QixXQUFPLFVBQVUsS0FBS0EsVUFBQSxXQUFXLEtBQUssZUFBYyxDQUFFLElBQ2xELEtBQ0FBLFVBQUEsV0FBVztFQUNqQjtBQUthLEVBQUFBLFVBQUEsYUFBYSxTQUFVLE1BQVU7QUFDNUMsV0FBT0EsVUFBQSxZQUFZLEtBQUssVUFBUztFQUNuQztBQUthLEVBQUFBLFVBQUEsYUFBYSxTQUFVLE1BQWMsT0FBYTtBQUM3RCxRQUFNLE9BQU8sSUFBSSxLQUFLLEtBQUssSUFBSSxNQUFNLE9BQU8sQ0FBQyxDQUFDO0FBQzlDLFdBQU8sQ0FBQ0EsVUFBQSxXQUFXLElBQUksR0FBR0EsVUFBQSxhQUFhLElBQUksQ0FBQztFQUM5QztBQUthLEVBQUFBLFVBQUEsVUFBVSxTQUFVLE1BQVksTUFBaUI7QUFDNUQsV0FBTyxRQUFRO0FBQ2YsV0FBTyxJQUFJLEtBQ1QsS0FBSyxJQUNILEtBQUssZUFBYyxHQUNuQixLQUFLLFlBQVcsR0FDaEIsS0FBSyxXQUFVLEdBQ2YsS0FBSyxTQUFRLEdBQ2IsS0FBSyxXQUFVLEdBQ2YsS0FBSyxXQUFVLEdBQ2YsS0FBSyxnQkFBZSxDQUFFLENBQ3ZCO0VBRUw7QUFFYSxFQUFBQSxVQUFBLFFBQVEsU0FBVSxNQUFpQjtBQUM5QyxRQUFNLFFBQVEsSUFBSSxLQUFLLEtBQUssUUFBTyxDQUFFO0FBQ3JDLFdBQU87RUFDVDtBQUVhLEVBQUFBLFVBQUEsYUFBYSxTQUFVLE9BQXNCO0FBQ3hELFFBQU0sU0FBUyxDQUFBO0FBQ2YsYUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNyQyxhQUFPLEtBQUtBLFVBQUEsTUFBTSxNQUFNLEVBQUUsQ0FBQzs7QUFFN0IsV0FBTztFQUNUO0FBS2EsRUFBQUEsVUFBQSxPQUFPLFNBQThCLE9BQVU7QUFDMUQsVUFBTSxLQUFLLFNBQVUsR0FBRyxHQUFDO0FBQ3ZCLGFBQU8sRUFBRSxRQUFPLElBQUssRUFBRSxRQUFPO0lBQ2hDLENBQUM7RUFDSDtBQUVhLEVBQUFBLFVBQUEsb0JBQW9CLFNBQVUsTUFBYyxLQUFVO0FBQVYsUUFBQSxRQUFBLFFBQUE7QUFBQSxZQUFBO0lBQVU7QUFDakUsUUFBTSxPQUFPLElBQUksS0FBSyxJQUFJO0FBQzFCLFdBQU87TUFDTCxTQUFTLEtBQUssZUFBYyxFQUFHLFNBQVEsR0FBSSxHQUFHLEdBQUc7TUFDakQsU0FBUyxLQUFLLFlBQVcsSUFBSyxHQUFHLEdBQUcsR0FBRztNQUN2QyxTQUFTLEtBQUssV0FBVSxHQUFJLEdBQUcsR0FBRztNQUNsQztNQUNBLFNBQVMsS0FBSyxZQUFXLEdBQUksR0FBRyxHQUFHO01BQ25DLFNBQVMsS0FBSyxjQUFhLEdBQUksR0FBRyxHQUFHO01BQ3JDLFNBQVMsS0FBSyxjQUFhLEdBQUksR0FBRyxHQUFHO01BQ3JDLE1BQU0sTUFBTTtNQUNaLEtBQUssRUFBRTtFQUNYO0FBRWEsRUFBQUEsVUFBQSxvQkFBb0IsU0FBVSxPQUFhO0FBQ3RELFFBQU0sS0FBSztBQUNYLFFBQU0sT0FBTyxHQUFHLEtBQUssS0FBSztBQUUxQixRQUFJLENBQUM7QUFBTSxZQUFNLElBQUksTUFBTSx3QkFBQSxPQUF3QixLQUFLLENBQUU7QUFFMUQsV0FBTyxJQUFJLEtBQ1QsS0FBSyxJQUNILFNBQVMsS0FBSyxJQUFJLEVBQUUsR0FDcEIsU0FBUyxLQUFLLElBQUksRUFBRSxJQUFJLEdBQ3hCLFNBQVMsS0FBSyxJQUFJLEVBQUUsR0FDcEIsU0FBUyxLQUFLLElBQUksRUFBRSxLQUFLLEdBQ3pCLFNBQVMsS0FBSyxJQUFJLEVBQUUsS0FBSyxHQUN6QixTQUFTLEtBQUssSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUMzQjtFQUVMO0FBQ0YsR0F4TGlCLGFBQUEsV0FBUSxDQUFBLEVBQUE7QUEwTHpCLElBQUEsbUJBQWU7OztBQ3BMZixJQUFBLGFBQUEsV0FBQTtBQVFFLFdBQUFDLFlBQVksUUFBVyxNQUF1QjtBQUw5QixTQUFBLFVBQXVCO0FBQ3ZCLFNBQUEsVUFBdUI7QUFDaEMsU0FBQSxVQUFrQixDQUFBO0FBQ2xCLFNBQUEsUUFBUTtBQUdiLFNBQUssU0FBUztBQUNkLFNBQUssT0FBTztBQUVaLFFBQUksV0FBVyxXQUFXO0FBQ3hCLFdBQUssVUFBVSxLQUFLLE1BQ2hCLEtBQUssU0FDTCxJQUFJLEtBQUssS0FBSyxPQUFPLFFBQU8sSUFBSyxDQUFDO0FBQ3RDLFdBQUssVUFBVSxLQUFLLE1BQU0sS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLE1BQU0sUUFBTyxJQUFLLENBQUM7ZUFDL0QsV0FBVyxVQUFVO0FBQzlCLFdBQUssVUFBVSxLQUFLLE1BQU0sS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLLEdBQUcsUUFBTyxJQUFLLENBQUM7ZUFDekQsV0FBVyxTQUFTO0FBQzdCLFdBQUssVUFBVSxLQUFLLE1BQU0sS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLLEdBQUcsUUFBTyxJQUFLLENBQUM7O0VBRXRFO0FBVUEsRUFBQUEsWUFBQSxVQUFBLFNBQUEsU0FBTyxNQUFVO0FBQ2YsTUFBRSxLQUFLO0FBQ1AsUUFBTSxXQUFXLEtBQUssV0FBVyxPQUFPLEtBQUs7QUFDN0MsUUFBTSxVQUFVLEtBQUssV0FBVyxPQUFPLEtBQUs7QUFFNUMsUUFBSSxLQUFLLFdBQVcsV0FBVztBQUM3QixVQUFJO0FBQVUsZUFBTztBQUNyQixVQUFJO0FBQVMsZUFBTztlQUNYLEtBQUssV0FBVyxVQUFVO0FBQ25DLFVBQUk7QUFBUyxlQUFPO2VBQ1gsS0FBSyxXQUFXLFNBQVM7QUFDbEMsVUFBSTtBQUFVLGVBQU87QUFDckIsV0FBSyxJQUFJLElBQUk7QUFDYixhQUFPOztBQUdULFdBQU8sS0FBSyxJQUFJLElBQUk7RUFDdEI7QUFPQSxFQUFBQSxZQUFBLFVBQUEsTUFBQSxTQUFJLE1BQVU7QUFDWixTQUFLLFFBQVEsS0FBSyxJQUFJO0FBQ3RCLFdBQU87RUFDVDtBQVFBLEVBQUFBLFlBQUEsVUFBQSxXQUFBLFdBQUE7QUFDRSxRQUFNLE1BQU0sS0FBSztBQUNqQixZQUFRLEtBQUs7V0FDTjtXQUNBO0FBQ0gsZUFBTztXQUNKO1dBQ0E7O0FBRUgsZUFBUSxJQUFJLFNBQVMsSUFBSSxJQUFJLFNBQVMsS0FBSzs7RUFFakQ7QUFFQSxFQUFBQSxZQUFBLFVBQUEsUUFBQSxXQUFBO0FBQ0UsV0FBTyxJQUFJQSxZQUFXLEtBQUssUUFBUSxLQUFLLElBQUk7RUFDOUM7QUFDRixTQUFBQTtBQUFBLEVBbkZBOzs7O0FDakJBLG1CQUFrQjtBQUNsQixJQUFNO0FBQUEsRUFDRjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNKLElBQUksYUFBQUM7OztBQ25CSixJQUFBLHFCQUFBLFNBQUEsUUFBQTtBQUFnRCxZQUFBQyxxQkFBQSxNQUFBO0FBRzlDLFdBQUFBLG9CQUNFLFFBQ0EsTUFDQSxVQUFrQjtBQUhwQixRQUFBLFFBS0UsT0FBQSxLQUFBLE1BQU0sUUFBUSxJQUFJLEtBQUM7QUFFbkIsVUFBSyxXQUFXOztFQUNsQjtBQUVBLEVBQUFBLG9CQUFBLFVBQUEsTUFBQSxTQUFJLE1BQVU7QUFDWixRQUFJLEtBQUssU0FBUyxNQUFNLEtBQUssUUFBUSxNQUFNLEdBQUc7QUFDNUMsV0FBSyxRQUFRLEtBQUssSUFBSTtBQUN0QixhQUFPOztBQUVULFdBQU87RUFDVDtBQUNGLFNBQUFBO0FBQUEsRUFwQmdELGtCQUFVOzs7O0FDSTFELElBQU0sVUFBb0I7RUFDeEIsVUFBVTtJQUNSO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBOztFQUVGLFlBQVk7SUFDVjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7O0VBRUYsUUFBUTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsY0FBYztJQUNkLE9BQU87SUFDUCxVQUFVO0lBQ1YsY0FBYztJQUNkLFdBQVc7SUFDWCxXQUFXO0lBQ1gsYUFBYTtJQUNiLFlBQVk7SUFDWixXQUFXO0lBQ1gsSUFBSTtJQUNKLElBQUk7SUFDSixLQUFLO0lBQ0wsT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsV0FBVztJQUNYLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixPQUFPO0lBQ1AsT0FBTztJQUNQLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTzs7O0FBSVgsSUFBQSxlQUFlOzs7QUNyRWYsSUFBTSxXQUFXLFNBQVUsS0FBZSxLQUFXO0FBQ25ELFNBQU8sSUFBSSxRQUFRLEdBQUcsTUFBTTtBQUM5QjtBQVFBLElBQU0saUJBQTBCLFNBQUMsSUFBRTtBQUFLLFNBQUEsR0FBRyxTQUFRO0FBQVg7QUFJeEMsSUFBTSx1QkFBc0MsU0FDMUMsTUFDQSxPQUNBLEtBQVc7QUFDUixTQUFBLEdBQUEsT0FBRyxPQUFLLEdBQUEsRUFBQSxPQUFJLEtBQUcsSUFBQSxFQUFBLE9BQUssSUFBSTtBQUF4QjtBQVVMLElBQUEsU0FBQSxXQUFBO0FBaUJFLFdBQUFDLFFBQ0UsT0FDQSxTQUNBLFVBQ0EsZUFBbUQ7QUFGbkQsUUFBQSxZQUFBLFFBQUE7QUFBQSxnQkFBQTtJQUFpQztBQUNqQyxRQUFBLGFBQUEsUUFBQTtBQUFBLGlCQUFBO0lBQTRCO0FBQzVCLFFBQUEsa0JBQUEsUUFBQTtBQUFBLHNCQUFBO0lBQW1EO0FBRW5ELFNBQUssT0FBTyxDQUFBO0FBQ1osU0FBSyxXQUFXLFlBQVk7QUFDNUIsU0FBSyxVQUFVO0FBQ2YsU0FBSyxnQkFBZ0I7QUFDckIsU0FBSyxRQUFRO0FBQ2IsU0FBSyxVQUFVLE1BQU07QUFDckIsU0FBSyxjQUFjLE1BQU07QUFFekIsUUFBSSxLQUFLLFlBQVksWUFBWTtBQUMvQixVQUFNLGFBQWMsQ0FBQSxFQUFnQixPQUFPLEtBQUssUUFBUSxVQUFVO0FBQ2xFLFVBQU0sY0FBZSxDQUFBLEVBQWdCLE9BQU8sS0FBSyxRQUFRLFdBQVc7QUFFcEUsaUJBQVcsS0FBSyxTQUFDLEdBQUcsR0FBQztBQUFLLGVBQUEsSUFBSTtNQUFKLENBQUs7QUFDL0Isa0JBQVksS0FBSyxTQUFDLEdBQUcsR0FBQztBQUFLLGVBQUEsSUFBSTtNQUFKLENBQUs7QUFFaEMsV0FBSyxhQUFhLFdBQVcsT0FBTyxXQUFXO0FBQy9DLFVBQUksQ0FBQyxLQUFLLFdBQVc7QUFBUSxhQUFLLGFBQWE7O0FBR2pELFFBQUksVUFBVSxLQUFLLFlBQVksU0FBUyxHQUFHO0FBQ3pDLFVBQU0sWUFBWSxDQUFDLFFBQVEsS0FBSyxZQUFZLFNBQVMsSUFDakQsQ0FBQyxLQUFLLFlBQVksU0FBUyxJQUMzQixLQUFLLFlBQVk7QUFDckIsVUFBTSxPQUFPLE9BQU8sU0FBUztBQUU3QixXQUFLLFlBQVk7UUFDZixVQUFVLFVBQVUsT0FBTyxTQUFVLFNBQWdCO0FBQ25ELGlCQUFPLENBQUMsUUFBUTtRQUNsQixDQUFDO1FBQ0QsV0FBVyxVQUFVLE9BQU8sU0FBVSxTQUFnQjtBQUNwRCxpQkFBTyxRQUFRLFFBQVEsQ0FBQztRQUMxQixDQUFDO1FBQ0QsWUFDRSxLQUFLLFFBQVEsSUFBSSxNQUFNLE1BQ3ZCLEtBQUssUUFBUSxJQUFJLE1BQU0sTUFDdkIsS0FBSyxRQUFRLElBQUksTUFBTSxNQUN2QixLQUFLLFFBQVEsSUFBSSxNQUFNLE1BQ3ZCLEtBQUssUUFBUSxJQUFJLE1BQU0sTUFDdkIsS0FBSyxRQUFRLElBQUksTUFBTSxNQUN2QixLQUFLLFFBQVEsSUFBSSxNQUFNO1FBQ3pCLFlBQ0UsS0FBSyxRQUFRLElBQUksTUFBTSxNQUN2QixLQUFLLFFBQVEsSUFBSSxNQUFNLE1BQ3ZCLEtBQUssUUFBUSxJQUFJLE1BQU0sTUFDdkIsS0FBSyxRQUFRLElBQUksTUFBTSxNQUN2QixLQUFLLFFBQVEsSUFBSSxNQUFNLE1BQ3ZCLEtBQUssUUFBUSxJQUFJLE1BQU0sTUFDdkIsS0FBSyxRQUFRLElBQUksTUFBTTs7QUFHM0IsVUFBTSxlQUFlLFNBQVUsR0FBWSxHQUFVO0FBQ25ELGVBQU8sRUFBRSxVQUFVLEVBQUU7TUFDdkI7QUFFQSxXQUFLLFVBQVUsU0FBUyxLQUFLLFlBQVk7QUFDekMsV0FBSyxVQUFVLFVBQVUsS0FBSyxZQUFZO0FBRTFDLFVBQUksQ0FBQyxLQUFLLFVBQVUsU0FBUztBQUFRLGFBQUssVUFBVSxXQUFXO0FBQy9ELFVBQUksQ0FBQyxLQUFLLFVBQVUsVUFBVTtBQUFRLGFBQUssVUFBVSxZQUFZO1dBQzVEO0FBQ0wsV0FBSyxZQUFZOztFQUVyQjtBQVFPLEVBQUFBLFFBQUEscUJBQVAsU0FBMEIsT0FBWTtBQUNwQyxRQUFNLGFBQWE7QUFFbkIsUUFBSSxFQUFFLE1BQU0sUUFBUSxRQUFRQSxRQUFPO0FBQWMsYUFBTztBQUN4RCxRQUFJLE1BQU0sWUFBWSxTQUFTLE1BQU0sWUFBWTtBQUFPLGFBQU87QUFFL0QsYUFBVyxPQUFPLE1BQU0sYUFBYTtBQUNuQyxVQUFJLFNBQVMsQ0FBQyxXQUFXLFFBQVEsTUFBTSxHQUFHLEdBQUc7QUFBRyxlQUFPO0FBQ3ZELFVBQUksQ0FBQyxTQUFTQSxRQUFPLFlBQVksTUFBTSxRQUFRLE9BQU8sR0FBRztBQUFHLGVBQU87O0FBR3JFLFdBQU87RUFDVDtBQUVBLEVBQUFBLFFBQUEsVUFBQSxxQkFBQSxXQUFBO0FBQ0UsV0FBT0EsUUFBTyxtQkFBbUIsS0FBSyxLQUFLO0VBQzdDO0FBU0EsRUFBQUEsUUFBQSxVQUFBLFdBQUEsV0FBQTtBQUNFLFFBQU0sVUFBVSxLQUFLO0FBRXJCLFFBQUksRUFBRSxLQUFLLFFBQVEsUUFBUUEsUUFBTyxjQUFjO0FBQzlDLGFBQU8sUUFBUSx5REFBeUQ7O0FBRzFFLFNBQUssT0FBTyxDQUFDLFFBQVEsT0FBTyxDQUFDO0FBRzdCLFNBQUssTUFBTSxZQUFZLEtBQUssUUFBUSxPQUFNO0FBRTFDLFFBQUksS0FBSyxRQUFRLE9BQU87QUFDdEIsV0FBSyxJQUFJLFFBQVEsT0FBTyxDQUFDO0FBQ3pCLFVBQU0sUUFBUSxLQUFLLFFBQVE7QUFDM0IsV0FBSyxJQUNILEtBQUssY0FDSCxNQUFNLGVBQWMsR0FDcEIsS0FBSyxTQUFTLFdBQVcsTUFBTSxZQUFXLElBQzFDLE1BQU0sV0FBVSxDQUFFLENBQ25CO2VBRU0sS0FBSyxRQUFRLE9BQU87QUFDN0IsV0FBSyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQ3BCLElBQUksS0FBSyxRQUFRLE1BQU0sU0FBUSxDQUFFLEVBQ2pDLElBQ0MsS0FBSyxPQUFPLEtBQUssUUFBUSxLQUFLLElBQUksUUFBUSxPQUFPLElBQUksUUFBUSxNQUFNLENBQUM7O0FBSTFFLFFBQUksQ0FBQyxLQUFLLG1CQUFrQjtBQUFJLFdBQUssSUFBSSxRQUFRLGlCQUFpQixDQUFDO0FBRW5FLFdBQU8sS0FBSyxLQUFLLEtBQUssRUFBRTtFQUMxQjtBQUVBLEVBQUFBLFFBQUEsVUFBQSxTQUFBLFdBQUE7QUFDRSxRQUFNLFVBQVUsS0FBSztBQUVyQixRQUFJLEtBQUssUUFBUSxhQUFhO0FBQUcsV0FBSyxJQUFJLEtBQUssUUFBUSxTQUFTLFNBQVEsQ0FBRTtBQUUxRSxTQUFLLElBQ0gsS0FBSyxPQUFPLEtBQUssUUFBUSxRQUFRLElBQUksUUFBUSxPQUFPLElBQUksUUFBUSxNQUFNLENBQUM7RUFFM0U7QUFFQSxFQUFBQSxRQUFBLFVBQUEsV0FBQSxXQUFBO0FBQ0UsUUFBTSxVQUFVLEtBQUs7QUFFckIsUUFBSSxLQUFLLFFBQVEsYUFBYTtBQUFHLFdBQUssSUFBSSxLQUFLLFFBQVEsU0FBUyxTQUFRLENBQUU7QUFFMUUsU0FBSyxJQUNILEtBQUssT0FBTyxLQUFLLFFBQVEsUUFBUSxJQUM3QixRQUFRLFNBQVMsSUFDakIsUUFBUSxRQUFRLENBQUM7RUFFekI7QUFFQSxFQUFBQSxRQUFBLFVBQUEsUUFBQSxXQUFBO0FBQ0UsUUFBTSxVQUFVLEtBQUs7QUFFckIsUUFBSSxLQUFLLFFBQVEsYUFBYTtBQUFHLFdBQUssSUFBSSxLQUFLLFFBQVEsU0FBUyxTQUFRLENBQUU7QUFFMUUsUUFBSSxLQUFLLGFBQWEsS0FBSyxVQUFVLFlBQVk7QUFDL0MsV0FBSyxJQUNILEtBQUssT0FBTyxLQUFLLFFBQVEsUUFBUSxJQUM3QixRQUFRLFVBQVUsSUFDbEIsUUFBUSxTQUFTLENBQUM7V0FFbkI7QUFDTCxXQUFLLElBQ0gsS0FBSyxPQUFPLEtBQUssUUFBUSxRQUFRLElBQUksUUFBUSxNQUFNLElBQUksUUFBUSxLQUFLLENBQUM7O0FBSXpFLFFBQUksS0FBSyxZQUFZLFNBQVM7QUFDNUIsV0FBSyxJQUFJLFFBQVEsSUFBSSxDQUFDO0FBQ3RCLFdBQUssU0FBUTs7QUFHZixRQUFJLEtBQUssWUFBWTtBQUNuQixXQUFLLFlBQVc7ZUFDUCxLQUFLLFdBQVc7QUFDekIsV0FBSyxXQUFVO2VBQ04sS0FBSyxZQUFZLFFBQVE7QUFDbEMsV0FBSyxRQUFPOztFQUVoQjtBQUVBLEVBQUFBLFFBQUEsVUFBQSxTQUFBLFdBQUE7QUFDRSxRQUFNLFVBQVUsS0FBSztBQUVyQixRQUFJLEtBQUssUUFBUSxhQUFhLEdBQUc7QUFDL0IsV0FBSyxJQUFJLEtBQUssUUFBUSxTQUFTLFNBQVEsQ0FBRSxFQUFFLElBQ3pDLEtBQUssT0FBTyxLQUFLLFFBQVEsUUFBUSxJQUFJLFFBQVEsT0FBTyxJQUFJLFFBQVEsTUFBTSxDQUFDOztBQUkzRSxRQUFJLEtBQUssYUFBYSxLQUFLLFVBQVUsWUFBWTtBQUMvQyxVQUFJLEtBQUssUUFBUSxhQUFhLEdBQUc7QUFDL0IsYUFBSyxJQUNILEtBQUssT0FBTyxLQUFLLFFBQVEsUUFBUSxJQUM3QixRQUFRLFVBQVUsSUFDbEIsUUFBUSxTQUFTLENBQUM7YUFFbkI7QUFDTCxhQUFLLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRSxJQUFJLFFBQVEsVUFBVSxDQUFDOztlQUV4QyxLQUFLLGFBQWEsS0FBSyxVQUFVLFlBQVk7QUFDdEQsV0FBSyxJQUNILEtBQUssT0FBTyxLQUFLLFFBQVEsUUFBUSxJQUFJLFFBQVEsTUFBTSxJQUFJLFFBQVEsS0FBSyxDQUFDO1dBRWxFO0FBQ0wsVUFBSSxLQUFLLFFBQVEsYUFBYTtBQUFHLGFBQUssSUFBSSxRQUFRLE1BQU0sQ0FBQztBQUV6RCxVQUFJLEtBQUssWUFBWSxTQUFTO0FBQzVCLGFBQUssSUFBSSxRQUFRLElBQUksQ0FBQztBQUN0QixhQUFLLFNBQVE7O0FBR2YsVUFBSSxLQUFLLFlBQVk7QUFDbkIsYUFBSyxZQUFXO2lCQUNQLEtBQUssV0FBVztBQUN6QixhQUFLLFdBQVU7OztFQUdyQjtBQUVBLEVBQUFBLFFBQUEsVUFBQSxVQUFBLFdBQUE7QUFDRSxRQUFNLFVBQVUsS0FBSztBQUVyQixRQUFJLEtBQUssWUFBWSxTQUFTO0FBQzVCLFVBQUksS0FBSyxRQUFRLGFBQWEsR0FBRztBQUMvQixhQUFLLElBQUksS0FBSyxRQUFRLFNBQVMsU0FBUSxDQUFFLEVBQUUsSUFBSSxRQUFRLFFBQVEsQ0FBQztBQUNoRSxZQUFJLEtBQUssT0FBTyxLQUFLLFFBQVEsUUFBUTtBQUFHLGVBQUssSUFBSSxRQUFRLElBQUksQ0FBQzthQUN6RDs7QUFHUCxXQUFLLFNBQVE7V0FDUjtBQUNMLFVBQUksS0FBSyxRQUFRLGFBQWEsR0FBRztBQUMvQixhQUFLLElBQUksS0FBSyxRQUFRLFNBQVMsU0FBUSxDQUFFOztBQUUzQyxXQUFLLElBQ0gsS0FBSyxPQUFPLEtBQUssUUFBUSxRQUFRLElBQzdCLFFBQVEsUUFBUSxJQUNoQixRQUFRLE9BQU8sQ0FBQzs7QUFHeEIsUUFBSSxLQUFLLFlBQVk7QUFDbkIsV0FBSyxZQUFXO2VBQ1AsS0FBSyxhQUFhLEtBQUssVUFBVSxZQUFZO0FBQ3RELFdBQUssSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFLElBQUksUUFBUSxVQUFVLENBQUM7ZUFDdEMsS0FBSyxXQUFXO0FBQ3pCLFdBQUssV0FBVTs7RUFFbkI7QUFFQSxFQUFBQSxRQUFBLFVBQUEsU0FBQSxXQUFBO0FBQ0UsUUFBTSxVQUFVLEtBQUs7QUFFckIsUUFBSSxLQUFLLFlBQVksU0FBUztBQUM1QixVQUFJLEtBQUssUUFBUSxhQUFhLEdBQUc7QUFDL0IsYUFBSyxJQUFJLEtBQUssUUFBUSxTQUFTLFNBQVEsQ0FBRTtBQUN6QyxhQUFLLElBQUksUUFBUSxPQUFPLENBQUM7YUFDcEI7O0FBR1AsV0FBSyxTQUFRO1dBQ1I7QUFDTCxVQUFJLEtBQUssUUFBUSxhQUFhLEdBQUc7QUFDL0IsYUFBSyxJQUFJLEtBQUssUUFBUSxTQUFTLFNBQVEsQ0FBRTs7QUFFM0MsV0FBSyxJQUNILEtBQUssT0FBTyxLQUFLLFFBQVEsUUFBUSxJQUFJLFFBQVEsT0FBTyxJQUFJLFFBQVEsTUFBTSxDQUFDOztBQUkzRSxRQUFJLEtBQUssWUFBWTtBQUNuQixXQUFLLFlBQVc7ZUFDUCxLQUFLLFdBQVc7QUFDekIsV0FBSyxXQUFVOztBQUdqQixRQUFJLEtBQUssUUFBUSxXQUFXO0FBQzFCLFdBQUssSUFBSSxRQUFRLFFBQVEsQ0FBQyxFQUN2QixJQUFJLEtBQUssS0FBSyxLQUFLLFFBQVEsV0FBVyxLQUFLLEtBQUssUUFBUSxLQUFLLENBQUMsQ0FBQyxFQUMvRCxJQUFJLFFBQVEsS0FBSyxDQUFDOztBQUd2QixRQUFJLEtBQUssUUFBUSxVQUFVO0FBQ3pCLFdBQUssSUFBSSxRQUFRLElBQUksQ0FBQyxFQUNuQixJQUNDLEtBQUssT0FBUSxLQUFLLFFBQVEsU0FBc0IsTUFBTSxJQUNsRCxRQUFRLE9BQU8sSUFDZixRQUFRLE1BQU0sQ0FBQyxFQUVwQixJQUFJLEtBQUssS0FBSyxLQUFLLFFBQVEsVUFBVSxRQUFXLFFBQVEsS0FBSyxDQUFDLENBQUM7O0VBRXRFO0FBRVEsRUFBQUEsUUFBQSxVQUFBLGNBQVIsV0FBQTtBQUNFLFFBQU0sVUFBVSxLQUFLO0FBQ3JCLFFBQUksS0FBSyxhQUFhLEtBQUssVUFBVSxVQUFVO0FBQzdDLFdBQUssSUFBSSxRQUFRLElBQUksQ0FBQyxFQUNuQixJQUNDLEtBQUssS0FBSyxLQUFLLFVBQVUsVUFBVSxLQUFLLGFBQWEsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUVwRSxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQ2xCLElBQUksS0FBSyxLQUFLLEtBQUssWUFBWSxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQztXQUNyRDtBQUNMLFdBQUssSUFBSSxRQUFRLFFBQVEsQ0FBQyxFQUFFLElBQzFCLEtBQUssS0FBSyxLQUFLLFlBQVksS0FBSyxLQUFLLFFBQVEsS0FBSyxDQUFDLENBQUM7O0VBSTFEO0FBRVEsRUFBQUEsUUFBQSxVQUFBLGFBQVIsV0FBQTtBQUNFLFFBQU0sVUFBVSxLQUFLO0FBQ3JCLFFBQUksS0FBSyxVQUFVLFlBQVksQ0FBQyxLQUFLLFVBQVUsWUFBWTtBQUN6RCxXQUFLLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRSxJQUN0QixLQUFLLEtBQUssS0FBSyxVQUFVLFVBQVUsS0FBSyxXQUFXLENBQUM7O0FBSXhELFFBQUksS0FBSyxVQUFVLFdBQVc7QUFDNUIsVUFBSSxLQUFLLFVBQVU7QUFBVSxhQUFLLElBQUksUUFBUSxLQUFLLENBQUM7QUFFcEQsV0FBSyxJQUFJLFFBQVEsUUFBUSxDQUFDLEVBQUUsSUFDMUIsS0FBSyxLQUFLLEtBQUssVUFBVSxXQUFXLEtBQUssYUFBYSxRQUFRLEtBQUssQ0FBQyxDQUFDOztFQUczRTtBQUVRLEVBQUFBLFFBQUEsVUFBQSxVQUFSLFdBQUE7QUFDRSxRQUFNLFVBQVUsS0FBSztBQUVyQixTQUFLLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRSxJQUN0QixLQUFLLEtBQUssS0FBSyxZQUFZLFFBQVEsUUFBVyxRQUFRLEtBQUssQ0FBQyxDQUFDO0VBRWpFO0FBRVEsRUFBQUEsUUFBQSxVQUFBLFdBQVIsV0FBQTtBQUNFLFNBQUssSUFDSCxLQUFLLEtBQUssS0FBSyxRQUFRLFNBQVMsS0FBSyxXQUFXLEtBQUssUUFBUSxLQUFLLENBQUMsQ0FBQztFQUV4RTtBQUVBLEVBQUFBLFFBQUEsVUFBQSxNQUFBLFNBQUksR0FBa0I7QUFDcEIsUUFBSSxTQUFTLEVBQUUsU0FBUSxHQUFJLEVBQUU7QUFDN0IsUUFBSTtBQUNKLFFBQU0sVUFBVSxLQUFLO0FBRXJCLFFBQUksTUFBTTtBQUFJLGFBQU8sUUFBUSxNQUFNO0FBRW5DLFFBQU0sT0FBTyxLQUFLLElBQUksQ0FBQztBQUN2QixZQUFRO1dBQ0Q7V0FDQTtXQUNBO0FBQ0gsY0FBTSxPQUFPLFFBQVEsSUFBSTtBQUN6QjtXQUNHO1dBQ0E7QUFDSCxjQUFNLE9BQU8sUUFBUSxJQUFJO0FBQ3pCO1dBQ0c7V0FDQTtBQUNILGNBQU0sT0FBTyxRQUFRLElBQUk7QUFDekI7O0FBRUEsY0FBTSxPQUFPLFFBQVEsSUFBSTs7QUFHN0IsV0FBTyxJQUFJLElBQUksTUFBTSxNQUFNLFFBQVEsTUFBTSxJQUFJO0VBQy9DO0FBRUEsRUFBQUEsUUFBQSxVQUFBLFlBQUEsU0FBVSxHQUFTO0FBQ2pCLFdBQU8sS0FBSyxTQUFTLFdBQVcsSUFBSTtFQUN0QztBQUVBLEVBQUFBLFFBQUEsVUFBQSxjQUFBLFNBQVksTUFBc0I7QUFDaEMsUUFBTSxVQUFVLFNBQVMsSUFBSSxLQUFLLE9BQU8sS0FBSyxJQUFJLEtBQUssYUFBWTtBQUNuRSxZQUNJLEtBQWlCLElBQUksS0FBSyxJQUFLLEtBQWlCLENBQUMsSUFBSSxNQUFNLE1BQzdELEtBQUssU0FBUyxTQUFTO0VBRTNCO0FBRUEsRUFBQUEsUUFBQSxVQUFBLFNBQUEsU0FBTyxHQUFTO0FBQ2QsV0FBTyxJQUFJLFFBQVE7RUFDckI7QUFFQSxFQUFBQSxRQUFBLFVBQUEsTUFBQSxTQUFJLEdBQVM7QUFDWCxTQUFLLEtBQUssS0FBSyxHQUFHO0FBQ2xCLFNBQUssS0FBSyxLQUFLLENBQUM7QUFDaEIsV0FBTztFQUNUO0FBRUEsRUFBQUEsUUFBQSxVQUFBLE9BQUEsU0FDRSxLQUNBLFVBQ0EsWUFDQSxPQUFXO0FBSmIsUUFBQSxRQUFBO0FBSUUsUUFBQSxVQUFBLFFBQUE7QUFBQSxjQUFBO0lBQVc7QUFFWCxRQUFJLENBQUMsUUFBUSxHQUFHLEdBQUc7QUFDakIsWUFBTSxDQUFDLEdBQUc7O0FBRVosUUFBTSxZQUFZLFNBQ2hCLE9BQ0EsV0FDQSxnQkFBc0I7QUFFdEIsVUFBSSxPQUFPO0FBRVgsZUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNyQyxZQUFJLE1BQU0sR0FBRztBQUNYLGNBQUksTUFBTSxNQUFNLFNBQVMsR0FBRztBQUMxQixvQkFBUSxNQUFNLGlCQUFpQjtpQkFDMUI7QUFDTCxvQkFBUSxZQUFZOzs7QUFHeEIsZ0JBQVEsTUFBTTs7QUFFaEIsYUFBTztJQUNUO0FBRUEsZUFDRSxZQUNBLFNBQVUsR0FBQztBQUNULGFBQU8sRUFBRSxTQUFRO0lBQ25CO0FBRUYsUUFBTSxlQUFlLFNBQUMsS0FBYztBQUNsQyxhQUFPLFlBQVksU0FBUyxLQUFLLE9BQU0sR0FBRztJQUM1QztBQUVBLFFBQUksWUFBWTtBQUNkLGFBQU8sVUFBVSxJQUFJLElBQUksWUFBWSxHQUFHLE9BQU8sVUFBVTtXQUNwRDtBQUNMLGFBQU8sSUFBSSxJQUFJLFlBQVksRUFBRSxLQUFLLFFBQVEsR0FBRzs7RUFFakQ7QUFDRixTQUFBQTtBQUFBLEVBOWNBOzs7O0FDaENBLElBQUEsU0FBQSxXQUFBO0FBT0UsV0FBQUMsUUFBWSxPQUE4QjtBQUZsQyxTQUFBLE9BQU87QUFHYixTQUFLLFFBQVE7RUFDZjtBQUVBLEVBQUFBLFFBQUEsVUFBQSxRQUFBLFNBQU1DLE9BQVk7QUFDaEIsU0FBSyxPQUFPQTtBQUNaLFNBQUssT0FBTztBQUNaLFdBQU8sS0FBSyxXQUFVO0VBQ3hCO0FBRUEsRUFBQUQsUUFBQSxVQUFBLFNBQUEsV0FBQTtBQUNFLFdBQU8sS0FBSyxRQUFRLEtBQUssV0FBVztFQUN0QztBQUVBLEVBQUFBLFFBQUEsVUFBQSxhQUFBLFdBQUE7QUFDRSxRQUFJO0FBQ0osUUFBSTtBQUVKLFNBQUssU0FBUztBQUNkLFNBQUssUUFBUTtBQUNiLE9BQUc7QUFDRCxVQUFJLEtBQUs7QUFBTSxlQUFPO0FBRXRCLFVBQUksT0FBSTtBQUNSLGFBQU87QUFDUCxlQUFXLFVBQVEsS0FBSyxPQUFPO0FBQzdCLGVBQU8sS0FBSyxNQUFNO0FBQ2xCLFlBQU0sUUFBUSxLQUFLLEtBQUssS0FBSyxJQUFJO0FBQ2pDLFlBQUksT0FBTztBQUNULGNBQUksU0FBUyxRQUFRLE1BQU0sR0FBRyxTQUFTLEtBQUssR0FBRyxRQUFRO0FBQ3JELG1CQUFPO0FBQ1AseUJBQWE7Ozs7QUFLbkIsVUFBSSxRQUFRLE1BQU07QUFDaEIsYUFBSyxPQUFPLEtBQUssS0FBSyxPQUFPLEtBQUssR0FBRyxNQUFNO0FBRTNDLFlBQUksS0FBSyxTQUFTO0FBQUksZUFBSyxPQUFPOztBQUdwQyxVQUFJLFFBQVEsTUFBTTtBQUNoQixhQUFLLE9BQU87QUFDWixhQUFLLFNBQVM7QUFDZCxhQUFLLFFBQVE7QUFDYjs7YUFFSyxlQUFlO0FBRXhCLFNBQUssU0FBUztBQUNkLFNBQUssUUFBUTtBQUNiLFdBQU87RUFDVDtBQUVBLEVBQUFBLFFBQUEsVUFBQSxTQUFBLFNBQU8sTUFBWTtBQUNqQixRQUFJLEtBQUssV0FBVyxNQUFNO0FBQ3hCLFVBQUksS0FBSyxPQUFPO0FBQ2QsWUFBTSxJQUFJLEtBQUs7QUFDZixhQUFLLFdBQVU7QUFDZixlQUFPOztBQUdULFdBQUssV0FBVTtBQUNmLGFBQU87O0FBR1QsV0FBTztFQUNUO0FBRUEsRUFBQUEsUUFBQSxVQUFBLGVBQUEsV0FBQTtBQUNFLFdBQU8sS0FBSyxPQUFPLFFBQVE7RUFDN0I7QUFFQSxFQUFBQSxRQUFBLFVBQUEsU0FBQSxTQUFPLE1BQVk7QUFDakIsUUFBSSxLQUFLLE9BQU8sSUFBSTtBQUFHLGFBQU87QUFFOUIsVUFBTSxJQUFJLE1BQU0sY0FBYyxPQUFPLGdCQUFnQixLQUFLLE1BQU07RUFDbEU7QUFDRixTQUFBQTtBQUFBLEVBdEZBO0FBd0ZjLFNBQVAsVUFBMkJDLE9BQWMsVUFBNEI7QUFBNUIsTUFBQSxhQUFBLFFBQUE7QUFBQSxlQUFBO0VBQTRCO0FBQzFFLE1BQU0sVUFBNEIsQ0FBQTtBQUNsQyxNQUFNLE1BQU0sSUFBSSxPQUFPLFNBQVMsTUFBTTtBQUV0QyxNQUFJLENBQUMsSUFBSSxNQUFNQSxLQUFJO0FBQUcsV0FBTztBQUU3QixJQUFDO0FBQ0QsU0FBTztBQUVQLFdBQVMsSUFBQztBQUVSLFFBQUksT0FBTyxPQUFPO0FBQ2xCLFFBQU0sSUFBSSxJQUFJLGFBQVk7QUFDMUIsUUFBSTtBQUFHLGNBQVEsV0FBVyxTQUFTLEVBQUUsSUFBSSxFQUFFO0FBQzNDLFFBQUksSUFBSSxPQUFNO0FBQUksWUFBTSxJQUFJLE1BQU0sZ0JBQWdCO0FBRWxELFlBQVEsSUFBSTtXQUNMO0FBQ0gsZ0JBQVEsT0FBTyxNQUFNO0FBQ3JCLFlBQUksSUFBSSxXQUFVLEdBQUk7QUFDcEIsYUFBRTtBQUNGLFlBQUM7O0FBRUg7V0FJRztBQUNILGdCQUFRLE9BQU8sTUFBTTtBQUNyQixnQkFBUSxZQUFZLENBQUMsTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sRUFBRTtBQUNyRSxZQUFJLFdBQVU7QUFDZCxVQUFDO0FBQ0Q7V0FFRztBQUNILGdCQUFRLE9BQU8sTUFBTTtBQUNyQixZQUFJLElBQUksV0FBVSxHQUFJO0FBQ3BCLGFBQUU7QUFDRixZQUFDOztBQUVIO1dBRUc7QUFDSCxnQkFBUSxPQUFPLE1BQU07QUFDckIsWUFBSSxJQUFJLFdBQVUsR0FBSTtBQUNwQixhQUFFO0FBQ0YsWUFBQzs7QUFFSDtXQUVHO0FBQ0gsZ0JBQVEsT0FBTyxNQUFNO0FBQ3JCLFlBQUksSUFBSSxXQUFVLEdBQUk7QUFDcEIsYUFBRTtBQUNGLFlBQUM7O0FBRUg7V0FFRztBQUNILGdCQUFRLE9BQU8sTUFBTTtBQUNyQixZQUFJLElBQUksV0FBVSxHQUFJO0FBQ3BCLGFBQUU7QUFDRixZQUFDOztBQUVIO1dBRUc7QUFDSCxnQkFBUSxPQUFPLE1BQU07QUFDckIsWUFBSSxJQUFJLFdBQVUsR0FBSTtBQUNwQixhQUFFO0FBQ0YsWUFBQzs7QUFFSDtXQUVHO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO0FBQ0gsZ0JBQVEsT0FBTyxNQUFNO0FBQ3JCLFlBQU0sTUFBa0IsSUFBSSxPQUN6QixPQUFPLEdBQUcsQ0FBQyxFQUNYLFlBQVc7QUFDZCxnQkFBUSxZQUFZLENBQUMsTUFBTSxJQUFJO0FBRS9CLFlBQUksQ0FBQyxJQUFJLFdBQVU7QUFBSTtBQUd2QixlQUFPLElBQUksT0FBTyxPQUFPLEdBQUc7QUFDMUIsY0FBSSxJQUFJLE9BQU07QUFBSSxrQkFBTSxJQUFJLE1BQU0sZ0JBQWdCO0FBRWxELGNBQU0sTUFBTSxVQUFTO0FBQ3JCLGNBQUksQ0FBQyxLQUFLO0FBQ1Isa0JBQU0sSUFBSSxNQUNSLHVCQUF1QixJQUFJLFNBQVMsb0JBQW9COztBQUk1RCxrQkFBUSxVQUFVLEtBQUssTUFBTSxJQUFpQjtBQUM5QyxjQUFJLFdBQVU7O0FBRWhCLGNBQUs7QUFDTCxVQUFDO0FBQ0Q7V0FFRztXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7QUFDSCxnQkFBUSxPQUFPLE1BQU07QUFDckIsZ0JBQVEsVUFBVSxDQUFDLFFBQU8sQ0FBWTtBQUV0QyxZQUFJLENBQUMsSUFBSSxXQUFVO0FBQUk7QUFHdkIsZUFBTyxJQUFJLE9BQU8sT0FBTyxHQUFHO0FBQzFCLGNBQUksSUFBSSxPQUFNO0FBQUksa0JBQU0sSUFBSSxNQUFNLGdCQUFnQjtBQUVsRCxjQUFNLElBQUksUUFBTztBQUNqQixjQUFJLENBQUMsR0FBRztBQUNOLGtCQUFNLElBQUksTUFDUix1QkFBdUIsSUFBSSxTQUFTLGtCQUFrQjs7QUFJMUQsa0JBQVEsUUFBUSxLQUFLLENBQUM7QUFDdEIsY0FBSSxXQUFVOztBQUdoQixXQUFFO0FBQ0YsVUFBQztBQUNEOztBQUdBLGNBQU0sSUFBSSxNQUFNLGdCQUFnQjs7RUFFdEM7QUFFQSxXQUFTLEtBQUU7QUFDVCxRQUFNLEtBQUssSUFBSSxPQUFPLElBQUk7QUFDMUIsUUFBTSxNQUFNLElBQUksT0FBTyxLQUFLO0FBQzVCLFFBQUksRUFBRSxNQUFNO0FBQU07QUFFbEIsT0FBRztBQUNELFVBQU0sTUFBTSxVQUFTO0FBQ3JCLFVBQU0sTUFBTSxVQUFTO0FBQ3JCLFVBQU0sSUFBSSxRQUFPO0FBR2pCLFVBQUksS0FBSztBQUdQLFlBQUksS0FBSztBQUNQLGNBQUksV0FBVTtBQUNkLGNBQUksQ0FBQyxRQUFRO0FBQVcsb0JBQVEsWUFBWSxDQUFBO0FBQzFDLGtCQUFRLFVBQTBCLEtBQ2xDLE1BQU0sS0FBbUIsSUFBSSxHQUFHLENBQUM7ZUFFOUI7QUFDTCxjQUFJLENBQUMsUUFBUTtBQUFZLG9CQUFRLGFBQWEsQ0FBQTtBQUM1QyxrQkFBUSxXQUF3QixLQUFLLEdBQUc7QUFDMUMsY0FBSSxPQUFPLFFBQVE7O2lCQUdaLEtBQUs7QUFDZCxZQUFJLFdBQVU7QUFDZCxZQUFJLENBQUMsUUFBUTtBQUFXLGtCQUFRLFlBQVksQ0FBQTtBQUMxQyxnQkFBUSxVQUEwQixLQUFLLE1BQU0sSUFBa0I7aUJBQ3hELElBQUksV0FBVyxjQUFjO0FBQ3RDLFlBQUksV0FBVTtBQUNkLFlBQUksQ0FBQyxRQUFRLFdBQVc7QUFDdEIsa0JBQVEsWUFBWSxDQUFDLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUU7O2lCQUU5RCxJQUFJLFdBQVcsV0FBVztBQUNuQyxZQUFJLFdBQVU7QUFDZCxZQUFJLElBQUksSUFBSSxhQUFZO0FBQ3hCLFlBQUksQ0FBQyxHQUFHO0FBQ04sZ0JBQU0sSUFBSSxNQUNSLHVCQUF1QixJQUFJLFNBQVMsd0JBQXdCOztBQUdoRSxnQkFBUSxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3RDLGVBQU8sSUFBSSxPQUFPLE9BQU8sR0FBRztBQUMxQixjQUFJLElBQUksYUFBWTtBQUNwQixjQUFJLENBQUMsR0FBRztBQUNOLGtCQUFNLElBQUksTUFDUix1QkFBdUIsSUFBSSxTQUFTLHFCQUFxQjs7QUFHN0Qsa0JBQVEsU0FBUyxLQUFLLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7aUJBRWpDLEdBQUc7QUFDWixZQUFJLFdBQVU7QUFDZCxZQUFJLENBQUMsUUFBUTtBQUFTLGtCQUFRLFVBQVUsQ0FBQTtBQUN0QyxnQkFBUSxRQUFxQixLQUFLLENBQUM7YUFDaEM7QUFDTDs7YUFFSyxJQUFJLE9BQU8sT0FBTyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssSUFBSSxPQUFPLElBQUk7RUFDdEU7QUFFQSxXQUFTLEtBQUU7QUFDVCxRQUFNLEtBQUssSUFBSSxPQUFPLElBQUk7QUFDMUIsUUFBSSxDQUFDO0FBQUk7QUFFVCxPQUFHO0FBQ0QsVUFBSSxJQUFJLElBQUksYUFBWTtBQUN4QixVQUFJLENBQUMsR0FBRztBQUNOLGNBQU0sSUFBSSxNQUFNLHVCQUF1QixJQUFJLFNBQVMsaUJBQWlCOztBQUV2RSxjQUFRLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDcEMsYUFBTyxJQUFJLE9BQU8sT0FBTyxHQUFHO0FBQzFCLFlBQUksSUFBSSxhQUFZO0FBQ3BCLFlBQUksQ0FBQyxHQUFHO0FBQ04sZ0JBQU0sSUFBSSxNQUFNLHVCQUF1QixJQUFJLFNBQVMsaUJBQWlCOztBQUV2RSxnQkFBUSxPQUFPLEtBQUssU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDOzthQUVqQyxJQUFJLE9BQU8sT0FBTyxLQUFLLElBQUksT0FBTyxJQUFJO0VBQ2pEO0FBRUEsV0FBUyxVQUFPO0FBQ2QsWUFBUSxJQUFJO1dBQ0w7QUFDSCxlQUFPO1dBQ0o7QUFDSCxlQUFPO1dBQ0o7QUFDSCxlQUFPO1dBQ0o7QUFDSCxlQUFPO1dBQ0o7QUFDSCxlQUFPO1dBQ0o7QUFDSCxlQUFPO1dBQ0o7QUFDSCxlQUFPO1dBQ0o7QUFDSCxlQUFPO1dBQ0o7QUFDSCxlQUFPO1dBQ0o7QUFDSCxlQUFPO1dBQ0o7QUFDSCxlQUFPO1dBQ0o7QUFDSCxlQUFPOztBQUVQLGVBQU87O0VBRWI7QUFFQSxXQUFTLFlBQVM7QUFDaEIsWUFBUSxJQUFJO1dBQ0w7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7QUFDSCxlQUFPLElBQUksT0FBTyxPQUFPLEdBQUcsQ0FBQyxFQUFFLFlBQVc7O0FBRTFDLGVBQU87O0VBRWI7QUFFQSxXQUFTLFlBQVM7QUFDaEIsWUFBUSxJQUFJO1dBQ0w7QUFDSCxZQUFJLFdBQVU7QUFDZCxlQUFPO1dBQ0o7QUFDSCxZQUFJLFdBQVU7QUFDZCxlQUFPO1dBQ0o7QUFDSCxZQUFJLFdBQVU7QUFDZCxlQUFPLElBQUksT0FBTyxNQUFNLElBQUksS0FBSztXQUM5QjtBQUNILFlBQUksV0FBVTtBQUNkLGVBQU8sSUFBSSxPQUFPLE1BQU0sSUFBSSxLQUFLO1dBQzlCO0FBQ0gsWUFBTSxJQUFJLFNBQVMsSUFBSSxNQUFNLElBQUksRUFBRTtBQUNuQyxZQUFJLElBQUksUUFBUSxJQUFJO0FBQUssZ0JBQU0sSUFBSSxNQUFNLHVCQUF1QixDQUFDO0FBRWpFLFlBQUksV0FBVTtBQUNkLGVBQU8sSUFBSSxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUk7O0FBR2pDLGVBQU87O0VBRWI7QUFFQSxXQUFTLFFBQUs7QUFDWixRQUFJLE9BQU8sSUFBSTtBQUNmLFFBQUksT0FBTyxLQUFLO0FBRWhCLFFBQUksTUFBTSxVQUFTO0FBQ25CLFFBQUksQ0FBQztBQUFLO0FBRVYsWUFBUSxhQUFhLENBQUMsR0FBRztBQUN6QixRQUFJLFdBQVU7QUFFZCxXQUFPLElBQUksT0FBTyxPQUFPLEdBQUc7QUFDMUIsWUFBTSxVQUFTO0FBQ2YsVUFBSSxDQUFDLEtBQUs7QUFDUixjQUFNLElBQUksTUFDUix1QkFBdUIsSUFBSSxTQUFTLHFCQUFxQjs7QUFJN0QsY0FBUSxXQUFXLEtBQUssR0FBRztBQUMzQixVQUFJLFdBQVU7O0VBRWxCO0FBRUEsV0FBUyxJQUFDO0FBQ1IsUUFBSSxJQUFJLFdBQVcsU0FBUztBQUMxQixVQUFNLE9BQU8sS0FBSyxNQUFNLElBQUksSUFBSTtBQUVoQyxVQUFJLENBQUM7QUFBTSxjQUFNLElBQUksTUFBTSw2QkFBNkIsSUFBSSxJQUFJO0FBQ2hFLGNBQVEsUUFBUSxJQUFJLEtBQUssSUFBSTtlQUNwQixJQUFJLE9BQU8sS0FBSyxHQUFHO0FBQzVCLGNBQVEsUUFBUSxTQUFTLElBQUksTUFBTSxJQUFJLEVBQUU7QUFDekMsVUFBSSxPQUFPLFFBQVE7O0VBR3ZCO0FBQ0Y7OztBQ25hQSxJQUFZO0NBQVosU0FBWUMsWUFBUztBQUNuQixFQUFBQSxXQUFBQSxXQUFBLFlBQUEsS0FBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsYUFBQSxLQUFBO0FBQ0EsRUFBQUEsV0FBQUEsV0FBQSxZQUFBLEtBQUE7QUFDQSxFQUFBQSxXQUFBQSxXQUFBLFdBQUEsS0FBQTtBQUNBLEVBQUFBLFdBQUFBLFdBQUEsWUFBQSxLQUFBO0FBQ0EsRUFBQUEsV0FBQUEsV0FBQSxjQUFBLEtBQUE7QUFDQSxFQUFBQSxXQUFBQSxXQUFBLGNBQUEsS0FBQTtBQUNGLEdBUlksY0FBQSxZQUFTLENBQUEsRUFBQTtBQVVmLFNBQVUscUJBQ2QsTUFBZTtBQU1mLFNBQU8sT0FBTyxVQUFVO0FBQzFCOzs7QUMrREEsSUFBTSxXQUFXLFNBQVVDLE9BQWMsVUFBNEI7QUFBNUIsTUFBQSxhQUFBLFFBQUE7QUFBQSxlQUFBO0VBQTRCO0FBQ25FLFNBQU8sSUFBSSxNQUFNLFVBQVVBLE9BQU0sUUFBUSxLQUFLLE1BQVM7QUFDekQ7QUFFQSxJQUFNLFNBQVM7RUFDYjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBR0YsZUFBTyxjQUFjLENBQUE7QUFDckIsZUFBTyxZQUFZLFVBQVUsVUFBVTtBQUN2QyxlQUFPLFlBQVksVUFBVSxZQUFZO0FBQ3pDLGVBQU8sWUFBWSxVQUFVLFNBQVMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxNQUFNO0FBQzlELGVBQU8sWUFBWSxVQUFVLFVBQVU7QUFDdkMsZUFBTyxZQUFZLFVBQVUsV0FBVztBQUN4QyxlQUFPLFlBQVksVUFBVSxVQUFVLENBQUMsWUFBWSxXQUFXLEVBQUUsT0FBTyxNQUFNO0FBTTlFLElBQU0sU0FBUyxTQUNiLE9BQ0EsU0FDQSxVQUNBLGVBQTZCO0FBRTdCLFNBQU8sSUFBSSxlQUFPLE9BQU8sU0FBUyxVQUFVLGFBQWEsRUFBRSxTQUFRO0FBQ3JFO0FBRVEsSUFBQSxxQkFBdUIsZUFBTTs7O0FDL0hyQyxJQUFBLE9BQUEsV0FBQTtBQU1FLFdBQUFDLE1BQ0UsTUFDQSxRQUNBLFFBQ0EsYUFBbUI7QUFFbkIsU0FBSyxPQUFPO0FBQ1osU0FBSyxTQUFTO0FBQ2QsU0FBSyxTQUFTO0FBQ2QsU0FBSyxjQUFjLGVBQWU7RUFDcEM7QUFFQSxFQUFBQSxNQUFBLFVBQUEsV0FBQSxXQUFBO0FBQ0UsV0FBTyxLQUFLO0VBQ2Q7QUFFQSxFQUFBQSxNQUFBLFVBQUEsYUFBQSxXQUFBO0FBQ0UsV0FBTyxLQUFLO0VBQ2Q7QUFFQSxFQUFBQSxNQUFBLFVBQUEsYUFBQSxXQUFBO0FBQ0UsV0FBTyxLQUFLO0VBQ2Q7QUFFQSxFQUFBQSxNQUFBLFVBQUEsa0JBQUEsV0FBQTtBQUNFLFdBQU8sS0FBSztFQUNkO0FBRUEsRUFBQUEsTUFBQSxVQUFBLFVBQUEsV0FBQTtBQUNFLFlBQ0csS0FBSyxPQUFPLEtBQUssS0FBSyxLQUFLLFNBQVMsS0FBSyxLQUFLLFVBQVUsTUFDekQsS0FBSztFQUVUO0FBQ0YsU0FBQUE7QUFBQSxFQXhDQTtBQTBDQSxJQUFBLFdBQUEsU0FBQSxRQUFBO0FBQThCLFlBQUFDLFdBQUEsTUFBQTtBQWlCNUIsV0FBQUEsVUFDRSxNQUNBLE9BQ0EsS0FDQSxNQUNBLFFBQ0EsUUFDQSxhQUFtQjtBQVByQixRQUFBLFFBU0UsT0FBQSxLQUFBLE1BQU0sTUFBTSxRQUFRLFFBQVEsV0FBVyxLQUFDO0FBQ3hDLFVBQUssT0FBTztBQUNaLFVBQUssUUFBUTtBQUNiLFVBQUssTUFBTTs7RUFDYjtBQXpCTyxFQUFBQSxVQUFBLFdBQVAsU0FBZ0IsTUFBVTtBQUN4QixXQUFPLElBQUksS0FDVCxLQUFLLGVBQWMsR0FDbkIsS0FBSyxZQUFXLElBQUssR0FDckIsS0FBSyxXQUFVLEdBQ2YsS0FBSyxZQUFXLEdBQ2hCLEtBQUssY0FBYSxHQUNsQixLQUFLLGNBQWEsR0FDbEIsS0FBSyxRQUFPLElBQUssR0FBSTtFQUV6QjtBQWlCQSxFQUFBQSxVQUFBLFVBQUEsYUFBQSxXQUFBO0FBQ0UsV0FBTyxTQUFTLFdBQVcsSUFBSSxLQUFLLEtBQUssUUFBTyxDQUFFLENBQUM7RUFDckQ7QUFFQSxFQUFBQSxVQUFBLFVBQUEsVUFBQSxXQUFBO0FBQ0UsV0FBTyxJQUFJLEtBQ1QsS0FBSyxJQUNILEtBQUssTUFDTCxLQUFLLFFBQVEsR0FDYixLQUFLLEtBQ0wsS0FBSyxNQUNMLEtBQUssUUFDTCxLQUFLLFFBQ0wsS0FBSyxXQUFXLENBQ2pCLEVBQ0QsUUFBTztFQUNYO0FBRUEsRUFBQUEsVUFBQSxVQUFBLFNBQUEsV0FBQTtBQUNFLFdBQU8sS0FBSztFQUNkO0FBRUEsRUFBQUEsVUFBQSxVQUFBLFdBQUEsV0FBQTtBQUNFLFdBQU8sS0FBSztFQUNkO0FBRUEsRUFBQUEsVUFBQSxVQUFBLFVBQUEsV0FBQTtBQUNFLFdBQU8sS0FBSztFQUNkO0FBRU8sRUFBQUEsVUFBQSxVQUFBLFdBQVAsU0FBZ0IsT0FBYTtBQUMzQixTQUFLLFFBQVE7RUFDZjtBQUVPLEVBQUFBLFVBQUEsVUFBQSxZQUFQLFNBQWlCLFFBQWM7QUFDN0IsU0FBSyxTQUFTO0FBQ2QsUUFBSSxLQUFLLFFBQVEsSUFBSTtBQUNuQixVQUFNLFVBQVUsS0FBSyxNQUFNLEtBQUssUUFBUSxFQUFFO0FBQzFDLFVBQU0sV0FBVyxNQUFNLEtBQUssT0FBTyxFQUFFO0FBQ3JDLFdBQUssUUFBUTtBQUNiLFdBQUssUUFBUTtBQUNiLFVBQUksS0FBSyxVQUFVLEdBQUc7QUFDcEIsYUFBSyxRQUFRO0FBQ2IsVUFBRSxLQUFLOzs7RUFHYjtBQUVPLEVBQUFBLFVBQUEsVUFBQSxZQUFQLFNBQWlCLE1BQWMsTUFBWTtBQUN6QyxRQUFJLE9BQU8sS0FBSyxXQUFVLEdBQUk7QUFDNUIsV0FBSyxPQUFPLEVBQUUsS0FBSyxXQUFVLElBQUssS0FBSyxJQUFJLFNBQVMsT0FBTztXQUN0RDtBQUNMLFdBQUssT0FBTyxFQUFFLEtBQUssV0FBVSxJQUFLLFFBQVEsT0FBTzs7QUFHbkQsU0FBSyxPQUFNO0VBQ2I7QUFFTyxFQUFBQSxVQUFBLFVBQUEsV0FBUCxTQUFnQixNQUFZO0FBQzFCLFNBQUssT0FBTztBQUNaLFNBQUssT0FBTTtFQUNiO0FBRU8sRUFBQUEsVUFBQSxVQUFBLFdBQVAsU0FBZ0IsT0FBZSxVQUFtQixRQUFnQjtBQUNoRSxRQUFJLFVBQVU7QUFFWixXQUFLLFFBQVEsS0FBSyxPQUFPLEtBQUssS0FBSyxRQUFRLEtBQUssSUFBSTs7QUFHdEQsZUFBUztBQUNQLFdBQUssUUFBUTtBQUNQLFVBQUEsS0FBZ0MsT0FBTyxLQUFLLE1BQU0sRUFBRSxHQUE3QyxTQUFNLEdBQUEsS0FBTyxVQUFPLEdBQUE7QUFDakMsVUFBSSxRQUFRO0FBQ1YsYUFBSyxPQUFPO0FBQ1osYUFBSyxTQUFTLE1BQU07O0FBR3RCLFVBQUksTUFBTSxNQUFNLEtBQUssU0FBUyxRQUFRLEtBQUssSUFBSTtBQUFHOztFQUV0RDtBQUVPLEVBQUFBLFVBQUEsVUFBQSxhQUFQLFNBQ0UsU0FDQSxVQUNBLFFBQ0EsVUFBa0I7QUFFbEIsUUFBSSxVQUFVO0FBRVosV0FBSyxVQUNILEtBQUssT0FBTyxRQUFRLEtBQUssT0FBTyxLQUFLLEtBQUssV0FBVyxPQUFPLElBQUk7O0FBR3BFLGVBQVM7QUFDUCxXQUFLLFVBQVU7QUFDVCxVQUFBLEtBQW1DLE9BQU8sS0FBSyxRQUFRLEVBQUUsR0FBbEQsVUFBTyxHQUFBLEtBQU8sWUFBUyxHQUFBO0FBQ3BDLFVBQUksU0FBUztBQUNYLGFBQUssU0FBUztBQUNkLGFBQUssU0FBUyxTQUFTLE9BQU8sTUFBTTs7QUFHdEMsV0FDRyxNQUFNLE1BQU0sS0FBSyxTQUFTLFFBQVEsS0FBSyxJQUFJLE9BQzNDLE1BQU0sUUFBUSxLQUFLLFNBQVMsVUFBVSxLQUFLLE1BQU0sSUFDbEQ7QUFDQTs7O0VBR047QUFFTyxFQUFBQSxVQUFBLFVBQUEsYUFBUCxTQUNFLFNBQ0EsVUFDQSxRQUNBLFVBQ0EsVUFBa0I7QUFFbEIsUUFBSSxVQUFVO0FBRVosV0FBSyxVQUNILEtBQUssT0FDRixTQUFTLEtBQUssT0FBTyxPQUFPLEtBQUssU0FBUyxLQUFLLEtBQUssV0FDbkQsT0FBTyxJQUNQOztBQUdSLGVBQVM7QUFDUCxXQUFLLFVBQVU7QUFDVCxVQUFBLEtBQXFDLE9BQU8sS0FBSyxRQUFRLEVBQUUsR0FBcEQsWUFBUyxHQUFBLEtBQU8sWUFBUyxHQUFBO0FBQ3RDLFVBQUksV0FBVztBQUNiLGFBQUssU0FBUztBQUNkLGFBQUssV0FBVyxXQUFXLE9BQU8sUUFBUSxRQUFROztBQUdwRCxXQUNHLE1BQU0sTUFBTSxLQUFLLFNBQVMsUUFBUSxLQUFLLElBQUksT0FDM0MsTUFBTSxRQUFRLEtBQUssU0FBUyxVQUFVLEtBQUssTUFBTSxPQUNqRCxNQUFNLFFBQVEsS0FBSyxTQUFTLFVBQVUsS0FBSyxNQUFNLElBQ2xEO0FBQ0E7OztFQUdOO0FBRU8sRUFBQUEsVUFBQSxVQUFBLFNBQVAsV0FBQTtBQUNFLFFBQUksS0FBSyxPQUFPLElBQUk7QUFDbEI7O0FBR0YsUUFBSSxjQUFjLFNBQVMsV0FBVyxLQUFLLE1BQU0sS0FBSyxRQUFRLENBQUMsRUFBRTtBQUNqRSxRQUFJLEtBQUssT0FBTyxhQUFhO0FBQzNCOztBQUdGLFdBQU8sS0FBSyxNQUFNLGFBQWE7QUFDN0IsV0FBSyxPQUFPO0FBQ1osUUFBRSxLQUFLO0FBQ1AsVUFBSSxLQUFLLFVBQVUsSUFBSTtBQUNyQixhQUFLLFFBQVE7QUFDYixVQUFFLEtBQUs7QUFDUCxZQUFJLEtBQUssT0FBTyxTQUFTLFNBQVM7QUFDaEM7OztBQUlKLG9CQUFjLFNBQVMsV0FBVyxLQUFLLE1BQU0sS0FBSyxRQUFRLENBQUMsRUFBRTs7RUFFakU7QUFFTyxFQUFBQSxVQUFBLFVBQUEsTUFBUCxTQUFXLFNBQXdCLFVBQWlCO0FBQzFDLFFBQUEsT0FBcUQsUUFBTyxNQUF0RCxXQUErQyxRQUFPLFVBQTVDLE9BQXFDLFFBQU8sTUFBdEMsU0FBK0IsUUFBTyxRQUE5QixXQUF1QixRQUFPLFVBQXBCLFdBQWEsUUFBTztBQUVwRSxZQUFRO1dBQ0QsVUFBVTtBQUNiLGVBQU8sS0FBSyxTQUFTLFFBQVE7V0FDMUIsVUFBVTtBQUNiLGVBQU8sS0FBSyxVQUFVLFFBQVE7V0FDM0IsVUFBVTtBQUNiLGVBQU8sS0FBSyxVQUFVLFVBQVUsSUFBSTtXQUNqQyxVQUFVO0FBQ2IsZUFBTyxLQUFLLFNBQVMsUUFBUTtXQUMxQixVQUFVO0FBQ2IsZUFBTyxLQUFLLFNBQVMsVUFBVSxVQUFVLE1BQU07V0FDNUMsVUFBVTtBQUNiLGVBQU8sS0FBSyxXQUFXLFVBQVUsVUFBVSxRQUFRLFFBQVE7V0FDeEQsVUFBVTtBQUNiLGVBQU8sS0FBSyxXQUFXLFVBQVUsVUFBVSxRQUFRLFVBQVUsUUFBUTs7RUFFM0U7QUFDRixTQUFBQTtBQUFBLEVBN044QixJQUFJOzs7QUNoQzVCLFNBQVUsa0JBQWtCLFNBQXlCO0FBQ3pELE1BQU0sVUFBb0IsQ0FBQTtBQUMxQixNQUFNLE9BQU8sT0FBTyxLQUFLLE9BQU87QUFHaEMsV0FBa0IsS0FBQSxHQUFBLFNBQUEsTUFBQSxLQUFBLE9BQUEsUUFBQSxNQUFNO0FBQW5CLFFBQU0sTUFBRyxPQUFBO0FBQ1osUUFBSSxDQUFDLFNBQVMsYUFBYSxHQUFHO0FBQUcsY0FBUSxLQUFLLEdBQUc7QUFDakQsUUFBSSxpQkFBUyxPQUFPLFFBQVEsSUFBSSxLQUFLLENBQUMsaUJBQVMsWUFBWSxRQUFRLElBQUksR0FBRztBQUN4RSxjQUFRLEtBQUssR0FBRzs7O0FBSXBCLE1BQUksUUFBUSxRQUFRO0FBQ2xCLFVBQU0sSUFBSSxNQUFNLHNCQUFzQixRQUFRLEtBQUssSUFBSSxDQUFDOztBQUcxRCxTQUFBLFNBQUEsQ0FBQSxHQUFZLE9BQU87QUFDckI7QUFFTSxTQUFVLGFBQWEsU0FBeUI7QUFDcEQsTUFBTSxPQUFJLFNBQUEsU0FBQSxDQUFBLEdBQVEsZUFBZSxHQUFLLGtCQUFrQixPQUFPLENBQUM7QUFFaEUsTUFBSSxVQUFVLEtBQUssUUFBUTtBQUFHLFNBQUssT0FBTyxNQUFNO0FBRWhELE1BQUksRUFBRSxVQUFVLEtBQUssSUFBSSxLQUFLLE1BQU0sWUFBWSxLQUFLLFFBQVE7QUFDM0QsVUFBTSxJQUFJLE1BQU0sc0JBQUEsT0FBc0IsS0FBSyxNQUFJLEdBQUEsRUFBQSxPQUFJLFFBQVEsSUFBSSxDQUFFOztBQUduRSxNQUFJLENBQUMsS0FBSztBQUFTLFNBQUssVUFBVSxJQUFJLEtBQUssSUFBSSxLQUFJLEVBQUcsZ0JBQWdCLENBQUMsQ0FBQztBQUV4RSxNQUFJLENBQUMsVUFBVSxLQUFLLElBQUksR0FBRztBQUN6QixTQUFLLE9BQU8sTUFBTSxHQUFHO2FBQ1osU0FBUyxLQUFLLElBQUksR0FBRztTQUV6QjtBQUNMLFNBQUssT0FBTyxLQUFLLEtBQUs7O0FBR3hCLE1BQUksVUFBVSxLQUFLLFFBQVEsR0FBRztBQUM1QixRQUFJLFNBQVMsS0FBSyxRQUFRO0FBQUcsV0FBSyxXQUFXLENBQUMsS0FBSyxRQUFRO0FBRTNELGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxTQUFTLFFBQVEsS0FBSztBQUM3QyxVQUFNLElBQUksS0FBSyxTQUFTO0FBQ3hCLFVBQUksTUFBTSxLQUFLLEVBQUUsS0FBSyxRQUFRLEtBQUssTUFBTTtBQUN2QyxjQUFNLElBQUksTUFDUiw0REFBaUU7Ozs7QUFNekUsTUFDRSxFQUNFLFFBQVEsS0FBSyxRQUFrQixLQUMvQixTQUFTLEtBQUssUUFBb0IsS0FDbEMsU0FBUyxLQUFLLFNBQXFCLEtBQ25DLFFBQVEsS0FBSyxVQUFVLEtBQ3ZCLFNBQVMsS0FBSyxVQUFzQixLQUNwQyxVQUFVLEtBQUssU0FBUyxLQUN4QixVQUFVLEtBQUssUUFBUSxJQUV6QjtBQUNBLFlBQVEsS0FBSztXQUNOLE1BQU07QUFDVCxZQUFJLENBQUMsS0FBSztBQUFTLGVBQUssVUFBVSxLQUFLLFFBQVEsWUFBVyxJQUFLO0FBQy9ELGFBQUssYUFBYSxLQUFLLFFBQVEsV0FBVTtBQUN6QztXQUNHLE1BQU07QUFDVCxhQUFLLGFBQWEsS0FBSyxRQUFRLFdBQVU7QUFDekM7V0FDRyxNQUFNO0FBQ1QsYUFBSyxZQUFZLENBQUMsaUJBQVMsV0FBVyxLQUFLLE9BQU8sQ0FBQztBQUNuRDs7O0FBS04sTUFBSSxVQUFVLEtBQUssT0FBTyxLQUFLLENBQUMsUUFBUSxLQUFLLE9BQU8sR0FBRztBQUNyRCxTQUFLLFVBQVUsQ0FBQyxLQUFLLE9BQU87O0FBSTlCLE1BQ0UsVUFBVSxLQUFLLFNBQVMsS0FDeEIsQ0FBQyxRQUFRLEtBQUssU0FBUyxLQUN2QixTQUFTLEtBQUssU0FBUyxHQUN2QjtBQUNBLFNBQUssWUFBWSxDQUFDLEtBQUssU0FBUzs7QUFJbEMsTUFBSSxDQUFDLFVBQVUsS0FBSyxVQUFVLEdBQUc7QUFDL0IsU0FBSyxhQUFhLENBQUE7QUFDbEIsU0FBSyxjQUFjLENBQUE7YUFDVixRQUFRLEtBQUssVUFBVSxHQUFHO0FBQ25DLFFBQU0sYUFBYSxDQUFBO0FBQ25CLFFBQU0sY0FBYyxDQUFBO0FBRXBCLGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxXQUFXLFFBQVEsS0FBSztBQUMvQyxVQUFNLElBQUksS0FBSyxXQUFXO0FBQzFCLFVBQUksSUFBSSxHQUFHO0FBQ1QsbUJBQVcsS0FBSyxDQUFDO2lCQUNSLElBQUksR0FBRztBQUNoQixvQkFBWSxLQUFLLENBQUM7OztBQUd0QixTQUFLLGFBQWE7QUFDbEIsU0FBSyxjQUFjO2FBQ1YsS0FBSyxhQUFhLEdBQUc7QUFDOUIsU0FBSyxjQUFjLENBQUMsS0FBSyxVQUFVO0FBQ25DLFNBQUssYUFBYSxDQUFBO1NBQ2I7QUFDTCxTQUFLLGNBQWMsQ0FBQTtBQUNuQixTQUFLLGFBQWEsQ0FBQyxLQUFLLFVBQVU7O0FBSXBDLE1BQUksVUFBVSxLQUFLLFFBQVEsS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLEdBQUc7QUFDdkQsU0FBSyxXQUFXLENBQUMsS0FBSyxRQUFROztBQUloQyxNQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsR0FBRztBQUM5QixTQUFLLGFBQWE7YUFDVCxTQUFTLEtBQUssU0FBUyxHQUFHO0FBQ25DLFNBQUssWUFBWSxDQUFDLEtBQUssU0FBUztBQUNoQyxTQUFLLGFBQWE7YUFDVCxhQUFhLEtBQUssU0FBUyxHQUFHO0FBQ3ZDLFNBQUssWUFBWSxDQUFDLFFBQVEsUUFBUSxLQUFLLFNBQVMsRUFBRSxPQUFPO0FBQ3pELFNBQUssYUFBYTthQUNULEtBQUsscUJBQXFCLFNBQVM7QUFDNUMsUUFBSSxDQUFDLEtBQUssVUFBVSxLQUFLLEtBQUssT0FBTyxNQUFNLFNBQVM7QUFDbEQsV0FBSyxZQUFZLENBQUMsS0FBSyxVQUFVLE9BQU87QUFDeEMsV0FBSyxhQUFhO1dBQ2I7QUFDTCxXQUFLLGFBQWEsQ0FBQyxDQUFDLEtBQUssVUFBVSxTQUFTLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDN0QsV0FBSyxZQUFZOztTQUVkO0FBQ0wsUUFBTSxZQUFzQixDQUFBO0FBQzVCLFFBQU0sYUFBYSxDQUFBO0FBRW5CLGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxVQUFVLFFBQVEsS0FBSztBQUM5QyxVQUFNLE9BQU8sS0FBSyxVQUFVO0FBRTVCLFVBQUksU0FBUyxJQUFJLEdBQUc7QUFDbEIsa0JBQVUsS0FBSyxJQUFJO0FBQ25CO2lCQUNTLGFBQWEsSUFBSSxHQUFHO0FBQzdCLGtCQUFVLEtBQUssUUFBUSxRQUFRLElBQUksRUFBRSxPQUFPO0FBQzVDOztBQUdGLFVBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxPQUFPLE1BQU0sU0FBUztBQUN4QyxrQkFBVSxLQUFLLEtBQUssT0FBTzthQUN0QjtBQUNMLG1CQUFXLEtBQUssQ0FBQyxLQUFLLFNBQVMsS0FBSyxDQUFDLENBQUM7OztBQUcxQyxTQUFLLFlBQVksU0FBUyxTQUFTLElBQUksWUFBWTtBQUNuRCxTQUFLLGFBQWEsU0FBUyxVQUFVLElBQUksYUFBYTs7QUFJeEQsTUFBSSxDQUFDLFVBQVUsS0FBSyxNQUFNLEdBQUc7QUFDM0IsU0FBSyxTQUFTLEtBQUssT0FBTyxNQUFNLFNBQVMsQ0FBQyxLQUFLLFFBQVEsWUFBVyxDQUFFLElBQUk7YUFDL0QsU0FBUyxLQUFLLE1BQU0sR0FBRztBQUNoQyxTQUFLLFNBQVMsQ0FBQyxLQUFLLE1BQU07O0FBSTVCLE1BQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxHQUFHO0FBQzdCLFNBQUssV0FDSCxLQUFLLE9BQU8sTUFBTSxXQUFXLENBQUMsS0FBSyxRQUFRLGNBQWEsQ0FBRSxJQUFJO2FBQ3ZELFNBQVMsS0FBSyxRQUFRLEdBQUc7QUFDbEMsU0FBSyxXQUFXLENBQUMsS0FBSyxRQUFROztBQUloQyxNQUFJLENBQUMsVUFBVSxLQUFLLFFBQVEsR0FBRztBQUM3QixTQUFLLFdBQ0gsS0FBSyxPQUFPLE1BQU0sV0FBVyxDQUFDLEtBQUssUUFBUSxjQUFhLENBQUUsSUFBSTthQUN2RCxTQUFTLEtBQUssUUFBUSxHQUFHO0FBQ2xDLFNBQUssV0FBVyxDQUFDLEtBQUssUUFBUTs7QUFHaEMsU0FBTyxFQUFFLGVBQWUsS0FBcUI7QUFDL0M7QUFFTSxTQUFVLGFBQWEsTUFBbUI7QUFDOUMsTUFBTSxvQkFBb0IsS0FBSyxRQUFRLFFBQU8sSUFBSztBQUNuRCxNQUFJLENBQUMscUJBQXFCLEtBQUssSUFBSSxHQUFHO0FBQ3BDLFdBQU8sQ0FBQTs7QUFHVCxNQUFNLFVBQWtCLENBQUE7QUFDeEIsT0FBSyxPQUFPLFFBQVEsU0FBQyxNQUFJO0FBQ3ZCLFNBQUssU0FBUyxRQUFRLFNBQUMsUUFBTTtBQUMzQixXQUFLLFNBQVMsUUFBUSxTQUFDLFFBQU07QUFDM0IsZ0JBQVEsS0FBSyxJQUFJLEtBQUssTUFBTSxRQUFRLFFBQVEsaUJBQWlCLENBQUM7TUFDaEUsQ0FBQztJQUNILENBQUM7RUFDSCxDQUFDO0FBRUQsU0FBTztBQUNUOzs7QUN0Tk0sU0FBVSxZQUFZLFdBQWlCO0FBQzNDLE1BQU0sVUFBVSxVQUNiLE1BQU0sSUFBSSxFQUNWLElBQUksU0FBUyxFQUNiLE9BQU8sU0FBQyxHQUFDO0FBQUssV0FBQSxNQUFNO0VBQU4sQ0FBVTtBQUMzQixTQUFBLFNBQUEsU0FBQSxDQUFBLEdBQVksUUFBUSxFQUFFLEdBQUssUUFBUSxFQUFFO0FBQ3ZDO0FBRU0sU0FBVSxhQUFhLE1BQVk7QUFDdkMsTUFBTSxVQUE0QixDQUFBO0FBRWxDLE1BQU0sa0JBQWtCLCtDQUErQyxLQUNyRSxJQUFJO0FBR04sTUFBSSxDQUFDLGlCQUFpQjtBQUNwQixXQUFPOztBQUdBLE1BQUEsT0FBaUIsZ0JBQWUsSUFBMUIsVUFBVyxnQkFBZTtBQUV6QyxNQUFJLE1BQU07QUFDUixZQUFRLE9BQU87O0FBRWpCLFVBQVEsVUFBVSxpQkFBUyxrQkFBa0IsT0FBTztBQUNwRCxTQUFPO0FBQ1Q7QUFFQSxTQUFTLFVBQVUsV0FBaUI7QUFDbEMsY0FBWSxVQUFVLFFBQVEsYUFBYSxFQUFFO0FBQzdDLE1BQUksQ0FBQyxVQUFVO0FBQVEsV0FBTztBQUU5QixNQUFNLFNBQVMsaUJBQWlCLEtBQUssVUFBVSxZQUFXLENBQUU7QUFDNUQsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPLFdBQVcsU0FBUzs7QUFHcEIsTUFBQSxNQUFPLE9BQU07QUFDdEIsVUFBUSxJQUFJLFlBQVc7U0FDaEI7U0FDQTtBQUNILGFBQU8sV0FBVyxTQUFTO1NBQ3hCO0FBQ0gsYUFBTyxhQUFhLFNBQVM7O0FBRTdCLFlBQU0sSUFBSSxNQUFNLHdCQUFBLE9BQXdCLEtBQUcsTUFBQSxFQUFBLE9BQU8sU0FBUyxDQUFFOztBQUVuRTtBQUVBLFNBQVMsV0FBVyxNQUFZO0FBQzlCLE1BQU0sZUFBZSxLQUFLLFFBQVEsWUFBWSxFQUFFO0FBQ2hELE1BQU0sVUFBVSxhQUFhLFlBQVk7QUFFekMsTUFBTSxRQUFRLEtBQUssUUFBUSx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sR0FBRztBQUUvRCxRQUFNLFFBQVEsU0FBQ0MsT0FBSTtBQUNYLFFBQUEsS0FBZUEsTUFBSyxNQUFNLEdBQUcsR0FBNUIsTUFBRyxHQUFBLElBQUUsUUFBSyxHQUFBO0FBQ2pCLFlBQVEsSUFBSSxZQUFXO1dBQ2hCO0FBQ0gsZ0JBQVEsT0FBTyxVQUFVLE1BQU0sWUFBVztBQUMxQztXQUNHO0FBQ0gsZ0JBQVEsT0FBTyxLQUFLLE1BQU0sWUFBVztBQUNyQztXQUNHO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO0FBQ0gsWUFBTSxNQUFNLFlBQVksS0FBSztBQUM3QixZQUFNLFlBQVksSUFBSSxZQUFXO0FBR2pDLGdCQUFRLGFBQWE7QUFDckI7V0FDRztXQUNBO0FBQ0gsZ0JBQVEsWUFBWSxhQUFhLEtBQUs7QUFDdEM7V0FDRztXQUNBO0FBRUgsWUFBTSxVQUFVLGFBQWEsSUFBSTtBQUNqQyxnQkFBUSxPQUFPLFFBQVE7QUFDdkIsZ0JBQVEsVUFBVSxRQUFRO0FBQzFCO1dBQ0c7QUFDSCxnQkFBUSxRQUFRLGlCQUFTLGtCQUFrQixLQUFLO0FBQ2hEO1dBQ0c7QUFDSCxnQkFBUSxXQUFXLE9BQU8sS0FBSztBQUMvQjs7QUFFQSxjQUFNLElBQUksTUFBTSw2QkFBNkIsTUFBTSxHQUFHOztFQUU1RCxDQUFDO0FBRUQsU0FBTztBQUNUO0FBRUEsU0FBUyxZQUFZLE9BQWE7QUFDaEMsTUFBSSxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUk7QUFDN0IsUUFBTSxTQUFTLE1BQU0sTUFBTSxHQUFHO0FBQzlCLFdBQU8sT0FBTyxJQUFJLHFCQUFxQjs7QUFHekMsU0FBTyxzQkFBc0IsS0FBSztBQUNwQztBQUVBLFNBQVMsc0JBQXNCLE9BQWE7QUFDMUMsTUFBSSxhQUFhLEtBQUssS0FBSyxHQUFHO0FBQzVCLFdBQU8sT0FBTyxLQUFLOztBQUdyQixTQUFPO0FBQ1Q7QUFFQSxTQUFTLGFBQWEsT0FBYTtBQUNqQyxNQUFNLE9BQU8sTUFBTSxNQUFNLEdBQUc7QUFFNUIsU0FBTyxLQUFLLElBQUksU0FBQyxLQUFHO0FBQ2xCLFFBQUksSUFBSSxXQUFXLEdBQUc7QUFFcEIsYUFBTyxLQUFLOztBQUlkLFFBQU0sUUFBUSxJQUFJLE1BQU0sNEJBQTRCO0FBQ3BELFFBQUksQ0FBQyxTQUFTLE1BQU0sU0FBUyxHQUFHO0FBQzlCLFlBQU0sSUFBSSxZQUFZLDJCQUFBLE9BQTJCLEdBQUcsQ0FBRTs7QUFFeEQsUUFBTSxJQUFJLE9BQU8sTUFBTSxFQUFFO0FBQ3pCLFFBQU0sV0FBVyxNQUFNO0FBQ3ZCLFFBQU0sT0FBTyxLQUFLLFVBQVU7QUFDNUIsV0FBTyxJQUFJLFFBQVEsTUFBTSxDQUFDO0VBQzVCLENBQUM7QUFDSDs7O0FDaEpBLElBQUEsZUFBQSxXQUFBO0FBSUUsV0FBQUMsY0FBWSxNQUFZLE1BQW9CO0FBQzFDLFFBQUksTUFBTSxLQUFLLFFBQU8sQ0FBRSxHQUFHO0FBQ3pCLFlBQU0sSUFBSSxXQUFXLHFDQUFxQzs7QUFFNUQsU0FBSyxPQUFPO0FBQ1osU0FBSyxPQUFPO0VBQ2Q7QUFFQSxTQUFBLGVBQVlBLGNBQUEsV0FBQSxTQUFLO1NBQWpCLFdBQUE7QUFDRSxhQUFPLENBQUMsS0FBSyxRQUFRLEtBQUssS0FBSyxZQUFXLE1BQU87SUFDbkQ7Ozs7QUFFTyxFQUFBQSxjQUFBLFVBQUEsV0FBUCxXQUFBO0FBQ0UsUUFBTSxVQUFVLGlCQUFTLGtCQUFrQixLQUFLLEtBQUssUUFBTyxHQUFJLEtBQUssS0FBSztBQUMxRSxRQUFJLENBQUMsS0FBSyxPQUFPO0FBQ2YsYUFBTyxTQUFBLE9BQVMsS0FBSyxNQUFJLEdBQUEsRUFBQSxPQUFJLE9BQU87O0FBR3RDLFdBQU8sSUFBQSxPQUFJLE9BQU87RUFDcEI7QUFFTyxFQUFBQSxjQUFBLFVBQUEsVUFBUCxXQUFBO0FBQ0UsV0FBTyxLQUFLLEtBQUssUUFBTztFQUMxQjtBQUVPLEVBQUFBLGNBQUEsVUFBQSxjQUFQLFdBQUE7O0FBQ0UsUUFBSSxLQUFLLE9BQU87QUFDZCxhQUFPLEtBQUs7O0FBR2QsUUFBTSxnQkFBZ0IsS0FBSyxlQUFjLEVBQUcsZ0JBQWUsRUFBRztBQUM5RCxRQUFNLGdCQUFnQixJQUFJLEtBQ3hCLEtBQUssS0FBSyxlQUFlLFFBQVcsRUFBRSxVQUFVLGNBQWEsQ0FBRSxDQUFDO0FBRWxFLFFBQU0saUJBQWlCLElBQUksS0FDekIsS0FBSyxLQUFLLGVBQWUsUUFBVyxFQUFFLFdBQVUsS0FBQSxLQUFLLFVBQUksUUFBQSxPQUFBLFNBQUEsS0FBSSxNQUFLLENBQUUsQ0FBQztBQUV2RSxRQUFNLFdBQVcsZUFBZSxRQUFPLElBQUssY0FBYyxRQUFPO0FBRWpFLFdBQU8sSUFBSSxLQUFLLEtBQUssS0FBSyxRQUFPLElBQUssUUFBUTtFQUNoRDtBQUNGLFNBQUFBO0FBQUEsRUE3Q0E7OztBQ0tNLFNBQVUsZ0JBQWdCLFNBQXlCO0FBQ3ZELE1BQU0sUUFBb0IsQ0FBQTtBQUMxQixNQUFJLFVBQVU7QUFDZCxNQUFNLE9BQTBCLE9BQU8sS0FBSyxPQUFPO0FBQ25ELE1BQU1DLGVBQWMsT0FBTyxLQUFLLGVBQWU7QUFFL0MsV0FBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUNwQyxRQUFJLEtBQUssT0FBTztBQUFRO0FBQ3hCLFFBQUksQ0FBQyxTQUFTQSxjQUFhLEtBQUssRUFBRTtBQUFHO0FBRXJDLFFBQUksTUFBTSxLQUFLLEdBQUcsWUFBVztBQUM3QixRQUFNLFFBQVEsUUFBUSxLQUFLO0FBQzNCLFFBQUksV0FBVztBQUVmLFFBQUksQ0FBQyxVQUFVLEtBQUssS0FBTSxRQUFRLEtBQUssS0FBSyxDQUFDLE1BQU07QUFBUztBQUU1RCxZQUFRO1dBQ0Q7QUFDSCxtQkFBVyxNQUFNLFlBQVksUUFBUTtBQUNyQztXQUNHO0FBQ0gsWUFBSSxTQUFTLEtBQUssR0FBRztBQUNuQixxQkFBVyxJQUFJLFFBQVEsS0FBSyxFQUFFLFNBQVE7ZUFDakM7QUFDTCxxQkFBVyxNQUFNLFNBQVE7O0FBRTNCO1dBQ0c7QUFZSCxjQUFNO0FBQ04sbUJBQVcsUUFDVCxLQUFvQyxFQUVuQyxJQUFJLFNBQUMsTUFBSTtBQUNSLGNBQUksZ0JBQWdCLFNBQVM7QUFDM0IsbUJBQU87O0FBR1QsY0FBSSxRQUFRLElBQUksR0FBRztBQUNqQixtQkFBTyxJQUFJLFFBQVEsS0FBSyxJQUFJLEtBQUssRUFBRTs7QUFHckMsaUJBQU8sSUFBSSxRQUFRLElBQUk7UUFDekIsQ0FBQyxFQUNBLFNBQVE7QUFFWDtXQUNHO0FBQ0gsa0JBQVUsYUFBYSxPQUFpQixRQUFRLElBQUk7QUFDcEQ7V0FFRztBQUNILG1CQUFXLGlCQUFTLGtCQUFrQixPQUFpQixDQUFDLFFBQVEsSUFBSTtBQUNwRTs7QUFHQSxZQUFJLFFBQVEsS0FBSyxHQUFHO0FBQ2xCLGNBQU0sWUFBc0IsQ0FBQTtBQUM1QixtQkFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNyQyxzQkFBVSxLQUFLLE9BQU8sTUFBTSxFQUFFOztBQUVoQyxxQkFBVyxVQUFVLFNBQVE7ZUFDeEI7QUFDTCxxQkFBVyxPQUFPLEtBQUs7OztBQUk3QixRQUFJLFVBQVU7QUFDWixZQUFNLEtBQUssQ0FBQyxLQUFLLFFBQVEsQ0FBQzs7O0FBSTlCLE1BQU0sUUFBUSxNQUNYLElBQUksU0FBQyxJQUFZO1FBQVhDLE9BQUcsR0FBQSxJQUFFQyxTQUFLLEdBQUE7QUFBTSxXQUFBLEdBQUEsT0FBR0QsTUFBRyxHQUFBLEVBQUEsT0FBSUMsT0FBTSxTQUFRLENBQUU7RUFBMUIsQ0FBNEIsRUFDbEQsS0FBSyxHQUFHO0FBQ1gsTUFBSSxhQUFhO0FBQ2pCLE1BQUksVUFBVSxJQUFJO0FBQ2hCLGlCQUFhLFNBQUEsT0FBUyxLQUFLOztBQUc3QixTQUFPLENBQUMsU0FBUyxVQUFVLEVBQUUsT0FBTyxTQUFDLEdBQUM7QUFBSyxXQUFBLENBQUMsQ0FBQztFQUFGLENBQUcsRUFBRSxLQUFLLElBQUk7QUFDM0Q7QUFFQSxTQUFTLGFBQWEsU0FBa0IsTUFBb0I7QUFDMUQsTUFBSSxDQUFDLFNBQVM7QUFDWixXQUFPOztBQUdULFNBQU8sWUFBWSxJQUFJLGFBQWEsSUFBSSxLQUFLLE9BQU8sR0FBRyxJQUFJLEVBQUUsU0FBUTtBQUN2RTs7O0FDcEdBLFNBQVMsVUFDUCxNQUNBLE9BQTJDO0FBRTNDLE1BQUksTUFBTSxRQUFRLElBQUksR0FBRztBQUN2QixRQUFJLENBQUMsTUFBTSxRQUFRLEtBQUs7QUFBRyxhQUFPO0FBQ2xDLFFBQUksS0FBSyxXQUFXLE1BQU07QUFBUSxhQUFPO0FBQ3pDLFdBQU8sS0FBSyxNQUFNLFNBQUMsTUFBTSxHQUFDO0FBQUssYUFBQSxLQUFLLFFBQU8sTUFBTyxNQUFNLEdBQUcsUUFBTztJQUFuQyxDQUFxQzs7QUFHdEUsTUFBSSxnQkFBZ0IsTUFBTTtBQUN4QixXQUFPLGlCQUFpQixRQUFRLEtBQUssUUFBTyxNQUFPLE1BQU0sUUFBTzs7QUFHbEUsU0FBTyxTQUFTO0FBQ2xCO0FBRUEsSUFBQSxRQUFBLFdBQUE7QUFBQSxXQUFBQyxTQUFBO0FBQ0UsU0FBQSxNQUEwQztBQUMxQyxTQUFBLFNBQXFCLENBQUE7QUFDckIsU0FBQSxRQUFvQixDQUFBO0FBQ3BCLFNBQUEsVUFBc0IsQ0FBQTtFQWlGeEI7QUExRVMsRUFBQUEsT0FBQSxVQUFBLFlBQVAsU0FDRSxNQUNBLE9BQ0EsTUFBd0I7QUFFeEIsUUFBSSxPQUFPO0FBQ1QsY0FDRSxpQkFBaUIsT0FDYixpQkFBUyxNQUFNLEtBQUssSUFDcEIsaUJBQVMsV0FBVyxLQUFLOztBQUdqQyxRQUFJLFNBQVMsT0FBTztBQUNsQixXQUFLLE1BQU07V0FDTjtBQUNMLFdBQUssU0FBUztBQUNkLFdBQUssTUFBTSxLQUFLLElBQWdCOztFQUVwQztBQVNPLEVBQUFBLE9BQUEsVUFBQSxZQUFQLFNBQ0UsTUFDQSxNQUF3QjtBQUV4QixRQUFJLFNBQXVDO0FBQzNDLFFBQU0sV0FBVyxPQUFRLE9BQU8sS0FBSyxJQUFJLElBQTJCLENBQUE7QUFDcEUsUUFBTSxnQkFBZ0IsU0FBVUMsT0FBYztBQUM1QyxlQUFTQyxLQUFJLEdBQUdBLEtBQUksU0FBUyxRQUFRQSxNQUFLO0FBQ3hDLFlBQU0sTUFBTSxTQUFTQTtBQUNyQixZQUFJLENBQUMsVUFBVSxLQUFLLE1BQU1ELE1BQUssSUFBSSxHQUFHO0FBQ3BDLGlCQUFPOzs7QUFHWCxhQUFPO0lBQ1Q7QUFFQSxRQUFNLGVBQWUsS0FBSztBQUMxQixRQUFJLFNBQVMsT0FBTztBQUNsQixlQUFTLEtBQUs7ZUFDTCxRQUFRLFlBQVksR0FBRztBQUdoQyxlQUFTLElBQUksR0FBRyxJQUFJLGFBQWEsUUFBUSxLQUFLO0FBQzVDLFlBQU0sT0FBTyxhQUFhO0FBQzFCLFlBQUksU0FBUyxVQUFVLGNBQWMsSUFBSTtBQUFHO0FBQzVDLGlCQUFTLEtBQUs7QUFDZDs7O0FBSUosUUFBSSxDQUFDLFVBQVUsS0FBSyxLQUFLO0FBR3ZCLFVBQU0sYUFBYSxJQUFJLG1CQUFXLE1BQU0sSUFBSTtBQUM1QyxlQUFTLElBQUksR0FBRyxJQUFLLEtBQUssSUFBZSxRQUFRLEtBQUs7QUFDcEQsWUFBSSxDQUFDLFdBQVcsT0FBUSxLQUFLLElBQWUsRUFBRTtBQUFHOztBQUVuRCxlQUFTLFdBQVcsU0FBUTtBQUM1QixXQUFLLFVBQVUsTUFBTSxRQUFRLElBQUk7O0FBR25DLFdBQU8sUUFBUSxNQUFNLElBQ2pCLGlCQUFTLFdBQVcsTUFBTSxJQUMxQixrQkFBa0IsT0FDbEIsaUJBQVMsTUFBTSxNQUFNLElBQ3JCO0VBQ047QUFDRixTQUFBRDtBQUFBLEVBckZBOzs7QUNmQSxJQUFNLFdBQVEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxDQUFBLEdBQ1QsT0FBTyxHQUFHLEVBQUUsR0FBQyxJQUFBLEdBQ2IsT0FBTyxHQUFHLEVBQUUsR0FBQyxJQUFBLEdBQ2IsT0FBTyxHQUFHLEVBQUUsR0FBQyxJQUFBLEdBQ2IsT0FBTyxHQUFHLEVBQUUsR0FBQyxJQUFBLEdBQ2IsT0FBTyxHQUFHLEVBQUUsR0FBQyxJQUFBLEdBQ2IsT0FBTyxHQUFHLEVBQUUsR0FBQyxJQUFBLEdBQ2IsT0FBTyxHQUFHLEVBQUUsR0FBQyxJQUFBLEdBQ2IsT0FBTyxHQUFHLEVBQUUsR0FBQyxJQUFBLEdBQ2IsT0FBTyxHQUFHLEVBQUUsR0FBQyxJQUFBLEdBQ2IsT0FBTyxJQUFJLEVBQUUsR0FBQyxJQUFBLEdBQ2QsT0FBTyxJQUFJLEVBQUUsR0FBQyxJQUFBLEdBQ2QsT0FBTyxJQUFJLEVBQUUsR0FBQyxJQUFBLEdBQ2QsT0FBTyxHQUFHLENBQUMsR0FBQyxJQUFBO0FBR2pCLElBQU0sV0FBUSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLENBQUEsR0FDVCxPQUFPLEdBQUcsRUFBRSxHQUFDLElBQUEsR0FDYixPQUFPLEdBQUcsRUFBRSxHQUFDLElBQUEsR0FDYixPQUFPLEdBQUcsRUFBRSxHQUFDLElBQUEsR0FDYixPQUFPLEdBQUcsRUFBRSxHQUFDLElBQUEsR0FDYixPQUFPLEdBQUcsRUFBRSxHQUFDLElBQUEsR0FDYixPQUFPLEdBQUcsRUFBRSxHQUFDLElBQUEsR0FDYixPQUFPLEdBQUcsRUFBRSxHQUFDLElBQUEsR0FDYixPQUFPLEdBQUcsRUFBRSxHQUFDLElBQUEsR0FDYixPQUFPLEdBQUcsRUFBRSxHQUFDLElBQUEsR0FDYixPQUFPLElBQUksRUFBRSxHQUFDLElBQUEsR0FDZCxPQUFPLElBQUksRUFBRSxHQUFDLElBQUEsR0FDZCxPQUFPLElBQUksRUFBRSxHQUFDLElBQUEsR0FDZCxPQUFPLEdBQUcsQ0FBQyxHQUFDLElBQUE7QUFHakIsSUFBTSxNQUFNLE1BQU0sR0FBRyxFQUFFO0FBQ3ZCLElBQU0sTUFBTSxNQUFNLEdBQUcsRUFBRTtBQUN2QixJQUFNLE1BQU0sTUFBTSxHQUFHLEVBQUU7QUFDdkIsSUFBTSxNQUFNLE1BQU0sR0FBRyxFQUFFO0FBRXZCLElBQU0sY0FBVyxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLENBQUEsR0FDWixLQUFHLElBQUEsR0FDSCxLQUFHLElBQUEsR0FDSCxLQUFHLElBQUEsR0FDSCxLQUFHLElBQUEsR0FDSCxLQUFHLElBQUEsR0FDSCxLQUFHLElBQUEsR0FDSCxLQUFHLElBQUEsR0FDSCxLQUFHLElBQUEsR0FDSCxLQUFHLElBQUEsR0FDSCxLQUFHLElBQUEsR0FDSCxLQUFHLElBQUEsR0FDSCxLQUFHLElBQUEsR0FDSCxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUMsSUFBQTtBQUdwQixJQUFNLGNBQVcsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxDQUFBLEdBQ1osS0FBRyxJQUFBLEdBQ0gsS0FBRyxJQUFBLEdBQ0gsS0FBRyxJQUFBLEdBQ0gsS0FBRyxJQUFBLEdBQ0gsS0FBRyxJQUFBLEdBQ0gsS0FBRyxJQUFBLEdBQ0gsS0FBRyxJQUFBLEdBQ0gsS0FBRyxJQUFBLEdBQ0gsS0FBRyxJQUFBLEdBQ0gsS0FBRyxJQUFBLEdBQ0gsS0FBRyxJQUFBLEdBQ0gsS0FBRyxJQUFBLEdBQ0gsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFDLElBQUE7QUFHcEIsSUFBTSxPQUFPLE1BQU0sS0FBSyxDQUFDO0FBQ3pCLElBQU0sT0FBTyxNQUFNLEtBQUssQ0FBQztBQUN6QixJQUFNLE9BQU8sTUFBTSxLQUFLLENBQUM7QUFDekIsSUFBTSxPQUFPLE1BQU0sS0FBSyxDQUFDO0FBRXpCLElBQU0sZUFBWSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLENBQUEsR0FDYixNQUFJLElBQUEsR0FDSixNQUFJLElBQUEsR0FDSixNQUFJLElBQUEsR0FDSixNQUFJLElBQUEsR0FDSixNQUFJLElBQUEsR0FDSixNQUFJLElBQUEsR0FDSixNQUFJLElBQUEsR0FDSixNQUFJLElBQUEsR0FDSixNQUFJLElBQUEsR0FDSixNQUFJLElBQUEsR0FDSixNQUFJLElBQUEsR0FDSixNQUFJLElBQUEsR0FDSixLQUFLLE1BQU0sR0FBRyxDQUFDLEdBQUMsSUFBQTtBQUdyQixJQUFNLGVBQVksY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxjQUFBLGNBQUEsY0FBQSxDQUFBLEdBQ2IsTUFBSSxJQUFBLEdBQ0osTUFBSSxJQUFBLEdBQ0osTUFBSSxJQUFBLEdBQ0osTUFBSSxJQUFBLEdBQ0osTUFBSSxJQUFBLEdBQ0osTUFBSSxJQUFBLEdBQ0osTUFBSSxJQUFBLEdBQ0osTUFBSSxJQUFBLEdBQ0osTUFBSSxJQUFBLEdBQ0osTUFBSSxJQUFBLEdBQ0osTUFBSSxJQUFBLEdBQ0osTUFBSSxJQUFBLEdBQ0osS0FBSyxNQUFNLEdBQUcsQ0FBQyxHQUFDLElBQUE7QUFHckIsSUFBTSxZQUFZLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUM3RSxJQUFNLFlBQVksQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBRTdFLElBQU0sV0FBWSxXQUFBO0FBQ2hCLE1BQUksV0FBcUIsQ0FBQTtBQUN6QixXQUFTLElBQUksR0FBRyxJQUFJLElBQUk7QUFBSyxlQUFXLFNBQVMsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUNoRSxTQUFPO0FBQ1QsRUFBRTs7O0FDN0ZJLFNBQVUsWUFBWSxNQUFjLFNBQXNCO0FBQzlELE1BQU0sWUFBWSxJQUFJLEtBQUssS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFFL0MsTUFBTSxVQUFVLGlCQUFTLFdBQVcsSUFBSSxJQUFJLE1BQU07QUFDbEQsTUFBTSxjQUFjLGlCQUFTLFdBQVcsT0FBTyxDQUFDLElBQUksTUFBTTtBQUMxRCxNQUFNLGNBQWMsaUJBQVMsVUFBVSxTQUFTO0FBQ2hELE1BQU0sY0FBYyxpQkFBUyxXQUFXLFNBQVM7QUFFakQsTUFBTSxTQUFNLFNBQUEsU0FBQSxFQUNWLFNBQ0EsYUFDQSxhQUNBLFlBQVcsR0FDUixjQUFjLElBQUksQ0FBQyxHQUFBLEVBQ3RCLFNBQVMsS0FBSSxDQUFBO0FBR2YsTUFBSSxNQUFNLFFBQVEsUUFBUSxHQUFHO0FBQzNCLFdBQU87O0FBR1QsU0FBTyxVQUFVLE9BQU8sR0FBRyxVQUFVLENBQUM7QUFDdEMsTUFBSTtBQUNKLE1BQUk7QUFDSixNQUFJLFVBQVcsWUFBWSxNQUFNLElBQUksY0FBYyxRQUFRLE1BQU0sQ0FBQztBQUVsRSxNQUFJLFdBQVcsR0FBRztBQUNoQixjQUFVO0FBR1YsZUFBVyxPQUFPLFVBQVUsTUFBTSxjQUFjLFFBQVEsTUFBTSxDQUFDO1NBQzFEO0FBR0wsZUFBVyxVQUFVOztBQUd2QixNQUFNLE1BQU0sS0FBSyxNQUFNLFdBQVcsQ0FBQztBQUNuQyxNQUFNLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFDN0IsTUFBTSxXQUFXLEtBQUssTUFBTSxNQUFNLE1BQU0sQ0FBQztBQUV6QyxXQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsU0FBUyxRQUFRLEtBQUs7QUFDaEQsUUFBSSxJQUFJLFFBQVEsU0FBUztBQUN6QixRQUFJLElBQUksR0FBRztBQUNULFdBQUssV0FBVzs7QUFFbEIsUUFBSSxFQUFFLElBQUksS0FBSyxLQUFLLFdBQVc7QUFDN0I7O0FBR0YsUUFBSSxJQUFDO0FBQ0wsUUFBSSxJQUFJLEdBQUc7QUFDVCxVQUFJLFdBQVcsSUFBSSxLQUFLO0FBQ3hCLFVBQUksWUFBWSxXQUFXO0FBQ3pCLGFBQUssSUFBSTs7V0FFTjtBQUNMLFVBQUk7O0FBR04sYUFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUs7QUFDMUIsYUFBTyxRQUFRLEtBQUs7QUFDcEI7QUFDQSxVQUFJLE9BQU8sU0FBUyxPQUFPLFFBQVE7QUFBTTs7O0FBSTdDLE1BQUksU0FBUyxRQUFRLFVBQVUsQ0FBQyxHQUFHO0FBR2pDLFFBQUksSUFBSSxVQUFVLFdBQVc7QUFDN0IsUUFBSSxZQUFZO0FBQVcsV0FBSyxJQUFJO0FBQ3BDLFFBQUksSUFBSSxTQUFTO0FBR2YsZUFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUs7QUFDMUIsZUFBTyxRQUFRLEtBQUs7QUFDcEIsYUFBSztBQUNMLFlBQUksT0FBTyxTQUFTLE9BQU8sUUFBUTtBQUFNOzs7O0FBSy9DLE1BQUksU0FBUztBQU9YLFFBQUksWUFBUztBQUNiLFFBQUksQ0FBQyxTQUFTLFFBQVEsVUFBVSxFQUFFLEdBQUc7QUFDbkMsVUFBTSxlQUFlLGlCQUFTLFdBQzVCLElBQUksS0FBSyxLQUFLLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFHcEMsVUFBSSxXQUFXLE1BQU0sSUFBSSxhQUFhLFFBQU8sSUFBSyxRQUFRLE1BQU0sQ0FBQztBQUVqRSxVQUFNLFdBQVcsaUJBQVMsV0FBVyxPQUFPLENBQUMsSUFBSSxNQUFNO0FBQ3ZELFVBQUksU0FBTTtBQUNWLFVBQUksWUFBWSxHQUFHO0FBQ2pCLG1CQUFXO0FBQ1gsaUJBQVMsV0FBVyxNQUFNLGVBQWUsUUFBUSxNQUFNLENBQUM7YUFDbkQ7QUFDTCxpQkFBUyxVQUFVOztBQUdyQixrQkFBWSxLQUFLLE1BQU0sS0FBSyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUM7V0FDM0M7QUFDTCxrQkFBWTs7QUFHZCxRQUFJLFNBQVMsUUFBUSxVQUFVLFNBQVMsR0FBRztBQUN6QyxlQUFTLElBQUksR0FBRyxJQUFJLFNBQVM7QUFBSyxlQUFPLFFBQVEsS0FBSzs7O0FBSTFELFNBQU87QUFDVDtBQUVBLFNBQVMsY0FBYyxNQUFZO0FBQ2pDLE1BQU0sVUFBVSxpQkFBUyxXQUFXLElBQUksSUFBSSxNQUFNO0FBQ2xELE1BQU0sWUFBWSxJQUFJLEtBQUssS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDL0MsTUFBTSxPQUFPLGlCQUFTLFdBQVcsU0FBUztBQUUxQyxNQUFJLFlBQVksS0FBSztBQUNuQixXQUFPO01BQ0wsT0FBTztNQUNQLFVBQVU7TUFDVixXQUFXO01BQ1gsVUFBVSxTQUFTLE1BQU0sSUFBSTtNQUM3QixRQUFROzs7QUFJWixTQUFPO0lBQ0wsT0FBTztJQUNQLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVSxTQUFTLE1BQU0sSUFBSTtJQUM3QixRQUFROztBQUVaOzs7QUNoS00sU0FBVSxhQUNkLE1BQ0EsT0FDQSxTQUNBLFFBQ0EsVUFDQSxTQUFzQjtBQUV0QixNQUFNLFNBQW9CO0lBQ3hCLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVyxDQUFBOztBQUdiLE1BQUksU0FBcUIsQ0FBQTtBQUN6QixNQUFJLFFBQVEsU0FBUyxNQUFNLFFBQVE7QUFDakMsUUFBSSxNQUFNLFFBQVEsT0FBTyxHQUFHO0FBQzFCLGVBQVMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1dBQ2pCO0FBQ0wsZUFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsUUFBUSxLQUFLO0FBQy9DLGdCQUFRLFFBQVEsUUFBUTtBQUN4QixlQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQzs7O2FBR3pDLFFBQVEsU0FBUyxNQUFNLFNBQVM7QUFDekMsYUFBUyxDQUFDLE9BQU8sTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUM7O0FBRzlDLE1BQUksTUFBTSxNQUFNLEdBQUc7QUFDakIsV0FBTzs7QUFLVCxTQUFPLFlBQVksT0FBTyxHQUFHLE9BQU87QUFFcEMsV0FBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsS0FBSztBQUN0QyxRQUFNLE9BQU8sT0FBTztBQUNwQixRQUFNLFFBQVEsS0FBSztBQUNuQixRQUFNLE9BQU8sS0FBSyxLQUFLO0FBRXZCLGFBQVMsSUFBSSxHQUFHLElBQUksUUFBUSxXQUFXLFFBQVEsS0FBSztBQUNsRCxVQUFJLElBQUM7QUFDQyxVQUFBLEtBQVksUUFBUSxXQUFXLElBQTlCLE9BQUksR0FBQSxJQUFFLElBQUMsR0FBQTtBQUNkLFVBQUksSUFBSSxHQUFHO0FBQ1QsWUFBSSxRQUFRLElBQUksS0FBSztBQUNyQixhQUFLLE1BQU0sU0FBUyxLQUFLLE1BQU0sQ0FBQzthQUMzQjtBQUNMLFlBQUksU0FBUyxJQUFJLEtBQUs7QUFDdEIsYUFBSyxNQUFNLElBQUksU0FBUyxLQUFLLE1BQU0sQ0FBQzs7QUFFdEMsVUFBSSxTQUFTLEtBQUssS0FBSztBQUFNLGVBQU8sVUFBVSxLQUFLOzs7QUFJdkQsU0FBTztBQUNUOzs7QUNsRU0sU0FBVSxPQUFPLEdBQVcsUUFBVTtBQUFWLE1BQUEsV0FBQSxRQUFBO0FBQUEsYUFBQTtFQUFVO0FBQzFDLE1BQU0sSUFBSSxJQUFJO0FBQ2QsTUFBTSxJQUFJLEtBQUssTUFBTSxJQUFJLEdBQUc7QUFDNUIsTUFBTSxJQUFJLElBQUk7QUFDZCxNQUFNLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQztBQUMxQixNQUFNLElBQUksSUFBSTtBQUNkLE1BQU0sSUFBSSxLQUFLLE9BQU8sSUFBSSxLQUFLLEVBQUU7QUFDakMsTUFBTSxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxDQUFDO0FBQ3BDLE1BQU0sSUFBSSxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSTtBQUNoRCxNQUFNLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQztBQUMxQixNQUFNLElBQUksSUFBSTtBQUNkLE1BQU0sSUFBSSxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJO0FBQ25ELE1BQU0sSUFBSSxLQUFLLE9BQU8sSUFBSSxLQUFLLElBQUksS0FBSyxLQUFLLEdBQUc7QUFDaEQsTUFBTSxRQUFRLEtBQUssT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLE9BQU8sRUFBRTtBQUNuRCxNQUFNLE9BQVEsSUFBSSxJQUFJLElBQUksSUFBSSxPQUFPLEtBQU07QUFDM0MsTUFBTSxPQUFPLEtBQUssSUFBSSxHQUFHLFFBQVEsR0FBRyxNQUFNLE1BQU07QUFDaEQsTUFBTSxZQUFZLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUVsQyxTQUFPLENBQUMsS0FBSyxNQUFNLE9BQU8sY0FBYyxNQUFPLEtBQUssS0FBSyxHQUFHLENBQUM7QUFDL0Q7OztBQ0pBLElBQUEsV0FBQSxXQUFBO0FBTUUsV0FBQUcsVUFBb0IsU0FBc0I7QUFBdEIsU0FBQSxVQUFBO0VBQXlCO0FBRTdDLEVBQUFBLFVBQUEsVUFBQSxVQUFBLFNBQVEsTUFBYyxPQUFhO0FBQ2pDLFFBQU0sVUFBVSxLQUFLO0FBRXJCLFFBQUksU0FBUyxLQUFLLFVBQVU7QUFDMUIsV0FBSyxXQUFXLFlBQVksTUFBTSxPQUFPOztBQUczQyxRQUNFLFNBQVMsUUFBUSxVQUFVLE1BQzFCLFVBQVUsS0FBSyxhQUFhLFNBQVMsS0FBSyxXQUMzQztBQUNNLFVBQUEsS0FBZ0MsS0FBSyxVQUFuQyxVQUFPLEdBQUEsU0FBRSxTQUFNLEdBQUEsUUFBRSxXQUFRLEdBQUE7QUFDakMsV0FBSyxZQUFZLGFBQ2YsTUFDQSxPQUNBLFNBQ0EsUUFDQSxVQUNBLE9BQU87O0FBSVgsUUFBSSxVQUFVLFFBQVEsUUFBUSxHQUFHO0FBQy9CLFdBQUssYUFBYSxPQUFPLE1BQU0sUUFBUSxRQUFROztFQUVuRDtBQUVBLFNBQUEsZUFBSUEsVUFBQSxXQUFBLFlBQVE7U0FBWixXQUFBO0FBQ0UsYUFBTyxLQUFLLFlBQVksS0FBSyxVQUFVLFdBQVc7SUFDcEQ7Ozs7QUFFQSxTQUFBLGVBQUlBLFVBQUEsV0FBQSxhQUFTO1NBQWIsV0FBQTtBQUNFLGFBQU8sS0FBSyxZQUFZLEtBQUssVUFBVSxZQUFZO0lBQ3JEOzs7O0FBRUEsU0FBQSxlQUFJQSxVQUFBLFdBQUEsV0FBTztTQUFYLFdBQUE7QUFDRSxhQUFPLEtBQUssU0FBUztJQUN2Qjs7OztBQUVBLFNBQUEsZUFBSUEsVUFBQSxXQUFBLGVBQVc7U0FBZixXQUFBO0FBQ0UsYUFBTyxLQUFLLFNBQVM7SUFDdkI7Ozs7QUFFQSxTQUFBLGVBQUlBLFVBQUEsV0FBQSxVQUFNO1NBQVYsV0FBQTtBQUNFLGFBQU8sS0FBSyxTQUFTO0lBQ3ZCOzs7O0FBRUEsU0FBQSxlQUFJQSxVQUFBLFdBQUEsWUFBUTtTQUFaLFdBQUE7QUFDRSxhQUFPLEtBQUssU0FBUztJQUN2Qjs7OztBQUVBLFNBQUEsZUFBSUEsVUFBQSxXQUFBLFNBQUs7U0FBVCxXQUFBO0FBQ0UsYUFBTyxLQUFLLFNBQVM7SUFDdkI7Ozs7QUFFQSxTQUFBLGVBQUlBLFVBQUEsV0FBQSxXQUFPO1NBQVgsV0FBQTtBQUNFLGFBQU8sS0FBSyxTQUFTO0lBQ3ZCOzs7O0FBRUEsU0FBQSxlQUFJQSxVQUFBLFdBQUEsYUFBUztTQUFiLFdBQUE7QUFDRSxhQUFPLEtBQUssWUFBWSxLQUFLLFVBQVUsWUFBWSxDQUFBO0lBQ3JEOzs7O0FBRUEsU0FBQSxlQUFJQSxVQUFBLFdBQUEsZUFBVztTQUFmLFdBQUE7QUFDRSxhQUFPLEtBQUssU0FBUztJQUN2Qjs7OztBQUVBLFNBQUEsZUFBSUEsVUFBQSxXQUFBLFlBQVE7U0FBWixXQUFBO0FBQ0UsYUFBTyxLQUFLLFNBQVM7SUFDdkI7Ozs7QUFFQSxTQUFBLGVBQUlBLFVBQUEsV0FBQSxhQUFTO1NBQWIsV0FBQTtBQUNFLGFBQU8sS0FBSyxTQUFTO0lBQ3ZCOzs7O0FBRUEsRUFBQUEsVUFBQSxVQUFBLFVBQUEsV0FBQTtBQUNFLFdBQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxHQUFHLEdBQUcsS0FBSyxPQUFPO0VBQzlDO0FBRUEsRUFBQUEsVUFBQSxVQUFBLFVBQUEsU0FBUSxHQUFZLE9BQWE7QUFDL0IsUUFBTSxRQUFRLEtBQUssT0FBTyxRQUFRO0FBQ2xDLFFBQU0sTUFBTSxLQUFLLE9BQU87QUFDeEIsUUFBTSxNQUFNLE9BQXNCLE1BQU0sS0FBSyxPQUFPO0FBQ3BELGFBQVMsSUFBSSxPQUFPLElBQUksS0FBSztBQUFLLFVBQUksS0FBSztBQUMzQyxXQUFPLENBQUMsS0FBSyxPQUFPLEdBQUc7RUFDekI7QUFFQSxFQUFBQSxVQUFBLFVBQUEsVUFBQSxTQUFRLE1BQWMsT0FBZSxLQUFXO0FBRTlDLFFBQU0sTUFBTSxPQUFzQixNQUFNLEtBQUssVUFBVSxDQUFDO0FBQ3hELFFBQUksSUFDRixpQkFBUyxVQUFVLElBQUksS0FBSyxLQUFLLElBQUksTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFDM0QsS0FBSztBQUNQLFFBQU0sUUFBUTtBQUNkLGFBQVMsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLO0FBQzFCLFVBQUksS0FBSztBQUNULFFBQUU7QUFDRixVQUFJLEtBQUssU0FBUyxPQUFPLEtBQUssUUFBUTtBQUFNOztBQUU5QyxXQUFPLENBQUMsS0FBSyxPQUFPLENBQUM7RUFDdkI7QUFFQSxFQUFBQSxVQUFBLFVBQUEsVUFBQSxTQUFRLE1BQWMsT0FBZSxLQUFXO0FBQzlDLFFBQU0sTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPO0FBQ3JDLFFBQU0sSUFDSixpQkFBUyxVQUFVLElBQUksS0FBSyxLQUFLLElBQUksTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFDM0QsS0FBSztBQUNQLFFBQUksS0FBSztBQUNULFdBQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0VBQ3ZCO0FBRUEsRUFBQUEsVUFBQSxVQUFBLFdBQUEsU0FBUyxNQUFjLEdBQVcsUUFBZ0IsYUFBbUI7QUFBckUsUUFBQSxRQUFBO0FBQ0UsUUFBSSxNQUFjLENBQUE7QUFDbEIsU0FBSyxRQUFRLFNBQVMsUUFBUSxTQUFDLFFBQU07QUFDbkMsWUFBTSxJQUFJLE9BQU8sTUFBSyxTQUFTLE1BQU0sUUFBUSxRQUFRLFdBQVcsQ0FBQztJQUNuRSxDQUFDO0FBQ0QscUJBQVMsS0FBSyxHQUFHO0FBQ2pCLFdBQU87RUFDVDtBQUVBLEVBQUFBLFVBQUEsVUFBQSxXQUFBLFNBQVMsTUFBYyxRQUFnQixHQUFXLGFBQW1CO0FBQ25FLFFBQU0sTUFBTSxLQUFLLFFBQVEsU0FBUyxJQUNoQyxTQUFDLFFBQU07QUFBSyxhQUFBLElBQUksS0FBSyxNQUFNLFFBQVEsUUFBUSxXQUFXO0lBQTFDLENBQTJDO0FBR3pELHFCQUFTLEtBQUssR0FBRztBQUNqQixXQUFPO0VBQ1Q7QUFFQSxFQUFBQSxVQUFBLFVBQUEsV0FBQSxTQUFTLE1BQWMsUUFBZ0IsUUFBZ0IsYUFBbUI7QUFDeEUsV0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLFFBQVEsUUFBUSxXQUFXLENBQUM7RUFDckQ7QUFFQSxFQUFBQSxVQUFBLFVBQUEsWUFBQSxTQUFVLE1BQWU7QUFDdkIsWUFBUTtXQUNELFVBQVU7QUFDYixlQUFPLEtBQUssUUFBUSxLQUFLLElBQUk7V0FDMUIsVUFBVTtBQUNiLGVBQU8sS0FBSyxRQUFRLEtBQUssSUFBSTtXQUMxQixVQUFVO0FBQ2IsZUFBTyxLQUFLLFFBQVEsS0FBSyxJQUFJO1dBQzFCLFVBQVU7QUFDYixlQUFPLEtBQUssUUFBUSxLQUFLLElBQUk7O0FBRTdCLGVBQU8sS0FBSyxRQUFRLEtBQUssSUFBSTs7RUFFbkM7QUFFQSxFQUFBQSxVQUFBLFVBQUEsYUFBQSxTQUNFLE1BQWdFO0FBRWhFLFlBQVE7V0FDRCxVQUFVO0FBQ2IsZUFBTyxLQUFLLFNBQVMsS0FBSyxJQUFJO1dBQzNCLFVBQVU7QUFDYixlQUFPLEtBQUssU0FBUyxLQUFLLElBQUk7V0FDM0IsVUFBVTtBQUNiLGVBQU8sS0FBSyxTQUFTLEtBQUssSUFBSTs7RUFFcEM7QUFDRixTQUFBQTtBQUFBLEVBeEtBOzs7O0FDVk0sU0FBVSxhQUNkLFVBQ0EsU0FDQSxPQUNBLEtBQ0EsSUFDQSxRQUF5QjtBQUV6QixNQUFNLFVBQWtCLENBQUE7QUFFeEIsV0FBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsS0FBSztBQUN4QyxRQUFJLFNBQU07QUFDVixRQUFJLFVBQU87QUFDWCxRQUFNLE1BQU0sU0FBUztBQUVyQixRQUFJLE1BQU0sR0FBRztBQUNYLGVBQVMsS0FBSyxNQUFNLE1BQU0sUUFBUSxNQUFNO0FBQ3hDLGdCQUFVLE1BQU0sS0FBSyxRQUFRLE1BQU07V0FDOUI7QUFDTCxlQUFTLEtBQUssT0FBTyxNQUFNLEtBQUssUUFBUSxNQUFNO0FBQzlDLGdCQUFVLE1BQU0sTUFBTSxHQUFHLFFBQVEsTUFBTTs7QUFHekMsUUFBTSxNQUFNLENBQUE7QUFDWixhQUFTLElBQUksT0FBTyxJQUFJLEtBQUssS0FBSztBQUNoQyxVQUFNLE1BQU0sT0FBTztBQUNuQixVQUFJLENBQUMsVUFBVSxHQUFHO0FBQUc7QUFDckIsVUFBSSxLQUFLLEdBQUc7O0FBRWQsUUFBSSxJQUFDO0FBQ0wsUUFBSSxTQUFTLEdBQUc7QUFDZCxVQUFJLElBQUksTUFBTSxNQUFNLEVBQUU7V0FDakI7QUFDTCxVQUFJLElBQUk7O0FBR1YsUUFBTSxPQUFPLFFBQVE7QUFDckIsUUFBTSxPQUFPLGlCQUFTLFlBQVksR0FBRyxjQUFjLENBQUM7QUFDcEQsUUFBTSxNQUFNLGlCQUFTLFFBQVEsTUFBTSxJQUFJO0FBR3ZDLFFBQUksQ0FBQyxTQUFTLFNBQVMsR0FBRztBQUFHLGNBQVEsS0FBSyxHQUFHOztBQUcvQyxtQkFBUyxLQUFLLE9BQU87QUFFckIsU0FBTztBQUNUOzs7QUN6Q00sU0FBVSxLQUNkLFlBQ0EsU0FBc0I7QUFFZCxNQUFBLFVBQTZDLFFBQU8sU0FBM0MsT0FBb0MsUUFBTyxNQUFyQyxXQUE4QixRQUFPLFVBQTNCLFFBQW9CLFFBQU8sT0FBcEIsV0FBYSxRQUFPO0FBRTVELE1BQUksUUFBUSxRQUFRO0FBQ3BCLE1BQUksVUFBVSxLQUFLLGFBQWEsR0FBRztBQUNqQyxXQUFPLFdBQVcsVUFBVTs7QUFHOUIsTUFBTSxjQUFjLFNBQVMsU0FBUyxPQUFPO0FBRTdDLE1BQU0sS0FBSyxJQUFJLGlCQUFTLE9BQU87QUFDL0IsS0FBRyxRQUFRLFlBQVksTUFBTSxZQUFZLEtBQUs7QUFFOUMsTUFBSSxVQUFVLFlBQVksSUFBSSxhQUFhLE9BQU87QUFFbEQsYUFBUztBQUNELFFBQUEsS0FBdUIsR0FBRyxVQUFVLElBQUksRUFDNUMsWUFBWSxNQUNaLFlBQVksT0FDWixZQUFZLEdBQUcsR0FIVixTQUFNLEdBQUEsSUFBRSxRQUFLLEdBQUEsSUFBRSxNQUFHLEdBQUE7QUFNekIsUUFBTSxXQUFXLG1CQUFtQixRQUFRLE9BQU8sS0FBSyxJQUFJLE9BQU87QUFFbkUsUUFBSSxTQUFTLFFBQVEsR0FBRztBQUN0QixVQUFNLFVBQVUsYUFBYSxVQUFVLFNBQVMsT0FBTyxLQUFLLElBQUksTUFBTTtBQUV0RSxlQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxLQUFLO0FBQ3ZDLFlBQU0sTUFBTSxRQUFRO0FBQ3BCLFlBQUksU0FBUyxNQUFNLE9BQU87QUFDeEIsaUJBQU8sV0FBVyxVQUFVOztBQUc5QixZQUFJLE9BQU8sU0FBUztBQUNsQixjQUFNLGNBQWMsZUFBZSxLQUFLLE9BQU87QUFDL0MsY0FBSSxDQUFDLFdBQVcsT0FBTyxXQUFXLEdBQUc7QUFDbkMsbUJBQU8sV0FBVyxVQUFVOztBQUc5QixjQUFJLE9BQU87QUFDVCxjQUFFO0FBQ0YsZ0JBQUksQ0FBQyxPQUFPO0FBQ1YscUJBQU8sV0FBVyxVQUFVOzs7OztXQUsvQjtBQUNMLGVBQVMsSUFBSSxPQUFPLElBQUksS0FBSyxLQUFLO0FBQ2hDLFlBQU0sYUFBYSxPQUFPO0FBQzFCLFlBQUksQ0FBQyxVQUFVLFVBQVUsR0FBRztBQUMxQjs7QUFHRixZQUFNLE9BQU8saUJBQVMsWUFBWSxHQUFHLGNBQWMsVUFBVTtBQUM3RCxpQkFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUN2QyxjQUFNLE9BQU8sUUFBUTtBQUNyQixjQUFNLE1BQU0saUJBQVMsUUFBUSxNQUFNLElBQUk7QUFDdkMsY0FBSSxTQUFTLE1BQU0sT0FBTztBQUN4QixtQkFBTyxXQUFXLFVBQVU7O0FBRzlCLGNBQUksT0FBTyxTQUFTO0FBQ2xCLGdCQUFNLGNBQWMsZUFBZSxLQUFLLE9BQU87QUFDL0MsZ0JBQUksQ0FBQyxXQUFXLE9BQU8sV0FBVyxHQUFHO0FBQ25DLHFCQUFPLFdBQVcsVUFBVTs7QUFHOUIsZ0JBQUksT0FBTztBQUNULGdCQUFFO0FBQ0Ysa0JBQUksQ0FBQyxPQUFPO0FBQ1YsdUJBQU8sV0FBVyxVQUFVOzs7Ozs7O0FBT3hDLFFBQUksUUFBUSxhQUFhLEdBQUc7QUFDMUIsYUFBTyxXQUFXLFVBQVU7O0FBSTlCLGdCQUFZLElBQUksU0FBUyxRQUFRO0FBRWpDLFFBQUksWUFBWSxPQUFPLGlCQUFTLFNBQVM7QUFDdkMsYUFBTyxXQUFXLFVBQVU7O0FBRzlCLFFBQUksQ0FBQyxxQkFBcUIsSUFBSSxHQUFHO0FBQy9CLGdCQUFVLEdBQUcsV0FBVyxJQUFJLEVBQzFCLFlBQVksTUFDWixZQUFZLFFBQ1osWUFBWSxRQUNaLENBQUM7O0FBSUwsT0FBRyxRQUFRLFlBQVksTUFBTSxZQUFZLEtBQUs7O0FBRWxEO0FBRUEsU0FBUyxXQUNQLElBQ0EsWUFDQSxTQUFzQjtBQUdwQixNQUFBLFVBT0UsUUFBTyxTQU5ULFdBTUUsUUFBTyxVQUxULFlBS0UsUUFBTyxXQUpULFdBSUUsUUFBTyxVQUhULGFBR0UsUUFBTyxZQUZULGNBRUUsUUFBTyxhQURULFlBQ0UsUUFBTztBQUVYLFNBQ0csU0FBUyxPQUFPLEtBQUssQ0FBQyxTQUFTLFNBQVMsR0FBRyxNQUFNLFdBQVcsS0FDNUQsU0FBUyxRQUFRLEtBQUssQ0FBQyxHQUFHLFFBQVEsZUFDbEMsU0FBUyxTQUFTLEtBQUssQ0FBQyxTQUFTLFdBQVcsR0FBRyxTQUFTLFdBQVcsS0FDbkUsU0FBUyxHQUFHLFNBQVMsS0FBSyxDQUFDLEdBQUcsVUFBVSxlQUN4QyxhQUFhLFFBQVEsQ0FBQyxTQUFTLEdBQUcsWUFBWSxVQUFVLE1BQ3ZELFNBQVMsVUFBVSxLQUFLLFNBQVMsV0FBVyxNQUM1QyxDQUFDLFNBQVMsWUFBWSxHQUFHLFNBQVMsV0FBVyxLQUM3QyxDQUFDLFNBQVMsYUFBYSxHQUFHLFVBQVUsV0FBVyxLQUNoRCxTQUFTLFNBQVMsTUFDZixhQUFhLEdBQUcsV0FDaEIsQ0FBQyxTQUFTLFdBQVcsYUFBYSxDQUFDLEtBQ25DLENBQUMsU0FBUyxXQUFXLENBQUMsR0FBRyxVQUFVLFVBQVUsS0FDNUMsY0FBYyxHQUFHLFdBQ2hCLENBQUMsU0FBUyxXQUFXLGFBQWEsSUFBSSxHQUFHLE9BQU8sS0FDaEQsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxHQUFHLGNBQWMsYUFBYSxHQUFHLE9BQU87QUFFeEU7QUFFQSxTQUFTLGVBQWUsTUFBWSxTQUFzQjtBQUN4RCxTQUFPLElBQUksYUFBYSxNQUFNLFFBQVEsSUFBSSxFQUFFLFlBQVc7QUFDekQ7QUFFQSxTQUFTLFdBQXVDLFlBQXlCO0FBQ3ZFLFNBQU8sV0FBVyxTQUFRO0FBQzVCO0FBRUEsU0FBUyxtQkFDUCxRQUNBLE9BQ0EsS0FDQSxJQUNBLFNBQXNCO0FBRXRCLE1BQUksV0FBVztBQUNmLFdBQVMsYUFBYSxPQUFPLGFBQWEsS0FBSyxjQUFjO0FBQzNELFFBQU0sYUFBYSxPQUFPO0FBRTFCLGVBQVcsV0FBVyxJQUFJLFlBQVksT0FBTztBQUU3QyxRQUFJO0FBQVUsYUFBTyxjQUFjOztBQUdyQyxTQUFPO0FBQ1Q7QUFFQSxTQUFTLFlBQ1AsSUFDQSxhQUNBLFNBQXNCO0FBRWQsTUFBQSxPQUFxQyxRQUFPLE1BQXRDLFNBQStCLFFBQU8sUUFBOUIsV0FBdUIsUUFBTyxVQUFwQixXQUFhLFFBQU87QUFFcEQsTUFBSSxxQkFBcUIsSUFBSSxHQUFHO0FBQzlCLFdBQU8sYUFBYSxPQUFPOztBQUc3QixNQUNHLFFBQVEsTUFBTSxVQUNiLFNBQVMsTUFBTSxLQUNmLENBQUMsU0FBUyxRQUFRLFlBQVksSUFBSSxLQUNuQyxRQUFRLE1BQU0sWUFDYixTQUFTLFFBQVEsS0FDakIsQ0FBQyxTQUFTLFVBQVUsWUFBWSxNQUFNLEtBQ3ZDLFFBQVEsTUFBTSxZQUNiLFNBQVMsUUFBUSxLQUNqQixDQUFDLFNBQVMsVUFBVSxZQUFZLE1BQU0sR0FDeEM7QUFDQSxXQUFPLENBQUE7O0FBR1QsU0FBTyxHQUFHLFdBQVcsSUFBSSxFQUN2QixZQUFZLE1BQ1osWUFBWSxRQUNaLFlBQVksUUFDWixZQUFZLFdBQVc7QUFFM0I7OztBQ3RMTyxJQUFNLE9BQU87RUFDbEIsSUFBSSxJQUFJLFFBQVEsQ0FBQztFQUNqQixJQUFJLElBQUksUUFBUSxDQUFDO0VBQ2pCLElBQUksSUFBSSxRQUFRLENBQUM7RUFDakIsSUFBSSxJQUFJLFFBQVEsQ0FBQztFQUNqQixJQUFJLElBQUksUUFBUSxDQUFDO0VBQ2pCLElBQUksSUFBSSxRQUFRLENBQUM7RUFDakIsSUFBSSxJQUFJLFFBQVEsQ0FBQzs7QUFHWixJQUFNLGtCQUEyQjtFQUN0QyxNQUFNLFVBQVU7RUFDaEIsU0FBUztFQUNULFVBQVU7RUFDVixNQUFNLEtBQUs7RUFDWCxPQUFPO0VBQ1AsT0FBTztFQUNQLE1BQU07RUFDTixVQUFVO0VBQ1YsU0FBUztFQUNULFlBQVk7RUFDWixhQUFhO0VBQ2IsV0FBVztFQUNYLFVBQVU7RUFDVixXQUFXO0VBQ1gsWUFBWTtFQUNaLFFBQVE7RUFDUixVQUFVO0VBQ1YsVUFBVTtFQUNWLFVBQVU7O0FBR0wsSUFBTSxjQUFjLE9BQU8sS0FBSyxlQUFlO0FBUXRELElBQUEsUUFBQSxXQUFBO0FBaUNFLFdBQUFDLE9BQVksU0FBZ0MsU0FBZTtBQUEvQyxRQUFBLFlBQUEsUUFBQTtBQUFBLGdCQUFBLENBQUE7SUFBOEI7QUFBRSxRQUFBLFlBQUEsUUFBQTtBQUFBLGdCQUFBO0lBQWU7QUFFekQsU0FBSyxTQUFTLFVBQVUsT0FBTyxJQUFJLE1BQUs7QUFHeEMsU0FBSyxjQUFjLGtCQUFrQixPQUFPO0FBQ3BDLFFBQUEsZ0JBQWtCLGFBQWEsT0FBTyxFQUFDO0FBQy9DLFNBQUssVUFBVTtFQUNqQjtBQUVPLEVBQUFBLE9BQUEsWUFBUCxTQUFpQkMsT0FBYyxVQUFtQjtBQUNoRCxXQUFPLFVBQVVBLE9BQU0sUUFBUTtFQUNqQztBQUVPLEVBQUFELE9BQUEsV0FBUCxTQUFnQkMsT0FBYyxVQUFtQjtBQUMvQyxXQUFPLFNBQVNBLE9BQU0sUUFBUTtFQUNoQztBQUlPLEVBQUFELE9BQUEsYUFBUCxTQUFrQixLQUFXO0FBQzNCLFdBQU8sSUFBSUEsT0FBTUEsT0FBTSxZQUFZLEdBQUcsS0FBSyxNQUFTO0VBQ3REO0FBSVUsRUFBQUEsT0FBQSxVQUFBLFFBQVYsU0FDRSxZQUF5QjtBQUV6QixXQUFPLEtBQUssWUFBWSxLQUFLLE9BQU87RUFDdEM7QUFFUSxFQUFBQSxPQUFBLFVBQUEsWUFBUixTQUFrQixNQUF5QixNQUF3QjtBQUNqRSxRQUFJLENBQUMsS0FBSztBQUFRLGFBQU87QUFDekIsV0FBTyxLQUFLLE9BQU8sVUFBVSxNQUFNLElBQUk7RUFDekM7QUFFTyxFQUFBQSxPQUFBLFVBQUEsWUFBUCxTQUNFLE1BQ0EsT0FDQSxNQUF3QjtBQUV4QixRQUFJLENBQUMsS0FBSztBQUFRO0FBQ2xCLFdBQU8sS0FBSyxPQUFPLFVBQVUsTUFBTSxPQUFPLElBQUk7RUFDaEQ7QUFRQSxFQUFBQSxPQUFBLFVBQUEsTUFBQSxTQUFJLFVBQTRDO0FBQzlDLFFBQUksVUFBVTtBQUNaLGFBQU8sS0FBSyxNQUFNLElBQUksMkJBQW1CLE9BQU8sQ0FBQSxHQUFJLFFBQVEsQ0FBQzs7QUFHL0QsUUFBSSxTQUFTLEtBQUssVUFBVSxLQUFLO0FBQ2pDLFFBQUksV0FBVyxPQUFPO0FBQ3BCLGVBQVMsS0FBSyxNQUFNLElBQUksbUJBQVcsT0FBTyxDQUFBLENBQUUsQ0FBQztBQUM3QyxXQUFLLFVBQVUsT0FBTyxNQUFNOztBQUU5QixXQUFPO0VBQ1Q7QUFVQSxFQUFBQSxPQUFBLFVBQUEsVUFBQSxTQUNFLE9BQ0EsUUFDQSxLQUNBLFVBQTRDO0FBRDVDLFFBQUEsUUFBQSxRQUFBO0FBQUEsWUFBQTtJQUFXO0FBR1gsUUFBSSxDQUFDLGlCQUFTLFlBQVksS0FBSyxLQUFLLENBQUMsaUJBQVMsWUFBWSxNQUFNLEdBQUc7QUFDakUsWUFBTSxJQUFJLE1BQU0seUNBQXlDOztBQUUzRCxRQUFNLE9BQU87TUFDWDtNQUNBO01BQ0E7O0FBR0YsUUFBSSxVQUFVO0FBQ1osYUFBTyxLQUFLLE1BQU0sSUFBSSwyQkFBbUIsV0FBVyxNQUFNLFFBQVEsQ0FBQzs7QUFHckUsUUFBSSxTQUFTLEtBQUssVUFBVSxXQUFXLElBQUk7QUFDM0MsUUFBSSxXQUFXLE9BQU87QUFDcEIsZUFBUyxLQUFLLE1BQU0sSUFBSSxtQkFBVyxXQUFXLElBQUksQ0FBQztBQUNuRCxXQUFLLFVBQVUsV0FBVyxRQUFRLElBQUk7O0FBRXhDLFdBQU87RUFDVDtBQVNBLEVBQUFBLE9BQUEsVUFBQSxTQUFBLFNBQU8sSUFBVSxLQUFXO0FBQVgsUUFBQSxRQUFBLFFBQUE7QUFBQSxZQUFBO0lBQVc7QUFDMUIsUUFBSSxDQUFDLGlCQUFTLFlBQVksRUFBRSxHQUFHO0FBQzdCLFlBQU0sSUFBSSxNQUFNLHdDQUF3Qzs7QUFFMUQsUUFBTSxPQUFPLEVBQUUsSUFBUSxJQUFRO0FBQy9CLFFBQUksU0FBUyxLQUFLLFVBQVUsVUFBVSxJQUFJO0FBQzFDLFFBQUksV0FBVyxPQUFPO0FBQ3BCLGVBQVMsS0FBSyxNQUFNLElBQUksbUJBQVcsVUFBVSxJQUFJLENBQUM7QUFDbEQsV0FBSyxVQUFVLFVBQVUsUUFBUSxJQUFJOztBQUV2QyxXQUFPO0VBQ1Q7QUFTQSxFQUFBQSxPQUFBLFVBQUEsUUFBQSxTQUFNLElBQVUsS0FBVztBQUFYLFFBQUEsUUFBQSxRQUFBO0FBQUEsWUFBQTtJQUFXO0FBQ3pCLFFBQUksQ0FBQyxpQkFBUyxZQUFZLEVBQUUsR0FBRztBQUM3QixZQUFNLElBQUksTUFBTSx1Q0FBdUM7O0FBRXpELFFBQU0sT0FBTyxFQUFFLElBQVEsSUFBUTtBQUMvQixRQUFJLFNBQVMsS0FBSyxVQUFVLFNBQVMsSUFBSTtBQUN6QyxRQUFJLFdBQVcsT0FBTztBQUNwQixlQUFTLEtBQUssTUFBTSxJQUFJLG1CQUFXLFNBQVMsSUFBSSxDQUFDO0FBQ2pELFdBQUssVUFBVSxTQUFTLFFBQVEsSUFBSTs7QUFFdEMsV0FBTztFQUNUO0FBTUEsRUFBQUEsT0FBQSxVQUFBLFFBQUEsV0FBQTtBQUNFLFdBQU8sS0FBSyxJQUFHLEVBQUc7RUFDcEI7QUFRQSxFQUFBQSxPQUFBLFVBQUEsV0FBQSxXQUFBO0FBQ0UsV0FBTyxnQkFBZ0IsS0FBSyxXQUFXO0VBQ3pDO0FBTUEsRUFBQUEsT0FBQSxVQUFBLFNBQUEsU0FDRSxTQUNBLFVBQ0EsZUFBNkI7QUFFN0IsV0FBTyxPQUFPLE1BQU0sU0FBUyxVQUFVLGFBQWE7RUFDdEQ7QUFFQSxFQUFBQSxPQUFBLFVBQUEsMkJBQUEsV0FBQTtBQUNFLFdBQU8sbUJBQW1CLElBQUk7RUFDaEM7QUFNQSxFQUFBQSxPQUFBLFVBQUEsUUFBQSxXQUFBO0FBQ0UsV0FBTyxJQUFJQSxPQUFNLEtBQUssV0FBVztFQUNuQztBQTlNZ0IsRUFBQUEsT0FBQSxjQUEwQztJQUN4RDtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7QUFHYyxFQUFBQSxPQUFBLFNBQVMsVUFBVTtBQUNuQixFQUFBQSxPQUFBLFVBQVUsVUFBVTtBQUNwQixFQUFBQSxPQUFBLFNBQVMsVUFBVTtBQUNuQixFQUFBQSxPQUFBLFFBQVEsVUFBVTtBQUNsQixFQUFBQSxPQUFBLFNBQVMsVUFBVTtBQUNuQixFQUFBQSxPQUFBLFdBQVcsVUFBVTtBQUNyQixFQUFBQSxPQUFBLFdBQVcsVUFBVTtBQUVyQixFQUFBQSxPQUFBLEtBQUssS0FBSztBQUNWLEVBQUFBLE9BQUEsS0FBSyxLQUFLO0FBQ1YsRUFBQUEsT0FBQSxLQUFLLEtBQUs7QUFDVixFQUFBQSxPQUFBLEtBQUssS0FBSztBQUNWLEVBQUFBLE9BQUEsS0FBSyxLQUFLO0FBQ1YsRUFBQUEsT0FBQSxLQUFLLEtBQUs7QUFDVixFQUFBQSxPQUFBLEtBQUssS0FBSztBQW9CbkIsRUFBQUEsT0FBQSxjQUFjO0FBTWQsRUFBQUEsT0FBQSxrQkFBa0I7QUE2SjNCLFNBQUFBO0VBdE5BOzs7QUMzRE0sU0FBVSxRQUNkLFlBQ0EsUUFDQSxTQUNBLFFBQ0EsU0FDQSxNQUF3QjtBQUV4QixNQUFNLGNBQXdDLENBQUE7QUFDOUMsTUFBTSxVQUFVLFdBQVc7QUFFM0IsV0FBUyxXQUFXLE9BQWEsUUFBWTtBQUMzQyxZQUFRLFFBQVEsU0FBVSxPQUFLO0FBQzdCLFlBQU0sUUFBUSxPQUFPLFFBQVEsSUFBSSxFQUFFLFFBQVEsU0FBVSxNQUFJO0FBQ3ZELG9CQUFZLE9BQU8sSUFBSSxLQUFLO01BQzlCLENBQUM7SUFDSCxDQUFDO0VBQ0g7QUFFQSxVQUFRLFFBQVEsU0FBVSxNQUFJO0FBQzVCLFFBQU1FLGFBQVksSUFBSSxhQUFhLE1BQU0sSUFBSSxFQUFFLFlBQVc7QUFDMUQsZ0JBQVksT0FBT0EsVUFBUyxLQUFLO0VBQ25DLENBQUM7QUFFRCxhQUFXLFNBQVMsU0FBVSxNQUFJO0FBQ2hDLFFBQU0sS0FBSyxPQUFPLElBQUk7QUFDdEIsUUFBSSxNQUFNLEVBQUU7QUFBRyxhQUFPLFFBQVEsS0FBSyxNQUFNLElBQUk7QUFDN0MsUUFBSSxDQUFDLFlBQVksS0FBSztBQUNwQixpQkFBVyxJQUFJLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQzdDLFVBQUksQ0FBQyxZQUFZLEtBQUs7QUFDcEIsb0JBQVksTUFBTTtBQUNsQixlQUFPLFFBQVEsS0FBSyxNQUFNLElBQUk7OztBQUdsQyxXQUFPO0VBQ1Q7QUFFQSxNQUFJLFdBQVcsV0FBVyxXQUFXO0FBQ25DLGVBQVcsV0FBVyxLQUFLLE9BQU8sV0FBVyxLQUFLLE1BQU07QUFDeEQsZUFBVyxTQUFTLFNBQVUsTUFBSTtBQUNoQyxVQUFNLEtBQUssT0FBTyxJQUFJO0FBQ3RCLFVBQUksQ0FBQyxZQUFZLEtBQUs7QUFDcEIsb0JBQVksTUFBTTtBQUNsQixlQUFPLFFBQVEsS0FBSyxNQUFNLElBQUk7O0FBRWhDLGFBQU87SUFDVDs7QUFHRixXQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUSxLQUFLO0FBQ3RDLFFBQU0sWUFBWSxJQUFJLGFBQWEsT0FBTyxJQUFJLElBQUksRUFBRSxZQUFXO0FBQy9ELFFBQUksQ0FBQyxXQUFXLE9BQU8sSUFBSSxLQUFLLFVBQVUsUUFBTyxDQUFFLENBQUM7QUFBRzs7QUFHekQsU0FBTyxRQUFRLFNBQVUsT0FBSztBQUM1QixTQUFLLFlBQVksTUFBTSxPQUFPO0VBQ2hDLENBQUM7QUFFRCxNQUFNLE1BQU0sV0FBVztBQUN2QixtQkFBUyxLQUFLLEdBQUc7QUFDakIsVUFBUSxXQUFXO1NBQ1o7U0FDQTtBQUNILGFBQU87U0FDSjtBQUNILGFBQVMsSUFBSSxVQUFVLElBQUksSUFBSSxTQUFTLE1BQU87U0FDNUM7O0FBRUgsYUFBUyxJQUFJLFVBQVUsSUFBSSxNQUFPOztBQUV4Qzs7O0FDekRBLElBQU1DLG1CQUFtQztFQUN2QyxTQUFTO0VBQ1QsT0FBTztFQUNQLFFBQVE7RUFDUixVQUFVO0VBQ1YsWUFBWTtFQUNaLE1BQU07O0FBR0YsU0FBVSxXQUFXLEdBQVcsU0FBaUM7QUFDckUsTUFBTSxZQUFnQyxDQUFBO0FBQ3RDLE1BQUksWUFBb0IsQ0FBQTtBQUN4QixNQUFNLGFBQWlDLENBQUE7QUFDdkMsTUFBSSxhQUFxQixDQUFBO0FBRXpCLE1BQU0sZ0JBQWdCLGFBQWEsQ0FBQztBQUM1QixNQUFBLFVBQVksY0FBYTtBQUMzQixNQUFBLE9BQVMsY0FBYTtBQUU1QixNQUFNLFFBQVEsZUFBZSxHQUFHLFFBQVEsTUFBTTtBQUU5QyxRQUFNLFFBQVEsU0FBQyxNQUFJOztBQUNqQixRQUFJLENBQUM7QUFBTTtBQUNMLFFBQUEsS0FBeUIsY0FBYyxJQUFJLEdBQXpDLE9BQUksR0FBQSxNQUFFLFFBQUssR0FBQSxPQUFFLFFBQUssR0FBQTtBQUUxQixZQUFRLEtBQUssWUFBVztXQUNqQjtBQUNILFlBQUksTUFBTSxRQUFRO0FBQ2hCLGdCQUFNLElBQUksTUFBTSwyQkFBQSxPQUEyQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUU7O0FBRzlELGtCQUFVLEtBQUssWUFBWSxJQUFJLENBQUM7QUFDaEM7V0FFRztBQUNHLFlBQUEsTUFBZ0IsS0FBQSw0QkFBNEIsS0FBSyxJQUFJLE9BQUMsUUFBQSxPQUFBLFNBQUEsS0FBSSxDQUFBLEdBQXZELFlBQVMsR0FBQTtBQUNsQixZQUFJLGFBQWEsQ0FBQyxNQUFNO0FBQ3RCLGlCQUFPOztBQUVULG9CQUFZLFVBQVUsT0FBTyxXQUFXLE9BQU8sS0FBSyxDQUFDO0FBQ3JEO1dBRUc7QUFDSCxZQUFJLE1BQU0sUUFBUTtBQUNoQixnQkFBTSxJQUFJLE1BQU0sNEJBQUEsT0FBNEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFFOztBQUcvRCxtQkFBVyxLQUFLLFlBQVksS0FBSyxDQUFDO0FBQ2xDO1dBRUc7QUFDSCxxQkFBYSxXQUFXLE9BQU8sV0FBVyxPQUFPLEtBQUssQ0FBQztBQUN2RDtXQUVHO0FBQ0g7O0FBR0EsY0FBTSxJQUFJLE1BQU0sMkJBQTJCLElBQUk7O0VBRXJELENBQUM7QUFFRCxTQUFPO0lBQ0w7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBOztBQUVKO0FBRUEsU0FBUyxVQUFVLEdBQVcsU0FBaUM7QUFDdkQsTUFBQSxLQUNKLFdBQVcsR0FBRyxPQUFPLEdBRGYsWUFBUyxHQUFBLFdBQUUsWUFBUyxHQUFBLFdBQUUsYUFBVSxHQUFBLFlBQUUsYUFBVSxHQUFBLFlBQUUsVUFBTyxHQUFBLFNBQUUsT0FBSSxHQUFBO0FBR25FLE1BQU0sVUFBVSxRQUFRLFVBQVU7QUFFbEMsTUFBSSxRQUFRLFlBQVk7QUFDdEIsWUFBUSxXQUFXO0FBQ25CLFlBQVEsU0FBUzs7QUFHbkIsTUFDRSxRQUFRLFlBQ1IsVUFBVSxTQUFTLEtBQ25CLFVBQVUsVUFDVixXQUFXLFVBQ1gsV0FBVyxRQUNYO0FBQ0EsUUFBTSxTQUFPLElBQUksU0FBUyxPQUFPO0FBRWpDLFdBQUssUUFBUSxPQUFPO0FBQ3BCLFdBQUssS0FBSyxRQUFRLE1BQVM7QUFFM0IsY0FBVSxRQUFRLFNBQUNDLE1BQUc7QUFDcEIsYUFBSyxNQUFNLElBQUksTUFBTSxrQkFBa0JBLE1BQUssU0FBUyxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBQ3RFLENBQUM7QUFFRCxjQUFVLFFBQVEsU0FBQyxNQUFJO0FBQ3JCLGFBQUssTUFBTSxJQUFJO0lBQ2pCLENBQUM7QUFFRCxlQUFXLFFBQVEsU0FBQ0EsTUFBRztBQUNyQixhQUFLLE9BQU8sSUFBSSxNQUFNLGtCQUFrQkEsTUFBSyxTQUFTLElBQUksR0FBRyxPQUFPLENBQUM7SUFDdkUsQ0FBQztBQUVELGVBQVcsUUFBUSxTQUFDLE1BQUk7QUFDdEIsYUFBSyxPQUFPLElBQUk7SUFDbEIsQ0FBQztBQUVELFFBQUksUUFBUSxjQUFjLFFBQVE7QUFBUyxhQUFLLE1BQU0sT0FBTztBQUM3RCxXQUFPOztBQUdULE1BQU0sTUFBTSxVQUFVLE1BQU0sQ0FBQTtBQUM1QixTQUFPLElBQUksTUFDVCxrQkFDRSxLQUNBLElBQUksV0FBVyxRQUFRLFdBQVcsU0FDbEMsSUFBSSxRQUFRLFFBQVEsUUFBUSxJQUFJLEdBRWxDLE9BQU87QUFFWDtBQUVNLFNBQVUsU0FDZCxHQUNBLFNBQXNDO0FBQXRDLE1BQUEsWUFBQSxRQUFBO0FBQUEsY0FBQSxDQUFBO0VBQXNDO0FBRXRDLFNBQU8sVUFBVSxHQUFHQyxtQkFBa0IsT0FBTyxDQUFDO0FBQ2hEO0FBRUEsU0FBUyxrQkFDUCxLQUNBLFNBQ0EsTUFBb0I7QUFFcEIsU0FBQSxTQUFBLFNBQUEsQ0FBQSxHQUNLLEdBQUcsR0FBQSxFQUNOLFNBQ0EsS0FBSSxDQUFBO0FBRVI7QUFFQSxTQUFTQSxtQkFBa0IsU0FBaUM7QUFDMUQsTUFBTSxVQUFvQixDQUFBO0FBQzFCLE1BQU0sT0FBTyxPQUFPLEtBQUssT0FBTztBQUNoQyxNQUFNQyxlQUFjLE9BQU8sS0FDekJILGdCQUFlO0FBR2pCLE9BQUssUUFBUSxTQUFVLEtBQUc7QUFDeEIsUUFBSSxDQUFDLFNBQVNHLGNBQWEsR0FBRztBQUFHLGNBQVEsS0FBSyxHQUFHO0VBQ25ELENBQUM7QUFFRCxNQUFJLFFBQVEsUUFBUTtBQUNsQixVQUFNLElBQUksTUFBTSxzQkFBc0IsUUFBUSxLQUFLLElBQUksQ0FBQzs7QUFHMUQsU0FBQSxTQUFBLFNBQUEsQ0FBQSxHQUFZSCxnQkFBZSxHQUFLLE9BQU87QUFDekM7QUFFQSxTQUFTLFlBQVksTUFBWTtBQUMvQixNQUFJLEtBQUssUUFBUSxHQUFHLE1BQU0sSUFBSTtBQUM1QixXQUFPO01BQ0wsTUFBTTtNQUNOLE9BQU87OztBQUlMLE1BQUEsS0FBZ0IsTUFBTSxNQUFNLEtBQUssQ0FBQyxHQUFqQyxPQUFJLEdBQUEsSUFBRSxRQUFLLEdBQUE7QUFDbEIsU0FBTztJQUNMO0lBQ0E7O0FBRUo7QUFFQSxTQUFTLGNBQWMsTUFBWTtBQUMzQixNQUFBLEtBQWtCLFlBQVksSUFBSSxHQUFoQyxPQUFJLEdBQUEsTUFBRSxRQUFLLEdBQUE7QUFDbkIsTUFBTSxRQUFRLEtBQUssTUFBTSxHQUFHO0FBQzVCLE1BQUksQ0FBQztBQUFPLFVBQU0sSUFBSSxNQUFNLHFCQUFxQjtBQUVqRCxTQUFPO0lBQ0wsTUFBTSxNQUFNLEdBQUcsWUFBVztJQUMxQixPQUFPLE1BQU0sTUFBTSxDQUFDO0lBQ3BCOztBQUVKO0FBRUEsU0FBUyxlQUFlLEdBQVcsUUFBYztBQUFkLE1BQUEsV0FBQSxRQUFBO0FBQUEsYUFBQTtFQUFjO0FBQy9DLE1BQUksS0FBSyxFQUFFLEtBQUk7QUFDZixNQUFJLENBQUM7QUFBRyxVQUFNLElBQUksTUFBTSxzQkFBc0I7QUFJOUMsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPLEVBQUUsTUFBTSxJQUFJOztBQUdyQixNQUFNLFFBQVEsRUFBRSxNQUFNLElBQUk7QUFDMUIsTUFBSSxJQUFJO0FBQ1IsU0FBTyxJQUFJLE1BQU0sUUFBUTtBQUV2QixRQUFNLE9BQVEsTUFBTSxLQUFLLE1BQU0sR0FBRyxRQUFRLFNBQVMsRUFBRTtBQUNyRCxRQUFJLENBQUMsTUFBTTtBQUNULFlBQU0sT0FBTyxHQUFHLENBQUM7ZUFDUixJQUFJLEtBQUssS0FBSyxPQUFPLEtBQUs7QUFDbkMsWUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLENBQUM7QUFDNUIsWUFBTSxPQUFPLEdBQUcsQ0FBQztXQUNaO0FBQ0wsV0FBSzs7O0FBSVQsU0FBTztBQUNUO0FBRUEsU0FBUyxpQkFBaUIsT0FBZTtBQUN2QyxRQUFNLFFBQVEsU0FBQyxNQUFJO0FBQ2pCLFFBQUksQ0FBQywrQkFBK0IsS0FBSyxJQUFJLEdBQUc7QUFDOUMsWUFBTSxJQUFJLE1BQU0sb0NBQW9DLElBQUk7O0VBRTVELENBQUM7QUFDSDtBQUVBLFNBQVMsV0FBVyxVQUFrQixPQUFlO0FBQ25ELG1CQUFpQixLQUFLO0FBRXRCLFNBQU8sU0FDSixNQUFNLEdBQUcsRUFDVCxJQUFJLFNBQUMsU0FBTztBQUFLLFdBQUEsaUJBQVMsa0JBQWtCLE9BQU87RUFBbEMsQ0FBbUM7QUFDekQ7OztBQ25QQSxTQUFTLG1CQUFzQixXQUFpQjtBQUFoRCxNQUFBLFFBQUE7QUFDRSxTQUFPLFNBQUMsT0FBUztBQUNmLFFBQUksVUFBVSxRQUFXO0FBQ3ZCLFlBQUssSUFBQSxPQUFJLFNBQVMsS0FBTTs7QUFHMUIsUUFBSSxNQUFLLElBQUEsT0FBSSxTQUFTLE9BQVEsUUFBVztBQUN2QyxhQUFPLE1BQUssSUFBQSxPQUFJLFNBQVM7O0FBRzNCLGFBQVMsSUFBSSxHQUFHLElBQUksTUFBSyxPQUFPLFFBQVEsS0FBSztBQUMzQyxVQUFNLFVBQVcsTUFBSyxPQUFPLEdBQUcsWUFBWTtBQUM1QyxVQUFJLFNBQU87QUFDVCxlQUFPOzs7RUFHYjtBQUNGO0FBRUEsSUFBQSxXQUFBLFNBQUEsUUFBQTtBQUE4QixZQUFBSSxXQUFBLE1BQUE7QUFlNUIsV0FBQUEsVUFBWSxTQUFlO0FBQWYsUUFBQSxZQUFBLFFBQUE7QUFBQSxnQkFBQTtJQUFlO0FBQTNCLFFBQUEsUUFDRSxPQUFBLEtBQUEsTUFBTSxDQUFBLEdBQUksT0FBTyxLQUFDO0FBUXBCLFVBQUEsVUFBVSxtQkFBbUIsTUFBTSxPQUFNLENBQUMsU0FBUyxDQUFDO0FBQ3BELFVBQUEsT0FBTyxtQkFBbUIsTUFBTSxPQUFNLENBQUMsTUFBTSxDQUFDO0FBUDVDLFVBQUssU0FBUyxDQUFBO0FBQ2QsVUFBSyxTQUFTLENBQUE7QUFDZCxVQUFLLFVBQVUsQ0FBQTtBQUNmLFVBQUssVUFBVSxDQUFBOztFQUNqQjtBQUtBLEVBQUFBLFVBQUEsVUFBQSxRQUFBLFNBQ0UsWUFBeUI7QUFFekIsV0FBTyxRQUNMLFlBQ0EsS0FBSyxRQUNMLEtBQUssU0FDTCxLQUFLLFFBQ0wsS0FBSyxTQUNMLEtBQUssS0FBSSxDQUFFO0VBRWY7QUFPQSxFQUFBQSxVQUFBLFVBQUEsUUFBQSxTQUFNLE9BQVk7QUFDaEIsYUFBUyxPQUFPLEtBQUssTUFBTTtFQUM3QjtBQU9BLEVBQUFBLFVBQUEsVUFBQSxTQUFBLFNBQU8sT0FBWTtBQUNqQixhQUFTLE9BQU8sS0FBSyxPQUFPO0VBQzlCO0FBT0EsRUFBQUEsVUFBQSxVQUFBLFFBQUEsU0FBTSxNQUFVO0FBQ2QsYUFBUyxNQUFNLEtBQUssTUFBTTtFQUM1QjtBQU9BLEVBQUFBLFVBQUEsVUFBQSxTQUFBLFNBQU8sTUFBVTtBQUNmLGFBQVMsTUFBTSxLQUFLLE9BQU87RUFDN0I7QUFPQSxFQUFBQSxVQUFBLFVBQUEsU0FBQSxXQUFBO0FBQ0UsV0FBTyxLQUFLLE9BQU8sSUFBSSxTQUFDLEdBQUM7QUFBSyxhQUFBLFNBQVMsRUFBRSxTQUFRLENBQUU7SUFBckIsQ0FBc0I7RUFDdEQ7QUFPQSxFQUFBQSxVQUFBLFVBQUEsVUFBQSxXQUFBO0FBQ0UsV0FBTyxLQUFLLFFBQVEsSUFBSSxTQUFDLEdBQUM7QUFBSyxhQUFBLFNBQVMsRUFBRSxTQUFRLENBQUU7SUFBckIsQ0FBc0I7RUFDdkQ7QUFPQSxFQUFBQSxVQUFBLFVBQUEsU0FBQSxXQUFBO0FBQ0UsV0FBTyxLQUFLLE9BQU8sSUFBSSxTQUFDLEdBQUM7QUFBSyxhQUFBLElBQUksS0FBSyxFQUFFLFFBQU8sQ0FBRTtJQUFwQixDQUFxQjtFQUNyRDtBQU9BLEVBQUFBLFVBQUEsVUFBQSxVQUFBLFdBQUE7QUFDRSxXQUFPLEtBQUssUUFBUSxJQUFJLFNBQUMsR0FBQztBQUFLLGFBQUEsSUFBSSxLQUFLLEVBQUUsUUFBTyxDQUFFO0lBQXBCLENBQXFCO0VBQ3REO0FBRUEsRUFBQUEsVUFBQSxVQUFBLFVBQUEsV0FBQTtBQUNFLFFBQUksU0FBbUIsQ0FBQTtBQUV2QixRQUFJLENBQUMsS0FBSyxPQUFPLFVBQVUsS0FBSyxVQUFVO0FBQ3hDLGVBQVMsT0FBTyxPQUFPLGdCQUFnQixFQUFFLFNBQVMsS0FBSyxTQUFRLENBQUUsQ0FBQzs7QUFHcEUsU0FBSyxPQUFPLFFBQVEsU0FBVSxPQUFLO0FBQ2pDLGVBQVMsT0FBTyxPQUFPLE1BQU0sU0FBUSxFQUFHLE1BQU0sSUFBSSxDQUFDO0lBQ3JELENBQUM7QUFFRCxTQUFLLFFBQVEsUUFBUSxTQUFVLFFBQU07QUFDbkMsZUFBUyxPQUFPLE9BQ2QsT0FDRyxTQUFRLEVBQ1IsTUFBTSxJQUFJLEVBQ1YsSUFBSSxTQUFDLE1BQUk7QUFBSyxlQUFBLEtBQUssUUFBUSxXQUFXLFNBQVM7TUFBakMsQ0FBa0MsRUFDaEQsT0FBTyxTQUFDLE1BQUk7QUFBSyxlQUFBLENBQUMsV0FBVyxLQUFLLElBQUk7TUFBckIsQ0FBc0IsQ0FBQztJQUUvQyxDQUFDO0FBRUQsUUFBSSxLQUFLLE9BQU8sUUFBUTtBQUN0QixhQUFPLEtBQUssZUFBZSxTQUFTLEtBQUssUUFBUSxLQUFLLEtBQUksQ0FBRSxDQUFDOztBQUcvRCxRQUFJLEtBQUssUUFBUSxRQUFRO0FBQ3ZCLGFBQU8sS0FBSyxlQUFlLFVBQVUsS0FBSyxTQUFTLEtBQUssS0FBSSxDQUFFLENBQUM7O0FBR2pFLFdBQU87RUFDVDtBQVFBLEVBQUFBLFVBQUEsVUFBQSxXQUFBLFdBQUE7QUFDRSxXQUFPLEtBQUssUUFBTyxFQUFHLEtBQUssSUFBSTtFQUNqQztBQUtBLEVBQUFBLFVBQUEsVUFBQSxRQUFBLFdBQUE7QUFDRSxRQUFNLE1BQU0sSUFBSUEsVUFBUyxDQUFDLENBQUMsS0FBSyxNQUFNO0FBRXRDLFNBQUssT0FBTyxRQUFRLFNBQUMsTUFBSTtBQUFLLGFBQUEsSUFBSSxNQUFNLEtBQUssTUFBSyxDQUFFO0lBQXRCLENBQXVCO0FBQ3JELFNBQUssUUFBUSxRQUFRLFNBQUMsTUFBSTtBQUFLLGFBQUEsSUFBSSxPQUFPLEtBQUssTUFBSyxDQUFFO0lBQXZCLENBQXdCO0FBQ3ZELFNBQUssT0FBTyxRQUFRLFNBQUMsTUFBSTtBQUFLLGFBQUEsSUFBSSxNQUFNLElBQUksS0FBSyxLQUFLLFFBQU8sQ0FBRSxDQUFDO0lBQWxDLENBQW1DO0FBQ2pFLFNBQUssUUFBUSxRQUFRLFNBQUMsTUFBSTtBQUFLLGFBQUEsSUFBSSxPQUFPLElBQUksS0FBSyxLQUFLLFFBQU8sQ0FBRSxDQUFDO0lBQW5DLENBQW9DO0FBRW5FLFdBQU87RUFDVDtBQUNGLFNBQUFBO0FBQUEsRUF2SzhCLEtBQUs7QUF5S25DLFNBQVMsU0FBUyxPQUFjLFlBQW1CO0FBQ2pELE1BQUksRUFBRSxpQkFBaUIsUUFBUTtBQUM3QixVQUFNLElBQUksVUFBVSxPQUFPLEtBQUssSUFBSSx3QkFBd0I7O0FBRzlELE1BQUksQ0FBQyxTQUFTLFdBQVcsSUFBSSxNQUFNLEdBQUcsT0FBTyxLQUFLLENBQUMsR0FBRztBQUNwRCxlQUFXLEtBQUssS0FBSzs7QUFFekI7QUFFQSxTQUFTLFNBQVMsTUFBWSxZQUFrQjtBQUM5QyxNQUFJLEVBQUUsZ0JBQWdCLE9BQU87QUFDM0IsVUFBTSxJQUFJLFVBQVUsT0FBTyxJQUFJLElBQUksdUJBQXVCOztBQUU1RCxNQUFJLENBQUMsU0FBUyxXQUFXLElBQUksTUFBTSxHQUFHLE9BQU8sSUFBSSxDQUFDLEdBQUc7QUFDbkQsZUFBVyxLQUFLLElBQUk7QUFDcEIscUJBQVMsS0FBSyxVQUFVOztBQUU1QjtBQUVBLFNBQVMsZUFDUCxPQUNBLFFBQ0EsTUFBd0I7QUFFeEIsTUFBTSxRQUFRLENBQUMsUUFBUSxLQUFLLFlBQVcsTUFBTztBQUM5QyxNQUFNLFNBQVMsUUFBUSxHQUFBLE9BQUcsT0FBSyxHQUFBLElBQU0sR0FBQSxPQUFHLE9BQUssUUFBQSxFQUFBLE9BQVMsTUFBSSxHQUFBO0FBRTFELE1BQU0sYUFBYSxPQUNoQixJQUFJLFNBQUMsT0FBSztBQUFLLFdBQUEsaUJBQVMsa0JBQWtCLE1BQU0sUUFBTyxHQUFJLEtBQUs7RUFBakQsQ0FBa0QsRUFDakUsS0FBSyxHQUFHO0FBRVgsU0FBTyxHQUFBLE9BQUcsTUFBTSxFQUFBLE9BQUcsVUFBVTtBQUMvQjs7O0FDdE9PLFNBQVMsY0FBYyxHQUF5QixHQUFxQztBQUN4RixNQUFJLE1BQU0sUUFBUSxNQUFNLE1BQU07QUFDMUIsV0FBTztBQUFBLEVBQ1gsV0FBVyxNQUFNLFFBQVEsTUFBTSxNQUFNO0FBQ2pDLFdBQU87QUFBQSxFQUNYLFdBQVcsTUFBTSxRQUFRLE1BQU0sTUFBTTtBQUNqQyxRQUFJLEVBQUUsUUFBUSxLQUFLLENBQUMsRUFBRSxRQUFRLEdBQUc7QUFDN0IsYUFBTztBQUFBLElBQ1gsV0FBVyxDQUFDLEVBQUUsUUFBUSxLQUFLLEVBQUUsUUFBUSxHQUFHO0FBQ3BDLGFBQU87QUFBQSxJQUNYO0FBRUEsUUFBSSxFQUFFLFFBQVEsQ0FBQyxHQUFHO0FBQ2QsYUFBTztBQUFBLElBQ1gsV0FBVyxFQUFFLFNBQVMsQ0FBQyxHQUFHO0FBQ3RCLGFBQU87QUFBQSxJQUNYLE9BQU87QUFDSCxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0osT0FBTztBQUNILFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQ2xCTyxJQUFNLGFBQU4sTUFBaUI7QUFBQSxFQXNCcEIsWUFBWTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0osR0FPRztBQUNDLFNBQUssUUFBUTtBQUNiLFNBQUssY0FBYztBQUNuQixTQUFLLGdCQUFnQjtBQUNyQixTQUFLLFlBQVk7QUFDakIsU0FBSyxnQkFBZ0I7QUFDckIsU0FBSyxVQUFVO0FBQUEsRUFDbkI7QUFBQSxFQUVBLE9BQWMsU0FBUztBQUFBLElBQ25CO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDSixHQUtzQjtBQUNsQixRQUFJO0FBQ0EsWUFBTSxRQUFRLG1CQUFtQixNQUFNLG9DQUFvQztBQUMzRSxVQUFJLFNBQVMsTUFBTTtBQUNmLGVBQU87QUFBQSxNQUNYO0FBRUEsWUFBTSxtQkFBbUIsTUFBTSxHQUFHLEtBQUs7QUFDdkMsWUFBTSxjQUFjLE1BQU0sT0FBTztBQUVqQyxZQUFNLFVBQVUsTUFBTSxVQUFVLGdCQUFnQjtBQUNoRCxVQUFJLFlBQVksTUFBTTtBQUdsQixZQUFJLGdCQUErQjtBQUVuQyxZQUFJLFNBQVM7QUFDVCwwQkFBZ0IsT0FBTyxPQUFPLE9BQU87QUFBQSxRQUN6QyxXQUFXLGVBQWU7QUFDdEIsMEJBQWdCLE9BQU8sT0FBTyxhQUFhO0FBQUEsUUFDL0MsV0FBVyxXQUFXO0FBQ2xCLDBCQUFnQixPQUFPLE9BQU8sU0FBUztBQUFBLFFBQzNDO0FBRUEsWUFBSSxDQUFDLGVBQWUsa0JBQWtCLE1BQU07QUFDeEMsa0JBQVEsVUFBVSxPQUFPLE9BQU8sYUFBYSxFQUFFLFFBQVEsS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLE9BQU87QUFBQSxRQUNuRixPQUFPO0FBQ0gsa0JBQVEsVUFBVSxPQUFPLE9BQU8sRUFBRSxRQUFRLEtBQUssRUFBRSxJQUFJLElBQUksRUFBRSxPQUFPO0FBQUEsUUFDdEU7QUFFQSxjQUFNLFFBQVEsSUFBSSxNQUFNLE9BQU87QUFDL0IsZUFBTyxJQUFJLFdBQVc7QUFBQSxVQUNsQjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsUUFDSixDQUFDO0FBQUEsTUFDTDtBQUFBLElBQ0osU0FBUyxPQUFQO0FBQUEsSUFFRjtBQUVBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFTyxTQUFpQjtBQUNwQixRQUFJQyxRQUFPLEtBQUssTUFBTSxPQUFPO0FBQzdCLFFBQUksS0FBSyxhQUFhO0FBQ2xCLE1BQUFBLFNBQVE7QUFBQSxJQUNaO0FBRUEsV0FBT0E7QUFBQSxFQUNYO0FBQUEsRUFLTyxPQUlFO0FBMUhiO0FBMkhRLFFBQUk7QUFDSixRQUFJLEtBQUssYUFBYTtBQUVsQixZQUFNLFFBQVEsT0FBTyxPQUFPO0FBQzVCLFlBQU0sbUJBQW1CLElBQUksTUFBTSxpQ0FDNUIsS0FBSyxNQUFNLGNBRGlCO0FBQUEsUUFFL0IsU0FBUyxNQUFNLFFBQVEsS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLE9BQU87QUFBQSxNQUNuRCxFQUFDO0FBQ0QsYUFBTyxLQUFLLFVBQVUsTUFBTSxNQUFNLEtBQUssR0FBRyxnQkFBZ0I7QUFBQSxJQUM5RCxPQUFPO0FBSUgsWUFBTSxRQUFRLE9BR1QsUUFBTyxVQUFLLGtCQUFMLFlBQXNCLE1BQVMsRUFDdEMsTUFBTSxLQUFLO0FBRWhCLGFBQU8sS0FBSyxVQUFVLE9BQU8sS0FBSyxLQUFLO0FBQUEsSUFDM0M7QUFFQSxRQUFJLFNBQVMsTUFBTTtBQUdmLFVBQUksWUFBMkI7QUFDL0IsVUFBSSxnQkFBK0I7QUFDbkMsVUFBSSxVQUF5QjtBQUk3QixVQUFJLEtBQUssZUFBZTtBQUNwQixZQUFJLEtBQUssV0FBVztBQUNoQixnQkFBTSxxQkFBcUIsT0FBTyxPQUFPLFNBQVMsS0FBSyxVQUFVLEtBQUssS0FBSyxhQUFhLENBQUM7QUFHekYsc0JBQVksT0FBTyxPQUFPLElBQUk7QUFFOUIsb0JBQVUsSUFBSSxLQUFLLE1BQU0sbUJBQW1CLE9BQU8sQ0FBQyxHQUFHLE1BQU07QUFBQSxRQUNqRTtBQUNBLFlBQUksS0FBSyxlQUFlO0FBQ3BCLGdCQUFNLHFCQUFxQixPQUFPLE9BQU8sU0FBUyxLQUFLLGNBQWMsS0FBSyxLQUFLLGFBQWEsQ0FBQztBQUc3RiwwQkFBZ0IsT0FBTyxPQUFPLElBQUk7QUFFbEMsd0JBQWMsSUFBSSxLQUFLLE1BQU0sbUJBQW1CLE9BQU8sQ0FBQyxHQUFHLE1BQU07QUFBQSxRQUNyRTtBQUNBLFlBQUksS0FBSyxTQUFTO0FBQ2QsZ0JBQU0scUJBQXFCLE9BQU8sT0FBTyxTQUFTLEtBQUssUUFBUSxLQUFLLEtBQUssYUFBYSxDQUFDO0FBR3ZGLG9CQUFVLE9BQU8sT0FBTyxJQUFJO0FBRTVCLGtCQUFRLElBQUksS0FBSyxNQUFNLG1CQUFtQixPQUFPLENBQUMsR0FBRyxNQUFNO0FBQUEsUUFDL0Q7QUFBQSxNQUNKO0FBRUEsYUFBTztBQUFBLFFBQ0g7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBRUEsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVPLFlBQVksT0FBbUI7QUFDbEMsUUFBSSxLQUFLLGdCQUFnQixNQUFNLGFBQWE7QUFDeEMsYUFBTztBQUFBLElBQ1g7QUFHQSxRQUFJLGNBQWMsS0FBSyxXQUFXLE1BQU0sU0FBUyxNQUFNLEdBQUc7QUFDdEQsYUFBTztBQUFBLElBQ1g7QUFDQSxRQUFJLGNBQWMsS0FBSyxlQUFlLE1BQU0sYUFBYSxNQUFNLEdBQUc7QUFDOUQsYUFBTztBQUFBLElBQ1g7QUFDQSxRQUFJLGNBQWMsS0FBSyxTQUFTLE1BQU0sT0FBTyxNQUFNLEdBQUc7QUFDbEQsYUFBTztBQUFBLElBQ1g7QUFFQSxXQUFPLEtBQUssT0FBTyxNQUFNLE1BQU0sT0FBTztBQUFBLEVBQzFDO0FBQUEsRUFzQlEsVUFBVSxPQUFlLE9BQW9CO0FBSWpELFVBQU0sSUFBSSxJQUFJO0FBQ2QsUUFBSSxPQUFPLE9BQU8sT0FBTyxNQUFNLE1BQU0sTUFBTSxPQUFPLENBQUMsQ0FBQztBQUdwRCxVQUFNLFNBQVMsS0FBSyxPQUFPO0FBQzNCLFVBQU0sYUFBYSxPQUFPLE1BQU0sNkJBQTZCO0FBQzdELFFBQUksZUFBZSxNQUFNO0FBRXJCLFVBQUksQ0FBQyxPQUFPLFNBQVMsTUFBTSxHQUFHO0FBQzFCLGVBQU8sV0FBVyxnQkFBZ0IsT0FBTyxNQUFNLE9BQU8sV0FBVyxFQUFFO0FBQUEsTUFDdkU7QUFBQSxJQUNKO0FBR0EsVUFBTSxZQUFZLE9BQU8sTUFBTSw0QkFBNEI7QUFDM0QsUUFBSSxjQUFjLE1BQU07QUFDcEIsYUFBTyxXQUFXLGVBQWUsT0FBTyxNQUFNLE9BQU8sVUFBVSxFQUFFO0FBQUEsSUFDckU7QUFHQSxXQUFPLFdBQVcsWUFBWSxJQUFJLEVBQUUsT0FBTztBQUFBLEVBQy9DO0FBQUEsRUFPQSxPQUFlLGdCQUNYLE9BQ0EsTUFDQSxPQUNBLGdCQUNNO0FBRU4sUUFBSSx1QkFBK0I7QUFDbkMsUUFBSSxtQkFBbUIsUUFBVztBQUM5Qiw2QkFBdUIsT0FBTyxTQUFTLGVBQWUsS0FBSyxHQUFHLEVBQUU7QUFBQSxJQUNwRTtBQUdBLFdBQU8sV0FBVyx3QkFBd0IsT0FBTyxNQUFNLG9CQUFvQixHQUFHO0FBRzFFLGFBQU8sV0FBVyxrQkFBa0IsT0FBTyxLQUFLO0FBQUEsSUFDcEQ7QUFFQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBS0EsT0FBZSx3QkFBd0IsT0FBZSxNQUFjLGdCQUFpQztBQUNqRyxRQUFJLGFBQWEsS0FBSyxNQUFNLElBQUksTUFBTSxNQUFNO0FBRzVDLFVBQU0sWUFBWSxLQUFLLEtBQUssSUFBSSxNQUFNLEtBQUs7QUFDM0Msa0JBQWMsWUFBWTtBQUUxQixXQUFPLGFBQWE7QUFBQSxFQUN4QjtBQUFBLEVBT0EsT0FBZSxlQUNYLE9BQ0EsTUFDQSxPQUNBLGVBQ007QUFFTixRQUFJLHNCQUE4QjtBQUNsQyxRQUFJLGtCQUFrQixRQUFXO0FBQzdCLDRCQUFzQixPQUFPLFNBQVMsY0FBYyxLQUFLLEdBQUcsRUFBRTtBQUFBLElBQ2xFO0FBR0EsV0FBTyxXQUFXLHVCQUF1QixPQUFPLE1BQU0sbUJBQW1CLEdBQUc7QUFHeEUsYUFBTyxXQUFXLGtCQUFrQixPQUFPLEtBQUs7QUFBQSxJQUNwRDtBQUVBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFLQSxPQUFlLHVCQUF1QixPQUFlLE1BQWMsZUFBZ0M7QUFDL0YsVUFBTSxPQUFPLEtBQUssS0FBSyxJQUFJLE1BQU0sS0FBSztBQUV0QyxXQUFPLE9BQU87QUFBQSxFQUNsQjtBQUFBLEVBT0EsT0FBZSxrQkFBa0IsT0FBZSxPQUFzQjtBQUNsRSxVQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsTUFBTSxLQUFLO0FBRXJDLFVBQU0sVUFBVSxNQUFNO0FBQ3RCLFlBQVEsVUFBVSxNQUFNLFFBQVEsS0FBSyxFQUFFLE9BQU87QUFDOUMsWUFBUSxJQUFJLE1BQU0sT0FBTztBQUV6QixXQUFPLE9BQU8sT0FBTyxNQUFNLE1BQU0sTUFBTSxPQUFPLENBQUMsQ0FBQztBQUFBLEVBQ3BEO0FBQUEsRUFFQSxPQUFlLFlBQVksTUFBc0I7QUFDN0MsVUFBTSxnQkFBZ0IsT0FBTyxPQUFPLElBQUksSUFBSSxFQUFFLE1BQU0sSUFBSTtBQUV4RCxXQUFPLGNBQWMsUUFBUSxLQUFLO0FBQUEsRUFDdEM7QUFDSjs7O0FDOVZPLElBQUssYUFBTCxrQkFBS0MsZ0JBQUw7QUFDSCxFQUFBQSxZQUFBLFVBQU87QUFDUCxFQUFBQSxZQUFBLFVBQU87QUFDUCxFQUFBQSxZQUFBLGlCQUFjO0FBQ2QsRUFBQUEsWUFBQSxlQUFZO0FBQ1osRUFBQUEsWUFBQSxjQUFXO0FBQ1gsRUFBQUEsWUFBQSxXQUFRO0FBTkEsU0FBQUE7QUFBQSxHQUFBO0FBZ0JMLElBQU0sc0JBQU4sTUFBMEI7QUFBQSxFQWlEN0IsWUFDSSxRQUNBLE1BQ0Esa0JBQ0Esb0JBQ0EsT0FBbUIsbUJBQ3JCO0FBQ0UsU0FBSyxTQUFTO0FBQ2QsU0FBSyxPQUFPO0FBQ1osU0FBSyxtQkFBbUI7QUFDeEIsU0FBSyxxQkFBcUI7QUFDMUIsU0FBSyxPQUFPO0FBQUEsRUFDaEI7QUFDSjs7O0FDakVPLElBQU0sVUFBTixNQUFhO0FBQUEsRUEwQ2hCLElBQVcsU0FBaUI7QUFDeEIsV0FBTyxLQUFLLGNBQWM7QUFBQSxFQUM5QjtBQUFBLEVBUUEsSUFBVyxPQUFlO0FBQ3RCLFdBQU8sS0FBSyxjQUFjO0FBQUEsRUFDOUI7QUFBQSxFQVFBLElBQVcsbUJBQTJCO0FBQ2xDLFdBQU8sS0FBSyxjQUFjO0FBQUEsRUFDOUI7QUFBQSxFQVFBLElBQVcscUJBQThCO0FBQ3JDLFdBQU8sS0FBSyxjQUFjO0FBQUEsRUFDOUI7QUFBQSxFQUtBLElBQVcsT0FBbUI7QUFDMUIsV0FBTyxLQUFLLGNBQWM7QUFBQSxFQUM5QjtBQUFBLEVBU0EsWUFBWSxlQUFvQztBQUM1QyxTQUFLLGdCQUFnQjtBQUFBLEVBQ3pCO0FBQUEsRUFLQSxPQUFPLFdBQW1CO0FBQ3RCLFdBQU8sSUFBSSxRQUFPLElBQUksb0JBQW9CLEtBQUssUUFBUSxLQUFLLHVCQUFxQixDQUFDO0FBQUEsRUFDdEY7QUFBQSxFQUtBLE9BQU8sWUFBb0I7QUFDdkIsV0FBTyxJQUFJLFFBQU8sSUFBSSxvQkFBb0IsSUFBSSxTQUFTLElBQUkseUJBQXNCLENBQUM7QUFBQSxFQUN0RjtBQUFBLEVBTUEsT0FBTyxXQUFtQjtBQUN0QixXQUFPLElBQUksUUFBTyxJQUFJLG9CQUFvQixLQUFLLFFBQVEsS0FBSyx1QkFBcUIsQ0FBQztBQUFBLEVBQ3RGO0FBQUEsRUFLQSxPQUFPLGdCQUF3QjtBQUMzQixXQUFPLElBQUksUUFBTyxJQUFJLG9CQUFvQixLQUFLLGFBQWEsS0FBSyxpQ0FBMEIsQ0FBQztBQUFBLEVBQ2hHO0FBQUEsRUFLQSxPQUFPLGlCQUF5QjtBQUM1QixXQUFPLElBQUksUUFBTyxJQUFJLG9CQUFvQixLQUFLLGVBQWUsS0FBSyxxQ0FBNEIsQ0FBQztBQUFBLEVBQ3BHO0FBQUEsRUFRQSxPQUFPLHdCQUF3QixRQUE0QjtBQUN2RCxZQUFRO0FBQUEsV0FDQztBQUFBLFdBQ0E7QUFDRDtBQUFBLFdBQ0M7QUFDRDtBQUFBLFdBQ0M7QUFDRDtBQUFBLFdBQ0M7QUFDRDtBQUFBLFdBQ0M7QUFBQTtBQUVEO0FBQUE7QUFBQSxFQUVaO0FBQUEsRUFPQSxPQUFPLDRCQUE0QixvQkFBd0M7QUFDdkUsV0FBTyxXQUFXO0FBQUEsRUFDdEI7QUFBQSxFQVdBLE9BQU8sb0JBQW9CLGVBQXVCO0FBQzlDLFdBQU8sSUFBSSxRQUFPLElBQUksb0JBQW9CLGVBQWUsV0FBVyxLQUFLLHdCQUFzQixDQUFDO0FBQUEsRUFDcEc7QUFBQSxFQU9BLE9BQU8sd0JBQXdCLFVBQWlDO0FBQzVELFVBQU0sU0FBUyxTQUFTO0FBQ3hCLFVBQU0sT0FBTyxRQUFPLDRCQUE0QixTQUFTLEVBQUU7QUFDM0QsV0FBTyxJQUFJLFFBQU8sSUFBSSxvQkFBb0IsUUFBUSxTQUFTLElBQUksU0FBUyxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQUEsRUFDNUY7QUFBQSxFQVNPLGNBQXVCO0FBQzFCLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQUEsRUFLTyxjQUFjO0FBQ2pCLFFBQUksZ0JBQWdCO0FBQ3BCLFFBQUksUUFBTyx3Q0FBd0MsS0FBSyxLQUFLLG9CQUFvQjtBQUM3RSxzQkFBZ0I7QUFBQSxJQUNwQjtBQUNBLFdBQ0ksTUFBTSxLQUFLLGVBQ0gsS0FBSyw2QkFDRixLQUFLLGlCQUNMLEtBQUssY0FBYyxTQUMzQjtBQUFBLEVBRVg7QUFBQSxFQVNBLE9BQWMsMENBQW1EO0FBQzdELFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFoT08sSUFBTSxTQUFOO0FBQU0sT0FRSyxPQUFlLFFBQU8sU0FBUztBQVJwQyxPQWdCSyxRQUFnQixRQUFPLFVBQVU7QUFoQnRDLE9BMEJLLE9BQWUsUUFBTyxTQUFTOzs7QUM5QjFDLElBQU0saUJBQU4sTUFBcUI7QUFBQSxFQUN4QixjQUFjO0FBQ1YsU0FBSyxlQUFlO0FBQUEsTUFFaEIsT0FBTyxTQUFTLEVBQUU7QUFBQSxNQUNsQixPQUFPLFNBQVMsRUFBRTtBQUFBLElBQ3RCO0FBQ0EsU0FBSyxpQkFBaUI7QUFBQSxNQUVsQixPQUFPLGVBQWUsRUFBRTtBQUFBLE1BQ3hCLE9BQU8sY0FBYyxFQUFFO0FBQUEsSUFDM0I7QUFBQSxFQUNKO0FBQUEsRUFjQSxPQUFjLFVBQVUsVUFBaUMsV0FBZ0M7QUFDckYsYUFBUyxLQUFLLFNBQVM7QUFBQSxFQUMzQjtBQUFBLEVBY0EsT0FBYyxjQUNWLFVBQ0EsZ0JBQ0EsV0FDTztBQUNQLFVBQU0sUUFBUSxLQUFLLGdCQUFnQixnQkFBZ0IsUUFBUTtBQUMzRCxRQUFJLFNBQVMsSUFBSTtBQUNiLGFBQU87QUFBQSxJQUNYO0FBQ0EsYUFBUyxPQUFPLE9BQU8sR0FBRyxTQUFTO0FBQ25DLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFTQSxPQUFlLGdCQUFnQixxQkFBMEMsVUFBaUM7QUFDdEcsVUFBTSx5QkFBeUIsSUFBSSxPQUFPLG1CQUFtQjtBQUM3RCxXQUFPLFNBQVMsVUFBVSxDQUFDLE1BQU07QUFDN0IsYUFBTyxJQUFJLE9BQU8sQ0FBQyxFQUFFLFlBQVksS0FBSyx1QkFBdUIsWUFBWTtBQUFBLElBQzdFLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFXQSxPQUFjLGFBQWEsVUFBaUMsUUFBNkI7QUFDckYsVUFBTSxRQUFRLEtBQUssZ0JBQWdCLFFBQVEsUUFBUTtBQUNuRCxRQUFJLFNBQVMsSUFBSTtBQUNiLGFBQU87QUFBQSxJQUNYO0FBQ0EsYUFBUyxPQUFPLE9BQU8sQ0FBQztBQUN4QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBU0EsT0FBYyx3QkFBd0IsZ0JBQWdDO0FBQ2xFLG1CQUFlLGVBQWUsT0FBTyxDQUFDO0FBQUEsRUFDMUM7QUFBQSxFQU9BLE9BQWMsdUJBQXVCLGdCQUFnQztBQUNqRSxtQkFBZSx3QkFBd0IsY0FBYztBQUNyRCxVQUFNQyxtQkFBa0IsSUFBSSxlQUFlO0FBQzNDLElBQUFBLGlCQUFnQixlQUFlLFFBQVEsQ0FBQyxNQUFNO0FBQzFDLHFCQUFlLFVBQVUsZUFBZSxnQkFBZ0IsQ0FBQztBQUFBLElBQzdELENBQUM7QUFBQSxFQUNMO0FBQUEsRUFlQSxPQUFjLHdCQUNWLGdCQUNBLG1CQUNRO0FBQ1IsVUFBTSxVQUFvQixDQUFDO0FBQzNCLHNCQUFrQixRQUFRLENBQUMsbUJBQW1CO0FBQzFDLFlBQU0sWUFBWSxlQUFlLGVBQWUsS0FBSyxDQUFDQyxhQUFZO0FBQzlELGVBQ0lBLFNBQVEsVUFBVSxlQUFlLE1BQ2pDQSxTQUFRLFFBQVEsZUFBZSxNQUMvQkEsU0FBUSxvQkFBb0IsZUFBZTtBQUFBLE1BRW5ELENBQUM7QUFDRCxVQUFJLENBQUMsV0FBVztBQUNaLHVCQUFlLFVBQVUsZUFBZSxnQkFBZ0IsT0FBTyx3QkFBd0IsY0FBYyxDQUFDO0FBQUEsTUFDMUcsT0FBTztBQUNILGdCQUFRLEtBQUssY0FBYyxlQUFlLE9BQU8sZUFBZSx1QkFBdUI7QUFBQSxNQUMzRjtBQUFBLElBQ0osQ0FBQztBQUNELFdBQU87QUFBQSxFQUNYO0FBQUEsRUFPQSxPQUFjLHNCQUFzQixnQkFBZ0MsZ0JBQWdDO0FBQ2hHLG1CQUFlLGNBQWM7QUFDN0IsbUJBQWUsYUFBYSxRQUFRLENBQUMsZUFBZTtBQUNoRCxxQkFBZSxJQUFJLFVBQVU7QUFBQSxJQUNqQyxDQUFDO0FBQ0QsbUJBQWUsZUFBZSxRQUFRLENBQUMsZUFBZTtBQUNsRCxxQkFBZSxJQUFJLFVBQVU7QUFBQSxJQUNqQyxDQUFDO0FBQUEsRUFDTDtBQUNKOzs7Ozs7Ozs7Ozs7Ozs7QUMzSk8sSUFBTSxVQUFOLE1BQWM7QUFBQSxFQUNULFlBQ1ksY0FDQSxPQUNBLGFBQ0EsYUFDQSxrQkFDQSxRQUNsQjtBQU5rQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQSxFQUNqQjtBQUFBLEVBVUgsV0FBVyxTQUFvQjtBQUMzQixRQUFJLG9CQUErQixDQUFDO0FBRXBDLGlDQUFhLFFBQVEsQ0FBQyxZQUFZO0FBQzlCLDBCQUFvQjtBQUFBLFFBQ2hCLEdBQUc7QUFBQSxRQUNILElBQUk7QUFBQSxVQUNBLFFBQVE7QUFBQSxVQUNSLFFBQVE7QUFBQSxVQUNSLFFBQVE7QUFBQSxVQUNSLFFBQVE7QUFBQSxVQUNSLFFBQVE7QUFBQSxVQUNSLFFBQVE7QUFBQSxRQUNaO0FBQUEsTUFDSjtBQUFBLElBQ0osQ0FBQztBQUNELFdBQU87QUFBQSxFQUNYO0FBQUEsRUFVQSxXQUFXLGdCQUE2QjtBQUNwQyxVQUFNLGVBQW9ELENBQUM7QUFFM0QsWUFBUSxPQUFPLFFBQVEsQ0FBQyxZQUFZO0FBQ2hDLG1CQUFhLFFBQVEsZ0JBQWdCLFFBQVE7QUFBQSxJQUNqRCxDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQVNBLE9BQU8sV0FBVyxNQUF1QjtBQUNyQyxlQUFXLFdBQVcsUUFBUSxRQUFRO0FBQ2xDLFVBQUksU0FBUyxRQUFRLGNBQWM7QUFDL0IsZUFBTztBQUFBLE1BQ1g7QUFBQSxJQUNKO0FBRUEsVUFBTSxJQUFJO0FBQUEsTUFDTiw0Q0FBNEMscURBQ3ZDLEtBQWEsVUFBVSxZQUFZO0FBQUEsSUFFNUM7QUFBQSxFQUNKO0FBQ0o7OztBQ3BEQSxJQUFNLGtCQUE0QjtBQUFBLEVBQzlCLGNBQWM7QUFBQSxFQUNkLG9CQUFvQjtBQUFBLEVBQ3BCLGFBQWE7QUFBQSxFQUNiLHFCQUFxQjtBQUFBLEVBQ3JCLHFCQUFxQjtBQUFBLEVBQ3JCLHFCQUFxQjtBQUFBLEVBQ3JCLG1CQUFtQjtBQUFBLEVBQ25CLDRCQUE0QjtBQUFBLEVBQzVCLHVCQUF1QixDQUFDO0FBQUEsRUFDeEIsZ0JBQWdCLElBQUksZUFBZTtBQUFBLEVBQ25DLFVBQVUsUUFBUTtBQUFBLEVBQ2xCLGlCQUFpQixDQVFqQjtBQUFBLEVBQ0EsZUFBZSxDQUFDO0FBQ3BCO0FBRUEsSUFBSSxXQUFxQixtQkFBSztBQVV2QixJQUFNLGNBQWMsTUFBZ0I7QUFFdkMsYUFBVyxRQUFRLFFBQVEsZUFBZTtBQUN0QyxRQUFJLFNBQVMsU0FBUyxVQUFVLFFBQVc7QUFDdkMsZUFBUyxTQUFTLFFBQVEsUUFBUSxjQUFjO0FBQUEsSUFDcEQ7QUFBQSxFQUNKO0FBSUEsV0FBUyxlQUFlLGVBQWUsUUFBUSxDQUFDLEdBQUcsT0FBTyxVQUFVO0FBbkZ4RTtBQW9GUSxVQUFNLFVBQVUsT0FBTyw0QkFBNEIsRUFBRSxJQUFJO0FBQ3pELFVBQU0sU0FBUyxJQUFJO0FBQUEsT0FDZixPQUFFLFdBQUYsWUFBWTtBQUFBLE1BQ1osRUFBRTtBQUFBLE9BQ0YsT0FBRSxxQkFBRixZQUFzQjtBQUFBLE1BQ3RCLEVBQUU7QUFBQSxNQUNGO0FBQUEsSUFDSjtBQUFBLEVBQ0osQ0FBQztBQUVELFNBQU8sbUJBQUs7QUFDaEI7QUFFTyxJQUFNLGlCQUFpQixDQUFDLGdCQUE2QztBQUN4RSxhQUFXLGtDQUFLLFdBQWE7QUFFN0IsU0FBTyxZQUFZO0FBQ3ZCO0FBTU8sSUFBTSx1QkFBdUIsQ0FBQyxNQUFjLFVBQXNDO0FBQ3JGLFdBQVMsZ0JBQWdCLFFBQVE7QUFhakMsU0FBTyxZQUFZO0FBQ3ZCO0FBU08sSUFBTSxtQkFBbUIsQ0FBQyxpQkFBa0M7QUFuSW5FO0FBb0lJLFVBQU8sY0FBUyxTQUFTLGtCQUFsQixZQUFtQztBQUM5Qzs7O0FDbEhPLElBQU0saUJBQU4sTUFBcUI7QUFBQSxFQWNqQixjQUFjO0FBWHJCLFNBQVEsc0JBQWdDLENBQUM7QUFZckMsU0FBSyxzQkFBc0I7QUFBQSxFQUMvQjtBQUFBLEVBU0EsSUFBVyxxQkFBK0I7QUFDdEMsV0FBTyxLQUFLLG9CQUFvQixPQUFPLENBQUMsRUFBRSxPQUFPLE1BQU0sV0FBVyxPQUFPLE1BQU0sTUFBTTtBQUFBLEVBQ3pGO0FBQUEsRUFTQSxPQUFjLGNBQThCO0FBQ3hDLFFBQUksQ0FBQyxlQUFlLFVBQVU7QUFDMUIscUJBQWUsV0FBVyxJQUFJLGVBQWU7QUFBQSxJQUNqRDtBQUVBLFdBQU8sZUFBZTtBQUFBLEVBQzFCO0FBQUEsRUFRTyxJQUFJLFFBQTRDO0FBQ25ELFFBQUksQ0FBQyxLQUFLLFVBQVUsT0FBTyxNQUFNLEdBQUc7QUFDaEMsVUFBSSxrQkFBa0IsUUFBUTtBQUMxQixhQUFLLG9CQUFvQixLQUFLLE1BQU07QUFBQSxNQUN4QyxPQUFPO0FBQ0gsYUFBSyxvQkFBb0IsS0FBSyxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQUEsTUFDcEQ7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUFBLEVBYU8sU0FBUyxRQUF3QjtBQUNwQyxRQUFJLEtBQUssVUFBVSxNQUFNLEdBQUc7QUFDeEIsYUFBTyxLQUFLLFVBQVUsTUFBTTtBQUFBLElBQ2hDO0FBRUEsV0FBTyxPQUFPO0FBQUEsRUFDbEI7QUFBQSxFQWVPLGlCQUFpQixRQUF3QjtBQUM1QyxRQUFJLEtBQUssVUFBVSxNQUFNLEdBQUc7QUFDeEIsYUFBTyxLQUFLLFVBQVUsTUFBTTtBQUFBLElBQ2hDO0FBRUEsV0FBTyxPQUFPLG9CQUFvQixNQUFNO0FBQUEsRUFDNUM7QUFBQSxFQVNPLE9BQU8sWUFBNEI7QUFDdEMsUUFBSSxLQUFLLG9CQUFvQixPQUFPLENBQUMsRUFBRSxLQUFLLE1BQU0sU0FBUyxVQUFVLEVBQUUsU0FBUyxHQUFHO0FBQy9FLGFBQU8sS0FBSyxvQkFBb0IsT0FBTyxDQUFDLEVBQUUsS0FBSyxNQUFNLFNBQVMsVUFBVSxFQUFFO0FBQUEsSUFDOUU7QUFFQSxXQUFPLE9BQU87QUFBQSxFQUNsQjtBQUFBLEVBT08seUJBQStCO0FBQ2xDLFNBQUssY0FBYztBQUNuQixTQUFLLHNCQUFzQjtBQUFBLEVBQy9CO0FBQUEsRUFLTyxnQkFBc0I7QUFDekIsU0FBSyxzQkFBc0IsQ0FBQztBQUFBLEVBQ2hDO0FBQUEsRUFVTyxjQUFjLFFBQXdCO0FBQ3pDLFFBQUksT0FBTyxxQkFBcUIsSUFBSTtBQUNoQyxZQUFNLGFBQWEsS0FBSyxTQUFTLE9BQU8sZ0JBQWdCO0FBQ3hELFVBQUksZUFBZSxNQUFNO0FBQ3JCLGVBQU87QUFBQSxNQUNYO0FBQUEsSUFDSjtBQUNBLFdBQU8sT0FBTztBQUFBLEVBQ2xCO0FBQUEsRUFVTyxzQkFBc0IsUUFBd0I7QUFDakQsVUFBTSxhQUFhLEtBQUssY0FBYyxNQUFNO0FBQzVDLFFBQUksV0FBVyw4QkFBMkI7QUFDdEMsYUFBTztBQUFBLElBQ1g7QUFHQSxXQUFPLE9BQU8sb0JBQW9CLE9BQU8sZ0JBQWdCO0FBQUEsRUFDN0Q7QUFBQSxFQVdPLG9CQUFvQixhQUFpQztBQUN4RCxVQUFNLGtCQUFrQixZQUFZLE9BQU8sQ0FBQyxNQUFNO0FBQzlDLGFBQU8sQ0FBQyxLQUFLLFVBQVUsRUFBRSxNQUFNO0FBQUEsSUFDbkMsQ0FBQztBQUtELFVBQU0sb0JBQW9CLElBQUksZUFBZTtBQUU3QyxVQUFNLHNCQUFnQyxDQUFDO0FBQ3ZDLG9CQUFnQixRQUFRLENBQUMsTUFBTTtBQUUzQixVQUFJLGtCQUFrQixVQUFVLEVBQUUsTUFBTSxHQUFHO0FBQ3ZDO0FBQUEsTUFDSjtBQUlBLFlBQU0sWUFBWSxlQUFlLHNCQUFzQixHQUFHLFlBQVksRUFBRSxTQUFTO0FBQ2pGLDBCQUFvQixLQUFLLFNBQVM7QUFFbEMsd0JBQWtCLElBQUksU0FBUztBQUFBLElBQ25DLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsT0FBZSxzQkFBc0IsR0FBVyxTQUFpQjtBQUM3RCxVQUFNLHNCQUFzQixJQUFJO0FBQUEsTUFDNUIsRUFBRTtBQUFBLE1BQ0Y7QUFBQSxNQUNBLEVBQUU7QUFBQSxNQUNGLEVBQUU7QUFBQSxNQUNGLEVBQUU7QUFBQSxJQUNOO0FBQ0EsV0FBTyxJQUFJLE9BQU8sbUJBQW1CO0FBQUEsRUFDekM7QUFBQSxFQVVRLFVBQVUsY0FBOEI7QUFDNUMsV0FBTyxLQUFLLG9CQUFvQixPQUFPLENBQUMsRUFBRSxPQUFPLE1BQU0sV0FBVyxZQUFZLEVBQUU7QUFBQSxFQUNwRjtBQUFBLEVBVVEsVUFBVSxjQUErQjtBQUM3QyxXQUNJLEtBQUssb0JBQW9CLEtBQUssQ0FBQ0MsYUFBWTtBQUN2QyxhQUFPQSxTQUFRLFdBQVc7QUFBQSxJQUM5QixDQUFDLE1BQU07QUFBQSxFQUVmO0FBQUEsRUFRUSx3QkFBOEI7QUFDbEMsVUFBTSxrQkFBa0IsQ0FBQyxPQUFPLFNBQVMsR0FBRyxPQUFPLGVBQWUsR0FBRyxPQUFPLFNBQVMsR0FBRyxPQUFPLGNBQWMsQ0FBQztBQUU5RyxvQkFBZ0IsUUFBUSxDQUFDLFdBQVc7QUFDaEMsV0FBSyxJQUFJLE1BQU07QUFBQSxJQUNuQixDQUFDO0FBQUEsRUFDTDtBQUNKOzs7QUNqUk8sSUFBTSxXQUFOLE1BQWM7QUFBQSxFQVFqQixPQUFjLFVBQVUsTUFBb0I7QUFDeEMsUUFBSSxVQUFVO0FBRWQsUUFBSSxLQUFLLFlBQVksTUFBTTtBQUV2QixZQUFNLGNBQWMsS0FBSyxNQUFNLE9BQU8sT0FBTyxFQUFFLEtBQUssS0FBSyxPQUFPLElBQUksU0FBUSxrQkFBa0I7QUFFOUYsVUFBSTtBQUNKLFVBQUksZUFBZSxHQUFLO0FBQ3BCLHdCQUFnQjtBQUFBLE1BQ3BCLFdBQVcsZUFBZSxLQUFPO0FBRTdCLHlCQUFrQixjQUFjLE1BQVEsTUFBTyxLQUFPO0FBQUEsTUFDMUQsT0FBTztBQUNILHdCQUFnQjtBQUFBLE1BQ3BCO0FBRUEsaUJBQVcsZ0JBQWdCLFNBQVE7QUFBQSxJQUN2QztBQUVBLFFBQUksS0FBSyxrQkFBa0IsTUFBTTtBQUM3QixVQUFJLE9BQU8sT0FBTyxFQUFFLGNBQWMsS0FBSyxhQUFhLEdBQUc7QUFDbkQsbUJBQVcsSUFBSSxTQUFRO0FBQUEsTUFDM0I7QUFBQSxJQUNKO0FBRUEsUUFBSSxLQUFLLGNBQWMsTUFBTTtBQUN6QixVQUFJLE9BQU8sT0FBTyxFQUFFLFNBQVMsS0FBSyxTQUFTLEdBQUc7QUFDMUMsbUJBQVcsSUFBSSxTQUFRO0FBQUEsTUFDM0I7QUFBQSxJQUNKO0FBRUEsWUFBUSxLQUFLO0FBQUEsV0FFSjtBQUNELG1CQUFXLElBQU0sU0FBUTtBQUN6QjtBQUFBLFdBRUM7QUFDRCxtQkFBVyxPQUFPLFNBQVE7QUFDMUI7QUFBQSxXQUVDO0FBQ0QsbUJBQVcsUUFBUSxTQUFRO0FBQzNCO0FBQUE7QUFHUixXQUFPO0FBQUEsRUFDWDtBQUNKO0FBekRPLElBQU0sVUFBTjtBQUFNLFFBQ2UsaUJBQWlCO0FBRGhDLFFBRWUsdUJBQXVCO0FBRnRDLFFBR2UscUJBQXFCO0FBSHBDLFFBSWUsc0JBQXNCO0FBSnJDLFFBTWUscUJBQXFCLE1BQU8sS0FBSyxLQUFLOzs7QUNSbEUsSUFBQUMsbUJBQTRDOzs7QUNBNUMsc0JBQTRDO0FBTTVDLElBQUk7QUFDSixJQUFJO0FBRUcsSUFBTSxpQkFBaUIsQ0FBQztBQUFBLEVBQzNCLGVBQWU7QUFBQSxFQUNmLE9BQU87QUFDWCxNQUdNO0FBQ0Ysa0JBQWdCO0FBQ2hCLFVBQVE7QUFDWjtBQVNPLElBQU0sdUJBQXVCLENBQU8sT0FNdEIsaUJBTnNCLEtBTXRCLFdBTnNCO0FBQUEsRUFDdkM7QUFBQSxFQUNBO0FBQ0osR0FHcUI7QUFDakIsTUFBSSxVQUFVLFVBQWEsa0JBQWtCLFFBQVc7QUFDcEQsWUFBUSxNQUFNLGdEQUFnRDtBQUM5RDtBQUFBLEVBQ0o7QUFFQSxNQUFJLENBQUMsTUFBTSxRQUFRLFFBQVEsR0FBRztBQUMxQixlQUFXLENBQUMsUUFBUTtBQUFBLEVBQ3hCO0FBRUEsZ0JBQWM7QUFBQSxJQUNWO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxlQUFlO0FBQUEsRUFDbkIsQ0FBQztBQUNMO0FBT0EsSUFBTSxnQkFBZ0IsQ0FBTyxPQVlSLGlCQVpRLEtBWVIsV0FaUTtBQUFBLEVBQ3pCO0FBQUEsRUFDQTtBQUFBLEVBQ0EsT0FBQUM7QUFBQSxFQUNBLGVBQUFDO0FBQUEsRUFDQTtBQUNKLEdBTXFCO0FBQ2pCLFFBQU0sUUFBUSxNQUFNO0FBQ2hCLFFBQUksZ0JBQWdCLElBQUk7QUFDcEIsY0FBUSxNQUFNLHVEQUF1RDtBQUNyRTtBQUFBLElBQ0o7QUFFQSxVQUFNLFVBQVUsS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLGFBQWEsR0FBRyxHQUFHO0FBQ3pELGVBQVcsTUFBTTtBQUNiLG9CQUFjO0FBQUEsUUFDVjtBQUFBLFFBQ0E7QUFBQSxRQUNBLE9BQUFEO0FBQUEsUUFDQSxlQUFBQztBQUFBLFFBQ0EsZUFBZSxnQkFBZ0I7QUFBQSxNQUNuQyxDQUFDO0FBQUEsSUFDTCxHQUFHLE9BQU87QUFBQSxFQUNkO0FBRUEsUUFBTSxPQUFPRCxPQUFNLHNCQUFzQixhQUFhLElBQUk7QUFDMUQsTUFBSSxFQUFFLGdCQUFnQix3QkFBUTtBQUMxQixZQUFRLEtBQUssaUNBQWlDLGFBQWEsMkJBQTJCO0FBQ3RGLFdBQU8sTUFBTTtBQUFBLEVBQ2pCO0FBRUEsTUFBSSxLQUFLLGNBQWMsTUFBTTtBQUN6QixZQUFRLE1BQU0sMkRBQTJEO0FBQ3pFO0FBQUEsRUFDSjtBQUVBLFFBQU0sWUFBWUMsZUFBYyxhQUFhLElBQUk7QUFDakQsTUFBSSxhQUFhLFVBQWEsY0FBYyxNQUFNO0FBQzlDLFlBQVEsS0FBSyx1Q0FBdUMsS0FBSyxvQkFBb0I7QUFDN0UsV0FBTyxNQUFNO0FBQUEsRUFDakI7QUFFQSxRQUFNLGlCQUFpQixVQUFVO0FBQ2pDLE1BQUksbUJBQW1CLFVBQWEsZUFBZSxXQUFXLEdBQUc7QUFDN0QsWUFBUSxLQUFLLCtDQUErQyxLQUFLLG9CQUFvQjtBQUNyRixXQUFPLE1BQU07QUFBQSxFQUNqQjtBQUVBLFFBQU0sY0FBYyxNQUFNRCxPQUFNLEtBQUssSUFBSTtBQUN6QyxRQUFNLFlBQVksWUFBWSxNQUFNLElBQUk7QUFFeEMsUUFBTSxFQUFFLGFBQWEsSUFBSSxZQUFZO0FBQ3JDLE1BQUk7QUFDSixNQUFJLGVBQWU7QUFDbkIsYUFBVyxpQkFBaUIsZ0JBQWdCO0FBQ3hDLFFBQUksY0FBYyxTQUFTLE1BQU0sT0FBTyxhQUFhLGNBQWM7QUFDL0Q7QUFBQSxJQUNKO0FBRUEsUUFBSSxjQUFjLFNBQVMsUUFBVztBQUNsQztBQUFBLElBQ0o7QUFFQSxVQUFNLE9BQU8sVUFBVSxjQUFjLFNBQVMsTUFBTTtBQUVwRCxRQUFJLEtBQUssU0FBUyxZQUFZLEdBQUc7QUFDN0IsVUFBSSxpQkFBaUIsYUFBYSxjQUFjO0FBQzVDLG1CQUFXO0FBQ1g7QUFBQSxNQUNKO0FBRUE7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQUksYUFBYSxRQUFXO0FBQ3hCLFlBQVEsTUFBTSxtREFBbUQ7QUFDakU7QUFBQSxFQUNKO0FBRUEsUUFBTSxtQkFBbUI7QUFBQSxJQUNyQixHQUFHLFVBQVUsTUFBTSxHQUFHLFNBQVMsU0FBUyxNQUFNLElBQUk7QUFBQSxJQUNsRCxHQUFHLFNBQVMsSUFBSSxDQUFDLFNBQWUsS0FBSyxpQkFBaUIsQ0FBQztBQUFBLElBQ3ZELEdBQUcsVUFBVSxNQUFNLFNBQVMsU0FBUyxNQUFNLE9BQU8sQ0FBQztBQUFBLEVBQ3ZEO0FBRUEsUUFBTUEsT0FBTSxPQUFPLE1BQU0saUJBQWlCLEtBQUssSUFBSSxDQUFDO0FBQ3hEOzs7QURuSU8sSUFBTSxnQkFBd0Q7QUFBQSxFQUNqRSxhQUFhO0FBQUEsRUFDYixVQUFVO0FBQUEsRUFDVixTQUFTO0FBQUEsRUFDVCxXQUFXO0FBQUEsRUFDWCxlQUFlO0FBQUEsRUFDZixVQUFVO0FBQUEsRUFDVixnQkFBZ0I7QUFBQSxFQUNoQixXQUFXO0FBQ2Y7QUFFQSxJQUFNLHNCQUFzQjtBQUM1QixJQUFNLCtCQUErQjtBQU9yQyxTQUFlLHlCQUF5QkUsT0FBY0MsVUFBMEIsTUFBYztBQUFBO0FBQzFGLFVBQU0sa0NBQWlCLGVBQWVELE9BQU1DLFVBQVMsTUFBTSxJQUE0QjtBQUFBLEVBQzNGO0FBQUE7QUFTQSxTQUFzQixlQUNsQixNQUNBLGVBQ0EsZUFBb0MsTUFDZDtBQUFBO0FBcEQxQjtBQXFESSxRQUFJLENBQUM7QUFBYyxxQkFBZTtBQUNsQyxVQUFNLEtBQW9CLFNBQVMsY0FBYyxJQUFJO0FBQ3JELGtCQUFjLGdCQUFnQixZQUFZLEVBQUU7QUFFNUMsT0FBRyxVQUFVLElBQUksa0JBQWtCLHdCQUF3QjtBQU8zRCxVQUFNLFdBQVcsU0FBUyxjQUFjLE1BQU07QUFDOUMsT0FBRyxZQUFZLFFBQVE7QUFDdkIsYUFBUyxVQUFVLElBQUksaUJBQWlCO0FBQ3hDLFVBQU0sYUFBYSxNQUFNLFdBQVcsTUFBTSxlQUFlLFVBQVUsWUFBWTtBQUMvRSxlQUFXLE9BQU87QUFBWSxTQUFHLFFBQVEsT0FBTyxXQUFXO0FBSTNELFVBQU0sV0FBVyxTQUFTLGNBQWMsT0FBTztBQUMvQyxPQUFHLFlBQVksUUFBUTtBQUN2QixhQUFTLFVBQVUsSUFBSSx5QkFBeUI7QUFDaEQsYUFBUyxPQUFPO0FBQ2hCLFFBQUksS0FBSyxPQUFPLFdBQVcsS0FBSztBQUM1QixlQUFTLFVBQVU7QUFDbkIsU0FBRyxVQUFVLElBQUksWUFBWTtBQUFBLElBQ2pDO0FBRUEsYUFBUyxpQkFBaUIsU0FBUyxDQUFDLFVBQXNCO0FBQ3RELFlBQU0sZUFBZTtBQUdyQixZQUFNLGdCQUFnQjtBQUd0QixlQUFTLFdBQVc7QUFDcEIsWUFBTSxlQUFlLEtBQUssT0FBTztBQUNqQywyQkFBcUI7QUFBQSxRQUNqQixjQUFjO0FBQUEsUUFDZCxVQUFVO0FBQUEsTUFDZCxDQUFDO0FBQUEsSUFDTCxDQUFDO0FBRUQsT0FBRyxRQUFRLFFBQVE7QUFHbkIsT0FBRyxhQUFhLGFBQWEsS0FBSyxPQUFPLE9BQU8sS0FBSyxDQUFDO0FBQ3RELE9BQUcsYUFBYSxhQUFhLGNBQWMsVUFBVSxTQUFTLENBQUM7QUFDL0QsYUFBUyxhQUFhLGFBQWEsY0FBYyxVQUFVLFNBQVMsQ0FBQztBQUVyRSxTQUFJLG1CQUFjLGtCQUFkLG1CQUE2QixXQUFXO0FBQ3hDLGlCQUFXLEVBQUUsTUFBTSxTQUFTLFVBQVUsa0JBQWtCLGNBQWMsaUJBQWlCLENBQUM7QUFBQSxJQUM1RjtBQUVBLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFFQSxTQUFlLFdBQ1gsTUFDQSxlQUNBLGVBQ0EsY0FDNkI7QUFBQTtBQW5IakM7QUFvSEksUUFBSSxnQkFBc0MsQ0FBQztBQUMzQyxVQUFNLGNBQWEsbUJBQWMsZUFBZCxZQUE0QixJQUFJLFdBQVcsY0FBYyxhQUFhO0FBRXpGLGVBQVcsYUFBYSxXQUFXLGtCQUFrQjtBQUNqRCxVQUFJLGtCQUFrQixLQUFLLGtCQUFrQixZQUFZLFNBQVM7QUFDbEUsVUFBSSxpQkFBaUI7QUFDakIsWUFBSSxjQUFjO0FBQWUsNEJBQWtCLDJCQUEyQixlQUFlO0FBRTdGLGNBQU0sT0FBTyxTQUFTLGNBQWMsTUFBTTtBQUMxQyxzQkFBYyxZQUFZLElBQUk7QUFDOUIsWUFBSSxNQUFNO0FBS04sZ0JBQU0sZUFBZSxTQUFTLGNBQWMsTUFBTTtBQUNsRCxlQUFLLFlBQVksWUFBWTtBQUM3QixnQkFBTSxvQkFBb0IsY0FBYyxpQkFBaUIsV0FBVyxNQUFNLFlBQVk7QUFDdEYsZ0JBQU0sQ0FBQyxnQkFBZ0IsY0FBYyxJQUFJLDJCQUEyQixXQUFXLElBQUk7QUFDbkYsNkJBQW1CLFdBQVcsWUFBWTtBQUUxQyxlQUFLLFVBQVUsSUFBSSxHQUFHLGNBQWM7QUFFcEMscUJBQVcsT0FBTztBQUFnQixpQkFBSyxRQUFRLE9BQU8sZUFBZTtBQUNyRSwwQkFBZ0Isa0NBQUssZ0JBQWtCO0FBQUEsUUFDM0M7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUdBLGVBQVcsYUFBYSxXQUFXLGtCQUFrQjtBQUNqRCxZQUFNLENBQUMsR0FBRyxjQUFjLElBQUksMkJBQTJCLFdBQVcsSUFBSTtBQUN0RSxzQkFBZ0Isa0NBQUssZ0JBQWtCO0FBQUEsSUFDM0M7QUFFQSxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBS0EsU0FBZSxvQkFDWCxNQUNBLGlCQUNBLFdBQ0EsTUFDQSxjQUNGO0FBQUE7QUFDRSxRQUFJLGNBQWMsZUFBZTtBQUM3QixZQUFNLGFBQWEsaUJBQWlCLE1BQU0sS0FBSyxJQUFJO0FBS25ELFlBQU0sYUFBYSxLQUFLLGNBQWMsWUFBWTtBQUNsRCxZQUFNLHFCQUFxQixrQ0FBYztBQUd6QyxZQUFNLFdBQVcsbUJBQW1CLGNBQWMsR0FBRztBQUNyRCxVQUFJLGFBQWEsTUFBTTtBQUNuQixlQUFPLFNBQVMsWUFBWTtBQUN4Qiw2QkFBbUIsYUFBYSxTQUFTLFlBQVksUUFBUTtBQUFBLFFBQ2pFO0FBQ0EsaUJBQVMsT0FBTztBQUFBLE1BQ3BCO0FBR0EsV0FBSyxpQkFBaUIsR0FBRyxFQUFFLFFBQVEsQ0FBQ0MsY0FBYTtBQUM3QyxZQUFJLENBQUNBLFVBQVMsY0FBYyxHQUFHO0FBQzNCLFVBQUFBLFVBQVMsT0FBTztBQUFBLFFBQ3BCO0FBQUEsTUFDSixDQUFDO0FBR0QsV0FBSyxpQkFBaUIsWUFBWSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0I7QUFDN0Qsd0JBQWdCLE9BQU87QUFBQSxNQUMzQixDQUFDO0FBQUEsSUFDTCxPQUFPO0FBQ0gsV0FBSyxZQUFZO0FBQUEsSUFDckI7QUFBQSxFQUNKO0FBQUE7QUFhQSxTQUFTLDJCQUEyQixXQUFnQyxNQUE4QztBQUM5RyxRQUFNLGlCQUEyQixDQUFDO0FBQ2xDLFFBQU0saUJBQXVDLENBQUM7QUFDOUMsUUFBTSxtQkFBbUIsQ0FBQyxNQUFjLGtCQUEwQjtBQUM5RCxVQUFNLFlBQVksZ0JBQWdCLElBQUk7QUFDdEMsUUFBSTtBQUFXLHFCQUFlLGlCQUFpQjtBQUFBLEVBQ25EO0FBQ0EsVUFBUTtBQUFBLFNBQ0M7QUFDRCxxQkFBZSxLQUFLLGNBQWMsV0FBVztBQUM3QztBQUFBLFNBQ0MsWUFBWTtBQUNiLFVBQUksZ0JBQWdCO0FBQ3BCLFVBQUksS0FBSztBQUF1Qyx3QkFBZ0I7QUFBQSxlQUN2RCxLQUFLO0FBQXlDLHdCQUFnQjtBQUFBLGVBQzlELEtBQUs7QUFBc0Msd0JBQWdCO0FBQUE7QUFDL0Qsd0JBQWdCO0FBQ3JCLHFCQUFlLGtCQUFrQjtBQUNqQyxxQkFBZSxLQUFLLGNBQWMsUUFBUTtBQUMxQztBQUFBLElBQ0o7QUFBQSxTQUNLLFdBQVc7QUFDWixZQUFNLE9BQU8sS0FBSztBQUNsQixVQUFJLE1BQU07QUFDTix1QkFBZSxLQUFLLGNBQWMsT0FBTztBQUN6Qyx5QkFBaUIsTUFBTSxTQUFTO0FBQUEsTUFDcEM7QUFDQTtBQUFBLElBQ0o7QUFBQSxTQUNLLGFBQWE7QUFDZCxZQUFNLE9BQU8sS0FBSztBQUNsQixVQUFJLE1BQU07QUFDTix1QkFBZSxLQUFLLGNBQWMsU0FBUztBQUMzQyx5QkFBaUIsTUFBTSxXQUFXO0FBQUEsTUFDdEM7QUFDQTtBQUFBLElBQ0o7QUFBQSxTQUNLLGlCQUFpQjtBQUNsQixZQUFNLE9BQU8sS0FBSztBQUNsQixVQUFJLE1BQU07QUFDTix1QkFBZSxLQUFLLGNBQWMsYUFBYTtBQUMvQyx5QkFBaUIsTUFBTSxlQUFlO0FBQUEsTUFDMUM7QUFDQTtBQUFBLElBQ0o7QUFBQSxTQUNLLFlBQVk7QUFDYixZQUFNLE9BQU8sS0FBSztBQUNsQixVQUFJLE1BQU07QUFDTix1QkFBZSxLQUFLLGNBQWMsUUFBUTtBQUMxQyx5QkFBaUIsTUFBTSxVQUFVO0FBQUEsTUFDckM7QUFDQTtBQUFBLElBQ0o7QUFBQSxTQUNLLGtCQUFrQjtBQUNuQixxQkFBZSxLQUFLLGNBQWMsY0FBYztBQUNoRDtBQUFBLElBQ0o7QUFBQTtBQUVKLFNBQU8sQ0FBQyxnQkFBZ0IsY0FBYztBQUMxQztBQVNBLFNBQVMsbUJBQW1CLFdBQWdDLG1CQUFvQztBQUM1RixNQUFJLGNBQWMsZUFBZTtBQUM3QixVQUFNLE9BQU8sa0JBQWtCLHVCQUF1QixLQUFLO0FBQzNELGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDbEMsWUFBTSxVQUFVLEtBQUssR0FBRztBQUN4QixVQUFJLFNBQVM7QUFDVCxjQUFNLFlBQVksb0JBQW9CLE9BQU87QUFDN0MsY0FBTUQsV0FBVSxLQUFLO0FBQ3JCLFlBQUk7QUFBVyxVQUFBQSxTQUFRLFFBQVEsVUFBVTtBQUFBLE1BQzdDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDSjtBQVFBLFNBQVMsZ0JBQWdCLE1BQWM7QUFDbkMsUUFBTSxRQUFRLE9BQU8sT0FBTyxFQUFFLFFBQVEsS0FBSztBQUMzQyxNQUFJLFNBQVM7QUFDYixRQUFNLFdBQVcsTUFBTSxLQUFLLE1BQU0sTUFBTTtBQUN4QyxNQUFJLE1BQU0sUUFBUTtBQUFHLFdBQU87QUFDNUIsTUFBSSxhQUFhO0FBQUcsV0FBTztBQUFBLFdBQ2xCLFdBQVc7QUFBRyxjQUFVO0FBQUEsV0FDeEIsV0FBVztBQUFHLGNBQVU7QUFDakMsTUFBSSxLQUFLLElBQUksUUFBUSxLQUFLLHFCQUFxQjtBQUMzQyxjQUFVLEtBQUssSUFBSSxRQUFRLEVBQUUsU0FBUyxJQUFJO0FBQUEsRUFDOUMsT0FBTztBQUNILGNBQVU7QUFBQSxFQUNkO0FBQ0EsU0FBTztBQUNYO0FBTUEsU0FBUyxvQkFBb0IsS0FBYTtBQUV0QyxRQUFNLGVBQWU7QUFDckIsTUFBSSxlQUFlLElBQUksUUFBUSxjQUFjLEdBQUc7QUFFaEQsaUJBQWUsYUFBYSxRQUFRLFVBQVUsRUFBRTtBQUNoRCxNQUFJLGFBQWEsU0FBUztBQUFHLFdBQU87QUFBQTtBQUMvQixXQUFPO0FBQ2hCO0FBRUEsU0FBUyxXQUFXO0FBQUEsRUFDaEI7QUFBQSxFQUNBLFNBQUFBO0FBQUEsRUFDQTtBQUNKLEdBSVM7QUFDTCxFQUFBQSxTQUFRLGlCQUFpQixjQUFjLE1BQU07QUFDekMsVUFBTSxVQUFVQSxTQUFRLFVBQVU7QUFDbEMsWUFBUSxXQUFXLENBQUMsV0FBVyxXQUFXLENBQUM7QUFFM0MsUUFBSSxLQUFLLFlBQVk7QUFDakIsWUFBTSxnQkFBZ0IsUUFBUSxVQUFVO0FBQ3hDLG9CQUFjLFFBQVEsR0FBYyxvQkFBb0IsS0FBSyxXQUFXLE9BQU8sR0FBRztBQUFBLElBQ3RGO0FBRUEsUUFBSSxLQUFLLFdBQVc7QUFDaEIsWUFBTSxlQUFlLFFBQVEsVUFBVTtBQUN2QyxtQkFBYTtBQUFBLFFBQ1QsY0FBYztBQUFBLFVBQ1YsV0FBc0I7QUFBQSxVQUN0QixNQUFNLEtBQUs7QUFBQSxRQUNmLENBQUM7QUFBQSxNQUNMO0FBQUEsSUFDSjtBQUVBLFFBQUksS0FBSyxlQUFlO0FBQ3BCLFlBQU0sbUJBQW1CLFFBQVEsVUFBVTtBQUMzQyx1QkFBaUI7QUFBQSxRQUNiLGNBQWM7QUFBQSxVQUNWLFdBQXNCO0FBQUEsVUFDdEIsTUFBTSxLQUFLO0FBQUEsUUFDZixDQUFDO0FBQUEsTUFDTDtBQUFBLElBQ0o7QUFFQSxRQUFJLEtBQUssU0FBUztBQUNkLFlBQU0sYUFBYSxRQUFRLFVBQVU7QUFDckMsaUJBQVc7QUFBQSxRQUNQLGNBQWM7QUFBQSxVQUNWLFdBQXNCO0FBQUEsVUFDdEIsTUFBTSxLQUFLO0FBQUEsUUFDZixDQUFDO0FBQUEsTUFDTDtBQUFBLElBQ0o7QUFFQSxRQUFJLEtBQUssVUFBVTtBQUNmLFlBQU0sY0FBYyxRQUFRLFVBQVU7QUFDdEMsa0JBQVk7QUFBQSxRQUNSLGNBQWM7QUFBQSxVQUNWLFdBQXNCO0FBQUEsVUFDdEIsTUFBTSxLQUFLO0FBQUEsUUFDZixDQUFDO0FBQUEsTUFDTDtBQUFBLElBQ0o7QUFFQSxVQUFNLFdBQVcsS0FBSyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7QUFDdEQsUUFBSSxVQUFVO0FBQ1YsWUFBTSxjQUFjLFFBQVEsVUFBVTtBQUN0QyxrQkFBWSxRQUFRLGFBQU0sVUFBVTtBQUFBLElBQ3hDO0FBRUEsSUFBQUEsU0FBUSxpQkFBaUIsY0FBYyxNQUFNO0FBQ3pDLGNBQVEsT0FBTztBQUFBLElBQ25CLENBQUM7QUFBQSxFQUNMLENBQUM7QUFDTDtBQUVBLFNBQVMsY0FBYyxFQUFFLFdBQVcsS0FBSyxHQUFnRDtBQUNyRixTQUFPLEdBQUcsYUFBYSxLQUFLLE9BQWtCLHVCQUF1QixVQUFVLE1BQU0sS0FBSztBQUFBLElBQ3RGLE9BQU8sT0FBTyxFQUFFLFFBQVEsS0FBSztBQUFBLEVBQ2pDO0FBQ0o7QUFFQSxTQUFTLDJCQUEyQixhQUFxQjtBQUNyRCxRQUFNLEVBQUUsY0FBYyxtQkFBbUIsSUFBSSxZQUFZO0FBQ3pELE1BQUksb0JBQW9CO0FBQ3BCLFdBQU8sWUFBWSxRQUFRLGNBQWMsRUFBRSxFQUFFLEtBQUs7QUFBQSxFQUN0RDtBQUNBLFNBQU87QUFDWDs7O0FFbFpPLElBQU0sZUFBTixNQUFtQjtBQUFBLEVBT3RCLE9BQWMsU0FBUyxNQUE2QjtBQUNoRCxVQUFNLEVBQUUsNEJBQTRCLHNCQUFzQixJQUFJLFlBQVk7QUFFMUUsUUFBSSxDQUFDLDRCQUE0QjtBQUU3QixhQUFPO0FBQUEsSUFDWDtBQUVBLFFBQUksQ0FBQyxLQUFLLGlCQUFpQix1QkFBdUIsSUFBSSxHQUFHO0FBRXJELGFBQU87QUFBQSxJQUNYO0FBRUEsV0FBTyxLQUFLLG9CQUFvQixJQUFJO0FBQUEsRUFDeEM7QUFBQSxFQUVBLE9BQWUsaUJBQWlCLFNBQW1CLE1BQWM7QUFDN0QsUUFBSSxRQUFRLFdBQVcsR0FBRztBQUV0QixhQUFPO0FBQUEsSUFDWDtBQUlBLFdBQU8sUUFBUSxLQUFLLENBQUMsV0FBVyxLQUFLLFdBQVcsU0FBUyxHQUFHLENBQUM7QUFBQSxFQUNqRTtBQUFBLEVBRUEsT0FBZSxvQkFBb0IsTUFBNkI7QUFDNUQsVUFBTSxXQUFXLEtBQUssSUFBSSxHQUFHLEtBQUssWUFBWSxHQUFHLElBQUksQ0FBQztBQUN0RCxVQUFNLFVBQVUsS0FBSyxZQUFZLEdBQUc7QUFFcEMsVUFBTSxXQUFXLEtBQUssVUFBVSxVQUFVLE9BQU87QUFFakQsUUFBSSxZQUFZLDBCQUEwQixLQUFLLFFBQVE7QUFDdkQsUUFBSSxDQUFDO0FBQVcsa0JBQVksd0JBQXdCLEtBQUssUUFBUTtBQUVqRSxRQUFJLFdBQVc7QUFDWCxZQUFNLE9BQU8sT0FBTyxPQUFPLENBQUMsU0FBUyxVQUFVLEVBQUUsR0FBRyxTQUFTLFVBQVUsRUFBRSxJQUFJLEdBQUcsU0FBUyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZHLFVBQUksS0FBSyxRQUFRLEdBQUc7QUFDaEIsZUFBTztBQUFBLE1BQ1g7QUFBQSxJQUNKO0FBRUEsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUtBLE9BQWMsaUJBQWlCO0FBQUEsSUFDM0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0osR0FJWTtBQUNSLFdBQU8sY0FBYyxRQUFRLFlBQVksUUFBUSxrQkFBa0I7QUFBQSxFQUN2RTtBQUFBLEVBUUEsT0FBYyxlQUFlLE1BQVksU0FBaUIsY0FBbUM7QUFFekYsUUFBSSxnQkFBZ0IsS0FBSztBQUN6QixRQUFJLDBCQUEwQixLQUFLO0FBRW5DLFFBQUksaUJBQWlCLE1BQU07QUFHdkIsVUFBSSx5QkFBeUI7QUFFekIsa0NBQTBCO0FBQzFCLHdCQUFnQjtBQUFBLE1BQ3BCLE9BQU87QUFBQSxNQUdQO0FBQUEsSUFDSixPQUFPO0FBR0gsVUFBSSx5QkFBeUI7QUFHekIsd0JBQWdCO0FBQUEsTUFDcEIsV0FBVyxLQUFLLGlCQUFpQixJQUFJLEdBQUc7QUFHcEMsd0JBQWdCO0FBQ2hCLGtDQUEwQjtBQUFBLE1BQzlCLE9BQU87QUFBQSxNQUVQO0FBQUEsSUFDSjtBQUVBLFdBQU8sSUFBSSxLQUFLLGlDQUNULE9BRFM7QUFBQSxNQUVaLE1BQU07QUFBQSxNQUNOO0FBQUEsTUFDQTtBQUFBLElBQ0osRUFBQztBQUFBLEVBQ0w7QUFBQSxFQU1BLE9BQWMsNkJBQTZCLGNBQW9CLGNBQThCO0FBQ3pGLFVBQU0sd0JBQXdCLGFBQWEsMEJBQTBCLGFBQWEsZ0JBQWdCO0FBRWxHLFdBQU8sYUFBYSxJQUFJLENBQUMsU0FBZTtBQUNwQyxVQUFJLDBCQUEwQixRQUFRLENBQUMsc0JBQXNCLE9BQU8sS0FBSyxlQUFlLEtBQUssR0FBRztBQUc1RixlQUFPLElBQUksS0FBSyxpQ0FBSyxPQUFMLEVBQVcseUJBQXlCLE1BQU0sRUFBQztBQUFBLE1BQy9EO0FBRUEsYUFBTztBQUFBLElBQ1gsQ0FBQztBQUFBLEVBQ0w7QUFDSjs7O0FDdklPLFNBQVMsYUFBYSxHQUFXO0FBY3BDLFNBQU8sRUFBRSxRQUFRLDBCQUEwQixNQUFNO0FBQ3JEOzs7QUNTTyxJQUFNLGtCQUFrQjtBQUFBLEVBQzNCLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLEtBQUs7QUFBQSxFQUNMLE1BQU07QUFDVjtBQUVPLElBQU0sbUJBQW1CO0FBQ3pCLElBQU0sa0JBQWtCO0FBQ3hCLElBQU0sc0JBQXNCO0FBQzVCLElBQU0sZ0JBQWdCO0FBQ3RCLElBQU0saUJBQWlCO0FBRXZCLElBQU0sMEJBQU4sTUFBNkI7QUFrRXBDO0FBbEVPLElBQU0seUJBQU47QUFBTSx1QkFDYyxhQUFhO0FBRDNCLHVCQUljLG1CQUFtQjtBQUpqQyx1QkFPYyxrQkFBa0I7QUFQaEMsdUJBVWMsZ0JBQWdCO0FBVjlCLHVCQWFjLHFCQUFxQjtBQWJuQyx1QkFvQmMsWUFBWSxJQUFJO0FBQUEsRUFDbkMsd0JBQXVCLGlCQUFpQixTQUNwQyx3QkFBdUIsZ0JBQWdCLFNBQ3ZDLE9BQ0Esd0JBQXVCLGNBQWMsU0FDckMsd0JBQXVCLG1CQUFtQjtBQUFBLEVBQzlDO0FBQ0o7QUEzQlMsdUJBOEJjLGVBQWUsSUFBSTtBQUFBLEVBQ3RDLHdCQUF1QixpQkFBaUIsU0FDcEMsd0JBQXVCLGdCQUFnQixTQUN2QyxTQUNBLHdCQUF1QixjQUFjLFNBQ3JDLE9BQ0Esd0JBQXVCLG1CQUFtQjtBQUFBLEVBQzlDO0FBQ0o7QUF0Q1MsdUJBeUNjLGdCQUFnQixJQUFJO0FBQUEsRUFDdkMsd0JBQXVCLGlCQUFpQixTQUFTLHdCQUF1QixnQkFBZ0I7QUFDNUY7QUEzQ1MsdUJBOENjLGlCQUFpQjtBQTlDL0IsdUJBa0RjLGdCQUFnQjtBQWxEOUIsdUJBbURjLGlCQUFpQjtBQW5EL0IsdUJBb0RjLHFCQUFxQjtBQXBEbkMsdUJBcURjLGVBQWU7QUFyRDdCLHVCQXNEYyxnQkFBZ0I7QUF0RDlCLHVCQXVEYyxrQkFBa0I7QUF2RGhDLHVCQWdFYyxXQUFXO0FBaEV6Qix1QkFpRWMsa0JBQWtCLElBQUksT0FBTyx3QkFBSyxTQUFTLFNBQVMsR0FBRztBQVczRSxJQUFNLE9BQU4sTUFBVztBQUFBLEVBbUNkLFlBQVk7QUFBQSxJQUNSO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKLEdBbUJHO0FBeENILFNBQVEsV0FBMEI7QUF5QzlCLFNBQUssU0FBUztBQUNkLFNBQUssY0FBYztBQUNuQixTQUFLLE9BQU87QUFDWixTQUFLLGNBQWM7QUFDbkIsU0FBSyxhQUFhO0FBQ2xCLFNBQUssZUFBZTtBQUNwQixTQUFLLGVBQWU7QUFDcEIsU0FBSyxrQkFBa0I7QUFFdkIsU0FBSyxPQUFPO0FBRVosU0FBSyxXQUFXO0FBRWhCLFNBQUssWUFBWTtBQUNqQixTQUFLLGdCQUFnQjtBQUNyQixTQUFLLFVBQVU7QUFDZixTQUFLLFdBQVc7QUFFaEIsU0FBSyxhQUFhO0FBQ2xCLFNBQUssWUFBWTtBQUNqQixTQUFLLG1CQUFtQjtBQUV4QixTQUFLLDBCQUEwQjtBQUFBLEVBQ25DO0FBQUEsRUFlQSxPQUFjLFNBQVM7QUFBQSxJQUNuQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDSixHQU9nQjtBQUVaLFVBQU0sYUFBYSxLQUFLLE1BQU0sdUJBQXVCLFNBQVM7QUFDOUQsUUFBSSxlQUFlLE1BQU07QUFDckIsYUFBTztBQUFBLElBQ1g7QUFHQSxVQUFNLE9BQU8sV0FBVyxHQUFHLEtBQUs7QUFJaEMsVUFBTSxFQUFFLGFBQWEsSUFBSSxZQUFZO0FBQ3JDLFFBQUksQ0FBQyxLQUFLLFNBQVMsWUFBWSxHQUFHO0FBQzlCLGFBQU87QUFBQSxJQUNYO0FBRUEsUUFBSSxjQUFjO0FBQ2xCLFVBQU0sY0FBYyxXQUFXO0FBQy9CLFVBQU0sYUFBYSxXQUFXO0FBRzlCLFVBQU0sZUFBZSxXQUFXO0FBQ2hDLFVBQU0sU0FBUyxlQUFlLFlBQVksRUFBRSxpQkFBaUIsWUFBWTtBQUl6RSxVQUFNLGlCQUFpQixZQUFZLE1BQU0sdUJBQXVCLGNBQWM7QUFDOUUsVUFBTSxZQUFZLG1CQUFtQixPQUFPLGVBQWUsS0FBSztBQUVoRSxRQUFJLGNBQWMsSUFBSTtBQUNsQixvQkFBYyxZQUFZLFFBQVEsdUJBQXVCLGdCQUFnQixFQUFFLEVBQUUsS0FBSztBQUFBLElBQ3RGO0FBS0EsUUFBSTtBQUNKLFFBQUksV0FBcUI7QUFDekIsUUFBSSxZQUEyQjtBQUMvQixRQUFJLGdCQUErQjtBQUNuQyxRQUFJLDBCQUEwQjtBQUM5QixRQUFJLFVBQXlCO0FBQzdCLFFBQUksV0FBMEI7QUFDOUIsUUFBSSxpQkFBeUI7QUFDN0IsUUFBSSxhQUFnQztBQUNwQyxRQUFJLE9BQVksQ0FBQztBQUtqQixRQUFJLGVBQWU7QUFFbkIsVUFBTSxVQUFVO0FBQ2hCLFFBQUksT0FBTztBQUNYLE9BQUc7QUFDQyxnQkFBVTtBQUNWLFlBQU0sZ0JBQWdCLFlBQVksTUFBTSx1QkFBdUIsYUFBYTtBQUM1RSxVQUFJLGtCQUFrQixNQUFNO0FBQ3hCLGdCQUFRLGNBQWM7QUFBQSxlQUNiLGdCQUFnQjtBQUNqQix1QkFBVztBQUNYO0FBQUEsZUFDQyxnQkFBZ0I7QUFDakIsdUJBQVc7QUFDWDtBQUFBLGVBQ0MsZ0JBQWdCO0FBQ2pCLHVCQUFXO0FBQ1g7QUFBQTtBQUdSLHNCQUFjLFlBQVksUUFBUSx1QkFBdUIsZUFBZSxFQUFFLEVBQUUsS0FBSztBQUNqRixrQkFBVTtBQUFBLE1BQ2Q7QUFFQSxZQUFNLGdCQUFnQixZQUFZLE1BQU0sdUJBQXVCLGFBQWE7QUFDNUUsVUFBSSxrQkFBa0IsTUFBTTtBQUN4QixtQkFBVyxPQUFPLE9BQU8sY0FBYyxJQUFJLHVCQUF1QixVQUFVO0FBQzVFLHNCQUFjLFlBQVksUUFBUSx1QkFBdUIsZUFBZSxFQUFFLEVBQUUsS0FBSztBQUNqRixrQkFBVTtBQUFBLE1BQ2Q7QUFFQSxZQUFNLGVBQWUsWUFBWSxNQUFNLHVCQUF1QixZQUFZO0FBQzFFLFVBQUksaUJBQWlCLE1BQU07QUFDdkIsa0JBQVUsT0FBTyxPQUFPLGFBQWEsSUFBSSx1QkFBdUIsVUFBVTtBQUMxRSxzQkFBYyxZQUFZLFFBQVEsdUJBQXVCLGNBQWMsRUFBRSxFQUFFLEtBQUs7QUFDaEYsa0JBQVU7QUFBQSxNQUNkO0FBRUEsWUFBTSxxQkFBcUIsWUFBWSxNQUFNLHVCQUF1QixrQkFBa0I7QUFDdEYsVUFBSSx1QkFBdUIsTUFBTTtBQUM3Qix3QkFBZ0IsT0FBTyxPQUFPLG1CQUFtQixJQUFJLHVCQUF1QixVQUFVO0FBQ3RGLHNCQUFjLFlBQVksUUFBUSx1QkFBdUIsb0JBQW9CLEVBQUUsRUFBRSxLQUFLO0FBQ3RGLGtCQUFVO0FBQUEsTUFDZDtBQUVBLFlBQU0saUJBQWlCLFlBQVksTUFBTSx1QkFBdUIsY0FBYztBQUM5RSxVQUFJLG1CQUFtQixNQUFNO0FBQ3pCLG9CQUFZLE9BQU8sT0FBTyxlQUFlLElBQUksdUJBQXVCLFVBQVU7QUFDOUUsc0JBQWMsWUFBWSxRQUFRLHVCQUF1QixnQkFBZ0IsRUFBRSxFQUFFLEtBQUs7QUFDbEYsa0JBQVU7QUFBQSxNQUNkO0FBRUEsWUFBTSxrQkFBa0IsWUFBWSxNQUFNLHVCQUF1QixlQUFlO0FBQ2hGLFVBQUksb0JBQW9CLE1BQU07QUFJMUIseUJBQWlCLGdCQUFnQixHQUFHLEtBQUs7QUFDekMsc0JBQWMsWUFBWSxRQUFRLHVCQUF1QixpQkFBaUIsRUFBRSxFQUFFLEtBQUs7QUFDbkYsa0JBQVU7QUFBQSxNQUNkO0FBSUEsWUFBTSxZQUFZLFlBQVksTUFBTSx1QkFBdUIsZUFBZTtBQUMxRSxVQUFJLGFBQWEsTUFBTTtBQUNuQixzQkFBYyxZQUFZLFFBQVEsdUJBQXVCLGlCQUFpQixFQUFFLEVBQUUsS0FBSztBQUNuRixrQkFBVTtBQUNWLGNBQU0sVUFBVSxVQUFVLEdBQUcsS0FBSztBQUVsQyx1QkFBZSxhQUFhLFNBQVMsSUFBSSxDQUFDLFNBQVMsWUFBWSxFQUFFLEtBQUssR0FBRyxJQUFJO0FBQUEsTUFDakY7QUFFQTtBQUFBLElBQ0osU0FBUyxXQUFXLFFBQVE7QUFHNUIsUUFBSSxlQUFlLFNBQVMsR0FBRztBQUMzQixtQkFBYSxXQUFXLFNBQVM7QUFBQSxRQUM3QixvQkFBb0I7QUFBQSxRQUNwQjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDSixDQUFDO0FBQUEsSUFDTDtBQUdBLFFBQUksYUFBYSxpQkFBaUIsRUFBRSxXQUFXLGVBQWUsUUFBUSxDQUFDLEtBQUssaUJBQWlCLE1BQU07QUFDL0Ysc0JBQWdCO0FBQ2hCLGdDQUEwQjtBQUFBLElBQzlCO0FBTUEsUUFBSSxhQUFhLFNBQVM7QUFBRyxxQkFBZSxNQUFNO0FBTWxELFVBQU0sZUFBZSxZQUFZLE1BQU0sdUJBQXVCLFFBQVE7QUFDdEUsUUFBSSxpQkFBaUIsTUFBTTtBQUN2QixhQUFPLGFBQWEsT0FBTyxDQUFDLFFBQVEsUUFBUSxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7QUFBQSxJQUNyRjtBQUVBLFdBQU8sSUFBSSxLQUFLO0FBQUEsTUFDWjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0Esa0JBQWtCO0FBQUEsTUFDbEI7QUFBQSxJQUNKLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFNYSxLQUFLLGVBQThEO0FBQUE7QUFDNUUsYUFBTyxlQUFlLE1BQU0sYUFBYTtBQUFBLElBQzdDO0FBQUE7QUFBQSxFQVFPLFNBQVMsZUFBdUM7QUFDbkQsVUFBTSxhQUFhLElBQUksV0FBVyxhQUFhO0FBQy9DLFFBQUksYUFBYTtBQUNqQixlQUFXLGFBQWEsV0FBVyxrQkFBa0I7QUFDakQsb0JBQWMsS0FBSyxrQkFBa0IsWUFBWSxTQUFTO0FBQUEsSUFDOUQ7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBS08sa0JBQWtCLFFBQW9CLFdBQWdDO0FBamNqRjtBQWtjUSxZQUFRO0FBQUEsV0FDQztBQUNELGVBQU8sS0FBSztBQUFBLFdBQ1gsWUFBWTtBQUNiLFlBQUksV0FBbUI7QUFFdkIsWUFBSSxLQUFLLGFBQWEsZ0JBQWU7QUFDakMscUJBQVcsTUFBTSxnQkFBZ0I7QUFBQSxRQUNyQyxXQUFXLEtBQUssYUFBYSxrQkFBaUI7QUFDMUMscUJBQVcsTUFBTSxnQkFBZ0I7QUFBQSxRQUNyQyxXQUFXLEtBQUssYUFBYSxlQUFjO0FBQ3ZDLHFCQUFXLE1BQU0sZ0JBQWdCO0FBQUEsUUFDckM7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUFBLFdBQ0s7QUFDRCxZQUFJLENBQUMsS0FBSztBQUFXLGlCQUFPO0FBQzVCLGVBQU8sT0FBTyxRQUFRLFlBQ2hCLE1BQU0sa0JBQ04sSUFBSSxtQkFBbUIsS0FBSyxVQUFVLE9BQU8sdUJBQXVCLFVBQVU7QUFBQSxXQUNuRjtBQUNELFlBQUksQ0FBQyxLQUFLLGlCQUFpQixLQUFLO0FBQXlCLGlCQUFPO0FBQ2hFLGVBQU8sT0FBTyxRQUFRLFlBQ2hCLE1BQU0sc0JBQ04sSUFBSSx1QkFBdUIsS0FBSyxjQUFjLE9BQU8sdUJBQXVCLFVBQVU7QUFBQSxXQUMzRjtBQUNELFlBQUksQ0FBQyxLQUFLO0FBQVUsaUJBQU87QUFDM0IsZUFBTyxPQUFPLFFBQVEsWUFDaEIsTUFBTSxpQkFDTixJQUFJLGtCQUFrQixLQUFLLFNBQVMsT0FBTyx1QkFBdUIsVUFBVTtBQUFBLFdBQ2pGO0FBQ0QsWUFBSSxDQUFDLEtBQUs7QUFBUyxpQkFBTztBQUMxQixlQUFPLE9BQU8sUUFBUSxZQUNoQixNQUFNLGdCQUNOLElBQUksaUJBQWlCLEtBQUssUUFBUSxPQUFPLHVCQUF1QixVQUFVO0FBQUEsV0FDL0U7QUFDRCxZQUFJLENBQUMsS0FBSztBQUFZLGlCQUFPO0FBQzdCLGVBQU8sT0FBTyxRQUFRLFlBQ2hCLE1BQU0sbUJBQ04sSUFBSSxvQkFBb0IsS0FBSyxXQUFXLE9BQU87QUFBQSxXQUNwRDtBQUNELGdCQUFPLFVBQUssY0FBTCxZQUFrQjtBQUFBO0FBRXpCLGNBQU0sSUFBSSxNQUFNLG9EQUFvRCxZQUFZO0FBQUE7QUFBQSxFQUU1RjtBQUFBLEVBUU8sbUJBQTJCO0FBQzlCLFdBQU8sR0FBRyxLQUFLLGNBQWMsS0FBSyxlQUFlLEtBQUssT0FBTyxXQUFXLEtBQUssU0FBUztBQUFBLEVBQzFGO0FBQUEsRUFVTyxTQUFpQjtBQUNwQixVQUFNLFlBQVksZUFBZSxZQUFZLEVBQUUsc0JBQXNCLEtBQUssTUFBTTtBQUVoRixRQUFJLGNBQWM7QUFFbEIsUUFBSSxpQkFJTztBQUVYLFFBQUksVUFBVSxZQUFZLEdBQUc7QUFFekIsWUFBTSxFQUFFLFlBQVksSUFBSSxZQUFZO0FBQ3BDLFVBQUksYUFBYTtBQUNiLHNCQUFjLE9BQU8sT0FBTztBQUFBLE1BQ2hDO0FBR0EsVUFBSSxLQUFLLGVBQWUsTUFBTTtBQUMxQix5QkFBaUIsS0FBSyxXQUFXLEtBQUs7QUFBQSxNQUMxQztBQUFBLElBQ0o7QUFFQSxVQUFNLGNBQWMsSUFBSSxLQUFLLGlDQUN0QixPQURzQjtBQUFBLE1BRXpCLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxJQUNkLEVBQUM7QUFFRCxVQUFNLFdBQW1CLENBQUM7QUFFMUIsUUFBSSxtQkFBbUIsTUFBTTtBQUN6QixZQUFNLGFBQWEsZUFBZSxZQUFZLEVBQUUsc0JBQXNCLFNBQVM7QUFDL0UsWUFBTSxXQUFXLElBQUksS0FBSyxnREFDbkIsT0FDQSxpQkFGbUI7QUFBQSxRQUd0QixRQUFRO0FBQUEsUUFHUixXQUFXO0FBQUEsTUFDZixFQUFDO0FBQ0QsZUFBUyxLQUFLLFFBQVE7QUFBQSxJQUMxQjtBQUdBLGFBQVMsS0FBSyxXQUFXO0FBRXpCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxJQUFXLFVBQWtCO0FBQ3pCLFFBQUksS0FBSyxhQUFhLE1BQU07QUFDeEIsV0FBSyxXQUFXLFFBQVEsVUFBVSxJQUFJO0FBQUEsSUFDMUM7QUFFQSxXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBS0EsSUFBVyxXQUEwQjtBQUNqQyxVQUFNLGdCQUFnQixLQUFLLEtBQUssTUFBTSxjQUFjO0FBQ3BELFFBQUksa0JBQWtCLE1BQU07QUFDeEIsYUFBTyxjQUFjO0FBQUEsSUFDekIsT0FBTztBQUNILGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUFBLEVBU08sWUFBWSxFQUFFLGlCQUFpQixHQUE2RDtBQUMvRixRQUFJO0FBQ0osUUFBSSxrQkFBa0I7QUFDbEIsaUJBQVcsS0FBSztBQUFBLElBQ3BCLE9BQU87QUFFSCxpQkFBVyxNQUFNLEtBQUs7QUFBQSxJQUMxQjtBQUVBLFFBQUksYUFBYSxNQUFNO0FBQ25CLGFBQU87QUFBQSxJQUNYO0FBR0EsUUFBSSxLQUFLLG9CQUFvQixRQUFRLEtBQUssb0JBQW9CLFVBQVU7QUFDcEUsaUJBQVcsV0FBVyxRQUFRLEtBQUs7QUFBQSxJQUN2QztBQUVBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFlQSxPQUFPLG9CQUFvQixVQUFrQixVQUEyQjtBQUNwRSxRQUFJLFNBQVMsV0FBVyxTQUFTLFFBQVE7QUFDckMsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPLFNBQVMsTUFBTSxDQUFDLFNBQVMsVUFBVSxRQUFRLFlBQVksU0FBUyxNQUFNLENBQUM7QUFBQSxFQUNsRjtBQUFBLEVBYU8sWUFBWSxPQUFhO0FBUTVCLFFBQUksT0FBMEI7QUFBQSxNQUMxQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNKO0FBQ0EsZUFBVyxNQUFNLE1BQU07QUFDbkIsVUFBSSxLQUFLLFFBQVEsTUFBTTtBQUFLLGVBQU87QUFBQSxJQUN2QztBQUdBLFFBQUksS0FBSyxLQUFLLFdBQVcsTUFBTSxLQUFLLFFBQVE7QUFDeEMsYUFBTztBQUFBLElBQ1g7QUFFQSxRQUNJLENBQUMsS0FBSyxLQUFLLE1BQU0sU0FBVUUsVUFBUyxPQUFPO0FBQ3ZDLGFBQU9BLGFBQVksTUFBTSxLQUFLO0FBQUEsSUFDbEMsQ0FBQyxHQUNIO0FBQ0UsYUFBTztBQUFBLElBQ1g7QUFHQSxXQUFPLENBQUMsYUFBYSxpQkFBaUIsV0FBVyxVQUFVO0FBQzNELGVBQVcsTUFBTSxNQUFNO0FBQ25CLFlBQU0sUUFBUSxLQUFLO0FBQ25CLFlBQU0sUUFBUSxNQUFNO0FBQ3BCLFVBQUksY0FBYyxPQUFPLEtBQUssTUFBTSxHQUFHO0FBQ25DLGVBQU87QUFBQSxNQUNYO0FBQUEsSUFDSjtBQUVBLFVBQU0sY0FBYyxLQUFLO0FBQ3pCLFVBQU0sY0FBYyxNQUFNO0FBQzFCLFFBQUksZ0JBQWdCLFFBQVEsZ0JBQWdCLE1BQU07QUFDOUMsYUFBTztBQUFBLElBQ1gsV0FBVyxnQkFBZ0IsUUFBUSxnQkFBZ0IsTUFBTTtBQUNyRCxhQUFPO0FBQUEsSUFDWCxXQUFXLGVBQWUsZUFBZSxDQUFDLFlBQVksWUFBWSxXQUFXLEdBQUc7QUFDNUUsYUFBTztBQUFBLElBQ1g7QUFFQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBUU8sb0NBQW9DO0FBQ3ZDLFVBQU0sRUFBRSxhQUFhLElBQUksWUFBWTtBQUNyQyxRQUFJLGNBQWMsS0FBSztBQUN2QixRQUFJLGFBQWEsV0FBVztBQUFHLGFBQU87QUFFdEMsVUFBTSxvQkFBb0IsT0FBTyxZQUF3QixhQUFhLFlBQVksSUFBSSxXQUFXLElBQUk7QUFDckcsUUFBSSxLQUFLLFlBQVksT0FBTyxpQkFBaUIsSUFBSSxJQUFJO0FBQ2pELG9CQUFjLFlBQVksUUFBUSxtQkFBbUIsTUFBTSxFQUFFLFFBQVEsTUFBTSxHQUFHLEVBQUUsS0FBSztBQUFBLElBQ3pGO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDaHRCTyxJQUFNLE9BQU4sTUFBYztBQUFBLEVBT2pCLFlBQW9CLE9BQWdCO0FBQWhCO0FBTnBCLFNBQVEsU0FBd0I7QUFBQSxFQU1LO0FBQUEsRUFLckMsSUFBSSxRQUFXO0FBQ1gsUUFBSSxLQUFLLFdBQVcsUUFBVztBQUMzQixXQUFLLFNBQVMsS0FBSyxNQUFNO0FBQUEsSUFDN0I7QUFFQSxXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUNKOzs7QTdDTE8sSUFBTUMsU0FBTixNQUFZO0FBQUEsRUFzQmYsWUFBWSxFQUFFLGVBQUFDLGdCQUFlLE9BQUFDLFFBQU8sT0FBTyxHQUF3RTtBQUMvRyxTQUFLLGdCQUFnQkQ7QUFDckIsU0FBSywrQkFBK0IsQ0FBQztBQUNyQyxTQUFLLFFBQVFDO0FBQ2IsU0FBSyx1QkFBdUIsQ0FBQztBQUM3QixTQUFLLFNBQVM7QUFDZCxTQUFLLHdCQUF3QixDQUFDO0FBRTlCLFNBQUssYUFBYSxJQUFJLE1BQU07QUFDNUIsU0FBSyxRQUFRO0FBQ2IsU0FBSyxRQUFRLENBQUM7QUFFZCxTQUFLLDBCQUEwQjtBQUUvQixTQUFLLGlCQUFpQjtBQUN0QixTQUFLLGlCQUFpQjtBQUN0QixTQUFLLGtCQUFrQjtBQUV2QixTQUFLLFVBQVU7QUFBQSxFQUNuQjtBQUFBLEVBRU8sU0FBZTtBQUNsQixlQUFXLGtCQUFrQixLQUFLLDhCQUE4QjtBQUM1RCxXQUFLLGNBQWMsT0FBTyxjQUFjO0FBQUEsSUFDNUM7QUFFQSxlQUFXLGtCQUFrQixLQUFLLHNCQUFzQjtBQUNwRCxXQUFLLE1BQU0sT0FBTyxjQUFjO0FBQUEsSUFDcEM7QUFFQSxlQUFXLGtCQUFrQixLQUFLLHVCQUF1QjtBQUNyRCxXQUFLLE9BQU8sSUFBSSxjQUFjO0FBQUEsSUFDbEM7QUFBQSxFQUNKO0FBQUEsRUFFTyxXQUFtQjtBQUN0QixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBRU8sV0FBa0I7QUFDckIsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQUVRLG9CQUEwQjtBQUM5QixTQUFLLE9BQU8sbUJBQW1CO0FBQUEsTUFDM0IsT0FBTyxLQUFLO0FBQUEsTUFDWixPQUFPLEtBQUs7QUFBQSxJQUNoQixDQUFDO0FBQUEsRUFDTDtBQUFBLEVBRVEsbUJBQXlCO0FBQzdCLFVBQU0sMEJBQTBCLEtBQUssY0FBYyxHQUFHLFlBQVksTUFBWTtBQUcxRSxVQUFJLENBQUMsS0FBSyx5QkFBeUI7QUFDL0IsYUFBSywwQkFBMEI7QUFDL0IsYUFBSyxVQUFVO0FBQUEsTUFDbkI7QUFBQSxJQUNKLEVBQUM7QUFDRCxTQUFLLDZCQUE2QixLQUFLLHVCQUF1QjtBQUc5RCxVQUFNLHdCQUF3QixLQUFLLGNBQWMsR0FBRyxXQUFXLENBQUMsU0FBZ0I7QUFDNUUsV0FBSyxXQUFXLGFBQWEsTUFBTTtBQUMvQixhQUFLLFVBQVUsSUFBSTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNMLENBQUM7QUFDRCxTQUFLLDZCQUE2QixLQUFLLHFCQUFxQjtBQUFBLEVBQ2hFO0FBQUEsRUFFUSxtQkFBeUI7QUFDN0IsVUFBTSxFQUFFLDJCQUEyQixJQUFJLFlBQVk7QUFFbkQsVUFBTSx3QkFBd0IsS0FBSyxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQXdCO0FBQzNFLFVBQUksRUFBRSxnQkFBZ0IseUJBQVE7QUFDMUI7QUFBQSxNQUNKO0FBRUEsV0FBSyxXQUFXLGFBQWEsTUFBTTtBQUMvQixhQUFLLFVBQVUsSUFBSTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNMLENBQUM7QUFDRCxTQUFLLHFCQUFxQixLQUFLLHFCQUFxQjtBQUVwRCxVQUFNLHdCQUF3QixLQUFLLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBd0I7QUFDM0UsVUFBSSxFQUFFLGdCQUFnQix5QkFBUTtBQUMxQjtBQUFBLE1BQ0o7QUFFQSxXQUFLLFdBQVcsYUFBYSxNQUFNO0FBQy9CLGFBQUssUUFBUSxLQUFLLE1BQU0sT0FBTyxDQUFDLFNBQWU7QUFDM0MsaUJBQU8sS0FBSyxTQUFTLEtBQUs7QUFBQSxRQUM5QixDQUFDO0FBRUQsYUFBSyxrQkFBa0I7QUFBQSxNQUMzQixDQUFDO0FBQUEsSUFDTCxDQUFDO0FBQ0QsU0FBSyxxQkFBcUIsS0FBSyxxQkFBcUI7QUFFcEQsVUFBTSx3QkFBd0IsS0FBSyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQXFCLFlBQW9CO0FBQzVGLFVBQUksRUFBRSxnQkFBZ0IseUJBQVE7QUFDMUI7QUFBQSxNQUNKO0FBRUEsV0FBSyxXQUFXLGFBQWEsTUFBTTtBQUMvQixjQUFNLGVBQWUsSUFBSSxLQUFLLE1BQU0sYUFBYSxTQUFTLEtBQUssSUFBSSxDQUFDO0FBRXBFLGFBQUssUUFBUSxLQUFLLE1BQU0sSUFBSSxDQUFDLFNBQXFCO0FBQzlDLGNBQUksS0FBSyxTQUFTLFNBQVM7QUFDdkIsZ0JBQUksQ0FBQyw0QkFBNEI7QUFDN0IscUJBQU8sSUFBSSxLQUFLLGlDQUFLLE9BQUwsRUFBVyxNQUFNLEtBQUssS0FBSyxFQUFDO0FBQUEsWUFDaEQsT0FBTztBQUNILHFCQUFPLGFBQWEsZUFBZSxNQUFNLEtBQUssTUFBTSxhQUFhLEtBQUs7QUFBQSxZQUMxRTtBQUFBLFVBQ0osT0FBTztBQUNILG1CQUFPO0FBQUEsVUFDWDtBQUFBLFFBQ0osQ0FBQztBQUVELGFBQUssa0JBQWtCO0FBQUEsTUFDM0IsQ0FBQztBQUFBLElBQ0wsQ0FBQztBQUNELFNBQUsscUJBQXFCLEtBQUsscUJBQXFCO0FBQUEsRUFDeEQ7QUFBQSxFQUVRLG9CQUEwQjtBQUM5QixVQUFNLG1CQUFtQixLQUFLLE9BQU8scUJBQXFCLENBQUMsWUFBWTtBQUNuRSxjQUFRLEVBQUUsT0FBTyxLQUFLLE9BQU8sT0FBTyxLQUFLLE1BQU0sQ0FBQztBQUFBLElBQ3BELENBQUM7QUFDRCxTQUFLLHNCQUFzQixLQUFLLGdCQUFnQjtBQUFBLEVBQ3BEO0FBQUEsRUFFUSxZQUEyQjtBQUMvQixXQUFPLEtBQUssV0FBVyxhQUFhLE1BQVk7QUFDNUMsV0FBSyxRQUFRO0FBQ2IsWUFBTSxRQUFRO0FBQUEsUUFDVixLQUFLLE1BQU0saUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQWdCO0FBQy9DLGlCQUFPLEtBQUssVUFBVSxJQUFJO0FBQUEsUUFDOUIsQ0FBQztBQUFBLE1BQ0w7QUFDQSxXQUFLLFFBQVE7QUFFYixXQUFLLGtCQUFrQjtBQUFBLElBQzNCLEVBQUM7QUFBQSxFQUNMO0FBQUEsRUFFYyxVQUFVLE1BQTRCO0FBQUE7QUFDaEQsWUFBTSxZQUFZLEtBQUssY0FBYyxhQUFhLElBQUk7QUFDdEQsVUFBSSxjQUFjLFFBQVEsY0FBYyxRQUFXO0FBQy9DO0FBQUEsTUFDSjtBQUVBLFlBQU0sV0FBVyxLQUFLLE1BQU0sT0FBTyxDQUFDLFNBQWU7QUFDL0MsZUFBTyxLQUFLLFNBQVMsS0FBSztBQUFBLE1BQzlCLENBQUM7QUFFRCxZQUFNLFlBQVksVUFBVTtBQUk1QixVQUFJLFdBQW1CLENBQUM7QUFDeEIsVUFBSSxjQUFjLFFBQVc7QUFFekIsY0FBTSxjQUFjLE1BQU0sS0FBSyxNQUFNLFdBQVcsSUFBSTtBQUNwRCxtQkFBVyxLQUFLLHdCQUF3QixhQUFhLFdBQVcsV0FBVyxJQUFJO0FBQUEsTUFDbkY7QUFJQSxVQUFJLEtBQUssb0JBQW9CLFVBQVUsUUFBUSxHQUFHO0FBTTlDO0FBQUEsTUFDSjtBQUVBLFVBQUksS0FBSyxTQUFTLEtBQUssbUJBQVk7QUFDL0IsZ0JBQVE7QUFBQSxVQUNKLG9FQUFvRSxLQUFLO0FBQUEsUUFDN0U7QUFBQSxNQUNKO0FBSUEsV0FBSyxRQUFRLEtBQUssTUFBTSxPQUFPLENBQUMsU0FBZTtBQUMzQyxlQUFPLEtBQUssU0FBUyxLQUFLO0FBQUEsTUFDOUIsQ0FBQztBQUVELFdBQUssTUFBTSxLQUFLLEdBQUcsUUFBUTtBQUczQixXQUFLLGtCQUFrQjtBQUFBLElBQzNCO0FBQUE7QUFBQSxFQUVRLHdCQUNKLGFBQ0EsV0FDQSxXQUNBLE1BQ007QUFDTixVQUFNLFFBQWdCLENBQUM7QUFDdkIsVUFBTSxZQUFZLFlBQVksTUFBTSxJQUFJO0FBQ3hDLFVBQU0sY0FBYyxVQUFVO0FBSTlCLFVBQU0sbUJBQW1CLElBQUksS0FBSyxNQUFNLGFBQWEsU0FBUyxLQUFLLElBQUksQ0FBQztBQUt4RSxRQUFJLGlCQUFzQztBQUMxQyxRQUFJLGVBQWU7QUFDbkIsZUFBVyxZQUFZLFdBQVc7QUFDOUIsVUFBSSxTQUFTLFNBQVMsUUFBVztBQUM3QixjQUFNLGFBQWEsU0FBUyxTQUFTLE1BQU07QUFDM0MsWUFBSSxjQUFjLGFBQWE7QUFZM0Isa0JBQVE7QUFBQSxZQUNKLEdBQUcsS0FBSyx1Q0FBdUMsd0NBQXdDO0FBQUEsVUFDM0Y7QUFDQSxpQkFBTztBQUFBLFFBQ1g7QUFDQSxZQUFJLG1CQUFtQixRQUFRLGVBQWUsU0FBUyxJQUFJLE9BQU8sWUFBWTtBQUcxRSwyQkFBaUJGLE9BQU0sV0FBVyxZQUFZLFVBQVUsUUFBUTtBQUNoRSx5QkFBZTtBQUFBLFFBQ25CO0FBRUEsWUFBSSxtQkFBbUIsTUFBTTtBQUV6QjtBQUFBLFFBQ0o7QUFFQSxjQUFNLE9BQU8sVUFBVTtBQUN2QixZQUFJLFNBQVMsUUFBVztBQUNwQixrQkFBUSxJQUFJLEdBQUcsS0FBSyxjQUFjLHlDQUF5QztBQUMzRTtBQUFBLFFBQ0o7QUFFQSxZQUFJO0FBQ0osWUFBSTtBQUNBLGlCQUFPLEtBQUssU0FBUztBQUFBLFlBQ2pCO0FBQUEsWUFDQSxNQUFNLEtBQUs7QUFBQSxZQUNYLGNBQWMsZUFBZSxTQUFTLE1BQU07QUFBQSxZQUM1QztBQUFBLFlBQ0EsaUJBQWlCQSxPQUFNLG1CQUFtQixZQUFZLFVBQVUsUUFBUTtBQUFBLFlBQ3hFLGNBQWMsaUJBQWlCO0FBQUEsVUFDbkMsQ0FBQztBQUFBLFFBQ0wsU0FBUyxHQUFQO0FBQ0UsZUFBSyw2QkFBNkIsR0FBRyxNQUFNLFVBQVUsSUFBSTtBQUN6RDtBQUFBLFFBQ0o7QUFFQSxZQUFJLFNBQVMsTUFBTTtBQUNmO0FBQ0EsZ0JBQU0sS0FBSyxJQUFJO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUVBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFUSw2QkFBNkIsR0FBUSxNQUFhLFVBQXlCLE1BQWM7QUFDN0YsVUFBTSxNQUFNO0FBQUE7QUFBQSxTQUVYO0FBQUEsUUFDRCxLQUFLO0FBQUEsZUFDRSxTQUFTLFNBQVMsTUFBTTtBQUFBLGFBQzFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjTCxZQUFRLE1BQU0sR0FBRztBQUNqQixRQUFJLGFBQWEsT0FBTztBQUNwQixjQUFRLE1BQU0sRUFBRSxLQUFLO0FBQUEsSUFDekI7QUFDQSxRQUFJLEtBQUssVUFBVSxtQ0FBb0I7QUFDbkMsVUFBSSx3QkFBTyxLQUFLLEdBQUs7QUFBQSxJQUN6QjtBQUFBLEVBQ0o7QUFBQSxFQUVBLE9BQWUsV0FBVyxnQkFBd0IsVUFBMkQ7QUFDekcsUUFBSSxhQUFhLFFBQVc7QUFDeEIsYUFBTztBQUFBLElBQ1g7QUFFQSxlQUFXLFdBQVcsVUFBVTtBQUM1QixVQUFJLFFBQVEsU0FBUyxNQUFNLFFBQVEsa0JBQWtCLFFBQVEsU0FBUyxJQUFJLFFBQVEsZ0JBQWdCO0FBQzlGLGVBQU87QUFBQSxNQUNYO0FBQUEsSUFDSjtBQUVBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxPQUFlLG1CQUFtQixnQkFBd0IsVUFBcUQ7QUFDM0csUUFBSSxhQUFhLFFBQVc7QUFDeEIsYUFBTztBQUFBLElBQ1g7QUFFQSxRQUFJLGtCQUFpQztBQUVyQyxlQUFXLFdBQVcsVUFBVTtBQUM1QixVQUFJLFFBQVEsU0FBUyxNQUFNLE9BQU8sZ0JBQWdCO0FBQzlDLGVBQU87QUFBQSxNQUNYO0FBQ0Esd0JBQWtCLFFBQVE7QUFBQSxJQUM5QjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBOEN2WEEsSUFBQUcsbUJBQWdEOzs7QUNBaEQsSUFBQUMsbUJBQTJCOzs7QUNBM0IsU0FBUyxPQUFPO0FBQUU7QUFnQmxCLFNBQVMsSUFBSSxJQUFJO0FBQ2IsU0FBTyxHQUFHO0FBQ2Q7QUFDQSxTQUFTLGVBQWU7QUFDcEIsU0FBTyx1QkFBTyxPQUFPLElBQUk7QUFDN0I7QUFDQSxTQUFTLFFBQVEsS0FBSztBQUNsQixNQUFJLFFBQVEsR0FBRztBQUNuQjtBQUNBLFNBQVMsWUFBWSxPQUFPO0FBQ3hCLFNBQU8sT0FBTyxVQUFVO0FBQzVCO0FBQ0EsU0FBUyxlQUFlLEdBQUcsR0FBRztBQUMxQixTQUFPLEtBQUssSUFBSSxLQUFLLElBQUksTUFBTSxNQUFPLEtBQUssT0FBTyxNQUFNLFlBQWEsT0FBTyxNQUFNO0FBQ3RGO0FBWUEsU0FBUyxTQUFTLEtBQUs7QUFDbkIsU0FBTyxPQUFPLEtBQUssR0FBRyxFQUFFLFdBQVc7QUFDdkM7QUFvS0EsSUFBSSxlQUFlO0FBQ25CLFNBQVMsa0JBQWtCO0FBQ3ZCLGlCQUFlO0FBQ25CO0FBQ0EsU0FBUyxnQkFBZ0I7QUFDckIsaUJBQWU7QUFDbkI7QUE2RkEsU0FBUyxPQUFPLFFBQVEsTUFBTTtBQUMxQixTQUFPLFlBQVksSUFBSTtBQUMzQjtBQW1EQSxTQUFTLE9BQU8sUUFBUSxNQUFNLFFBQVE7QUFDbEMsU0FBTyxhQUFhLE1BQU0sVUFBVSxJQUFJO0FBQzVDO0FBU0EsU0FBUyxPQUFPLE1BQU07QUFDbEIsT0FBSyxXQUFXLFlBQVksSUFBSTtBQUNwQztBQUNBLFNBQVMsYUFBYSxZQUFZLFdBQVc7QUFDekMsV0FBUyxJQUFJLEdBQUcsSUFBSSxXQUFXLFFBQVEsS0FBSyxHQUFHO0FBQzNDLFFBQUksV0FBVztBQUNYLGlCQUFXLEdBQUcsRUFBRSxTQUFTO0FBQUEsRUFDakM7QUFDSjtBQUNBLFNBQVMsUUFBUSxNQUFNO0FBQ25CLFNBQU8sU0FBUyxjQUFjLElBQUk7QUFDdEM7QUFnQkEsU0FBUyxZQUFZLE1BQU07QUFDdkIsU0FBTyxTQUFTLGdCQUFnQiw4QkFBOEIsSUFBSTtBQUN0RTtBQUNBLFNBQVMsS0FBSyxNQUFNO0FBQ2hCLFNBQU8sU0FBUyxlQUFlLElBQUk7QUFDdkM7QUFDQSxTQUFTLFFBQVE7QUFDYixTQUFPLEtBQUssR0FBRztBQUNuQjtBQUlBLFNBQVMsT0FBTyxNQUFNLE9BQU8sU0FBUyxTQUFTO0FBQzNDLE9BQUssaUJBQWlCLE9BQU8sU0FBUyxPQUFPO0FBQzdDLFNBQU8sTUFBTSxLQUFLLG9CQUFvQixPQUFPLFNBQVMsT0FBTztBQUNqRTtBQUNBLFNBQVMsZ0JBQWdCLElBQUk7QUFDekIsU0FBTyxTQUFVLE9BQU87QUFDcEIsVUFBTSxlQUFlO0FBRXJCLFdBQU8sR0FBRyxLQUFLLE1BQU0sS0FBSztBQUFBLEVBQzlCO0FBQ0o7QUFzQkEsU0FBUyxLQUFLLE1BQU0sV0FBVyxPQUFPO0FBQ2xDLE1BQUksU0FBUztBQUNULFNBQUssZ0JBQWdCLFNBQVM7QUFBQSxXQUN6QixLQUFLLGFBQWEsU0FBUyxNQUFNO0FBQ3RDLFNBQUssYUFBYSxXQUFXLEtBQUs7QUFDMUM7QUEyREEsU0FBUyxTQUFTQyxVQUFTO0FBQ3ZCLFNBQU8sTUFBTSxLQUFLQSxTQUFRLFVBQVU7QUFDeEM7QUF1SEEsU0FBUyxTQUFTQyxPQUFNLE1BQU07QUFDMUIsU0FBTyxLQUFLO0FBQ1osTUFBSUEsTUFBSyxjQUFjO0FBQ25CLElBQUFBLE1BQUssT0FBTztBQUNwQjtBQUNBLFNBQVMsZ0JBQWdCLE9BQU8sT0FBTztBQUNuQyxRQUFNLFFBQVEsU0FBUyxPQUFPLEtBQUs7QUFDdkM7QUFpQkEsU0FBUyxjQUFjLFFBQVEsT0FBTztBQUNsQyxXQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUSxRQUFRLEtBQUssR0FBRztBQUMvQyxVQUFNLFNBQVMsT0FBTyxRQUFRO0FBQzlCLFFBQUksT0FBTyxZQUFZLE9BQU87QUFDMUIsYUFBTyxXQUFXO0FBQ2xCO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxTQUFPLGdCQUFnQjtBQUMzQjtBQU9BLFNBQVMsYUFBYSxRQUFRO0FBQzFCLFFBQU0sa0JBQWtCLE9BQU8sY0FBYyxVQUFVLEtBQUssT0FBTyxRQUFRO0FBQzNFLFNBQU8sbUJBQW1CLGdCQUFnQjtBQUM5QztBQXlEQSxTQUFTLGFBQWFDLFVBQVMsTUFBTSxRQUFRO0FBQ3pDLEVBQUFBLFNBQVEsVUFBVSxTQUFTLFFBQVEsVUFBVSxJQUFJO0FBQ3JEO0FBU0EsSUFBTSxVQUFOLE1BQWM7QUFBQSxFQUNWLFlBQVksU0FBUyxPQUFPO0FBQ3hCLFNBQUssU0FBUztBQUNkLFNBQUssU0FBUztBQUNkLFNBQUssSUFBSSxLQUFLLElBQUk7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsRUFBRSxNQUFNO0FBQ0osU0FBSyxFQUFFLElBQUk7QUFBQSxFQUNmO0FBQUEsRUFDQSxFQUFFLE1BQU0sUUFBUSxTQUFTLE1BQU07QUFDM0IsUUFBSSxDQUFDLEtBQUssR0FBRztBQUNULFVBQUksS0FBSztBQUNMLGFBQUssSUFBSSxZQUFZLE9BQU8sUUFBUTtBQUFBO0FBRXBDLGFBQUssSUFBSSxRQUFRLE9BQU8sUUFBUTtBQUNwQyxXQUFLLElBQUk7QUFDVCxXQUFLLEVBQUUsSUFBSTtBQUFBLElBQ2Y7QUFDQSxTQUFLLEVBQUUsTUFBTTtBQUFBLEVBQ2pCO0FBQUEsRUFDQSxFQUFFLE1BQU07QUFDSixTQUFLLEVBQUUsWUFBWTtBQUNuQixTQUFLLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRSxVQUFVO0FBQUEsRUFDekM7QUFBQSxFQUNBLEVBQUUsUUFBUTtBQUNOLGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLFFBQVEsS0FBSyxHQUFHO0FBQ3ZDLGFBQU8sS0FBSyxHQUFHLEtBQUssRUFBRSxJQUFJLE1BQU07QUFBQSxJQUNwQztBQUFBLEVBQ0o7QUFBQSxFQUNBLEVBQUUsTUFBTTtBQUNKLFNBQUssRUFBRTtBQUNQLFNBQUssRUFBRSxJQUFJO0FBQ1gsU0FBSyxFQUFFLEtBQUssQ0FBQztBQUFBLEVBQ2pCO0FBQUEsRUFDQSxJQUFJO0FBQ0EsU0FBSyxFQUFFLFFBQVEsTUFBTTtBQUFBLEVBQ3pCO0FBQ0o7QUEyS0EsSUFBSTtBQUNKLFNBQVMsc0JBQXNCLFdBQVc7QUFDdEMsc0JBQW9CO0FBQ3hCO0FBQ0EsU0FBUyx3QkFBd0I7QUFDN0IsTUFBSSxDQUFDO0FBQ0QsVUFBTSxJQUFJLE1BQU0sa0RBQWtEO0FBQ3RFLFNBQU87QUFDWDtBQUlBLFNBQVMsUUFBUSxJQUFJO0FBQ2pCLHdCQUFzQixFQUFFLEdBQUcsU0FBUyxLQUFLLEVBQUU7QUFDL0M7QUErQ0EsSUFBTSxtQkFBbUIsQ0FBQztBQUUxQixJQUFNLG9CQUFvQixDQUFDO0FBQzNCLElBQU0sbUJBQW1CLENBQUM7QUFDMUIsSUFBTSxrQkFBa0IsQ0FBQztBQUN6QixJQUFNLG1CQUFtQixRQUFRLFFBQVE7QUFDekMsSUFBSSxtQkFBbUI7QUFDdkIsU0FBUyxrQkFBa0I7QUFDdkIsTUFBSSxDQUFDLGtCQUFrQjtBQUNuQix1QkFBbUI7QUFDbkIscUJBQWlCLEtBQUssS0FBSztBQUFBLEVBQy9CO0FBQ0o7QUFLQSxTQUFTLG9CQUFvQixJQUFJO0FBQzdCLG1CQUFpQixLQUFLLEVBQUU7QUFDNUI7QUFzQkEsSUFBTSxpQkFBaUIsb0JBQUksSUFBSTtBQUMvQixJQUFJLFdBQVc7QUFDZixTQUFTLFFBQVE7QUFDYixRQUFNLGtCQUFrQjtBQUN4QixLQUFHO0FBR0MsV0FBTyxXQUFXLGlCQUFpQixRQUFRO0FBQ3ZDLFlBQU0sWUFBWSxpQkFBaUI7QUFDbkM7QUFDQSw0QkFBc0IsU0FBUztBQUMvQixhQUFPLFVBQVUsRUFBRTtBQUFBLElBQ3ZCO0FBQ0EsMEJBQXNCLElBQUk7QUFDMUIscUJBQWlCLFNBQVM7QUFDMUIsZUFBVztBQUNYLFdBQU8sa0JBQWtCO0FBQ3JCLHdCQUFrQixJQUFJLEVBQUU7QUFJNUIsYUFBUyxJQUFJLEdBQUcsSUFBSSxpQkFBaUIsUUFBUSxLQUFLLEdBQUc7QUFDakQsWUFBTSxXQUFXLGlCQUFpQjtBQUNsQyxVQUFJLENBQUMsZUFBZSxJQUFJLFFBQVEsR0FBRztBQUUvQix1QkFBZSxJQUFJLFFBQVE7QUFDM0IsaUJBQVM7QUFBQSxNQUNiO0FBQUEsSUFDSjtBQUNBLHFCQUFpQixTQUFTO0FBQUEsRUFDOUIsU0FBUyxpQkFBaUI7QUFDMUIsU0FBTyxnQkFBZ0IsUUFBUTtBQUMzQixvQkFBZ0IsSUFBSSxFQUFFO0FBQUEsRUFDMUI7QUFDQSxxQkFBbUI7QUFDbkIsaUJBQWUsTUFBTTtBQUNyQix3QkFBc0IsZUFBZTtBQUN6QztBQUNBLFNBQVMsT0FBTyxJQUFJO0FBQ2hCLE1BQUksR0FBRyxhQUFhLE1BQU07QUFDdEIsT0FBRyxPQUFPO0FBQ1YsWUFBUSxHQUFHLGFBQWE7QUFDeEIsVUFBTSxRQUFRLEdBQUc7QUFDakIsT0FBRyxRQUFRLENBQUMsRUFBRTtBQUNkLE9BQUcsWUFBWSxHQUFHLFNBQVMsRUFBRSxHQUFHLEtBQUssS0FBSztBQUMxQyxPQUFHLGFBQWEsUUFBUSxtQkFBbUI7QUFBQSxFQUMvQztBQUNKO0FBZUEsSUFBTSxXQUFXLG9CQUFJLElBQUk7QUFlekIsU0FBUyxjQUFjLE9BQU8sT0FBTztBQUNqQyxNQUFJLFNBQVMsTUFBTSxHQUFHO0FBQ2xCLGFBQVMsT0FBTyxLQUFLO0FBQ3JCLFVBQU0sRUFBRSxLQUFLO0FBQUEsRUFDakI7QUFDSjtBQXFVQSxJQUFNLFVBQVcsT0FBTyxXQUFXLGNBQzdCLFNBQ0EsT0FBTyxlQUFlLGNBQ2xCLGFBQ0E7QUE4VlYsU0FBUyxnQkFBZ0IsV0FBVyxRQUFRLFFBQVEsZUFBZTtBQUMvRCxRQUFNLEVBQUUsVUFBVSxVQUFVLFlBQVksYUFBYSxJQUFJLFVBQVU7QUFDbkUsY0FBWSxTQUFTLEVBQUUsUUFBUSxNQUFNO0FBQ3JDLE1BQUksQ0FBQyxlQUFlO0FBRWhCLHdCQUFvQixNQUFNO0FBQ3RCLFlBQU0saUJBQWlCLFNBQVMsSUFBSSxHQUFHLEVBQUUsT0FBTyxXQUFXO0FBQzNELFVBQUksWUFBWTtBQUNaLG1CQUFXLEtBQUssR0FBRyxjQUFjO0FBQUEsTUFDckMsT0FDSztBQUdELGdCQUFRLGNBQWM7QUFBQSxNQUMxQjtBQUNBLGdCQUFVLEdBQUcsV0FBVyxDQUFDO0FBQUEsSUFDN0IsQ0FBQztBQUFBLEVBQ0w7QUFDQSxlQUFhLFFBQVEsbUJBQW1CO0FBQzVDO0FBQ0EsU0FBUyxrQkFBa0IsV0FBVyxXQUFXO0FBQzdDLFFBQU0sS0FBSyxVQUFVO0FBQ3JCLE1BQUksR0FBRyxhQUFhLE1BQU07QUFDdEIsWUFBUSxHQUFHLFVBQVU7QUFDckIsT0FBRyxZQUFZLEdBQUcsU0FBUyxFQUFFLFNBQVM7QUFHdEMsT0FBRyxhQUFhLEdBQUcsV0FBVztBQUM5QixPQUFHLE1BQU0sQ0FBQztBQUFBLEVBQ2Q7QUFDSjtBQUNBLFNBQVMsV0FBVyxXQUFXLEdBQUc7QUFDOUIsTUFBSSxVQUFVLEdBQUcsTUFBTSxPQUFPLElBQUk7QUFDOUIscUJBQWlCLEtBQUssU0FBUztBQUMvQixvQkFBZ0I7QUFDaEIsY0FBVSxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQUEsRUFDN0I7QUFDQSxZQUFVLEdBQUcsTUFBTyxJQUFJLEtBQU0sTUFBTyxLQUFNLElBQUk7QUFDbkQ7QUFDQSxTQUFTLEtBQUssV0FBVyxTQUFTQyxXQUFVQyxrQkFBaUIsV0FBVyxPQUFPLGVBQWUsUUFBUSxDQUFDLEVBQUUsR0FBRztBQUN4RyxRQUFNLG1CQUFtQjtBQUN6Qix3QkFBc0IsU0FBUztBQUMvQixRQUFNLEtBQUssVUFBVSxLQUFLO0FBQUEsSUFDdEIsVUFBVTtBQUFBLElBQ1YsS0FBSztBQUFBLElBRUw7QUFBQSxJQUNBLFFBQVE7QUFBQSxJQUNSO0FBQUEsSUFDQSxPQUFPLGFBQWE7QUFBQSxJQUVwQixVQUFVLENBQUM7QUFBQSxJQUNYLFlBQVksQ0FBQztBQUFBLElBQ2IsZUFBZSxDQUFDO0FBQUEsSUFDaEIsZUFBZSxDQUFDO0FBQUEsSUFDaEIsY0FBYyxDQUFDO0FBQUEsSUFDZixTQUFTLElBQUksSUFBSSxRQUFRLFlBQVksbUJBQW1CLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxFQUFFO0FBQUEsSUFFekYsV0FBVyxhQUFhO0FBQUEsSUFDeEI7QUFBQSxJQUNBLFlBQVk7QUFBQSxJQUNaLE1BQU0sUUFBUSxVQUFVLGlCQUFpQixHQUFHO0FBQUEsRUFDaEQ7QUFDQSxtQkFBaUIsY0FBYyxHQUFHLElBQUk7QUFDdEMsTUFBSSxRQUFRO0FBQ1osS0FBRyxNQUFNRCxZQUNIQSxVQUFTLFdBQVcsUUFBUSxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxTQUFTO0FBQzVELFVBQU0sUUFBUSxLQUFLLFNBQVMsS0FBSyxLQUFLO0FBQ3RDLFFBQUksR0FBRyxPQUFPLFVBQVUsR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssS0FBSyxHQUFHO0FBQ25ELFVBQUksQ0FBQyxHQUFHLGNBQWMsR0FBRyxNQUFNO0FBQzNCLFdBQUcsTUFBTSxHQUFHLEtBQUs7QUFDckIsVUFBSTtBQUNBLG1CQUFXLFdBQVcsQ0FBQztBQUFBLElBQy9CO0FBQ0EsV0FBTztBQUFBLEVBQ1gsQ0FBQyxJQUNDLENBQUM7QUFDUCxLQUFHLE9BQU87QUFDVixVQUFRO0FBQ1IsVUFBUSxHQUFHLGFBQWE7QUFFeEIsS0FBRyxXQUFXQyxtQkFBa0JBLGlCQUFnQixHQUFHLEdBQUcsSUFBSTtBQUMxRCxNQUFJLFFBQVEsUUFBUTtBQUNoQixRQUFJLFFBQVEsU0FBUztBQUNqQixzQkFBZ0I7QUFDaEIsWUFBTSxRQUFRLFNBQVMsUUFBUSxNQUFNO0FBRXJDLFNBQUcsWUFBWSxHQUFHLFNBQVMsRUFBRSxLQUFLO0FBQ2xDLFlBQU0sUUFBUSxNQUFNO0FBQUEsSUFDeEIsT0FDSztBQUVELFNBQUcsWUFBWSxHQUFHLFNBQVMsRUFBRTtBQUFBLElBQ2pDO0FBQ0EsUUFBSSxRQUFRO0FBQ1Isb0JBQWMsVUFBVSxHQUFHLFFBQVE7QUFDdkMsb0JBQWdCLFdBQVcsUUFBUSxRQUFRLFFBQVEsUUFBUSxRQUFRLGFBQWE7QUFDaEYsa0JBQWM7QUFDZCxVQUFNO0FBQUEsRUFDVjtBQUNBLHdCQUFzQixnQkFBZ0I7QUFDMUM7QUFDQSxJQUFJO0FBQ0osSUFBSSxPQUFPLGdCQUFnQixZQUFZO0FBQ25DLGtCQUFnQixjQUFjLFlBQVk7QUFBQSxJQUN0QyxjQUFjO0FBQ1YsWUFBTTtBQUNOLFdBQUssYUFBYSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsSUFDdEM7QUFBQSxJQUNBLG9CQUFvQjtBQUNoQixZQUFNLEVBQUUsU0FBUyxJQUFJLEtBQUs7QUFDMUIsV0FBSyxHQUFHLGdCQUFnQixTQUFTLElBQUksR0FBRyxFQUFFLE9BQU8sV0FBVztBQUU1RCxpQkFBVyxPQUFPLEtBQUssR0FBRyxTQUFTO0FBRS9CLGFBQUssWUFBWSxLQUFLLEdBQUcsUUFBUSxJQUFJO0FBQUEsTUFDekM7QUFBQSxJQUNKO0FBQUEsSUFDQSx5QkFBeUJDLE9BQU0sV0FBVyxVQUFVO0FBQ2hELFdBQUtBLFNBQVE7QUFBQSxJQUNqQjtBQUFBLElBQ0EsdUJBQXVCO0FBQ25CLGNBQVEsS0FBSyxHQUFHLGFBQWE7QUFBQSxJQUNqQztBQUFBLElBQ0EsV0FBVztBQUNQLHdCQUFrQixNQUFNLENBQUM7QUFDekIsV0FBSyxXQUFXO0FBQUEsSUFDcEI7QUFBQSxJQUNBLElBQUksTUFBTSxVQUFVO0FBRWhCLFlBQU0sWUFBYSxLQUFLLEdBQUcsVUFBVSxVQUFVLEtBQUssR0FBRyxVQUFVLFFBQVEsQ0FBQztBQUMxRSxnQkFBVSxLQUFLLFFBQVE7QUFDdkIsYUFBTyxNQUFNO0FBQ1QsY0FBTSxRQUFRLFVBQVUsUUFBUSxRQUFRO0FBQ3hDLFlBQUksVUFBVTtBQUNWLG9CQUFVLE9BQU8sT0FBTyxDQUFDO0FBQUEsTUFDakM7QUFBQSxJQUNKO0FBQUEsSUFDQSxLQUFLLFNBQVM7QUFDVixVQUFJLEtBQUssU0FBUyxDQUFDLFNBQVMsT0FBTyxHQUFHO0FBQ2xDLGFBQUssR0FBRyxhQUFhO0FBQ3JCLGFBQUssTUFBTSxPQUFPO0FBQ2xCLGFBQUssR0FBRyxhQUFhO0FBQUEsTUFDekI7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNKO0FBSUEsSUFBTSxrQkFBTixNQUFzQjtBQUFBLEVBQ2xCLFdBQVc7QUFDUCxzQkFBa0IsTUFBTSxDQUFDO0FBQ3pCLFNBQUssV0FBVztBQUFBLEVBQ3BCO0FBQUEsRUFDQSxJQUFJLE1BQU0sVUFBVTtBQUNoQixVQUFNLFlBQWEsS0FBSyxHQUFHLFVBQVUsVUFBVSxLQUFLLEdBQUcsVUFBVSxRQUFRLENBQUM7QUFDMUUsY0FBVSxLQUFLLFFBQVE7QUFDdkIsV0FBTyxNQUFNO0FBQ1QsWUFBTSxRQUFRLFVBQVUsUUFBUSxRQUFRO0FBQ3hDLFVBQUksVUFBVTtBQUNWLGtCQUFVLE9BQU8sT0FBTyxDQUFDO0FBQUEsSUFDakM7QUFBQSxFQUNKO0FBQUEsRUFDQSxLQUFLLFNBQVM7QUFDVixRQUFJLEtBQUssU0FBUyxDQUFDLFNBQVMsT0FBTyxHQUFHO0FBQ2xDLFdBQUssR0FBRyxhQUFhO0FBQ3JCLFdBQUssTUFBTSxPQUFPO0FBQ2xCLFdBQUssR0FBRyxhQUFhO0FBQUEsSUFDekI7QUFBQSxFQUNKO0FBQ0o7OzthQzM3RDRCOzs7QUNFNUIsSUFBTSxnQkFBZ0I7QUFBQSxFQUNsQixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixTQUFTO0FBQUEsRUFDVCxJQUFJO0FBQ1I7QUFVTyxTQUFTLGVBQWUsTUFBc0I7QUFDakQsYUFBVyxDQUFDLEtBQUssR0FBRyxLQUFLLE9BQU8sUUFBUSxhQUFhLEdBQUc7QUFDcEQsV0FBTyxLQUFLLFFBQVEsT0FBTyxNQUFNLFVBQVUsR0FBRyxHQUFHLEdBQUc7QUFBQSxFQUN4RDtBQUNBLFNBQU87QUFDWDs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0JEa1RtQyxJQUFNLE1BQUE7Ozs7Ozs7O0FBQWIsYUFBb0IsUUFBQSxNQUFBLE1BQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUJBRk8sSUFBSyxNQUFBOzs7Z0JBQy9CLElBQU0sT0FBSSxJQUFNLElBQUMsV0FBVyxDQUFDLEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7dURBUHpCLElBQUssR0FBQTs7O3VEQUdSLElBQVMsR0FBQyxJQUFLLElBQUMsT0FBTyxDQUFDLEVBQUUsWUFBVyxDQUFBLENBQUE7Ozt5REFFOUIsSUFBSyxHQUFBOzs7QUFUL0IsYUFlTSxRQUFBLE9BQUEsTUFBQTtBQWJGLGFBTUMsT0FBQSxLQUFBO3dDQUZlLElBQVksR0FBQzs7QUFHN0IsYUFLTyxPQUFBLEtBQUE7QUFKSCxhQUEyQyxPQUFBLEtBQUE7Ozs7Ozs7Ozs7OzsrRUFIaENDLEtBQVMsR0FBQ0EsS0FBSyxJQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVcsQ0FBQSxJQUFBOzs7OzBDQURwQ0EsS0FBWSxHQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7aUJBaUdMLElBQU0sSUFBQyxPQUFJOzs7aUJBQUksSUFBTSxJQUFDLFNBQU07Ozs7Ozs7O2dCQUFoQixJQUFFOztnQkFBZSxHQUFDOzRDQUF2QyxJQUFNOzs7O0FBQXJCLGFBQThELFFBQUEsUUFBQSxNQUFBOzs7Ozs7O21EQUF0Q0EsS0FBTSxJQUFDLE9BQUk7QUFBQSxpQkFBQSxJQUFBLFFBQUE7bURBQUlBLEtBQU0sSUFBQyxTQUFNO0FBQUEsaUJBQUEsSUFBQSxRQUFBO3VFQUFyQ0EsS0FBTSxNQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7cUJBeEd0QixJQUFlOzttQ0FBcEIsUUFBSSxLQUFBLEdBQUE7OzttQkF1R0ssSUFBYTs7aUNBQWxCLFFBQUksS0FBQSxHQUFBOzs7Ozs7Ozs7Ozs7Ozs7Z0JBeEdvQyxVQUFROzs7Ozs7Ozs7Ozs7O2lCQXFDL0MsZ0JBQWdCOzs7Ozs7Ozs7O2lCQWNoQixhQUFhOzs7Ozs7Ozs7O2lCQWNiLG1CQUFtQjs7Ozs7Ozs7OztpQkFjbkIsZUFBZTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7eURBdkZQLElBQVMsR0FBQyxHQUFHLENBQUE7OzJEQVFOLElBQVksR0FBQyxRQUFROzs7Ozs7O3lEQW1DNUIsSUFBUyxHQUFDLEdBQUcsQ0FBQTs7Ozs7O2tDQWFYLGVBQWU7eURBQ2pCLElBQVMsR0FBQyxHQUFHLENBQUE7Ozs7OztrQ0FhWCxlQUFlO3lEQUNqQixJQUFTLEdBQUMsR0FBRyxDQUFBOzs7OztrQ0FhWCxlQUFlO3lEQUNqQixJQUFTLEdBQUMsR0FBRyxDQUFBOzs7Ozs7eURBZ0JULElBQVMsR0FBQyxHQUFHLENBQUE7Ozs7O1VBVVosSUFBWSxHQUFDLFdBQU07QUFBQSw0QkFBQSxNQUFBLElBQUEsSUFBQSxLQUFBLE1BQUEsQ0FBQTs7Ozs7OzhDQWlCdEIsSUFBWSxHQUFDLE9BQU8sWUFBVzs7Ozs7Ozs0Q0E5SVcsSUFBYyxFQUFBOzs7O0FBRHJGLGFBaUtLLFFBQUEsTUFBQSxNQUFBO0FBaEtELGFBK0pNLE1BQUEsSUFBQTtBQTNKRixhQVlLLE1BQUEsSUFBQTtBQVhELGFBQTBFLE1BQUEsTUFBQTs7QUFFMUUsYUFRQyxNQUFBLE1BQUE7OEJBUGUsSUFBWSxHQUFDLFdBQVc7OztBQWE1QyxhQW9CSyxNQUFBLElBQUE7QUFuQkQsYUFBNkQsTUFBQSxNQUFBOzs7Ozs7O0FBd0JqRSxhQXdFSyxNQUFBLElBQUE7QUFwRUQsYUFBNkQsTUFBQSxNQUFBOztBQUU3RCxhQU1DLE1BQUEsTUFBQTs4QkFMZSxJQUFZLEdBQUMsY0FBYzs7QUFNM0MsYUFBdUQsTUFBQSxLQUFBOzs7aUJBQXZCLElBQWdCLElBQUEsS0FBQTs7QUFLaEQsYUFBbUQsTUFBQSxNQUFBOztBQUVuRCxhQU1DLE1BQUEsTUFBQTs4QkFMZSxJQUFZLEdBQUMsT0FBTzs7QUFNcEMsYUFBaUQsTUFBQSxLQUFBOzs7bUJBQXBCLElBQWEsSUFBQSxLQUFBOztBQUsxQyxhQUErRCxNQUFBLE1BQUE7O0FBRS9ELGFBTUMsTUFBQSxNQUFBOzhCQUxlLElBQVksR0FBQyxhQUFhOztBQU0xQyxhQUE2RCxNQUFBLEtBQUE7OzttQkFBMUIsSUFBbUIsSUFBQSxLQUFBOztBQUt0RCxhQUE4RCxNQUFBLE1BQUE7O0FBRTlELGFBTUMsTUFBQSxNQUFBOzhCQUxlLElBQVksR0FBQyxTQUFTOztBQU10QyxhQUFxRCxNQUFBLEtBQUE7OzttQkFBdEIsSUFBZSxJQUFBLEtBQUE7O0FBSzlDLGFBV0ssTUFBQSxJQUFBO0FBVkQsYUFDNkQsTUFBQSxNQUFBOztBQUU3RCxhQU1DLE1BQUEsTUFBQTt1QkFMaUIsSUFBWSxHQUFDOztBQVl2QyxhQU9LLE1BQUEsSUFBQTtBQU5ELGFBQWtDLE1BQUEsTUFBQTs7QUFDbEMsYUFJUSxNQUFBLE1BQUE7Ozs7NEJBSlksSUFBWSxHQUFDLE1BQU07O0FBTzNDLGFBc0JLLE1BQUEsSUFBQTtBQWxCRCxhQVNLLE1BQUEsSUFBQTtBQVJELGFBQXFDLE1BQUEsTUFBQTs7QUFDckMsYUFNQyxNQUFBLE1BQUE7O0FBTUwsYUFHSyxNQUFBLElBQUE7QUFGRCxhQUFvQixNQUFBLEtBQUE7O0FBQ3BCLGFBQThCLE1BQUEsS0FBQTt3QkFBakIsSUFBVTs7QUFHL0IsYUFHSyxNQUFBLElBQUE7QUFGRCxhQUFtRCxNQUFBLE9BQUE7O0FBQ25ELGFBQXdELE1BQUEsT0FBQTs7OztnQ0F4SU0sSUFBZ0IsR0FBQTs7Ozs7OzttQ0F3STlDLElBQVEsR0FBQTtpREE3SmhCLElBQVMsR0FBQSxDQUFBOzs7Ozs7aUZBY2xCQSxLQUFTLEdBQUMsR0FBRyxJQUFBOzs7MkNBTlpBLEtBQVksR0FBQyxhQUFXO2dDQUF4QkEsS0FBWSxHQUFDLFdBQVc7O2lGQWNsQkEsS0FBWSxHQUFDLFdBQVE7Ozs7dUJBQ3BDQSxLQUFlOztxQ0FBcEIsUUFBSSxLQUFBLEdBQUE7Ozs7Ozs7Ozs7Ozs7NENBQUo7O2lGQWtDYUEsS0FBUyxHQUFDLEdBQUcsSUFBQTs7OzJDQUpaQSxLQUFZLEdBQUMsZ0JBQWM7Z0NBQTNCQSxLQUFZLEdBQUMsY0FBYzs7O21CQU1YQSxLQUFnQixFQUFBO2lGQVlqQ0EsS0FBUyxHQUFDLEdBQUcsSUFBQTs7OzJDQUpaQSxLQUFZLEdBQUMsU0FBTztnQ0FBcEJBLEtBQVksR0FBQyxPQUFPOzs7cUJBTVBBLEtBQWEsRUFBQTtpRkFZM0JBLEtBQVMsR0FBQyxHQUFHLElBQUE7OzsyQ0FKWkEsS0FBWSxHQUFDLGVBQWE7Z0NBQTFCQSxLQUFZLEdBQUMsYUFBYTs7O3FCQU1QQSxLQUFtQixFQUFBO2lGQVl2Q0EsS0FBUyxHQUFDLEdBQUcsSUFBQTs7OzJDQUpaQSxLQUFZLEdBQUMsV0FBUztnQ0FBdEJBLEtBQVksR0FBQyxTQUFTOzs7cUJBTVBBLEtBQWUsRUFBQTtpRkFjM0JBLEtBQVMsR0FBQyxHQUFHLElBQUE7Ozs7eUJBSlZBLEtBQVksR0FBQzs7O3FCQWV4QkEsS0FBYTs7bUNBQWxCLFFBQUksS0FBQSxHQUFBOzs7Ozs7Ozs7Ozs7O3dDQUFKOzs7OEJBRGNBLEtBQVksR0FBQyxNQUFNOzsyRUFpQnRCQSxLQUFZLEdBQUMsT0FBTyxZQUFXLElBQUE7Ozs7MEJBVS9CQSxLQUFVO0FBQUE7OzhDQXhKZ0NBLEtBQWMsRUFBQTs7Ozs7Ozs7Ozs7Ozs7OztJQW5QN0Usa0JBQ0E7OztNQXREUyxJQUFBO1FBaUJGLEtBQVUsSUFBQTtRQUNWLFNBQXdELElBQUE7UUFDeEQsY0FBdUIsSUFBQTtNQUU5QjtNQUNBLGVBQVk7SUFXWixhQUFhO0lBQ2IsUUFBUSxPQUFPO0lBQ2YsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsZUFBZTtJQUNmLFNBQVM7SUFDVCxVQUFVO0lBQ1YsYUFBYTs7TUFHYixrQkFBMEI7TUFDMUIsc0JBQThCO01BQzlCLGdCQUF3QjtNQUN4QixtQkFBMkI7TUFDM0IsYUFBcUI7TUFDckIsd0JBQWlDO01BQ2pDLGlCQUEwQjtRQU14QixrQkFBZTs7TUFLYixPQUFPO01BQ1AsT0FBTztNQUNQLFFBQVEsZ0JBQWdCOzs7TUFFeEIsT0FBTztNQUNQLE9BQU87TUFDUCxRQUFRLGdCQUFnQjs7O01BRXhCLE9BQU87TUFDUCxPQUFPO01BQ1AsUUFBUSxnQkFBZ0I7OztNQUV4QixPQUFPO01BQ1AsT0FBTztNQUNQLFFBQVEsZ0JBQWdCOzs7V0F5QnZCLHlCQUNMLFdBQ0EsV0FDQSxjQUFnQyxRQUFTO1NBRXBDLFdBQVM7c0JBQ007O1VBRWQsU0FBZ0IsaUJBQVUsV0FBVyxhQUFXLEVBQ2xELGFBQWEsZUFBZSxPQUFTLENBQUE7UUFFckMsV0FBVyxNQUFJO2FBQ1IsT0FBTyxPQUFPLE1BQU0sRUFBRSxPQUFPLFlBQVk7O3lCQUUvQjs7V0FRaEIsd0NBQXdDLFdBQW1ELFdBQWlCO1dBQzFHLHlCQUNILFdBQ0EsV0FDQSxhQUFhLGNBQVcsSUFBTyxLQUFJLElBQUssTUFBUzs7V0FRaEQsd0JBQXdCLFdBQWlCO1FBQzFDLE9BQTZCO1VBQzNCLGFBQW9CLGlCQUN0QixXQUFTLElBQ0wsS0FBSSxHQUFBLEVBQ04sYUFBYSxhQUFhLFlBQVcsQ0FBQTtRQUV2QyxlQUFlLE1BQUk7QUFDbkIsYUFBTyxPQUFPLE9BQU8sVUFBVTs7V0FFNUI7O0FBdUNYLFVBQU8sTUFBQTtZQUNLLGNBQWMsa0JBQWlCLElBQUssWUFBVztvQkFDdkQsaUJBQWlCLGlCQUFpQjtVQUM1QixjQUFjLEtBQUssa0NBQWlDO1FBTXRELGVBQWUsS0FBSyxlQUFlLFlBQVksUUFBUSxZQUFZLEtBQUE7QUFDbkUsOEJBQXdCO1FBQ3hCLFdBQXlDO1FBQ3pDLEtBQUssNEJBQXlCO0FBQzlCLGlCQUFXO2VBQ0osS0FBSywrQkFBNEI7QUFDeEMsaUJBQVc7ZUFDSixLQUFLLDZCQUEwQjtBQUN0QyxpQkFBVzs7b0JBR2YsZUFBWTtNQUNSO01BQ0EsUUFBUSxLQUFLO01BQ2I7TUFDQSxnQkFBZ0IsS0FBSyxhQUFhLEtBQUssV0FBVyxPQUFNLElBQUs7TUFDN0QsV0FBVyxLQUFLLFlBQ1YsS0FBSyxVQUFVLE9BQU8sWUFBWSxJQUNsQztNQUNOLGVBQWUsS0FBSyxnQkFDZCxLQUFLLGNBQWMsT0FBTyxZQUFZLElBQ3RDO01BQ04sU0FBUyxLQUFLLFVBQVUsS0FBSyxRQUFRLE9BQU8sWUFBWSxJQUFJO01BQzVELFVBQVUsS0FBSyxXQUFXLEtBQUssU0FBUyxPQUFPLFlBQVksSUFBSTtNQUMvRCxhQUFhOztBQUVqQjs7QUFDSSx5QkFBaUIsTUFBSzs7TUFDdkI7OztRQUdELG1CQUFvQixXQUFvQjtRQUN0QyxNQUFNLE9BQUcsQ0FBSyxNQUFNLFVBQU0sQ0FBSyxNQUFNLFNBQU87WUFDdEMsaUJBQWlCLGdCQUFnQixLQUNuQyxZQUFVLE9BQU8sTUFBTSxPQUFPLENBQUMsRUFBRSxZQUFXLEtBQU0sTUFBTSxHQUFHO1VBQzNELGdCQUFjO3dCQUNkLGFBQWEsV0FBVyxlQUFlLE9BQUssWUFBQTs7OztRQUtsRCxXQUFRLE1BQUE7QUFDVixhQUFRLENBQUEsQ0FBQTs7UUFHTixZQUFTLE1BQUE7WUFDSCxhQUFZLElBQUssWUFBVztRQUNoQyxjQUFjLGFBQWEsWUFBWSxLQUFJO1FBQzNDLHVCQUFxQjtBQUNyQixvQkFBYyxlQUFlLE1BQU07O1VBR2pDLFlBQVksd0JBQXdCLGFBQWEsU0FBUztVQUUxRCxnQkFBZ0Isd0JBQXdCLGFBQWEsYUFBYTtVQUVsRSxVQUFVLHdCQUF3QixhQUFhLE9BQU87UUFFeEQsYUFBZ0M7UUFDaEMsYUFBYSxnQkFBYztBQUMzQixtQkFBYSxXQUFXLFNBQVE7UUFDNUIsb0JBQW9CLGFBQWE7UUFDakM7UUFDQTtRQUNBOzs7UUFJSjtZQUNJLGFBQWE7V0FDWjtBQUNEOztXQUVDO0FBQ0Q7O1dBRUM7QUFDRDs7O0FBR0E7O1VBR0YsY0FBVyxJQUFPLEtBQUksT0FBQSxPQUFBLE9BQUEsT0FBQSxDQUFBLEdBQ3JCLElBQUksR0FBQTtNQUNQO01BQ0EsUUFBUSxhQUFhO01BQ3JCLFVBQVU7TUFDVjtNQUNBO01BQ0E7TUFDQTtNQUNBLFVBQVUsT0FDTCxPQUFPLGFBQWEsVUFBVSxZQUFZLEVBQzFDLFFBQU8sSUFDTixPQUFPLE9BQU8sYUFBYSxVQUFVLFlBQVksSUFDakQ7O0FBR1YsYUFBUSxDQUFFLFdBQVcsQ0FBQTs7OztBQWFELGlCQUFhLGNBQVcsS0FBQTs7Ozs7O0FBQ3pCLHlCQUFnQjs7Ozs7QUFxQlAsaUJBQWEsV0FBUSxLQUFBOzs7OztBQXVCN0IsaUJBQWEsaUJBQWMsS0FBQTs7Ozs7QUFjM0IsaUJBQWEsVUFBTyxLQUFBOzs7OztBQWNwQixpQkFBYSxnQkFBYSxLQUFBOzs7OztBQWMxQixpQkFBYSxZQUFTLEtBQUE7Ozs7O0FBZ0JoQixpQkFBYSxjQUFXLEtBQUE7Ozs7O0FBYzFCLGlCQUFhLFNBQU0sYUFBQSxJQUFBOzs7Ozs7Ozs7Ozs7OztBQWxSL0M7QUFBQyxxQkFBQSxHQUFFLFlBQWEsU0FBZ0IsaUJBQWlCLE1BQU0sSUFBSTs7O0FBRTNELFNBQUM7d0JBQ0csYUFBYSxZQUFZLGVBQWUsYUFBYSxTQUFTLEdBQUEsWUFBQTt3QkFDOUQsa0JBQWtCLHdDQUF3QyxTQUFTLGFBQWEsU0FBUyxDQUFBOzs7O0FBRzdGLFNBQUM7d0JBQ0csYUFBYSxnQkFBZ0IsZUFBZSxhQUFhLGFBQWEsR0FBQSxZQUFBO3dCQUN0RSxzQkFBc0Isd0NBQXdDLGFBQWEsYUFBYSxhQUFhLENBQUE7Ozs7QUFHekcsU0FBQzt3QkFDRyxhQUFhLFVBQVUsZUFBZSxhQUFhLE9BQU8sR0FBQSxZQUFBO3dCQUMxRCxnQkFBZ0Isd0NBQXdDLE9BQU8sYUFBYSxPQUFPLENBQUE7Ozs7QUFHdkYsU0FBQzthQUNRLGFBQWEsZ0JBQWM7MEJBQzVCLG1CQUFtQixxQkFBcUI7OzBCQUV4QyxtQkFBZ0IsYUFBQSxJQUNaLEtBQUEsYUFBQSxJQUFBLEtBQUEsV0FBVyxTQUFRO1lBQ2Ysb0JBQW9CLGFBQWE7WUFFakMsV0FBVztZQUNYLGVBQWU7WUFDZixTQUFTO2tCQUNYLFFBQUEsT0FBQSxrQkFBQSxHQUFFLE9BQU0sQ0FBQSxNQUFFLFFBQUEsT0FBQSxTQUFBLEtBQUksZ0NBQWdDOzs7OztBQUk1RCxTQUFDO3dCQUNHLGFBQWEseUJBQXlCLFFBQVEsYUFBYSxRQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FGOUtwRSxJQUFNLFlBQU4sY0FBd0IsdUJBQU07QUFBQSxFQUlqQyxZQUFZLEVBQUUsS0FBSyxNQUFNLFNBQVMsR0FBdUU7QUFDckcsVUFBTSxHQUFHO0FBRVQsU0FBSyxPQUFPO0FBQ1osU0FBSyxXQUFXLENBQUMsaUJBQXlCO0FBQ3RDLG1CQUFhLFVBQVUsU0FBUyxZQUFZO0FBQzVDLFdBQUssTUFBTTtBQUFBLElBQ2Y7QUFBQSxFQUNKO0FBQUEsRUFFTyxTQUFlO0FBQ2xCLFNBQUssUUFBUSxRQUFRLHFCQUFxQjtBQUMxQyxVQUFNLEVBQUUsVUFBVSxJQUFJO0FBRXRCLFVBQU0sZ0JBQWdCLEtBQUssK0NBQStDO0FBRTFFLFFBQUksaUJBQVM7QUFBQSxNQUNULFFBQVE7QUFBQSxNQUNSLE9BQU8sRUFBRSxNQUFNLEtBQUssTUFBTSxlQUE4QixVQUFVLEtBQUssU0FBUztBQUFBLElBQ3BGLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFRUSxpREFBaUQ7QUFDckQsVUFBTSxnQkFBMEIsZUFBZSxZQUFZLEVBQUU7QUFDN0QsUUFBSSxlQUFlLFlBQVksRUFBRSxTQUFTLEtBQUssS0FBSyxPQUFPLE1BQU0sTUFBTSxPQUFPLE9BQU87QUFDakYsb0JBQWMsS0FBSyxLQUFLLEtBQUssTUFBTTtBQUFBLElBQ3ZDO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVPLFVBQWdCO0FBQ25CLFVBQU0sRUFBRSxVQUFVLElBQUk7QUFDdEIsY0FBVSxNQUFNO0FBQUEsRUFDcEI7QUFDSjs7O0FJaENPLElBQU0sZUFBZSxDQUFDLEVBQUUsTUFBTSxLQUFLLE1BQTRDO0FBbEJ0RjtBQW1CSSxRQUFNLGVBQWUsYUFBYSxTQUFTLElBQUk7QUFFL0MsUUFBTSxPQUFPLEtBQUssU0FBUztBQUFBLElBQ3ZCO0FBQUEsSUFDQTtBQUFBLElBQ0EsY0FBYztBQUFBLElBQ2QsY0FBYztBQUFBLElBQ2QsaUJBQWlCO0FBQUEsSUFDakI7QUFBQSxFQUNKLENBQUM7QUFFRCxNQUFJLFNBQVMsTUFBTTtBQUNmLFdBQU87QUFBQSxFQUNYO0FBSUEsUUFBTSxlQUFlLEtBQUssTUFBTSx1QkFBdUIsWUFBWTtBQUNuRSxNQUFJLGlCQUFpQixNQUFNO0FBRXZCLFlBQVEsTUFBTSxzQ0FBc0MsSUFBSTtBQUN4RCxXQUFPLElBQUksS0FBSztBQUFBLE1BQ1osUUFBUSxPQUFPO0FBQUEsTUFDZixhQUFhO0FBQUEsTUFDYjtBQUFBLE1BQ0EsYUFBYTtBQUFBLE1BQ2IsWUFBWTtBQUFBLE1BQ1o7QUFBQSxNQUNBLFdBQVc7QUFBQSxNQUNYLGVBQWU7QUFBQSxNQUNmLFNBQVM7QUFBQSxNQUNULFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUVaLGNBQWM7QUFBQSxNQUNkLGNBQWM7QUFBQSxNQUNkLGlCQUFpQjtBQUFBLE1BQ2pCLFdBQVc7QUFBQSxNQUNYLE1BQU0sQ0FBQztBQUFBLE1BQ1Asa0JBQWtCO0FBQUEsTUFDbEIseUJBQXlCO0FBQUEsSUFDN0IsQ0FBQztBQUFBLEVBQ0w7QUFFQSxRQUFNLGNBQXNCLGFBQWE7QUFDekMsUUFBTSxjQUFhLGtCQUFhLE9BQWIsWUFBbUI7QUFDdEMsUUFBTSxnQkFBdUIsa0JBQWEsT0FBYixZQUFtQjtBQUNoRCxRQUFNLFNBQVMsZUFBZSxZQUFZLEVBQUUsaUJBQWlCLFlBQVk7QUFFekUsTUFBSSxjQUFzQixhQUFhO0FBRXZDLFFBQU0saUJBQWlCLEtBQUssTUFBTSx1QkFBdUIsY0FBYztBQUN2RSxRQUFNLFlBQVksbUJBQW1CLE9BQU8sZUFBZSxLQUFLO0FBRWhFLE1BQUksY0FBYyxJQUFJO0FBQ2xCLGtCQUFjLFlBQVksUUFBUSx1QkFBdUIsZ0JBQWdCLEVBQUU7QUFBQSxFQUMvRTtBQUVBLFNBQU8sSUFBSSxLQUFLO0FBQUEsSUFDWjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gsZUFBZTtBQUFBLElBQ2YsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsWUFBWTtBQUFBLElBRVosY0FBYztBQUFBLElBQ2QsY0FBYztBQUFBLElBQ2QsaUJBQWlCO0FBQUEsSUFDakIsTUFBTSxDQUFDO0FBQUEsSUFDUCxrQkFBa0I7QUFBQSxJQUVsQix5QkFBeUI7QUFBQSxFQUM3QixDQUFDO0FBQ0w7OztBTDdGTyxJQUFNLGVBQWUsQ0FBQyxVQUFtQixRQUFnQixNQUFZLFFBQWE7QUFOekY7QUFPSSxNQUFJLFVBQVU7QUFDVixXQUFPLGdCQUFnQjtBQUFBLEVBQzNCO0FBRUEsTUFBSSxFQUFFLGdCQUFnQixnQ0FBZTtBQUVqQztBQUFBLEVBQ0o7QUFFQSxRQUFNLFFBQU8sVUFBSyxTQUFMLG1CQUFXO0FBQ3hCLE1BQUksU0FBUyxRQUFXO0FBQ3BCO0FBQUEsRUFDSjtBQUVBLFFBQU0saUJBQWlCLE9BQU8sVUFBVTtBQUN4QyxRQUFNLGFBQWEsZUFBZTtBQUNsQyxRQUFNLE9BQU8sT0FBTyxRQUFRLFVBQVU7QUFDdEMsUUFBTSxPQUFPLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QyxRQUFNLFdBQVcsQ0FBQyxpQkFBK0I7QUFDN0MsVUFBTSxhQUFhLGFBQWEsNkJBQTZCLE1BQU0sWUFBWSxFQUMxRSxJQUFJLENBQUNDLFVBQWVBLE1BQUssaUJBQWlCLENBQUMsRUFDM0MsS0FBSyxJQUFJO0FBQ2QsV0FBTyxRQUFRLFlBQVksVUFBVTtBQUFBLEVBQ3pDO0FBR0EsUUFBTSxZQUFZLElBQUksVUFBVTtBQUFBLElBQzVCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKLENBQUM7QUFDRCxZQUFVLEtBQUs7QUFDbkI7OztBTXhDQSxJQUFBQyxtQkFBMkM7QUFLcEMsSUFBTSxhQUFhLENBQUMsVUFBbUIsUUFBZ0IsU0FBZTtBQUw3RTtBQU1JLE1BQUksVUFBVTtBQUNWLFFBQUksRUFBRSxnQkFBZ0IsZ0NBQWU7QUFFakMsYUFBTztBQUFBLElBQ1g7QUFNQSxXQUFPO0FBQUEsRUFDWDtBQUVBLE1BQUksRUFBRSxnQkFBZ0IsZ0NBQWU7QUFFakM7QUFBQSxFQUNKO0FBR0EsUUFBTSxRQUFPLFVBQUssU0FBTCxtQkFBVztBQUN4QixNQUFJLFNBQVMsUUFBVztBQUNwQjtBQUFBLEVBQ0o7QUFFQSxRQUFNLGdCQUFnQixPQUFPLFVBQVU7QUFDdkMsUUFBTSxhQUFhLGNBQWM7QUFDakMsUUFBTSxPQUFPLE9BQU8sUUFBUSxVQUFVO0FBRXRDLFFBQU0sY0FBYyxXQUFXLE1BQU0sSUFBSTtBQUN6QyxTQUFPLFFBQVEsWUFBWSxXQUFXO0FBYXRDLFNBQU8sVUFBVTtBQUFBLElBQ2IsTUFBTSxjQUFjO0FBQUEsSUFDcEIsSUFBSSxzQkFBc0IsY0FBYyxJQUFJLE1BQU0sV0FBVztBQUFBLEVBQ2pFLENBQUM7QUFDTDtBQUVPLElBQU0sYUFBYSxDQUFDLE1BQWMsU0FBaUI7QUFDdEQsTUFBSSxjQUFjO0FBRWxCLFFBQU0sT0FBTyxLQUFLLFNBQVM7QUFBQSxJQUV2QjtBQUFBLElBQ0E7QUFBQSxJQUNBLGNBQWM7QUFBQSxJQUNkLGNBQWM7QUFBQSxJQUNkLGlCQUFpQjtBQUFBLElBQ2pCLGNBQWM7QUFBQSxFQUNsQixDQUFDO0FBQ0QsTUFBSSxTQUFTLE1BQU07QUFDZixrQkFBYyxXQUFXLElBQUk7QUFBQSxFQUNqQyxPQUFPO0FBUUgsVUFBTSxhQUFhLEtBQUssTUFBTSx1QkFBdUIsU0FBUztBQUM5RCxRQUFJLGVBQWUsTUFBTTtBQUVyQixZQUFNLGVBQWUsV0FBVztBQUNoQyxZQUFNLFNBQVMsZUFBZSxZQUFZLEVBQUUsU0FBUyxZQUFZO0FBQ2pFLFlBQU0sa0JBQWtCLE9BQU87QUFDL0Isb0JBQWMsS0FBSyxRQUFRLHVCQUF1QixXQUFXLFFBQVEscUJBQXFCO0FBQUEsSUFDOUYsV0FBVyx1QkFBdUIsY0FBYyxLQUFLLElBQUksR0FBRztBQUV4RCxvQkFBYyxLQUFLLFFBQVEsdUJBQXVCLGVBQWUsVUFBVTtBQUFBLElBQy9FLE9BQU87QUFFSCxvQkFBYyxLQUFLLFFBQVEsdUJBQXVCLGtCQUFrQixNQUFNO0FBQUEsSUFDOUU7QUFBQSxFQUNKO0FBRUEsU0FBTztBQUNYO0FBRUEsSUFBTSxhQUFhLENBQUMsU0FBdUI7QUFFdkMsUUFBTSxlQUFlLEtBQUssT0FBTztBQUNqQyxTQUFPLGFBQWEsSUFBSSxDQUFDQyxVQUFlQSxNQUFLLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxJQUFJO0FBQzlFO0FBYU8sSUFBTSx3QkFBd0IsQ0FBQyxjQUFzQixNQUFjLGdCQUF3QjtBQUM5RixNQUFJLGFBQWEsWUFBWTtBQUM3QixNQUFJLGNBQWMsS0FBSyxRQUFRO0FBRTNCLFdBQU8sZ0JBQWdCLFlBQVksU0FBUyxhQUFhO0FBQUEsRUFDN0Q7QUFHQSxRQUFNLGlCQUFpQixxQkFBZ0I7QUFDdkMsTUFBSSxZQUFZLE1BQU0sdUJBQXVCLGFBQWEsS0FBSyxhQUFhLEtBQUssVUFBVSxnQkFBZ0I7QUFDdkcsa0JBQWM7QUFBQSxFQUNsQjtBQUdBLE1BQUksY0FBYyxJQUFJLEtBQUssVUFBVSxZQUFZLE9BQU8sUUFBUSxNQUFNLElBQUk7QUFDdEUsV0FBTyxlQUFlLGFBQWEsS0FBSztBQUFBLEVBQzVDO0FBSUEsUUFBTSxvQkFBb0IsWUFBWSxPQUFPLE1BQU07QUFDbkQsTUFBSSxlQUFlLG1CQUFtQjtBQUVsQyxXQUFPO0FBQUEsRUFDWDtBQUVBLFNBQU8sZUFBZSxhQUFhLEtBQUs7QUFDNUM7OztBQ3RJTyxJQUFNLFdBQU4sTUFBZTtBQUFBLEVBR2xCLElBQVksTUFBVztBQUNuQixXQUFPLEtBQUssT0FBTztBQUFBLEVBQ3ZCO0FBQUEsRUFFQSxZQUFZLEVBQUUsT0FBTyxHQUF1QjtBQUN4QyxTQUFLLFNBQVM7QUFFZCxXQUFPLFdBQVc7QUFBQSxNQUNkLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLHFCQUFxQixDQUFDLFVBQW1CLFFBQWdCLFNBQWU7QUFDcEUsZUFBTyxhQUFhLFVBQVUsUUFBUSxNQUFNLEtBQUssR0FBRztBQUFBLE1BQ3hEO0FBQUEsSUFDSixDQUFDO0FBRUQsV0FBTyxXQUFXO0FBQUEsTUFDZCxJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsTUFDTixxQkFBcUI7QUFBQSxJQUN6QixDQUFDO0FBQUEsRUFDTDtBQUNKOzs7QUNoQk8sSUFBTSxjQUFOLE1BQWtCO0FBQUEsRUFHckIsWUFBWSxFQUFFLGVBQWUsR0FBdUM7QUFDaEUsU0FBSyxpQkFBaUI7QUFBQSxFQUMxQjtBQUFBLEVBRU8sY0FBYyxTQUF5RDtBQUMxRSxXQUFPLEtBQUssZUFBZSxHQUFHLHdEQUFtQixPQUFPO0FBQUEsRUFDNUQ7QUFBQSxFQUVPLG1CQUFtQixXQUFrQztBQUN4RCxTQUFLLGVBQWUsUUFBUSx3REFBbUIsU0FBUztBQUFBLEVBQzVEO0FBQUEsRUFFTyxxQkFBcUIsU0FBdUU7QUFDL0YsV0FBTyxLQUFLLGVBQWUsR0FBRyx1RUFBMEIsT0FBTztBQUFBLEVBQ25FO0FBQUEsRUFFTywwQkFBMEIsSUFBZ0Q7QUFDN0UsU0FBSyxlQUFlLFFBQVEsdUVBQTBCLEVBQUU7QUFBQSxFQUM1RDtBQUFBLEVBRU8sSUFBSSxVQUEwQjtBQUNqQyxTQUFLLGVBQWUsT0FBTyxRQUFRO0FBQUEsRUFDdkM7QUFDSjs7O0FDcENPLElBQU0saUJBQU4sTUFBcUI7QUFBQSxFQUN4QixZQUFZLEVBQUUsT0FBTyxHQUF1QjtBQUk1QyxTQUFPLHdCQUF3QixLQUFLLHVCQUF1QixLQUFLLElBQUk7QUFIaEUsV0FBTyw4QkFBOEIsS0FBSyx1QkFBdUIsS0FBSyxJQUFJLENBQUM7QUFBQSxFQUMvRTtBQUFBLEVBUWMsdUJBQXVCQyxVQUFzQixTQUFzRDtBQUFBO0FBaEJySDtBQWlCUSxZQUFNLEVBQUUsYUFBYSxJQUFJLFlBQVk7QUFDckMsWUFBTSxtQkFBbUJBLFNBQVEsUUFBUSxpQkFBaUIsRUFBRSxPQUFPLENBQUMsYUFBYTtBQWxCekYsWUFBQUM7QUFtQlksY0FBTSxhQUFZQSxNQUFBLFNBQVMsZ0JBQVQsZ0JBQUFBLElBQXNCLE1BQU07QUFDOUMsWUFBSSxjQUFjLFFBQVc7QUFDekIsaUJBQU87QUFBQSxRQUNYO0FBTUEsWUFBSSxnQkFBK0I7QUFJbkMsaUJBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLElBQUksSUFBSSxHQUFHO0FBQzdDLGNBQUksVUFBVSxPQUFPLElBQUk7QUFDckIsNEJBQWdCLFVBQVU7QUFDMUI7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUVBLFlBQUksa0JBQWtCLE1BQU07QUFDeEIsaUJBQU87QUFBQSxRQUNYO0FBRUEsZUFBTyxjQUFjLFNBQVMsWUFBWTtBQUFBLE1BQzlDLENBQUM7QUFDRCxVQUFJLGlCQUFpQixXQUFXLEdBQUc7QUFFL0I7QUFBQSxNQUNKO0FBRUEsWUFBTSxPQUFPLFFBQVE7QUFDckIsWUFBTSxVQUFVLFFBQVEsZUFBZUQsUUFBTztBQUU5QyxVQUFJLFlBQVksTUFBTTtBQUVsQjtBQUFBLE1BQ0o7QUFFQSxZQUFNLFlBQVksUUFBUSxLQUFLLE1BQU0sSUFBSTtBQUV6QyxVQUFJLGVBQWU7QUFDbkIsWUFBTSxZQUFvQixDQUFDO0FBQzNCLGVBQVMsYUFBYSxRQUFRLFdBQVcsY0FBYyxRQUFRLFNBQVMsY0FBYztBQUNsRixjQUFNLE9BQU8sVUFBVTtBQUN2QixZQUFJLFNBQVMsUUFBVztBQUdwQjtBQUFBLFFBQ0o7QUFFQSxjQUFNLE9BQU8sS0FBSyxTQUFTO0FBQUEsVUFDdkI7QUFBQSxVQUNBO0FBQUEsVUFDQSxjQUFjLFFBQVE7QUFBQSxVQUN0QjtBQUFBLFVBQ0EsaUJBQWlCO0FBQUEsVUFDakIsY0FBYztBQUFBLFFBQ2xCLENBQUM7QUFDRCxZQUFJLFNBQVMsTUFBTTtBQUNmLG9CQUFVLEtBQUssSUFBSTtBQUNuQjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBR0EsZUFBU0UsZ0JBQWUsR0FBR0EsZ0JBQWUsaUJBQWlCLFFBQVFBLGlCQUFnQjtBQUMvRSxjQUFNLE9BQU8sVUFBVUE7QUFDdkIsY0FBTSxrQkFBa0IsaUJBQWlCQTtBQUV6QyxZQUFJLFNBQVMsVUFBYSxvQkFBb0IsUUFBVztBQUlyRDtBQUFBLFFBQ0o7QUFFQSxjQUFNLFlBQW1CLHFCQUFnQixRQUFRLFdBQVcsTUFBbkMsWUFBd0M7QUFDakUsY0FBTSxZQUFvQixPQUFPLFNBQVMsVUFBVSxFQUFFO0FBQ3RELGNBQU0sY0FBYyxNQUFNLEtBQUssS0FBSztBQUFBLFVBQ2hDLGlCQUFpQkY7QUFBQSxVQUNqQjtBQUFBLFFBQ0osQ0FBQztBQUlELGNBQU0sbUJBQW1CLGdCQUFnQjtBQUN6QyxpQkFBUyxJQUFJLEdBQUcsSUFBSSxpQkFBaUIsUUFBUSxJQUFJLElBQUksR0FBRztBQUNwRCxnQkFBTSxnQkFBZ0IsaUJBQWlCO0FBQ3ZDLGNBQUksY0FBYyxTQUFTLFlBQVksTUFBTSxPQUFPO0FBQ2hELHdCQUFZLFFBQVEsYUFBYTtBQUFBLFVBQ3JDLFdBQVcsY0FBYyxTQUFTLFlBQVksTUFBTSxNQUFNO0FBQ3RELHdCQUFZLE9BQU8sYUFBYTtBQUFBLFVBQ3BDO0FBQUEsUUFDSjtBQUtBLGNBQU0sb0JBQW9CLGdCQUFnQixpQkFBaUIsb0JBQW9CO0FBQy9FLGNBQU0sZUFBZSxZQUFZLGlCQUFpQixvQkFBb0I7QUFDdEUsWUFBSSxrQkFBa0IsV0FBVyxhQUFhLFFBQVE7QUFDbEQsbUJBQVMsSUFBSSxHQUFHLElBQUksa0JBQWtCLFFBQVEsS0FBSztBQUMvQyx5QkFBYSxHQUFHLFlBQVksa0JBQWtCLEVBQUU7QUFBQSxVQUNwRDtBQUFBLFFBQ0o7QUFFQSx3QkFBZ0IsWUFBWSxXQUFXO0FBQUEsTUFDM0M7QUFBQSxJQUNKO0FBQUE7QUFDSjs7O0FDaklBLGtCQUF1QztBQUV2QyxJQUFBRyxtQkFBdUI7QUFJaEIsSUFBTSwwQkFBMEIsTUFBTTtBQUN6QyxTQUFPLHVCQUFXLFVBQVUsb0JBQW9CO0FBQ3BEO0FBRUEsSUFBTSx1QkFBTixNQUFrRDtBQUFBLEVBRzlDLFlBQVksTUFBa0I7QUFDMUIsU0FBSyxPQUFPO0FBRVosU0FBSyxtQkFBbUIsS0FBSyxpQkFBaUIsS0FBSyxJQUFJO0FBQ3ZELFNBQUssS0FBSyxJQUFJLGlCQUFpQixTQUFTLEtBQUssZ0JBQWdCO0FBQUEsRUFDakU7QUFBQSxFQUVPLFVBQWdCO0FBQ25CLFNBQUssS0FBSyxJQUFJLG9CQUFvQixTQUFTLEtBQUssZ0JBQWdCO0FBQUEsRUFDcEU7QUFBQSxFQUVRLGlCQUFpQixPQUE0QjtBQUNqRCxVQUFNLEVBQUUsT0FBTyxJQUFJO0FBR25CLFFBQUksQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLHFCQUFxQixPQUFPLFNBQVMsWUFBWTtBQUNoRixhQUFPO0FBQUEsSUFDWDtBQVVBLFVBQU0sV0FBVyxPQUFPLFFBQVEsbURBQW1EO0FBQ25GLFFBQUksVUFBVTtBQUNWLFVBQUksU0FBUyxRQUFRLHFCQUFxQixHQUFHO0FBRXpDLGNBQU0sTUFDRjtBQUVKLGdCQUFRLEtBQUssR0FBRztBQUNoQixZQUFJLHdCQUFPLEtBQUssSUFBSztBQUFBLE1BQ3pCO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFFQSxVQUFNLEVBQUUsTUFBTSxJQUFJLEtBQUs7QUFDdkIsVUFBTSxXQUFXLEtBQUssS0FBSyxTQUFTLE1BQU07QUFDMUMsVUFBTSxPQUFPLE1BQU0sSUFBSSxPQUFPLFFBQVE7QUFDdEMsVUFBTSxPQUFPLEtBQUssU0FBUztBQUFBLE1BQ3ZCLE1BQU0sS0FBSztBQUFBLE1BSVgsTUFBTTtBQUFBLE1BQ04sY0FBYztBQUFBLE1BQ2QsY0FBYztBQUFBLE1BQ2QsaUJBQWlCO0FBQUEsTUFDakIsY0FBYztBQUFBLElBQ2xCLENBQUM7QUFFRCxZQUFRLE1BQU0sb0RBQW9ELGtCQUFrQixLQUFLLE1BQU07QUFHL0YsUUFBSSxTQUFTLE1BQU07QUFDZixhQUFPO0FBQUEsSUFDWDtBQUdBLFVBQU0sZUFBZTtBQUdyQixVQUFNLFVBQVUsS0FBSyxPQUFPO0FBQzVCLFVBQU0sZ0JBQWdCLFFBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssTUFBTSxTQUFTO0FBR25GLFVBQU0sY0FBYyxNQUFNLE9BQU87QUFBQSxNQUM3QixTQUFTO0FBQUEsUUFDTCxNQUFNLEtBQUs7QUFBQSxRQUNYLElBQUksS0FBSztBQUFBLFFBQ1QsUUFBUTtBQUFBLE1BQ1o7QUFBQSxJQUNKLENBQUM7QUFDRCxTQUFLLEtBQUssU0FBUyxXQUFXO0FBVTlCLFVBQU0sdUJBQXVCLE9BQU87QUFDcEMsZUFBVyxNQUFNO0FBQ2IsYUFBTyxVQUFVO0FBQUEsSUFDckIsR0FBRyxDQUFDO0FBRUosV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDM0dBLElBQUFDLG1CQUEwRTs7O0FDaUJuRSxJQUFNLFNBQU4sTUFBYTtBQUFBLEVBWWhCLFlBQVksVUFBa0IsWUFBd0IsU0FBa0I7QUFDcEUsU0FBSyxXQUFXO0FBQ2hCLFNBQUssYUFBYSxPQUFPLGFBQWEsU0FBUyxVQUFVO0FBQUEsRUFDN0Q7QUFBQSxFQUVBLE9BQWUsYUFBYSxTQUFrQixZQUF3QjtBQUNsRSxXQUFPLFVBQVUsT0FBTyx1QkFBdUIsVUFBVSxJQUFJO0FBQUEsRUFDakU7QUFBQSxFQUVBLE9BQWUsdUJBQXVCLFlBQW9DO0FBRXRFLFdBQU8sQ0FBQyxHQUFHLE1BQU8sV0FBVyxHQUFHLENBQUMsSUFBSTtBQUFBLEVBQ3pDO0FBQ0o7OztBQ2pCTyxJQUFNLFVBQU4sTUFBYztBQUFBLEVBSWpCLFlBQVksVUFBa0IsU0FBMEI7QUFDcEQsU0FBSyxXQUFXO0FBQ2hCLFNBQUssVUFBVTtBQUFBLEVBQ25CO0FBQ0o7OztBQ2JPLElBQWUsUUFBZixNQUFxQjtBQUFBLEVBWWpCLHVCQUF1QixNQUF1QjtBQUNqRCxXQUFPLE1BQU0sa0JBQWtCLEtBQUssYUFBYSxHQUFHLElBQUk7QUFBQSxFQUM1RDtBQUFBLEVBZ0JBLE9BQWlCLGtCQUFrQixRQUF1QixNQUF1QjtBQUM3RSxRQUFJLFFBQVE7QUFDUixhQUFPLE9BQU8sS0FBSyxJQUFJO0FBQUEsSUFDM0IsT0FBTztBQUNILGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUFBLEVBU0EsT0FBaUIsU0FBUyxjQUE2QixNQUF1QztBQUMxRixRQUFJLGNBQWM7QUFDZCxhQUFPLEtBQUssTUFBTSxZQUFZO0FBQUEsSUFDbEMsT0FBTztBQUNILGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUFBLEVBK0JPLG9CQUE0QjtBQUMvQixXQUFPLEtBQUssVUFBVTtBQUFBLEVBQzFCO0FBQUEsRUFXTywyQkFBMkI7QUFDOUIsV0FBbUIsYUFBYSxLQUFLLGtCQUFrQixDQUFDO0FBQUEsRUFDNUQ7QUFBQSxFQVlPLGtCQUEyQjtBQUM5QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBUU8sY0FBYyxNQUE2QjtBQUM5QyxRQUFJLENBQUMsS0FBSyxnQkFBZ0IsR0FBRztBQUN6QixhQUFPO0FBQUEsSUFDWDtBQUVBLFFBQUksQ0FBQyxLQUFLLHVCQUF1QixJQUFJLEdBQUc7QUFDcEMsYUFBTztBQUFBLElBQ1g7QUFFQSxXQUFPLEtBQUsscUJBQXFCLElBQUk7QUFBQSxFQUN6QztBQUFBLEVBV08sdUJBQXVCLE1BQXVCO0FBQ2pELFFBQUksQ0FBQyxLQUFLLGdCQUFnQixHQUFHO0FBQ3pCLGFBQU87QUFBQSxJQUNYO0FBRUEsV0FBTyxNQUFNLGtCQUFrQixLQUFLLGFBQWEsR0FBRyxJQUFJO0FBQUEsRUFDNUQ7QUFBQSxFQWVPLHFCQUFxQixNQUE2QjtBQUNyRCxRQUFJLENBQUMsS0FBSyxnQkFBZ0IsR0FBRztBQUN6QixhQUFPO0FBQUEsSUFDWDtBQUVBLFVBQU0sUUFBUSxNQUFNLFNBQVMsS0FBSyxhQUFhLEdBQUcsSUFBSTtBQUN0RCxRQUFJLFVBQVUsTUFBTTtBQUNoQixhQUFPO0FBQUEsSUFDWDtBQUVBLFVBQU0sVUFBVSxDQUFDLENBQUMsTUFBTTtBQUN4QixXQUFPLEtBQUssYUFBYSxPQUFPO0FBQUEsRUFDcEM7QUFBQSxFQWFVLGVBQXVCO0FBQzdCLFFBQUksQ0FBQyxLQUFLLGdCQUFnQixHQUFHO0FBQ3pCLFlBQU0sTUFBTSxvQ0FBb0MsS0FBSyxrQkFBa0IsR0FBRztBQUFBLElBQzlFO0FBRUEsV0FBTyxJQUFJLE9BQU8sWUFBWSxLQUFLLHlCQUF5QixjQUFjO0FBQUEsRUFDOUU7QUFBQSxFQVFPLGFBQXlCO0FBQzVCLFVBQU0sTUFBTSxrQ0FBa0MsS0FBSyxrQkFBa0IsR0FBRztBQUFBLEVBQzVFO0FBQUEsRUFNTyxhQUFhLFNBQTBCO0FBQzFDLFdBQU8sSUFBSSxPQUFPLEtBQUssa0JBQWtCLEdBQUcsS0FBSyxXQUFXLEdBQUcsT0FBTztBQUFBLEVBQzFFO0FBQUEsRUFRTyxxQkFBNkI7QUFDaEMsV0FBTyxLQUFLLGFBQWEsS0FBSztBQUFBLEVBQ2xDO0FBQUEsRUFRTyxzQkFBOEI7QUFDakMsV0FBTyxLQUFLLGFBQWEsSUFBSTtBQUFBLEVBQ2pDO0FBQUEsRUFZTyxtQkFBNEI7QUFDL0IsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQVFPLFVBQTJCO0FBQzlCLFVBQU0sTUFBTSwrQkFBK0IsS0FBSyxrQkFBa0IsR0FBRztBQUFBLEVBQ3pFO0FBQUEsRUFRTyxnQkFBeUI7QUFDNUIsV0FBTyxJQUFJLFFBQVEsS0FBSyxrQkFBa0IsR0FBRyxLQUFLLFFBQVEsQ0FBQztBQUFBLEVBQy9EO0FBQ0o7OztBQ3JSTyxJQUFNLGNBQU4sTUFBa0I7QUFBQSxFQUtyQixZQUFZLGFBQXFCQyxZQUEwQixDQUFDLEdBQUcsU0FBaUIsSUFBSTtBQUNoRixTQUFLLGNBQWM7QUFDbkIsU0FBSyxTQUFTO0FBQ2QsU0FBSyxXQUFXQTtBQUFBLEVBQ3BCO0FBQUEsRUFNQSxPQUFjLFdBQVdBLFdBQXlCO0FBQzlDLFdBQU8sS0FBSywyQkFBMkIsVUFBVUEsV0FBVSxLQUFLO0FBQUEsRUFDcEU7QUFBQSxFQU1BLE9BQWMsVUFBVUEsV0FBeUI7QUFDN0MsV0FBTyxLQUFLLDJCQUEyQixtQkFBbUJBLFdBQVUsSUFBSTtBQUFBLEVBQzVFO0FBQUEsRUFNQSxPQUFjLFdBQVdBLFdBQXlCO0FBQzlDLFdBQU8sSUFBSSxZQUFZLFdBQVdBLFdBQVUsS0FBSztBQUFBLEVBQ3JEO0FBQUEsRUFNQSxPQUFjLFdBQVdBLFdBQXlCO0FBQzlDLFdBQU8sSUFBSSxZQUFZLGtCQUFrQkEsV0FBVSxLQUFLO0FBQUEsRUFDNUQ7QUFBQSxFQVNPLFNBQVMscUJBQTZCLElBQUk7QUFDN0MsUUFBSSxLQUFLLFNBQVMsVUFBVSxHQUFHO0FBQzNCLGFBQU8scUJBQXFCLEtBQUs7QUFBQSxJQUNyQztBQUdBLFFBQUksU0FBUyxxQkFBcUIsR0FBRyxLQUFLO0FBQzFDLFFBQUksS0FBSyxTQUFTLFNBQVMsR0FBRztBQUcxQixnQkFBVSxLQUFLLEtBQUs7QUFBQSxJQUN4QjtBQUNBLGNBQVU7QUFDVixVQUFNLGlCQUFpQixxQkFBcUI7QUFDNUMsYUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFNBQVMsUUFBUSxLQUFLO0FBQzNDLGdCQUFVO0FBQUEsRUFBSyxLQUFLLFNBQVMsR0FBRyxTQUFTLGNBQWM7QUFBQSxJQUMzRDtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxPQUFlLDJCQUEyQixhQUFxQkEsV0FBeUIsUUFBZ0I7QUFDcEcsUUFBSUEsVUFBUyxXQUFXLEdBQUc7QUFDdkIsWUFBTSxTQUFTQSxVQUFTO0FBQ3hCLFlBQU0sU0FBU0EsVUFBUztBQUN4QixVQUFJLE9BQU8sV0FBVyxVQUFVLE9BQU8sV0FBVyxJQUFJO0FBQ2xELGVBQU8sU0FBUyxLQUFLLE1BQU07QUFDM0IsZUFBTztBQUFBLE1BQ1g7QUFBQSxJQUNKO0FBQ0EsV0FBTyxJQUFJLFlBQVksYUFBYUEsV0FBVSxNQUFNO0FBQUEsRUFDeEQ7QUFDSjs7O0FDdEVPLElBQU0sU0FBTixNQUFhO0FBQUEsRUFLVCxZQUFZLGFBQXFCLGdCQUFnQyxhQUEwQjtBQUM5RixTQUFLLGNBQWM7QUFDbkIsU0FBSyxjQUFjO0FBQ25CLFNBQUssaUJBQWlCO0FBQUEsRUFDMUI7QUFBQSxFQUVPLHNCQUFzQixRQUFnQjtBQUN6QyxVQUFNLGNBQWMsS0FBSztBQUN6QixVQUFNLHdCQUF3QixZQUFZLFNBQVM7QUFDbkQsUUFBSSwwQkFBMEIsS0FBSyxhQUFhO0FBQzVDLGFBQU8sR0FBRyxTQUFTLEtBQUs7QUFBQTtBQUFBLElBQzVCLE9BQU87QUFDSCxhQUFPLEdBQUcsU0FBUyxLQUFLO0FBQUEsRUFBbUIsWUFBWSxTQUFTLElBQUk7QUFBQTtBQUFBLElBQ3hFO0FBQUEsRUFDSjtBQUNKO0FBb0JPLElBQU0sdUJBQU4sTUFBMkI7QUFBQSxFQUs5QixZQUFZLGFBQXFCO0FBQzdCLFNBQUssY0FBYztBQUFBLEVBQ3ZCO0FBQUEsRUFFQSxJQUFXLFNBQTZCO0FBQ3BDLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQUEsRUFFQSxJQUFJLE9BQU8sT0FBMkI7QUFDbEMsU0FBSyxVQUFVO0FBQUEsRUFDbkI7QUFBQSxFQUVBLElBQUksaUJBQTZDO0FBQzdDLFFBQUksS0FBSyxTQUFTO0FBQ2QsYUFBTyxLQUFLLFFBQVE7QUFBQSxJQUN4QixPQUFPO0FBQ0gsYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKO0FBQUEsRUFTQSxPQUFjLFdBQVcsUUFBc0M7QUFDM0QsVUFBTSxTQUFTLElBQUkscUJBQXFCLE9BQU8sV0FBVztBQUMxRCxXQUFPLFNBQVM7QUFDaEIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQU9BLE9BQWMsVUFBVSxhQUFxQixjQUE0QztBQUNyRixVQUFNLFNBQVMsSUFBSSxxQkFBcUIsV0FBVztBQUNuRCxXQUFPLFFBQVE7QUFDZixXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QUM3Rk8sSUFBTSxvQkFBTixNQUF3QjtBQUFBLEVBUzNCLFlBQVksYUFBcUIsUUFBd0I7QUFDckQsU0FBSyxlQUFlO0FBQ3BCLFNBQUssVUFBVTtBQUFBLEVBQ25CO0FBQUEsRUFFTyx1QkFBdUIsTUFBdUI7QUFDakQsV0FBTyxRQUFRLEtBQUs7QUFBQSxFQUN4QjtBQUFBLEVBRU8sMkJBQTJCLE1BQW9DO0FBQ2xFLFVBQU0sU0FBUyxJQUFJLHFCQUFxQixJQUFJO0FBRTVDLFFBQUksU0FBUyxLQUFLLGNBQWM7QUFDNUIsYUFBTyxTQUFTLElBQUksT0FBTyxNQUFNLEtBQUssU0FBUyxJQUFJLFlBQVksSUFBSSxDQUFDO0FBQ3BFLGFBQU87QUFBQSxJQUNYO0FBRUEsV0FBTyxRQUFRLDZCQUE2QjtBQUM1QyxXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QUM5Qk8sSUFBTSxxQkFBTixNQUF5QjtBQUFBLEVBQXpCO0FBQ0gsU0FBaUIsV0FBZ0MsQ0FBQztBQUFBO0FBQUEsRUFFM0MsSUFBSSxhQUFxQixRQUF3QjtBQUNwRCxTQUFLLFNBQVMsS0FBSyxJQUFJLGtCQUFrQixhQUFhLE1BQU0sQ0FBQztBQUFBLEVBQ2pFO0FBQUEsRUFFTyx1QkFBdUIsTUFBdUI7QUFDakQsZUFBVyxVQUFVLEtBQUssVUFBVTtBQUNoQyxVQUFJLE9BQU8sdUJBQXVCLElBQUksR0FBRztBQUNyQyxlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRU8sMkJBQTJCLE1BQW9DO0FBQ2xFLGVBQVcsVUFBVSxLQUFLLFVBQVU7QUFDaEMsWUFBTSxJQUFJLE9BQU8sMkJBQTJCLElBQUk7QUFDaEQsVUFBSSxFQUFFLFVBQVUsUUFBVztBQUN2QixlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFFQSxVQUFNLFNBQVMsSUFBSSxxQkFBcUIsSUFBSTtBQUM1QyxXQUFPLFFBQVEsNkJBQTZCO0FBQzVDLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQy9CTyxJQUFlLCtCQUFmLGNBQW9ELE1BQU07QUFBQSxFQUExRDtBQUFBO0FBQ0gsU0FBbUIsV0FBVyxJQUFJLG1CQUFtQjtBQUFBO0FBQUEsRUFFOUMsdUJBQXVCLE1BQXVCO0FBQ2pELFdBQU8sS0FBSyxTQUFTLHVCQUF1QixJQUFJO0FBQUEsRUFDcEQ7QUFBQSxFQUVPLDJCQUEyQixNQUFvQztBQUNsRSxXQUFPLEtBQUssU0FBUywyQkFBMkIsSUFBSTtBQUFBLEVBQ3hEO0FBQUEsRUFFVSxlQUE4QjtBQUNwQyxXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QUNuQk8sSUFBTSxjQUFOLGNBQTBCLDZCQUE2QjtBQUFBLEVBQzFELGNBQWM7QUFDVixVQUFNO0FBV04sU0FBSyxTQUFTO0FBQUEsTUFDVjtBQUFBLE1BQ0EsQ0FBQyxTQUNHLEtBQUssT0FBTyw4QkFDWixLQUFLLE9BQU8sd0NBQ1osS0FBSyxPQUFPO0FBQUEsSUFDcEI7QUFDQSxTQUFLLFNBQVM7QUFBQSxNQUNWO0FBQUEsTUFDQSxDQUFDLFNBQWUsS0FBSyxPQUFPLDhCQUE0QixLQUFLLE9BQU87QUFBQSxJQUN4RTtBQUFBLEVBQ0o7QUFBQSxFQUVPLFlBQW9CO0FBQ3ZCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFTyxrQkFBMkI7QUFDOUIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUtPLGFBQXlCO0FBSTVCLFdBQU8sQ0FBQyxHQUFTLE1BQVk7QUFDekIsWUFBTSxpQkFBaUIsWUFBWSxjQUFjLENBQUM7QUFDbEQsWUFBTSxpQkFBaUIsWUFBWSxjQUFjLENBQUM7QUFDbEQsVUFBSSxpQkFBaUIsZ0JBQWdCO0FBQ2pDLGVBQU87QUFBQSxNQUNYLFdBQVcsaUJBQWlCLGdCQUFnQjtBQUN4QyxlQUFPO0FBQUEsTUFDWCxPQUFPO0FBQ0gsZUFBTztBQUFBLE1BQ1g7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUFBLEVBRUEsT0FBZSxjQUFjLEdBQWlCO0FBQzFDLFFBQUksRUFBRSxPQUFPLFdBQVcsS0FBSztBQUN6QixhQUFPO0FBQUEsSUFDWCxPQUFPO0FBQ0gsYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKO0FBQ0o7OztBQ2xFQSxJQUFBQyxVQUF3QjtBQUVqQixJQUFNLGFBQU4sTUFBaUI7QUFBQSxFQUNwQixPQUFjLFVBQVUsT0FBZSxjQUF1QixPQUFzQjtBQUVoRixXQUFPLE9BQ0Y7QUFBQSxNQUNVLGtCQUFVLE9BQU8sUUFBVztBQUFBLFFBQy9CO0FBQUEsTUFDSixDQUFDO0FBQUEsSUFDTCxFQUNDLFFBQVEsS0FBSztBQUFBLEVBQ3RCO0FBQ0o7OztBQ0VPLElBQWUsWUFBZixjQUFpQyxNQUFNO0FBQUEsRUFHMUMsY0FBYztBQUNWLFVBQU07QUFDTixTQUFLLHFCQUFxQixJQUFJLG1CQUFtQjtBQUNqRCxTQUFLLG1CQUFtQixJQUFJLE9BQU8sS0FBSyxVQUFVLFVBQVUsQ0FBQyxTQUFlLEtBQUssS0FBSyxJQUFJLE1BQU0sSUFBSTtBQUNwRyxTQUFLLG1CQUFtQixJQUFJLE1BQU0sS0FBSyxVQUFVLFVBQVUsQ0FBQyxTQUFlLEtBQUssS0FBSyxJQUFJLE1BQU0sSUFBSTtBQUNuRyxTQUFLLG1CQUFtQixJQUFJLEdBQUcsS0FBSyxVQUFVLHFCQUFxQixDQUFDLFNBQWU7QUFDL0UsWUFBTSxPQUFPLEtBQUssS0FBSyxJQUFJO0FBQzNCLGFBQU8sU0FBUyxRQUFRLENBQUMsS0FBSyxRQUFRO0FBQUEsSUFDMUMsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVPLHVCQUF1QixNQUF1QjtBQUNqRCxRQUFJLEtBQUssbUJBQW1CLHVCQUF1QixJQUFJLEdBQUc7QUFDdEQsYUFBTztBQUFBLElBQ1g7QUFFQSxXQUFPLE1BQU0sdUJBQXVCLElBQUk7QUFBQSxFQUM1QztBQUFBLEVBRU8sMkJBQTJCLE1BQW9DO0FBQ2xFLFVBQU0sZUFBZSxLQUFLLG1CQUFtQiwyQkFBMkIsSUFBSTtBQUM1RSxRQUFJLGFBQWEsV0FBVyxRQUFXO0FBQ25DLGFBQU87QUFBQSxJQUNYO0FBRUEsVUFBTSxTQUFTLElBQUkscUJBQXFCLElBQUk7QUFFNUMsVUFBTSxRQUFRLE1BQU0sU0FBUyxLQUFLLGFBQWEsR0FBRyxJQUFJO0FBQ3RELFFBQUk7QUFDSixRQUFJLFVBQVUsTUFBTTtBQUNoQixZQUFNLGFBQWEsV0FBVyxVQUFVLE1BQU0sRUFBRTtBQUNoRCxVQUFJLENBQUMsV0FBVyxRQUFRLEdBQUc7QUFDdkIsZUFBTyxRQUFRLHVCQUF1QixLQUFLLFVBQVUsSUFBSTtBQUFBLE1BQzdELE9BQU87QUFDSCxZQUFJO0FBQ0osWUFBSSxNQUFNLE9BQU8sVUFBVTtBQUN2QiwyQkFBaUIsQ0FBQyxTQUFlO0FBQzdCLGtCQUFNLE9BQU8sS0FBSyxLQUFLLElBQUk7QUFDM0IsbUJBQU8sT0FBTyxLQUFLLFNBQVMsVUFBVSxJQUFJLEtBQUssMkJBQTJCO0FBQUEsVUFDOUU7QUFDQSxxQkFBVyxNQUFNLE1BQU07QUFBQSxRQUMzQixXQUFXLE1BQU0sT0FBTyxTQUFTO0FBQzdCLDJCQUFpQixDQUFDLFNBQWU7QUFDN0Isa0JBQU0sT0FBTyxLQUFLLEtBQUssSUFBSTtBQUMzQixtQkFBTyxPQUFPLEtBQUssUUFBUSxVQUFVLElBQUksS0FBSywyQkFBMkI7QUFBQSxVQUM3RTtBQUNBLHFCQUFXLE1BQU0sTUFBTTtBQUFBLFFBQzNCLE9BQU87QUFDSCwyQkFBaUIsQ0FBQyxTQUFlO0FBQzdCLGtCQUFNLE9BQU8sS0FBSyxLQUFLLElBQUk7QUFDM0IsbUJBQU8sT0FBTyxLQUFLLE9BQU8sVUFBVSxJQUFJLEtBQUssMkJBQTJCO0FBQUEsVUFDNUU7QUFDQSxxQkFBVztBQUFBLFFBQ2Y7QUFDQSxjQUFNLGNBQWMsVUFBVTtBQUFBLFVBQzFCLEtBQUssVUFBVTtBQUFBLFVBQ2Y7QUFBQSxVQUNBLEtBQUssMkJBQTJCO0FBQUEsVUFDaEM7QUFBQSxRQUNKO0FBQ0EsZUFBTyxTQUFTLElBQUksT0FBTyxNQUFNLGdCQUFnQixJQUFJLFlBQVksV0FBVyxDQUFDO0FBQUEsTUFDakY7QUFBQSxJQUNKLE9BQU87QUFDSCxhQUFPLFFBQVEscUNBQXFDLEtBQUssVUFBVSxJQUFJO0FBQUEsSUFDM0U7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBZ0JBLE9BQWMscUJBQ1YsV0FDQSwrQkFDQSw0QkFDQSxZQUNGO0FBRUUsVUFBTSxhQUFhLFdBQVcsT0FBTyxnQ0FBZ0M7QUFDckUsUUFBSSxTQUFTLEdBQUcsb0JBQW9CLGlDQUFpQztBQUNyRSxRQUFJLDRCQUE0QjtBQUM1QixnQkFBVSxVQUFVO0FBQUEsSUFDeEI7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBV08sa0JBQTJCO0FBQzlCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFTyxhQUF5QjtBQUM1QixXQUFPLENBQUMsR0FBUyxNQUFZO0FBQ3pCLGFBQU8sY0FBYyxLQUFLLEtBQUssQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUM7QUFBQSxJQUNuRDtBQUFBLEVBQ0o7QUFDSjs7O0FDOUhPLElBQU0sZ0JBQU4sY0FBMkIsVUFBVTtBQUFBLEVBRzlCLGVBQXVCO0FBQzdCLFdBQU8sY0FBYTtBQUFBLEVBQ3hCO0FBQUEsRUFDTyxZQUFvQjtBQUN2QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ08sS0FBSyxNQUEyQjtBQUNuQyxXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBQ1UsNkJBQTZCO0FBQ25DLFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFmTyxJQUFNLGVBQU47QUFBTSxhQUNlLFlBQVk7OztBQ0ZqQyxJQUFNLGlCQUFOLGNBQTRCLE1BQU07QUFBQSxFQU9yQywyQkFBMkIsTUFBb0M7QUFDM0QsVUFBTSxTQUFTLElBQUkscUJBQXFCLElBQUk7QUFDNUMsVUFBTSxnQkFBZ0IsTUFBTSxTQUFTLEtBQUssYUFBYSxHQUFHLElBQUk7QUFDOUQsUUFBSSxrQkFBa0IsTUFBTTtBQUN4QixZQUFNLHVCQUF1QixjQUFjO0FBQzNDLFVBQUksaUJBQWtDO0FBRXRDLGNBQVE7QUFBQSxhQUNDO0FBQ0Q7QUFDQTtBQUFBLGFBQ0M7QUFDRDtBQUNBO0FBQUEsYUFDQztBQUNEO0FBQ0E7QUFBQSxhQUNDO0FBQ0Q7QUFDQTtBQUFBO0FBR1IsVUFBSSxtQkFBbUIsTUFBTTtBQUN6QixlQUFPLFFBQVE7QUFDZixlQUFPO0FBQUEsTUFDWDtBQUVBLFVBQUksY0FBYztBQUNsQixVQUFJO0FBQ0osY0FBUSxjQUFjO0FBQUEsYUFDYjtBQUNELG1CQUFTLENBQUMsU0FBZSxLQUFLLFNBQVMsY0FBYyxjQUFlLElBQUk7QUFDeEU7QUFBQSxhQUNDO0FBQ0QsbUJBQVMsQ0FBQyxTQUFlLEtBQUssU0FBUyxjQUFjLGNBQWUsSUFBSTtBQUN4RTtBQUFBLGFBQ0M7QUFDRCxtQkFBUyxDQUFDLFNBQWUsS0FBSyxhQUFhO0FBQzNDO0FBQUE7QUFFQSxtQkFBUyxDQUFDLFNBQWUsS0FBSyxhQUFhO0FBQzNDLHdCQUFjLEdBQUcsS0FBSyxVQUFVLFFBQVE7QUFBQTtBQUdoRCxhQUFPLFNBQVMsSUFBSSxPQUFPLE1BQU0sUUFBUSxJQUFJLFlBQVksV0FBVyxDQUFDO0FBQUEsSUFDekUsT0FBTztBQUNILGFBQU8sUUFBUTtBQUFBLElBQ25CO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVPLFlBQW9CO0FBQ3ZCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFVSxlQUF1QjtBQUM3QixXQUFPLGVBQWM7QUFBQSxFQUN6QjtBQUFBLEVBRU8sa0JBQTJCO0FBQzlCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFTyxhQUF5QjtBQUM1QixXQUFPLENBQUMsR0FBUyxNQUFZO0FBQ3pCLGFBQU8sRUFBRSxTQUFTLGNBQWMsRUFBRSxRQUFRO0FBQUEsSUFDOUM7QUFBQSxFQUNKO0FBQ0o7QUEzRU8sSUFBTSxnQkFBTjtBQUFNLGNBS2UsaUJBQWlCOzs7QUNMdEMsSUFBZSxpQkFBZixNQUE4QjtBQUFBLEVBVzFCLGFBQWEsaUJBQTJCO0FBQzNDLFdBQU8sZ0JBQWdCLEtBQUssQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUM7QUFBQSxFQUN0RDtBQUNKOzs7QUNiTyxJQUFNLG1CQUFOLGNBQStCLGVBQWU7QUFBQSxFQVMxQyxZQUFZLGNBQXNCO0FBQ3JDLFVBQU07QUFDTixTQUFLLGVBQWU7QUFBQSxFQUN4QjtBQUFBLEVBRU8sUUFBUSxnQkFBaUM7QUFDNUMsV0FBTyxpQkFBaUIsOEJBQThCLGdCQUFnQixLQUFLLFlBQVk7QUFBQSxFQUMzRjtBQUFBLEVBRUEsT0FBYyw4QkFBOEIsVUFBa0IsUUFBeUI7QUFDbkYsV0FBTyxTQUFTLGtCQUFrQixFQUFFLFNBQVMsT0FBTyxrQkFBa0IsQ0FBQztBQUFBLEVBQzNFO0FBQ0o7OztBQ3ZCTyxJQUFNLGVBQU4sY0FBMkIsZUFBZTtBQUFBLEVBUXRDLFlBQVksT0FBZTtBQUM5QixVQUFNO0FBQ04sU0FBSyxRQUFRO0FBQUEsRUFDakI7QUFBQSxFQVVBLE9BQWMscUJBQXFCLFlBQXlDO0FBRXhFLFVBQU0sZUFDRjtBQUNKLFVBQU0sUUFBUSxXQUFXLE1BQU0sWUFBWTtBQUUzQyxRQUFJLFVBQVUsTUFBTTtBQUNoQixZQUFNLFNBQVMsSUFBSSxPQUFPLE1BQU0sSUFBSSxNQUFNLEVBQUU7QUFDNUMsYUFBTyxJQUFJLGFBQWEsTUFBTTtBQUFBLElBQ2xDLE9BQU87QUFDSCxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFBQSxFQUVPLFFBQVEsZ0JBQWlDO0FBQzVDLFdBQU8sZUFBZSxNQUFNLEtBQUssS0FBSyxNQUFNO0FBQUEsRUFDaEQ7QUFDSjs7O0FDM0JPLElBQWUsWUFBZixjQUFpQyxNQUFNO0FBQUEsRUFDbkMsMkJBQTJCLE1BQW9DO0FBQ2xFLFVBQU0sUUFBUSxNQUFNLFNBQVMsS0FBSyxhQUFhLEdBQUcsSUFBSTtBQUN0RCxRQUFJLFVBQVUsTUFBTTtBQUdoQixhQUFPLHFCQUFxQixVQUFVLE1BQU0sbUNBQW1DLEtBQUssVUFBVSxJQUFJO0FBQUEsSUFDdEc7QUFJQSxVQUFNLENBQUMsR0FBRyxnQkFBZ0IsV0FBVyxJQUFJO0FBQ3pDLFFBQUksVUFBaUM7QUFDckMsUUFBSSxlQUFlLFNBQVMsU0FBUyxHQUFHO0FBQ3BDLGdCQUFVLElBQUksaUJBQWlCLFdBQVc7QUFBQSxJQUM5QyxXQUFXLGVBQWUsU0FBUyxPQUFPLEdBQUc7QUFDekMsZ0JBQVUsYUFBYSxxQkFBcUIsV0FBVztBQUN2RCxVQUFJLFlBQVksTUFBTTtBQUNsQixlQUFPLHFCQUFxQjtBQUFBLFVBQ3hCO0FBQUEsVUFDQSx1QkFBdUIsS0FBSyxVQUFVO0FBQUEsUUFDMUM7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUVBLFFBQUksWUFBWSxNQUFNO0FBR2xCLGFBQU8scUJBQXFCLFVBQVUsTUFBTSxtQ0FBbUMsS0FBSyxVQUFVLElBQUk7QUFBQSxJQUN0RztBQUtBLFVBQU0sU0FBUyxlQUFlLE1BQU0sS0FBSyxNQUFNO0FBQy9DLFVBQU0sU0FBUyxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsU0FBUyxNQUFNLEdBQUcsSUFBSSxZQUFZLElBQUksQ0FBQztBQUN0RixXQUFPLHFCQUFxQixXQUFXLE1BQU07QUFBQSxFQUNqRDtBQUFBLEVBS1UsZUFBdUI7QUFDN0IsV0FBTyxLQUFLLHlCQUF5QjtBQUFBLEVBQ3pDO0FBQUEsRUFNVSx3QkFBZ0M7QUFDdEMsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVVLGVBQXVCO0FBQzdCLFdBQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxhQUFhLE9BQU8sS0FBSyxzQkFBc0IsU0FBUztBQUFBLEVBQzFGO0FBQUEsRUFXVSxVQUFVLFNBQXlCLFFBQWlDO0FBQzFFLFdBQU8sQ0FBQyxTQUFlO0FBQ25CLFlBQU0sUUFBUSxRQUFTLFFBQVEsS0FBSyxNQUFNLElBQUksQ0FBQztBQUMvQyxhQUFPLFNBQVMsQ0FBQyxRQUFRO0FBQUEsSUFDN0I7QUFBQSxFQUNKO0FBQUEsRUFTQSxhQUF5QjtBQUNyQixXQUFPLENBQUMsR0FBUyxNQUFZO0FBQ3pCLGFBQU8sS0FBSyxNQUFNLENBQUMsRUFBRSxjQUFjLEtBQUssTUFBTSxDQUFDLEdBQUcsUUFBVyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsSUFDbEY7QUFBQSxFQUNKO0FBQUEsRUFTTyxVQUEyQjtBQUM5QixXQUFPLENBQUMsU0FBZTtBQUNuQixhQUFPLENBQUMsS0FBSyxNQUFNLElBQUksQ0FBQztBQUFBLElBQzVCO0FBQUEsRUFDSjtBQUNKOzs7QUMxR08sSUFBTSxZQUFOLGNBQXdCLFVBQVU7QUFBQSxFQUM5QixZQUFvQjtBQUN2QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBT08sTUFBTSxNQUFvQjtBQUM3QixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBRU8sa0JBQTJCO0FBQzlCLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQ2hCTyxJQUFNLGVBQU4sY0FBMkIsTUFBTTtBQUFBLEVBQ3BDLHVCQUF1QixPQUF3QjtBQUMzQyxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsMkJBQTJCLE1BQW9DO0FBQzNELFdBQU8scUJBQXFCLFVBQVUsTUFBTSwyQ0FBMkM7QUFBQSxFQUMzRjtBQUFBLEVBRUEsWUFBb0I7QUFDaEIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVVLGVBQThCO0FBQ3BDLFVBQU0sTUFBTSxvQ0FBb0MsS0FBSyxVQUFVLEdBQUc7QUFBQSxFQUN0RTtBQUFBLEVBRUEsa0JBQTJCO0FBQ3ZCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFTyxhQUF5QjtBQUM1QixXQUFPLENBQUMsR0FBUyxNQUFZO0FBRXpCLGFBQU8sRUFBRSxVQUFVLEVBQUU7QUFBQSxJQUN6QjtBQUFBLEVBQ0o7QUFDSjs7O0FDNUJPLElBQU0sT0FBTixNQUFXO0FBQUEsRUFDZCxPQUFjLEdBQUcsU0FBbUIsT0FBZTtBQUMvQyxVQUFNLHFCQUFtQztBQUFBLE1BQ3JDLElBQUksYUFBYSxFQUFFLFdBQVc7QUFBQSxNQUM5QixJQUFJLFlBQVksRUFBRSxXQUFXO0FBQUEsTUFDN0IsSUFBSSxhQUFhLEVBQUUsV0FBVztBQUFBLE1BQzlCLElBQUksY0FBYyxFQUFFLFdBQVc7QUFBQSxNQUMvQixJQUFJLFVBQVUsRUFBRSxXQUFXO0FBQUEsSUFDL0I7QUFFQSxVQUFNLGtCQUFnQyxDQUFDO0FBRXZDLGVBQVcsVUFBVSxTQUFTO0FBQzFCLHNCQUFnQixLQUFLLE9BQU8sVUFBVTtBQUFBLElBQzFDO0FBRUEsV0FBTyxNQUFNLEtBQUssS0FBSyx3QkFBd0IsQ0FBQyxHQUFHLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLENBQUM7QUFBQSxFQUMvRjtBQUFBLEVBRUEsT0FBZSx3QkFBd0IsYUFBdUM7QUFDMUUsV0FBTyxDQUFDLEdBQUcsTUFBTTtBQUNiLGlCQUFXLGNBQWMsYUFBYTtBQUNsQyxjQUFNLFNBQVMsV0FBVyxHQUFHLENBQUM7QUFDOUIsWUFBSSxXQUFXLEdBQUc7QUFDZCxpQkFBTztBQUFBLFFBQ1g7QUFBQSxNQUNKO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKO0FBQ0o7OztBQzVCTyxJQUFNLG1CQUFOLGNBQStCLFVBQVU7QUFBQSxFQUNyQyxZQUFvQjtBQUN2QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBU08sTUFBTSxNQUFvQjtBQUk3QixVQUFNLGVBQWUsWUFBWSxFQUFFO0FBQ25DLFdBQU8sS0FBSyxZQUFZLFFBQVEsY0FBYyxFQUFFLEVBQUUsS0FBSztBQUFBLEVBQzNEO0FBQUEsRUFFTyxrQkFBMkI7QUFDOUIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQVVPLGFBQXlCO0FBQzVCLFdBQU8sQ0FBQyxHQUFTLE1BQVk7QUFDekIsWUFBTSxlQUFlLGlCQUFpQixpQkFBaUIsRUFBRSxXQUFXO0FBQ3BFLFlBQU0sZUFBZSxpQkFBaUIsaUJBQWlCLEVBQUUsV0FBVztBQUNwRSxhQUFPLGFBQWEsY0FBYyxjQUFjLFFBQVcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUFBLElBQ2hGO0FBQUEsRUFDSjtBQUFBLEVBUUEsT0FBYyxpQkFBaUIsYUFBNkI7QUFDeEQsVUFBTSxlQUFlLFlBQVksRUFBRTtBQUNuQyxrQkFBYyxZQUFZLFFBQVEsY0FBYyxFQUFFLEVBQUUsS0FBSztBQUV6RCxVQUFNLHNCQUFzQjtBQUM1QixVQUFNLGlCQUFpQixZQUFZLE1BQU0sbUJBQW1CO0FBQzVELFFBQUksbUJBQW1CLE1BQU07QUFDekIsWUFBTSxnQkFBZ0IsZUFBZTtBQUdyQyxvQkFDSSxjQUFjLFVBQVUsY0FBYyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksWUFBWSxRQUFRLHFCQUFxQixFQUFFO0FBQUEsSUFDN0c7QUFFQSxrQkFBYyxLQUFLLGtCQUFrQixhQUFhLGtCQUFrQjtBQUNwRSxrQkFBYyxLQUFLLGtCQUFrQixhQUFhLGNBQWM7QUFDaEUsa0JBQWMsS0FBSyxrQkFBa0IsYUFBYSxjQUFjO0FBQ2hFLGtCQUFjLEtBQUssa0JBQWtCLGFBQWEsY0FBYztBQUNoRSxrQkFBYyxLQUFLLGtCQUFrQixhQUFhLFlBQVk7QUFFOUQsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQU9BLE9BQWUsa0JBQWtCLGFBQXFCLFFBQWdCO0FBQ2xFLFVBQU0sdUJBQXVCLFlBQVksTUFBTSxNQUFNO0FBQ3JELFFBQUkseUJBQXlCLE1BQU07QUFDL0IsWUFBTSxzQkFBc0IscUJBQXFCO0FBQ2pELG9CQUFjLHNCQUFzQixZQUFZLFFBQVEsUUFBUSxFQUFFO0FBQUEsSUFDdEU7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QUN0Rk8sSUFBTSxpQkFBTixjQUE0QixVQUFVO0FBQUEsRUFHL0IsZUFBdUI7QUFDN0IsV0FBTyxlQUFjO0FBQUEsRUFDekI7QUFBQSxFQUNPLFlBQW9CO0FBQ3ZCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFDTyxLQUFLLE1BQTJCO0FBQ25DLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQUEsRUFDVSw2QkFBNkI7QUFDbkMsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQWZPLElBQU0sZ0JBQU47QUFBTSxjQUNlLGFBQWE7OztBQ0hsQyxJQUFNLHVCQUFOLGNBQW1DLDZCQUE2QjtBQUFBLEVBQ25FLGNBQWM7QUFDVixVQUFNO0FBRU4sU0FBSyxTQUFTLElBQUkscUJBQXFCLENBQUMsU0FBUztBQUM3QyxVQUFJLEtBQUssZ0JBQWdCO0FBQUksZUFBTztBQUVwQyxZQUFNLHFCQUFxQixLQUFLLFlBQVksWUFBWSxHQUFHO0FBQzNELFVBQUksdUJBQXVCO0FBQUksZUFBTztBQUd0QyxhQUFPLE9BQU8sS0FBSyxLQUFLLFlBQVksTUFBTSxxQkFBcUIsQ0FBQyxDQUFDO0FBQUEsSUFDckUsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVPLFlBQW9CO0FBQ3ZCLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQ2pCTyxJQUFNLGVBQU4sY0FBMkIsVUFBVTtBQUFBLEVBQ2pDLFlBQW9CO0FBQ3ZCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFPTyxNQUFNLE1BQW9CO0FBQzdCLFFBQUksS0FBSyxpQkFBaUI7QUFDdEIsYUFBTyxLQUFLO0FBQUEsSUFDaEIsT0FBTztBQUNILGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUFBLEVBRUEsa0JBQTJCO0FBQ3ZCLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQ3BCTyxJQUFNLHNCQUFOLGNBQWlDLFVBQVU7QUFBQSxFQUdwQyxlQUF1QjtBQUM3QixXQUFPLG9CQUFtQjtBQUFBLEVBQzlCO0FBQUEsRUFDTyxZQUFvQjtBQUN2QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ08sS0FBSyxNQUEyQjtBQUNuQyxXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBQ1UsNkJBQTZCO0FBQ25DLFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFmTyxJQUFNLHFCQUFOO0FBQU0sbUJBQ2Usa0JBQWtCOzs7QUNEdkMsSUFBTSxrQkFBTixjQUE2QixVQUFVO0FBQUEsRUFHaEMsZUFBdUI7QUFDN0IsV0FBTyxnQkFBZTtBQUFBLEVBQzFCO0FBQUEsRUFDTyxZQUFvQjtBQUN2QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ08sS0FBSyxNQUEyQjtBQUNuQyxXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBQ1UsNkJBQTZCO0FBRW5DLFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFoQk8sSUFBTSxpQkFBTjtBQUFNLGVBQ2UsY0FBYzs7O0FDT25DLElBQU0sb0JBQU4sY0FBK0IsTUFBTTtBQUFBLEVBTXhDLGNBQWM7QUFDVixVQUFNO0FBQ04sU0FBSyxxQkFBcUIsSUFBSSxtQkFBbUI7QUFDakQsU0FBSyxtQkFBbUI7QUFBQSxNQUFJLGtCQUFpQjtBQUFBLE1BQTZCLENBQUMsU0FDdkUsS0FBSyxNQUFNLElBQUksRUFBRSxLQUFLLENBQUMsU0FBUyxTQUFTLElBQUk7QUFBQSxJQUNqRDtBQUNBLFNBQUssbUJBQW1CO0FBQUEsTUFDcEIsa0JBQWlCO0FBQUEsTUFDakIsQ0FBQyxTQUFlLENBQUMsS0FBSyxNQUFNLElBQUksRUFBRSxLQUFLLENBQUMsU0FBUyxTQUFTLElBQUk7QUFBQSxJQUNsRTtBQUFBLEVBQ0o7QUFBQSxFQUVPLHVCQUF1QixNQUF1QjtBQUNqRCxRQUFJLEtBQUssbUJBQW1CLHVCQUF1QixJQUFJLEdBQUc7QUFDdEQsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPLE1BQU0sdUJBQXVCLElBQUk7QUFBQSxFQUM1QztBQUFBLEVBRU8sMkJBQTJCLE1BQW9DO0FBQ2xFLFVBQU0sZUFBZSxLQUFLLG1CQUFtQiwyQkFBMkIsSUFBSTtBQUM1RSxRQUFJLGFBQWEsV0FBVyxRQUFXO0FBQ25DLGFBQU87QUFBQSxJQUNYO0FBRUEsVUFBTSxTQUFTLElBQUkscUJBQXFCLElBQUk7QUFFNUMsVUFBTSxlQUFlLE1BQU0sU0FBUyxLQUFLLGFBQWEsR0FBRyxJQUFJO0FBQzdELFFBQUksaUJBQWlCLE1BQU07QUFDdkIsWUFBTSxhQUFhLFdBQVcsVUFBVSxhQUFhLEVBQUU7QUFDdkQsVUFBSSxDQUFDLFdBQVcsUUFBUSxHQUFHO0FBQ3ZCLGVBQU8sUUFBUTtBQUFBLE1BQ25CLE9BQU87QUFDSCxZQUFJO0FBQ0osWUFBSTtBQUNKLFlBQUksYUFBYSxPQUFPLFVBQVU7QUFDOUIsMkJBQWlCLENBQUMsU0FBZTtBQUM3QixtQkFBTyxLQUFLLE1BQU0sSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTLFFBQVEsS0FBSyxTQUFTLFVBQVUsQ0FBQztBQUFBLFVBQzVFO0FBQ0EscUJBQVcsTUFBTSxhQUFhO0FBQUEsUUFDbEMsV0FBVyxhQUFhLE9BQU8sU0FBUztBQUNwQywyQkFBaUIsQ0FBQyxTQUFlO0FBQzdCLG1CQUFPLEtBQUssTUFBTSxJQUFJLEVBQUUsS0FBSyxDQUFDLFNBQVMsUUFBUSxLQUFLLFFBQVEsVUFBVSxDQUFDO0FBQUEsVUFDM0U7QUFDQSxxQkFBVyxNQUFNLGFBQWE7QUFBQSxRQUNsQyxPQUFPO0FBQ0gsMkJBQWlCLENBQUMsU0FBZTtBQUM3QixtQkFBTyxLQUFLLE1BQU0sSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTLFFBQVEsS0FBSyxPQUFPLFVBQVUsQ0FBQztBQUFBLFVBQzFFO0FBQ0EscUJBQVc7QUFBQSxRQUNmO0FBQ0EsY0FBTSxjQUFjLFVBQVU7QUFBQSxVQUMxQjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFFBQ0o7QUFDQSxlQUFPLFNBQVMsSUFBSSxPQUFPLE1BQU0sZ0JBQWdCLElBQUksWUFBWSxXQUFXLENBQUM7QUFBQSxNQUNqRjtBQUFBLElBQ0osT0FBTztBQUNILGFBQU8sUUFBUTtBQUFBLElBQ25CO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQVNPLGFBQWEsTUFBMkI7QUFDM0MsVUFBTSxlQUFlLElBQUksa0JBQWlCLEVBQUUsTUFBTSxJQUFJO0FBQ3RELFVBQU0scUJBQXFCLGFBQWEsS0FBSyxhQUFhO0FBQzFELFdBQU8sbUJBQW1CO0FBQUEsRUFDOUI7QUFBQSxFQUVVLGVBQXVCO0FBQzdCLFdBQU8sa0JBQWlCO0FBQUEsRUFDNUI7QUFBQSxFQUtPLE1BQU0sTUFBK0I7QUFDeEMsV0FBTyxNQUFNLEdBQUcsS0FBSyxXQUFXLEtBQUssZUFBZSxLQUFLLE9BQU87QUFBQSxFQUNwRTtBQUFBLEVBRU8sWUFBb0I7QUFDdkIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVPLGtCQUEyQjtBQUM5QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBS08sYUFBeUI7QUFDNUIsV0FBTyxDQUFDLEdBQVMsTUFBWTtBQUN6QixhQUFPLGNBQWMsS0FBSyxhQUFhLENBQUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxDQUFDO0FBQUEsSUFDbkU7QUFBQSxFQUNKO0FBQ0o7QUEvR08sSUFBTSxtQkFBTjtBQUFNLGlCQUNlLGdCQUFnQjtBQUQvQixpQkFFZSw4QkFBOEI7QUFGN0MsaUJBR2UsNkJBQTZCOzs7QUNoQmxELElBQU0saUJBQU4sY0FBNkIsNkJBQTZCO0FBQUEsRUFDN0QsY0FBYztBQUNWLFVBQU07QUFDTixTQUFLLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLEtBQUssZUFBZSxJQUFJO0FBQ3BFLFNBQUssU0FBUyxJQUFJLG9CQUFvQixDQUFDLFNBQVMsS0FBSyxlQUFlLElBQUk7QUFBQSxFQUM1RTtBQUFBLEVBRU8sWUFBb0I7QUFDdkIsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDRk8sSUFBZSxpQkFBZixjQUFzQyxVQUFVO0FBQUEsRUFVekMsa0JBQTBCO0FBQ2hDLFdBQU8sS0FBSyxrQkFBa0IsSUFBSTtBQUFBLEVBQ3RDO0FBQUEsRUFFTyxZQUFvQjtBQUN2QixXQUFPLEdBQUcsS0FBSyxrQkFBa0IsS0FBSyxLQUFLLGdCQUFnQjtBQUFBLEVBQy9EO0FBQUEsRUFFVSxlQUF1QjtBQUM3QixXQUFPLEdBQUcsS0FBSyxrQkFBa0IsS0FBSyxLQUFLLGdCQUFnQjtBQUFBLEVBQy9EO0FBQUEsRUFFVSx3QkFBZ0M7QUFDdEMsV0FBTyxHQUFHLE1BQU0sc0JBQXNCO0FBQUEsRUFDMUM7QUFBQSxFQVFPLE1BQU0sTUFBb0I7QUFDN0IsV0FBTyxLQUFLLE9BQU8sSUFBSSxFQUFFLEtBQUssSUFBSTtBQUFBLEVBQ3RDO0FBQUEsRUFVVSxVQUFVLFNBQXlCLFFBQWlDO0FBQzFFLFdBQU8sQ0FBQyxTQUFlO0FBQ25CLFlBQU0sUUFBUSxRQUFTLGFBQWEsS0FBSyxPQUFPLElBQUksQ0FBQztBQUNyRCxhQUFPLFNBQVMsQ0FBQyxRQUFRO0FBQUEsSUFDN0I7QUFBQSxFQUNKO0FBQ0o7OztBQ2xETyxJQUFNLFlBQU4sY0FBd0IsZUFBZTtBQUFBLEVBS25DLG9CQUE0QjtBQUMvQixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRU8sT0FBTyxNQUFzQjtBQUNoQyxXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBTU8sa0JBQTJCO0FBQzlCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFNTyxxQkFBcUIsTUFBNkI7QUFDckQsVUFBTSxRQUFRLEtBQUssTUFBTSxLQUFLLGFBQWEsQ0FBQztBQUM1QyxRQUFJLFVBQVUsTUFBTTtBQUNoQixhQUFPO0FBQUEsSUFDWDtBQUVBLFVBQU0sVUFBVSxDQUFDLENBQUMsTUFBTTtBQUN4QixVQUFNLG1CQUFtQixNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU07QUFDdkQsVUFBTSxhQUFhLFVBQVUsMkJBQTJCLGdCQUFnQjtBQUN4RSxXQUFPLElBQUksT0FBTyxLQUFLLGtCQUFrQixHQUFHLFlBQVksT0FBTztBQUFBLEVBQ25FO0FBQUEsRUFTVSxlQUF1QjtBQUM3QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBS08sYUFBeUI7QUFDNUIsV0FBTyxVQUFVLDJCQUEyQixDQUFDO0FBQUEsRUFDakQ7QUFBQSxFQUVBLE9BQWUsMkJBQTJCLGtCQUFzQztBQUM1RSxXQUFPLENBQUMsR0FBUyxNQUFZO0FBRXpCLFVBQUksRUFBRSxLQUFLLFdBQVcsS0FBSyxFQUFFLEtBQUssV0FBVyxHQUFHO0FBQzVDLGVBQU87QUFBQSxNQUNYLFdBQVcsRUFBRSxLQUFLLFdBQVcsR0FBRztBQUU1QixlQUFPO0FBQUEsTUFDWCxXQUFXLEVBQUUsS0FBSyxXQUFXLEdBQUc7QUFFNUIsZUFBTztBQUFBLE1BQ1g7QUFHQSxZQUFNLHNCQUFzQixtQkFBbUI7QUFFL0MsVUFBSSxFQUFFLEtBQUssU0FBUyxvQkFBb0IsRUFBRSxLQUFLLFVBQVUsa0JBQWtCO0FBQ3ZFLGVBQU87QUFBQSxNQUNYLFdBQVcsRUFBRSxLQUFLLFNBQVMsb0JBQW9CLEVBQUUsS0FBSyxVQUFVLGtCQUFrQjtBQUM5RSxlQUFPO0FBQUEsTUFDWCxXQUFXLEVBQUUsS0FBSyxTQUFTLG9CQUFvQixFQUFFLEtBQUssU0FBUyxrQkFBa0I7QUFDN0UsZUFBTztBQUFBLE1BQ1g7QUFFQSxZQUFNLE9BQU8sRUFBRSxLQUFLO0FBQ3BCLFlBQU0sT0FBTyxFQUFFLEtBQUs7QUFDcEIsYUFBTyxLQUFLLGNBQWMsTUFBTSxRQUFXLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFBQSxJQUNoRTtBQUFBLEVBQ0o7QUFDSjs7O0FDOUZBLHFCQUFtQztBQXdCNUIsSUFBTSxlQUFOLGNBQTJCLE1BQU07QUFBQSxFQUFqQztBQUFBO0FBR0gsU0FBaUIscUJBQXFCO0FBQ3RDLFNBQWlCLHFCQUFxQixDQUFDLE9BQU8sTUFBTSxPQUFPLEtBQUs7QUFDaEUsU0FBUSxZQUFvQyxDQUFDO0FBQUE7QUFBQSxFQUVuQyxlQUF1QjtBQUM3QixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBRU8sMkJBQTJCLE1BQW9DO0FBQ2xFLFdBQU8sS0FBSyxVQUFVLElBQUk7QUFBQSxFQUM5QjtBQUFBLEVBRU8sWUFBb0I7QUFDdkIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQVdRLFVBQVUsTUFBb0M7QUFDbEQsVUFBTSxTQUFTLElBQUkscUJBQXFCLElBQUk7QUFDNUMsUUFBSSxLQUFLLFdBQVcsR0FBRztBQUNuQixhQUFPLFFBQVE7QUFDZixhQUFPO0FBQUEsSUFDWDtBQUNBLFVBQU0sZUFBZSxLQUFLLHFCQUFxQixJQUFJO0FBQ25ELFFBQUk7QUFFQSxZQUFNLHdCQUFvQixlQUFBQyxPQUFVLFlBQVk7QUFHaEQsaUJBQVcsU0FBUyxtQkFBbUI7QUFDbkMsWUFBSSxNQUFNLFNBQVMsZ0JBQWdCLE1BQU0sT0FBTztBQUM1QyxnQkFBTSxhQUFhLE1BQU0sTUFBTSxLQUFLO0FBQ3BDLGNBQUksRUFBRSxjQUFjLEtBQUssWUFBWTtBQUNqQyxrQkFBTSxjQUFjLFlBQVksVUFBVTtBQUMxQyxnQkFBSSxnQkFBZ0IsTUFBTTtBQUN0QixxQkFBTyxRQUFRLGtDQUFrQztBQUNqRCxxQkFBTztBQUFBLFlBQ1g7QUFDQSxnQkFBSSxZQUFZLE9BQU87QUFDbkIscUJBQU8sUUFBUSxrQ0FBa0MsZ0JBQWdCLFlBQVk7QUFDN0UscUJBQU87QUFBQSxZQUNYLFdBQVcsWUFBWSxRQUFRO0FBQzNCLG1CQUFLLFVBQVUsY0FBYyxZQUFZO0FBQUEsWUFDN0M7QUFBQSxVQUNKO0FBQUEsUUFDSixXQUFXLE1BQU0sU0FBUyxZQUFZO0FBS2xDLGNBQUksTUFBTSxTQUFTLFFBQVc7QUFDMUIsbUJBQU8sUUFBUTtBQUNmLG1CQUFPO0FBQUEsVUFDWDtBQUNBLGNBQUksQ0FBQyxLQUFLLG1CQUFtQixTQUFTLE1BQU0sS0FBSyxHQUFHO0FBQ2hELG1CQUFPLFFBQVEsNkJBQTZCLE1BQU07QUFDbEQsbUJBQU87QUFBQSxVQUNYO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFFQSxZQUFNLGlCQUFpQixDQUFDLFNBQWU7QUFDbkMsZUFBTyxLQUFLLDBCQUEwQixNQUFNLGlCQUFpQjtBQUFBLE1BQ2pFO0FBQ0EsWUFBTSxjQUFjLEtBQUsscUJBQXFCLGlCQUFpQjtBQUMvRCxhQUFPLFNBQVMsSUFBSSxPQUFPLE1BQU0sZ0JBQWdCLFdBQVc7QUFDNUQsYUFBTztBQUFBLElBQ1gsU0FBUyxPQUFQO0FBQ0UsWUFBTSxVQUFVLGlCQUFpQixRQUFRLE1BQU0sVUFBVTtBQUN6RCxhQUFPLFFBQVEsOEJBQThCO0FBQzdDLGFBQU87QUFBQSxJQUNYO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVRLHFCQUFxQixNQUFzQjtBQUkvQyxXQUFPLEtBQUssUUFBUSxpQkFBaUIsUUFBUTtBQUFBLEVBQ2pEO0FBQUEsRUFTUSwwQkFBMEIsTUFBWSxtQkFBK0M7QUFDekYsVUFBTSxTQUFTLENBQUMsTUFBMEI7QUFDdEMsYUFBTyxNQUFNO0FBQUEsSUFDakI7QUFDQSxVQUFNLFdBQVcsQ0FBQyxNQUFlO0FBQzdCLGFBQU8sSUFBSSxTQUFTO0FBQUEsSUFDeEI7QUFDQSxVQUFNLGVBQXlCLENBQUM7QUFDaEMsZUFBVyxTQUFTLG1CQUFtQjtBQUNuQyxVQUFJLE1BQU0sU0FBUyxjQUFjO0FBSTdCLFlBQUksTUFBTSxTQUFTO0FBQU0sZ0JBQU0sTUFBTSxrQkFBa0I7QUFDdkQsY0FBTSxTQUFTLEtBQUssVUFBVSxNQUFNLE1BQU0sS0FBSztBQUMvQyxjQUFNLFNBQVMsT0FBTyxlQUFlLElBQUk7QUFDekMscUJBQWEsS0FBSyxTQUFTLE1BQU0sQ0FBQztBQUFBLE1BQ3RDLFdBQVcsTUFBTSxTQUFTLFlBQVk7QUFHbEMsWUFBSSxNQUFNLFVBQVUsT0FBTztBQUN2QixnQkFBTSxPQUFPLE9BQU8sYUFBYSxJQUFJLENBQUM7QUFDdEMsdUJBQWEsS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQUEsUUFDckMsV0FBVyxNQUFNLFVBQVUsTUFBTTtBQUM3QixnQkFBTSxPQUFPLE9BQU8sYUFBYSxJQUFJLENBQUM7QUFDdEMsZ0JBQU0sT0FBTyxPQUFPLGFBQWEsSUFBSSxDQUFDO0FBQ3RDLHVCQUFhLEtBQUssU0FBUyxRQUFRLElBQUksQ0FBQztBQUFBLFFBQzVDLFdBQVcsTUFBTSxVQUFVLE9BQU87QUFDOUIsZ0JBQU0sT0FBTyxPQUFPLGFBQWEsSUFBSSxDQUFDO0FBQ3RDLGdCQUFNLE9BQU8sT0FBTyxhQUFhLElBQUksQ0FBQztBQUN0Qyx1QkFBYSxLQUFLLFNBQVMsUUFBUSxJQUFJLENBQUM7QUFBQSxRQUM1QyxXQUFXLE1BQU0sVUFBVSxPQUFPO0FBQzlCLGdCQUFNLE9BQU8sT0FBTyxhQUFhLElBQUksQ0FBQztBQUN0QyxnQkFBTSxPQUFPLE9BQU8sYUFBYSxJQUFJLENBQUM7QUFDdEMsdUJBQWEsS0FBSyxTQUFVLFFBQVEsQ0FBQyxRQUFVLENBQUMsUUFBUSxJQUFLLENBQUM7QUFBQSxRQUNsRSxPQUFPO0FBQ0gsZ0JBQU0sTUFBTSwyQkFBMkIsTUFBTSxLQUFLO0FBQUEsUUFDdEQ7QUFBQSxNQUNKLE9BQU87QUFDSCxjQUFNLE1BQU0sNkJBQTZCLEtBQUs7QUFBQSxNQUNsRDtBQUFBLElBQ0o7QUFFQSxXQUFPLE9BQU8sYUFBYSxFQUFFO0FBQUEsRUFDakM7QUFBQSxFQU9RLHFCQUFxQixtQkFBbUQ7QUFFNUUsVUFBTSxtQkFBa0MsQ0FBQztBQUN6QyxlQUFXLFNBQVMsbUJBQW1CO0FBQ25DLFVBQUksTUFBTSxTQUFTLGNBQWM7QUFDN0IsWUFBSSxNQUFNLFNBQVM7QUFBTSxnQkFBTSxNQUFNLGtCQUFrQjtBQUN2RCxjQUFNLFNBQVMsS0FBSyxVQUFVLE1BQU0sTUFBTSxLQUFLO0FBQy9DLHlCQUFpQixLQUFLLE9BQU8sV0FBVztBQUFBLE1BQzVDLFdBQVcsTUFBTSxTQUFTLFlBQVk7QUFHbEMsWUFBSSxNQUFNLFVBQVUsT0FBTztBQUN2QixnQkFBTSxPQUFPLGlCQUFpQixJQUFJO0FBQ2xDLDJCQUFpQixLQUFLLFlBQVksV0FBVyxDQUFDLElBQUssQ0FBQyxDQUFDO0FBQUEsUUFDekQsV0FBVyxNQUFNLFVBQVUsTUFBTTtBQUM3QixnQkFBTSxPQUFPLGlCQUFpQixJQUFJO0FBQ2xDLGdCQUFNLE9BQU8saUJBQWlCLElBQUk7QUFDbEMsMkJBQWlCLEtBQUssWUFBWSxVQUFVLENBQUMsTUFBTyxJQUFLLENBQUMsQ0FBQztBQUFBLFFBQy9ELFdBQVcsTUFBTSxVQUFVLE9BQU87QUFDOUIsZ0JBQU0sT0FBTyxpQkFBaUIsSUFBSTtBQUNsQyxnQkFBTSxPQUFPLGlCQUFpQixJQUFJO0FBQ2xDLDJCQUFpQixLQUFLLFlBQVksV0FBVyxDQUFDLE1BQU8sSUFBSyxDQUFDLENBQUM7QUFBQSxRQUNoRSxXQUFXLE1BQU0sVUFBVSxPQUFPO0FBQzlCLGdCQUFNLE9BQU8saUJBQWlCLElBQUk7QUFDbEMsZ0JBQU0sT0FBTyxpQkFBaUIsSUFBSTtBQUNsQywyQkFBaUIsS0FBSyxZQUFZLFdBQVcsQ0FBQyxNQUFPLElBQUssQ0FBQyxDQUFDO0FBQUEsUUFDaEUsT0FBTztBQUNILGdCQUFNLE1BQU0sMkJBQTJCLE1BQU0sS0FBSztBQUFBLFFBQ3REO0FBQUEsTUFDSixPQUFPO0FBQ0gsY0FBTSxNQUFNLDZCQUE2QixLQUFLO0FBQUEsTUFDbEQ7QUFBQSxJQUNKO0FBRUEsV0FBTyxpQkFBaUI7QUFBQSxFQUM1QjtBQUNKOzs7QUMxTU8sSUFBTSxnQkFBTixjQUE0QixVQUFVO0FBQUEsRUFDbEMsWUFBb0I7QUFDdkIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQU9PLE1BQU0sTUFBb0I7QUFDN0IsVUFBTSxXQUFXLEtBQUs7QUFDdEIsUUFBSSxhQUFhLE1BQU07QUFDbkIsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPLFdBQVc7QUFBQSxFQUN0QjtBQUFBLEVBRUEsa0JBQTJCO0FBQ3ZCLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQ3hCTyxJQUFNLGtCQUFOLGNBQThCLFVBQVU7QUFBQSxFQUMzQyxjQUFjO0FBQ1YsVUFBTTtBQUFBLEVBQ1Y7QUFBQSxFQUVPLFlBQW9CO0FBQ3ZCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxNQUFNLE1BQW9CO0FBQ3RCLFdBQU8sS0FBSyxPQUFPO0FBQUEsRUFDdkI7QUFBQSxFQUVBLGtCQUEyQjtBQUN2QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRU8sbUJBQTRCO0FBQy9CLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQ2RPLElBQU0sa0JBQU4sY0FBOEIsTUFBTTtBQUFBLEVBSWhDLHVCQUF1QixNQUF1QjtBQUdqRCxVQUFNLGdCQUFnQixJQUFJLE9BQU8sT0FBTyxLQUFLLHlCQUF5QixJQUFJO0FBQzFFLFdBQU8sTUFBTSxrQkFBa0IsZUFBZSxJQUFJO0FBQUEsRUFDdEQ7QUFBQSxFQUVBLDJCQUEyQixNQUFvQztBQUMzRCxVQUFNLFFBQVEsTUFBTSxTQUFTLEtBQUssYUFBYSxHQUFHLElBQUk7QUFDdEQsUUFBSSxVQUFVLE1BQU07QUFFaEIsYUFBTyxLQUFLLFlBQVksSUFBSTtBQUFBLElBQ2hDO0FBRUEsVUFBTSxDQUFDLEdBQUcsZ0JBQWdCLGtCQUFrQixJQUFJO0FBRWhELFVBQU0sb0JBQW9CLFdBQVcsbUJBQW1CLFlBQVk7QUFDcEUsUUFBSSxDQUFDLG1CQUFtQjtBQUNwQixhQUFPLEtBQUssWUFBWSxJQUFJO0FBQUEsSUFDaEM7QUFFQSxRQUFJO0FBRUosWUFBUTtBQUFBLFdBQ0M7QUFDRCx5QkFBaUIsQ0FBQyxTQUFlO0FBQzdCLGlCQUFPLEtBQUssT0FBTyxTQUFTO0FBQUEsUUFDaEM7QUFDQTtBQUFBLFdBQ0M7QUFDRCx5QkFBaUIsQ0FBQyxTQUFlO0FBQzdCLGlCQUFPLEtBQUssT0FBTyxTQUFTO0FBQUEsUUFDaEM7QUFDQTtBQUFBO0FBRUEsZUFBTyxLQUFLLFlBQVksSUFBSTtBQUFBO0FBR3BDLFdBQU8scUJBQXFCLFdBQVcsSUFBSSxPQUFPLE1BQU0sZ0JBQWdCLElBQUksWUFBWSxJQUFJLENBQUMsQ0FBQztBQUFBLEVBQ2xHO0FBQUEsRUFFVSxlQUE4QjtBQUNwQyxXQUFPLElBQUksT0FBTyxPQUFPLEtBQUsseUJBQXlCLHlCQUF5QjtBQUFBLEVBQ3BGO0FBQUEsRUFFUSxZQUFZLE1BQW9DO0FBQ3BELFVBQU0sZUFBZSxPQUFPLE9BQU8sVUFBVSxFQUN4QyxPQUFPLENBQUMsTUFBTSx5QkFBc0IsRUFDcEMsS0FBSyxHQUFHO0FBRWIsVUFBTSxVQUFVLFdBQVcsS0FBSyxrQkFBa0IsbUJBQW1CO0FBQUE7QUFBQSx1QkFFdEQ7QUFBQTtBQUFBO0FBQUEsdUJBR0EsS0FBSyxrQkFBa0I7QUFDdEMsV0FBTyxxQkFBcUIsVUFBVSxNQUFNLE9BQU87QUFBQSxFQUN2RDtBQUFBLEVBRU8sWUFBb0I7QUFDdkIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLE1BQU0sTUFBb0I7QUFDdEIsV0FBTyxLQUFLLE9BQU87QUFBQSxFQUN2QjtBQUFBLEVBTUEsa0JBQTJCO0FBQ3ZCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxhQUF5QjtBQUNyQixXQUFPLENBQUMsR0FBUyxNQUFZO0FBQ3pCLFlBQU0sT0FBTyxnQkFBZ0IsVUFBVSxDQUFDO0FBQ3hDLFlBQU0sT0FBTyxnQkFBZ0IsVUFBVSxDQUFDO0FBQ3hDLGFBQU8sS0FBSyxjQUFjLE1BQU0sUUFBVyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsSUFDaEU7QUFBQSxFQUNKO0FBQUEsRUFNTyxtQkFBNEI7QUFDL0IsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVPLFVBQTJCO0FBQzlCLFdBQU8sQ0FBQyxTQUFlO0FBQ25CLGFBQU8sQ0FBQyxnQkFBZ0IsVUFBVSxJQUFJLENBQUM7QUFBQSxJQUMzQztBQUFBLEVBQ0o7QUFBQSxFQUVBLE9BQWUsVUFBVSxNQUFZO0FBQ2pDLFFBQUk7QUFFSixZQUFRLEtBQUssT0FBTztBQUFBO0FBRVosaUJBQVM7QUFDVDtBQUFBO0FBRUEsaUJBQVM7QUFDVDtBQUFBO0FBRUEsaUJBQVM7QUFDVDtBQUFBO0FBRUEsaUJBQVM7QUFDVDtBQUFBO0FBRUEsaUJBQVM7QUFDVDtBQUFBO0FBRUEsaUJBQVM7QUFDVDtBQUFBO0FBRVIsV0FBTyxTQUFTLE1BQU0sS0FBSyxPQUFPO0FBQUEsRUFDdEM7QUFDSjs7O0FDdklPLElBQU0sa0JBQU4sY0FBOEIsVUFBVTtBQUFBLEVBQzNDLFlBQW9CO0FBQ2hCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxNQUFNLE1BQW9CO0FBQ3RCLFFBQUksS0FBSyxlQUFlLE1BQU07QUFDMUIsYUFBTyxLQUFLLFdBQVksT0FBTztBQUFBLElBQ25DLE9BQU87QUFDSCxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFDSjs7O0FDU0EsSUFBTSxnQkFBZ0I7QUFBQSxFQUNsQixNQUFNLElBQUksZ0JBQWdCO0FBQUEsRUFDMUIsTUFBTSxJQUFJLGdCQUFnQjtBQUFBLEVBQzFCLE1BQU0sSUFBSSxZQUFZO0FBQUEsRUFDdEIsTUFBTSxJQUFJLGVBQWU7QUFBQSxFQUN6QixNQUFNLElBQUksY0FBYztBQUFBLEVBQ3hCLE1BQU0sSUFBSSxpQkFBaUI7QUFBQSxFQUMzQixNQUFNLElBQUksZUFBZTtBQUFBLEVBQ3pCLE1BQU0sSUFBSSxtQkFBbUI7QUFBQSxFQUM3QixNQUFNLElBQUksYUFBYTtBQUFBLEVBQ3ZCLE1BQU0sSUFBSSxjQUFjO0FBQUEsRUFDeEIsTUFBTSxJQUFJLFVBQVU7QUFBQSxFQUNwQixNQUFNLElBQUksaUJBQWlCO0FBQUEsRUFDM0IsTUFBTSxJQUFJLFVBQVU7QUFBQSxFQUNwQixNQUFNLElBQUksYUFBYTtBQUFBLEVBQ3ZCLE1BQU0sSUFBSSxxQkFBcUI7QUFBQSxFQUMvQixNQUFNLElBQUksYUFBYTtBQUFBLEVBQ3ZCLE1BQU0sSUFBSSxjQUFjO0FBQUEsRUFDeEIsTUFBTSxJQUFJLGFBQWE7QUFBQSxFQUN2QixNQUFNLElBQUksZ0JBQWdCO0FBQzlCO0FBRU8sU0FBUyxZQUFZLGNBQW1EO0FBQzNFLGFBQVcsV0FBVyxlQUFlO0FBQ2pDLFVBQU0sUUFBUSxRQUFRO0FBQ3RCLFFBQUksTUFBTSx1QkFBdUIsWUFBWTtBQUFHLGFBQU8sTUFBTSwyQkFBMkIsWUFBWTtBQUFBLEVBQ3hHO0FBQ0EsU0FBTztBQUNYO0FBRU8sU0FBUyxZQUFZLGNBQXFDO0FBSTdELFFBQU0sZUFBZTtBQUNyQixNQUFJLGFBQWEsTUFBTSxZQUFZLE1BQU0sTUFBTTtBQUMzQyxXQUFPO0FBQUEsRUFDWDtBQUdBLGFBQVcsV0FBVyxlQUFlO0FBQ2pDLFVBQU0sUUFBUSxRQUFRO0FBQ3RCLFVBQU0sU0FBUyxNQUFNLGNBQWMsWUFBWTtBQUMvQyxRQUFJLFFBQVE7QUFDUixhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFDQSxTQUFPO0FBQ1g7QUFFTyxTQUFTLGFBQWEsTUFBOEI7QUFJdkQsUUFBTSxnQkFBZ0I7QUFDdEIsTUFBSSxLQUFLLE1BQU0sYUFBYSxNQUFNLE1BQU07QUFDcEMsV0FBTztBQUFBLEVBQ1g7QUFHQSxhQUFXLFdBQVcsZUFBZTtBQUNqQyxVQUFNLFFBQVEsUUFBUTtBQUN0QixVQUFNLFlBQVksTUFBTSxrQkFBa0I7QUFDMUMsUUFBSSxTQUFTLFlBQVksYUFBYTtBQUNsQyxVQUFJLE1BQU0saUJBQWlCLEdBQUc7QUFDMUIsZUFBTyxNQUFNLGNBQWM7QUFBQSxNQUMvQjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsU0FBTztBQUNYOzs7QUMzRk8sSUFBTSxlQUFOLE1BQW1CO0FBQUEsRUFrQnRCLFlBQVksY0FBc0IsTUFBYztBQUM1QyxTQUFLLGVBQWU7QUFDcEIsU0FBSyxPQUFPO0FBQUEsRUFDaEI7QUFDSjs7O0FDeURPLElBQU0sZ0JBQU4sTUFBb0I7QUFBQSxFQUd2QixZQUFZLGNBQTZDO0FBRnpELFNBQVEscUJBQXFCLElBQUksTUFBYztBQUczQyxVQUFNLGFBQWEsYUFBYSxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQzlDLFVBQU0sYUFBYSxXQUFXO0FBQzlCLGFBQVMsSUFBSSxHQUFHLElBQUksWUFBWSxLQUFLO0FBQ2pDLFdBQUssbUJBQW1CLEtBQUssRUFBRTtBQUFBLElBQ25DO0FBQUEsRUFDSjtBQUFBLEVBU0Esd0JBQXdCLFlBQXNDO0FBRTFELFVBQU0sbUJBQW1CLElBQUksTUFBb0I7QUFDakQsYUFBUyxRQUFRLEdBQUcsUUFBUSxXQUFXLFFBQVEsU0FBUztBQUNwRCxZQUFNLFFBQVEsV0FBVztBQUN6QixVQUFJLFNBQVMsS0FBSyxtQkFBbUIsUUFBUTtBQUN6Qyx5QkFBaUIsS0FBSyxJQUFJLGFBQWEsT0FBTyxLQUFLLENBQUM7QUFFcEQsaUJBQVMsSUFBSSxPQUFPLElBQUksV0FBVyxRQUFRLEtBQUs7QUFDNUMsZUFBSyxtQkFBbUIsS0FBSztBQUFBLFFBQ2pDO0FBQ0EsYUFBSyxtQkFBbUIsU0FBUztBQUFBLE1BQ3JDO0FBQUEsSUFDSjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQzlHTyxJQUFNLG1CQUFOLE1BQTBCO0FBQUEsRUFJN0IsWUFBWSxRQUFhO0FBSHpCLG9CQUE2QyxvQkFBSSxJQUFJO0FBQ3JELGtCQUFjLENBQUM7QUFHWCxTQUFLLFNBQVM7QUFBQSxFQUNsQjtBQUFBLEVBUUEsaUJBQWlCLFlBQXNCLENBQUMsR0FBdUI7QUFDM0QsVUFBTSxZQUFZLG9CQUFJLElBQUk7QUFDMUIsUUFBSSxLQUFLLFNBQVMsUUFBUSxHQUFHO0FBR3pCLGdCQUFVLElBQUksQ0FBQyxHQUFHLFNBQVMsR0FBRyxLQUFLLE1BQU07QUFDekMsYUFBTztBQUFBLElBQ1g7QUFFQSxlQUFXLENBQUMsVUFBVSxLQUFLLEtBQUssS0FBSyxVQUFVO0FBQzNDLGdCQUFVLEtBQUssUUFBUTtBQUN2QixZQUFNLGNBQWMsTUFBTSxpQkFBaUIsU0FBUztBQUNwRCxrQkFBWSxRQUFRLENBQUMsT0FBTyxRQUFRLFVBQVUsSUFBSSxLQUFLLEtBQUssQ0FBQztBQUM3RCxnQkFBVSxJQUFJO0FBQUEsSUFDbEI7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QUN6Qk8sSUFBTSxnQ0FBTixjQUE0QyxJQUFzQjtBQUFDO0FBeUIxRSxJQUFNLHVCQUFOLGNBQW1DLGlCQUF1QjtBQUFDO0FBYXBELElBQU0seUJBQU4sTUFBNkI7QUFBQSxFQVFoQyxZQUFZLFdBQXNCLE9BQWU7QUFQakQsU0FBTyxTQUFTLElBQUksOEJBQThCO0FBUTlDLFVBQU0sT0FBTyxLQUFLLGtCQUFrQixXQUFXLEtBQUs7QUFDcEQsU0FBSyxTQUFTLEtBQUssaUJBQWlCO0FBQ3BDLFNBQUssU0FBUyxLQUFLLGdCQUFnQjtBQUFBLEVBQ3ZDO0FBQUEsRUFLUSxrQkFBa0IsV0FBc0IsT0FBcUM7QUFNakYsVUFBTSxPQUFPLElBQUkscUJBQXFCLEtBQUs7QUFFM0MsUUFBSSxtQkFBbUIsQ0FBQyxJQUFJO0FBQzVCLGVBQVcsWUFBWSxXQUFXO0FBQzlCLFlBQU0sZ0JBQWdCLENBQUM7QUFDdkIsaUJBQVcsbUJBQW1CLGtCQUFrQjtBQUM1QyxtQkFBVyxRQUFRLGdCQUFnQixRQUFRO0FBQ3ZDLGdCQUFNLGFBQWEsTUFBTSxxQkFBcUIsVUFBVSxJQUFJO0FBQzVELHFCQUFXLGFBQWEsWUFBWTtBQUNoQyxnQkFBSSxRQUFRLGdCQUFnQixTQUFTLElBQUksU0FBUztBQUNsRCxnQkFBSSxVQUFVLFFBQVc7QUFDckIsc0JBQVEsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDO0FBQ25DLDhCQUFnQixTQUFTLElBQUksV0FBVyxLQUFLO0FBQzdDLDRCQUFjLEtBQUssS0FBSztBQUFBLFlBQzVCO0FBQ0Esa0JBQU0sT0FBTyxLQUFLLElBQUk7QUFBQSxVQUMxQjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQ0EseUJBQW1CO0FBQUEsSUFDdkI7QUFFQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRVEsa0JBQWtCO0FBSXRCLFdBQU8sSUFBSSw4QkFBOEIsQ0FBQyxHQUFHLEtBQUssT0FBTyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUM7QUFBQSxFQUM5RTtBQUNKOzs7QUN0Rk8sSUFBTSxZQUFOLE1BQWdCO0FBQUEsRUErQm5CLFlBQVksUUFBa0IsZUFBK0IsT0FBZTtBQUN4RSxTQUFLLFNBQVM7QUFDZCxTQUFLLGdCQUFnQjtBQUNyQixTQUFLLFFBQVE7QUFBQSxFQUNqQjtBQUFBLEVBT08sdUJBQStCO0FBQ2xDLFFBQUksU0FBUztBQUNiLGVBQVcsUUFBUSxLQUFLLE9BQU87QUFDM0IsZ0JBQVUsS0FBSyxpQkFBaUIsSUFBSTtBQUFBLElBQ3hDO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQVNPLFdBQW1CO0FBQ3RCLFFBQUksU0FBUztBQUNiLGNBQVUsaUJBQWlCLEtBQUs7QUFBQTtBQUVoQyxlQUFXLFdBQVcsS0FBSyxlQUFlO0FBR3RDLFlBQU0sZ0JBQWdCLElBQUksT0FBTyxJQUFJLFFBQVEsWUFBWTtBQUN6RCxnQkFBVSxHQUFHLGlCQUFpQixRQUFRO0FBQUE7QUFBQSxJQUMxQztBQUVBLGNBQVUsS0FBSyxxQkFBcUI7QUFDcEMsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDL0VPLElBQU0sYUFBTixNQUFpQjtBQUFBLEVBV3BCLFlBQVksUUFBbUIsT0FBZTtBQVY5QyxTQUFRLFVBQXVCLElBQUksTUFBaUI7QUFDcEQsU0FBUSxrQkFBa0I7QUFZdEIsU0FBSyxrQkFBa0IsTUFBTTtBQUU3QixVQUFNLGdCQUFnQixJQUFJLHVCQUF1QixRQUFRLEtBQUs7QUFDOUQsU0FBSyxTQUFTLGFBQWE7QUFBQSxFQUMvQjtBQUFBLEVBTUEsSUFBVyxTQUFzQjtBQUM3QixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBS08sa0JBQWtCO0FBQ3JCLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQUEsRUFRTyxXQUFtQjtBQUN0QixRQUFJLFNBQVM7QUFDYixlQUFXLGFBQWEsS0FBSyxRQUFRO0FBQ2pDLGdCQUFVLFVBQVUsU0FBUztBQUM3QixnQkFBVTtBQUFBLElBQ2Q7QUFDQSxVQUFNLGtCQUFrQixLQUFLLGdCQUFnQjtBQUM3QyxjQUFVO0FBQUEsRUFBSztBQUFBO0FBQ2YsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVRLFNBQVMsZUFBdUM7QUFFcEQsVUFBTSxVQUFVLElBQUksY0FBYyxjQUFjLE1BQU07QUFHdEQsZUFBVyxDQUFDLFFBQVEsS0FBSyxLQUFLLGNBQWMsUUFBUTtBQUNoRCxZQUFNLGdCQUFnQixRQUFRLHdCQUF3QixNQUFNO0FBQzVELFlBQU0sWUFBWSxJQUFJLFVBQVUsUUFBUSxlQUFlLEtBQUs7QUFDNUQsV0FBSyxJQUFJLFNBQVM7QUFBQSxJQUN0QjtBQUFBLEVBQ0o7QUFBQSxFQUVRLElBQUksV0FBc0I7QUFDOUIsU0FBSyxRQUFRLEtBQUssU0FBUztBQUFBLEVBQy9CO0FBQ0o7OztBQ25FTyxJQUFNLFNBQU4sTUFBWTtBQUFBLEVBR2YsT0FBYyxxQkFBcUIsVUFBcUM7QUFDcEUsV0FBTyxJQUFJLFFBQVEsVUFBVSxPQUFNLG1CQUFtQixRQUFRLENBQUM7QUFBQSxFQUNuRTtBQUFBLEVBT0EsT0FBYyxHQUFHLFVBQXFCLE9BQTJCO0FBQzdELFdBQU8sSUFBSSxXQUFXLFVBQVUsS0FBSztBQUFBLEVBQ3pDO0FBQUEsRUFVQSxPQUFjLHFCQUFxQixVQUFtQixNQUFzQjtBQUN4RSxXQUFPLFNBQVMsUUFBUSxJQUFJO0FBQUEsRUFDaEM7QUFBQSxFQUVBLE9BQWMsbUJBQW1CLFVBQTZDO0FBQzFFLFdBQU8sT0FBTSxTQUFTO0FBQUEsRUFDMUI7QUFBQSxFQXFCQSxPQUFlLHlCQUF5QixVQUFrQjtBQUV0RCxXQUFPLFNBQVMsUUFBUSxPQUFPLE1BQU0sRUFBRSxRQUFRLE1BQU0sS0FBSztBQUFBLEVBQzlEO0FBQUEsRUFFQSxPQUFlLGdCQUFnQixNQUFzQjtBQUNqRCxRQUFJLGVBQWU7QUFDbkIsWUFBUSxLQUFLO0FBQUE7QUFFTCx1QkFBZTtBQUNmO0FBQUE7QUFFQSx1QkFBZTtBQUNmO0FBQUE7QUFFQSx1QkFBZTtBQUNmO0FBQUE7QUFFQSx1QkFBZTtBQUNmO0FBQUE7QUFFUixXQUFPLENBQUMsWUFBWSxLQUFLLGFBQWEsY0FBYztBQUFBLEVBQ3hEO0FBQUEsRUFFQSxPQUFlLGtCQUFrQixNQUFzQjtBQUNuRCxRQUFJLEtBQUssZUFBZSxNQUFNO0FBQzFCLGFBQU8sQ0FBQyxLQUFLLFdBQVksT0FBTyxDQUFDO0FBQUEsSUFDckMsT0FBTztBQUNILGFBQU8sQ0FBQyxNQUFNO0FBQUEsSUFDbEI7QUFBQSxFQUNKO0FBQUEsRUFFQSxPQUFlLGlCQUFpQixNQUFzQjtBQUNsRCxRQUFJLEtBQUssZUFBZSxNQUFNO0FBQzFCLGFBQU8sQ0FBQyxXQUFXO0FBQUEsSUFDdkIsT0FBTztBQUNILGFBQU8sQ0FBQyxlQUFlO0FBQUEsSUFDM0I7QUFBQSxFQUNKO0FBQUEsRUFFQSxPQUFlLGlCQUFpQixNQUFzQjtBQUNsRCxXQUFPLENBQUMsT0FBTSxlQUFlLEtBQUssV0FBVyxPQUFPLENBQUM7QUFBQSxFQUN6RDtBQUFBLEVBRUEsT0FBZSxxQkFBcUIsTUFBc0I7QUFDdEQsV0FBTyxDQUFDLE9BQU0sZUFBZSxLQUFLLGVBQWUsV0FBVyxDQUFDO0FBQUEsRUFDakU7QUFBQSxFQUVBLE9BQWUsZUFBZSxNQUFzQjtBQUNoRCxXQUFPLENBQUMsT0FBTSxlQUFlLEtBQUssU0FBUyxLQUFLLENBQUM7QUFBQSxFQUNyRDtBQUFBLEVBRUEsT0FBZSxnQkFBZ0IsTUFBc0I7QUFDakQsV0FBTyxDQUFDLE9BQU0sZUFBZSxLQUFLLFVBQVUsTUFBTSxDQUFDO0FBQUEsRUFDdkQ7QUFBQSxFQUVBLE9BQWUsbUJBQW1CLE1BQXNCO0FBQ3BELFVBQU0sb0JBQW9CLElBQUksaUJBQWlCLEVBQUUsYUFBYSxJQUFJO0FBQ2xFLFdBQU8sQ0FBQyxPQUFNLGVBQWUsbUJBQW1CLFNBQVMsQ0FBQztBQUFBLEVBQzlEO0FBQUEsRUFFQSxPQUFlLGVBQWUsTUFBNEIsT0FBdUI7QUFDN0UsUUFBSSxTQUFTLE1BQU07QUFDZixhQUFPLFFBQVEsUUFBUTtBQUFBLElBQzNCO0FBQ0EsV0FBTyxLQUFLLE9BQU8sT0FBTSxlQUFlO0FBQUEsRUFDNUM7QUFBQSxFQUVBLE9BQWUsWUFBWSxNQUFzQjtBQUc3QyxXQUFPLENBQUMsT0FBTSx5QkFBeUIsS0FBSyxLQUFLLFFBQVEsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUFBLEVBQ3hFO0FBQUEsRUFFQSxPQUFlLGNBQWMsTUFBc0I7QUFDL0MsVUFBTSxPQUFPLEtBQUs7QUFDbEIsVUFBTSx3QkFBd0IsS0FBSyxXQUFXO0FBQzlDLFVBQU0sU0FBUyxLQUFLLFVBQVUsR0FBRyxLQUFLLFlBQVkscUJBQXFCLENBQUM7QUFDeEUsUUFBSSxXQUFXLElBQUk7QUFDZixhQUFPLENBQUMsR0FBRztBQUFBLElBQ2Y7QUFDQSxXQUFPLENBQUMsT0FBTSx5QkFBeUIsTUFBTSxDQUFDO0FBQUEsRUFDbEQ7QUFBQSxFQUVBLE9BQWUsZ0JBQWdCLE1BQXNCO0FBSWpELFVBQU0sV0FBVyxLQUFLO0FBQ3RCLFFBQUksYUFBYSxNQUFNO0FBQ25CLGFBQU8sQ0FBQyxrQkFBa0I7QUFBQSxJQUM5QjtBQUNBLFdBQU8sQ0FBQyxPQUFPLE9BQU0seUJBQXlCLFFBQVEsSUFBSSxJQUFJO0FBQUEsRUFDbEU7QUFBQSxFQUVBLE9BQWUsWUFBWSxNQUFzQjtBQUM3QyxVQUFNLE9BQU8sS0FBSyxLQUFLLFFBQVEsT0FBTyxHQUFHO0FBQ3pDLFVBQU0saUJBQWlCLEtBQUssUUFBUSxHQUFHO0FBQ3ZDLFFBQUksa0JBQWtCLElBQUk7QUFDdEIsYUFBTyxDQUFDLEdBQUc7QUFBQSxJQUNmO0FBQ0EsV0FBTyxDQUFDLE9BQU0seUJBQXlCLEtBQUssVUFBVSxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQztBQUFBLEVBQ2pGO0FBQUEsRUFFQSxPQUFlLGdCQUFnQixNQUFzQjtBQUNqRCxVQUFNLFdBQVcsS0FBSyxZQUFZLEVBQUUsa0JBQWtCLEtBQUssQ0FBQztBQUM1RCxRQUFJLGFBQWEsTUFBTTtBQUNuQixhQUFPLENBQUMsa0JBQWtCO0FBQUEsSUFDOUI7QUFFQSxRQUFJLG9CQUFvQjtBQUV4QixRQUFJLEtBQUssYUFBYSxNQUFNO0FBRXhCLDBCQUFvQixPQUFNLHlCQUF5QixLQUFLLFFBQVE7QUFBQSxJQUNwRTtBQUVBLFFBQUksS0FBSyxvQkFBb0IsUUFBUSxLQUFLLGdCQUFnQixXQUFXLEdBQUc7QUFDcEUsYUFBTyxDQUFDLGlCQUFpQjtBQUFBLElBQzdCO0FBR0EsVUFBTSxtQkFBbUIsT0FBTSxlQUFlLElBQUksRUFBRTtBQUVwRCxRQUFJLHNCQUFzQixrQkFBa0I7QUFDeEMsYUFBTyxDQUFDLGlCQUFpQjtBQUFBLElBQzdCLE9BQU87QUFDSCxhQUFPLENBQUMsR0FBRyx1QkFBdUIsa0JBQWtCO0FBQUEsSUFDeEQ7QUFBQSxFQUNKO0FBQUEsRUFFQSxPQUFlLGNBQWMsTUFBc0I7QUFJL0MsUUFBSSxLQUFLLE9BQU8sV0FBVyxLQUFLO0FBQzVCLGFBQU8sQ0FBQyxNQUFNO0FBQUEsSUFDbEIsT0FBTztBQUNILGFBQU8sQ0FBQyxNQUFNO0FBQUEsSUFDbEI7QUFBQSxFQUNKO0FBQUEsRUFFQSxPQUFlLGVBQWUsTUFBc0I7QUFDaEQsUUFBSSxLQUFLLG9CQUFvQixRQUFRLEtBQUssZ0JBQWdCLFdBQVcsR0FBRztBQUNwRSxhQUFPLENBQUMsY0FBYztBQUFBLElBQzFCO0FBQ0EsV0FBTyxDQUFDLEtBQUssZUFBZTtBQUFBLEVBQ2hDO0FBQUEsRUFFQSxPQUFlLFlBQVksTUFBc0I7QUFDN0MsUUFBSSxLQUFLLEtBQUssVUFBVSxHQUFHO0FBQ3ZCLGFBQU8sQ0FBQyxXQUFXO0FBQUEsSUFDdkI7QUFDQSxXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUNKO0FBOU1PLElBQU0sUUFBTjtBQUFNLE1BQ2Usa0JBQWtCO0FBRGpDLE1BZ0NNLFdBQXNEO0FBQUEsRUFDakUsVUFBVSxPQUFNO0FBQUEsRUFDaEIsTUFBTSxPQUFNO0FBQUEsRUFDWixLQUFLLE9BQU07QUFBQSxFQUNYLFVBQVUsT0FBTTtBQUFBLEVBQ2hCLFFBQVEsT0FBTTtBQUFBLEVBQ2QsU0FBUyxPQUFNO0FBQUEsRUFDZixTQUFTLE9BQU07QUFBQSxFQUNmLE1BQU0sT0FBTTtBQUFBLEVBQ1osVUFBVSxPQUFNO0FBQUEsRUFDaEIsWUFBWSxPQUFNO0FBQUEsRUFDbEIsV0FBVyxPQUFNO0FBQUEsRUFDakIsTUFBTSxPQUFNO0FBQUEsRUFDWixXQUFXLE9BQU07QUFBQSxFQUNqQixPQUFPLE9BQU07QUFBQSxFQUNiLFFBQVEsT0FBTTtBQUFBLEVBQ2QsTUFBTSxPQUFNO0FBQ2hCOzs7QUM5Q0csSUFBTSxRQUFOLE1BQThCO0FBQUEsRUFzQmpDLFlBQVksRUFBRSxPQUFPLEdBQXVCO0FBbkI1QyxTQUFRLFNBQTZCO0FBQ3JDLFNBQVEsaUJBQWdDLElBQUksY0FBYztBQUMxRCxTQUFRLFdBQXFCLENBQUM7QUFDOUIsU0FBUSxTQUE2QjtBQUNyQyxTQUFRLFdBQXFCLENBQUM7QUFDOUIsU0FBUSxZQUF1QixDQUFDO0FBRWhDLFNBQWlCLGdCQUNiO0FBRUosU0FBaUIsb0JBQ2I7QUFDSixTQUFpQixrQkFBa0I7QUFDbkMsU0FBaUIscUJBQXFCO0FBRXRDLFNBQWlCLGNBQWM7QUFFL0IsU0FBaUIsZ0JBQWdCO0FBRzdCLFNBQUssU0FBUztBQUNkLFdBQ0ssTUFBTSxJQUFJLEVBQ1YsSUFBSSxDQUFDLFNBQWlCLEtBQUssS0FBSyxDQUFDLEVBQ2pDLFFBQVEsQ0FBQyxTQUFpQjtBQUN2QixjQUFRO0FBQUEsYUFDQyxTQUFTO0FBQ1Y7QUFBQSxhQUNDLEtBQUssZ0JBQWdCLEtBQUssSUFBSTtBQUMvQixlQUFLLGVBQWUsWUFBWTtBQUNoQztBQUFBLGFBQ0MsS0FBSyxtQkFBbUIsS0FBSyxJQUFJO0FBQ2xDLGVBQUssZUFBZSxlQUFlO0FBQ25DO0FBQUEsYUFDQyxLQUFLLFlBQVksS0FBSyxJQUFJO0FBQzNCLGVBQUssV0FBVyxFQUFFLEtBQUssQ0FBQztBQUN4QjtBQUFBLGFBQ0MsS0FBSyxZQUFZLEVBQUUsS0FBSyxDQUFDO0FBQzFCO0FBQUEsYUFDQyxLQUFLLGNBQWMsRUFBRSxLQUFLLENBQUM7QUFDNUI7QUFBQSxhQUNDLEtBQUssY0FBYyxLQUFLLElBQUk7QUFDN0IsZUFBSyxhQUFhLEVBQUUsS0FBSyxDQUFDO0FBQzFCO0FBQUEsYUFDQyxLQUFLLGtCQUFrQixLQUFLLElBQUk7QUFDakMsZUFBSyxpQkFBaUIsRUFBRSxLQUFLLENBQUM7QUFDOUI7QUFBQSxhQUNDLEtBQUssY0FBYyxLQUFLLElBQUk7QUFFN0I7QUFBQSxhQUNDLEtBQUssWUFBWSxJQUFJO0FBQ3RCO0FBQUE7QUFFQSxlQUFLLFNBQVMsNEJBQTRCO0FBQUE7QUFBQSxJQUV0RCxDQUFDO0FBQUEsRUFDVDtBQUFBLEVBRU8sZUFBdUI7QUFDMUIsV0FBTyxvREFBb0QsS0FBSyxnQ0FBZ0M7QUFBQSxFQUNwRztBQUFBLEVBRU8sa0NBQTBDO0FBQzdDLFFBQUksU0FBUztBQUViLFVBQU0sRUFBRSxhQUFhLElBQUksWUFBWTtBQUNyQyxRQUFJLGFBQWEsV0FBVyxHQUFHO0FBQzNCLGdCQUFVLDRDQUE0QztBQUFBO0FBQUE7QUFBQSxJQUMxRDtBQUVBLFVBQU0sa0JBQWtCLEtBQUssUUFBUTtBQUNyQyxRQUFJLG9CQUFvQixHQUFHO0FBQ3ZCLGdCQUFVO0FBQUEsSUFDZCxPQUFPO0FBQ0gsZUFBUyxJQUFJLEdBQUcsSUFBSSxpQkFBaUIsS0FBSztBQUN0QyxZQUFJLElBQUk7QUFBRyxvQkFBVTtBQUNyQixrQkFBVSxLQUFLLFFBQVEsR0FBRyxzQkFBc0IsRUFBRTtBQUFBLE1BQ3REO0FBQUEsSUFDSjtBQUVBLFFBQUksS0FBSyxXQUFXLFFBQVc7QUFDM0IsZ0JBQVU7QUFBQTtBQUFBLFVBQWUsS0FBSztBQUM5QixVQUFJLEtBQUssV0FBVyxHQUFHO0FBQ25CLGtCQUFVO0FBQUEsTUFDZDtBQUNBLGdCQUFVO0FBQUEsSUFDZDtBQUVBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxJQUFXLFFBQTRCO0FBQ25DLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQUEsRUFFQSxJQUFXLGdCQUErQjtBQUN0QyxXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBRUEsSUFBVyxVQUFvQjtBQUMzQixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBRUEsSUFBVyxVQUFVO0FBQ2pCLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQUEsRUFFQSxJQUFXLFdBQVc7QUFDbEIsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQUVBLElBQVcsUUFBNEI7QUFDbkMsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQUVPLGtCQUFrQixPQUEyQjtBQUNoRCxTQUFLLFFBQVEsUUFBUSxDQUFDLFdBQVc7QUFDN0IsY0FBUSxNQUFNLE9BQU8sT0FBTyxjQUFjO0FBQUEsSUFDOUMsQ0FBQztBQUVELFVBQU0scUJBQXFCLEtBQUssR0FBRyxLQUFLLFNBQVMsS0FBSyxFQUFFLE1BQU0sR0FBRyxLQUFLLEtBQUs7QUFDM0UsV0FBTyxNQUFNLEdBQUcsS0FBSyxVQUFVLGtCQUFrQjtBQUFBLEVBQ3JEO0FBQUEsRUFFUSxpQkFBaUIsRUFBRSxLQUFLLEdBQTJCO0FBQ3ZELFVBQU0sbUJBQW1CLEtBQUssTUFBTSxLQUFLLGlCQUFpQjtBQUMxRCxRQUFJLHFCQUFxQixNQUFNO0FBQzNCLFlBQU0sT0FBTyxpQkFBaUIsT0FBTztBQUNyQyxZQUFNLFNBQVMsaUJBQWlCO0FBRWhDLGNBQVE7QUFBQSxhQUNDO0FBQ0QsZUFBSyxlQUFlLGdCQUFnQjtBQUNwQztBQUFBLGFBQ0M7QUFDRCxlQUFLLGVBQWUsZ0JBQWdCO0FBQ3BDO0FBQUEsYUFDQztBQUNELGVBQUssZUFBZSxlQUFlO0FBQ25DO0FBQUEsYUFDQztBQUNELGVBQUssZUFBZSxnQkFBZ0I7QUFDcEM7QUFBQSxhQUNDO0FBQ0QsZUFBSyxlQUFlLG9CQUFvQjtBQUN4QztBQUFBLGFBQ0M7QUFDRCxlQUFLLGVBQWUsY0FBYztBQUNsQztBQUFBLGFBQ0M7QUFDRCxlQUFLLGVBQWUsZUFBZTtBQUNuQztBQUFBLGFBQ0M7QUFDRCxlQUFLLGVBQWUscUJBQXFCO0FBQ3pDO0FBQUEsYUFDQztBQUNELGVBQUssZUFBZSxpQkFBaUI7QUFDckM7QUFBQSxhQUNDO0FBQ0QsZUFBSyxlQUFlLGNBQWM7QUFDbEM7QUFBQTtBQUVBLGVBQUssU0FBUztBQUFBO0FBQUEsSUFFMUI7QUFBQSxFQUNKO0FBQUEsRUFFUSxZQUFZLE1BQWM7QUFDOUIsVUFBTSxnQkFBNkIsWUFBWSxJQUFJO0FBQ25ELFFBQUksaUJBQWlCLE1BQU07QUFDdkIsVUFBSSxjQUFjO0FBQVEsYUFBSyxTQUFTLEtBQUssY0FBYyxNQUFNO0FBQUE7QUFDNUQsYUFBSyxTQUFTLGNBQWM7QUFDakMsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRVEsV0FBVyxFQUFFLEtBQUssR0FBMkI7QUFDakQsVUFBTSxhQUFhLEtBQUssTUFBTSxLQUFLLFdBQVc7QUFDOUMsUUFBSSxlQUFlLE1BQU07QUFFckIsV0FBSyxTQUFTLE9BQU8sU0FBUyxXQUFXLElBQUksRUFBRTtBQUFBLElBQ25ELE9BQU87QUFDSCxXQUFLLFNBQVM7QUFBQSxJQUNsQjtBQUFBLEVBQ0o7QUFBQSxFQUVRLFlBQVksRUFBRSxLQUFLLEdBQThCO0FBQ3JELFVBQU0sZUFBNEIsWUFBWSxJQUFJO0FBQ2xELFFBQUksY0FBYztBQUNkLFdBQUssU0FBUyxLQUFLLFlBQVk7QUFDL0IsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBYVEsYUFBYSxFQUFFLEtBQUssR0FBMkI7QUFDbkQsVUFBTSxhQUFhLEtBQUssTUFBTSxLQUFLLGFBQWE7QUFDaEQsUUFBSSxlQUFlLE1BQU07QUFDckIsV0FBSyxVQUFVLEtBQUssTUFBTSxxQkFBcUIsV0FBVyxFQUFzQixDQUFDO0FBQUEsSUFDckYsT0FBTztBQUNILFdBQUssU0FBUztBQUFBLElBQ2xCO0FBQUEsRUFDSjtBQUFBLEVBV1EsY0FBYyxFQUFFLEtBQUssR0FBOEI7QUFDdkQsVUFBTSxnQkFBNkIsYUFBYSxJQUFJO0FBQ3BELFFBQUksZUFBZTtBQUNmLFdBQUssVUFBVSxLQUFLLGFBQWE7QUFDakMsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QTVDM09PLElBQU0sZ0JBQU4sTUFBb0I7QUFBQSxFQUl2QixZQUFZLEVBQUUsUUFBUSxPQUFPLEdBQTRDO0FBT3pFLFNBQU8sc0JBQXNCLEtBQUsscUJBQXFCLEtBQUssSUFBSTtBQU41RCxTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLFNBQVM7QUFFZCxXQUFPLG1DQUFtQyxTQUFTLEtBQUsscUJBQXFCLEtBQUssSUFBSSxDQUFDO0FBQUEsRUFDM0Y7QUFBQSxFQUljLHFCQUFxQixRQUFnQkMsVUFBc0IsU0FBdUM7QUFBQTtBQUM1RyxjQUFRO0FBQUEsUUFDSixJQUFJLGlCQUFpQjtBQUFBLFVBQ2pCLEtBQUssS0FBSztBQUFBLFVBQ1YsUUFBUSxLQUFLO0FBQUEsVUFDYixXQUFXQTtBQUFBLFVBQ1g7QUFBQSxVQUNBLFVBQVUsUUFBUTtBQUFBLFFBQ3RCLENBQUM7QUFBQSxNQUNMO0FBQUEsSUFDSjtBQUFBO0FBQ0o7QUFFQSxJQUFNLG1CQUFOLGNBQStCLHFDQUFvQjtBQUFBLEVBVy9DLFlBQVk7QUFBQSxJQUNSO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0osR0FNRztBQUNDLFVBQU0sU0FBUztBQUVmLFNBQUssTUFBTTtBQUNYLFNBQUssU0FBUztBQUNkLFNBQUssU0FBUztBQUNkLFNBQUssV0FBVztBQUtoQixZQUFRLEtBQUssWUFBWTtBQUFBLFdBQ2hCO0FBQ0QsYUFBSyxRQUFRLElBQUksTUFBTSxFQUFFLE9BQU8sQ0FBQztBQUNqQyxhQUFLLFlBQVk7QUFDakI7QUFBQTtBQUdBLGFBQUssUUFBUSxJQUFJLE1BQU0sRUFBRSxPQUFPLENBQUM7QUFDakMsYUFBSyxZQUFZO0FBQ2pCO0FBQUE7QUFBQSxFQUVaO0FBQUEsRUFFQSxTQUFTO0FBRUwsU0FBSyxPQUFPLDBCQUEwQixLQUFLLE9BQU8sS0FBSyxJQUFJLENBQUM7QUFFNUQsU0FBSyxpQkFBaUIsS0FBSyxPQUFPLGNBQWMsS0FBSyxPQUFPLEtBQUssSUFBSSxDQUFDO0FBRXRFLFNBQUssc0JBQXNCO0FBQUEsRUFDL0I7QUFBQSxFQUVBLFdBQVc7QUFDUCxRQUFJLEtBQUssbUJBQW1CLFFBQVc7QUFDbkMsV0FBSyxPQUFPLElBQUksS0FBSyxjQUFjO0FBQUEsSUFDdkM7QUFFQSxRQUFJLEtBQUssdUJBQXVCLFFBQVc7QUFDdkMsbUJBQWEsS0FBSyxrQkFBa0I7QUFBQSxJQUN4QztBQUFBLEVBQ0o7QUFBQSxFQVVRLHdCQUE4QjtBQUNsQyxVQUFNLFdBQVcsSUFBSSxLQUFLO0FBQzFCLGFBQVMsU0FBUyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQzdCLFVBQU0sTUFBTSxJQUFJLEtBQUs7QUFFckIsVUFBTSx5QkFBeUIsU0FBUyxRQUFRLElBQUksSUFBSSxRQUFRO0FBRWhFLFNBQUsscUJBQXFCLFdBQVcsTUFBTTtBQUN2QyxXQUFLLFFBQVEsSUFBSSxNQUFNLEVBQUUsUUFBUSxLQUFLLE9BQU8sQ0FBQztBQUU5QyxXQUFLLE9BQU8sMEJBQTBCLEtBQUssT0FBTyxLQUFLLElBQUksQ0FBQztBQUM1RCxXQUFLLHNCQUFzQjtBQUFBLElBQy9CLEdBQUcseUJBQXlCLEdBQUk7QUFBQSxFQUNwQztBQUFBLEVBRWMsT0FBTyxJQUFtRDtBQUFBLCtDQUFuRCxFQUFFLE9BQU8sTUFBTSxHQUFvQztBQWpJNUU7QUFzSVEsWUFBTSxVQUFVLEtBQUssWUFBWSxTQUFTLEtBQUs7QUFDL0MsVUFBSSwrQkFBd0IsS0FBSyxNQUFNLFVBQVUsUUFBVztBQUN4RCxnQkFBUTtBQUFBLFVBQ0osVUFBVSxLQUFLLGdEQUFnRCxLQUFLLDZCQUE2QixNQUFNLCtCQUErQjtBQUFBLFFBQzFJO0FBRUEsWUFBSSxLQUFLLE1BQU0sY0FBYyxjQUFjO0FBQ3ZDLGVBQUssa0JBQWtCLE9BQU87QUFBQSxRQUNsQztBQUVBLGNBQU0sNEJBQTRCLEtBQUssTUFBTSxrQkFBa0IsS0FBSztBQUNwRSxtQkFBVyxTQUFTLDBCQUEwQixRQUFRO0FBR2xELGVBQUssaUJBQWlCLFNBQVMsTUFBTSxhQUFhO0FBRWxELGdCQUFNLEVBQUUsU0FBUyxJQUFJLE1BQU0sS0FBSyxnQkFBZ0I7QUFBQSxZQUM1QyxPQUFPLE1BQU07QUFBQSxZQUNiO0FBQUEsVUFDSixDQUFDO0FBQ0Qsa0JBQVEsWUFBWSxRQUFRO0FBQUEsUUFDaEM7QUFDQSxjQUFNLGtCQUFrQiwwQkFBMEIsZ0JBQWdCO0FBQ2xFLGdCQUFRLE1BQU0sR0FBRyxzQkFBc0IsTUFBTSx5Q0FBeUMsS0FBSyxXQUFXO0FBQ3RHLGFBQUssYUFBYSxTQUFTLGVBQWU7QUFBQSxNQUM5QyxXQUFXLEtBQUssTUFBTSxVQUFVLFFBQVc7QUFDdkMsZ0JBQVEsVUFBVSxFQUFFLFlBQ2hCLHFCQUEwQixLQUFLLE1BQU0sTUFBTSxRQUFRLE9BQU8sTUFBTTtBQUFBLE1BQ3hFLE9BQU87QUFDSCxnQkFBUSxRQUFRLG1CQUFtQjtBQUFBLE1BQ3ZDO0FBRUEsaUJBQUssWUFBWSxlQUFqQixtQkFBNkIsWUFBWTtBQUFBLElBQzdDO0FBQUE7QUFBQSxFQUdRLGtCQUFrQixTQUF5QjtBQUMvQyxVQUFNLHNCQUFzQixLQUFLLE1BQU0sYUFBYTtBQUVwRCxVQUFNLG9CQUFvQixRQUFRLFNBQVMsS0FBSztBQUNoRCxzQkFBa0IsV0FBVyxDQUFDLGdDQUFnQyxDQUFDO0FBQy9ELHNCQUFrQixRQUFRLG1CQUFtQjtBQUM3QyxZQUFRLFlBQVksaUJBQWlCO0FBQUEsRUFDekM7QUFBQSxFQUVjLGdCQUFnQixJQU1rQztBQUFBLCtDQU5sQztBQUFBLE1BQzFCO0FBQUEsTUFDQTtBQUFBLElBQ0osR0FHZ0U7QUFDNUQsWUFBTSxhQUFhLE1BQU07QUFFekIsWUFBTSxTQUFTLElBQUksV0FBVyxLQUFLLE1BQU0sYUFBYTtBQUN0RCxZQUFNLFdBQVcsUUFBUSxTQUFTLElBQUk7QUFDdEMsZUFBUyxXQUFXLENBQUMsc0JBQXNCLDJCQUEyQixDQUFDO0FBQ3ZFLGVBQVMsV0FBVyxPQUFPLGVBQWU7QUFDMUMsWUFBTSxvQkFBb0IsS0FBSyxxQkFBcUI7QUFDcEQsVUFBSSxxQkFBcUIsa0JBQWtCLFNBQVM7QUFBRyxpQkFBUyxRQUFRLGNBQWM7QUFDdEYsZUFBUyxJQUFJLEdBQUcsSUFBSSxZQUFZLEtBQUs7QUFDakMsY0FBTSxPQUFPLE1BQU07QUFDbkIsY0FBTSxtQkFBbUIsS0FBSyxpQkFBaUIsRUFBRSxLQUFLLENBQUM7QUFFdkQsY0FBTSxXQUFXLE1BQU0sS0FBSyxLQUFLO0FBQUEsVUFDN0IsaUJBQWlCO0FBQUEsVUFDakIsV0FBVztBQUFBLFVBQ1gsZUFBZSxLQUFLLE1BQU07QUFBQSxVQUMxQjtBQUFBLFVBQ0EsWUFBWTtBQUFBLFFBQ2hCLENBQUM7QUFHRCxjQUFNLFlBQVksU0FBUyxpQkFBaUIsb0JBQW9CO0FBQ2hFLGtCQUFVLFFBQVEsQ0FBQyxhQUFhLFNBQVMsT0FBTyxDQUFDO0FBRWpELGNBQU0sWUFBWSxLQUFLLE1BQU0sY0FBYztBQUUzQyxjQUFNLGFBQWEsU0FBUyxXQUFXLGFBQWE7QUFFcEQsWUFBSSxDQUFDLEtBQUssTUFBTSxjQUFjLGFBQWE7QUFDdkMsZUFBSyxXQUFXLFlBQVksSUFBSTtBQUFBLFFBQ3BDO0FBRUEsWUFBSSxDQUFDLEtBQUssTUFBTSxjQUFjLGVBQWU7QUFDekMsZUFBSyxhQUFhLFlBQVksTUFBTSxXQUFXLGdCQUFnQjtBQUFBLFFBQ25FO0FBRUEsWUFBSSxDQUFDLEtBQUssTUFBTSxjQUFjLGdCQUFnQjtBQUMxQyxlQUFLLGNBQWMsWUFBWSxJQUFJO0FBQUEsUUFDdkM7QUFFQSxpQkFBUyxZQUFZLFFBQVE7QUFBQSxNQUNqQztBQUVBLGFBQU8sRUFBRSxVQUFVLFdBQVc7QUFBQSxJQUNsQztBQUFBO0FBQUEsRUFFUSxjQUFjLFVBQXVCLE1BQVk7QUFDckQsVUFBTSxpQkFBaUIsU0FBUyxTQUFTLEtBQUs7QUFBQSxNQUMxQyxLQUFLO0FBQUEsSUFDVCxDQUFDO0FBQ0QsbUJBQWUsYUFBYSxDQUFDLFVBQXNCO0FBQy9DLFlBQU0sZUFBZTtBQUVyQixZQUFNLFdBQVcsQ0FBQyxpQkFBK0I7QUFDN0MsNkJBQXFCO0FBQUEsVUFDakIsY0FBYztBQUFBLFVBQ2QsVUFBVSxhQUFhLDZCQUE2QixNQUFNLFlBQVk7QUFBQSxRQUMxRSxDQUFDO0FBQUEsTUFDTDtBQUdBLFlBQU0sWUFBWSxJQUFJLFVBQVU7QUFBQSxRQUM1QixLQUFLLEtBQUs7QUFBQSxRQUNWO0FBQUEsUUFDQTtBQUFBLE1BQ0osQ0FBQztBQUNELGdCQUFVLEtBQUs7QUFBQSxJQUNuQixDQUFDO0FBQUEsRUFDTDtBQUFBLEVBRVEsV0FBVyxVQUF1QixNQUFZO0FBQ2xELFVBQU1DLFFBQU8sSUFBSSxLQUFLLGFBQWEsRUFBRSxPQUFPLEtBQUssT0FBTztBQUN4RCxhQUFTLFdBQVcsRUFBRSxNQUFBQSxPQUFNLEtBQUssZ0JBQWdCLENBQUM7QUFBQSxFQUN0RDtBQUFBLEVBU1EsaUJBQWlCLFNBQXlCLGVBQStCO0FBQzdFLGVBQVcsV0FBVyxlQUFlO0FBQ2pDLFdBQUssZ0JBQWdCLFNBQVMsT0FBTztBQUFBLElBQ3pDO0FBQUEsRUFDSjtBQUFBLEVBRWMsZ0JBQWdCLFNBQXlCLE9BQXFCO0FBQUE7QUFDeEUsVUFBSTtBQUlKLFVBQUksTUFBTSxpQkFBaUIsR0FBRztBQUMxQixpQkFBUyxRQUFRLFNBQVMsTUFBTTtBQUFBLFVBQzVCLEtBQUs7QUFBQSxRQUNULENBQUM7QUFBQSxNQUNMLFdBQVcsTUFBTSxpQkFBaUIsR0FBRztBQUNqQyxpQkFBUyxRQUFRLFNBQVMsTUFBTTtBQUFBLFVBQzVCLEtBQUs7QUFBQSxRQUNULENBQUM7QUFBQSxNQUNMLE9BQU87QUFFSCxpQkFBUyxRQUFRLFNBQVMsTUFBTTtBQUFBLFVBQzVCLEtBQUs7QUFBQSxRQUNULENBQUM7QUFBQSxNQUNMO0FBQ0EsWUFBTSxrQ0FBaUIsZUFBZSxNQUFNLE1BQU0sUUFBUSxLQUFLLFVBQVUsSUFBSTtBQUFBLElBQ2pGO0FBQUE7QUFBQSxFQUVRLGFBQWEsVUFBdUIsTUFBWSxXQUFvQixrQkFBdUM7QUF4U3ZIO0FBeVNRLFVBQU0sV0FBVyxTQUFTLFdBQVcsRUFBRSxLQUFLLGlCQUFpQixDQUFDO0FBRTlELFFBQUksQ0FBQyxXQUFXO0FBQ1osZUFBUyxPQUFPLElBQUk7QUFBQSxJQUN4QjtBQUVBLFVBQU0sT0FBTyxTQUFTLFNBQVMsR0FBRztBQUVsQyxTQUFLLE9BQU8sS0FBSztBQUNqQixTQUFLLGFBQWEsYUFBYSxLQUFLLElBQUk7QUFDeEMsU0FBSyxNQUFNO0FBQ1gsU0FBSyxTQUFTO0FBQ2QsU0FBSyxTQUFTLGVBQWU7QUFDN0IsUUFBSSxXQUFXO0FBQ1gsV0FBSyxTQUFTLDBCQUEwQjtBQUFBLElBQzVDO0FBRUEsUUFBSSxLQUFLLG9CQUFvQixNQUFNO0FBQy9CLFlBQU0sbUJBQW1CLEtBQUssZ0JBQWdCLFFBQVEsTUFBTSxFQUFFO0FBQzlELFdBQUssT0FBTyxLQUFLLE9BQU8sTUFBTTtBQUM5QixXQUFLLGFBQWEsYUFBYSxLQUFLLGFBQWEsV0FBVyxJQUFJLE1BQU0sZ0JBQWdCO0FBQUEsSUFDMUY7QUFFQSxRQUFJO0FBQ0osUUFBSSxXQUFXO0FBQ1gsaUJBQVc7QUFBQSxJQUNmLE9BQU87QUFDSCxrQkFBVyxVQUFLLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxNQUFyQyxZQUEwQztBQUFBLElBQ3pEO0FBRUEsU0FBSyxRQUFRLFFBQVE7QUFFckIsUUFBSSxDQUFDLFdBQVc7QUFDWixlQUFTLE9BQU8sR0FBRztBQUFBLElBQ3ZCO0FBQUEsRUFDSjtBQUFBLEVBRVEsYUFBYSxTQUF5QixZQUFvQjtBQUM5RCxRQUFJLENBQUMsS0FBSyxNQUFNLGNBQWMsZUFBZTtBQUN6QyxjQUFRLFVBQVU7QUFBQSxRQUNkLE1BQU0sR0FBRyxrQkFBa0IsZUFBZSxJQUFJLE1BQU07QUFBQSxRQUNwRCxLQUFLO0FBQUEsTUFDVCxDQUFDO0FBQUEsSUFDTDtBQUFBLEVBQ0o7QUFBQSxFQUVRLGlCQUFpQixFQUFFLEtBQUssR0FBd0M7QUFFcEUsVUFBTSxnQkFBZ0IsS0FBSyxLQUFLLE1BQU0sZUFBZTtBQUNyRCxRQUFJLGtCQUFrQixNQUFNO0FBQ3hCLGFBQU87QUFBQSxJQUNYO0FBRUEsVUFBTSxXQUFXLGNBQWM7QUFDL0IsVUFBTSx1QkFBdUIsS0FBSyxJQUFJLE1BQU0saUJBQWlCLEVBQUUsT0FBTyxDQUFDLFNBQWdCO0FBQ25GLFVBQUksS0FBSyxhQUFhLFVBQVU7QUFFNUIsZUFBTztBQUFBLE1BQ1g7QUFBQSxJQUNKLENBQUM7QUFFRCxXQUFPLHFCQUFxQixTQUFTO0FBQUEsRUFDekM7QUFBQSxFQUVRLHVCQUF1QjtBQUMzQixVQUFNLGdCQUEwQixDQUFDO0FBQ2pDLGVBQVcsU0FBUyxLQUFLLE1BQU0sVUFBVTtBQUNyQyxvQkFBYyxLQUFLLE1BQU0sUUFBUTtBQUFBLElBQ3JDO0FBQ0EsV0FBTyxjQUFjLEtBQUssR0FBRztBQUFBLEVBQ2pDO0FBQ0o7OztBNkNoWEEsSUFBQUMsb0JBQTREOzs7QUNNckQsU0FBUyw4QkFBOEI7QUFDMUMsUUFBTSxNQUF3QjtBQUFBLElBQzFCLENBQUMsS0FBSyxhQUFhLEtBQUssTUFBTTtBQUFBLElBQzlCLENBQUMsS0FBSyxXQUFXLEtBQUssTUFBTTtBQUFBLElBQzVCLENBQUMsS0FBSyxlQUFlLEtBQUssTUFBTTtBQUFBLElBQ2hDLENBQUMsS0FBSyxhQUFhLEtBQUssTUFBTTtBQUFBLElBQzlCLENBQUMsS0FBSyxhQUFhLEtBQUssTUFBTTtBQUFBLElBQzlCLENBQUMsS0FBSyxhQUFhLEtBQUssV0FBVztBQUFBLElBQ25DLENBQUMsS0FBSyxlQUFlLEtBQUssYUFBYTtBQUFBLElBQ3ZDLENBQUMsS0FBSyxZQUFZLEtBQUssTUFBTTtBQUFBLElBQzdCLENBQUMsS0FBSyxRQUFRLEtBQUssTUFBTTtBQUFBLElBQ3pCLENBQUMsS0FBSyxRQUFRLEtBQUssTUFBTTtBQUFBLElBQ3pCLENBQUMsS0FBSyxZQUFZLEtBQUssTUFBTTtBQUFBLElBQzdCLENBQUMsS0FBSyxlQUFlLEtBQUssTUFBTTtBQUFBLElBQ2hDLENBQUMsS0FBSyxRQUFRLEtBQUssTUFBTTtBQUFBLElBQ3pCLENBQUMsS0FBSyxVQUFVLEtBQUssTUFBTTtBQUFBLElBQzNCLENBQUMsS0FBSyxPQUFPLEtBQUssTUFBTTtBQUFBLElBQ3hCLENBQUMsS0FBSyxPQUFPLEtBQUssTUFBTTtBQUFBLElBQ3hCLENBQUMsS0FBSyxZQUFZLEtBQUssTUFBTTtBQUFBLElBQzdCLENBQUMsS0FBSyxTQUFTLEtBQUssTUFBTTtBQUFBLElBQzFCLENBQUMsS0FBSyxtQkFBbUIsS0FBSyxVQUFVO0FBQUEsSUFDeEMsQ0FBQyxLQUFLLG1CQUFtQixLQUFLLFVBQVU7QUFBQSxJQUN4QyxDQUFDLEtBQUssbUJBQW1CLEtBQUssVUFBVTtBQUFBLElBQ3hDLENBQUMsS0FBSyxtQkFBbUIsS0FBSyxVQUFVO0FBQUEsSUFDeEMsQ0FBQyxLQUFLLG1CQUFtQixLQUFLLFVBQVU7QUFBQSxJQUN4QyxDQUFDLEtBQUssbUJBQW1CLEtBQUssVUFBVTtBQUFBLElBQ3hDLENBQUMsS0FBSyxtQkFBbUIsS0FBSyxVQUFVO0FBQUEsSUFDeEMsQ0FBQyxLQUFLLG1CQUFtQixLQUFLLFVBQVU7QUFBQSxJQUN4QyxDQUFDLEtBQUssbUJBQW1CLEtBQUssVUFBVTtBQUFBLElBQ3hDLENBQUMsS0FBSyxtQkFBbUIsS0FBSyxVQUFVO0FBQUEsRUFDNUM7QUFDQSxTQUFPO0FBQ1g7OztBQ2hDTyxTQUFTLHdCQUF3QjtBQUNwQyxRQUFNLE1BQXdCO0FBQUEsSUFDMUIsQ0FBQyxLQUFLLGNBQWMsS0FBSyxNQUFNO0FBQUEsSUFDL0IsQ0FBQyxLQUFLLG1CQUFtQixLQUFLLE1BQU07QUFBQSxJQUNwQyxDQUFDLEtBQUssYUFBYSxLQUFLLFdBQVc7QUFBQSxJQUNuQyxDQUFDLEtBQUssWUFBWSxLQUFLLE1BQU07QUFBQSxJQUM3QixDQUFDLEtBQUssNkJBQTZCLEtBQUssYUFBYTtBQUFBLElBQ3JELENBQUMsS0FBSyxhQUFhLEtBQUssTUFBTTtBQUFBLElBQzlCLENBQUMsS0FBSyxZQUFZLEtBQUssTUFBTTtBQUFBLElBQzdCLENBQUMsS0FBSyxVQUFVLEtBQUssTUFBTTtBQUFBLElBQzNCLENBQUMsS0FBSywrQ0FBK0MsS0FBSyxNQUFNO0FBQUEsSUFDaEUsQ0FBQyxLQUFLLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDN0IsQ0FBQyxLQUFLLGNBQWMsS0FBSyxNQUFNO0FBQUEsSUFDL0IsQ0FBQyxLQUFLLHlCQUF5QixLQUFLLE1BQU07QUFBQSxJQUMxQyxDQUFDLEtBQUssUUFBUSxLQUFLLE1BQU07QUFBQSxJQUN6QixDQUFDLEtBQUssUUFBUSxLQUFLLE1BQU07QUFBQSxJQUN6QixDQUFDLEtBQUssUUFBUSxLQUFLLE1BQU07QUFBQSxJQUN6QixDQUFDLEtBQUssU0FBUyxLQUFLLE1BQU07QUFBQSxJQUMxQixDQUFDLEtBQUssMEJBQTBCLEtBQUssTUFBTTtBQUFBLElBQzNDLENBQUMsS0FBSyxPQUFPLEtBQUssTUFBTTtBQUFBLElBQ3hCLENBQUMsS0FBSyxPQUFPLEtBQUssTUFBTTtBQUFBLEVBQzVCO0FBQ0EsU0FBTztBQUNYOzs7QUN2Qk8sU0FBUyxrQ0FBa0M7QUFDOUMsUUFBTSxNQUF3QjtBQUFBLElBQzFCLENBQUMsS0FBSyxhQUFhLEtBQUssTUFBTTtBQUFBLElBQzlCLENBQUMsS0FBSyxXQUFXLEtBQUssTUFBTTtBQUFBLElBQzVCLENBQUMsS0FBSyxhQUFhLEtBQUssV0FBVztBQUFBLElBQ25DLENBQUMsS0FBSyxlQUFlLEtBQUssYUFBYTtBQUFBLElBQ3ZDLENBQUMsS0FBSyxZQUFZLEtBQUssTUFBTTtBQUFBLElBQzdCLENBQUMsS0FBSyxhQUFhLEtBQUssTUFBTTtBQUFBLElBQzlCLENBQUMsS0FBSyxZQUFZLEtBQUssTUFBTTtBQUFBLElBQzdCLENBQUMsS0FBSyxVQUFVLEtBQUssTUFBTTtBQUFBLEVBQy9CO0FBQ0EsU0FBTztBQUNYOzs7QUNYTyxTQUFTLHVCQUF1QjtBQUNuQyxRQUFNLE1BQXdCO0FBQUEsSUFDMUIsQ0FBQyxLQUFLLGFBQWEsS0FBSyxNQUFNO0FBQUEsSUFDOUIsQ0FBQyxLQUFLLFdBQVcsS0FBSyxNQUFNO0FBQUEsSUFDNUIsQ0FBQyxLQUFLLFdBQVcsS0FBSyxNQUFNO0FBQUEsSUFDNUIsQ0FBQyxLQUFLLFdBQVcsS0FBSyxXQUFXO0FBQUEsSUFDakMsQ0FBQyxLQUFLLFdBQVcsS0FBSyxNQUFNO0FBQUEsSUFDNUIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDN0IsQ0FBQyxLQUFLLGFBQWEsS0FBSyxhQUFhO0FBQUEsSUFDckMsQ0FBQyxLQUFLLE9BQU8sS0FBSyxNQUFNO0FBQUEsSUFDeEIsQ0FBQyxLQUFLLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDN0IsQ0FBQyxLQUFLLGFBQWEsS0FBSyxNQUFNO0FBQUEsSUFDOUIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLGNBQWMsS0FBSyxNQUFNO0FBQUEsSUFDL0IsQ0FBQyxLQUFLLE9BQU8sS0FBSyxNQUFNO0FBQUEsSUFDeEIsQ0FBQyxLQUFLLE9BQU8sS0FBSyxNQUFNO0FBQUEsSUFDeEIsQ0FBQyxLQUFLLFNBQVMsS0FBSyxNQUFNO0FBQUEsSUFDMUIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDN0IsQ0FBQyxLQUFLLGVBQWUsS0FBSyxNQUFNO0FBQUEsSUFDaEMsQ0FBQyxLQUFLLGNBQWMsS0FBSyxNQUFNO0FBQUEsSUFDL0IsQ0FBQyxLQUFLLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDN0IsQ0FBQyxLQUFLLFdBQVcsS0FBSyxNQUFNO0FBQUEsSUFDNUIsQ0FBQyxLQUFLLFVBQVUsS0FBSyxNQUFNO0FBQUEsSUFDM0IsQ0FBQyxLQUFLLFVBQVUsS0FBSyxNQUFNO0FBQUEsSUFDM0IsQ0FBQyxLQUFLLFVBQVUsS0FBSyxNQUFNO0FBQUEsSUFDM0IsQ0FBQyxLQUFLLFNBQVMsS0FBSyxhQUFhO0FBQUEsSUFDakMsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLHNCQUFzQixLQUFLLE1BQU07QUFBQSxJQUN2QyxDQUFDLEtBQUssUUFBUSxLQUFLLE1BQU07QUFBQSxJQUN6QixDQUFDLEtBQUssa0JBQWtCLEtBQUssTUFBTTtBQUFBLElBQ25DLENBQUMsS0FBSyxZQUFZLEtBQUssTUFBTTtBQUFBLElBQzdCLENBQUMsS0FBSyxTQUFTLEtBQUssTUFBTTtBQUFBLElBQzFCLENBQUMsS0FBSyxlQUFlLEtBQUssTUFBTTtBQUFBLElBQ2hDLENBQUMsS0FBSyxjQUFjLEtBQUssTUFBTTtBQUFBLElBQy9CLENBQUMsS0FBSyxxQkFBcUIsS0FBSyxNQUFNO0FBQUEsSUFDdEMsQ0FBQyxLQUFLLGFBQWEsS0FBSyxNQUFNO0FBQUEsSUFDOUIsQ0FBQyxLQUFLLFVBQVUsS0FBSyxNQUFNO0FBQUEsRUFDL0I7QUFDQSxTQUFPO0FBQ1g7OztBQ3pDTyxTQUFTLDJCQUEyQjtBQUN2QyxRQUFNLE1BQXdCO0FBQUEsSUFDMUIsQ0FBQyxLQUFLLFNBQVMsS0FBSyxNQUFNO0FBQUEsSUFDMUIsQ0FBQyxLQUFLLGNBQWMsS0FBSyxhQUFhO0FBQUEsSUFDdEMsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLFlBQVksS0FBSyxXQUFXO0FBQUEsSUFDbEMsQ0FBQyxLQUFLLGFBQWEsS0FBSyxNQUFNO0FBQUEsSUFDOUIsQ0FBQyxLQUFLLGNBQWMsS0FBSyxNQUFNO0FBQUEsSUFDL0IsQ0FBQyxLQUFLLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDN0IsQ0FBQyxLQUFLLGFBQWEsS0FBSyxNQUFNO0FBQUEsSUFDOUIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLFNBQVMsS0FBSyxNQUFNO0FBQUEsSUFDMUIsQ0FBQyxLQUFLLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDN0IsQ0FBQyxLQUFLLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDN0IsQ0FBQyxLQUFLLGVBQWUsS0FBSyxNQUFNO0FBQUEsSUFDaEMsQ0FBQyxLQUFLLFdBQVcsS0FBSyxNQUFNO0FBQUEsSUFDNUIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLE9BQU8sS0FBSyxNQUFNO0FBQUEsSUFDeEIsQ0FBQyxLQUFLLE9BQU8sS0FBSyxNQUFNO0FBQUEsSUFDeEIsQ0FBQyxLQUFLLE1BQU0sS0FBSyxNQUFNO0FBQUEsSUFDdkIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsRUFDN0I7QUFDQSxTQUFPO0FBQ1g7OztBQzNCTyxTQUFTLDBCQUEwQjtBQUN0QyxRQUFNLE1BQXdCO0FBQUEsSUFFMUIsQ0FBQyxLQUFLLFNBQVMsS0FBSyxNQUFNO0FBQUEsSUFDMUIsQ0FBQyxLQUFLLGNBQWMsS0FBSyxhQUFhO0FBQUEsSUFDdEMsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLFlBQVksS0FBSyxXQUFXO0FBQUEsSUFDbEMsQ0FBQyxLQUFLLGFBQWEsS0FBSyxNQUFNO0FBQUEsSUFDOUIsQ0FBQyxLQUFLLGNBQWMsS0FBSyxNQUFNO0FBQUEsSUFFL0IsQ0FBQyxLQUFLLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDN0IsQ0FBQyxLQUFLLGFBQWEsS0FBSyxNQUFNO0FBQUEsSUFDOUIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLFNBQVMsS0FBSyxNQUFNO0FBQUEsSUFDMUIsQ0FBQyxLQUFLLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDN0IsQ0FBQyxLQUFLLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDN0IsQ0FBQyxLQUFLLGVBQWUsS0FBSyxNQUFNO0FBQUEsSUFDaEMsQ0FBQyxLQUFLLFdBQVcsS0FBSyxNQUFNO0FBQUEsSUFDNUIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDekIsQ0FBQyxLQUFLLE9BQU8sS0FBSyxNQUFNO0FBQUEsSUFDeEIsQ0FBQyxLQUFLLE9BQU8sS0FBSyxNQUFNO0FBQUEsSUFDeEIsQ0FBQyxLQUFLLE1BQU0sS0FBSyxNQUFNO0FBQUEsSUFDdkIsQ0FBQyxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQUEsRUFDN0I7QUFDQSxTQUFPO0FBQ1g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbENBLElBQUFDLG1CQUFzRDs7O0FDTS9DLElBQU0sa0JBQU4sTUFBc0I7QUFBQSxFQUlsQixTQUFTLHFCQUFvRDtBQUNoRSxVQUFNLFNBQW1CLENBQUM7QUFHMUIsV0FBTyxLQUFLLEdBQUcsS0FBSyxlQUFlLG1CQUFtQixDQUFDO0FBQ3ZELFdBQU8sS0FBSyxHQUFHLEtBQUssYUFBYSxtQkFBbUIsQ0FBQztBQUNyRCxXQUFPLEtBQUssR0FBRyxLQUFLLG1CQUFtQixtQkFBbUIsQ0FBQztBQUUzRCxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBVU8sOEJBQThCLE9BQThCO0FBQy9ELFVBQU0sQ0FBQyxRQUFRLE9BQU8sa0JBQWtCLFlBQVksSUFBSTtBQUV4RCxVQUFNLFNBQW1CLENBQUM7QUFLMUIsV0FBTyxLQUFLLEdBQUcsS0FBSyxhQUFhLFlBQVksQ0FBQztBQU05QyxRQUFJLFdBQVcsb0JBQW9CLGlCQUFpQixZQUFZO0FBQzVELGFBQU8sS0FBSyxrQkFBa0IsMkJBQTJCO0FBQUEsSUFDN0Q7QUFJQSxRQUFJLE9BQU8sU0FBUyxHQUFHO0FBQ25CLGFBQU87QUFBQSxJQUNYO0FBRUEsVUFBTSxnQkFBZ0IsT0FBTyx3QkFBd0IsS0FBSyxFQUFFO0FBQzVELFdBQU8sS0FBSyxHQUFHLEtBQUssOEJBQThCLGFBQWEsQ0FBQztBQUNoRSxXQUFPLEtBQUssR0FBRyxLQUFLLFNBQVMsYUFBYSxDQUFDO0FBRTNDLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFTyxlQUFlLHFCQUFvRDtBQUN0RSxXQUFPLGdCQUFnQixrQkFBa0Isb0JBQW9CLFFBQVEsb0JBQW9CO0FBQUEsRUFDN0Y7QUFBQSxFQUVPLG1CQUFtQixxQkFBb0Q7QUFDMUUsV0FBTyxnQkFBZ0Isa0JBQWtCLG9CQUFvQixrQkFBa0IseUJBQXlCO0FBQUEsRUFDNUc7QUFBQSxFQUVPLGFBQWEscUJBQTBDO0FBQzFELFVBQU0sU0FBbUIsQ0FBQztBQUMxQixRQUFJLG9CQUFvQixLQUFLLFdBQVcsR0FBRztBQUN2QyxhQUFPLEtBQUssbUNBQW1DO0FBQUEsSUFDbkQ7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRU8sYUFBYSxZQUE4QjtBQUM5QyxVQUFNLG9CQUFvQixXQUFXO0FBQ3JDLFVBQU0sU0FBbUIsQ0FBQztBQUMxQixRQUFJLENBQUMsbUJBQW1CO0FBQ3BCLGFBQU8sS0FBSyxnQkFBZ0IsaUNBQWlDO0FBQUEsSUFDakU7QUFDQSxRQUFJLDBDQUF1QztBQUN2QyxhQUFPLEtBQUssbURBQW1EO0FBQUEsSUFDbkU7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRU8sOEJBQThCLGVBQThDO0FBQy9FLFVBQU0sU0FBbUIsQ0FBQztBQUUxQixVQUFNLFNBQVMsY0FBYztBQUM3QixVQUFNLFdBQVcsSUFBSSxlQUFlO0FBQ3BDLFVBQU0sb0JBQW9CLFdBQVcsTUFBTSxNQUFNO0FBQ2pELFVBQU0sNEJBQTRCLFNBQVMsU0FBUyxpQkFBaUI7QUFDckUsUUFBSSwwQkFBMEIsOEJBQTJCO0FBQ3JELFVBQUksY0FBYyxxQkFBcUIsMEJBQTBCLGtCQUFrQjtBQUMvRSxlQUFPO0FBQUEsVUFDSCxrQ0FBa0MsYUFBYSxjQUFjLHNEQUFzRCwwQkFBMEI7QUFBQSxRQUNqSjtBQUFBLE1BQ0o7QUFDQSxVQUFJLGNBQWMsU0FBUywwQkFBMEIsTUFBTTtBQUN2RCxlQUFPO0FBQUEsVUFDSCwyQkFBMkIsYUFBYSxjQUFjLDBDQUEwQywwQkFBMEI7QUFBQSxRQUM5SDtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBRUEsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLE9BQWUsa0JBQWtCLFFBQWdCLFlBQThCO0FBQzNFLFVBQU0sU0FBbUIsQ0FBQztBQUMxQixRQUFJLE9BQU8sV0FBVyxHQUFHO0FBQ3JCLGFBQU8sS0FBSyxHQUFHLDZCQUE2QjtBQUFBLElBQ2hEO0FBRUEsUUFBSSxPQUFPLFNBQVMsR0FBRztBQUNuQixhQUFPLEtBQUssR0FBRyxnQkFBZ0Isc0NBQXNDO0FBQUEsSUFDekU7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QURwSEEsSUFBTSxZQUFZLElBQUksZ0JBQWdCO0FBRS9CLElBQU0sb0JBQU4sY0FBZ0MsdUJBQU07QUFBQSxFQVV6QyxZQUFtQixRQUFnQixZQUFpQyxjQUF1QjtBQUN2RixVQUFNLE9BQU8sR0FBRztBQUREO0FBSG5CLGlCQUFpQjtBQUNqQixpQkFBaUI7QUFJYixTQUFLLGVBQWUsV0FBVztBQUMvQixTQUFLLGFBQWEsV0FBVztBQUM3QixTQUFLLG1CQUFtQixXQUFXO0FBQ25DLFNBQUssMkJBQTJCLFdBQVc7QUFDM0MsU0FBSyxPQUFPLFdBQVc7QUFDdkIsU0FBSyxlQUFlO0FBQUEsRUFDeEI7QUFBQSxFQUtPLHNCQUFzQjtBQUN6QixXQUFPLElBQUk7QUFBQSxNQUNQLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxJQUNUO0FBQUEsRUFDSjtBQUFBLEVBRU0sVUFBVTtBQUFBO0FBQ1osWUFBTSxFQUFFLFVBQVUsSUFBSTtBQUV0QixnQkFBVSxNQUFNO0FBRWhCLFlBQU0sYUFBYSxVQUFVLFVBQVU7QUFHdkMsVUFBSTtBQUNKLFVBQUkseUJBQVEsVUFBVSxFQUNqQixRQUFRLG9CQUFvQixFQUM1QjtBQUFBLFFBQ0c7QUFBQSxNQUNKLEVBQ0MsUUFBUSxDQUFDQyxVQUFTO0FBQ2YsMkJBQW1CQTtBQUNuQixRQUFBQSxNQUFLLFNBQVMsS0FBSyxZQUFZLEVBQUUsU0FBUyxDQUFDLE1BQU07QUFDN0MsZUFBSyxlQUFlO0FBQ3BCLDRCQUFrQixTQUFTQSxPQUFNLFVBQVUsZUFBZSxLQUFLLG9CQUFvQixDQUFDLENBQUM7QUFBQSxRQUN6RixDQUFDO0FBQUEsTUFDTCxDQUFDLEVBQ0EsWUFBWSxLQUFLLFlBQVksRUFDN0IsS0FBSyxDQUFDLGFBQWE7QUFFaEIsMEJBQWtCLFNBQVMsa0JBQWtCLFVBQVUsZUFBZSxLQUFLLG9CQUFvQixDQUFDLENBQUM7QUFBQSxNQUNyRyxDQUFDO0FBRUwsVUFBSTtBQUNKLFVBQUkseUJBQVEsVUFBVSxFQUNqQixRQUFRLGtCQUFrQixFQUMxQixRQUFRLCtDQUErQyxFQUN2RCxRQUFRLENBQUNBLFVBQVM7QUFDZix5QkFBaUJBO0FBQ2pCLFFBQUFBLE1BQUssU0FBUyxLQUFLLFVBQVUsRUFBRSxTQUFTLENBQUMsTUFBTTtBQUMzQyxlQUFLLGFBQWE7QUFDbEIsNEJBQWtCLFNBQVNBLE9BQU0sVUFBVSxhQUFhLEtBQUssb0JBQW9CLENBQUMsQ0FBQztBQUFBLFFBQ3ZGLENBQUM7QUFBQSxNQUNMLENBQUMsRUFDQSxLQUFLLENBQUMsYUFBYTtBQUNoQiwwQkFBa0IsU0FBUyxnQkFBZ0IsVUFBVSxhQUFhLEtBQUssb0JBQW9CLENBQUMsQ0FBQztBQUFBLE1BQ2pHLENBQUM7QUFFTCxVQUFJO0FBQ0osVUFBSSx5QkFBUSxVQUFVLEVBQ2pCLFFBQVEseUJBQXlCLEVBQ2pDLFFBQVEsOERBQThELEVBQ3RFLFFBQVEsQ0FBQ0EsVUFBUztBQUNmLCtCQUF1QkE7QUFDdkIsUUFBQUEsTUFBSyxTQUFTLEtBQUssZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLE1BQU07QUFDakQsZUFBSyxtQkFBbUI7QUFDeEIsNEJBQWtCLFNBQVNBLE9BQU0sVUFBVSxtQkFBbUIsS0FBSyxvQkFBb0IsQ0FBQyxDQUFDO0FBQUEsUUFDN0YsQ0FBQztBQUFBLE1BQ0wsQ0FBQyxFQUNBLEtBQUssQ0FBQyxhQUFhO0FBQ2hCLDBCQUFrQjtBQUFBLFVBQ2Q7QUFBQSxVQUNBLFVBQVUsbUJBQW1CLEtBQUssb0JBQW9CLENBQUM7QUFBQSxRQUMzRDtBQUFBLE1BQ0osQ0FBQztBQUVMLFVBQUkseUJBQVEsVUFBVSxFQUNqQixRQUFRLGtCQUFrQixFQUMxQixRQUFRLDREQUE0RCxFQUNwRSxZQUFZLENBQUMsYUFBYTtBQUN2QixjQUFNLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFNZDtBQUNBLGNBQU0sUUFBUSxDQUFDLE1BQU07QUFDakIsbUJBQVMsVUFBVSxHQUFHLENBQUM7QUFBQSxRQUMzQixDQUFDO0FBQ0QsaUJBQVMsU0FBUyxLQUFLLElBQUksRUFBRSxTQUFTLENBQUMsTUFBTTtBQUN6QyxlQUFLLE9BQU8sT0FBTyw0QkFBNEIsQ0FBQztBQUFBLFFBQ3BELENBQUM7QUFBQSxNQUNMLENBQUM7QUFFTCxVQUFJLE9BQU8sd0NBQXdDLEdBQUc7QUFDbEQsWUFBSSx5QkFBUSxVQUFVLEVBQ2pCLFFBQVEsc0JBQXNCLEVBQzlCO0FBQUEsVUFDRztBQUFBLFFBQ0osRUFDQyxVQUFVLENBQUMsV0FBVztBQUNuQixpQkFBTyxTQUFTLEtBQUssd0JBQXdCLEVBQUUsU0FBUyxDQUFPLFVBQVU7QUFDckUsaUJBQUssMkJBQTJCO0FBQUEsVUFDcEMsRUFBQztBQUFBLFFBQ0wsQ0FBQztBQUFBLE1BQ1Q7QUFFQSxZQUFNLFdBQVcsVUFBVSxVQUFVO0FBQ3JDLFlBQU0sZ0JBQWdCLElBQUkseUJBQVEsUUFBUTtBQUMxQyxvQkFBYyxVQUFVLENBQUMsTUFBTTtBQUMzQixVQUFFLFdBQVcsTUFBTSxFQUNkLFFBQVEsV0FBVyxFQUNuQixRQUFRLE1BQVk7QUFDakIsZ0JBQU0sU0FBUyxVQUFVLFNBQVMsS0FBSyxvQkFBb0IsQ0FBQztBQUM1RCxjQUFJLE9BQU8sU0FBUyxHQUFHO0FBQ25CLGtCQUFNLFVBQVUsT0FBTyxLQUFLLElBQUksSUFBSTtBQUVwQyxnQkFBSSx3QkFBTyxPQUFPO0FBQ2xCO0FBQUEsVUFDSjtBQUNBLGVBQUssUUFBUTtBQUNiLGVBQUssTUFBTTtBQUFBLFFBQ2YsRUFBQztBQUNMLGVBQU87QUFBQSxNQUNYLENBQUM7QUFDRCxvQkFBYyxlQUFlLENBQUMsTUFBTTtBQUNoQyxVQUFFLFFBQVEsT0FBTyxFQUNaLFdBQVcsUUFBUSxFQUNuQixRQUFRLE1BQU07QUFDWCxlQUFLLFFBQVE7QUFDYixlQUFLLE1BQU07QUFBQSxRQUNmLENBQUM7QUFDTCxlQUFPO0FBQUEsTUFDWCxDQUFDO0FBQUEsSUFDTDtBQUFBO0FBQUEsRUFRQSxTQUFTO0FBQ0wsU0FBSyxRQUFRO0FBQUEsRUFDakI7QUFBQSxFQUVBLE9BQU8sbUJBQW1CLFdBQTBCO0FBQ2hELGNBQVUsUUFBUSxTQUFTLDJCQUEyQjtBQUFBLEVBQzFEO0FBQUEsRUFFQSxPQUFPLHNCQUFzQixXQUEwQjtBQUNuRCxjQUFVLFFBQVEsWUFBWSwyQkFBMkI7QUFBQSxFQUM3RDtBQUFBLEVBRUEsT0FBZSxTQUFTQSxPQUFxQixVQUFvQjtBQUM3RCxVQUFNLFFBQVEsU0FBUyxXQUFXO0FBQ2xDLFFBQUksT0FBTztBQUNQLHdCQUFrQixzQkFBc0JBLEtBQUk7QUFBQSxJQUNoRCxPQUFPO0FBQ0gsd0JBQWtCLG1CQUFtQkEsS0FBSTtBQUFBLElBQzdDO0FBQUEsRUFDSjtBQUNKOzs7QVA5S08sSUFBTSxlQUFOLGNBQTBCLG1DQUFpQjtBQUFBLEVBVzlDLFlBQVksRUFBRSxPQUFPLEdBQTRCO0FBQzdDLFVBQU0sT0FBTyxLQUFLLE1BQU07QUFSNUIsMkJBQTZDO0FBQUEsTUFDekMsOEJBQThCLEtBQUssNkJBQTZCLEtBQUssSUFBSTtBQUFBLE1BQ3pFLGdDQUFnQyxLQUFLLCtCQUErQixLQUFLLElBQUk7QUFBQSxJQUNqRjtBQU9JLFNBQUssU0FBUztBQUFBLEVBQ2xCO0FBQUEsRUFLYSxhQUFhQyxTQUFpQztBQUFBO0FBQ3ZELFlBQU0sS0FBSyxPQUFPLGFBQWE7QUFFL0IsVUFBSUEsU0FBUTtBQUNSLGFBQUssUUFBUTtBQUFBLE1BQ2pCO0FBQUEsSUFDSjtBQUFBO0FBQUEsRUFFTyxVQUFnQjtBQUNuQixVQUFNLEVBQUUsWUFBWSxJQUFJO0FBRXhCLGdCQUFZLE1BQU07QUFDbEIsU0FBSyxZQUFZLFNBQVMsZ0JBQWdCO0FBSTFDLGdCQUFZLFNBQVMsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsZ0JBQVksU0FBUyxLQUFLO0FBQUEsTUFDdEIsS0FBSztBQUFBLE1BQ0wsTUFBTTtBQUFBLElBQ1YsQ0FBQztBQUdELGdCQUFZLFNBQVMsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0QsUUFBSSwwQkFBUSxXQUFXLEVBQ2xCLFFBQVEsb0JBQW9CLEVBQzVCO0FBQUEsTUFDRyxhQUFZO0FBQUEsUUFDUjtBQUFBLE1BTUo7QUFBQSxJQUNKLEVBQ0MsUUFBUSxDQUFDQyxVQUFTO0FBQ2YsWUFBTUMsWUFBVyxZQUFZO0FBSzdCLE1BQUFELE1BQUssZUFBZSxvQkFBb0IsRUFDbkMsU0FBU0MsVUFBUyxZQUFZLEVBQzlCLFNBQVMsQ0FBTyxVQUFVO0FBQ3ZCLHVCQUFlLEVBQUUsY0FBYyxNQUFNLENBQUM7QUFFdEMsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ25DLEVBQUM7QUFBQSxJQUNULENBQUM7QUFFTCxRQUFJLDBCQUFRLFdBQVcsRUFDbEIsUUFBUSx1Q0FBdUMsRUFDL0M7QUFBQSxNQUNHO0FBQUEsSUFDSixFQUNDLFVBQVUsQ0FBQyxXQUFXO0FBQ25CLFlBQU1BLFlBQVcsWUFBWTtBQUU3QixhQUFPLFNBQVNBLFVBQVMsa0JBQWtCLEVBQUUsU0FBUyxDQUFPLFVBQVU7QUFDbkUsdUJBQWUsRUFBRSxvQkFBb0IsTUFBTSxDQUFDO0FBRTVDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNuQyxFQUFDO0FBQUEsSUFDTCxDQUFDO0FBR0wsZ0JBQVksU0FBUyxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRCxVQUFNLEVBQUUsY0FBYyxJQUFJLFlBQVk7QUFFdEMsa0NBQWEsUUFBUSxDQUFDLFlBQVk7QUFDOUIsV0FBSyxvQkFBb0IsYUFBYSxTQUFTLGFBQWE7QUFBQSxJQUNoRSxDQUFDO0FBR0QsZ0JBQVksU0FBUyxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRCxRQUFJLDBCQUFRLFdBQVcsRUFDbEIsUUFBUSx1Q0FBdUMsRUFDL0MsUUFBUSxnR0FBMkYsRUFDbkcsVUFBVSxDQUFDLFdBQVc7QUFDbkIsWUFBTUEsWUFBVyxZQUFZO0FBQzdCLGFBQU8sU0FBU0EsVUFBUyxXQUFXLEVBQUUsU0FBUyxDQUFPLFVBQVU7QUFDNUQsdUJBQWUsRUFBRSxhQUFhLE1BQU0sQ0FBQztBQUNyQyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDbkMsRUFBQztBQUFBLElBQ0wsQ0FBQztBQUVMLFFBQUksMEJBQVEsV0FBVyxFQUNsQixRQUFRLGtEQUFrRCxFQUMxRDtBQUFBLE1BQ0csYUFBWTtBQUFBLFFBQ1I7QUFBQSxNQUtKO0FBQUEsSUFDSixFQUNDLFVBQVUsQ0FBQyxXQUFXO0FBQ25CLFlBQU1BLFlBQVcsWUFBWTtBQUM3QixhQUFPLFNBQVNBLFVBQVMsMEJBQTBCLEVBQUUsU0FBUyxDQUFPLFVBQVU7QUFDM0UsdUJBQWUsRUFBRSw0QkFBNEIsTUFBTSxDQUFDO0FBQ3BELGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNuQyxFQUFDO0FBQUEsSUFDTCxDQUFDO0FBRUwsUUFBSSwwQkFBUSxXQUFXLEVBQ2xCLFFBQVEsc0NBQXNDLEVBQzlDO0FBQUEsTUFDRztBQUFBLElBQ0osRUFDQyxRQUFRLENBQU8sVUFBVTtBQUN0QixZQUFNQSxZQUFXLFlBQVk7QUFDN0IsWUFBTSxLQUFLLE9BQU8sYUFBYTtBQUMvQixZQUNLLFNBQVMsYUFBWSxrQkFBa0JBLFVBQVMscUJBQXFCLENBQUMsRUFDdEUsU0FBUyxDQUFPLFVBQVU7QUFDdkIsY0FBTSxVQUFVLGFBQVksMkJBQTJCLEtBQUs7QUFDNUQsdUJBQWUsRUFBRSx1QkFBdUIsUUFBUSxDQUFDO0FBQ2pELGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNuQyxFQUFDO0FBQUEsSUFDVCxFQUFDO0FBR0wsZ0JBQVksU0FBUyxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUc1RCxRQUFJLDBCQUFRLFdBQVcsRUFDbEIsUUFBUSwyQkFBMkIsRUFDbkMsUUFBUSxpR0FBaUcsRUFDekcsVUFBVSxDQUFDLFdBQVc7QUFDbkIsWUFBTUEsWUFBVyxZQUFZO0FBQzdCLGFBQU8sU0FBU0EsVUFBUyxtQkFBbUIsRUFBRSxTQUFTLENBQU8sVUFBVTtBQUNwRSx1QkFBZSxFQUFFLHFCQUFxQixNQUFNLENBQUM7QUFDN0MsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ25DLEVBQUM7QUFBQSxJQUNMLENBQUM7QUFFTCxRQUFJLDBCQUFRLFdBQVcsRUFDbEIsUUFBUSx1Q0FBdUMsRUFDL0M7QUFBQSxNQUNHO0FBQUEsSUFDSixFQUNDLFVBQVUsQ0FBQyxXQUFXO0FBQ25CLFlBQU1BLFlBQVcsWUFBWTtBQUM3QixhQUNLLFVBQVUsR0FBRyxHQUFHLENBQUMsRUFDakIsU0FBU0EsVUFBUyxtQkFBbUIsRUFDckMsa0JBQWtCLEVBQ2xCLFNBQVMsQ0FBTyxVQUFVO0FBQ3ZCLHVCQUFlLEVBQUUscUJBQXFCLE1BQU0sQ0FBQztBQUM3QyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDbkMsRUFBQztBQUFBLElBQ1QsQ0FBQztBQUVMLFFBQUksMEJBQVEsV0FBVyxFQUNsQixRQUFRLDRDQUE0QyxFQUNwRDtBQUFBLE1BQ0c7QUFBQSxJQUNKLEVBQ0MsVUFBVSxDQUFDLFdBQVc7QUFDbkIsWUFBTUEsWUFBVyxZQUFZO0FBQzdCLGFBQ0ssVUFBVSxHQUFHLElBQUksQ0FBQyxFQUNsQixTQUFTQSxVQUFTLG1CQUFtQixFQUNyQyxrQkFBa0IsRUFDbEIsU0FBUyxDQUFPLFVBQVU7QUFDdkIsdUJBQWUsRUFBRSxxQkFBcUIsTUFBTSxDQUFDO0FBQzdDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNuQyxFQUFDO0FBQUEsSUFDVCxDQUFDO0FBR0wsZ0JBQVksU0FBUyxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd0RCxRQUFJLDBCQUFRLFdBQVcsRUFDbEIsUUFBUSxnQ0FBZ0MsRUFDeEM7QUFBQSxNQUNHO0FBQUEsSUFJSixFQUNDLFVBQVUsQ0FBQyxXQUFXO0FBQ25CLFlBQU1BLFlBQVcsWUFBWTtBQUM3QixhQUFPLFNBQVNBLFVBQVMsaUJBQWlCLEVBQUUsU0FBUyxDQUFPLFVBQVU7QUFDbEUsdUJBQWUsRUFBRSxtQkFBbUIsTUFBTSxDQUFDO0FBQzNDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNuQyxFQUFDO0FBQUEsSUFDTCxDQUFDO0FBQUEsRUFDVDtBQUFBLEVBRVEsb0JBQW9CLGFBQTBCLFNBQWMsZUFBNkI7QUFDN0YsVUFBTSxtQkFBbUIsWUFBWSxTQUFTLFdBQVc7QUFBQSxNQUNyRCxLQUFLO0FBQUEsTUFDTCxNQUFNLG1CQUNFLFFBQVEsUUFBUSxjQUFjLFFBQVEsUUFBUSxFQUFFLE1BQU0sS0FBSyxJQUFJLENBQUM7QUFBQSxJQUU1RSxDQUFDO0FBQ0QscUJBQWlCLE1BQU07QUFDdkIscUJBQWlCLFdBQVcsTUFBTTtBQUM5QixvQkFBYyxRQUFRLFFBQVEsaUJBQWlCO0FBQy9DLHFCQUFlLEVBQUUsY0FBNkIsQ0FBQztBQUMvQyxXQUFLLE9BQU8sYUFBYTtBQUFBLElBQzdCO0FBQ0EsVUFBTSxVQUFVLGlCQUFpQixTQUFTLFNBQVM7QUFDbkQsUUFBSSwwQkFBUSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsUUFBUSxJQUFJO0FBQ3RELFlBQVEsVUFBVSxXQUFXLEVBQUUsVUFBVSxRQUFRO0FBSWpELFFBQUksUUFBUSxXQUFXLE1BQU07QUFDekIsWUFBTSxTQUFTLGlCQUFpQixTQUFTLE9BQU87QUFBQSxRQUM1QyxLQUFLLFFBQVEsT0FBTztBQUFBLFFBQ3BCLE1BQU0sUUFBUSxPQUFPO0FBQUEsTUFDekIsQ0FBQztBQUNELFVBQUksUUFBUSxPQUFPLFNBQVMsTUFBTTtBQUM5QixlQUFPLG1CQUFtQixhQUFhLFFBQVEsT0FBTyxJQUFJO0FBQUEsTUFDOUQ7QUFBQSxJQUNKO0FBS0EsWUFBUSxTQUFTLFFBQVEsQ0FBQyxZQUFpQjtBQUN2QyxVQUFJLFFBQVEsZ0JBQWdCLE1BQU0sQ0FBQyxpQkFBaUIsUUFBUSxXQUFXLEdBQUc7QUFHdEU7QUFBQSxNQUNKO0FBQ0EsVUFBSSxRQUFRLFNBQVMsWUFBWTtBQUM3QixZQUFJLDBCQUFRLGdCQUFnQixFQUN2QixRQUFRLFFBQVEsSUFBSSxFQUNwQixRQUFRLFFBQVEsV0FBVyxFQUMzQixVQUFVLENBQUMsV0FBVztBQUNuQixnQkFBTUEsWUFBVyxZQUFZO0FBQzdCLGNBQUksQ0FBQ0EsVUFBUyxnQkFBZ0IsUUFBUSxjQUFjO0FBQ2hELGlDQUFxQixRQUFRLGFBQWEsUUFBUSxZQUFZO0FBQUEsVUFDbEU7QUFDQSxpQkFDSyxTQUFrQkEsVUFBUyxnQkFBZ0IsUUFBUSxZQUFZLEVBQy9ELFNBQVMsQ0FBTyxVQUFVO0FBQ3ZCLGlDQUFxQixRQUFRLGFBQWEsS0FBSztBQUMvQyxrQkFBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLFVBQ25DLEVBQUM7QUFBQSxRQUNULENBQUM7QUFBQSxNQUNULFdBQVcsUUFBUSxTQUFTLFFBQVE7QUFDaEMsWUFBSSwwQkFBUSxnQkFBZ0IsRUFDdkIsUUFBUSxRQUFRLElBQUksRUFDcEIsUUFBUSxRQUFRLFdBQVcsRUFDM0IsUUFBUSxDQUFDRCxVQUFTO0FBQ2YsZ0JBQU1DLFlBQVcsWUFBWTtBQUM3QixjQUFJLENBQUNBLFVBQVMsZ0JBQWdCLFFBQVEsY0FBYztBQUNoRCxpQ0FBcUIsUUFBUSxhQUFhLFFBQVEsWUFBWTtBQUFBLFVBQ2xFO0FBRUEsZ0JBQU0sV0FBVyxDQUFPLFVBQWtCO0FBQ3RDLGlDQUFxQixRQUFRLGFBQWEsS0FBSztBQUMvQyxrQkFBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLFVBQ25DO0FBRUEsVUFBQUQsTUFBSyxlQUFlLFFBQVEsWUFBWSxTQUFTLENBQUMsRUFDN0MsU0FBU0MsVUFBUyxnQkFBZ0IsUUFBUSxhQUFhLFNBQVMsQ0FBQyxFQUNqRSxhQUFTLDRCQUFTLFVBQVUsS0FBSyxJQUFJLENBQUM7QUFBQSxRQUMvQyxDQUFDO0FBQUEsTUFDVCxXQUFXLFFBQVEsU0FBUyxZQUFZO0FBQ3BDLFlBQUksMEJBQVEsZ0JBQWdCLEVBQ3ZCLFFBQVEsUUFBUSxJQUFJLEVBQ3BCLFFBQVEsUUFBUSxXQUFXLEVBQzNCLFlBQVksQ0FBQ0QsVUFBUztBQUNuQixnQkFBTUMsWUFBVyxZQUFZO0FBQzdCLGNBQUksQ0FBQ0EsVUFBUyxnQkFBZ0IsUUFBUSxjQUFjO0FBQ2hELGlDQUFxQixRQUFRLGFBQWEsUUFBUSxZQUFZO0FBQUEsVUFDbEU7QUFFQSxnQkFBTSxXQUFXLENBQU8sVUFBa0I7QUFDdEMsaUNBQXFCLFFBQVEsYUFBYSxLQUFLO0FBQy9DLGtCQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsVUFDbkM7QUFFQSxVQUFBRCxNQUFLLGVBQWUsUUFBUSxZQUFZLFNBQVMsQ0FBQyxFQUM3QyxTQUFTQyxVQUFTLGdCQUFnQixRQUFRLGFBQWEsU0FBUyxDQUFDLEVBQ2pFLGFBQVMsNEJBQVMsVUFBVSxLQUFLLElBQUksQ0FBQztBQUUzQyxVQUFBRCxNQUFLLFFBQVEsT0FBTztBQUNwQixVQUFBQSxNQUFLLFFBQVEsT0FBTztBQUFBLFFBQ3hCLENBQUM7QUFBQSxNQUNULFdBQVcsUUFBUSxTQUFTLFlBQVk7QUFDcEMsYUFBSyxnQkFBZ0IsUUFBUSxhQUFhLGtCQUFrQixJQUFJO0FBQUEsTUFDcEU7QUFFQSxVQUFJLFFBQVEsV0FBVyxNQUFNO0FBQ3pCLGNBQU0sU0FBUyxpQkFBaUIsU0FBUyxLQUFLO0FBQUEsVUFDMUMsS0FBSyxRQUFRLE9BQU87QUFBQSxVQUNwQixNQUFNLFFBQVEsT0FBTztBQUFBLFFBQ3pCLENBQUM7QUFDRCxZQUFJLFFBQVEsT0FBTyxTQUFTLE1BQU07QUFDOUIsaUJBQU8sbUJBQW1CLGFBQWEsUUFBUSxPQUFPLElBQUk7QUFBQSxRQUM5RDtBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFFQSxPQUFlLDJCQUEyQixPQUF5QjtBQUMvRCxXQUNJLE1BRUssTUFBTSxHQUFHLEVBQ1QsSUFBSSxDQUFDLFdBQVcsT0FBTyxLQUFLLENBQUMsRUFFN0IsSUFBSSxDQUFDLFdBQVcsT0FBTyxRQUFRLFlBQVksRUFBRSxDQUFDLEVBQzlDLE9BQU8sQ0FBQyxXQUFXLFdBQVcsRUFBRTtBQUFBLEVBRTdDO0FBQUEsRUFFQSxPQUFlLGtCQUFrQixTQUEyQjtBQUN4RCxXQUFPLFFBQVEsS0FBSyxHQUFHO0FBQUEsRUFDM0I7QUFBQSxFQVdBLDZCQUE2QixhQUEwQkMsV0FBdUI7QUFDMUUsVUFBTSxFQUFFLGVBQWUsSUFBSSxZQUFZO0FBR3ZDLG1CQUFlLGFBQWEsUUFBUSxDQUFDLGdCQUFnQjtBQUNqRDtBQUFBLFFBQ0k7QUFBQSxRQUNBO0FBQUEsUUFDQSxlQUFlO0FBQUEsUUFDZjtBQUFBLFFBQ0FBO0FBQUEsUUFDQUEsVUFBUztBQUFBLFFBQ1Q7QUFBQSxNQUNKO0FBQUEsSUFDSixDQUFDO0FBQUEsRUFDTDtBQUFBLEVBU0EsK0JBQStCLGFBQTBCQSxXQUF1QjtBQUM1RSxVQUFNLEVBQUUsZUFBZSxJQUFJLFlBQVk7QUFHdkMsbUJBQWUsZUFBZSxRQUFRLENBQUMsZ0JBQWdCO0FBQ25EO0FBQUEsUUFDSTtBQUFBLFFBQ0E7QUFBQSxRQUNBLGVBQWU7QUFBQSxRQUNmO0FBQUEsUUFDQUE7QUFBQSxRQUNBQSxVQUFTO0FBQUEsUUFDVDtBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFFRCxnQkFBWSxTQUFTLEtBQUs7QUFHMUIsVUFBTSxVQUFVLElBQUksMEJBQVEsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXO0FBQzNELGFBQ0ssY0FBYyxxQkFBcUIsRUFDbkMsT0FBTyxFQUNQLFFBQVEsTUFBWTtBQUNqQix1QkFBZTtBQUFBLFVBQ1gsZUFBZTtBQUFBLFVBQ2YsSUFBSSxvQkFBb0IsSUFBSSxJQUFJLElBQUksd0JBQXNCO0FBQUEsUUFDOUQ7QUFDQSxjQUFNLDRCQUE0QixnQkFBZ0JBLFNBQVE7QUFBQSxNQUM5RCxFQUFDO0FBQUEsSUFDVCxDQUFDO0FBQ0QsWUFBUSxPQUFPLE9BQU87QUFJdEIsVUFBTSxTQUF1QjtBQUFBLE1BRXpCLENBQUMsb0JBQTJCLDRCQUE0QixDQUFDO0FBQUEsTUFDekQsQ0FBQyx3QkFBK0IsZ0NBQWdDLENBQUM7QUFBQSxNQUNqRSxDQUFDLGdDQUF1QyxxQkFBcUIsQ0FBQztBQUFBLE1BQzlELENBQUMsaUJBQXdCLHlCQUF5QixDQUFDO0FBQUEsTUFDbkQsQ0FBQyxnQkFBdUIsd0JBQXdCLENBQUM7QUFBQSxNQUVqRCxDQUFDLCtCQUFzQyxzQkFBc0IsQ0FBQztBQUFBLElBQ2xFO0FBQ0EsZUFBVyxDQUFDLE1BQU0sVUFBVSxLQUFLLFFBQVE7QUFDckMsWUFBTSxrQ0FBa0MsSUFBSSwwQkFBUSxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7QUFDbkYsY0FBTSxRQUFRLEdBQUcsYUFBYSxXQUFXO0FBQ3pDLGVBQU8sY0FBYyxLQUFLLEVBQUUsUUFBUSxNQUFZO0FBQzVDLGdCQUFNLDBCQUEwQixZQUFZLGdCQUFnQkEsU0FBUTtBQUFBLFFBQ3hFLEVBQUM7QUFBQSxNQUNMLENBQUM7QUFDRCxzQ0FBZ0MsT0FBTyxPQUFPO0FBQUEsSUFDbEQ7QUFHQSxVQUFNLHdCQUF3QixJQUFJLDBCQUFRLFdBQVcsRUFBRSxVQUFVLENBQUMsV0FBVztBQUN6RSxhQUNLLGNBQWMsOEJBQThCLEVBQzVDLE9BQU8sRUFDUCxRQUFRLE1BQVk7QUFDakIsY0FBTSxRQUFRLEtBQUssT0FBTyxTQUFTO0FBQ25DLGNBQU0sY0FBYyxNQUFPLElBQUksQ0FBQyxTQUFTO0FBQ3JDLGlCQUFPLEtBQUs7QUFBQSxRQUNoQixDQUFDO0FBQ0QsY0FBTSxrQkFBa0IsZUFBZSxZQUFZLEVBQUUsb0JBQW9CLFdBQVc7QUFDcEYsWUFBSSxnQkFBZ0IsV0FBVyxHQUFHO0FBQzlCO0FBQUEsUUFDSjtBQUNBLHdCQUFnQixRQUFRLENBQUMsTUFBTTtBQUMzQix5QkFBZSxVQUFVLGVBQWUsZ0JBQWdCLENBQUM7QUFBQSxRQUM3RCxDQUFDO0FBQ0QsY0FBTSw0QkFBNEIsZ0JBQWdCQSxTQUFRO0FBQUEsTUFDOUQsRUFBQztBQUFBLElBQ1QsQ0FBQztBQUNELDBCQUFzQixPQUFPLE9BQU87QUFHcEMsVUFBTSxzQkFBc0IsSUFBSSwwQkFBUSxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7QUFDdkUsYUFDSyxjQUFjLHVDQUF1QyxFQUNyRCxXQUFXLEVBQ1gsUUFBUSxNQUFZO0FBQ2pCLHVCQUFlLHVCQUF1QixjQUFjO0FBQ3BELGNBQU0sNEJBQTRCLGdCQUFnQkEsU0FBUTtBQUFBLE1BQzlELEVBQUM7QUFBQSxJQUNULENBQUM7QUFDRCx3QkFBb0IsT0FBTyxPQUFPO0FBQUEsRUFDdEM7QUFDSjtBQXBkTyxJQUFNLGNBQU47QUFBTSxZQWlCTSx5QkFBeUIsQ0FBQyxTQUNyQyxlQUFlLENBQUMscUJBQXNCLGlCQUFpQixVQUFVLEVBQUUsWUFBWSxJQUFLO0FBOGM1RixTQUFTLHVCQUNMLGFBQ0EsWUFDQSxVQUNBLGdCQUNBQSxXQUNBLFFBQ0EsY0FDRjtBQUdFLFFBQU0sb0JBQW9CLFlBQVksU0FBUyxLQUFLO0FBQ3BELG9CQUFrQixTQUFTLGdCQUFnQjtBQUMzQyxvQkFBa0IsY0FBYyxJQUFJLE9BQU8sVUFBVSxFQUFFLFlBQVk7QUFFbkUsUUFBTSxVQUFVLElBQUksMEJBQVEsV0FBVztBQUV2QyxVQUFRLE9BQU8sWUFBWSxpQkFBaUI7QUFFNUMsTUFBSSxDQUFDLGNBQWM7QUFDZixZQUFRLGVBQWUsQ0FBQyxVQUFVO0FBQzlCLFlBQ0ssUUFBUSxPQUFPLEVBQ2YsV0FBVyxRQUFRLEVBQ25CLFFBQVEsTUFBWTtBQUNqQixZQUFJLGVBQWUsYUFBYSxVQUFVLFVBQVUsR0FBRztBQUNuRCxnQkFBTSw0QkFBNEIsZ0JBQWdCQSxTQUFRO0FBQUEsUUFDOUQ7QUFBQSxNQUNKLEVBQUM7QUFBQSxJQUNULENBQUM7QUFBQSxFQUNMO0FBRUEsVUFBUSxlQUFlLENBQUMsVUFBVTtBQUM5QixVQUNLLFFBQVEsUUFBUSxFQUNoQixXQUFXLE1BQU0sRUFDakIsUUFBUSxNQUFZO0FBQ2pCLFlBQU0sUUFBUSxJQUFJLGtCQUFrQixRQUFRLFlBQVksWUFBWTtBQUVwRSxZQUFNLFVBQVUsTUFBWTtBQUN4QixZQUFJLE1BQU0sT0FBTztBQUNiLGNBQUksZUFBZSxjQUFjLFVBQVUsWUFBWSxNQUFNLG9CQUFvQixDQUFDLEdBQUc7QUFDakYsa0JBQU0sNEJBQTRCLGdCQUFnQkEsU0FBUTtBQUFBLFVBQzlEO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFFQSxZQUFNLEtBQUs7QUFBQSxJQUNmLEVBQUM7QUFBQSxFQUNULENBQUM7QUFFRCxVQUFRLE9BQU8sT0FBTztBQUMxQjtBQUVBLFNBQWUsMEJBQ1gsbUJBQ0EsZ0JBQ0FBLFdBQ0Y7QUFBQTtBQUNFLFVBQU0sVUFBVSxlQUFlLHdCQUF3QixnQkFBZ0IsaUJBQWlCO0FBRXhGLFlBQVEsUUFBUSxDQUFDLFdBQVc7QUFDeEIsVUFBSSx5QkFBTyxNQUFNO0FBQUEsSUFDckIsQ0FBQztBQUVELFVBQU0sNEJBQTRCLGdCQUFnQkEsU0FBUTtBQUFBLEVBQzlEO0FBQUE7QUFFQSxTQUFlLDRCQUE0QixhQUE2QkEsV0FBdUI7QUFBQTtBQUMzRixtQkFBZTtBQUFBLE1BQ1gsZ0JBQWdCO0FBQUEsSUFDcEIsQ0FBQztBQUlELG1CQUFlLHNCQUFzQixhQUFhLGVBQWUsWUFBWSxDQUFDO0FBRTlFLFVBQU1BLFVBQVMsYUFBYSxJQUFJO0FBQUEsRUFDcEM7QUFBQTs7O0FTNWpCQSxJQUFBQyxvQkFBa0Q7OztBQ09sRCxJQUFNLHVCQUF1QixHQUFRLGtCQUF1QixzQkFBMkI7QUFvQmhGLFNBQVMsaUJBQWlCLE1BQWMsV0FBbUJDLFdBQW1DO0FBQ2pHLE1BQUksY0FBNkIsQ0FBQztBQUdsQyxnQkFBYyxZQUFZLE9BQU8sb0JBQW9CLE1BQU0sV0FBV0EsU0FBUSxDQUFDO0FBRy9FLGdCQUFjLFlBQVksT0FBTyx5QkFBeUIsTUFBTSxXQUFXQSxTQUFRLENBQUM7QUFHcEYsUUFBTSwwQkFBMEIsZ0NBQWdDLE1BQU1BLFNBQVE7QUFLOUUsUUFBTSxZQUFZLGdCQUFnQixNQUFNLG1CQUFtQixTQUFTO0FBQ3BFLE1BQUksbUJBQW1CO0FBQ3ZCLE1BQUksYUFBYSxVQUFVLFNBQVMsR0FBRztBQUNuQyxVQUFNLGtCQUFrQixVQUFVO0FBQ2xDLFFBQUksZ0JBQWdCLFVBQVUsS0FBSyxJQUFJLEdBQUdBLFVBQVMsbUJBQW1CLEdBQUc7QUFDckUsWUFBTSxzQkFBc0Isd0JBQXdCO0FBQUEsUUFBTyxDQUFDLGdCQUN4RCxZQUFZLFlBQVksWUFBWSxFQUFFLFNBQVMsZ0JBQWdCLFlBQVksQ0FBQztBQUFBLE1BQ2hGO0FBQ0EsaUJBQVcsWUFBWSxxQkFBcUI7QUFDeEMsb0JBQVksS0FBSztBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsYUFBYSxTQUFTO0FBQUEsVUFDdEIsWUFBWSxTQUFTO0FBQUEsVUFDckIsVUFBVSxVQUFVO0FBQUEsVUFDcEIsWUFBWSxnQkFBZ0I7QUFBQSxRQUNoQyxDQUFDO0FBQ0QsMkJBQW1CO0FBQUEsTUFDdkI7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUdBLE1BQUksQ0FBQyxvQkFBb0JBLFVBQVMsd0JBQXdCO0FBQ3RELGtCQUFjLFlBQVksT0FBTyx1QkFBdUI7QUFLNUQsTUFBSSxZQUFZLFNBQVMsS0FBSyxDQUFDLFlBQVksS0FBSyxDQUFDLFVBQVUsTUFBTSxtQkFBbUIsT0FBTyxHQUFHO0FBRTFGLGdCQUFZLFFBQVE7QUFBQSxNQUNoQixnQkFBZ0I7QUFBQSxNQUNoQixhQUFhO0FBQUEsTUFDYixZQUFZO0FBQUEsSUFDaEIsQ0FBQztBQUFBLEVBQ0w7QUFHQSxnQkFBYyxZQUFZLE1BQU0sR0FBR0EsVUFBUyxtQkFBbUI7QUFFL0QsU0FBTztBQUNYO0FBRUEsU0FBUyxZQUFZLE1BQWM7QUFDL0IsTUFBSSxPQUFPLE9BQVksZUFBZSxFQUFFLEtBQUssQ0FBQyxVQUFVLE1BQU0sU0FBUyxLQUFLLEtBQUssU0FBUyxLQUFLLENBQUM7QUFBRyxXQUFPO0FBQzlHO0FBS0EsU0FBUyxnQ0FBZ0MsTUFBYyxXQUFvQztBQUN2RixRQUFNLGNBQTZCLENBQUM7QUFFcEMsTUFBSSxDQUFDLEtBQUssU0FBYyxhQUFhO0FBQ2pDLGdCQUFZLEtBQUs7QUFBQSxNQUNiLGFBQWEsR0FBUTtBQUFBLE1BQ3JCLFlBQVksR0FBUTtBQUFBLElBQ3hCLENBQUM7QUFDTCxNQUFJLENBQUMsS0FBSyxTQUFjLGVBQWU7QUFDbkMsZ0JBQVksS0FBSztBQUFBLE1BQ2IsYUFBYSxHQUFRO0FBQUEsTUFDckIsWUFBWSxHQUFRO0FBQUEsSUFDeEIsQ0FBQztBQUNMLE1BQUksQ0FBQyxLQUFLLFNBQWMsbUJBQW1CO0FBQ3ZDLGdCQUFZLEtBQUs7QUFBQSxNQUNiLGFBQWEsR0FBUTtBQUFBLE1BQ3JCLFlBQVksR0FBUTtBQUFBLElBQ3hCLENBQUM7QUFDTCxNQUFJLENBQUMsWUFBWSxJQUFJLEdBQUc7QUFDcEIsZ0JBQVksS0FBSztBQUFBLE1BQ2IsYUFBYSxHQUFRLGdCQUFnQjtBQUFBLE1BQ3JDLFlBQVksR0FBUSxnQkFBZ0I7QUFBQSxJQUN4QyxDQUFDO0FBQ0QsZ0JBQVksS0FBSztBQUFBLE1BQ2IsYUFBYSxHQUFRLGdCQUFnQjtBQUFBLE1BQ3JDLFlBQVksR0FBUSxnQkFBZ0I7QUFBQSxJQUN4QyxDQUFDO0FBQ0QsZ0JBQVksS0FBSztBQUFBLE1BQ2IsYUFBYSxHQUFRLGdCQUFnQjtBQUFBLE1BQ3JDLFlBQVksR0FBUSxnQkFBZ0I7QUFBQSxJQUN4QyxDQUFDO0FBQUEsRUFDTDtBQUNBLE1BQUksQ0FBQyxLQUFLLFNBQWMsZ0JBQWdCO0FBQ3BDLGdCQUFZLEtBQUs7QUFBQSxNQUNiLGFBQWEsR0FBUTtBQUFBLE1BQ3JCLFlBQVksR0FBUTtBQUFBLElBQ3hCLENBQUM7QUFFTCxTQUFPO0FBQ1g7QUFVQSxTQUFTLG9CQUFvQixNQUFjLFdBQW1CQSxXQUFtQztBQUM3RixRQUFNLHFCQUFxQjtBQUFBLElBQ3ZCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBRUEsUUFBTSxVQUF5QixDQUFDO0FBQ2hDLFFBQU0sWUFBWSxJQUFJLE9BQU8sS0FBSyw2Q0FBNkMsSUFBSTtBQUNuRixRQUFNLFlBQVksZ0JBQWdCLE1BQU0sV0FBVyxTQUFTO0FBQzVELE1BQUksYUFBYSxVQUFVLFVBQVUsR0FBRztBQUNwQyxVQUFNLGFBQWEsVUFBVTtBQUM3QixVQUFNLGFBQWEsVUFBVTtBQUM3QixRQUFJLFdBQVcsU0FBU0EsVUFBUyxxQkFBcUI7QUFDbEQsYUFBTyxDQUFDO0FBQUEsSUFDWjtBQUtBLFVBQU0sZUFDRixjQUFjLFdBQVcsU0FBUyxJQUFJLFdBQVcsVUFBVSxlQUFlLFVBQVUsR0FBRyxJQUFJLElBQUk7QUFDbkcsUUFBSSxnQkFBZ0IsYUFBYSxRQUFRLEdBQUc7QUFHeEMsY0FBUSxLQUFLO0FBQUEsUUFDVCxhQUFhLEdBQUcsYUFBYSxPQUFZLHVCQUF1QixVQUFVO0FBQUEsUUFDMUUsWUFBWSxHQUFHLGNBQWMsYUFBYSxPQUFZLHVCQUF1QixVQUFVO0FBQUEsUUFDdkYsVUFBVSxVQUFVO0FBQUEsUUFDcEIsWUFBWSxVQUFVLEdBQUc7QUFBQSxNQUM3QixDQUFDO0FBQUEsSUFDTDtBQVFBLFVBQU0sV0FBVztBQUNqQixVQUFNLHdCQUF3QjtBQUM5QixRQUFJLGlCQUFpQixtQkFDaEI7QUFBQSxNQUNHLENBQUMsVUFDRyxjQUNBLFdBQVcsVUFBVSxZQUNyQixNQUFNLFlBQVksRUFBRSxTQUFTLFdBQVcsWUFBWSxDQUFDO0FBQUEsSUFDN0QsRUFDQyxNQUFNLEdBQUcscUJBQXFCO0FBQ25DLFFBQUksZUFBZSxXQUFXLEdBQUc7QUFFN0IsdUJBQWlCLG1CQUFtQixNQUFNLEdBQUcscUJBQXFCO0FBQUEsSUFDdEU7QUFDQSxlQUFXLFNBQVMsZ0JBQWdCO0FBQ2hDLFlBQU0sYUFBYSxXQUFXLFVBQVUsT0FBTyxJQUFJO0FBQ25ELFlBQU0sZ0JBQWdCLEdBQUcsV0FBVyxPQUFZLHVCQUF1QixVQUFVO0FBQ2pGLGNBQVEsS0FBSztBQUFBLFFBQ1QsZ0JBQWdCO0FBQUEsUUFDaEIsYUFBYSxHQUFHLFVBQVU7QUFBQSxRQUMxQixZQUFZLEdBQUcsY0FBYztBQUFBLFFBQzdCLFVBQVUsVUFBVTtBQUFBLFFBQ3BCLFlBQVksVUFBVSxHQUFHO0FBQUEsTUFDN0IsQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBQ0EsU0FBTztBQUNYO0FBVUEsU0FBUyx5QkFBeUIsTUFBYyxXQUFtQkEsV0FBb0I7QUFsT3ZGO0FBbU9JLFFBQU0scUJBQXFCO0FBQUEsSUFDdkI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBRUEsUUFBTSxVQUF5QixDQUFDO0FBQ2hDLFFBQU0sa0JBQWtCLElBQUksT0FBTyxJQUFTLHdDQUF3QyxJQUFJO0FBQ3hGLFFBQU0sa0JBQWtCLGdCQUFnQixNQUFNLGlCQUFpQixTQUFTO0FBQ3hFLE1BQUksbUJBQW1CLGdCQUFnQixVQUFVLEdBQUc7QUFDaEQsVUFBTSxtQkFBbUIsZ0JBQWdCO0FBQ3pDLFVBQU0sbUJBQW1CLGdCQUFnQjtBQUN6QyxRQUFJLGlCQUFpQixTQUFTQSxVQUFTO0FBQXFCLGFBQU8sQ0FBQztBQUNwRSxRQUFJLGlCQUFpQixTQUFTLEdBQUc7QUFHN0IsWUFBTSxvQkFBbUIsZ0JBQVcsU0FBUztBQUFBLFFBQ3pDLG9CQUFvQjtBQUFBLFFBQ3BCLFdBQVc7QUFBQSxRQUNYLGVBQWU7QUFBQSxRQUNmLFNBQVM7QUFBQSxNQUNiLENBQUMsTUFMd0IsbUJBS3JCO0FBQ0osVUFBSSxrQkFBa0I7QUFDbEIsY0FBTSxlQUFlLEdBQUcsb0JBQW9CO0FBQzVDLGdCQUFRLEtBQUs7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLGFBQWEsVUFBSztBQUFBLFVBQ2xCLFlBQVk7QUFBQSxVQUNaLFVBQVUsZ0JBQWdCO0FBQUEsVUFDMUIsWUFBWSxnQkFBZ0IsR0FBRztBQUFBLFFBQ25DLENBQUM7QUFLRCxZQUFJLGdCQUFnQixNQUFNO0FBQWMsaUJBQU8sQ0FBQztBQUFBLE1BQ3BEO0FBQUEsSUFDSjtBQVNBLFVBQU0sV0FBVztBQUNqQixVQUFNLDRCQUE0QkEsVUFBUyxzQkFBc0I7QUFDakUsUUFBSSxpQkFBaUIsbUJBQ2hCO0FBQUEsTUFDRyxDQUFDLFVBQ0csb0JBQ0EsaUJBQWlCLFVBQVUsWUFDM0IsTUFBTSxZQUFZLEVBQUUsU0FBUyxpQkFBaUIsWUFBWSxDQUFDO0FBQUEsSUFDbkUsRUFDQyxNQUFNLEdBQUcseUJBQXlCO0FBQ3ZDLFFBQUksZUFBZSxXQUFXLEtBQUssaUJBQWlCLEtBQUssRUFBRSxXQUFXLEdBQUc7QUFHckUsdUJBQWlCLG1CQUFtQixNQUFNLEdBQUcseUJBQXlCO0FBQUEsSUFDMUU7QUFDQSxlQUFXLFNBQVMsZ0JBQWdCO0FBQ2hDLGNBQVEsS0FBSztBQUFBLFFBQ1QsZ0JBQWdCO0FBQUEsUUFDaEIsYUFBYSxHQUFHO0FBQUEsUUFDaEIsWUFBWSxHQUFHLG9CQUFvQjtBQUFBLFFBQ25DLFVBQVUsZ0JBQWdCO0FBQUEsUUFDMUIsWUFBWSxnQkFBZ0IsR0FBRztBQUFBLE1BQ25DLENBQUM7QUFBQSxJQUNMO0FBQUEsRUFDSjtBQUVBLFNBQU87QUFDWDtBQU1PLFNBQVMsZ0JBQWdCLEdBQVcsR0FBVyxVQUFvQztBQUN0RixRQUFNLFVBQVUsRUFBRSxTQUFTLENBQUM7QUFDNUIsYUFBVyxTQUFTLFNBQVM7QUFDekIsU0FBSSwrQkFBTyxVQUFTLE1BQU0sU0FBUyxZQUFZLFlBQVksTUFBTSxRQUFRLE1BQU0sR0FBRztBQUFRLGFBQU87QUFBQSxFQUNyRztBQUNBLFNBQU8sQ0FBQztBQUNaOzs7QUR0VE8sSUFBTSxrQkFBTixjQUE4QixnQ0FBc0M7QUFBQSxFQUd2RSxZQUFZLEtBQVVDLFdBQW9CO0FBQ3RDLFVBQU0sR0FBRztBQUNULFNBQUssV0FBV0E7QUFBQSxFQUNwQjtBQUFBLEVBRUEsVUFBVSxRQUF3QixRQUFnQixPQUErQztBQUM3RixRQUFJLENBQUMsS0FBSyxTQUFTO0FBQXFCLGFBQU87QUFDL0MsVUFBTSxPQUFPLE9BQU8sUUFBUSxPQUFPLElBQUk7QUFDdkMsUUFBSSxLQUFLLFNBQVMsS0FBSyxTQUFTLFlBQVksS0FBSyxLQUFLLE1BQVcsdUJBQXVCLFNBQVMsR0FBRztBQUNoRyxhQUFPO0FBQUEsUUFDSCxPQUFPLEVBQUUsTUFBTSxPQUFPLE1BQU0sSUFBSSxFQUFFO0FBQUEsUUFDbEMsS0FBSztBQUFBLFVBQ0QsTUFBTSxPQUFPO0FBQUEsVUFDYixJQUFJLEtBQUs7QUFBQSxRQUNiO0FBQUEsUUFDQSxPQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsZUFBZSxTQUF5RDtBQUNwRSxVQUFNLE9BQU8sUUFBUTtBQUNyQixVQUFNLGdCQUFnQixRQUFRLE9BQU8sVUFBVTtBQUUvQyxVQUFNLGNBQTZCLGlCQUFpQixNQUFNLGNBQWMsSUFBSSxLQUFLLFFBQVE7QUFHekYsVUFBTSx5QkFBbUQsQ0FBQztBQUMxRCxlQUFXLGNBQWM7QUFBYSw2QkFBdUIsS0FBSyxpQ0FBSyxhQUFMLEVBQWlCLFFBQWlCLEVBQUM7QUFFckcsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLGlCQUFpQixPQUErQixJQUFpQjtBQUM3RCxPQUFHLFFBQVEsTUFBTSxXQUFXO0FBQUEsRUFDaEM7QUFBQSxFQUVBLGlCQUFpQixPQUErQixNQUFrQztBQXJEdEY7QUFzRFEsVUFBTSxTQUFTLE1BQU0sUUFBUTtBQUM3QixRQUFJLE1BQU0sbUJBQW1CLFNBQVM7QUFFbEMsV0FBSyxNQUFNO0FBQ1gsWUFBTSxhQUFhLElBQUksY0FBYyxXQUFXO0FBQUEsUUFDNUMsTUFBTTtBQUFBLFFBQ04sS0FBSztBQUFBLE1BQ1QsQ0FBQztBQUNELE9BQUMsNENBQWdCLE9BQWhCLG1CQUFvQixlQUFwQixtQkFBZ0MsY0FBYztBQUMvQztBQUFBLElBQ0o7QUFDQSxVQUFNLGdCQUFnQixNQUFNLFFBQVEsT0FBTyxVQUFVO0FBQ3JELFVBQU0sY0FBYztBQUFBLE1BQ2hCLE1BQU0sY0FBYztBQUFBLE1BQ3BCLEtBQUksV0FBTSxhQUFOLFlBQWtCLGNBQWM7QUFBQSxJQUN4QztBQUNBLFVBQU0sWUFBWSxNQUFNLGFBQ2xCO0FBQUEsTUFDSSxNQUFNLGNBQWM7QUFBQSxNQUNwQixJQUFJLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDL0IsSUFDQTtBQUNOLFVBQU0sUUFBUSxPQUFPLGFBQWEsTUFBTSxZQUFZLGFBQWEsU0FBUztBQUMxRSxVQUFNLFFBQVEsT0FBTyxVQUFVO0FBQUEsTUFDM0IsTUFBTSxjQUFjO0FBQUEsTUFDcEIsSUFBSSxZQUFZLEtBQUssTUFBTSxXQUFXO0FBQUEsSUFDMUMsQ0FBQztBQUFBLEVBQ0w7QUFDSjs7O0FoSGxFQSxJQUFxQixjQUFyQixjQUF5Qyx5QkFBTztBQUFBLEVBS3RDLFNBQVM7QUFBQTtBQUNYLGNBQVEsSUFBSSx3QkFBd0I7QUFFcEMsWUFBTSxLQUFLLGFBQWE7QUFDeEIsV0FBSyxjQUFjLElBQUksWUFBWSxFQUFFLFFBQVEsS0FBSyxDQUFDLENBQUM7QUFFcEQscUJBQWU7QUFBQSxRQUNYLGVBQWUsS0FBSyxJQUFJO0FBQUEsUUFDeEIsT0FBTyxLQUFLLElBQUk7QUFBQSxNQUNwQixDQUFDO0FBR0QsWUFBTSxLQUFLLGlCQUFpQjtBQUU1QixZQUFNLFNBQVMsSUFBSSxZQUFZLEVBQUUsZ0JBQWdCLEtBQUssSUFBSSxVQUFVLENBQUM7QUFDckUsV0FBSyxRQUFRLElBQUlDLE9BQU07QUFBQSxRQUNuQixlQUFlLEtBQUssSUFBSTtBQUFBLFFBQ3hCLE9BQU8sS0FBSyxJQUFJO0FBQUEsUUFDaEI7QUFBQSxNQUNKLENBQUM7QUFDRCxXQUFLLGlCQUFpQixJQUFJLGVBQWUsRUFBRSxRQUFRLEtBQUssQ0FBQztBQUN6RCxXQUFLLGdCQUFnQixJQUFJLGNBQWMsRUFBRSxRQUFRLE1BQU0sT0FBTyxDQUFDO0FBRS9ELFdBQUssd0JBQXdCLHdCQUF3QixDQUFDO0FBQ3RELFdBQUssc0JBQXNCLElBQUksZ0JBQWdCLEtBQUssS0FBSyxZQUFZLENBQUMsQ0FBQztBQUN2RSxVQUFJLFNBQVMsRUFBRSxRQUFRLEtBQUssQ0FBQztBQUFBLElBQ2pDO0FBQUE7QUFBQSxFQUVNLG1CQUFtQjtBQUFBO0FBQ3JCLFlBQU0sRUFBRSxlQUFlLElBQUksWUFBWTtBQUN2QyxxQkFBZSxzQkFBc0IsZ0JBQWdCLGVBQWUsWUFBWSxDQUFDO0FBQUEsSUFDckY7QUFBQTtBQUFBLEVBRUEsV0FBVztBQXREZjtBQXVEUSxZQUFRLElBQUksMEJBQTBCO0FBQ3RDLGVBQUssVUFBTCxtQkFBWTtBQUFBLEVBQ2hCO0FBQUEsRUFFTSxlQUFlO0FBQUE7QUFDakIsWUFBTSxjQUFjLE1BQU0sS0FBSyxTQUFTO0FBQ3hDLHFCQUFlLFdBQVc7QUFDMUIsWUFBTSxLQUFLLGlCQUFpQjtBQUFBLElBQ2hDO0FBQUE7QUFBQSxFQUVNLGVBQWU7QUFBQTtBQUNqQixZQUFNLEtBQUssU0FBUyxZQUFZLENBQUM7QUFBQSxJQUNyQztBQUFBO0FBQUEsRUFFTyxXQUErQjtBQXJFMUM7QUFzRVEsWUFBTyxVQUFLLFVBQUwsbUJBQVk7QUFBQSxFQUN2QjtBQUNKOyIsCiAgIm5hbWVzIjogWyJtb2R1bGUiLCAiX19leHRlbmRzIiwgIl9fYXNzaWduIiwgIl9fcmVzdCIsICJfX2RlY29yYXRlIiwgIl9fcGFyYW0iLCAiX19tZXRhZGF0YSIsICJfX2F3YWl0ZXIiLCAiX19nZW5lcmF0b3IiLCAiX19leHBvcnRTdGFyIiwgIl9fdmFsdWVzIiwgIl9fcmVhZCIsICJfX3NwcmVhZCIsICJfX3NwcmVhZEFycmF5cyIsICJfX3NwcmVhZEFycmF5IiwgIl9fYXdhaXQiLCAiX19hc3luY0dlbmVyYXRvciIsICJfX2FzeW5jRGVsZWdhdG9yIiwgIl9fYXN5bmNWYWx1ZXMiLCAiX19tYWtlVGVtcGxhdGVPYmplY3QiLCAiX19pbXBvcnRTdGFyIiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwgIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiLCAiX19jbGFzc1ByaXZhdGVGaWVsZEluIiwgIl9fY3JlYXRlQmluZGluZyIsICJleHBvcnRzIiwgInYiLCAibW9kdWxlIiwgInQiLCAiZSIsICJuIiwgInIiLCAiaSIsICJzIiwgInUiLCAiTSIsICJtIiwgImgiLCAiJCIsICJsIiwgInkiLCAiZyIsICJEIiwgInYiLCAibyIsICJkIiwgImEiLCAiZiIsICJjIiwgIl9faW1wb3J0RGVmYXVsdCIsICJtb2R1bGUiLCAidCIsICJlIiwgImkiLCAiciIsICJzIiwgIl9faW1wb3J0RGVmYXVsdCIsICJ0ZXh0IiwgInRleHQiLCAiRmlsdGVyIiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX2EiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0U3RhciIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJ0ZXh0IiwgInRleHQiLCAiX19pbXBvcnREZWZhdWx0IiwgInRleHQiLCAicGFyc2VEYXRlIiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydFN0YXIiLCAiX19pbXBvcnREZWZhdWx0IiwgInRleHQiLCAicGFyc2VEYXRlIiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydFN0YXIiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAidGV4dCIsICJwYXJzZURhdGUiLCAidGV4dCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydFN0YXIiLCAidGV4dCIsICJfX2ltcG9ydERlZmF1bHQiLCAidGV4dCIsICJwYXJzZURhdGUiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydFN0YXIiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJ0ZXh0IiwgInBhcnNlRGF0ZSIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0U3RhciIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAidGV4dCIsICJwYXJzZURhdGUiLCAiX19pbXBvcnREZWZhdWx0IiwgInRleHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJ0ZXh0IiwgInBhcnNlRGF0ZSIsICJfX2ltcG9ydERlZmF1bHQiLCAidGV4dCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgInRleHQiLCAicGFyc2VEYXRlIiwgIl9fZXhwb3J0U3RhciIsICJfX2ltcG9ydFN0YXIiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydFN0YXIiLCAiX19pbXBvcnRTdGFyIiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2ltcG9ydERlZmF1bHQiLCAiX19pbXBvcnREZWZhdWx0IiwgInRleHQiLCAicGFyc2VEYXRlIiwgIl9faW1wb3J0U3RhciIsICJNZXJpZGllbSIsICJ0ZXh0IiwgInBhcnNlRGF0ZSIsICJPcGVyYXRvcnMiLCAiU3RydWN0dXJhbENoYXJhY3RlcnMiLCAiVG9rZW5zIiwgInJlcXVpcmVfY29uc3QiLCAiX19hc3NpZ24iLCAicmVxdWlyZV91dGlscyIsICJfX3NwcmVhZEFycmF5cyIsICJfX3NwcmVhZEFycmF5cyIsICJyZXF1aXJlX3V0aWxzIiwgInJlcXVpcmVfY29uc3QiLCAiX19zcHJlYWRBcnJheXMiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJlbGVtZW50IiwgIldlZWtkYXkiLCAiZGF0ZXV0aWwiLCAiSXRlclJlc3VsdCIsICJ0c2xpYiIsICJDYWxsYmFja0l0ZXJSZXN1bHQiLCAiVG9UZXh0IiwgIlBhcnNlciIsICJ0ZXh0IiwgIkZyZXF1ZW5jeSIsICJ0ZXh0IiwgIlRpbWUiLCAiRGF0ZVRpbWUiLCAiYXR0ciIsICJEYXRlV2l0aFpvbmUiLCAiZGVmYXVsdEtleXMiLCAia2V5IiwgInZhbHVlIiwgIkNhY2hlIiwgIml0ZW0iLCAiaSIsICJJdGVyaW5mbyIsICJSUnVsZSIsICJ0ZXh0IiwgInpvbmVkRGF0ZSIsICJERUZBVUxUX09QVElPTlMiLCAidmFsIiwgImluaXRpYWxpemVPcHRpb25zIiwgImRlZmF1bHRLZXlzIiwgIlJSdWxlU2V0IiwgInRleHQiLCAiU3RhdHVzVHlwZSIsICJkZWZhdWx0U2V0dGluZ3MiLCAiZWxlbWVudCIsICJlbGVtZW50IiwgImltcG9ydF9vYnNpZGlhbiIsICJ2YXVsdCIsICJtZXRhZGF0YUNhY2hlIiwgInRleHQiLCAiZWxlbWVudCIsICJwRWxlbWVudCIsICJlbGVtZW50IiwgIkNhY2hlIiwgIm1ldGFkYXRhQ2FjaGUiLCAidmF1bHQiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJlbGVtZW50IiwgInRleHQiLCAiZWxlbWVudCIsICJpbnN0YW5jZSIsICJjcmVhdGVfZnJhZ21lbnQiLCAiYXR0ciIsICJjdHgiLCAidGFzayIsICJpbXBvcnRfb2JzaWRpYW4iLCAidGFzayIsICJlbGVtZW50IiwgIl9hIiwgInNlY3Rpb25JbmRleCIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImNoaWxkcmVuIiwgImNocm9ubyIsICJib29uUGFyc2UiLCAiZWxlbWVudCIsICJ0ZXh0IiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAidGV4dCIsICJ1cGRhdGUiLCAidGV4dCIsICJzZXR0aW5ncyIsICJpbXBvcnRfb2JzaWRpYW4iLCAic2V0dGluZ3MiLCAic2V0dGluZ3MiLCAiQ2FjaGUiXQp9Cg== + Example: ${this.fieldNameSingular()} is not NON_TASK`;return le.fromError(e,n)}fieldName(){return"status.type"}value(e){return e.status.type}supportsSorting(){return!0}comparator(){return(e,t)=>{let n=$r.groupName(e),i=$r.groupName(t);return n.localeCompare(i,void 0,{numeric:!0})}}supportsGrouping(){return!0}grouper(){return e=>[$r.groupName(e)]}static groupName(e){let t;switch(e.status.type){case"IN_PROGRESS":t="1";break;case"TODO":t="2";break;case"DONE":t="3";break;case"CANCELLED":t="4";break;case"NON_TASK":t="5";break;case"EMPTY":t="6";break}return t+" "+e.status.type}};var _o=class extends Xe{fieldName(){return"recurrence"}value(e){return e.recurrence!==null?e.recurrence.toText():""}};var cf=[()=>new go,()=>new $r,()=>new br,()=>new uo,()=>new dn,()=>new vr,()=>new Is,()=>new Ns,()=>new cn,()=>new Cs,()=>new ei,()=>new fn,()=>new pn,()=>new oo,()=>new ao,()=>new ho,()=>new yo,()=>new ti,()=>new _o];function mo(r){for(let e of cf){let t=e();if(t.canCreateFilterForLine(r))return t.createFilterOrErrorMessage(r)}return null}function rT(r){let e=/^sort by /;if(r.match(e)===null)return null;for(let t of cf){let i=t().parseSortLine(r);if(i)return i}return null}function nT(r){let e=/^group by /;if(r.match(e)===null)return null;for(let t of cf){let n=t(),i=n.fieldNameSingular();if(r===`group by ${i}`&&n.supportsGrouping())return n.createGrouper()}return null}var To=class{constructor(e,t){this.nestingLevel=e,this.name=t}};var bo=class{constructor(e){this.lastHeadingAtLevel=new Array;let n=e.keys().next().value.length;for(let i=0;it.set(o,a)),e.pop();return t}};var Eo=class extends Map{},wo=class extends vo{},Ro=class{constructor(e,t){this.groups=new Eo;let n=this.buildGroupingTree(e,t);this.groups=n.generateAllPaths(),this.groups=this.getSortedGroups()}buildGroupingTree(e,t){let n=new wo(t),i=[n];for(let s of e){let a=[];for(let o of i)for(let u of o.values){let l=Dr.getGroupNamesForTask(s,u);for(let c of l){let d=o.children.get(c);d===void 0&&(d=new wo([]),o.children.set(c,d),a.push(d)),d.values.push(u)}}i=a}return n}getSortedGroups(){return new Eo([...this.groups.entries()].sort())}};var Oo=class{constructor(e,t,n){this.groups=e,this.groupHeadings=t,this.tasks=n}tasksAsStringOfLines(){let e="";for(let t of this.tasks)e+=t.toFileLineString()+` +`;return e}toString(){let e=` +`;e+=`Group names: [${this.groups}] +`;for(let t of this.groupHeadings)e+=`${"#".repeat(4+t.nestingLevel)} ${t.name} +`;return e+=this.tasksAsStringOfLines(),e}};var Do=class{constructor(e,t){this._groups=new Array;this._totalTaskCount=0;this._totalTaskCount=t.length;let n=new Ro(e,t);this.addTasks(n)}get groups(){return this._groups}totalTasksCount(){return this._totalTaskCount}toString(){let e="";for(let n of this.groups)e+=n.toString(),e+=` +--- +`;return e+=` +${this.totalTasksCount()} tasks +`,e}addTasks(e){let t=new bo(e.groups);for(let[n,i]of e.groups){let s=t.getHeadingsForTaskGroup(n),a=new Oo(n,s,i);this.add(a)}}add(e){this._groups.push(e)}};var re=class{static fromGroupingProperty(e){return new Hn(e,re.grouperForProperty(e))}static by(e,t){return new Do(e,t)}static getGroupNamesForTask(e,t){return e.grouper(t)}static grouperForProperty(e){return re.groupers[e]}static escapeMarkdownCharacters(e){return e.replace(/\\/g,"\\\\").replace(/_/g,"\\_")}static groupByPriority(e){let t="ERROR";switch(e.priority){case"1":t="High";break;case"2":t="Medium";break;case"3":t="None";break;case"4":t="Low";break}return[`Priority ${e.priority}: ${t}`]}static groupByRecurrence(e){return e.recurrence!==null?[e.recurrence.toText()]:["None"]}static groupByRecurring(e){return e.recurrence!==null?["Recurring"]:["Not Recurring"]}static groupByStartDate(e){return[re.stringFromDate(e.startDate,"start")]}static groupByScheduledDate(e){return[re.stringFromDate(e.scheduledDate,"scheduled")]}static groupByDueDate(e){return[re.stringFromDate(e.dueDate,"due")]}static groupByDoneDate(e){return[re.stringFromDate(e.doneDate,"done")]}static groupByHappensDate(e){let t=new vr().earliestDate(e);return[re.stringFromDate(t,"happens")]}static stringFromDate(e,t){return e===null?"No "+t+" date":e.format(re.groupDateFormat)}static groupByPath(e){return[re.escapeMarkdownCharacters(e.path.replace(".md",""))]}static groupByFolder(e){let t=e.path,n=e.filename+".md",i=t.substring(0,t.lastIndexOf(n));return i===""?["/"]:[re.escapeMarkdownCharacters(i)]}static groupByFileName(e){let t=e.filename;return t===null?["Unknown Location"]:["[["+re.escapeMarkdownCharacters(t)+"]]"]}static groupByRoot(e){let t=e.path.replace(/\\/g,"/"),n=t.indexOf("/");return n==-1?["/"]:[re.escapeMarkdownCharacters(t.substring(0,n+1))]}static groupByBacklink(e){if(e.getLinkText({isFilenameUnique:!0})===null)return["Unknown Location"];let n="Unknown Location";if(e.filename!==null&&(n=re.escapeMarkdownCharacters(e.filename)),e.precedingHeader===null||e.precedingHeader.length===0)return[n];let i=re.groupByHeading(e)[0];return n===i?[n]:[`${n} > ${i}`]}static groupByStatus(e){return e.status.symbol===" "?["Todo"]:["Done"]}static groupByHeading(e){return e.precedingHeader===null||e.precedingHeader.length===0?["(No heading)"]:[e.precedingHeader]}static groupByTags(e){return e.tags.length==0?["(No tags)"]:e.tags}},Dr=re;Dr.groupDateFormat="YYYY-MM-DD dddd",Dr.groupers={backlink:re.groupByBacklink,done:re.groupByDoneDate,due:re.groupByDueDate,filename:re.groupByFileName,folder:re.groupByFolder,happens:re.groupByHappensDate,heading:re.groupByHeading,path:re.groupByPath,priority:re.groupByPriority,recurrence:re.groupByRecurrence,recurring:re.groupByRecurring,root:re.groupByRoot,scheduled:re.groupByScheduledDate,start:re.groupByStartDate,status:re.groupByStatus,tags:re.groupByTags};var li=class{constructor({source:e}){this._limit=void 0;this._layoutOptions=new bi;this._filters=[];this._error=void 0;this._sorting=[];this._grouping=[];this.groupByRegexp=/^group by (backlink|done|due|filename|folder|happens|heading|path|priority|recurrence|recurring|root|scheduled|start|status|tags)/;this.hideOptionsRegexp=/^(hide|show) (task count|backlink|priority|start date|scheduled date|done date|due date|recurrence rule|edit button|urgency)/;this.shortModeRegexp=/^short/;this.explainQueryRegexp=/^explain/;this.limitRegexp=/^limit (to )?(\d+)( tasks?)?/;this.commentRegexp=/^#.*/;this.source=e,e.split(` +`).map(t=>t.trim()).forEach(t=>{switch(!0){case t==="":break;case this.shortModeRegexp.test(t):this._layoutOptions.shortMode=!0;break;case this.explainQueryRegexp.test(t):this._layoutOptions.explainQuery=!0;break;case this.limitRegexp.test(t):this.parseLimit({line:t});break;case this.parseSortBy({line:t}):break;case this.parseGroupBy2({line:t}):break;case this.groupByRegexp.test(t):this.parseGroupBy({line:t});break;case this.hideOptionsRegexp.test(t):this.parseHideOptions({line:t});break;case this.commentRegexp.test(t):break;case this.parseFilter(t):break;default:this._error=`do not understand query: ${t}`}})}explainQuery(){return`Explanation of this Tasks code block query: + +`+this.explainQueryWithoutIntroduction()}explainQueryWithoutIntroduction(){let e="",{globalFilter:t}=U();t.length!==0&&(e+=`Only tasks containing the global filter '${t}'. + +`);let n=this.filters.length;if(n===0)e+="No filters supplied. All tasks will match the query.";else for(let i=0;i0&&(e+=` +`),e+=this.filters[i].explainFilterIndented("");return this._limit!==void 0&&(e+=` + +At most ${this._limit} task`,this._limit!==1&&(e+="s"),e+=`. +`),e}get limit(){return this._limit}get layoutOptions(){return this._layoutOptions}get filters(){return this._filters}get sorting(){return this._sorting}get grouping(){return this._grouping}get error(){return this._error}applyQueryToTasks(e){this.filters.forEach(n=>{e=e.filter(n.filterFunction)});let t=ri.by(this.sorting,e).slice(0,this.limit);return Dr.by(this.grouping,t)}parseHideOptions({line:e}){let t=e.match(this.hideOptionsRegexp);if(t!==null){let n=t[1]==="hide";switch(t[2]){case"task count":this._layoutOptions.hideTaskCount=n;break;case"backlink":this._layoutOptions.hideBacklinks=n;break;case"priority":this._layoutOptions.hidePriority=n;break;case"start date":this._layoutOptions.hideStartDate=n;break;case"scheduled date":this._layoutOptions.hideScheduledDate=n;break;case"due date":this._layoutOptions.hideDueDate=n;break;case"done date":this._layoutOptions.hideDoneDate=n;break;case"recurrence rule":this._layoutOptions.hideRecurrenceRule=n;break;case"edit button":this._layoutOptions.hideEditButton=n;break;case"urgency":this._layoutOptions.hideUrgency=n;break;default:this._error="do not understand hide/show option"}}}parseFilter(e){let t=mo(e);return t!=null?(t.filter?this._filters.push(t.filter):this._error=t.error,!0):!1}parseLimit({line:e}){let t=e.match(this.limitRegexp);t!==null?this._limit=Number.parseInt(t[2],10):this._error="do not understand query limit"}parseSortBy({line:e}){let t=rT(e);return t?(this._sorting.push(t),!0):!1}parseGroupBy({line:e}){let t=e.match(this.groupByRegexp);t!==null?this._grouping.push(Dr.fromGroupingProperty(t[1])):this._error="do not understand query grouping"}parseGroupBy2({line:e}){let t=nT(e);return t?(this._grouping.push(t),!0):!1}};var Mo=class{constructor({plugin:e,events:t}){this.addQueryRenderChild=this._addQueryRenderChild.bind(this);this.app=e.app,this.events=t,e.registerMarkdownCodeBlockProcessor("tasks",this._addQueryRenderChild.bind(this))}_addQueryRenderChild(e,t,n){return x(this,null,function*(){n.addChild(new df({app:this.app,events:this.events,container:t,source:e,filePath:n.sourcePath}))})}},df=class extends So.MarkdownRenderChild{constructor({app:t,events:n,container:i,source:s,filePath:a}){super(i);switch(this.app=t,this.events=n,this.source=s,this.filePath=a,this.containerEl.className){case"block-language-tasks":this.query=new li({source:s}),this.queryType="tasks";break;default:this.query=new li({source:s}),this.queryType="tasks";break}}onload(){this.events.triggerRequestCacheUpdate(this.render.bind(this)),this.renderEventRef=this.events.onCacheUpdate(this.render.bind(this)),this.reloadQueryAtMidnight()}onunload(){this.renderEventRef!==void 0&&this.events.off(this.renderEventRef),this.queryReloadTimeout!==void 0&&clearTimeout(this.queryReloadTimeout)}reloadQueryAtMidnight(){let t=new Date;t.setHours(24,0,0,0);let n=new Date,i=t.getTime()-n.getTime();this.queryReloadTimeout=setTimeout(()=>{this.query=new li({source:this.source}),this.events.triggerRequestCacheUpdate(this.render.bind(this)),this.reloadQueryAtMidnight()},i+1e3)}render(i){return x(this,arguments,function*({tasks:t,state:n}){var a;let s=this.containerEl.createEl("div");if(n==="Warm"&&this.query.error===void 0){console.debug(`Render ${this.queryType} called for a block in active file "${this.filePath}", to select from ${t.length} tasks: plugin state: ${n}`),this.query.layoutOptions.explainQuery&&this.createExplanation(s);let o=this.query.applyQueryToTasks(t);for(let l of o.groups){this.addGroupHeadings(s,l.groupHeadings);let{taskList:c}=yield this.createTasksList({tasks:l.tasks,content:s});s.appendChild(c)}let u=o.totalTasksCount();console.debug(`${u} of ${t.length} tasks displayed in a block in "${this.filePath}"`),this.addTaskCount(s,u)}else this.query.error!==void 0?s.createDiv().innerHTML=`
Tasks query: ${this.query.error.replace(/\n/g,"
")}
`:s.setText("Loading Tasks ...");(a=this.containerEl.firstChild)==null||a.replaceWith(s)})}createExplanation(t){let n=this.query.explainQuery(),i=t.createEl("pre");i.addClasses(["plugin-tasks-query-explanation"]),i.setText(n),t.appendChild(i)}createTasksList(i){return x(this,arguments,function*({tasks:t,content:n}){let s=t.length,a=n.createEl("ul");a.addClasses(["contains-task-list","plugin-tasks-query-result"]);for(let o=0;oh.remove());let f=this.query.layoutOptions.shortMode;this.query.layoutOptions.hideUrgency||this.addUrgency(c,u),this.query.layoutOptions.hideBacklinks||this.addBacklinks(c,u,f,l),this.query.layoutOptions.hideEditButton||this.addEditButton(c,u),a.appendChild(c)}return{taskList:a,tasksCount:s}})}addEditButton(t,n){t.createEl("a",{cls:"tasks-edit"}).onClickEvent(s=>{s.preventDefault();let a=u=>{Xa({originalTask:n,newTasks:ut.removeInferredStatusIfNeeded(n,u)})};new Xn({app:this.app,task:n,onSubmit:a}).open()})}addUrgency(t,n){let i=new Intl.NumberFormat().format(n.urgency);t.createSpan({text:i,cls:"tasks-urgency"})}addGroupHeadings(t,n){for(let i of n)this.addGroupHeading(t,i)}addGroupHeading(t,n){return x(this,null,function*(){let i;n.nestingLevel===0?i=t.createEl("h4",{cls:"tasks-group-heading"}):n.nestingLevel===1?i=t.createEl("h5",{cls:"tasks-group-heading"}):i=t.createEl("h6",{cls:"tasks-group-heading"}),yield So.MarkdownRenderer.renderMarkdown(n.name,i,this.filePath,this)})}addBacklinks(t,n,i,s){var l;let a=t.createSpan({cls:"tasks-backlink"});i||a.append(" (");let o=a.createEl("a");if(o.href=n.path,o.setAttribute("data-href",n.path),o.rel="noopener",o.target="_blank",o.addClass("internal-link"),i&&o.addClass("internal-link-short-mode"),n.precedingHeader!==null){let c=n.precedingHeader.replace(/#/g,"");o.href=o.href+"#"+c,o.setAttribute("data-href",o.getAttribute("data-href")+"#"+c)}let u;i?u=" \u{1F517}":u=(l=n.getLinkText({isFilenameUnique:s}))!=null?l:"",o.setText(u),i||a.append(")")}addTaskCount(t,n){this.query.layoutOptions.hideTaskCount||t.createDiv({text:`${n} task${n!==1?"s":""}`,cls:"tasks-count"})}isFilenameUnique({task:t}){let n=t.path.match(/([^/]*)\..+$/i);if(n===null)return;let i=n[1];return this.app.vault.getMarkdownFiles().filter(a=>{if(a.basename===i)return!0}).length<2}};var ce=require("obsidian");var iT=[{text:"Core Statuses",level:"h3",class:"",open:!0,notice:{class:"setting-item-description",text:null,html:"

These are the core statuses that Tasks supports natively, with no need for custom CSS styling or theming.

You can add edit and add your own custom statuses in the section below.

"},settings:[{name:"",description:"",type:"function",initialValue:"",placeholder:"",settingName:"insertTaskCoreStatusSettings",featureFlag:"",notice:null}]},{text:"Custom Statuses",level:"h3",class:"",open:!0,notice:{class:"setting-item-description",text:null,html:`

You should first select and install a CSS Snippet or Theme to style custom checkboxes.

Then, use the buttons below to set up your custom statuses, to match your chosen CSS checkboxes.

Note Any statuses with the same symbol as any earlier statuses will be ignored. You can confirm the actually loaded statuses by running the 'Create or edit task' command and looking at the Status drop-down.

See the documentation to get started!

`},settings:[{name:"",description:"",type:"function",initialValue:"",placeholder:"",settingName:"insertCustomTaskStatusSettings",featureFlag:"",notice:null}]}];var Ht=require("obsidian");var gn=class{validate(e){let t=[];return t.push(...this.validateSymbol(e)),t.push(...this.validateName(e)),t.push(...this.validateNextSymbol(e)),t}validateSymbol(e){return gn.validateOneSymbol(e.symbol,"Task Status Symbol")}validateNextSymbol(e){return gn.validateOneSymbol(e.nextStatusSymbol,"Task Next Status Symbol")}validateName(e){let t=[];return e.name.length===0&&t.push("Task Status Name cannot be empty."),t}static validateOneSymbol(e,t){let n=[];return e.length===0&&n.push(`${t} cannot be empty.`),e.length>1&&n.push(`${t} ("${e}") must be a single character.`),n}};var _n=new gn,Tt=class extends Ht.Modal{constructor(t,n,i){super(t.app);this.plugin=t;this.saved=!1;this.error=!1;this.statusSymbol=n.symbol,this.statusName=n.name,this.statusNextSymbol=n.nextStatusSymbol,this.statusAvailableAsCommand=n.availableAsCommand,this.type=n.type,this.isCoreStatus=i}statusConfiguration(){return new Ye(this.statusSymbol,this.statusName,this.statusNextSymbol,this.statusAvailableAsCommand,this.type)}display(){return x(this,null,function*(){let{contentEl:t}=this;t.empty();let n=t.createDiv(),i;new Ht.Setting(n).setName("Task Status Symbol").setDesc("This is the character between the square braces. (It can only be edited for Custom statuses, and not Core statuses.)").addText(l=>{i=l,l.setValue(this.statusSymbol).onChange(c=>{this.statusSymbol=c,Tt.setValid(l,_n.validateSymbol(this.statusConfiguration()))})}).setDisabled(this.isCoreStatus).then(l=>{Tt.setValid(i,_n.validateSymbol(this.statusConfiguration()))});let s;new Ht.Setting(n).setName("Task Status Name").setDesc("This is the friendly name of the task status.").addText(l=>{s=l,l.setValue(this.statusName).onChange(c=>{this.statusName=c,Tt.setValid(l,_n.validateName(this.statusConfiguration()))})}).then(l=>{Tt.setValid(s,_n.validateName(this.statusConfiguration()))});let a;new Ht.Setting(n).setName("Task Next Status Symbol").setDesc("When clicked on this is the symbol that should be used next.").addText(l=>{a=l,l.setValue(this.statusNextSymbol).onChange(c=>{this.statusNextSymbol=c,Tt.setValid(l,_n.validateNextSymbol(this.statusConfiguration()))})}).then(l=>{Tt.setValid(a,_n.validateNextSymbol(this.statusConfiguration()))}),new Ht.Setting(n).setName("Task Status Type").setDesc("Control how the status behaves for searching and toggling.").addDropdown(l=>{["TODO","IN_PROGRESS","DONE","CANCELLED","NON_TASK"].forEach(d=>{l.addOption(d,d)}),l.setValue(this.type).onChange(d=>{this.type=j.getTypeFromStatusTypeString(d)})}),j.tasksPluginCanCreateCommandsForStatuses()&&new Ht.Setting(n).setName("Available as command").setDesc("If enabled this status will be available as a command so you can assign a hotkey and toggle the status using it.").addToggle(l=>{l.setValue(this.statusAvailableAsCommand).onChange(c=>x(this,null,function*(){this.statusAvailableAsCommand=c}))});let o=t.createDiv(),u=new Ht.Setting(o);u.addButton(l=>(l.setTooltip("Save").setIcon("checkmark").onClick(()=>x(this,null,function*(){let c=_n.validate(this.statusConfiguration());if(c.length>0){let d=c.join(` +`)+` + +Fix errors before saving.`;new Ht.Notice(d);return}this.saved=!0,this.close()})),l)),u.addExtraButton(l=>(l.setIcon("cross").setTooltip("Cancel").onClick(()=>{this.saved=!1,this.close()}),l))})}onOpen(){this.display()}static setValidationError(t){t.inputEl.addClass("tasks-settings-is-invalid")}static removeValidationError(t){t.inputEl.removeClass("tasks-settings-is-invalid")}static setValid(t,n){n.length===0?Tt.removeValidationError(t):Tt.setValidationError(t)}};function sT(){return[[" ","Unchecked","x","TODO"],["x","Regular"," ","DONE"],["X","Checked"," ","DONE"],["-","Dropped","x","CANCELLED"],[">","Forward","x","TODO"],["D","Date","x","TODO"],["?","Question","x","TODO"],["/","Half Done","x","IN_PROGRESS"],["+","Add","x","TODO"],["R","Research","x","TODO"],["!","Important","x","TODO"],["i","Idea","x","TODO"],["B","Brainstorm","x","TODO"],["P","Pro","x","TODO"],["C","Con","x","TODO"],["Q","Quote","x","TODO"],["N","Note","x","TODO"],["b","Bookmark","x","TODO"],["I","Information","x","TODO"],["p","Paraphrase","x","TODO"],["L","Location","x","TODO"],["E","Example","x","TODO"],["A","Answer","x","TODO"],["r","Reward","x","TODO"],["c","Choice","x","TODO"],["d","Doing","x","IN_PROGRESS"],["T","Time","x","TODO"],["@","Character / Person","x","TODO"],["t","Talk","x","TODO"],["O","Outline / Plot","x","TODO"],["~","Conflict","x","TODO"],["W","World","x","TODO"],["f","Clue / Find","x","TODO"],["F","Foreshadow","x","TODO"],["H","Favorite / Health","x","TODO"],["&","Symbolism","x","TODO"],["s","Secret","x","TODO"]]}function aT(){return[[" ","to-do","x","TODO"],["/","incomplete","x","IN_PROGRESS"],["x","done"," ","DONE"],["-","canceled","x","CANCELLED"],[">","forwarded","x","TODO"],["<","scheduling","x","TODO"],["?","question","x","TODO"],["!","important","x","TODO"],["*","star","x","TODO"],['"',"quote","x","TODO"],["l","location","x","TODO"],["b","bookmark","x","TODO"],["i","information","x","TODO"],["S","savings","x","TODO"],["I","idea","x","TODO"],["p","pros","x","TODO"],["c","cons","x","TODO"],["f","fire","x","TODO"],["k","key","x","TODO"],["w","win","x","TODO"],["u","up","x","TODO"],["d","down","x","TODO"]]}var ci=class extends ce.PluginSettingTab{constructor({plugin:t}){super(t.app,t);this.customFunctions={insertTaskCoreStatusSettings:this.insertTaskCoreStatusSettings.bind(this),insertCustomTaskStatusSettings:this.insertCustomTaskStatusSettings.bind(this)};this.plugin=t}saveSettings(t){return x(this,null,function*(){yield this.plugin.saveSettings(),t&&this.display()})}display(){let{containerEl:t}=this;t.empty(),this.containerEl.addClass("tasks-settings"),t.createEl("h3",{text:"Tasks Settings"}),t.createEl("p",{cls:"tasks-setting-important",text:"Changing any settings requires a restart of obsidian."}),t.createEl("h4",{text:"Global filter Settings"}),new ce.Setting(t).setName("Global task filter").setDesc(ci.createFragmentWithHTML('

Recommended: Leave empty if you want all checklist items in your vault to be tasks managed by this plugin.

Use a global filter if you want Tasks to only act on a subset of your "- [ ]" checklist items, so that a checklist item must include the specified string in its description in order to be considered a task.

For example, if you set the global filter to #task, the Tasks plugin will only handle checklist items tagged with #task.
Other checklist items will remain normal checklist items and not appear in queries or get a done date set.

See the documentation.

')).addText(i=>{let s=U();i.setPlaceholder("e.g. #task or TODO").setValue(s.globalFilter).onChange(a=>x(this,null,function*(){ot({globalFilter:a}),yield this.plugin.saveSettings()}))}),new ce.Setting(t).setName("Remove global filter from description").setDesc("Enabling this removes the string that you set as global filter from the task description when displaying a task.").addToggle(i=>{let s=U();i.setValue(s.removeGlobalFilter).onChange(a=>x(this,null,function*(){ot({removeGlobalFilter:a}),yield this.plugin.saveSettings()}))}),t.createEl("h4",{text:"Task Statuses"});let{headingOpened:n}=U();iT.forEach(i=>{this.addOneSettingsBlock(t,i,n)}),t.createEl("h4",{text:"Date Settings"}),new ce.Setting(t).setName("Set done date on every completed task").setDesc("Enabling this will add a timestamp \u2705 YYYY-MM-DD at the end when a task is toggled to done").addToggle(i=>{let s=U();i.setValue(s.setDoneDate).onChange(a=>x(this,null,function*(){ot({setDoneDate:a}),yield this.plugin.saveSettings()}))}),new ce.Setting(t).setName("Use filename as Scheduled date for undated tasks").setDesc(ci.createFragmentWithHTML('Save time entering Scheduled (\u23F3) dates.
If this option is enabled, any undated tasks will be given a default Scheduled date extracted from their file name.
The date in the file name must be in one of YYYY-MM-DD or YYYYMMDD formats.
Undated tasks have none of Due (\u{1F4C5} ), Scheduled (\u23F3) and Start (\u{1F6EB}) dates.

See the documentation.

')).addToggle(i=>{let s=U();i.setValue(s.useFilenameAsScheduledDate).onChange(a=>x(this,null,function*(){ot({useFilenameAsScheduledDate:a}),yield this.plugin.saveSettings()}))}),new ce.Setting(t).setName("Folders with default Scheduled dates").setDesc("Leave empty if you want to use default Scheduled dates everywhere, or enter a comma-separated list of folders.").addText(i=>x(this,null,function*(){let s=U();yield this.plugin.saveSettings(),i.setValue(ci.renderFolderArray(s.filenameAsDateFolders)).onChange(a=>x(this,null,function*(){let o=ci.parseCommaSeparatedFolders(a);ot({filenameAsDateFolders:o}),yield this.plugin.saveSettings()}))})),t.createEl("h4",{text:"Auto-suggest Settings"}),new ce.Setting(t).setName("Auto-suggest task content").setDesc("Enabling this will open an intelligent suggest menu while typing inside a recognized task line.").addToggle(i=>{let s=U();i.setValue(s.autoSuggestInEditor).onChange(a=>x(this,null,function*(){ot({autoSuggestInEditor:a}),yield this.plugin.saveSettings()}))}),new ce.Setting(t).setName("Minimum match length for auto-suggest").setDesc("If higher than 0, auto-suggest will be triggered only when the beginning of any supported keywords is recognized.").addSlider(i=>{let s=U();i.setLimits(0,3,1).setValue(s.autoSuggestMinMatch).setDynamicTooltip().onChange(a=>x(this,null,function*(){ot({autoSuggestMinMatch:a}),yield this.plugin.saveSettings()}))}),new ce.Setting(t).setName("Maximum number of auto-suggestions to show").setDesc('How many suggestions should be shown when an auto-suggest menu pops up (including the "\u23CE" option).').addSlider(i=>{let s=U();i.setLimits(3,12,1).setValue(s.autoSuggestMaxItems).setDynamicTooltip().onChange(a=>x(this,null,function*(){ot({autoSuggestMaxItems:a}),yield this.plugin.saveSettings()}))}),t.createEl("h4",{text:"Dialog Settings"}),new ce.Setting(t).setName("Provide access keys in dialogs").setDesc("If the access keys (keyboard shortcuts) for various controls in dialog boxes conflict with system keyboard shortcuts or assistive technology functionality that is important for you, you may want to deactivate them here.").addToggle(i=>{let s=U();i.setValue(s.provideAccessKeys).onChange(a=>x(this,null,function*(){ot({provideAccessKeys:a}),yield this.plugin.saveSettings()}))})}addOneSettingsBlock(t,n,i){let s=t.createEl("details",{cls:"tasks-nested-settings",attr:we({},n.open||i[n.text]?{open:!0}:{})});s.empty(),s.ontoggle=()=>{i[n.text]=s.open,ot({headingOpened:i}),this.plugin.saveSettings()};let a=s.createEl("summary");if(new ce.Setting(a).setHeading().setName(n.text),a.createDiv("collapser").createDiv("handle"),n.notice!==null){let o=s.createEl("div",{cls:n.notice.class,text:n.notice.text});n.notice.html!==null&&o.insertAdjacentHTML("beforeend",n.notice.html)}n.settings.forEach(o=>{if(!(o.featureFlag!==""&&!h_(o.featureFlag))&&(o.type==="checkbox"?new ce.Setting(s).setName(o.name).setDesc(o.description).addToggle(u=>{let l=U();l.generalSettings[o.settingName]||nn(o.settingName,o.initialValue),u.setValue(l.generalSettings[o.settingName]).onChange(c=>x(this,null,function*(){nn(o.settingName,c),yield this.plugin.saveSettings()}))}):o.type==="text"?new ce.Setting(s).setName(o.name).setDesc(o.description).addText(u=>{let l=U();l.generalSettings[o.settingName]||nn(o.settingName,o.initialValue);let c=d=>x(this,null,function*(){nn(o.settingName,d),yield this.plugin.saveSettings()});u.setPlaceholder(o.placeholder.toString()).setValue(l.generalSettings[o.settingName].toString()).onChange((0,ce.debounce)(c,500,!0))}):o.type==="textarea"?new ce.Setting(s).setName(o.name).setDesc(o.description).addTextArea(u=>{let l=U();l.generalSettings[o.settingName]||nn(o.settingName,o.initialValue);let c=d=>x(this,null,function*(){nn(o.settingName,d),yield this.plugin.saveSettings()});u.setPlaceholder(o.placeholder.toString()).setValue(l.generalSettings[o.settingName].toString()).onChange((0,ce.debounce)(c,500,!0)),u.inputEl.rows=8,u.inputEl.cols=40}):o.type==="function"&&this.customFunctions[o.settingName](s,this),o.notice!==null)){let u=s.createEl("p",{cls:o.notice.class,text:o.notice.text});o.notice.html!==null&&u.insertAdjacentHTML("beforeend",o.notice.html)}})}static parseCommaSeparatedFolders(t){return t.split(",").map(n=>n.trim()).map(n=>n.replace(/^\/|\/$/g,"")).filter(n=>n!=="")}static renderFolderArray(t){return t.join(",")}insertTaskCoreStatusSettings(t,n){let{statusSettings:i}=U();i.coreStatuses.forEach(s=>{oT(t,s,i.coreStatuses,i,n,n.plugin,!0)})}insertCustomTaskStatusSettings(t,n){let{statusSettings:i}=U();i.customStatuses.forEach(c=>{oT(t,c,i.customStatuses,i,n,n.plugin,!1)}),t.createEl("div"),new ce.Setting(t).addButton(c=>{c.setButtonText("Add New Task Status").setCta().onClick(()=>x(this,null,function*(){Pe.addStatus(i.customStatuses,new Ye("","","",!1,"TODO")),yield di(i,n)}))}).infoEl.remove(),new ce.Setting(t).addButton(c=>{c.setButtonText("Add all Status types supported by Minimal Theme").setCta().onClick(()=>x(this,null,function*(){yield uT(aT(),i,n)}))}).infoEl.remove(),new ce.Setting(t).addButton(c=>{c.setButtonText("Add all Status types supported by ITS Theme").setCta().onClick(()=>x(this,null,function*(){yield uT(sT(),i,n)}))}).infoEl.remove(),new ce.Setting(t).addButton(c=>{c.setButtonText("Add All Unknown Status Types").setCta().onClick(()=>x(this,null,function*(){let d=this.plugin.getTasks(),f=he.getInstance().findUnknownStatuses(d);f.length!==0&&(f.forEach(h=>{Pe.addStatus(i.customStatuses,h)}),yield di(i,n))}))}).infoEl.remove(),new ce.Setting(t).addButton(c=>{c.setButtonText("Reset Custom Status Types to Defaults").setWarning().onClick(()=>x(this,null,function*(){Pe.resetAllCustomStatuses(i),yield di(i,n)}))}).infoEl.remove()}},qs=ci;qs.createFragmentWithHTML=t=>createFragment(n=>n.createDiv().innerHTML=t);function oT(r,e,t,n,i,s,a){let o=r.createEl("pre");o.addClass("row-for-status"),o.textContent=new j(e).previewText();let u=new ce.Setting(r);u.infoEl.replaceWith(o),a||u.addExtraButton(l=>{l.setIcon("cross").setTooltip("Delete").onClick(()=>x(this,null,function*(){Pe.deleteStatus(t,e)&&(yield di(n,i))}))}),u.addExtraButton(l=>{l.setIcon("pencil").setTooltip("Edit").onClick(()=>x(this,null,function*(){let c=new Tt(s,e,a);c.onClose=()=>x(this,null,function*(){c.saved&&Pe.replaceStatus(t,e,c.statusConfiguration())&&(yield di(n,i))}),c.open()}))}),u.infoEl.remove()}function uT(r,e,t){return x(this,null,function*(){Pe.bulkAddStatusCollection(e,r).forEach(i=>{new ce.Notice(i)}),yield di(e,t)})}function di(r,e){return x(this,null,function*(){ot({statusSettings:r}),Pe.applyToStatusRegistry(r,he.getInstance()),yield e.saveSettings(!0)})}var cT=require("obsidian");var Zk=`${$t}${jt}${Bt}`;function lT(r,e,t){let n=[];n=n.concat(eP(r,e,t)),n=n.concat(tP(r,e,t));let i=Jk(r,t),s=ff(r,/([a-zA-Z'_-]*)/g,e),a=!1;if(s&&s.length>0){let o=s[0];if(o.length>=Math.max(1,t.autoSuggestMinMatch)){let u=i.filter(l=>l.displayText.toLowerCase().includes(o.toLowerCase()));for(let l of u)n.push({suggestionType:"match",displayText:l.displayText,appendText:l.appendText,insertAt:s.index,insertSkip:o.length}),a=!0}}return!a&&t.autoSuggestMinMatch===0&&(n=n.concat(i)),n.length>0&&!n.some(o=>o.suggestionType==="match")&&n.unshift({suggestionType:"empty",displayText:"\u23CE",appendText:` +`}),n=n.slice(0,t.autoSuggestMaxItems),n}function Qk(r){if(Object.values(Ae).some(e=>e.length>0&&r.includes(e)))return!0}function Jk(r,e){let t=[];return r.includes(Bt)||t.push({displayText:`${Bt} due date`,appendText:`${Bt} `}),r.includes($t)||t.push({displayText:`${$t} start date`,appendText:`${$t} `}),r.includes(jt)||t.push({displayText:`${jt} scheduled date`,appendText:`${jt} `}),Qk(r)||(t.push({displayText:`${Ae.High} high priority`,appendText:`${Ae.High} `}),t.push({displayText:`${Ae.Medium} medium priority`,appendText:`${Ae.Medium} `}),t.push({displayText:`${Ae.Low} low priority`,appendText:`${Ae.Low} `})),r.includes(Yt)||t.push({displayText:`${Yt} recurring (repeat)`,appendText:`${Yt} `}),t}function eP(r,e,t){let n=["today","tomorrow","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","next week","next month","next year"],i=[],s=new RegExp(`([${Zk}])\\s*([0-9a-zA-Z ]*)`,"ug"),a=ff(r,s,e);if(a&&a.length>=2){let o=a[1],u=a[2];if(u.length1?yr.parseDate(Vn(u),!0):null;l&&l.isValid()&&i.push({displayText:`${l.format(S.dateFormat)}`,appendText:`${o} ${l.format(S.dateFormat)} `,insertAt:a.index,insertSkip:a[0].length});let c=1,d=5,f=n.filter(h=>u&&u.length>=c&&h.toLowerCase().includes(u.toLowerCase())).slice(0,d);f.length===0&&(f=n.slice(0,d));for(let h of f){let m=`${yr.parseDate(h,!0).format(S.dateFormat)}`;i.push({suggestionType:"match",displayText:`${h} (${m})`,appendText:`${o} ${m} `,insertAt:a.index,insertSkip:a[0].length})}}return i}function tP(r,e,t){var o;let n=["every","every day","every week","every month","every month on the","every year","every week on Sunday","every week on Monday","every week on Tuesday","every week on Wednesday","every week on Thursday","every week on Friday","every week on Saturday"],i=[],s=new RegExp(`(${Yt})\\s*([0-9a-zA-Z ]*)`,"ug"),a=ff(r,s,e);if(a&&a.length>=2){let u=a[1],l=a[2];if(l.length0){let h=(o=We.fromText({recurrenceRuleText:l,startDate:null,scheduledDate:null,dueDate:null}))==null?void 0:o.toText();if(h){let y=`${u} ${h} `;if(i.push({suggestionType:"match",displayText:`\u2705 ${h}`,appendText:y,insertAt:a.index,insertSkip:a[0].length}),a[0]==y)return[]}}let c=1,d=t.autoSuggestMaxItems/2,f=n.filter(h=>l&&l.length>=c&&h.toLowerCase().includes(l.toLowerCase())).slice(0,d);f.length===0&&l.trim().length===0&&(f=n.slice(0,d));for(let h of f)i.push({suggestionType:"match",displayText:`${h}`,appendText:`${u} ${h} `,insertAt:a.index,insertSkip:a[0].length})}return i}function ff(r,e,t){let n=r.matchAll(e);for(let i of n)if((i==null?void 0:i.index)&&i.index<=t&&t<=i.index+i[0].length)return i;return[]}var ko=class extends cT.EditorSuggest{constructor(t,n){super(t);this.settings=n}onTrigger(t,n,i){if(!this.settings.autoSuggestInEditor)return null;let s=n.getLine(t.line);return s.contains(this.settings.globalFilter)&&s.match(S.taskRegex)?{start:{line:t.line,ch:0},end:{line:t.line,ch:s.length},query:s}:null}getSuggestions(t){let n=t.query,i=t.editor.getCursor(),s=lT(n,i.ch,this.settings),a=[];for(let o of s)a.push(vt(we({},o),{context:t}));return a}renderSuggestion(t,n){n.setText(t.displayText)}selectSuggestion(t,n){var u,l,c;let i=t.context.editor;if(t.suggestionType==="empty"){this.close();let d=new KeyboardEvent("keydown",{code:"Enter",key:"Enter"});(l=(u=i==null?void 0:i.cm)==null?void 0:u.contentDOM)==null||l.dispatchEvent(d);return}let s=t.context.editor.getCursor(),a={line:s.line,ch:(c=t.insertAt)!=null?c:s.ch},o=t.insertSkip?{line:s.line,ch:a.ch+t.insertSkip}:void 0;t.context.editor.replaceRange(t.appendText,a,o),t.context.editor.setCursor({line:s.line,ch:a.ch+t.appendText.length})}};var Po=class extends dT.Plugin{onload(){return x(this,null,function*(){console.log('loading plugin "tasks"'),yield this.loadSettings(),this.addSettingTab(new qs({plugin:this})),y_({metadataCache:this.app.metadataCache,vault:this.app.vault}),yield this.loadTaskStatuses();let t=new io({obsidianEvents:this.app.workspace});this.cache=new sn({metadataCache:this.app.metadataCache,vault:this.app.vault,events:t}),this.inlineRenderer=new so({plugin:this}),this.queryRenderer=new Mo({plugin:this,events:t}),this.registerEditorExtension($_()),this.registerEditorSuggest(new ko(this.app,U())),new no({plugin:this})})}loadTaskStatuses(){return x(this,null,function*(){let{statusSettings:t}=U();Pe.applyToStatusRegistry(t,he.getInstance())})}onunload(){var t;console.log('unloading plugin "tasks"'),(t=this.cache)==null||t.unload()}loadSettings(){return x(this,null,function*(){let t=yield this.loadData();ot(t),yield this.loadTaskStatuses()})}saveSettings(){return x(this,null,function*(){yield this.saveData(U())})}getTasks(){var t;return(t=this.cache)==null?void 0:t.getTasks()}}; From af485689bd8e5c2b48392698ac29cf4ba72159f1 Mon Sep 17 00:00:00 2001 From: Erez Shermer Date: Wed, 22 Mar 2023 21:22:19 +0200 Subject: [PATCH 16/29] Added 'normal' as the priority value if no priority field is present: https://github.com/obsidian-tasks-group/obsidian-tasks/pull/1519 --- docs/advanced/styling.md | 3 ++- src/TaskLineRenderer.ts | 12 +++++++++++- tests/TaskLineRenderer.test.ts | 24 ++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index 00f0eb96c5..0adbb8ca8a 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -65,7 +65,8 @@ The generic classes are: In addition to the generic classes, there are [**data attributes**](https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes) that represent the content of the various task components. -A **priority data attributes** named `data-task-priority` represents the specific priority of a class. It can be `high`, `medium`, `low` or `none`. +A **priority data attributes** named `data-task-priority` represents the specific priority of a class. It can be `high`, `medium`, `low` or `normal`. +The `normal` value is special: it is added as a default to a task's upper `task-list-item` even if there is no priority field set for that task. A **date attribute** represents a due, created, start, scheduled or done date in a format relative to the current date. The date attributes are `data-task-due`, `data-task-created`, `data-task-start`, `data-task-scheduled` and `data-task-done` and are populated with a relative expression that denotes the number of days this field represents compared to today: diff --git a/src/TaskLineRenderer.ts b/src/TaskLineRenderer.ts index b75d714e31..9d59f075f7 100644 --- a/src/TaskLineRenderer.ts +++ b/src/TaskLineRenderer.ts @@ -151,6 +151,16 @@ async function taskToHtml( allAttributes = { ...allAttributes, ...dataAttributes }; } + // If a task has no priority field set, its priority will not be rendered as part of the loop above and + // it will not be set a priority data attribute. + // In such a case we want the upper task LI element to mark the task has a 'normal' priority. + // So if the priority was not rendered, force it through the pipe of getting the component data for the + // priority field. + if (allAttributes.taskPriority === undefined) { + const [_, dataAttributes] = getComponentClassesAndData('priority', task); + allAttributes = { ...allAttributes, ...dataAttributes }; + } + return allAttributes; } @@ -228,7 +238,7 @@ function getComponentClassesAndData(component: TaskLayoutComponent, task: Task): if (task.priority === taskModule.Priority.High) priorityValue = 'high'; else if (task.priority === taskModule.Priority.Medium) priorityValue = 'medium'; else if (task.priority === taskModule.Priority.Low) priorityValue = 'low'; - else priorityValue = 'none'; + else priorityValue = 'normal'; dataAttributes['taskPriority'] = priorityValue; genericClasses.push(LayoutClasses.priority); break; diff --git a/tests/TaskLineRenderer.test.ts b/tests/TaskLineRenderer.test.ts index 55c2553f2a..0d024974c9 100644 --- a/tests/TaskLineRenderer.test.ts +++ b/tests/TaskLineRenderer.test.ts @@ -201,6 +201,14 @@ describe('task line rendering', () => { ); }); + it('marks nonexistent task priority as "normal" priority', async () => { + await testLiAttributes( + '- [ ] Full task 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 🔁 every day', + {}, + { taskPriority: 'normal' }, + ); + }); + it('renders a done task correctly with the default layout', async () => { await testLayoutOptions( '- [x] Full task ✅ 2022-07-05 ⏫ 📅 2022-07-02 ⏳ 2022-07-03 🛫 2022-07-04 ➕ 2022-07-05 🔁 every day', @@ -280,6 +288,22 @@ describe('task line rendering', () => { expect(found).toBeTruthy(); }; + const testLiAttributes = async ( + taskLine: string, + layoutOptions: Partial, + attributes: AttributesDictionary, + ) => { + const task = fromLine({ + line: taskLine, + }); + const fullLayoutOptions = { ...new LayoutOptions(), ...layoutOptions }; + const parentRender = await createMockParentAndRender(task, fullLayoutOptions); + const li = parentRender.children[0] as HTMLElement; + for (const key in attributes) { + expect(li.dataset[key]).toEqual(attributes[key]); + } + }; + const testHiddenComponentClasses = async ( taskLine: string, layoutOptions: Partial, From 2bc8fbfbf9498344f7f66a696e11f7e24a4d44bd Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Mon, 27 Mar 2023 20:53:34 +0100 Subject: [PATCH 17/29] vault: Add link to the 'Styling of Queries' for smoke-testing. --- .../Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/sample_vaults/Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md b/resources/sample_vaults/Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md index e89531bdfc..02e7b088d5 100644 --- a/resources/sample_vaults/Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md +++ b/resources/sample_vaults/Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md @@ -91,7 +91,7 @@ Steps to do: - [ ] #task View this file in **Reading view** and confirm that the tasks in this section are listed - [ ] #task View this file in **Live Preview** and confirm that the tasks in this section are listed - [ ] #task **check**: Checked all above steps for **viewing task blocks** worked -- [ ] #task **check**: Open the file "Styling of Queries" and follow the steps there +- [ ] #task **check**: Open the file [[Styling of Queries]] and follow the steps there --- From 1e2a11882cf984bdf0ccf3b09254ddbeefbda596 Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Mon, 27 Mar 2023 21:16:46 +0100 Subject: [PATCH 18/29] docs: Clarify placing of items on 3-line grid --- docs/advanced/styling.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index 0adbb8ca8a..263640fe80 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -211,7 +211,11 @@ ul > li.plugin-tasks-list-item .task-list-item-checkbox { ### Grid Layout -The following organizes the task structure into a 3-line grid, on which the description is in the first line and the various components are on the 2nd: +The following organizes the task structure into a 3-line grid, on which: + +- the description is in the first line, +- and the various components are on the second, +- the urgency, backlink and edit button are, if displayed, on the third. ```css ul > li.plugin-tasks-list-item { From f5e8c291b139872876c93b88b629e93107991e05 Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Mon, 27 Mar 2023 21:27:12 +0100 Subject: [PATCH 19/29] docs: Add 'normal' priority to the styling docs And put the 4 .task-list-item blocks in decreasing order of priority. --- docs/advanced/styling.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index 263640fe80..2e1366f8ae 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -137,20 +137,24 @@ Making tags, internal links and the recurrence rules of tasks to appear in gray: ### Priority as a Checkbox Color -The following rules remove the Tasks priority emoticon and render the tasks' checkboxes in red, blue and orange according to the tasks' priority: +The following rules remove the Tasks priority emoticon and render the tasks' checkboxes in red, orange, blue and cyan according to the tasks' priority: ```css .task-list-item[data-task-priority="high"] input[type=checkbox] { box-shadow: 0px 0px 2px 2px var(--color-red); border-color: var(--color-red); } -.task-list-item[data-task-priority="low"] input[type=checkbox] { +.task-list-item[data-task-priority="medium"] input[type=checkbox] { + box-shadow: 0px 0px 2px 2px var(--color-orange); + border-color: var(--color-orange); +} +.task-list-item[data-task-priority="normal"] input[type=checkbox] { box-shadow: 0px 0px 2px 2px var(--color-blue); border-color: var(--color-blue); } -.task-list-item[data-task-priority="medium"] input[type=checkbox] { - box-shadow: 0px 0px 2px 2px var(--color-orange); - border-color: var(--color-orange); +.task-list-item[data-task-priority="low"] input[type=checkbox] { + box-shadow: 0px 0px 2px 2px var(--color-cyan); + border-color: var(--color-cyan); } /* This part removes the regular priority emoticon */ span.task-priority { From 65724e767a33a684b38fee54ec643e6e3c34d5df Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Mon, 27 Mar 2023 21:53:24 +0100 Subject: [PATCH 20/29] docs: Document that 'has:' selector needs 1.1.9 Obsidian installer or above. --- docs/advanced/styling.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index 2e1366f8ae..78da1de6dd 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -84,6 +84,9 @@ Data attributes are added to both their corresponding components (e.g. to the du An exception is the tag data attribute which is added only to the tag's `` element within the rendered description -- however you can still use a CSS `:has` selector to format an entire task's description according to a tag, as demonstrated in the examples below. +{: .warning } +The CSS `:has` selector is available with Obsidian installer version 1.1.9 and newer. You can run the Obsidian command `Show debug info` to see your current installer version. + **Tip:** [CSS wildcard selectors](https://www.geeksforgeeks.org/wildcard-selectors-and-in-css-for-classes/) are a good way to select all past dates or future dates at once -- just use `.task-due[data-task-due^="past-"]` to address all overdue tasks, for example. Examples that utilize this can be found below. ## Hidden Components, Groups & Short Mode From 7daaf11c1f69c9f6fa8ba35b7d9b65a6caba164e Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Mon, 27 Mar 2023 21:53:40 +0100 Subject: [PATCH 21/29] vault: Document that 'has:' selector needs 1.1.9 Obsidian installer or above. --- .../sample_vaults/Tasks-Demo/Styling/Styling of Queries.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md b/resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md index 1fa651baaf..00c3dace1a 100644 --- a/resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md +++ b/resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md @@ -1,5 +1,11 @@ # Styling of Queries +> [!Warning] +> These tests require the `.has` selector. +> The CSS `:has` selector is available with **Obsidian installer version 1.1.9 and newer**. You can run the Obsidian command `Show debug info` to see your current installer version. + +--- + To test styling of queries, follow this: - [ ] **1. Open the Obsidian settings of the Demo vault and under Appearance | CSS Snippets, turn on `tasks-plugin-query-styling`.** From efb278305586dcaddb07c50019400f85ca14cd87 Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Mon, 27 Mar 2023 21:57:06 +0100 Subject: [PATCH 22/29] docs: Add table of contents to styling.md --- docs/advanced/styling.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index 78da1de6dd..75a8040587 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -7,6 +7,20 @@ has_toc: false --- # Styling Tasks +{: .no_toc } + +
+ + Table of contents + + {: .text-delta } +1. TOC +{:toc} +
+ +--- + +## Introduction In rendered queries and Reading View, the Tasks plugin adds detailed CSS classes and data attributes that represent many of each task's content, to allow for very extensive styling options via CSS. Not only each component in a rendered task line is tagged with classes to differentiate it, many components also add classes and data attributes that represent the actual content of the task, so CSS rules can refer to data such as the relative due date of a task or its specific priority. From 086bf073db09a44c4ac34e1bcd6680610b74ab48 Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Mon, 27 Mar 2023 21:59:31 +0100 Subject: [PATCH 23/29] docs: Fix tiny typo. --- docs/advanced/styling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index 75a8040587..a00c981e00 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -30,7 +30,7 @@ Not only each component in a rendered task line is tagged with classes to differ {: .released } The following description relates to a restructuring of the rendered tasks that was introduced in Tasks X.Y.Z. -The Tasks plugin renders a task in the following structure (this refers to query results, but the Reading View is the same exact the top-most containers): +The Tasks plugin renders a task in the following structure (this refers to query results, but the Reading View is the same except the top-most containers): ```markdown - Obsidian code block (div class="block-language-tasks") From 1f8ad60d34eb4b9206d17ef1478f267d6fb9726b Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Wed, 29 Mar 2023 13:54:13 +0100 Subject: [PATCH 24/29] docs: Fix pluralisation in styling.md --- docs/advanced/styling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index a00c981e00..7759975de5 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -55,7 +55,7 @@ The Tasks plugin renders a task in the following structure (this refers to query As can be seen above, the basic task `li` contains a checkbox and a content span. The content span contains a list of **component** spans: description, priority, recurrence, created date, start date, scheduled date, due date and done date in this order. -Each component span is marked with a **generic class**, which denotes the type of the component, and in some cases a **data attributes** that represents the component's content itself. +Each component span is marked with a **generic class**, which denotes the type of the component, and in some cases a **data attribute** that represents the component's content itself. Within each component span there is an additional "internal" span, which is the one holding the actual component text. The reason for this additional internal span is that it allows CSS styles that closely wrap the text itself, rather than its container box, e.g. for the purpose of drawing a highlight or a box that is exactly in the size of the text. From 8947322c83b571737a44617439bf6e0438f7632f Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Wed, 29 Mar 2023 13:58:09 +0100 Subject: [PATCH 25/29] test: Use whitespace to divide up a long test, for readability --- tests/TaskLineRenderer.test.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/TaskLineRenderer.test.ts b/tests/TaskLineRenderer.test.ts index 0d024974c9..92b182ebd4 100644 --- a/tests/TaskLineRenderer.test.ts +++ b/tests/TaskLineRenderer.test.ts @@ -77,25 +77,32 @@ describe('task line rendering', () => { // Check what we have one child, which is the rendered child expect(parentRender.children.length).toEqual(1); const li = parentRender.children[0]; + // Check that it's an element of type LI expect(li.nodeName).toEqual('LI'); + // Check that it has two children: a checkbox and a text span expect(li.children.length).toEqual(2); + const checkbox = li.children[0]; expect(checkbox.nodeName).toEqual('INPUT'); expect(checkbox.classList.contains('task-list-item-checkbox')).toBeTruthy(); + const textSpan = li.children[1]; expect(textSpan.nodeName).toEqual('SPAN'); expect(textSpan.classList.contains('tasks-list-text')).toBeTruthy(); + // Check that the text span contains a single description span expect(textSpan.children.length).toEqual(1); const descriptionSpan = textSpan.children[0]; expect(descriptionSpan.nodeName).toEqual('SPAN'); expect(descriptionSpan.className).toEqual('task-description'); + // Check that the description span contains an internal span (see taskToHtml for an explanation why it's there) expect(descriptionSpan.children.length).toEqual(1); const internalDescriptionSpan = descriptionSpan.children[0]; expect(internalDescriptionSpan.nodeName).toEqual('SPAN'); + // Check that eventually the correct text was rendered expect((internalDescriptionSpan as HTMLSpanElement).innerText).toEqual('This is a simple task'); }); From e2f554b4670bfbeebb6080ac153f6e2796a66a6e Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Wed, 29 Mar 2023 14:08:09 +0100 Subject: [PATCH 26/29] vault: Rename tasks-plugin-query-styling.css to clarify it's for smoke tests --- ...-styling.css => tasks-plugin-smoke-test-query-styling.css} | 2 ++ .../sample_vaults/Tasks-Demo/Styling/Styling of Queries.md | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) rename resources/sample_vaults/Tasks-Demo/.obsidian/snippets/{tasks-plugin-query-styling.css => tasks-plugin-smoke-test-query-styling.css} (72%) diff --git a/resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-query-styling.css b/resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-smoke-test-query-styling.css similarity index 72% rename from resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-query-styling.css rename to resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-smoke-test-query-styling.css index bd91c46e6e..79da183235 100644 --- a/resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-query-styling.css +++ b/resources/sample_vaults/Tasks-Demo/.obsidian/snippets/tasks-plugin-smoke-test-query-styling.css @@ -1,3 +1,5 @@ +/* This file is only for use in smoke-testing the Tasks plugin, and not intended for use by users. */ + .block-language-tasks:has(ul.plugin-tasks-query-result[data-task-group-by="priority"]) .tasks-group-heading { color: red; } diff --git a/resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md b/resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md index 00c3dace1a..cc45c5af9d 100644 --- a/resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md +++ b/resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md @@ -8,7 +8,7 @@ To test styling of queries, follow this: -- [ ] **1. Open the Obsidian settings of the Demo vault and under Appearance | CSS Snippets, turn on `tasks-plugin-query-styling`.** +- [ ] **1. Open the Obsidian settings of the Demo vault and under Appearance | CSS Snippets, turn on `tasks-plugin-smoke-test-query-styling`.** - [ ] **2.** **Test 'group by' classes** - the following query result should have **red headings** named 'Priority 1: High' and 'Priority 4: Low'. @@ -38,7 +38,7 @@ path includes Styling of Queries hide priority ``` -- [ ] 6. Open the Obsidian settings of the Demo vault and under Appearance | CSS Snippets, turn **off** `tasks-plugin-query-styling`. +- [ ] 6. Open the Obsidian settings of the Demo vault and under Appearance | CSS Snippets, turn **off** `tasks-plugin-smoke-test-query-styling`. ## Tasks for Reference From 59ac05d8092d7de906bc1ca4ceea94e560bb58bc Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Wed, 29 Mar 2023 14:17:17 +0100 Subject: [PATCH 27/29] vault: Move Styling of Queries.md to 'Manual Testing' folder To clarify that it is for testing, not for use by users. --- .../Tasks-Demo/{Styling => Manual Testing}/Styling of Queries.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename resources/sample_vaults/Tasks-Demo/{Styling => Manual Testing}/Styling of Queries.md (100%) diff --git a/resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md b/resources/sample_vaults/Tasks-Demo/Manual Testing/Styling of Queries.md similarity index 100% rename from resources/sample_vaults/Tasks-Demo/Styling/Styling of Queries.md rename to resources/sample_vaults/Tasks-Demo/Manual Testing/Styling of Queries.md From 30f31e77fbda3c1da2abff0202aa55f97b93145b Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Wed, 29 Mar 2023 14:18:51 +0100 Subject: [PATCH 28/29] vault: Minor clarifications to styling smoke test instructions --- .../Manual Testing/Smoke Testing the Tasks Plugin.md | 7 ++++++- .../Tasks-Demo/Manual Testing/Styling of Queries.md | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/resources/sample_vaults/Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md b/resources/sample_vaults/Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md index 02e7b088d5..d634e988da 100644 --- a/resources/sample_vaults/Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md +++ b/resources/sample_vaults/Tasks-Demo/Manual Testing/Smoke Testing the Tasks Plugin.md @@ -91,7 +91,6 @@ Steps to do: - [ ] #task View this file in **Reading view** and confirm that the tasks in this section are listed - [ ] #task View this file in **Live Preview** and confirm that the tasks in this section are listed - [ ] #task **check**: Checked all above steps for **viewing task blocks** worked -- [ ] #task **check**: Open the file [[Styling of Queries]] and follow the steps there --- @@ -104,6 +103,12 @@ heading includes Rendering of Task Blocks --- +### Styling of Rendered Task Blocks + +- [ ] #task **check**: Open the file [[Styling of Queries]] and follow the steps there + +--- + ### Create or edit Task modal - This text should copied in to the task Description, after following steps below diff --git a/resources/sample_vaults/Tasks-Demo/Manual Testing/Styling of Queries.md b/resources/sample_vaults/Tasks-Demo/Manual Testing/Styling of Queries.md index cc45c5af9d..028a5450b1 100644 --- a/resources/sample_vaults/Tasks-Demo/Manual Testing/Styling of Queries.md +++ b/resources/sample_vaults/Tasks-Demo/Manual Testing/Styling of Queries.md @@ -6,7 +6,7 @@ --- -To test styling of queries, follow this: +To test styling of queries, follow these steps, viewing this file either in **Reading** Mode or **Live Preview** Mode: - [ ] **1. Open the Obsidian settings of the Demo vault and under Appearance | CSS Snippets, turn on `tasks-plugin-smoke-test-query-styling`.** From c32f2bbd76aa2b1b3feacde9905bdd9c2603c16c Mon Sep 17 00:00:00 2001 From: Clare Macrae Date: Wed, 29 Mar 2023 14:28:40 +0100 Subject: [PATCH 29/29] Update styling.md Co-Authored-By: esm7 --- docs/advanced/styling.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/advanced/styling.md b/docs/advanced/styling.md index 7759975de5..f708f1ef2c 100644 --- a/docs/advanced/styling.md +++ b/docs/advanced/styling.md @@ -179,6 +179,16 @@ span.task-priority { } ``` +### Styling Tasks with Custom Statuses + +To create a green halo around the checkbox of tasks with a `/` custom status, add the following CSS snippet: + +```css +li.task-list-item[data-task="/"] .task-list-item-checkbox { + box-shadow: 0 0 10px green; +} +``` + ### Colors for Due Today and Overdue The following rules mark 'today' due dates as blue and past due dates as red:

See the documentation to get started!