@firestitch/report 18.10.0 → 18.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/components/component-text/component-text.component.d.ts +1 -0
- package/app/reports/components/component-text/value-embed.plugin.d.ts +25 -1
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +12 -0
- package/app/reports/components/report-component/report-component.component.d.ts +1 -0
- package/app/reports/data/report.data.d.ts +5 -7
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +13 -1
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +30 -2
- package/app/reports/export/report-export-collector.service.d.ts +13 -5
- package/app/reports/export/report-filter-lines.d.ts +3 -0
- package/app/reports/filter-settings-rules.d.ts +4 -0
- package/app/reports/filter-text.d.ts +8 -0
- package/app/reports/format.d.ts +1 -0
- package/app/reports/interfaces/report-export-lines-input.interface.d.ts +1 -0
- package/app/reports/interfaces/report-filter-group-changes.interface.d.ts +7 -0
- package/app/reports/interfaces/report.interface.d.ts +1 -14
- package/app/reports/report-filter-items.d.ts +11 -8
- package/app/reports/report-view-config.d.ts +1 -3
- package/app/reports/services/report-filter-state.service.d.ts +5 -14
- package/app/reports/services/report-view.service.d.ts +1 -13
- package/app/reports/text.d.ts +16 -0
- package/app/reports/views/report/fs-ai-report.component.d.ts +2 -8
- package/esm2022/app/reports/canvas-landing-page.mjs +7 -6
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +5 -5
- package/esm2022/app/reports/components/component-text/component-text.component.mjs +34 -22
- package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +254 -42
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +130 -24
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +38 -19
- package/esm2022/app/reports/data/report.data.mjs +19 -11
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +57 -14
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +169 -21
- package/esm2022/app/reports/export/report-export-collector.service.mjs +84 -33
- package/esm2022/app/reports/export/report-filter-lines.mjs +25 -8
- package/esm2022/app/reports/export/report-pdf.service.mjs +31 -21
- package/esm2022/app/reports/export/report-pptx.service.mjs +21 -11
- package/esm2022/app/reports/filter-settings-rules.mjs +8 -1
- package/esm2022/app/reports/filter-text.mjs +154 -0
- package/esm2022/app/reports/format.mjs +3 -2
- package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-filter-group-changes.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/report-date-presets.mjs +2 -2
- package/esm2022/app/reports/report-filter-items.mjs +48 -106
- package/esm2022/app/reports/report-view-config.mjs +6 -116
- package/esm2022/app/reports/services/report-filter-state.service.mjs +92 -269
- package/esm2022/app/reports/services/report-view.service.mjs +25 -165
- package/esm2022/app/reports/text.mjs +59 -13
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +69 -130
- package/esm2022/app/reports/views/report/report.component.mjs +25 -19
- package/fesm2022/{firestitch-report-echarts-UBg8Wlhd.mjs → firestitch-report-echarts-CyHkFToO.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-UBg8Wlhd.mjs.map → firestitch-report-echarts-CyHkFToO.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-B1keNrcK.mjs → firestitch-report-firestitch-report-DftB7M1o.mjs} +2936 -3254
- package/fesm2022/firestitch-report-firestitch-report-DftB7M1o.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/app/reports/interfaces/report-url-link.interface.d.ts +0 -4
- package/app/reports/interfaces/report-url-value-name.type.d.ts +0 -1
- package/app/reports/interfaces/report-url-write.interface.d.ts +0 -4
- package/app/reports/report-url-state.d.ts +0 -36
- package/esm2022/app/reports/interfaces/report-url-link.interface.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-url-value-name.type.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-url-write.interface.mjs +0 -2
- package/esm2022/app/reports/report-url-state.mjs +0 -677
- package/fesm2022/firestitch-report-firestitch-report-B1keNrcK.mjs.map +0 -1
|
@@ -13,6 +13,13 @@ export const COMPONENT_TOGGLE_TOOLTIP = 'Show on this component';
|
|
|
13
13
|
export const FIXED_DATES_PERIOD = 'fixed';
|
|
14
14
|
// How many decimals a Default minimum or Default maximum takes.
|
|
15
15
|
export const DEFAULT_BOUND_SCALE = 6;
|
|
16
|
+
// A filter's Name and Label, checked as the server checks them, so a bad one
|
|
17
|
+
// is caught before Save. The name is an identifier: a letter, then letters
|
|
18
|
+
// and digits. That it is unique in the report is the server's to check.
|
|
19
|
+
export const FILTER_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9]*$/;
|
|
20
|
+
export const FILTER_NAME_PATTERN_MESSAGE = 'A name starts with a letter and holds only letters and digits.';
|
|
21
|
+
export const FILTER_NAME_MAX_LENGTH = 50;
|
|
22
|
+
export const FILTER_LABEL_MAX_LENGTH = 200;
|
|
16
23
|
// Every Report bar choice, in the order the select lists them.
|
|
17
24
|
const BAR_PLACEMENT_OPTIONS = [
|
|
18
25
|
{ value: 'off', name: 'Off' },
|
|
@@ -280,4 +287,4 @@ export function normalizeDefault(value) {
|
|
|
280
287
|
export function defaultChanged(stored, draft) {
|
|
281
288
|
return JSON.stringify(normalizeDefault(stored)) !== JSON.stringify(normalizeDefault(draft));
|
|
282
289
|
}
|
|
283
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXNldHRpbmdzLXJ1bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2ZpbHRlci1zZXR0aW5ncy1ydWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtQkEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd6RCxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQTZDO0lBQzNFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0lBQ25DLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFO0NBQy9DLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyx1Q0FBdUMsQ0FBQztBQUMzRSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRywyQ0FBMkMsQ0FBQztBQUMvRSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyx3QkFBd0IsQ0FBQztBQUVqRSwyRUFBMkU7QUFDM0UsdUJBQXVCO0FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztBQUUxQyxnRUFBZ0U7QUFDaEUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBRXJDLCtEQUErRDtBQUMvRCxNQUFNLHFCQUFxQixHQUErQztJQUN4RSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUM3QixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRTtJQUN0QyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO0NBQzFDLENBQUM7QUFHRixrRUFBa0U7QUFDbEUsTUFBTSxlQUFlLEdBQUcsOEJBQThCLENBQUM7QUFDdkQsMEVBQTBFO0FBQzFFLHVFQUF1RTtBQUN2RSxNQUFNLGFBQWEsR0FBRyx5QkFBeUIsQ0FBQztBQUVoRCx5RUFBeUU7QUFDekUsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSw4QkFBOEI7QUFDOUIsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQVk7SUFDNUMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ2pGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTNCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDL0MsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxzQkFBc0I7QUFDdEIsTUFBTSxVQUFVLFdBQVcsQ0FBQyxHQUFrQixFQUFFLEdBQWtCO0lBQ2hFLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUMvQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLFFBQVEsR0FBRyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDL0MsQ0FBQztBQUVELHlFQUF5RTtBQUN6RSwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLG1FQUFtRTtBQUNuRSxNQUFNLFVBQVUsZUFBZSxDQUM3QixLQUE0QyxFQUM1Qyx3QkFBaUMsRUFDakMsUUFBa0Q7SUFFbEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztXQUNoRCxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUVqRixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksRUFBRSxJQUFJO1FBQ1YsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxPQUFPLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJO0tBQy9ELENBQUM7QUFDSixDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLHVFQUF1RTtBQUN2RSw2Q0FBNkM7QUFDN0MsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxRQUFrRCxFQUNsRCxNQUFlO0lBRWYsTUFBTSxNQUFNLEdBQXdCLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVwRSxPQUFPLE1BQU0sSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQztRQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ2IsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxtRUFBbUU7QUFDbkUsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxZQUFpQyxFQUNqQyxVQUE4QixLQUFLO0lBRW5DLE9BQU8scUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDN0MsUUFBUSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckIsS0FBSyxPQUFPO2dCQUNWLE9BQU8sWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sS0FBSyxPQUFPLENBQUM7WUFDakcsS0FBSyxNQUFNO2dCQUNULE9BQU8sWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLEtBQUssTUFBTSxDQUFDO1lBQzdEO2dCQUNFLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsMkVBQTJFO0FBQzNFLDRFQUE0RTtBQUM1RSxrRUFBa0U7QUFDbEUsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxZQUFpQyxFQUNqQyxPQUE2QztJQUU3QyxNQUFNLE9BQU8sR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLEtBQUssTUFBTTtRQUM1QyxDQUFDLENBQUMsWUFBWTtRQUNkLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUM7SUFFckQsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLHdFQUF3RTtBQUN4RSx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixTQUE2QixFQUM3QixPQUE2QztJQUU3QyxJQUFJLFNBQVMsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLFNBQVMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ2xELENBQUM7SUFFRCxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUMxQixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsUUFBUSxPQUFPLEVBQUUsQ0FBQztRQUNoQixLQUFLLFdBQVc7WUFDZCxPQUFPLE1BQU0sQ0FBQztRQUNoQixLQUFLLE1BQU07WUFDVCxPQUFPLFFBQVEsQ0FBQztRQUNsQjtZQUNFLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLE9BQU87QUFDUCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQTJDO0lBQ3RFLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssTUFBTTtZQUNULE9BQU8sT0FBTyxDQUFDO1FBQ2pCLEtBQUssTUFBTTtZQUNULE9BQU8sTUFBTSxDQUFDO1FBQ2hCO1lBQ0UsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNILENBQUM7QUFFRCxzREFBc0Q7QUFDdEQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQTJDO0lBQzFFLE9BQU8sS0FBSyxLQUFLLFdBQVcsSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDO0FBQ25ELENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsMEVBQTBFO0FBQzFFLDBDQUEwQztBQUMxQyxNQUFNLFVBQVUsV0FBVyxDQUFDLFNBQTZCLEVBQUUsU0FBa0I7SUFDM0UsUUFBUSxTQUFTLEVBQUUsQ0FBQztRQUNsQixLQUFLLE1BQU07WUFDVCxPQUFPLE1BQU0sQ0FBQztRQUNoQixLQUFLLE9BQU87WUFDVixPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDdkM7WUFDRSxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDMUMsQ0FBQztBQUNILENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFNBQTZCO0lBQ2hFLE9BQU8sU0FBUyxLQUFLLE1BQU07UUFDekIsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7UUFDbEQsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQztBQUM3RCxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLG1EQUFtRDtBQUNuRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBOEM7SUFDN0UsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7U0FDbEIsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQztTQUMvRixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLDZFQUE2RTtBQUM3RSxtREFBbUQ7QUFDbkQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUF3QixFQUFFLEtBQXNDO0lBQzlGLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksSUFBSSxRQUFRLENBQUM7SUFFMUUsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDZCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLEdBQUcsS0FBSyxXQUFXLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksUUFBUSxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUN6RSxDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLDJFQUEyRTtBQUMzRSxxRUFBcUU7QUFDckUsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxNQUFpRCxFQUNqRCxTQUF3QixJQUFJO0lBRTVCLE1BQU0sT0FBTyxHQUEyQjtRQUN0QyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO1FBQ2xELEdBQUcsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUN6RixDQUFDO0lBRUYsT0FBTyxNQUFNLElBQUksTUFBTSxLQUFLLGtCQUFrQixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztRQUN4RSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUE2QixDQUFDLEVBQUUsQ0FBQztRQUM5RSxDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ2QsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSwrQ0FBK0M7QUFDL0MsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUE2QztJQUN6RSxPQUFPLE1BQU0sRUFBRSxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUc7UUFDckQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRO1FBQ2pCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztBQUN6QixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLHNFQUFzRTtBQUN0RSxzQ0FBc0M7QUFDdEMsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixNQUFjLEVBQ2QsS0FBb0IsRUFDcEIsR0FBa0I7SUFFbEIsSUFBSSxNQUFNLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztRQUNsQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDbEUsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFpQixFQUFFLE9BQWdCO0lBQy9ELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzFELENBQUM7QUFFRCx3RUFBd0U7QUFDeEUscUVBQXFFO0FBQ3JFLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFlLEVBQUUsTUFBZTtJQUNqRSxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV0QyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDaEYsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSw0RUFBNEU7QUFDNUUsMkVBQTJFO0FBQzNFLDBFQUEwRTtBQUMxRSx3REFBd0Q7QUFDeEQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixLQUF3QixFQUN4QixRQUFrRDtJQUVsRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUM1RSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLGFBQWEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELHNFQUFzRTtBQUN0RSw4RUFBOEU7QUFDOUUsNENBQTRDO0FBQzVDLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUE0QztJQUMzRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBdUIsRUFBRSxDQUFDO0lBQzFDLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hCLFVBQVUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxVQUFVLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDN0IsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN6QixVQUFVLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUNoQyxVQUFVLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7SUFDakQsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEMsVUFBVSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQzdCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQixVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLFVBQVUsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUN2QyxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDNUQsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSx3QkFBd0I7QUFDeEIsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsTUFBNkMsRUFDN0MsS0FBNEM7SUFFNUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzlGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGUgcnVsZXMgYmVoaW5kIHRoZSB0d28gZmlsdGVyIHNldHRpbmdzIGRpYWxvZ3MsIGtlcHQgcHVyZSBzbyB0aGUgbm9kZVxuLy8gaGFybmVzcyBjaGVja3MgdGhlbSB3aXRob3V0IGEgZGlhbG9nLiBUaGUgY29tcG9uZW50IHNldHRpbmdzJyBGaWx0ZXJzIHRhYlxuLy8gcmVhZHMgdGhlIFR5cGUgc2VsZWN0LCB0aGUgUmVwb3J0IGJhciBzZWxlY3QgYW5kIHRoZSBUaGlzIGNvbXBvbmVudCB0b2dnbGVcbi8vIGZyb20gaGVyZTsgdGhlIHJlcG9ydCBzZXR0aW5ncycgRmlsdGVycyB0YWIgcmVhZHMgaXRzIGRlZmF1bHQgcm93cyAodGhlXG4vLyBwZXJpb2QsIHRoZSBleGNsdWRlIHRvZ2dsZSwgdGhlIG51bWJlciByYW5nZSBlbmRzIGFuZCB0aGVpciBjaGVjaykgZnJvbVxuLy8gaGVyZS4gVGhlIGRpYWxvZ3Mgb25seSBjYWxsIHRoZXNlLlxuaW1wb3J0IHsgRmlsdGVyQmFyUGxhY2VtZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2ZpbHRlci1iYXItcGxhY2VtZW50LnR5cGUnO1xuaW1wb3J0IHsgRmlsdGVyQ29tcG9uZW50VG9nZ2xlU3RhdGUgfSBmcm9tICcuL2ludGVyZmFjZXMvZmlsdGVyLWNvbXBvbmVudC10b2dnbGUtc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZpbHRlclNldHRpbmdzT3B0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2ZpbHRlci1zZXR0aW5ncy1vcHRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IEZpbHRlclR5cGVTZWxlY3RTdGF0ZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9maWx0ZXItdHlwZS1zZWxlY3Qtc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdlci1mZWF0dXJlLnR5cGUnO1xuaW1wb3J0IHtcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0RmlsdGVyTGV2ZWwsXG4gIFJlcG9ydEZpbHRlclR5cGUsXG4gIFJlcG9ydFBhZ2UsXG4gIFJlcG9ydFJlbGF0aXZlUmFuZ2UsXG59IGZyb20gJy4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJFTEFUSVZFX1JBTkdFX05BTUVTLCBpc1JlbGF0aXZlUmFuZ2UgfSBmcm9tICcuL3JlcG9ydC12aWV3LWNvbmZpZyc7XG5pbXBvcnQgeyBvZmZlcnNFeGNsdWRlIH0gZnJvbSAnLi9yZXBvcnQtdmlld2VyLWZlYXR1cmVzJztcblxuXG4vLyBUaGUgVHlwZSBzZWxlY3QncyBjaG9pY2VzLiBBIGNvbHVtbiB0aGF0IGNhbiBiZSBlaXRoZXIgaG9sZHMgYm90aC5cbmV4cG9ydCBjb25zdCBGSUxURVJfVFlQRV9PUFRJT05TOiBGaWx0ZXJTZXR0aW5nc09wdGlvbjxSZXBvcnRGaWx0ZXJUeXBlPltdID0gW1xuICB7IHZhbHVlOiAnc2VsZWN0JywgbmFtZTogJ1ZhbHVlcycgfSxcbiAgeyB2YWx1ZTogJ251bWJlclJhbmdlJywgbmFtZTogJ051bWJlciByYW5nZScgfSxcbl07XG5cbmV4cG9ydCBjb25zdCBUWVBFX0xPQ0tFRF9UT09MVElQID0gJ1JlbW92ZSB0aGUgZmlsdGVyIHRvIGNoYW5nZSBpdHMgdHlwZS4nO1xuZXhwb3J0IGNvbnN0IFBBR0VfRklMVEVSX1RPT0xUSVAgPSAnQSBwYWdlIGZpbHRlciBzaG93cyBpbiB0aGUgcGFnZSBiYXIgb25seS4nO1xuZXhwb3J0IGNvbnN0IENPTVBPTkVOVF9UT0dHTEVfVE9PTFRJUCA9ICdTaG93IG9uIHRoaXMgY29tcG9uZW50JztcblxuLy8gVGhlIERlZmF1bHQgcGVyaW9kIHNlbGVjdCdzIHZhbHVlIGZvciBhIHJhbmdlIG9mIGZpeGVkIGRheXMuIE5vIHJlbGF0aXZlXG4vLyByYW5nZSBpcyBuYW1lZCB0aGlzLlxuZXhwb3J0IGNvbnN0IEZJWEVEX0RBVEVTX1BFUklPRCA9ICdmaXhlZCc7XG5cbi8vIEhvdyBtYW55IGRlY2ltYWxzIGEgRGVmYXVsdCBtaW5pbXVtIG9yIERlZmF1bHQgbWF4aW11bSB0YWtlcy5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0JPVU5EX1NDQUxFID0gNjtcblxuLy8gRXZlcnkgUmVwb3J0IGJhciBjaG9pY2UsIGluIHRoZSBvcmRlciB0aGUgc2VsZWN0IGxpc3RzIHRoZW0uXG5jb25zdCBCQVJfUExBQ0VNRU5UX09QVElPTlM6IEZpbHRlclNldHRpbmdzT3B0aW9uPEZpbHRlckJhclBsYWNlbWVudD5bXSA9IFtcbiAgeyB2YWx1ZTogJ29mZicsIG5hbWU6ICdPZmYnIH0sXG4gIHsgdmFsdWU6ICdldmVyeScsIG5hbWU6ICdFdmVyeSBwYWdlJyB9LFxuICB7IHZhbHVlOiAncGFnZScsIG5hbWU6ICdUaGlzIHBhZ2Ugb25seScgfSxcbl07XG5cblxuLy8gQSBudW1iZXIgd2l0aCBpdHMgZ3JvdXAgY29tbWFzIGluIHBsYWNlICgnMSwyNTAuNScsICctMTIsMDAwJykuXG5jb25zdCBHUk9VUEVEX0RFQ0lNQUwgPSAvXi0/XFxkezEsM30oLFxcZHszfSkrKFxcLlxcZCopPyQvO1xuLy8gQSBwbGFpbiBkZWNpbWFsIG51bWJlciAoJzEyNTAuNScsICctMycsICcwJywgJy41JykuIEhleCwgYmluYXJ5LCBvY3RhbCxcbi8vIGV4cG9uZW50cyBhbmQgaW5uZXIgc3BhY2VzIGRvIG5vdCBtYXRjaCwgdGhvdWdoIE51bWJlcigpIHJlYWRzIHNvbWUuXG5jb25zdCBQTEFJTl9ERUNJTUFMID0gL14tPyhcXGQrKFxcLlxcZCopP3xcXC5cXGQrKSQvO1xuXG4vLyBBIGRlZmF1bHQgcmFuZ2UgZW5kIGFzIHR5cGVkLiBBbiBlbXB0eSBmaWVsZCBpcyBubyBlbmQuIEEgbnVtYmVyIGlucHV0XG4vLyB3aXRoIGEgbWFzayBoYW5kcyBiYWNrIHRleHQgd2l0aCBpdHMgZ3JvdXAgY29tbWFzICgnMSwyNTAuNScpLCBzbyB0aG9zZSBnb1xuLy8gYmVmb3JlIE51bWJlcigpIHJlYWRzIGl0OyAwIGlzIGFuIGVuZCBsaWtlIGFueSBvdGhlci4gQW55dGhpbmcgdGhhdCBpcyBub3Rcbi8vIGEgZGVjaW1hbCBudW1iZXIgaXMgbm8gZW5kLlxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGVmYXVsdEJvdW5kKHJhdzogdW5rbm93bik6IG51bWJlciB8IG51bGwge1xuICBpZiAodHlwZW9mIHJhdyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHJhdykgPyByYXcgOiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByYXcgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gcmF3LnRyaW0oKTtcbiAgY29uc3QgdGV4dCA9IEdST1VQRURfREVDSU1BTC50ZXN0KHRyaW1tZWQpID8gdHJpbW1lZC5yZXBsYWNlKC8sL2csICcnKSA6IHRyaW1tZWQ7XG4gIGlmICghUExBSU5fREVDSU1BTC50ZXN0KHRleHQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB2YWx1ZSA9IE51bWJlcih0ZXh0KTtcblxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogbnVsbDtcbn1cblxuLy8gV2h5IHR3byByYW5nZSBlbmRzIGNhbm5vdCBiZSBzYXZlZCwgaW4gdGhlIHNlcnZlcidzIHdvcmRzLCBvciBudWxsLiBBbiBvcGVuXG4vLyBlbmQgaXMgYWx3YXlzIGZpbmUuXG5leHBvcnQgZnVuY3Rpb24gYm91bmRzRXJyb3IobWluOiBudW1iZXIgfCBudWxsLCBtYXg6IG51bWJlciB8IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKG1pbiA9PT0gbnVsbCB8fCBtYXggPT09IG51bGwgfHwgbWluIDw9IG1heCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGBtaW4gKCR7bWlufSkgaXMgYWJvdmUgbWF4ICgke21heH0pLmA7XG59XG5cbi8vIFRoZSBUeXBlIHNlbGVjdCBvZiBhIGNvbHVtbiBvbiB0aGUgY29tcG9uZW50IHNldHRpbmdzJyBGaWx0ZXJzIHRhYi4gSXRcbi8vIHNob3dzIHdoZW4gdGhlIGNvbHVtbiBjYW4gdGFrZSBlaXRoZXIgdHlwZSBhbmQgdGhlIHNlcnZlciBzZXJ2ZXMgbnVtYmVyXG4vLyByYW5nZXMgKGFuIG9sZGVyIHNlcnZlciBsaXN0cyBubyBmZWF0dXJlcykuIEEgZmlsdGVyJ3MgdHlwZSBjYW5ub3QgY2hhbmdlLFxuLy8gc28gaXQgaXMgbG9ja2VkIHdoaWxlIHRoZSBjb2x1bW4gaGFzIGEgZmlsdGVyIG9uIHRoaXMgY29tcG9uZW50LlxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVTZWxlY3RTdGF0ZShcbiAgdHlwZXM6IFJlcG9ydEZpbHRlclR5cGVbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGhhc0ZpbHRlck9uVGhpc0NvbXBvbmVudDogYm9vbGVhbixcbiAgZmVhdHVyZXM6IFJlcG9ydFZpZXdlckZlYXR1cmVbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBGaWx0ZXJUeXBlU2VsZWN0U3RhdGUge1xuICBjb25zdCBzaG93ID0gKGZlYXR1cmVzID8/IFtdKS5pbmNsdWRlcygnbnVtYmVyUmFuZ2UnKVxuICAgICYmIEZJTFRFUl9UWVBFX09QVElPTlMuZXZlcnkoKG9wdGlvbikgPT4gKHR5cGVzID8/IFtdKS5pbmNsdWRlcyhvcHRpb24udmFsdWUpKTtcblxuICBpZiAoIXNob3cpIHtcbiAgICByZXR1cm4geyBzaG93OiBmYWxzZSwgZGlzYWJsZWQ6IGZhbHNlLCB0b29sdGlwOiBudWxsIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNob3c6IHRydWUsXG4gICAgZGlzYWJsZWQ6IGhhc0ZpbHRlck9uVGhpc0NvbXBvbmVudCxcbiAgICB0b29sdGlwOiBoYXNGaWx0ZXJPblRoaXNDb21wb25lbnQgPyBUWVBFX0xPQ0tFRF9UT09MVElQIDogbnVsbCxcbiAgfTtcbn1cblxuLy8gVGhlIGxldmVscyBhIG5ldyBvciBtb3ZlZCBmaWx0ZXIgY2FuIHRha2Ugb24gYSBjb21wb25lbnQuIFRoaXMgcGFnZSBvbmx5XG4vLyBuZWVkcyBhIHNlcnZlciB0aGF0IHNlcnZlcyBwYWdlIGZpbHRlcnMgYW5kIGEgY29tcG9uZW50IG9uIGEgcGFnZSAoYVxuLy8gaGVhZGVyIG9yIGZvb3RlciBjb21wb25lbnQgaXMgb24gbm8gcGFnZSkuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTGV2ZWxDaG9pY2VzKFxuICBmZWF0dXJlczogUmVwb3J0Vmlld2VyRmVhdHVyZVtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb25QYWdlOiBib29sZWFuLFxuKTogUmVwb3J0RmlsdGVyTGV2ZWxbXSB7XG4gIGNvbnN0IGxldmVsczogUmVwb3J0RmlsdGVyTGV2ZWxbXSA9IFsnY29tcG9uZW50JywgJ3JlcG9ydCcsICdib3RoJ107XG5cbiAgcmV0dXJuIG9uUGFnZSAmJiAoZmVhdHVyZXMgPz8gW10pLmluY2x1ZGVzKCdwYWdlU2NvcGUnKVxuICAgID8gWy4uLmxldmVscywgJ3BhZ2UnXVxuICAgIDogbGV2ZWxzO1xufVxuXG4vLyBUaGUgUmVwb3J0IGJhciBzZWxlY3QncyBjaG9pY2VzIGZvciB0aGUgbGV2ZWxzIG9uIG9mZmVyLiBUaGUgY2hvaWNlIGEgcm93XG4vLyBhbHJlYWR5IGhvbGRzIGlzIGFsd2F5cyBsaXN0ZWQsIHNvIHRoZSBzZWxlY3QgbmV2ZXIgc2hvd3MgYmxhbmsuXG5leHBvcnQgZnVuY3Rpb24gYmFyUGxhY2VtZW50T3B0aW9ucyhcbiAgbGV2ZWxDaG9pY2VzOiBSZXBvcnRGaWx0ZXJMZXZlbFtdLFxuICBjdXJyZW50OiBGaWx0ZXJCYXJQbGFjZW1lbnQgPSAnb2ZmJyxcbik6IEZpbHRlclNldHRpbmdzT3B0aW9uPEZpbHRlckJhclBsYWNlbWVudD5bXSB7XG4gIHJldHVybiBCQVJfUExBQ0VNRU5UX09QVElPTlMuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICBzd2l0Y2ggKG9wdGlvbi52YWx1ZSkge1xuICAgICAgY2FzZSAnZXZlcnknOlxuICAgICAgICByZXR1cm4gbGV2ZWxDaG9pY2VzLmluY2x1ZGVzKCdyZXBvcnQnKSB8fCBsZXZlbENob2ljZXMuaW5jbHVkZXMoJ2JvdGgnKSB8fCBjdXJyZW50ID09PSAnZXZlcnknO1xuICAgICAgY2FzZSAncGFnZSc6XG4gICAgICAgIHJldHVybiBsZXZlbENob2ljZXMuaW5jbHVkZXMoJ3BhZ2UnKSB8fCBjdXJyZW50ID09PSAncGFnZSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBBIHZhbHVlJ3MgUmVwb3J0IGJhciBjaG9pY2VzLiBBIHZhbHVlIGhhcyBubyBzdHJpcCBvZiBpdHMgb3duIGFuZCBpdHNcbi8vIGdyb3VwIG1heSBiZSBzaGFyZWQsIHNvIGEgcGljayBuZXZlciBsb3dlcnMgdGhlIGdyb3VwICh0aGUgaW5saW5lIHZhbHVlc1xuLy8gcnVsZSk6IFRoaXMgcGFnZSBvbmx5IGlzIG9mZmVyZWQgZm9yIGEgbmV3IGZpbHRlciwgb3IgZm9yIGEgZ3JvdXAgdGhhdCBpc1xuLy8gYWxyZWFkeSBhIHBhZ2UgZ3JvdXAsIG5ldmVyIHRvIG1vdmUgYSBzaGFyZWQgZ3JvdXAgdG8gb25lIHBhZ2UuXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVQbGFjZW1lbnRPcHRpb25zKFxuICBsZXZlbENob2ljZXM6IFJlcG9ydEZpbHRlckxldmVsW10sXG4gIGN1cnJlbnQ6IFJlcG9ydEZpbHRlckxldmVsIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IEZpbHRlclNldHRpbmdzT3B0aW9uPEZpbHRlckJhclBsYWNlbWVudD5bXSB7XG4gIGNvbnN0IGNob2ljZXMgPSAhY3VycmVudCB8fCBjdXJyZW50ID09PSAncGFnZSdcbiAgICA/IGxldmVsQ2hvaWNlc1xuICAgIDogbGV2ZWxDaG9pY2VzLmZpbHRlcigobGV2ZWwpID0+IGxldmVsICE9PSAncGFnZScpO1xuXG4gIHJldHVybiBiYXJQbGFjZW1lbnRPcHRpb25zKGNob2ljZXMsIGJhclBsYWNlbWVudChjdXJyZW50KSk7XG59XG5cbi8vIFRoZSBsZXZlbCBhIHZhbHVlJ3MgZmlsdGVyIGdyb3VwIGVuZHMgYXQgYWZ0ZXIgYSBSZXBvcnQgYmFyIHBpY2ssIG9yIG51bGxcbi8vIHdoZW4gdGhlIHZhbHVlIGxlYXZlcyBpdC4gT2ZmIHVubGlua3MgdGhpcyB2YWx1ZSBhbG9uZSBhbmQgdGhlIGdyb3VwIGtlZXBzXG4vLyBpdHMgb3RoZXIgbWVtYmVycy4gQSBuZXcgZmlsdGVyIHRha2VzIHRoZSBwaWNrJ3MgbGV2ZWwuIEV2ZXJ5IHBhZ2UgcmFpc2VzIGFcbi8vIHN0cmlwLW9ubHkgZ3JvdXAgdG8gYm90aCwga2VlcGluZyBpdHMgc3RyaXBzLCBhbmQgYSBwYWdlIGdyb3VwIHRvIHRoZVxuLy8gcmVwb3J0IGJhci4gTm90aGluZyBlbHNlIG1vdmVzIHRoZSBncm91cCwgc28gYSB2YWx1ZSBuZXZlciBsb3dlcnMgaXQuXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVGaWx0ZXJMZXZlbChcbiAgcGxhY2VtZW50OiBGaWx0ZXJCYXJQbGFjZW1lbnQsXG4gIGN1cnJlbnQ6IFJlcG9ydEZpbHRlckxldmVsIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IFJlcG9ydEZpbHRlckxldmVsIHwgbnVsbCB7XG4gIGlmIChwbGFjZW1lbnQgPT09ICdvZmYnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoIWN1cnJlbnQpIHtcbiAgICByZXR1cm4gcGxhY2VtZW50ID09PSAncGFnZScgPyAncGFnZScgOiAncmVwb3J0JztcbiAgfVxuXG4gIGlmIChwbGFjZW1lbnQgIT09ICdldmVyeScpIHtcbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIHN3aXRjaCAoY3VycmVudCkge1xuICAgIGNhc2UgJ2NvbXBvbmVudCc6XG4gICAgICByZXR1cm4gJ2JvdGgnO1xuICAgIGNhc2UgJ3BhZ2UnOlxuICAgICAgcmV0dXJuICdyZXBvcnQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgfVxufVxuXG4vLyBXaGVyZSBhIGdyb3VwIG9mIGEgbGV2ZWwgc2hvd3MgaW4gdGhlIHJlcG9ydCBiYXIuIE5vIGdyb3VwIChubyBmaWx0ZXIpIGlzXG4vLyBvZmYuXG5leHBvcnQgZnVuY3Rpb24gYmFyUGxhY2VtZW50KGxldmVsOiBSZXBvcnRGaWx0ZXJMZXZlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBGaWx0ZXJCYXJQbGFjZW1lbnQge1xuICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgY2FzZSAncmVwb3J0JzpcbiAgICBjYXNlICdib3RoJzpcbiAgICAgIHJldHVybiAnZXZlcnknO1xuICAgIGNhc2UgJ3BhZ2UnOlxuICAgICAgcmV0dXJuICdwYWdlJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdvZmYnO1xuICB9XG59XG5cbi8vIFdoZXRoZXIgYSBncm91cCBvZiBhIGxldmVsIHNob3dzIG9uIGl0cyBjb21wb25lbnRzLlxuZXhwb3J0IGZ1bmN0aW9uIHNob3duT25Db21wb25lbnQobGV2ZWw6IFJlcG9ydEZpbHRlckxldmVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbGV2ZWwgPT09ICdjb21wb25lbnQnIHx8IGxldmVsID09PSAnYm90aCc7XG59XG5cbi8vIFRoZSBsZXZlbCB0aGUgdHdvIGNvbnRyb2xzIG9mIGEgcm93IGFzayBmb3IsIG9yIG51bGwgd2hlbiB0aGV5IGFzayBmb3Igbm9cbi8vIGZpbHRlciBhdCBhbGwuIEEgcGFnZSBmaWx0ZXIgc2hvd3MgaW4gaXRzIHBhZ2UncyBiYXIgb25seSwgc28gVGhpcyBwYWdlXG4vLyBvbmx5IGlnbm9yZXMgdGhlIFRoaXMgY29tcG9uZW50IHRvZ2dsZS5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJMZXZlbChwbGFjZW1lbnQ6IEZpbHRlckJhclBsYWNlbWVudCwgY29tcG9uZW50OiBib29sZWFuKTogUmVwb3J0RmlsdGVyTGV2ZWwgfCBudWxsIHtcbiAgc3dpdGNoIChwbGFjZW1lbnQpIHtcbiAgICBjYXNlICdwYWdlJzpcbiAgICAgIHJldHVybiAncGFnZSc7XG4gICAgY2FzZSAnZXZlcnknOlxuICAgICAgcmV0dXJuIGNvbXBvbmVudCA/ICdib3RoJyA6ICdyZXBvcnQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY29tcG9uZW50ID8gJ2NvbXBvbmVudCcgOiBudWxsO1xuICB9XG59XG5cbi8vIFRoZSBUaGlzIGNvbXBvbmVudCB0b2dnbGUgb2YgYSByb3c6IGxvY2tlZCB3aGlsZSBUaGlzIHBhZ2Ugb25seSBpcyBwaWNrZWQuXG5leHBvcnQgZnVuY3Rpb24gY29tcG9uZW50VG9nZ2xlU3RhdGUocGxhY2VtZW50OiBGaWx0ZXJCYXJQbGFjZW1lbnQpOiBGaWx0ZXJDb21wb25lbnRUb2dnbGVTdGF0ZSB7XG4gIHJldHVybiBwbGFjZW1lbnQgPT09ICdwYWdlJ1xuICAgID8geyBkaXNhYmxlZDogdHJ1ZSwgdG9vbHRpcDogUEFHRV9GSUxURVJfVE9PTFRJUCB9XG4gICAgOiB7IGRpc2FibGVkOiBmYWxzZSwgdG9vbHRpcDogQ09NUE9ORU5UX1RPR0dMRV9UT09MVElQIH07XG59XG5cbi8vIFRoZSBncm91cHMgdGhlIHJlcG9ydCBzZXR0aW5ncycgRmlsdGVycyB0YWIgbGlzdHMgZGVmYXVsdHMgZm9yOiB0aG9zZSBvZlxuLy8gdGhlIHJlcG9ydCBiYXIsIGV2ZXJ5IHBhZ2Ugb3Igb25lLCBpbiBiYXIgb3JkZXIuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFJvd0dyb3Vwcyhncm91cHM6IFJlcG9ydEZpbHRlckdyb3VwW10gfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0RmlsdGVyR3JvdXBbXSB7XG4gIHJldHVybiAoZ3JvdXBzID8/IFtdKVxuICAgIC5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5sZXZlbCA9PT0gJ3JlcG9ydCcgfHwgZ3JvdXAubGV2ZWwgPT09ICdib3RoJyB8fCBncm91cC5sZXZlbCA9PT0gJ3BhZ2UnKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG59XG5cbi8vIEEgZGVmYXVsdCByb3cncyBsYWJlbDogYSBwYWdlIGdyb3VwIG5hbWVzIGl0cyBwYWdlLCAnUmVnaW9uIChwYWdlXG4vLyBcIk92ZXJ2aWV3XCIpJy4gQSBwYWdlIHdpdGggbm8gbmFtZSByZWFkcyBhcyB0aGUgY2FudmFzIG5hbWVzIGl0ICgnUGFnZSAyJykuXG4vLyBBIHBhZ2UgdGhpcyByZXBvcnQgbm8gbG9uZ2VyIGhvbGRzIGFkZHMgbm90aGluZy5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0Um93TGFiZWwoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLCBwYWdlczogUmVwb3J0UGFnZVtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IGxhYmVsID0gZ3JvdXAubGFiZWwgfHwgZ3JvdXAuZmlsdGVycz8uWzBdPy5maWx0ZXJDb2x1bW4gfHwgJ0ZpbHRlcic7XG5cbiAgaWYgKGdyb3VwLmxldmVsICE9PSAncGFnZScpIHtcbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cblxuICBjb25zdCBpbmRleCA9IChwYWdlcyA/PyBbXSkuZmluZEluZGV4KChwYWdlKSA9PiBwYWdlLmlkID09PSBncm91cC5wYWdlSWQpO1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG5cbiAgcmV0dXJuIGAke2xhYmVsfSAocGFnZSBcIiR7cGFnZXNbaW5kZXhdLm5hbWUgfHwgYFBhZ2UgJHtpbmRleCArIDF9YH1cIilgO1xufVxuXG4vLyBUaGUgRGVmYXVsdCBwZXJpb2Qgc2VsZWN0J3MgY2hvaWNlczogRml4ZWQgZGF0ZXMsIHRoZW4gZXZlcnkgcmVsYXRpdmVcbi8vIHJhbmdlIGluIHRoZSBzZXJ2ZXIgZW51bSdzIG9yZGVyLCBuYW1lZCBieSBgbGFiZWxzYC4gQSBzdG9yZWQgcmFuZ2UgdGhpc1xuLy8gdmlld2VyIGRvZXMgbm90IGtub3cgaXMgbGlzdGVkIGxhc3QsIHNvIHRoZSBzZWxlY3Qgc3RpbGwgc2hvd3MgaXQuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFBlcmlvZE9wdGlvbnMoXG4gIGxhYmVsczogKHJlbGF0aXZlOiBSZXBvcnRSZWxhdGl2ZVJhbmdlKSA9PiBzdHJpbmcsXG4gIHN0b3JlZDogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4pOiBGaWx0ZXJTZXR0aW5nc09wdGlvbltdIHtcbiAgY29uc3Qgb3B0aW9uczogRmlsdGVyU2V0dGluZ3NPcHRpb25bXSA9IFtcbiAgICB7IHZhbHVlOiBGSVhFRF9EQVRFU19QRVJJT0QsIG5hbWU6ICdGaXhlZCBkYXRlcycgfSxcbiAgICAuLi5SRUxBVElWRV9SQU5HRV9OQU1FUy5tYXAoKHJlbGF0aXZlKSA9PiAoeyB2YWx1ZTogcmVsYXRpdmUsIG5hbWU6IGxhYmVscyhyZWxhdGl2ZSkgfSkpLFxuICBdO1xuXG4gIHJldHVybiBzdG9yZWQgJiYgc3RvcmVkICE9PSBGSVhFRF9EQVRFU19QRVJJT0QgJiYgIWlzUmVsYXRpdmVSYW5nZShzdG9yZWQpXG4gICAgPyBbLi4ub3B0aW9ucywgeyB2YWx1ZTogc3RvcmVkLCBuYW1lOiBsYWJlbHMoc3RvcmVkIGFzIFJlcG9ydFJlbGF0aXZlUmFuZ2UpIH1dXG4gICAgOiBvcHRpb25zO1xufVxuXG4vLyBUaGUgRGVmYXVsdCBwZXJpb2QgYSBzdG9yZWQgZGF0ZSByYW5nZSBkZWZhdWx0IG9wZW5zIG9uOiBpdHMgcmVsYXRpdmVcbi8vIHJhbmdlLCBlbHNlIEZpeGVkIGRhdGVzICh0aGUgZGF5cywgb3Igbm9uZSkuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFBlcmlvZChzdG9yZWQ6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gc3RvcmVkPy5yZWxhdGl2ZSAmJiAhc3RvcmVkLnN0YXJ0ICYmICFzdG9yZWQuZW5kXG4gICAgPyBzdG9yZWQucmVsYXRpdmVcbiAgICA6IEZJWEVEX0RBVEVTX1BFUklPRDtcbn1cblxuLy8gQSBkYXRlIHJhbmdlIGRlZmF1bHQgaW4gaXRzIHN0b3JlZCBzaGFwZTogdGhlIHJlbGF0aXZlIHJhbmdlIHBpY2tlZCwgZWxzZVxuLy8gdGhlIGZpeGVkIGRheXMsIG9yIG51bGwgd2hlbiB0aGVyZSBhcmUgbm9uZS4gTmV2ZXIgYm90aDogdGhlIHNlcnZlclxuLy8gcmVmdXNlcyBhIHJlbGF0aXZlIHJhbmdlIHdpdGggZGF5cy5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlUmFuZ2VEZWZhdWx0KFxuICBwZXJpb2Q6IHN0cmluZyxcbiAgc3RhcnQ6IHN0cmluZyB8IG51bGwsXG4gIGVuZDogc3RyaW5nIHwgbnVsbCxcbik6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwge1xuICBpZiAocGVyaW9kICE9PSBGSVhFRF9EQVRFU19QRVJJT0QpIHtcbiAgICByZXR1cm4geyByZWxhdGl2ZTogcGVyaW9kIH07XG4gIH1cblxuICBpZiAoIXN0YXJ0ICYmICFlbmQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7IC4uLihzdGFydCA/IHsgc3RhcnQgfSA6IHt9KSwgLi4uKGVuZCA/IHsgZW5kIH0gOiB7fSkgfTtcbn1cblxuLy8gQSBzZWxlY3QgZGVmYXVsdCBpbiBpdHMgc3RvcmVkIHNoYXBlOiB0aGUgcGlja3Mga2VwdCwgb3IgbGVmdCBvdXQgd2hpbGVcbi8vIEV4Y2x1ZGUgdGhlc2UgdmFsdWVzIGlzIG9uLCBvciBudWxsIHdoZW4gbm90aGluZyBpcyBwaWNrZWQuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0RGVmYXVsdCh2YWx1ZXM6IHVua25vd25bXSwgZXhjbHVkZTogYm9vbGVhbik6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwge1xuICBpZiAoIXZhbHVlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBleGNsdWRlID8geyBleGNsdWRlVmFsdWVzOiB2YWx1ZXMgfSA6IHsgdmFsdWVzIH07XG59XG5cbi8vIEEgbnVtYmVyIHJhbmdlIGRlZmF1bHQgaW4gaXRzIHN0b3JlZCBzaGFwZSBmcm9tIHRoZSBlbmRzIGFzIHR5cGVkOiBhblxuLy8gb3BlbiBlbmQgaXMgbGVmdCBvdXQsIDAgaXMga2VwdCwgYW5kIHR3byBvcGVuIGVuZHMgYXJlIG5vIGRlZmF1bHQuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyUmFuZ2VEZWZhdWx0KHJhd01pbjogdW5rbm93biwgcmF3TWF4OiB1bmtub3duKTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCB7XG4gIGNvbnN0IG1pbiA9IHBhcnNlRGVmYXVsdEJvdW5kKHJhd01pbik7XG4gIGNvbnN0IG1heCA9IHBhcnNlRGVmYXVsdEJvdW5kKHJhd01heCk7XG5cbiAgaWYgKG1pbiA9PT0gbnVsbCAmJiBtYXggPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7IC4uLihtaW4gIT09IG51bGwgPyB7IG1pbiB9IDoge30pLCAuLi4obWF4ICE9PSBudWxsID8geyBtYXggfSA6IHt9KSB9O1xufVxuXG4vLyBXaGV0aGVyIGEgc2VsZWN0IGdyb3VwJ3MgZGVmYXVsdCByb3cgb2ZmZXJzIEV4Y2x1ZGUgdGhlc2UgdmFsdWVzOiB0aGVcbi8vIHJlcG9ydCBiYXIncyBydWxlIChvZmZlcnNFeGNsdWRlKSwgc28gbm90IG9uIGEgc2VydmVyIHRoYXQgZG9lcyBub3Qgc2VydmVcbi8vIGV4Y2x1ZGUgKGFuIG9sZGVyIHNlcnZlciBsaXN0cyBubyBmZWF0dXJlcykgbm9yIG9uIGEgZ3JvdXAgd2l0aCBhIG1lbWJlclxuLy8gdGhhdCBiaW5kcyBzZXZlcmFsIGNvbHVtbnMgKG11bHRpQ29sdW1uKS4gQSBkZWZhdWx0IHRoYXQgYWxyZWFkeSBsZWF2ZXNcbi8vIHZhbHVlcyBvdXQga2VlcHMgdGhlIHRvZ2dsZSwgc28gaXQgY2FuIGJlIHR1cm5lZCBvZmYuXG5leHBvcnQgZnVuY3Rpb24gc2hvd0V4Y2x1ZGVUb2dnbGUoXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgZmVhdHVyZXM6IFJlcG9ydFZpZXdlckZlYXR1cmVbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgaWYgKGdyb3VwLnR5cGUgPT09ICdzZWxlY3QnICYmIGdyb3VwLmNvbmZpZz8uZGVmYXVsdD8uZXhjbHVkZVZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gb2ZmZXJzRXhjbHVkZShncm91cCwgZmVhdHVyZXMpO1xufVxuXG4vLyBBIHN0b3JlZCBvciBkcmFmdCBkZWZhdWx0IGluIGEgc3RhYmxlIGZvcm0gZm9yIGNvbXBhcmluZzogZW1wdHkgYW5kXG4vLyBhYnNlbnQga2V5cyBhcmUgZHJvcHBlZCwgc28gYSBuby1vcCBlZGl0IGRvZXMgbm90IHJlYWQgYXMgYSBjaGFuZ2UuIDAgaXMgYW5cbi8vIGVuZCBsaWtlIGFueSBvdGhlci4gTm90aGluZyBsZWZ0IGlzIG51bGwuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGVmYXVsdCh2YWx1ZTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkOiBGaWx0ZXJHcm91cERlZmF1bHQgPSB7fTtcbiAgaWYgKHZhbHVlLnN0YXJ0KSB7XG4gICAgbm9ybWFsaXplZC5zdGFydCA9IHZhbHVlLnN0YXJ0O1xuICB9XG4gIGlmICh2YWx1ZS5lbmQpIHtcbiAgICBub3JtYWxpemVkLmVuZCA9IHZhbHVlLmVuZDtcbiAgfVxuICBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICBub3JtYWxpemVkLnZhbHVlcyA9IHZhbHVlLnZhbHVlcztcbiAgfVxuICBpZiAodmFsdWUuZXhjbHVkZVZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgbm9ybWFsaXplZC5leGNsdWRlVmFsdWVzID0gdmFsdWUuZXhjbHVkZVZhbHVlcztcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlLm1pbiA9PT0gJ251bWJlcicpIHtcbiAgICBub3JtYWxpemVkLm1pbiA9IHZhbHVlLm1pbjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlLm1heCA9PT0gJ251bWJlcicpIHtcbiAgICBub3JtYWxpemVkLm1heCA9IHZhbHVlLm1heDtcbiAgfVxuICBpZiAodmFsdWUudmFsdWUpIHtcbiAgICBub3JtYWxpemVkLnZhbHVlID0gdmFsdWUudmFsdWU7XG4gIH1cbiAgaWYgKHZhbHVlLnJlbGF0aXZlKSB7XG4gICAgbm9ybWFsaXplZC5yZWxhdGl2ZSA9IHZhbHVlLnJlbGF0aXZlO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG5vcm1hbGl6ZWQpLmxlbmd0aCA/IG5vcm1hbGl6ZWQgOiBudWxsO1xufVxuXG4vLyBXaGV0aGVyIGEgcm93J3MgZHJhZnQgZGVmYXVsdCBkaWZmZXJzIGZyb20gdGhlIGdyb3VwJ3Mgc3RvcmVkIG9uZS4gT25seSBhXG4vLyBjaGFuZ2VkIHJvdyBpcyBzYXZlZC5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0Q2hhbmdlZChcbiAgc3RvcmVkOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBkcmFmdDogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplRGVmYXVsdChzdG9yZWQpKSAhPT0gSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplRGVmYXVsdChkcmFmdCkpO1xufVxuIl19
|
|
290
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXNldHRpbmdzLXJ1bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2ZpbHRlci1zZXR0aW5ncy1ydWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtQkEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd6RCxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQTZDO0lBQzNFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0lBQ25DLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFO0NBQy9DLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyx1Q0FBdUMsQ0FBQztBQUMzRSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRywyQ0FBMkMsQ0FBQztBQUMvRSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyx3QkFBd0IsQ0FBQztBQUVqRSwyRUFBMkU7QUFDM0UsdUJBQXVCO0FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztBQUUxQyxnRUFBZ0U7QUFDaEUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBRXJDLDZFQUE2RTtBQUM3RSwyRUFBMkU7QUFDM0Usd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDO0FBQzVELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLGdFQUFnRSxDQUFDO0FBQzVHLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUN6QyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFM0MsK0RBQStEO0FB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LENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkIsVUFBVSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM1RCxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLHdCQUF3QjtBQUN4QixNQUFNLFVBQVUsY0FBYyxDQUM1QixNQUE2QyxFQUM3QyxLQUE0QztJQUU1QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDOUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBydWxlcyBiZWhpbmQgdGhlIHR3byBmaWx0ZXIgc2V0dGluZ3MgZGlhbG9ncywga2VwdCBwdXJlIHNvIHRoZSBub2RlXG4vLyBoYXJuZXNzIGNoZWNrcyB0aGVtIHdpdGhvdXQgYSBkaWFsb2cuIFRoZSBjb21wb25lbnQgc2V0dGluZ3MnIEZpbHRlcnMgdGFiXG4vLyByZWFkcyB0aGUgVHlwZSBzZWxlY3QsIHRoZSBSZXBvcnQgYmFyIHNlbGVjdCBhbmQgdGhlIFRoaXMgY29tcG9uZW50IHRvZ2dsZVxuLy8gZnJvbSBoZXJlOyB0aGUgcmVwb3J0IHNldHRpbmdzJyBGaWx0ZXJzIHRhYiByZWFkcyBpdHMgZGVmYXVsdCByb3dzICh0aGVcbi8vIHBlcmlvZCwgdGhlIGV4Y2x1ZGUgdG9nZ2xlLCB0aGUgbnVtYmVyIHJhbmdlIGVuZHMgYW5kIHRoZWlyIGNoZWNrKSBmcm9tXG4vLyBoZXJlLiBUaGUgZGlhbG9ncyBvbmx5IGNhbGwgdGhlc2UuXG5pbXBvcnQgeyBGaWx0ZXJCYXJQbGFjZW1lbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvZmlsdGVyLWJhci1wbGFjZW1lbnQudHlwZSc7XG5pbXBvcnQgeyBGaWx0ZXJDb21wb25lbnRUb2dnbGVTdGF0ZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9maWx0ZXItY29tcG9uZW50LXRvZ2dsZS1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2V0dGluZ3NPcHRpb24gfSBmcm9tICcuL2ludGVyZmFjZXMvZmlsdGVyLXNldHRpbmdzLW9wdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsdGVyVHlwZVNlbGVjdFN0YXRlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2ZpbHRlci10eXBlLXNlbGVjdC1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld2VyRmVhdHVyZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9yZXBvcnQtdmlld2VyLWZlYXR1cmUudHlwZSc7XG5pbXBvcnQge1xuICBGaWx0ZXJHcm91cERlZmF1bHQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRGaWx0ZXJMZXZlbCxcbiAgUmVwb3J0RmlsdGVyVHlwZSxcbiAgUmVwb3J0UGFnZSxcbiAgUmVwb3J0UmVsYXRpdmVSYW5nZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUkVMQVRJVkVfUkFOR0VfTkFNRVMsIGlzUmVsYXRpdmVSYW5nZSB9IGZyb20gJy4vcmVwb3J0LXZpZXctY29uZmlnJztcbmltcG9ydCB7IG9mZmVyc0V4Y2x1ZGUgfSBmcm9tICcuL3JlcG9ydC12aWV3ZXItZmVhdHVyZXMnO1xuXG5cbi8vIFRoZSBUeXBlIHNlbGVjdCdzIGNob2ljZXMuIEEgY29sdW1uIHRoYXQgY2FuIGJlIGVpdGhlciBob2xkcyBib3RoLlxuZXhwb3J0IGNvbnN0IEZJTFRFUl9UWVBFX09QVElPTlM6IEZpbHRlclNldHRpbmdzT3B0aW9uPFJlcG9ydEZpbHRlclR5cGU+W10gPSBbXG4gIHsgdmFsdWU6ICdzZWxlY3QnLCBuYW1lOiAnVmFsdWVzJyB9LFxuICB7IHZhbHVlOiAnbnVtYmVyUmFuZ2UnLCBuYW1lOiAnTnVtYmVyIHJhbmdlJyB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFRZUEVfTE9DS0VEX1RPT0xUSVAgPSAnUmVtb3ZlIHRoZSBmaWx0ZXIgdG8gY2hhbmdlIGl0cyB0eXBlLic7XG5leHBvcnQgY29uc3QgUEFHRV9GSUxURVJfVE9PTFRJUCA9ICdBIHBhZ2UgZmlsdGVyIHNob3dzIGluIHRoZSBwYWdlIGJhciBvbmx5Lic7XG5leHBvcnQgY29uc3QgQ09NUE9ORU5UX1RPR0dMRV9UT09MVElQID0gJ1Nob3cgb24gdGhpcyBjb21wb25lbnQnO1xuXG4vLyBUaGUgRGVmYXVsdCBwZXJpb2Qgc2VsZWN0J3MgdmFsdWUgZm9yIGEgcmFuZ2Ugb2YgZml4ZWQgZGF5cy4gTm8gcmVsYXRpdmVcbi8vIHJhbmdlIGlzIG5hbWVkIHRoaXMuXG5leHBvcnQgY29uc3QgRklYRURfREFURVNfUEVSSU9EID0gJ2ZpeGVkJztcblxuLy8gSG93IG1hbnkgZGVjaW1hbHMgYSBEZWZhdWx0IG1pbmltdW0gb3IgRGVmYXVsdCBtYXhpbXVtIHRha2VzLlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQk9VTkRfU0NBTEUgPSA2O1xuXG4vLyBBIGZpbHRlcidzIE5hbWUgYW5kIExhYmVsLCBjaGVja2VkIGFzIHRoZSBzZXJ2ZXIgY2hlY2tzIHRoZW0sIHNvIGEgYmFkIG9uZVxuLy8gaXMgY2F1Z2h0IGJlZm9yZSBTYXZlLiBUaGUgbmFtZSBpcyBhbiBpZGVudGlmaWVyOiBhIGxldHRlciwgdGhlbiBsZXR0ZXJzXG4vLyBhbmQgZGlnaXRzLiBUaGF0IGl0IGlzIHVuaXF1ZSBpbiB0aGUgcmVwb3J0IGlzIHRoZSBzZXJ2ZXIncyB0byBjaGVjay5cbmV4cG9ydCBjb25zdCBGSUxURVJfTkFNRV9QQVRURVJOID0gL15bQS1aYS16XVtBLVphLXowLTldKiQvO1xuZXhwb3J0IGNvbnN0IEZJTFRFUl9OQU1FX1BBVFRFUk5fTUVTU0FHRSA9ICdBIG5hbWUgc3RhcnRzIHdpdGggYSBsZXR0ZXIgYW5kIGhvbGRzIG9ubHkgbGV0dGVycyBhbmQgZGlnaXRzLic7XG5leHBvcnQgY29uc3QgRklMVEVSX05BTUVfTUFYX0xFTkdUSCA9IDUwO1xuZXhwb3J0IGNvbnN0IEZJTFRFUl9MQUJFTF9NQVhfTEVOR1RIID0gMjAwO1xuXG4vLyBFdmVyeSBSZXBvcnQgYmFyIGNob2ljZSwgaW4gdGhlIG9yZGVyIHRoZSBzZWxlY3QgbGlzdHMgdGhlbS5cbmNvbnN0IEJBUl9QTEFDRU1FTlRfT1BUSU9OUzogRmlsdGVyU2V0dGluZ3NPcHRpb248RmlsdGVyQmFyUGxhY2VtZW50PltdID0gW1xuICB7IHZhbHVlOiAnb2ZmJywgbmFtZTogJ09mZicgfSxcbiAgeyB2YWx1ZTogJ2V2ZXJ5JywgbmFtZTogJ0V2ZXJ5IHBhZ2UnIH0sXG4gIHsgdmFsdWU6ICdwYWdlJywgbmFtZTogJ1RoaXMgcGFnZSBvbmx5JyB9LFxuXTtcblxuXG4vLyBBIG51bWJlciB3aXRoIGl0cyBncm91cCBjb21tYXMgaW4gcGxhY2UgKCcxLDI1MC41JywgJy0xMiwwMDAnKS5cbmNvbnN0IEdST1VQRURfREVDSU1BTCA9IC9eLT9cXGR7MSwzfSgsXFxkezN9KSsoXFwuXFxkKik/JC87XG4vLyBBIHBsYWluIGRlY2ltYWwgbnVtYmVyICgnMTI1MC41JywgJy0zJywgJzAnLCAnLjUnKS4gSGV4LCBiaW5hcnksIG9jdGFsLFxuLy8gZXhwb25lbnRzIGFuZCBpbm5lciBzcGFjZXMgZG8gbm90IG1hdGNoLCB0aG91Z2ggTnVtYmVyKCkgcmVhZHMgc29tZS5cbmNvbnN0IFBMQUlOX0RFQ0lNQUwgPSAvXi0/KFxcZCsoXFwuXFxkKik/fFxcLlxcZCspJC87XG5cbi8vIEEgZGVmYXVsdCByYW5nZSBlbmQgYXMgdHlwZWQuIEFuIGVtcHR5IGZpZWxkIGlzIG5vIGVuZC4gQSBudW1iZXIgaW5wdXRcbi8vIHdpdGggYSBtYXNrIGhhbmRzIGJhY2sgdGV4dCB3aXRoIGl0cyBncm91cCBjb21tYXMgKCcxLDI1MC41JyksIHNvIHRob3NlIGdvXG4vLyBiZWZvcmUgTnVtYmVyKCkgcmVhZHMgaXQ7IDAgaXMgYW4gZW5kIGxpa2UgYW55IG90aGVyLiBBbnl0aGluZyB0aGF0IGlzIG5vdFxuLy8gYSBkZWNpbWFsIG51bWJlciBpcyBubyBlbmQuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEZWZhdWx0Qm91bmQocmF3OiB1bmtub3duKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgcmF3ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocmF3KSA/IHJhdyA6IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHJhdyAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICBjb25zdCB0ZXh0ID0gR1JPVVBFRF9ERUNJTUFMLnRlc3QodHJpbW1lZCkgPyB0cmltbWVkLnJlcGxhY2UoLywvZywgJycpIDogdHJpbW1lZDtcbiAgaWYgKCFQTEFJTl9ERUNJTUFMLnRlc3QodGV4dCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gTnVtYmVyKHRleHQpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiBudWxsO1xufVxuXG4vLyBXaHkgdHdvIHJhbmdlIGVuZHMgY2Fubm90IGJlIHNhdmVkLCBpbiB0aGUgc2VydmVyJ3Mgd29yZHMsIG9yIG51bGwuIEFuIG9wZW5cbi8vIGVuZCBpcyBhbHdheXMgZmluZS5cbmV4cG9ydCBmdW5jdGlvbiBib3VuZHNFcnJvcihtaW46IG51bWJlciB8IG51bGwsIG1heDogbnVtYmVyIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICBpZiAobWluID09PSBudWxsIHx8IG1heCA9PT0gbnVsbCB8fCBtaW4gPD0gbWF4KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gYG1pbiAoJHttaW59KSBpcyBhYm92ZSBtYXggKCR7bWF4fSkuYDtcbn1cblxuLy8gVGhlIFR5cGUgc2VsZWN0IG9mIGEgY29sdW1uIG9uIHRoZSBjb21wb25lbnQgc2V0dGluZ3MnIEZpbHRlcnMgdGFiLiBJdFxuLy8gc2hvd3Mgd2hlbiB0aGUgY29sdW1uIGNhbiB0YWtlIGVpdGhlciB0eXBlIGFuZCB0aGUgc2VydmVyIHNlcnZlcyBudW1iZXJcbi8vIHJhbmdlcyAoYW4gb2xkZXIgc2VydmVyIGxpc3RzIG5vIGZlYXR1cmVzKS4gQSBmaWx0ZXIncyB0eXBlIGNhbm5vdCBjaGFuZ2UsXG4vLyBzbyBpdCBpcyBsb2NrZWQgd2hpbGUgdGhlIGNvbHVtbiBoYXMgYSBmaWx0ZXIgb24gdGhpcyBjb21wb25lbnQuXG5leHBvcnQgZnVuY3Rpb24gdHlwZVNlbGVjdFN0YXRlKFxuICB0eXBlczogUmVwb3J0RmlsdGVyVHlwZVtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgaGFzRmlsdGVyT25UaGlzQ29tcG9uZW50OiBib29sZWFuLFxuICBmZWF0dXJlczogUmVwb3J0Vmlld2VyRmVhdHVyZVtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IEZpbHRlclR5cGVTZWxlY3RTdGF0ZSB7XG4gIGNvbnN0IHNob3cgPSAoZmVhdHVyZXMgPz8gW10pLmluY2x1ZGVzKCdudW1iZXJSYW5nZScpXG4gICAgJiYgRklMVEVSX1RZUEVfT1BUSU9OUy5ldmVyeSgob3B0aW9uKSA9PiAodHlwZXMgPz8gW10pLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkpO1xuXG4gIGlmICghc2hvdykge1xuICAgIHJldHVybiB7IHNob3c6IGZhbHNlLCBkaXNhYmxlZDogZmFsc2UsIHRvb2x0aXA6IG51bGwgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2hvdzogdHJ1ZSxcbiAgICBkaXNhYmxlZDogaGFzRmlsdGVyT25UaGlzQ29tcG9uZW50LFxuICAgIHRvb2x0aXA6IGhhc0ZpbHRlck9uVGhpc0NvbXBvbmVudCA/IFRZUEVfTE9DS0VEX1RPT0xUSVAgOiBudWxsLFxuICB9O1xufVxuXG4vLyBUaGUgbGV2ZWxzIGEgbmV3IG9yIG1vdmVkIGZpbHRlciBjYW4gdGFrZSBvbiBhIGNvbXBvbmVudC4gVGhpcyBwYWdlIG9ubHlcbi8vIG5lZWRzIGEgc2VydmVyIHRoYXQgc2VydmVzIHBhZ2UgZmlsdGVycyBhbmQgYSBjb21wb25lbnQgb24gYSBwYWdlIChhXG4vLyBoZWFkZXIgb3IgZm9vdGVyIGNvbXBvbmVudCBpcyBvbiBubyBwYWdlKS5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJMZXZlbENob2ljZXMoXG4gIGZlYXR1cmVzOiBSZXBvcnRWaWV3ZXJGZWF0dXJlW10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvblBhZ2U6IGJvb2xlYW4sXG4pOiBSZXBvcnRGaWx0ZXJMZXZlbFtdIHtcbiAgY29uc3QgbGV2ZWxzOiBSZXBvcnRGaWx0ZXJMZXZlbFtdID0gWydjb21wb25lbnQnLCAncmVwb3J0JywgJ2JvdGgnXTtcblxuICByZXR1cm4gb25QYWdlICYmIChmZWF0dXJlcyA/PyBbXSkuaW5jbHVkZXMoJ3BhZ2VTY29wZScpXG4gICAgPyBbLi4ubGV2ZWxzLCAncGFnZSddXG4gICAgOiBsZXZlbHM7XG59XG5cbi8vIFRoZSBSZXBvcnQgYmFyIHNlbGVjdCdzIGNob2ljZXMgZm9yIHRoZSBsZXZlbHMgb24gb2ZmZXIuIFRoZSBjaG9pY2UgYSByb3dcbi8vIGFscmVhZHkgaG9sZHMgaXMgYWx3YXlzIGxpc3RlZCwgc28gdGhlIHNlbGVjdCBuZXZlciBzaG93cyBibGFuay5cbmV4cG9ydCBmdW5jdGlvbiBiYXJQbGFjZW1lbnRPcHRpb25zKFxuICBsZXZlbENob2ljZXM6IFJlcG9ydEZpbHRlckxldmVsW10sXG4gIGN1cnJlbnQ6IEZpbHRlckJhclBsYWNlbWVudCA9ICdvZmYnLFxuKTogRmlsdGVyU2V0dGluZ3NPcHRpb248RmlsdGVyQmFyUGxhY2VtZW50PltdIHtcbiAgcmV0dXJuIEJBUl9QTEFDRU1FTlRfT1BUSU9OUy5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgIHN3aXRjaCAob3B0aW9uLnZhbHVlKSB7XG4gICAgICBjYXNlICdldmVyeSc6XG4gICAgICAgIHJldHVybiBsZXZlbENob2ljZXMuaW5jbHVkZXMoJ3JlcG9ydCcpIHx8IGxldmVsQ2hvaWNlcy5pbmNsdWRlcygnYm90aCcpIHx8IGN1cnJlbnQgPT09ICdldmVyeSc7XG4gICAgICBjYXNlICdwYWdlJzpcbiAgICAgICAgcmV0dXJuIGxldmVsQ2hvaWNlcy5pbmNsdWRlcygncGFnZScpIHx8IGN1cnJlbnQgPT09ICdwYWdlJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIEEgdmFsdWUncyBSZXBvcnQgYmFyIGNob2ljZXMuIEEgdmFsdWUgaGFzIG5vIHN0cmlwIG9mIGl0cyBvd24gYW5kIGl0c1xuLy8gZ3JvdXAgbWF5IGJlIHNoYXJlZCwgc28gYSBwaWNrIG5ldmVyIGxvd2VycyB0aGUgZ3JvdXAgKHRoZSBpbmxpbmUgdmFsdWVzXG4vLyBydWxlKTogVGhpcyBwYWdlIG9ubHkgaXMgb2ZmZXJlZCBmb3IgYSBuZXcgZmlsdGVyLCBvciBmb3IgYSBncm91cCB0aGF0IGlzXG4vLyBhbHJlYWR5IGEgcGFnZSBncm91cCwgbmV2ZXIgdG8gbW92ZSBhIHNoYXJlZCBncm91cCB0byBvbmUgcGFnZS5cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZVBsYWNlbWVudE9wdGlvbnMoXG4gIGxldmVsQ2hvaWNlczogUmVwb3J0RmlsdGVyTGV2ZWxbXSxcbiAgY3VycmVudDogUmVwb3J0RmlsdGVyTGV2ZWwgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogRmlsdGVyU2V0dGluZ3NPcHRpb248RmlsdGVyQmFyUGxhY2VtZW50PltdIHtcbiAgY29uc3QgY2hvaWNlcyA9ICFjdXJyZW50IHx8IGN1cnJlbnQgPT09ICdwYWdlJ1xuICAgID8gbGV2ZWxDaG9pY2VzXG4gICAgOiBsZXZlbENob2ljZXMuZmlsdGVyKChsZXZlbCkgPT4gbGV2ZWwgIT09ICdwYWdlJyk7XG5cbiAgcmV0dXJuIGJhclBsYWNlbWVudE9wdGlvbnMoY2hvaWNlcywgYmFyUGxhY2VtZW50KGN1cnJlbnQpKTtcbn1cblxuLy8gVGhlIGxldmVsIGEgdmFsdWUncyBmaWx0ZXIgZ3JvdXAgZW5kcyBhdCBhZnRlciBhIFJlcG9ydCBiYXIgcGljaywgb3IgbnVsbFxuLy8gd2hlbiB0aGUgdmFsdWUgbGVhdmVzIGl0LiBPZmYgdW5saW5rcyB0aGlzIHZhbHVlIGFsb25lIGFuZCB0aGUgZ3JvdXAga2VlcHNcbi8vIGl0cyBvdGhlciBtZW1iZXJzLiBBIG5ldyBmaWx0ZXIgdGFrZXMgdGhlIHBpY2sncyBsZXZlbC4gRXZlcnkgcGFnZSByYWlzZXMgYVxuLy8gc3RyaXAtb25seSBncm91cCB0byBib3RoLCBrZWVwaW5nIGl0cyBzdHJpcHMsIGFuZCBhIHBhZ2UgZ3JvdXAgdG8gdGhlXG4vLyByZXBvcnQgYmFyLiBOb3RoaW5nIGVsc2UgbW92ZXMgdGhlIGdyb3VwLCBzbyBhIHZhbHVlIG5ldmVyIGxvd2VycyBpdC5cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZUZpbHRlckxldmVsKFxuICBwbGFjZW1lbnQ6IEZpbHRlckJhclBsYWNlbWVudCxcbiAgY3VycmVudDogUmVwb3J0RmlsdGVyTGV2ZWwgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUmVwb3J0RmlsdGVyTGV2ZWwgfCBudWxsIHtcbiAgaWYgKHBsYWNlbWVudCA9PT0gJ29mZicpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghY3VycmVudCkge1xuICAgIHJldHVybiBwbGFjZW1lbnQgPT09ICdwYWdlJyA/ICdwYWdlJyA6ICdyZXBvcnQnO1xuICB9XG5cbiAgaWYgKHBsYWNlbWVudCAhPT0gJ2V2ZXJ5Jykge1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgc3dpdGNoIChjdXJyZW50KSB7XG4gICAgY2FzZSAnY29tcG9uZW50JzpcbiAgICAgIHJldHVybiAnYm90aCc7XG4gICAgY2FzZSAncGFnZSc6XG4gICAgICByZXR1cm4gJ3JlcG9ydCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICB9XG59XG5cbi8vIFdoZXJlIGEgZ3JvdXAgb2YgYSBsZXZlbCBzaG93cyBpbiB0aGUgcmVwb3J0IGJhci4gTm8gZ3JvdXAgKG5vIGZpbHRlcikgaXNcbi8vIG9mZi5cbmV4cG9ydCBmdW5jdGlvbiBiYXJQbGFjZW1lbnQobGV2ZWw6IFJlcG9ydEZpbHRlckxldmVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IEZpbHRlckJhclBsYWNlbWVudCB7XG4gIHN3aXRjaCAobGV2ZWwpIHtcbiAgICBjYXNlICdyZXBvcnQnOlxuICAgIGNhc2UgJ2JvdGgnOlxuICAgICAgcmV0dXJuICdldmVyeSc7XG4gICAgY2FzZSAncGFnZSc6XG4gICAgICByZXR1cm4gJ3BhZ2UnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ29mZic7XG4gIH1cbn1cblxuLy8gV2hldGhlciBhIGdyb3VwIG9mIGEgbGV2ZWwgc2hvd3Mgb24gaXRzIGNvbXBvbmVudHMuXG5leHBvcnQgZnVuY3Rpb24gc2hvd25PbkNvbXBvbmVudChsZXZlbDogUmVwb3J0RmlsdGVyTGV2ZWwgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBsZXZlbCA9PT0gJ2NvbXBvbmVudCcgfHwgbGV2ZWwgPT09ICdib3RoJztcbn1cblxuLy8gVGhlIGxldmVsIHRoZSB0d28gY29udHJvbHMgb2YgYSByb3cgYXNrIGZvciwgb3IgbnVsbCB3aGVuIHRoZXkgYXNrIGZvciBub1xuLy8gZmlsdGVyIGF0IGFsbC4gQSBwYWdlIGZpbHRlciBzaG93cyBpbiBpdHMgcGFnZSdzIGJhciBvbmx5LCBzbyBUaGlzIHBhZ2Vcbi8vIG9ubHkgaWdub3JlcyB0aGUgVGhpcyBjb21wb25lbnQgdG9nZ2xlLlxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckxldmVsKHBsYWNlbWVudDogRmlsdGVyQmFyUGxhY2VtZW50LCBjb21wb25lbnQ6IGJvb2xlYW4pOiBSZXBvcnRGaWx0ZXJMZXZlbCB8IG51bGwge1xuICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgIGNhc2UgJ3BhZ2UnOlxuICAgICAgcmV0dXJuICdwYWdlJztcbiAgICBjYXNlICdldmVyeSc6XG4gICAgICByZXR1cm4gY29tcG9uZW50ID8gJ2JvdGgnIDogJ3JlcG9ydCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb21wb25lbnQgPyAnY29tcG9uZW50JyA6IG51bGw7XG4gIH1cbn1cblxuLy8gVGhlIFRoaXMgY29tcG9uZW50IHRvZ2dsZSBvZiBhIHJvdzogbG9ja2VkIHdoaWxlIFRoaXMgcGFnZSBvbmx5IGlzIHBpY2tlZC5cbmV4cG9ydCBmdW5jdGlvbiBjb21wb25lbnRUb2dnbGVTdGF0ZShwbGFjZW1lbnQ6IEZpbHRlckJhclBsYWNlbWVudCk6IEZpbHRlckNvbXBvbmVudFRvZ2dsZVN0YXRlIHtcbiAgcmV0dXJuIHBsYWNlbWVudCA9PT0gJ3BhZ2UnXG4gICAgPyB7IGRpc2FibGVkOiB0cnVlLCB0b29sdGlwOiBQQUdFX0ZJTFRFUl9UT09MVElQIH1cbiAgICA6IHsgZGlzYWJsZWQ6IGZhbHNlLCB0b29sdGlwOiBDT01QT05FTlRfVE9HR0xFX1RPT0xUSVAgfTtcbn1cblxuLy8gVGhlIGdyb3VwcyB0aGUgcmVwb3J0IHNldHRpbmdzJyBGaWx0ZXJzIHRhYiBsaXN0cyBkZWZhdWx0cyBmb3I6IHRob3NlIG9mXG4vLyB0aGUgcmVwb3J0IGJhciwgZXZlcnkgcGFnZSBvciBvbmUsIGluIGJhciBvcmRlci5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0Um93R3JvdXBzKGdyb3VwczogUmVwb3J0RmlsdGVyR3JvdXBbXSB8IG51bGwgfCB1bmRlZmluZWQpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgcmV0dXJuIChncm91cHMgPz8gW10pXG4gICAgLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmxldmVsID09PSAncmVwb3J0JyB8fCBncm91cC5sZXZlbCA9PT0gJ2JvdGgnIHx8IGdyb3VwLmxldmVsID09PSAncGFnZScpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcbn1cblxuLy8gQSBkZWZhdWx0IHJvdydzIGxhYmVsOiBhIHBhZ2UgZ3JvdXAgbmFtZXMgaXRzIHBhZ2UsICdSZWdpb24gKHBhZ2Vcbi8vIFwiT3ZlcnZpZXdcIiknLiBBIHBhZ2Ugd2l0aCBubyBuYW1lIHJlYWRzIGFzIHRoZSBjYW52YXMgbmFtZXMgaXQgKCdQYWdlIDInKS5cbi8vIEEgcGFnZSB0aGlzIHJlcG9ydCBubyBsb25nZXIgaG9sZHMgYWRkcyBub3RoaW5nLlxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRSb3dMYWJlbChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIHBhZ2VzOiBSZXBvcnRQYWdlW10gfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgY29uc3QgbGFiZWwgPSBncm91cC5sYWJlbCB8fCBncm91cC5maWx0ZXJzPy5bMF0/LmZpbHRlckNvbHVtbiB8fCAnRmlsdGVyJztcblxuICBpZiAoZ3JvdXAubGV2ZWwgIT09ICdwYWdlJykge1xuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuXG4gIGNvbnN0IGluZGV4ID0gKHBhZ2VzID8/IFtdKS5maW5kSW5kZXgoKHBhZ2UpID0+IHBhZ2UuaWQgPT09IGdyb3VwLnBhZ2VJZCk7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cblxuICByZXR1cm4gYCR7bGFiZWx9IChwYWdlIFwiJHtwYWdlc1tpbmRleF0ubmFtZSB8fCBgUGFnZSAke2luZGV4ICsgMX1gfVwiKWA7XG59XG5cbi8vIFRoZSBEZWZhdWx0IHBlcmlvZCBzZWxlY3QncyBjaG9pY2VzOiBGaXhlZCBkYXRlcywgdGhlbiBldmVyeSByZWxhdGl2ZVxuLy8gcmFuZ2UgaW4gdGhlIHNlcnZlciBlbnVtJ3Mgb3JkZXIsIG5hbWVkIGJ5IGBsYWJlbHNgLiBBIHN0b3JlZCByYW5nZSB0aGlzXG4vLyB2aWV3ZXIgZG9lcyBub3Qga25vdyBpcyBsaXN0ZWQgbGFzdCwgc28gdGhlIHNlbGVjdCBzdGlsbCBzaG93cyBpdC5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0UGVyaW9kT3B0aW9ucyhcbiAgbGFiZWxzOiAocmVsYXRpdmU6IFJlcG9ydFJlbGF0aXZlUmFuZ2UpID0+IHN0cmluZyxcbiAgc3RvcmVkOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcbik6IEZpbHRlclNldHRpbmdzT3B0aW9uW10ge1xuICBjb25zdCBvcHRpb25zOiBGaWx0ZXJTZXR0aW5nc09wdGlvbltdID0gW1xuICAgIHsgdmFsdWU6IEZJWEVEX0RBVEVTX1BFUklPRCwgbmFtZTogJ0ZpeGVkIGRhdGVzJyB9LFxuICAgIC4uLlJFTEFUSVZFX1JBTkdFX05BTUVTLm1hcCgocmVsYXRpdmUpID0+ICh7IHZhbHVlOiByZWxhdGl2ZSwgbmFtZTogbGFiZWxzKHJlbGF0aXZlKSB9KSksXG4gIF07XG5cbiAgcmV0dXJuIHN0b3JlZCAmJiBzdG9yZWQgIT09IEZJWEVEX0RBVEVTX1BFUklPRCAmJiAhaXNSZWxhdGl2ZVJhbmdlKHN0b3JlZClcbiAgICA/IFsuLi5vcHRpb25zLCB7IHZhbHVlOiBzdG9yZWQsIG5hbWU6IGxhYmVscyhzdG9yZWQgYXMgUmVwb3J0UmVsYXRpdmVSYW5nZSkgfV1cbiAgICA6IG9wdGlvbnM7XG59XG5cbi8vIFRoZSBEZWZhdWx0IHBlcmlvZCBhIHN0b3JlZCBkYXRlIHJhbmdlIGRlZmF1bHQgb3BlbnMgb246IGl0cyByZWxhdGl2ZVxuLy8gcmFuZ2UsIGVsc2UgRml4ZWQgZGF0ZXMgKHRoZSBkYXlzLCBvciBub25lKS5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0UGVyaW9kKHN0b3JlZDogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBzdG9yZWQ/LnJlbGF0aXZlICYmICFzdG9yZWQuc3RhcnQgJiYgIXN0b3JlZC5lbmRcbiAgICA/IHN0b3JlZC5yZWxhdGl2ZVxuICAgIDogRklYRURfREFURVNfUEVSSU9EO1xufVxuXG4vLyBBIGRhdGUgcmFuZ2UgZGVmYXVsdCBpbiBpdHMgc3RvcmVkIHNoYXBlOiB0aGUgcmVsYXRpdmUgcmFuZ2UgcGlja2VkLCBlbHNlXG4vLyB0aGUgZml4ZWQgZGF5cywgb3IgbnVsbCB3aGVuIHRoZXJlIGFyZSBub25lLiBOZXZlciBib3RoOiB0aGUgc2VydmVyXG4vLyByZWZ1c2VzIGEgcmVsYXRpdmUgcmFuZ2Ugd2l0aCBkYXlzLlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVSYW5nZURlZmF1bHQoXG4gIHBlcmlvZDogc3RyaW5nLFxuICBzdGFydDogc3RyaW5nIHwgbnVsbCxcbiAgZW5kOiBzdHJpbmcgfCBudWxsLFxuKTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCB7XG4gIGlmIChwZXJpb2QgIT09IEZJWEVEX0RBVEVTX1BFUklPRCkge1xuICAgIHJldHVybiB7IHJlbGF0aXZlOiBwZXJpb2QgfTtcbiAgfVxuXG4gIGlmICghc3RhcnQgJiYgIWVuZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHsgLi4uKHN0YXJ0ID8geyBzdGFydCB9IDoge30pLCAuLi4oZW5kID8geyBlbmQgfSA6IHt9KSB9O1xufVxuXG4vLyBBIHNlbGVjdCBkZWZhdWx0IGluIGl0cyBzdG9yZWQgc2hhcGU6IHRoZSBwaWNrcyBrZXB0LCBvciBsZWZ0IG91dCB3aGlsZVxuLy8gRXhjbHVkZSB0aGVzZSB2YWx1ZXMgaXMgb24sIG9yIG51bGwgd2hlbiBub3RoaW5nIGlzIHBpY2tlZC5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3REZWZhdWx0KHZhbHVlczogdW5rbm93bltdLCBleGNsdWRlOiBib29sZWFuKTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCB7XG4gIGlmICghdmFsdWVzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGV4Y2x1ZGUgPyB7IGV4Y2x1ZGVWYWx1ZXM6IHZhbHVlcyB9IDogeyB2YWx1ZXMgfTtcbn1cblxuLy8gQSBudW1iZXIgcmFuZ2UgZGVmYXVsdCBpbiBpdHMgc3RvcmVkIHNoYXBlIGZyb20gdGhlIGVuZHMgYXMgdHlwZWQ6IGFuXG4vLyBvcGVuIGVuZCBpcyBsZWZ0IG91dCwgMCBpcyBrZXB0LCBhbmQgdHdvIG9wZW4gZW5kcyBhcmUgbm8gZGVmYXVsdC5cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJSYW5nZURlZmF1bHQocmF3TWluOiB1bmtub3duLCByYXdNYXg6IHVua25vd24pOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsIHtcbiAgY29uc3QgbWluID0gcGFyc2VEZWZhdWx0Qm91bmQocmF3TWluKTtcbiAgY29uc3QgbWF4ID0gcGFyc2VEZWZhdWx0Qm91bmQocmF3TWF4KTtcblxuICBpZiAobWluID09PSBudWxsICYmIG1heCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHsgLi4uKG1pbiAhPT0gbnVsbCA/IHsgbWluIH0gOiB7fSksIC4uLihtYXggIT09IG51bGwgPyB7IG1heCB9IDoge30pIH07XG59XG5cbi8vIFdoZXRoZXIgYSBzZWxlY3QgZ3JvdXAncyBkZWZhdWx0IHJvdyBvZmZlcnMgRXhjbHVkZSB0aGVzZSB2YWx1ZXM6IHRoZVxuLy8gcmVwb3J0IGJhcidzIHJ1bGUgKG9mZmVyc0V4Y2x1ZGUpLCBzbyBub3Qgb24gYSBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCBzZXJ2ZVxuLy8gZXhjbHVkZSAoYW4gb2xkZXIgc2VydmVyIGxpc3RzIG5vIGZlYXR1cmVzKSBub3Igb24gYSBncm91cCB3aXRoIGEgbWVtYmVyXG4vLyB0aGF0IGJpbmRzIHNldmVyYWwgY29sdW1ucyAobXVsdGlDb2x1bW4pLiBBIGRlZmF1bHQgdGhhdCBhbHJlYWR5IGxlYXZlc1xuLy8gdmFsdWVzIG91dCBrZWVwcyB0aGUgdG9nZ2xlLCBzbyBpdCBjYW4gYmUgdHVybmVkIG9mZi5cbmV4cG9ydCBmdW5jdGlvbiBzaG93RXhjbHVkZVRvZ2dsZShcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICBmZWF0dXJlczogUmVwb3J0Vmlld2VyRmVhdHVyZVtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICBpZiAoZ3JvdXAudHlwZSA9PT0gJ3NlbGVjdCcgJiYgZ3JvdXAuY29uZmlnPy5kZWZhdWx0Py5leGNsdWRlVmFsdWVzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBvZmZlcnNFeGNsdWRlKGdyb3VwLCBmZWF0dXJlcyk7XG59XG5cbi8vIEEgc3RvcmVkIG9yIGRyYWZ0IGRlZmF1bHQgaW4gYSBzdGFibGUgZm9ybSBmb3IgY29tcGFyaW5nOiBlbXB0eSBhbmRcbi8vIGFic2VudCBrZXlzIGFyZSBkcm9wcGVkLCBzbyBhIG5vLW9wIGVkaXQgZG9lcyBub3QgcmVhZCBhcyBhIGNoYW5nZS4gMCBpcyBhblxuLy8gZW5kIGxpa2UgYW55IG90aGVyLiBOb3RoaW5nIGxlZnQgaXMgbnVsbC5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEZWZhdWx0KHZhbHVlOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsIHwgdW5kZWZpbmVkKTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWQ6IEZpbHRlckdyb3VwRGVmYXVsdCA9IHt9O1xuICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICBub3JtYWxpemVkLnN0YXJ0ID0gdmFsdWUuc3RhcnQ7XG4gIH1cbiAgaWYgKHZhbHVlLmVuZCkge1xuICAgIG5vcm1hbGl6ZWQuZW5kID0gdmFsdWUuZW5kO1xuICB9XG4gIGlmICh2YWx1ZS52YWx1ZXM/Lmxlbmd0aCkge1xuICAgIG5vcm1hbGl6ZWQudmFsdWVzID0gdmFsdWUudmFsdWVzO1xuICB9XG4gIGlmICh2YWx1ZS5leGNsdWRlVmFsdWVzPy5sZW5ndGgpIHtcbiAgICBub3JtYWxpemVkLmV4Y2x1ZGVWYWx1ZXMgPSB2YWx1ZS5leGNsdWRlVmFsdWVzO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUubWluID09PSAnbnVtYmVyJykge1xuICAgIG5vcm1hbGl6ZWQubWluID0gdmFsdWUubWluO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUubWF4ID09PSAnbnVtYmVyJykge1xuICAgIG5vcm1hbGl6ZWQubWF4ID0gdmFsdWUubWF4O1xuICB9XG4gIGlmICh2YWx1ZS52YWx1ZSkge1xuICAgIG5vcm1hbGl6ZWQudmFsdWUgPSB2YWx1ZS52YWx1ZTtcbiAgfVxuICBpZiAodmFsdWUucmVsYXRpdmUpIHtcbiAgICBub3JtYWxpemVkLnJlbGF0aXZlID0gdmFsdWUucmVsYXRpdmU7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXMobm9ybWFsaXplZCkubGVuZ3RoID8gbm9ybWFsaXplZCA6IG51bGw7XG59XG5cbi8vIFdoZXRoZXIgYSByb3cncyBkcmFmdCBkZWZhdWx0IGRpZmZlcnMgZnJvbSB0aGUgZ3JvdXAncyBzdG9yZWQgb25lLiBPbmx5IGFcbi8vIGNoYW5nZWQgcm93IGlzIHNhdmVkLlxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRDaGFuZ2VkKFxuICBzdG9yZWQ6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGRyYWZ0OiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShub3JtYWxpemVEZWZhdWx0KHN0b3JlZCkpICE9PSBKU09OLnN0cmluZ2lmeShub3JtYWxpemVEZWZhdWx0KGRyYWZ0KSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { isLastDayOfMonth } from 'date-fns';
|
|
2
|
+
import { excludes, filterChipValueText, valuePicks } from './export/report-filter-lines';
|
|
3
|
+
import { DAY_SHORT, MONTH_YEAR, formatLocalDate, writeDayRange } from './format';
|
|
4
|
+
import { dateBoundString, dateFromBound } from './report-filter-items';
|
|
5
|
+
// Filters inside text blocks: what each {{filter.<id>}} token reads as. The
|
|
6
|
+
// value is the viewer's current one for the group, the one the filter bar
|
|
7
|
+
// shows, so a heading follows a filter the moment it changes. Pure, so the
|
|
8
|
+
// canvas and both exports word a filter the same way.
|
|
9
|
+
// What a filter with neither a label nor a name is called.
|
|
10
|
+
const UNNAMED_FILTER = 'Filter';
|
|
11
|
+
// What a date range, or a select or number range with nothing in it, reads as.
|
|
12
|
+
const ALL_DATES_TEXT = 'All dates';
|
|
13
|
+
const ALL_TEXT = 'All';
|
|
14
|
+
// What a select leaving values out reads as before their names.
|
|
15
|
+
const ALL_EXCEPT_TEXT = 'All except';
|
|
16
|
+
// '2026': a whole calendar year.
|
|
17
|
+
const YEAR = { year: 'numeric' };
|
|
18
|
+
// The filter groups whose tokens a layer reads: every group but a page
|
|
19
|
+
// group, which belongs to its page (pageId; null for the header and footer,
|
|
20
|
+
// which belong to no page). Elsewhere its token reads the em dash, and the
|
|
21
|
+
// Insert field menus do not list it.
|
|
22
|
+
export function layerFilterGroups(groups, pageId) {
|
|
23
|
+
return groups.filter((group) => group.level !== 'page' || (!!pageId && group.pageId === pageId));
|
|
24
|
+
}
|
|
25
|
+
// Out of every group's fields, the ones a layer reads (layerFilterGroups): a
|
|
26
|
+
// file words every filter once and hands each page, and the header and
|
|
27
|
+
// footer, its own.
|
|
28
|
+
export function layerFilterFields(fields, groups, pageId) {
|
|
29
|
+
return Object.fromEntries(layerFilterGroups(groups, pageId)
|
|
30
|
+
.filter((group) => !!fields[group.id])
|
|
31
|
+
.map((group) => [group.id, fields[group.id]]));
|
|
32
|
+
}
|
|
33
|
+
// What a filter is called where an author picks and sees it (the Insert
|
|
34
|
+
// field menus and the editor's chips): its label, else its name, else
|
|
35
|
+
// 'Filter'.
|
|
36
|
+
export function filterFieldName(group) {
|
|
37
|
+
return group.label || group.name || UNNAMED_FILTER;
|
|
38
|
+
}
|
|
39
|
+
// Each of the groups as its token reads, by group id. value is a group's
|
|
40
|
+
// current value; names are the names of a select's picks (kept or left out):
|
|
41
|
+
// undefined while they load, null when they could not be read.
|
|
42
|
+
export function textFilterFields(groups, value, locale, names) {
|
|
43
|
+
return Object.fromEntries(groups.map((group) => {
|
|
44
|
+
const groupValue = value(group.id);
|
|
45
|
+
const picked = group.type === 'select' ? valuePicks(groupValue) : [];
|
|
46
|
+
return [group.id, textFilterField(group, groupValue, locale, picked.length ? names(group, picked) : [])];
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
// What one filter token prints for a group's value, in the report's locale.
|
|
50
|
+
// - A date range fits the range: one whole calendar month 'September 2026',
|
|
51
|
+
// one whole quarter 'Q3 2026' (in English only: Intl has no word for a
|
|
52
|
+
// quarter, so another language writes it as its months), one whole year
|
|
53
|
+
// '2026', several whole months 'August – October 2026', any other days the
|
|
54
|
+
// day range ('Sep 1 – 15, 2026', one day that day). Only a start reads
|
|
55
|
+
// 'From Sep 1, 2026', only an end 'Until Sep 30, 2026', neither 'All dates'.
|
|
56
|
+
// The bounds are calendar days, the end the last one included, read as
|
|
57
|
+
// local midnight and written with no zone, so no day shifts.
|
|
58
|
+
// - A select and a number range read as their chip after its label
|
|
59
|
+
// (filterChipValueText): the picked names joined by ', ' (a blank row's
|
|
60
|
+
// pick by its label, 'No region'), '0 to 10', '0 or more', '50 or less'.
|
|
61
|
+
// A select leaving values out reads 'All except West, East'. Nothing
|
|
62
|
+
// picked or no end reads 'All'.
|
|
63
|
+
// - A keyword, its text, trimmed ('' when there is none).
|
|
64
|
+
export function filterFieldText(group, value, locale, names = []) {
|
|
65
|
+
switch (group.type) {
|
|
66
|
+
case 'dateRange':
|
|
67
|
+
return periodText(calendarDay(value?.start), calendarDay(value?.end), locale);
|
|
68
|
+
case 'keyword':
|
|
69
|
+
return value?.value?.trim() ?? '';
|
|
70
|
+
default:
|
|
71
|
+
return chosenText(value, locale, names);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Whether two filter field sets read the same, so a recomputed set that
|
|
75
|
+
// changed nothing a token or an Insert field menu shows does not repaint
|
|
76
|
+
// every block.
|
|
77
|
+
export function sameFilterFields(a, b) {
|
|
78
|
+
if (a === b) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
if (!a || !b) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
const ids = Object.keys(a).map(Number);
|
|
85
|
+
return ids.length === Object.keys(b).length
|
|
86
|
+
&& ids.every((id) => {
|
|
87
|
+
const other = b[id];
|
|
88
|
+
return !!other
|
|
89
|
+
&& a[id].name === other.name
|
|
90
|
+
&& a[id].order === other.order
|
|
91
|
+
&& a[id].text === other.text
|
|
92
|
+
&& !!a[id].loading === !!other.loading;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// One group's token. A select whose picked names have not arrived reads as
|
|
96
|
+
// loading, and one whose names could not be read has no text (the em dash).
|
|
97
|
+
function textFilterField(group, value, locale, names) {
|
|
98
|
+
const name = filterFieldName(group);
|
|
99
|
+
const order = group.order;
|
|
100
|
+
if (names === undefined) {
|
|
101
|
+
return { name, order, loading: true };
|
|
102
|
+
}
|
|
103
|
+
return names ? { name, order, text: filterFieldText(group, value, locale, names) } : { name, order };
|
|
104
|
+
}
|
|
105
|
+
// A select's picks or a number range's ends, in the chip's words.
|
|
106
|
+
function chosenText(value, locale, names) {
|
|
107
|
+
const text = filterChipValueText(value, { locale, names });
|
|
108
|
+
if (text === null) {
|
|
109
|
+
return ALL_TEXT;
|
|
110
|
+
}
|
|
111
|
+
return excludes(value) ? `${ALL_EXCEPT_TEXT} ${text}` : text;
|
|
112
|
+
}
|
|
113
|
+
// A date-range bound as the calendar day the filter sends the server
|
|
114
|
+
// (dateBoundString), read as local midnight, or null for none.
|
|
115
|
+
function calendarDay(bound) {
|
|
116
|
+
return dateFromBound(dateBoundString(bound));
|
|
117
|
+
}
|
|
118
|
+
function periodText(start, end, locale) {
|
|
119
|
+
if (start && end) {
|
|
120
|
+
return start <= end ? rangeText(start, end, locale) : rangeText(end, start, locale);
|
|
121
|
+
}
|
|
122
|
+
if (start) {
|
|
123
|
+
return `From ${formatLocalDate(start, locale, DAY_SHORT)}`;
|
|
124
|
+
}
|
|
125
|
+
return end ? `Until ${formatLocalDate(end, locale, DAY_SHORT)}` : ALL_DATES_TEXT;
|
|
126
|
+
}
|
|
127
|
+
// The days from first to last, both included, first not after last.
|
|
128
|
+
function rangeText(first, last, locale) {
|
|
129
|
+
const months = wholeMonths(first, last);
|
|
130
|
+
const quarterStart = first.getMonth() % 3 === 0;
|
|
131
|
+
if (months === 1) {
|
|
132
|
+
return formatLocalDate(first, locale, MONTH_YEAR);
|
|
133
|
+
}
|
|
134
|
+
if (months === 12 && first.getMonth() === 0) {
|
|
135
|
+
return formatLocalDate(first, locale, YEAR);
|
|
136
|
+
}
|
|
137
|
+
if (months === 3 && quarterStart && isEnglish(locale)) {
|
|
138
|
+
return `Q${first.getMonth() / 3 + 1} ${formatLocalDate(first, locale, YEAR)}`;
|
|
139
|
+
}
|
|
140
|
+
return writeDayRange(first, last, locale, months ? MONTH_YEAR : DAY_SHORT);
|
|
141
|
+
}
|
|
142
|
+
// How many whole calendar months the days cover: none unless they start on a
|
|
143
|
+
// month's first day and end on a month's last.
|
|
144
|
+
function wholeMonths(first, last) {
|
|
145
|
+
if (first.getDate() !== 1 || !isLastDayOfMonth(last)) {
|
|
146
|
+
return 0;
|
|
147
|
+
}
|
|
148
|
+
return (last.getFullYear() - first.getFullYear()) * 12 + last.getMonth() - first.getMonth() + 1;
|
|
149
|
+
}
|
|
150
|
+
// Whether the locale's language is English, the one a quarter is written in.
|
|
151
|
+
function isEnglish(locale) {
|
|
152
|
+
return locale.split('-')[0].toLowerCase() === 'en';
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZmlsdGVyLXRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDekYsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVqRixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSXZFLDRFQUE0RTtBQUM1RSwwRUFBMEU7QUFDMUUsMkVBQTJFO0FBQzNFLHNEQUFzRDtBQUV0RCwyREFBMkQ7QUFDM0QsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDO0FBRWhDLCtFQUErRTtBQUMvRSxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUM7QUFDbkMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBRXZCLGdFQUFnRTtBQUNoRSxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUM7QUFFckMsaUNBQWlDO0FBQ2pDLE1BQU0sSUFBSSxHQUErQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUU3RCx1RUFBdUU7QUFDdkUsNEVBQTRFO0FBQzVFLDJFQUEyRTtBQUMzRSxxQ0FBcUM7QUFDckMsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQTJCLEVBQUUsTUFBcUI7SUFDbEYsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ25HLENB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O0FBQzdFLCtDQUErQztBQUMvQyxTQUFTLFdBQVcsQ0FBQyxLQUFXLEVBQUUsSUFBVTtJQUMxQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2xHLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsU0FBUyxTQUFTLENBQUMsTUFBdUI7SUFDeEMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNMYXN0RGF5T2ZNb250aCB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgZXhjbHVkZXMsIGZpbHRlckNoaXBWYWx1ZVRleHQsIHZhbHVlUGlja3MgfSBmcm9tICcuL2V4cG9ydC9yZXBvcnQtZmlsdGVyLWxpbmVzJztcbmltcG9ydCB7IERBWV9TSE9SVCwgTU9OVEhfWUVBUiwgZm9ybWF0TG9jYWxEYXRlLCB3cml0ZURheVJhbmdlIH0gZnJvbSAnLi9mb3JtYXQnO1xuaW1wb3J0IHsgRmlsdGVyR3JvdXBWYWx1ZSwgUmVwb3J0RmlsdGVyR3JvdXAsIFJlcG9ydExvY2FsZVRhZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGRhdGVCb3VuZFN0cmluZywgZGF0ZUZyb21Cb3VuZCB9IGZyb20gJy4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBUZXh0RmlsdGVyRmllbGQgfSBmcm9tICcuL3RleHQnO1xuXG5cbi8vIEZpbHRlcnMgaW5zaWRlIHRleHQgYmxvY2tzOiB3aGF0IGVhY2gge3tmaWx0ZXIuPGlkPn19IHRva2VuIHJlYWRzIGFzLiBUaGVcbi8vIHZhbHVlIGlzIHRoZSB2aWV3ZXIncyBjdXJyZW50IG9uZSBmb3IgdGhlIGdyb3VwLCB0aGUgb25lIHRoZSBmaWx0ZXIgYmFyXG4vLyBzaG93cywgc28gYSBoZWFkaW5nIGZvbGxvd3MgYSBmaWx0ZXIgdGhlIG1vbWVudCBpdCBjaGFuZ2VzLiBQdXJlLCBzbyB0aGVcbi8vIGNhbnZhcyBhbmQgYm90aCBleHBvcnRzIHdvcmQgYSBmaWx0ZXIgdGhlIHNhbWUgd2F5LlxuXG4vLyBXaGF0IGEgZmlsdGVyIHdpdGggbmVpdGhlciBhIGxhYmVsIG5vciBhIG5hbWUgaXMgY2FsbGVkLlxuY29uc3QgVU5OQU1FRF9GSUxURVIgPSAnRmlsdGVyJztcblxuLy8gV2hhdCBhIGRhdGUgcmFuZ2UsIG9yIGEgc2VsZWN0IG9yIG51bWJlciByYW5nZSB3aXRoIG5vdGhpbmcgaW4gaXQsIHJlYWRzIGFzLlxuY29uc3QgQUxMX0RBVEVTX1RFWFQgPSAnQWxsIGRhdGVzJztcbmNvbnN0IEFMTF9URVhUID0gJ0FsbCc7XG5cbi8vIFdoYXQgYSBzZWxlY3QgbGVhdmluZyB2YWx1ZXMgb3V0IHJlYWRzIGFzIGJlZm9yZSB0aGVpciBuYW1lcy5cbmNvbnN0IEFMTF9FWENFUFRfVEVYVCA9ICdBbGwgZXhjZXB0JztcblxuLy8gJzIwMjYnOiBhIHdob2xlIGNhbGVuZGFyIHllYXIuXG5jb25zdCBZRUFSOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHsgeWVhcjogJ251bWVyaWMnIH07XG5cbi8vIFRoZSBmaWx0ZXIgZ3JvdXBzIHdob3NlIHRva2VucyBhIGxheWVyIHJlYWRzOiBldmVyeSBncm91cCBidXQgYSBwYWdlXG4vLyBncm91cCwgd2hpY2ggYmVsb25ncyB0byBpdHMgcGFnZSAocGFnZUlkOyBudWxsIGZvciB0aGUgaGVhZGVyIGFuZCBmb290ZXIsXG4vLyB3aGljaCBiZWxvbmcgdG8gbm8gcGFnZSkuIEVsc2V3aGVyZSBpdHMgdG9rZW4gcmVhZHMgdGhlIGVtIGRhc2gsIGFuZCB0aGVcbi8vIEluc2VydCBmaWVsZCBtZW51cyBkbyBub3QgbGlzdCBpdC5cbmV4cG9ydCBmdW5jdGlvbiBsYXllckZpbHRlckdyb3Vwcyhncm91cHM6IFJlcG9ydEZpbHRlckdyb3VwW10sIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IFJlcG9ydEZpbHRlckdyb3VwW10ge1xuICByZXR1cm4gZ3JvdXBzLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmxldmVsICE9PSAncGFnZScgfHwgKCEhcGFnZUlkICYmIGdyb3VwLnBhZ2VJZCA9PT0gcGFnZUlkKSk7XG59XG5cbi8vIE91dCBvZiBldmVyeSBncm91cCdzIGZpZWxkcywgdGhlIG9uZXMgYSBsYXllciByZWFkcyAobGF5ZXJGaWx0ZXJHcm91cHMpOiBhXG4vLyBmaWxlIHdvcmRzIGV2ZXJ5IGZpbHRlciBvbmNlIGFuZCBoYW5kcyBlYWNoIHBhZ2UsIGFuZCB0aGUgaGVhZGVyIGFuZFxuLy8gZm9vdGVyLCBpdHMgb3duLlxuZXhwb3J0IGZ1bmN0aW9uIGxheWVyRmlsdGVyRmllbGRzKFxuICBmaWVsZHM6IFJlY29yZDxudW1iZXIsIFRleHRGaWx0ZXJGaWVsZD4sXG4gIGdyb3VwczogUmVwb3J0RmlsdGVyR3JvdXBbXSxcbiAgcGFnZUlkOiBudW1iZXIgfCBudWxsLFxuKTogUmVjb3JkPG51bWJlciwgVGV4dEZpbHRlckZpZWxkPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMobGF5ZXJGaWx0ZXJHcm91cHMoZ3JvdXBzLCBwYWdlSWQpXG4gICAgLmZpbHRlcigoZ3JvdXApID0+ICEhZmllbGRzW2dyb3VwLmlkXSlcbiAgICAubWFwKChncm91cCkgPT4gW2dyb3VwLmlkLCBmaWVsZHNbZ3JvdXAuaWRdXSkpO1xufVxuXG4vLyBXaGF0IGEgZmlsdGVyIGlzIGNhbGxlZCB3aGVyZSBhbiBhdXRob3IgcGlja3MgYW5kIHNlZXMgaXQgKHRoZSBJbnNlcnRcbi8vIGZpZWxkIG1lbnVzIGFuZCB0aGUgZWRpdG9yJ3MgY2hpcHMpOiBpdHMgbGFiZWwsIGVsc2UgaXRzIG5hbWUsIGVsc2Vcbi8vICdGaWx0ZXInLlxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckZpZWxkTmFtZShncm91cDogUGljazxSZXBvcnRGaWx0ZXJHcm91cCwgJ2xhYmVsJyB8ICduYW1lJz4pOiBzdHJpbmcge1xuICByZXR1cm4gZ3JvdXAubGFiZWwgfHwgZ3JvdXAubmFtZSB8fCBVTk5BTUVEX0ZJTFRFUjtcbn1cblxuLy8gRWFjaCBvZiB0aGUgZ3JvdXBzIGFzIGl0cyB0b2tlbiByZWFkcywgYnkgZ3JvdXAgaWQuIHZhbHVlIGlzIGEgZ3JvdXAnc1xuLy8gY3VycmVudCB2YWx1ZTsgbmFtZXMgYXJlIHRoZSBuYW1lcyBvZiBhIHNlbGVjdCdzIHBpY2tzIChrZXB0IG9yIGxlZnQgb3V0KTpcbi8vIHVuZGVmaW5lZCB3aGlsZSB0aGV5IGxvYWQsIG51bGwgd2hlbiB0aGV5IGNvdWxkIG5vdCBiZSByZWFkLlxuZXhwb3J0IGZ1bmN0aW9uIHRleHRGaWx0ZXJGaWVsZHMoXG4gIGdyb3VwczogUmVwb3J0RmlsdGVyR3JvdXBbXSxcbiAgdmFsdWU6IChncm91cElkOiBudW1iZXIpID0+IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgbmFtZXM6IChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIHZhbHVlczogdW5rbm93bltdKSA9PiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBSZWNvcmQ8bnVtYmVyLCBUZXh0RmlsdGVyRmllbGQ+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhncm91cHMubWFwKChncm91cCkgPT4ge1xuICAgIGNvbnN0IGdyb3VwVmFsdWUgPSB2YWx1ZShncm91cC5pZCk7XG4gICAgY29uc3QgcGlja2VkID0gZ3JvdXAudHlwZSA9PT0gJ3NlbGVjdCcgPyB2YWx1ZVBpY2tzKGdyb3VwVmFsdWUpIDogW107XG5cbiAgICByZXR1cm4gW2dyb3VwLmlkLCB0ZXh0RmlsdGVyRmllbGQoZ3JvdXAsIGdyb3VwVmFsdWUsIGxvY2FsZSwgcGlja2VkLmxlbmd0aCA/IG5hbWVzKGdyb3VwLCBwaWNrZWQpIDogW10pXTtcbiAgfSkpO1xufVxuXG4vLyBXaGF0IG9uZSBmaWx0ZXIgdG9rZW4gcHJpbnRzIGZvciBhIGdyb3VwJ3MgdmFsdWUsIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG4vLyAtIEEgZGF0ZSByYW5nZSBmaXRzIHRoZSByYW5nZTogb25lIHdob2xlIGNhbGVuZGFyIG1vbnRoICdTZXB0ZW1iZXIgMjAyNicsXG4vLyAgIG9uZSB3aG9sZSBxdWFydGVyICdRMyAyMDI2JyAoaW4gRW5nbGlzaCBvbmx5OiBJbnRsIGhhcyBubyB3b3JkIGZvciBhXG4vLyAgIHF1YXJ0ZXIsIHNvIGFub3RoZXIgbGFuZ3VhZ2Ugd3JpdGVzIGl0IGFzIGl0cyBtb250aHMpLCBvbmUgd2hvbGUgeWVhclxuLy8gICAnMjAyNicsIHNldmVyYWwgd2hvbGUgbW9udGhzICdBdWd1c3Qg4oCTIE9jdG9iZXIgMjAyNicsIGFueSBvdGhlciBkYXlzIHRoZVxuLy8gICBkYXkgcmFuZ2UgKCdTZXAgMSDigJMgMTUsIDIwMjYnLCBvbmUgZGF5IHRoYXQgZGF5KS4gT25seSBhIHN0YXJ0IHJlYWRzXG4vLyAgICdGcm9tIFNlcCAxLCAyMDI2Jywgb25seSBhbiBlbmQgJ1VudGlsIFNlcCAzMCwgMjAyNicsIG5laXRoZXIgJ0FsbCBkYXRlcycuXG4vLyAgIFRoZSBib3VuZHMgYXJlIGNhbGVuZGFyIGRheXMsIHRoZSBlbmQgdGhlIGxhc3Qgb25lIGluY2x1ZGVkLCByZWFkIGFzXG4vLyAgIGxvY2FsIG1pZG5pZ2h0IGFuZCB3cml0dGVuIHdpdGggbm8gem9uZSwgc28gbm8gZGF5IHNoaWZ0cy5cbi8vIC0gQSBzZWxlY3QgYW5kIGEgbnVtYmVyIHJhbmdlIHJlYWQgYXMgdGhlaXIgY2hpcCBhZnRlciBpdHMgbGFiZWxcbi8vICAgKGZpbHRlckNoaXBWYWx1ZVRleHQpOiB0aGUgcGlja2VkIG5hbWVzIGpvaW5lZCBieSAnLCAnIChhIGJsYW5rIHJvdydzXG4vLyAgIHBpY2sgYnkgaXRzIGxhYmVsLCAnTm8gcmVnaW9uJyksICcwIHRvIDEwJywgJzAgb3IgbW9yZScsICc1MCBvciBsZXNzJy5cbi8vICAgQSBzZWxlY3QgbGVhdmluZyB2YWx1ZXMgb3V0IHJlYWRzICdBbGwgZXhjZXB0IFdlc3QsIEVhc3QnLiBOb3RoaW5nXG4vLyAgIHBpY2tlZCBvciBubyBlbmQgcmVhZHMgJ0FsbCcuXG4vLyAtIEEga2V5d29yZCwgaXRzIHRleHQsIHRyaW1tZWQgKCcnIHdoZW4gdGhlcmUgaXMgbm9uZSkuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyRmllbGRUZXh0KFxuICBncm91cDogUGljazxSZXBvcnRGaWx0ZXJHcm91cCwgJ3R5cGUnPixcbiAgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4pOiBzdHJpbmcge1xuICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgcmV0dXJuIHBlcmlvZFRleHQoY2FsZW5kYXJEYXkodmFsdWU/LnN0YXJ0KSwgY2FsZW5kYXJEYXkodmFsdWU/LmVuZCksIGxvY2FsZSk7XG4gICAgY2FzZSAna2V5d29yZCc6XG4gICAgICByZXR1cm4gdmFsdWU/LnZhbHVlPy50cmltKCkgPz8gJyc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjaG9zZW5UZXh0KHZhbHVlLCBsb2NhbGUsIG5hbWVzKTtcbiAgfVxufVxuXG4vLyBXaGV0aGVyIHR3byBmaWx0ZXIgZmllbGQgc2V0cyByZWFkIHRoZSBzYW1lLCBzbyBhIHJlY29tcHV0ZWQgc2V0IHRoYXRcbi8vIGNoYW5nZWQgbm90aGluZyBhIHRva2VuIG9yIGFuIEluc2VydCBmaWVsZCBtZW51IHNob3dzIGRvZXMgbm90IHJlcGFpbnRcbi8vIGV2ZXJ5IGJsb2NrLlxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVGaWx0ZXJGaWVsZHMoXG4gIGE6IFJlY29yZDxudW1iZXIsIFRleHRGaWx0ZXJGaWVsZD4gfCB1bmRlZmluZWQsXG4gIGI6IFJlY29yZDxudW1iZXIsIFRleHRGaWx0ZXJGaWVsZD4gfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghYSB8fCAhYikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGlkcyA9IE9iamVjdC5rZXlzKGEpLm1hcChOdW1iZXIpO1xuXG4gIHJldHVybiBpZHMubGVuZ3RoID09PSBPYmplY3Qua2V5cyhiKS5sZW5ndGhcbiAgICAmJiBpZHMuZXZlcnkoKGlkKSA9PiB7XG4gICAgICBjb25zdCBvdGhlciA9IGJbaWRdO1xuXG4gICAgICByZXR1cm4gISFvdGhlclxuICAgICAgICAmJiBhW2lkXS5uYW1lID09PSBvdGhlci5uYW1lXG4gICAgICAgICYmIGFbaWRdLm9yZGVyID09PSBvdGhlci5vcmRlclxuICAgICAgICAmJiBhW2lkXS50ZXh0ID09PSBvdGhlci50ZXh0XG4gICAgICAgICYmICEhYVtpZF0ubG9hZGluZyA9PT0gISFvdGhlci5sb2FkaW5nO1xuICAgIH0pO1xufVxuXG4vLyBPbmUgZ3JvdXAncyB0b2tlbi4gQSBzZWxlY3Qgd2hvc2UgcGlja2VkIG5hbWVzIGhhdmUgbm90IGFycml2ZWQgcmVhZHMgYXNcbi8vIGxvYWRpbmcsIGFuZCBvbmUgd2hvc2UgbmFtZXMgY291bGQgbm90IGJlIHJlYWQgaGFzIG5vIHRleHQgKHRoZSBlbSBkYXNoKS5cbmZ1bmN0aW9uIHRleHRGaWx0ZXJGaWVsZChcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogVGV4dEZpbHRlckZpZWxkIHtcbiAgY29uc3QgbmFtZSA9IGZpbHRlckZpZWxkTmFtZShncm91cCk7XG4gIGNvbnN0IG9yZGVyID0gZ3JvdXAub3JkZXI7XG5cbiAgaWYgKG5hbWVzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyBuYW1lLCBvcmRlciwgbG9hZGluZzogdHJ1ZSB9O1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzID8geyBuYW1lLCBvcmRlciwgdGV4dDogZmlsdGVyRmllbGRUZXh0KGdyb3VwLCB2YWx1ZSwgbG9jYWxlLCBuYW1lcykgfSA6IHsgbmFtZSwgb3JkZXIgfTtcbn1cblxuLy8gQSBzZWxlY3QncyBwaWNrcyBvciBhIG51bWJlciByYW5nZSdzIGVuZHMsIGluIHRoZSBjaGlwJ3Mgd29yZHMuXG5mdW5jdGlvbiBjaG9zZW5UZXh0KFxuICB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBzdHJpbmcge1xuICBjb25zdCB0ZXh0ID0gZmlsdGVyQ2hpcFZhbHVlVGV4dCh2YWx1ZSwgeyBsb2NhbGUsIG5hbWVzIH0pO1xuXG4gIGlmICh0ZXh0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIEFMTF9URVhUO1xuICB9XG5cbiAgcmV0dXJuIGV4Y2x1ZGVzKHZhbHVlKSA/IGAke0FMTF9FWENFUFRfVEVYVH0gJHt0ZXh0fWAgOiB0ZXh0O1xufVxuXG4vLyBBIGRhdGUtcmFuZ2UgYm91bmQgYXMgdGhlIGNhbGVuZGFyIGRheSB0aGUgZmlsdGVyIHNlbmRzIHRoZSBzZXJ2ZXJcbi8vIChkYXRlQm91bmRTdHJpbmcpLCByZWFkIGFzIGxvY2FsIG1pZG5pZ2h0LCBvciBudWxsIGZvciBub25lLlxuZnVuY3Rpb24gY2FsZW5kYXJEYXkoYm91bmQ6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB8IG51bGwge1xuICByZXR1cm4gZGF0ZUZyb21Cb3VuZChkYXRlQm91bmRTdHJpbmcoYm91bmQpKTtcbn1cblxuZnVuY3Rpb24gcGVyaW9kVGV4dChzdGFydDogRGF0ZSB8IG51bGwsIGVuZDogRGF0ZSB8IG51bGwsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHtcbiAgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgIHJldHVybiBzdGFydCA8PSBlbmQgPyByYW5nZVRleHQoc3RhcnQsIGVuZCwgbG9jYWxlKSA6IHJhbmdlVGV4dChlbmQsIHN0YXJ0LCBsb2NhbGUpO1xuICB9XG5cbiAgaWYgKHN0YXJ0KSB7XG4gICAgcmV0dXJuIGBGcm9tICR7Zm9ybWF0TG9jYWxEYXRlKHN0YXJ0LCBsb2NhbGUsIERBWV9TSE9SVCl9YDtcbiAgfVxuXG4gIHJldHVybiBlbmQgPyBgVW50aWwgJHtmb3JtYXRMb2NhbERhdGUoZW5kLCBsb2NhbGUsIERBWV9TSE9SVCl9YCA6IEFMTF9EQVRFU19URVhUO1xufVxuXG4vLyBUaGUgZGF5cyBmcm9tIGZpcnN0IHRvIGxhc3QsIGJvdGggaW5jbHVkZWQsIGZpcnN0IG5vdCBhZnRlciBsYXN0LlxuZnVuY3Rpb24gcmFuZ2VUZXh0KGZpcnN0OiBEYXRlLCBsYXN0OiBEYXRlLCBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1vbnRocyA9IHdob2xlTW9udGhzKGZpcnN0LCBsYXN0KTtcbiAgY29uc3QgcXVhcnRlclN0YXJ0ID0gZmlyc3QuZ2V0TW9udGgoKSAlIDMgPT09IDA7XG5cbiAgaWYgKG1vbnRocyA9PT0gMSkge1xuICAgIHJldHVybiBmb3JtYXRMb2NhbERhdGUoZmlyc3QsIGxvY2FsZSwgTU9OVEhfWUVBUik7XG4gIH1cblxuICBpZiAobW9udGhzID09PSAxMiAmJiBmaXJzdC5nZXRNb250aCgpID09PSAwKSB7XG4gICAgcmV0dXJuIGZvcm1hdExvY2FsRGF0ZShmaXJzdCwgbG9jYWxlLCBZRUFSKTtcbiAgfVxuXG4gIGlmIChtb250aHMgPT09IDMgJiYgcXVhcnRlclN0YXJ0ICYmIGlzRW5nbGlzaChsb2NhbGUpKSB7XG4gICAgcmV0dXJuIGBRJHtmaXJzdC5nZXRNb250aCgpIC8gMyArIDF9ICR7Zm9ybWF0TG9jYWxEYXRlKGZpcnN0LCBsb2NhbGUsIFlFQVIpfWA7XG4gIH1cblxuICByZXR1cm4gd3JpdGVEYXlSYW5nZShmaXJzdCwgbGFzdCwgbG9jYWxlLCBtb250aHMgPyBNT05USF9ZRUFSIDogREFZX1NIT1JUKTtcbn1cblxuLy8gSG93IG1hbnkgd2hvbGUgY2FsZW5kYXIgbW9udGhzIHRoZSBkYXlzIGNvdmVyOiBub25lIHVubGVzcyB0aGV5IHN0YXJ0IG9uIGFcbi8vIG1vbnRoJ3MgZmlyc3QgZGF5IGFuZCBlbmQgb24gYSBtb250aCdzIGxhc3QuXG5mdW5jdGlvbiB3aG9sZU1vbnRocyhmaXJzdDogRGF0ZSwgbGFzdDogRGF0ZSk6IG51bWJlciB7XG4gIGlmIChmaXJzdC5nZXREYXRlKCkgIT09IDEgfHwgIWlzTGFzdERheU9mTW9udGgobGFzdCkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiAobGFzdC5nZXRGdWxsWWVhcigpIC0gZmlyc3QuZ2V0RnVsbFllYXIoKSkgKiAxMiArIGxhc3QuZ2V0TW9udGgoKSAtIGZpcnN0LmdldE1vbnRoKCkgKyAxO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBsb2NhbGUncyBsYW5ndWFnZSBpcyBFbmdsaXNoLCB0aGUgb25lIGEgcXVhcnRlciBpcyB3cml0dGVuIGluLlxuZnVuY3Rpb24gaXNFbmdsaXNoKGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogYm9vbGVhbiB7XG4gIHJldHVybiBsb2NhbGUuc3BsaXQoJy0nKVswXS50b0xvd2VyQ2FzZSgpID09PSAnZW4nO1xufVxuIl19
|