ngx-bootstrap 3.2.0 → 3.3.0
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/CHANGELOG.md +46 -0
- package/README.md +3 -0
- package/accordion/package.json +1 -1
- package/alert/package.json +1 -1
- package/bundles/ngx-bootstrap.es2015.js +10658 -8629
- package/bundles/ngx-bootstrap.es2015.js.map +1 -1
- package/buttons/package.json +1 -1
- package/carousel/package.json +1 -1
- package/chronos/bundles/ngx-bootstrap-chronos.umd.js +22 -1
- package/chronos/bundles/ngx-bootstrap-chronos.umd.js.map +1 -1
- package/chronos/bundles/ngx-bootstrap-chronos.umd.min.js +1 -1
- package/chronos/bundles/ngx-bootstrap-chronos.umd.min.js.map +1 -1
- package/chronos/esm2015/index.js +2 -2
- package/chronos/esm2015/ngx-bootstrap-chronos.js +2 -2
- package/chronos/esm2015/public_api.js +2 -2
- package/chronos/esm5/index.js +2 -2
- package/chronos/esm5/ngx-bootstrap-chronos.js +2 -2
- package/chronos/esm5/public_api.js +2 -2
- package/chronos/fesm2015/ngx-bootstrap-chronos.js +19 -2
- package/chronos/fesm2015/ngx-bootstrap-chronos.js.map +1 -1
- package/chronos/fesm5/ngx-bootstrap-chronos.js +20 -2
- package/chronos/fesm5/ngx-bootstrap-chronos.js.map +1 -1
- package/chronos/ngx-bootstrap-chronos.metadata.json +1 -1
- package/chronos/package.json +1 -1
- package/chronos/public_api.d.ts +1 -1
- package/collapse/package.json +1 -1
- package/component-loader/bundles/ngx-bootstrap-component-loader.umd.js +2 -1
- package/component-loader/bundles/ngx-bootstrap-component-loader.umd.js.map +1 -1
- package/component-loader/bundles/ngx-bootstrap-component-loader.umd.min.js +1 -1
- package/component-loader/bundles/ngx-bootstrap-component-loader.umd.min.js.map +1 -1
- package/component-loader/esm2015/component-loader.class.js +2 -1
- package/component-loader/esm5/component-loader.class.js +2 -1
- package/component-loader/fesm2015/ngx-bootstrap-component-loader.js +2 -1
- package/component-loader/fesm2015/ngx-bootstrap-component-loader.js.map +1 -1
- package/component-loader/fesm5/ngx-bootstrap-component-loader.js +2 -1
- package/component-loader/fesm5/ngx-bootstrap-component-loader.js.map +1 -1
- package/component-loader/package.json +1 -1
- package/datepicker/base/bs-datepicker-container.d.ts +1 -0
- package/datepicker/bs-datepicker-inline.component.d.ts +4 -0
- package/datepicker/bs-datepicker.component.d.ts +4 -0
- package/datepicker/bs-datepicker.config.d.ts +4 -0
- package/datepicker/bs-daterangepicker.component.d.ts +4 -0
- package/datepicker/bundles/ngx-bootstrap-datepicker.umd.js +69 -4
- package/datepicker/bundles/ngx-bootstrap-datepicker.umd.js.map +1 -1
- package/datepicker/bundles/ngx-bootstrap-datepicker.umd.min.js +1 -1
- package/datepicker/bundles/ngx-bootstrap-datepicker.umd.min.js.map +1 -1
- package/datepicker/engine/flag-days-calendar.d.ts +1 -0
- package/datepicker/esm2015/base/bs-datepicker-container.js +8 -1
- package/datepicker/esm2015/bs-datepicker-inline.component.js +12 -2
- package/datepicker/esm2015/bs-datepicker.component.js +11 -1
- package/datepicker/esm2015/bs-datepicker.config.js +6 -1
- package/datepicker/esm2015/bs-daterangepicker.component.js +12 -2
- package/datepicker/esm2015/engine/flag-days-calendar.js +6 -3
- package/datepicker/esm2015/reducer/bs-datepicker.actions.js +14 -1
- package/datepicker/esm2015/reducer/bs-datepicker.effects.js +9 -1
- package/datepicker/esm2015/reducer/bs-datepicker.reducer.js +2 -1
- package/datepicker/esm2015/reducer/bs-datepicker.state.js +3 -1
- package/datepicker/esm2015/utils/bs-calendar-utils.js +13 -2
- package/datepicker/esm5/base/bs-datepicker-container.js +12 -1
- package/datepicker/esm5/bs-datepicker-inline.component.js +12 -2
- package/datepicker/esm5/bs-datepicker.component.js +11 -1
- package/datepicker/esm5/bs-datepicker.config.js +6 -1
- package/datepicker/esm5/bs-daterangepicker.component.js +12 -2
- package/datepicker/esm5/engine/flag-days-calendar.js +6 -3
- package/datepicker/esm5/reducer/bs-datepicker.actions.js +18 -1
- package/datepicker/esm5/reducer/bs-datepicker.effects.js +13 -1
- package/datepicker/esm5/reducer/bs-datepicker.reducer.js +2 -1
- package/datepicker/esm5/reducer/bs-datepicker.state.js +3 -1
- package/datepicker/esm5/utils/bs-calendar-utils.js +13 -2
- package/datepicker/fesm2015/ngx-bootstrap-datepicker.js +59 -5
- package/datepicker/fesm2015/ngx-bootstrap-datepicker.js.map +1 -1
- package/datepicker/fesm5/ngx-bootstrap-datepicker.js +71 -5
- package/datepicker/fesm5/ngx-bootstrap-datepicker.js.map +1 -1
- package/datepicker/ngx-bootstrap-datepicker.metadata.json +1 -1
- package/datepicker/package.json +1 -1
- package/datepicker/reducer/bs-datepicker.actions.d.ts +2 -0
- package/datepicker/reducer/bs-datepicker.effects.d.ts +1 -0
- package/datepicker/reducer/bs-datepicker.state.d.ts +1 -0
- package/datepicker/utils/bs-calendar-utils.d.ts +1 -0
- package/dropdown/package.json +1 -1
- package/locale/package.json +1 -1
- package/mini-ngrx/package.json +1 -1
- package/modal/package.json +1 -1
- package/package.json +2 -2
- package/pagination/package.json +1 -1
- package/popover/bundles/ngx-bootstrap-popover.umd.js +3 -2
- package/popover/bundles/ngx-bootstrap-popover.umd.js.map +1 -1
- package/popover/bundles/ngx-bootstrap-popover.umd.min.js +1 -1
- package/popover/bundles/ngx-bootstrap-popover.umd.min.js.map +1 -1
- package/popover/esm2015/popover-container.component.js +19 -8
- package/popover/esm5/popover-container.component.js +3 -2
- package/popover/fesm2015/ngx-bootstrap-popover.js +19 -8
- package/popover/fesm2015/ngx-bootstrap-popover.js.map +1 -1
- package/popover/fesm5/ngx-bootstrap-popover.js +3 -2
- package/popover/fesm5/ngx-bootstrap-popover.js.map +1 -1
- package/popover/ngx-bootstrap-popover.metadata.json +1 -1
- package/popover/package.json +1 -1
- package/positioning/bundles/ngx-bootstrap-positioning.umd.js +1192 -252
- package/positioning/bundles/ngx-bootstrap-positioning.umd.js.map +1 -1
- package/positioning/bundles/ngx-bootstrap-positioning.umd.min.js +1 -1
- package/positioning/bundles/ngx-bootstrap-positioning.umd.min.js.map +1 -1
- package/positioning/esm2015/models/index.js +44 -0
- package/positioning/esm2015/modifiers/arrow.js +54 -0
- package/positioning/esm2015/modifiers/flip.js +65 -0
- package/positioning/esm2015/modifiers/index.js +11 -0
- package/positioning/esm2015/modifiers/initData.js +34 -0
- package/positioning/esm2015/modifiers/preventOverflow.js +70 -0
- package/positioning/esm2015/modifiers/shift.js +29 -0
- package/positioning/esm2015/ng-positioning.js +19 -220
- package/positioning/esm2015/positioning.service.js +44 -4
- package/positioning/esm2015/utils/computeAutoPlacement.js +64 -0
- package/positioning/esm2015/utils/findCommonOffsetParent.js +47 -0
- package/positioning/esm2015/utils/getBordersSize.js +20 -0
- package/positioning/esm2015/utils/getBoundaries.js +66 -0
- package/positioning/esm2015/utils/getBoundingClientRect.js +61 -0
- package/positioning/esm2015/utils/getClientRect.js +13 -0
- package/positioning/esm2015/utils/getFixedPositionOffsetParent.js +26 -0
- package/positioning/esm2015/utils/getOffsetParent.js +37 -0
- package/positioning/esm2015/utils/getOffsetRectRelativeToArbitraryNode.js +62 -0
- package/positioning/esm2015/utils/getOffsets.js +20 -0
- package/positioning/esm2015/utils/getOppositePlacement.js +15 -0
- package/positioning/esm2015/utils/getOppositeVariation.js +20 -0
- package/positioning/esm2015/utils/getOuterSizes.js +21 -0
- package/positioning/esm2015/utils/getParentNode.js +17 -0
- package/positioning/esm2015/utils/getReferenceOffsets.js +21 -0
- package/positioning/esm2015/utils/getRoot.js +17 -0
- package/positioning/esm2015/utils/getScroll.js +22 -0
- package/positioning/esm2015/utils/getScrollParent.js +32 -0
- package/positioning/esm2015/utils/getStyleComputedProperty.js +21 -0
- package/positioning/esm2015/utils/getTargetOffsets.js +38 -0
- package/positioning/esm2015/utils/getViewportOffsetRectRelativeToArtbitraryNode.js +29 -0
- package/positioning/esm2015/utils/getWindowSizes.js +34 -0
- package/positioning/esm2015/utils/includeScroll.js +23 -0
- package/positioning/esm2015/utils/index.js +28 -0
- package/positioning/esm2015/utils/isBrowser.js +7 -0
- package/positioning/esm2015/utils/isFixed.js +22 -0
- package/positioning/esm2015/utils/isIE.js +22 -0
- package/positioning/esm2015/utils/isNumeric.js +14 -0
- package/positioning/esm2015/utils/isOffsetContainer.js +18 -0
- package/positioning/esm2015/utils/setAllStyles.js +55 -0
- package/positioning/esm2015/utils/setStyles.js +28 -0
- package/positioning/esm5/models/index.js +44 -0
- package/positioning/esm5/modifiers/arrow.js +56 -0
- package/positioning/esm5/modifiers/flip.js +66 -0
- package/positioning/esm5/modifiers/index.js +11 -0
- package/positioning/esm5/modifiers/initData.js +34 -0
- package/positioning/esm5/modifiers/preventOverflow.js +73 -0
- package/positioning/esm5/modifiers/shift.js +31 -0
- package/positioning/esm5/ng-positioning.js +24 -247
- package/positioning/esm5/positioning.service.js +49 -5
- package/positioning/esm5/utils/computeAutoPlacement.js +72 -0
- package/positioning/esm5/utils/findCommonOffsetParent.js +47 -0
- package/positioning/esm5/utils/getBordersSize.js +20 -0
- package/positioning/esm5/utils/getBoundaries.js +68 -0
- package/positioning/esm5/utils/getBoundingClientRect.js +61 -0
- package/positioning/esm5/utils/getClientRect.js +14 -0
- package/positioning/esm5/utils/getFixedPositionOffsetParent.js +26 -0
- package/positioning/esm5/utils/getOffsetParent.js +37 -0
- package/positioning/esm5/utils/getOffsetRectRelativeToArbitraryNode.js +63 -0
- package/positioning/esm5/utils/getOffsets.js +20 -0
- package/positioning/esm5/utils/getOppositePlacement.js +15 -0
- package/positioning/esm5/utils/getOppositeVariation.js +20 -0
- package/positioning/esm5/utils/getOuterSizes.js +21 -0
- package/positioning/esm5/utils/getParentNode.js +17 -0
- package/positioning/esm5/utils/getReferenceOffsets.js +22 -0
- package/positioning/esm5/utils/getRoot.js +17 -0
- package/positioning/esm5/utils/getScroll.js +23 -0
- package/positioning/esm5/utils/getScrollParent.js +32 -0
- package/positioning/esm5/utils/getStyleComputedProperty.js +21 -0
- package/positioning/esm5/utils/getTargetOffsets.js +38 -0
- package/positioning/esm5/utils/getViewportOffsetRectRelativeToArtbitraryNode.js +30 -0
- package/positioning/esm5/utils/getWindowSizes.js +34 -0
- package/positioning/esm5/utils/includeScroll.js +24 -0
- package/positioning/esm5/utils/index.js +28 -0
- package/positioning/esm5/utils/isBrowser.js +7 -0
- package/positioning/esm5/utils/isFixed.js +22 -0
- package/positioning/esm5/utils/isIE.js +22 -0
- package/positioning/esm5/utils/isNumeric.js +14 -0
- package/positioning/esm5/utils/isOffsetContainer.js +18 -0
- package/positioning/esm5/utils/setAllStyles.js +55 -0
- package/positioning/esm5/utils/setStyles.js +28 -0
- package/positioning/fesm2015/ngx-bootstrap-positioning.js +1108 -211
- package/positioning/fesm2015/ngx-bootstrap-positioning.js.map +1 -1
- package/positioning/fesm5/ngx-bootstrap-positioning.js +1148 -249
- package/positioning/fesm5/ngx-bootstrap-positioning.js.map +1 -1
- package/positioning/models/index.d.ts +27 -0
- package/positioning/modifiers/arrow.d.ts +2 -0
- package/positioning/modifiers/flip.d.ts +2 -0
- package/positioning/modifiers/index.d.ts +5 -0
- package/positioning/modifiers/initData.d.ts +2 -0
- package/positioning/modifiers/preventOverflow.d.ts +2 -0
- package/positioning/modifiers/shift.d.ts +2 -0
- package/positioning/ng-positioning.d.ts +7 -10
- package/positioning/ngx-bootstrap-positioning.metadata.json +1 -1
- package/positioning/package.json +1 -1
- package/positioning/positioning.service.d.ts +7 -1
- package/positioning/utils/computeAutoPlacement.d.ts +2 -0
- package/positioning/utils/findCommonOffsetParent.d.ts +1 -0
- package/positioning/utils/getBordersSize.d.ts +4 -0
- package/positioning/utils/getBoundaries.d.ts +1 -0
- package/positioning/utils/getBoundingClientRect.d.ts +2 -0
- package/positioning/utils/getClientRect.d.ts +5 -0
- package/positioning/utils/getFixedPositionOffsetParent.d.ts +1 -0
- package/positioning/utils/getOffsetParent.d.ts +1 -0
- package/positioning/utils/getOffsetRectRelativeToArbitraryNode.d.ts +2 -0
- package/positioning/utils/getOffsets.d.ts +2 -0
- package/positioning/utils/getOppositePlacement.d.ts +4 -0
- package/positioning/utils/getOppositeVariation.d.ts +4 -0
- package/positioning/utils/getOuterSizes.d.ts +7 -0
- package/positioning/utils/getParentNode.d.ts +4 -0
- package/positioning/utils/getReferenceOffsets.d.ts +2 -0
- package/positioning/utils/getRoot.d.ts +4 -0
- package/positioning/utils/getScroll.d.ts +4 -0
- package/positioning/utils/getScrollParent.d.ts +1 -0
- package/positioning/utils/getStyleComputedProperty.d.ts +4 -0
- package/positioning/utils/getTargetOffsets.d.ts +2 -0
- package/positioning/utils/getViewportOffsetRectRelativeToArtbitraryNode.d.ts +2 -0
- package/positioning/utils/getWindowSizes.d.ts +4 -0
- package/positioning/utils/includeScroll.d.ts +2 -0
- package/positioning/utils/index.d.ts +22 -0
- package/positioning/utils/isBrowser.d.ts +1 -0
- package/positioning/utils/isFixed.d.ts +1 -0
- package/positioning/utils/isIE.d.ts +1 -0
- package/positioning/utils/isNumeric.d.ts +4 -0
- package/positioning/utils/isOffsetContainer.d.ts +1 -0
- package/positioning/utils/setAllStyles.d.ts +6 -0
- package/positioning/utils/setStyles.d.ts +5 -0
- package/progressbar/package.json +1 -1
- package/rating/package.json +1 -1
- package/sortable/package.json +1 -1
- package/tabs/package.json +1 -1
- package/timepicker/package.json +1 -1
- package/tooltip/bundles/ngx-bootstrap-tooltip.umd.js +3 -2
- package/tooltip/bundles/ngx-bootstrap-tooltip.umd.js.map +1 -1
- package/tooltip/bundles/ngx-bootstrap-tooltip.umd.min.js +1 -1
- package/tooltip/bundles/ngx-bootstrap-tooltip.umd.min.js.map +1 -1
- package/tooltip/esm2015/tooltip-container.component.js +12 -7
- package/tooltip/esm5/tooltip-container.component.js +3 -2
- package/tooltip/fesm2015/ngx-bootstrap-tooltip.js +12 -7
- package/tooltip/fesm2015/ngx-bootstrap-tooltip.js.map +1 -1
- package/tooltip/fesm5/ngx-bootstrap-tooltip.js +3 -2
- package/tooltip/fesm5/ngx-bootstrap-tooltip.js.map +1 -1
- package/tooltip/ngx-bootstrap-tooltip.metadata.json +1 -1
- package/tooltip/package.json +1 -1
- package/typeahead/bundles/ngx-bootstrap-typeahead.umd.js +46 -22
- package/typeahead/bundles/ngx-bootstrap-typeahead.umd.js.map +1 -1
- package/typeahead/bundles/ngx-bootstrap-typeahead.umd.min.js +1 -1
- package/typeahead/bundles/ngx-bootstrap-typeahead.umd.min.js.map +1 -1
- package/typeahead/esm2015/typeahead-container.component.js +15 -4
- package/typeahead/esm2015/typeahead.config.js +21 -1
- package/typeahead/esm2015/typeahead.directive.js +37 -21
- package/typeahead/esm5/typeahead-container.component.js +12 -4
- package/typeahead/esm5/typeahead.config.js +21 -1
- package/typeahead/esm5/typeahead.directive.js +37 -21
- package/typeahead/fesm2015/ngx-bootstrap-typeahead.js +49 -22
- package/typeahead/fesm2015/ngx-bootstrap-typeahead.js.map +1 -1
- package/typeahead/fesm5/ngx-bootstrap-typeahead.js +46 -22
- package/typeahead/fesm5/ngx-bootstrap-typeahead.js.map +1 -1
- package/typeahead/ngx-bootstrap-typeahead.metadata.json +1 -1
- package/typeahead/package.json +1 -1
- package/typeahead/typeahead-container.component.d.ts +1 -1
- package/typeahead/typeahead.config.d.ts +6 -0
- package/typeahead/typeahead.directive.d.ts +7 -1
- package/utils/package.json +1 -1
@@ -1,294 +1,1195 @@
|
|
1
1
|
(function (global, factory) {
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core')) :
|
3
|
-
typeof define === 'function' && define.amd ? define('ngx-bootstrap/positioning', ['exports', '@angular/core'], factory) :
|
4
|
-
(factory((global['ngx-bootstrap'] = global['ngx-bootstrap'] || {}, global['ngx-bootstrap'].positioning = {}),global.ng.core));
|
5
|
-
}(this, (function (exports,core) { 'use strict';
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs')) :
|
3
|
+
typeof define === 'function' && define.amd ? define('ngx-bootstrap/positioning', ['exports', '@angular/core', 'rxjs'], factory) :
|
4
|
+
(factory((global['ngx-bootstrap'] = global['ngx-bootstrap'] || {}, global['ngx-bootstrap'].positioning = {}),global.ng.core,global.rxjs));
|
5
|
+
}(this, (function (exports,core,rxjs) { 'use strict';
|
6
|
+
|
7
|
+
/*! *****************************************************************************
|
8
|
+
Copyright (c) Microsoft Corporation. All rights reserved.
|
9
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
10
|
+
this file except in compliance with the License. You may obtain a copy of the
|
11
|
+
License at http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
|
13
|
+
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
14
|
+
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
|
15
|
+
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
|
16
|
+
MERCHANTABLITY OR NON-INFRINGEMENT.
|
17
|
+
|
18
|
+
See the Apache Version 2.0 License for specific language governing permissions
|
19
|
+
and limitations under the License.
|
20
|
+
***************************************************************************** */
|
21
|
+
var __assign = function () {
|
22
|
+
__assign = Object.assign || function __assign(t) {
|
23
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
24
|
+
s = arguments[i];
|
25
|
+
for (var p in s)
|
26
|
+
if (Object.prototype.hasOwnProperty.call(s, p))
|
27
|
+
t[p] = s[p];
|
28
|
+
}
|
29
|
+
return t;
|
30
|
+
};
|
31
|
+
return __assign.apply(this, arguments);
|
32
|
+
};
|
33
|
+
|
34
|
+
/**
|
35
|
+
* @fileoverview added by tsickle
|
36
|
+
* @suppress {checkTypes} checked by tsc
|
37
|
+
*/
|
38
|
+
/**
|
39
|
+
* Get CSS computed property of the given element
|
40
|
+
* @param {?} element
|
41
|
+
* @param {?=} property
|
42
|
+
* @return {?}
|
43
|
+
*/
|
44
|
+
function getStyleComputedProperty(element, property) {
|
45
|
+
if (element.nodeType !== 1) {
|
46
|
+
return [];
|
47
|
+
}
|
48
|
+
// NOTE: 1 DOM access here
|
49
|
+
var /** @type {?} */ window = element.ownerDocument.defaultView;
|
50
|
+
var /** @type {?} */ css = window.getComputedStyle(element, null);
|
51
|
+
return property ? css[property] : css;
|
52
|
+
}
|
53
|
+
|
54
|
+
/**
|
55
|
+
* @fileoverview added by tsickle
|
56
|
+
* @suppress {checkTypes} checked by tsc
|
57
|
+
*/
|
58
|
+
/**
|
59
|
+
* Returns the parentNode or the host of the element
|
60
|
+
* @param {?} element
|
61
|
+
* @return {?}
|
62
|
+
*/
|
63
|
+
function getParentNode(element) {
|
64
|
+
if (element.nodeName === 'HTML') {
|
65
|
+
return element;
|
66
|
+
}
|
67
|
+
return element.parentNode || element.host;
|
68
|
+
}
|
69
|
+
|
70
|
+
/**
|
71
|
+
* @fileoverview added by tsickle
|
72
|
+
* @suppress {checkTypes} checked by tsc
|
73
|
+
*/
|
74
|
+
/**
|
75
|
+
* @param {?} element
|
76
|
+
* @return {?}
|
77
|
+
*/
|
78
|
+
function getScrollParent(element) {
|
79
|
+
// Return body, `getScroll` will take care to get the correct `scrollTop` from it
|
80
|
+
if (!element) {
|
81
|
+
return document.body;
|
82
|
+
}
|
83
|
+
switch (element.nodeName) {
|
84
|
+
case 'HTML':
|
85
|
+
case 'BODY':
|
86
|
+
return element.ownerDocument.body;
|
87
|
+
case '#document':
|
88
|
+
return element.body;
|
89
|
+
default:
|
90
|
+
}
|
91
|
+
// Firefox want us to check `-x` and `-y` variations as well
|
92
|
+
var _a = getStyleComputedProperty(element), overflow = _a.overflow, overflowX = _a.overflowX, overflowY = _a.overflowY;
|
93
|
+
if (/(auto|scroll|overlay)/.test(String(overflow) + String(overflowY) + String(overflowX))) {
|
94
|
+
return element;
|
95
|
+
}
|
96
|
+
return getScrollParent(getParentNode(element));
|
97
|
+
}
|
98
|
+
|
99
|
+
/**
|
100
|
+
* @fileoverview added by tsickle
|
101
|
+
* @suppress {checkTypes} checked by tsc
|
102
|
+
*/
|
103
|
+
var /** @type {?} */ isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
|
104
|
+
|
105
|
+
/**
|
106
|
+
* @fileoverview added by tsickle
|
107
|
+
* @suppress {checkTypes} checked by tsc
|
108
|
+
*/
|
109
|
+
var /** @type {?} */ isIE11 = isBrowser && !!(((window)).MSInputMethodContext && ((document)).documentMode);
|
110
|
+
var /** @type {?} */ isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);
|
111
|
+
/**
|
112
|
+
* @param {?=} version
|
113
|
+
* @return {?}
|
114
|
+
*/
|
115
|
+
function isIE(version) {
|
116
|
+
if (version === 11) {
|
117
|
+
return isIE11;
|
118
|
+
}
|
119
|
+
if (version === 10) {
|
120
|
+
return isIE10;
|
121
|
+
}
|
122
|
+
return isIE11 || isIE10;
|
123
|
+
}
|
124
|
+
|
125
|
+
/**
|
126
|
+
* @fileoverview added by tsickle
|
127
|
+
* @suppress {checkTypes} checked by tsc
|
128
|
+
*/
|
129
|
+
/**
|
130
|
+
* @param {?} element
|
131
|
+
* @return {?}
|
132
|
+
*/
|
133
|
+
function getOffsetParent(element) {
|
134
|
+
if (!element) {
|
135
|
+
return document.documentElement;
|
136
|
+
}
|
137
|
+
var /** @type {?} */ noOffsetParent = isIE(10) ? document.body : null;
|
138
|
+
// NOTE: 1 DOM access here
|
139
|
+
var /** @type {?} */ offsetParent = element.offsetParent || null;
|
140
|
+
// Skip hidden elements which don't have an offsetParent
|
141
|
+
var /** @type {?} */ sibling;
|
142
|
+
while (offsetParent === noOffsetParent && element.nextElementSibling) {
|
143
|
+
sibling = element.nextElementSibling;
|
144
|
+
offsetParent = sibling.offsetParent;
|
145
|
+
}
|
146
|
+
var /** @type {?} */ nodeName = offsetParent && offsetParent.nodeName;
|
147
|
+
if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {
|
148
|
+
return sibling ? sibling.ownerDocument.documentElement : document.documentElement;
|
149
|
+
}
|
150
|
+
// .offsetParent will return the closest TH, TD or TABLE in case
|
151
|
+
// no offsetParent is present, I hate this job...
|
152
|
+
if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 &&
|
153
|
+
getStyleComputedProperty(offsetParent, 'position') === 'static') {
|
154
|
+
return getOffsetParent(offsetParent);
|
155
|
+
}
|
156
|
+
return offsetParent;
|
157
|
+
}
|
158
|
+
|
159
|
+
/**
|
160
|
+
* @fileoverview added by tsickle
|
161
|
+
* @suppress {checkTypes} checked by tsc
|
162
|
+
*/
|
163
|
+
/**
|
164
|
+
* @param {?} element
|
165
|
+
* @return {?}
|
166
|
+
*/
|
167
|
+
function isOffsetContainer(element) {
|
168
|
+
var nodeName = element.nodeName;
|
169
|
+
if (nodeName === 'BODY') {
|
170
|
+
return false;
|
171
|
+
}
|
172
|
+
return (nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element);
|
173
|
+
}
|
174
|
+
|
175
|
+
/**
|
176
|
+
* @fileoverview added by tsickle
|
177
|
+
* @suppress {checkTypes} checked by tsc
|
178
|
+
*/
|
179
|
+
/**
|
180
|
+
* Finds the root node (document, shadowDOM root) of the given element
|
181
|
+
* @param {?} node
|
182
|
+
* @return {?}
|
183
|
+
*/
|
184
|
+
function getRoot(node) {
|
185
|
+
if (node.parentNode !== null) {
|
186
|
+
return getRoot(node.parentNode);
|
187
|
+
}
|
188
|
+
return node;
|
189
|
+
}
|
190
|
+
|
191
|
+
/**
|
192
|
+
* @fileoverview added by tsickle
|
193
|
+
* @suppress {checkTypes} checked by tsc
|
194
|
+
*/
|
195
|
+
/**
|
196
|
+
* @param {?} element1
|
197
|
+
* @param {?} element2
|
198
|
+
* @return {?}
|
199
|
+
*/
|
200
|
+
function findCommonOffsetParent(element1, element2) {
|
201
|
+
// This check is needed to avoid errors in case one of the elements isn't defined for any reason
|
202
|
+
if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {
|
203
|
+
return document.documentElement;
|
204
|
+
}
|
205
|
+
// Here we make sure to give as "start" the element that comes first in the DOM
|
206
|
+
/* tslint:disable-next-line: no-bitwise */
|
207
|
+
var /** @type {?} */ order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;
|
208
|
+
var /** @type {?} */ start = order ? element1 : element2;
|
209
|
+
var /** @type {?} */ end = order ? element2 : element1;
|
210
|
+
// Get common ancestor container
|
211
|
+
var /** @type {?} */ range = document.createRange();
|
212
|
+
range.setStart(start, 0);
|
213
|
+
range.setEnd(end, 0);
|
214
|
+
var commonAncestorContainer = range.commonAncestorContainer;
|
215
|
+
// Both nodes are inside #document
|
216
|
+
if ((element1 !== commonAncestorContainer &&
|
217
|
+
element2 !== commonAncestorContainer) ||
|
218
|
+
start.contains(end)) {
|
219
|
+
if (isOffsetContainer(commonAncestorContainer)) {
|
220
|
+
return commonAncestorContainer;
|
221
|
+
}
|
222
|
+
return getOffsetParent(commonAncestorContainer);
|
223
|
+
}
|
224
|
+
// one of the nodes is inside shadowDOM, find which one
|
225
|
+
var /** @type {?} */ element1root = getRoot(element1);
|
226
|
+
if (element1root.host) {
|
227
|
+
return findCommonOffsetParent(element1root.host, element2);
|
228
|
+
}
|
229
|
+
else {
|
230
|
+
return findCommonOffsetParent(element1, getRoot(element2).host);
|
231
|
+
}
|
232
|
+
}
|
233
|
+
|
234
|
+
/**
|
235
|
+
* @fileoverview added by tsickle
|
236
|
+
* @suppress {checkTypes} checked by tsc
|
237
|
+
*/
|
238
|
+
/**
|
239
|
+
* Helper to detect borders of a given element
|
240
|
+
*/
|
241
|
+
/**
|
242
|
+
* @param {?} styles
|
243
|
+
* @param {?} axis
|
244
|
+
* @return {?}
|
245
|
+
*/
|
246
|
+
function getBordersSize(styles, axis) {
|
247
|
+
var /** @type {?} */ sideA = axis === 'x' ? 'Left' : 'Top';
|
248
|
+
var /** @type {?} */ sideB = sideA === 'Left' ? 'Right' : 'Bottom';
|
249
|
+
return (parseFloat(styles["border" + sideA + "Width"]) +
|
250
|
+
parseFloat(styles["border" + sideB + "Width"]));
|
251
|
+
}
|
252
|
+
|
253
|
+
/**
|
254
|
+
* @fileoverview added by tsickle
|
255
|
+
* @suppress {checkTypes} checked by tsc
|
256
|
+
*/
|
257
|
+
/**
|
258
|
+
* @param {?} axis
|
259
|
+
* @param {?} body
|
260
|
+
* @param {?} html
|
261
|
+
* @param {?} computedStyle
|
262
|
+
* @return {?}
|
263
|
+
*/
|
264
|
+
function getSize(axis, body, html, computedStyle) {
|
265
|
+
return Math.max(body["offset" + axis], body["scroll" + axis], html["client" + axis], html["offset" + axis], html["scroll" + axis], isIE(10)
|
266
|
+
? (parseInt(html["offset" + axis], 10) +
|
267
|
+
parseInt(computedStyle["margin" + (axis === 'Height' ? 'Top' : 'Left')], 10) +
|
268
|
+
parseInt(computedStyle["margin" + (axis === 'Height' ? 'Bottom' : 'Right')], 10))
|
269
|
+
: 0);
|
270
|
+
}
|
271
|
+
/**
|
272
|
+
* @param {?} document
|
273
|
+
* @return {?}
|
274
|
+
*/
|
275
|
+
function getWindowSizes(document) {
|
276
|
+
var /** @type {?} */ body = document.body;
|
277
|
+
var /** @type {?} */ html = document.documentElement;
|
278
|
+
var /** @type {?} */ computedStyle = isIE(10) && getComputedStyle(html);
|
279
|
+
return {
|
280
|
+
height: getSize('Height', body, html, computedStyle),
|
281
|
+
width: getSize('Width', body, html, computedStyle)
|
282
|
+
};
|
283
|
+
}
|
284
|
+
|
285
|
+
/**
|
286
|
+
* @fileoverview added by tsickle
|
287
|
+
* @suppress {checkTypes} checked by tsc
|
288
|
+
*/
|
289
|
+
/**
|
290
|
+
* Gets the scroll value of the given element in the given side (top and left)
|
291
|
+
* @param {?} element
|
292
|
+
* @param {?=} side
|
293
|
+
* @return {?}
|
294
|
+
*/
|
295
|
+
function getScroll(element, side) {
|
296
|
+
if (side === void 0) {
|
297
|
+
side = 'top';
|
298
|
+
}
|
299
|
+
var /** @type {?} */ upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';
|
300
|
+
var /** @type {?} */ nodeName = element.nodeName;
|
301
|
+
if (nodeName === 'BODY' || nodeName === 'HTML') {
|
302
|
+
var /** @type {?} */ html = element.ownerDocument.documentElement;
|
303
|
+
var /** @type {?} */ scrollingElement = element.ownerDocument.scrollingElement || html;
|
304
|
+
return scrollingElement[upperSide];
|
305
|
+
}
|
306
|
+
return element[upperSide];
|
307
|
+
}
|
308
|
+
|
309
|
+
/**
|
310
|
+
* @fileoverview added by tsickle
|
311
|
+
* @suppress {checkTypes} checked by tsc
|
312
|
+
*/
|
313
|
+
/**
|
314
|
+
* @param {?} offsets
|
315
|
+
* @return {?}
|
316
|
+
*/
|
317
|
+
function getClientRect(offsets) {
|
318
|
+
return __assign({}, offsets, { right: offsets.left + offsets.width, bottom: offsets.top + offsets.height });
|
319
|
+
}
|
320
|
+
|
321
|
+
/**
|
322
|
+
* @fileoverview added by tsickle
|
323
|
+
* @suppress {checkTypes} checked by tsc
|
324
|
+
*/
|
325
|
+
/**
|
326
|
+
* @param {?} element
|
327
|
+
* @return {?}
|
328
|
+
*/
|
329
|
+
function getBoundingClientRect(element) {
|
330
|
+
var /** @type {?} */ rect = {};
|
331
|
+
// IE10 10 FIX: Please, don't ask, the element isn't
|
332
|
+
// considered in DOM in some circumstances...
|
333
|
+
// This isn't reproducible in IE10 compatibility mode of IE11
|
334
|
+
try {
|
335
|
+
if (isIE(10)) {
|
336
|
+
rect = element.getBoundingClientRect();
|
337
|
+
var /** @type {?} */ scrollTop = getScroll(element, 'top');
|
338
|
+
var /** @type {?} */ scrollLeft = getScroll(element, 'left');
|
339
|
+
rect.top += scrollTop;
|
340
|
+
rect.left += scrollLeft;
|
341
|
+
rect.bottom += scrollTop;
|
342
|
+
rect.right += scrollLeft;
|
343
|
+
}
|
344
|
+
else {
|
345
|
+
rect = element.getBoundingClientRect();
|
346
|
+
}
|
347
|
+
}
|
348
|
+
catch (e) {
|
349
|
+
return undefined;
|
350
|
+
}
|
351
|
+
var /** @type {?} */ result = {
|
352
|
+
left: rect.left,
|
353
|
+
top: rect.top,
|
354
|
+
width: rect.right - rect.left,
|
355
|
+
height: rect.bottom - rect.top
|
356
|
+
};
|
357
|
+
// subtract scrollbar size from sizes
|
358
|
+
var /** @type {?} */ sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
|
359
|
+
var /** @type {?} */ width = sizes.width || element.clientWidth || result.right - result.left;
|
360
|
+
var /** @type {?} */ height = sizes.height || element.clientHeight || result.bottom - result.top;
|
361
|
+
var /** @type {?} */ horizScrollbar = element.offsetWidth - width;
|
362
|
+
var /** @type {?} */ vertScrollbar = element.offsetHeight - height;
|
363
|
+
// if an hypothetical scrollbar is detected, we must be sure it's not a `border`
|
364
|
+
// we make this check conditional for performance reasons
|
365
|
+
if (horizScrollbar || vertScrollbar) {
|
366
|
+
var /** @type {?} */ styles = getStyleComputedProperty(element);
|
367
|
+
horizScrollbar -= getBordersSize(styles, 'x');
|
368
|
+
vertScrollbar -= getBordersSize(styles, 'y');
|
369
|
+
result.width -= horizScrollbar;
|
370
|
+
result.height -= vertScrollbar;
|
371
|
+
}
|
372
|
+
return getClientRect(result);
|
373
|
+
}
|
374
|
+
|
375
|
+
/**
|
376
|
+
* @fileoverview added by tsickle
|
377
|
+
* @suppress {checkTypes} checked by tsc
|
378
|
+
*/
|
379
|
+
/**
|
380
|
+
* @param {?} rect
|
381
|
+
* @param {?} element
|
382
|
+
* @param {?=} subtract
|
383
|
+
* @return {?}
|
384
|
+
*/
|
385
|
+
function includeScroll(rect, element, subtract) {
|
386
|
+
if (subtract === void 0) {
|
387
|
+
subtract = false;
|
388
|
+
}
|
389
|
+
var /** @type {?} */ scrollTop = getScroll(element, 'top');
|
390
|
+
var /** @type {?} */ scrollLeft = getScroll(element, 'left');
|
391
|
+
var /** @type {?} */ modifier = subtract ? -1 : 1;
|
392
|
+
rect.top += scrollTop * modifier;
|
393
|
+
rect.bottom += scrollTop * modifier;
|
394
|
+
rect.left += scrollLeft * modifier;
|
395
|
+
rect.right += scrollLeft * modifier;
|
396
|
+
return rect;
|
397
|
+
}
|
6
398
|
|
7
399
|
/**
|
8
400
|
* @fileoverview added by tsickle
|
9
401
|
* @suppress {checkTypes} checked by tsc
|
10
402
|
*/
|
11
403
|
/**
|
12
|
-
* @
|
13
|
-
* @
|
404
|
+
* @param {?} children
|
405
|
+
* @param {?} parent
|
406
|
+
* @param {?=} fixedPosition
|
407
|
+
* @return {?}
|
408
|
+
*/
|
409
|
+
function getOffsetRectRelativeToArbitraryNode(children, parent, fixedPosition) {
|
410
|
+
if (fixedPosition === void 0) {
|
411
|
+
fixedPosition = false;
|
412
|
+
}
|
413
|
+
var /** @type {?} */ isIE10 = isIE(10);
|
414
|
+
var /** @type {?} */ isHTML = parent.nodeName === 'HTML';
|
415
|
+
var /** @type {?} */ childrenRect = getBoundingClientRect(children);
|
416
|
+
var /** @type {?} */ parentRect = getBoundingClientRect(parent);
|
417
|
+
var /** @type {?} */ scrollParent = getScrollParent(children);
|
418
|
+
var /** @type {?} */ styles = getStyleComputedProperty(parent);
|
419
|
+
var /** @type {?} */ borderTopWidth = parseFloat(styles.borderTopWidth);
|
420
|
+
var /** @type {?} */ borderLeftWidth = parseFloat(styles.borderLeftWidth);
|
421
|
+
// In cases where the parent is fixed, we must ignore negative scroll in offset calc
|
422
|
+
if (fixedPosition && isHTML) {
|
423
|
+
parentRect.top = Math.max(parentRect.top, 0);
|
424
|
+
parentRect.left = Math.max(parentRect.left, 0);
|
425
|
+
}
|
426
|
+
var /** @type {?} */ offsets = getClientRect({
|
427
|
+
top: childrenRect.top - parentRect.top - borderTopWidth,
|
428
|
+
left: childrenRect.left - parentRect.left - borderLeftWidth,
|
429
|
+
width: childrenRect.width,
|
430
|
+
height: childrenRect.height
|
431
|
+
});
|
432
|
+
offsets.marginTop = 0;
|
433
|
+
offsets.marginLeft = 0;
|
434
|
+
// Subtract margins of documentElement in case it's being used as parent
|
435
|
+
// we do this only on HTML because it's the only element that behaves
|
436
|
+
// differently when margins are applied to it. The margins are included in
|
437
|
+
// the box of the documentElement, in the other cases not.
|
438
|
+
if (!isIE10 && isHTML) {
|
439
|
+
var /** @type {?} */ marginTop = parseFloat(styles.marginTop);
|
440
|
+
var /** @type {?} */ marginLeft = parseFloat(styles.marginLeft);
|
441
|
+
offsets.top -= borderTopWidth - marginTop;
|
442
|
+
offsets.bottom -= borderTopWidth - marginTop;
|
443
|
+
offsets.left -= borderLeftWidth - marginLeft;
|
444
|
+
offsets.right -= borderLeftWidth - marginLeft;
|
445
|
+
// Attach marginTop and marginLeft because in some circumstances we may need them
|
446
|
+
offsets.marginTop = marginTop;
|
447
|
+
offsets.marginLeft = marginLeft;
|
448
|
+
}
|
449
|
+
if (isIE10 && !fixedPosition
|
450
|
+
? parent.contains(scrollParent)
|
451
|
+
: parent === scrollParent && scrollParent.nodeName !== 'BODY') {
|
452
|
+
offsets = includeScroll(offsets, parent);
|
453
|
+
}
|
454
|
+
return offsets;
|
455
|
+
}
|
456
|
+
|
457
|
+
/**
|
458
|
+
* @fileoverview added by tsickle
|
459
|
+
* @suppress {checkTypes} checked by tsc
|
460
|
+
*/
|
461
|
+
/**
|
462
|
+
* @param {?} element
|
463
|
+
* @param {?=} excludeScroll
|
464
|
+
* @return {?}
|
465
|
+
*/
|
466
|
+
function getViewportOffsetRectRelativeToArtbitraryNode(element, excludeScroll) {
|
467
|
+
if (excludeScroll === void 0) {
|
468
|
+
excludeScroll = false;
|
469
|
+
}
|
470
|
+
var /** @type {?} */ html = element.ownerDocument.documentElement;
|
471
|
+
var /** @type {?} */ relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);
|
472
|
+
var /** @type {?} */ width = Math.max(html.clientWidth, window.innerWidth || 0);
|
473
|
+
var /** @type {?} */ height = Math.max(html.clientHeight, window.innerHeight || 0);
|
474
|
+
var /** @type {?} */ scrollTop = !excludeScroll ? getScroll(html) : 0;
|
475
|
+
var /** @type {?} */ scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;
|
476
|
+
var /** @type {?} */ offset = {
|
477
|
+
top: scrollTop - Number(relativeOffset.top) + Number(relativeOffset.marginTop),
|
478
|
+
left: scrollLeft - Number(relativeOffset.left) + Number(relativeOffset.marginLeft),
|
479
|
+
width: width,
|
480
|
+
height: height
|
481
|
+
};
|
482
|
+
return getClientRect(offset);
|
483
|
+
}
|
484
|
+
|
485
|
+
/**
|
486
|
+
* @fileoverview added by tsickle
|
487
|
+
* @suppress {checkTypes} checked by tsc
|
488
|
+
*/
|
489
|
+
/**
|
490
|
+
* @param {?} element
|
491
|
+
* @return {?}
|
492
|
+
*/
|
493
|
+
function isFixed(element) {
|
494
|
+
var /** @type {?} */ nodeName = element.nodeName;
|
495
|
+
if (nodeName === 'BODY' || nodeName === 'HTML') {
|
496
|
+
return false;
|
497
|
+
}
|
498
|
+
if (getStyleComputedProperty(element, 'position') === 'fixed') {
|
499
|
+
return true;
|
500
|
+
}
|
501
|
+
return isFixed(getParentNode(element));
|
502
|
+
}
|
503
|
+
|
504
|
+
/**
|
505
|
+
* @fileoverview added by tsickle
|
506
|
+
* @suppress {checkTypes} checked by tsc
|
507
|
+
*/
|
508
|
+
/**
|
509
|
+
* @param {?} element
|
510
|
+
* @return {?}
|
511
|
+
*/
|
512
|
+
function getFixedPositionOffsetParent(element) {
|
513
|
+
// This check is needed to avoid errors in case one of the elements isn't defined for any reason
|
514
|
+
if (!element || !element.parentElement || isIE()) {
|
515
|
+
return document.documentElement;
|
516
|
+
}
|
517
|
+
var /** @type {?} */ el = element.parentElement;
|
518
|
+
while (el && getStyleComputedProperty(el, 'transform') === 'none') {
|
519
|
+
el = el.parentElement;
|
520
|
+
}
|
521
|
+
return el || document.documentElement;
|
522
|
+
}
|
523
|
+
|
524
|
+
/**
|
525
|
+
* @fileoverview added by tsickle
|
526
|
+
* @suppress {checkTypes} checked by tsc
|
527
|
+
*/
|
528
|
+
/**
|
529
|
+
* @param {?} target
|
530
|
+
* @param {?} host
|
531
|
+
* @param {?=} padding
|
532
|
+
* @param {?=} boundariesElement
|
533
|
+
* @param {?=} fixedPosition
|
534
|
+
* @return {?}
|
535
|
+
*/
|
536
|
+
function getBoundaries(target, host, padding, boundariesElement, fixedPosition) {
|
537
|
+
if (padding === void 0) {
|
538
|
+
padding = 0;
|
539
|
+
}
|
540
|
+
if (fixedPosition === void 0) {
|
541
|
+
fixedPosition = false;
|
542
|
+
}
|
543
|
+
// NOTE: 1 DOM access here
|
544
|
+
var /** @type {?} */ boundaries = { top: 0, left: 0 };
|
545
|
+
var /** @type {?} */ offsetParent = fixedPosition ? getFixedPositionOffsetParent(target) : findCommonOffsetParent(target, host);
|
546
|
+
// Handle viewport case
|
547
|
+
if (boundariesElement === 'viewport') {
|
548
|
+
boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);
|
549
|
+
}
|
550
|
+
else {
|
551
|
+
// Handle other cases based on DOM element used as boundaries
|
552
|
+
var /** @type {?} */ boundariesNode = void 0;
|
553
|
+
if (boundariesElement === 'scrollParent') {
|
554
|
+
boundariesNode = getScrollParent(getParentNode(host));
|
555
|
+
if (boundariesNode.nodeName === 'BODY') {
|
556
|
+
boundariesNode = target.ownerDocument.documentElement;
|
557
|
+
}
|
558
|
+
}
|
559
|
+
else if (boundariesElement === 'window') {
|
560
|
+
boundariesNode = target.ownerDocument.documentElement;
|
561
|
+
}
|
562
|
+
else {
|
563
|
+
boundariesNode = boundariesElement;
|
564
|
+
}
|
565
|
+
var /** @type {?} */ offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);
|
566
|
+
// In case of HTML, we need a different computation
|
567
|
+
if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {
|
568
|
+
var _a = getWindowSizes(target.ownerDocument), height = _a.height, width = _a.width;
|
569
|
+
boundaries.top += offsets.top - offsets.marginTop;
|
570
|
+
boundaries.bottom = Number(height) + Number(offsets.top);
|
571
|
+
boundaries.left += offsets.left - offsets.marginLeft;
|
572
|
+
boundaries.right = Number(width) + Number(offsets.left);
|
573
|
+
}
|
574
|
+
else {
|
575
|
+
// for all the other DOM elements, this one is good
|
576
|
+
boundaries = offsets;
|
577
|
+
}
|
578
|
+
}
|
579
|
+
// Add paddings
|
580
|
+
boundaries.left += padding;
|
581
|
+
boundaries.top += padding;
|
582
|
+
boundaries.right -= padding;
|
583
|
+
boundaries.bottom -= padding;
|
584
|
+
return boundaries;
|
585
|
+
}
|
586
|
+
|
587
|
+
/**
|
588
|
+
* @fileoverview added by tsickle
|
589
|
+
* @suppress {checkTypes} checked by tsc
|
590
|
+
*/
|
591
|
+
/**
|
592
|
+
* @param {?} __0
|
593
|
+
* @return {?}
|
594
|
+
*/
|
595
|
+
function getArea(_a) {
|
596
|
+
var width = _a.width, height = _a.height;
|
597
|
+
return width * height;
|
598
|
+
}
|
599
|
+
/**
|
600
|
+
* @param {?} placement
|
601
|
+
* @param {?} refRect
|
602
|
+
* @param {?} target
|
603
|
+
* @param {?} host
|
604
|
+
* @param {?} boundariesElement
|
605
|
+
* @param {?=} padding
|
606
|
+
* @return {?}
|
607
|
+
*/
|
608
|
+
function computeAutoPlacement(placement, refRect, target, host, boundariesElement, padding) {
|
609
|
+
if (padding === void 0) {
|
610
|
+
padding = 0;
|
611
|
+
}
|
612
|
+
if (placement.indexOf('auto') === -1) {
|
613
|
+
return placement;
|
614
|
+
}
|
615
|
+
if (placement.indexOf('auto') !== -1
|
616
|
+
&& (placement.indexOf('left') !== -1
|
617
|
+
|| placement.indexOf('right') !== -1
|
618
|
+
|| placement.indexOf('top') !== -1
|
619
|
+
|| placement.indexOf('bottom') !== -1)) {
|
620
|
+
return placement.split(' ')[1] || '';
|
621
|
+
}
|
622
|
+
var /** @type {?} */ boundaries = getBoundaries(target, host, padding, boundariesElement);
|
623
|
+
var /** @type {?} */ rects = {
|
624
|
+
top: {
|
625
|
+
width: boundaries.width,
|
626
|
+
height: refRect.top - boundaries.top
|
627
|
+
},
|
628
|
+
right: {
|
629
|
+
width: boundaries.right - refRect.right,
|
630
|
+
height: boundaries.height
|
631
|
+
},
|
632
|
+
bottom: {
|
633
|
+
width: boundaries.width,
|
634
|
+
height: boundaries.bottom - refRect.bottom
|
635
|
+
},
|
636
|
+
left: {
|
637
|
+
width: refRect.left - boundaries.left,
|
638
|
+
height: boundaries.height
|
639
|
+
}
|
640
|
+
};
|
641
|
+
var /** @type {?} */ sortedAreas = Object.keys(rects)
|
642
|
+
.map(function (key) {
|
643
|
+
return (__assign({ key: key }, rects[key], { area: getArea(rects[key]) }));
|
644
|
+
})
|
645
|
+
.sort(function (a, b) { return b.area - a.area; });
|
646
|
+
var /** @type {?} */ filteredAreas = sortedAreas.filter(function (_a) {
|
647
|
+
var width = _a.width, height = _a.height;
|
648
|
+
return width >= target.clientWidth && height >= target.clientHeight;
|
649
|
+
});
|
650
|
+
var /** @type {?} */ computedPlacement = filteredAreas.length > 0
|
651
|
+
? filteredAreas[0].key
|
652
|
+
: sortedAreas[0].key;
|
653
|
+
var /** @type {?} */ variation = placement.split(' ')[1];
|
654
|
+
target.className = target.className.replace(/auto/g, computedPlacement);
|
655
|
+
return computedPlacement + (variation ? "-" + variation : '');
|
656
|
+
}
|
657
|
+
|
658
|
+
/**
|
659
|
+
* @fileoverview added by tsickle
|
660
|
+
* @suppress {checkTypes} checked by tsc
|
661
|
+
*/
|
662
|
+
/**
|
663
|
+
* @param {?} data
|
664
|
+
* @return {?}
|
665
|
+
*/
|
666
|
+
function getOffsets(data) {
|
667
|
+
return {
|
668
|
+
width: data.offsets.target.width,
|
669
|
+
height: data.offsets.target.height,
|
670
|
+
left: Math.floor(data.offsets.target.left),
|
671
|
+
top: Math.round(data.offsets.target.top),
|
672
|
+
bottom: Math.round(data.offsets.target.bottom),
|
673
|
+
right: Math.floor(data.offsets.target.right)
|
674
|
+
};
|
675
|
+
}
|
676
|
+
|
677
|
+
/**
|
678
|
+
* @fileoverview added by tsickle
|
679
|
+
* @suppress {checkTypes} checked by tsc
|
680
|
+
*/
|
681
|
+
/**
|
682
|
+
* Get the opposite placement of the given one
|
683
|
+
* @param {?} placement
|
684
|
+
* @return {?}
|
685
|
+
*/
|
686
|
+
function getOppositePlacement(placement) {
|
687
|
+
var /** @type {?} */ hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };
|
688
|
+
return placement.replace(/left|right|bottom|top/g, function (matched) { return hash[matched]; });
|
689
|
+
}
|
690
|
+
|
691
|
+
/**
|
692
|
+
* @fileoverview added by tsickle
|
693
|
+
* @suppress {checkTypes} checked by tsc
|
694
|
+
*/
|
695
|
+
/**
|
696
|
+
* Get the opposite placement variation of the given one
|
697
|
+
* @param {?} variation
|
698
|
+
* @return {?}
|
699
|
+
*/
|
700
|
+
function getOppositeVariation(variation) {
|
701
|
+
if (variation === 'right') {
|
702
|
+
return 'left';
|
703
|
+
}
|
704
|
+
else if (variation === 'left') {
|
705
|
+
return 'right';
|
706
|
+
}
|
707
|
+
return variation;
|
708
|
+
}
|
709
|
+
|
710
|
+
/**
|
711
|
+
* @fileoverview added by tsickle
|
712
|
+
* @suppress {checkTypes} checked by tsc
|
713
|
+
*/
|
714
|
+
/**
|
715
|
+
* Get the outer sizes of the given element (offset size + margins)
|
716
|
+
* @param {?} element
|
717
|
+
* @return {?}
|
718
|
+
*/
|
719
|
+
function getOuterSizes(element) {
|
720
|
+
var /** @type {?} */ window = element.ownerDocument.defaultView;
|
721
|
+
var /** @type {?} */ styles = window.getComputedStyle(element);
|
722
|
+
var /** @type {?} */ x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);
|
723
|
+
var /** @type {?} */ y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);
|
724
|
+
return {
|
725
|
+
width: Number(element.offsetWidth) + y,
|
726
|
+
height: Number(element.offsetHeight) + x
|
727
|
+
};
|
728
|
+
}
|
729
|
+
|
730
|
+
/**
|
731
|
+
* @fileoverview added by tsickle
|
732
|
+
* @suppress {checkTypes} checked by tsc
|
733
|
+
*/
|
734
|
+
/**
|
735
|
+
* @param {?} target
|
736
|
+
* @param {?} host
|
737
|
+
* @param {?=} fixedPosition
|
738
|
+
* @return {?}
|
739
|
+
*/
|
740
|
+
function getReferenceOffsets(target, host, fixedPosition) {
|
741
|
+
if (fixedPosition === void 0) {
|
742
|
+
fixedPosition = null;
|
743
|
+
}
|
744
|
+
var /** @type {?} */ commonOffsetParent = fixedPosition
|
745
|
+
? getFixedPositionOffsetParent(target)
|
746
|
+
: findCommonOffsetParent(target, host);
|
747
|
+
return getOffsetRectRelativeToArbitraryNode(host, commonOffsetParent, fixedPosition);
|
748
|
+
}
|
749
|
+
|
750
|
+
/**
|
751
|
+
* @fileoverview added by tsickle
|
752
|
+
* @suppress {checkTypes} checked by tsc
|
753
|
+
*/
|
754
|
+
/**
|
755
|
+
* @param {?} target
|
756
|
+
* @param {?} hostOffsets
|
757
|
+
* @param {?} position
|
758
|
+
* @return {?}
|
759
|
+
*/
|
760
|
+
function getTargetOffsets(target, hostOffsets, position) {
|
761
|
+
var /** @type {?} */ placement = position.split(' ')[0];
|
762
|
+
// Get target node sizes
|
763
|
+
var /** @type {?} */ targetRect = getOuterSizes(target);
|
764
|
+
// Add position, width and height to our offsets object
|
765
|
+
var /** @type {?} */ targetOffsets = {
|
766
|
+
width: targetRect.width,
|
767
|
+
height: targetRect.height
|
768
|
+
};
|
769
|
+
// depending by the target placement we have to compute its offsets slightly differently
|
770
|
+
var /** @type {?} */ isHoriz = ['right', 'left'].indexOf(placement) !== -1;
|
771
|
+
var /** @type {?} */ mainSide = isHoriz ? 'top' : 'left';
|
772
|
+
var /** @type {?} */ secondarySide = isHoriz ? 'left' : 'top';
|
773
|
+
var /** @type {?} */ measurement = isHoriz ? 'height' : 'width';
|
774
|
+
var /** @type {?} */ secondaryMeasurement = !isHoriz ? 'height' : 'width';
|
775
|
+
targetOffsets[mainSide] =
|
776
|
+
hostOffsets[mainSide] +
|
777
|
+
hostOffsets[measurement] / 2 -
|
778
|
+
targetRect[measurement] / 2;
|
779
|
+
targetOffsets[secondarySide] = placement === secondarySide
|
780
|
+
? hostOffsets[secondarySide] - targetRect[secondaryMeasurement]
|
781
|
+
: hostOffsets[getOppositePlacement(secondarySide)];
|
782
|
+
return targetOffsets;
|
783
|
+
}
|
784
|
+
|
785
|
+
/**
|
786
|
+
* @fileoverview added by tsickle
|
787
|
+
* @suppress {checkTypes} checked by tsc
|
788
|
+
*/
|
789
|
+
/**
|
790
|
+
* Tells if a given input is a number
|
791
|
+
* @param {?} n
|
792
|
+
* @return {?}
|
793
|
+
*/
|
794
|
+
function isNumeric(n) {
|
795
|
+
return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);
|
796
|
+
}
|
797
|
+
|
798
|
+
/**
|
799
|
+
* @fileoverview added by tsickle
|
800
|
+
* @suppress {checkTypes} checked by tsc
|
801
|
+
*/
|
802
|
+
/**
|
803
|
+
* @param {?} data
|
804
|
+
* @param {?=} renderer
|
805
|
+
* @return {?}
|
806
|
+
*/
|
807
|
+
function setAllStyles$$1(data, renderer) {
|
808
|
+
var /** @type {?} */ target = data.instance.target;
|
809
|
+
var /** @type {?} */ offsets = getOffsets(data);
|
810
|
+
setStyles(target, {
|
811
|
+
'will-change': 'transform',
|
812
|
+
top: '0px',
|
813
|
+
left: '0px',
|
814
|
+
transform: "translate3d(" + offsets.left + "px, " + offsets.top + "px, 0px)"
|
815
|
+
}, renderer);
|
816
|
+
if (data.instance.arrow) {
|
817
|
+
setStyles(data.instance.arrow, data.offsets.arrow, renderer);
|
818
|
+
}
|
819
|
+
if (data.placementAuto) {
|
820
|
+
if (renderer) {
|
821
|
+
renderer.setAttribute(target, 'class', target.className.replace(/bs-popover-auto/g, "bs-popover-" + data.placement));
|
822
|
+
renderer.setAttribute(target, 'class', target.className.replace(/bs-tooltip-auto/g, "bs-tooltip-" + data.placement));
|
823
|
+
renderer.setAttribute(target, 'class', target.className.replace(/\sauto/g, "s" + data.placement));
|
824
|
+
if (target.className.match(/popover/g)) {
|
825
|
+
renderer.addClass(target, 'popover-auto');
|
826
|
+
}
|
827
|
+
if (target.className.match(/tooltip/g)) {
|
828
|
+
renderer.addClass(target, 'tooltip-auto');
|
829
|
+
}
|
830
|
+
}
|
831
|
+
else {
|
832
|
+
target.className = target.className.replace(/bs-popover-auto/g, "bs-popover-" + data.placement);
|
833
|
+
target.className = target.className.replace(/bs-tooltip-auto/g, "bs-tooltip-" + data.placement);
|
834
|
+
target.className = target.className.replace(/\sauto/g, "s" + data.placement);
|
835
|
+
if (target.className.match(/popover/g)) {
|
836
|
+
target.classList.add('popover-auto');
|
837
|
+
}
|
838
|
+
if (target.className.match(/tooltip/g)) {
|
839
|
+
target.classList.add('tooltip-auto');
|
840
|
+
}
|
841
|
+
}
|
842
|
+
}
|
843
|
+
if (renderer) {
|
844
|
+
renderer.setAttribute(target, 'class', target.className.replace(/left|right|top|bottom/g, "" + data.placement));
|
845
|
+
}
|
846
|
+
else {
|
847
|
+
target.className = target.className.replace(/left|right|top|bottom/g, "" + data.placement);
|
848
|
+
}
|
849
|
+
}
|
850
|
+
|
851
|
+
/**
|
852
|
+
* @fileoverview added by tsickle
|
853
|
+
* @suppress {checkTypes} checked by tsc
|
854
|
+
*/
|
855
|
+
/**
|
856
|
+
* @param {?} element
|
857
|
+
* @param {?} styles
|
858
|
+
* @param {?=} renderer
|
859
|
+
* @return {?}
|
860
|
+
*/
|
861
|
+
function setStyles(element, styles, renderer) {
|
862
|
+
Object.keys(styles).forEach(function (prop) {
|
863
|
+
var /** @type {?} */ unit = '';
|
864
|
+
// add unit if the value is numeric and is one of the following
|
865
|
+
if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 &&
|
866
|
+
isNumeric(styles[prop])) {
|
867
|
+
unit = 'px';
|
868
|
+
}
|
869
|
+
if (renderer) {
|
870
|
+
renderer.setStyle(element, prop, "" + String(styles[prop]) + unit);
|
871
|
+
return;
|
872
|
+
}
|
873
|
+
element.style[prop] = String(styles[prop]) + unit;
|
874
|
+
});
|
875
|
+
}
|
876
|
+
|
877
|
+
/**
|
878
|
+
* @fileoverview added by tsickle
|
879
|
+
* @suppress {checkTypes} checked by tsc
|
880
|
+
*/
|
881
|
+
|
882
|
+
/**
|
883
|
+
* @fileoverview added by tsickle
|
884
|
+
* @suppress {checkTypes} checked by tsc
|
885
|
+
*/
|
886
|
+
/**
|
887
|
+
* @param {?} data
|
888
|
+
* @return {?}
|
889
|
+
*/
|
890
|
+
function arrow(data) {
|
891
|
+
var /** @type {?} */ targetOffsets = data.offsets.target;
|
892
|
+
// if arrowElement is a string, suppose it's a CSS selector
|
893
|
+
var /** @type {?} */ arrowElement = data.instance.target.querySelector('.arrow');
|
894
|
+
// if arrowElement is not found, don't run the modifier
|
895
|
+
if (!arrowElement) {
|
896
|
+
return data;
|
897
|
+
}
|
898
|
+
var /** @type {?} */ isVertical = ['left', 'right'].indexOf(data.placement) !== -1;
|
899
|
+
var /** @type {?} */ len = isVertical ? 'height' : 'width';
|
900
|
+
var /** @type {?} */ sideCapitalized = isVertical ? 'Top' : 'Left';
|
901
|
+
var /** @type {?} */ side = sideCapitalized.toLowerCase();
|
902
|
+
var /** @type {?} */ altSide = isVertical ? 'left' : 'top';
|
903
|
+
var /** @type {?} */ opSide = isVertical ? 'bottom' : 'right';
|
904
|
+
var /** @type {?} */ arrowElementSize = getOuterSizes(arrowElement)[len];
|
905
|
+
// top/left side
|
906
|
+
if (data.offsets.host[opSide] - arrowElementSize < targetOffsets[side]) {
|
907
|
+
targetOffsets[side] -=
|
908
|
+
targetOffsets[side] - (data.offsets.host[opSide] - arrowElementSize);
|
909
|
+
}
|
910
|
+
// bottom/right side
|
911
|
+
if (Number(data.offsets.host[side]) + Number(arrowElementSize) > targetOffsets[opSide]) {
|
912
|
+
targetOffsets[side] +=
|
913
|
+
Number(data.offsets.host[side]) + Number(arrowElementSize) - Number(targetOffsets[opSide]);
|
914
|
+
}
|
915
|
+
targetOffsets = getClientRect(targetOffsets);
|
916
|
+
// compute center of the target
|
917
|
+
var /** @type {?} */ center = Number(data.offsets.host[side]) + Number(data.offsets.host[len] / 2 - arrowElementSize / 2);
|
918
|
+
// Compute the sideValue using the updated target offsets
|
919
|
+
// take target margin in account because we don't have this info available
|
920
|
+
var /** @type {?} */ css = getStyleComputedProperty(data.instance.target);
|
921
|
+
var /** @type {?} */ targetMarginSide = parseFloat(css["margin" + sideCapitalized]);
|
922
|
+
var /** @type {?} */ targetBorderSide = parseFloat(css["border" + sideCapitalized + "Width"]);
|
923
|
+
var /** @type {?} */ sideValue = center - targetOffsets[side] - targetMarginSide - targetBorderSide;
|
924
|
+
// prevent arrowElement from being placed not contiguously to its target
|
925
|
+
sideValue = Math.max(Math.min(targetOffsets[len] - arrowElementSize, sideValue), 0);
|
926
|
+
data.offsets.arrow = (_a = {},
|
927
|
+
_a[side] = Math.round(sideValue),
|
928
|
+
_a[altSide] = '' // make sure to unset any eventual altSide value from the DOM node
|
929
|
+
,
|
930
|
+
_a);
|
931
|
+
data.instance.arrow = arrowElement;
|
932
|
+
return data;
|
933
|
+
var _a;
|
934
|
+
}
|
935
|
+
|
936
|
+
/**
|
937
|
+
* @fileoverview added by tsickle
|
938
|
+
* @suppress {checkTypes} checked by tsc
|
939
|
+
*/
|
940
|
+
/**
|
941
|
+
* @param {?} data
|
942
|
+
* @return {?}
|
943
|
+
*/
|
944
|
+
function flip(data) {
|
945
|
+
data.offsets.target = getClientRect(data.offsets.target);
|
946
|
+
var /** @type {?} */ boundaries = getBoundaries(data.instance.target, data.instance.host, 0, // padding
|
947
|
+
'viewport', false // positionFixed
|
948
|
+
);
|
949
|
+
var /** @type {?} */ placement = data.placement.split(' ')[0];
|
950
|
+
var /** @type {?} */ variation = data.placement.split(' ')[1] || '';
|
951
|
+
var /** @type {?} */ adaptivePosition = variation
|
952
|
+
? getOppositePlacement(placement)
|
953
|
+
: computeAutoPlacement('auto', data.offsets.host, data.instance.target, data.instance.host, 'viewport', 0);
|
954
|
+
var /** @type {?} */ flipOrder = [placement, adaptivePosition];
|
955
|
+
/* tslint:disable-next-line: cyclomatic-complexity */
|
956
|
+
flipOrder.forEach(function (step, index) {
|
957
|
+
if (placement !== step || flipOrder.length === index + 1) {
|
958
|
+
return data;
|
959
|
+
}
|
960
|
+
placement = data.placement.split(' ')[0];
|
961
|
+
// using floor because the host offsets may contain decimals we are not going to consider here
|
962
|
+
var /** @type {?} */ overlapsRef = (placement === 'left' &&
|
963
|
+
Math.floor(data.offsets.target.right) > Math.floor(data.offsets.host.left)) ||
|
964
|
+
(placement === 'right' &&
|
965
|
+
Math.floor(data.offsets.target.left) < Math.floor(data.offsets.host.right)) ||
|
966
|
+
(placement === 'top' &&
|
967
|
+
Math.floor(data.offsets.target.bottom) > Math.floor(data.offsets.host.top)) ||
|
968
|
+
(placement === 'bottom' &&
|
969
|
+
Math.floor(data.offsets.target.top) < Math.floor(data.offsets.host.bottom));
|
970
|
+
var /** @type {?} */ overflowsLeft = Math.floor(data.offsets.target.left) < Math.floor(boundaries.left);
|
971
|
+
var /** @type {?} */ overflowsRight = Math.floor(data.offsets.target.right) > Math.floor(boundaries.right);
|
972
|
+
var /** @type {?} */ overflowsTop = Math.floor(data.offsets.target.top) < Math.floor(boundaries.top);
|
973
|
+
var /** @type {?} */ overflowsBottom = Math.floor(data.offsets.target.bottom) > Math.floor(boundaries.bottom);
|
974
|
+
var /** @type {?} */ overflowsBoundaries = (placement === 'left' && overflowsLeft) ||
|
975
|
+
(placement === 'right' && overflowsRight) ||
|
976
|
+
(placement === 'top' && overflowsTop) ||
|
977
|
+
(placement === 'bottom' && overflowsBottom);
|
978
|
+
// flip the variation if required
|
979
|
+
var /** @type {?} */ isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
|
980
|
+
var /** @type {?} */ flippedVariation = ((isVertical && variation === 'left' && overflowsLeft) ||
|
981
|
+
(isVertical && variation === 'right' && overflowsRight) ||
|
982
|
+
(!isVertical && variation === 'left' && overflowsTop) ||
|
983
|
+
(!isVertical && variation === 'right' && overflowsBottom));
|
984
|
+
if (overlapsRef || overflowsBoundaries || flippedVariation) {
|
985
|
+
// this boolean to detect any flip loop
|
986
|
+
if (overlapsRef || overflowsBoundaries) {
|
987
|
+
placement = flipOrder[index + 1];
|
988
|
+
}
|
989
|
+
if (flippedVariation) {
|
990
|
+
variation = getOppositeVariation(variation);
|
991
|
+
}
|
992
|
+
data.placement = placement + (variation ? " " + variation : '');
|
993
|
+
data.offsets.target = __assign({}, data.offsets.target, getTargetOffsets(data.instance.target, data.offsets.host, data.placement));
|
994
|
+
}
|
995
|
+
});
|
996
|
+
return data;
|
997
|
+
}
|
998
|
+
|
999
|
+
/**
|
1000
|
+
* @fileoverview added by tsickle
|
1001
|
+
* @suppress {checkTypes} checked by tsc
|
1002
|
+
*/
|
1003
|
+
/**
|
1004
|
+
* @param {?} targetElement
|
1005
|
+
* @param {?} hostElement
|
1006
|
+
* @param {?} position
|
1007
|
+
* @return {?}
|
1008
|
+
*/
|
1009
|
+
function initData(targetElement, hostElement, position) {
|
1010
|
+
var /** @type {?} */ hostElPosition = getReferenceOffsets(targetElement, hostElement);
|
1011
|
+
var /** @type {?} */ targetOffset = getTargetOffsets(targetElement, hostElPosition, position);
|
1012
|
+
var /** @type {?} */ placement = computeAutoPlacement(position, hostElPosition, targetElement, hostElement, 'viewport', 0);
|
1013
|
+
var /** @type {?} */ placementAuto = position.indexOf('auto') !== -1;
|
1014
|
+
return {
|
1015
|
+
instance: {
|
1016
|
+
target: targetElement,
|
1017
|
+
host: hostElement,
|
1018
|
+
arrow: null
|
1019
|
+
},
|
1020
|
+
offsets: {
|
1021
|
+
target: targetOffset,
|
1022
|
+
host: hostElPosition,
|
1023
|
+
arrow: null
|
1024
|
+
},
|
1025
|
+
positionFixed: false,
|
1026
|
+
placement: placement,
|
1027
|
+
placementAuto: placementAuto
|
1028
|
+
};
|
1029
|
+
}
|
1030
|
+
|
1031
|
+
/**
|
1032
|
+
* @fileoverview added by tsickle
|
1033
|
+
* @suppress {checkTypes} checked by tsc
|
1034
|
+
*/
|
1035
|
+
/**
|
1036
|
+
* @param {?} data
|
1037
|
+
* @return {?}
|
1038
|
+
*/
|
1039
|
+
function preventOverflow(data) {
|
1040
|
+
// NOTE: DOM access here
|
1041
|
+
// resets the targetOffsets's position so that the document size can be calculated excluding
|
1042
|
+
// the size of the targetOffsets element itself
|
1043
|
+
var /** @type {?} */ transformProp = 'transform';
|
1044
|
+
var /** @type {?} */ targetStyles = data.instance.target.style; // assignment to help minification
|
1045
|
+
var top = targetStyles.top, left = targetStyles.left, _a = transformProp, transform = targetStyles[_a];
|
1046
|
+
targetStyles.top = '';
|
1047
|
+
targetStyles.left = '';
|
1048
|
+
targetStyles[transformProp] = '';
|
1049
|
+
var /** @type {?} */ boundaries = getBoundaries(data.instance.target, data.instance.host, 0, // padding
|
1050
|
+
'scrollParent', false // positionFixed
|
1051
|
+
);
|
1052
|
+
// NOTE: DOM access here
|
1053
|
+
// restores the original style properties after the offsets have been computed
|
1054
|
+
targetStyles.top = top;
|
1055
|
+
targetStyles.left = left;
|
1056
|
+
targetStyles[transformProp] = transform;
|
1057
|
+
var /** @type {?} */ order = ['left', 'right', 'top', 'bottom'];
|
1058
|
+
var /** @type {?} */ check = {
|
1059
|
+
primary: /**
|
1060
|
+
* @param {?} placement
|
1061
|
+
* @return {?}
|
1062
|
+
*/ function (placement) {
|
1063
|
+
var /** @type {?} */ value = data.offsets.target[placement];
|
1064
|
+
if (data.offsets.target[placement] < boundaries[placement] &&
|
1065
|
+
!false // options.escapeWithReference
|
1066
|
+
) {
|
1067
|
+
value = Math.max(data.offsets.target[placement], boundaries[placement]);
|
1068
|
+
}
|
1069
|
+
return _a = {}, _a[placement] = value, _a;
|
1070
|
+
var _a;
|
1071
|
+
},
|
1072
|
+
secondary: /**
|
1073
|
+
* @param {?} placement
|
1074
|
+
* @return {?}
|
1075
|
+
*/ function (placement) {
|
1076
|
+
var /** @type {?} */ mainSide = placement === 'right' ? 'left' : 'top';
|
1077
|
+
var /** @type {?} */ value = data.offsets.target[mainSide];
|
1078
|
+
if (data.offsets.target[placement] > boundaries[placement] &&
|
1079
|
+
!false // escapeWithReference
|
1080
|
+
) {
|
1081
|
+
value = Math.min(data.offsets.target[mainSide], boundaries[placement] -
|
1082
|
+
(placement === 'right' ? data.offsets.target.width : data.offsets.target.height));
|
1083
|
+
}
|
1084
|
+
return _a = {}, _a[mainSide] = value, _a;
|
1085
|
+
var _a;
|
1086
|
+
}
|
1087
|
+
};
|
1088
|
+
var /** @type {?} */ side;
|
1089
|
+
order.forEach(function (placement) {
|
1090
|
+
side = ['left', 'top']
|
1091
|
+
.indexOf(placement) !== -1
|
1092
|
+
? 'primary'
|
1093
|
+
: 'secondary';
|
1094
|
+
data.offsets.target = __assign({}, data.offsets.target, check[side](placement));
|
1095
|
+
});
|
1096
|
+
return data;
|
1097
|
+
}
|
1098
|
+
|
1099
|
+
/**
|
1100
|
+
* @fileoverview added by tsickle
|
1101
|
+
* @suppress {checkTypes} checked by tsc
|
1102
|
+
*/
|
1103
|
+
/**
|
1104
|
+
* @param {?} data
|
1105
|
+
* @return {?}
|
1106
|
+
*/
|
1107
|
+
function shift(data) {
|
1108
|
+
var /** @type {?} */ placement = data.placement;
|
1109
|
+
var /** @type {?} */ basePlacement = placement.split(' ')[0];
|
1110
|
+
var /** @type {?} */ shiftvariation = placement.split(' ')[1];
|
1111
|
+
if (shiftvariation) {
|
1112
|
+
var _a = data.offsets, host = _a.host, target = _a.target;
|
1113
|
+
var /** @type {?} */ isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;
|
1114
|
+
var /** @type {?} */ side = isVertical ? 'left' : 'top';
|
1115
|
+
var /** @type {?} */ measurement = isVertical ? 'width' : 'height';
|
1116
|
+
var /** @type {?} */ shiftOffsets = {
|
1117
|
+
left: (_b = {}, _b[side] = host[side], _b),
|
1118
|
+
right: (_c = {},
|
1119
|
+
_c[side] = host[side] + host[measurement] - host[measurement],
|
1120
|
+
_c)
|
1121
|
+
};
|
1122
|
+
data.offsets.target = __assign({}, target, shiftOffsets[shiftvariation]);
|
1123
|
+
}
|
1124
|
+
return data;
|
1125
|
+
var _b, _c;
|
1126
|
+
}
|
1127
|
+
|
1128
|
+
/**
|
1129
|
+
* @fileoverview added by tsickle
|
1130
|
+
* @suppress {checkTypes} checked by tsc
|
1131
|
+
*/
|
1132
|
+
|
1133
|
+
/**
|
1134
|
+
* @fileoverview added by tsickle
|
1135
|
+
* @suppress {checkTypes} checked by tsc
|
14
1136
|
*/
|
15
1137
|
var Positioning = (function () {
|
16
1138
|
function Positioning() {
|
17
1139
|
}
|
18
1140
|
/**
|
19
|
-
* @param {?}
|
1141
|
+
* @param {?} hostElement
|
1142
|
+
* @param {?} targetElement
|
20
1143
|
* @param {?=} round
|
21
1144
|
* @return {?}
|
22
1145
|
*/
|
23
1146
|
Positioning.prototype.position = /**
|
24
|
-
* @param {?}
|
1147
|
+
* @param {?} hostElement
|
1148
|
+
* @param {?} targetElement
|
25
1149
|
* @param {?=} round
|
26
1150
|
* @return {?}
|
27
1151
|
*/
|
28
|
-
function (
|
1152
|
+
function (hostElement, targetElement, round) {
|
29
1153
|
if (round === void 0) {
|
30
1154
|
round = true;
|
31
1155
|
}
|
32
|
-
|
33
|
-
var /** @type {?} */ parentOffset = {
|
34
|
-
width: 0,
|
35
|
-
height: 0,
|
36
|
-
top: 0,
|
37
|
-
bottom: 0,
|
38
|
-
left: 0,
|
39
|
-
right: 0
|
40
|
-
};
|
41
|
-
if (this.getStyle(element, 'position') === 'fixed') {
|
42
|
-
var /** @type {?} */ bcRect = element.getBoundingClientRect();
|
43
|
-
elPosition = {
|
44
|
-
width: bcRect.width,
|
45
|
-
height: bcRect.height,
|
46
|
-
top: bcRect.top,
|
47
|
-
bottom: bcRect.bottom,
|
48
|
-
left: bcRect.left,
|
49
|
-
right: bcRect.right
|
50
|
-
};
|
51
|
-
}
|
52
|
-
else {
|
53
|
-
var /** @type {?} */ offsetParentEl = this.offsetParent(element);
|
54
|
-
elPosition = this.offset(element, false);
|
55
|
-
if (offsetParentEl !== document.documentElement) {
|
56
|
-
parentOffset = this.offset(offsetParentEl, false);
|
57
|
-
}
|
58
|
-
parentOffset.top += offsetParentEl.clientTop;
|
59
|
-
parentOffset.left += offsetParentEl.clientLeft;
|
60
|
-
}
|
61
|
-
elPosition.top -= parentOffset.top;
|
62
|
-
elPosition.bottom -= parentOffset.top;
|
63
|
-
elPosition.left -= parentOffset.left;
|
64
|
-
elPosition.right -= parentOffset.left;
|
65
|
-
if (round) {
|
66
|
-
elPosition.top = Math.round(elPosition.top);
|
67
|
-
elPosition.bottom = Math.round(elPosition.bottom);
|
68
|
-
elPosition.left = Math.round(elPosition.left);
|
69
|
-
elPosition.right = Math.round(elPosition.right);
|
70
|
-
}
|
71
|
-
return elPosition;
|
1156
|
+
return this.offset(hostElement, targetElement, false);
|
72
1157
|
};
|
73
1158
|
/**
|
74
|
-
* @param {?}
|
1159
|
+
* @param {?} hostElement
|
1160
|
+
* @param {?} targetElement
|
75
1161
|
* @param {?=} round
|
76
1162
|
* @return {?}
|
77
1163
|
*/
|
78
1164
|
Positioning.prototype.offset = /**
|
79
|
-
* @param {?}
|
1165
|
+
* @param {?} hostElement
|
1166
|
+
* @param {?} targetElement
|
80
1167
|
* @param {?=} round
|
81
1168
|
* @return {?}
|
82
1169
|
*/
|
83
|
-
function (
|
1170
|
+
function (hostElement, targetElement, round) {
|
84
1171
|
if (round === void 0) {
|
85
1172
|
round = true;
|
86
1173
|
}
|
87
|
-
|
88
|
-
var /** @type {?} */ viewportOffset = {
|
89
|
-
top: window.pageYOffset - document.documentElement.clientTop,
|
90
|
-
left: window.pageXOffset - document.documentElement.clientLeft
|
91
|
-
};
|
92
|
-
var /** @type {?} */ elOffset = {
|
93
|
-
height: elBcr.height || element.offsetHeight,
|
94
|
-
width: elBcr.width || element.offsetWidth,
|
95
|
-
top: elBcr.top + viewportOffset.top,
|
96
|
-
bottom: elBcr.bottom + viewportOffset.top,
|
97
|
-
left: elBcr.left + viewportOffset.left,
|
98
|
-
right: elBcr.right + viewportOffset.left
|
99
|
-
};
|
100
|
-
if (round) {
|
101
|
-
elOffset.height = Math.round(elOffset.height);
|
102
|
-
elOffset.width = Math.round(elOffset.width);
|
103
|
-
elOffset.top = Math.round(elOffset.top);
|
104
|
-
elOffset.bottom = Math.round(elOffset.bottom);
|
105
|
-
elOffset.left = Math.round(elOffset.left);
|
106
|
-
elOffset.right = Math.round(elOffset.right);
|
107
|
-
}
|
108
|
-
return elOffset;
|
1174
|
+
return getReferenceOffsets(targetElement, hostElement);
|
109
1175
|
};
|
110
1176
|
/**
|
111
1177
|
* @param {?} hostElement
|
112
1178
|
* @param {?} targetElement
|
113
|
-
* @param {?}
|
1179
|
+
* @param {?} position
|
114
1180
|
* @param {?=} appendToBody
|
115
1181
|
* @return {?}
|
116
1182
|
*/
|
117
1183
|
Positioning.prototype.positionElements = /**
|
118
1184
|
* @param {?} hostElement
|
119
1185
|
* @param {?} targetElement
|
120
|
-
* @param {?}
|
1186
|
+
* @param {?} position
|
121
1187
|
* @param {?=} appendToBody
|
122
1188
|
* @return {?}
|
123
1189
|
*/
|
124
|
-
function (hostElement, targetElement,
|
125
|
-
var /** @type {?} */
|
126
|
-
|
127
|
-
: this.position(hostElement, false);
|
128
|
-
var /** @type {?} */ targetElStyles = this.getAllStyles(targetElement);
|
129
|
-
var /** @type {?} */ targetElBCR = targetElement.getBoundingClientRect();
|
130
|
-
var /** @type {?} */ placementPrimary = placement.split(' ')[0] || 'top';
|
131
|
-
var /** @type {?} */ placementSecondary = placement.split(' ')[1] || 'center';
|
132
|
-
var /** @type {?} */ targetElPosition = {
|
133
|
-
height: targetElBCR.height || targetElement.offsetHeight,
|
134
|
-
width: targetElBCR.width || targetElement.offsetWidth,
|
135
|
-
top: 0,
|
136
|
-
bottom: targetElBCR.height || targetElement.offsetHeight,
|
137
|
-
left: 0,
|
138
|
-
right: targetElBCR.width || targetElement.offsetWidth
|
139
|
-
};
|
140
|
-
var /** @type {?} */ shiftHeight = {
|
141
|
-
top: hostElPosition.top,
|
142
|
-
center: hostElPosition.top +
|
143
|
-
hostElPosition.height / 2 -
|
144
|
-
targetElPosition.height / 2,
|
145
|
-
bottom: hostElPosition.top + hostElPosition.height
|
146
|
-
};
|
147
|
-
var /** @type {?} */ shiftWidth = {
|
148
|
-
left: hostElPosition.left,
|
149
|
-
center: hostElPosition.left +
|
150
|
-
hostElPosition.width / 2 -
|
151
|
-
targetElPosition.width / 2,
|
152
|
-
right: hostElPosition.left + hostElPosition.width
|
153
|
-
};
|
154
|
-
if (placementPrimary === 'auto') {
|
155
|
-
var /** @type {?} */ newPlacementPrimary = this.autoPosition(targetElPosition, hostElPosition, targetElement, placementSecondary);
|
156
|
-
if (!newPlacementPrimary)
|
157
|
-
newPlacementPrimary = this.autoPosition(targetElPosition, hostElPosition, targetElement);
|
158
|
-
if (newPlacementPrimary)
|
159
|
-
placementPrimary = newPlacementPrimary;
|
160
|
-
targetElement.classList.add(placementPrimary);
|
161
|
-
}
|
162
|
-
switch (placementPrimary) {
|
163
|
-
case 'top':
|
164
|
-
targetElPosition.top =
|
165
|
-
hostElPosition.top -
|
166
|
-
(targetElPosition.height +
|
167
|
-
parseFloat(targetElStyles.marginBottom));
|
168
|
-
targetElPosition.bottom +=
|
169
|
-
hostElPosition.top - targetElPosition.height;
|
170
|
-
targetElPosition.left = shiftWidth[placementSecondary];
|
171
|
-
targetElPosition.right += shiftWidth[placementSecondary];
|
172
|
-
break;
|
173
|
-
case 'bottom':
|
174
|
-
targetElPosition.top = shiftHeight[placementPrimary];
|
175
|
-
targetElPosition.bottom += shiftHeight[placementPrimary];
|
176
|
-
targetElPosition.left = shiftWidth[placementSecondary];
|
177
|
-
targetElPosition.right += shiftWidth[placementSecondary];
|
178
|
-
break;
|
179
|
-
case 'left':
|
180
|
-
targetElPosition.top = shiftHeight[placementSecondary];
|
181
|
-
targetElPosition.bottom += shiftHeight[placementSecondary];
|
182
|
-
targetElPosition.left =
|
183
|
-
hostElPosition.left -
|
184
|
-
(targetElPosition.width + parseFloat(targetElStyles.marginRight));
|
185
|
-
targetElPosition.right +=
|
186
|
-
hostElPosition.left - targetElPosition.width;
|
187
|
-
break;
|
188
|
-
case 'right':
|
189
|
-
targetElPosition.top = shiftHeight[placementSecondary];
|
190
|
-
targetElPosition.bottom += shiftHeight[placementSecondary];
|
191
|
-
targetElPosition.left = shiftWidth[placementPrimary];
|
192
|
-
targetElPosition.right += shiftWidth[placementPrimary];
|
193
|
-
break;
|
194
|
-
}
|
195
|
-
targetElPosition.top = Math.round(targetElPosition.top);
|
196
|
-
targetElPosition.bottom = Math.round(targetElPosition.bottom);
|
197
|
-
targetElPosition.left = Math.round(targetElPosition.left);
|
198
|
-
targetElPosition.right = Math.round(targetElPosition.right);
|
199
|
-
return targetElPosition;
|
200
|
-
};
|
201
|
-
/**
|
202
|
-
* @param {?} targetElPosition
|
203
|
-
* @param {?} hostElPosition
|
204
|
-
* @param {?} targetElement
|
205
|
-
* @param {?=} preferredPosition
|
206
|
-
* @return {?}
|
207
|
-
*/
|
208
|
-
Positioning.prototype.autoPosition = /**
|
209
|
-
* @param {?} targetElPosition
|
210
|
-
* @param {?} hostElPosition
|
211
|
-
* @param {?} targetElement
|
212
|
-
* @param {?=} preferredPosition
|
213
|
-
* @return {?}
|
214
|
-
*/
|
215
|
-
function (targetElPosition, hostElPosition, targetElement, preferredPosition) {
|
216
|
-
if ((!preferredPosition || preferredPosition === 'right') &&
|
217
|
-
targetElPosition.left + hostElPosition.left - targetElPosition.width <
|
218
|
-
0) {
|
219
|
-
return 'right';
|
220
|
-
}
|
221
|
-
else if ((!preferredPosition || preferredPosition === 'top') &&
|
222
|
-
targetElPosition.bottom +
|
223
|
-
hostElPosition.bottom +
|
224
|
-
targetElPosition.height >
|
225
|
-
window.innerHeight) {
|
226
|
-
return 'top';
|
227
|
-
}
|
228
|
-
else if ((!preferredPosition || preferredPosition === 'bottom') &&
|
229
|
-
targetElPosition.top + hostElPosition.top - targetElPosition.height < 0) {
|
230
|
-
return 'bottom';
|
231
|
-
}
|
232
|
-
else if ((!preferredPosition || preferredPosition === 'left') &&
|
233
|
-
targetElPosition.right +
|
234
|
-
hostElPosition.right +
|
235
|
-
targetElPosition.width >
|
236
|
-
window.innerWidth) {
|
237
|
-
return 'left';
|
238
|
-
}
|
239
|
-
return null;
|
240
|
-
};
|
241
|
-
/**
|
242
|
-
* @param {?} element
|
243
|
-
* @return {?}
|
244
|
-
*/
|
245
|
-
Positioning.prototype.getAllStyles = /**
|
246
|
-
* @param {?} element
|
247
|
-
* @return {?}
|
248
|
-
*/
|
249
|
-
function (element) {
|
250
|
-
return window.getComputedStyle(element);
|
251
|
-
};
|
252
|
-
/**
|
253
|
-
* @param {?} element
|
254
|
-
* @param {?} prop
|
255
|
-
* @return {?}
|
256
|
-
*/
|
257
|
-
Positioning.prototype.getStyle = /**
|
258
|
-
* @param {?} element
|
259
|
-
* @param {?} prop
|
260
|
-
* @return {?}
|
261
|
-
*/
|
262
|
-
function (element, prop) {
|
263
|
-
return ((this.getAllStyles(element)))[prop];
|
264
|
-
};
|
265
|
-
/**
|
266
|
-
* @param {?} element
|
267
|
-
* @return {?}
|
268
|
-
*/
|
269
|
-
Positioning.prototype.isStaticPositioned = /**
|
270
|
-
* @param {?} element
|
271
|
-
* @return {?}
|
272
|
-
*/
|
273
|
-
function (element) {
|
274
|
-
return (this.getStyle(element, 'position') || 'static') === 'static';
|
275
|
-
};
|
276
|
-
/**
|
277
|
-
* @param {?} element
|
278
|
-
* @return {?}
|
279
|
-
*/
|
280
|
-
Positioning.prototype.offsetParent = /**
|
281
|
-
* @param {?} element
|
282
|
-
* @return {?}
|
283
|
-
*/
|
284
|
-
function (element) {
|
285
|
-
var /** @type {?} */ offsetParentEl = (element.offsetParent) || document.documentElement;
|
286
|
-
while (offsetParentEl &&
|
287
|
-
offsetParentEl !== document.documentElement &&
|
288
|
-
this.isStaticPositioned(offsetParentEl)) {
|
289
|
-
offsetParentEl = /** @type {?} */ (offsetParentEl.offsetParent);
|
290
|
-
}
|
291
|
-
return offsetParentEl || document.documentElement;
|
1190
|
+
function (hostElement, targetElement, position, appendToBody) {
|
1191
|
+
var /** @type {?} */ chainOfModifiers = [flip, shift, preventOverflow, arrow];
|
1192
|
+
return chainOfModifiers.reduce(function (modifiedData, modifier) { return modifier(modifiedData); }, initData(targetElement, hostElement, position));
|
292
1193
|
};
|
293
1194
|
return Positioning;
|
294
1195
|
}());
|
@@ -298,12 +1199,12 @@
|
|
298
1199
|
* @param {?} targetElement
|
299
1200
|
* @param {?} placement
|
300
1201
|
* @param {?=} appendToBody
|
1202
|
+
* @param {?=} renderer
|
301
1203
|
* @return {?}
|
302
1204
|
*/
|
303
|
-
function positionElements(hostElement, targetElement, placement, appendToBody) {
|
304
|
-
var /** @type {?} */
|
305
|
-
|
306
|
-
targetElement.style.left = pos.left + "px";
|
1205
|
+
function positionElements(hostElement, targetElement, placement, appendToBody, renderer) {
|
1206
|
+
var /** @type {?} */ data = positionService.positionElements(hostElement, targetElement, placement, appendToBody);
|
1207
|
+
setAllStyles$$1(data, renderer);
|
307
1208
|
}
|
308
1209
|
|
309
1210
|
/**
|
@@ -311,7 +1212,18 @@
|
|
311
1212
|
* @suppress {checkTypes} checked by tsc
|
312
1213
|
*/
|
313
1214
|
var PositioningService = (function () {
|
314
|
-
function PositioningService() {
|
1215
|
+
function PositioningService(rendererFactory) {
|
1216
|
+
var _this = this;
|
1217
|
+
this.update$$ = new rxjs.Subject();
|
1218
|
+
this.events$ = rxjs.merge(rxjs.fromEvent(window, 'scroll'), rxjs.fromEvent(window, 'resize'), rxjs.of(0, rxjs.animationFrameScheduler), this.update$$);
|
1219
|
+
this.positionElements = new Map();
|
1220
|
+
this.events$
|
1221
|
+
.subscribe(function () {
|
1222
|
+
_this.positionElements
|
1223
|
+
.forEach(function (positionElement) {
|
1224
|
+
positionElements(_getHtmlElement(positionElement.target), _getHtmlElement(positionElement.element), positionElement.attachment, positionElement.appendToBody, rendererFactory.createRenderer(null, null));
|
1225
|
+
});
|
1226
|
+
});
|
315
1227
|
}
|
316
1228
|
/**
|
317
1229
|
* @param {?} options
|
@@ -322,12 +1234,40 @@
|
|
322
1234
|
* @return {?}
|
323
1235
|
*/
|
324
1236
|
function (options) {
|
325
|
-
|
326
|
-
|
1237
|
+
this.addPositionElement(options);
|
1238
|
+
this.update$$.next();
|
1239
|
+
};
|
1240
|
+
/**
|
1241
|
+
* @param {?} options
|
1242
|
+
* @return {?}
|
1243
|
+
*/
|
1244
|
+
PositioningService.prototype.addPositionElement = /**
|
1245
|
+
* @param {?} options
|
1246
|
+
* @return {?}
|
1247
|
+
*/
|
1248
|
+
function (options) {
|
1249
|
+
this.positionElements.set(_getHtmlElement(options.element), options);
|
1250
|
+
};
|
1251
|
+
/**
|
1252
|
+
* @param {?} elRef
|
1253
|
+
* @return {?}
|
1254
|
+
*/
|
1255
|
+
PositioningService.prototype.deletePositionElement = /**
|
1256
|
+
* @param {?} elRef
|
1257
|
+
* @return {?}
|
1258
|
+
*/
|
1259
|
+
function (elRef) {
|
1260
|
+
this.positionElements.delete(_getHtmlElement(elRef));
|
327
1261
|
};
|
328
1262
|
PositioningService.decorators = [
|
329
1263
|
{ type: core.Injectable }
|
330
1264
|
];
|
1265
|
+
/** @nocollapse */
|
1266
|
+
PositioningService.ctorParameters = function () {
|
1267
|
+
return [
|
1268
|
+
{ type: core.RendererFactory2, },
|
1269
|
+
];
|
1270
|
+
};
|
331
1271
|
return PositioningService;
|
332
1272
|
}());
|
333
1273
|
/**
|
@@ -363,4 +1303,4 @@
|
|
363
1303
|
|
364
1304
|
})));
|
365
1305
|
|
366
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWJvb3RzdHJhcC1wb3NpdGlvbmluZy51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvbmctcG9zaXRpb25pbmcudHMiLCJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvcG9zaXRpb25pbmcuc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBjb3B5cmlnaHQgVmFsb3IgU29mdHdhcmVcbiAqIEBjb3B5cmlnaHQgQW5ndWxhciBuZy1ib290c3RyYXAgdGVhbVxuICovXG5cbi8vIHByZXZpb3VzIHZlcnNpb246XG4vLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci11aS9ib290c3RyYXAvYmxvYi8wN2MzMWQwNzMxZjdjYjA2OGExOTMyYjhlMDFkMjMxMmI3OTZiNGVjL3NyYy9wb3NpdGlvbi9wb3NpdGlvbi5qc1xuLy8gdHNsaW50OmRpc2FibGVcbmV4cG9ydCBjbGFzcyBQb3NpdGlvbmluZyB7XG4gIHB1YmxpYyBwb3NpdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCwgcm91bmQgPSB0cnVlKTogQ2xpZW50UmVjdCB7XG4gICAgbGV0IGVsUG9zaXRpb246IENsaWVudFJlY3Q7XG4gICAgbGV0IHBhcmVudE9mZnNldDogQ2xpZW50UmVjdCA9IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09PSAnZml4ZWQnKSB7XG4gICAgICBjb25zdCBiY1JlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgZWxQb3NpdGlvbiA9IHtcbiAgICAgICAgd2lkdGg6IGJjUmVjdC53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBiY1JlY3QuaGVpZ2h0LFxuICAgICAgICB0b3A6IGJjUmVjdC50b3AsXG4gICAgICAgIGJvdHRvbTogYmNSZWN0LmJvdHRvbSxcbiAgICAgICAgbGVmdDogYmNSZWN0LmxlZnQsXG4gICAgICAgIHJpZ2h0OiBiY1JlY3QucmlnaHRcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9mZnNldFBhcmVudEVsID0gdGhpcy5vZmZzZXRQYXJlbnQoZWxlbWVudCk7XG5cbiAgICAgIGVsUG9zaXRpb24gPSB0aGlzLm9mZnNldChlbGVtZW50LCBmYWxzZSk7XG5cbiAgICAgIGlmIChvZmZzZXRQYXJlbnRFbCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgIHBhcmVudE9mZnNldCA9IHRoaXMub2Zmc2V0KG9mZnNldFBhcmVudEVsLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHBhcmVudE9mZnNldC50b3AgKz0gb2Zmc2V0UGFyZW50RWwuY2xpZW50VG9wO1xuICAgICAgcGFyZW50T2Zmc2V0LmxlZnQgKz0gb2Zmc2V0UGFyZW50RWwuY2xpZW50TGVmdDtcbiAgICB9XG5cbiAgICBlbFBvc2l0aW9uLnRvcCAtPSBwYXJlbnRPZmZzZXQudG9wO1xuICAgIGVsUG9zaXRpb24uYm90dG9tIC09IHBhcmVudE9mZnNldC50b3A7XG4gICAgZWxQb3NpdGlvbi5sZWZ0IC09IHBhcmVudE9mZnNldC5sZWZ0O1xuICAgIGVsUG9zaXRpb24ucmlnaHQgLT0gcGFyZW50T2Zmc2V0LmxlZnQ7XG5cbiAgICBpZiAocm91bmQpIHtcbiAgICAgIGVsUG9zaXRpb24udG9wID0gTWF0aC5yb3VuZChlbFBvc2l0aW9uLnRvcCk7XG4gICAgICBlbFBvc2l0aW9uLmJvdHRvbSA9IE1hdGgucm91bmQoZWxQb3NpdGlvbi5ib3R0b20pO1xuICAgICAgZWxQb3NpdGlvbi5sZWZ0ID0gTWF0aC5yb3VuZChlbFBvc2l0aW9uLmxlZnQpO1xuICAgICAgZWxQb3NpdGlvbi5yaWdodCA9IE1hdGgucm91bmQoZWxQb3NpdGlvbi5yaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsUG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgb2Zmc2V0KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCByb3VuZCA9IHRydWUpOiBDbGllbnRSZWN0IHtcbiAgICBjb25zdCBlbEJjciA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgdmlld3BvcnRPZmZzZXQgPSB7XG4gICAgICB0b3A6IHdpbmRvdy5wYWdlWU9mZnNldCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRUb3AsXG4gICAgICBsZWZ0OiB3aW5kb3cucGFnZVhPZmZzZXQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50TGVmdFxuICAgIH07XG5cbiAgICBsZXQgZWxPZmZzZXQgPSB7XG4gICAgICBoZWlnaHQ6IGVsQmNyLmhlaWdodCB8fCBlbGVtZW50Lm9mZnNldEhlaWdodCxcbiAgICAgIHdpZHRoOiBlbEJjci53aWR0aCB8fCBlbGVtZW50Lm9mZnNldFdpZHRoLFxuICAgICAgdG9wOiBlbEJjci50b3AgKyB2aWV3cG9ydE9mZnNldC50b3AsXG4gICAgICBib3R0b206IGVsQmNyLmJvdHRvbSArIHZpZXdwb3J0T2Zmc2V0LnRvcCxcbiAgICAgIGxlZnQ6IGVsQmNyLmxlZnQgKyB2aWV3cG9ydE9mZnNldC5sZWZ0LFxuICAgICAgcmlnaHQ6IGVsQmNyLnJpZ2h0ICsgdmlld3BvcnRPZmZzZXQubGVmdFxuICAgIH07XG5cbiAgICBpZiAocm91bmQpIHtcbiAgICAgIGVsT2Zmc2V0LmhlaWdodCA9IE1hdGgucm91bmQoZWxPZmZzZXQuaGVpZ2h0KTtcbiAgICAgIGVsT2Zmc2V0LndpZHRoID0gTWF0aC5yb3VuZChlbE9mZnNldC53aWR0aCk7XG4gICAgICBlbE9mZnNldC50b3AgPSBNYXRoLnJvdW5kKGVsT2Zmc2V0LnRvcCk7XG4gICAgICBlbE9mZnNldC5ib3R0b20gPSBNYXRoLnJvdW5kKGVsT2Zmc2V0LmJvdHRvbSk7XG4gICAgICBlbE9mZnNldC5sZWZ0ID0gTWF0aC5yb3VuZChlbE9mZnNldC5sZWZ0KTtcbiAgICAgIGVsT2Zmc2V0LnJpZ2h0ID0gTWF0aC5yb3VuZChlbE9mZnNldC5yaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsT2Zmc2V0O1xuICB9XG5cbiAgcHVibGljIHBvc2l0aW9uRWxlbWVudHMoXG4gICAgaG9zdEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHBsYWNlbWVudDogc3RyaW5nLFxuICAgIGFwcGVuZFRvQm9keT86IGJvb2xlYW5cbiAgKTogQ2xpZW50UmVjdCB7XG4gICAgY29uc3QgaG9zdEVsUG9zaXRpb24gPSBhcHBlbmRUb0JvZHlcbiAgICAgID8gdGhpcy5vZmZzZXQoaG9zdEVsZW1lbnQsIGZhbHNlKVxuICAgICAgOiB0aGlzLnBvc2l0aW9uKGhvc3RFbGVtZW50LCBmYWxzZSk7XG4gICAgY29uc3QgdGFyZ2V0RWxTdHlsZXMgPSB0aGlzLmdldEFsbFN0eWxlcyh0YXJnZXRFbGVtZW50KTtcbiAgICBjb25zdCB0YXJnZXRFbEJDUiA9IHRhcmdldEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHBsYWNlbWVudFByaW1hcnkgPSBwbGFjZW1lbnQuc3BsaXQoJyAnKVswXSB8fCAndG9wJztcbiAgICBjb25zdCBwbGFjZW1lbnRTZWNvbmRhcnkgPSBwbGFjZW1lbnQuc3BsaXQoJyAnKVsxXSB8fCAnY2VudGVyJztcblxuICAgIGxldCB0YXJnZXRFbFBvc2l0aW9uOiBDbGllbnRSZWN0ID0ge1xuICAgICAgaGVpZ2h0OiB0YXJnZXRFbEJDUi5oZWlnaHQgfHwgdGFyZ2V0RWxlbWVudC5vZmZzZXRIZWlnaHQsXG4gICAgICB3aWR0aDogdGFyZ2V0RWxCQ1Iud2lkdGggfHwgdGFyZ2V0RWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICAgIHRvcDogMCxcbiAgICAgIGJvdHRvbTogdGFyZ2V0RWxCQ1IuaGVpZ2h0IHx8IHRhcmdldEVsZW1lbnQub2Zmc2V0SGVpZ2h0LFxuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiB0YXJnZXRFbEJDUi53aWR0aCB8fCB0YXJnZXRFbGVtZW50Lm9mZnNldFdpZHRoXG4gICAgfTtcblxuICAgIGNvbnN0IHNoaWZ0SGVpZ2h0OiBhbnkgPSB7XG4gICAgICB0b3A6IGhvc3RFbFBvc2l0aW9uLnRvcCxcbiAgICAgIGNlbnRlcjpcbiAgICAgICAgaG9zdEVsUG9zaXRpb24udG9wICtcbiAgICAgICAgaG9zdEVsUG9zaXRpb24uaGVpZ2h0IC8gMiAtXG4gICAgICAgIHRhcmdldEVsUG9zaXRpb24uaGVpZ2h0IC8gMixcbiAgICAgIGJvdHRvbTogaG9zdEVsUG9zaXRpb24udG9wICsgaG9zdEVsUG9zaXRpb24uaGVpZ2h0XG4gICAgfTtcbiAgICBjb25zdCBzaGlmdFdpZHRoOiBhbnkgPSB7XG4gICAgICBsZWZ0OiBob3N0RWxQb3NpdGlvbi5sZWZ0LFxuICAgICAgY2VudGVyOlxuICAgICAgICBob3N0RWxQb3NpdGlvbi5sZWZ0ICtcbiAgICAgICAgaG9zdEVsUG9zaXRpb24ud2lkdGggLyAyIC1cbiAgICAgICAgdGFyZ2V0RWxQb3NpdGlvbi53aWR0aCAvIDIsXG4gICAgICByaWdodDogaG9zdEVsUG9zaXRpb24ubGVmdCArIGhvc3RFbFBvc2l0aW9uLndpZHRoXG4gICAgfTsgICAgXG5cbiAgICBpZiAocGxhY2VtZW50UHJpbWFyeSA9PT0gJ2F1dG8nKSB7XG4gICAgICBsZXQgbmV3UGxhY2VtZW50UHJpbWFyeSA9IHRoaXMuYXV0b1Bvc2l0aW9uKFxuICAgICAgICB0YXJnZXRFbFBvc2l0aW9uLFxuICAgICAgICBob3N0RWxQb3NpdGlvbixcbiAgICAgICAgdGFyZ2V0RWxlbWVudCxcbiAgICAgICAgcGxhY2VtZW50U2Vjb25kYXJ5XG4gICAgICApO1xuICAgICAgaWYgKCFuZXdQbGFjZW1lbnRQcmltYXJ5KVxuICAgICAgICBuZXdQbGFjZW1lbnRQcmltYXJ5ID0gdGhpcy5hdXRvUG9zaXRpb24oXG4gICAgICAgICAgdGFyZ2V0RWxQb3NpdGlvbixcbiAgICAgICAgICBob3N0RWxQb3NpdGlvbixcbiAgICAgICAgICB0YXJnZXRFbGVtZW50XG4gICAgICAgICk7XG4gICAgICBpZiAobmV3UGxhY2VtZW50UHJpbWFyeSkgcGxhY2VtZW50UHJpbWFyeSA9IG5ld1BsYWNlbWVudFByaW1hcnk7XG4gICAgICB0YXJnZXRFbGVtZW50LmNsYXNzTGlzdC5hZGQocGxhY2VtZW50UHJpbWFyeSk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwbGFjZW1lbnRQcmltYXJ5KSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICB0YXJnZXRFbFBvc2l0aW9uLnRvcCA9XG4gICAgICAgICAgaG9zdEVsUG9zaXRpb24udG9wIC1cbiAgICAgICAgICAodGFyZ2V0RWxQb3NpdGlvbi5oZWlnaHQgK1xuICAgICAgICAgICAgcGFyc2VGbG9hdCh0YXJnZXRFbFN0eWxlcy5tYXJnaW5Cb3R0b20pKTtcbiAgICAgICAgdGFyZ2V0RWxQb3NpdGlvbi5ib3R0b20gKz1cbiAgICAgICAgICBob3N0RWxQb3NpdGlvbi50b3AgLSB0YXJnZXRFbFBvc2l0aW9uLmhlaWdodDtcbiAgICAgICAgdGFyZ2V0RWxQb3NpdGlvbi5sZWZ0ID0gc2hpZnRXaWR0aFtwbGFjZW1lbnRTZWNvbmRhcnldO1xuICAgICAgICB0YXJnZXRFbFBvc2l0aW9uLnJpZ2h0ICs9IHNoaWZ0V2lkdGhbcGxhY2VtZW50U2Vjb25kYXJ5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICB0YXJnZXRFbFBvc2l0aW9uLnRvcCA9IHNoaWZ0SGVpZ2h0W3BsYWNlbWVudFByaW1hcnldO1xuICAgICAgICB0YXJnZXRFbFBvc2l0aW9uLmJvdHRvbSArPSBzaGlmdEhlaWdodFtwbGFjZW1lbnRQcmltYXJ5XTtcbiAgICAgICAgdGFyZ2V0RWxQb3NpdGlvbi5sZWZ0ID0gc2hpZnRXaWR0aFtwbGFjZW1lbnRTZWNvbmRhcnldO1xuICAgICAgICB0YXJnZXRFbFBvc2l0aW9uLnJpZ2h0ICs9IHNoaWZ0V2lkdGhbcGxhY2VtZW50U2Vjb25kYXJ5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgdGFyZ2V0RWxQb3NpdGlvbi50b3AgPSBzaGlmdEhlaWdodFtwbGFjZW1lbnRTZWNvbmRhcnldO1xuICAgICAgICB0YXJnZXRFbFBvc2l0aW9uLmJvdHRvbSArPSBzaGlmdEhlaWdodFtwbGFjZW1lbnRTZWNvbmRhcnldO1xuICAgICAgICB0YXJnZXRFbFBvc2l0aW9uLmxlZnQgPVxuICAgICAgICAgIGhvc3RFbFBvc2l0aW9uLmxlZnQgLVxuICAgICAgICAgICh0YXJnZXRFbFBvc2l0aW9uLndpZHRoICsgcGFyc2VGbG9hdCh0YXJnZXRFbFN0eWxlcy5tYXJnaW5SaWdodCkpO1xuICAgICAgICB0YXJnZXRFbFBvc2l0aW9uLnJpZ2h0ICs9XG4gICAgICAgICAgaG9zdEVsUG9zaXRpb24ubGVmdCAtIHRhcmdldEVsUG9zaXRpb24ud2lkdGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICB0YXJnZXRFbFBvc2l0aW9uLnRvcCA9IHNoaWZ0SGVpZ2h0W3BsYWNlbWVudFNlY29uZGFyeV07XG4gICAgICAgIHRhcmdldEVsUG9zaXRpb24uYm90dG9tICs9IHNoaWZ0SGVpZ2h0W3BsYWNlbWVudFNlY29uZGFyeV07XG4gICAgICAgIHRhcmdldEVsUG9zaXRpb24ubGVmdCA9IHNoaWZ0V2lkdGhbcGxhY2VtZW50UHJpbWFyeV07XG4gICAgICAgIHRhcmdldEVsUG9zaXRpb24ucmlnaHQgKz0gc2hpZnRXaWR0aFtwbGFjZW1lbnRQcmltYXJ5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGFyZ2V0RWxQb3NpdGlvbi50b3AgPSBNYXRoLnJvdW5kKHRhcmdldEVsUG9zaXRpb24udG9wKTtcbiAgICB0YXJnZXRFbFBvc2l0aW9uLmJvdHRvbSA9IE1hdGgucm91bmQodGFyZ2V0RWxQb3NpdGlvbi5ib3R0b20pO1xuICAgIHRhcmdldEVsUG9zaXRpb24ubGVmdCA9IE1hdGgucm91bmQodGFyZ2V0RWxQb3NpdGlvbi5sZWZ0KTtcbiAgICB0YXJnZXRFbFBvc2l0aW9uLnJpZ2h0ID0gTWF0aC5yb3VuZCh0YXJnZXRFbFBvc2l0aW9uLnJpZ2h0KTtcblxuICAgIHJldHVybiB0YXJnZXRFbFBvc2l0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvUG9zaXRpb24oXG4gICAgdGFyZ2V0RWxQb3NpdGlvbjogQ2xpZW50UmVjdCxcbiAgICBob3N0RWxQb3NpdGlvbjogQ2xpZW50UmVjdCxcbiAgICB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBwcmVmZXJyZWRQb3NpdGlvbj86IHN0cmluZ1xuICApIHtcbiAgICBpZiAoXG4gICAgICAoIXByZWZlcnJlZFBvc2l0aW9uIHx8IHByZWZlcnJlZFBvc2l0aW9uID09PSAncmlnaHQnKSAmJlxuICAgICAgdGFyZ2V0RWxQb3NpdGlvbi5sZWZ0ICsgaG9zdEVsUG9zaXRpb24ubGVmdCAtIHRhcmdldEVsUG9zaXRpb24ud2lkdGggPFxuICAgICAgICAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKCFwcmVmZXJyZWRQb3NpdGlvbiB8fCBwcmVmZXJyZWRQb3NpdGlvbiA9PT0gJ3RvcCcpICYmXG4gICAgICB0YXJnZXRFbFBvc2l0aW9uLmJvdHRvbSArXG4gICAgICAgIGhvc3RFbFBvc2l0aW9uLmJvdHRvbSArXG4gICAgICAgIHRhcmdldEVsUG9zaXRpb24uaGVpZ2h0ID5cbiAgICAgICAgd2luZG93LmlubmVySGVpZ2h0XG4gICAgKSB7XG4gICAgICByZXR1cm4gJ3RvcCc7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICghcHJlZmVycmVkUG9zaXRpb24gfHwgcHJlZmVycmVkUG9zaXRpb24gPT09ICdib3R0b20nKSAmJlxuICAgICAgdGFyZ2V0RWxQb3NpdGlvbi50b3AgKyBob3N0RWxQb3NpdGlvbi50b3AgLSB0YXJnZXRFbFBvc2l0aW9uLmhlaWdodCA8IDBcbiAgICApIHtcbiAgICAgIHJldHVybiAnYm90dG9tJztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKCFwcmVmZXJyZWRQb3NpdGlvbiB8fCBwcmVmZXJyZWRQb3NpdGlvbiA9PT0gJ2xlZnQnKSAmJlxuICAgICAgdGFyZ2V0RWxQb3NpdGlvbi5yaWdodCArXG4gICAgICAgIGhvc3RFbFBvc2l0aW9uLnJpZ2h0ICtcbiAgICAgICAgdGFyZ2V0RWxQb3NpdGlvbi53aWR0aCA+XG4gICAgICAgIHdpbmRvdy5pbm5lcldpZHRoXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWxsU3R5bGVzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgcmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdHlsZShlbGVtZW50OiBIVE1MRWxlbWVudCwgcHJvcDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMuZ2V0QWxsU3R5bGVzKGVsZW1lbnQpIGFzIGFueSlbcHJvcF07XG4gIH1cblxuICBwcml2YXRlIGlzU3RhdGljUG9zaXRpb25lZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSB8fCAnc3RhdGljJykgPT09ICdzdGF0aWMnO1xuICB9XG5cbiAgcHJpdmF0ZSBvZmZzZXRQYXJlbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgbGV0IG9mZnNldFBhcmVudEVsID1cbiAgICAgIDxIVE1MRWxlbWVudD5lbGVtZW50Lm9mZnNldFBhcmVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICB3aGlsZSAoXG4gICAgICBvZmZzZXRQYXJlbnRFbCAmJlxuICAgICAgb2Zmc2V0UGFyZW50RWwgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJlxuICAgICAgdGhpcy5pc1N0YXRpY1Bvc2l0aW9uZWQob2Zmc2V0UGFyZW50RWwpXG4gICAgKSB7XG4gICAgICBvZmZzZXRQYXJlbnRFbCA9IDxIVE1MRWxlbWVudD5vZmZzZXRQYXJlbnRFbC5vZmZzZXRQYXJlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldFBhcmVudEVsIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxufVxuXG5jb25zdCBwb3NpdGlvblNlcnZpY2UgPSBuZXcgUG9zaXRpb25pbmcoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aW9uRWxlbWVudHMoXG4gIGhvc3RFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIHBsYWNlbWVudDogc3RyaW5nLFxuICBhcHBlbmRUb0JvZHk/OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgcG9zID0gcG9zaXRpb25TZXJ2aWNlLnBvc2l0aW9uRWxlbWVudHMoXG4gICAgaG9zdEVsZW1lbnQsXG4gICAgdGFyZ2V0RWxlbWVudCxcbiAgICBwbGFjZW1lbnQsXG4gICAgYXBwZW5kVG9Cb2R5XG4gICk7XG5cbiAgdGFyZ2V0RWxlbWVudC5zdHlsZS50b3AgPSBgJHtwb3MudG9wfXB4YDtcbiAgdGFyZ2V0RWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7cG9zLmxlZnR9cHhgO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcG9zaXRpb25FbGVtZW50cyB9IGZyb20gJy4vbmctcG9zaXRpb25pbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBvc2l0aW9uaW5nT3B0aW9ucyB7XG4gIC8qKiBUaGUgRE9NIGVsZW1lbnQsIEVsZW1lbnRSZWYsIG9yIGEgc2VsZWN0b3Igc3RyaW5nIG9mIGFuIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBtb3ZlZCAqL1xuICBlbGVtZW50PzogSFRNTEVsZW1lbnQgfCBFbGVtZW50UmVmIHwgc3RyaW5nO1xuXG4gIC8qKiBUaGUgRE9NIGVsZW1lbnQsIEVsZW1lbnRSZWYsIG9yIGEgc2VsZWN0b3Igc3RyaW5nIG9mIGFuIGVsZW1lbnQgd2hpY2ggdGhlIGVsZW1lbnQgd2lsbCBiZSBhdHRhY2hlZCB0byAgKi9cbiAgdGFyZ2V0PzogSFRNTEVsZW1lbnQgfCBFbGVtZW50UmVmIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0cmluZyBvZiB0aGUgZm9ybSAndmVydC1hdHRhY2htZW50IGhvcml6LWF0dGFjaG1lbnQnIG9yICdwbGFjZW1lbnQnXG4gICAqIC0gcGxhY2VtZW50IGNhbiBiZSBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIiwgXCJyaWdodFwiXG4gICAqIG5vdCB5ZXQgc3VwcG9ydGVkOlxuICAgKiAtIHZlcnQtYXR0YWNobWVudCBjYW4gYmUgYW55IG9mICd0b3AnLCAnbWlkZGxlJywgJ2JvdHRvbSdcbiAgICogLSBob3Jpei1hdHRhY2htZW50IGNhbiBiZSBhbnkgb2YgJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J1xuICAgKi9cbiAgYXR0YWNobWVudD86IHN0cmluZztcblxuICAvKiogQSBzdHJpbmcgc2ltaWxhciB0byBgYXR0YWNobWVudGAuIFRoZSBvbmUgZGlmZmVyZW5jZSBpcyB0aGF0LCBpZiBpdCdzIG5vdCBwcm92aWRlZCxcbiAgICogYHRhcmdldEF0dGFjaG1lbnRgIHdpbGwgYXNzdW1lIHRoZSBtaXJyb3IgaW1hZ2Ugb2YgYGF0dGFjaG1lbnRgLlxuICAgKi9cbiAgdGFyZ2V0QXR0YWNobWVudD86IHN0cmluZztcblxuICAvKiogQSBzdHJpbmcgb2YgdGhlIGZvcm0gJ3ZlcnQtb2Zmc2V0IGhvcml6LW9mZnNldCdcbiAgICogLSB2ZXJ0LW9mZnNldCBhbmQgaG9yaXotb2Zmc2V0IGNhbiBiZSBvZiB0aGUgZm9ybSBcIjIwcHhcIiBvciBcIjU1JVwiXG4gICAqL1xuICBvZmZzZXQ/OiBzdHJpbmc7XG5cbiAgLyoqIEEgc3RyaW5nIHNpbWlsYXIgdG8gYG9mZnNldGAsIGJ1dCByZWZlcnJpbmcgdG8gdGhlIG9mZnNldCBvZiB0aGUgdGFyZ2V0ICovXG4gIHRhcmdldE9mZnNldD86IHN0cmluZztcblxuICAvKiogSWYgdHJ1ZSBjb21wb25lbnQgd2lsbCBiZSBhdHRhY2hlZCB0byBib2R5ICovXG4gIGFwcGVuZFRvQm9keT86IGJvb2xlYW47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQb3NpdGlvbmluZ1NlcnZpY2Uge1xuICBwb3NpdGlvbihvcHRpb25zOiBQb3NpdGlvbmluZ09wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCB7ZWxlbWVudCwgdGFyZ2V0LCBhdHRhY2htZW50LCBhcHBlbmRUb0JvZHl9ID0gb3B0aW9ucztcbiAgICBwb3NpdGlvbkVsZW1lbnRzKFxuICAgICAgX2dldEh0bWxFbGVtZW50KHRhcmdldCksXG4gICAgICBfZ2V0SHRtbEVsZW1lbnQoZWxlbWVudCksXG4gICAgICBhdHRhY2htZW50LFxuICAgICAgYXBwZW5kVG9Cb2R5XG4gICAgKTtcbiAgfVxuXG59XG5cbmZ1bmN0aW9uIF9nZXRIdG1sRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWYgfCBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gIC8vIGl0IG1lYW5zIHRoYXQgd2UgZ290IGEgc2VsZWN0b3JcbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICB9XG5cbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50UmVmKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50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
|
1306
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWJvb3RzdHJhcC1wb3NpdGlvbmluZy51bWQuanMubWFwIiwic291cmNlcyI6WyJub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL3V0aWxzL2dldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy91dGlscy9nZXRQYXJlbnROb2RlLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL3V0aWxzL2dldFNjcm9sbFBhcmVudC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy91dGlscy9pc0Jyb3dzZXIudHMiLCJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvdXRpbHMvaXNJRS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy91dGlscy9nZXRPZmZzZXRQYXJlbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvdXRpbHMvaXNPZmZzZXRDb250YWluZXIudHMiLCJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvdXRpbHMvZ2V0Um9vdC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy91dGlscy9maW5kQ29tbW9uT2Zmc2V0UGFyZW50LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL3V0aWxzL2dldEJvcmRlcnNTaXplLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL3V0aWxzL2dldFdpbmRvd1NpemVzLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL3V0aWxzL2dldFNjcm9sbC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy91dGlscy9nZXRDbGllbnRSZWN0LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL3V0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy91dGlscy9pbmNsdWRlU2Nyb2xsLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL3V0aWxzL2dldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZS50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy91dGlscy9nZXRWaWV3cG9ydE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJ0Yml0cmFyeU5vZGUudHMiLCJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvdXRpbHMvaXNGaXhlZC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy91dGlscy9nZXRGaXhlZFBvc2l0aW9uT2Zmc2V0UGFyZW50LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL3V0aWxzL2dldEJvdW5kYXJpZXMudHMiLCJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQudHMiLCJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvdXRpbHMvZ2V0T2Zmc2V0cy50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvbi50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy91dGlscy9nZXRPdXRlclNpemVzLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL3V0aWxzL2dldFJlZmVyZW5jZU9mZnNldHMudHMiLCJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvdXRpbHMvZ2V0VGFyZ2V0T2Zmc2V0cy50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy91dGlscy9pc051bWVyaWMudHMiLCJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvdXRpbHMvc2V0QWxsU3R5bGVzLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL3V0aWxzL3NldFN0eWxlcy50cyIsIm5nOi8vbmd4LWJvb3RzdHJhcC9wb3NpdGlvbmluZy9tb2RpZmllcnMvYXJyb3cudHMiLCJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvbW9kaWZpZXJzL2ZsaXAudHMiLCJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvbW9kaWZpZXJzL2luaXREYXRhLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cudHMiLCJuZzovL25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvbW9kaWZpZXJzL3NoaWZ0LnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL25nLXBvc2l0aW9uaW5nLnRzIiwibmc6Ly9uZ3gtYm9vdHN0cmFwL3Bvc2l0aW9uaW5nL3Bvc2l0aW9uaW5nLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xyXG4gICAgcmVzdWx0LmRlZmF1bHQgPSBtb2Q7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG4iLCIvKipcbiAqIEdldCBDU1MgY29tcHV0ZWQgcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbGVtZW50OiBIVE1MRWxlbWVudCwgcHJvcGVydHk/OiBzdHJpbmcpOiBhbnkge1xuICBpZiAoZWxlbWVudC5ub2RlVHlwZSAhPT0gMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICAvLyBOT1RFOiAxIERPTSBhY2Nlc3MgaGVyZVxuICBjb25zdCB3aW5kb3cgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gIGNvbnN0IGNzcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpO1xuXG4gIHJldHVybiBwcm9wZXJ0eSA/IGNzc1twcm9wZXJ0eV0gOiBjc3M7XG59XG4iLCIvKipcbiAqIFJldHVybnMgdGhlIHBhcmVudE5vZGUgb3IgdGhlIGhvc3Qgb2YgdGhlIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudE5vZGUoZWxlbWVudDogYW55KTogYW55IHtcbiAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQucGFyZW50Tm9kZSB8fCBlbGVtZW50Lmhvc3Q7XG59XG4iLCIvKipcbiAqIFJldHVybnMgdGhlIHNjcm9sbGluZyBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqL1xuaW1wb3J0IHsgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5IH0gZnJvbSAnLi9nZXRTdHlsZUNvbXB1dGVkUHJvcGVydHknO1xuaW1wb3J0IHsgZ2V0UGFyZW50Tm9kZSB9IGZyb20gJy4vZ2V0UGFyZW50Tm9kZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudDogYW55KTogYW55IHtcbiAgLy8gUmV0dXJuIGJvZHksIGBnZXRTY3JvbGxgIHdpbGwgdGFrZSBjYXJlIHRvIGdldCB0aGUgY29ycmVjdCBgc2Nyb2xsVG9wYCBmcm9tIGl0XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgc3dpdGNoIChlbGVtZW50Lm5vZGVOYW1lKSB7XG4gICAgY2FzZSAnSFRNTCc6XG4gICAgY2FzZSAnQk9EWSc6XG4gICAgICByZXR1cm4gZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHk7XG4gICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgIHJldHVybiBlbGVtZW50LmJvZHk7XG4gICAgZGVmYXVsdDpcbiAgfVxuXG4gIC8vIEZpcmVmb3ggd2FudCB1cyB0byBjaGVjayBgLXhgIGFuZCBgLXlgIHZhcmlhdGlvbnMgYXMgd2VsbFxuICBjb25zdCB7IG92ZXJmbG93LCBvdmVyZmxvd1gsIG92ZXJmbG93WSB9ID0gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQpO1xuICBpZiAoLyhhdXRvfHNjcm9sbHxvdmVybGF5KS8udGVzdChTdHJpbmcob3ZlcmZsb3cpICsgU3RyaW5nKG92ZXJmbG93WSkgKyBTdHJpbmcob3ZlcmZsb3dYKSkpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG59XG4iLCJleHBvcnQgY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbiIsIi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYnJvd3NlciBpcyBJbnRlcm5ldCBFeHBsb3JlclxuICovXG5pbXBvcnQgeyBpc0Jyb3dzZXIgfSBmcm9tICcuL2lzQnJvd3Nlcic7XG5cbmNvbnN0IGlzSUUxMSA9IGlzQnJvd3NlciAmJiAhISgod2luZG93IGFzIGFueSkuTVNJbnB1dE1ldGhvZENvbnRleHQgJiYgKGRvY3VtZW50IGFzIGFueSkuZG9jdW1lbnRNb2RlKTtcbmNvbnN0IGlzSUUxMCA9IGlzQnJvd3NlciAmJiAvTVNJRSAxMC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzSUUodmVyc2lvbj86IG51bWJlcikge1xuICBpZiAodmVyc2lvbiA9PT0gMTEpIHtcbiAgICByZXR1cm4gaXNJRTExO1xuICB9XG4gIGlmICh2ZXJzaW9uID09PSAxMCkge1xuICAgIHJldHVybiBpc0lFMTA7XG4gIH1cblxuICByZXR1cm4gaXNJRTExIHx8IGlzSUUxMDtcbn1cbiIsIi8qKlxuICogUmV0dXJucyB0aGUgb2Zmc2V0IHBhcmVudCBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICovXG5pbXBvcnQgeyBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkgfSBmcm9tICcuL2dldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eSc7XG5pbXBvcnQgeyBpc0lFIH0gZnJvbSAnLi9pc0lFJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50OiBhbnkpOiBhbnkge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgY29uc3Qgbm9PZmZzZXRQYXJlbnQgPSBpc0lFKDEwKSA/IGRvY3VtZW50LmJvZHkgOiBudWxsO1xuXG4gIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG4gIGxldCBvZmZzZXRQYXJlbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCB8fCBudWxsO1xuICAvLyBTa2lwIGhpZGRlbiBlbGVtZW50cyB3aGljaCBkb24ndCBoYXZlIGFuIG9mZnNldFBhcmVudFxuXG4gIGxldCBzaWJsaW5nOiBhbnk7XG5cbiAgd2hpbGUgKG9mZnNldFBhcmVudCA9PT0gbm9PZmZzZXRQYXJlbnQgJiYgZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHtcbiAgICBzaWJsaW5nID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgb2Zmc2V0UGFyZW50ID0gc2libGluZy5vZmZzZXRQYXJlbnQ7XG4gIH1cblxuICBjb25zdCBub2RlTmFtZSA9IG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQubm9kZU5hbWU7XG5cbiAgaWYgKCFub2RlTmFtZSB8fCBub2RlTmFtZSA9PT0gJ0JPRFknIHx8IG5vZGVOYW1lID09PSAnSFRNTCcpIHtcbiAgICByZXR1cm4gc2libGluZyA/IHNpYmxpbmcub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cblxuICAvLyAub2Zmc2V0UGFyZW50IHdpbGwgcmV0dXJuIHRoZSBjbG9zZXN0IFRILCBURCBvciBUQUJMRSBpbiBjYXNlXG4gIC8vIG5vIG9mZnNldFBhcmVudCBpcyBwcmVzZW50LCBJIGhhdGUgdGhpcyBqb2IuLi5cbiAgaWYgKFxuICAgIFsnVEgnLCAnVEQnLCAnVEFCTEUnXS5pbmRleE9mKG9mZnNldFBhcmVudC5ub2RlTmFtZSkgIT09IC0xICYmXG4gICAgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnXG4gICkge1xuICAgIHJldHVybiBnZXRPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRQYXJlbnQ7XG59XG4iLCJpbXBvcnQgeyBnZXRPZmZzZXRQYXJlbnQgfSBmcm9tICcuL2dldE9mZnNldFBhcmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09mZnNldENvbnRhaW5lcihlbGVtZW50OiBhbnkpIHtcbiAgY29uc3QgeyBub2RlTmFtZSB9ID0gZWxlbWVudDtcbiAgaWYgKG5vZGVOYW1lID09PSAnQk9EWScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIG5vZGVOYW1lID09PSAnSFRNTCcgfHwgZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpID09PSBlbGVtZW50XG4gICk7XG59XG4iLCIvKipcbiAqIEZpbmRzIHRoZSByb290IG5vZGUgKGRvY3VtZW50LCBzaGFkb3dET00gcm9vdCkgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3Qobm9kZTogTm9kZSk6IGFueSB7XG4gIGlmIChub2RlLnBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gZ2V0Um9vdChub2RlLnBhcmVudE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG4iLCIvKipcbiAqIEZpbmRzIHRoZSBvZmZzZXQgcGFyZW50IGNvbW1vbiB0byB0aGUgdHdvIHByb3ZpZGVkIG5vZGVzXG4gKi9cbmltcG9ydCB7IGlzT2Zmc2V0Q29udGFpbmVyIH0gZnJvbSAnLi9pc09mZnNldENvbnRhaW5lcic7XG5pbXBvcnQgeyBnZXRSb290IH0gZnJvbSAnLi9nZXRSb290JztcbmltcG9ydCB7IGdldE9mZnNldFBhcmVudCB9IGZyb20gJy4vZ2V0T2Zmc2V0UGFyZW50JztcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDb21tb25PZmZzZXRQYXJlbnQoZWxlbWVudDE6IEhUTUxFbGVtZW50LCBlbGVtZW50MjogSFRNTEVsZW1lbnQpOiBhbnkge1xuICAvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCB0byBhdm9pZCBlcnJvcnMgaW4gY2FzZSBvbmUgb2YgdGhlIGVsZW1lbnRzIGlzbid0IGRlZmluZWQgZm9yIGFueSByZWFzb25cbiAgaWYgKCFlbGVtZW50MSB8fCAhZWxlbWVudDEubm9kZVR5cGUgfHwgIWVsZW1lbnQyIHx8ICFlbGVtZW50Mi5ub2RlVHlwZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cblxuICAvLyBIZXJlIHdlIG1ha2Ugc3VyZSB0byBnaXZlIGFzIFwic3RhcnRcIiB0aGUgZWxlbWVudCB0aGF0IGNvbWVzIGZpcnN0IGluIHRoZSBET01cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1iaXR3aXNlICovXG4gIGNvbnN0IG9yZGVyID0gZWxlbWVudDEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbWVudDIpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkc7XG5cbiAgY29uc3Qgc3RhcnQgPSBvcmRlciA/IGVsZW1lbnQxIDogZWxlbWVudDI7XG4gIGNvbnN0IGVuZCA9IG9yZGVyID8gZWxlbWVudDIgOiBlbGVtZW50MTtcblxuICAvLyBHZXQgY29tbW9uIGFuY2VzdG9yIGNvbnRhaW5lclxuICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gIHJhbmdlLnNldFN0YXJ0KHN0YXJ0LCAwKTtcbiAgcmFuZ2Uuc2V0RW5kKGVuZCwgMCk7XG4gIGNvbnN0IHsgY29tbW9uQW5jZXN0b3JDb250YWluZXIgfSA9IHJhbmdlO1xuXG4gIC8vIEJvdGggbm9kZXMgYXJlIGluc2lkZSAjZG9jdW1lbnRcbiAgaWYgKFxuICAgIChlbGVtZW50MSAhPT0gY29tbW9uQW5jZXN0b3JDb250YWluZXIgJiZcbiAgICAgIGVsZW1lbnQyICE9PSBjb21tb25BbmNlc3RvckNvbnRhaW5lcikgfHxcbiAgICBzdGFydC5jb250YWlucyhlbmQpXG4gICkge1xuICAgIGlmIChpc09mZnNldENvbnRhaW5lcihjb21tb25BbmNlc3RvckNvbnRhaW5lcikpIHtcbiAgICAgIHJldHVybiBjb21tb25BbmNlc3RvckNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0T2Zmc2V0UGFyZW50KGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKTtcbiAgfVxuXG4gIC8vIG9uZSBvZiB0aGUgbm9kZXMgaXMgaW5zaWRlIHNoYWRvd0RPTSwgZmluZCB3aGljaCBvbmVcbiAgY29uc3QgZWxlbWVudDFyb290ID0gZ2V0Um9vdChlbGVtZW50MSk7XG4gIGlmIChlbGVtZW50MXJvb3QuaG9zdCkge1xuICAgIHJldHVybiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQxcm9vdC5ob3N0LCBlbGVtZW50Mik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbmRDb21tb25PZmZzZXRQYXJlbnQoZWxlbWVudDEsIGdldFJvb3QoZWxlbWVudDIpLmhvc3QpO1xuICB9XG59XG4iLCIvKipcbiAqIEhlbHBlciB0byBkZXRlY3QgYm9yZGVycyBvZiBhIGdpdmVuIGVsZW1lbnRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzOiBDU1NTdHlsZURlY2xhcmF0aW9uLCBheGlzOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2lkZUEgPSBheGlzID09PSAneCcgPyAnTGVmdCcgOiAnVG9wJztcbiAgY29uc3Qgc2lkZUIgPSBzaWRlQSA9PT0gJ0xlZnQnID8gJ1JpZ2h0JyA6ICdCb3R0b20nO1xuXG4gIHJldHVybiAoXG4gICAgcGFyc2VGbG9hdChzdHlsZXNbYGJvcmRlciR7c2lkZUF9V2lkdGhgXSkgK1xuICAgIHBhcnNlRmxvYXQoc3R5bGVzW2Bib3JkZXIke3NpZGVCfVdpZHRoYF0pXG4gICk7XG59XG4iLCJpbXBvcnQgeyBpc0lFIH0gZnJvbSAnLi9pc0lFJztcblxuZnVuY3Rpb24gZ2V0U2l6ZShheGlzOiBzdHJpbmcsIGJvZHk6IEhUTUxFbGVtZW50LCBodG1sOiBIVE1MRWxlbWVudCwgY29tcHV0ZWRTdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbikge1xuICByZXR1cm4gTWF0aC5tYXgoXG4gICAgYm9keVtgb2Zmc2V0JHtheGlzfWBdLFxuICAgIGJvZHlbYHNjcm9sbCR7YXhpc31gXSxcbiAgICBodG1sW2BjbGllbnQke2F4aXN9YF0sXG4gICAgaHRtbFtgb2Zmc2V0JHtheGlzfWBdLFxuICAgIGh0bWxbYHNjcm9sbCR7YXhpc31gXSxcbiAgICBpc0lFKDEwKVxuICAgICAgPyAocGFyc2VJbnQoaHRtbFtgb2Zmc2V0JHtheGlzfWBdLCAxMCkgK1xuICAgICAgcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVtgbWFyZ2luJHtheGlzID09PSAnSGVpZ2h0JyA/ICdUb3AnIDogJ0xlZnQnfWBdLCAxMCkgK1xuICAgICAgcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVtgbWFyZ2luJHtheGlzID09PSAnSGVpZ2h0JyA/ICdCb3R0b20nIDogJ1JpZ2h0J31gXSwgMTApKVxuICAgIDogMFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2luZG93U2l6ZXMoZG9jdW1lbnQ6IERvY3VtZW50KSB7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuICBjb25zdCBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICBjb25zdCBjb21wdXRlZFN0eWxlID0gaXNJRSgxMCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShodG1sKTtcblxuICByZXR1cm4ge1xuICAgIGhlaWdodDogZ2V0U2l6ZSgnSGVpZ2h0JywgYm9keSwgaHRtbCwgY29tcHV0ZWRTdHlsZSksXG4gICAgd2lkdGg6IGdldFNpemUoJ1dpZHRoJywgYm9keSwgaHRtbCwgY29tcHV0ZWRTdHlsZSlcbiAgfTtcbn1cbiIsIi8qKlxuICogR2V0cyB0aGUgc2Nyb2xsIHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50IGluIHRoZSBnaXZlbiBzaWRlICh0b3AgYW5kIGxlZnQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGwoZWxlbWVudDogSFRNTEVsZW1lbnQsIHNpZGUgPSAndG9wJykge1xuICBjb25zdCB1cHBlclNpZGUgPSBzaWRlID09PSAndG9wJyA/ICdzY3JvbGxUb3AnIDogJ3Njcm9sbExlZnQnO1xuICBjb25zdCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnQk9EWScgfHwgbm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgIGNvbnN0IGh0bWwgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IHNjcm9sbGluZ0VsZW1lbnQgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCB8fCBodG1sO1xuXG4gICAgcmV0dXJuIHNjcm9sbGluZ0VsZW1lbnRbdXBwZXJTaWRlXTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50W3VwcGVyU2lkZV07XG59XG4iLCIvKipcbiAqIEdpdmVuIGVsZW1lbnQgb2Zmc2V0cywgZ2VuZXJhdGUgYW4gb3V0cHV0IHNpbWlsYXIgdG8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG4gKi9cbmltcG9ydCB7IE9mZnNldHMgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdChvZmZzZXRzOiBPZmZzZXRzKTogT2Zmc2V0cyB7XG4gIHJldHVybiB7XG4gICAgLi4ub2Zmc2V0cyxcbiAgICByaWdodDogb2Zmc2V0cy5sZWZ0ICsgb2Zmc2V0cy53aWR0aCxcbiAgICBib3R0b206IG9mZnNldHMudG9wICsgb2Zmc2V0cy5oZWlnaHRcbiAgfTtcbn1cbiIsIi8qKlxuICogR2V0IGJvdW5kaW5nIGNsaWVudCByZWN0IG9mIGdpdmVuIGVsZW1lbnRcbiAqL1xuaW1wb3J0IHsgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5IH0gZnJvbSAnLi9nZXRTdHlsZUNvbXB1dGVkUHJvcGVydHknO1xuaW1wb3J0IHsgZ2V0Qm9yZGVyc1NpemUgfSBmcm9tICcuL2dldEJvcmRlcnNTaXplJztcbmltcG9ydCB7IGdldFdpbmRvd1NpemVzIH0gZnJvbSAnLi9nZXRXaW5kb3dTaXplcyc7XG5pbXBvcnQgeyBnZXRTY3JvbGwgfSBmcm9tICcuL2dldFNjcm9sbCc7XG5pbXBvcnQgeyBnZXRDbGllbnRSZWN0IH0gZnJvbSAnLi9nZXRDbGllbnRSZWN0JztcbmltcG9ydCB7IGlzSUUgfSBmcm9tICcuL2lzSUUnO1xuaW1wb3J0IHsgT2Zmc2V0cyB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBPZmZzZXRzIHtcbiAgbGV0IHJlY3Q6IGFueSA9IHt9O1xuXG4gIC8vIElFMTAgMTAgRklYOiBQbGVhc2UsIGRvbid0IGFzaywgdGhlIGVsZW1lbnQgaXNuJ3RcbiAgLy8gY29uc2lkZXJlZCBpbiBET00gaW4gc29tZSBjaXJjdW1zdGFuY2VzLi4uXG4gIC8vIFRoaXMgaXNuJ3QgcmVwcm9kdWNpYmxlIGluIElFMTAgY29tcGF0aWJpbGl0eSBtb2RlIG9mIElFMTFcbiAgdHJ5IHtcbiAgICBpZiAoaXNJRSgxMCkpIHtcbiAgICAgIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICd0b3AnKTtcbiAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSBnZXRTY3JvbGwoZWxlbWVudCwgJ2xlZnQnKTtcbiAgICAgIHJlY3QudG9wICs9IHNjcm9sbFRvcDtcbiAgICAgIHJlY3QubGVmdCArPSBzY3JvbGxMZWZ0O1xuICAgICAgcmVjdC5ib3R0b20gKz0gc2Nyb2xsVG9wO1xuICAgICAgcmVjdC5yaWdodCArPSBzY3JvbGxMZWZ0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBhbnkgPSB7XG4gICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgIHRvcDogcmVjdC50b3AsXG4gICAgd2lkdGg6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG4gICAgaGVpZ2h0OiByZWN0LmJvdHRvbSAtIHJlY3QudG9wXG4gIH07XG5cbiAgLy8gc3VidHJhY3Qgc2Nyb2xsYmFyIHNpemUgZnJvbSBzaXplc1xuICBjb25zdCBzaXplczogYW55ID0gZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0hUTUwnID8gZ2V0V2luZG93U2l6ZXMoZWxlbWVudC5vd25lckRvY3VtZW50KSA6IHt9O1xuICBjb25zdCB3aWR0aCA9XG4gICAgc2l6ZXMud2lkdGggfHwgZWxlbWVudC5jbGllbnRXaWR0aCB8fCByZXN1bHQucmlnaHQgLSByZXN1bHQubGVmdDtcbiAgY29uc3QgaGVpZ2h0ID1cbiAgICBzaXplcy5oZWlnaHQgfHwgZWxlbWVudC5jbGllbnRIZWlnaHQgfHwgcmVzdWx0LmJvdHRvbSAtIHJlc3VsdC50b3A7XG5cbiAgbGV0IGhvcml6U2Nyb2xsYmFyID0gZWxlbWVudC5vZmZzZXRXaWR0aCAtIHdpZHRoO1xuICBsZXQgdmVydFNjcm9sbGJhciA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gaGVpZ2h0O1xuXG4gIC8vIGlmIGFuIGh5cG90aGV0aWNhbCBzY3JvbGxiYXIgaXMgZGV0ZWN0ZWQsIHdlIG11c3QgYmUgc3VyZSBpdCdzIG5vdCBhIGBib3JkZXJgXG4gIC8vIHdlIG1ha2UgdGhpcyBjaGVjayBjb25kaXRpb25hbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29uc1xuICBpZiAoaG9yaXpTY3JvbGxiYXIgfHwgdmVydFNjcm9sbGJhcikge1xuICAgIGNvbnN0IHN0eWxlcyA9IGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbGVtZW50KTtcbiAgICBob3JpelNjcm9sbGJhciAtPSBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsICd4Jyk7XG4gICAgdmVydFNjcm9sbGJhciAtPSBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsICd5Jyk7XG5cbiAgICByZXN1bHQud2lkdGggLT0gaG9yaXpTY3JvbGxiYXI7XG4gICAgcmVzdWx0LmhlaWdodCAtPSB2ZXJ0U2Nyb2xsYmFyO1xuICB9XG5cbiAgcmV0dXJuIGdldENsaWVudFJlY3QocmVzdWx0KTtcbn1cbiIsIi8qKlxuICogU3VtIG9yIHN1YnRyYWN0IHRoZSBlbGVtZW50IHNjcm9sbCB2YWx1ZXMgKGxlZnQgYW5kIHRvcCkgZnJvbSBhIGdpdmVuIHJlY3Qgb2JqZWN0XG4gKi9cbmltcG9ydCB7IGdldFNjcm9sbCB9IGZyb20gJy4vZ2V0U2Nyb2xsJztcbmltcG9ydCB7IE9mZnNldHMgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5jbHVkZVNjcm9sbChyZWN0OiBPZmZzZXRzLCBlbGVtZW50OiBIVE1MRWxlbWVudCwgc3VidHJhY3QgPSBmYWxzZSkge1xuICBjb25zdCBzY3JvbGxUb3AgPSBnZXRTY3JvbGwoZWxlbWVudCwgJ3RvcCcpO1xuICBjb25zdCBzY3JvbGxMZWZ0ID0gZ2V0U2Nyb2xsKGVsZW1lbnQsICdsZWZ0Jyk7XG4gIGNvbnN0IG1vZGlmaWVyID0gc3VidHJhY3QgPyAtMSA6IDE7XG4gIHJlY3QudG9wICs9IHNjcm9sbFRvcCAqIG1vZGlmaWVyO1xuICByZWN0LmJvdHRvbSArPSBzY3JvbGxUb3AgKiBtb2RpZmllcjtcbiAgcmVjdC5sZWZ0ICs9IHNjcm9sbExlZnQgKiBtb2RpZmllcjtcbiAgcmVjdC5yaWdodCArPSBzY3JvbGxMZWZ0ICogbW9kaWZpZXI7XG5cbiAgcmV0dXJuIHJlY3Q7XG59XG4iLCJpbXBvcnQgeyBnZXRCb3VuZGluZ0NsaWVudFJlY3QgfSBmcm9tICcuL2dldEJvdW5kaW5nQ2xpZW50UmVjdCc7XG5pbXBvcnQgeyBnZXRDbGllbnRSZWN0IH0gZnJvbSAnLi9nZXRDbGllbnRSZWN0JztcbmltcG9ydCB7IGdldFNjcm9sbFBhcmVudCB9IGZyb20gJy4vZ2V0U2Nyb2xsUGFyZW50JztcbmltcG9ydCB7IGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eSB9IGZyb20gJy4vZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5JztcbmltcG9ydCB7IGluY2x1ZGVTY3JvbGwgfSBmcm9tICcuL2luY2x1ZGVTY3JvbGwnO1xuaW1wb3J0IHsgaXNJRSBhcyBydW5Jc0lFIH0gZnJvbSAnLi9pc0lFJztcbmltcG9ydCB7IE9mZnNldHMgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlKFxuICBjaGlsZHJlbjogSFRNTEVsZW1lbnQsXG4gIHBhcmVudDogSFRNTEVsZW1lbnQsXG4gIGZpeGVkUG9zaXRpb24gPSBmYWxzZVxuKTogT2Zmc2V0cyB7XG4gIGNvbnN0IGlzSUUxMCA9IHJ1bklzSUUoMTApO1xuICBjb25zdCBpc0hUTUwgPSBwYXJlbnQubm9kZU5hbWUgPT09ICdIVE1MJztcbiAgY29uc3QgY2hpbGRyZW5SZWN0OiBhbnkgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoY2hpbGRyZW4pO1xuICBjb25zdCBwYXJlbnRSZWN0OiBhbnkgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QocGFyZW50KTtcbiAgY29uc3Qgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KGNoaWxkcmVuKTtcblxuICBjb25zdCBzdHlsZXMgPSBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkocGFyZW50KTtcbiAgY29uc3QgYm9yZGVyVG9wV2lkdGggPSBwYXJzZUZsb2F0KHN0eWxlcy5ib3JkZXJUb3BXaWR0aCk7XG4gIGNvbnN0IGJvcmRlckxlZnRXaWR0aCA9IHBhcnNlRmxvYXQoc3R5bGVzLmJvcmRlckxlZnRXaWR0aCk7XG5cbiAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHBhcmVudCBpcyBmaXhlZCwgd2UgbXVzdCBpZ25vcmUgbmVnYXRpdmUgc2Nyb2xsIGluIG9mZnNldCBjYWxjXG4gIGlmIChmaXhlZFBvc2l0aW9uICYmIGlzSFRNTCkge1xuICAgIHBhcmVudFJlY3QudG9wID0gTWF0aC5tYXgocGFyZW50UmVjdC50b3AsIDApO1xuICAgIHBhcmVudFJlY3QubGVmdCA9IE1hdGgubWF4KHBhcmVudFJlY3QubGVmdCwgMCk7XG4gIH1cblxuICBsZXQgb2Zmc2V0czogT2Zmc2V0cyA9IGdldENsaWVudFJlY3Qoe1xuICAgIHRvcDogY2hpbGRyZW5SZWN0LnRvcCAtIHBhcmVudFJlY3QudG9wIC0gYm9yZGVyVG9wV2lkdGgsXG4gICAgbGVmdDogY2hpbGRyZW5SZWN0LmxlZnQgLSBwYXJlbnRSZWN0LmxlZnQgLSBib3JkZXJMZWZ0V2lkdGgsXG4gICAgd2lkdGg6IGNoaWxkcmVuUmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IGNoaWxkcmVuUmVjdC5oZWlnaHRcbiAgfSk7XG5cbiAgb2Zmc2V0cy5tYXJnaW5Ub3AgPSAwO1xuICBvZmZzZXRzLm1hcmdpbkxlZnQgPSAwO1xuXG4gIC8vIFN1YnRyYWN0IG1hcmdpbnMgb2YgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgaXQncyBiZWluZyB1c2VkIGFzIHBhcmVudFxuICAvLyB3ZSBkbyB0aGlzIG9ubHkgb24gSFRNTCBiZWNhdXNlIGl0J3MgdGhlIG9ubHkgZWxlbWVudCB0aGF0IGJlaGF2ZXNcbiAgLy8gZGlmZmVyZW50bHkgd2hlbiBtYXJnaW5zIGFyZSBhcHBsaWVkIHRvIGl0LiBUaGUgbWFyZ2lucyBhcmUgaW5jbHVkZWQgaW5cbiAgLy8gdGhlIGJveCBvZiB0aGUgZG9jdW1lbnRFbGVtZW50LCBpbiB0aGUgb3RoZXIgY2FzZXMgbm90LlxuICBpZiAoIWlzSUUxMCAmJiBpc0hUTUwpIHtcbiAgICBjb25zdCBtYXJnaW5Ub3AgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5Ub3ApO1xuICAgIGNvbnN0IG1hcmdpbkxlZnQgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5MZWZ0KTtcblxuICAgIG9mZnNldHMudG9wIC09IGJvcmRlclRvcFdpZHRoIC0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMuYm90dG9tIC09IGJvcmRlclRvcFdpZHRoIC0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMubGVmdCAtPSBib3JkZXJMZWZ0V2lkdGggLSBtYXJnaW5MZWZ0O1xuICAgIG9mZnNldHMucmlnaHQgLT0gYm9yZGVyTGVmdFdpZHRoIC0gbWFyZ2luTGVmdDtcblxuICAgIC8vIEF0dGFjaCBtYXJnaW5Ub3AgYW5kIG1hcmdpbkxlZnQgYmVjYXVzZSBpbiBzb21lIGNpcmN1bXN0YW5jZXMgd2UgbWF5IG5lZWQgdGhlbVxuICAgIG9mZnNldHMubWFyZ2luVG9wID0gbWFyZ2luVG9wO1xuICAgIG9mZnNldHMubWFyZ2luTGVmdCA9IG1hcmdpbkxlZnQ7XG4gIH1cblxuICBpZiAoXG4gICAgaXNJRTEwICYmICFmaXhlZFBvc2l0aW9uXG4gICAgICA/IHBhcmVudC5jb250YWlucyhzY3JvbGxQYXJlbnQpXG4gICAgICA6IHBhcmVudCA9PT0gc2Nyb2xsUGFyZW50ICYmIHNjcm9sbFBhcmVudC5ub2RlTmFtZSAhPT0gJ0JPRFknXG4gICkge1xuICAgIG9mZnNldHMgPSBpbmNsdWRlU2Nyb2xsKG9mZnNldHMsIHBhcmVudCk7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn1cbiIsImltcG9ydCB7IGdldENsaWVudFJlY3QgfSBmcm9tICcuL2dldENsaWVudFJlY3QnO1xuaW1wb3J0IHsgZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlIH0gZnJvbSAnLi9nZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUnO1xuaW1wb3J0IHsgZ2V0U2Nyb2xsIH0gZnJvbSAnLi9nZXRTY3JvbGwnO1xuaW1wb3J0IHsgT2Zmc2V0cyB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3cG9ydE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJ0Yml0cmFyeU5vZGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIGV4Y2x1ZGVTY3JvbGwgPSBmYWxzZSk6IE9mZnNldHMge1xuICBjb25zdCBodG1sID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgY29uc3QgcmVsYXRpdmVPZmZzZXQgPSBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUoZWxlbWVudCwgaHRtbCk7XG4gIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoaHRtbC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XG4gIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KGh0bWwuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG5cbiAgY29uc3Qgc2Nyb2xsVG9wID0gIWV4Y2x1ZGVTY3JvbGwgPyBnZXRTY3JvbGwoaHRtbCkgOiAwO1xuICBjb25zdCBzY3JvbGxMZWZ0ID0gIWV4Y2x1ZGVTY3JvbGwgPyBnZXRTY3JvbGwoaHRtbCwgJ2xlZnQnKSA6IDA7XG5cbiAgY29uc3Qgb2Zmc2V0ID0ge1xuICAgIHRvcDogc2Nyb2xsVG9wIC0gTnVtYmVyKHJlbGF0aXZlT2Zmc2V0LnRvcCkgKyBOdW1iZXIocmVsYXRpdmVPZmZzZXQubWFyZ2luVG9wKSxcbiAgICBsZWZ0OiBzY3JvbGxMZWZ0IC0gTnVtYmVyKHJlbGF0aXZlT2Zmc2V0LmxlZnQpICsgTnVtYmVyKHJlbGF0aXZlT2Zmc2V0Lm1hcmdpbkxlZnQpLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodFxuICB9O1xuXG4gIHJldHVybiBnZXRDbGllbnRSZWN0KG9mZnNldCk7XG59XG4iLCIvKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIGZpeGVkIG9yIGlzIGluc2lkZSBhIGZpeGVkIHBhcmVudFxuICovXG5pbXBvcnQgeyBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkgfSBmcm9tICcuL2dldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eSc7XG5pbXBvcnQgeyBnZXRQYXJlbnROb2RlIH0gZnJvbSAnLi9nZXRQYXJlbnROb2RlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRml4ZWQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuICBpZiAobm9kZU5hbWUgPT09ICdCT0RZJyB8fCBub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBpc0ZpeGVkKGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xufVxuIiwiLyoqXG4gKiBGaW5kcyB0aGUgZmlyc3QgcGFyZW50IG9mIGFuIGVsZW1lbnQgdGhhdCBoYXMgYSB0cmFuc2Zvcm1lZCBwcm9wZXJ0eSBkZWZpbmVkXG4gKi9cblxuaW1wb3J0IHsgZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5IH0gZnJvbSAnLi9nZXRTdHlsZUNvbXB1dGVkUHJvcGVydHknO1xuaW1wb3J0IHsgaXNJRSB9IGZyb20gJy4vaXNJRSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaXhlZFBvc2l0aW9uT2Zmc2V0UGFyZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xuICAvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCB0byBhdm9pZCBlcnJvcnMgaW4gY2FzZSBvbmUgb2YgdGhlIGVsZW1lbnRzIGlzbid0IGRlZmluZWQgZm9yIGFueSByZWFzb25cbiAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LnBhcmVudEVsZW1lbnQgfHwgaXNJRSgpKSB7XG4gICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgbGV0IGVsID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChlbCAmJiBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkoZWwsICd0cmFuc2Zvcm0nKSA9PT0gJ25vbmUnKSB7XG4gICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuIGVsIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbn1cbiIsIi8qKlxuICogQ29tcHV0ZWQgdGhlIGJvdW5kYXJpZXMgbGltaXRzIGFuZCByZXR1cm4gdGhlbVxuICovXG5pbXBvcnQgeyBnZXRTY3JvbGxQYXJlbnQgfSBmcm9tICcuL2dldFNjcm9sbFBhcmVudCc7XG5pbXBvcnQgeyBnZXRQYXJlbnROb2RlIH0gZnJvbSAnLi9nZXRQYXJlbnROb2RlJztcbmltcG9ydCB7IGZpbmRDb21tb25PZmZzZXRQYXJlbnQgfSBmcm9tICcuL2ZpbmRDb21tb25PZmZzZXRQYXJlbnQnO1xuaW1wb3J0IHsgZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlIH0gZnJvbSAnLi9nZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUnO1xuaW1wb3J0IHsgZ2V0Vmlld3BvcnRPZmZzZXRSZWN0UmVsYXRpdmVUb0FydGJpdHJhcnlOb2RlIH0gZnJvbSAnLi9nZXRWaWV3cG9ydE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJ0Yml0cmFyeU5vZGUnO1xuaW1wb3J0IHsgZ2V0V2luZG93U2l6ZXMgfSBmcm9tICcuL2dldFdpbmRvd1NpemVzJztcbmltcG9ydCB7IGlzRml4ZWQgfSBmcm9tICcuL2lzRml4ZWQnO1xuaW1wb3J0IHsgZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudCB9IGZyb20gJy4vZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCb3VuZGFyaWVzKFxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxuICBob3N0OiBIVE1MRWxlbWVudCxcbiAgcGFkZGluZyA9IDAsXG4gIGJvdW5kYXJpZXNFbGVtZW50OiBzdHJpbmcsXG4gIGZpeGVkUG9zaXRpb24gPSBmYWxzZVxuKSB7XG4gIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlXG5cbiAgbGV0IGJvdW5kYXJpZXM6IGFueSA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG4gIGNvbnN0IG9mZnNldFBhcmVudCA9IGZpeGVkUG9zaXRpb24gPyBnZXRGaXhlZFBvc2l0aW9uT2Zmc2V0UGFyZW50KHRhcmdldCkgOiBmaW5kQ29tbW9uT2Zmc2V0UGFyZW50KHRhcmdldCwgaG9zdCk7XG5cbiAgLy8gSGFuZGxlIHZpZXdwb3J0IGNhc2VcbiAgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAndmlld3BvcnQnKSB7XG4gICAgYm91bmRhcmllcyA9IGdldFZpZXdwb3J0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcnRiaXRyYXJ5Tm9kZShvZmZzZXRQYXJlbnQsIGZpeGVkUG9zaXRpb24pO1xuICB9IGVsc2Uge1xuICAgIC8vIEhhbmRsZSBvdGhlciBjYXNlcyBiYXNlZCBvbiBET00gZWxlbWVudCB1c2VkIGFzIGJvdW5kYXJpZXNcbiAgICBsZXQgYm91bmRhcmllc05vZGU7XG4gICAgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAnc2Nyb2xsUGFyZW50Jykge1xuICAgICAgYm91bmRhcmllc05vZGUgPSBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShob3N0KSk7XG4gICAgICBpZiAoYm91bmRhcmllc05vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICBib3VuZGFyaWVzTm9kZSA9IHRhcmdldC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAnd2luZG93Jykge1xuICAgICAgYm91bmRhcmllc05vZGUgPSB0YXJnZXQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvdW5kYXJpZXNOb2RlID0gYm91bmRhcmllc0VsZW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgb2Zmc2V0cyA9IGdldE9mZnNldFJlY3RSZWxhdGl2ZVRvQXJiaXRyYXJ5Tm9kZShcbiAgICAgIGJvdW5kYXJpZXNOb2RlLFxuICAgICAgb2Zmc2V0UGFyZW50LFxuICAgICAgZml4ZWRQb3NpdGlvblxuICAgICk7XG5cbiAgICAvLyBJbiBjYXNlIG9mIEhUTUwsIHdlIG5lZWQgYSBkaWZmZXJlbnQgY29tcHV0YXRpb25cbiAgICBpZiAoYm91bmRhcmllc05vZGUubm9kZU5hbWUgPT09ICdIVE1MJyAmJiAhaXNGaXhlZChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBjb25zdCB7IGhlaWdodCwgd2lkdGggfSA9IGdldFdpbmRvd1NpemVzKHRhcmdldC5vd25lckRvY3VtZW50KTtcbiAgICAgIGJvdW5kYXJpZXMudG9wICs9IG9mZnNldHMudG9wIC0gb2Zmc2V0cy5tYXJnaW5Ub3A7XG4gICAgICBib3VuZGFyaWVzLmJvdHRvbSA9IE51bWJlcihoZWlnaHQpICsgTnVtYmVyKG9mZnNldHMudG9wKTtcbiAgICAgIGJvdW5kYXJpZXMubGVmdCArPSBvZmZzZXRzLmxlZnQgLSBvZmZzZXRzLm1hcmdpbkxlZnQ7XG4gICAgICBib3VuZGFyaWVzLnJpZ2h0ID0gTnVtYmVyKHdpZHRoKSArIE51bWJlcihvZmZzZXRzLmxlZnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmb3IgYWxsIHRoZSBvdGhlciBET00gZWxlbWVudHMsIHRoaXMgb25lIGlzIGdvb2RcbiAgICAgIGJvdW5kYXJpZXMgPSBvZmZzZXRzO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBwYWRkaW5nc1xuICBib3VuZGFyaWVzLmxlZnQgKz0gcGFkZGluZztcbiAgYm91bmRhcmllcy50b3AgKz0gcGFkZGluZztcbiAgYm91bmRhcmllcy5yaWdodCAtPSBwYWRkaW5nO1xuICBib3VuZGFyaWVzLmJvdHRvbSAtPSBwYWRkaW5nO1xuXG4gIHJldHVybiBib3VuZGFyaWVzO1xufVxuIiwiLyoqXG4gKiBVdGlsaXR5IHVzZWQgdG8gdHJhbnNmb3JtIHRoZSBgYXV0b2AgcGxhY2VtZW50IHRvIHRoZSBwbGFjZW1lbnQgd2l0aCBtb3JlXG4gKiBhdmFpbGFibGUgc3BhY2UuXG4gKi9cbmltcG9ydCB7IGdldEJvdW5kYXJpZXMgfSBmcm9tICcuL2dldEJvdW5kYXJpZXMnO1xuaW1wb3J0IHsgT2Zmc2V0cyB9IGZyb20gJy4uL21vZGVscyc7XG5cbmZ1bmN0aW9uIGdldEFyZWEoeyB3aWR0aCwgaGVpZ2h0IH06IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0pIHtcbiAgcmV0dXJuIHdpZHRoICogaGVpZ2h0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUF1dG9QbGFjZW1lbnQoXG4gIHBsYWNlbWVudDogc3RyaW5nLFxuICByZWZSZWN0OiBPZmZzZXRzLFxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxuICBob3N0OiBIVE1MRWxlbWVudCxcbiAgYm91bmRhcmllc0VsZW1lbnQ6IHN0cmluZyxcbiAgcGFkZGluZyA9IDBcbikge1xuICBpZiAocGxhY2VtZW50LmluZGV4T2YoJ2F1dG8nKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gcGxhY2VtZW50O1xuICB9XG5cbiAgaWYgKHBsYWNlbWVudC5pbmRleE9mKCdhdXRvJykgIT09IC0xXG4gICAgJiYgKHBsYWNlbWVudC5pbmRleE9mKCdsZWZ0JykgIT09IC0xXG4gICAgfHwgcGxhY2VtZW50LmluZGV4T2YoJ3JpZ2h0JykgIT09IC0xXG4gICAgfHwgcGxhY2VtZW50LmluZGV4T2YoJ3RvcCcpICE9PSAtMVxuICAgIHx8IHBsYWNlbWVudC5pbmRleE9mKCdib3R0b20nKSAhPT0gLTEpKSB7XG5cbiAgICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCcgJylbMV0gfHwgJyc7XG4gIH1cblxuICBjb25zdCBib3VuZGFyaWVzID0gZ2V0Qm91bmRhcmllcyh0YXJnZXQsIGhvc3QsIHBhZGRpbmcsIGJvdW5kYXJpZXNFbGVtZW50KTtcblxuICBjb25zdCByZWN0czogYW55ID0ge1xuICAgIHRvcDoge1xuICAgICAgd2lkdGg6IGJvdW5kYXJpZXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHJlZlJlY3QudG9wIC0gYm91bmRhcmllcy50b3BcbiAgICB9LFxuICAgIHJpZ2h0OiB7XG4gICAgICB3aWR0aDogYm91bmRhcmllcy5yaWdodCAtIHJlZlJlY3QucmlnaHQsXG4gICAgICBoZWlnaHQ6IGJvdW5kYXJpZXMuaGVpZ2h0XG4gICAgfSxcbiAgICBib3R0b206IHtcbiAgICAgIHdpZHRoOiBib3VuZGFyaWVzLndpZHRoLFxuICAgICAgaGVpZ2h0OiBib3VuZGFyaWVzLmJvdHRvbSAtIHJlZlJlY3QuYm90dG9tXG4gICAgfSxcbiAgICBsZWZ0OiB7XG4gICAgICB3aWR0aDogcmVmUmVjdC5sZWZ0IC0gYm91bmRhcmllcy5sZWZ0LFxuICAgICAgaGVpZ2h0OiBib3VuZGFyaWVzLmhlaWdodFxuICAgIH1cbiAgfTtcblxuICBjb25zdCBzb3J0ZWRBcmVhcyA9IE9iamVjdC5rZXlzKHJlY3RzKVxuICAgIC5tYXAoa2V5ID0+ICh7XG4gICAgICBrZXksXG4gICAgICAuLi5yZWN0c1trZXldLFxuICAgICAgYXJlYTogZ2V0QXJlYShyZWN0c1trZXldKVxuICAgIH0pKVxuICAgIC5zb3J0KChhLCBiKSA9PiBiLmFyZWEgLSBhLmFyZWEpO1xuXG4gIGNvbnN0IGZpbHRlcmVkQXJlYXMgPSBzb3J0ZWRBcmVhcy5maWx0ZXIoXG4gICAgKHsgd2lkdGgsIGhlaWdodCB9KSA9PlxuICAgICAgd2lkdGggPj0gdGFyZ2V0LmNsaWVudFdpZHRoICYmIGhlaWdodCA+PSB0YXJnZXQuY2xpZW50SGVpZ2h0XG4gICk7XG5cbiAgY29uc3QgY29tcHV0ZWRQbGFjZW1lbnQ6IHN0cmluZyA9IGZpbHRlcmVkQXJlYXMubGVuZ3RoID4gMFxuICAgID8gZmlsdGVyZWRBcmVhc1swXS5rZXlcbiAgICA6IHNvcnRlZEFyZWFzWzBdLmtleTtcblxuICBjb25zdCB2YXJpYXRpb24gPSBwbGFjZW1lbnQuc3BsaXQoJyAnKVsxXTtcblxuICB0YXJnZXQuY2xhc3NOYW1lID0gdGFyZ2V0LmNsYXNzTmFtZS5yZXBsYWNlKC9hdXRvL2csIGNvbXB1dGVkUGxhY2VtZW50KTtcblxuICByZXR1cm4gY29tcHV0ZWRQbGFjZW1lbnQgKyAodmFyaWF0aW9uID8gYC0ke3ZhcmlhdGlvbn1gIDogJycpO1xufVxuIiwiaW1wb3J0IHsgRGF0YSwgT2Zmc2V0cyB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPZmZzZXRzKGRhdGE6IERhdGEpOiBPZmZzZXRzIHtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogZGF0YS5vZmZzZXRzLnRhcmdldC53aWR0aCxcbiAgICBoZWlnaHQ6IGRhdGEub2Zmc2V0cy50YXJnZXQuaGVpZ2h0LFxuICAgIGxlZnQ6IE1hdGguZmxvb3IoZGF0YS5vZmZzZXRzLnRhcmdldC5sZWZ0KSxcbiAgICB0b3A6IE1hdGgucm91bmQoZGF0YS5vZmZzZXRzLnRhcmdldC50b3ApLFxuICAgIGJvdHRvbTogTWF0aC5yb3VuZChkYXRhLm9mZnNldHMudGFyZ2V0LmJvdHRvbSksXG4gICAgcmlnaHQ6IE1hdGguZmxvb3IoZGF0YS5vZmZzZXRzLnRhcmdldC5yaWdodClcbiAgfTtcbn1cbiIsIi8qKlxuICogR2V0IHRoZSBvcHBvc2l0ZSBwbGFjZW1lbnQgb2YgdGhlIGdpdmVuIG9uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50OiBzdHJpbmcpIHtcbiAgY29uc3QgaGFzaCA9IHsgbGVmdDogJ3JpZ2h0JywgcmlnaHQ6ICdsZWZ0JywgYm90dG9tOiAndG9wJywgdG9wOiAnYm90dG9tJyB9O1xuXG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIG1hdGNoZWQgPT4gaGFzaFttYXRjaGVkXSk7XG59XG4iLCIvKipcbiAqIEdldCB0aGUgb3Bwb3NpdGUgcGxhY2VtZW50IHZhcmlhdGlvbiBvZiB0aGUgZ2l2ZW4gb25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVZhcmlhdGlvbih2YXJpYXRpb246IHN0cmluZykge1xuICBpZiAodmFyaWF0aW9uID09PSAncmlnaHQnKSB7XG4gICAgcmV0dXJuICdsZWZ0JztcbiAgfSBlbHNlIGlmICh2YXJpYXRpb24gPT09ICdsZWZ0Jykge1xuICAgIHJldHVybiAncmlnaHQnO1xuICB9XG5cbiAgcmV0dXJuIHZhcmlhdGlvbjtcbn1cbiIsIi8qKlxuICogR2V0IHRoZSBvdXRlciBzaXplcyBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAob2Zmc2V0IHNpemUgKyBtYXJnaW5zKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3V0ZXJTaXplcyhlbGVtZW50OiBhbnkpIHtcbiAgY29uc3Qgd2luZG93ID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgY29uc3QgeCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCB8fCAwKSArIHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkJvdHRvbSB8fCAwKTtcbiAgY29uc3QgeSA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkxlZnQgfHwgMCkgKyBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5SaWdodCB8fCAwKTtcblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiBOdW1iZXIoZWxlbWVudC5vZmZzZXRXaWR0aCkgKyB5LFxuICAgIGhlaWdodDogTnVtYmVyKGVsZW1lbnQub2Zmc2V0SGVpZ2h0KSArIHhcbiAgfTtcbn1cbiIsIi8qKlxuICogR2V0IG9mZnNldHMgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50XG4gKi9cbmltcG9ydCB7IGZpbmRDb21tb25PZmZzZXRQYXJlbnQgfSBmcm9tICcuL2ZpbmRDb21tb25PZmZzZXRQYXJlbnQnO1xuaW1wb3J0IHsgZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9BcmJpdHJhcnlOb2RlIH0gZnJvbSAnLi9nZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUnO1xuaW1wb3J0IHsgZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudCB9IGZyb20gJy4vZ2V0Rml4ZWRQb3NpdGlvbk9mZnNldFBhcmVudCc7XG5pbXBvcnQgeyBPZmZzZXRzIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlZmVyZW5jZU9mZnNldHMoXG4gIHRhcmdldDogSFRNTEVsZW1lbnQsXG4gIGhvc3Q6IEhUTUxFbGVtZW50LFxuICBmaXhlZFBvc2l0aW9uOiBib29sZWFuID0gbnVsbFxuKTogT2Zmc2V0cyB7XG4gIGNvbnN0IGNvbW1vbk9mZnNldFBhcmVudCA9IGZpeGVkUG9zaXRpb25cbiAgICA/IGdldEZpeGVkUG9zaXRpb25PZmZzZXRQYXJlbnQodGFyZ2V0KVxuICAgIDogZmluZENvbW1vbk9mZnNldFBhcmVudCh0YXJnZXQsIGhvc3QpO1xuXG4gIHJldHVybiBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0FyYml0cmFyeU5vZGUoaG9zdCwgY29tbW9uT2Zmc2V0UGFyZW50LCBmaXhlZFBvc2l0aW9uKTtcbn1cbiIsIi8qKlxuICogR2V0IG9mZnNldHMgdG8gdGhlIHRhcmdldFxuICovXG5pbXBvcnQgeyBnZXRPcHBvc2l0ZVBsYWNlbWVudCB9IGZyb20gJy4vZ2V0T3Bwb3NpdGVQbGFjZW1lbnQnO1xuaW1wb3J0IHsgZ2V0T3V0ZXJTaXplcyB9IGZyb20gJy4vZ2V0T3V0ZXJTaXplcyc7XG5pbXBvcnQgeyBPZmZzZXRzIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcmdldE9mZnNldHMoXG4gIHRhcmdldDogSFRNTEVsZW1lbnQsXG4gIGhvc3RPZmZzZXRzOiBPZmZzZXRzLFxuICBwb3NpdGlvbjogc3RyaW5nXG4pOiBPZmZzZXRzIHtcbiAgY29uc3QgcGxhY2VtZW50ID0gcG9zaXRpb24uc3BsaXQoJyAnKVswXTtcblxuICAvLyBHZXQgdGFyZ2V0IG5vZGUgc2l6ZXNcbiAgY29uc3QgdGFyZ2V0UmVjdCA9IGdldE91dGVyU2l6ZXModGFyZ2V0KTtcblxuICAvLyBBZGQgcG9zaXRpb24sIHdpZHRoIGFuZCBoZWlnaHQgdG8gb3VyIG9mZnNldHMgb2JqZWN0XG4gIGNvbnN0IHRhcmdldE9mZnNldHMgPSB7XG4gICAgd2lkdGg6IHRhcmdldFJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiB0YXJnZXRSZWN0LmhlaWdodFxuICB9O1xuXG4gIC8vIGRlcGVuZGluZyBieSB0aGUgdGFyZ2V0IHBsYWNlbWVudCB3ZSBoYXZlIHRvIGNvbXB1dGUgaXRzIG9mZnNldHMgc2xpZ2h0bHkgZGlmZmVyZW50bHlcbiAgY29uc3QgaXNIb3JpeiA9IFsncmlnaHQnLCAnbGVmdCddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTE7XG4gIGNvbnN0IG1haW5TaWRlID0gaXNIb3JpeiA/ICd0b3AnIDogJ2xlZnQnO1xuICBjb25zdCBzZWNvbmRhcnlTaWRlID0gaXNIb3JpeiA/ICdsZWZ0JyA6ICd0b3AnO1xuICBjb25zdCBtZWFzdXJlbWVudCA9IGlzSG9yaXogPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gIGNvbnN0IHNlY29uZGFyeU1lYXN1cmVtZW50ID0gIWlzSG9yaXogPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgdGFyZ2V0T2Zmc2V0c1ttYWluU2lkZV0gPVxuICAgIGhvc3RPZmZzZXRzW21haW5TaWRlXSArXG4gICAgaG9zdE9mZnNldHNbbWVhc3VyZW1lbnRdIC8gMiAtXG4gICAgdGFyZ2V0UmVjdFttZWFzdXJlbWVudF0gLyAyO1xuXG4gIHRhcmdldE9mZnNldHNbc2Vjb25kYXJ5U2lkZV0gPSBwbGFjZW1lbnQgPT09IHNlY29uZGFyeVNpZGVcbiAgICA/IGhvc3RPZmZzZXRzW3NlY29uZGFyeVNpZGVdIC0gdGFyZ2V0UmVjdFtzZWNvbmRhcnlNZWFzdXJlbWVudF1cbiAgICA6IGhvc3RPZmZzZXRzW2dldE9wcG9zaXRlUGxhY2VtZW50KHNlY29uZGFyeVNpZGUpXTtcblxuICByZXR1cm4gdGFyZ2V0T2Zmc2V0cztcbn1cbiIsIi8qKlxuICogVGVsbHMgaWYgYSBnaXZlbiBpbnB1dCBpcyBhIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljKG46IGFueSkge1xuICByZXR1cm4gbiAhPT0gJycgJiYgIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pO1xufVxuIiwiLyoqXG4gKiBTZXQgdGhlIHN0eWxlIHRvIHRoZSBnaXZlbiBwb3BwZXJcbiAqL1xuaW1wb3J0IHsgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERhdGEgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgZ2V0T2Zmc2V0cywgc2V0U3R5bGVzIH0gZnJvbSAnLi9pbmRleCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBbGxTdHlsZXMoZGF0YTogRGF0YSwgcmVuZGVyZXI/OiBSZW5kZXJlcjIpOiB2b2lkIHtcbiAgY29uc3QgdGFyZ2V0ID0gZGF0YS5pbnN0YW5jZS50YXJnZXQ7XG5cbiAgY29uc3Qgb2Zmc2V0cyA9IGdldE9mZnNldHMoZGF0YSk7XG5cbiAgc2V0U3R5bGVzKHRhcmdldCwge1xuICAgICd3aWxsLWNoYW5nZSc6ICd0cmFuc2Zvcm0nLFxuICAgIHRvcDogJzBweCcsXG4gICAgbGVmdDogJzBweCcsXG4gICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHtvZmZzZXRzLmxlZnR9cHgsICR7b2Zmc2V0cy50b3B9cHgsIDBweClgXG4gIH0sIHJlbmRlcmVyKTtcblxuICBpZiAoZGF0YS5pbnN0YW5jZS5hcnJvdykge1xuICAgIHNldFN0eWxlcyhkYXRhLmluc3RhbmNlLmFycm93LCBkYXRhLm9mZnNldHMuYXJyb3csIHJlbmRlcmVyKTtcbiAgfVxuXG4gIGlmIChkYXRhLnBsYWNlbWVudEF1dG8pIHtcbiAgICBpZiAocmVuZGVyZXIpIHtcbiAgICAgIHJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0YXJnZXQsICdjbGFzcycsXG4gICAgICAgIHRhcmdldC5jbGFzc05hbWUucmVwbGFjZSgvYnMtcG9wb3Zlci1hdXRvL2csIGBicy1wb3BvdmVyLSR7ZGF0YS5wbGFjZW1lbnR9YClcbiAgICAgICk7XG4gICAgICByZW5kZXJlci5zZXRBdHRyaWJ1dGUodGFyZ2V0LCAnY2xhc3MnLFxuICAgICAgICB0YXJnZXQuY2xhc3NOYW1lLnJlcGxhY2UoL2JzLXRvb2x0aXAtYXV0by9nLCBgYnMtdG9vbHRpcC0ke2RhdGEucGxhY2VtZW50fWApXG4gICAgICApO1xuXG4gICAgICByZW5kZXJlci5zZXRBdHRyaWJ1dGUodGFyZ2V0LCAnY2xhc3MnLFxuICAgICAgICB0YXJnZXQuY2xhc3NOYW1lLnJlcGxhY2UoL1xcc2F1dG8vZywgYFxccyR7ZGF0YS5wbGFjZW1lbnR9YClcbiAgICAgICk7XG5cbiAgICAgIGlmICh0YXJnZXQuY2xhc3NOYW1lLm1hdGNoKC9wb3BvdmVyL2cpKSB7XG4gICAgICAgIHJlbmRlcmVyLmFkZENsYXNzKHRhcmdldCwgJ3BvcG92ZXItYXV0bycpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGFyZ2V0LmNsYXNzTmFtZS5tYXRjaCgvdG9vbHRpcC9nKSkge1xuICAgICAgICByZW5kZXJlci5hZGRDbGFzcyh0YXJnZXQsICd0b29sdGlwLWF1dG8nKTtcbiAgICAgIH1cblxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5jbGFzc05hbWUgPSB0YXJnZXQuY2xhc3NOYW1lLnJlcGxhY2UoL2JzLXBvcG92ZXItYXV0by9nLCBgYnMtcG9wb3Zlci0ke2RhdGEucGxhY2VtZW50fWApO1xuICAgICAgdGFyZ2V0LmNsYXNzTmFtZSA9IHRhcmdldC5jbGFzc05hbWUucmVwbGFjZSgvYnMtdG9vbHRpcC1hdXRvL2csIGBicy10b29sdGlwLSR7ZGF0YS5wbGFjZW1lbnR9YCk7XG4gICAgICB0YXJnZXQuY2xhc3NOYW1lID0gdGFyZ2V0LmNsYXNzTmFtZS5yZXBsYWNlKC9cXHNhdXRvL2csIGBcXHMke2RhdGEucGxhY2VtZW50fWApO1xuXG4gICAgICBpZiAodGFyZ2V0LmNsYXNzTmFtZS5tYXRjaCgvcG9wb3Zlci9nKSkge1xuICAgICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZCgncG9wb3Zlci1hdXRvJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0YXJnZXQuY2xhc3NOYW1lLm1hdGNoKC90b29sdGlwL2cpKSB7XG4gICAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKCd0b29sdGlwLWF1dG8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocmVuZGVyZXIpIHtcbiAgICByZW5kZXJlci5zZXRBdHRyaWJ1dGUodGFyZ2V0LCAnY2xhc3MnLCB0YXJnZXQuY2xhc3NOYW1lLnJlcGxhY2UoL2xlZnR8cmlnaHR8dG9wfGJvdHRvbS9nLCBgJHtkYXRhLnBsYWNlbWVudH1gKSk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0LmNsYXNzTmFtZSA9IHRhcmdldC5jbGFzc05hbWUucmVwbGFjZSgvbGVmdHxyaWdodHx0b3B8Ym90dG9tL2csIGAke2RhdGEucGxhY2VtZW50fWApO1xuICB9XG59XG4iLCIvKipcbiAqIFNldCB0aGUgc3R5bGUgdG8gdGhlIGdpdmVuIHBvcHBlclxuICovXG5pbXBvcnQgeyBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgaXNOdW1lcmljIH0gZnJvbSAnLi9pc051bWVyaWMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0U3R5bGVzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzdHlsZXM6IGFueSwgcmVuZGVyZXI/OiBSZW5kZXJlcjIpIHtcbiAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKChwcm9wOiBhbnkpID0+IHtcbiAgICBsZXQgdW5pdCA9ICcnO1xuICAgIC8vIGFkZCB1bml0IGlmIHRoZSB2YWx1ZSBpcyBudW1lcmljIGFuZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZ1xuICAgIGlmIChbJ3dpZHRoJywgJ2hlaWdodCcsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXS5pbmRleE9mKHByb3ApICE9PSAtMSAmJlxuICAgICAgaXNOdW1lcmljKHN0eWxlc1twcm9wXSkpIHtcbiAgICAgIHVuaXQgPSAncHgnO1xuICAgIH1cblxuICAgIGlmIChyZW5kZXJlcikge1xuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgcHJvcCwgYCR7U3RyaW5nKHN0eWxlc1twcm9wXSl9JHt1bml0fWApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IFN0cmluZyhzdHlsZXNbcHJvcF0pICsgdW5pdDtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBnZXRDbGllbnRSZWN0LCBnZXRPdXRlclNpemVzLCBnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBEYXRhIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFycm93KGRhdGE6IERhdGEpIHtcbiAgbGV0IHRhcmdldE9mZnNldHMgPSBkYXRhLm9mZnNldHMudGFyZ2V0O1xuICAvLyBpZiBhcnJvd0VsZW1lbnQgaXMgYSBzdHJpbmcsIHN1cHBvc2UgaXQncyBhIENTUyBzZWxlY3RvclxuICBjb25zdCBhcnJvd0VsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGRhdGEuaW5zdGFuY2UudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJy5hcnJvdycpO1xuXG4gIC8vIGlmIGFycm93RWxlbWVudCBpcyBub3QgZm91bmQsIGRvbid0IHJ1biB0aGUgbW9kaWZpZXJcbiAgaWYgKCFhcnJvd0VsZW1lbnQpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGNvbnN0IGlzVmVydGljYWwgPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGRhdGEucGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgY29uc3QgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgY29uc3Qgc2lkZUNhcGl0YWxpemVkID0gaXNWZXJ0aWNhbCA/ICdUb3AnIDogJ0xlZnQnO1xuICBjb25zdCBzaWRlID0gc2lkZUNhcGl0YWxpemVkLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGFsdFNpZGUgPSBpc1ZlcnRpY2FsID8gJ2xlZnQnIDogJ3RvcCc7XG4gIGNvbnN0IG9wU2lkZSA9IGlzVmVydGljYWwgPyAnYm90dG9tJyA6ICdyaWdodCc7XG4gIGNvbnN0IGFycm93RWxlbWVudFNpemUgPSBnZXRPdXRlclNpemVzKGFycm93RWxlbWVudClbbGVuXTtcblxuICAvLyB0b3AvbGVmdCBzaWRlXG4gIGlmIChkYXRhLm9mZnNldHMuaG9zdFtvcFNpZGVdIC0gYXJyb3dFbGVtZW50U2l6ZSA8IHRhcmdldE9mZnNldHNbc2lkZV0pIHtcbiAgICB0YXJnZXRPZmZzZXRzW3NpZGVdIC09XG4gICAgICB0YXJnZXRPZmZzZXRzW3NpZGVdIC0gKGRhdGEub2Zmc2V0cy5ob3N0W29wU2lkZV0gLSBhcnJvd0VsZW1lbnRTaXplKTtcbiAgfVxuICAvLyBib3R0b20vcmlnaHQgc2lkZVxuICBpZiAoTnVtYmVyKGRhdGEub2Zmc2V0cy5ob3N0W3NpZGVdKSArIE51bWJlcihhcnJvd0VsZW1lbnRTaXplKSA+IHRhcmdldE9mZnNldHNbb3BTaWRlXSkge1xuICAgIHRhcmdldE9mZnNldHNbc2lkZV0gKz1cbiAgICAgIE51bWJlcihkYXRhLm9mZnNldHMuaG9zdFtzaWRlXSkgKyBOdW1iZXIoYXJyb3dFbGVtZW50U2l6ZSkgLSBOdW1iZXIodGFyZ2V0T2Zmc2V0c1tvcFNpZGVdKTtcbiAgfVxuICB0YXJnZXRPZmZzZXRzID0gZ2V0Q2xpZW50UmVjdCh0YXJnZXRPZmZzZXRzKTtcblxuICAvLyBjb21wdXRlIGNlbnRlciBvZiB0aGUgdGFyZ2V0XG4gIGNvbnN0IGNlbnRlciA9IE51bWJlcihkYXRhLm9mZnNldHMuaG9zdFtzaWRlXSkgKyBOdW1iZXIoZGF0YS5vZmZzZXRzLmhvc3RbbGVuXSAvIDIgLSBhcnJvd0VsZW1lbnRTaXplIC8gMik7XG5cbiAgLy8gQ29tcHV0ZSB0aGUgc2lkZVZhbHVlIHVzaW5nIHRoZSB1cGRhdGVkIHRhcmdldCBvZmZzZXRzXG4gIC8vIHRha2UgdGFyZ2V0IG1hcmdpbiBpbiBhY2NvdW50IGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGlzIGluZm8gYXZhaWxhYmxlXG4gIGNvbnN0IGNzcyA9IGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShkYXRhLmluc3RhbmNlLnRhcmdldCk7XG5cbiAgY29uc3QgdGFyZ2V0TWFyZ2luU2lkZSA9IHBhcnNlRmxvYXQoY3NzW2BtYXJnaW4ke3NpZGVDYXBpdGFsaXplZH1gXSk7XG4gIGNvbnN0IHRhcmdldEJvcmRlclNpZGUgPSBwYXJzZUZsb2F0KGNzc1tgYm9yZGVyJHtzaWRlQ2FwaXRhbGl6ZWR9V2lkdGhgXSk7XG4gIGxldCBzaWRlVmFsdWUgPVxuICAgIGNlbnRlciAtIHRhcmdldE9mZnNldHNbc2lkZV0gLSB0YXJnZXRNYXJnaW5TaWRlIC0gdGFyZ2V0Qm9yZGVyU2lkZTtcblxuICAvLyBwcmV2ZW50IGFycm93RWxlbWVudCBmcm9tIGJlaW5nIHBsYWNlZCBub3QgY29udGlndW91c2x5IHRvIGl0cyB0YXJnZXRcbiAgc2lkZVZhbHVlID0gTWF0aC5tYXgoTWF0aC5taW4odGFyZ2V0T2Zmc2V0c1tsZW5dIC0gYXJyb3dFbGVtZW50U2l6ZSwgc2lkZVZhbHVlKSwgMCk7XG5cbiAgZGF0YS5vZmZzZXRzLmFycm93ID0ge1xuICAgIFtzaWRlXTogTWF0aC5yb3VuZChzaWRlVmFsdWUpLFxuICAgIFthbHRTaWRlXTogJycgLy8gbWFrZSBzdXJlIHRvIHVuc2V0IGFueSBldmVudHVhbCBhbHRTaWRlIHZhbHVlIGZyb20gdGhlIERPTSBub2RlXG4gIH07XG5cbiAgZGF0YS5pbnN0YW5jZS5hcnJvdyA9IGFycm93RWxlbWVudDtcblxuICByZXR1cm4gZGF0YTtcbn1cbiIsImltcG9ydCB7XG4gIGNvbXB1dGVBdXRvUGxhY2VtZW50LFxuICBnZXRCb3VuZGFyaWVzLCBnZXRDbGllbnRSZWN0LFxuICBnZXRPcHBvc2l0ZVBsYWNlbWVudCxcbiAgZ2V0T3Bwb3NpdGVWYXJpYXRpb24sXG4gIGdldFRhcmdldE9mZnNldHNcbn0gZnJvbSAnLi4vdXRpbHMnO1xuXG5pbXBvcnQgeyBEYXRhIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZsaXAoZGF0YTogRGF0YSk6IERhdGEge1xuICBkYXRhLm9mZnNldHMudGFyZ2V0ID0gZ2V0Q2xpZW50UmVjdChkYXRhLm9mZnNldHMudGFyZ2V0KTtcblxuICBjb25zdCBib3VuZGFyaWVzID0gZ2V0Qm91bmRhcmllcyhcbiAgICBkYXRhLmluc3RhbmNlLnRhcmdldCxcbiAgICBkYXRhLmluc3RhbmNlLmhvc3QsXG4gICAgMCwgLy8gcGFkZGluZ1xuICAgICd2aWV3cG9ydCcsXG4gICAgZmFsc2UgLy8gcG9zaXRpb25GaXhlZFxuICApO1xuXG4gIGxldCBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnICcpWzBdO1xuICBsZXQgdmFyaWF0aW9uID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJyAnKVsxXSB8fCAnJztcblxuICBjb25zdCBhZGFwdGl2ZVBvc2l0aW9uID0gdmFyaWF0aW9uXG4gICAgPyBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpXG4gICAgOiBjb21wdXRlQXV0b1BsYWNlbWVudCgnYXV0bycsIGRhdGEub2Zmc2V0cy5ob3N0LCBkYXRhLmluc3RhbmNlLnRhcmdldCwgZGF0YS5pbnN0YW5jZS5ob3N0LCAndmlld3BvcnQnLCAwKTtcblxuICBjb25zdCBmbGlwT3JkZXIgPSBbcGxhY2VtZW50LCBhZGFwdGl2ZVBvc2l0aW9uXTtcblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGN5Y2xvbWF0aWMtY29tcGxleGl0eSAqL1xuICBmbGlwT3JkZXIuZm9yRWFjaCgoc3RlcCwgaW5kZXgpID0+IHtcbiAgICBpZiAocGxhY2VtZW50ICE9PSBzdGVwIHx8IGZsaXBPcmRlci5sZW5ndGggPT09IGluZGV4ICsgMSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJyAnKVswXTtcblxuICAgIC8vIHVzaW5nIGZsb29yIGJlY2F1c2UgdGhlIGhvc3Qgb2Zmc2V0cyBtYXkgY29udGFpbiBkZWNpbWFscyB3ZSBhcmUgbm90IGdvaW5nIHRvIGNvbnNpZGVyIGhlcmVcbiAgICBjb25zdCBvdmVybGFwc1JlZiA9XG4gICAgICAocGxhY2VtZW50ID09PSAnbGVmdCcgJiZcbiAgICAgICAgTWF0aC5mbG9vcihkYXRhLm9mZnNldHMudGFyZ2V0LnJpZ2h0KSA+IE1hdGguZmxvb3IoZGF0YS5vZmZzZXRzLmhvc3QubGVmdCkpIHx8XG4gICAgICAocGxhY2VtZW50ID09PSAncmlnaHQnICYmXG4gICAgICAgIE1hdGguZmxvb3IoZGF0YS5vZmZzZXRzLnRhcmdldC5sZWZ0KSA8IE1hdGguZmxvb3IoZGF0YS5vZmZzZXRzLmhvc3QucmlnaHQpKSB8fFxuICAgICAgKHBsYWNlbWVudCA9PT0gJ3RvcCcgJiZcbiAgICAgICAgTWF0aC5mbG9vcihkYXRhLm9mZnNldHMudGFyZ2V0LmJvdHRvbSkgPiBNYXRoLmZsb29yKGRhdGEub2Zmc2V0cy5ob3N0LnRvcCkpIHx8XG4gICAgICAocGxhY2VtZW50ID09PSAnYm90dG9tJyAmJlxuICAgICAgICBNYXRoLmZsb29yKGRhdGEub2Zmc2V0cy50YXJnZXQudG9wKSA8IE1hdGguZmxvb3IoZGF0YS5vZmZzZXRzLmhvc3QuYm90dG9tKSk7XG5cbiAgICBjb25zdCBvdmVyZmxvd3NMZWZ0ID0gTWF0aC5mbG9vcihkYXRhLm9mZnNldHMudGFyZ2V0LmxlZnQpIDwgTWF0aC5mbG9vcihib3VuZGFyaWVzLmxlZnQpO1xuICAgIGNvbnN0IG92ZXJmbG93c1JpZ2h0ID0gTWF0aC5mbG9vcihkYXRhLm9mZnNldHMudGFyZ2V0LnJpZ2h0KSA+IE1hdGguZmxvb3IoYm91bmRhcmllcy5yaWdodCk7XG4gICAgY29uc3Qgb3ZlcmZsb3dzVG9wID0gTWF0aC5mbG9vcihkYXRhLm9mZnNldHMudGFyZ2V0LnRvcCkgPCBNYXRoLmZsb29yKGJvdW5kYXJpZXMudG9wKTtcbiAgICBjb25zdCBvdmVyZmxvd3NCb3R0b20gPSBNYXRoLmZsb29yKGRhdGEub2Zmc2V0cy50YXJnZXQuYm90dG9tKSA+IE1hdGguZmxvb3IoYm91bmRhcmllcy5ib3R0b20pO1xuXG4gICAgY29uc3Qgb3ZlcmZsb3dzQm91bmRhcmllcyA9XG4gICAgICAocGxhY2VtZW50ID09PSAnbGVmdCcgJiYgb3ZlcmZsb3dzTGVmdCkgfHxcbiAgICAgIChwbGFjZW1lbnQgPT09ICdyaWdodCcgJiYgb3ZlcmZsb3dzUmlnaHQpIHx8XG4gICAgICAocGxhY2VtZW50ID09PSAndG9wJyAmJiBvdmVyZmxvd3NUb3ApIHx8XG4gICAgICAocGxhY2VtZW50ID09PSAnYm90dG9tJyAmJiBvdmVyZmxvd3NCb3R0b20pO1xuXG4gICAgLy8gZmxpcCB0aGUgdmFyaWF0aW9uIGlmIHJlcXVpcmVkXG4gICAgY29uc3QgaXNWZXJ0aWNhbCA9IFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSAhPT0gLTE7XG4gICAgY29uc3QgZmxpcHBlZFZhcmlhdGlvbiA9XG4gICAgICAoKGlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnbGVmdCcgJiYgb3ZlcmZsb3dzTGVmdCkgfHxcbiAgICAgICAgKGlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAncmlnaHQnICYmIG92ZXJmbG93c1JpZ2h0KSB8fFxuICAgICAgICAoIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAnbGVmdCcgJiYgb3ZlcmZsb3dzVG9wKSB8fFxuICAgICAgICAoIWlzVmVydGljYWwgJiYgdmFyaWF0aW9uID09PSAncmlnaHQnICYmIG92ZXJmbG93c0JvdHRvbSkpO1xuXG4gICAgaWYgKG92ZXJsYXBzUmVmIHx8IG92ZXJmbG93c0JvdW5kYXJpZXMgfHwgZmxpcHBlZFZhcmlhdGlvbikge1xuICAgICAgLy8gdGhpcyBib29sZWFuIHRvIGRldGVjdCBhbnkgZmxpcCBsb29wXG4gICAgICBpZiAob3ZlcmxhcHNSZWYgfHwgb3ZlcmZsb3dzQm91bmRhcmllcykge1xuICAgICAgICBwbGFjZW1lbnQgPSBmbGlwT3JkZXJbaW5kZXggKyAxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZsaXBwZWRWYXJpYXRpb24pIHtcbiAgICAgICAgdmFyaWF0aW9uID0gZ2V0T3Bwb3NpdGVWYXJpYXRpb24odmFyaWF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5wbGFjZW1lbnQgPSBwbGFjZW1lbnQgKyAodmFyaWF0aW9uID8gYCAke3ZhcmlhdGlvbn1gIDogJycpO1xuXG4gICAgICBkYXRhLm9mZnNldHMudGFyZ2V0ID0ge1xuICAgICAgICAuLi5kYXRhLm9mZnNldHMudGFyZ2V0LFxuICAgICAgICAuLi5nZXRUYXJnZXRPZmZzZXRzKFxuICAgICAgICAgIGRhdGEuaW5zdGFuY2UudGFyZ2V0LFxuICAgICAgICAgIGRhdGEub2Zmc2V0cy5ob3N0LFxuICAgICAgICAgIGRhdGEucGxhY2VtZW50XG4gICAgICAgIClcbiAgICAgIH07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn1cbiIsImltcG9ydCB7XG4gIGNvbXB1dGVBdXRvUGxhY2VtZW50LFxuICBnZXRSZWZlcmVuY2VPZmZzZXRzLFxuICBnZXRUYXJnZXRPZmZzZXRzXG59IGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHsgRGF0YSB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0RGF0YSh0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCwgaG9zdEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwb3NpdGlvbjogc3RyaW5nKTogRGF0YSB7XG5cbiAgY29uc3QgaG9zdEVsUG9zaXRpb24gPSBnZXRSZWZlcmVuY2VPZmZzZXRzKHRhcmdldEVsZW1lbnQsIGhvc3RFbGVtZW50KTtcbiAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gZ2V0VGFyZ2V0T2Zmc2V0cyh0YXJnZXRFbGVtZW50LCBob3N0RWxQb3NpdGlvbiwgcG9zaXRpb24pO1xuXG4gIGNvbnN0IHBsYWNlbWVudCA9IGNvbXB1dGVBdXRvUGxhY2VtZW50KHBvc2l0aW9uLCBob3N0RWxQb3NpdGlvbiwgdGFyZ2V0RWxlbWVudCwgaG9zdEVsZW1lbnQsICd2aWV3cG9ydCcsIDApO1xuICBjb25zdCBwbGFjZW1lbnRBdXRvID0gcG9zaXRpb24uaW5kZXhPZignYXV0bycpICE9PSAtMTtcblxuICByZXR1cm4ge1xuICAgIGluc3RhbmNlOiB7XG4gICAgICB0YXJnZXQ6IHRhcmdldEVsZW1lbnQsXG4gICAgICBob3N0OiBob3N0RWxlbWVudCxcbiAgICAgIGFycm93OiBudWxsXG4gICAgfSxcbiAgICBvZmZzZXRzOiB7XG4gICAgICB0YXJnZXQ6IHRhcmdldE9mZnNldCxcbiAgICAgIGhvc3Q6IGhvc3RFbFBvc2l0aW9uLFxuICAgICAgYXJyb3c6IG51bGxcbiAgICB9LFxuICAgIHBvc2l0aW9uRml4ZWQ6IGZhbHNlLFxuICAgIHBsYWNlbWVudCxcbiAgICBwbGFjZW1lbnRBdXRvXG4gIH07XG59XG4iLCJpbXBvcnQgeyBnZXRCb3VuZGFyaWVzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgRGF0YSB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coZGF0YTogRGF0YSkge1xuXG4gIC8vIE5PVEU6IERPTSBhY2Nlc3MgaGVyZVxuICAvLyByZXNldHMgdGhlIHRhcmdldE9mZnNldHMncyBwb3NpdGlvbiBzbyB0aGF0IHRoZSBkb2N1bWVudCBzaXplIGNhbiBiZSBjYWxjdWxhdGVkIGV4Y2x1ZGluZ1xuICAvLyB0aGUgc2l6ZSBvZiB0aGUgdGFyZ2V0T2Zmc2V0cyBlbGVtZW50IGl0c2VsZlxuICBjb25zdCB0cmFuc2Zvcm1Qcm9wID0gJ3RyYW5zZm9ybSc7XG4gIGNvbnN0IHRhcmdldFN0eWxlcyA9IGRhdGEuaW5zdGFuY2UudGFyZ2V0LnN0eWxlOyAvLyBhc3NpZ25tZW50IHRvIGhlbHAgbWluaWZpY2F0aW9uXG4gIGNvbnN0IHsgdG9wLCBsZWZ0LCBbdHJhbnNmb3JtUHJvcF06IHRyYW5zZm9ybSB9ID0gdGFyZ2V0U3R5bGVzO1xuICB0YXJnZXRTdHlsZXMudG9wID0gJyc7XG4gIHRhcmdldFN0eWxlcy5sZWZ0ID0gJyc7XG4gIHRhcmdldFN0eWxlc1t0cmFuc2Zvcm1Qcm9wXSA9ICcnO1xuXG4gIGNvbnN0IGJvdW5kYXJpZXMgPSBnZXRCb3VuZGFyaWVzKFxuICAgIGRhdGEuaW5zdGFuY2UudGFyZ2V0LFxuICAgIGRhdGEuaW5zdGFuY2UuaG9zdCxcbiAgICAwLCAvLyBwYWRkaW5nXG4gICAgJ3Njcm9sbFBhcmVudCcsXG4gICAgZmFsc2UgLy8gcG9zaXRpb25GaXhlZFxuICApO1xuXG4gIC8vIE5PVEU6IERPTSBhY2Nlc3MgaGVyZVxuICAvLyByZXN0b3JlcyB0aGUgb3JpZ2luYWwgc3R5bGUgcHJvcGVydGllcyBhZnRlciB0aGUgb2Zmc2V0cyBoYXZlIGJlZW4gY29tcHV0ZWRcbiAgdGFyZ2V0U3R5bGVzLnRvcCA9IHRvcDtcbiAgdGFyZ2V0U3R5bGVzLmxlZnQgPSBsZWZ0O1xuICB0YXJnZXRTdHlsZXNbdHJhbnNmb3JtUHJvcF0gPSB0cmFuc2Zvcm07XG5cbiAgY29uc3Qgb3JkZXIgPSBbJ2xlZnQnLCAncmlnaHQnLCAndG9wJywgJ2JvdHRvbSddO1xuXG4gIGNvbnN0IGNoZWNrID0ge1xuICAgIHByaW1hcnkocGxhY2VtZW50OiBzdHJpbmcpIHtcbiAgICAgIGxldCB2YWx1ZSA9IGRhdGEub2Zmc2V0cy50YXJnZXRbcGxhY2VtZW50XTtcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YS5vZmZzZXRzLnRhcmdldFtwbGFjZW1lbnRdIDwgYm91bmRhcmllc1twbGFjZW1lbnRdICYmXG4gICAgICAgICFmYWxzZSAvLyBvcHRpb25zLmVzY2FwZVdpdGhSZWZlcmVuY2VcbiAgICAgICkge1xuICAgICAgICB2YWx1ZSA9IE1hdGgubWF4KGRhdGEub2Zmc2V0cy50YXJnZXRbcGxhY2VtZW50XSwgYm91bmRhcmllc1twbGFjZW1lbnRdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgW3BsYWNlbWVudF06IHZhbHVlIH07XG4gICAgfSxcbiAgICBzZWNvbmRhcnkocGxhY2VtZW50OiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IG1haW5TaWRlID0gcGxhY2VtZW50ID09PSAncmlnaHQnID8gJ2xlZnQnIDogJ3RvcCc7XG4gICAgICBsZXQgdmFsdWUgPSBkYXRhLm9mZnNldHMudGFyZ2V0W21haW5TaWRlXTtcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YS5vZmZzZXRzLnRhcmdldFtwbGFjZW1lbnRdID4gYm91bmRhcmllc1twbGFjZW1lbnRdICYmXG4gICAgICAgICFmYWxzZSAvLyBlc2NhcGVXaXRoUmVmZXJlbmNlXG4gICAgICApIHtcbiAgICAgICAgdmFsdWUgPSBNYXRoLm1pbihcbiAgICAgICAgICBkYXRhLm9mZnNldHMudGFyZ2V0W21haW5TaWRlXSxcbiAgICAgICAgICBib3VuZGFyaWVzW3BsYWNlbWVudF0gLVxuICAgICAgICAgIChwbGFjZW1lbnQgPT09ICdyaWdodCcgPyBkYXRhLm9mZnNldHMudGFyZ2V0LndpZHRoIDogZGF0YS5vZmZzZXRzLnRhcmdldC5oZWlnaHQpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IFttYWluU2lkZV06IHZhbHVlIH07XG4gICAgfVxuICB9O1xuXG4gIGxldCBzaWRlOiBzdHJpbmc7XG5cbiAgb3JkZXIuZm9yRWFjaChwbGFjZW1lbnQgPT4ge1xuICAgIHNpZGUgPSBbJ2xlZnQnLCAndG9wJ11cbiAgICAgIC5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xXG4gICAgICA/ICdwcmltYXJ5J1xuICAgICAgOiAnc2Vjb25kYXJ5JztcblxuICAgIGRhdGEub2Zmc2V0cy50YXJnZXQgPSB7IC4uLmRhdGEub2Zmc2V0cy50YXJnZXQsIC4uLmNoZWNrW3NpZGVdKHBsYWNlbWVudCkgfTtcblxuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn1cbiIsImltcG9ydCB7IERhdGEgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2hpZnQoZGF0YTogRGF0YSk6IERhdGEge1xuICBjb25zdCBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDtcbiAgY29uc3QgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnICcpWzBdO1xuICBjb25zdCBzaGlmdHZhcmlhdGlvbiA9IHBsYWNlbWVudC5zcGxpdCgnICcpWzFdO1xuXG4gIGlmIChzaGlmdHZhcmlhdGlvbikge1xuICAgIGNvbnN0IHsgaG9zdCwgdGFyZ2V0IH0gPSBkYXRhLm9mZnNldHM7XG4gICAgY29uc3QgaXNWZXJ0aWNhbCA9IFsnYm90dG9tJywgJ3RvcCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuICAgIGNvbnN0IHNpZGUgPSBpc1ZlcnRpY2FsID8gJ2xlZnQnIDogJ3RvcCc7XG4gICAgY29uc3QgbWVhc3VyZW1lbnQgPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXG4gICAgY29uc3Qgc2hpZnRPZmZzZXRzID0ge1xuICAgICAgbGVmdDogeyBbc2lkZV06IGhvc3Rbc2lkZV0gfSxcbiAgICAgIHJpZ2h0OiB7XG4gICAgICAgIFtzaWRlXTogaG9zdFtzaWRlXSArIGhvc3RbbWVhc3VyZW1lbnRdIC0gaG9zdFttZWFzdXJlbWVudF1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZGF0YS5vZmZzZXRzLnRhcmdldCA9IHsgLi4udGFyZ2V0LCAuLi5zaGlmdE9mZnNldHNbc2hpZnR2YXJpYXRpb25dIH07XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cbiIsIi8qKlxuICogQGNvcHlyaWdodCBWYWxvciBTb2Z0d2FyZVxuICogQGNvcHlyaWdodCBGZWRlcmljbyBaaXZvbG8gYW5kIGNvbnRyaWJ1dG9yc1xuICovXG5pbXBvcnQgeyBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZ2V0UmVmZXJlbmNlT2Zmc2V0cywgc2V0QWxsU3R5bGVzIH0gZnJvbSAnLi91dGlscyc7XG5cbmltcG9ydCB7IGFycm93LCBmbGlwLCBwcmV2ZW50T3ZlcmZsb3csIHNoaWZ0LCBpbml0RGF0YSB9IGZyb20gJy4vbW9kaWZpZXJzJztcbmltcG9ydCB7IERhdGEsIE9mZnNldHMgfSBmcm9tICcuL21vZGVscyc7XG5cblxuZXhwb3J0IGNsYXNzIFBvc2l0aW9uaW5nIHtcbiAgcG9zaXRpb24oaG9zdEVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCwgcm91bmQgPSB0cnVlKTogT2Zmc2V0cyB7XG4gICAgcmV0dXJuIHRoaXMub2Zmc2V0KGhvc3RFbGVtZW50LCB0YXJnZXRFbGVtZW50LCBmYWxzZSk7XG4gIH1cblxuICBvZmZzZXQoaG9zdEVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCwgcm91bmQgPSB0cnVlKTogT2Zmc2V0cyB7XG4gICAgcmV0dXJuIGdldFJlZmVyZW5jZU9mZnNldHModGFyZ2V0RWxlbWVudCwgaG9zdEVsZW1lbnQpO1xuICB9XG5cbiAgcG9zaXRpb25FbGVtZW50cyhcbiAgICBob3N0RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgcG9zaXRpb246IHN0cmluZyxcbiAgICBhcHBlbmRUb0JvZHk/OiBib29sZWFuXG4gICk6IERhdGEge1xuICAgIGNvbnN0IGNoYWluT2ZNb2RpZmllcnMgPSBbZmxpcCwgc2hpZnQsIHByZXZlbnRPdmVyZmxvdywgYXJyb3ddO1xuXG4gICAgcmV0dXJuIGNoYWluT2ZNb2RpZmllcnMucmVkdWNlKFxuICAgICAgKG1vZGlmaWVkRGF0YSwgbW9kaWZpZXIpID0+IG1vZGlmaWVyKG1vZGlmaWVkRGF0YSksXG4gICAgICBpbml0RGF0YSh0YXJnZXRFbGVtZW50LCBob3N0RWxlbWVudCwgcG9zaXRpb24pXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBwb3NpdGlvblNlcnZpY2UgPSBuZXcgUG9zaXRpb25pbmcoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aW9uRWxlbWVudHMoXG4gIGhvc3RFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIHBsYWNlbWVudDogc3RyaW5nLFxuICBhcHBlbmRUb0JvZHk/OiBib29sZWFuLFxuICByZW5kZXJlcj86IFJlbmRlcmVyMlxuKTogdm9pZCB7XG5cbiAgY29uc3QgZGF0YSA9IHBvc2l0aW9uU2VydmljZS5wb3NpdGlvbkVsZW1lbnRzKFxuICAgIGhvc3RFbGVtZW50LFxuICAgIHRhcmdldEVsZW1lbnQsXG4gICAgcGxhY2VtZW50LFxuICAgIGFwcGVuZFRvQm9keVxuICApO1xuXG4gIHNldEFsbFN0eWxlcyhkYXRhLCByZW5kZXJlcik7XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFbGVtZW50UmVmLCBSZW5kZXJlckZhY3RvcnkyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IHBvc2l0aW9uRWxlbWVudHMgfSBmcm9tICcuL25nLXBvc2l0aW9uaW5nJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIG9mLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlciwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zaXRpb25pbmdPcHRpb25zIHtcbiAgLyoqIFRoZSBET00gZWxlbWVudCwgRWxlbWVudFJlZiwgb3IgYSBzZWxlY3RvciBzdHJpbmcgb2YgYW4gZWxlbWVudCB3aGljaCB3aWxsIGJlIG1vdmVkICovXG4gIGVsZW1lbnQ/OiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWYgfCBzdHJpbmc7XG5cbiAgLyoqIFRoZSBET00gZWxlbWVudCwgRWxlbWVudFJlZiwgb3IgYSBzZWxlY3RvciBzdHJpbmcgb2YgYW4gZWxlbWVudCB3aGljaCB0aGUgZWxlbWVudCB3aWxsIGJlIGF0dGFjaGVkIHRvICAqL1xuICB0YXJnZXQ/OiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWYgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIG9mIHRoZSBmb3JtICd2ZXJ0LWF0dGFjaG1lbnQgaG9yaXotYXR0YWNobWVudCcgb3IgJ3BsYWNlbWVudCdcbiAgICogLSBwbGFjZW1lbnQgY2FuIGJlIFwidG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiLCBcInJpZ2h0XCJcbiAgICogbm90IHlldCBzdXBwb3J0ZWQ6XG4gICAqIC0gdmVydC1hdHRhY2htZW50IGNhbiBiZSBhbnkgb2YgJ3RvcCcsICdtaWRkbGUnLCAnYm90dG9tJ1xuICAgKiAtIGhvcml6LWF0dGFjaG1lbnQgY2FuIGJlIGFueSBvZiAnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnXG4gICAqL1xuICBhdHRhY2htZW50Pzogc3RyaW5nO1xuXG4gIC8qKiBBIHN0cmluZyBzaW1pbGFyIHRvIGBhdHRhY2htZW50YC4gVGhlIG9uZSBkaWZmZXJlbmNlIGlzIHRoYXQsIGlmIGl0J3Mgbm90IHByb3ZpZGVkLFxuICAgKiBgdGFyZ2V0QXR0YWNobWVudGAgd2lsbCBhc3N1bWUgdGhlIG1pcnJvciBpbWFnZSBvZiBgYXR0YWNobWVudGAuXG4gICAqL1xuICB0YXJnZXRBdHRhY2htZW50Pzogc3RyaW5nO1xuXG4gIC8qKiBBIHN0cmluZyBvZiB0aGUgZm9ybSAndmVydC1vZmZzZXQgaG9yaXotb2Zmc2V0J1xuICAgKiAtIHZlcnQtb2Zmc2V0IGFuZCBob3Jpei1vZmZzZXQgY2FuIGJlIG9mIHRoZSBmb3JtIFwiMjBweFwiIG9yIFwiNTUlXCJcbiAgICovXG4gIG9mZnNldD86IHN0cmluZztcblxuICAvKiogQSBzdHJpbmcgc2ltaWxhciB0byBgb2Zmc2V0YCwgYnV0IHJlZmVycmluZyB0byB0aGUgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgKi9cbiAgdGFyZ2V0T2Zmc2V0Pzogc3RyaW5nO1xuXG4gIC8qKiBJZiB0cnVlIGNvbXBvbmVudCB3aWxsIGJlIGF0dGFjaGVkIHRvIGJvZHkgKi9cbiAgYXBwZW5kVG9Cb2R5PzogYm9vbGVhbjtcbn1cblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUG9zaXRpb25pbmdTZXJ2aWNlIHtcbiAgcHJpdmF0ZSB1cGRhdGUkJCA9IG5ldyBTdWJqZWN0PG51bGw+KCk7XG5cbiAgcHJpdmF0ZSBldmVudHMkOiBhbnkgPSBtZXJnZShcbiAgICBmcm9tRXZlbnQod2luZG93LCAnc2Nyb2xsJyksXG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpLFxuICAgIG9mKDAsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyKSxcbiAgICB0aGlzLnVwZGF0ZSQkXG4gICk7XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkVsZW1lbnRzID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKHJlbmRlcmVyRmFjdG9yeTogUmVuZGVyZXJGYWN0b3J5Mikge1xuICAgIHRoaXMuZXZlbnRzJFxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucG9zaXRpb25FbGVtZW50c1xuICAgICAgICAgIC5mb3JFYWNoKChwb3NpdGlvbkVsZW1lbnQ6IFBvc2l0aW9uaW5nT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcG9zaXRpb25FbGVtZW50cyhcbiAgICAgICAgICAgICAgX2dldEh0bWxFbGVtZW50KHBvc2l0aW9uRWxlbWVudC50YXJnZXQpLFxuICAgICAgICAgICAgICBfZ2V0SHRtbEVsZW1lbnQocG9zaXRpb25FbGVtZW50LmVsZW1lbnQpLFxuICAgICAgICAgICAgICBwb3NpdGlvbkVsZW1lbnQuYXR0YWNobWVudCxcbiAgICAgICAgICAgICAgcG9zaXRpb25FbGVtZW50LmFwcGVuZFRvQm9keSxcbiAgICAgICAgICAgICAgcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwb3NpdGlvbihvcHRpb25zOiBQb3NpdGlvbmluZ09wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFBvc2l0aW9uRWxlbWVudChvcHRpb25zKTtcbiAgICB0aGlzLnVwZGF0ZSQkLm5leHQoKTtcbiAgfVxuXG4gIGFkZFBvc2l0aW9uRWxlbWVudChvcHRpb25zOiBQb3NpdGlvbmluZ09wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnBvc2l0aW9uRWxlbWVudHMuc2V0KF9nZXRIdG1sRWxlbWVudChvcHRpb25zLmVsZW1lbnQpLCBvcHRpb25zKTtcbiAgfVxuXG4gIGRlbGV0ZVBvc2l0aW9uRWxlbWVudChlbFJlZjogRWxlbWVudFJlZik6IHZvaWQge1xuICAgIHRoaXMucG9zaXRpb25FbGVtZW50cy5kZWxldGUoX2dldEh0bWxFbGVtZW50KGVsUmVmKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2dldEh0bWxFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgRWxlbWVudFJlZiB8IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBnb3QgYSBzZWxlY3RvclxuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCk7XG4gIH1cblxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcbiAgICByZXR1cm4gZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG4iXSwibmFtZXMiOlsicnVuSXNJRSIsInNldEFsbFN0eWxlcyIsIlN1YmplY3QiLCJtZXJnZSIsImZyb21FdmVudCIsIm9mIiwiYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIiLCJJbmplY3RhYmxlIiwiUmVuZGVyZXJGYWN0b3J5MiIsIkVsZW1lbnRSZWYiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7Ozs7Ozs7Ozs7OztBQWNBLElBZU8sSUFBSSxRQUFRLEdBQUc7UUFDbEIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksa0JBQWtCLENBQUM7WUFDM0MsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2pELENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQztvQkFBRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUFFLENBQUMs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
|