@alauda-fe/common 1.4.29-beta.1 → 1.4.29
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/array-form-table/form/component.d.ts +1 -1
- package/code/managed-fields-folder.util.d.ts +2 -3
- package/code/resource-yaml-display/component.d.ts +3 -8
- package/code/resource-yaml-editor/component.d.ts +2 -3
- package/code/yaml-sidebar/component.d.ts +6 -15
- package/core/abstract/base-nested-form-control.d.ts +1 -1
- package/core/services/kubernetes-schema.service.d.ts +1 -0
- package/core/services/plugin-util.service.d.ts +1 -1
- package/core/services/workspace-helper.service.d.ts +1 -1
- package/core/services/yaml-util.service.d.ts +1 -1
- package/core/types/schema.d.ts +9 -0
- package/esm2022/abnormal-page/abnormal-page.component.mjs +1 -1
- package/esm2022/array-form-table/form/component.mjs +1 -1
- package/esm2022/array-form-table/key-value-form/component.mjs +1 -1
- package/esm2022/array-form-table/key-value-table/component.mjs +1 -1
- package/esm2022/array-form-table/string-array-form/component.mjs +1 -1
- package/esm2022/async-data/error-page/component.mjs +1 -1
- package/esm2022/async-data/page-state/component.mjs +1 -1
- package/esm2022/business/notification-disabled-container/component.mjs +1 -1
- package/esm2022/business/resource-select/exports/cluster-list/component.mjs +1 -1
- package/esm2022/business/resource-select/exports/cluster-selector/component.mjs +1 -1
- package/esm2022/business/resource-select/exports/icon/component.mjs +1 -1
- package/esm2022/business/resource-select/exports/mesh-group-selector/component.mjs +1 -1
- package/esm2022/business/resource-select/exports/namespace-list/component.mjs +1 -1
- package/esm2022/business/resource-select/exports/namespace-page/component.mjs +1 -1
- package/esm2022/business/resource-select/exports/namespace-selector/component.mjs +1 -1
- package/esm2022/business/resource-select/exports/project-list/component.mjs +1 -1
- package/esm2022/business/resource-select/exports/project-page/component.mjs +1 -1
- package/esm2022/business/resource-select/exports/project-selector/component.mjs +1 -1
- package/esm2022/business/resource-select/internals/data-grid/component.mjs +1 -1
- package/esm2022/business/resource-select/internals/meshgroup-list/component.mjs +1 -1
- package/esm2022/business/resource-select/internals/no-data/component.mjs +1 -1
- package/esm2022/business/resource-select/internals/resource-dashboard/component.mjs +1 -1
- package/esm2022/business/resource-select/internals/selector-popup/component.mjs +1 -1
- package/esm2022/chart/common/axis/axis-label.component.mjs +1 -1
- package/esm2022/chart/common/axis/x-axis-ticks.component.mjs +1 -1
- package/esm2022/chart/common/axis/x-axis.component.mjs +1 -1
- package/esm2022/chart/common/axis/x-plot-lines.component.mjs +1 -1
- package/esm2022/chart/common/axis/y-axis-ticks.component.mjs +1 -1
- package/esm2022/chart/common/axis/y-axis.component.mjs +1 -1
- package/esm2022/chart/common/axis/y-plot-lines.component.mjs +1 -1
- package/esm2022/chart/common/chart/chart.component.mjs +1 -1
- package/esm2022/chart/common/legend/legend.component.mjs +1 -1
- package/esm2022/chart/common/range-area/range-area.component.mjs +1 -1
- package/esm2022/chart/common/reference-area/reference-area.component.mjs +1 -1
- package/esm2022/chart/common/series/area-series.component.mjs +1 -1
- package/esm2022/chart/common/series/bar-path.component.mjs +1 -1
- package/esm2022/chart/common/series/bar-series.component.mjs +1 -1
- package/esm2022/chart/common/series/line-series.component.mjs +1 -1
- package/esm2022/chart/common/tooltip/tooltip.component.mjs +1 -1
- package/esm2022/chart/custom-template/dropdown-legend.mjs +1 -1
- package/esm2022/code/code-display-dialog/component.mjs +1 -1
- package/esm2022/code/k8s-yaml-display-dialog/component.mjs +1 -1
- package/esm2022/code/managed-fields-folder.util.mjs +1 -1
- package/esm2022/code/resource-yaml-display/component.mjs +25 -29
- package/esm2022/code/resource-yaml-editor/component.mjs +13 -16
- package/esm2022/code/yaml-examples.mjs +14 -6
- package/esm2022/code/yaml-sidebar/component.mjs +93 -119
- package/esm2022/core/components/tree/node/component.mjs +1 -1
- package/esm2022/core/components/tree/tree/component.mjs +1 -1
- package/esm2022/core/directives/readonly-field.directive.mjs +1 -1
- package/esm2022/core/services/kubernetes-schema.service.mjs +27 -21
- package/esm2022/core/services/plugin-util.service.mjs +3 -3
- package/esm2022/core/services/workspace-helper.service.mjs +1 -1
- package/esm2022/core/services/yaml-util.service.mjs +3 -2
- package/esm2022/core/types/schema.mjs +1 -1
- package/esm2022/custom-columns-setting/component.mjs +1 -1
- package/esm2022/disabled-container/disabled-container.component.mjs +1 -1
- package/esm2022/editable/editable.component.mjs +1 -1
- package/esm2022/editable-text/component.mjs +1 -1
- package/esm2022/exec/placeholder/component.mjs +1 -1
- package/esm2022/exec/terminal/component.mjs +1 -1
- package/esm2022/exec/terminal-group/component.mjs +1 -1
- package/esm2022/feature-gate-forbidden/component/component.mjs +1 -1
- package/esm2022/form/errors-mapper/errors-mapper-component/component.mjs +1 -1
- package/esm2022/form/errors-mapper/errors-mapper.directive.mjs +1 -1
- package/esm2022/form/labels-editor/component.mjs +1 -1
- package/esm2022/form/taints-editor/component.mjs +1 -1
- package/esm2022/form/upload-file/component.mjs +1 -1
- package/esm2022/form/validators/strong-password/strong-password-tooltip/component.mjs +1 -1
- package/esm2022/graph-canvas/components/graph-actions.component.mjs +1 -1
- package/esm2022/graph-canvas/components/graph-canvas.component.mjs +1 -1
- package/esm2022/graph-canvas/components/graph-link.component.mjs +1 -1
- package/esm2022/graph-canvas/components/graph-links.component.mjs +1 -1
- package/esm2022/grid-layout/components/grid/component.mjs +1 -1
- package/esm2022/grid-layout/components/grid-items/component.mjs +1 -1
- package/esm2022/help-document/component.mjs +1 -1
- package/esm2022/k8s-resource-list/footer/component.mjs +1 -1
- package/esm2022/k8s-shared/resource-mark/k8s-resource-mark.component.mjs +1 -1
- package/esm2022/k8s-shared/update-description-dialog/component.mjs +1 -1
- package/esm2022/k8s-shared/update-display-name-dialog/component.mjs +1 -1
- package/esm2022/k8s-shared/update-key-value-dialog/component.mjs +1 -1
- package/esm2022/lazy-component/lazy-load-component.mjs +1 -1
- package/esm2022/license/license-error/component.mjs +1 -1
- package/esm2022/list-display/component.mjs +1 -1
- package/esm2022/metric-chart/metric-chart.component.mjs +1 -1
- package/esm2022/metric-chart/metric-time-pick.mjs +1 -1
- package/esm2022/multi-search/action-input/component.mjs +1 -1
- package/esm2022/multi-search/form/component.mjs +1 -1
- package/esm2022/multi-search/multi-search-tags/component.mjs +1 -1
- package/esm2022/mutable/mosaic/mosaic.component.mjs +1 -1
- package/esm2022/notification/feedback-notification/component.mjs +1 -1
- package/esm2022/overview-banner/overview-banner.component.mjs +1 -1
- package/esm2022/page-guard/component/component.mjs +1 -1
- package/esm2022/page-scaffold/navigation/breadcrumb/breadcrumb.component.mjs +1 -1
- package/esm2022/page-scaffold/navigation/nav-menu/nav-item-li/nav-item-li.component.mjs +1 -1
- package/esm2022/page-scaffold/navigation/nav-menu/nav-item-ul/nav-item-ul.component.mjs +1 -1
- package/esm2022/page-scaffold/navigation/nav-menu/nav-menu.component.mjs +1 -1
- package/esm2022/page-scaffold/page/notices/maintenance.component.mjs +1 -1
- package/esm2022/page-scaffold/page/notices/notice.component.mjs +1 -1
- package/esm2022/page-scaffold/page/page.component.mjs +1 -1
- package/esm2022/page-scaffold/page-header/account-menu/component/component.mjs +1 -1
- package/esm2022/page-scaffold/page-header/common-layout/namespace-select/component.mjs +1 -1
- package/esm2022/page-scaffold/page-header/common-layout/product-select/component.mjs +1 -1
- package/esm2022/page-scaffold/page-header/component.mjs +1 -1
- package/esm2022/page-scaffold/page-header/enterprise-support-status/component.mjs +1 -1
- package/esm2022/page-scaffold/page-header/header-notify/component/header-notify.component.mjs +1 -1
- package/esm2022/page-scaffold/page-header/header-notify/component/notification-list/notification-list.component.mjs +1 -1
- package/esm2022/page-scaffold/page-header/help-menu/component/component.mjs +1 -1
- package/esm2022/pie-derivative-chart/donut-status/component.mjs +1 -1
- package/esm2022/pie-derivative-chart/radial-bar/radial-bar-chart.component.mjs +1 -1
- package/esm2022/pod-status/component.mjs +1 -1
- package/esm2022/searchable-selector/component.mjs +1 -1
- package/esm2022/skeleton/item/component.mjs +1 -1
- package/esm2022/skeleton/nav-skeleton/component.mjs +1 -1
- package/esm2022/table/component.mjs +1 -1
- package/esm2022/translate/i18n-assets-loader.mjs +7 -2
- package/esm2022/translate/translate.service.mjs +146 -174
- package/esm2022/view-chart/custom-template/dropdown-legend.mjs +1 -1
- package/esm2022/view-chart/legend/legend.component.mjs +1 -1
- package/esm2022/view-chart/view-chart.component.mjs +1 -1
- package/esm2022/view-zchart/custom-template/dropdown-legend.mjs +1 -1
- package/esm2022/view-zchart/legend/legend.component.mjs +1 -1
- package/esm2022/view-zchart/view-zchart.component.mjs +1 -1
- package/esm2022/widget/card-section/card-section.component.mjs +1 -1
- package/esm2022/widget/confirm-delete/confirm-delete.component.mjs +1 -1
- package/esm2022/widget/current-time/component.mjs +1 -1
- package/esm2022/widget/date-range-picker/component.mjs +1 -1
- package/esm2022/widget/field-set/column/component.mjs +2 -2
- package/esm2022/widget/field-set/group/component.mjs +1 -1
- package/esm2022/widget/field-set/item/component.mjs +1 -1
- package/esm2022/widget/foldable-block/component.mjs +1 -1
- package/esm2022/widget/foldable-item-in-table/component.mjs +1 -1
- package/esm2022/widget/loading-mask/loading-mask.component.mjs +1 -1
- package/esm2022/widget/password-input/component.mjs +1 -1
- package/esm2022/widget/relative-time/component.mjs +1 -1
- package/esm2022/widget/resource-label/component.mjs +1 -1
- package/esm2022/widget/resource-multi-select/component.mjs +1 -1
- package/esm2022/widget/search-panel/component.mjs +1 -1
- package/esm2022/widget/search-panel/search-item/component.mjs +1 -1
- package/esm2022/widget/status-icon/status-icon.component.mjs +1 -1
- package/esm2022/widget/tags-label/component.mjs +1 -1
- package/esm2022/widget/terminating-tag/component.mjs +1 -1
- package/esm2022/widget/text-ellipsis/component.mjs +1 -1
- package/esm2022/widget/text-with-url/component.mjs +1 -1
- package/esm2022/widget/zero-state/zero-state.component.mjs +1 -1
- package/esm2022/workload-status-icon/component.mjs +1 -1
- package/esm2022/xterm/xterm-terminal/xterm-terminal.component.mjs +1 -1
- package/esm2022/xterm/xterm.component.mjs +1 -1
- package/package.json +1 -1
- package/translate/translate.service.d.ts +30 -55
|
@@ -6,7 +6,7 @@ import { __decorate, __metadata } from "tslib";
|
|
|
6
6
|
import { HttpClient } from '@angular/common/http';
|
|
7
7
|
import { Inject, Injectable, Optional, isDevMode, } from '@angular/core';
|
|
8
8
|
import { IntlMessageFormat } from 'intl-messageformat';
|
|
9
|
-
import { get, head, isPlainObject } from 'lodash-es';
|
|
9
|
+
import { get, head, has, isPlainObject, template } from 'lodash-es';
|
|
10
10
|
import { Observable, Subject, forkJoin, throwError, EMPTY, catchError, filter, finalize, map, takeUntil, } from 'rxjs';
|
|
11
11
|
import { ajax } from 'rxjs/ajax';
|
|
12
12
|
import { API_GATEWAY } from '../core/constants/constants';
|
|
@@ -18,6 +18,18 @@ import { getUserLanguage } from './i18n-config';
|
|
|
18
18
|
import { TRANSLATE_OPTIONS, TRANSLATIONS } from './tokens';
|
|
19
19
|
import * as i0 from "@angular/core";
|
|
20
20
|
import * as i1 from "@angular/common/http";
|
|
21
|
+
function getLooseLocale(locale) {
|
|
22
|
+
return head(locale.split(/[_-]/)) || locale;
|
|
23
|
+
}
|
|
24
|
+
function hasLodashTemplateFormat(message) {
|
|
25
|
+
return /\{\{[^}]+\}\}/.test(message);
|
|
26
|
+
}
|
|
27
|
+
function hasIcuMessageFormat(message) {
|
|
28
|
+
return /\{[^{}]+\}/.test(message);
|
|
29
|
+
}
|
|
30
|
+
function isTemplatePlainObject(data) {
|
|
31
|
+
return isPlainObject(data);
|
|
32
|
+
}
|
|
21
33
|
/**
|
|
22
34
|
* 国际化翻译服务
|
|
23
35
|
*
|
|
@@ -72,25 +84,21 @@ export class TranslateService {
|
|
|
72
84
|
}
|
|
73
85
|
/**
|
|
74
86
|
* 获取翻译文本并进行模板插值
|
|
75
|
-
*
|
|
76
|
-
*
|
|
87
|
+
* 支持两种模板语法:
|
|
88
|
+
* 1. 传统的 {{ key }} 语法,使用 lodash template 处理
|
|
89
|
+
* 2. ICU Message Format 语法,使用 IntlMessageFormat 处理
|
|
77
90
|
* @param key - 翻译键或翻译对象
|
|
78
91
|
* @param data - 模板数据(支持基本类型、Date、对象和数组)
|
|
79
92
|
* @returns 翻译后的文本
|
|
80
93
|
*
|
|
81
94
|
* @example
|
|
82
95
|
* ```typescript
|
|
83
|
-
* //
|
|
84
|
-
* translate.get('hello', { name: 'World' }) // 模板: "Hello {name}"
|
|
85
|
-
*
|
|
86
|
-
* // 基本类型参数(自动转换为 {value})
|
|
87
|
-
* translate.get('welcome', 'John') // 模板: "Welcome {value}"
|
|
96
|
+
* // lodash template 语法
|
|
97
|
+
* translate.get('hello', { name: 'World' }) // 模板: "Hello {{ name }}"
|
|
88
98
|
*
|
|
89
|
-
* // ICU
|
|
90
|
-
* translate.get('itemCount', { count: 5 })
|
|
91
|
-
*
|
|
92
|
-
* // ICU 格式(日期,默认本地化)
|
|
93
|
-
* translate.get('createdAt', { date: new Date() })
|
|
99
|
+
* // ICU Message Format 语法
|
|
100
|
+
* translate.get('itemCount', { count: 5 }) // 模板: "Items: {count, number}"
|
|
101
|
+
* translate.get('createdAt', { date: new Date() }) // 模板: "Created: {date, date, short}"
|
|
94
102
|
* ```
|
|
95
103
|
*/
|
|
96
104
|
get(key, data) {
|
|
@@ -99,11 +107,15 @@ export class TranslateService {
|
|
|
99
107
|
return translation;
|
|
100
108
|
}
|
|
101
109
|
try {
|
|
102
|
-
//
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
110
|
+
// 检测模板类型并使用相应的处理方式
|
|
111
|
+
if (hasLodashTemplateFormat(translation)) {
|
|
112
|
+
return this.formatLodashTemplate(translation, data);
|
|
113
|
+
}
|
|
114
|
+
if (hasIcuMessageFormat(translation)) {
|
|
115
|
+
return this.formatIcuMessage(translation, data);
|
|
116
|
+
}
|
|
117
|
+
// 如果没有模板语法,直接返回翻译文本
|
|
118
|
+
return translation;
|
|
107
119
|
}
|
|
108
120
|
catch (error) {
|
|
109
121
|
this.handleTemplateError(key, error);
|
|
@@ -116,17 +128,16 @@ export class TranslateService {
|
|
|
116
128
|
* @returns 原始翻译模板文本
|
|
117
129
|
*/
|
|
118
130
|
getRaw(key) {
|
|
131
|
+
// 当翻译key是null或undefined时返回空字符串
|
|
132
|
+
if (key == null) {
|
|
133
|
+
return '';
|
|
134
|
+
}
|
|
119
135
|
if (typeof key === 'string') {
|
|
120
136
|
return this.getTranslationByKey(key);
|
|
121
137
|
}
|
|
122
138
|
// 当key是Translation对象时,获取当前语言的翻译值
|
|
123
|
-
const value = this.getTranslationByObject(key);
|
|
124
|
-
|
|
125
|
-
if (value !== undefined) {
|
|
126
|
-
return value === null ? 'null' : String(value);
|
|
127
|
-
}
|
|
128
|
-
// 如果没有找到翻译,返回JSON字符串形式
|
|
129
|
-
return JSON.stringify(key);
|
|
139
|
+
const value = this.getTranslationByObject(key, this.locale);
|
|
140
|
+
return value == null ? '' : String(value);
|
|
130
141
|
}
|
|
131
142
|
/**
|
|
132
143
|
* 切换到下一个支持的语言环境
|
|
@@ -237,27 +248,17 @@ export class TranslateService {
|
|
|
237
248
|
* @param data - 模板数据
|
|
238
249
|
* @returns ICU 兼容的数据对象
|
|
239
250
|
*/
|
|
240
|
-
|
|
251
|
+
normalizeIcuData(data) {
|
|
241
252
|
if (data == null) {
|
|
242
253
|
return {};
|
|
243
254
|
}
|
|
244
255
|
// 如果是纯对象,直接转换其属性
|
|
245
|
-
if (
|
|
256
|
+
if (isTemplatePlainObject(data)) {
|
|
246
257
|
return this.convertObjectToIcuData(data);
|
|
247
258
|
}
|
|
248
259
|
// 基本类型、数组、Date等包装为 { value: data }
|
|
249
260
|
return { value: this.convertValueToIcuValue(data) };
|
|
250
261
|
}
|
|
251
|
-
/**
|
|
252
|
-
* 检查是否为纯模板对象(不是数组、Date等特殊对象)
|
|
253
|
-
*/
|
|
254
|
-
isPlainTemplateObject(data) {
|
|
255
|
-
return (typeof data === 'object' &&
|
|
256
|
-
data !== null &&
|
|
257
|
-
!Array.isArray(data) &&
|
|
258
|
-
!(data instanceof Date) &&
|
|
259
|
-
data.constructor === Object);
|
|
260
|
-
}
|
|
261
262
|
/**
|
|
262
263
|
* 转换对象的所有属性为 ICU 兼容值
|
|
263
264
|
*/
|
|
@@ -321,23 +322,52 @@ export class TranslateService {
|
|
|
321
322
|
}
|
|
322
323
|
}
|
|
323
324
|
/**
|
|
324
|
-
*
|
|
325
|
-
*
|
|
326
|
-
* @param
|
|
327
|
-
* @returns
|
|
325
|
+
* 使用 lodash template 格式化文本
|
|
326
|
+
* @param message - 包含 {{ }} 语法的模板字符串
|
|
327
|
+
* @param data - 模板数据
|
|
328
|
+
* @returns 格式化后的字符串
|
|
328
329
|
*/
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
330
|
+
formatLodashTemplate(message, data) {
|
|
331
|
+
try {
|
|
332
|
+
// 将数据标准化为对象格式
|
|
333
|
+
const templateData = this.normalizeTemplateData(data);
|
|
334
|
+
// 使用 lodash template 处理 {{ }} 语法
|
|
335
|
+
const compiled = template(message, {
|
|
336
|
+
interpolate: /\{\{(.+?)\}\}/g, // 自定义插值语法为 {{ }}
|
|
337
|
+
});
|
|
338
|
+
return compiled(templateData);
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
if (isDevMode()) {
|
|
342
|
+
console.warn(`Lodash template formatting failed for "${message}":`, error);
|
|
343
|
+
}
|
|
344
|
+
// 降级处理:返回原始消息
|
|
345
|
+
return message;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* 标准化模板数据为对象格式
|
|
350
|
+
* @param data - 原始模板数据
|
|
351
|
+
* @returns 标准化后的对象或数组(为了向后兼容)
|
|
352
|
+
*/
|
|
353
|
+
normalizeTemplateData(data) {
|
|
354
|
+
if (data == null) {
|
|
355
|
+
return {};
|
|
356
|
+
}
|
|
357
|
+
// 如果是纯对象,直接返回
|
|
358
|
+
if (isTemplatePlainObject(data)) {
|
|
359
|
+
return data;
|
|
360
|
+
}
|
|
361
|
+
// 这样模板中可以使用 {{ 0 }} 访问第一个元素
|
|
362
|
+
return [data];
|
|
335
363
|
}
|
|
336
364
|
/**
|
|
337
365
|
* 使用 ICU message format 格式化文本
|
|
338
366
|
*/
|
|
339
|
-
formatIcuMessage(message,
|
|
367
|
+
formatIcuMessage(message, data) {
|
|
340
368
|
try {
|
|
369
|
+
// 将数据转换为 ICU 兼容格式
|
|
370
|
+
const icuData = this.normalizeIcuData(data);
|
|
341
371
|
const messageFormat = new IntlMessageFormat(message, this.locale, undefined, { ignoreTag: true });
|
|
342
372
|
return messageFormat.format(icuData);
|
|
343
373
|
}
|
|
@@ -540,18 +570,6 @@ export class TranslateService {
|
|
|
540
570
|
return date.toISOString();
|
|
541
571
|
}
|
|
542
572
|
}
|
|
543
|
-
/**
|
|
544
|
-
* 通过字符串键获取翻译
|
|
545
|
-
*/
|
|
546
|
-
getTranslationByKey(key) {
|
|
547
|
-
return this.resolveTranslation(key);
|
|
548
|
-
}
|
|
549
|
-
/**
|
|
550
|
-
* 通过翻译对象获取翻译值
|
|
551
|
-
*/
|
|
552
|
-
getTranslationByObject(translationObj) {
|
|
553
|
-
return this.getTranslationValue(translationObj, this.locale);
|
|
554
|
-
}
|
|
555
573
|
/**
|
|
556
574
|
* 处理无效语言环境
|
|
557
575
|
*/
|
|
@@ -582,7 +600,8 @@ export class TranslateService {
|
|
|
582
600
|
* 标准化远程URL
|
|
583
601
|
*/
|
|
584
602
|
normalizeRemoteUrl(remoteUrl) {
|
|
585
|
-
|
|
603
|
+
// 清理URL(移除hash片段)
|
|
604
|
+
remoteUrl = head(remoteUrl.split(/#/)) || remoteUrl;
|
|
586
605
|
const isAbsolute = isAbsoluteUrl(remoteUrl);
|
|
587
606
|
const isApiGateWayRequest = remoteUrl.startsWith(API_GATEWAY);
|
|
588
607
|
// 开发模式下进行URL验证
|
|
@@ -598,12 +617,6 @@ export class TranslateService {
|
|
|
598
617
|
}
|
|
599
618
|
return remoteUrl;
|
|
600
619
|
}
|
|
601
|
-
/**
|
|
602
|
-
* 清理URL(移除hash片段)
|
|
603
|
-
*/
|
|
604
|
-
cleanUrl(url) {
|
|
605
|
-
return head(url.split(/#/)) || url;
|
|
606
|
-
}
|
|
607
620
|
/**
|
|
608
621
|
* 验证远程URL(开发模式)
|
|
609
622
|
*/
|
|
@@ -630,8 +643,8 @@ export class TranslateService {
|
|
|
630
643
|
createMultiLocaleRequest(urlTemplate) {
|
|
631
644
|
const requests = this.options.locales.map(locale => this.fetchTranslation(urlTemplate, locale).pipe(catchError(error => {
|
|
632
645
|
if (this.options.loose) {
|
|
633
|
-
const looseLocale =
|
|
634
|
-
if (
|
|
646
|
+
const looseLocale = getLooseLocale(locale);
|
|
647
|
+
if (looseLocale !== locale &&
|
|
635
648
|
!this.options.locales.includes(looseLocale)) {
|
|
636
649
|
return this.fetchTranslation(urlTemplate, looseLocale);
|
|
637
650
|
}
|
|
@@ -669,140 +682,99 @@ export class TranslateService {
|
|
|
669
682
|
}
|
|
670
683
|
}
|
|
671
684
|
/**
|
|
672
|
-
*
|
|
685
|
+
* 通过键查找翻译文本
|
|
673
686
|
*/
|
|
674
|
-
|
|
675
|
-
//
|
|
676
|
-
let value = this.
|
|
677
|
-
//
|
|
678
|
-
if (value === undefined) {
|
|
679
|
-
|
|
687
|
+
getTranslationByKey(key, locale = this.locale) {
|
|
688
|
+
// 1) 精确匹配当前 locale
|
|
689
|
+
let value = this.findInAllTranslations(key, locale);
|
|
690
|
+
// 2) 宽松匹配当前 locale(如 zh-CN -> zh)
|
|
691
|
+
if (value === undefined && this.options.loose) {
|
|
692
|
+
const loose = getLooseLocale(locale);
|
|
693
|
+
if (loose !== locale) {
|
|
694
|
+
value = this.findInAllTranslations(key, loose);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
// 3) 回退到 fallbackLocale
|
|
698
|
+
if (value === undefined && locale !== this.options.fallbackLocale) {
|
|
699
|
+
const fb = this.options.fallbackLocale;
|
|
700
|
+
value = this.findInAllTranslations(key, fb);
|
|
701
|
+
// 4) 宽松匹配回退 locale
|
|
702
|
+
if (value === undefined && this.options.loose) {
|
|
703
|
+
const fbLoose = getLooseLocale(fb);
|
|
704
|
+
if (fbLoose !== fb) {
|
|
705
|
+
value = this.findInAllTranslations(key, fbLoose);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
680
708
|
}
|
|
681
709
|
return value ?? key;
|
|
682
710
|
}
|
|
683
711
|
/**
|
|
684
|
-
*
|
|
712
|
+
* 在所有翻译源中查找键值
|
|
713
|
+
*/
|
|
714
|
+
findInAllTranslations(key, locale) {
|
|
715
|
+
// 远程翻译优先级更高
|
|
716
|
+
return (this.findInTranslationsList(key, locale, this.remoteTranslationsList) ??
|
|
717
|
+
this.findInTranslationsList(key, locale, this.translationsList));
|
|
718
|
+
}
|
|
719
|
+
/**
|
|
720
|
+
* 在翻译列表中查找键值
|
|
685
721
|
*/
|
|
686
|
-
|
|
687
|
-
if (!translationsList
|
|
722
|
+
findInTranslationsList(key, locale, translationsList) {
|
|
723
|
+
if (!translationsList?.length)
|
|
688
724
|
return undefined;
|
|
689
|
-
|
|
690
|
-
// 从后往前遍历(后加入的优先级更高)
|
|
725
|
+
// 后加入的优先级更高
|
|
691
726
|
for (let i = translationsList.length - 1; i >= 0; i--) {
|
|
692
|
-
const value = this.
|
|
693
|
-
if (value !== undefined)
|
|
727
|
+
const value = this.findInTranslation(key, locale, translationsList[i]);
|
|
728
|
+
if (value !== undefined)
|
|
694
729
|
return value;
|
|
695
|
-
}
|
|
696
730
|
}
|
|
697
731
|
return undefined;
|
|
698
732
|
}
|
|
699
733
|
/**
|
|
700
|
-
*
|
|
734
|
+
* 在单个翻译对象中查找键值
|
|
701
735
|
*/
|
|
702
|
-
|
|
703
|
-
const
|
|
704
|
-
|
|
705
|
-
if (translationValue === undefined) {
|
|
736
|
+
findInTranslation(key, locale, translations) {
|
|
737
|
+
const localeData = translations[locale];
|
|
738
|
+
if (!localeData)
|
|
706
739
|
return undefined;
|
|
707
|
-
|
|
708
|
-
// 获取翻译值,支持扁平和嵌套两种结构
|
|
709
|
-
const value = this.getTranslationFromSource(translationValue, key);
|
|
710
|
-
// 如果找到值(包括null值),则处理并返回
|
|
740
|
+
const value = get(localeData, key);
|
|
711
741
|
if (value !== undefined) {
|
|
712
742
|
this.validateTranslationValue(value, locale, key);
|
|
713
|
-
|
|
714
|
-
return value === null ? 'null' : String(value);
|
|
715
|
-
}
|
|
716
|
-
// 如果在当前语言的翻译值中找不到key,但这不是fallback语言,尝试fallback
|
|
717
|
-
if (locale !== this.options.fallbackLocale) {
|
|
718
|
-
const fallbackTranslationValue = this.getTranslationValue(translations, this.options.fallbackLocale);
|
|
719
|
-
if (fallbackTranslationValue !== undefined) {
|
|
720
|
-
const fallbackValue = this.getTranslationFromSource(fallbackTranslationValue, key);
|
|
721
|
-
if (fallbackValue !== undefined) {
|
|
722
|
-
this.validateTranslationValue(fallbackValue, this.options.fallbackLocale, key);
|
|
723
|
-
return fallbackValue === null ? 'null' : String(fallbackValue);
|
|
724
|
-
}
|
|
725
|
-
}
|
|
743
|
+
return value == null ? '' : String(value);
|
|
726
744
|
}
|
|
727
745
|
return undefined;
|
|
728
746
|
}
|
|
729
747
|
/**
|
|
730
|
-
*
|
|
731
|
-
* @param source - 翻译源对象
|
|
732
|
-
* @param key - 翻译键(如 'a.b.c')
|
|
733
|
-
* @returns 翻译值或undefined
|
|
748
|
+
* 从Translation对象中获取翻译值(支持宽松匹配和回退逻辑)
|
|
734
749
|
*/
|
|
735
|
-
|
|
736
|
-
if (!source
|
|
750
|
+
getTranslationByObject(source, locale = this.locale) {
|
|
751
|
+
if (!source)
|
|
737
752
|
return undefined;
|
|
753
|
+
// 1) 精确匹配当前 locale
|
|
754
|
+
if (has(source, locale)) {
|
|
755
|
+
return source[locale];
|
|
738
756
|
}
|
|
739
|
-
//
|
|
740
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
741
|
-
return source[key];
|
|
742
|
-
}
|
|
743
|
-
// 2. 再尝试嵌套结构:使用lodash.get按路径查找 a.b.c
|
|
744
|
-
const nestedValue = get(source, key);
|
|
745
|
-
if (nestedValue !== undefined) {
|
|
746
|
-
return nestedValue;
|
|
747
|
-
}
|
|
748
|
-
return undefined;
|
|
749
|
-
}
|
|
750
|
-
/**
|
|
751
|
-
* 获取指定语言的翻译值(处理loose模式和fallback逻辑)
|
|
752
|
-
*/
|
|
753
|
-
getTranslationValue(source, locale = this.locale) {
|
|
754
|
-
if (!source) {
|
|
755
|
-
return undefined;
|
|
756
|
-
}
|
|
757
|
-
// 1. 首先检查精确匹配的键是否存在
|
|
758
|
-
if (Object.prototype.hasOwnProperty.call(source, locale)) {
|
|
759
|
-
return source[locale]; // 返回实际值,可能是null、undefined或其他值
|
|
760
|
-
}
|
|
761
|
-
// 2. 如果启用了宽松模式,尝试宽松匹配
|
|
757
|
+
// 2) 宽松匹配当前 locale(如 zh-CN -> zh)
|
|
762
758
|
if (this.options.loose) {
|
|
763
|
-
const
|
|
764
|
-
if (
|
|
765
|
-
return
|
|
759
|
+
const loose = getLooseLocale(locale);
|
|
760
|
+
if (loose !== locale && has(source, loose)) {
|
|
761
|
+
return source[loose];
|
|
766
762
|
}
|
|
767
763
|
}
|
|
768
|
-
// 3
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
return source[this.options.fallbackLocale];
|
|
773
|
-
}
|
|
774
|
-
// 如果启用了宽松模式,也对fallback语言进行宽松匹配
|
|
775
|
-
if (this.options.loose) {
|
|
776
|
-
const fallbackLooseValue = this.getLooseTranslationValue(source, this.options.fallbackLocale);
|
|
777
|
-
if (fallbackLooseValue !== undefined) {
|
|
778
|
-
return fallbackLooseValue;
|
|
779
|
-
}
|
|
780
|
-
}
|
|
764
|
+
// 3) 回退到 fallbackLocale
|
|
765
|
+
const fb = this.options.fallbackLocale;
|
|
766
|
+
if (fb !== locale && has(source, fb)) {
|
|
767
|
+
return source[fb];
|
|
781
768
|
}
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
const looseLocale = this.extractLooseLocale(locale);
|
|
789
|
-
if (locale === looseLocale) {
|
|
790
|
-
// 寻找匹配的宽松语言
|
|
791
|
-
const matchedEntry = Object.entries(source).find(([key]) => looseLocale === this.extractLooseLocale(key));
|
|
792
|
-
return matchedEntry?.[1];
|
|
793
|
-
}
|
|
794
|
-
// 检查宽松语言键是否存在
|
|
795
|
-
if (Object.prototype.hasOwnProperty.call(source, looseLocale)) {
|
|
796
|
-
return source[looseLocale];
|
|
769
|
+
// 4) 宽松匹配回退 locale
|
|
770
|
+
if (this.options.loose) {
|
|
771
|
+
const fbLoose = getLooseLocale(fb);
|
|
772
|
+
if (fbLoose !== fb && has(source, fbLoose)) {
|
|
773
|
+
return source[fbLoose];
|
|
774
|
+
}
|
|
797
775
|
}
|
|
798
776
|
return undefined;
|
|
799
777
|
}
|
|
800
|
-
/**
|
|
801
|
-
* 提取宽松语言代码(如:zh-CN -> zh)
|
|
802
|
-
*/
|
|
803
|
-
extractLooseLocale(locale) {
|
|
804
|
-
return head(locale.split(/[_-]/)) || locale;
|
|
805
|
-
}
|
|
806
778
|
/**
|
|
807
779
|
* 验证翻译值(开发模式)
|
|
808
780
|
*/
|
|
@@ -821,7 +793,7 @@ export class TranslateService {
|
|
|
821
793
|
return;
|
|
822
794
|
}
|
|
823
795
|
Object.entries(translation).forEach(([key, value]) => {
|
|
824
|
-
if (!
|
|
796
|
+
if (!has(prevTranslation, key)) {
|
|
825
797
|
return;
|
|
826
798
|
}
|
|
827
799
|
const prevValue = prevTranslation[key];
|
|
@@ -866,4 +838,4 @@ __decorate([
|
|
|
866
838
|
type: Inject,
|
|
867
839
|
args: [TRANSLATIONS]
|
|
868
840
|
}] }], { locale$: [] }); })();
|
|
869
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvdHJhbnNsYXRlL3RyYW5zbGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBRVYsUUFBUSxFQUNSLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckQsT0FBTyxFQUNMLFVBQVUsRUFDVixPQUFPLEVBQ1AsUUFBUSxFQUNSLFVBQVUsRUFDVixLQUFLLEVBQ0wsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBQ1IsR0FBRyxFQUNILFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHdCQUF3QixFQUN4QixjQUFjLEdBQ2YsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxD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O3VCQUFDLFlBQVk7cUJBaEJ6QixPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBtb2R1bGUgdHJhbnNsYXRlXG4gKi9cblxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gIEluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgaXNEZXZNb2RlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEludGxNZXNzYWdlRm9ybWF0IH0gZnJvbSAnaW50bC1tZXNzYWdlZm9ybWF0JztcbmltcG9ydCB7IGdldCwgaGVhZCwgaXNQbGFpbk9iamVjdCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBmb3JrSm9pbixcbiAgdGhyb3dFcnJvcixcbiAgRU1QVFksXG4gIGNhdGNoRXJyb3IsXG4gIGZpbHRlcixcbiAgZmluYWxpemUsXG4gIG1hcCxcbiAgdGFrZVVudGlsLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGFqYXggfSBmcm9tICdyeGpzL2FqYXgnO1xuXG5pbXBvcnQgeyBBUElfR0FURVdBWSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlSW5wdXQsIFRPS0VOX0JBU0VfSFJFRiB9IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBpc0Fic29sdXRlVXJsIH0gZnJvbSAnLi4vY29yZS91dGlscy9jb21tb24nO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICcuLi9jb3JlL3V0aWxzL3lhbWwnO1xuXG5pbXBvcnQge1xuICBGQUxMQkFDS19MQU5HVUFHRSxcbiAgTE9DQUxFX1BMQUNFSE9MREVSX1JFR0VYLFxuICBMT0NBTEVfU1RPUkFHRSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0VXNlckxhbmd1YWdlIH0gZnJvbSAnLi9pMThuLWNvbmZpZyc7XG5pbXBvcnQgeyBUUkFOU0xBVEVfT1BUSU9OUywgVFJBTlNMQVRJT05TIH0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHtcbiAgVHJhbnNsYXRlS2V5LFxuICBUcmFuc2xhdGVPcHRpb25zLFxuICBUcmFuc2xhdGlvbixcbiAgVHJhbnNsYXRpb25WYWx1ZSxcbiAgVHJhbnNsYXRpb25zLFxuICBUZW1wbGF0ZURhdGEsXG4gIEljdURhdGEsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIOWbvemZheWMlue/u+ivkeacjeWKoVxuICpcbiAqIOeJueaAp++8mlxuICogLSDmlK/mjIHlpJrlsYLnuqfnv7vor5HkvJjlhYjnuqfvvIjov5znqIvnv7vor5EgPiDmiYvliqjmt7vliqDnv7vor5EgPiDphY3nva7nv7vor5HvvIlcbiAqIC0g5pSv5oyB5Yqo5oCB6K+t6KiA5YiH5o2iXG4gKiAtIOaUr+aMgSBJQ1UgTWVzc2FnZSBGb3JtYXQg5qih5p2/5o+S5YC8XG4gKiAtIOaUr+aMgeWuveadvuaooeW8j+ivreiogOWMuemFjVxuICogLSDmlK/mjIHlvILmraXov5znqIvnv7vor5HliqDovb1cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGVTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqIOe/u+ivkea3u+WKoOmAmuefpea1gSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0aW9uc0FkZGVkJCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IHRyYW5zbGF0aW9uc0FkZGVkJCA9IHRoaXMudHJhbnNsYXRpb25zQWRkZWQkJC5hc09ic2VydmFibGUoKTtcblxuICAvKiog57uE5Lu26ZSA5q+B6YCa55+l5rWBICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiog5pys5Zyw57+76K+R5YiX6KGo77yI5LyY5YWI57qn77ya5ZCO5Yqg5YWl55qE5LyY5YWI57qn5pu06auY77yJICovXG4gIHJlYWRvbmx5IHRyYW5zbGF0aW9uc0xpc3Q6IEFycmF5PFJlYWRvbmx5PFRyYW5zbGF0aW9ucz4+ID0gW107XG5cbiAgLyoqIOi/nOeoi+e/u+ivkeWIl+ihqO+8iOS8mOWFiOe6p+acgOmrmO+8iSAqL1xuICByZWFkb25seSByZW1vdGVUcmFuc2xhdGlvbnNMaXN0OiBBcnJheTxSZWFkb25seTxUcmFuc2xhdGlvbnM+PiA9IFtdO1xuXG4gIC8qKiDnv7vor5HphY3nva7pgInpobkgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogVHJhbnNsYXRlT3B0aW9ucztcblxuICAvKiog5b2T5YmN6K+t6KiA546v5aKDICovXG4gIGxvY2FsZTogc3RyaW5nO1xuXG4gIC8qKiDlvZPliY3or63oqIDnjq/looPvvIjlk43lupTlvI/vvIkgKi9cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHJlYWRvbmx5IGxvY2FsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICAvKiog6I635Y+W5pSv5oyB55qE6K+t6KiA5YiX6KGoICovXG4gIGdldCBsb2NhbGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxvY2FsZXM7XG4gIH1cblxuICAvKiog6I635Y+W5Zue6YCA6K+t6KiAICovXG4gIGdldCBmYWxsYmFja0xvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMb2NhbGU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdChUT0tFTl9CQVNFX0hSRUYpIHByaXZhdGUgcmVhZG9ubHkgYmFzZUhyZWY6IHN0cmluZyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRSQU5TTEFURV9PUFRJT05TKSBvcHRpb25zOiBUcmFuc2xhdGVPcHRpb25zLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVFJBTlNMQVRJT05TKSB0cmFuc2xhdGlvbkxpc3Q6IFRyYW5zbGF0aW9uc1tdLFxuICApIHtcbiAgICAvLyDliJ3lp4vljJbor63oqIDnjq/looNcbiAgICB0aGlzLmxvY2FsZSA9IHRoaXMuZ2V0SW5pdGlhbExvY2FsZShvcHRpb25zKTtcblxuICAgIC8vIOWIneWni+WMlumFjee9rumAiemhuVxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxvY2FsZXM6IFt0aGlzLmxvY2FsZV0sXG4gICAgICBmYWxsYmFja0xvY2FsZTogRkFMTEJBQ0tfTEFOR1VBR0UsXG4gICAgICBsb29zZTogZmFsc2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyDliJ3lp4vljJbnv7vor5HliJfooahcbiAgICB0aGlzLnRyYW5zbGF0aW9uc0xpc3QgPSB0aGlzLmdldEluaXRpYWxpemVUcmFuc2xhdGlvbnMoXG4gICAgICBvcHRpb25zLFxuICAgICAgdHJhbnNsYXRpb25MaXN0LFxuICAgICk7XG5cbiAgICAvLyDliqDovb3ov5znqIvnv7vor5FcbiAgICB0aGlzLmxvYWRSZW1vdGVUcmFuc2xhdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog57uE5Lu26ZSA5q+B5riF55CGXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JCQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnv7vor5HmlofmnKzlubbov5vooYzmqKHmnb/mj5LlgLxcbiAgICog6Ieq5Yqo5bCG5Lyg57ufIHt7IGtleSB9fSDor63ms5XovazmjaLkuLogSUNVIHtrZXl9IOagvOW8j+i/m+ihjOino+aekFxuICAgKiDlkIzml7bmlK/mjIHljp/nlJ8gSUNVIE1lc3NhZ2UgRm9ybWF0IOivreazlVxuICAgKiBAcGFyYW0ga2V5IC0g57+76K+R6ZSu5oiW57+76K+R5a+56LGhXG4gICAqIEBwYXJhbSBkYXRhIC0g5qih5p2/5pWw5o2u77yI5pSv5oyB5Z+65pys57G75Z6L44CBRGF0ZeOAgeWvueixoeWSjOaVsOe7hO+8iVxuICAgKiBAcmV0dXJucyDnv7vor5HlkI7nmoTmlofmnKxcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyDlr7nosaHlj4LmlbDvvIjmjqjojZDvvIlcbiAgICogdHJhbnNsYXRlLmdldCgnaGVsbG8nLCB7IG5hbWU6ICdXb3JsZCcgfSkgLy8g5qih5p2/OiBcIkhlbGxvIHtuYW1lfVwiXG4gICAqXG4gICAqIC8vIOWfuuacrOexu+Wei+WPguaVsO+8iOiHquWKqOi9rOaNouS4uiB7dmFsdWV977yJXG4gICAqIHRyYW5zbGF0ZS5nZXQoJ3dlbGNvbWUnLCAnSm9obicpIC8vIOaooeadvzogXCJXZWxjb21lIHt2YWx1ZX1cIlxuICAgKlxuICAgKiAvLyBJQ1Ug5qC85byP77yI5pWw5a2X77yJXG4gICAqIHRyYW5zbGF0ZS5nZXQoJ2l0ZW1Db3VudCcsIHsgY291bnQ6IDUgfSlcbiAgICpcbiAgICogLy8gSUNVIOagvOW8j++8iOaXpeacn++8jOm7mOiupOacrOWcsOWMlu+8iVxuICAgKiB0cmFuc2xhdGUuZ2V0KCdjcmVhdGVkQXQnLCB7IGRhdGU6IG5ldyBEYXRlKCkgfSlcbiAgICogYGBgXG4gICAqL1xuICBnZXQoa2V5OiBUcmFuc2xhdGVLZXksIGRhdGE/OiBUZW1wbGF0ZURhdGEpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5nZXRSYXcoa2V5KTtcblxuICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8g5bCG5Lyg57uf55qEIHt7IGtleSB9fSDor63ms5XovazmjaLkuLogSUNVIHtrZXl9IOagvOW8j1xuICAgICAgY29uc3QgaWN1TWVzc2FnZSA9IHRoaXMuY29udmVydFRvSWN1Rm9ybWF0KHRyYW5zbGF0aW9uKTtcbiAgICAgIC8vIOWwhuaVsOaNrui9rOaNouS4uiBJQ1Ug5YW85a6555qE5qC85byPXG4gICAgICBjb25zdCBpY3VEYXRhID0gdGhpcy5ub3JtYWxpemVBbmRDb252ZXJ0VG9JY3VEYXRhKGRhdGEpO1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0SWN1TWVzc2FnZShpY3VNZXNzYWdlLCBpY3VEYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5oYW5kbGVUZW1wbGF0ZUVycm9yKGtleSwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bljp/lp4vnv7vor5HmlofmnKzmqKHmnb/vvIjkuI3ov5vooYzmj5LlgLzlpITnkIbvvIlcbiAgICogQHBhcmFtIGtleSAtIOe/u+ivkemUruaIlue/u+ivkeWvueixoVxuICAgKiBAcmV0dXJucyDljp/lp4vnv7vor5HmqKHmnb/mlofmnKxcbiAgICovXG4gIGdldFJhdyhrZXk6IFRyYW5zbGF0ZUtleSk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvbkJ5S2V5KGtleSk7XG4gICAgfVxuXG4gICAgLy8g5b2Ta2V55pivVHJhbnNsYXRpb27lr7nosaHml7bvvIzojrflj5blvZPliY3or63oqIDnmoTnv7vor5HlgLxcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VHJhbnNsYXRpb25CeU9iamVjdChrZXkpO1xuXG4gICAgLy8g5aaC5p6c5om+5Yiw5YC85YiZ6L+U5Zue5a2X56ym5Liy5b2i5byP77yM5ZCm5YiZ6L+U5ZueSlNPTuWtl+espuS4suihqOekulxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8vIOWmguaenOayoeacieaJvuWIsOe/u+ivke+8jOi/lOWbnkpTT07lrZfnrKbkuLLlvaLlvI9cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliIfmjaLliLDkuIvkuIDkuKrmlK/mjIHnmoTor63oqIDnjq/looNcbiAgICovXG4gIHRvZ2dsZUxvY2FsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLm9wdGlvbnMubG9jYWxlcy5pbmRleE9mKHRoaXMubG9jYWxlKTtcblxuICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmhhbmRsZUludmFsaWRMb2NhbGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0SW5kZXggPSAoY3VycmVudEluZGV4ICsgMSkgJSB0aGlzLm9wdGlvbnMubG9jYWxlcy5sZW5ndGg7XG4gICAgY29uc3QgbmV4dExvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGVzW25leHRJbmRleF07XG5cbiAgICBpZiAobmV4dExvY2FsZSAmJiBuZXh0TG9jYWxlICE9PSB0aGlzLmxvY2FsZSkge1xuICAgICAgdGhpcy5zZXRMb2NhbGUobmV4dExvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruW9k+WJjeivreiogOeOr+Wig1xuICAgKiBAcGFyYW0gbG9jYWxlIC0g6KaB6K6+572u55qE6K+t6KiA546v5aKDXG4gICAqL1xuICBzZXRMb2NhbGUobG9jYWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZExvY2FsZShsb2NhbGUpKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBJbnZhbGlkIGxvY2FsZTogJHtsb2NhbGV9LiBTdXBwb3J0ZWQgbG9jYWxlczogJHt0aGlzLm9wdGlvbnMubG9jYWxlcy5qb2luKCcsICcpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTE9DQUxFX1NUT1JBR0UsIGxvY2FsZSk7XG4gICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gIH1cblxuICAvKipcbiAgICog5omL5Yqo5re75Yqg57+76K+R5YyFXG4gICAqIEBwYXJhbSB0cmFuc2xhdGlvbnMgLSDopoHmt7vliqDnmoTnv7vor5HljIVcbiAgICovXG4gIGFkZFRyYW5zbGF0aW9ucyh0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdHJhbnNsYXRpb25zIHx8IHR5cGVvZiB0cmFuc2xhdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIHRyYW5zbGF0aW9ucyBvYmplY3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDlvIDlj5HmqKHlvI/kuIvmo4Dmn6Xph43lpI3nv7vor5FcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgdGhpcy50cmFuc2xhdGlvbnNMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY2hlY2tGb3JEdXBsaWNhdGVUcmFuc2xhdGlvbnModHJhbnNsYXRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zbGF0aW9uc0xpc3QucHVzaCh0cmFuc2xhdGlvbnMpO1xuICAgIHRoaXMudHJhbnNsYXRpb25zQWRkZWQkJC5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICog5re75Yqg6L+c56iL57+76K+R5YyFXG4gICAqIEBwYXJhbSByZW1vdGVVcmwgLSDov5znqIvnv7vor5Hmlofku7ZVUkxcbiAgICovXG4gIGFkZFJlbW90ZVRyYW5zbGF0aW9ucyhyZW1vdGVVcmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcmVtb3RlVXJsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFVybCA9IHRoaXMubm9ybWFsaXplUmVtb3RlVXJsKHJlbW90ZVVybCk7XG4gICAgY29uc3QgcmVxdWVzdCQgPSB0aGlzLmNyZWF0ZVJlbW90ZVRyYW5zbGF0aW9uUmVxdWVzdChub3JtYWxpemVkVXJsKTtcblxuICAgIHJlcXVlc3QkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25zQWRkZWQkJC5uZXh0KCk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IHJlbW90ZVRyYW5zbGF0aW9ucyA9PiB7XG4gICAgICAgICAgaWYgKHJlbW90ZVRyYW5zbGF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdGVUcmFuc2xhdGlvbnNMaXN0LnB1c2gocmVtb3RlVHJhbnNsYXRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcmVtb3RlIHRyYW5zbGF0aW9ucyBmcm9tICR7cmVtb3RlVXJsfTpgLFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5LuO6L+c56iLVVJM6I635Y+W57+76K+R5pWw5o2uXG4gICAqIEBwYXJhbSByZW1vdGVVcmwgLSDov5znqItVUkxcbiAgICogQHBhcmFtIGxvY2FsZSAtIOWPr+mAieeahOivreiogOeOr+Wig++8iOeUqOS6jlVSTOaooeadv+abv+aNou+8iVxuICAgKiBAcmV0dXJucyDnv7vor5HmlbDmja7nmoRPYnNlcnZhYmxlXG4gICAqL1xuICBmZXRjaFRyYW5zbGF0aW9uKHJlbW90ZVVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUcmFuc2xhdGlvbnM+O1xuICBmZXRjaFRyYW5zbGF0aW9uKHJlbW90ZVVybDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyk6IE9ic2VydmFibGU8VHJhbnNsYXRpb24+O1xuICBmZXRjaFRyYW5zbGF0aW9uKFxuICAgIHJlbW90ZVVybDogc3RyaW5nLFxuICAgIGxvY2FsZT86IHN0cmluZyxcbiAgKTogT2JzZXJ2YWJsZTxUcmFuc2xhdGlvbnMgfCBUcmFuc2xhdGlvbj4ge1xuICAgIHRoaXMudmFsaWRhdGVGZXRjaFRyYW5zbGF0aW9uUGFyYW1zKHJlbW90ZVVybCwgbG9jYWxlKTtcblxuICAgIGNvbnN0IHRhcmdldFVybCA9IGxvY2FsZVxuICAgICAgPyByZW1vdGVVcmwucmVwbGFjZShMT0NBTEVfUExBQ0VIT0xERVJfUkVHRVgsIGxvY2FsZSlcbiAgICAgIDogcmVtb3RlVXJsO1xuXG4gICAgcmV0dXJuIHRoaXMucGVyZm9ybVRyYW5zbGF0aW9uUmVxdWVzdCh0YXJnZXRVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWIneWni+ivreiogOeOr+Wig1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbml0aWFsTG9jYWxlKG9wdGlvbnM6IFRyYW5zbGF0ZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBvcHRpb25zPy5sb2NhbGUgfHwgZ2V0VXNlckxhbmd1YWdlKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Yid5aeL57+76K+R5YiX6KGoXG4gICAqL1xuICBwcml2YXRlIGdldEluaXRpYWxpemVUcmFuc2xhdGlvbnMoXG4gICAgb3B0aW9uczogVHJhbnNsYXRlT3B0aW9ucyxcbiAgICB0cmFuc2xhdGlvbkxpc3Q6IFRyYW5zbGF0aW9uc1tdLFxuICApOiBUcmFuc2xhdGlvbnNbXSB7XG4gICAgcmV0dXJuIFtvcHRpb25zPy50cmFuc2xhdGlvbnMsIC4uLih0cmFuc2xhdGlvbkxpc3QgfHwgW10pXS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICAvKipcbiAgICog5Yqg6L296L+c56iL57+76K+RXG4gICAqL1xuICBwcml2YXRlIGxvYWRSZW1vdGVUcmFuc2xhdGlvbnMob3B0aW9uczogVHJhbnNsYXRlT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghb3B0aW9ucz8ucmVtb3RlVXJsKSByZXR1cm47XG5cbiAgICBjb25zdCB1cmxzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLnJlbW90ZVVybClcbiAgICAgID8gb3B0aW9ucy5yZW1vdGVVcmxcbiAgICAgIDogW29wdGlvbnMucmVtb3RlVXJsXTtcblxuICAgIHVybHMuZm9yRWFjaCh1cmwgPT4gdGhpcy5hZGRSZW1vdGVUcmFuc2xhdGlvbnModXJsKSk7XG4gIH1cblxuICAvKipcbiAgICog6L2s5o2i5qih5p2/5pWw5o2u5Li6IElDVSDlhbzlrrnmoLzlvI9cbiAgICogQHBhcmFtIGRhdGEgLSDmqKHmnb/mlbDmja5cbiAgICogQHJldHVybnMgSUNVIOWFvOWuueeahOaVsOaNruWvueixoVxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVBbmRDb252ZXJ0VG9JY3VEYXRhKGRhdGE6IFRlbXBsYXRlRGF0YSk6IEljdURhdGEge1xuICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzmmK/nuq/lr7nosaHvvIznm7TmjqXovazmjaLlhbblsZ7mgKdcbiAgICBpZiAodGhpcy5pc1BsYWluVGVtcGxhdGVPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRPYmplY3RUb0ljdURhdGEoZGF0YSk7XG4gICAgfVxuXG4gICAgLy8g5Z+65pys57G75Z6L44CB5pWw57uE44CBRGF0ZeetieWMheijheS4uiB7IHZhbHVlOiBkYXRhIH1cbiAgICByZXR1cm4geyB2YWx1ZTogdGhpcy5jb252ZXJ0VmFsdWVUb0ljdVZhbHVlKGRhdGEpIH07XG4gIH1cblxuICAvKipcbiAgICog5qOA5p+l5piv5ZCm5Li657qv5qih5p2/5a+56LGh77yI5LiN5piv5pWw57uE44CBRGF0ZeetieeJueauiuWvueixoe+8iVxuICAgKi9cbiAgcHJpdmF0ZSBpc1BsYWluVGVtcGxhdGVPYmplY3QoXG4gICAgZGF0YTogVGVtcGxhdGVEYXRhLFxuICApOiBkYXRhIGlzIFJlY29yZDxzdHJpbmcsIFRlbXBsYXRlRGF0YT4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIGRhdGEgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICAhKGRhdGEgaW5zdGFuY2VvZiBEYXRlKSAmJlxuICAgICAgZGF0YS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDovazmjaLlr7nosaHnmoTmiYDmnInlsZ7mgKfkuLogSUNVIOWFvOWuueWAvFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0T2JqZWN0VG9JY3VEYXRhKG9iajogUmVjb3JkPHN0cmluZywgVGVtcGxhdGVEYXRhPik6IEljdURhdGEge1xuICAgIGNvbnN0IHJlc3VsdDogSWN1RGF0YSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmNvbnZlcnRWYWx1ZVRvSWN1VmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog5bCG5Y2V5Liq5YC86L2s5o2i5Li6IElDVSDlhbzlrrnnsbvlnotcbiAgICog5oyJ54WnIElDVSBNZXNzYWdlRm9ybWF0IOinhOiMg++8jOWPquaUr+aMgSBzdHJpbmcgfCBudW1iZXIgfCBEYXRlXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRWYWx1ZVRvSWN1VmFsdWUodmFsdWU6IFRlbXBsYXRlRGF0YSk6IHN0cmluZyB8IG51bWJlciB8IERhdGUge1xuICAgIC8vIElDVSDljp/nlJ/mlK/mjIHnmoTnsbvlnovnm7TmjqXov5Tlm55cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIOWFtuS7luexu+Wei+i9rOS4uuWtl+espuS4slxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyDnroDljZXmlbDnu4TovazkuLrpgJflj7fliIbpmpTnmoTlrZfnrKbkuLJcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoaXRlbSA9PiBTdHJpbmcoaXRlbSA/PyAnJykpLmpvaW4oJywgJyk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJ251bGwnO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8g5a+56LGh6L2s5Li6IEpTT04g5a2X56ym5LiyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICog5aSE55CG5qih5p2/6ZSZ6K+vXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVRlbXBsYXRlRXJyb3Ioa2V5OiBUcmFuc2xhdGVLZXksIGVycm9yOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBrZXlTdHIgPSB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyA/IGtleSA6ICdbb2JqZWN0XSc7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBUaGUgdHJhbnNsYXRpb24ga2V5ICcke2tleVN0cn0nIGlzIG1pc3NpbmcgdGhlIG5lY2Vzc2FyeSBwYXJhbWV0ZXJzLmA7XG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIGVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5bCG5Lyg57uf55qEIHt7IGtleSB9fSDor63ms5XovazmjaLkuLogSUNVIHtrZXl9IOagvOW8j1xuICAgKiDlkIzml7bkv53mjIHlt7LmnInnmoQgSUNVIOagvOW8j+S4jeWPmFxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIOWOn+Wni+a2iOaBr+aooeadv1xuICAgKiBAcmV0dXJucyDovazmjaLlkI7nmoQgSUNVIOagvOW8j+a2iOaBr1xuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0VG9JY3VGb3JtYXQobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyDlsIYge3sga2V5IH19IOi9rOaNouS4uiB7a2V5fVxuICAgIC8vIOaUr+aMgeepuuagvO+8mnt7IGtleSB9fSAtPiB7a2V5fe+8jOS9huWOu+aOieWGhemDqOeahOepuuagvFxuICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UoL1xce1xceyhbXn1dKylcXH1cXH0vZywgKF8sIGNvbnRlbnQpID0+IHtcbiAgICAgIHJldHVybiBgeyR7Y29udGVudC50cmltKCl9fWA7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5L2/55SoIElDVSBtZXNzYWdlIGZvcm1hdCDmoLzlvI/ljJbmlofmnKxcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0SWN1TWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIGljdURhdGE6IEljdURhdGEpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtZXNzYWdlRm9ybWF0ID0gbmV3IEludGxNZXNzYWdlRm9ybWF0KFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICB0aGlzLmxvY2FsZSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7IGlnbm9yZVRhZzogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBtZXNzYWdlRm9ybWF0LmZvcm1hdChpY3VEYXRhKSBhcyBzdHJpbmc7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYElDVSBtZXNzYWdlIGZvcm1hdHRpbmcgZmFpbGVkIGZvciBcIiR7bWVzc2FnZX1cIjpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgICAvLyDpmY3nuqflpITnkIbvvJrov5Tlm57ljp/lp4vmtojmga9cbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoLzlvI/ljJbmlbDlrZdcbiAgICogQHBhcmFtIHZhbHVlIC0g6KaB5qC85byP5YyW55qE5pWw5a2XXG4gICAqIEBwYXJhbSBvcHRpb25zIC0g5qC85byP5YyW6YCJ6aG5XG4gICAqIEByZXR1cm5zIOagvOW8j+WMluWQjueahOaVsOWtl+Wtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBmb3JtYXROdW1iZXIoMTIzNC41NikgLy8gXCIxLDIzNC41NlwiXG4gICAqIGZvcm1hdE51bWJlcigwLjg1LCB7IHN0eWxlOiAncGVyY2VudCcgfSkgLy8gXCI4NSVcIlxuICAgKiBmb3JtYXROdW1iZXIoMTIzNC41NiwgeyBzdHlsZTogJ2N1cnJlbmN5JywgY3VycmVuY3k6ICdDTlknIH0pIC8vIFwiwqUxLDIzNC41NlwiXG4gICAqL1xuICBmb3JtYXROdW1iZXIodmFsdWU6IG51bWJlciwgb3B0aW9uczogSW50bC5OdW1iZXJGb3JtYXRPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMubG9jYWxlLCBvcHRpb25zKS5mb3JtYXQodmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBOdW1iZXIgZm9ybWF0dGluZyBmYWlsZWQgZm9yIHZhbHVlICR7dmFsdWV9OmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoLzlvI/ljJbotKfluIFcbiAgICogQHBhcmFtIHZhbHVlIC0g6KaB5qC85byP5YyW55qE6YeR6aKdXG4gICAqIEBwYXJhbSBjdXJyZW5jeSAtIOi0p+W4geS7o+egge+8jOm7mOiupOS4uiBDTllcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDlhbbku5bmoLzlvI/ljJbpgInpoblcbiAgICogQHJldHVybnMg5qC85byP5YyW5ZCO55qE6LSn5biB5a2X56ym5LiyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGZvcm1hdEN1cnJlbmN5KDEyMzQuNTYpIC8vIGVuLVVTOiBcIkNOwqUxLDIzNC41NlwiLCB6aC1DTjogXCLCpTEsMjM0LjU2XCJcbiAgICogZm9ybWF0Q3VycmVuY3koMTIzNC41NiwgJ1VTRCcpIC8vIGVuLVVTOiBcIiQxLDIzNC41NlwiLCB6aC1DTjogXCJVUyQxLDIzNC41NlwiXG4gICAqL1xuICBmb3JtYXRDdXJyZW5jeShcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGN1cnJlbmN5OiBzdHJpbmcgPSAnQ05ZJyxcbiAgICBvcHRpb25zOiBPbWl0PEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucywgJ3N0eWxlJyB8ICdjdXJyZW5jeSc+ID0ge30sXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0TnVtYmVyKHZhbHVlLCB7XG4gICAgICBzdHlsZTogJ2N1cnJlbmN5JyxcbiAgICAgIGN1cnJlbmN5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLzlvI/ljJbnmb7liIbmr5RcbiAgICogQHBhcmFtIHZhbHVlIC0g6KaB5qC85byP5YyW55qE5YC877yIMC44NSDooajnpLogODUl77yJXG4gICAqIEBwYXJhbSBvcHRpb25zIC0g5qC85byP5YyW6YCJ6aG5XG4gICAqIEByZXR1cm5zIOagvOW8j+WMluWQjueahOeZvuWIhuavlOWtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBmb3JtYXRQZXJjZW50KDAuODUpIC8vIFwiODUlXCJcbiAgICogZm9ybWF0UGVyY2VudCgwLjg1NjcsIHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAyIH0pIC8vIFwiODUuNjclXCJcbiAgICovXG4gIGZvcm1hdFBlcmNlbnQoXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBvcHRpb25zOiBPbWl0PEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucywgJ3N0eWxlJz4gPSB7fSxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXROdW1iZXIodmFsdWUsIHtcbiAgICAgIHN0eWxlOiAncGVyY2VudCcsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOagvOW8j+WMluaXpeacn1xuICAgKiBAcGFyYW0gZGF0ZSAtIOimgeagvOW8j+WMlueahOaXpeacn1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zIOagvOW8j+mFjee9rlxuICAgKiBAcmV0dXJucyDmoLzlvI/ljJblkI7nmoTml6XmnJ/lrZfnrKbkuLJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogZm9ybWF0RGF0ZShuZXcgRGF0ZSgpKSAvLyBlbi1VUzogXCIwMS8wMS8yMDI1XCIsIHpoLUNOOiBcIjIwMjUvMDEvMDFcIlxuICAgKiBmb3JtYXREYXRlKG5ldyBEYXRlKCksIHsgZGF0ZVN0eWxlOiAnZnVsbCcgfSkgLy8gXCIyMDI05bm0OOaciDIw5pel5pif5pyf5LqMXCJcbiAgICogZm9ybWF0RGF0ZShuZXcgRGF0ZSgpLCB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICcyLWRpZ2l0JywgZGF5OiAnMi1kaWdpdCcgfSkgLy8g5qC55o2ubG9jYWxl5qC85byP5YyWXG4gICAqIGZvcm1hdERhdGUobmV3IERhdGUoKSwgeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycgfSkgLy8gXCIyMDI05bm0OOaciFwiXG4gICAqL1xuICBmb3JtYXREYXRlKFxuICAgIGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gICAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7XG4gICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgfSxcbiAgKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0ZU9iaiA9IG5ldyBEYXRlKGRhdGUpO1xuICAgICAgaWYgKGlzTmFOKGRhdGVPYmouZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0ZScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZUJ5T3B0aW9ucyhkYXRlT2JqLCBvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRGF0ZSBmb3JtYXR0aW5nIGZhaWxlZCBmb3IgZGF0ZSAke2RhdGV9OmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTdHJpbmcoZGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagvOW8j+WMluaXpeacn+WSjOaXtumXtFxuICAgKiBAcGFyYW0gZGF0ZSAtIOimgeagvOW8j+WMlueahOaXpeacn+aXtumXtFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zIOagvOW8j+mFjee9rlxuICAgKiBAcmV0dXJucyDmoLzlvI/ljJblkI7nmoTml6XmnJ/ml7bpl7TlrZfnrKbkuLJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogZm9ybWF0RGF0ZVRpbWUobmV3IERhdGUoKSkgLy8gZW4tVVM6IFwiMDEvMDEvMjAyNSwgMTQ6MzA6MDBcIiwgemgtQ046IFwiMjAyNS8wMS8wMSAxNDozMDowMFwiXG4gICAqIGZvcm1hdERhdGVUaW1lKG5ldyBEYXRlKCksIHsgZGF0ZVN0eWxlOiAnbWVkaXVtJywgdGltZVN0eWxlOiAnc2hvcnQnIH0pIC8vIFwiMjAyNOW5tDjmnIgyMOaXpSAxNDozMFwiXG4gICAqIGZvcm1hdERhdGVUaW1lKG5ldyBEYXRlKCksIHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJzItZGlnaXQnLCBkYXk6ICcyLWRpZ2l0JywgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0Jywgc2Vjb25kOiAnMi1kaWdpdCcsIGhvdXIxMjogZmFsc2UgfSkgLy8g5qC55o2ubG9jYWxl5qC85byP5YyWXG4gICAqL1xuICBmb3JtYXREYXRlVGltZShcbiAgICBkYXRlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICAgIG9wdGlvbnM6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0ge1xuICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgbW9udGg6ICcyLWRpZ2l0JyxcbiAgICAgIGRheTogJzItZGlnaXQnLFxuICAgICAgaG91cjogJzItZGlnaXQnLFxuICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICBzZWNvbmQ6ICcyLWRpZ2l0JyxcbiAgICAgIGhvdXIxMjogZmFsc2UsXG4gICAgfSxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlKGRhdGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOagvOW8j+WMluebuOWvueaXtumXtFxuICAgKiBAcGFyYW0gdmFsdWUgLSDml7bpl7Tlt67lgLzvvIjmlbDlrZfvvInmiJbml6XmnJ/lr7nosaFcbiAgICogQHBhcmFtIHVuaXQgLSDml7bpl7TljZXkvY3vvIjlvZN2YWx1ZeS4uuaVsOWtl+aXtuW/hemhu+aPkOS+m++8iVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOagvOW8j+WMlumAiemhuVxuICAgKiBAcmV0dXJucyDmoLzlvI/ljJblkI7nmoTnm7jlr7nml7bpl7TlrZfnrKbkuLJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8g5omL5Yqo5oyH5a6a5Y2V5L2NXG4gICAqIGZvcm1hdFJlbGF0aXZlVGltZSgtMSwgJ2RheScpIC8vIGVuLVVTOiBcInllc3RlcmRheVwiLCB6aC1DTjogXCLmmKjlpKlcIlxuICAgKiBmb3JtYXRSZWxhdGl2ZVRpbWUoMiwgJ2hvdXInKSAvLyBlbi1VUzogXCJpbiAyIGhvdXJzXCIsIHpoLUNOOiBcIjLlsI/ml7blkI5cIlxuICAgKiBmb3JtYXRSZWxhdGl2ZVRpbWUoLTMwLCAnbWludXRlJykgLy8gZW4tVVM6IFwiMzAgbWludXRlcyBhZ29cIiwgemgtQ046IFwiMzDliIbpkp/liY1cIlxuICAgKlxuICAgKiAvLyDoh6rliqjorqHnrpfljZXkvY1cbiAgICogZm9ybWF0UmVsYXRpdmVUaW1lKG5ldyBEYXRlKERhdGUubm93KCkgLSA2MDAwMCkpIC8vIFwiMSBtaW51dGUgYWdvXCJcbiAgICogZm9ybWF0UmVsYXRpdmVUaW1lKG5ldyBEYXRlKERhdGUubm93KCkgKyA3MjAwMDAwKSkgLy8gXCJpbiAyIGhvdXJzXCJcbiAgICogZm9ybWF0UmVsYXRpdmVUaW1lKG5ldyBEYXRlKERhdGUubm93KCkgLSA4NjQwMDAwMCkpIC8vIFwieWVzdGVyZGF5XCJcbiAgICovXG4gIGZvcm1hdFJlbGF0aXZlVGltZShcbiAgICB2YWx1ZTogRGF0ZSxcbiAgICBvcHRpb25zPzogSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRPcHRpb25zLFxuICApOiBzdHJpbmc7XG5cbiAgZm9ybWF0UmVsYXRpdmVUaW1lKFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgdW5pdDogSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRVbml0LFxuICAgIG9wdGlvbnM/OiBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdE9wdGlvbnMsXG4gICk6IHN0cmluZztcblxuICBmb3JtYXRSZWxhdGl2ZVRpbWUoXG4gICAgdmFsdWU6IG51bWJlciB8IERhdGUsXG4gICAgdW5pdE9yT3B0aW9ucz86XG4gICAgICB8IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0VW5pdFxuICAgICAgfCBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdE9wdGlvbnMsXG4gICAgb3B0aW9uczogSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRPcHRpb25zID0geyBudW1lcmljOiAnYXV0bycgfSxcbiAgKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgbGV0IGZpbmFsVmFsdWU6IG51bWJlcjtcbiAgICAgIGxldCBmaW5hbFVuaXQ6IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0VW5pdDtcbiAgICAgIGxldCBmaW5hbE9wdGlvbnM6IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucztcblxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAvLyDoh6rliqjorqHnrpfml7bpl7Tlt67lkozljZXkvY1cbiAgICAgICAgY29uc3QgeyB2YWx1ZTogY2FsY3VsYXRlZFZhbHVlLCB1bml0OiBjYWxjdWxhdGVkVW5pdCB9ID1cbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVJlbGF0aXZlVGltZSh2YWx1ZSk7XG4gICAgICAgIGZpbmFsVmFsdWUgPSBjYWxjdWxhdGVkVmFsdWU7XG4gICAgICAgIGZpbmFsVW5pdCA9IGNhbGN1bGF0ZWRVbml0O1xuICAgICAgICBmaW5hbE9wdGlvbnMgPVxuICAgICAgICAgICh1bml0T3JPcHRpb25zIGFzIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucykgfHwgb3B0aW9ucztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOS9v+eUqOaPkOS+m+eahOaVsOWAvOWSjOWNleS9jVxuICAgICAgICBmaW5hbFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGZpbmFsVW5pdCA9IHVuaXRPck9wdGlvbnMgYXMgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRVbml0O1xuICAgICAgICBmaW5hbE9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLCBmaW5hbE9wdGlvbnMpLmZvcm1hdChcbiAgICAgICAgZmluYWxWYWx1ZSxcbiAgICAgICAgZmluYWxVbml0LFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgUmVsYXRpdmUgdGltZSBmb3JtYXR0aW5nIGZhaWxlZCBmb3IgJHt2YWx1ZX06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZVxuICAgICAgICA/IHZhbHVlLnRvTG9jYWxlU3RyaW5nKHRoaXMubG9jYWxlKVxuICAgICAgICA6IGAke3ZhbHVlfWA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagueaNruaXpeacn+iuoeeul+ebuOWvueaXtumXtOW3ruWAvOWSjOacgOWQiOmAgueahOWNleS9jVxuICAgKiBAcGFyYW0gZGF0ZSAtIOebruagh+aXpeacn1xuICAgKiBAcmV0dXJucyDljIXlkKvml7bpl7Tlt67lgLzlkozljZXkvY3nmoTlr7nosaFcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlUmVsYXRpdmVUaW1lKGRhdGU6IERhdGUpOiB7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICB1bml0OiBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdFVuaXQ7XG4gIH0ge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgZGlmZk1zID0gZGF0ZS5nZXRUaW1lKCkgLSBub3cuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGFic0RpZmZNcyA9IE1hdGguYWJzKGRpZmZNcyk7XG5cbiAgICAvLyDml7bpl7TljZXkvY3pmIjlgLzvvIjmr6vnp5LvvIlcbiAgICBjb25zdCBNSU5VVEVfTVMgPSA2MCAqIDEwMDA7XG4gICAgY29uc3QgSE9VUl9NUyA9IDYwICogTUlOVVRFX01TO1xuICAgIGNvbnN0IERBWV9NUyA9IDI0ICogSE9VUl9NUztcblxuICAgIC8vIOagueaNruaXtumXtOW3rumAieaLqeWQiOmAgueahOWNleS9je+8jOacgOWkp+WNleS9jeS4umRheVxuICAgIGlmIChhYnNEaWZmTXMgPj0gREFZX01TKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogTWF0aC5yb3VuZChkaWZmTXMgLyBEQVlfTVMpLFxuICAgICAgICB1bml0OiAnZGF5JyxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChhYnNEaWZmTXMgPj0gSE9VUl9NUykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IE1hdGgucm91bmQoZGlmZk1zIC8gSE9VUl9NUyksXG4gICAgICAgIHVuaXQ6ICdob3VyJyxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChhYnNEaWZmTXMgPj0gTUlOVVRFX01TKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogTWF0aC5yb3VuZChkaWZmTXMgLyBNSU5VVEVfTVMpLFxuICAgICAgICB1bml0OiAnbWludXRlJyxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogTWF0aC5yb3VuZChkaWZmTXMgLyAxMDAwKSxcbiAgICAgIHVuaXQ6ICdzZWNvbmQnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5pel5pyf5qC85byP6YWN572u5qC85byP5YyW5pel5pyfXG4gICAqIOS9v+eUqOagh+WHhiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyDnoa7kv53moLzlvI/lj6/pooTmtYvmgKdcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0RGF0ZUJ5T3B0aW9ucyhcbiAgICBkYXRlOiBEYXRlLFxuICAgIG9wdGlvbnM6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zLFxuICApOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsIG9wdGlvbnMpLmZvcm1hdChkYXRlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRGF0ZSBmb3JtYXR0aW5nIGZhaWxlZDpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrov4flrZfnrKbkuLLplK7ojrflj5bnv7vor5FcbiAgICovXG4gIHByaXZhdGUgZ2V0VHJhbnNsYXRpb25CeUtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVRyYW5zbGF0aW9uKGtleSk7XG4gIH1cblxuICAvKipcbiAgICog6YCa6L+H57+76K+R5a+56LGh6I635Y+W57+76K+R5YC8XG4gICAqL1xuICBwcml2YXRlIGdldFRyYW5zbGF0aW9uQnlPYmplY3QoXG4gICAgdHJhbnNsYXRpb25PYmo6IFRyYW5zbGF0aW9uLFxuICApOiBUcmFuc2xhdGlvblZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvblZhbHVlKHRyYW5zbGF0aW9uT2JqLCB0aGlzLmxvY2FsZSk7XG4gIH1cblxuICAvKipcbiAgICog5aSE55CG5peg5pWI6K+t6KiA546v5aKDXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUludmFsaWRMb2NhbGUoKTogdm9pZCB7XG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgbG9jYWxlc2AgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIGNvcnJlY3RseScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpqozor4Hor63oqIDnjq/looPmmK/lkKbmnInmlYhcbiAgICovXG4gIHByaXZhdGUgaXNWYWxpZExvY2FsZShsb2NhbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9jYWxlcy5pbmNsdWRlcyhsb2NhbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOajgOafpemHjeWkjee/u+ivke+8iOW8gOWPkeaooeW8j++8iVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0ZvckR1cGxpY2F0ZVRyYW5zbGF0aW9ucyhuZXdUcmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9ucyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZXhpc3RpbmdUcmFuc2xhdGlvbnMgb2YgdGhpcy50cmFuc2xhdGlvbnNMaXN0KSB7XG4gICAgICBPYmplY3Qua2V5cyhuZXdUcmFuc2xhdGlvbnMpLmZvckVhY2gobG9jYWxlID0+IHtcbiAgICAgICAgaWYgKGV4aXN0aW5nVHJhbnNsYXRpb25zW2xvY2FsZV0pIHtcbiAgICAgICAgICB0aGlzLmNvbXBhcmVUcmFuc2xhdGlvbktleXMoXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICBuZXdUcmFuc2xhdGlvbnNbbG9jYWxlXSxcbiAgICAgICAgICAgIGV4aXN0aW5nVHJhbnNsYXRpb25zW2xvY2FsZV0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagh+WHhuWMlui/nOeoi1VSTFxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVSZW1vdGVVcmwocmVtb3RlVXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJlbW90ZVVybCA9IHRoaXMuY2xlYW5VcmwocmVtb3RlVXJsKTtcbiAgICBjb25zdCBpc0Fic29sdXRlID0gaXNBYnNvbHV0ZVVybChyZW1vdGVVcmwpO1xuICAgIGNvbnN0IGlzQXBpR2F0ZVdheVJlcXVlc3QgPSByZW1vdGVVcmwuc3RhcnRzV2l0aChBUElfR0FURVdBWSk7XG5cbiAgICAvLyDlvIDlj5HmqKHlvI/kuIvov5vooYxVUkzpqozor4FcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVSZW1vdGVVcmwocmVtb3RlVXJsLCBpc0Fic29sdXRlKTtcbiAgICB9XG5cbiAgICAvLyDnm7jlr7lVUkzovazmjaLkuLrnu53lr7lVUkxcbiAgICBpZiAoIWlzQWJzb2x1dGUgJiYgIWlzQXBpR2F0ZVdheVJlcXVlc3QpIHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmJhc2VIcmVmLmVuZHNXaXRoKCcvJylcbiAgICAgICAgPyB0aGlzLmJhc2VIcmVmXG4gICAgICAgIDogYCR7dGhpcy5iYXNlSHJlZn0vYDtcbiAgICAgIHJldHVybiBgJHtiYXNlVXJsfSR7cmVtb3RlVXJsfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbW90ZVVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmuIXnkIZVUkzvvIjnp7vpmaRoYXNo54mH5q6177yJXG4gICAqL1xuICBwcml2YXRlIGNsZWFuVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaGVhZCh1cmwuc3BsaXQoLyMvKSkgfHwgdXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIOmqjOivgei/nOeoi1VSTO+8iOW8gOWPkeaooeW8j++8iVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJlbW90ZVVybChyZW1vdGVVcmw6IHN0cmluZywgaXNBYnNvbHV0ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghaXNBYnNvbHV0ZSAmJiAoIXRoaXMuYmFzZUhyZWYgfHwgIWlzQWJzb2x1dGVVcmwodGhpcy5iYXNlSHJlZikpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnYWJzb2x1dGUgYmFzZSBocmVmIGlzIHJlcXVpcmVkIGZvciByZWxhdGl2ZSByZW1vdGUgdXJsJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHJlbW90ZVVybC5zcGxpdCgnPycpWzBdLmluY2x1ZGVzKCcuLycpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnZG8gbm90IHVzZSBhbnkgZG90IHdpdGggc2xhc2ggZm9yIHJlbGF0aXZlIHVybCB3aGljaCBzaG91bGQgYWx3YXlzIGJhc2UgZnJvbSBiYXNlIGhyZWYnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Yib5bu66L+c56iL57+76K+R6K+35rGCXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVJlbW90ZVRyYW5zbGF0aW9uUmVxdWVzdChcbiAgICBub3JtYWxpemVkVXJsOiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8VHJhbnNsYXRpb25zPiB7XG4gICAgaWYgKExPQ0FMRV9QTEFDRUhPTERFUl9SRUdFWC50ZXN0KG5vcm1hbGl6ZWRVcmwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVNdWx0aUxvY2FsZVJlcXVlc3Qobm9ybWFsaXplZFVybCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpbmdsZUxvY2FsZVJlcXVlc3Qobm9ybWFsaXplZFVybCk7XG4gIH1cblxuICAvKipcbiAgICog5Yib5bu65aSa6K+t6KiA6K+35rGCXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU11bHRpTG9jYWxlUmVxdWVzdChcbiAgICB1cmxUZW1wbGF0ZTogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPFRyYW5zbGF0aW9ucz4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gdGhpcy5vcHRpb25zLmxvY2FsZXMubWFwKGxvY2FsZSA9PlxuICAgICAgdGhpcy5mZXRjaFRyYW5zbGF0aW9uKHVybFRlbXBsYXRlLCBsb2NhbGUpLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9vc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvb3NlTG9jYWxlID0gdGhpcy5leHRyYWN0TG9vc2VMb2NhbGUobG9jYWxlKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbG9jYWxlICE9PSBsb29zZUxvY2FsZSAmJlxuICAgICAgICAgICAgICAhdGhpcy5vcHRpb25zLmxvY2FsZXMuaW5jbHVkZXMobG9vc2VMb2NhbGUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hUcmFuc2xhdGlvbih1cmxUZW1wbGF0ZSwgbG9vc2VMb2NhbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXNEZXZNb2RlKCkgPyB0aHJvd0Vycm9yKCgpID0+IGVycm9yKSA6IEVNUFRZO1xuICAgICAgICB9KSxcbiAgICAgICAgZmlsdGVyKGlzUGxhaW5PYmplY3QpLFxuICAgICAgICBtYXAoXG4gICAgICAgICAgKHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvbikgPT5cbiAgICAgICAgICAgICh7IFtsb2NhbGVdOiB0cmFuc2xhdGlvbiB9KSBhcyBUcmFuc2xhdGlvbnMsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpLnBpcGUoXG4gICAgICBtYXAocmVzdWx0cyA9PlxuICAgICAgICByZXN1bHRzLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBPYmplY3QuYXNzaWduKGFjYywgY3VyciksIHt9KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rljZXor63oqIDor7fmsYJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU2luZ2xlTG9jYWxlUmVxdWVzdCh1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8VHJhbnNsYXRpb25zPiB7XG4gICAgcmV0dXJuIHRoaXMucGVyZm9ybVRyYW5zbGF0aW9uUmVxdWVzdCh1cmwpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IChpc0Rldk1vZGUoKSA/IHRocm93RXJyb3IoKCkgPT4gZXJyb3IpIDogRU1QVFkpKSxcbiAgICApIGFzIE9ic2VydmFibGU8VHJhbnNsYXRpb25zPjtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiafooYznv7vor5Hor7fmsYJcbiAgICovXG4gIHByaXZhdGUgcGVyZm9ybVRyYW5zbGF0aW9uUmVxdWVzdCh1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgaXNKU09OID0gdXJsLmVuZHNXaXRoKCcuanNvbicpO1xuICAgIGNvbnN0IGlzQXBpR2F0ZVdheVJlcXVlc3QgPSB1cmwuc3RhcnRzV2l0aChBUElfR0FURVdBWSk7XG4gICAgY29uc3QgcmVzcG9uc2VUeXBlID0gaXNKU09OID8gJ2pzb24nIDogJ3RleHQnO1xuXG4gICAgaWYgKGlzQXBpR2F0ZVdheVJlcXVlc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgLnJlcXVlc3QoJ0dFVCcsIHVybCwgeyByZXNwb25zZVR5cGUgfSlcbiAgICAgICAgLnBpcGUobWFwKGJvZHkgPT4gKGlzSlNPTiA/IGJvZHkgOiBwYXJzZShib2R5KSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWpheCh7IHVybCwgcmVzcG9uc2VUeXBlIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgcmVzcG9uc2UgfSkgPT4gKGlzSlNPTiA/IHJlc3BvbnNlIDogcGFyc2UocmVzcG9uc2UgYXMgc3RyaW5nKSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog6aqM6K+BZmV0Y2hUcmFuc2xhdGlvbuWPguaVsFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZldGNoVHJhbnNsYXRpb25QYXJhbXMoXG4gICAgcmVtb3RlVXJsOiBzdHJpbmcsXG4gICAgbG9jYWxlPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgTE9DQUxFX1BMQUNFSE9MREVSX1JFR0VYLnRlc3QocmVtb3RlVXJsKSAmJiAhbG9jYWxlKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnYGxvY2FsZWAgaXMgcmVxdWlyZWQgc2luY2UgdGhlIHByb3ZpZGVkIHJlbW90ZSB1cmwgY29udGFpbnMgbG9jYWxlIHBsYWNlaG9sZGVyJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOino+aekOe/u+ivkeaWh+acrFxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVHJhbnNsYXRpb24oa2V5OiBzdHJpbmcsIGxvY2FsZSA9IHRoaXMubG9jYWxlKTogc3RyaW5nIHtcbiAgICAvLyDkvJjlhYjku47ov5znqIvnv7vor5HkuK3mn6Xmib5cbiAgICBsZXQgdmFsdWUgPSB0aGlzLnNlYXJjaEluVHJhbnNsYXRpb25zTGlzdChcbiAgICAgIGtleSxcbiAgICAgIGxvY2FsZSxcbiAgICAgIHRoaXMucmVtb3RlVHJhbnNsYXRpb25zTGlzdCxcbiAgICApO1xuXG4gICAgLy8g5aaC5p6c6L+c56iL57+76K+R5Lit5rKh5pyJ5om+5Yiw77yIdW5kZWZpbmVk77yJ77yM5YiZ5LuO5pys5Zyw57+76K+R5Lit5p+l5om+XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5zZWFyY2hJblRyYW5zbGF0aW9uc0xpc3Qoa2V5LCBsb2NhbGUsIHRoaXMudHJhbnNsYXRpb25zTGlzdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlID8/IGtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlnKjnv7vor5HliJfooajkuK3mkJzntKJcbiAgICovXG4gIHByaXZhdGUgc2VhcmNoSW5UcmFuc2xhdGlvbnNMaXN0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uc0xpc3Q6IFRyYW5zbGF0aW9uc1tdLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdHJhbnNsYXRpb25zTGlzdCB8fCB0cmFuc2xhdGlvbnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyDku47lkI7lvoDliY3pgY3ljobvvIjlkI7liqDlhaXnmoTkvJjlhYjnuqfmm7Tpq5jvvIlcbiAgICBmb3IgKGxldCBpID0gdHJhbnNsYXRpb25zTGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlYXJjaEluVHJhbnNsYXRpb25zKGtleSwgbG9jYWxlLCB0cmFuc2xhdGlvbnNMaXN0W2ldKTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOWcqOWNleS4que/u+ivkeWvueixoeS4reaQnOe0olxuICAgKi9cbiAgcHJpdmF0ZSBzZWFyY2hJblRyYW5zbGF0aW9ucyhcbiAgICBrZXk6IHN0cmluZyxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9ucyxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0cmFuc2xhdGlvblZhbHVlID0gdGhpcy5nZXRUcmFuc2xhdGlvblZhbHVlKHRyYW5zbGF0aW9ucywgbG9jYWxlKTtcblxuICAgIC8vIOWmguaenOayoeacieiOt+WPluWIsOe/u+ivkeWAvOWvueixoe+8iGdldFRyYW5zbGF0aW9uVmFsdWXlt7Lnu4/lpITnkIbkuoZsb29zZeWSjGZhbGxiYWNr77yJ77yM55u05o6l6L+U5ZueXG4gICAgaWYgKHRyYW5zbGF0aW9uVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyDojrflj5bnv7vor5HlgLzvvIzmlK/mjIHmiYHlubPlkozltYzlpZfkuKTnp43nu5PmnoRcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VHJhbnNsYXRpb25Gcm9tU291cmNlKHRyYW5zbGF0aW9uVmFsdWUsIGtleSk7XG5cbiAgICAvLyDlpoLmnpzmib7liLDlgLzvvIjljIXmi6xudWxs5YC877yJ77yM5YiZ5aSE55CG5bm26L+U5ZueXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVUcmFuc2xhdGlvblZhbHVlKHZhbHVlLCBsb2NhbGUsIGtleSk7XG4gICAgICAvLyBudWxs5YC86L2s5o2i5Li65a2X56ym5LiyJ251bGwn77yM5YW25LuW5YC85q2j5bi46L2s5o2iXG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8vIOWmguaenOWcqOW9k+WJjeivreiogOeahOe/u+ivkeWAvOS4reaJvuS4jeWIsGtlee+8jOS9hui/meS4jeaYr2ZhbGxiYWNr6K+t6KiA77yM5bCd6K+VZmFsbGJhY2tcbiAgICBpZiAobG9jYWxlICE9PSB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMb2NhbGUpIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrVHJhbnNsYXRpb25WYWx1ZSA9IHRoaXMuZ2V0VHJhbnNsYXRpb25WYWx1ZShcbiAgICAgICAgdHJhbnNsYXRpb25zLFxuICAgICAgICB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMb2NhbGUsXG4gICAgICApO1xuXG4gICAgICBpZiAoZmFsbGJhY2tUcmFuc2xhdGlvblZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tWYWx1ZSA9IHRoaXMuZ2V0VHJhbnNsYXRpb25Gcm9tU291cmNlKFxuICAgICAgICAgIGZhbGxiYWNrVHJhbnNsYXRpb25WYWx1ZSxcbiAgICAgICAgICBrZXksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChmYWxsYmFja1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlVHJhbnNsYXRpb25WYWx1ZShcbiAgICAgICAgICAgIGZhbGxiYWNrVmFsdWUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMb2NhbGUsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gZmFsbGJhY2tWYWx1ZSA9PT0gbnVsbCA/ICdudWxsJyA6IFN0cmluZyhmYWxsYmFja1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICog5LuO57+76K+R5rqQ6I635Y+W57+76K+R5YC877yM5pSv5oyB5omB5bmz5ZKM5bWM5aWX5Lik56eN57uT5p6EXG4gICAqIEBwYXJhbSBzb3VyY2UgLSDnv7vor5HmupDlr7nosaFcbiAgICogQHBhcmFtIGtleSAtIOe/u+ivkemUru+8iOWmgiAnYS5iLmMn77yJXG4gICAqIEByZXR1cm5zIOe/u+ivkeWAvOaIlnVuZGVmaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUcmFuc2xhdGlvbkZyb21Tb3VyY2Uoc291cmNlOiBhbnksIGtleTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyAxLiDkvJjlhYjlsJ3or5XmiYHlubPnu5PmnoTvvJrnm7TmjqXmn6Xmib7lrozmlbTnmoTplK4gJ2EuYi5jJ1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICByZXR1cm4gc291cmNlW2tleV07XG4gICAgfVxuXG4gICAgLy8gMi4g5YaN5bCd6K+V5bWM5aWX57uT5p6E77ya5L2/55SobG9kYXNoLmdldOaMiei3r+W+hOafpeaJviBhLmIuY1xuICAgIGNvbnN0IG5lc3RlZFZhbHVlID0gZ2V0KHNvdXJjZSwga2V5KTtcbiAgICBpZiAobmVzdGVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG5lc3RlZFZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5oyH5a6a6K+t6KiA55qE57+76K+R5YC877yI5aSE55CGbG9vc2XmqKHlvI/lkoxmYWxsYmFja+mAu+i+ke+8iVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUcmFuc2xhdGlvblZhbHVlKFxuICAgIHNvdXJjZTogVHJhbnNsYXRpb24sXG4gICAgbG9jYWxlID0gdGhpcy5sb2NhbGUsXG4gICk6IFRyYW5zbGF0aW9uVmFsdWUge1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIDEuIOmmluWFiOajgOafpeeyvuehruWMuemFjeeahOmUruaYr+WQpuWtmOWcqFxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBsb2NhbGUpKSB7XG4gICAgICByZXR1cm4gc291cmNlW2xvY2FsZV07IC8vIOi/lOWbnuWunumZheWAvO+8jOWPr+iDveaYr251bGzjgIF1bmRlZmluZWTmiJblhbbku5blgLxcbiAgICB9XG5cbiAgICAvLyAyLiDlpoLmnpzlkK/nlKjkuoblrr3mnb7mqKHlvI/vvIzlsJ3or5Xlrr3mnb7ljLnphY1cbiAgICBpZiAodGhpcy5vcHRpb25zLmxvb3NlKSB7XG4gICAgICBjb25zdCBsb29zZVZhbHVlID0gdGhpcy5nZXRMb29zZVRyYW5zbGF0aW9uVmFsdWUoc291cmNlLCBsb2NhbGUpO1xuICAgICAgaWYgKGxvb3NlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbG9vc2VWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzLiDlpoLmnpzlvZPliY3or63oqIDkuI3mmK9mYWxsYmFja+ivreiogO+8jOWwneivlWZhbGxiYWNr6K+t6KiAXG4gICAgaWYgKGxvY2FsZSAhPT0gdGhpcy5vcHRpb25zLmZhbGxiYWNrTG9jYWxlKSB7XG4gICAgICAvLyDpppblhYjmo4Dmn6VmYWxsYmFja+ivreiogOeahOeyvuehruWMuemFjVxuICAgICAgaWYgKFxuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5mYWxsYmFja0xvY2FsZSxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2VbdGhpcy5vcHRpb25zLmZhbGxiYWNrTG9jYWxlXTtcbiAgICAgIH1cblxuICAgICAgLy8g5aaC5p6c5ZCv55So5LqG5a695p2+5qih5byP77yM5Lmf5a+5ZmFsbGJhY2vor63oqIDov5vooYzlrr3mnb7ljLnphY1cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9vc2UpIHtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tMb29zZVZhbHVlID0gdGhpcy5nZXRMb29zZVRyYW5zbGF0aW9uVmFsdWUoXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5mYWxsYmFja0xvY2FsZSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZhbGxiYWNrTG9vc2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrTG9vc2VWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICog5a695p2+5qih5byP5LiL6I635Y+W57+76K+R5YC8XG4gICAqL1xuICBwcml2YXRlIGdldExvb3NlVHJhbnNsYXRpb25WYWx1ZShcbiAgICBzb3VyY2U6IFRyYW5zbGF0aW9uLFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICApOiBUcmFuc2xhdGlvblZhbHVlIHtcbiAgICBjb25zdCBsb29zZUxvY2FsZSA9IHRoaXMuZXh0cmFjdExvb3NlTG9jYWxlKGxvY2FsZSk7XG5cbiAgICBpZiAobG9jYWxlID09PSBsb29zZUxvY2FsZSkge1xuICAgICAgLy8g5a+75om+5Yy56YWN55qE5a695p2+6K+t6KiAXG4gICAgICBjb25zdCBtYXRjaGVkRW50cnkgPSBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZpbmQoXG4gICAgICAgIChba2V5XSkgPT4gbG9vc2VMb2NhbGUgPT09IHRoaXMuZXh0cmFjdExvb3NlTG9jYWxlKGtleSksXG4gICAgICApO1xuICAgICAgcmV0dXJuIG1hdGNoZWRFbnRyeT8uWzFdO1xuICAgIH1cblxuICAgIC8vIOajgOafpeWuveadvuivreiogOmUruaYr+WQpuWtmOWcqFxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBsb29zZUxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2VbbG9vc2VMb2NhbGVdO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICog5o+Q5Y+W5a695p2+6K+t6KiA5Luj56CB77yI5aaC77yaemgtQ04gLT4gemjvvIlcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdExvb3NlTG9jYWxlKGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaGVhZChsb2NhbGUuc3BsaXQoL1tfLV0vKSkgfHwgbG9jYWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIOmqjOivgee/u+ivkeWAvO+8iOW8gOWPkeaooeW8j++8iVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRyYW5zbGF0aW9uVmFsdWUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBrZXk6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgaXNEZXZNb2RlKCkgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHR5cGVvZiBnZXQodmFsdWUsIFN5bWJvbC50b1ByaW1pdGl2ZSkgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFRoZSB0cmFuc2xhdGlvbiBmb3IgbG9jYWxlOiBcXGAke2xvY2FsZX1cXGAgYW5kIGtleTpcXGAke2tleX1cXGAgaXMgYW4gb2JqZWN0LCB3aGljaCBjb3VsZCBiZSB1bmV4cGVjdGVkYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOavlOi+g+e/u+ivkemUru+8iOW8gOWPkeaooeW8j+S4i+ajgOafpemHjeWkje+8iVxuICAgKi9cbiAgcHJpdmF0ZSBjb21wYXJlVHJhbnNsYXRpb25LZXlzKFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvbixcbiAgICBwcmV2VHJhbnNsYXRpb246IFRyYW5zbGF0aW9uLFxuICAgIHBhdGg6IHN0cmluZ1tdID0gW10sXG4gICk6IHZvaWQge1xuICAgIGlmICh0cmFuc2xhdGlvbiA9PSBudWxsIHx8IHByZXZUcmFuc2xhdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgT2JqZWN0LmVudHJpZXModHJhbnNsYXRpb24pLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJldlRyYW5zbGF0aW9uLCBrZXkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldlZhbHVlID0gcHJldlRyYW5zbGF0aW9uW2tleV07XG4gICAgICBjb25zdCB2YWx1ZUlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0KHZhbHVlKTtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZUlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0KHByZXZWYWx1ZSk7XG5cbiAgICAgIGlmICh2YWx1ZUlzUGxhaW5PYmplY3QgJiYgcHJldlZhbHVlSXNQbGFpbk9iamVjdCkge1xuICAgICAgICB0aGlzLmNvbXBhcmVUcmFuc2xhdGlvbktleXMoXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHZhbHVlIGFzIFRyYW5zbGF0aW9uLFxuICAgICAgICAgIHByZXZWYWx1ZSBhcyBUcmFuc2xhdGlvbixcbiAgICAgICAgICBbLi4ucGF0aCwga2V5XSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbHVlSXNQbGFpbk9iamVjdCAmJiAhcHJldlZhbHVlSXNQbGFpbk9iamVjdCkge1xuICAgICAgICBjb25zdCBvdXRwdXRQYXRoID0gWy4uLnBhdGgsIGtleV0uam9pbignIC0+ICcpO1xuICAgICAgICBpZiAodmFsdWUgPT09IHByZXZWYWx1ZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBUaGUgY3VzdG9taXplZCB0cmFuc2xhdGlvbiBmb3IgbG9jYWxlOiBcXGAke2xvY2FsZX1cXGAgYW5kIHBhdGg6IFxcYCR7b3V0cHV0UGF0aH1cXGAgaXMgZHVwbGljYXRlZCB3aXRoIHRoZSBvdGhlciB0cmFuc2xhdGlvbiwgcGxlYXNlIHJlbW92ZSBpdCBpbiB5b3VyIHRyYW5zbGF0aW9uIGZpbGUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBUd28ga2V5cyB0aGF0IHRoZSBsb2NhbGUgaXMgXFxgJHtsb2NhbGV9XFxgIGFuZCB0aGUgcGF0aCBpcyBcXGAke291dHB1dFBhdGh9XFxgIGFyZSBzYW1lLCBidXQgdGhlaXIgdmFsdWVzIGFyZSBub3QgZXF1YWwsIHBsZWFzZSByZW1vdmUgb25lIG9mIHRoZW0gb3IgY2hhbmdlIG9uZSBvZiB0aGUga2V5cy5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
841
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvdHJhbnNsYXRlL3RyYW5zbGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBRVYsUUFBUSxFQUNSLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwRSxPQUFPLEVBQ0wsVUFBVSxFQUNWLE9BQU8sRUFDUCxRQUFRLEVBQ1IsVUFBVSxFQUNWLEtBQUssRUFDTCxVQUFVLEVBQ1YsTUFBTSxFQUNOLFFBQVEsRUFDUixHQUFHLEVBQ0gsU0FBUyxHQUNWLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVqQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLGNBQWMsR0FDZixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZ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QUFoQixnQkFBZ0IsbUJBREgsTUFBTTs7QUF3QnJCO0lBRFIsZUFBZSxFQUFFOzhCQUNBLFVBQVU7aURBQVM7aUZBdkIxQixnQkFBZ0I7Y0FENUIsVUFBVTtlQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7c0JBc0M3QixNQUFNO3VCQUFDLGVBQWU7O3NCQUN0QixRQUFROztzQkFBSSxNQUFNO3VCQUFDLGlCQUFpQjs7c0JBQ3BDLFFBQVE7O3NCQUFJLE1BQU07dUJBQUMsWUFBWTtxQkFoQnpCLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSB0cmFuc2xhdGVcbiAqL1xuXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgSW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW50bE1lc3NhZ2VGb3JtYXQgfSBmcm9tICdpbnRsLW1lc3NhZ2Vmb3JtYXQnO1xuaW1wb3J0IHsgZ2V0LCBoZWFkLCBoYXMsIGlzUGxhaW5PYmplY3QsIHRlbXBsYXRlIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIGZvcmtKb2luLFxuICB0aHJvd0Vycm9yLFxuICBFTVBUWSxcbiAgY2F0Y2hFcnJvcixcbiAgZmlsdGVyLFxuICBmaW5hbGl6ZSxcbiAgbWFwLFxuICB0YWtlVW50aWwsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgYWpheCB9IGZyb20gJ3J4anMvYWpheCc7XG5cbmltcG9ydCB7IEFQSV9HQVRFV0FZIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMvY29uc3RhbnRzJztcbmltcG9ydCB7IE9ic2VydmFibGVJbnB1dCwgVE9LRU5fQkFTRV9IUkVGIH0gZnJvbSAnLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IGlzQWJzb2x1dGVVcmwgfSBmcm9tICcuLi9jb3JlL3V0aWxzL2NvbW1vbic7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJy4uL2NvcmUvdXRpbHMveWFtbCc7XG5cbmltcG9ydCB7XG4gIEZBTExCQUNLX0xBTkdVQUdFLFxuICBMT0NBTEVfUExBQ0VIT0xERVJfUkVHRVgsXG4gIExPQ0FMRV9TVE9SQUdFLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRVc2VyTGFuZ3VhZ2UgfSBmcm9tICcuL2kxOG4tY29uZmlnJztcbmltcG9ydCB7IFRSQU5TTEFURV9PUFRJT05TLCBUUkFOU0xBVElPTlMgfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQge1xuICBUcmFuc2xhdGVLZXksXG4gIFRyYW5zbGF0ZU9wdGlvbnMsXG4gIFRyYW5zbGF0aW9uLFxuICBUcmFuc2xhdGlvblZhbHVlLFxuICBUcmFuc2xhdGlvbnMsXG4gIFRlbXBsYXRlRGF0YSxcbiAgSWN1RGF0YSxcbiAgVGVtcGxhdGVEYXRhT2JqZWN0LFxufSBmcm9tICcuL3R5cGVzJztcblxuZnVuY3Rpb24gZ2V0TG9vc2VMb2NhbGUobG9jYWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaGVhZChsb2NhbGUuc3BsaXQoL1tfLV0vKSkgfHwgbG9jYWxlO1xufVxuXG5mdW5jdGlvbiBoYXNMb2Rhc2hUZW1wbGF0ZUZvcm1hdChtZXNzYWdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXHtcXHtbXn1dK1xcfVxcfS8udGVzdChtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gaGFzSWN1TWVzc2FnZUZvcm1hdChtZXNzYWdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXHtbXnt9XStcXH0vLnRlc3QobWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIGlzVGVtcGxhdGVQbGFpbk9iamVjdChkYXRhOiBUZW1wbGF0ZURhdGEpOiBkYXRhIGlzIFRlbXBsYXRlRGF0YU9iamVjdCB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KGRhdGEpO1xufVxuXG4vKipcbiAqIOWbvemZheWMlue/u+ivkeacjeWKoVxuICpcbiAqIOeJueaAp++8mlxuICogLSDmlK/mjIHlpJrlsYLnuqfnv7vor5HkvJjlhYjnuqfvvIjov5znqIvnv7vor5EgPiDmiYvliqjmt7vliqDnv7vor5EgPiDphY3nva7nv7vor5HvvIlcbiAqIC0g5pSv5oyB5Yqo5oCB6K+t6KiA5YiH5o2iXG4gKiAtIOaUr+aMgSBJQ1UgTWVzc2FnZSBGb3JtYXQg5qih5p2/5o+S5YC8XG4gKiAtIOaUr+aMgeWuveadvuaooeW8j+ivreiogOWMuemFjVxuICogLSDmlK/mjIHlvILmraXov5znqIvnv7vor5HliqDovb1cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGVTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqIOe/u+ivkea3u+WKoOmAmuefpea1gSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0aW9uc0FkZGVkJCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IHRyYW5zbGF0aW9uc0FkZGVkJCA9IHRoaXMudHJhbnNsYXRpb25zQWRkZWQkJC5hc09ic2VydmFibGUoKTtcblxuICAvKiog57uE5Lu26ZSA5q+B6YCa55+l5rWBICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiog5pys5Zyw57+76K+R5YiX6KGo77yI5LyY5YWI57qn77ya5ZCO5Yqg5YWl55qE5LyY5YWI57qn5pu06auY77yJICovXG4gIHJlYWRvbmx5IHRyYW5zbGF0aW9uc0xpc3Q6IEFycmF5PFJlYWRvbmx5PFRyYW5zbGF0aW9ucz4+ID0gW107XG5cbiAgLyoqIOi/nOeoi+e/u+ivkeWIl+ihqO+8iOS8mOWFiOe6p+acgOmrmO+8iSAqL1xuICByZWFkb25seSByZW1vdGVUcmFuc2xhdGlvbnNMaXN0OiBBcnJheTxSZWFkb25seTxUcmFuc2xhdGlvbnM+PiA9IFtdO1xuXG4gIC8qKiDnv7vor5HphY3nva7pgInpobkgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogVHJhbnNsYXRlT3B0aW9ucztcblxuICAvKiog5b2T5YmN6K+t6KiA546v5aKDICovXG4gIGxvY2FsZTogc3RyaW5nO1xuXG4gIC8qKiDlvZPliY3or63oqIDnjq/looPvvIjlk43lupTlvI/vvIkgKi9cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHJlYWRvbmx5IGxvY2FsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICAvKiog6I635Y+W5pSv5oyB55qE6K+t6KiA5YiX6KGoICovXG4gIGdldCBsb2NhbGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxvY2FsZXM7XG4gIH1cblxuICAvKiog6I635Y+W5Zue6YCA6K+t6KiAICovXG4gIGdldCBmYWxsYmFja0xvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMb2NhbGU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdChUT0tFTl9CQVNFX0hSRUYpIHByaXZhdGUgcmVhZG9ubHkgYmFzZUhyZWY6IHN0cmluZyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRSQU5TTEFURV9PUFRJT05TKSBvcHRpb25zOiBUcmFuc2xhdGVPcHRpb25zLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVFJBTlNMQVRJT05TKSB0cmFuc2xhdGlvbkxpc3Q6IFRyYW5zbGF0aW9uc1tdLFxuICApIHtcbiAgICAvLyDliJ3lp4vljJbor63oqIDnjq/looNcbiAgICB0aGlzLmxvY2FsZSA9IHRoaXMuZ2V0SW5pdGlhbExvY2FsZShvcHRpb25zKTtcblxuICAgIC8vIOWIneWni+WMlumFjee9rumAiemhuVxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxvY2FsZXM6IFt0aGlzLmxvY2FsZV0sXG4gICAgICBmYWxsYmFja0xvY2FsZTogRkFMTEJBQ0tfTEFOR1VBR0UsXG4gICAgICBsb29zZTogZmFsc2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyDliJ3lp4vljJbnv7vor5HliJfooahcbiAgICB0aGlzLnRyYW5zbGF0aW9uc0xpc3QgPSB0aGlzLmdldEluaXRpYWxpemVUcmFuc2xhdGlvbnMoXG4gICAgICBvcHRpb25zLFxuICAgICAgdHJhbnNsYXRpb25MaXN0LFxuICAgICk7XG5cbiAgICAvLyDliqDovb3ov5znqIvnv7vor5FcbiAgICB0aGlzLmxvYWRSZW1vdGVUcmFuc2xhdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog57uE5Lu26ZSA5q+B5riF55CGXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JCQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnv7vor5HmlofmnKzlubbov5vooYzmqKHmnb/mj5LlgLxcbiAgICog5pSv5oyB5Lik56eN5qih5p2/6K+t5rOV77yaXG4gICAqIDEuIOS8oOe7n+eahCB7eyBrZXkgfX0g6K+t5rOV77yM5L2/55SoIGxvZGFzaCB0ZW1wbGF0ZSDlpITnkIZcbiAgICogMi4gSUNVIE1lc3NhZ2UgRm9ybWF0IOivreazle+8jOS9v+eUqCBJbnRsTWVzc2FnZUZvcm1hdCDlpITnkIZcbiAgICogQHBhcmFtIGtleSAtIOe/u+ivkemUruaIlue/u+ivkeWvueixoVxuICAgKiBAcGFyYW0gZGF0YSAtIOaooeadv+aVsOaNru+8iOaUr+aMgeWfuuacrOexu+Wei+OAgURhdGXjgIHlr7nosaHlkozmlbDnu4TvvIlcbiAgICogQHJldHVybnMg57+76K+R5ZCO55qE5paH5pysXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gbG9kYXNoIHRlbXBsYXRlIOivreazlVxuICAgKiB0cmFuc2xhdGUuZ2V0KCdoZWxsbycsIHsgbmFtZTogJ1dvcmxkJyB9KSAvLyDmqKHmnb86IFwiSGVsbG8ge3sgbmFtZSB9fVwiXG4gICAqXG4gICAqIC8vIElDVSBNZXNzYWdlIEZvcm1hdCDor63ms5VcbiAgICogdHJhbnNsYXRlLmdldCgnaXRlbUNvdW50JywgeyBjb3VudDogNSB9KSAvLyDmqKHmnb86IFwiSXRlbXM6IHtjb3VudCwgbnVtYmVyfVwiXG4gICAqIHRyYW5zbGF0ZS5nZXQoJ2NyZWF0ZWRBdCcsIHsgZGF0ZTogbmV3IERhdGUoKSB9KSAvLyDmqKHmnb86IFwiQ3JlYXRlZDoge2RhdGUsIGRhdGUsIHNob3J0fVwiXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0KGtleTogVHJhbnNsYXRlS2V5LCBkYXRhPzogVGVtcGxhdGVEYXRhKTogc3RyaW5nIHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRoaXMuZ2V0UmF3KGtleSk7XG5cbiAgICBpZiAoZGF0YSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRpb247XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIOajgOa1i+aooeadv+exu+Wei+W5tuS9v+eUqOebuOW6lOeahOWkhOeQhuaWueW8j1xuICAgICAgaWYgKGhhc0xvZGFzaFRlbXBsYXRlRm9ybWF0KHRyYW5zbGF0aW9uKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRMb2Rhc2hUZW1wbGF0ZSh0cmFuc2xhdGlvbiwgZGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoaGFzSWN1TWVzc2FnZUZvcm1hdCh0cmFuc2xhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0SWN1TWVzc2FnZSh0cmFuc2xhdGlvbiwgZGF0YSk7XG4gICAgICB9XG4gICAgICAvLyDlpoLmnpzmsqHmnInmqKHmnb/or63ms5XvvIznm7TmjqXov5Tlm57nv7vor5HmlofmnKxcbiAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5oYW5kbGVUZW1wbGF0ZUVycm9yKGtleSwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bljp/lp4vnv7vor5HmlofmnKzmqKHmnb/vvIjkuI3ov5vooYzmj5LlgLzlpITnkIbvvIlcbiAgICogQHBhcmFtIGtleSAtIOe/u+ivkemUruaIlue/u+ivkeWvueixoVxuICAgKiBAcmV0dXJucyDljp/lp4vnv7vor5HmqKHmnb/mlofmnKxcbiAgICovXG4gIGdldFJhdyhrZXk6IFRyYW5zbGF0ZUtleSk6IHN0cmluZyB7XG4gICAgLy8g5b2T57+76K+Ra2V55pivbnVsbOaIlnVuZGVmaW5lZOaXtui/lOWbnuepuuWtl+espuS4slxuICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb25CeUtleShrZXkpO1xuICAgIH1cblxuICAgIC8vIOW9k2tleeaYr1RyYW5zbGF0aW9u5a+56LGh5pe277yM6I635Y+W5b2T5YmN6K+t6KiA55qE57+76K+R5YC8XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFRyYW5zbGF0aW9uQnlPYmplY3Qoa2V5LCB0aGlzLmxvY2FsZSk7XG5cbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliIfmjaLliLDkuIvkuIDkuKrmlK/mjIHnmoTor63oqIDnjq/looNcbiAgICovXG4gIHRvZ2dsZUxvY2FsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLm9wdGlvbnMubG9jYWxlcy5pbmRleE9mKHRoaXMubG9jYWxlKTtcblxuICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmhhbmRsZUludmFsaWRMb2NhbGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0SW5kZXggPSAoY3VycmVudEluZGV4ICsgMSkgJSB0aGlzLm9wdGlvbnMubG9jYWxlcy5sZW5ndGg7XG4gICAgY29uc3QgbmV4dExvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGVzW25leHRJbmRleF07XG5cbiAgICBpZiAobmV4dExvY2FsZSAmJiBuZXh0TG9jYWxlICE9PSB0aGlzLmxvY2FsZSkge1xuICAgICAgdGhpcy5zZXRMb2NhbGUobmV4dExvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruW9k+WJjeivreiogOeOr+Wig1xuICAgKiBAcGFyYW0gbG9jYWxlIC0g6KaB6K6+572u55qE6K+t6KiA546v5aKDXG4gICAqL1xuICBzZXRMb2NhbGUobG9jYWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZExvY2FsZShsb2NhbGUpKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBJbnZhbGlkIGxvY2FsZTogJHtsb2NhbGV9LiBTdXBwb3J0ZWQgbG9jYWxlczogJHt0aGlzLm9wdGlvbnMubG9jYWxlcy5qb2luKCcsICcpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTE9DQUxFX1NUT1JBR0UsIGxvY2FsZSk7XG4gICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gIH1cblxuICAvKipcbiAgICog5omL5Yqo5re75Yqg57+76K+R5YyFXG4gICAqIEBwYXJhbSB0cmFuc2xhdGlvbnMgLSDopoHmt7vliqDnmoTnv7vor5HljIVcbiAgICovXG4gIGFkZFRyYW5zbGF0aW9ucyh0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdHJhbnNsYXRpb25zIHx8IHR5cGVvZiB0cmFuc2xhdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIHRyYW5zbGF0aW9ucyBvYmplY3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDlvIDlj5HmqKHlvI/kuIvmo4Dmn6Xph43lpI3nv7vor5FcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgdGhpcy50cmFuc2xhdGlvbnNMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY2hlY2tGb3JEdXBsaWNhdGVUcmFuc2xhdGlvbnModHJhbnNsYXRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zbGF0aW9uc0xpc3QucHVzaCh0cmFuc2xhdGlvbnMpO1xuICAgIHRoaXMudHJhbnNsYXRpb25zQWRkZWQkJC5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICog5re75Yqg6L+c56iL57+76K+R5YyFXG4gICAqIEBwYXJhbSByZW1vdGVVcmwgLSDov5znqIvnv7vor5Hmlofku7ZVUkxcbiAgICovXG4gIGFkZFJlbW90ZVRyYW5zbGF0aW9ucyhyZW1vdGVVcmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcmVtb3RlVXJsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFVybCA9IHRoaXMubm9ybWFsaXplUmVtb3RlVXJsKHJlbW90ZVVybCk7XG4gICAgY29uc3QgcmVxdWVzdCQgPSB0aGlzLmNyZWF0ZVJlbW90ZVRyYW5zbGF0aW9uUmVxdWVzdChub3JtYWxpemVkVXJsKTtcblxuICAgIHJlcXVlc3QkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25zQWRkZWQkJC5uZXh0KCk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IHJlbW90ZVRyYW5zbGF0aW9ucyA9PiB7XG4gICAgICAgICAgaWYgKHJlbW90ZVRyYW5zbGF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdGVUcmFuc2xhdGlvbnNMaXN0LnB1c2gocmVtb3RlVHJhbnNsYXRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcmVtb3RlIHRyYW5zbGF0aW9ucyBmcm9tICR7cmVtb3RlVXJsfTpgLFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5LuO6L+c56iLVVJM6I635Y+W57+76K+R5pWw5o2uXG4gICAqIEBwYXJhbSByZW1vdGVVcmwgLSDov5znqItVUkxcbiAgICogQHBhcmFtIGxvY2FsZSAtIOWPr+mAieeahOivreiogOeOr+Wig++8iOeUqOS6jlVSTOaooeadv+abv+aNou+8iVxuICAgKiBAcmV0dXJucyDnv7vor5HmlbDmja7nmoRPYnNlcnZhYmxlXG4gICAqL1xuICBmZXRjaFRyYW5zbGF0aW9uKHJlbW90ZVVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUcmFuc2xhdGlvbnM+O1xuICBmZXRjaFRyYW5zbGF0aW9uKHJlbW90ZVVybDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyk6IE9ic2VydmFibGU8VHJhbnNsYXRpb24+O1xuICBmZXRjaFRyYW5zbGF0aW9uKFxuICAgIHJlbW90ZVVybDogc3RyaW5nLFxuICAgIGxvY2FsZT86IHN0cmluZyxcbiAgKTogT2JzZXJ2YWJsZTxUcmFuc2xhdGlvbnMgfCBUcmFuc2xhdGlvbj4ge1xuICAgIHRoaXMudmFsaWRhdGVGZXRjaFRyYW5zbGF0aW9uUGFyYW1zKHJlbW90ZVVybCwgbG9jYWxlKTtcblxuICAgIGNvbnN0IHRhcmdldFVybCA9IGxvY2FsZVxuICAgICAgPyByZW1vdGVVcmwucmVwbGFjZShMT0NBTEVfUExBQ0VIT0xERVJfUkVHRVgsIGxvY2FsZSlcbiAgICAgIDogcmVtb3RlVXJsO1xuXG4gICAgcmV0dXJuIHRoaXMucGVyZm9ybVRyYW5zbGF0aW9uUmVxdWVzdCh0YXJnZXRVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWIneWni+ivreiogOeOr+Wig1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbml0aWFsTG9jYWxlKG9wdGlvbnM6IFRyYW5zbGF0ZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBvcHRpb25zPy5sb2NhbGUgfHwgZ2V0VXNlckxhbmd1YWdlKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Yid5aeL57+76K+R5YiX6KGoXG4gICAqL1xuICBwcml2YXRlIGdldEluaXRpYWxpemVUcmFuc2xhdGlvbnMoXG4gICAgb3B0aW9uczogVHJhbnNsYXRlT3B0aW9ucyxcbiAgICB0cmFuc2xhdGlvbkxpc3Q6IFRyYW5zbGF0aW9uc1tdLFxuICApOiBUcmFuc2xhdGlvbnNbXSB7XG4gICAgcmV0dXJuIFtvcHRpb25zPy50cmFuc2xhdGlvbnMsIC4uLih0cmFuc2xhdGlvbkxpc3QgfHwgW10pXS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICAvKipcbiAgICog5Yqg6L296L+c56iL57+76K+RXG4gICAqL1xuICBwcml2YXRlIGxvYWRSZW1vdGVUcmFuc2xhdGlvbnMob3B0aW9uczogVHJhbnNsYXRlT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghb3B0aW9ucz8ucmVtb3RlVXJsKSByZXR1cm47XG5cbiAgICBjb25zdCB1cmxzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLnJlbW90ZVVybClcbiAgICAgID8gb3B0aW9ucy5yZW1vdGVVcmxcbiAgICAgIDogW29wdGlvbnMucmVtb3RlVXJsXTtcblxuICAgIHVybHMuZm9yRWFjaCh1cmwgPT4gdGhpcy5hZGRSZW1vdGVUcmFuc2xhdGlvbnModXJsKSk7XG4gIH1cblxuICAvKipcbiAgICog6L2s5o2i5qih5p2/5pWw5o2u5Li6IElDVSDlhbzlrrnmoLzlvI9cbiAgICogQHBhcmFtIGRhdGEgLSDmqKHmnb/mlbDmja5cbiAgICogQHJldHVybnMgSUNVIOWFvOWuueeahOaVsOaNruWvueixoVxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVJY3VEYXRhKGRhdGE6IFRlbXBsYXRlRGF0YSk6IEljdURhdGEge1xuICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzmmK/nuq/lr7nosaHvvIznm7TmjqXovazmjaLlhbblsZ7mgKdcbiAgICBpZiAoaXNUZW1wbGF0ZVBsYWluT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0T2JqZWN0VG9JY3VEYXRhKGRhdGEgYXMgVGVtcGxhdGVEYXRhT2JqZWN0KTtcbiAgICB9XG5cbiAgICAvLyDln7rmnKznsbvlnovjgIHmlbDnu4TjgIFEYXRl562J5YyF6KOF5Li6IHsgdmFsdWU6IGRhdGEgfVxuICAgIHJldHVybiB7IHZhbHVlOiB0aGlzLmNvbnZlcnRWYWx1ZVRvSWN1VmFsdWUoZGF0YSkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDovazmjaLlr7nosaHnmoTmiYDmnInlsZ7mgKfkuLogSUNVIOWFvOWuueWAvFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0T2JqZWN0VG9JY3VEYXRhKG9iajogVGVtcGxhdGVEYXRhT2JqZWN0KTogSWN1RGF0YSB7XG4gICAgY29uc3QgcmVzdWx0OiBJY3VEYXRhID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuY29udmVydFZhbHVlVG9JY3VWYWx1ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDlsIbljZXkuKrlgLzovazmjaLkuLogSUNVIOWFvOWuueexu+Wei1xuICAgKiDmjInnhacgSUNVIE1lc3NhZ2VGb3JtYXQg6KeE6IyD77yM5Y+q5pSv5oyBIHN0cmluZyB8IG51bWJlciB8IERhdGVcbiAgICovXG4gIHByaXZhdGUgY29udmVydFZhbHVlVG9JY3VWYWx1ZSh2YWx1ZTogVGVtcGxhdGVEYXRhKTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB7XG4gICAgLy8gSUNVIOWOn+eUn+aUr+aMgeeahOexu+Wei+ebtOaOpei/lOWbnlxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8g5YW25LuW57G75Z6L6L2s5Li65a2X56ym5LiyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIOeugOWNleaVsOe7hOi9rOS4uumAl+WPt+WIhumalOeahOWtl+espuS4slxuICAgICAgcmV0dXJuIHZhbHVlLm1hcChpdGVtID0+IFN0cmluZyhpdGVtID8/ICcnKSkuam9pbignLCAnKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyDlr7nosaHovazkuLogSlNPTiDlrZfnrKbkuLJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlpITnkIbmqKHmnb/plJnor69cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlVGVtcGxhdGVFcnJvcihrZXk6IFRyYW5zbGF0ZUtleSwgZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGtleVN0ciA9IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnID8ga2V5IDogJ1tvYmplY3RdJztcbiAgICBjb25zdCBtZXNzYWdlID0gYFRoZSB0cmFuc2xhdGlvbiBrZXkgJyR7a2V5U3RyfScgaXMgbWlzc2luZyB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMuYDtcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4obWVzc2FnZSwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDkvb/nlKggbG9kYXNoIHRlbXBsYXRlIOagvOW8j+WMluaWh+acrFxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIOWMheWQqyB7eyB9fSDor63ms5XnmoTmqKHmnb/lrZfnrKbkuLJcbiAgICogQHBhcmFtIGRhdGEgLSDmqKHmnb/mlbDmja5cbiAgICogQHJldHVybnMg5qC85byP5YyW5ZCO55qE5a2X56ym5LiyXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdExvZGFzaFRlbXBsYXRlKG1lc3NhZ2U6IHN0cmluZywgZGF0YTogVGVtcGxhdGVEYXRhKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgLy8g5bCG5pWw5o2u5qCH5YeG5YyW5Li65a+56LGh5qC85byPXG4gICAgICBjb25zdCB0ZW1wbGF0ZURhdGEgPSB0aGlzLm5vcm1hbGl6ZVRlbXBsYXRlRGF0YShkYXRhKTtcblxuICAgICAgLy8g5L2/55SoIGxvZGFzaCB0ZW1wbGF0ZSDlpITnkIYge3sgfX0g6K+t5rOVXG4gICAgICBjb25zdCBjb21waWxlZCA9IHRlbXBsYXRlKG1lc3NhZ2UsIHtcbiAgICAgICAgaW50ZXJwb2xhdGU6IC9cXHtcXHsoLis/KVxcfVxcfS9nLCAvLyDoh6rlrprkuYnmj5LlgLzor63ms5XkuLoge3sgfX1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY29tcGlsZWQodGVtcGxhdGVEYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgTG9kYXNoIHRlbXBsYXRlIGZvcm1hdHRpbmcgZmFpbGVkIGZvciBcIiR7bWVzc2FnZX1cIjpgLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8g6ZmN57qn5aSE55CG77ya6L+U5Zue5Y6f5aeL5raI5oGvXG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qCH5YeG5YyW5qih5p2/5pWw5o2u5Li65a+56LGh5qC85byPXG4gICAqIEBwYXJhbSBkYXRhIC0g5Y6f5aeL5qih5p2/5pWw5o2uXG4gICAqIEByZXR1cm5zIOagh+WHhuWMluWQjueahOWvueixoeaIluaVsOe7hO+8iOS4uuS6huWQkeWQjuWFvOWuue+8iVxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVUZW1wbGF0ZURhdGEoXG4gICAgZGF0YTogVGVtcGxhdGVEYXRhLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgYW55W10ge1xuICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzmmK/nuq/lr7nosaHvvIznm7TmjqXov5Tlm55cbiAgICBpZiAoaXNUZW1wbGF0ZVBsYWluT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvLyDov5nmoLfmqKHmnb/kuK3lj6/ku6Xkvb/nlKgge3sgMCB9fSDorr/pl67nrKzkuIDkuKrlhYPntKBcbiAgICByZXR1cm4gW2RhdGFdIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiDkvb/nlKggSUNVIG1lc3NhZ2UgZm9ybWF0IOagvOW8j+WMluaWh+acrFxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRJY3VNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgZGF0YTogVGVtcGxhdGVEYXRhKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgLy8g5bCG5pWw5o2u6L2s5o2i5Li6IElDVSDlhbzlrrnmoLzlvI9cbiAgICAgIGNvbnN0IGljdURhdGEgPSB0aGlzLm5vcm1hbGl6ZUljdURhdGEoZGF0YSk7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2VGb3JtYXQgPSBuZXcgSW50bE1lc3NhZ2VGb3JtYXQoXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHRoaXMubG9jYWxlLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHsgaWdub3JlVGFnOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIG1lc3NhZ2VGb3JtYXQuZm9ybWF0KGljdURhdGEpIGFzIHN0cmluZztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgSUNVIG1lc3NhZ2UgZm9ybWF0dGluZyBmYWlsZWQgZm9yIFwiJHttZXNzYWdlfVwiOmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIC8vIOmZjee6p+WkhOeQhu+8mui/lOWbnuWOn+Wni+a2iOaBr1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagvOW8j+WMluaVsOWtl1xuICAgKiBAcGFyYW0gdmFsdWUgLSDopoHmoLzlvI/ljJbnmoTmlbDlrZdcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDmoLzlvI/ljJbpgInpoblcbiAgICogQHJldHVybnMg5qC85byP5YyW5ZCO55qE5pWw5a2X5a2X56ym5LiyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGZvcm1hdE51bWJlcigxMjM0LjU2KSAvLyBcIjEsMjM0LjU2XCJcbiAgICogZm9ybWF0TnVtYmVyKDAuODUsIHsgc3R5bGU6ICdwZXJjZW50JyB9KSAvLyBcIjg1JVwiXG4gICAqIGZvcm1hdE51bWJlcigxMjM0LjU2LCB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeTogJ0NOWScgfSkgLy8gXCLCpTEsMjM0LjU2XCJcbiAgICovXG4gIGZvcm1hdE51bWJlcih2YWx1ZTogbnVtYmVyLCBvcHRpb25zOiBJbnRsLk51bWJlckZvcm1hdE9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5sb2NhbGUsIG9wdGlvbnMpLmZvcm1hdCh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYE51bWJlciBmb3JtYXR0aW5nIGZhaWxlZCBmb3IgdmFsdWUgJHt2YWx1ZX06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagvOW8j+WMlui0p+W4gVxuICAgKiBAcGFyYW0gdmFsdWUgLSDopoHmoLzlvI/ljJbnmoTph5Hpop1cbiAgICogQHBhcmFtIGN1cnJlbmN5IC0g6LSn5biB5Luj56CB77yM6buY6K6k5Li6IENOWVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOWFtuS7luagvOW8j+WMlumAiemhuVxuICAgKiBAcmV0dXJucyDmoLzlvI/ljJblkI7nmoTotKfluIHlrZfnrKbkuLJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogZm9ybWF0Q3VycmVuY3koMTIzNC41NikgLy8gZW4tVVM6IFwiQ07CpTEsMjM0LjU2XCIsIHpoLUNOOiBcIsKlMSwyMzQuNTZcIlxuICAgKiBmb3JtYXRDdXJyZW5jeSgxMjM0LjU2LCAnVVNEJykgLy8gZW4tVVM6IFwiJDEsMjM0LjU2XCIsIHpoLUNOOiBcIlVTJDEsMjM0LjU2XCJcbiAgICovXG4gIGZvcm1hdEN1cnJlbmN5KFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgY3VycmVuY3k6IHN0cmluZyA9ICdDTlknLFxuICAgIG9wdGlvbnM6IE9taXQ8SW50bC5OdW1iZXJGb3JtYXRPcHRpb25zLCAnc3R5bGUnIHwgJ2N1cnJlbmN5Jz4gPSB7fSxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXROdW1iZXIodmFsdWUsIHtcbiAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxuICAgICAgY3VycmVuY3ksXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOagvOW8j+WMlueZvuWIhuavlFxuICAgKiBAcGFyYW0gdmFsdWUgLSDopoHmoLzlvI/ljJbnmoTlgLzvvIgwLjg1IOihqOekuiA4NSXvvIlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDmoLzlvI/ljJbpgInpoblcbiAgICogQHJldHVybnMg5qC85byP5YyW5ZCO55qE55m+5YiG5q+U5a2X56ym5LiyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGZvcm1hdFBlcmNlbnQoMC44NSkgLy8gXCI4NSVcIlxuICAgKiBmb3JtYXRQZXJjZW50KDAuODU2NywgeyBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIgfSkgLy8gXCI4NS42NyVcIlxuICAgKi9cbiAgZm9ybWF0UGVyY2VudChcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIG9wdGlvbnM6IE9taXQ8SW50bC5OdW1iZXJGb3JtYXRPcHRpb25zLCAnc3R5bGUnPiA9IHt9LFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdE51bWJlcih2YWx1ZSwge1xuICAgICAgc3R5bGU6ICdwZXJjZW50JyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5qC85byP5YyW5pel5pyfXG4gICAqIEBwYXJhbSBkYXRlIC0g6KaB5qC85byP5YyW55qE5pel5pyfXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMg5qC85byP6YWN572uXG4gICAqIEByZXR1cm5zIOagvOW8j+WMluWQjueahOaXpeacn+Wtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBmb3JtYXREYXRlKG5ldyBEYXRlKCkpIC8vIGVuLVVTOiBcIjAxLzAxLzIwMjVcIiwgemgtQ046IFwiMjAyNS8wMS8wMVwiXG4gICAqIGZvcm1hdERhdGUobmV3IERhdGUoKSwgeyBkYXRlU3R5bGU6ICdmdWxsJyB9KSAvLyBcIjIwMjTlubQ45pyIMjDml6XmmJ/mnJ/kuoxcIlxuICAgKiBmb3JtYXREYXRlKG5ldyBEYXRlKCksIHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJzItZGlnaXQnLCBkYXk6ICcyLWRpZ2l0JyB9KSAvLyDmoLnmja5sb2NhbGXmoLzlvI/ljJZcbiAgICogZm9ybWF0RGF0ZShuZXcgRGF0ZSgpLCB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJyB9KSAvLyBcIjIwMjTlubQ45pyIXCJcbiAgICovXG4gIGZvcm1hdERhdGUoXG4gICAgZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bWJlcixcbiAgICBvcHRpb25zOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHtcbiAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICB9LFxuICApOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRlT2JqID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICBpZiAoaXNOYU4oZGF0ZU9iai5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRlJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlQnlPcHRpb25zKGRhdGVPYmosIG9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBEYXRlIGZvcm1hdHRpbmcgZmFpbGVkIGZvciBkYXRlICR7ZGF0ZX06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFN0cmluZyhkYXRlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC85byP5YyW5pel5pyf5ZKM5pe26Ze0XG4gICAqIEBwYXJhbSBkYXRlIC0g6KaB5qC85byP5YyW55qE5pel5pyf5pe26Ze0XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMg5qC85byP6YWN572uXG4gICAqIEByZXR1cm5zIOagvOW8j+WMluWQjueahOaXpeacn+aXtumXtOWtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBmb3JtYXREYXRlVGltZShuZXcgRGF0ZSgpKSAvLyBlbi1VUzogXCIwMS8wMS8yMDI1LCAxNDozMDowMFwiLCB6aC1DTjogXCIyMDI1LzAxLzAxIDE0OjMwOjAwXCJcbiAgICogZm9ybWF0RGF0ZVRpbWUobmV3IERhdGUoKSwgeyBkYXRlU3R5bGU6ICdtZWRpdW0nLCB0aW1lU3R5bGU6ICdzaG9ydCcgfSkgLy8gXCIyMDI05bm0OOaciDIw5pelIDE0OjMwXCJcbiAgICogZm9ybWF0RGF0ZVRpbWUobmV3IERhdGUoKSwgeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnMi1kaWdpdCcsIGRheTogJzItZGlnaXQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLCBzZWNvbmQ6ICcyLWRpZ2l0JywgaG91cjEyOiBmYWxzZSB9KSAvLyDmoLnmja5sb2NhbGXmoLzlvI/ljJZcbiAgICovXG4gIGZvcm1hdERhdGVUaW1lKFxuICAgIGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gICAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7XG4gICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIHNlY29uZDogJzItZGlnaXQnLFxuICAgICAgaG91cjEyOiBmYWxzZSxcbiAgICB9LFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGUoZGF0ZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog5qC85byP5YyW55u45a+55pe26Ze0XG4gICAqIEBwYXJhbSB2YWx1ZSAtIOaXtumXtOW3ruWAvO+8iOaVsOWtl++8ieaIluaXpeacn+WvueixoVxuICAgKiBAcGFyYW0gdW5pdCAtIOaXtumXtOWNleS9je+8iOW9k3ZhbHVl5Li65pWw5a2X5pe25b+F6aG75o+Q5L6b77yJXG4gICAqIEBwYXJhbSBvcHRpb25zIC0g5qC85byP5YyW6YCJ6aG5XG4gICAqIEByZXR1cm5zIOagvOW8j+WMluWQjueahOebuOWvueaXtumXtOWtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyDmiYvliqjmjIflrprljZXkvY1cbiAgICogZm9ybWF0UmVsYXRpdmVUaW1lKC0xLCAnZGF5JykgLy8gZW4tVVM6IFwieWVzdGVyZGF5XCIsIHpoLUNOOiBcIuaYqOWkqVwiXG4gICAqIGZvcm1hdFJlbGF0aXZlVGltZSgyLCAnaG91cicpIC8vIGVuLVVTOiBcImluIDIgaG91cnNcIiwgemgtQ046IFwiMuWwj+aXtuWQjlwiXG4gICAqIGZvcm1hdFJlbGF0aXZlVGltZSgtMzAsICdtaW51dGUnKSAvLyBlbi1VUzogXCIzMCBtaW51dGVzIGFnb1wiLCB6aC1DTjogXCIzMOWIhumSn+WJjVwiXG4gICAqXG4gICAqIC8vIOiHquWKqOiuoeeul+WNleS9jVxuICAgKiBmb3JtYXRSZWxhdGl2ZVRpbWUobmV3IERhdGUoRGF0ZS5ub3coKSAtIDYwMDAwKSkgLy8gXCIxIG1pbnV0ZSBhZ29cIlxuICAgKiBmb3JtYXRSZWxhdGl2ZVRpbWUobmV3IERhdGUoRGF0ZS5ub3coKSArIDcyMDAwMDApKSAvLyBcImluIDIgaG91cnNcIlxuICAgKiBmb3JtYXRSZWxhdGl2ZVRpbWUobmV3IERhdGUoRGF0ZS5ub3coKSAtIDg2NDAwMDAwKSkgLy8gXCJ5ZXN0ZXJkYXlcIlxuICAgKi9cbiAgZm9ybWF0UmVsYXRpdmVUaW1lKFxuICAgIHZhbHVlOiBEYXRlLFxuICAgIG9wdGlvbnM/OiBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdE9wdGlvbnMsXG4gICk6IHN0cmluZztcblxuICBmb3JtYXRSZWxhdGl2ZVRpbWUoXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICB1bml0OiBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdFVuaXQsXG4gICAgb3B0aW9ucz86IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucyxcbiAgKTogc3RyaW5nO1xuXG4gIGZvcm1hdFJlbGF0aXZlVGltZShcbiAgICB2YWx1ZTogbnVtYmVyIHwgRGF0ZSxcbiAgICB1bml0T3JPcHRpb25zPzpcbiAgICAgIHwgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRVbml0XG4gICAgICB8IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucyxcbiAgICBvcHRpb25zOiBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdE9wdGlvbnMgPSB7IG51bWVyaWM6ICdhdXRvJyB9LFxuICApOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBsZXQgZmluYWxWYWx1ZTogbnVtYmVyO1xuICAgICAgbGV0IGZpbmFsVW5pdDogSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRVbml0O1xuICAgICAgbGV0IGZpbmFsT3B0aW9uczogSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRPcHRpb25zO1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIC8vIOiHquWKqOiuoeeul+aXtumXtOW3ruWSjOWNleS9jVxuICAgICAgICBjb25zdCB7IHZhbHVlOiBjYWxjdWxhdGVkVmFsdWUsIHVuaXQ6IGNhbGN1bGF0ZWRVbml0IH0gPVxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVsYXRpdmVUaW1lKHZhbHVlKTtcbiAgICAgICAgZmluYWxWYWx1ZSA9IGNhbGN1bGF0ZWRWYWx1ZTtcbiAgICAgICAgZmluYWxVbml0ID0gY2FsY3VsYXRlZFVuaXQ7XG4gICAgICAgIGZpbmFsT3B0aW9ucyA9XG4gICAgICAgICAgKHVuaXRPck9wdGlvbnMgYXMgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRPcHRpb25zKSB8fCBvcHRpb25zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5L2/55So5o+Q5L6b55qE5pWw5YC85ZKM5Y2V5L2NXG4gICAgICAgIGZpbmFsVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZmluYWxVbml0ID0gdW5pdE9yT3B0aW9ucyBhcyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdFVuaXQ7XG4gICAgICAgIGZpbmFsT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsIGZpbmFsT3B0aW9ucykuZm9ybWF0KFxuICAgICAgICBmaW5hbFZhbHVlLFxuICAgICAgICBmaW5hbFVuaXQsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZWxhdGl2ZSB0aW1lIGZvcm1hdHRpbmcgZmFpbGVkIGZvciAke3ZhbHVlfTpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlXG4gICAgICAgID8gdmFsdWUudG9Mb2NhbGVTdHJpbmcodGhpcy5sb2NhbGUpXG4gICAgICAgIDogYCR7dmFsdWV9YDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5pel5pyf6K6h566X55u45a+55pe26Ze05beu5YC85ZKM5pyA5ZCI6YCC55qE5Y2V5L2NXG4gICAqIEBwYXJhbSBkYXRlIC0g55uu5qCH5pel5pyfXG4gICAqIEByZXR1cm5zIOWMheWQq+aXtumXtOW3ruWAvOWSjOWNleS9jeeahOWvueixoVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVSZWxhdGl2ZVRpbWUoZGF0ZTogRGF0ZSk6IHtcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIHVuaXQ6IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0VW5pdDtcbiAgfSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBkaWZmTXMgPSBkYXRlLmdldFRpbWUoKSAtIG5vdy5nZXRUaW1lKCk7XG4gICAgY29uc3QgYWJzRGlmZk1zID0gTWF0aC5hYnMoZGlmZk1zKTtcblxuICAgIC8vIOaXtumXtOWNleS9jemYiOWAvO+8iOavq+enku+8iVxuICAgIGNvbnN0IE1JTlVURV9NUyA9IDYwICogMTAwMDtcbiAgICBjb25zdCBIT1VSX01TID0gNjAgKiBNSU5VVEVfTVM7XG4gICAgY29uc3QgREFZX01TID0gMjQgKiBIT1VSX01TO1xuXG4gICAgLy8g5qC55o2u5pe26Ze05beu6YCJ5oup5ZCI6YCC55qE5Y2V5L2N77yM5pyA5aSn5Y2V5L2N5Li6ZGF5XG4gICAgaWYgKGFic0RpZmZNcyA+PSBEQVlfTVMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKGRpZmZNcyAvIERBWV9NUyksXG4gICAgICAgIHVuaXQ6ICdkYXknLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGFic0RpZmZNcyA+PSBIT1VSX01TKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogTWF0aC5yb3VuZChkaWZmTXMgLyBIT1VSX01TKSxcbiAgICAgICAgdW5pdDogJ2hvdXInLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGFic0RpZmZNcyA+PSBNSU5VVEVfTVMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKGRpZmZNcyAvIE1JTlVURV9NUyksXG4gICAgICAgIHVuaXQ6ICdtaW51dGUnLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBNYXRoLnJvdW5kKGRpZmZNcyAvIDEwMDApLFxuICAgICAgdW5pdDogJ3NlY29uZCcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7ml6XmnJ/moLzlvI/phY3nva7moLzlvI/ljJbml6XmnJ9cbiAgICog5L2/55So5qCH5YeGIEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zIOehruS/neagvOW8j+WPr+mihOa1i+aAp1xuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXREYXRlQnlPcHRpb25zKFxuICAgIGRhdGU6IERhdGUsXG4gICAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMsXG4gICk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmxvY2FsZSwgb3B0aW9ucykuZm9ybWF0KGRhdGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBEYXRlIGZvcm1hdHRpbmcgZmFpbGVkOmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuaXoOaViOivreiogOeOr+Wig1xuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVJbnZhbGlkTG9jYWxlKCk6IHZvaWQge1xuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGxvY2FsZXNgIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCBjb3JyZWN0bHknKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6aqM6K+B6K+t6KiA546v5aKD5piv5ZCm5pyJ5pWIXG4gICAqL1xuICBwcml2YXRlIGlzVmFsaWRMb2NhbGUobG9jYWxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxvY2FsZXMuaW5jbHVkZXMobG9jYWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmo4Dmn6Xph43lpI3nv7vor5HvvIjlvIDlj5HmqKHlvI/vvIlcbiAgICovXG4gIHByaXZhdGUgY2hlY2tGb3JEdXBsaWNhdGVUcmFuc2xhdGlvbnMobmV3VHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbnMpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGV4aXN0aW5nVHJhbnNsYXRpb25zIG9mIHRoaXMudHJhbnNsYXRpb25zTGlzdCkge1xuICAgICAgT2JqZWN0LmtleXMobmV3VHJhbnNsYXRpb25zKS5mb3JFYWNoKGxvY2FsZSA9PiB7XG4gICAgICAgIGlmIChleGlzdGluZ1RyYW5zbGF0aW9uc1tsb2NhbGVdKSB7XG4gICAgICAgICAgdGhpcy5jb21wYXJlVHJhbnNsYXRpb25LZXlzKFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgbmV3VHJhbnNsYXRpb25zW2xvY2FsZV0sXG4gICAgICAgICAgICBleGlzdGluZ1RyYW5zbGF0aW9uc1tsb2NhbGVdLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoIflh4bljJbov5znqItVUkxcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplUmVtb3RlVXJsKHJlbW90ZVVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyDmuIXnkIZVUkzvvIjnp7vpmaRoYXNo54mH5q6177yJXG4gICAgcmVtb3RlVXJsID0gaGVhZChyZW1vdGVVcmwuc3BsaXQoLyMvKSkgfHwgcmVtb3RlVXJsO1xuICAgIGNvbnN0IGlzQWJzb2x1dGUgPSBpc0Fic29sdXRlVXJsKHJlbW90ZVVybCk7XG4gICAgY29uc3QgaXNBcGlHYXRlV2F5UmVxdWVzdCA9IHJlbW90ZVVybC5zdGFydHNXaXRoKEFQSV9HQVRFV0FZKTtcblxuICAgIC8vIOW8gOWPkeaooeW8j+S4i+i/m+ihjFVSTOmqjOivgVxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgdGhpcy52YWxpZGF0ZVJlbW90ZVVybChyZW1vdGVVcmwsIGlzQWJzb2x1dGUpO1xuICAgIH1cblxuICAgIC8vIOebuOWvuVVSTOi9rOaNouS4uue7neWvuVVSTFxuICAgIGlmICghaXNBYnNvbHV0ZSAmJiAhaXNBcGlHYXRlV2F5UmVxdWVzdCkge1xuICAgICAgY29uc3QgYmFzZVVybCA9IHRoaXMuYmFzZUhyZWYuZW5kc1dpdGgoJy8nKVxuICAgICAgICA/IHRoaXMuYmFzZUhyZWZcbiAgICAgICAgOiBgJHt0aGlzLmJhc2VIcmVmfS9gO1xuICAgICAgcmV0dXJuIGAke2Jhc2VVcmx9JHtyZW1vdGVVcmx9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVtb3RlVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIOmqjOivgei/nOeoi1VSTO+8iOW8gOWPkeaooeW8j++8iVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJlbW90ZVVybChyZW1vdGVVcmw6IHN0cmluZywgaXNBYnNvbHV0ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghaXNBYnNvbHV0ZSAmJiAoIXRoaXMuYmFzZUhyZWYgfHwgIWlzQWJzb2x1dGVVcmwodGhpcy5iYXNlSHJlZikpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnYWJzb2x1dGUgYmFzZSBocmVmIGlzIHJlcXVpcmVkIGZvciByZWxhdGl2ZSByZW1vdGUgdXJsJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHJlbW90ZVVybC5zcGxpdCgnPycpWzBdLmluY2x1ZGVzKCcuLycpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnZG8gbm90IHVzZSBhbnkgZG90IHdpdGggc2xhc2ggZm9yIHJlbGF0aXZlIHVybCB3aGljaCBzaG91bGQgYWx3YXlzIGJhc2UgZnJvbSBiYXNlIGhyZWYnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Yib5bu66L+c56iL57+76K+R6K+35rGCXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVJlbW90ZVRyYW5zbGF0aW9uUmVxdWVzdChcbiAgICBub3JtYWxpemVkVXJsOiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8VHJhbnNsYXRpb25zPiB7XG4gICAgaWYgKExPQ0FMRV9QTEFDRUhPTERFUl9SRUdFWC50ZXN0KG5vcm1hbGl6ZWRVcmwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVNdWx0aUxvY2FsZVJlcXVlc3Qobm9ybWFsaXplZFVybCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpbmdsZUxvY2FsZVJlcXVlc3Qobm9ybWFsaXplZFVybCk7XG4gIH1cblxuICAvKipcbiAgICog5Yib5bu65aSa6K+t6KiA6K+35rGCXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU11bHRpTG9jYWxlUmVxdWVzdChcbiAgICB1cmxUZW1wbGF0ZTogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPFRyYW5zbGF0aW9ucz4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gdGhpcy5vcHRpb25zLmxvY2FsZXMubWFwKGxvY2FsZSA9PlxuICAgICAgdGhpcy5mZXRjaFRyYW5zbGF0aW9uKHVybFRlbXBsYXRlLCBsb2NhbGUpLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9vc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvb3NlTG9jYWxlID0gZ2V0TG9vc2VMb2NhbGUobG9jYWxlKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbG9vc2VMb2NhbGUgIT09IGxvY2FsZSAmJlxuICAgICAgICAgICAgICAhdGhpcy5vcHRpb25zLmxvY2FsZXMuaW5jbHVkZXMobG9vc2VMb2NhbGUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hUcmFuc2xhdGlvbih1cmxUZW1wbGF0ZSwgbG9vc2VMb2NhbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXNEZXZNb2RlKCkgPyB0aHJvd0Vycm9yKCgpID0+IGVycm9yKSA6IEVNUFRZO1xuICAgICAgICB9KSxcbiAgICAgICAgZmlsdGVyKGlzUGxhaW5PYmplY3QpLFxuICAgICAgICBtYXAoXG4gICAgICAgICAgKHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvbikgPT5cbiAgICAgICAgICAgICh7IFtsb2NhbGVdOiB0cmFuc2xhdGlvbiB9KSBhcyBUcmFuc2xhdGlvbnMsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpLnBpcGUoXG4gICAgICBtYXAocmVzdWx0cyA9PlxuICAgICAgICByZXN1bHRzLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBPYmplY3QuYXNzaWduKGFjYywgY3VyciksIHt9KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rljZXor63oqIDor7fmsYJcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU2luZ2xlTG9jYWxlUmVxdWVzdCh1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8VHJhbnNsYXRpb25zPiB7XG4gICAgcmV0dXJuIHRoaXMucGVyZm9ybVRyYW5zbGF0aW9uUmVxdWVzdCh1cmwpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IChpc0Rldk1vZGUoKSA/IHRocm93RXJyb3IoKCkgPT4gZXJyb3IpIDogRU1QVFkpKSxcbiAgICApIGFzIE9ic2VydmFibGU8VHJhbnNsYXRpb25zPjtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiafooYznv7vor5Hor7fmsYJcbiAgICovXG4gIHByaXZhdGUgcGVyZm9ybVRyYW5zbGF0aW9uUmVxdWVzdCh1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgaXNKU09OID0gdXJsLmVuZHNXaXRoKCcuanNvbicpO1xuICAgIGNvbnN0IGlzQXBpR2F0ZVdheVJlcXVlc3QgPSB1cmwuc3RhcnRzV2l0aChBUElfR0FURVdBWSk7XG4gICAgY29uc3QgcmVzcG9uc2VUeXBlID0gaXNKU09OID8gJ2pzb24nIDogJ3RleHQnO1xuXG4gICAgaWYgKGlzQXBpR2F0ZVdheVJlcXVlc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgLnJlcXVlc3QoJ0dFVCcsIHVybCwgeyByZXNwb25zZVR5cGUgfSlcbiAgICAgICAgLnBpcGUobWFwKGJvZHkgPT4gKGlzSlNPTiA/IGJvZHkgOiBwYXJzZShib2R5KSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWpheCh7IHVybCwgcmVzcG9uc2VUeXBlIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgcmVzcG9uc2UgfSkgPT4gKGlzSlNPTiA/IHJlc3BvbnNlIDogcGFyc2UocmVzcG9uc2UgYXMgc3RyaW5nKSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog6aqM6K+BZmV0Y2hUcmFuc2xhdGlvbuWPguaVsFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZldGNoVHJhbnNsYXRpb25QYXJhbXMoXG4gICAgcmVtb3RlVXJsOiBzdHJpbmcsXG4gICAgbG9jYWxlPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgTE9DQUxFX1BMQUNFSE9MREVSX1JFR0VYLnRlc3QocmVtb3RlVXJsKSAmJiAhbG9jYWxlKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnYGxvY2FsZWAgaXMgcmVxdWlyZWQgc2luY2UgdGhlIHByb3ZpZGVkIHJlbW90ZSB1cmwgY29udGFpbnMgbG9jYWxlIHBsYWNlaG9sZGVyJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/h+mUruafpeaJvue/u+ivkeaWh+acrFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUcmFuc2xhdGlvbkJ5S2V5KGtleTogc3RyaW5nLCBsb2NhbGUgPSB0aGlzLmxvY2FsZSk6IHN0cmluZyB7XG4gICAgLy8gMSkg57K+56Gu5Yy56YWN5b2T5YmNIGxvY2FsZVxuICAgIGxldCB2YWx1ZSA9IHRoaXMuZmluZEluQWxsVHJhbnNsYXRpb25zKGtleSwgbG9jYWxlKTtcblxuICAgIC8vIDIpIOWuveadvuWMuemFjeW9k+WJjSBsb2NhbGXvvIjlpoIgemgtQ04gLT4gemjvvIlcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLm9wdGlvbnMubG9vc2UpIHtcbiAgICAgIGNvbnN0IGxvb3NlID0gZ2V0TG9vc2VMb2NhbGUobG9jYWxlKTtcbiAgICAgIGlmIChsb29zZSAhPT0gbG9jYWxlKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5maW5kSW5BbGxUcmFuc2xhdGlvbnMoa2V5LCBsb29zZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMykg5Zue6YCA5YiwIGZhbGxiYWNrTG9jYWxlXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbG9jYWxlICE9PSB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMb2NhbGUpIHtcbiAgICAgIGNvbnN0IGZiID0gdGhpcy5vcHRpb25zLmZhbGxiYWNrTG9jYWxlO1xuICAgICAgdmFsdWUgPSB0aGlzLmZpbmRJbkFsbFRyYW5zbGF0aW9ucyhrZXksIGZiKTtcblxuICAgICAgLy8gNCkg5a695p2+5Yy56YWN5Zue6YCAIGxvY2FsZVxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgdGhpcy5vcHRpb25zLmxvb3NlKSB7XG4gICAgICAgIGNvbnN0IGZiTG9vc2UgPSBnZXRMb29zZUxvY2FsZShmYik7XG4gICAgICAgIGlmIChmYkxvb3NlICE9PSBmYikge1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5maW5kSW5BbGxUcmFuc2xhdGlvbnMoa2V5LCBmYkxvb3NlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA/PyBrZXk7XG4gIH1cblxuICAvKipcbiAgICog5Zyo5omA5pyJ57+76K+R5rqQ5Lit5p+l5om+6ZSu5YC8XG4gICAqL1xuICBwcml2YXRlIGZpbmRJbkFsbFRyYW5zbGF0aW9ucyhcbiAgICBrZXk6IHN0cmluZyxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyDov5znqIvnv7vor5HkvJjlhYjnuqfmm7Tpq5hcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5maW5kSW5UcmFuc2xhdGlvbnNMaXN0KGtleSwgbG9jYWxlLCB0aGlzLnJlbW90ZVRyYW5zbGF0aW9uc0xpc3QpID8/XG4gICAgICB0aGlzLmZpbmRJblRyYW5zbGF0aW9uc0xpc3Qoa2V5LCBsb2NhbGUsIHRoaXMudHJhbnNsYXRpb25zTGlzdClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWcqOe/u+ivkeWIl+ihqOS4reafpeaJvumUruWAvFxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kSW5UcmFuc2xhdGlvbnNMaXN0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uc0xpc3Q6IFRyYW5zbGF0aW9uc1tdLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdHJhbnNsYXRpb25zTGlzdD8ubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8g5ZCO5Yqg5YWl55qE5LyY5YWI57qn5pu06auYXG4gICAgZm9yIChsZXQgaSA9IHRyYW5zbGF0aW9uc0xpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maW5kSW5UcmFuc2xhdGlvbihrZXksIGxvY2FsZSwgdHJhbnNsYXRpb25zTGlzdFtpXSk7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOWcqOWNleS4que/u+ivkeWvueixoeS4reafpeaJvumUruWAvFxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kSW5UcmFuc2xhdGlvbihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9ucyxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb2NhbGVEYXRhID0gdHJhbnNsYXRpb25zW2xvY2FsZV07XG4gICAgaWYgKCFsb2NhbGVEYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgdmFsdWUgPSBnZXQobG9jYWxlRGF0YSwga2V5KTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52YWxpZGF0ZVRyYW5zbGF0aW9uVmFsdWUodmFsdWUsIGxvY2FsZSwga2V5KTtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOS7jlRyYW5zbGF0aW9u5a+56LGh5Lit6I635Y+W57+76K+R5YC877yI5pSv5oyB5a695p2+5Yy56YWN5ZKM5Zue6YCA6YC76L6R77yJXG4gICAqL1xuICBwcml2YXRlIGdldFRyYW5zbGF0aW9uQnlPYmplY3QoXG4gICAgc291cmNlOiBUcmFuc2xhdGlvbixcbiAgICBsb2NhbGUgPSB0aGlzLmxvY2FsZSxcbiAgKTogVHJhbnNsYXRpb25WYWx1ZSB7XG4gICAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyAxKSDnsr7noa7ljLnphY3lvZPliY0gbG9jYWxlXG4gICAgaWYgKGhhcyhzb3VyY2UsIGxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2VbbG9jYWxlXTtcbiAgICB9XG5cbiAgICAvLyAyKSDlrr3mnb7ljLnphY3lvZPliY0gbG9jYWxl77yI5aaCIHpoLUNOIC0+IHpo77yJXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb29zZSkge1xuICAgICAgY29uc3QgbG9vc2UgPSBnZXRMb29zZUxvY2FsZShsb2NhbGUpO1xuICAgICAgaWYgKGxvb3NlICE9PSBsb2NhbGUgJiYgaGFzKHNvdXJjZSwgbG9vc2UpKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2VbbG9vc2VdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMpIOWbnumAgOWIsCBmYWxsYmFja0xvY2FsZVxuICAgIGNvbnN0IGZiID0gdGhpcy5vcHRpb25zLmZhbGxiYWNrTG9jYWxlO1xuICAgIGlmIChmYiAhPT0gbG9jYWxlICYmIGhhcyhzb3VyY2UsIGZiKSkge1xuICAgICAgcmV0dXJuIHNvdXJjZVtmYl07XG4gICAgfVxuXG4gICAgLy8gNCkg5a695p2+5Yy56YWN5Zue6YCAIGxvY2FsZVxuICAgIGlmICh0aGlzLm9wdGlvbnMubG9vc2UpIHtcbiAgICAgIGNvbnN0IGZiTG9vc2UgPSBnZXRMb29zZUxvY2FsZShmYik7XG4gICAgICBpZiAoZmJMb29zZSAhPT0gZmIgJiYgaGFzKHNvdXJjZSwgZmJMb29zZSkpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVtmYkxvb3NlXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOmqjOivgee/u+ivkeWAvO+8iOW8gOWPkeaooeW8j++8iVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRyYW5zbGF0aW9uVmFsdWUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBrZXk6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgaXNEZXZNb2RlKCkgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHR5cGVvZiBnZXQodmFsdWUsIFN5bWJvbC50b1ByaW1pdGl2ZSkgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFRoZSB0cmFuc2xhdGlvbiBmb3IgbG9jYWxlOiBcXGAke2xvY2FsZX1cXGAgYW5kIGtleTpcXGAke2tleX1cXGAgaXMgYW4gb2JqZWN0LCB3aGljaCBjb3VsZCBiZSB1bmV4cGVjdGVkYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOavlOi+g+e/u+ivkemUru+8iOW8gOWPkeaooeW8j+S4i+ajgOafpemHjeWkje+8iVxuICAgKi9cbiAgcHJpdmF0ZSBjb21wYXJlVHJhbnNsYXRpb25LZXlzKFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvbixcbiAgICBwcmV2VHJhbnNsYXRpb246IFRyYW5zbGF0aW9uLFxuICAgIHBhdGg6IHN0cmluZ1tdID0gW10sXG4gICk6IHZvaWQge1xuICAgIGlmICh0cmFuc2xhdGlvbiA9PSBudWxsIHx8IHByZXZUcmFuc2xhdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgT2JqZWN0LmVudHJpZXModHJhbnNsYXRpb24pLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKCFoYXMocHJldlRyYW5zbGF0aW9uLCBrZXkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldlZhbHVlID0gcHJldlRyYW5zbGF0aW9uW2tleV07XG4gICAgICBjb25zdCB2YWx1ZUlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0KHZhbHVlKTtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZUlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0KHByZXZWYWx1ZSk7XG5cbiAgICAgIGlmICh2YWx1ZUlzUGxhaW5PYmplY3QgJiYgcHJldlZhbHVlSXNQbGFpbk9iamVjdCkge1xuICAgICAgICB0aGlzLmNvbXBhcmVUcmFuc2xhdGlvbktleXMoXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHZhbHVlIGFzIFRyYW5zbGF0aW9uLFxuICAgICAgICAgIHByZXZWYWx1ZSBhcyBUcmFuc2xhdGlvbixcbiAgICAgICAgICBbLi4ucGF0aCwga2V5XSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbHVlSXNQbGFpbk9iamVjdCAmJiAhcHJldlZhbHVlSXNQbGFpbk9iamVjdCkge1xuICAgICAgICBjb25zdCBvdXRwdXRQYXRoID0gWy4uLnBhdGgsIGtleV0uam9pbignIC0+ICcpO1xuICAgICAgICBpZiAodmFsdWUgPT09IHByZXZWYWx1ZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBUaGUgY3VzdG9taXplZCB0cmFuc2xhdGlvbiBmb3IgbG9jYWxlOiBcXGAke2xvY2FsZX1cXGAgYW5kIHBhdGg6IFxcYCR7b3V0cHV0UGF0aH1cXGAgaXMgZHVwbGljYXRlZCB3aXRoIHRoZSBvdGhlciB0cmFuc2xhdGlvbiwgcGxlYXNlIHJlbW92ZSBpdCBpbiB5b3VyIHRyYW5zbGF0aW9uIGZpbGUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBUd28ga2V5cyB0aGF0IHRoZSBsb2NhbGUgaXMgXFxgJHtsb2NhbGV9XFxgIGFuZCB0aGUgcGF0aCBpcyBcXGAke291dHB1dFBhdGh9XFxgIGFyZSBzYW1lLCBidXQgdGhlaXIgdmFsdWVzIGFyZSBub3QgZXF1YWwsIHBsZWFzZSByZW1vdmUgb25lIG9mIHRoZW0gb3IgY2hhbmdlIG9uZSBvZiB0aGUga2V5cy5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19
|