barsa-novin-ray-core 2.2.73 → 2.2.75
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/fesm2022/barsa-novin-ray-core.mjs +630 -651
- package/fesm2022/barsa-novin-ray-core.mjs.map +1 -1
- package/lib/abstract-classes/field-base.d.ts +1 -1
- package/lib/abstract-classes/number-base.d.ts +1 -1
- package/lib/date-services/date-hijri.service.d.ts +1 -1
- package/lib/date-services/date.service.d.ts +1 -1
- package/lib/directives/base.directive.d.ts +1 -1
- package/lib/dynamic-component/base-view-item-props.d.ts +4 -4
- package/lib/resolvers/login-settings.resolver.d.ts +1 -1
- package/lib/resolvers/tile-group-breadcrumb.resolver.d.ts +1 -1
- package/lib/services/notification.service.d.ts +2 -2
- package/lib/services/portal.service.d.ts +1 -1
- package/package.json +3 -5
- package/esm2022/barsa-novin-ray-core.mjs +0 -5
- package/esm2022/lib/abstract-classes/application-base.mjs +0 -25
- package/esm2022/lib/abstract-classes/barsa-api.mjs +0 -43
- package/esm2022/lib/abstract-classes/base-column-props.mjs +0 -89
- package/esm2022/lib/abstract-classes/base.component.mjs +0 -60
- package/esm2022/lib/abstract-classes/field-base.mjs +0 -244
- package/esm2022/lib/abstract-classes/files-validation-helper.mjs +0 -75
- package/esm2022/lib/abstract-classes/form-base.mjs +0 -164
- package/esm2022/lib/abstract-classes/form-field-report-page.component.mjs +0 -54
- package/esm2022/lib/abstract-classes/form-page-base.mjs +0 -132
- package/esm2022/lib/abstract-classes/form-page.component.mjs +0 -53
- package/esm2022/lib/abstract-classes/form-props.base.mjs +0 -100
- package/esm2022/lib/abstract-classes/form-toolbar-base.mjs +0 -57
- package/esm2022/lib/abstract-classes/index.mjs +0 -25
- package/esm2022/lib/abstract-classes/layout-item-base.mjs +0 -49
- package/esm2022/lib/abstract-classes/layout-panel-base.mjs +0 -68
- package/esm2022/lib/abstract-classes/linear-list-helper.mjs +0 -135
- package/esm2022/lib/abstract-classes/models.mjs +0 -184
- package/esm2022/lib/abstract-classes/module-with-dynamic-components.mjs +0 -2
- package/esm2022/lib/abstract-classes/number-base.mjs +0 -201
- package/esm2022/lib/abstract-classes/page-base.mjs +0 -98
- package/esm2022/lib/abstract-classes/page-with-form-handler-base.mjs +0 -41
- package/esm2022/lib/abstract-classes/report-base.mjs +0 -266
- package/esm2022/lib/abstract-classes/report-item-base.mjs +0 -54
- package/esm2022/lib/abstract-classes/report-view-base.component.mjs +0 -450
- package/esm2022/lib/abstract-classes/system-base.mjs +0 -25
- package/esm2022/lib/abstract-classes/tile-props.mjs +0 -49
- package/esm2022/lib/auth-guard.mjs +0 -48
- package/esm2022/lib/barsa-novin-ray-core-routing.module.mjs +0 -311
- package/esm2022/lib/barsa-novin-ray-core.module.mjs +0 -522
- package/esm2022/lib/base-ulv-setting.component.mjs +0 -46
- package/esm2022/lib/base.module.mjs +0 -28
- package/esm2022/lib/button-loading/button-loading.component.mjs +0 -20
- package/esm2022/lib/constants.mjs +0 -963
- package/esm2022/lib/container.component.mjs +0 -100
- package/esm2022/lib/controllers/base-controller.mjs +0 -9
- package/esm2022/lib/controllers/base-view.mjs +0 -24
- package/esm2022/lib/controllers/index.mjs +0 -4
- package/esm2022/lib/controllers/models.mjs +0 -2
- package/esm2022/lib/custom-route-reuse-strategy.mjs +0 -32
- package/esm2022/lib/date-services/date-hijri.service.mjs +0 -146
- package/esm2022/lib/date-services/date-info.mjs +0 -2
- package/esm2022/lib/date-services/date-miladi.service.mjs +0 -124
- package/esm2022/lib/date-services/date-shamsi.service.mjs +0 -148
- package/esm2022/lib/date-services/date.service.mjs +0 -149
- package/esm2022/lib/date-services/index.mjs +0 -6
- package/esm2022/lib/device.mjs +0 -663
- package/esm2022/lib/directives/absolute-div-body.directive.mjs +0 -46
- package/esm2022/lib/directives/anchor-scroll.directive.mjs +0 -25
- package/esm2022/lib/directives/attr-rtl.directive.mjs +0 -36
- package/esm2022/lib/directives/base.directive.mjs +0 -55
- package/esm2022/lib/directives/body-click.directive.mjs +0 -36
- package/esm2022/lib/directives/column-resizer.directive.mjs +0 -40
- package/esm2022/lib/directives/copy.directive.mjs +0 -60
- package/esm2022/lib/directives/count-down.directive.mjs +0 -109
- package/esm2022/lib/directives/dynamic-command.directive.mjs +0 -43
- package/esm2022/lib/directives/dynamic-style.directive.mjs +0 -66
- package/esm2022/lib/directives/ellapsis-text.directive.mjs +0 -70
- package/esm2022/lib/directives/ellipsify.directive.mjs +0 -73
- package/esm2022/lib/directives/field-binding.directive.mjs +0 -18
- package/esm2022/lib/directives/fill-empty-space.mjs +0 -89
- package/esm2022/lib/directives/form-close.directive.mjs +0 -33
- package/esm2022/lib/directives/img-lazy.directive.mjs +0 -82
- package/esm2022/lib/directives/index.mjs +0 -42
- package/esm2022/lib/directives/intersection-observer.directive.mjs +0 -52
- package/esm2022/lib/directives/items-renderer.directive.mjs +0 -60
- package/esm2022/lib/directives/label-mandatory.directive.mjs +0 -49
- package/esm2022/lib/directives/load-external-files.directive.mjs +0 -38
- package/esm2022/lib/directives/mobile.directive.mjs +0 -30
- package/esm2022/lib/directives/nowraptext.directive.mjs +0 -27
- package/esm2022/lib/directives/numbers-only-input.directive.mjs +0 -27
- package/esm2022/lib/directives/placeHolder.directive.mjs +0 -16
- package/esm2022/lib/directives/prevent-default.directive.mjs +0 -21
- package/esm2022/lib/directives/print-files.directive.mjs +0 -39
- package/esm2022/lib/directives/render-ulv-paging.directive.mjs +0 -81
- package/esm2022/lib/directives/render-ulv-viewer.directive.mjs +0 -76
- package/esm2022/lib/directives/render-ulv.directive.mjs +0 -52
- package/esm2022/lib/directives/route-form-change.directive.mjs +0 -38
- package/esm2022/lib/directives/save-image.directive.mjs +0 -28
- package/esm2022/lib/directives/splide-slider.directive.mjs +0 -113
- package/esm2022/lib/directives/stop-propagation.directive.mjs +0 -21
- package/esm2022/lib/directives/table-resizer.directive.mjs +0 -236
- package/esm2022/lib/directives/ulv-command.directive.mjs +0 -43
- package/esm2022/lib/directives/until-inview.directive.mjs +0 -53
- package/esm2022/lib/directives/webotp.directive.mjs +0 -49
- package/esm2022/lib/directives/workflow-choice-command.directive.mjs +0 -61
- package/esm2022/lib/dynamic-component/base-dynamic.component.mjs +0 -97
- package/esm2022/lib/dynamic-component/base-form-toolbaritem-props.mjs +0 -53
- package/esm2022/lib/dynamic-component/base-item-content-props.mjs +0 -83
- package/esm2022/lib/dynamic-component/base-view-content-props.mjs +0 -27
- package/esm2022/lib/dynamic-component/base-view-item-props.mjs +0 -552
- package/esm2022/lib/dynamic-component/base-view-props.mjs +0 -163
- package/esm2022/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +0 -38
- package/esm2022/lib/dynamic-component/dynamic-form.component.mjs +0 -69
- package/esm2022/lib/dynamic-component/dynamic-item.component.mjs +0 -78
- package/esm2022/lib/dynamic-component/dynamic-layout.component.mjs +0 -64
- package/esm2022/lib/dynamic-component/index.mjs +0 -11
- package/esm2022/lib/empty-page/empty-page.component.mjs +0 -49
- package/esm2022/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +0 -16
- package/esm2022/lib/field-ui/field-ui.component.mjs +0 -149
- package/esm2022/lib/form/form.component.mjs +0 -212
- package/esm2022/lib/form-new/form-new.component.mjs +0 -31
- package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page-routing.module.mjs +0 -54
- package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page.module.mjs +0 -29
- package/esm2022/lib/form-page-routing/constants.mjs +0 -9
- package/esm2022/lib/form-page-routing/index.mjs +0 -3
- package/esm2022/lib/from-intersection-observer.mjs +0 -53
- package/esm2022/lib/global-error-handler.mjs +0 -26
- package/esm2022/lib/injdection-tokens.mjs +0 -8
- package/esm2022/lib/modal-root.component.mjs +0 -34
- package/esm2022/lib/not-found/not-found.component.mjs +0 -16
- package/esm2022/lib/not-internet/not-internet.component.mjs +0 -21
- package/esm2022/lib/pipes/barsa-icon-dict.pipe.mjs +0 -20
- package/esm2022/lib/pipes/bbb-translate.pipe.mjs +0 -36
- package/esm2022/lib/pipes/can-upload.pipe.mjs +0 -27
- package/esm2022/lib/pipes/card-media-size.pipe.mjs +0 -21
- package/esm2022/lib/pipes/column-custom-component.pipe.mjs +0 -41
- package/esm2022/lib/pipes/column-customui.pipe.mjs +0 -33
- package/esm2022/lib/pipes/column-icon.pipe.mjs +0 -23
- package/esm2022/lib/pipes/column-value.pipe.mjs +0 -35
- package/esm2022/lib/pipes/column-valueof-parameters.pipe.mjs +0 -34
- package/esm2022/lib/pipes/combo-row-img.pipe.mjs +0 -17
- package/esm2022/lib/pipes/context-menu.pipe.mjs +0 -41
- package/esm2022/lib/pipes/control-ui.pipe.mjs +0 -32
- package/esm2022/lib/pipes/convert-to-style.pipe.mjs +0 -33
- package/esm2022/lib/pipes/date-time-to-caption.pipe.mjs +0 -35
- package/esm2022/lib/pipes/fileinfo-count.pipe.mjs +0 -21
- package/esm2022/lib/pipes/filter-columns-by-details.pipe.mjs +0 -23
- package/esm2022/lib/pipes/filter-inline-action-list.pipe.mjs +0 -19
- package/esm2022/lib/pipes/filter-string.pipe.mjs +0 -45
- package/esm2022/lib/pipes/filter-tab.pipe.mjs +0 -20
- package/esm2022/lib/pipes/filter-toolbar-control.pipe.mjs +0 -17
- package/esm2022/lib/pipes/filter-workflow-mobile.pipe.mjs +0 -25
- package/esm2022/lib/pipes/filter.pipe.mjs +0 -34
- package/esm2022/lib/pipes/find-column-by-db-name.pipe.mjs +0 -28
- package/esm2022/lib/pipes/find-preview-column.pipe.mjs +0 -20
- package/esm2022/lib/pipes/fiori-icon.pipe.mjs +0 -43
- package/esm2022/lib/pipes/groupby.pipe.mjs +0 -64
- package/esm2022/lib/pipes/header-facet-value.pipe.mjs +0 -23
- package/esm2022/lib/pipes/hide-accept-cancel-buttons.pipe.mjs +0 -24
- package/esm2022/lib/pipes/hide-columns-inmobile.pipe.mjs +0 -23
- package/esm2022/lib/pipes/index.mjs +0 -55
- package/esm2022/lib/pipes/isimage.pipe.mjs +0 -20
- package/esm2022/lib/pipes/list-count.pipe.mjs +0 -18
- package/esm2022/lib/pipes/merge-fields-to-columns.pipe.mjs +0 -43
- package/esm2022/lib/pipes/mo-info-ulv-data.pipe.mjs +0 -59
- package/esm2022/lib/pipes/mo-info-ulv-paging.pipe.mjs +0 -17
- package/esm2022/lib/pipes/mo-report-value-concat.pipe.mjs +0 -36
- package/esm2022/lib/pipes/mo-report-value.pipe.mjs +0 -18
- package/esm2022/lib/pipes/mo-value.pipe.mjs +0 -19
- package/esm2022/lib/pipes/multiple-groupby.pipe.mjs +0 -91
- package/esm2022/lib/pipes/numeral.pipe.mjs +0 -44
- package/esm2022/lib/pipes/picture-field-source.pipe.mjs +0 -23
- package/esm2022/lib/pipes/remove-newline.pipe.mjs +0 -21
- package/esm2022/lib/pipes/replace.pipe.mjs +0 -18
- package/esm2022/lib/pipes/reverse.pipe.mjs +0 -23
- package/esm2022/lib/pipes/rownumber.pipe.mjs +0 -26
- package/esm2022/lib/pipes/sanitize-text.pipe.mjs +0 -21
- package/esm2022/lib/pipes/seperator-fix.pipe.mjs +0 -24
- package/esm2022/lib/pipes/sort.pipe.mjs +0 -49
- package/esm2022/lib/pipes/string-to-number.pipe.mjs +0 -26
- package/esm2022/lib/pipes/th-image-icon.pipe.mjs +0 -22
- package/esm2022/lib/pipes/tlbButtons.pipe.mjs +0 -60
- package/esm2022/lib/pipes/toolbar-settings.pipe.mjs +0 -27
- package/esm2022/lib/pipes/total-summary.pipe.mjs +0 -17
- package/esm2022/lib/pipes/tree-item-isexpanded.pipe.mjs +0 -26
- package/esm2022/lib/pipes/visible-value.pipe.mjs +0 -19
- package/esm2022/lib/portal-page/portal-page.component.mjs +0 -24
- package/esm2022/lib/portal-page/portal-sidebar.component.mjs +0 -37
- package/esm2022/lib/redirect-home-guard.mjs +0 -51
- package/esm2022/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +0 -12
- package/esm2022/lib/report-container/report-container.component.mjs +0 -63
- package/esm2022/lib/resizable-module/resizable.component.mjs +0 -31
- package/esm2022/lib/resizable-module/resizable.directive.mjs +0 -42
- package/esm2022/lib/resizable-module/resizable.module.mjs +0 -17
- package/esm2022/lib/resolvers/index.mjs +0 -7
- package/esm2022/lib/resolvers/login-settings.resolver.mjs +0 -18
- package/esm2022/lib/resolvers/portal-dynamic-page.resolver.mjs +0 -49
- package/esm2022/lib/resolvers/portal-form-page.resolver.mjs +0 -18
- package/esm2022/lib/resolvers/portal-page.resolver.mjs +0 -30
- package/esm2022/lib/resolvers/portal-report-page.resolver.mjs +0 -37
- package/esm2022/lib/resolvers/tile-group-breadcrumb.resolver.mjs +0 -30
- package/esm2022/lib/root-page/root-page.component.mjs +0 -21
- package/esm2022/lib/root-portal/root-portal.component.mjs +0 -236
- package/esm2022/lib/server-connection-error/server-connection-error.component.mjs +0 -19
- package/esm2022/lib/services/api.service.mjs +0 -63
- package/esm2022/lib/services/audio-recording.service.mjs +0 -95
- package/esm2022/lib/services/barsa-dialog.service.mjs +0 -80
- package/esm2022/lib/services/barsa-storage.service.mjs +0 -78
- package/esm2022/lib/services/breadcrumb.service.mjs +0 -64
- package/esm2022/lib/services/column.service.mjs +0 -20
- package/esm2022/lib/services/container.service.mjs +0 -69
- package/esm2022/lib/services/dynamic-component.service.mjs +0 -55
- package/esm2022/lib/services/form-panel.service.mjs +0 -394
- package/esm2022/lib/services/form.service.mjs +0 -14
- package/esm2022/lib/services/groupby.service.mjs +0 -21
- package/esm2022/lib/services/horizontal-layout.service.mjs +0 -16
- package/esm2022/lib/services/index.mjs +0 -32
- package/esm2022/lib/services/indexeddb.service.mjs +0 -34
- package/esm2022/lib/services/layout-main-content.service.mjs +0 -19
- package/esm2022/lib/services/layout.service.mjs +0 -42
- package/esm2022/lib/services/local-storage.service.mjs +0 -32
- package/esm2022/lib/services/log.service.mjs +0 -50
- package/esm2022/lib/services/network-status.service.mjs +0 -15
- package/esm2022/lib/services/notification-popup.service.mjs +0 -2
- package/esm2022/lib/services/notification-sw.service.mjs +0 -180
- package/esm2022/lib/services/notification.service.mjs +0 -189
- package/esm2022/lib/services/portal.service.mjs +0 -950
- package/esm2022/lib/services/prompt-update.service.mjs +0 -56
- package/esm2022/lib/services/routing.service.mjs +0 -60
- package/esm2022/lib/services/save-scoll-position.service.mjs +0 -29
- package/esm2022/lib/services/service-worker-communication.service.mjs +0 -120
- package/esm2022/lib/services/tabpage.service.mjs +0 -13
- package/esm2022/lib/services/toast.service.mjs +0 -2
- package/esm2022/lib/services/ui.service.mjs +0 -23
- package/esm2022/lib/services/ulvmain.service.mjs +0 -824
- package/esm2022/lib/services/upload.service.mjs +0 -166
- package/esm2022/lib/services/video-recording.service.mjs +0 -115
- package/esm2022/lib/unlimit-session/unlimit-session.component.mjs +0 -40
- package/esm2022/public-api.mjs +0 -42
|
@@ -1,963 +0,0 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
import { _isNumberValue } from '@angular/cdk/coercion';
|
|
3
|
-
import { BarsaApi } from './abstract-classes/barsa-api';
|
|
4
|
-
import { DateHijriService, DateMiladiService, DateShamsiService } from './date-services';
|
|
5
|
-
import * as Device from './device';
|
|
6
|
-
import { FormControl, FormGroup } from '@angular/forms';
|
|
7
|
-
export var TableHeaderWidthMode;
|
|
8
|
-
(function (TableHeaderWidthMode) {
|
|
9
|
-
TableHeaderWidthMode[TableHeaderWidthMode["FitToRowContent"] = 1] = "FitToRowContent";
|
|
10
|
-
TableHeaderWidthMode[TableHeaderWidthMode["FitToContainer"] = 2] = "FitToContainer";
|
|
11
|
-
TableHeaderWidthMode[TableHeaderWidthMode["FreeColumnSize"] = 3] = "FreeColumnSize";
|
|
12
|
-
TableHeaderWidthMode[TableHeaderWidthMode["ColumnWidth"] = 4] = "ColumnWidth";
|
|
13
|
-
})(TableHeaderWidthMode || (TableHeaderWidthMode = {}));
|
|
14
|
-
export function setTableThWidth(tableHeaderMode, columns, thList, renderer2) {
|
|
15
|
-
let propName = '';
|
|
16
|
-
switch (tableHeaderMode) {
|
|
17
|
-
case TableHeaderWidthMode.FitToRowContent:
|
|
18
|
-
propName = '$FitToContent';
|
|
19
|
-
break;
|
|
20
|
-
case TableHeaderWidthMode.FitToContainer:
|
|
21
|
-
propName = '$FitContainerWidth';
|
|
22
|
-
break;
|
|
23
|
-
case TableHeaderWidthMode.FreeColumnSize:
|
|
24
|
-
propName = '$Width';
|
|
25
|
-
break;
|
|
26
|
-
case TableHeaderWidthMode.ColumnWidth:
|
|
27
|
-
propName = '$ColumnWidth';
|
|
28
|
-
break;
|
|
29
|
-
}
|
|
30
|
-
thList.forEach((c, i) => {
|
|
31
|
-
const wx = _calcWidthOfTh(columns[i], i, propName, thList);
|
|
32
|
-
wx && renderer2.setStyle(c, 'width', wx);
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
function _calcWidthOfTh(column, i, propName, thList) {
|
|
36
|
-
if (!column) {
|
|
37
|
-
return '';
|
|
38
|
-
}
|
|
39
|
-
if (column.$IsImageOricon && i < thList.length - 1) {
|
|
40
|
-
const fieldTypeId = +column.FieldTypeId;
|
|
41
|
-
if (fieldTypeId === 6 || fieldTypeId === 5 || fieldTypeId === 42) {
|
|
42
|
-
return '24px';
|
|
43
|
-
}
|
|
44
|
-
debugger;
|
|
45
|
-
}
|
|
46
|
-
return column.$IsImageOricon && i < thList.length - 1 ? '42px' : column[propName];
|
|
47
|
-
}
|
|
48
|
-
export function calculateColumnContent(columns, moDataList) {
|
|
49
|
-
columns.forEach((column) => {
|
|
50
|
-
setColumnWidthByMaxMoContentWidth(moDataList, column);
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
export function calculateColumnWidth(container, columns, moDataList, disableContextMenuOverflow, contextMenuItems) {
|
|
54
|
-
columns
|
|
55
|
-
.filter((c) => !c.Hidden)
|
|
56
|
-
.forEach((column) => {
|
|
57
|
-
setColumnCaptionWidth(column);
|
|
58
|
-
});
|
|
59
|
-
const contextMenuWidth = calcContextMenuWidth(contextMenuItems, disableContextMenuOverflow);
|
|
60
|
-
return { columns: [...columns], contextMenuWidth };
|
|
61
|
-
}
|
|
62
|
-
function setColumnCaptionWidth(column) {
|
|
63
|
-
if (column.$ColumnWidthNum) {
|
|
64
|
-
return column.$ColumnWidthNum;
|
|
65
|
-
}
|
|
66
|
-
const colCaptionWidth = measureText(column.Alias) + 16 + 10;
|
|
67
|
-
column.$ColumnWidthNum = Math.ceil(colCaptionWidth);
|
|
68
|
-
column.$ColumnWidth = `${column.$ColumnWidthNum}px`;
|
|
69
|
-
return colCaptionWidth;
|
|
70
|
-
}
|
|
71
|
-
export function setColumnWidthByMaxMoContentWidth(moDataList, column) {
|
|
72
|
-
const width = calculateMoDataListContentWidthByColumnName(moDataList, column);
|
|
73
|
-
column.$ContentWidth = `${Math.ceil(width)}px`;
|
|
74
|
-
}
|
|
75
|
-
export function calculateMoDataListContentWidthByColumnName(moDataList, column) {
|
|
76
|
-
let maxWidth = 0;
|
|
77
|
-
moDataList.forEach((c, index) => {
|
|
78
|
-
const caption = getColumnValueOfMoDataList(column.Name, c, undefined, true);
|
|
79
|
-
const captionWidth = measureText(caption) + 16;
|
|
80
|
-
if (maxWidth < captionWidth) {
|
|
81
|
-
maxWidth = captionWidth;
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
return Math.ceil(maxWidth);
|
|
85
|
-
}
|
|
86
|
-
export function calculateFreeColumnSize(columns) {
|
|
87
|
-
let allColWidth = 0;
|
|
88
|
-
const visibleColumns = columns.filter((c) => !c.Hidden);
|
|
89
|
-
visibleColumns.forEach((col, index) => {
|
|
90
|
-
const x = setColumnCaptionWidth(col);
|
|
91
|
-
const w = col.Width && col.Width > 0 ? col.Width : x;
|
|
92
|
-
allColWidth += w;
|
|
93
|
-
col.$Width = index === visibleColumns.length - 1 ? '100%' : `${w}px`;
|
|
94
|
-
});
|
|
95
|
-
return [...columns];
|
|
96
|
-
}
|
|
97
|
-
export function calculateColumnWidthFitToContainer(container, canView, disableContextMenuOverflow, contextMenuItems, columns) {
|
|
98
|
-
let hasDefinedWidth = true;
|
|
99
|
-
let containerWidth = columns.map((c) => c.Width).reduce((a, b) => a + b, 0);
|
|
100
|
-
if (containerWidth === 0) {
|
|
101
|
-
containerWidth = container.clientWidth;
|
|
102
|
-
hasDefinedWidth = false;
|
|
103
|
-
}
|
|
104
|
-
let allColWidth = 0;
|
|
105
|
-
const isMobile = getDeviceIsMobile();
|
|
106
|
-
let remainPercent = 0;
|
|
107
|
-
const lCols = columns.filter((c, i) => !c.Hidden && !(i === 0 && c.FieldTypeId === 41));
|
|
108
|
-
lCols.forEach((col, index) => {
|
|
109
|
-
// اگر فیلد از نوع رنگ نبود و ستون اول هم نبود
|
|
110
|
-
const x = setColumnCaptionWidth(col);
|
|
111
|
-
const w = col.Width && col.Width > 0 ? col.Width : x;
|
|
112
|
-
allColWidth += w;
|
|
113
|
-
const percent = (w / containerWidth) * 100;
|
|
114
|
-
col.$FitContainerWidth = isMobile || col.Width === 0 ? '100%' : `${percent}%`;
|
|
115
|
-
if (index === lCols.length - 1 && !hasDefinedWidth) {
|
|
116
|
-
col.$FitContainerWidth = 100 - remainPercent + '%';
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
remainPercent += percent;
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
// const canViewButtonWidth = canView ? 40 : 0;
|
|
123
|
-
// const selectionWidth = 30;
|
|
124
|
-
const contextMenuWidth = calcContextMenuWidth(contextMenuItems, disableContextMenuOverflow);
|
|
125
|
-
// const containerWidthAllColumns = containerWidth - selectionWidth - canViewButtonWidth - contextMenuWidth - 12;
|
|
126
|
-
// allColWidth += containerWidthAllColumns - allColWidth;// محاسبه آخرین ستون.چون width مشخصی ندارد
|
|
127
|
-
// columns
|
|
128
|
-
// .filter((c) => !c.Hidden)
|
|
129
|
-
// .forEach((col) => {
|
|
130
|
-
// const newWidth = Math.ceil((containerWidthAllColumns * col.Width) / allColWidth);
|
|
131
|
-
// col.Width = newWidth;
|
|
132
|
-
// col.$FitContainerWidth = `${newWidth}px`;
|
|
133
|
-
// });
|
|
134
|
-
return { columns: [...columns], contextMenuWidth };
|
|
135
|
-
}
|
|
136
|
-
export function calcContextMenuWidth(contextMenuItems, disableContextMenuOverflow) {
|
|
137
|
-
let contextMenuWidth = contextMenuItems.length > 1 ? 40 : 0;
|
|
138
|
-
const btnPadding = 14 + 2 + 10; // padding + border + if text is overflowed then add 5 pixel.so we always 5 px to it.
|
|
139
|
-
const tdPadding = 15 + 1; // padding + border
|
|
140
|
-
const buttonIconWidth = 16 + 6; // size + margin
|
|
141
|
-
if (disableContextMenuOverflow || contextMenuItems.length === 1) {
|
|
142
|
-
contextMenuWidth = 0;
|
|
143
|
-
contextMenuItems.forEach((c) => {
|
|
144
|
-
contextMenuWidth += measureText(c.text) + btnPadding + tdPadding;
|
|
145
|
-
contextMenuWidth += c.icon ? buttonIconWidth : 0;
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
return contextMenuWidth;
|
|
149
|
-
}
|
|
150
|
-
export function isInLocalMode() {
|
|
151
|
-
const offlinceActive = BarsaApi.Common.Util.TryGetValue(BarsaApi.Offline, 'Settings.IsActive', false);
|
|
152
|
-
const offlineTrue = BarsaApi.Common.Util.TryGetValue(BarsaApi.Offline, 'Settings.IsOffline', false);
|
|
153
|
-
return offlinceActive && offlineTrue;
|
|
154
|
-
}
|
|
155
|
-
export function getLabelWidth(item) {
|
|
156
|
-
const fieldXtype = item.FieldUi?.originalXtype;
|
|
157
|
-
if (fieldXtype === 'Ui.Button' ||
|
|
158
|
-
fieldXtype === 'Ui.CheckBox' ||
|
|
159
|
-
!item.TextVisible ||
|
|
160
|
-
item.CaptionSetting?.AlignMode === 'AutoSize') {
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
let labelCaption = item.Caption;
|
|
164
|
-
if (labelCaption === '‌') {
|
|
165
|
-
labelCaption = '';
|
|
166
|
-
}
|
|
167
|
-
labelCaption = labelCaption + ' * ';
|
|
168
|
-
// if (item.FieldUi?.Setting?.IsMandatory) {
|
|
169
|
-
// if (labelCaption.indexOf('*') < 0) {
|
|
170
|
-
// }
|
|
171
|
-
// } else {
|
|
172
|
-
// labelCaption = labelCaption.replace('*', '');
|
|
173
|
-
// }
|
|
174
|
-
labelCaption += ':';
|
|
175
|
-
const labelWidth = measureText(labelCaption);
|
|
176
|
-
let labelWithPadding = labelWidth + 10;
|
|
177
|
-
if (item.FieldUi?.Setting?.FieldIcon) {
|
|
178
|
-
labelWithPadding += 24;
|
|
179
|
-
}
|
|
180
|
-
if (item.FieldUi?.Setting?.HelpDescription) {
|
|
181
|
-
labelWithPadding += 24;
|
|
182
|
-
}
|
|
183
|
-
const controlWidth = Math.ceil(labelWithPadding);
|
|
184
|
-
return controlWidth;
|
|
185
|
-
}
|
|
186
|
-
export function getColumnValueOfMoDataList(name, mo, Columns, caption) {
|
|
187
|
-
let fieldName = Columns ? Columns.find((c) => c.Name === name || c.Alias === name)?.Name : name;
|
|
188
|
-
if (!fieldName) {
|
|
189
|
-
fieldName = name;
|
|
190
|
-
}
|
|
191
|
-
let val = fieldName ? mo[fieldName] : undefined;
|
|
192
|
-
if (caption) {
|
|
193
|
-
let captionVal = fieldName ? mo[fieldName]?.$Caption : undefined;
|
|
194
|
-
if (typeof captionVal === 'undefined') {
|
|
195
|
-
captionVal = mo[fieldName + '$Caption'];
|
|
196
|
-
}
|
|
197
|
-
if (typeof captionVal === 'undefined') {
|
|
198
|
-
captionVal = val;
|
|
199
|
-
}
|
|
200
|
-
val = captionVal;
|
|
201
|
-
}
|
|
202
|
-
return val;
|
|
203
|
-
}
|
|
204
|
-
export function throwIfAlreadyLoaded(parentModule, moduleName) {
|
|
205
|
-
if (parentModule) {
|
|
206
|
-
throw new Error(`${moduleName} has already been loaded. Import ${moduleName} in the AppModule only.`);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
const measureTextValues = {};
|
|
210
|
-
export function measureText(text, fontSize) {
|
|
211
|
-
if (measureTextValues[text]) {
|
|
212
|
-
return measureTextValues[text];
|
|
213
|
-
}
|
|
214
|
-
const measureTextDom = document.getElementById('measureText');
|
|
215
|
-
if (!measureTextDom) {
|
|
216
|
-
return -1;
|
|
217
|
-
}
|
|
218
|
-
const ctx = measureTextDom.getContext('2d');
|
|
219
|
-
fontSize = fontSize ? fontSize : '0.885rem';
|
|
220
|
-
ctx.font = `normal ${fontSize} IRANYekanDigits`;
|
|
221
|
-
const x = ctx.measureText(text).width;
|
|
222
|
-
measureTextValues[text] = x;
|
|
223
|
-
return x;
|
|
224
|
-
}
|
|
225
|
-
export function genrateInlineMoId() {
|
|
226
|
-
return (BarsaApi.idGenerator--).toString();
|
|
227
|
-
}
|
|
228
|
-
export function enumValueToStringSize(value, defaultValue) {
|
|
229
|
-
switch (value) {
|
|
230
|
-
case '1':
|
|
231
|
-
return 's';
|
|
232
|
-
case '2':
|
|
233
|
-
return 'm';
|
|
234
|
-
case '3':
|
|
235
|
-
return 'l';
|
|
236
|
-
default:
|
|
237
|
-
return defaultValue;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
export function executeUlvCommandHandler(button, options) {
|
|
241
|
-
if (button.Command && button.Command.Handler) {
|
|
242
|
-
button.Command.Handler(button, options);
|
|
243
|
-
}
|
|
244
|
-
else if (button.handler) {
|
|
245
|
-
button.handler.bind(button.scope)(button, options);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
export function getUniqueId(parts) {
|
|
249
|
-
const stringArr = [];
|
|
250
|
-
for (let i = 0; i < parts; i++) {
|
|
251
|
-
// eslint-disable-next-line no-bitwise
|
|
252
|
-
const S4 = (((1 + Math.random()) * 0x10000) | 0).toString(16);
|
|
253
|
-
const S4_ = S4.length > 0 ? S4.substring(1) : '';
|
|
254
|
-
stringArr.push(S4_);
|
|
255
|
-
}
|
|
256
|
-
return stringArr.join('-');
|
|
257
|
-
}
|
|
258
|
-
export function getDateService(logService, culture) {
|
|
259
|
-
const defaultCulture = culture ?? BarsaApi.LoginFormData.Culture;
|
|
260
|
-
switch (defaultCulture) {
|
|
261
|
-
case 'fa-IR':
|
|
262
|
-
return new DateShamsiService(logService);
|
|
263
|
-
case 'ar-AE':
|
|
264
|
-
return new DateHijriService(logService);
|
|
265
|
-
default:
|
|
266
|
-
return new DateMiladiService(logService);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
export function getAllItemsPerChildren(item, level, array, parentNode, autoOpenLevels) {
|
|
270
|
-
let newItem = item;
|
|
271
|
-
if (level > 0) {
|
|
272
|
-
item.parentNode = parentNode;
|
|
273
|
-
item.level = level;
|
|
274
|
-
item.isExpand = item.isExpand ?? autoOpenLevels > level;
|
|
275
|
-
item.visibility = item.parentNode.isExpand;
|
|
276
|
-
array.push(newItem);
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
newItem = item;
|
|
280
|
-
newItem.isExpand = true;
|
|
281
|
-
}
|
|
282
|
-
if (item.children) {
|
|
283
|
-
item.children.forEach((child) => setOneDepthLevel(child));
|
|
284
|
-
return item.children.map((i) => getAllItemsPerChildren(i, level + 1, array, newItem, autoOpenLevels));
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
export function setOneDepthLevel(node) {
|
|
288
|
-
let hasOneDepth = true;
|
|
289
|
-
node.children?.forEach((child) => {
|
|
290
|
-
if (child.Data?.$HasChildren) {
|
|
291
|
-
hasOneDepth = false;
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
node.hasOneDepthLevel = hasOneDepth;
|
|
296
|
-
}
|
|
297
|
-
export function isFirefox() {
|
|
298
|
-
return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
|
|
299
|
-
}
|
|
300
|
-
export function getImagePath(type, moId, fileId, fieldDefId, size, sizeH) {
|
|
301
|
-
moId = moId == null ? '' : encodeURIComponent(moId);
|
|
302
|
-
fileId = fileId == null ? '' : encodeURIComponent(fileId);
|
|
303
|
-
fieldDefId = fieldDefId == null ? '' : encodeURIComponent(fieldDefId);
|
|
304
|
-
size = size === null ? 128 : size;
|
|
305
|
-
sizeH = sizeH === null ? size : sizeH;
|
|
306
|
-
const url = `/IH.ashx?ty=${type}&moId=${moId}&id=${fileId}&fdId=${fieldDefId}&si=${size}&siH=${sizeH}`;
|
|
307
|
-
return url;
|
|
308
|
-
}
|
|
309
|
-
export function isFunction(functionToCheck) {
|
|
310
|
-
return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
|
|
311
|
-
}
|
|
312
|
-
export function DeviceWidth() {
|
|
313
|
-
return window.innerWidth > 0 ? window.innerWidth : screen.width;
|
|
314
|
-
}
|
|
315
|
-
export function getHeaderValue(fieldValue, returnValue) {
|
|
316
|
-
if (typeof fieldValue !== 'object') {
|
|
317
|
-
return fieldValue;
|
|
318
|
-
}
|
|
319
|
-
const value = fieldValue.Value;
|
|
320
|
-
const valueCaption = fieldValue.Value$Caption;
|
|
321
|
-
let valueObjectCaption = null;
|
|
322
|
-
if (typeof value === 'object') {
|
|
323
|
-
valueObjectCaption = fieldValue.Value.$Caption;
|
|
324
|
-
}
|
|
325
|
-
if (valueObjectCaption && !returnValue) {
|
|
326
|
-
return valueObjectCaption;
|
|
327
|
-
}
|
|
328
|
-
if (valueCaption && !valueCaption.startsWith('tmp') && !returnValue) {
|
|
329
|
-
return valueCaption;
|
|
330
|
-
}
|
|
331
|
-
return value;
|
|
332
|
-
}
|
|
333
|
-
export function elementInViewport2(el) {
|
|
334
|
-
let top = el.offsetTop;
|
|
335
|
-
let left = el.offsetLeft;
|
|
336
|
-
const width = el.offsetWidth;
|
|
337
|
-
const height = el.offsetHeight;
|
|
338
|
-
while (el.offsetParent) {
|
|
339
|
-
el = el.offsetParent;
|
|
340
|
-
top += el.offsetTop;
|
|
341
|
-
left += el.offsetLeft;
|
|
342
|
-
}
|
|
343
|
-
return (top < window.pageYOffset + window.innerHeight &&
|
|
344
|
-
left < window.pageXOffset + window.innerWidth &&
|
|
345
|
-
top + height > window.pageYOffset &&
|
|
346
|
-
left + width > window.pageXOffset);
|
|
347
|
-
}
|
|
348
|
-
export function PreventDefaulEvent(e, propagationDisable = true) {
|
|
349
|
-
if (propagationDisable) {
|
|
350
|
-
stopPropagation(e);
|
|
351
|
-
}
|
|
352
|
-
e.preventDefault();
|
|
353
|
-
}
|
|
354
|
-
export function stopPropagation(e) {
|
|
355
|
-
e.stopPropagation();
|
|
356
|
-
}
|
|
357
|
-
export function getParentHeight(elDom) {
|
|
358
|
-
let parentDom = elDom.parentElement;
|
|
359
|
-
let parentHeight = parentDom?.clientHeight ?? 0;
|
|
360
|
-
while (parentDom != null && parentHeight < 40) {
|
|
361
|
-
parentDom = parentDom.parentElement;
|
|
362
|
-
parentHeight = parentDom?.clientHeight ?? 0;
|
|
363
|
-
}
|
|
364
|
-
return parentHeight;
|
|
365
|
-
}
|
|
366
|
-
export function getComponentDefined(controlUi, customUiSetting) {
|
|
367
|
-
let moduleName = BarsaApi.LoginFormData.DefaultUiModule;
|
|
368
|
-
let moduleKebabName = BarsaApi.Common.Util.GetKebabCase(moduleName);
|
|
369
|
-
let componentName = controlUi.originalXtype.replace('.', '').replace('_', '');
|
|
370
|
-
let selector = BarsaApi.Common.Util.GetKebabCase(componentName);
|
|
371
|
-
selector = selector.substring(1, selector.length);
|
|
372
|
-
selector = BarsaApi.LoginFormData.CustomUiPrefix + '-' + selector;
|
|
373
|
-
if (customUiSetting && customUiSetting.Module) {
|
|
374
|
-
moduleName = customUiSetting.Module;
|
|
375
|
-
moduleKebabName = BarsaApi.Common.Util.GetKebabCase(moduleName);
|
|
376
|
-
componentName = customUiSetting.Name;
|
|
377
|
-
selector = customUiSetting.Selector;
|
|
378
|
-
}
|
|
379
|
-
const modulePath = moduleKebabName.slice(1, moduleKebabName.length);
|
|
380
|
-
return { moduleName, modulePath, componentName, selector };
|
|
381
|
-
}
|
|
382
|
-
export function isSafari() {
|
|
383
|
-
return Device.isSafari();
|
|
384
|
-
}
|
|
385
|
-
export function isFF() {
|
|
386
|
-
return Device.isFF();
|
|
387
|
-
}
|
|
388
|
-
export function getDeviceIsPhone() {
|
|
389
|
-
return Device.isPhone();
|
|
390
|
-
}
|
|
391
|
-
export function getDeviceIsDesktop() {
|
|
392
|
-
return Device.isDesktop();
|
|
393
|
-
}
|
|
394
|
-
export function getDeviceIsTablet() {
|
|
395
|
-
return Device.isTablet();
|
|
396
|
-
}
|
|
397
|
-
export function getDeviceIsMobile() {
|
|
398
|
-
return navigator.userAgent.indexOf('mobi') > 0 || getDeviceIsPhone();
|
|
399
|
-
}
|
|
400
|
-
export function getControlSizeMode(el, deviceSize = 'l') {
|
|
401
|
-
const containerWidth = el.offsetWidth;
|
|
402
|
-
if (containerWidth === 0) {
|
|
403
|
-
return deviceSize;
|
|
404
|
-
}
|
|
405
|
-
if (deviceSize === 's' || containerWidth < 600) {
|
|
406
|
-
deviceSize = 's';
|
|
407
|
-
}
|
|
408
|
-
else if (deviceSize === 'm' || (containerWidth > 600 && containerWidth < 1200)) {
|
|
409
|
-
deviceSize = 'm';
|
|
410
|
-
}
|
|
411
|
-
return deviceSize;
|
|
412
|
-
}
|
|
413
|
-
export function formatBytes(bytes, decimals = 2, size) {
|
|
414
|
-
if (bytes === 0) {
|
|
415
|
-
return '0 Bytes';
|
|
416
|
-
}
|
|
417
|
-
const k = 1024;
|
|
418
|
-
const dm = decimals < 0 ? 0 : decimals;
|
|
419
|
-
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|
420
|
-
const i = sizes.findIndex((c) => c === size);
|
|
421
|
-
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
|
|
422
|
-
}
|
|
423
|
-
export function getValidExtension(validExtensions) {
|
|
424
|
-
let _validExtensions = '';
|
|
425
|
-
if (Array.isArray(validExtensions)) {
|
|
426
|
-
_validExtensions = validExtensions.map((c) => '.' + c.Extension).join(',');
|
|
427
|
-
}
|
|
428
|
-
return _validExtensions;
|
|
429
|
-
}
|
|
430
|
-
export function getIcon(type) {
|
|
431
|
-
return BarsaApi.Common.File.FileIconDict128[type];
|
|
432
|
-
}
|
|
433
|
-
export function isImage(type) {
|
|
434
|
-
if (!type) {
|
|
435
|
-
return false;
|
|
436
|
-
}
|
|
437
|
-
type = type.toLowerCase();
|
|
438
|
-
return ['img', 'png', 'jpeg', 'jpg', 'gif', 'bmp', 'tiff', 'image', 'jfif'].indexOf(type) > -1;
|
|
439
|
-
}
|
|
440
|
-
export function GetAllColumnsSorted(context) {
|
|
441
|
-
const allColumns = BarsaApi.Common.Util.TryGetValue(context, 'Setting.View.Columns', []).filter((c) => c.Name !== 'Id' && c.Name !== '$StyleIndex' && !c.Hidden);
|
|
442
|
-
const colList = BarsaApi.Common.Util.TryGetValue(context, 'Setting.View.GridSetting.ColSettingList', []);
|
|
443
|
-
const columns = new Array();
|
|
444
|
-
colList.forEach((colS) => {
|
|
445
|
-
const columnOfColList = allColumns.find((c) => c.Name === colS.Name);
|
|
446
|
-
if (columnOfColList) {
|
|
447
|
-
columns.push({ ...columnOfColList, Hidden: colS.IsHidden, Width: colS.Width });
|
|
448
|
-
}
|
|
449
|
-
});
|
|
450
|
-
allColumns.forEach((column, index) => {
|
|
451
|
-
const colSetting = colList.find((c) => c.Name === column.Name);
|
|
452
|
-
if (!colSetting) {
|
|
453
|
-
columns.splice(index, 0, { ...column, Hidden: colList.length > 0 ? true : false });
|
|
454
|
-
}
|
|
455
|
-
});
|
|
456
|
-
return columns;
|
|
457
|
-
}
|
|
458
|
-
export function GetVisibleValue(object, field) {
|
|
459
|
-
let outputValue;
|
|
460
|
-
if (object[field]?.$Caption !== undefined) {
|
|
461
|
-
outputValue = object[field].$Caption;
|
|
462
|
-
}
|
|
463
|
-
else {
|
|
464
|
-
outputValue = object[field + '$Caption'] !== undefined ? object[field + '$Caption'] : object[field];
|
|
465
|
-
}
|
|
466
|
-
return outputValue;
|
|
467
|
-
}
|
|
468
|
-
export function GroupBy(collection, sortSettings) {
|
|
469
|
-
const grouped = {};
|
|
470
|
-
const groups = sortSettings.map((c) => c.Name);
|
|
471
|
-
const getTitle = (mo, fieldName) => GetVisibleValue(mo, fieldName);
|
|
472
|
-
collection.forEach((a) => {
|
|
473
|
-
groups
|
|
474
|
-
.reduce((o, g, i) => {
|
|
475
|
-
const groupTitle = getTitle(a, g);
|
|
476
|
-
o[groupTitle] = o[groupTitle] || (i + 1 === groups.length ? [] : {});
|
|
477
|
-
if (Array.isArray(o[groupTitle])) {
|
|
478
|
-
a.$Level = groups.length;
|
|
479
|
-
let title = getTitle(a, groups[0]);
|
|
480
|
-
let parent = grouped[title];
|
|
481
|
-
parent.$Count = (parent.$Count ?? 0) + 1;
|
|
482
|
-
for (let j = 1; j < groups.length - 1; j++) {
|
|
483
|
-
title = getTitle(a, groups[j]);
|
|
484
|
-
parent = parent[title];
|
|
485
|
-
parent.$Count = o[groupTitle].length + 1;
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
else {
|
|
489
|
-
const a2 = FindGroup(groupTitle, a);
|
|
490
|
-
o[groupTitle].$Expanded = a2?.$Expanded;
|
|
491
|
-
o[groupTitle].$Visibility = a2?.$Visibility;
|
|
492
|
-
}
|
|
493
|
-
return o[groupTitle];
|
|
494
|
-
}, grouped)
|
|
495
|
-
.push(a);
|
|
496
|
-
});
|
|
497
|
-
return { grouped, groups };
|
|
498
|
-
}
|
|
499
|
-
export function FindGroup(groupTitle, a) {
|
|
500
|
-
if (a.$Group === groupTitle) {
|
|
501
|
-
return a;
|
|
502
|
-
}
|
|
503
|
-
if (a.$Parent) {
|
|
504
|
-
return FindGroup(groupTitle, a.$Parent);
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
export function FillAllLayoutControls(item, layoutControls) {
|
|
508
|
-
if (item.xtype === 'Ly.LayoutControl') {
|
|
509
|
-
layoutControls.push(item);
|
|
510
|
-
return;
|
|
511
|
-
}
|
|
512
|
-
if (!item.items?.length) {
|
|
513
|
-
return;
|
|
514
|
-
}
|
|
515
|
-
item.items.forEach((c) => FillAllLayoutControls(c, layoutControls));
|
|
516
|
-
}
|
|
517
|
-
export function FindToolbarItem(toolbarItems, value, prop = 'text') {
|
|
518
|
-
if (!toolbarItems?.length) {
|
|
519
|
-
return null;
|
|
520
|
-
}
|
|
521
|
-
const findInArray = (toolbarItems, value) => {
|
|
522
|
-
let item = null;
|
|
523
|
-
toolbarItems.forEach((c) => {
|
|
524
|
-
if (typeof c === 'object' && !item) {
|
|
525
|
-
if (c[prop] === value) {
|
|
526
|
-
item = c;
|
|
527
|
-
return;
|
|
528
|
-
}
|
|
529
|
-
else if (c.menu?.items?.length) {
|
|
530
|
-
item = findInArray(c.menu.items, value);
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
});
|
|
534
|
-
return item;
|
|
535
|
-
};
|
|
536
|
-
return findInArray(toolbarItems, value);
|
|
537
|
-
}
|
|
538
|
-
export function FindLayoutSettingFromLayout94(layout94, layoutTitle) {
|
|
539
|
-
if (!layoutTitle) {
|
|
540
|
-
return null;
|
|
541
|
-
}
|
|
542
|
-
if (layout94.Caption === layoutTitle || layout94.Title === layoutTitle || layout94.ControlId === layoutTitle) {
|
|
543
|
-
return layout94;
|
|
544
|
-
}
|
|
545
|
-
let tempLayout94 = null;
|
|
546
|
-
if (layout94.items?.length) {
|
|
547
|
-
for (let i = 0; i < layout94.items.length; i++) {
|
|
548
|
-
if (!tempLayout94) {
|
|
549
|
-
tempLayout94 = FindLayoutSettingFromLayout94(layout94.items[i], layoutTitle);
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
return tempLayout94;
|
|
554
|
-
}
|
|
555
|
-
export function getGridSettings(context) {
|
|
556
|
-
const gridSetting = BarsaApi.Common.Util.TryGetValue(context, 'Setting.View.GridSetting', null);
|
|
557
|
-
return {
|
|
558
|
-
ColSettingList: gridSetting?.ColSettingList ?? null,
|
|
559
|
-
SortSettingList: gridSetting?.SortSettingList ?? [],
|
|
560
|
-
AutoSizeColumns: gridSetting?.AutoSizeColumns ?? false
|
|
561
|
-
};
|
|
562
|
-
}
|
|
563
|
-
export function getResetGridSettings(columns, context) {
|
|
564
|
-
const colList = columns;
|
|
565
|
-
const settings = getGridSettings(context);
|
|
566
|
-
settings.ColSettingList = colList.map((c) => ({
|
|
567
|
-
IsHidden: c.Hidden,
|
|
568
|
-
Name: c.Name,
|
|
569
|
-
Width: c.Width,
|
|
570
|
-
Caption: c.Caption
|
|
571
|
-
}));
|
|
572
|
-
return settings;
|
|
573
|
-
}
|
|
574
|
-
export function GetDefaultMoObjectInfo(typeDefId) {
|
|
575
|
-
return {
|
|
576
|
-
Id: '0',
|
|
577
|
-
$Caption: '',
|
|
578
|
-
$TypeDefId: typeDefId,
|
|
579
|
-
$State: 'New',
|
|
580
|
-
$Type: 'Common.MetaObjectWeb',
|
|
581
|
-
$FieldDict: {}
|
|
582
|
-
};
|
|
583
|
-
}
|
|
584
|
-
export function getLayout94ObjectInfo() {
|
|
585
|
-
return {
|
|
586
|
-
Type: 'Root',
|
|
587
|
-
ControlId: 'ریشه',
|
|
588
|
-
xtype: 'Ly.LayoutContainer',
|
|
589
|
-
Bounds: { x: 0, y: 0, width: 432, height: 24 },
|
|
590
|
-
items: [
|
|
591
|
-
{
|
|
592
|
-
Type: 'VerticalJoin',
|
|
593
|
-
xtype: 'Ly.LayoutJoin',
|
|
594
|
-
IsVertical: true,
|
|
595
|
-
Bounds: { x: 0, y: 0, width: 432, height: 82 },
|
|
596
|
-
items: []
|
|
597
|
-
}
|
|
598
|
-
]
|
|
599
|
-
};
|
|
600
|
-
}
|
|
601
|
-
export function getFormSettings(typeDefId) {
|
|
602
|
-
const mo = GetDefaultMoObjectInfo(typeDefId);
|
|
603
|
-
const formPanelSettings = {
|
|
604
|
-
View: {
|
|
605
|
-
Layout94: getLayout94ObjectInfo,
|
|
606
|
-
ControlInfo: [],
|
|
607
|
-
TypeDefId: typeDefId
|
|
608
|
-
},
|
|
609
|
-
IsSearchPanel: true,
|
|
610
|
-
Data: {
|
|
611
|
-
Mo: mo
|
|
612
|
-
}
|
|
613
|
-
};
|
|
614
|
-
return formPanelSettings;
|
|
615
|
-
}
|
|
616
|
-
export function createFormPanelMetaConditions(typeDefId, controlsInfo, controlName, value) {
|
|
617
|
-
const formSettings = getFormSettings(typeDefId);
|
|
618
|
-
formSettings.View.ControlInfo = JSON.parse(JSON.stringify(controlsInfo));
|
|
619
|
-
formSettings.View.Layout94.items[0].items.push(...controlsInfo.map((c) => getLayoutControl(c.ControlName)));
|
|
620
|
-
formSettings.Data.Mo[controlName] = value;
|
|
621
|
-
const formPanelCtrlr = new BarsaApi.Ul.FormPanelCtrlr({
|
|
622
|
-
Setting: formSettings,
|
|
623
|
-
Features: {
|
|
624
|
-
Workflow: false,
|
|
625
|
-
Toolbar: false,
|
|
626
|
-
InfoBar: false
|
|
627
|
-
}
|
|
628
|
-
});
|
|
629
|
-
return formPanelCtrlr;
|
|
630
|
-
}
|
|
631
|
-
export function getNewMoGridEditor(formSettings, typedefId) {
|
|
632
|
-
const newFormSettings = JSON.parse(JSON.stringify(formSettings));
|
|
633
|
-
return { ...newFormSettings.Data.Mo, $TypeDefId: typedefId };
|
|
634
|
-
}
|
|
635
|
-
export function createGridEditorFormPanel(formSettings, mo, typedef, relation, rewriteLayout = true, UlvMainCtrlr = null) {
|
|
636
|
-
const newFormSettings = JSON.parse(JSON.stringify(formSettings));
|
|
637
|
-
newFormSettings.Data.Mo = { ...mo, $TypeDefId: typedef };
|
|
638
|
-
if (rewriteLayout) {
|
|
639
|
-
newFormSettings.View.Layout94 = getLayout94ObjectInfo();
|
|
640
|
-
newFormSettings.View.Layout94.items[0].items.push(...newFormSettings.View.ControlInfo.map((c) => getLayoutControl(c.ControlName, c.ControlFieldCaptionTranslated, false)));
|
|
641
|
-
}
|
|
642
|
-
const formRequestParams = new BarsaApi.Ul.FormRequestParams({
|
|
643
|
-
MoId: newFormSettings.Data.Mo.Id,
|
|
644
|
-
TypeDefId: typedef,
|
|
645
|
-
Relation: relation
|
|
646
|
-
// MoContext: {
|
|
647
|
-
// ReportId: '',
|
|
648
|
-
// ViewId: '',
|
|
649
|
-
// ViewName: '',
|
|
650
|
-
// CondFormating: '',
|
|
651
|
-
// IncludeInReport: ''
|
|
652
|
-
// }
|
|
653
|
-
});
|
|
654
|
-
const formPanelCtrlr = new BarsaApi.Ul.FormPanelCtrlr({
|
|
655
|
-
Setting: newFormSettings,
|
|
656
|
-
Relation: relation,
|
|
657
|
-
UlvMainCtrlr: UlvMainCtrlr,
|
|
658
|
-
Features: {
|
|
659
|
-
Workflow: false,
|
|
660
|
-
Toolbar: false,
|
|
661
|
-
InfoBar: false
|
|
662
|
-
},
|
|
663
|
-
FormRequestParams: formRequestParams
|
|
664
|
-
});
|
|
665
|
-
return formPanelCtrlr;
|
|
666
|
-
}
|
|
667
|
-
export function getLayoutControl(controlName, controlCaption = '', hide = true) {
|
|
668
|
-
return {
|
|
669
|
-
xtype: 'Ly.LayoutControl',
|
|
670
|
-
Type: 'LayoutControlItem',
|
|
671
|
-
ControlId: controlName,
|
|
672
|
-
IsVertical: false,
|
|
673
|
-
TextLocation: 'Right',
|
|
674
|
-
TextVisible: false,
|
|
675
|
-
Visible: !hide,
|
|
676
|
-
hide,
|
|
677
|
-
UseLayoutItemTextForControl: false,
|
|
678
|
-
Caption: controlCaption,
|
|
679
|
-
AccessibleName: '',
|
|
680
|
-
Bounds: { x: 0, y: 0, width: 432, height: 24 },
|
|
681
|
-
MinSize: { width: 89, height: 24 },
|
|
682
|
-
MaxSize: { width: 0, height: 24 },
|
|
683
|
-
ControlBounds: { width: 388, height: 20 },
|
|
684
|
-
ControlMinSize: { width: 45, height: 20 },
|
|
685
|
-
ControlMaxSize: { width: 0, height: 20 },
|
|
686
|
-
Padding: [2, 2, 2, 2],
|
|
687
|
-
LabelSize: { width: 35, height: 13 },
|
|
688
|
-
originalXtype: ''
|
|
689
|
-
};
|
|
690
|
-
}
|
|
691
|
-
export function getControlList(mo, controlDbNames, isSearchPanel, isGridEditor) {
|
|
692
|
-
return new Promise((resolve, reject) => {
|
|
693
|
-
BarsaApi.Common.Ajax.GetServerData('Form94.GetControlInfos', {
|
|
694
|
-
controlInfoParameter: {
|
|
695
|
-
FieldDbNames: controlDbNames,
|
|
696
|
-
Mo: new BarsaApi.Common.MetaObjectWeb(mo),
|
|
697
|
-
IsSearchPanel: isSearchPanel,
|
|
698
|
-
IsGridEditor: isGridEditor
|
|
699
|
-
}
|
|
700
|
-
}, (m) => {
|
|
701
|
-
resolve(m);
|
|
702
|
-
}, (err) => {
|
|
703
|
-
reject(err);
|
|
704
|
-
});
|
|
705
|
-
});
|
|
706
|
-
}
|
|
707
|
-
export function shallowEqual(objA, objB) {
|
|
708
|
-
if (objA === objB) {
|
|
709
|
-
return true;
|
|
710
|
-
}
|
|
711
|
-
if (typeof objA !== 'object' || !objA || typeof objB !== 'object' || !objB) {
|
|
712
|
-
return false;
|
|
713
|
-
}
|
|
714
|
-
const keysA = Object.keys(objA);
|
|
715
|
-
const keysB = Object.keys(objB);
|
|
716
|
-
if (keysA.length !== keysB.length) {
|
|
717
|
-
return false;
|
|
718
|
-
}
|
|
719
|
-
const bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);
|
|
720
|
-
// eslint-disable-next-line @typescript-eslint/prefer-for-of
|
|
721
|
-
for (let idx = 0; idx < keysA.length; idx++) {
|
|
722
|
-
const key = keysA[idx];
|
|
723
|
-
if (!bHasOwnProperty(key)) {
|
|
724
|
-
return false;
|
|
725
|
-
}
|
|
726
|
-
if (objA[key] !== objB[key]) {
|
|
727
|
-
return false;
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
return true;
|
|
731
|
-
}
|
|
732
|
-
export function toNumber(value, fallbackValue = 0) {
|
|
733
|
-
return _isNumberValue(value) ? Number(value) : fallbackValue;
|
|
734
|
-
}
|
|
735
|
-
function propDecoratorFactory(name, fallback) {
|
|
736
|
-
function propDecorator(target, propName, originalDescriptor) {
|
|
737
|
-
const privatePropName = `$$__zorroPropDecorator__${propName}`;
|
|
738
|
-
if (Object.prototype.hasOwnProperty.call(target, privatePropName)) {
|
|
739
|
-
// warn(`The prop "${privatePropName}" is already exist, it will be overrided by ${name} decorator.`);
|
|
740
|
-
}
|
|
741
|
-
Object.defineProperty(target, privatePropName, {
|
|
742
|
-
configurable: true,
|
|
743
|
-
writable: true
|
|
744
|
-
});
|
|
745
|
-
return {
|
|
746
|
-
get() {
|
|
747
|
-
return originalDescriptor && originalDescriptor.get
|
|
748
|
-
? originalDescriptor.get.bind(this)()
|
|
749
|
-
: this[privatePropName];
|
|
750
|
-
},
|
|
751
|
-
set(value) {
|
|
752
|
-
if (originalDescriptor && originalDescriptor.set) {
|
|
753
|
-
originalDescriptor.set.bind(this)(fallback(value));
|
|
754
|
-
}
|
|
755
|
-
this[privatePropName] = fallback(value);
|
|
756
|
-
}
|
|
757
|
-
};
|
|
758
|
-
}
|
|
759
|
-
return propDecorator;
|
|
760
|
-
}
|
|
761
|
-
export function InputNumber(fallbackValue) {
|
|
762
|
-
return propDecoratorFactory('InputNumber', (value) => toNumber(value, fallbackValue));
|
|
763
|
-
}
|
|
764
|
-
export var AffixRespondEvents;
|
|
765
|
-
(function (AffixRespondEvents) {
|
|
766
|
-
AffixRespondEvents["resize"] = "resize";
|
|
767
|
-
AffixRespondEvents["scroll"] = "scroll";
|
|
768
|
-
AffixRespondEvents["touchstart"] = "touchstart";
|
|
769
|
-
AffixRespondEvents["touchmove"] = "touchmove";
|
|
770
|
-
AffixRespondEvents["touchend"] = "touchend";
|
|
771
|
-
AffixRespondEvents["pageshow"] = "pageshow";
|
|
772
|
-
AffixRespondEvents["load"] = "LOAD";
|
|
773
|
-
})(AffixRespondEvents || (AffixRespondEvents = {}));
|
|
774
|
-
export function isTargetWindow(target) {
|
|
775
|
-
return typeof window !== 'undefined' && target === window;
|
|
776
|
-
}
|
|
777
|
-
export function getTargetRect(target) {
|
|
778
|
-
return !isTargetWindow(target)
|
|
779
|
-
? target.getBoundingClientRect()
|
|
780
|
-
: {
|
|
781
|
-
top: 0,
|
|
782
|
-
left: 0,
|
|
783
|
-
bottom: 0
|
|
784
|
-
};
|
|
785
|
-
}
|
|
786
|
-
export function getFieldValue(name, mo, caption) {
|
|
787
|
-
if (mo.GetFValueByCaption) {
|
|
788
|
-
let result = mo.GetFValue(name);
|
|
789
|
-
if (caption) {
|
|
790
|
-
result = mo.GetFCaption(name);
|
|
791
|
-
}
|
|
792
|
-
if (typeof caption === 'undefined' && mo.InheritanceInfo && !(mo.$FieldDict && mo.$FieldDict[name])) {
|
|
793
|
-
const { ParentFieldName } = mo.InheritanceInfo;
|
|
794
|
-
const moParent = mo.GetFValue(ParentFieldName);
|
|
795
|
-
let result = moParent.GetFValue(name);
|
|
796
|
-
if (caption) {
|
|
797
|
-
result = moParent.GetFCaption(name);
|
|
798
|
-
}
|
|
799
|
-
}
|
|
800
|
-
return result;
|
|
801
|
-
}
|
|
802
|
-
const fieldName = mo.$FieldDict && mo.$FieldDict[name] ? mo.$FieldDict[name] : name;
|
|
803
|
-
let val = mo[fieldName];
|
|
804
|
-
if (caption) {
|
|
805
|
-
let captionVal = mo[fieldName]?.$Caption;
|
|
806
|
-
if (typeof captionVal !== 'string') {
|
|
807
|
-
if (!captionVal) {
|
|
808
|
-
captionVal = mo[fieldName + '$Caption'];
|
|
809
|
-
}
|
|
810
|
-
if (!captionVal) {
|
|
811
|
-
captionVal = val;
|
|
812
|
-
}
|
|
813
|
-
}
|
|
814
|
-
val = captionVal;
|
|
815
|
-
}
|
|
816
|
-
return val;
|
|
817
|
-
}
|
|
818
|
-
/* eslint-disable no-invalid-this */
|
|
819
|
-
export const availablePrefixes = ['moz', 'ms', 'webkit'];
|
|
820
|
-
export function requestAnimationFramePolyfill() {
|
|
821
|
-
let lastTime = 0;
|
|
822
|
-
return function (callback) {
|
|
823
|
-
const currTime = new Date().getTime();
|
|
824
|
-
const timeToCall = Math.max(0, 16 - (currTime - lastTime));
|
|
825
|
-
const id = setTimeout(() => {
|
|
826
|
-
callback(currTime + timeToCall);
|
|
827
|
-
}, timeToCall);
|
|
828
|
-
lastTime = currTime + timeToCall;
|
|
829
|
-
return id;
|
|
830
|
-
};
|
|
831
|
-
}
|
|
832
|
-
export function ExecuteDynamicCommand(command, mo = null) {
|
|
833
|
-
const e = { command, DynamicSetting: mo, Mo: mo };
|
|
834
|
-
BarsaApi.Common.CustomCodeManager.RunDynamicCommand(command.Id, e);
|
|
835
|
-
}
|
|
836
|
-
export function ExecuteWorkflowChoiceDef(scope, param, success, failed) {
|
|
837
|
-
BarsaApi.Common.Ajax.GetServerData('Workflow94.ChoiceSelect', param, (result) => {
|
|
838
|
-
success(result);
|
|
839
|
-
}, // success
|
|
840
|
-
(error) => {
|
|
841
|
-
failed(error);
|
|
842
|
-
}, // error
|
|
843
|
-
() => { }, // doReturn
|
|
844
|
-
scope, true);
|
|
845
|
-
}
|
|
846
|
-
export function getRequestAnimationFrame() {
|
|
847
|
-
if (typeof window === 'undefined') {
|
|
848
|
-
return () => 0;
|
|
849
|
-
}
|
|
850
|
-
if (window.requestAnimationFrame) {
|
|
851
|
-
// https://github.com/vuejs/vue/issues/4465
|
|
852
|
-
return window.requestAnimationFrame.bind(window);
|
|
853
|
-
}
|
|
854
|
-
const prefix = availablePrefixes.filter((key) => `${key}RequestAnimationFrame` in window)[0];
|
|
855
|
-
return prefix ? window[`${prefix}RequestAnimationFrame`] : requestAnimationFramePolyfill();
|
|
856
|
-
}
|
|
857
|
-
export function cancelRequestAnimationFrame(id) {
|
|
858
|
-
if (typeof window === 'undefined') {
|
|
859
|
-
return null;
|
|
860
|
-
}
|
|
861
|
-
if (window.cancelAnimationFrame) {
|
|
862
|
-
return window.cancelAnimationFrame(id);
|
|
863
|
-
}
|
|
864
|
-
const prefix = availablePrefixes.filter((key) => `${key}CancelAnimationFrame` in window || `${key}CancelRequestAnimationFrame` in window)[0];
|
|
865
|
-
return prefix
|
|
866
|
-
? (window[`${prefix}CancelAnimationFrame`] ||
|
|
867
|
-
window[`${prefix}CancelRequestAnimationFrame`])
|
|
868
|
-
// @ts-ignore
|
|
869
|
-
.call(this, id)
|
|
870
|
-
: clearTimeout(id);
|
|
871
|
-
}
|
|
872
|
-
export function easeInOutCubic(t, b, c, d) {
|
|
873
|
-
const cc = c - b;
|
|
874
|
-
let tt = t / (d / 2);
|
|
875
|
-
if (tt < 1) {
|
|
876
|
-
return (cc / 2) * tt * tt * tt + b;
|
|
877
|
-
}
|
|
878
|
-
else {
|
|
879
|
-
return (cc / 2) * ((tt -= 2) * tt * tt + 2) + b;
|
|
880
|
-
}
|
|
881
|
-
}
|
|
882
|
-
export const WordMimeType = '.doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document';
|
|
883
|
-
export const ImageMimeType = '.jpeg,.jpg,.gif,.png,.bmp,.tif,image/*';
|
|
884
|
-
export const PdfMimeType = '.pdf';
|
|
885
|
-
export const AllFilesMimeType = '.txt,.ppt,.pdf,.*';
|
|
886
|
-
export const VideoMimeType = 'video/*';
|
|
887
|
-
export const AudioMimeType = 'audio/*';
|
|
888
|
-
export function ChangeLayoutInfoCustomUi(layoutInfo, componentUi) {
|
|
889
|
-
layoutInfo.FieldUi.Setting.CustomUi = componentUi;
|
|
890
|
-
}
|
|
891
|
-
export const mobile_regex = new RegExp('^(\\+98|0)?9\\d{9}$');
|
|
892
|
-
export const number_only = new RegExp('^[0-9]+$');
|
|
893
|
-
export function forbiddenValidator(nameRe) {
|
|
894
|
-
return (control) => {
|
|
895
|
-
const forbidden = nameRe.test(control.value);
|
|
896
|
-
return !forbidden ? { forbiddenName: { value: control.value } } : null;
|
|
897
|
-
};
|
|
898
|
-
}
|
|
899
|
-
export function GetImgTags(setting) {
|
|
900
|
-
let str = '';
|
|
901
|
-
for (let i = 0; i < setting.sources.length; i++) {
|
|
902
|
-
str +=
|
|
903
|
-
"<img src='" +
|
|
904
|
-
setting.sources[i] +
|
|
905
|
-
"' class='" +
|
|
906
|
-
getCenter(setting.isCenter) +
|
|
907
|
-
"' style='" +
|
|
908
|
-
setting.customCss +
|
|
909
|
-
"' /> ";
|
|
910
|
-
}
|
|
911
|
-
return str;
|
|
912
|
-
}
|
|
913
|
-
export function ImagetoPrint(setting) {
|
|
914
|
-
return ('<html><head>' +
|
|
915
|
-
'<script src="/Lib/scripts/jquery-x.min.js"></script><script src="Lib/ImagePrint/ImagePrintInternal.js"></script>' +
|
|
916
|
-
'</head><body style="margin : 0 1 0 1">' +
|
|
917
|
-
GetImgTags(setting) +
|
|
918
|
-
'</body></html>');
|
|
919
|
-
}
|
|
920
|
-
export function PrintImage(setting) {
|
|
921
|
-
let pageLink = 'about:blank';
|
|
922
|
-
let pwa = window.open(pageLink, '_new');
|
|
923
|
-
pwa?.document.open();
|
|
924
|
-
let imageToPrint = ImagetoPrint(setting);
|
|
925
|
-
pwa?.document.write(imageToPrint);
|
|
926
|
-
pwa?.document.close();
|
|
927
|
-
}
|
|
928
|
-
function getCenter(isCenter) {
|
|
929
|
-
if (isCenter)
|
|
930
|
-
return 'center';
|
|
931
|
-
return '';
|
|
932
|
-
}
|
|
933
|
-
export function SaveImageToFile(name, src) {
|
|
934
|
-
const t = getUniqueId(4);
|
|
935
|
-
var link = document.createElement('a');
|
|
936
|
-
link.href = src;
|
|
937
|
-
link.download = name;
|
|
938
|
-
document.body.appendChild(link);
|
|
939
|
-
link.click();
|
|
940
|
-
setTimeout(function () {
|
|
941
|
-
link.parentNode?.removeChild(link);
|
|
942
|
-
}, 10);
|
|
943
|
-
}
|
|
944
|
-
export function validateAllFormFields(formGroup) {
|
|
945
|
-
//{1}
|
|
946
|
-
Object.keys(formGroup.controls).forEach((field) => {
|
|
947
|
-
//{2}
|
|
948
|
-
const control = formGroup.get(field); //{3}
|
|
949
|
-
if (control instanceof FormControl) {
|
|
950
|
-
//{4}
|
|
951
|
-
control.markAsTouched({ onlySelf: true });
|
|
952
|
-
}
|
|
953
|
-
else if (control instanceof FormGroup) {
|
|
954
|
-
//{5}
|
|
955
|
-
validateAllFormFields(control); //{6}
|
|
956
|
-
}
|
|
957
|
-
});
|
|
958
|
-
}
|
|
959
|
-
export function getFocusableTagNames() {
|
|
960
|
-
return `button,button:not([disabled]),[href],input:not([disabled]),input,
|
|
961
|
-
select,select:not([disabled]),textarea,textarea:not([disabled]),[tabindex]:not([tabindex="-1"])`;
|
|
962
|
-
}
|
|
963
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etbm92aW4tcmF5LWNvcmUvc3JjL2xpYi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFleEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFlLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEcsT0FBTyxLQUFLLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFHbkMsT0FBTyxFQUFtQixXQUFXLEVBQUUsU0FBUyxFQUFpQyxNQUFNLGdCQUFnQixDQUFDO0FBRXhHLE1BQU0sQ0FBTixJQUFZLG9CQUtYO0FBTEQsV0FBWSxvQkFBb0I7SUFDNUIscUZBQW1CLENBQUE7SUFDbkIsbUZBQWtCLENBQUE7SUFDbEIsbUZBQWtCLENBQUE7SUFDbEIsNkVBQWUsQ0FBQTtBQUNuQixDQUFDLEVBTFcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQUsvQjtBQUNELE1BQU0sVUFBVSxlQUFlLENBQzNCLGVBQXFDLEVBQ3JDLE9BQTJCLEVBQzNCLE1BQThCLEVBQzlCLFNBQW9CO0lBRXBCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNsQixRQUFRLGVBQWUsRUFBRSxDQUFDO1FBQ3RCLEtBQUssb0JBQW9CLENBQUMsZUFBZTtZQUNyQyxRQUFRLEdBQUcsZUFBZSxDQUFDO1lBQzNCLE1BQU07UUFDVixLQUFLLG9CQUFvQixDQUFDLGNBQWM7WUFDcEMsUUFBUSxHQUFHLG9CQUFvQixDQUFDO1lBQ2hDLE1BQU07UUFDVixLQUFLLG9CQUFvQixDQUFDLGNBQWM7WUFDcEMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUNwQixNQUFNO1FBQ1YsS0FBSyxvQkFB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QUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzlDLEtBQUs7UUFDTCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSztRQUMzQyxJQUFJLE9BQU8sWUFBWSxXQUFXLEVBQUUsQ0FBQztZQUNqQyxLQUFLO1lBQ0wsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7YUFBTSxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUUsQ0FBQztZQUN0QyxLQUFLO1lBQ0wscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLO1FBQ3pDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFDRCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2hDLE9BQU87Z0hBQ3FHLENBQUM7QUFDakgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXHJcbmltcG9ydCB7IF9pc051bWJlclZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgQmFyc2FBcGkgfSBmcm9tICcuL2Fic3RyYWN0LWNsYXNzZXMvYmFyc2EtYXBpJztcclxuaW1wb3J0IHtcclxuICAgIEFiYnJldmF0aW9uRGV2aWNlU2l6ZSxcclxuICAgIENvbFNldHRpbmcsXHJcbiAgICBFanJheU9sZ28sXHJcbiAgICBGb3JtU2V0dGluZyxcclxuICAgIEdlbmVyYWxDb250cm9sSW5mb01vZGVsLFxyXG4gICAgR3JpZFNldHRpbmcsXHJcbiAgICBMYXlvdXRTZXR0aW5nLFxyXG4gICAgTWVudUl0ZW0sXHJcbiAgICBNZXRhb2JqZWN0RGF0YU1vZGVsLFxyXG4gICAgUmVwb3J0Vmlld0NvbHVtbixcclxuICAgIFNvcnRTZXR0aW5nLFxyXG4gICAgVHJlZU5vZGVPYmpcclxufSBmcm9tICcuL2Fic3RyYWN0LWNsYXNzZXMvbW9kZWxzJztcclxuaW1wb3J0IHsgRGF0ZUhpanJpU2VydmljZSwgRGF0ZU1pbGFkaVNlcnZpY2UsIERhdGVTZXJ2aWNlLCBEYXRlU2hhbXNpU2VydmljZSB9IGZyb20gJy4vZGF0ZS1zZXJ2aWNlcyc7XHJcbmltcG9ydCAqIGFzIERldmljZSBmcm9tICcuL2RldmljZSc7XHJcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2xvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5leHBvcnQgZW51bSBUYWJsZUhlYWRlcldpZHRoTW9kZSB7XHJcbiAgICBGaXRUb1Jvd0NvbnRlbnQgPSAxLFxyXG4gICAgRml0VG9Db250YWluZXIgPSAyLFxyXG4gICAgRnJlZUNvbHVtblNpemUgPSAzLFxyXG4gICAgQ29sdW1uV2lkdGggPSA0XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFRhYmxlVGhXaWR0aChcclxuICAgIHRhYmxlSGVhZGVyTW9kZTogVGFibGVIZWFkZXJXaWR0aE1vZGUsXHJcbiAgICBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW10sXHJcbiAgICB0aExpc3Q6IEhUTUxUYWJsZUNlbGxFbGVtZW50W10sXHJcbiAgICByZW5kZXJlcjI6IFJlbmRlcmVyMlxyXG4pOiB2b2lkIHtcclxuICAgIGxldCBwcm9wTmFtZSA9ICcnO1xyXG4gICAgc3dpdGNoICh0YWJsZUhlYWRlck1vZGUpIHtcclxuICAgICAgICBjYXNlIFRhYmxlSGVhZGVyV2lkdGhNb2RlLkZpdFRvUm93Q29udGVudDpcclxuICAgICAgICAgICAgcHJvcE5hbWUgPSAnJEZpdFRvQ29udGVudCc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVGFibGVIZWFkZXJXaWR0aE1vZGUuRml0VG9Db250YWluZXI6XHJcbiAgICAgICAgICAgIHByb3BOYW1lID0gJyRGaXRDb250YWluZXJXaWR0aCc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVGFibGVIZWFkZXJXaWR0aE1vZGUuRnJlZUNvbHVtblNpemU6XHJcbiAgICAgICAgICAgIHByb3BOYW1lID0gJyRXaWR0aCc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVGFibGVIZWFkZXJXaWR0aE1vZGUuQ29sdW1uV2lkdGg6XHJcbiAgICAgICAgICAgIHByb3BOYW1lID0gJyRDb2x1bW5XaWR0aCc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgdGhMaXN0LmZvckVhY2goKGMsIGkpID0+IHtcclxuICAgICAgICBjb25zdCB3eCA9IF9jYWxjV2lkdGhPZlRoKGNvbHVtbnNbaV0sIGksIHByb3BOYW1lLCB0aExpc3QpO1xyXG4gICAgICAgIHd4ICYmIHJlbmRlcmVyMi5zZXRTdHlsZShjLCAnd2lkdGgnLCB3eCk7XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBfY2FsY1dpZHRoT2ZUaChjb2x1bW46IFJlcG9ydFZpZXdDb2x1bW4sIGk6IG51bWJlciwgcHJvcE5hbWU6IHN0cmluZywgdGhMaXN0KTogc3RyaW5nIHtcclxuICAgIGlmICghY29sdW1uKSB7XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbHVtbi4kSXNJbWFnZU9yaWNvbiAmJiBpIDwgdGhMaXN0Lmxlbmd0aCAtIDEpIHtcclxuICAgICAgICBjb25zdCBmaWVsZFR5cGVJZCA9ICtjb2x1bW4uRmllbGRUeXBlSWQ7XHJcbiAgICAgICAgaWYgKGZpZWxkVHlwZUlkID09PSA2IHx8IGZpZWxkVHlwZUlkID09PSA1IHx8IGZpZWxkVHlwZUlkID09PSA0Mikge1xyXG4gICAgICAgICAgICByZXR1cm4gJzI0cHgnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWJ1Z2dlcjtcclxuICAgIH1cclxuICAgIHJldHVybiBjb2x1bW4uJElzSW1hZ2VPcmljb24gJiYgaSA8IHRoTGlzdC5sZW5ndGggLSAxID8gJzQycHgnIDogY29sdW1uW3Byb3BOYW1lXTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlQ29sdW1uQ29udGVudChjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW10sIG1vRGF0YUxpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSk6IHZvaWQge1xyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICBzZXRDb2x1bW5XaWR0aEJ5TWF4TW9Db250ZW50V2lkdGgobW9EYXRhTGlzdCwgY29sdW1uKTtcclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb2x1bW5XaWR0aChcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW10sXHJcbiAgICBtb0RhdGFMaXN0OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10sXHJcbiAgICBkaXNhYmxlQ29udGV4dE1lbnVPdmVyZmxvdzogYm9vbGVhbixcclxuICAgIGNvbnRleHRNZW51SXRlbXM6IE1lbnVJdGVtW11cclxuKTogeyBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW107IGNvbnRleHRNZW51V2lkdGg6IG51bWJlciB9IHtcclxuICAgIGNvbHVtbnNcclxuICAgICAgICAuZmlsdGVyKChjKSA9PiAhYy5IaWRkZW4pXHJcbiAgICAgICAgLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICBzZXRDb2x1bW5DYXB0aW9uV2lkdGgoY29sdW1uKTtcclxuICAgICAgICB9KTtcclxuICAgIGNvbnN0IGNvbnRleHRNZW51V2lkdGggPSBjYWxjQ29udGV4dE1lbnVXaWR0aChjb250ZXh0TWVudUl0ZW1zLCBkaXNhYmxlQ29udGV4dE1lbnVPdmVyZmxvdyk7XHJcbiAgICByZXR1cm4geyBjb2x1bW5zOiBbLi4uY29sdW1uc10sIGNvbnRleHRNZW51V2lkdGggfTtcclxufVxyXG5mdW5jdGlvbiBzZXRDb2x1bW5DYXB0aW9uV2lkdGgoY29sdW1uOiBSZXBvcnRWaWV3Q29sdW1uKTogbnVtYmVyIHtcclxuICAgIGlmIChjb2x1bW4uJENvbHVtbldpZHRoTnVtKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbHVtbi4kQ29sdW1uV2lkdGhOdW07XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb2xDYXB0aW9uV2lkdGggPSBtZWFzdXJlVGV4dChjb2x1bW4uQWxpYXMpICsgMTYgKyAxMDtcclxuICAgIGNvbHVtbi4kQ29sdW1uV2lkdGhOdW0gPSBNYXRoLmNlaWwoY29sQ2FwdGlvbldpZHRoKTtcclxuICAgIGNvbHVtbi4kQ29sdW1uV2lkdGggPSBgJHtjb2x1bW4uJENvbHVtbldpZHRoTnVtfXB4YDtcclxuICAgIHJldHVybiBjb2xDYXB0aW9uV2lkdGg7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIHNldENvbHVtbldpZHRoQnlNYXhNb0NvbnRlbnRXaWR0aChtb0RhdGFMaXN0OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10sIGNvbHVtbjogUmVwb3J0Vmlld0NvbHVtbikge1xyXG4gICAgY29uc3Qgd2lkdGggPSBjYWxjdWxhdGVNb0RhdGFMaXN0Q29udGVudFdpZHRoQnlDb2x1bW5OYW1lKG1vRGF0YUxpc3QsIGNvbHVtbik7XHJcbiAgICBjb2x1bW4uJENvbnRlbnRXaWR0aCA9IGAke01hdGguY2VpbCh3aWR0aCl9cHhgO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlTW9EYXRhTGlzdENvbnRlbnRXaWR0aEJ5Q29sdW1uTmFtZShcclxuICAgIG1vRGF0YUxpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSxcclxuICAgIGNvbHVtbjogUmVwb3J0Vmlld0NvbHVtblxyXG4pOiBudW1iZXIge1xyXG4gICAgbGV0IG1heFdpZHRoID0gMDtcclxuICAgIG1vRGF0YUxpc3QuZm9yRWFjaCgoYywgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCBjYXB0aW9uID0gZ2V0Q29sdW1uVmFsdWVPZk1vRGF0YUxpc3QoY29sdW1uLk5hbWUsIGMsIHVuZGVmaW5lZCwgdHJ1ZSk7XHJcbiAgICAgICAgY29uc3QgY2FwdGlvbldpZHRoID0gbWVhc3VyZVRleHQoY2FwdGlvbikgKyAxNjtcclxuICAgICAgICBpZiAobWF4V2lkdGggPCBjYXB0aW9uV2lkdGgpIHtcclxuICAgICAgICAgICAgbWF4V2lkdGggPSBjYXB0aW9uV2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gTWF0aC5jZWlsKG1heFdpZHRoKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRnJlZUNvbHVtblNpemUoY29sdW1uczogUmVwb3J0Vmlld0NvbHVtbltdKTogUmVwb3J0Vmlld0NvbHVtbltdIHtcclxuICAgIGxldCBhbGxDb2xXaWR0aCA9IDA7XHJcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5IaWRkZW4pO1xyXG5cclxuICAgIHZpc2libGVDb2x1bW5zLmZvckVhY2goKGNvbCwgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCB4ID0gc2V0Q29sdW1uQ2FwdGlvbldpZHRoKGNvbCk7XHJcbiAgICAgICAgY29uc3QgdyA9IGNvbC5XaWR0aCAmJiBjb2wuV2lkdGggPiAwID8gY29sLldpZHRoIDogeDtcclxuICAgICAgICBhbGxDb2xXaWR0aCArPSB3O1xyXG4gICAgICAgIGNvbC4kV2lkdGggPSBpbmRleCA9PT0gdmlzaWJsZUNvbHVtbnMubGVuZ3RoIC0gMSA/ICcxMDAlJyA6IGAke3d9cHhgO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gWy4uLmNvbHVtbnNdO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb2x1bW5XaWR0aEZpdFRvQ29udGFpbmVyKFxyXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcclxuICAgIGNhblZpZXc6IGJvb2xlYW4sXHJcbiAgICBkaXNhYmxlQ29udGV4dE1lbnVPdmVyZmxvdzogYm9vbGVhbixcclxuICAgIGNvbnRleHRNZW51SXRlbXM6IE1lbnVJdGVtW10sXHJcbiAgICBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW11cclxuKTogeyBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW107IGNvbnRleHRNZW51V2lkdGg6IG51bWJlciB9IHtcclxuICAgIGxldCBoYXNEZWZpbmVkV2lkdGggPSB0cnVlO1xyXG4gICAgbGV0IGNvbnRhaW5lcldpZHRoID0gY29sdW1ucy5tYXAoKGMpID0+IGMuV2lkdGgpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xyXG4gICAgaWYgKGNvbnRhaW5lcldpZHRoID09PSAwKSB7XHJcbiAgICAgICAgY29udGFpbmVyV2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgaGFzRGVmaW5lZFdpZHRoID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgYWxsQ29sV2lkdGggPSAwO1xyXG4gICAgY29uc3QgaXNNb2JpbGUgPSBnZXREZXZpY2VJc01vYmlsZSgpO1xyXG4gICAgbGV0IHJlbWFpblBlcmNlbnQgPSAwO1xyXG4gICAgY29uc3QgbENvbHMgPSBjb2x1bW5zLmZpbHRlcigoYywgaSkgPT4gIWMuSGlkZGVuICYmICEoaSA9PT0gMCAmJiBjLkZpZWxkVHlwZUlkID09PSA0MSkpO1xyXG4gICAgbENvbHMuZm9yRWFjaCgoY29sLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIC8vINin2q/YsSDZgduM2YTYryDYp9iyINmG2YjYuSDYsdmG2q8g2YbYqNmI2K8g2Ygg2LPYqtmI2YYg2KfZiNmEINmH2YUg2YbYqNmI2K9cclxuICAgICAgICBjb25zdCB4ID0gc2V0Q29sdW1uQ2FwdGlvbldpZHRoKGNvbCk7XHJcbiAgICAgICAgY29uc3QgdyA9IGNvbC5XaWR0aCAmJiBjb2wuV2lkdGggPiAwID8gY29sLldpZHRoIDogeDtcclxuICAgICAgICBhbGxDb2xXaWR0aCArPSB3O1xyXG4gICAgICAgIGNvbnN0IHBlcmNlbnQgPSAodyAvIGNvbnRhaW5lcldpZHRoKSAqIDEwMDtcclxuICAgICAgICBjb2wuJEZpdENvbnRhaW5lcldpZHRoID0gaXNNb2JpbGUgfHwgY29sLldpZHRoID09PSAwID8gJzEwMCUnIDogYCR7cGVyY2VudH0lYDtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSBsQ29scy5sZW5ndGggLSAxICYmICFoYXNEZWZpbmVkV2lkdGgpIHtcclxuICAgICAgICAgICAgY29sLiRGaXRDb250YWluZXJXaWR0aCA9IDEwMCAtIHJlbWFpblBlcmNlbnQgKyAnJSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVtYWluUGVyY2VudCArPSBwZXJjZW50O1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gY29uc3QgY2FuVmlld0J1dHRvbldpZHRoID0gY2FuVmlldyA/IDQwIDogMDtcclxuICAgIC8vIGNvbnN0IHNlbGVjdGlvbldpZHRoID0gMzA7XHJcblxyXG4gICAgY29uc3QgY29udGV4dE1lbnVXaWR0aCA9IGNhbGNDb250ZXh0TWVudVdpZHRoKGNvbnRleHRNZW51SXRlbXMsIGRpc2FibGVDb250ZXh0TWVudU92ZXJmbG93KTtcclxuICAgIC8vIGNvbnN0IGNvbnRhaW5lcldpZHRoQWxsQ29sdW1ucyA9IGNvbnRhaW5lcldpZHRoIC0gc2VsZWN0aW9uV2lkdGggLSBjYW5WaWV3QnV0dG9uV2lkdGggLSBjb250ZXh0TWVudVdpZHRoIC0gMTI7XHJcbiAgICAvLyBhbGxDb2xXaWR0aCArPSBjb250YWluZXJXaWR0aEFsbENvbHVtbnMgLSBhbGxDb2xXaWR0aDsvLyDZhdit2KfYs9io2Ycg2KLYrtix24zZhiDYs9iq2YjZhi7ahtmI2YYgd2lkdGgg2YXYtNiu2LXbjCDZhtiv2KfYsdivXHJcbiAgICAvLyBjb2x1bW5zXHJcbiAgICAvLyAgICAgLmZpbHRlcigoYykgPT4gIWMuSGlkZGVuKVxyXG4gICAgLy8gICAgIC5mb3JFYWNoKChjb2wpID0+IHtcclxuICAgIC8vICAgICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLmNlaWwoKGNvbnRhaW5lcldpZHRoQWxsQ29sdW1ucyAqIGNvbC5XaWR0aCkgLyBhbGxDb2xXaWR0aCk7XHJcbiAgICAvLyAgICAgICAgIGNvbC5XaWR0aCA9IG5ld1dpZHRoO1xyXG4gICAgLy8gICAgICAgICBjb2wuJEZpdENvbnRhaW5lcldpZHRoID0gYCR7bmV3V2lkdGh9cHhgO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgcmV0dXJuIHsgY29sdW1uczogWy4uLmNvbHVtbnNdLCBjb250ZXh0TWVudVdpZHRoIH07XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNDb250ZXh0TWVudVdpZHRoKGNvbnRleHRNZW51SXRlbXM6IE1lbnVJdGVtW10sIGRpc2FibGVDb250ZXh0TWVudU92ZXJmbG93OiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBjb250ZXh0TWVudVdpZHRoID0gY29udGV4dE1lbnVJdGVtcy5sZW5ndGggPiAxID8gNDAgOiAwO1xyXG4gICAgY29uc3QgYnRuUGFkZGluZyA9IDE0ICsgMiArIDEwOyAvLyBwYWRkaW5nICsgYm9yZGVyICsgaWYgdGV4dCBpcyBvdmVyZmxvd2VkIHRoZW4gYWRkIDUgcGl4ZWwuc28gd2UgYWx3YXlzIDUgcHggdG8gaXQuXHJcbiAgICBjb25zdCB0ZFBhZGRpbmcgPSAxNSArIDE7IC8vIHBhZGRpbmcgKyBib3JkZXJcclxuICAgIGNvbnN0IGJ1dHRvbkljb25XaWR0aCA9IDE2ICsgNjsgLy8gc2l6ZSArIG1hcmdpblxyXG4gICAgaWYgKGRpc2FibGVDb250ZXh0TWVudU92ZXJmbG93IHx8IGNvbnRleHRNZW51SXRlbXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgY29udGV4dE1lbnVXaWR0aCA9IDA7XHJcbiAgICAgICAgY29udGV4dE1lbnVJdGVtcy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnRleHRNZW51V2lkdGggKz0gbWVhc3VyZVRleHQoYy50ZXh0KSArIGJ0blBhZGRpbmcgKyB0ZFBhZGRpbmc7XHJcbiAgICAgICAgICAgIGNvbnRleHRNZW51V2lkdGggKz0gYy5pY29uID8gYnV0dG9uSWNvbldpZHRoIDogMDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb250ZXh0TWVudVdpZHRoO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0luTG9jYWxNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgb2ZmbGluY2VBY3RpdmUgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShCYXJzYUFwaS5PZmZsaW5lLCAnU2V0dGluZ3MuSXNBY3RpdmUnLCBmYWxzZSk7XHJcbiAgICBjb25zdCBvZmZsaW5lVHJ1ZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKEJhcnNhQXBpLk9mZmxpbmUsICdTZXR0aW5ncy5Jc09mZmxpbmUnLCBmYWxzZSk7XHJcbiAgICByZXR1cm4gb2ZmbGluY2VBY3RpdmUgJiYgb2ZmbGluZVRydWU7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExhYmVsV2lkdGgoaXRlbTogYW55KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGZpZWxkWHR5cGUgPSBpdGVtLkZpZWxkVWk/Lm9yaWdpbmFsWHR5cGU7XHJcbiAgICBpZiAoXHJcbiAgICAgICAgZmllbGRYdHlwZSA9PT0gJ1VpLkJ1dHRvbicgfHxcclxuICAgICAgICBmaWVsZFh0eXBlID09PSAnVWkuQ2hlY2tCb3gnIHx8XHJcbiAgICAgICAgIWl0ZW0uVGV4dFZpc2libGUgfHxcclxuICAgICAgICBpdGVtLkNhcHRpb25TZXR0aW5nPy5BbGlnbk1vZGUgPT09ICdBdXRvU2l6ZSdcclxuICAgICkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBsYWJlbENhcHRpb24gPSBpdGVtLkNhcHRpb247XHJcbiAgICBpZiAobGFiZWxDYXB0aW9uID09PSAnJnp3bmo7Jykge1xyXG4gICAgICAgIGxhYmVsQ2FwdGlvbiA9ICcnO1xyXG4gICAgfVxyXG4gICAgbGFiZWxDYXB0aW9uID0gbGFiZWxDYXB0aW9uICsgJyAqICc7XHJcbiAgICAvLyBpZiAoaXRlbS5GaWVsZFVpPy5TZXR0aW5nPy5Jc01hbmRhdG9yeSkge1xyXG4gICAgLy8gICAgIGlmIChsYWJlbENhcHRpb24uaW5kZXhPZignKicpIDwgMCkge1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgbGFiZWxDYXB0aW9uID0gbGFiZWxDYXB0aW9uLnJlcGxhY2UoJyonLCAnJyk7XHJcbiAgICAvLyB9XHJcbiAgICBsYWJlbENhcHRpb24gKz0gJzonO1xyXG4gICAgY29uc3QgbGFiZWxXaWR0aCA9IG1lYXN1cmVUZXh0KGxhYmVsQ2FwdGlvbik7XHJcbiAgICBsZXQgbGFiZWxXaXRoUGFkZGluZyA9IGxhYmVsV2lkdGggKyAxMDtcclxuICAgIGlmIChpdGVtLkZpZWxkVWk/LlNldHRpbmc/LkZpZWxkSWNvbikge1xyXG4gICAgICAgIGxhYmVsV2l0aFBhZGRpbmcgKz0gMjQ7XHJcbiAgICB9XHJcbiAgICBpZiAoaXRlbS5GaWVsZFVpPy5TZXR0aW5nPy5IZWxwRGVzY3JpcHRpb24pIHtcclxuICAgICAgICBsYWJlbFdpdGhQYWRkaW5nICs9IDI0O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRyb2xXaWR0aCA9IE1hdGguY2VpbChsYWJlbFdpdGhQYWRkaW5nKTtcclxuICAgIHJldHVybiBjb250cm9sV2lkdGg7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtblZhbHVlT2ZNb0RhdGFMaXN0KFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgbW86IE1ldGFvYmplY3REYXRhTW9kZWwsXHJcbiAgICBDb2x1bW5zPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IE5hbWU6IHN0cmluZzsgQ2FwdGlvbjogc3RyaW5nIH1bXSxcclxuICAgIGNhcHRpb24/OiBib29sZWFuXHJcbik6IGFueSB7XHJcbiAgICBsZXQgZmllbGROYW1lID0gQ29sdW1ucyA/IENvbHVtbnMuZmluZCgoYykgPT4gYy5OYW1lID09PSBuYW1lIHx8IGMuQWxpYXMgPT09IG5hbWUpPy5OYW1lIDogbmFtZTtcclxuICAgIGlmICghZmllbGROYW1lKSB7XHJcbiAgICAgICAgZmllbGROYW1lID0gbmFtZTtcclxuICAgIH1cclxuICAgIGxldCB2YWwgPSBmaWVsZE5hbWUgPyBtb1tmaWVsZE5hbWVdIDogdW5kZWZpbmVkO1xyXG4gICAgaWYgKGNhcHRpb24pIHtcclxuICAgICAgICBsZXQgY2FwdGlvblZhbCA9IGZpZWxkTmFtZSA/IG1vW2ZpZWxkTmFtZV0/LiRDYXB0aW9uIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmICh0eXBlb2YgY2FwdGlvblZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgY2FwdGlvblZhbCA9IG1vW2ZpZWxkTmFtZSArICckQ2FwdGlvbiddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGNhcHRpb25WYWwgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGNhcHRpb25WYWwgPSB2YWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhbCA9IGNhcHRpb25WYWw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0lmQWxyZWFkeUxvYWRlZChwYXJlbnRNb2R1bGU6IGFueSwgbW9kdWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAocGFyZW50TW9kdWxlKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21vZHVsZU5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLiBJbXBvcnQgJHttb2R1bGVOYW1lfSBpbiB0aGUgQXBwTW9kdWxlIG9ubHkuYCk7XHJcbiAgICB9XHJcbn1cclxuY29uc3QgbWVhc3VyZVRleHRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcclxuZXhwb3J0IGZ1bmN0aW9uIG1lYXN1cmVUZXh0KHRleHQ6IHN0cmluZywgZm9udFNpemU/OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgaWYgKG1lYXN1cmVUZXh0VmFsdWVzW3RleHRdKSB7XHJcbiAgICAgICAgcmV0dXJuIG1lYXN1cmVUZXh0VmFsdWVzW3RleHRdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1lYXN1cmVUZXh0RG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lYXN1cmVUZXh0JykgYXMgSFRNTENhbnZhc0VsZW1lbnQ7XHJcbiAgICBpZiAoIW1lYXN1cmVUZXh0RG9tKSB7XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGN0eCA9IG1lYXN1cmVUZXh0RG9tLmdldENvbnRleHQoJzJkJykgYXMgYW55O1xyXG4gICAgZm9udFNpemUgPSBmb250U2l6ZSA/IGZvbnRTaXplIDogJzAuODg1cmVtJztcclxuICAgIGN0eC5mb250ID0gYG5vcm1hbCAke2ZvbnRTaXplfSBJUkFOWWVrYW5EaWdpdHNgO1xyXG4gICAgY29uc3QgeCA9IGN0eC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aDtcclxuICAgIG1lYXN1cmVUZXh0VmFsdWVzW3RleHRdID0geDtcclxuICAgIHJldHVybiB4O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZW5yYXRlSW5saW5lTW9JZCgpIHtcclxuICAgIHJldHVybiAoQmFyc2FBcGkuaWRHZW5lcmF0b3ItLSkudG9TdHJpbmcoKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZW51bVZhbHVlVG9TdHJpbmdTaXplKHZhbHVlOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAodmFsdWUpIHtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgICAgcmV0dXJuICdzJztcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgICAgcmV0dXJuICdtJztcclxuICAgICAgICBjYXNlICczJzpcclxuICAgICAgICAgICAgcmV0dXJuICdsJztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlVWx2Q29tbWFuZEhhbmRsZXIoYnV0dG9uLCBvcHRpb25zPyk6IHZvaWQge1xyXG4gICAgaWYgKGJ1dHRvbi5Db21tYW5kICYmIGJ1dHRvbi5Db21tYW5kLkhhbmRsZXIpIHtcclxuICAgICAgICBidXR0b24uQ29tbWFuZC5IYW5kbGVyKGJ1dHRvbiwgb3B0aW9ucyk7XHJcbiAgICB9IGVsc2UgaWYgKGJ1dHRvbi5oYW5kbGVyKSB7XHJcbiAgICAgICAgYnV0dG9uLmhhbmRsZXIuYmluZChidXR0b24uc2NvcGUpKGJ1dHRvbiwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZUlkKHBhcnRzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RyaW5nQXJyOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0czsgaSsrKSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcclxuICAgICAgICBjb25zdCBTNCA9ICgoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApIHwgMCkudG9TdHJpbmcoMTYpO1xyXG4gICAgICAgIGNvbnN0IFM0Xzogc3RyaW5nID0gUzQubGVuZ3RoID4gMCA/IFM0LnN1YnN0cmluZygxKSA6ICcnO1xyXG4gICAgICAgIHN0cmluZ0Fyci5wdXNoKFM0Xyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyaW5nQXJyLmpvaW4oJy0nKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGVTZXJ2aWNlKGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsIGN1bHR1cmU/KTogRGF0ZVNlcnZpY2Uge1xyXG4gICAgY29uc3QgZGVmYXVsdEN1bHR1cmUgPSBjdWx0dXJlID8/IEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuQ3VsdHVyZTtcclxuICAgIHN3aXRjaCAoZGVmYXVsdEN1bHR1cmUpIHtcclxuICAgICAgICBjYXNlICdmYS1JUic6XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZVNoYW1zaVNlcnZpY2UobG9nU2VydmljZSk7XHJcbiAgICAgICAgY2FzZSAnYXItQUUnOlxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGVIaWpyaVNlcnZpY2UobG9nU2VydmljZSk7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlTWlsYWRpU2VydmljZShsb2dTZXJ2aWNlKTtcclxuICAgIH1cclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsSXRlbXNQZXJDaGlsZHJlbihcclxuICAgIGl0ZW06IFRyZWVOb2RlT2JqLFxyXG4gICAgbGV2ZWw6IG51bWJlcixcclxuICAgIGFycmF5OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10sXHJcbiAgICBwYXJlbnROb2RlOiBUcmVlTm9kZU9iaixcclxuICAgIGF1dG9PcGVuTGV2ZWxzOiBudW1iZXJcclxuKTogYW55IHtcclxuICAgIGxldCBuZXdJdGVtOiBhbnkgPSBpdGVtO1xyXG4gICAgaWYgKGxldmVsID4gMCkge1xyXG4gICAgICAgIGl0ZW0ucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgaXRlbS5sZXZlbCA9IGxldmVsO1xyXG4gICAgICAgIGl0ZW0uaXNFeHBhbmQgPSBpdGVtLmlzRXhwYW5kID8/IGF1dG9PcGVuTGV2ZWxzID4gbGV2ZWw7XHJcbiAgICAgICAgaXRlbS52aXNpYmlsaXR5ID0gaXRlbS5wYXJlbnROb2RlLmlzRXhwYW5kO1xyXG4gICAgICAgIGFycmF5LnB1c2gobmV3SXRlbSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5ld0l0ZW0gPSBpdGVtO1xyXG4gICAgICAgIG5ld0l0ZW0uaXNFeHBhbmQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgaXRlbS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4gc2V0T25lRGVwdGhMZXZlbChjaGlsZCkpO1xyXG4gICAgICAgIHJldHVybiBpdGVtLmNoaWxkcmVuLm1hcCgoaSkgPT4gZ2V0QWxsSXRlbXNQZXJDaGlsZHJlbihpLCBsZXZlbCArIDEsIGFycmF5LCBuZXdJdGVtLCBhdXRvT3BlbkxldmVscykpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRPbmVEZXB0aExldmVsKG5vZGUpOiB2b2lkIHtcclxuICAgIGxldCBoYXNPbmVEZXB0aCA9IHRydWU7XHJcbiAgICBub2RlLmNoaWxkcmVuPy5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICAgIGlmIChjaGlsZC5EYXRhPy4kSGFzQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgaGFzT25lRGVwdGggPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbm9kZS5oYXNPbmVEZXB0aExldmVsID0gaGFzT25lRGVwdGg7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRmlyZWZveCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpID4gLTE7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEltYWdlUGF0aChcclxuICAgIHR5cGU6IHN0cmluZyxcclxuICAgIG1vSWQ6IHN0cmluZyB8IG51bGwsXHJcbiAgICBmaWxlSWQ6IHN0cmluZyxcclxuICAgIGZpZWxkRGVmSWQ/OiBzdHJpbmcsXHJcbiAgICBzaXplPzogbnVtYmVyLFxyXG4gICAgc2l6ZUg/OiBudW1iZXJcclxuKTogc3RyaW5nIHtcclxuICAgIG1vSWQgPSBtb0lkID09IG51bGwgPyAnJyA6IGVuY29kZVVSSUNvbXBvbmVudChtb0lkKTtcclxuICAgIGZpbGVJZCA9IGZpbGVJZCA9PSBudWxsID8gJycgOiBlbmNvZGVVUklDb21wb25lbnQoZmlsZUlkKTtcclxuICAgIGZpZWxkRGVmSWQgPSBmaWVsZERlZklkID09IG51bGwgPyAnJyA6IGVuY29kZVVSSUNvbXBvbmVudChmaWVsZERlZklkKTtcclxuICAgIHNpemUgPSBzaXplID09PSBudWxsID8gMTI4IDogc2l6ZTtcclxuICAgIHNpemVIID0gc2l6ZUggPT09IG51bGwgPyBzaXplIDogc2l6ZUg7XHJcbiAgICBjb25zdCB1cmwgPSBgL0lILmFzaHg/dHk9JHt0eXBlfSZtb0lkPSR7bW9JZH0maWQ9JHtmaWxlSWR9JmZkSWQ9JHtmaWVsZERlZklkfSZzaT0ke3NpemV9JnNpSD0ke3NpemVIfWA7XHJcbiAgICByZXR1cm4gdXJsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihmdW5jdGlvblRvQ2hlY2spOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmdW5jdGlvblRvQ2hlY2sgJiYge30udG9TdHJpbmcuY2FsbChmdW5jdGlvblRvQ2hlY2spID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBEZXZpY2VXaWR0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoID4gMCA/IHdpbmRvdy5pbm5lcldpZHRoIDogc2NyZWVuLndpZHRoO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXJWYWx1ZShmaWVsZFZhbHVlLCByZXR1cm5WYWx1ZT86IHRydWUpOiBhbnkge1xyXG4gICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiBmaWVsZFZhbHVlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZFZhbHVlLlZhbHVlO1xyXG4gICAgY29uc3QgdmFsdWVDYXB0aW9uOiBzdHJpbmcgPSBmaWVsZFZhbHVlLlZhbHVlJENhcHRpb247XHJcbiAgICBsZXQgdmFsdWVPYmplY3RDYXB0aW9uID0gbnVsbDtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgdmFsdWVPYmplY3RDYXB0aW9uID0gZmllbGRWYWx1ZS5WYWx1ZS4kQ2FwdGlvbjtcclxuICAgIH1cclxuICAgIGlmICh2YWx1ZU9iamVjdENhcHRpb24gJiYgIXJldHVyblZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlT2JqZWN0Q2FwdGlvbjtcclxuICAgIH1cclxuICAgIGlmICh2YWx1ZUNhcHRpb24gJiYgIXZhbHVlQ2FwdGlvbi5zdGFydHNXaXRoKCd0bXAnKSAmJiAhcmV0dXJuVmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWVDYXB0aW9uO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBlbGVtZW50SW5WaWV3cG9ydDIoZWw6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHRvcCA9IGVsLm9mZnNldFRvcDtcclxuICAgIGxldCBsZWZ0ID0gZWwub2Zmc2V0TGVmdDtcclxuICAgIGNvbnN0IHdpZHRoID0gZWwub2Zmc2V0V2lkdGg7XHJcbiAgICBjb25zdCBoZWlnaHQgPSBlbC5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgd2hpbGUgKGVsLm9mZnNldFBhcmVudCkge1xyXG4gICAgICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xyXG4gICAgICAgIHRvcCArPSBlbC5vZmZzZXRUb3A7XHJcbiAgICAgICAgbGVmdCArPSBlbC5vZmZzZXRMZWZ0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgICAgdG9wIDwgd2luZG93LnBhZ2VZT2Zmc2V0ICsgd2luZG93LmlubmVySGVpZ2h0ICYmXHJcbiAgICAgICAgbGVmdCA8IHdpbmRvdy5wYWdlWE9mZnNldCArIHdpbmRvdy5pbm5lcldpZHRoICYmXHJcbiAgICAgICAgdG9wICsgaGVpZ2h0ID4gd2luZG93LnBhZ2VZT2Zmc2V0ICYmXHJcbiAgICAgICAgbGVmdCArIHdpZHRoID4gd2luZG93LnBhZ2VYT2Zmc2V0XHJcbiAgICApO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBQcmV2ZW50RGVmYXVsRXZlbnQoZSwgcHJvcGFnYXRpb25EaXNhYmxlID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgaWYgKHByb3BhZ2F0aW9uRGlzYWJsZSkge1xyXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbihlKTtcclxuICAgIH1cclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGUpOiB2b2lkIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudEhlaWdodChlbERvbTogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xyXG4gICAgbGV0IHBhcmVudERvbSA9IGVsRG9tLnBhcmVudEVsZW1lbnQ7XHJcbiAgICBsZXQgcGFyZW50SGVpZ2h0ID0gcGFyZW50RG9tPy5jbGllbnRIZWlnaHQgPz8gMDtcclxuICAgIHdoaWxlIChwYXJlbnREb20gIT0gbnVsbCAmJiBwYXJlbnRIZWlnaHQgPCA0MCkge1xyXG4gICAgICAgIHBhcmVudERvbSA9IHBhcmVudERvbS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHBhcmVudEhlaWdodCA9IHBhcmVudERvbT8uY2xpZW50SGVpZ2h0ID8/IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyZW50SGVpZ2h0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcG9uZW50RGVmaW5lZChcclxuICAgIGNvbnRyb2xVaTogeyBvcmlnaW5hbFh0eXBlOiBzdHJpbmcgfSxcclxuICAgIGN1c3RvbVVpU2V0dGluZzogeyBNb2R1bGU6IHN0cmluZzsgTmFtZTogc3RyaW5nOyBTZWxlY3Rvcjogc3RyaW5nIH1cclxuKToge1xyXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nO1xyXG4gICAgbW9kdWxlUGF0aDogc3RyaW5nO1xyXG4gICAgY29tcG9uZW50TmFtZTogc3RyaW5nO1xyXG4gICAgc2VsZWN0b3I6IHN0cmluZztcclxufSB7XHJcbiAgICBsZXQgbW9kdWxlTmFtZSA9IEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuRGVmYXVsdFVpTW9kdWxlO1xyXG4gICAgbGV0IG1vZHVsZUtlYmFiTmFtZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLkdldEtlYmFiQ2FzZShtb2R1bGVOYW1lKTtcclxuICAgIGxldCBjb21wb25lbnROYW1lID0gY29udHJvbFVpLm9yaWdpbmFsWHR5cGUucmVwbGFjZSgnLicsICcnKS5yZXBsYWNlKCdfJywgJycpO1xyXG4gICAgbGV0IHNlbGVjdG9yOiBzdHJpbmcgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5HZXRLZWJhYkNhc2UoY29tcG9uZW50TmFtZSk7XHJcbiAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cmluZygxLCBzZWxlY3Rvci5sZW5ndGgpO1xyXG4gICAgc2VsZWN0b3IgPSBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLkN1c3RvbVVpUHJlZml4ICsgJy0nICsgc2VsZWN0b3I7XHJcbiAgICBpZiAoY3VzdG9tVWlTZXR0aW5nICYmIGN1c3RvbVVpU2V0dGluZy5Nb2R1bGUpIHtcclxuICAgICAgICBtb2R1bGVOYW1lID0gY3VzdG9tVWlTZXR0aW5nLk1vZHVsZTtcclxuICAgICAgICBtb2R1bGVLZWJhYk5hbWUgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5HZXRLZWJhYkNhc2UobW9kdWxlTmFtZSk7XHJcbiAgICAgICAgY29tcG9uZW50TmFtZSA9IGN1c3RvbVVpU2V0dGluZy5OYW1lO1xyXG4gICAgICAgIHNlbGVjdG9yID0gY3VzdG9tVWlTZXR0aW5nLlNlbGVjdG9yO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbW9kdWxlUGF0aCA9IG1vZHVsZUtlYmFiTmFtZS5zbGljZSgxLCBtb2R1bGVLZWJhYk5hbWUubGVuZ3RoKTtcclxuICAgIHJldHVybiB7IG1vZHVsZU5hbWUsIG1vZHVsZVBhdGgsIGNvbXBvbmVudE5hbWUsIHNlbGVjdG9yIH07XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmYXJpKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIERldmljZS5pc1NhZmFyaSgpO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0ZGKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIERldmljZS5pc0ZGKCk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERldmljZUlzUGhvbmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gRGV2aWNlLmlzUGhvbmUoKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGV2aWNlSXNEZXNrdG9wKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIERldmljZS5pc0Rlc2t0b3AoKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGV2aWNlSXNUYWJsZXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gRGV2aWNlLmlzVGFibGV0KCk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERldmljZUlzTW9iaWxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignbW9iaScpID4gMCB8fCBnZXREZXZpY2VJc1Bob25lKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sU2l6ZU1vZGUoZWw6IEhUTUxFbGVtZW50LCBkZXZpY2VTaXplOiAncycgfCAnbScgfCAnbCcgfCAneGwnID0gJ2wnKTogQWJicmV2YXRpb25EZXZpY2VTaXplIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gZWwub2Zmc2V0V2lkdGg7XHJcbiAgICBpZiAoY29udGFpbmVyV2lkdGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4gZGV2aWNlU2l6ZTtcclxuICAgIH1cclxuICAgIGlmIChkZXZpY2VTaXplID09PSAncycgfHwgY29udGFpbmVyV2lkdGggPCA2MDApIHtcclxuICAgICAgICBkZXZpY2VTaXplID0gJ3MnO1xyXG4gICAgfSBlbHNlIGlmIChkZXZpY2VTaXplID09PSAnbScgfHwgKGNvbnRhaW5lcldpZHRoID4gNjAwICYmIGNvbnRhaW5lcldpZHRoIDwgMTIwMCkpIHtcclxuICAgICAgICBkZXZpY2VTaXplID0gJ20nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRldmljZVNpemU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeXRlcyhcclxuICAgIGJ5dGVzLFxyXG4gICAgZGVjaW1hbHMgPSAyLFxyXG4gICAgc2l6ZTogJ0J5dGVzJyB8ICdLQicgfCAnTUInIHwgJ0dCJyB8ICdUQicgfCAnUEInIHwgJ0VCJyB8ICdaQicgfCAnWUInXHJcbik6IHN0cmluZyB7XHJcbiAgICBpZiAoYnl0ZXMgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gJzAgQnl0ZXMnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGsgPSAxMDI0O1xyXG4gICAgY29uc3QgZG0gPSBkZWNpbWFscyA8IDAgPyAwIDogZGVjaW1hbHM7XHJcbiAgICBjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcclxuICAgIGNvbnN0IGkgPSBzaXplcy5maW5kSW5kZXgoKGMpID0+IGMgPT09IHNpemUpO1xyXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpLnRvRml4ZWQoZG0pKSArICcgJyArIHNpemVzW2ldO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZEV4dGVuc2lvbih2YWxpZEV4dGVuc2lvbnMpOiBzdHJpbmcge1xyXG4gICAgbGV0IF92YWxpZEV4dGVuc2lvbnMgPSAnJztcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbGlkRXh0ZW5zaW9ucykpIHtcclxuICAgICAgICBfdmFsaWRFeHRlbnNpb25zID0gdmFsaWRFeHRlbnNpb25zLm1hcCgoYykgPT4gJy4nICsgYy5FeHRlbnNpb24pLmpvaW4oJywnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBfdmFsaWRFeHRlbnNpb25zO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRJY29uKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gQmFyc2FBcGkuQ29tbW9uLkZpbGUuRmlsZUljb25EaWN0MTI4W3R5cGVdO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0ltYWdlKHR5cGUpOiBib29sZWFuIHtcclxuICAgIGlmICghdHlwZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gWydpbWcnLCAncG5nJywgJ2pwZWcnLCAnanBnJywgJ2dpZicsICdibXAnLCAndGlmZicsICdpbWFnZScsICdqZmlmJ10uaW5kZXhPZih0eXBlKSA+IC0xO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsQ29sdW1uc1NvcnRlZChjb250ZXh0KTogQXJyYXk8UmVwb3J0Vmlld0NvbHVtbj4ge1xyXG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGNvbnRleHQsICdTZXR0aW5nLlZpZXcuQ29sdW1ucycsIFtdKS5maWx0ZXIoXHJcbiAgICAgICAgKGMpID0+IGMuTmFtZSAhPT0gJ0lkJyAmJiBjLk5hbWUgIT09ICckU3R5bGVJbmRleCcgJiYgIWMuSGlkZGVuXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGNvbExpc3Q6IENvbFNldHRpbmdbXSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKFxyXG4gICAgICAgIGNvbnRleHQsXHJcbiAgICAgICAgJ1NldHRpbmcuVmlldy5HcmlkU2V0dGluZy5Db2xTZXR0aW5nTGlzdCcsXHJcbiAgICAgICAgW11cclxuICAgICk7XHJcbiAgICBjb25zdCBjb2x1bW5zID0gbmV3IEFycmF5PFJlcG9ydFZpZXdDb2x1bW4+KCk7XHJcbiAgICBjb2xMaXN0LmZvckVhY2goKGNvbFMpID0+IHtcclxuICAgICAgICBjb25zdCBjb2x1bW5PZkNvbExpc3QgPSBhbGxDb2x1bW5zLmZpbmQoKGMpID0+IGMuTmFtZSA9PT0gY29sUy5OYW1lKTtcclxuICAgICAgICBpZiAoY29sdW1uT2ZDb2xMaXN0KSB7XHJcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaCh7IC4uLmNvbHVtbk9mQ29sTGlzdCwgSGlkZGVuOiBjb2xTLklzSGlkZGVuLCBXaWR0aDogY29sUy5XaWR0aCB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIGFsbENvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbFNldHRpbmcgPSBjb2xMaXN0LmZpbmQoKGMpID0+IGMuTmFtZSA9PT0gY29sdW1uLk5hbWUpO1xyXG4gICAgICAgIGlmICghY29sU2V0dGluZykge1xyXG4gICAgICAgICAgICBjb2x1bW5zLnNwbGljZShpbmRleCwgMCwgeyAuLi5jb2x1bW4sIEhpZGRlbjogY29sTGlzdC5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBHZXRWaXNpYmxlVmFsdWUob2JqZWN0LCBmaWVsZCk6IHN0cmluZyB7XHJcbiAgICBsZXQgb3V0cHV0VmFsdWU7XHJcbiAgICBpZiAob2JqZWN0W2ZpZWxkXT8uJENhcHRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIG91dHB1dFZhbHVlID0gb2JqZWN0W2ZpZWxkXS4kQ2FwdGlvbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgb3V0cHV0VmFsdWUgPSBvYmplY3RbZmllbGQgKyAnJENhcHRpb24nXSAhPT0gdW5kZWZpbmVkID8gb2JqZWN0W2ZpZWxkICsgJyRDYXB0aW9uJ10gOiBvYmplY3RbZmllbGRdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG91dHB1dFZhbHVlO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXAge1xyXG4gICAgJEdyb3VwOiBhbnk7XHJcbiAgICAkTGV2ZWw6IG51bWJlcjtcclxuICAgICRDb3VudDogbnVtYmVyO1xyXG4gICAgJEV4cGFuZGVkOiBib29sZWFuO1xyXG4gICAgJFBhcmVudDogYW55O1xyXG4gICAgJENoaWxkcmVuOiBhbnlbXTtcclxuICAgICRWaXNpYmlsaXR5OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gR3JvdXBCeShjb2xsZWN0aW9uOiBhbnlbXSwgc29ydFNldHRpbmdzOiBTb3J0U2V0dGluZ1tdKTogeyBncm91cGVkOiBHcm91cDsgZ3JvdXBzOiBhbnlbXSB9IHtcclxuICAgIGNvbnN0IGdyb3VwZWQ6IGFueSA9IHt9O1xyXG5cclxuICAgIGNvbnN0IGdyb3VwcyA9IHNvcnRTZXR0aW5ncy5tYXAoKGMpID0+IGMuTmFtZSk7XHJcbiAgICBjb25zdCBnZXRUaXRsZSA9IChtbywgZmllbGROYW1lKTogc3RyaW5nID0+IEdldFZpc2libGVWYWx1ZShtbywgZmllbGROYW1lKTtcclxuICAgIGNvbGxlY3Rpb24uZm9yRWFjaCgoYSkgPT4ge1xyXG4gICAgICAgIGdyb3Vwc1xyXG4gICAgICAgICAgICAucmVkdWNlKChvLCBnLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cFRpdGxlID0gZ2V0VGl0bGUoYSwgZyk7XHJcbiAgICAgICAgICAgICAgICBvW2dyb3VwVGl0bGVdID0gb1tncm91cFRpdGxlXSB8fCAoaSArIDEgPT09IGdyb3Vwcy5sZW5ndGggPyBbXSA6IHt9KTtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9bZ3JvdXBUaXRsZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYS4kTGV2ZWwgPSBncm91cHMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGdldFRpdGxlKGEsIGdyb3Vwc1swXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IGdyb3VwZWRbdGl0bGVdO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC4kQ291bnQgPSAocGFyZW50LiRDb3VudCA/PyAwKSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBncm91cHMubGVuZ3RoIC0gMTsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gZ2V0VGl0bGUoYSwgZ3JvdXBzW2pdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50W3RpdGxlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LiRDb3VudCA9IG9bZ3JvdXBUaXRsZV0ubGVuZ3RoICsgMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGEyID0gRmluZEdyb3VwKGdyb3VwVGl0bGUsIGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9bZ3JvdXBUaXRsZV0uJEV4cGFuZGVkID0gYTI/LiRFeHBhbmRlZDtcclxuICAgICAgICAgICAgICAgICAgICBvW2dyb3VwVGl0bGVdLiRWaXNpYmlsaXR5ID0gYTI/LiRWaXNpYmlsaXR5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9bZ3JvdXBUaXRsZV07XHJcbiAgICAgICAgICAgIH0sIGdyb3VwZWQpXHJcbiAgICAgICAgICAgIC5wdXNoKGEpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4geyBncm91cGVkLCBncm91cHMgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEZpbmRHcm91cChncm91cFRpdGxlOiBzdHJpbmcsIGE6IGFueSk6IGFueSB7XHJcbiAgICBpZiAoYS4kR3JvdXAgPT09IGdyb3VwVGl0bGUpIHtcclxuICAgICAgICByZXR1cm4gYTtcclxuICAgIH1cclxuICAgIGlmIChhLiRQYXJlbnQpIHtcclxuICAgICAgICByZXR1cm4gRmluZEdyb3VwKGdyb3VwVGl0bGUsIGEuJFBhcmVudCk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIEZpbGxBbGxMYXlvdXRDb250cm9scyhpdGVtOiBMYXlvdXRTZXR0aW5nLCBsYXlvdXRDb250cm9sczogTGF5b3V0U2V0dGluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAoaXRlbS54dHlwZSA9PT0gJ0x5LkxheW91dENvbnRyb2wnKSB7XHJcbiAgICAgICAgbGF5b3V0Q29udHJvbHMucHVzaChpdGVtKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIWl0ZW0uaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGl0ZW0uaXRlbXMuZm9yRWFjaCgoYykgPT4gRmlsbEFsbExheW91dENvbnRyb2xzKGMsIGxheW91dENvbnRyb2xzKSk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIEZpbmRUb29sYmFySXRlbSh0b29sYmFySXRlbXM6IE1lbnVJdGVtW10sIHZhbHVlOiBzdHJpbmcsIHByb3A6IHN0cmluZyA9ICd0ZXh0Jyk6IE1lbnVJdGVtIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmaW5kSW5BcnJheSA9ICh0b29sYmFySXRlbXM6IE1lbnVJdGVtW10sIHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBsZXQgaXRlbTogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuICAgICAgICB0b29sYmFySXRlbXMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGMgPT09ICdvYmplY3QnICYmICFpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY1twcm9wXSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtID0gYztcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMubWVudT8uaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBmaW5kSW5BcnJheShjLm1lbnUuaXRlbXMsIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBmaW5kSW5BcnJheSh0b29sYmFySXRlbXMsIHZhbHVlKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gRmluZExheW91dFNldHRpbmdGcm9tTGF5b3V0OTQobGF5b3V0OTQ6IExheW91dFNldHRpbmcsIGxheW91dFRpdGxlOiBzdHJpbmcpOiBMYXlvdXRTZXR0aW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIWxheW91dFRpdGxlKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAobGF5b3V0OTQuQ2FwdGlvbiA9PT0gbGF5b3V0VGl0bGUgfHwgbGF5b3V0OTQuVGl0bGUgPT09IGxheW91dFRpdGxlIHx8IGxheW91dDk0LkNvbnRyb2xJZCA9PT0gbGF5b3V0VGl0bGUpIHtcclxuICAgICAgICByZXR1cm4gbGF5b3V0OTQ7XHJcbiAgICB9XHJcbiAgICBsZXQgdGVtcExheW91dDk0OiBMYXlvdXRTZXR0aW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBpZiAobGF5b3V0OTQuaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0OTQuaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0ZW1wTGF5b3V0OTQpIHtcclxuICAgICAgICAgICAgICAgIHRlbXBMYXlvdXQ5NCA9IEZpbmRMYXlvdXRTZXR0aW5nRnJvbUxheW91dDk0KGxheW91dDk0Lml0ZW1zW2ldLCBsYXlvdXRUaXRsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcExheW91dDk0O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRHcmlkU2V0dGluZ3MoY29udGV4dCk6IEdyaWRTZXR0aW5nIHtcclxuICAgIGNvbnN0IGdyaWRTZXR0aW5nID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuVmlldy5HcmlkU2V0dGluZycsIG51bGwpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBDb2xTZXR0aW5nTGlzdDogZ3JpZFNldHRpbmc/LkNvbFNldHRpbmdMaXN0ID8/IG51bGwsXHJcbiAgICAgICAgU29ydFNldHRpbmdMaXN0OiBncmlkU2V0dGluZz8uU29ydFNldHRpbmdMaXN0ID8/IFtdLFxyXG4gICAgICAgIEF1dG9TaXplQ29sdW1uczogZ3JpZFNldHRpbmc/LkF1dG9TaXplQ29sdW1ucyA/PyBmYWxzZVxyXG4gICAgfTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzZXRHcmlkU2V0dGluZ3MoY29sdW1uczogUmVwb3J0Vmlld0NvbHVtbltdIHwgYW55W10sIGNvbnRleHQ6IGFueSk6IEdyaWRTZXR0aW5nIHtcclxuICAgIGNvbnN0IGNvbExpc3QgPSBjb2x1bW5zO1xyXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRHcmlkU2V0dGluZ3MoY29udGV4dCk7XHJcbiAgICBzZXR0aW5ncy5Db2xTZXR0aW5nTGlzdCA9IGNvbExpc3QubWFwKChjKSA9PiAoe1xyXG4gICAgICAgIElzSGlkZGVuOiBjLkhpZGRlbixcclxuICAgICAgICBOYW1lOiBjLk5hbWUsXHJcbiAgICAgICAgV2lkdGg6IGMuV2lkdGgsXHJcbiAgICAgICAgQ2FwdGlvbjogYy5DYXB0aW9uXHJcbiAgICB9KSk7XHJcbiAgICByZXR1cm4gc2V0dGluZ3M7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBHZXREZWZhdWx0TW9PYmplY3RJbmZvKHR5cGVEZWZJZDogc3RyaW5nKTogTWV0YW9iamVjdERhdGFNb2RlbCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIElkOiAnMCcsXHJcbiAgICAgICAgJENhcHRpb246ICcnLFxyXG4gICAgICAgICRUeXBlRGVmSWQ6IHR5cGVEZWZJZCxcclxuICAgICAgICAkU3RhdGU6ICdOZXcnLFxyXG4gICAgICAgICRUeXBlOiAnQ29tbW9uLk1ldGFPYmplY3RXZWInLFxyXG4gICAgICAgICRGaWVsZERpY3Q6IHt9XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXQ5NE9iamVjdEluZm8oKTogTGF5b3V0U2V0dGluZyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIFR5cGU6ICdSb290JyxcclxuICAgICAgICBDb250cm9sSWQ6ICfYsduM2LTZhycsXHJcbiAgICAgICAgeHR5cGU6ICdMeS5MYXlvdXRDb250YWluZXInLFxyXG4gICAgICAgIEJvdW5kczogeyB4OiAwLCB5OiAwLCB3aWR0aDogNDMyLCBoZWlnaHQ6IDI0IH0sXHJcbiAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgVHlwZTogJ1ZlcnRpY2FsSm9pbicsXHJcbiAgICAgICAgICAgICAgICB4dHlwZTogJ0x5LkxheW91dEpvaW4nLFxyXG4gICAgICAgICAgICAgICAgSXNWZXJ0aWNhbDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIEJvdW5kczogeyB4OiAwLCB5OiAwLCB3aWR0aDogNDMyLCBoZWlnaHQ6IDgyIH0sXHJcbiAgICAgICAgICAgICAgICBpdGVtczogW11cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgIH07XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1TZXR0aW5ncyh0eXBlRGVmSWQ6IHN0cmluZyk6IEZvcm1TZXR0aW5nIHtcclxuICAgIGNvbnN0IG1vID0gR2V0RGVmYXVsdE1vT2JqZWN0SW5mbyh0eXBlRGVmSWQpO1xyXG5cclxuICAgIGNvbnN0IGZvcm1QYW5lbFNldHRpbmdzOiBGb3JtU2V0dGluZyA9IHtcclxuICAgICAgICBWaWV3OiB7XHJcbiAgICAgICAgICAgIExheW91dDk0OiBnZXRMYXlvdXQ5NE9iamVjdEluZm8sXHJcbiAgICAgICAgICAgIENvbnRyb2xJbmZvOiBbXSxcclxuICAgICAgICAgICAgVHlwZURlZklkOiB0eXBlRGVmSWRcclxuICAgICAgICB9LFxyXG4gICAgICAgIElzU2VhcmNoUGFuZWw6IHRydWUsXHJcbiAgICAgICAgRGF0YToge1xyXG4gICAgICAgICAgICBNbzogbW9cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGZvcm1QYW5lbFNldHRpbmdzO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtUGFuZWxNZXRhQ29uZGl0aW9ucyhcclxuICAgIHR5cGVEZWZJZDogc3RyaW5nLFxyXG4gICAgY29udHJvbHNJbmZvOiBHZW5lcmFsQ29udHJvbEluZm9Nb2RlbFtdLFxyXG4gICAgY29udHJvbE5hbWU6IHN0cmluZyxcclxuICAgIHZhbHVlOiBhbnlcclxuKTogYW55IHtcclxuICAgIGNvbnN0IGZvcm1TZXR0aW5ncyA9IGdldEZvcm1TZXR0aW5ncyh0eXBlRGVmSWQpO1xyXG4gICAgZm9ybVNldHRpbmdzLlZpZXcuQ29udHJvbEluZm8gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbnRyb2xzSW5mbykpO1xyXG5cclxuICAgIGZvcm1TZXR0aW5ncy5WaWV3LkxheW91dDk0Lml0ZW1zWzBdLml0ZW1zLnB1c2goLi4uY29udHJvbHNJbmZvLm1hcCgoYykgPT4gZ2V0TGF5b3V0Q29udHJvbChjLkNvbnRyb2xOYW1lKSkpO1xyXG4gICAgZm9ybVNldHRpbmdzLkRhdGEuTW9bY29udHJvbE5hbWVdID0gdmFsdWU7XHJcbiAgICBjb25zdCBmb3JtUGFuZWxDdHJsciA9IG5ldyBCYXJzYUFwaS5VbC5Gb3JtUGFuZWxDdHJscih7XHJcbiAgICAgICAgU2V0dGluZzogZm9ybVNldHRpbmdzLFxyXG4gICAgICAgIEZlYXR1cmVzOiB7XHJcbiAgICAgICAgICAgIFdvcmtmbG93OiBmYWxzZSxcclxuICAgICAgICAgICAgVG9vbGJhcjogZmFsc2UsXHJcbiAgICAgICAgICAgIEluZm9CYXI6IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZm9ybVBhbmVsQ3RybHI7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldE5ld01vR3JpZEVkaXRvcihmb3JtU2V0dGluZ3M6IEZvcm1TZXR0aW5nLCB0eXBlZGVmSWQ6IHN0cmluZyk6IFBhcnRpYWw8Rm9ybVNldHRpbmc+IHtcclxuICAgIGNvbnN0IG5ld0Zvcm1TZXR0aW5nczogRm9ybVNldHRpbmcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZvcm1TZXR0aW5ncykpO1xyXG4gICAgcmV0dXJuIHsgLi4ubmV3Rm9ybVNldHRpbmdzLkRhdGEuTW8sICRUeXBlRGVmSWQ6IHR5cGVkZWZJZCB9O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHcmlkRWRpdG9yRm9ybVBhbmVsKFxyXG4gICAgZm9ybVNldHRpbmdzOiBGb3JtU2V0dGluZyxcclxuICAgIG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLFxyXG4gICAgdHlwZWRlZjogc3RyaW5nLFxyXG4gICAgcmVsYXRpb246IGFueSxcclxuICAgIHJld3JpdGVMYXlvdXQ6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgVWx2TWFpbkN0cmxyOiBhbnkgPSBudWxsXHJcbik6IGFueSB7XHJcbiAgICBjb25zdCBuZXdGb3JtU2V0dGluZ3M6IEZvcm1TZXR0aW5nID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShmb3JtU2V0dGluZ3MpKTtcclxuICAgIG5ld0Zvcm1TZXR0aW5ncy5EYXRhLk1vID0geyAuLi5tbywgJFR5cGVEZWZJZDogdHlwZWRlZiB9O1xyXG4gICAgaWYgKHJld3JpdGVMYXlvdXQpIHtcclxuICAgICAgICBuZXdGb3JtU2V0dGluZ3MuVmlldy5MYXlvdXQ5NCA9IGdldExheW91dDk0T2JqZWN0SW5mbygpO1xyXG4gICAgICAgIG5ld0Zvcm1TZXR0aW5ncy5WaWV3LkxheW91dDk0Lml0ZW1zWzBdLml0ZW1zLnB1c2goXHJcbiAgICAgICAgICAgIC4uLm5ld0Zvcm1TZXR0aW5ncy5WaWV3LkNvbnRyb2xJbmZvLm1hcCgoYykgPT5cclxuICAgICAgICAgICAgICAgIGdldExheW91dENvbnRyb2woYy5Db250cm9sTmFtZSwgYy5Db250cm9sRmllbGRDYXB0aW9uVHJhbnNsYXRlZCwgZmFsc2UpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZm9ybVJlcXVlc3RQYXJhbXMgPSBuZXcgQmFyc2FBcGkuVWwuRm9ybVJlcXVlc3RQYXJhbXMoe1xyXG4gICAgICAgIE1vSWQ6IG5ld0Zvcm1TZXR0aW5ncy5EYXRhLk1vLklkLFxyXG4gICAgICAgIFR5cGVEZWZJZDogdHlwZWRlZixcclxuICAgICAgICBSZWxhdGlvbjogcmVsYXRpb25cclxuICAgICAgICAvLyBNb0NvbnRleHQ6IHtcclxuICAgICAgICAvLyAgICAgUmVwb3J0SWQ6ICcnLFxyXG4gICAgICAgIC8vICAgICBWaWV3SWQ6ICcnLFxyXG4gICAgICAgIC8vICAgICBWaWV3TmFtZTogJycsXHJcbiAgICAgICAgLy8gICAgIENvbmRGb3JtYXRpbmc6ICcnLFxyXG4gICAgICAgIC8vICAgICBJbmNsdWRlSW5SZXBvcnQ6ICcnXHJcbiAgICAgICAgLy8gfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmb3JtUGFuZWxDdHJsciA9IG5ldyBCYXJzYUFwaS5VbC5Gb3JtUGFuZWxDdHJscih7XHJcbiAgICAgICAgU2V0dGluZzogbmV3Rm9ybVNldHRpbmdzLFxyXG4gICAgICAgIFJlbGF0aW9uOiByZWxhdGlvbixcclxuICAgICAgICBVbHZNYWluQ3RybHI6IFVsdk1haW5DdHJscixcclxuICAgICAgICBGZWF0dXJlczoge1xyXG4gICAgICAgICAgICBXb3JrZmxvdzogZmFsc2UsXHJcbiAgICAgICAgICAgIFRvb2xiYXI6IGZhbHNlLFxyXG4gICAgICAgICAgICBJbmZvQmFyOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgRm9ybVJlcXVlc3RQYXJhbXM6IGZvcm1SZXF1ZXN0UGFyYW1zXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmb3JtUGFuZWxDdHJscjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExheW91dENvbnRyb2woXHJcbiAgICBjb250cm9sTmFtZTogc3RyaW5nLFxyXG4gICAgY29udHJvbENhcHRpb246IHN0cmluZyA9ICcnLFxyXG4gICAgaGlkZTogYm9vbGVhbiA9IHRydWVcclxuKTogUGFydGlhbDxHZW5lcmFsQ29udHJvbEluZm9Nb2RlbD4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB4dHlwZTogJ0x5LkxheW91dENvbnRyb2wnLFxyXG4gICAgICAgIFR5cGU6ICdMYXlvdXRDb250cm9sSXRlbScsXHJcbiAgICAgICAgQ29udHJvbElkOiBjb250cm9sTmFtZSxcclxuICAgICAgICBJc1ZlcnRpY2FsOiBmYWxzZSxcclxuICAgICAgICBUZXh0TG9jYXRpb246ICdSaWdodCcsXHJcbiAgICAgICAgVGV4dFZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgIFZpc2libGU6ICFoaWRlLFxyXG4gICAgICAgIGhpZGUsXHJcbiAgICAgICAgVXNlTGF5b3V0SXRlbVRleHRGb3JDb250cm9sOiBmYWxzZSxcclxuICAgICAgICBDYXB0aW9uOiBjb250cm9sQ2FwdGlvbixcclxuICAgICAgICBBY2Nlc3NpYmxlTmFtZTogJycsXHJcbiAgICAgICAgQm91bmRzOiB7IHg6IDAsIHk6IDAsIHdpZHRoOiA0MzIsIGhlaWdodDogMjQgfSxcclxuICAgICAgICBNaW5TaXplOiB7IHdpZHRoOiA4OSwgaGVpZ2h0OiAyNCB9LFxyXG4gICAgICAgIE1heFNpemU6IHsgd2lkdGg6IDAsIGhlaWdodDogMjQgfSxcclxuICAgICAgICBDb250cm9sQm91bmRzOiB7IHdpZHRoOiAzODgsIGhlaWdodDogMjAgfSxcclxuICAgICAgICBDb250cm9sTWluU2l6ZTogeyB3aWR0aDogNDUsIGhlaWdodDogMjAgfSxcclxuICAgICAgICBDb250cm9sTWF4U2l6ZTogeyB3aWR0aDogMCwgaGVpZ2h0OiAyMCB9LFxyXG4gICAgICAgIFBhZGRpbmc6IFsyLCAyLCAyLCAyXSxcclxuICAgICAgICBMYWJlbFNpemU6IHsgd2lkdGg6IDM1LCBoZWlnaHQ6IDEzIH0sXHJcbiAgICAgICAgb3JpZ2luYWxYdHlwZTogJydcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sTGlzdChcclxuICAgIG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLFxyXG4gICAgY29udHJvbERiTmFtZXM6IHN0cmluZ1tdLFxyXG4gICAgaXNTZWFyY2hQYW5lbDogYm9vbGVhbixcclxuICAgIGlzR3JpZEVkaXRvcjogYm9vbGVhblxyXG4pOiBQcm9taXNlPEdlbmVyYWxDb250cm9sSW5mb01vZGVsW10+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxHZW5lcmFsQ29udHJvbEluZm9Nb2RlbFtdPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgQmFyc2FBcGkuQ29tbW9uLkFqYXguR2V0U2VydmVyRGF0YShcclxuICAgICAgICAgICAgJ0Zvcm05NC5HZXRDb250cm9sSW5mb3MnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sSW5mb1BhcmFtZXRlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkRGJOYW1lczogY29udHJvbERiTmFtZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgTW86IG5ldyBCYXJzYUFwaS5Db21tb24uTWV0YU9iamVjdFdlYihtbyksXHJcbiAgICAgICAgICAgICAgICAgICAgSXNTZWFyY2hQYW5lbDogaXNTZWFyY2hQYW5lbCxcclxuICAgICAgICAgICAgICAgICAgICBJc0dyaWRFZGl0b3I6IGlzR3JpZEVkaXRvclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAobSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShtKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE56U2FmZUFueSA9IGFueTtcclxuZXhwb3J0IHR5cGUgTnVtYmVySW5wdXQgPSBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsO1xyXG5leHBvcnQgaW50ZXJmYWNlIE5nU3R5bGVJbnRlcmZhY2Uge1xyXG4gICAgW2tsYXNzOiBzdHJpbmddOiBOelNhZmVBbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXhhYmxlT2JqZWN0IHtcclxuICAgIFtrZXk6IHN0cmluZ106IE56U2FmZUFueTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakE/OiBJbmRleGFibGVPYmplY3QsIG9iakI/OiBJbmRleGFibGVPYmplY3QpOiBib29sZWFuIHtcclxuICAgIGlmIChvYmpBID09PSBvYmpCKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCAhb2JqQSB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgIW9iakIpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcclxuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XHJcblxyXG4gICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJIYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuYmluZChvYmpCKTtcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mb3Itb2ZcclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGtleXNBLmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBrZXlzQVtpZHhdO1xyXG4gICAgICAgIGlmICghYkhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2JqQVtrZXldICE9PSBvYmpCW2tleV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlcjtcclxuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyPEQ+KHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIGZhbGxiYWNrOiBEKTogbnVtYmVyIHwgRDtcclxuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIGZhbGxiYWNrVmFsdWU6IG51bWJlciA9IDApOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIF9pc051bWJlclZhbHVlKHZhbHVlKSA/IE51bWJlcih2YWx1ZSkgOiBmYWxsYmFja1ZhbHVlO1xyXG59XHJcbmZ1bmN0aW9uIHByb3BEZWNvcmF0b3JGYWN0b3J5PFQsIEQ+KFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgZmFsbGJhY2s6ICh2OiBUKSA9PiBEXHJcbik6ICh0YXJnZXQ6IE56U2FmZUFueSwgcHJvcE5hbWU6IHN0cmluZykgPT4gdm9pZCB7XHJcbiAgICBmdW5jdGlvbiBwcm9wRGVjb3JhdG9yKFxyXG4gICAgICAgIHRhcmdldDogTnpTYWZlQW55LFxyXG4gICAgICAgIHByb3BOYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgb3JpZ2luYWxEZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8TnpTYWZlQW55PlxyXG4gICAgKTogTnpTYWZlQW55IHtcclxuICAgICAgICBjb25zdCBwcml2YXRlUHJvcE5hbWUgPSBgJCRfX3pvcnJvUHJvcERlY29yYXRvcl9fJHtwcm9wTmFtZX1gO1xyXG5cclxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgcHJpdmF0ZVByb3BOYW1lKSkge1xyXG4gICAgICAgICAgICAvLyB3YXJuKGBUaGUgcHJvcCBcIiR7cHJpdmF0ZVByb3BOYW1lfVwiIGlzIGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgb3ZlcnJpZGVkIGJ5ICR7bmFtZX0gZGVjb3JhdG9yLmApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJpdmF0ZVByb3BOYW1lLCB7XHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZ2V0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxEZXNjcmlwdG9yICYmIG9yaWdpbmFsRGVzY3JpcHRvci5nZXRcclxuICAgICAgICAgICAgICAgICAgICA/IG9yaWdpbmFsRGVzY3JpcHRvci5nZXQuYmluZCh0aGlzKSgpXHJcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzW3ByaXZhdGVQcm9wTmFtZV07XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCh2YWx1ZTogVCk6IHZvaWQge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGVzY3JpcHRvciAmJiBvcmlnaW5hbERlc2NyaXB0b3Iuc2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxEZXNjcmlwdG9yLnNldC5iaW5kKHRoaXMpKGZhbGxiYWNrKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzW3ByaXZhdGVQcm9wTmFtZV0gPSBmYWxsYmFjayh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwcm9wRGVjb3JhdG9yO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBJbnB1dE51bWJlcihmYWxsYmFja1ZhbHVlPzogTnpTYWZlQW55KTogTnpTYWZlQW55IHtcclxuICAgIHJldHVybiBwcm9wRGVjb3JhdG9yRmFjdG9yeSgnSW5wdXROdW1iZXInLCAodmFsdWU6IHN0cmluZyB8IG51bWJlcikgPT4gdG9OdW1iZXIodmFsdWUsIGZhbGxiYWNrVmFsdWUpKTtcclxufVxyXG5leHBvcnQgZW51bSBBZmZpeFJlc3BvbmRFdmVudHMge1xyXG4gICAgcmVzaXplID0gJ3Jlc2l6ZScsXHJcbiAgICBzY3JvbGwgPSAnc2Nyb2xsJyxcclxuICAgIHRvdWNoc3RhcnQgPSAndG91Y2hzdGFydCcsXHJcbiAgICB0b3VjaG1vdmUgPSAndG91Y2htb3ZlJyxcclxuICAgIHRvdWNoZW5kID0gJ3RvdWNoZW5kJyxcclxuICAgIHBhZ2VzaG93ID0gJ3BhZ2VzaG93JyxcclxuICAgIGxvYWQgPSAnTE9BRCdcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsZVJlY3Qge1xyXG4gICAgdG9wOiBudW1iZXI7XHJcbiAgICBsZWZ0OiBudW1iZXI7XHJcbiAgICB3aWR0aD86IG51bWJlcjtcclxuICAgIGhlaWdodD86IG51bWJlcjtcclxuICAgIGJvdHRvbT86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFyZ2V0V2luZG93KHRhcmdldDogRWxlbWVudCB8IFdpbmRvdyk6IHRhcmdldCBpcyBXaW5kb3cge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRhcmdldCA9PT0gd2luZG93O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0UmVjdCh0YXJnZXQ6IEVsZW1lbnQgfCBXaW5kb3cpOiBTaW1wbGVSZWN0IHtcclxuICAgIHJldHVybiAhaXNUYXJnZXRXaW5kb3codGFyZ2V0KVxyXG4gICAgICAgID8gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcbiAgICAgICAgOiB7XHJcbiAgICAgICAgICAgICAgdG9wOiAwLFxyXG4gICAgICAgICAgICAgIGxlZnQ6IDAsXHJcbiAgICAgICAgICAgICAgYm90dG9tOiAwXHJcbiAgICAgICAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShuYW1lOiBzdHJpbmcsIG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBjYXB0aW9uPzogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBpZiAobW8uR2V0RlZhbHVlQnlDYXB0aW9uKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG1vLkdldEZWYWx1ZShuYW1lKTtcclxuICAgICAgICBpZiAoY2FwdGlvbikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBtby5HZXRGQ2FwdGlvbihuYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjYXB0aW9uID09PSAndW5kZWZpbmVkJyAmJiBtby5Jbmhlcml0YW5jZUluZm8gJiYgIShtby4kRmllbGREaWN0ICYmIG1vLiRGaWVsZERpY3RbbmFtZV0pKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgUGFyZW50RmllbGROYW1lIH0gPSBtby5Jbmhlcml0YW5jZUluZm87XHJcbiAgICAgICAgICAgIGNvbnN0IG1vUGFyZW50ID0gbW8uR2V0RlZhbHVlKFBhcmVudEZpZWxkTmFtZSk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBtb1BhcmVudC5HZXRGVmFsdWUobmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChjYXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBtb1BhcmVudC5HZXRGQ2FwdGlvbihuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgY29uc3QgZmllbGROYW1lID0gbW8uJEZpZWxkRGljdCAmJiBtby4kRmllbGREaWN0W25hbWVdID8gbW8uJEZpZWxkRGljdFtuYW1lXSA6IG5hbWU7XHJcbiAgICBsZXQgdmFsID0gbW9bZmllbGROYW1lXTtcclxuICAgIGlmIChjYXB0aW9uKSB7XHJcbiAgICAgICAgbGV0IGNhcHRpb25WYWwgPSBtb1tmaWVsZE5hbWVdPy4kQ2FwdGlvbjtcclxuICAgICAgICBpZiAodHlwZW9mIGNhcHRpb25WYWwgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmICghY2FwdGlvblZhbCkge1xyXG4gICAgICAgICAgICAgICAgY2FwdGlvblZhbCA9IG1vW2ZpZWxkTmFtZSArICckQ2FwdGlvbiddO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghY2FwdGlvblZhbCkge1xyXG4gICAgICAgICAgICAgICAgY2FwdGlvblZhbCA9IHZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB2YWwgPSBjYXB0aW9uVmFsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbDtcclxufVxyXG5cclxuLyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXHJcbmV4cG9ydCBjb25zdCBhdmFpbGFibGVQcmVmaXhlcyA9IFsnbW96JywgJ21zJywgJ3dlYmtpdCddO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKCk6IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUge1xyXG4gICAgbGV0IGxhc3RUaW1lID0gMDtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKTogYW55IHtcclxuICAgICAgICBjb25zdCBjdXJyVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIGNvbnN0IHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XHJcbiAgICAgICAgY29uc3QgaWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcclxuICAgICAgICB9LCB0aW1lVG9DYWxsKTtcclxuICAgICAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBFeGVjdXRlRHluYW1pY0NvbW1hbmQoY29tbWFuZDogeyBJZDogc3RyaW5nIH0sIG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcclxuICAgIGNvbnN0IGUgPSB7IGNvbW1hbmQsIER5bmFtaWNTZXR0aW5nOiBtbywgTW86IG1vIH07XHJcbiAgICBCYXJzYUFwaS5Db21tb24uQ3VzdG9tQ29kZU1hbmFnZXIuUnVuRHluYW1pY0NvbW1hbmQoY29tbWFuZC5JZCwgZSk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIEV4ZWN1dGVXb3JrZmxvd0Nob2ljZURlZihzY29wZSwgcGFyYW0sIHN1Y2Nlc3M6IChyZXN1bHQpID0+IHZvaWQsIGZhaWxlZDogKGVycm9yKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICBCYXJzYUFwaS5Db21tb24uQWpheC5HZXRTZXJ2ZXJEYXRhKFxyXG4gICAgICAgICdXb3JrZmxvdzk0LkNob2ljZVNlbGVjdCcsXHJcbiAgICAgICAgcGFyYW0sXHJcbiAgICAgICAgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICBzdWNjZXNzKHJlc3VsdCk7XHJcbiAgICAgICAgfSwgLy8gc3VjY2Vzc1xyXG4gICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBmYWlsZWQoZXJyb3IpO1xyXG4gICAgICAgIH0sIC8vICBlcnJvclxyXG4gICAgICAgICgpID0+IHt9LCAvLyBkb1JldHVyblxyXG4gICAgICAgIHNjb3BlLFxyXG4gICAgICAgIHRydWVcclxuICAgICk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcXVlc3RBbmltYXRpb25GcmFtZSgpOiB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlL2lzc3Vlcy80NDY1XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZWZpeCA9IGF2YWlsYWJsZVByZWZpeGVzLmZpbHRlcigoa2V5KSA9PiBgJHtrZXl9UmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBpbiB3aW5kb3cpWzBdO1xyXG5cclxuICAgIHJldHVybiBwcmVmaXggPyAod2luZG93IGFzIE56U2FmZUFueSlbYCR7cHJlZml4fVJlcXVlc3RBbmltYXRpb25GcmFtZWBdIDogcmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lKGlkOiBudW1iZXIpOiBOelNhZmVBbnkge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAod2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwcmVmaXggPSBhdmFpbGFibGVQcmVmaXhlcy5maWx0ZXIoXHJcbiAgICAgICAgKGtleSkgPT4gYCR7a2V5fUNhbmNlbEFuaW1hdGlvbkZyYW1lYCBpbiB3aW5kb3cgfHwgYCR7a2V5fUNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZWAgaW4gd2luZG93XHJcbiAgICApWzBdO1xyXG5cclxuICAgIHJldHVybiBwcmVmaXhcclxuICAgICAgICA/IChcclxuICAgICAgICAgICAgICAod2luZG93IGFzIE56U2FmZUFueSlbYCR7cHJlZml4fUNhbmNlbEFuaW1hdGlvbkZyYW1lYF0gfHxcclxuICAgICAgICAgICAgICAod2luZG93IGFzIE56U2FmZUFueSlbYCR7cHJlZml4fUNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZWBdXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgIC5jYWxsKHRoaXMsIGlkKVxyXG4gICAgICAgIDogY2xlYXJUaW1lb3V0KGlkKTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRWFzeWluZ0ZuID0gKHQ6IG51bWJlciwgYjogbnVtYmVyLCBjOiBudW1iZXIsIGQ6IG51bWJlcikgPT4gbnVtYmVyO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGVhc2VJbk91dEN1YmljKHQ6IG51bWJlciwgYjogbnVtYmVyLCBjOiBudW1iZXIsIGQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBjYyA9IGMgLSBiO1xyXG4gICAgbGV0IHR0ID0gdCAvIChkIC8gMik7XHJcbiAgICBpZiAodHQgPCAxKSB7XHJcbiAgICAgICAgcmV0dXJuIChjYyAvIDIpICogdHQgKiB0dCAqIHR0ICsgYjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIChjYyAvIDIpICogKCh0dCAtPSAyKSAqIHR0ICogdHQgKyAyKSArIGI7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTnpTY3JvbGxUb09wdGlvbnMge1xyXG4gICAgLyoqIEFuaW1hdGlvbiBkdXJhdGlvbiwgZGVmYXVsdCBhcyA0NTAgKi9cclxuICAgIGR1cmF0aW9uPzogbnVtYmVyO1xyXG4gICAgLyoqIFNjcm9sbCBjb250YWluZXIsIGRlZmF1bHQgYXMgd2luZG93ICovXHJcbiAgICBlYXNpbmc/OiBFYXN5aW5nRm47XHJcbiAgICAvKiogU2Nyb2xsIGVuZCBjYWxsYmFjayAqL1xyXG4gICAgY2FsbGJhY2s/KCk6IHZvaWQ7XHJcbn1cclxuZXhwb3J0IGNvbnN0IFdvcmRNaW1lVHlwZSA9XHJcbiAgICAnLmRvYywuZG9jeCxhcHBsaWNhdGlvbi9tc3dvcmQsYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQnO1xyXG5leHBvcnQgY29uc3QgSW1hZ2VNaW1lVHlwZSA9ICcuanBlZywuanBnLC5naWYsLnBuZywuYm1wLC50aWYsaW1hZ2UvKic7XHJcbmV4cG9ydCBjb25zdCBQZGZNaW1lVHlwZSA9ICcucGRmJztcclxuZXhwb3J0IGNvbnN0IEFsbEZpbGVzTWltZVR5cGUgPSAnLnR4dCwucHB0LC5wZGYsLionO1xyXG5leHBvcnQgY29uc3QgVmlkZW9NaW1lVHlwZSA9ICd2aWRlby8qJztcclxuZXhwb3J0IGNvbnN0IEF1ZGlvTWltZVR5cGUgPSAnYXVkaW8vKic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gQ2hhbmdlTGF5b3V0SW5mb0N1c3RvbVVpKGxheW91dEluZm86IExheW91dFNldHRpbmcsIGNvbXBvbmVudFVpOiBFanJheU9sZ28pOiB2b2lkIHtcclxuICAgIGxheW91dEluZm8uRmllbGRVaS5TZXR0aW5nLkN1c3RvbVVpID0gY29tcG9uZW50VWk7XHJcbn1cclxuZXhwb3J0IGNvbnN0IG1vYmlsZV9yZWdleCA9IG5ldyBSZWdFeHAoJ14oXFxcXCs5OHwwKT85XFxcXGR7OX0kJyk7XHJcbmV4cG9ydCBjb25zdCBudW1iZXJfb25seSA9IG5ldyBSZWdFeHAoJ15bMC05XSskJyk7XHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JiaWRkZW5WYWxpZGF0b3IobmFtZVJlOiBSZWdFeHApOiBWYWxpZGF0b3JGbiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcclxuICAgICAgICBjb25zdCBmb3JiaWRkZW4gPSBuYW1lUmUudGVzdChjb250cm9sLnZhbHVlKTtcclxuICAgICAgICByZXR1cm4gIWZvcmJpZGRlbiA/IHsgZm9yYmlkZGVuTmFtZTogeyB2YWx1ZTogY29udHJvbC52YWx1ZSB9IH0gOiBudWxsO1xyXG4gICAgfTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gR2V0SW1nVGFncyhzZXR0aW5nKSB7XHJcbiAgICBsZXQgc3RyID0gJyc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldHRpbmcuc291cmNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHN0ciArPVxyXG4gICAgICAgICAgICBcIjxpbWcgc3JjPSdcIiArXHJcbiAgICAgICAgICAgIHNldHRpbmcuc291cmNlc1tpXSArXHJcbiAgICAgICAgICAgIFwiJyAgY2xhc3M9J1wiICtcclxuICAgICAgICAgICAgZ2V0Q2VudGVyKHNldHRpbmcuaXNDZW50ZXIpICtcclxuICAgICAgICAgICAgXCInICBzdHlsZT0nXCIgK1xyXG4gICAgICAgICAgICBzZXR0aW5nLmN1c3RvbUNzcyArXHJcbiAgICAgICAgICAgIFwiJyAvPiBcIjtcclxuICAgIH1cclxuICAgIHJldHVybiBzdHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBJbWFnZXRvUHJpbnQoc2V0dGluZykge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgICAnPGh0bWw+PGhlYWQ+JyArXHJcbiAgICAgICAgJzxzY3JpcHQgc3JjPVwiL0xpYi9zY3JpcHRzL2pxdWVyeS14Lm1pbi5qc1wiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPVwiTGliL0ltYWdlUHJpbnQvSW1hZ2VQcmludEludGVybmFsLmpzXCI+PC9zY3JpcHQ+JyArXHJcbiAgICAgICAgJzwvaGVhZD48Ym9keSBzdHlsZT1cIm1hcmdpbiA6IDAgMSAwIDFcIj4nICtcclxuICAgICAgICBHZXRJbWdUYWdzKHNldHRpbmcpICtcclxuICAgICAgICAnPC9ib2R5PjwvaHRtbD4nXHJcbiAgICApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUHJpbnRJbWFnZShzZXR0aW5nKSB7XHJcbiAgICBsZXQgcGFnZUxpbmsgPSAnYWJvdXQ6YmxhbmsnO1xyXG4gICAgbGV0IHB3YSA9IHdpbmRvdy5vcGVuKHBhZ2VMaW5rLCAnX25ldycpO1xyXG4gICAgcHdhPy5kb2N1bWVudC5vcGVuKCk7XHJcbiAgICBsZXQgaW1hZ2VUb1ByaW50ID0gSW1hZ2V0b1ByaW50KHNldHRpbmcpO1xyXG4gICAgcHdhPy5kb2N1bWVudC53cml0ZShpbWFnZVRvUHJpbnQpO1xyXG4gICAgcHdhPy5kb2N1bWVudC5jbG9zZSgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRDZW50ZXIoaXNDZW50ZXIpIHtcclxuICAgIGlmIChpc0NlbnRlcikgcmV0dXJuICdjZW50ZXInO1xyXG4gICAgcmV0dXJuICcnO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBTYXZlSW1hZ2VUb0ZpbGUobmFtZTogc3RyaW5nLCBzcmM6IHN0cmluZykge1xyXG4gICAgY29uc3QgdCA9IGdldFVuaXF1ZUlkKDQpO1xyXG4gICAgdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rLmhyZWYgPSBzcmM7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gbmFtZTtcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsaW5rLnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKGxpbmspO1xyXG4gICAgfSwgMTApO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUFsbEZvcm1GaWVsZHMoZm9ybUdyb3VwOiBGb3JtR3JvdXApIHtcclxuICAgIC8vezF9XHJcbiAgICBPYmplY3Qua2V5cyhmb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgLy97Mn1cclxuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZCk7IC8vezN9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xyXG4gICAgICAgICAgICAvL3s0fVxyXG4gICAgICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgLy97NX1cclxuICAgICAgICAgICAgdmFsaWRhdGVBbGxGb3JtRmllbGRzKGNvbnRyb2wpOyAvL3s2fVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2N1c2FibGVUYWdOYW1lcygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBidXR0b24sYnV0dG9uOm5vdChbZGlzYWJsZWRdKSxbaHJlZl0saW5wdXQ6bm90KFtkaXNhYmxlZF0pLGlucHV0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0LHNlbGVjdDpub3QoW2Rpc2FibGVkXSksdGV4dGFyZWEsdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLFt0YWJpbmRleF06bm90KFt0YWJpbmRleD1cIi0xXCJdKWA7XHJcbn1cclxuIl19
|